From 03f1fff1bb4edf88e5f1024d294cbbd48fa8d6fa Mon Sep 17 00:00:00 2001 From: pulak-opti Date: Thu, 9 May 2024 23:46:16 +0600 Subject: [PATCH 1/2] imediately close req and release memory after http call (node) --- lib/plugins/event_dispatcher/index.node.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/plugins/event_dispatcher/index.node.ts b/lib/plugins/event_dispatcher/index.node.ts index f9f716caf..f1edad36d 100644 --- a/lib/plugins/event_dispatcher/index.node.ts +++ b/lib/plugins/event_dispatcher/index.node.ts @@ -51,19 +51,22 @@ export const dispatchEvent = function( }, }; + const reqWrapper: { req?: http.ClientRequest } = {}; + const requestCallback = function(response?: { statusCode: number }): void { if (response && response.statusCode && response.statusCode >= 200 && response.statusCode < 400) { + reqWrapper.req?.destroy(); callback(response); } }; - const req = (parsedUrl.protocol === 'http:' ? http : https) + reqWrapper.req = (parsedUrl.protocol === 'http:' ? http : https) .request(requestOptions, requestCallback as (res: http.IncomingMessage) => void); // Add no-op error listener to prevent this from throwing - req.on('error', function() {}); - req.write(dataString); - req.end(); - return req; + reqWrapper.req.on('error', function() {}); + reqWrapper.req.write(dataString); + reqWrapper.req.end(); + return reqWrapper.req; }; export default { From 9d62b41655f2eb2b75c39b3743971d17a401636c Mon Sep 17 00:00:00 2001 From: pulak-opti Date: Mon, 13 May 2024 21:07:45 +0600 Subject: [PATCH 2/2] handle any status code & error case --- lib/plugins/event_dispatcher/index.node.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/plugins/event_dispatcher/index.node.ts b/lib/plugins/event_dispatcher/index.node.ts index f1edad36d..8efd7fb4f 100644 --- a/lib/plugins/event_dispatcher/index.node.ts +++ b/lib/plugins/event_dispatcher/index.node.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016-2018, 2020-2021, Optimizely + * Copyright 2016-2018, 2020-2021, 2024 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -55,15 +55,19 @@ export const dispatchEvent = function( const requestCallback = function(response?: { statusCode: number }): void { if (response && response.statusCode && response.statusCode >= 200 && response.statusCode < 400) { - reqWrapper.req?.destroy(); callback(response); } + reqWrapper.req?.destroy(); + reqWrapper.req = undefined; }; reqWrapper.req = (parsedUrl.protocol === 'http:' ? http : https) .request(requestOptions, requestCallback as (res: http.IncomingMessage) => void); // Add no-op error listener to prevent this from throwing - reqWrapper.req.on('error', function() {}); + reqWrapper.req.on('error', function() { + reqWrapper.req?.destroy(); + reqWrapper.req = undefined; + }); reqWrapper.req.write(dataString); reqWrapper.req.end(); return reqWrapper.req;