From df29fb0ffd86532886100da46de263f7f472ffb0 Mon Sep 17 00:00:00 2001 From: Nev Wylie <54870357+MSNev@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:13:42 -0700 Subject: [PATCH] [BUG] Excessive memory usage for SPA where unload hooks keep accumulating #2311 - Rework Asynchronous notification handling --- AISKU/Tests/Unit/src/AISKUSize.Tests.ts | 4 +- AISKU/Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + AISKU/Tests/Unit/src/aiskuunittests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/aiskuliteunittests.ts | 2 + .../test/Unit/src/GlobalTestHooks.Test.ts | 13 + .../test/Unit/src/post.unittests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/aichannel.tests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/offlinechannel.tests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/teechannel.tests.ts | 2 + common/config/rush/npm-shrinkwrap.json | 430 +++++++++--------- .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Unit/src/appinsights-analytics.tests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/cfgsync.tests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../src/appinsights-clickanalytics.tests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/dependencies.tests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../src/appinsights-perfmarkmeasure.tests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/prop.tests.ts | 2 + shared/1ds-core-js/src/Index.ts | 5 +- .../test/Unit/src/FileSizeCheckTest.ts | 2 +- .../test/Unit/src/GlobalTestHooks.Test.ts | 13 + .../test/Unit/src/core.unittests.ts | 2 + .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Unit/src/appinsights-common.tests.ts | 2 + .../Unit/src/ApplicationInsightsCore.Tests.ts | 27 +- .../Tests/Unit/src/GlobalTestHooks.Test.ts | 13 + .../Tests/Unit/src/aiunittests.ts | 2 + .../src/Config/DynamicConfig.ts | 2 + .../src/JavaScriptSDK.Enums/LoggingEnums.ts | 1 + .../src/JavaScriptSDK/AppInsightsCore.ts | 105 +++-- .../src/JavaScriptSDK/NotificationManager.ts | 65 ++- .../src/JavaScriptSDK/UnloadHookContainer.ts | 21 + .../src/applicationinsights-core-js.ts | 2 +- 41 files changed, 606 insertions(+), 283 deletions(-) create mode 100644 AISKU/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 AISKULight/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 channels/1ds-post-js/test/Unit/src/GlobalTestHooks.Test.ts create mode 100644 channels/applicationinsights-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 channels/offline-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 channels/tee-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 extensions/applicationinsights-analytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 extensions/applicationinsights-cfgsync-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 extensions/applicationinsights-dependencies-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 extensions/applicationinsights-properties-js/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 shared/1ds-core-js/test/Unit/src/GlobalTestHooks.Test.ts create mode 100644 shared/AppInsightsCommon/Tests/Unit/src/GlobalTestHooks.Test.ts create mode 100644 shared/AppInsightsCore/Tests/Unit/src/GlobalTestHooks.Test.ts diff --git a/AISKU/Tests/Unit/src/AISKUSize.Tests.ts b/AISKU/Tests/Unit/src/AISKUSize.Tests.ts index 6ee86ddf6..abbe9bc86 100644 --- a/AISKU/Tests/Unit/src/AISKUSize.Tests.ts +++ b/AISKU/Tests/Unit/src/AISKUSize.Tests.ts @@ -5,8 +5,8 @@ import { Snippet } from "../../../src/Snippet"; import { utlRemoveSessionStorage } from "@microsoft/applicationinsights-common"; export class AISKUSizeCheck extends AITestClass { - private readonly MAX_RAW_SIZE = 139; - private readonly MAX_BUNDLE_SIZE = 139; + private readonly MAX_RAW_SIZE = 140; + private readonly MAX_BUNDLE_SIZE = 140; private readonly MAX_RAW_DEFLATE_SIZE = 56; private readonly MAX_BUNDLE_DEFLATE_SIZE = 56; private readonly rawFilePath = "../dist/es5/applicationinsights-web.min.js"; diff --git a/AISKU/Tests/Unit/src/GlobalTestHooks.Test.ts b/AISKU/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/AISKU/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/AISKU/Tests/Unit/src/aiskuunittests.ts b/AISKU/Tests/Unit/src/aiskuunittests.ts index d2056151e..39a168f4e 100644 --- a/AISKU/Tests/Unit/src/aiskuunittests.ts +++ b/AISKU/Tests/Unit/src/aiskuunittests.ts @@ -2,6 +2,7 @@ import { AISKUSizeCheck } from "./AISKUSize.Tests"; import { ApplicationInsightsTests } from './applicationinsights.e2e.tests'; import { ApplicationInsightsFetchTests } from './applicationinsights.e2e.fetch.tests'; import { CdnPackagingChecks } from './CdnPackaging.tests'; +import { GlobalTestHooks } from './GlobalTestHooks.Test'; import { SanitizerE2ETests } from './sanitizer.e2e.tests'; import { ValidateE2ETests } from './validate.e2e.tests'; import { SenderE2ETests } from './sender.e2e.tests'; @@ -10,6 +11,7 @@ import { CdnThrottle} from "./CdnThrottle.tests"; import { ThrottleSentMessage } from "./ThrottleSentMessage.tests"; export function runTests() { + new GlobalTestHooks().registerTests(); new AISKUSizeCheck().registerTests(); new ApplicationInsightsTests().registerTests(); new ApplicationInsightsFetchTests().registerTests(); diff --git a/AISKULight/Tests/Unit/src/GlobalTestHooks.Test.ts b/AISKULight/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/AISKULight/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/AISKULight/Tests/Unit/src/aiskuliteunittests.ts b/AISKULight/Tests/Unit/src/aiskuliteunittests.ts index 8b8a878cc..f1a132879 100644 --- a/AISKULight/Tests/Unit/src/aiskuliteunittests.ts +++ b/AISKULight/Tests/Unit/src/aiskuliteunittests.ts @@ -1,8 +1,10 @@ import { AISKULightSizeCheck } from "./AISKULightSize.Tests"; import { ApplicationInsightsDynamicConfigTests } from "./dynamicconfig.tests"; import { ApplicationInsightsConfigTests } from "./config.tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new AISKULightSizeCheck().registerTests(); new ApplicationInsightsDynamicConfigTests().registerTests(); new ApplicationInsightsConfigTests().registerTests(); diff --git a/channels/1ds-post-js/test/Unit/src/GlobalTestHooks.Test.ts b/channels/1ds-post-js/test/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..730f8f2cd --- /dev/null +++ b/channels/1ds-post-js/test/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { _testHookMaxUnloadHooksCb } from "@microsoft/1ds-core-js"; +import { Assert } from "@microsoft/ai-test-framework"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/channels/1ds-post-js/test/Unit/src/post.unittests.ts b/channels/1ds-post-js/test/Unit/src/post.unittests.ts index d4b1b2f91..7ca5a404c 100644 --- a/channels/1ds-post-js/test/Unit/src/post.unittests.ts +++ b/channels/1ds-post-js/test/Unit/src/post.unittests.ts @@ -3,8 +3,10 @@ import { HttpManagerTest } from './HttpManagerTest'; import { KillSwitchTest } from './KillSwitchTest'; import { SerializerTest } from './SerializerTest'; import { FileSizeCheckTest } from "./FileSizeCheckTest" +import { GlobalTestHooks } from './GlobalTestHooks.Test'; export function registerTests() { + new GlobalTestHooks().registerTests(); new PostChannelTest("PostChannelTest").registerTests(); new HttpManagerTest("HttpManagerTest").registerTests(); new HttpManagerTest("HttpManagerTest", true).registerTests(); diff --git a/channels/applicationinsights-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/channels/applicationinsights-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/channels/applicationinsights-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/channels/applicationinsights-channel-js/Tests/Unit/src/aichannel.tests.ts b/channels/applicationinsights-channel-js/Tests/Unit/src/aichannel.tests.ts index 807b0d875..b4dd43ee5 100644 --- a/channels/applicationinsights-channel-js/Tests/Unit/src/aichannel.tests.ts +++ b/channels/applicationinsights-channel-js/Tests/Unit/src/aichannel.tests.ts @@ -1,7 +1,9 @@ import { SenderTests } from "./Sender.tests"; import { SampleTests } from "./Sample.tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new SenderTests().registerTests(); new SampleTests().registerTests(); } \ No newline at end of file diff --git a/channels/offline-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/channels/offline-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/channels/offline-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/channels/offline-channel-js/Tests/Unit/src/offlinechannel.tests.ts b/channels/offline-channel-js/Tests/Unit/src/offlinechannel.tests.ts index 2e6d18480..b7cafff85 100644 --- a/channels/offline-channel-js/Tests/Unit/src/offlinechannel.tests.ts +++ b/channels/offline-channel-js/Tests/Unit/src/offlinechannel.tests.ts @@ -5,8 +5,10 @@ import { OfflineInMemoryBatchTests } from "./inmemorybatch.tests"; import { OfflineBatchHandlerTests } from "./offlinebatchhandler.tests"; import { ChannelTests } from "./channel.tests"; import { Offlinetimer } from "./offlinetimer.tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new OfflineIndexedDBTests().registerTests(); new OfflineWebProviderTests().registerTests(); new OfflineDbProviderTests().registerTests(); diff --git a/channels/tee-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/channels/tee-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/channels/tee-channel-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/channels/tee-channel-js/Tests/Unit/src/teechannel.tests.ts b/channels/tee-channel-js/Tests/Unit/src/teechannel.tests.ts index 5ccef728d..0b215eedc 100644 --- a/channels/tee-channel-js/Tests/Unit/src/teechannel.tests.ts +++ b/channels/tee-channel-js/Tests/Unit/src/teechannel.tests.ts @@ -1,5 +1,7 @@ import { TeeChannelCoreTests } from "./TeeChannelCore.Tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new TeeChannelCoreTests().registerTests(); } \ No newline at end of file diff --git a/common/config/rush/npm-shrinkwrap.json b/common/config/rush/npm-shrinkwrap.json index 00874aa98..bb3fbb9b1 100644 --- a/common/config/rush/npm-shrinkwrap.json +++ b/common/config/rush/npm-shrinkwrap.json @@ -112,13 +112,14 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -295,9 +296,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@microsoft/api-extractor": { - "version": "7.42.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.42.3.tgz", - "integrity": "sha512-JNLJFpGHz6ekjS6bvYXxUBeRGnSHeCMFNvRbCQ+7XXB/ZFrgLSMPwWtEq40AiWAy+oyG5a4RSNwdJTp0B2USvQ==", + "version": "7.43.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.43.0.tgz", + "integrity": "sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==", "dependencies": { "@microsoft/api-extractor-model": "7.28.13", "@microsoft/tsdoc": "0.14.2", @@ -311,7 +312,7 @@ "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "5.3.3" + "typescript": "5.4.2" }, "bin": { "api-extractor": "bin/api-extractor" @@ -328,9 +329,9 @@ } }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -415,9 +416,9 @@ } }, "node_modules/@nevware21/ts-utils": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.5.tgz", - "integrity": "sha512-+TEvP0+l/VBR5bJZoYFV+o6aQQ1O6y80uys5AVyyCKeWvrgWu/yNydqSBQNsk4BuEfkayg7R9+HCJRRRIvptTA==" + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.0.tgz", + "integrity": "sha512-3yrohCSKYBLKrW41fYkZorN2rf9GYr/4Cb4Xu9fWCyXgVDyt1uLgMaCinhx0kEkEUfME3Smqs+2itJRhXgCo8Q==" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -565,7 +566,7 @@ "node_modules/@rush-temp/1ds-core-js": { "version": "0.0.0", "resolved": "file:projects/1ds-core-js.tgz", - "integrity": "sha512-Yenyn/vf5rOTX1VK1fPVY+Bf8DVK/t3TNPBX6bBya6/XveHbC3TqhygFegZQGAaEMsMP8UhFk0EZSIFwLZOe9g==", + "integrity": "sha512-aMB4Pz8GKaj8Mp6iV3oqtBZ9uB7M5LM+MujhpZ/SGq6ddJen+Z6KfihACBI1CPrhE1QfT8gRNodjwK87Bl2bfg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -593,7 +594,7 @@ "node_modules/@rush-temp/1ds-post-js": { "version": "0.0.0", "resolved": "file:projects/1ds-post-js.tgz", - "integrity": "sha512-9qFMH6i7lRRBEOcSfg8irJhtgSnhdmfaEtKCedzhaAY1WkCu/5HRED4IV1zaOpcY4Ft6NaOz2dopuamCY1O8jg==", + "integrity": "sha512-qRLxWu3TAsfDYS32im9w1iAnFHWN+Cq6vUQV81zEY6CleKOPvIH6/OpVVMWMyQLo6YqNXkg8X46DuOXO1zRzXg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -615,7 +616,7 @@ "node_modules/@rush-temp/ai-test-framework": { "version": "0.0.0", "resolved": "file:projects/ai-test-framework.tgz", - "integrity": "sha512-ietpdmkdhRcX/T8IGWCkwrzXm0lei44Al+/iBuohqg8mH8uJ5hfmVdvr/6FmZbEVc6OnF9szbXkwO22mbI+Jgw==", + "integrity": "sha512-2SVvZjDWz4Z3my2YUjzT8vSTnehJNzIIPkrjY0j6WBTpF4uFJz9X++B4JdNVzFkGlJggmohSVZSpzsDVcIozUw==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -641,7 +642,7 @@ "node_modules/@rush-temp/applicationinsights-analytics-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-analytics-js.tgz", - "integrity": "sha512-scDYrhHIwHTAT2TWQAWWngRrxPdtY4DskVREGC29/C3RpREt29C3GRtLX2CAu+A9vBAYYsiTEvlaSpgF9WJ8Lw==", + "integrity": "sha512-GuIaShQp5F1Gy+hcIJSN8AIPVpDB5jww42jRSs9uJoq1rHzluGfbAO00mzEEnuEKlXZnXMUaXBlEIbKfPfZTQg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -669,7 +670,7 @@ "node_modules/@rush-temp/applicationinsights-cfgsync-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-cfgsync-js.tgz", - "integrity": "sha512-Bo2vqddxUfqZrSQtJn/13n+VK9YcmBBiv+cNnw262NIreK3UfjyBYIIBLRZXYIA2cWNZc/MOkdzYVDGh0GR2Zw==", + "integrity": "sha512-fkvjhxyk71KxcXQj8jjCaM2htxvlJ+O8YztohXJuxzLk7acfv2IDuRhiok6LwPv/9xiAsOxLPrlUjr/7HYiMGg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -698,7 +699,7 @@ "node_modules/@rush-temp/applicationinsights-channel-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-channel-js.tgz", - "integrity": "sha512-aReejal37ipulAsn5hwmJF5FR5OiUUTtobB4dUfNOSNPwjSW+ZPY+qi9h/ormxhVOY68iZkVSVu0Dbq0h8ddkA==", + "integrity": "sha512-npoNQKfPegcxc669utbE1FUps3r4zDW32g8eTy77KdsuaR7v4Ruqna/+yVJgig7HjUNLEwPAjc0tOKr6ANWwWg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -725,7 +726,7 @@ "node_modules/@rush-temp/applicationinsights-chrome-debug-extension": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-chrome-debug-extension.tgz", - "integrity": "sha512-IAG59CWWaqyiBvnAISlRaPd0htjOh0AybF7jWUVTbbp7TKsfD6v45UkjE6uK0gPaJYZkPU5DKXZVt0jTdsXsEA==", + "integrity": "sha512-x9HcipbfmUfLIQLliA19GXuWG0qf01IiJ9SQwXUBlnHMFlCdxOpPSXi6WmkRY2rFz38L2MTSVKVeMJkl+5GRig==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -759,7 +760,7 @@ "node_modules/@rush-temp/applicationinsights-clickanalytics-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-clickanalytics-js.tgz", - "integrity": "sha512-ZCsfXKF/fQzKSAKv+DRPibpuaGUyUh8qcUBcUT8eedBYcv3Ex5yNBtAIsEK8Eong52hrPAue8cIhOY60j7mh9w==", + "integrity": "sha512-+gFkRkAH8Yi8UF1T52stxcufxwDogEC83r1d2uh30NvBsSOFpOVS+QlRCaDusPgYKKun06avyW9mK+FK584lBg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -784,7 +785,7 @@ "node_modules/@rush-temp/applicationinsights-common": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-common.tgz", - "integrity": "sha512-YRM15mnoFPV2MTsZG5zPOjzjruxP7/kIl45P/tCJmBXx2hjyQyYYPuSGOv/bgd0yT5UORy/efqHjhPiT4l5I7Q==", + "integrity": "sha512-rPuadg12JrTTuirmq8vsU91epteKdJiu5rpx/d8YBLTMK5n0yZD8Chb7K1aK21xJTXz+pMdIklpEImLASx76eA==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -810,7 +811,7 @@ "node_modules/@rush-temp/applicationinsights-core-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-core-js.tgz", - "integrity": "sha512-6+1rPbnq80W5DGQ/+E0GG6EdTy8FsE1qrPQF3XkueLIeAkmXS19+6CWyTso+GrWgYvX0SInxxIftONND/MqwaQ==", + "integrity": "sha512-6OOUEtGGsVMkwdrMbyviGzqvhx+fltBlC6eVXsBIMAQqLR0Kn8pZrSIEig2Z8DAxkv7w8/ODNDFfLIpoJrs3hA==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -839,7 +840,7 @@ "node_modules/@rush-temp/applicationinsights-debugplugin-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-debugplugin-js.tgz", - "integrity": "sha512-f0FxzTf9W8JVpOh69wm1HNtAIm+1xAAppPk/f3jvAOXk0ZQQ01xWxLq8TuWVNlLqixGVz7z/19JC5gX8vZNtPQ==", + "integrity": "sha512-jsMJ/VDxjnUebk+7sGDcba5Kqw/6Vr900rEcmLefJf93cxKI3N3Aeb4vJB85QyZzUoJizGK4AaD7eWAe5C/xkg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -864,7 +865,7 @@ "node_modules/@rush-temp/applicationinsights-dependencies-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-dependencies-js.tgz", - "integrity": "sha512-Ob+2tRboPpG8WlLNnwgT7scZeVJASvVaQG7HfgGq4x3I8XweHgqn5meXW3liXZEPdn5nOuWzZZX4bui980UXzQ==", + "integrity": "sha512-HvUL9Mce/JDCr62oLv654ljgwSPwvzz/YqaXRR+ik7qImCnHHYejHZAzjkG7tmb5sNknkUZvUE8Rngq8BNFZeQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -892,7 +893,7 @@ "node_modules/@rush-temp/applicationinsights-example-aisku": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-aisku.tgz", - "integrity": "sha512-bxZYy2Wp4fFXXrZirKG7Syri/YW2FxMnBSUJ8CjudqmKZfmZylCpR5Nn7j0rnqtpf3L2+MMHEKIzU841U1aJ2w==", + "integrity": "sha512-zz/JP7vwva7Bse7g4mdKbxR6Xhbe3Ephfo0Us0/VJ/MnUHRLrnGxABCpu2/dAvPPWzzEscgW/jlNXCbYF9FOQw==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.10.5 < 2.x", @@ -910,7 +911,7 @@ "node_modules/@rush-temp/applicationinsights-example-cfgsync": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-cfgsync.tgz", - "integrity": "sha512-ZqUL4JdVT9w3RE9AAPO3Q8QSPETyQYz8p78oJey4La9mqARRpsSMTkAvDuMYrHEMAd/2FCq8LVj3T8Uy6GfbpA==", + "integrity": "sha512-326ZVcx7kVyYkm0FCOsnHVEWC5j9nWb5veuxXhyi85RzoVtSMKjW6pDmwM/4Kxe3HiliOX72FSdLMOVLEr7/zg==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -936,7 +937,7 @@ "node_modules/@rush-temp/applicationinsights-example-dependencies": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-dependencies.tgz", - "integrity": "sha512-iOe85orFoc8hZ1DjohKQU1Odg6uZIjfpUr6VSLVoSKDSi5vZIn10FA4NQhcvE5jdYoXKHCqFNkByiMJXCmWFhQ==", + "integrity": "sha512-fZYwlC4XFxGg/K+AhRhEYv9BEJ2v1OweUtHfGWMl2MM4kRZifPCkZeIDImm3XoXqk+jeG/BgLFZhHpw3EcPdcw==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.10.5 < 2.x", @@ -954,7 +955,7 @@ "node_modules/@rush-temp/applicationinsights-example-shared-worker": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-shared-worker.tgz", - "integrity": "sha512-8HavJ6362hJZlxJ0j5AkxNYJu03lPsF66XDi7NijZtEZVDjZMNSMvgp0gY3DnXWIFXxO4tNqRYFTbNAccEztpg==", + "integrity": "sha512-r5IOuNEQd4aufPOREyi2o67Quq/ONEw1tIYZz5uBeHttLffRlBuE9E0RVye47igBrJedwGh/nEHW0NIEx9RQag==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -980,7 +981,7 @@ "node_modules/@rush-temp/applicationinsights-js-release-tools": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-js-release-tools.tgz", - "integrity": "sha512-6sVB5NMzKj/P9v9UvZlA/IjQSkGeupaDliSt2IZqy+SlR59Hv335Ekz/5f54xMHu+QiARXJATbjX7lDfCMG8qw==", + "integrity": "sha512-e9jw61D/jeRuLlSL+dQ2bFp8iqw6Q9ZMeboqX0CX0iYwjAPRiN/59ZK66D0UOgggNkqYgSEqgDi+ycw9XRtGnA==", "dependencies": { "globby": "^11.0.0", "grunt": "^1.5.3" @@ -989,7 +990,7 @@ "node_modules/@rush-temp/applicationinsights-offlinechannel-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-offlinechannel-js.tgz", - "integrity": "sha512-X891EJwuKqor4P3fEWmx3UedLwx1NXmElf1k1sj+PT5LDk1BTgvr8pUhI7VGG8cJ60wOB6iTyiVpZSx+CCvJeA==", + "integrity": "sha512-fbOcMfKTkyGgHCAlaIBFIdJzYxgTlCxSlPGdKweCLkOYSL7ZYCI4Ri9fNxUzYaXAvwGWQa0+qlvt8NDHGCmGCQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1016,7 +1017,7 @@ "node_modules/@rush-temp/applicationinsights-perfmarkmeasure-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-perfmarkmeasure-js.tgz", - "integrity": "sha512-ackCxopS/BUNIlHJaBVPwfW4uC3coP0+BgF1S1rQCYpVD4Uv4uiOFc2pg13hBAacG2tsrqKnD6NbWpawVUlR5w==", + "integrity": "sha512-K4KuVmQzmeaUmeJke01FyDsG0POmfTWlttk5Ir4V22dIL5zuVX2vRzkOKNLHkBYQ7BnORIEZ6V8IBvBpBbUOkA==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1041,7 +1042,7 @@ "node_modules/@rush-temp/applicationinsights-properties-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-properties-js.tgz", - "integrity": "sha512-N7bvhe6rUQ/ejT+PVlt1K09dFNqfrjxq7MkLFOgCbRfOIRLnxHktmJnx4UHBEyZQospeBT2qHGHnl2vxUipp/w==", + "integrity": "sha512-BRJ9nL85fDjqCfFZosxJqLAHGHAMT/9UCpRPsLfYGnLVzMGlKn9CbKnG1kL2xd8ygxCm9Fjd+KqSfrQPHwcTlg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1069,7 +1070,7 @@ "node_modules/@rush-temp/applicationinsights-rollup-es5": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-rollup-es5.tgz", - "integrity": "sha512-pZV3ytRYW9T6XrXLTRqAt5c23vrywlwfWQ1rrGVh78hlig+Ns/ZJw+jM4JwgSyvce8hcZiR+z1rm0xpKju+oJA==", + "integrity": "sha512-1Yw2QKlul+WlTRAHhchUxteaSDaeZjskW1H4R3BT7xv7yGZPi0dp4KtKdKAJZQ+/Z+Zxg4XXOWpuDmv/FYmFtQ==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -1093,7 +1094,7 @@ "node_modules/@rush-temp/applicationinsights-rollup-plugin-uglify3-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-rollup-plugin-uglify3-js.tgz", - "integrity": "sha512-WtYrHtc+6IgVGmHIahhl2aYUGuloDq9xCX6VuwObLmccrAqmYq0LYbCanjHi8ugorx/zwwQB37yY3y2WfaDGmw==", + "integrity": "sha512-gp8gJ52kIbJpkT406+PBS7rtyCSUnc72otGxnwywqWCuBJvO1O+qaOCIJBYL/wYk1lDpMKejDqG94vPSSQtnFg==", "dependencies": { "@nevware21/grunt-eslint-ts": "^0.2.2", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -1114,7 +1115,7 @@ "node_modules/@rush-temp/applicationinsights-shims": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-shims.tgz", - "integrity": "sha512-c3v8k8LpP4R6enyC0SRH/GiHaWiJagx94abvfoig0v0T2Tj+1zz8S5wL6WaDSn1P1py02l31qBUUyoNc7r86/g==", + "integrity": "sha512-7fRAilTI2OwX4puyMNFsxgeQskMNCIBYRBKXTKsdOWvBDAh6NOaCqhFb8uMseiXC30XZuHUZRUPDYUVZ+pb9nA==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -1136,7 +1137,7 @@ "node_modules/@rush-temp/applicationinsights-teechannel-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-teechannel-js.tgz", - "integrity": "sha512-2m6lgL8bWMR4apxizHKr+ujkeMTQt6tg+LT3QMzCab8HMz76FaXN0qh15cxjLmDEEiURolhfnt+RDhK8WFmqAA==", + "integrity": "sha512-NXWQHve+zyf0fGFMEnVHNEw3h1imD8kgmv5+MwwYlAkGNqDBZ1/6i+PxauW25ec8JOTR1TieKYxvyg44qkmZUQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1163,7 +1164,7 @@ "node_modules/@rush-temp/applicationinsights-test-module-type-check": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-test-module-type-check.tgz", - "integrity": "sha512-foafINNT32jvv1i/tqE0pS3Q38funTGDM/d+J72Nw/rLXZkg+Y+FfJbpGZiXvXlsrv+JEFW2LDxx/GW/8E/tCA==", + "integrity": "sha512-D91nqWWpovsHlJnDgAD51wKzZtn2AGzC2+Bxn9G2sPrBU2Y1Tjy7O0GMVHJ7KgxXeHaHgVEGcBaRzEpWxHb86g==", "dependencies": { "tslib": "*", "typescript": "^4.9.3" @@ -1172,7 +1173,7 @@ "node_modules/@rush-temp/applicationinsights-web": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web.tgz", - "integrity": "sha512-7GpahiMJWBob2HGregZ6/EihuW0SxasLBfZcFOddwoPN8tsfHIQ8PMB20ZoBwK5YDyODYkC2NvxjQGegbc25EQ==", + "integrity": "sha512-opemTNvlWqVOpfJM7khnsOCzLw3KO+OwsLVDXMJmO7Z4aCFHMjwmO/2nCyfCOlOMrYyzBrxg7beIdbovErNNUQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1204,7 +1205,7 @@ "node_modules/@rush-temp/applicationinsights-web-basic": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web-basic.tgz", - "integrity": "sha512-/sjk5WbM5+7F6xkJsvvX5slYGa7Qki9ajLbicHYW75tumNjS/wyapBINb511tw4Bf146zV8QtL2PMmerMe00WA==", + "integrity": "sha512-iuVLcZ8NBhO92rASSoGoMXWpS8wG13qC4GBGirxTMTj0p9TunqjBG0JVgMlzX20GG+750/2JHtPPkWJ0Gy65qQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1231,12 +1232,12 @@ "node_modules/@rush-temp/applicationinsights-web-config": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web-config.tgz", - "integrity": "sha512-WwlTM/noixyLMqKFBLKa9o88N/2Z3dA9m0R6Qc9UvBNseZqPIpvl1vRMDnmwjMMV6lV3FsmeSmjD7LCJphXF2Q==" + "integrity": "sha512-FwPOZ+esirRqdKg9s7VTxtWqGJ9CQ/gIJ0PfUvTolAF9JZCVw5wQeHD4Tv/KiziZhB50CNaGshnPmLpWGVzo9g==" }, "node_modules/@rush-temp/applicationinsights-web-snippet": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web-snippet.tgz", - "integrity": "sha512-P6Z3tVdzCZ6NW7Kvh+eDrYIaG5IZJYIsprrpDkz1KSveOQEPVKYyRYQFKiHfFzJ48uD9jY7i8dv3g9YTV2OuRw==", + "integrity": "sha512-GJu1HqT6Lo3Z7/qVfL24rx99i8tyr76ng7o/NHe4sbMINT2E21WVCLUt6AV2xHr9vJqChxzNq5FkgbVn5nCoRQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1489,9 +1490,9 @@ "integrity": "sha512-gVB+rxvxmbyPFWa6yjjKgcumWal3hyqoTXI0Oil161uWfo1OCzWZ/rnEumsx+6uVgrwPrCrhpQbLkzfildkSbg==" }, "node_modules/@types/react": { - "version": "16.14.58", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.58.tgz", - "integrity": "sha512-F8FNMutMPDU2AitpdmBUZozvli+0oCMdgRXG5dY+01gHxYsw6i+dX7HAoYE7k1inZ0ATNVbsjOfrWptUy+kbvA==", + "version": "16.14.59", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.59.tgz", + "integrity": "sha512-tOV7Za9TpBGi0jyi/fjsUmuFM1svfInVsBCkpQcwNDkVL8MEN1aV3FxjI4wYaASMlVE6NZXXx06zaN4rtRPwyQ==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -1545,16 +1546,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz", + "integrity": "sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==", "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/type-utils": "7.3.1", + "@typescript-eslint/utils": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -1563,7 +1564,7 @@ "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1580,19 +1581,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.3.1.tgz", + "integrity": "sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==", "peer": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1608,16 +1609,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz", + "integrity": "sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==", "peer": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1625,18 +1626,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz", + "integrity": "sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==", "peer": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/utils": "7.3.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1652,12 +1653,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz", + "integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==", "peer": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1665,13 +1666,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz", + "integrity": "sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==", "peer": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1680,7 +1681,7 @@ "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1717,21 +1718,21 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.3.1.tgz", + "integrity": "sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", "semver": "^7.5.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -1742,16 +1743,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz", + "integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==", "peer": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/types": "7.3.1", "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2180,9 +2181,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "version": "1.0.30001599", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", + "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==", "funding": [ { "type": "opencollective", @@ -2576,9 +2577,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.706", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.706.tgz", - "integrity": "sha512-fO01fufoGd6jKK3HR8ofBapF3ZPfgxNJ/ua9xQAhFu93TwWIs4d+weDn3kje3GB4S7aGUTfk5nvdU5F7z5mF9Q==" + "version": "1.4.711", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", + "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -4787,9 +4788,9 @@ } }, "node_modules/picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -4882,6 +4883,11 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -6058,11 +6064,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/update-browserslist-db/node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6305,13 +6306,14 @@ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" }, "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "requires": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "dependencies": { "ansi-styles": { @@ -6443,9 +6445,9 @@ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@microsoft/api-extractor": { - "version": "7.42.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.42.3.tgz", - "integrity": "sha512-JNLJFpGHz6ekjS6bvYXxUBeRGnSHeCMFNvRbCQ+7XXB/ZFrgLSMPwWtEq40AiWAy+oyG5a4RSNwdJTp0B2USvQ==", + "version": "7.43.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.43.0.tgz", + "integrity": "sha512-GFhTcJpB+MI6FhvXEI9b2K0snulNLWHqC/BbcJtyNYcKUiw7l3Lgis5ApsYncJ0leALX7/of4XfmXk+maT111w==", "requires": { "@microsoft/api-extractor-model": "7.28.13", "@microsoft/tsdoc": "0.14.2", @@ -6459,13 +6461,13 @@ "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "5.3.3" + "typescript": "5.4.2" }, "dependencies": { "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==" + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==" } } }, @@ -6537,9 +6539,9 @@ } }, "@nevware21/ts-utils": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.10.5.tgz", - "integrity": "sha512-+TEvP0+l/VBR5bJZoYFV+o6aQQ1O6y80uys5AVyyCKeWvrgWu/yNydqSBQNsk4BuEfkayg7R9+HCJRRRIvptTA==" + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@nevware21/ts-utils/-/ts-utils-0.11.0.tgz", + "integrity": "sha512-3yrohCSKYBLKrW41fYkZorN2rf9GYr/4Cb4Xu9fWCyXgVDyt1uLgMaCinhx0kEkEUfME3Smqs+2itJRhXgCo8Q==" }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -6631,7 +6633,7 @@ }, "@rush-temp/1ds-core-js": { "version": "file:projects\\1ds-core-js.tgz", - "integrity": "sha512-Yenyn/vf5rOTX1VK1fPVY+Bf8DVK/t3TNPBX6bBya6/XveHbC3TqhygFegZQGAaEMsMP8UhFk0EZSIFwLZOe9g==", + "integrity": "sha512-aMB4Pz8GKaj8Mp6iV3oqtBZ9uB7M5LM+MujhpZ/SGq6ddJen+Z6KfihACBI1CPrhE1QfT8gRNodjwK87Bl2bfg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6658,7 +6660,7 @@ }, "@rush-temp/1ds-post-js": { "version": "file:projects\\1ds-post-js.tgz", - "integrity": "sha512-9qFMH6i7lRRBEOcSfg8irJhtgSnhdmfaEtKCedzhaAY1WkCu/5HRED4IV1zaOpcY4Ft6NaOz2dopuamCY1O8jg==", + "integrity": "sha512-qRLxWu3TAsfDYS32im9w1iAnFHWN+Cq6vUQV81zEY6CleKOPvIH6/OpVVMWMyQLo6YqNXkg8X46DuOXO1zRzXg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6679,7 +6681,7 @@ }, "@rush-temp/ai-test-framework": { "version": "file:projects\\ai-test-framework.tgz", - "integrity": "sha512-ietpdmkdhRcX/T8IGWCkwrzXm0lei44Al+/iBuohqg8mH8uJ5hfmVdvr/6FmZbEVc6OnF9szbXkwO22mbI+Jgw==", + "integrity": "sha512-2SVvZjDWz4Z3my2YUjzT8vSTnehJNzIIPkrjY0j6WBTpF4uFJz9X++B4JdNVzFkGlJggmohSVZSpzsDVcIozUw==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -6704,7 +6706,7 @@ }, "@rush-temp/applicationinsights-analytics-js": { "version": "file:projects\\applicationinsights-analytics-js.tgz", - "integrity": "sha512-scDYrhHIwHTAT2TWQAWWngRrxPdtY4DskVREGC29/C3RpREt29C3GRtLX2CAu+A9vBAYYsiTEvlaSpgF9WJ8Lw==", + "integrity": "sha512-GuIaShQp5F1Gy+hcIJSN8AIPVpDB5jww42jRSs9uJoq1rHzluGfbAO00mzEEnuEKlXZnXMUaXBlEIbKfPfZTQg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6731,7 +6733,7 @@ }, "@rush-temp/applicationinsights-cfgsync-js": { "version": "file:projects\\applicationinsights-cfgsync-js.tgz", - "integrity": "sha512-Bo2vqddxUfqZrSQtJn/13n+VK9YcmBBiv+cNnw262NIreK3UfjyBYIIBLRZXYIA2cWNZc/MOkdzYVDGh0GR2Zw==", + "integrity": "sha512-fkvjhxyk71KxcXQj8jjCaM2htxvlJ+O8YztohXJuxzLk7acfv2IDuRhiok6LwPv/9xiAsOxLPrlUjr/7HYiMGg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6759,7 +6761,7 @@ }, "@rush-temp/applicationinsights-channel-js": { "version": "file:projects\\applicationinsights-channel-js.tgz", - "integrity": "sha512-aReejal37ipulAsn5hwmJF5FR5OiUUTtobB4dUfNOSNPwjSW+ZPY+qi9h/ormxhVOY68iZkVSVu0Dbq0h8ddkA==", + "integrity": "sha512-npoNQKfPegcxc669utbE1FUps3r4zDW32g8eTy77KdsuaR7v4Ruqna/+yVJgig7HjUNLEwPAjc0tOKr6ANWwWg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6785,7 +6787,7 @@ }, "@rush-temp/applicationinsights-chrome-debug-extension": { "version": "file:projects\\applicationinsights-chrome-debug-extension.tgz", - "integrity": "sha512-IAG59CWWaqyiBvnAISlRaPd0htjOh0AybF7jWUVTbbp7TKsfD6v45UkjE6uK0gPaJYZkPU5DKXZVt0jTdsXsEA==", + "integrity": "sha512-x9HcipbfmUfLIQLliA19GXuWG0qf01IiJ9SQwXUBlnHMFlCdxOpPSXi6WmkRY2rFz38L2MTSVKVeMJkl+5GRig==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -6818,7 +6820,7 @@ }, "@rush-temp/applicationinsights-clickanalytics-js": { "version": "file:projects\\applicationinsights-clickanalytics-js.tgz", - "integrity": "sha512-ZCsfXKF/fQzKSAKv+DRPibpuaGUyUh8qcUBcUT8eedBYcv3Ex5yNBtAIsEK8Eong52hrPAue8cIhOY60j7mh9w==", + "integrity": "sha512-+gFkRkAH8Yi8UF1T52stxcufxwDogEC83r1d2uh30NvBsSOFpOVS+QlRCaDusPgYKKun06avyW9mK+FK584lBg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6842,7 +6844,7 @@ }, "@rush-temp/applicationinsights-common": { "version": "file:projects\\applicationinsights-common.tgz", - "integrity": "sha512-YRM15mnoFPV2MTsZG5zPOjzjruxP7/kIl45P/tCJmBXx2hjyQyYYPuSGOv/bgd0yT5UORy/efqHjhPiT4l5I7Q==", + "integrity": "sha512-rPuadg12JrTTuirmq8vsU91epteKdJiu5rpx/d8YBLTMK5n0yZD8Chb7K1aK21xJTXz+pMdIklpEImLASx76eA==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6867,7 +6869,7 @@ }, "@rush-temp/applicationinsights-core-js": { "version": "file:projects\\applicationinsights-core-js.tgz", - "integrity": "sha512-6+1rPbnq80W5DGQ/+E0GG6EdTy8FsE1qrPQF3XkueLIeAkmXS19+6CWyTso+GrWgYvX0SInxxIftONND/MqwaQ==", + "integrity": "sha512-6OOUEtGGsVMkwdrMbyviGzqvhx+fltBlC6eVXsBIMAQqLR0Kn8pZrSIEig2Z8DAxkv7w8/ODNDFfLIpoJrs3hA==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6895,7 +6897,7 @@ }, "@rush-temp/applicationinsights-debugplugin-js": { "version": "file:projects\\applicationinsights-debugplugin-js.tgz", - "integrity": "sha512-f0FxzTf9W8JVpOh69wm1HNtAIm+1xAAppPk/f3jvAOXk0ZQQ01xWxLq8TuWVNlLqixGVz7z/19JC5gX8vZNtPQ==", + "integrity": "sha512-jsMJ/VDxjnUebk+7sGDcba5Kqw/6Vr900rEcmLefJf93cxKI3N3Aeb4vJB85QyZzUoJizGK4AaD7eWAe5C/xkg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6919,7 +6921,7 @@ }, "@rush-temp/applicationinsights-dependencies-js": { "version": "file:projects\\applicationinsights-dependencies-js.tgz", - "integrity": "sha512-Ob+2tRboPpG8WlLNnwgT7scZeVJASvVaQG7HfgGq4x3I8XweHgqn5meXW3liXZEPdn5nOuWzZZX4bui980UXzQ==", + "integrity": "sha512-HvUL9Mce/JDCr62oLv654ljgwSPwvzz/YqaXRR+ik7qImCnHHYejHZAzjkG7tmb5sNknkUZvUE8Rngq8BNFZeQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6946,7 +6948,7 @@ }, "@rush-temp/applicationinsights-example-aisku": { "version": "file:projects\\applicationinsights-example-aisku.tgz", - "integrity": "sha512-bxZYy2Wp4fFXXrZirKG7Syri/YW2FxMnBSUJ8CjudqmKZfmZylCpR5Nn7j0rnqtpf3L2+MMHEKIzU841U1aJ2w==", + "integrity": "sha512-zz/JP7vwva7Bse7g4mdKbxR6Xhbe3Ephfo0Us0/VJ/MnUHRLrnGxABCpu2/dAvPPWzzEscgW/jlNXCbYF9FOQw==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.10.5 < 2.x", @@ -6963,7 +6965,7 @@ }, "@rush-temp/applicationinsights-example-cfgsync": { "version": "file:projects\\applicationinsights-example-cfgsync.tgz", - "integrity": "sha512-ZqUL4JdVT9w3RE9AAPO3Q8QSPETyQYz8p78oJey4La9mqARRpsSMTkAvDuMYrHEMAd/2FCq8LVj3T8Uy6GfbpA==", + "integrity": "sha512-326ZVcx7kVyYkm0FCOsnHVEWC5j9nWb5veuxXhyi85RzoVtSMKjW6pDmwM/4Kxe3HiliOX72FSdLMOVLEr7/zg==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -6988,7 +6990,7 @@ }, "@rush-temp/applicationinsights-example-dependencies": { "version": "file:projects\\applicationinsights-example-dependencies.tgz", - "integrity": "sha512-iOe85orFoc8hZ1DjohKQU1Odg6uZIjfpUr6VSLVoSKDSi5vZIn10FA4NQhcvE5jdYoXKHCqFNkByiMJXCmWFhQ==", + "integrity": "sha512-fZYwlC4XFxGg/K+AhRhEYv9BEJ2v1OweUtHfGWMl2MM4kRZifPCkZeIDImm3XoXqk+jeG/BgLFZhHpw3EcPdcw==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.10.5 < 2.x", @@ -7005,7 +7007,7 @@ }, "@rush-temp/applicationinsights-example-shared-worker": { "version": "file:projects\\applicationinsights-example-shared-worker.tgz", - "integrity": "sha512-8HavJ6362hJZlxJ0j5AkxNYJu03lPsF66XDi7NijZtEZVDjZMNSMvgp0gY3DnXWIFXxO4tNqRYFTbNAccEztpg==", + "integrity": "sha512-r5IOuNEQd4aufPOREyi2o67Quq/ONEw1tIYZz5uBeHttLffRlBuE9E0RVye47igBrJedwGh/nEHW0NIEx9RQag==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -7030,7 +7032,7 @@ }, "@rush-temp/applicationinsights-js-release-tools": { "version": "file:projects\\applicationinsights-js-release-tools.tgz", - "integrity": "sha512-6sVB5NMzKj/P9v9UvZlA/IjQSkGeupaDliSt2IZqy+SlR59Hv335Ekz/5f54xMHu+QiARXJATbjX7lDfCMG8qw==", + "integrity": "sha512-e9jw61D/jeRuLlSL+dQ2bFp8iqw6Q9ZMeboqX0CX0iYwjAPRiN/59ZK66D0UOgggNkqYgSEqgDi+ycw9XRtGnA==", "requires": { "globby": "^11.0.0", "grunt": "^1.5.3" @@ -7038,7 +7040,7 @@ }, "@rush-temp/applicationinsights-offlinechannel-js": { "version": "file:projects\\applicationinsights-offlinechannel-js.tgz", - "integrity": "sha512-X891EJwuKqor4P3fEWmx3UedLwx1NXmElf1k1sj+PT5LDk1BTgvr8pUhI7VGG8cJ60wOB6iTyiVpZSx+CCvJeA==", + "integrity": "sha512-fbOcMfKTkyGgHCAlaIBFIdJzYxgTlCxSlPGdKweCLkOYSL7ZYCI4Ri9fNxUzYaXAvwGWQa0+qlvt8NDHGCmGCQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7064,7 +7066,7 @@ }, "@rush-temp/applicationinsights-perfmarkmeasure-js": { "version": "file:projects\\applicationinsights-perfmarkmeasure-js.tgz", - "integrity": "sha512-ackCxopS/BUNIlHJaBVPwfW4uC3coP0+BgF1S1rQCYpVD4Uv4uiOFc2pg13hBAacG2tsrqKnD6NbWpawVUlR5w==", + "integrity": "sha512-K4KuVmQzmeaUmeJke01FyDsG0POmfTWlttk5Ir4V22dIL5zuVX2vRzkOKNLHkBYQ7BnORIEZ6V8IBvBpBbUOkA==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7088,7 +7090,7 @@ }, "@rush-temp/applicationinsights-properties-js": { "version": "file:projects\\applicationinsights-properties-js.tgz", - "integrity": "sha512-N7bvhe6rUQ/ejT+PVlt1K09dFNqfrjxq7MkLFOgCbRfOIRLnxHktmJnx4UHBEyZQospeBT2qHGHnl2vxUipp/w==", + "integrity": "sha512-BRJ9nL85fDjqCfFZosxJqLAHGHAMT/9UCpRPsLfYGnLVzMGlKn9CbKnG1kL2xd8ygxCm9Fjd+KqSfrQPHwcTlg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7115,7 +7117,7 @@ }, "@rush-temp/applicationinsights-rollup-es5": { "version": "file:projects\\applicationinsights-rollup-es5.tgz", - "integrity": "sha512-pZV3ytRYW9T6XrXLTRqAt5c23vrywlwfWQ1rrGVh78hlig+Ns/ZJw+jM4JwgSyvce8hcZiR+z1rm0xpKju+oJA==", + "integrity": "sha512-1Yw2QKlul+WlTRAHhchUxteaSDaeZjskW1H4R3BT7xv7yGZPi0dp4KtKdKAJZQ+/Z+Zxg4XXOWpuDmv/FYmFtQ==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -7138,7 +7140,7 @@ }, "@rush-temp/applicationinsights-rollup-plugin-uglify3-js": { "version": "file:projects\\applicationinsights-rollup-plugin-uglify3-js.tgz", - "integrity": "sha512-WtYrHtc+6IgVGmHIahhl2aYUGuloDq9xCX6VuwObLmccrAqmYq0LYbCanjHi8ugorx/zwwQB37yY3y2WfaDGmw==", + "integrity": "sha512-gp8gJ52kIbJpkT406+PBS7rtyCSUnc72otGxnwywqWCuBJvO1O+qaOCIJBYL/wYk1lDpMKejDqG94vPSSQtnFg==", "requires": { "@nevware21/grunt-eslint-ts": "^0.2.2", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -7158,7 +7160,7 @@ }, "@rush-temp/applicationinsights-shims": { "version": "file:projects\\applicationinsights-shims.tgz", - "integrity": "sha512-c3v8k8LpP4R6enyC0SRH/GiHaWiJagx94abvfoig0v0T2Tj+1zz8S5wL6WaDSn1P1py02l31qBUUyoNc7r86/g==", + "integrity": "sha512-7fRAilTI2OwX4puyMNFsxgeQskMNCIBYRBKXTKsdOWvBDAh6NOaCqhFb8uMseiXC30XZuHUZRUPDYUVZ+pb9nA==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -7179,7 +7181,7 @@ }, "@rush-temp/applicationinsights-teechannel-js": { "version": "file:projects\\applicationinsights-teechannel-js.tgz", - "integrity": "sha512-2m6lgL8bWMR4apxizHKr+ujkeMTQt6tg+LT3QMzCab8HMz76FaXN0qh15cxjLmDEEiURolhfnt+RDhK8WFmqAA==", + "integrity": "sha512-NXWQHve+zyf0fGFMEnVHNEw3h1imD8kgmv5+MwwYlAkGNqDBZ1/6i+PxauW25ec8JOTR1TieKYxvyg44qkmZUQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7205,7 +7207,7 @@ }, "@rush-temp/applicationinsights-test-module-type-check": { "version": "file:projects\\applicationinsights-test-module-type-check.tgz", - "integrity": "sha512-foafINNT32jvv1i/tqE0pS3Q38funTGDM/d+J72Nw/rLXZkg+Y+FfJbpGZiXvXlsrv+JEFW2LDxx/GW/8E/tCA==", + "integrity": "sha512-D91nqWWpovsHlJnDgAD51wKzZtn2AGzC2+Bxn9G2sPrBU2Y1Tjy7O0GMVHJ7KgxXeHaHgVEGcBaRzEpWxHb86g==", "requires": { "tslib": "*", "typescript": "^4.9.3" @@ -7213,7 +7215,7 @@ }, "@rush-temp/applicationinsights-web": { "version": "file:projects\\applicationinsights-web.tgz", - "integrity": "sha512-7GpahiMJWBob2HGregZ6/EihuW0SxasLBfZcFOddwoPN8tsfHIQ8PMB20ZoBwK5YDyODYkC2NvxjQGegbc25EQ==", + "integrity": "sha512-opemTNvlWqVOpfJM7khnsOCzLw3KO+OwsLVDXMJmO7Z4aCFHMjwmO/2nCyfCOlOMrYyzBrxg7beIdbovErNNUQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7244,7 +7246,7 @@ }, "@rush-temp/applicationinsights-web-basic": { "version": "file:projects\\applicationinsights-web-basic.tgz", - "integrity": "sha512-/sjk5WbM5+7F6xkJsvvX5slYGa7Qki9ajLbicHYW75tumNjS/wyapBINb511tw4Bf146zV8QtL2PMmerMe00WA==", + "integrity": "sha512-iuVLcZ8NBhO92rASSoGoMXWpS8wG13qC4GBGirxTMTj0p9TunqjBG0JVgMlzX20GG+750/2JHtPPkWJ0Gy65qQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7270,11 +7272,11 @@ }, "@rush-temp/applicationinsights-web-config": { "version": "file:projects\\applicationinsights-web-config.tgz", - "integrity": "sha512-WwlTM/noixyLMqKFBLKa9o88N/2Z3dA9m0R6Qc9UvBNseZqPIpvl1vRMDnmwjMMV6lV3FsmeSmjD7LCJphXF2Q==" + "integrity": "sha512-FwPOZ+esirRqdKg9s7VTxtWqGJ9CQ/gIJ0PfUvTolAF9JZCVw5wQeHD4Tv/KiziZhB50CNaGshnPmLpWGVzo9g==" }, "@rush-temp/applicationinsights-web-snippet": { "version": "file:projects\\applicationinsights-web-snippet.tgz", - "integrity": "sha512-P6Z3tVdzCZ6NW7Kvh+eDrYIaG5IZJYIsprrpDkz1KSveOQEPVKYyRYQFKiHfFzJ48uD9jY7i8dv3g9YTV2OuRw==", + "integrity": "sha512-GJu1HqT6Lo3Z7/qVfL24rx99i8tyr76ng7o/NHe4sbMINT2E21WVCLUt6AV2xHr9vJqChxzNq5FkgbVn5nCoRQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7502,9 +7504,9 @@ "integrity": "sha512-gVB+rxvxmbyPFWa6yjjKgcumWal3hyqoTXI0Oil161uWfo1OCzWZ/rnEumsx+6uVgrwPrCrhpQbLkzfildkSbg==" }, "@types/react": { - "version": "16.14.58", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.58.tgz", - "integrity": "sha512-F8FNMutMPDU2AitpdmBUZozvli+0oCMdgRXG5dY+01gHxYsw6i+dX7HAoYE7k1inZ0ATNVbsjOfrWptUy+kbvA==", + "version": "16.14.59", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.59.tgz", + "integrity": "sha512-tOV7Za9TpBGi0jyi/fjsUmuFM1svfInVsBCkpQcwNDkVL8MEN1aV3FxjI4wYaASMlVE6NZXXx06zaN4rtRPwyQ==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -7558,16 +7560,16 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", - "integrity": "sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz", + "integrity": "sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==", "peer": true, "requires": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/type-utils": "7.2.0", - "@typescript-eslint/utils": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/type-utils": "7.3.1", + "@typescript-eslint/utils": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -7577,54 +7579,54 @@ } }, "@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.3.1.tgz", + "integrity": "sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==", "peer": true, "requires": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz", + "integrity": "sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==", "peer": true, "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1" } }, "@typescript-eslint/type-utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.2.0.tgz", - "integrity": "sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz", + "integrity": "sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==", "peer": true, "requires": { - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/utils": "7.2.0", + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/utils": "7.3.1", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" } }, "@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz", + "integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==", "peer": true }, "@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz", + "integrity": "sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==", "peer": true, "requires": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7654,27 +7656,27 @@ } }, "@typescript-eslint/utils": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.2.0.tgz", - "integrity": "sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.3.1.tgz", + "integrity": "sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==", "peer": true, "requires": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", "semver": "^7.5.4" } }, "@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz", + "integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==", "peer": true, "requires": { - "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/types": "7.3.1", "eslint-visitor-keys": "^3.4.1" } }, @@ -7973,9 +7975,9 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==" + "version": "1.0.30001599", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001599.tgz", + "integrity": "sha512-LRAQHZ4yT1+f9LemSMeqdMpMxZcc4RMWdj4tiFe3G8tNkWK+E58g+/tzotb5cU6TbcVJLr4fySiAW7XmxQvZQA==" }, "chalk": { "version": "4.1.2", @@ -8265,9 +8267,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.706", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.706.tgz", - "integrity": "sha512-fO01fufoGd6jKK3HR8ofBapF3ZPfgxNJ/ua9xQAhFu93TwWIs4d+weDn3kje3GB4S7aGUTfk5nvdU5F7z5mF9Q==" + "version": "1.4.711", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.711.tgz", + "integrity": "sha512-hRg81qzvUEibX2lDxnFlVCHACa+LtrCPIsWAxo161LDYIB3jauf57RGsMZV9mvGwE98yGH06icj3zBEoOkxd/w==" }, "encodeurl": { "version": "1.0.2", @@ -9949,9 +9951,9 @@ "integrity": "sha512-L7MXxUDtqr4PUaLFCDCXBfGV/6KLIuSEccizDI7JxT+c9x1G1v04BQ4+4oag84SHaCdrBgQAIs/Cqn+flwFPng==" }, "picocolors": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", - "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", @@ -10008,6 +10010,13 @@ "requires": { "picocolors": "^0.2.1", "source-map": "^0.6.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + } } }, "postcss-value-parser": { @@ -10869,13 +10878,6 @@ "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" - }, - "dependencies": { - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - } } }, "uri-js": { diff --git a/extensions/applicationinsights-analytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/extensions/applicationinsights-analytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/extensions/applicationinsights-analytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/extensions/applicationinsights-analytics-js/Tests/Unit/src/appinsights-analytics.tests.ts b/extensions/applicationinsights-analytics-js/Tests/Unit/src/appinsights-analytics.tests.ts index ae3bb504c..3e4b83ca7 100644 --- a/extensions/applicationinsights-analytics-js/Tests/Unit/src/appinsights-analytics.tests.ts +++ b/extensions/applicationinsights-analytics-js/Tests/Unit/src/appinsights-analytics.tests.ts @@ -1,8 +1,10 @@ import { AnalyticsPluginTests } from './AnalyticsPlugin.tests'; import { TelemetryItemCreatorTests } from './TelemetryItemCreator.tests'; import { AnalyticsExtensionSizeCheck } from "./AnalyticsExtensionSize.tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new AnalyticsPluginTests().registerTests(); new TelemetryItemCreatorTests().registerTests(); new AnalyticsExtensionSizeCheck().registerTests(); diff --git a/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsync.tests.ts b/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsync.tests.ts index 92792bdcf..4afb1b311 100644 --- a/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsync.tests.ts +++ b/extensions/applicationinsights-cfgsync-js/Tests/Unit/src/cfgsync.tests.ts @@ -1,7 +1,9 @@ import { CfgSyncHelperTests } from "./cfgsynchelper.tests"; import {CfgSyncPluginTests} from "./cfgsyncplugin.tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new CfgSyncPluginTests().registerTests(); new CfgSyncHelperTests().registerTests(); } diff --git a/extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/appinsights-clickanalytics.tests.ts b/extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/appinsights-clickanalytics.tests.ts index 04374873b..ce06a18ae 100644 --- a/extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/appinsights-clickanalytics.tests.ts +++ b/extensions/applicationinsights-clickanalytics-js/Tests/Unit/src/appinsights-clickanalytics.tests.ts @@ -1,5 +1,7 @@ import { ClickEventTest } from './ClickEventTest'; +import { GlobalTestHooks } from './GlobalTestHooks.Test'; export function runTests() { + new GlobalTestHooks().registerTests(); new ClickEventTest().registerTests(); } diff --git a/extensions/applicationinsights-dependencies-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/extensions/applicationinsights-dependencies-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/extensions/applicationinsights-dependencies-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/extensions/applicationinsights-dependencies-js/Tests/Unit/src/dependencies.tests.ts b/extensions/applicationinsights-dependencies-js/Tests/Unit/src/dependencies.tests.ts index 3938bebb8..386bbfb16 100644 --- a/extensions/applicationinsights-dependencies-js/Tests/Unit/src/dependencies.tests.ts +++ b/extensions/applicationinsights-dependencies-js/Tests/Unit/src/dependencies.tests.ts @@ -1,6 +1,8 @@ import { AjaxTests, AjaxPerfTrackTests, AjaxFrozenTests } from "./ajax.tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new AjaxTests().registerTests(); new AjaxPerfTrackTests().registerTests(); new AjaxFrozenTests().registerTests(); diff --git a/extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/appinsights-perfmarkmeasure.tests.ts b/extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/appinsights-perfmarkmeasure.tests.ts index 5a2d0c191..a5d266f63 100644 --- a/extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/appinsights-perfmarkmeasure.tests.ts +++ b/extensions/applicationinsights-perfmarkmeasure-js/Tests/Unit/src/appinsights-perfmarkmeasure.tests.ts @@ -1,5 +1,7 @@ import { MarkMeasureTests } from './MarkMeasureTests'; +import { GlobalTestHooks } from './GlobalTestHooks.Test'; export function runTests() { + new GlobalTestHooks().registerTests(); new MarkMeasureTests().registerTests(); } diff --git a/extensions/applicationinsights-properties-js/Tests/Unit/src/GlobalTestHooks.Test.ts b/extensions/applicationinsights-properties-js/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/extensions/applicationinsights-properties-js/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/extensions/applicationinsights-properties-js/Tests/Unit/src/prop.tests.ts b/extensions/applicationinsights-properties-js/Tests/Unit/src/prop.tests.ts index b81d1977e..be2a55a3f 100644 --- a/extensions/applicationinsights-properties-js/Tests/Unit/src/prop.tests.ts +++ b/extensions/applicationinsights-properties-js/Tests/Unit/src/prop.tests.ts @@ -3,8 +3,10 @@ import { PropertiesTests } from "./properties.tests"; import { SessionManagerTests } from "./SessionManager.Tests"; import { PropertiesExtensionSizeCheck } from "./propertiesSize.tests"; import { TelemetryContextTests } from "./TelemetryContext.Tests"; +import { GlobalTestHooks } from './GlobalTestHooks.Test'; export function runTests() { + new GlobalTestHooks().registerTests(); new PropertiesTests().registerTests(); new SessionManagerTests(false).registerTests(); new SessionManagerTests(true).registerTests(); diff --git a/shared/1ds-core-js/src/Index.ts b/shared/1ds-core-js/src/Index.ts index cbb0d2abe..dbbe476db 100644 --- a/shared/1ds-core-js/src/Index.ts +++ b/shared/1ds-core-js/src/Index.ts @@ -69,7 +69,10 @@ export { IPayloadData, IXHROverride, OnCompleteCallback, SendPOSTFunction, IInternalOfflineSupport, _ISendPostMgrConfig, IBackendResponse, _ISenderOnComplete, SenderPostManager, getResponseText, formatErrorMessageXdr, formatErrorMessageXhr, prependTransports, parseResponse, convertAllHeadersToMap, _getAllResponseHeaders, _appendHeader, _IInternalXhrOverride, _ITimeoutOverrideWrapper, IXDomainRequest, - TransportType + TransportType, + + // Test Hooks + _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; export { diff --git a/shared/1ds-core-js/test/Unit/src/FileSizeCheckTest.ts b/shared/1ds-core-js/test/Unit/src/FileSizeCheckTest.ts index 11bd7c9df..2e1f35752 100644 --- a/shared/1ds-core-js/test/Unit/src/FileSizeCheckTest.ts +++ b/shared/1ds-core-js/test/Unit/src/FileSizeCheckTest.ts @@ -2,7 +2,7 @@ import { AITestClass } from "@microsoft/ai-test-framework"; import * as pako from 'pako'; export class FileSizeCheckTest extends AITestClass { - private readonly MAX_BUNDLE_SIZE = 65; + private readonly MAX_BUNDLE_SIZE = 66; private readonly MAX_DEFLATE_SIZE = 28; private readonly bundleFilePath = "../bundle/es5/ms.core.min.js"; diff --git a/shared/1ds-core-js/test/Unit/src/GlobalTestHooks.Test.ts b/shared/1ds-core-js/test/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/shared/1ds-core-js/test/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/shared/1ds-core-js/test/Unit/src/core.unittests.ts b/shared/1ds-core-js/test/Unit/src/core.unittests.ts index 727a0db05..faa21219d 100644 --- a/shared/1ds-core-js/test/Unit/src/core.unittests.ts +++ b/shared/1ds-core-js/test/Unit/src/core.unittests.ts @@ -5,10 +5,12 @@ import { DynamicProtoTests } from './DynamicProtoTests'; import { UtilsTest } from './UtilsTest'; import { ValueSanitizerTests } from './ValueSanitizerTests'; import {FileSizeCheckTest} from './FileSizeCheckTest' +import { GlobalTestHooks } from './GlobalTestHooks.Test'; export function registerTests() { + new GlobalTestHooks().registerTests(); new CoreTest('CoreTest').registerTests(); new ESPromiseTests('ESPromiseTests').registerTests(); new ESPromiseSchedulerTests('ESPromiseSchedulerTests').registerTests(); diff --git a/shared/AppInsightsCommon/Tests/Unit/src/GlobalTestHooks.Test.ts b/shared/AppInsightsCommon/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..b67bf2fe7 --- /dev/null +++ b/shared/AppInsightsCommon/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "@microsoft/applicationinsights-core-js"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/shared/AppInsightsCommon/Tests/Unit/src/appinsights-common.tests.ts b/shared/AppInsightsCommon/Tests/Unit/src/appinsights-common.tests.ts index a05ddf193..f9ef32c0d 100644 --- a/shared/AppInsightsCommon/Tests/Unit/src/appinsights-common.tests.ts +++ b/shared/AppInsightsCommon/Tests/Unit/src/appinsights-common.tests.ts @@ -5,8 +5,10 @@ import { ConnectionStringParserTests } from "./ConnectionStringParser.tests"; import { SeverityLevelTests } from "./SeverityLevel.tests"; import { RequestHeadersTests } from "./RequestHeaders.tests"; import { ThrottleMgrTest } from "./ThrottleMgr.tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; export function runTests() { + new GlobalTestHooks().registerTests(); new ThrottleMgrTest().registerTests(); new ApplicationInsightsTests().registerTests(); new ExceptionTests().registerTests(); diff --git a/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts b/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts index 534bb39f8..5ee23bcfe 100644 --- a/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts +++ b/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts @@ -1,5 +1,5 @@ import { Assert, AITestClass } from "@microsoft/ai-test-framework"; -import { IConfiguration, ITelemetryPlugin, ITelemetryItem, IPlugin, IAppInsightsCore, normalizeJsName, random32, mwcRandomSeed, newId, randomValue, mwcRandom32, isNullOrUndefined, SenderPostManager, OnCompleteCallback, IPayloadData, _ISenderOnComplete, TransportType, _ISendPostMgrConfig } from "../../../src/applicationinsights-core-js" +import { IConfiguration, ITelemetryPlugin, ITelemetryItem, IPlugin, IAppInsightsCore, normalizeJsName, random32, mwcRandomSeed, newId, randomValue, mwcRandom32, isNullOrUndefined, SenderPostManager, OnCompleteCallback, IPayloadData, _ISenderOnComplete, TransportType, _ISendPostMgrConfig, dumpObj } from "../../../src/applicationinsights-core-js" import { AppInsightsCore } from "../../../src/JavaScriptSDK/AppInsightsCore"; import { IChannelControls } from "../../../src/JavaScriptSDK.Interfaces/IChannelControls"; import { _eInternalMessageId, LoggingSeverity } from "../../../src/JavaScriptSDK.Enums/LoggingEnums"; @@ -19,7 +19,6 @@ export class ApplicationInsightsCoreTests extends AITestClass { } public registerTests() { - this.testCase({ name: "ApplicationInsightsCore: Initialization validates input", test: () => { @@ -999,6 +998,30 @@ export class ApplicationInsightsCoreTests extends AITestClass { } }); + this.testCase({ + name: 'Test Excessive unload hook detection - make sure calling getPerfMgr() does not cause excessive unload hook detection', + test: () => { + const appInsightsCore = new AppInsightsCore(); + const channelPlugin1 = new ChannelPlugin(); + channelPlugin1.priority = 1001; + + const theConfig = { + channels: [[channelPlugin1]], + endpointUrl: "https://dc.services.visualstudio.com/v2/track", + instrumentationKey: "", + extensionConfig: {} + }; + + appInsightsCore.initialize(theConfig, []); + Assert.equal(true, appInsightsCore.isInitialized(), "Core is initialized"); + + // Send lots of notifications + for (let lp = 0; lp < 100; lp++) { + Assert.equal(null, appInsightsCore.getPerfMgr()); + } + } + }); + function _createBuckets(num: number) { // Using helper function as TypeScript 2.5.3 is complaining about new Array(100).fill(0); let buckets: number[] = []; diff --git a/shared/AppInsightsCore/Tests/Unit/src/GlobalTestHooks.Test.ts b/shared/AppInsightsCore/Tests/Unit/src/GlobalTestHooks.Test.ts new file mode 100644 index 000000000..99e370c4a --- /dev/null +++ b/shared/AppInsightsCore/Tests/Unit/src/GlobalTestHooks.Test.ts @@ -0,0 +1,13 @@ +import { Assert } from "@microsoft/ai-test-framework"; +import { _testHookMaxUnloadHooksCb } from "../../../src/JavaScriptSDK/UnloadHookContainer"; +import { dumpObj } from "@nevware21/ts-utils"; + +export class GlobalTestHooks { + + public registerTests() { + // Set a global maximum + _testHookMaxUnloadHooksCb(20, (state: string, hooks: Array) => { + Assert.ok(false, "Max unload hooks exceeded [" + hooks.length + "] - " + state + " - " + dumpObj(hooks)); + }); + } +} diff --git a/shared/AppInsightsCore/Tests/Unit/src/aiunittests.ts b/shared/AppInsightsCore/Tests/Unit/src/aiunittests.ts index bf7b3a679..6fc31aebc 100644 --- a/shared/AppInsightsCore/Tests/Unit/src/aiunittests.ts +++ b/shared/AppInsightsCore/Tests/Unit/src/aiunittests.ts @@ -1,6 +1,7 @@ import '@microsoft/applicationinsights-shims'; import { ApplicationInsightsCoreTests } from "./ApplicationInsightsCore.Tests"; import { CookieManagerTests } from "./CookieManager.Tests"; +import { GlobalTestHooks } from "./GlobalTestHooks.Test"; import { HelperFuncTests } from './HelperFunc.Tests'; import { AppInsightsCoreSizeCheck } from "./AppInsightsCoreSize.Tests"; import { EventHelperTests } from "./EventHelper.Tests"; @@ -12,6 +13,7 @@ import { W3cTraceParentTests } from "./W3cTraceParentTests"; import { DynamicConfigTests } from "./DynamicConfig.Tests"; export function runTests() { + new GlobalTestHooks().registerTests(); new DynamicTests().registerTests(); new DynamicConfigTests().registerTests(); new ApplicationInsightsCoreTests().registerTests(); diff --git a/shared/AppInsightsCore/src/Config/DynamicConfig.ts b/shared/AppInsightsCore/src/Config/DynamicConfig.ts index ba5b4c8af..c10a85350 100644 --- a/shared/AppInsightsCore/src/Config/DynamicConfig.ts +++ b/shared/AppInsightsCore/src/Config/DynamicConfig.ts @@ -36,6 +36,8 @@ function _createAndUseHandler(state: _IDynamicConfigHandlerState, configHa } }; + objDefine(handler, "toJSON", { v: () => "WatcherHandler" + (handler.fn ? "" : "[X]") }); + state.use(handler, configHandler); return handler; diff --git a/shared/AppInsightsCore/src/JavaScriptSDK.Enums/LoggingEnums.ts b/shared/AppInsightsCore/src/JavaScriptSDK.Enums/LoggingEnums.ts index 5906bcd04..abe98b4c0 100644 --- a/shared/AppInsightsCore/src/JavaScriptSDK.Enums/LoggingEnums.ts +++ b/shared/AppInsightsCore/src/JavaScriptSDK.Enums/LoggingEnums.ts @@ -84,6 +84,7 @@ export const enum _eInternalMessageId { InvalidDurationValue = 45, TelemetryEnvelopeInvalid = 46, CreateEnvelopeError = 47, + MaxUnloadHookExceeded = 48, // User actionable CannotSerializeObject = 48, diff --git a/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts b/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts index aa7dbb85d..c0ef2bc4d 100644 --- a/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts +++ b/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts @@ -181,7 +181,7 @@ function _addDelayedCfgListener(listeners: { rm: () => void, w: WatcherFunction< let theListener = _findWatcher(listeners, newWatcher).l; if (!theListener) { - theListener ={ + theListener = { w: newWatcher, rm: () => { let fnd = _findWatcher(listeners, newWatcher); @@ -207,6 +207,36 @@ function _registerDelayedCfgListener(config: IConfiguration, listeners: { rm: () }); } +// Moved this outside of the closure to reduce the retained memory footprint +function _initDebugListener(configHandler: IDynamicConfigHandler, unloadContainer: IUnloadHookContainer, notificationManager: INotificationManager, debugListener: INotificationListener) { + // Will get recalled if any referenced config values are changed + unloadContainer.add(configHandler.watch((details) => { + let disableDbgExt = details.cfg.disableDbgExt; + + if (disableDbgExt === true && debugListener) { + // Remove any previously loaded debug listener + notificationManager.removeNotificationListener(debugListener); + debugListener = null; + } + + if (notificationManager && !debugListener && disableDbgExt !== true) { + debugListener = getDebugListener(details.cfg); + notificationManager.addNotificationListener(debugListener); + } + })); + + return debugListener +} + +// Moved this outside of the closure to reduce the retained memory footprint +function _createUnloadHook(unloadHook: IUnloadHook): IUnloadHook { + return objDefine({ + rm: () => { + unloadHook.rm(); + } + }, "toJSON", { v: () => "aicore::onCfgChange<" + JSON.stringify(unloadHook) + ">" }); +} + /** * @group Classes * @group Entrypoint @@ -317,7 +347,8 @@ export class AppInsightsCore im _notificationManager = notificationManager; - _initDebugListener(); + // Initialize the debug listener outside of the closure to reduce the retained memory footprint + _debugListener = _initDebugListener(_configHandler, _hookContainer, _notificationManager && _self.getNotifyMgr(), _debugListener); _initPerfManager(); _self.logger = logger; @@ -444,17 +475,6 @@ export class AppInsightsCore im }; _self.getPerfMgr = (): IPerfManager => { - if (!_perfManager && !_cfgPerfManager) { - _addUnloadHook(_configHandler.watch((details) => { - if (details.cfg.enablePerfMgr) { - let createPerfMgr = details.cfg.createPerfMgr; - if (isFunction(createPerfMgr)) { - _cfgPerfManager = createPerfMgr(_self, _self.getNotifyMgr()); - } - } - })); - } - return _perfManager || _cfgPerfManager || getGblPerfMgr(); }; @@ -726,11 +746,7 @@ export class AppInsightsCore im unloadHook = onConfigChange(_configHandler.cfg, handler, _self.logger); } - return { - rm: () => { - unloadHook.rm(); - } - } + return _createUnloadHook(unloadHook); }; _self.getWParam = () => { @@ -854,6 +870,8 @@ export class AppInsightsCore im _pluginVersionString = null; _pluginVersionStringArr = null; _forceStopInternalLogPoller = false; + _internalLogPoller = null; + _internalLogPollerListening = false; } function _createTelCtx(): IProcessTelemetryContext { @@ -1106,40 +1124,39 @@ export class AppInsightsCore im return true; } - function _initDebugListener() { - // Lazily ensure that the notification manager is created - !_notificationManager && _self.getNotifyMgr(); + function _initPerfManager() { + // Save the previous config based performance manager creator to avoid creating new perf manager instances if unchanged + let prevCfgPerfMgr: (core: IAppInsightsCore, notificationManager: INotificationManager) => IPerfManager; // Will get recalled if any referenced config values are changed _addUnloadHook(_configHandler.watch((details) => { - let disableDbgExt = details.cfg.disableDbgExt; + let enablePerfMgr = details.cfg.enablePerfMgr; + if (enablePerfMgr) { + let createPerfMgr = details.cfg.createPerfMgr; + if (prevCfgPerfMgr !== createPerfMgr) { + if (!createPerfMgr) { + createPerfMgr = _createPerfManager; + } - if (disableDbgExt === true && _debugListener) { - // Remove any previously loaded debug listener - _notificationManager.removeNotificationListener(_debugListener); - _debugListener = null; - } - - if (_notificationManager && !_debugListener && disableDbgExt !== true) { - _debugListener = getDebugListener(details.cfg); - _notificationManager.addNotificationListener(_debugListener); - } - })); - } + // Set the performance manager creation function if not defined + getSetValue(details.cfg, STR_CREATE_PERF_MGR, createPerfMgr); + prevCfgPerfMgr = createPerfMgr; - function _initPerfManager() { - // Will get recalled if any referenced config values are changed - _addUnloadHook(_configHandler.watch((details) => { - let enablePerfMgr = details.cfg.enablePerfMgr; + // Remove any existing config based performance manager + _cfgPerfManager = null; + } - if (!enablePerfMgr && _cfgPerfManager) { + // Only create the performance manager if it's not already created or manually set + if (!_perfManager && !_cfgPerfManager && isFunction(createPerfMgr)) { + // Create a new config based performance manager + _cfgPerfManager = createPerfMgr(_self, _self.getNotifyMgr()); + } + } else { // Remove any existing config based performance manager _cfgPerfManager = null; - } - - if (enablePerfMgr) { - // Set the performance manager creation function if not defined - getSetValue(details.cfg, STR_CREATE_PERF_MGR, _createPerfManager); + + // Clear the previous cached value so it can be GC'd + prevCfgPerfMgr = null; } })); } diff --git a/shared/AppInsightsCore/src/JavaScriptSDK/NotificationManager.ts b/shared/AppInsightsCore/src/JavaScriptSDK/NotificationManager.ts index 89b893334..55ff7778b 100644 --- a/shared/AppInsightsCore/src/JavaScriptSDK/NotificationManager.ts +++ b/shared/AppInsightsCore/src/JavaScriptSDK/NotificationManager.ts @@ -2,7 +2,7 @@ // Licensed under the MIT License. import dynamicProto from "@microsoft/dynamicproto-js"; import { IPromise, createAllPromise, createPromise, doAwaitResponse } from "@nevware21/ts-async"; -import { arrForEach, arrIndexOf, objDefine, scheduleTimeout } from "@nevware21/ts-utils"; +import { ITimerHandler, arrForEach, arrIndexOf, objDefine, safe, scheduleTimeout } from "@nevware21/ts-utils"; import { createDynamicConfig } from "../Config/DynamicConfig"; import { IConfiguration } from "../JavaScriptSDK.Interfaces/IConfiguration"; import { INotificationListener } from "../JavaScriptSDK.Interfaces/INotificationListener"; @@ -18,17 +18,37 @@ const defaultValues = { perfEvtsSendAll: false }; -function _runListeners(listeners: INotificationListener[], name: string, isAsync: boolean, callback: (listener: INotificationListener) => void) { +interface IAsyncNotifications { + h: ITimerHandler; + cb: Array<{ fn: (listener: INotificationListener) => void, arg: INotificationListener }> +} + +function _runScheduledListeners(asyncNotifications: IAsyncNotifications) { + asyncNotifications.h = null; + let callbacks = asyncNotifications.cb; + asyncNotifications.cb = []; + arrForEach(callbacks, (cb) => { + // Run the listener in a try-catch to ensure that a single listener failing doesn't prevent the others from running + safe(cb.fn, [cb.arg]); + }); +} + +// This function is used to combine the logic of running the listeners and handling the async notifications so that they don't +// create multiple timers if there are multiple async listeners. +function _runListeners(listeners: INotificationListener[], name: string, asyncNotifications: IAsyncNotifications | null, callback: (listener: INotificationListener) => void) { arrForEach(listeners, (listener) => { if (listener && listener[name]) { - if (isAsync) { - scheduleTimeout(() => callback(listener), 0); + if (asyncNotifications) { + // Schedule the callback to be called after the current call stack has cleared. + asyncNotifications.cb.push({ + fn: callback, + arg: listener + }); + + asyncNotifications.h = asyncNotifications.h || scheduleTimeout(_runScheduledListeners, 0, asyncNotifications); } else { - try { - callback(listener); - } catch (e) { - // Catch errors to ensure we don't block sending the requests - } + // Run the listener in a try-catch to ensure that a single listener failing doesn't prevent the others from running + safe(callback, [listener]); } } }); @@ -44,7 +64,11 @@ export class NotificationManager implements INotificationManager { let perfEvtsSendAll: boolean; let unloadHandler: IUnloadHook; let _listeners: INotificationListener[] = []; - + let _asyncNotifications: IAsyncNotifications = { + h: null, + cb: [] + }; + let cfgHandler = createDynamicConfig(config, defaultValues); unloadHandler = cfgHandler.watch((details) => { @@ -77,7 +101,7 @@ export class NotificationManager implements INotificationManager { * @param events - The array of events that have been sent. */ _self.eventsSent = (events: ITelemetryItem[]): void => { - _runListeners(_listeners, STR_EVENTS_SENT, true, (listener) => { + _runListeners(_listeners, STR_EVENTS_SENT, _asyncNotifications, (listener) => { listener.eventsSent(events); }); }; @@ -89,7 +113,7 @@ export class NotificationManager implements INotificationManager { * constant should be used to check the different values. */ _self.eventsDiscarded = (events: ITelemetryItem[], reason: number): void => { - _runListeners(_listeners, STR_EVENTS_DISCARDED, true, (listener) => { + _runListeners(_listeners, STR_EVENTS_DISCARDED, _asyncNotifications, (listener) => { listener.eventsDiscarded(events, reason); }); }; @@ -100,7 +124,7 @@ export class NotificationManager implements INotificationManager { * @param isAsync - A flag which identifies whether the requests are being sent in an async or sync manner. */ _self.eventsSendRequest = (sendReason: number, isAsync: boolean): void => { - _runListeners(_listeners, STR_EVENTS_SEND_REQUEST, isAsync, (listener) => { + _runListeners(_listeners, STR_EVENTS_SEND_REQUEST, isAsync ? _asyncNotifications : null, (listener) => { listener.eventsSendRequest(sendReason, isAsync); }); }; @@ -110,7 +134,7 @@ export class NotificationManager implements INotificationManager { // Send all events or only parent events if (perfEvtsSendAll || !perfEvent.isChildEvt()) { - _runListeners(_listeners, STR_PERF_EVENT, false, (listener) => { + _runListeners(_listeners, STR_PERF_EVENT, null, (listener) => { if (perfEvent.isAsync) { scheduleTimeout(() => listener.perfEvent(perfEvent), 0); } else { @@ -123,7 +147,7 @@ export class NotificationManager implements INotificationManager { _self.offlineEventsStored = (events: ITelemetryItem[]): void => { if (events && events.length) { - _runListeners(_listeners, STR_OFFLINE_STORE, true, (listener) => { + _runListeners(_listeners, STR_OFFLINE_STORE, _asyncNotifications, (listener) => { listener.offlineEventsStored(events); }); } @@ -131,7 +155,7 @@ export class NotificationManager implements INotificationManager { _self.offlineBatchSent = (batch: IPayloadData): void => { if (batch && batch.data) { - _runListeners(_listeners, STR_OFFLINE_SENT, true, (listener) => { + _runListeners(_listeners, STR_OFFLINE_SENT, _asyncNotifications, (listener) => { listener.offlineBatchSent(batch); }); } @@ -140,7 +164,7 @@ export class NotificationManager implements INotificationManager { _self.offlineBatchDrop = (cnt: number, reason?: number): void => { if (cnt > 0) { let rn = reason || 0; // default is unknown - _runListeners(_listeners, STR_OFFLINE_DROP, true, (listener) => { + _runListeners(_listeners, STR_OFFLINE_DROP, _asyncNotifications, (listener) => { listener.offlineBatchDrop(cnt, rn); }); } @@ -152,10 +176,15 @@ export class NotificationManager implements INotificationManager { unloadHandler && unloadHandler.rm(); unloadHandler = null; _listeners = []; + + // Clear any async listener + _asyncNotifications.h && _asyncNotifications.h.cancel(); + _asyncNotifications.h = null; + _asyncNotifications.cb = []; }; let waiting: IPromise[]; - _runListeners(_listeners, "unload", false, (listener) => { + _runListeners(_listeners, "unload", null, (listener) => { let asyncUnload = listener.unload(isAsync); if (asyncUnload) { if (!waiting) { diff --git a/shared/AppInsightsCore/src/JavaScriptSDK/UnloadHookContainer.ts b/shared/AppInsightsCore/src/JavaScriptSDK/UnloadHookContainer.ts index 6afbd7b6b..32895ed0f 100644 --- a/shared/AppInsightsCore/src/JavaScriptSDK/UnloadHookContainer.ts +++ b/shared/AppInsightsCore/src/JavaScriptSDK/UnloadHookContainer.ts @@ -7,6 +7,9 @@ import { IDiagnosticLogger } from "../JavaScriptSDK.Interfaces/IDiagnosticLogger import { ILegacyUnloadHook, IUnloadHook } from "../JavaScriptSDK.Interfaces/IUnloadHook"; import { _throwInternal } from "./DiagnosticLogger"; +let _maxHooks: number | undefined; +let _hookAddMonitor: (state: string, hooks: Array) => void | undefined; + /** * Interface which identifiesAdd this hook so that it is automatically removed during unloading * @param hooks - The single hook or an array of IInstrumentHook objects @@ -16,6 +19,17 @@ export interface IUnloadHookContainer { run: (logger?: IDiagnosticLogger) => void; } +/** + * Test hook for setting the maximum number of unload hooks and calling a monitor function when the hooks are added or removed + * This allows for automatic test failure when the maximum number of unload hooks is exceeded + * @param maxHooks - The maximum number of unload hooks + * @param addMonitor - The monitor function to call when hooks are added or removed + */ +export function _testHookMaxUnloadHooksCb(maxHooks?: number, addMonitor?: (state: string, hooks: Array) => void) { + _maxHooks = maxHooks; + _hookAddMonitor = addMonitor; +} + /** * Create a IUnloadHookContainer which can be used to remember unload hook functions to be executed during the component unloading * process. @@ -37,11 +51,18 @@ export function createUnloadHookContainer(): IUnloadHookContainer { _throwInternal(logger, eLoggingSeverity.WARNING, _eInternalMessageId.PluginException, "Unloading:" + dumpObj(e)); } }); + + if (_maxHooks && oldHooks.length > _maxHooks) { + _hookAddMonitor ? _hookAddMonitor("doUnload", oldHooks) : _throwInternal(null, eLoggingSeverity.CRITICAL, _eInternalMessageId.MaxUnloadHookExceeded, "Max unload hooks exceeded. An excessive number of unload hooks has been detected."); + } } function _addHook(hooks: IUnloadHook | IUnloadHook[] | Iterator | ILegacyUnloadHook | ILegacyUnloadHook[] | Iterator) { if (hooks) { arrAppend(_hooks, hooks); + if (_maxHooks && _hooks.length > _maxHooks) { + _hookAddMonitor ? _hookAddMonitor("Add", _hooks) : _throwInternal(null, eLoggingSeverity.CRITICAL, _eInternalMessageId.MaxUnloadHookExceeded, "Max unload hooks exceeded. An excessive number of unload hooks has been detected."); + } } } diff --git a/shared/AppInsightsCore/src/applicationinsights-core-js.ts b/shared/AppInsightsCore/src/applicationinsights-core-js.ts index 176653564..2d02f8d1b 100644 --- a/shared/AppInsightsCore/src/applicationinsights-core-js.ts +++ b/shared/AppInsightsCore/src/applicationinsights-core-js.ts @@ -86,7 +86,7 @@ export { getDebugListener, getDebugExt } from "./JavaScriptSDK/DbgExtensionUtils export { TelemetryInitializerFunction, ITelemetryInitializerHandler, ITelemetryInitializerContainer } from "./JavaScriptSDK.Interfaces/ITelemetryInitializers"; export { createUniqueNamespace } from "./JavaScriptSDK/DataCacheHelper"; export { UnloadHandler, IUnloadHandlerContainer, createUnloadHandlerContainer } from "./JavaScriptSDK/UnloadHandlerContainer"; -export { IUnloadHookContainer, createUnloadHookContainer } from "./JavaScriptSDK/UnloadHookContainer"; +export { IUnloadHookContainer, createUnloadHookContainer, _testHookMaxUnloadHooksCb } from "./JavaScriptSDK/UnloadHookContainer"; export { ITelemetryUpdateState } from "./JavaScriptSDK.Interfaces/ITelemetryUpdateState"; export { ITelemetryUnloadState } from "./JavaScriptSDK.Interfaces/ITelemetryUnloadState"; export { IDistributedTraceContext } from "./JavaScriptSDK.Interfaces/IDistributedTraceContext";