import { subtle } from 'node:crypto'
import { readFile, unlink, writeFile } from 'node:fs/promises'
import * as http from 'node:http'
-import { AddressInfo } from 'node:net'
+import { AddressInfo, Socket } from 'node:net'
import { homedir } from 'node:os'
import { join } from 'node:path'
import type { NanoPowOptions, WorkGenerateRequest, WorkGenerateResponse, WorkValidateRequest, WorkValidateResponse } from '#types'
}
process.title = 'NanoPow Server'
+const MAX_BODY_SIZE = 256
+const MAX_IDLE_TIME = 5000
const MAX_REQUEST_COUNT = 10
-const MAX_REQUEST_TIME = 60000
const MAX_REQUEST_SIZE = 1024
-const MAX_BODY_SIZE = 256
+const MAX_REQUEST_TIME = 60000
const requests: Map<string, { tokens: number, time: number }> = new Map()
let data: Buffer[] = []
let reqSize = 0
if (req.method === 'POST') {
+ if (+(req.headers['content-length'] ?? 0) > MAX_BODY_SIZE) {
+ res.writeHead(413, { 'Content-Type': 'text/plain' })
+ res.end('Content Too Large')
+ req.socket.destroy()
+ return
+ }
req.on('data', (chunk: Buffer): void => {
reqSize += chunk.byteLength
if (reqSize > MAX_REQUEST_SIZE) {
}
})
-server.on('error', (e): void => {
+server.headersTimeout = MAX_IDLE_TIME
+server.keepAliveTimeout = MAX_IDLE_TIME
+
+server.on('connection', (c: Socket): void => {
+ c.setTimeout(MAX_IDLE_TIME, () => c.destroy())
+})
+
+server.on('error', (e: Error): void => {
log('Server error', e)
try {
shutdown()