diff --git a/src/listener.ts b/src/listener.ts index a9ea3dd..a62f9eb 100644 --- a/src/listener.ts +++ b/src/listener.ts @@ -203,9 +203,14 @@ export const getRequestListener = ( errorHandler?: CustomErrorHandler overrideGlobalObjects?: boolean autoCleanupIncoming?: boolean + requestsPerForcedGC?: number } = {} ) => { const autoCleanupIncoming = options.autoCleanupIncoming ?? true + const requestsPerForcedGC = options.requestsPerForcedGC ?? 0 + let requestCount = 0 + const gc = global.gc as () => void + if (options.overrideGlobalObjects !== false && global.Request !== LightweightRequest) { Object.defineProperty(global, 'Request', { value: LightweightRequest, @@ -214,6 +219,9 @@ export const getRequestListener = ( value: LightweightResponse, }) } + if (requestsPerForcedGC && !gc) { + throw new Error('`global.gc` is not available. Please run node with `--expose-gc` flag.') + } return async ( incoming: IncomingMessage | Http2ServerRequest, @@ -281,6 +289,14 @@ export const getRequestListener = ( } }) } + + if (requestsPerForcedGC) { + requestCount++ + if (requestCount >= requestsPerForcedGC) { + gc() + requestCount = 0 + } + } }) res = fetchCallback(req, { incoming, outgoing } as HttpBindings) as diff --git a/src/server.ts b/src/server.ts index 12b565b..e21f194 100644 --- a/src/server.ts +++ b/src/server.ts @@ -9,6 +9,7 @@ export const createAdaptorServer = (options: Options): ServerType => { hostname: options.hostname, overrideGlobalObjects: options.overrideGlobalObjects, autoCleanupIncoming: options.autoCleanupIncoming, + requestsPerForcedGC: options.requestsPerForcedGC, }) // ts will complain about createServerHTTP and createServerHTTP2 not being callable, which works just fine // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/types.ts b/src/types.ts index ce4a357..475dc5c 100644 --- a/src/types.ts +++ b/src/types.ts @@ -71,6 +71,7 @@ export type Options = { fetch: FetchCallback overrideGlobalObjects?: boolean autoCleanupIncoming?: boolean + requestsPerForcedGC?: number port?: number hostname?: string } & ServerOptions