From ea4413e9008a4fb51708ec731a99acf914bad8f1 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Mon, 23 Sep 2024 14:20:14 +0200 Subject: [PATCH 1/3] Unref setinterval --- packages/sdk-core/src/common/intervalHelper.ts | 13 +++++++++++++ .../src/modules/database/BacktraceDatabase.ts | 6 ++++-- .../src/modules/metrics/BacktraceMetrics.ts | 10 +++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 packages/sdk-core/src/common/intervalHelper.ts diff --git a/packages/sdk-core/src/common/intervalHelper.ts b/packages/sdk-core/src/common/intervalHelper.ts new file mode 100644 index 00000000..4b56b4d5 --- /dev/null +++ b/packages/sdk-core/src/common/intervalHelper.ts @@ -0,0 +1,13 @@ +/** + * Due to the event loop, NodeJS application might not exit + * due to some background work that the SDK delegates to setIntervals. + * Thanks to this helper we can cancell interval in NodeJS process. + * @param interval setInterval interval + */ +export function unrefInterval(interval: number | NodeJS.Timeout) { + if(!interval || typeof interval === 'number') { + return; + } + + interval.unref(); +} diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 054d35bf..162b2530 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -1,5 +1,6 @@ import { anySignal, createAbortController } from '../../common/AbortController.js'; import { IdGenerator } from '../../common/IdGenerator.js'; +import { unrefInterval } from '../../common/intervalHelper.js'; import { TimeHelper } from '../../common/TimeHelper.js'; import { BacktraceAttachment } from '../../model/attachment/index.js'; import { BacktraceDatabaseConfiguration } from '../../model/configuration/BacktraceDatabaseConfiguration.js'; @@ -13,7 +14,7 @@ import { AttachmentBacktraceDatabaseRecord, BacktraceDatabaseRecord, BacktraceDatabaseRecordCountByType, - ReportBacktraceDatabaseRecord, + ReportBacktraceDatabaseRecord } from './model/BacktraceDatabaseRecord.js'; export class BacktraceDatabase implements BacktraceModule { @@ -35,7 +36,7 @@ export class BacktraceDatabase implements BacktraceModule { private readonly _recordLimits: BacktraceDatabaseRecordCountByType; private readonly _retryInterval: number; - private _intervalId?: ReturnType; + private _intervalId?: NodeJS.Timeout | number;; private _enabled = false; @@ -368,6 +369,7 @@ export class BacktraceDatabase implements BacktraceModule { await this.send(); }; this._intervalId = setInterval(sendDatabaseReports, this._retryInterval); + unrefInterval(this._intervalId); await this.send(); } diff --git a/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts b/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts index a9038bea..da60dbca 100644 --- a/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts +++ b/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts @@ -1,11 +1,12 @@ import { createAbortController } from '../../common/AbortController.js'; import { AbortError } from '../../common/AbortError.js'; +import { unrefInterval } from '../../common/intervalHelper.js'; import { TimeHelper } from '../../common/TimeHelper.js'; import { BacktraceMetricsOptions } from '../../model/configuration/BacktraceConfiguration.js'; import { AttributeType } from '../../model/data/BacktraceData.js'; -import { BacktraceModule } from '../BacktraceModule.js'; import { AttributeManager } from '../attribute/AttributeManager.js'; import { ReportDataBuilder } from '../attribute/ReportDataBuilder.js'; +import { BacktraceModule } from '../BacktraceModule.js'; import { BacktraceSessionProvider } from './BacktraceSessionProvider.js'; import { MetricsQueue } from './MetricsQueue.js'; import { SummedEvent } from './model/SummedEvent.js'; @@ -28,7 +29,7 @@ export class BacktraceMetrics implements BacktraceModule { public readonly metricsHost: string; private readonly _updateInterval: number; - private _updateIntervalId?: ReturnType; + private _updateIntervalId?: NodeJS.Timeout | number; private readonly _abortController: AbortController; constructor( @@ -60,7 +61,10 @@ export class BacktraceMetrics implements BacktraceModule { } this._updateIntervalId = setInterval(() => { this.handleAbort(() => this.send(this._abortController.signal)); - }, this._updateInterval); + }, this._updateInterval) as NodeJS.Timeout | number; + + + unrefInterval(this._updateIntervalId); } /** From 5570c9d0778a622395c2c351156db379a66b3cf7 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Mon, 23 Sep 2024 14:31:34 +0200 Subject: [PATCH 2/3] Remove additional ; --- packages/sdk-core/src/modules/database/BacktraceDatabase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 162b2530..264587e5 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -36,7 +36,7 @@ export class BacktraceDatabase implements BacktraceModule { private readonly _recordLimits: BacktraceDatabaseRecordCountByType; private readonly _retryInterval: number; - private _intervalId?: NodeJS.Timeout | number;; + private _intervalId?: NodeJS.Timeout | number; private _enabled = false; From 7e5458213f9c8bb86a2ce5ed20648d97553b7f22 Mon Sep 17 00:00:00 2001 From: Konrad Dysput Date: Mon, 23 Sep 2024 14:41:03 +0200 Subject: [PATCH 3/3] Formatting once again --- packages/sdk-core/src/common/intervalHelper.ts | 4 ++-- packages/sdk-core/src/modules/database/BacktraceDatabase.ts | 2 +- packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/packages/sdk-core/src/common/intervalHelper.ts b/packages/sdk-core/src/common/intervalHelper.ts index 4b56b4d5..69b00480 100644 --- a/packages/sdk-core/src/common/intervalHelper.ts +++ b/packages/sdk-core/src/common/intervalHelper.ts @@ -1,11 +1,11 @@ /** - * Due to the event loop, NodeJS application might not exit + * Due to the event loop, NodeJS application might not exit * due to some background work that the SDK delegates to setIntervals. * Thanks to this helper we can cancell interval in NodeJS process. * @param interval setInterval interval */ export function unrefInterval(interval: number | NodeJS.Timeout) { - if(!interval || typeof interval === 'number') { + if (!interval || typeof interval === 'number') { return; } diff --git a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts index 264587e5..7f569d04 100644 --- a/packages/sdk-core/src/modules/database/BacktraceDatabase.ts +++ b/packages/sdk-core/src/modules/database/BacktraceDatabase.ts @@ -14,7 +14,7 @@ import { AttachmentBacktraceDatabaseRecord, BacktraceDatabaseRecord, BacktraceDatabaseRecordCountByType, - ReportBacktraceDatabaseRecord + ReportBacktraceDatabaseRecord, } from './model/BacktraceDatabaseRecord.js'; export class BacktraceDatabase implements BacktraceModule { diff --git a/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts b/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts index da60dbca..2a30bc8e 100644 --- a/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts +++ b/packages/sdk-core/src/modules/metrics/BacktraceMetrics.ts @@ -63,7 +63,6 @@ export class BacktraceMetrics implements BacktraceModule { this.handleAbort(() => this.send(this._abortController.signal)); }, this._updateInterval) as NodeJS.Timeout | number; - unrefInterval(this._updateIntervalId); }