diff --git a/bin/genieacs-cwmp.ts b/bin/genieacs-cwmp.ts index 2b9d5fc..09f3d1a 100755 --- a/bin/genieacs-cwmp.ts +++ b/bin/genieacs-cwmp.ts @@ -69,6 +69,7 @@ if (!cluster.worker) { onClientError: cwmp.onClientError, timeout: 30000, keepAliveTimeout: 0, + requestTimeout: cwmp.REQUEST_TIMEOUT, }; // Need this for Node < 15 diff --git a/lib/cwmp.ts b/lib/cwmp.ts index 8aa9c46..fe8d346 100644 --- a/lib/cwmp.ts +++ b/lib/cwmp.ts @@ -58,6 +58,10 @@ const REALM = "GenieACS"; const MAX_CYCLES = 4; const MAX_CONCURRENT_REQUESTS = +config.get("MAX_CONCURRENT_REQUESTS"); +const MAX_SESSION_DURATION = 300000; +const LOCK_REFRESH_INTERVAL = 10000; +export const REQUEST_TIMEOUT = 10000; + const currentSessions = new WeakMap(); const sessionsNonces = new WeakMap(); @@ -207,10 +211,10 @@ async function writeResponse( sessionContext.lastActivity = now; currentSessions.set(connection, sessionContext); if (now >= sessionContext.extendLock) { - sessionContext.extendLock = now + 10000; + sessionContext.extendLock = now + LOCK_REFRESH_INTERVAL; const lockToken = await lock.acquireLock( `cwmp_session_${sessionContext.deviceId}`, - sessionContext.timeout * 1000 + 15000, + sessionContext.timeout * 1000 + LOCK_REFRESH_INTERVAL + REQUEST_TIMEOUT, 0, `cwmp_session_${sessionContext.sessionId}`, ); @@ -865,7 +869,12 @@ async function sendAcsRequest( // When socket closes, store active sessions in cache export async function onConnection(socket: Socket): Promise { - await once(socket, "close", 300000); + try { + await once(socket, "close", MAX_SESSION_DURATION); + } catch { + socket.destroy(); + } + const sessionContext = currentSessions.get(socket); if (!sessionContext) return; currentSessions.delete(socket); @@ -1056,10 +1065,11 @@ async function processRequest( } } - sessionContext.extendLock = sessionContext.timestamp + 10000; + sessionContext.extendLock = + sessionContext.timestamp + LOCK_REFRESH_INTERVAL; const lockToken = await lock.acquireLock( `cwmp_session_${sessionContext.deviceId}`, - sessionContext.timeout * 1000 + 15000, + sessionContext.timeout * 1000 + LOCK_REFRESH_INTERVAL + REQUEST_TIMEOUT, 0, `cwmp_session_${sessionContext.sessionId}`, ); diff --git a/lib/server.ts b/lib/server.ts index 6334b9e..aeb1f76 100644 --- a/lib/server.ts +++ b/lib/server.ts @@ -41,6 +41,7 @@ interface ServerOptions { ssl?: { key: string; cert: string }; timeout?: number; keepAliveTimeout?: number; + requestTimeout?: number; onConnection?: (socket: Socket) => void; onClientError?: (err: Error, socket: Socket) => void; } @@ -152,6 +153,9 @@ export function start( server.timeout = options.timeout || 0; if (options.keepAliveTimeout != null) server.keepAliveTimeout = options.keepAliveTimeout; + if (options.requestTimeout != null) + server.requestTimeout = options.requestTimeout; + server.listen({ port: options.port, host: options.host }); }