diff --git a/AISKU/Tests/Unit/src/applicationinsights.e2e.tests.ts b/AISKU/Tests/Unit/src/applicationinsights.e2e.tests.ts index 80d2f8454..e904aba9e 100644 --- a/AISKU/Tests/Unit/src/applicationinsights.e2e.tests.ts +++ b/AISKU/Tests/Unit/src/applicationinsights.e2e.tests.ts @@ -6,6 +6,7 @@ import { IDependencyTelemetry, ContextTagKeys, Event, Trace, Exception, Metric, import { ITelemetryItem, getGlobal, newId, dumpObj, BaseTelemetryPlugin, IProcessTelemetryContext, __getRegisteredEvents, arrForEach, IConfiguration, FeatureOptInMode } from "@microsoft/applicationinsights-core-js"; import { TelemetryContext } from '@microsoft/applicationinsights-properties-js'; import { CONFIG_ENDPOINT_URL } from '../../../src/InternalConstants'; +import { OfflineChannel } from '@microsoft/applicationinsights-offlinechannel-js'; export class ApplicationInsightsTests extends AITestClass { @@ -44,6 +45,7 @@ export class ApplicationInsightsTests extends AITestClass { private tagKeys = new ContextTagKeys(); private _config; private _appId: string; + private _ctx: any; constructor(testName?: string) { super(testName || "ApplicationInsightsTests"); @@ -79,6 +81,7 @@ export class ApplicationInsightsTests extends AITestClass { this.isFetchPolyfill = fetch["polyfill"]; this.useFakeServer = false; this._config = this._getTestConfig(this._sessionPrefix); + this._ctx = {}; const init = new ApplicationInsights({ config: this._config @@ -285,8 +288,123 @@ export class ApplicationInsightsTests extends AITestClass { extConfig = ai.config.extensionConfig["AppInsightsCfgSyncPlugin"]; Assert.equal(extConfig.scheduleFetchTimeout, expectedTimeout, "timeout should be changes dynamically"); ai.unload(false); + if (ai && ai["dependencies"]) { + ai["dependencies"].teardown(); + } + } + }); + + this.testCase({ + name: "CfgSync DynamicConfigTests: Offline Support can be added and initialized with endpoint url", + useFakeTimers: true, + test: () => { + this.clock.tick(1); + // if fake timer is turned on, session data will return 0 and will throw sesson not renew error + let offlineChannel = new OfflineChannel(); + let config = { + instrumentationKey: "testIKey", + endpointUrl: "testUrl", + extensionConfig:{ + ["AppInsightsCfgSyncPlugin"]: { + cfgUrl: "" + } + + }, + extensions:[offlineChannel] + } as IConfiguration & IConfig; + let ai = new ApplicationInsights({config: config}); + ai.loadAppInsights(); + this.clock.tick(1); + + let sendChannel = ai.getPlugin(BreezeChannelIdentifier); + let offlineChannelPlugin = ai.getPlugin("OfflineChannel").plugin; + Assert.equal(sendChannel.plugin.isInitialized(), true, "sender is initialized"); + Assert.equal(offlineChannelPlugin.isInitialized(), true, "offline channel is initialized"); + let urlConfig = offlineChannelPlugin["_getDbgPlgTargets"]()[0]; + Assert.ok(urlConfig, "offline url config is initialized"); + + ai.unload(false); + if (ai && ai["dependencies"]) { + ai["dependencies"].teardown(); + } + offlineChannel.teardown(); + + } + }); + + this.testCase({ + name: "CfgSync DynamicConfigTests: Offline Support can be added and initialized with channels", + useFakeTimers: true, + test: () => { + this.clock.tick(1); + let offlineChannel = new OfflineChannel(); + let config = { + instrumentationKey: "testIKey", + endpointUrl: "testUrl", + extensionConfig:{ + ["AppInsightsCfgSyncPlugin"]: { + cfgUrl: "" + } + + }, + channels:[[offlineChannel]] + } as IConfiguration & IConfig; + let ai = new ApplicationInsights({config: config}); + ai.loadAppInsights(); + this.clock.tick(1); + + let sendChannel = ai.getPlugin(BreezeChannelIdentifier); + let offlineChannelPlugin = ai.getPlugin("OfflineChannel").plugin; + Assert.equal(sendChannel.plugin.isInitialized(), true, "sender is initialized"); + Assert.equal(offlineChannelPlugin.isInitialized(), true, "offline channel is initialized"); + let urlConfig = offlineChannelPlugin["_getDbgPlgTargets"]()[0]; + Assert.ok(urlConfig, "offline url config is initialized"); + + + ai.unload(false); + if (ai && ai["dependencies"]) { + ai["dependencies"].teardown(); + } + offlineChannel.teardown(); + + } + }); + + this.testCase({ + name: "CfgSync DynamicConfigTests: Offline Support can be added and initialized without endpoint url", + useFakeTimers: true, + test: () => { + this.clock.tick(1); + let offlineChannel = new OfflineChannel(); + let config = { + instrumentationKey: "testIKey", + extensionConfig:{ + ["AppInsightsCfgSyncPlugin"]: { + cfgUrl: "" + } + + }, + channels:[[offlineChannel]] + } as IConfiguration & IConfig; + let ai = new ApplicationInsights({config: config}); + ai.loadAppInsights(); + this.clock.tick(1); + + let sendChannel = ai.getPlugin(BreezeChannelIdentifier); + let offlineChannelPlugin = ai.getPlugin("OfflineChannel").plugin; + Assert.equal(sendChannel.plugin.isInitialized(), true, "sender is initialized"); + Assert.equal(offlineChannelPlugin.isInitialized(), true, "offline channel is initialized"); + let urlConfig = offlineChannelPlugin["_getDbgPlgTargets"]()[0]; + Assert.ok(urlConfig, "offline url config is initialized"); + + ai.unload(false); + if (ai && ai["dependencies"]) { + ai["dependencies"].teardown(); + } + offlineChannel.teardown(); } }); + } public addCDNOverrideTests(): void { @@ -318,6 +436,52 @@ export class ApplicationInsightsTests extends AITestClass { } public addAsyncTests(): void { + this.testCaseAsync({ + name: "E2E.GenericTests: Send events with offline support", + stepDelay: 1, + steps: [() => { + let offlineChannel = new OfflineChannel(); + this._ai.addPlugin(offlineChannel); + this._ctx.offlineChannel = offlineChannel; + + }].concat(PollingAssert.createPollingAssert(() => { + let offlineChannel = this._ctx.offlineChannel; + if (offlineChannel && offlineChannel.isInitialized()) { + let urlConfig = offlineChannel["_getDbgPlgTargets"]()[0]; + Assert.ok(urlConfig, "offline url config is initialized"); + + let offlineListener = offlineChannel.getOfflineListener() as any; + Assert.ok(offlineListener, "offlineListener should be initialized"); + + // online + offlineListener.setOnlineState(1); + let inMemoTimer = offlineChannel["_getDbgPlgTargets"]()[3]; + Assert.ok(!inMemoTimer, "offline in memo timer should be null"); + this._ai.trackEvent({ name: "online event", properties: { "prop1": "value1" }, measurements: { "measurement1": 200 } }); + + // set to offline status right way + offlineListener.setOnlineState(2); + this._ai.trackEvent({ name: "offline event", properties: { "prop2": "value2" }, measurements: { "measurement2": 200 } }); + inMemoTimer = offlineChannel["_getDbgPlgTargets"]()[3]; + Assert.ok(inMemoTimer, "in memo timer should not be null"); + let inMemoBatch = offlineChannel["_getDbgPlgTargets"]()[1]; + Assert.equal(inMemoBatch && inMemoBatch.count(), 1, "should have one event"); + + return true + } + return false + }, "Wait for init" + new Date().toISOString(), 60, 1000) as any).concat(this.asserts(1)).concat(() => { + const payloadStr: string[] = this.getPayloadMessages(this.successSpy); + if (payloadStr.length > 0) { + const payload = JSON.parse(payloadStr[0]); + const data = payload.data; + Assert.ok( payload && payload.iKey); + Assert.equal( ApplicationInsightsTests._instrumentationKey,payload.iKey,"payload ikey is not set correctly" ); + Assert.ok(data && data.baseData && data.baseData.properties["prop1"]); + Assert.ok(data && data.baseData && data.baseData.measurements["measurement1"]); + } + }) + }); this.testCaseAsync({ name: 'E2E.GenericTests: trackEvent sends to backend', stepDelay: 1, diff --git a/AISKU/Tests/UnitTests.html b/AISKU/Tests/UnitTests.html index 250f18fd0..a9f4344de 100644 --- a/AISKU/Tests/UnitTests.html +++ b/AISKU/Tests/UnitTests.html @@ -24,6 +24,7 @@ modules.add("qunit"); modules.add("sinon"); modules.add("pako","./node_modules/pako/dist/pako"); + modules.add("@microsoft/applicationinsights-offlinechannel-js"); // Load offline plugin loadFetchModule(modules, "whatwg-fetch"); loadCommonModules(modules, function () { diff --git a/AISKU/package.json b/AISKU/package.json index 53bbeed4a..71d27a7ec 100644 --- a/AISKU/package.json +++ b/AISKU/package.json @@ -32,6 +32,7 @@ }, "devDependencies": { "@microsoft/ai-test-framework": "0.0.1", + "@microsoft/applicationinsights-offlinechannel-js": "0.2.1", "@microsoft/applicationinsights-rollup-plugin-uglify3-js": "1.0.0", "@microsoft/applicationinsights-rollup-es5": "1.0.2", "sinon": "^7.3.1", diff --git a/channels/offline-channel-js/Tests/Unit/src/TestHelper.ts b/channels/offline-channel-js/Tests/Unit/src/TestHelper.ts index 4abd828a4..c1b54d539 100644 --- a/channels/offline-channel-js/Tests/Unit/src/TestHelper.ts +++ b/channels/offline-channel-js/Tests/Unit/src/TestHelper.ts @@ -6,6 +6,9 @@ export class TestChannel extends BaseTelemetryPlugin implements IChannelControls public priority: number = 1001; public endpoint: string = DEFAULT_BREEZE_ENDPOINT + DEFAULT_BREEZE_PATH; public isIdle: boolean = true; + public isInitialized = () => { + return true; + } lastEventAdded: ITelemetryItem; eventsAdded: ITelemetryItem[] = []; diff --git a/channels/offline-channel-js/Tests/Unit/src/channel.tests.ts b/channels/offline-channel-js/Tests/Unit/src/channel.tests.ts index 3326e22c9..c0d8b8af5 100644 --- a/channels/offline-channel-js/Tests/Unit/src/channel.tests.ts +++ b/channels/offline-channel-js/Tests/Unit/src/channel.tests.ts @@ -60,9 +60,11 @@ export class ChannelTests extends AITestClass { this.testCase({ name: "Channel: Init from core", + useFakeTimers: true, test: () => { let channel = new OfflineChannel(); - this.core.initialize(this.coreConfig,[channel]); + let onlineChannel = new TestChannel(); + this.core.initialize(this.coreConfig,[channel, onlineChannel]); this.core.addNotificationListener({ eventsDiscarded: (evts, reason) => { this.evtDiscard += 1; @@ -79,6 +81,8 @@ export class ChannelTests extends AITestClass { } }); + this.clock.tick(1); + let offlineListener = channel.getOfflineListener() as any; offlineListener.setOnlineState(1); let evt = mockTelemetryItem(); @@ -99,10 +103,12 @@ export class ChannelTests extends AITestClass { this.testCase({ name: "Channel: Init from core indexed db", + useFakeTimers: true, test: () => { let channel = new OfflineChannel(); + let onlineChannel = new TestChannel(); this.coreConfig.extensionConfig = {["OfflineChannel"]: {providers:[eStorageProviders.IndexedDb], inMemoMaxTime: 2000} as IOfflineChannelConfiguration}; - this.core.initialize(this.coreConfig,[channel]); + this.core.initialize(this.coreConfig,[channel, onlineChannel]); this.core.addNotificationListener({ eventsDiscarded: (evts, reason) => { this.evtDiscard += 1; @@ -118,7 +124,7 @@ export class ChannelTests extends AITestClass { this.batchDrop += 1; } }); - + this.clock.tick(1); let offlineListener = channel.getOfflineListener() as any; offlineListener.setOnlineState(1); let evt = mockTelemetryItem(); @@ -171,6 +177,8 @@ export class ChannelTests extends AITestClass { this.onDone(() => { channel.teardown(); }); + + this.clock.tick(1); let offlineListener = channel.getOfflineListener() as any; offlineListener.setOnlineState(1); let evt = mockTelemetryItem(); @@ -295,6 +303,8 @@ export class ChannelTests extends AITestClass { let channel = new OfflineChannel(); this.coreConfig.extensionConfig = {["OfflineChannel"]: {providers:[eStorageProviders.IndexedDb], inMemoMaxTime: 2000} as IOfflineChannelConfiguration}; channel.initialize(this.coreConfig, this.core,[]); + + this.clock.tick(1); let senderInst = channel["_getDbgPlgTargets"]()[2]; let sender1 = (payload: any, oncomplete: any, sync?: boolean) => { oncomplete(200, {}); @@ -392,6 +402,8 @@ export class ChannelTests extends AITestClass { } }); + this.clock.tick(1); + Assert.equal(this.evtDiscard, 0, "discard listener notification should not be called"); Assert.equal(this.evtStore, 0, "store listener notification should not be called"); Assert.equal(this.evtSent, 0, "sent listener notification should not be called"); @@ -460,6 +472,8 @@ export class ChannelTests extends AITestClass { this.batchDrop += 1; } }); + + this.clock.tick(1); let inMemoBatch = channel["_getDbgPlgTargets"]()[1]; this.sandbox.stub((inMemoBatch) as any, "addEvent").callsFake((evt) => { return false; @@ -517,6 +531,7 @@ export class ChannelTests extends AITestClass { this.batchDrop += 1; } }); + this.clock.tick(1); let senderInst = channel["_getDbgPlgTargets"]()[2]; let sender1 = (payload: any, oncomplete: any, sync?: boolean) => { @@ -581,6 +596,8 @@ export class ChannelTests extends AITestClass { // make sure in memo time is long enough this.coreConfig.extensionConfig = {["OfflineChannel"]: {providers:[eStorageProviders.LocalStorage], inMemoMaxTime: 200000} as IOfflineChannelConfiguration}; this.core.initialize(this.coreConfig,[channel, sendChannel]); + + this.clock.tick(1); let offlineListener = channel.getOfflineListener() as any; offlineListener.setOnlineState(2); 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 b7cafff85..20ac5fada 100644 --- a/channels/offline-channel-js/Tests/Unit/src/offlinechannel.tests.ts +++ b/channels/offline-channel-js/Tests/Unit/src/offlinechannel.tests.ts @@ -13,7 +13,7 @@ export function runTests() { new OfflineWebProviderTests().registerTests(); new OfflineDbProviderTests().registerTests(); new OfflineInMemoryBatchTests().registerTests(); - new OfflineBatchHandlerTests().registerTests(); new ChannelTests().registerTests(); + new OfflineBatchHandlerTests().registerTests(); new Offlinetimer().registerTests(); } \ No newline at end of file diff --git a/channels/offline-channel-js/Tests/Unit/src/offlinetimer.tests.ts b/channels/offline-channel-js/Tests/Unit/src/offlinetimer.tests.ts index 61cb17406..29872c2fd 100644 --- a/channels/offline-channel-js/Tests/Unit/src/offlinetimer.tests.ts +++ b/channels/offline-channel-js/Tests/Unit/src/offlinetimer.tests.ts @@ -43,6 +43,8 @@ export class Offlinetimer extends AITestClass { let channel = new OfflineChannel(); let onlineChannel = new TestChannel(); this.core.initialize(this.coreConfig,[channel, onlineChannel]); + + this.clock.tick(1); let offlineListener = channel.getOfflineListener() as any; // online, processTelemetry is not called @@ -153,6 +155,7 @@ export class Offlinetimer extends AITestClass { let channel = new OfflineChannel(); let onlineChannel = new TestChannel(); this.core.initialize(this.coreConfig,[channel, onlineChannel]); + this.clock.tick(1); let offlineListener = channel.getOfflineListener() as any; // online, processTelemetry is not called diff --git a/channels/offline-channel-js/src/Helpers/Utils.ts b/channels/offline-channel-js/src/Helpers/Utils.ts index c34c9b95e..3c1bda171 100644 --- a/channels/offline-channel-js/src/Helpers/Utils.ts +++ b/channels/offline-channel-js/src/Helpers/Utils.ts @@ -5,7 +5,8 @@ import { EventPersistence } from "@microsoft/applicationinsights-common"; import { INotificationManager, ITelemetryItem, NotificationManager, generateW3CId } from "@microsoft/applicationinsights-core-js"; import { isString, objKeys, strSubstr } from "@nevware21/ts-utils"; import { isValidPersistenceLevel } from "../Providers/IndexDbProvider"; -import { IPostTransmissionTelemetryItem } from "../applicationinsights-offlinechannel-js"; +import { IPostTransmissionTelemetryItem } from "../Interfaces/IInMemoryBatch"; + // Endpoint schema // . diff --git a/channels/offline-channel-js/src/OfflineChannel.ts b/channels/offline-channel-js/src/OfflineChannel.ts index cfb53ae41..2a33a3277 100644 --- a/channels/offline-channel-js/src/OfflineChannel.ts +++ b/channels/offline-channel-js/src/OfflineChannel.ts @@ -102,6 +102,9 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr let _overrideIkey: string; let _evtsLimitInMemo: number; let _notificationManager: INotificationManager | undefined; + let _isLazyInit: boolean; + let _dependencyPlugin: IChannelControls; + _initDefaults(); @@ -111,6 +114,7 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr _base.initialize(coreConfig, core, extensions); + // keep setting hasInitialized status here to avoid re-initialize _hasInitialized = true; _diagLogger = _self.diagLog(); @@ -119,31 +123,37 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr _taskScheduler = createTaskScheduler(createAsyncPromise, "offline channel"); _notificationManager = core.getNotifyMgr(); } - try { - _createUrlConfig(coreConfig, core, extensions, pluginChain); - let ctx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain); - _sender.initialize(coreConfig, core, ctx, _diagLogger, _primaryChannelId, _self._unloadHooks); - if (_sender) { - _senderInst = _sender.getXhrInst(); - _offlineListener.addListener((val)=> { - if (!val.isOnline) { - _sendNextBatchTimer && _sendNextBatchTimer.cancel(); - } else { - _setSendNextTimer(); - } - - }); - - // need it for first time to confirm if there are any events - _setSendNextTimer(); + // TODO: add refresh inside timer until dependency plugin is initialized + scheduleTimeout(() => { + try { + let _dependencyPlugin = _getDependencyPlugin(coreConfig, core); + // make sure that online sender is initialized + if (!_isLazyInit && _dependencyPlugin && _dependencyPlugin.isInitialized()) { + _isLazyInit = true; + _createUrlConfig(coreConfig, core, extensions, pluginChain); + let ctx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain); + _sender.initialize(coreConfig, core, ctx, _diagLogger, _primaryChannelId, _self._unloadHooks); + _senderInst = _sender.getXhrInst(); + _offlineListener.addListener((val)=> { + if (!val.isOnline) { + _sendNextBatchTimer && _sendNextBatchTimer.cancel(); + } else { + _setSendNextTimer(); + } + + }); - } + // need it for first time to confirm if there are any events + _setSendNextTimer(); + + } + } catch (e) { + // eslint-disable-next-line no-empty - } catch (e) { - // eslint-disable-next-line no-empty + } + + }, 0); - } - }; _self.processTelemetry = (evt: ITelemetryItem, itemCtx?: IProcessTelemetryContext) => { @@ -231,7 +241,7 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr _self.onunloadFlush = () => { if (!_paused) { - while (_inMemoBatch.count()) { + while (_inMemoBatch && _inMemoBatch.count()) { _flushInMemoItems(true); } // TODO: unloadprovider might send events out of order @@ -250,13 +260,13 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr _self.sendNextBatch = () => { // TODO: add callback function - return _setSendNextTimer(); + return _offineSupport && _setSendNextTimer(); }; _self._doTeardown = (unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState) => { _self.onunloadFlush(); _offlineListener && runTargetUnload(_offlineListener, false); - let handler = _urlCfg.batchHandler; + let handler = _urlCfg && _urlCfg.batchHandler; handler && handler.teardown(); _clearScheduledTimer(); _initDefaults(); @@ -288,6 +298,8 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr _primaryChannelId = null; _overrideIkey = null; _evtsLimitInMemo = null; + _isLazyInit = false; + _dependencyPlugin = null; } @@ -322,7 +334,7 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr try { // TODO: add while loop to flush everything let inMemo = _inMemoBatch; - let evts = inMemo.getItems(); + let evts = inMemo && inMemo.getItems(); if (!evts || !evts.length) { return; } @@ -524,7 +536,7 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr try { if (evt) { - return _offineSupport.serialize(evt, _convertUndefined); + return _offineSupport && _offineSupport.serialize(evt, _convertUndefined); } } catch (e) { @@ -563,23 +575,16 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr let ctx = createProcessTelemetryContext(null, theConfig, core); storageConfig = ctx.getExtCfg(_self.identifier, defaultOfflineChannelConfig); - let channelIds = storageConfig.primaryOnlineChannelId; + // let channelIds = storageConfig.primaryOnlineChannelId; let onlineUrl = null; - if (channelIds && channelIds.length) { - arrForEach(channelIds, (id) => { - let plugin = _self.core.getPlugin(id); - let channel = plugin && plugin.plugin; - if (channel) { - _primaryChannelId = id; - if (isFunction(channel.getOfflineSupport)) { - _offineSupport = channel.getOfflineSupport(); - onlineUrl = isFunction(_offineSupport && _offineSupport.getUrl) && _offineSupport.getUrl(); - } - return; - } - - }); + let channel = _getDependencyPlugin(coreConfig, core); + if (!!channel.isInitialized() && isFunction(channel.getOfflineSupport)) { + _offineSupport = channel.getOfflineSupport(); + onlineUrl = isFunction(_offineSupport && _offineSupport.getUrl) && _offineSupport.getUrl(); + } else { + return; } + _overrideIkey = storageConfig.overrideInstrumentationKey; let urlConfig: IUrlLocalStorageConfig = _urlCfg; @@ -639,6 +644,28 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr })); } + function _getDependencyPlugin(coreConfig: IConfiguration & IConfig, core: IAppInsightsCore) { + if (!_dependencyPlugin) { + let ctx = createProcessTelemetryContext(null, coreConfig, core); + let storageConfig = ctx.getExtCfg(_self.identifier, defaultOfflineChannelConfig); + let channelIds = storageConfig.primaryOnlineChannelId; + if (channelIds && channelIds.length) { + arrForEach(channelIds, (id) => { + let plugin = core.getPlugin(id); + let channel = plugin && plugin.plugin; + if (channel) { + _dependencyPlugin = channel; + return; + } + + + }); + } + } + + return _dependencyPlugin; + } + function _callNotification(evtName: string, theArgs: any[]) { callNotification(_notificationManager, evtName, theArgs); @@ -752,4 +779,5 @@ export class OfflineChannel extends BaseTelemetryPlugin implements IChannelContr public sendNextBatch() { // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging } + } diff --git a/common/config/rush/npm-shrinkwrap.json b/common/config/rush/npm-shrinkwrap.json index 1f6d3d2ab..307c919bf 100644 --- a/common/config/rush/npm-shrinkwrap.json +++ b/common/config/rush/npm-shrinkwrap.json @@ -565,7 +565,7 @@ "node_modules/@rush-temp/1ds-core-js": { "version": "0.0.0", "resolved": "file:projects/1ds-core-js.tgz", - "integrity": "sha512-wqTWM5FfPlt1VaWHtPrfJsWhwtHO0f0JgkM2O7kPNosZHB4/h6oUT2/8wrQMa9kht8BXujZe0mgSArIY2fTX5A==", + "integrity": "sha512-/Yn79SncrgzhGMHlOl/nGgScwGVo7fDzp21tAHDsb+3iZgfGiwRrDZP43qwzqWDtP4Bb52QN4gv1Ho0hvukd6g==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -593,7 +593,7 @@ "node_modules/@rush-temp/1ds-post-js": { "version": "0.0.0", "resolved": "file:projects/1ds-post-js.tgz", - "integrity": "sha512-Tv2PCInJemZ7aZqFuAmbLOv1cqIgz4yuyjI2WTJ1k1ybrraRUNQd2e/ZYc3cw3dqNQvBDYT9QfHHmo+/4s2rSA==", + "integrity": "sha512-hB2tfsRGZPlfqUUu+MJW0am1S/IryLmiS2XOtFBIcMTl9Y7+9Cj+8Cv8aDat4jGMphVHrTKuEsjatVe0m3+X/A==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -615,7 +615,7 @@ "node_modules/@rush-temp/ai-test-framework": { "version": "0.0.0", "resolved": "file:projects/ai-test-framework.tgz", - "integrity": "sha512-Bg6MiDIoWkKtTwDm8A66wZZ1t+09mx8u8SVJyFHcHZB0DptQQ1HoQamfkOA0JzS4oT3cd3bYYjTNJkE5cpYC1w==", + "integrity": "sha512-i8L9al7YfV205G5UQttp7Do21ziq98plr92VSnkVOOmz2dtB0kXtOdLtlVxtDvtZIoiGvo1wpU0j9mPUuLNdBw==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -641,7 +641,7 @@ "node_modules/@rush-temp/applicationinsights-analytics-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-analytics-js.tgz", - "integrity": "sha512-i2CZyUTYgDZ+B2rhSMhHaUYEhFWBDwhHqUbh9n1Dy77S+ZxFi6+nmC6VmW5Z8nM/I5QZ24lKTkrCiI+xRuzuAg==", + "integrity": "sha512-KtNJ0vXfw47B6ORqA1wtgXfSIWA7LQ2LUNMAokNDr6vC/lLjLWPveg8adZo5ptFh5beffzt5n3yQWllvJVGV/A==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -669,7 +669,7 @@ "node_modules/@rush-temp/applicationinsights-cfgsync-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-cfgsync-js.tgz", - "integrity": "sha512-ZaF4qcLxoRQEL3q8YsNgjKLXNjk9crt8eOueSfD3yRpxzSIavkxWPkKqE2eMIKoGrXX+Pg4pL9e7rEx3e3pWUw==", + "integrity": "sha512-TVH5b9aeaKtBgp/afYUHE+2vYuVbuA4Cqewaqu6r/Qds3eQOvUzAfKlur1T+N54gVhcdKkC2aUXUaba23PPRcg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -698,7 +698,7 @@ "node_modules/@rush-temp/applicationinsights-channel-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-channel-js.tgz", - "integrity": "sha512-vygsnOvKJS3Io+Ewp+mt2Bqhl8Rg9de77w3epIX14kuwRI0QUUxZud176RGoetOZwBFActvbh0Nk36gKkiY/xA==", + "integrity": "sha512-Egx+Qwpb56RzxVSkcB4xR2FvgbJ55gTCzGN6tSOAUz1n34sWlTdV2zBqJjzrTYrhy/7Y/W6Q/VVuocwH9XzubA==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -725,7 +725,7 @@ "node_modules/@rush-temp/applicationinsights-chrome-debug-extension": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-chrome-debug-extension.tgz", - "integrity": "sha512-30AR1ZiaoNfwF8CjbkcWh2g8w8ECYRFNFhnNmJAjhTcqFyUbdBTifTNBKb4AOeog6DDkN6NWZx9qojQLGoFYbg==", + "integrity": "sha512-RCdFP4mjd5pIjglQIfWH8Yls+QiEdioYS5ziHDEZWyIbd+fYx7iHHRVaqKutMb7/T/LqCDUur0Rm/Ah+do+yYw==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -759,7 +759,7 @@ "node_modules/@rush-temp/applicationinsights-clickanalytics-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-clickanalytics-js.tgz", - "integrity": "sha512-aXu0vdb+HNR6M+X5JoefcwwMFiQ03DE0St6cM1MEVONpvBC0s17rk245opy65aIulc/7wCPSLYMl4RLSWu+Q0w==", + "integrity": "sha512-AUkKc2bEuPomktpadeO/7nHAww9m+0bDefWkbEZZHvK+KgrG97ZhxzRpl/GGrnb43GujFyl0Hzot0OaPHtYBOA==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -784,7 +784,7 @@ "node_modules/@rush-temp/applicationinsights-common": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-common.tgz", - "integrity": "sha512-8m3iJe1Aa8lPzAJoDiyALTrDh4m89HcoGXGkjrq47wQ1d+GxIF0x/qPO6YvcRErPYDlBO9IzcWRQojCcH0IIlA==", + "integrity": "sha512-d0f4wTojw+nPN+xTB38NH6M6q4xhIVOH15t+HxRLRlWiR/mCxUa/Dsy1dnsRiAZRtNqxD+iFfGYLA9LEDZlwwg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -810,7 +810,7 @@ "node_modules/@rush-temp/applicationinsights-core-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-core-js.tgz", - "integrity": "sha512-CFC50QjPVur2gnlZxwcZ2Trd6pwxegt8ndiqTRYK6eGsskVcAeDvMi94hZjmh3LLDPSbUbjmw0TBoTM/+F7bJQ==", + "integrity": "sha512-5ixW1SnUFE3DhOPw5YudR3FXG/iKsa6GBEDFlsdiAVV5pkWUkJtfNfg8MBhJRfak8qOt3x/cIPq6RUmxRJyMcg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -839,7 +839,7 @@ "node_modules/@rush-temp/applicationinsights-debugplugin-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-debugplugin-js.tgz", - "integrity": "sha512-7wOjfBVjhxxmCvj3zF63fqCkqGdKTY8xsjomMRBYpM33NM7rN872gqScYWPMvIzxJsw/o996pfWF51upKc2Ojw==", + "integrity": "sha512-Tqm3AbMzBpweY1J7oDz8NKU1kfVLw73rS4hHsVkAIECepRsrCQVwHjk1H6N1Yf+08H2pdeXmBRGQ90CFX4SEvQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -864,7 +864,7 @@ "node_modules/@rush-temp/applicationinsights-dependencies-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-dependencies-js.tgz", - "integrity": "sha512-Jrqd+HFn/DhAlQGvBp4xHnBg/sPj6dcJshUCKs9uoqIitA0rRS9W4D27kJ+GpzAfTe+eDFY3NfkYOj4+ON3nMg==", + "integrity": "sha512-vUGGj1dW27capHkHArIKwz79gnpLZaRtW11Tf9OZj6odeP/2wiH+zZzyS09/NPvcQrA1bUjE+npc5Nj4Sm+1Bg==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -892,7 +892,7 @@ "node_modules/@rush-temp/applicationinsights-example-aisku": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-aisku.tgz", - "integrity": "sha512-nC6XEmHj3+zwP9lfg0SG7U6K38THNl7v1NRJlb9KKjWWy1PptK4kJrAxpezF3ttkid9TFHkUdbXafJPHPXEcGA==", + "integrity": "sha512-gC6YuoTK9qfasA5LcgZXNmqkKBxbRFqENuJEkGC8GLh/ooC/02BDei+31deefPQNVPw6cP9V+kDrlLfRwMVCtQ==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.11.1 < 2.x", @@ -910,7 +910,7 @@ "node_modules/@rush-temp/applicationinsights-example-cfgsync": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-cfgsync.tgz", - "integrity": "sha512-VxuKglaA0xhHc18AYgFDotTve6vPc0Zx2f1dPD+Gc6WXFDKOS6XOQyoG1tyjJ+UUXrwVxz+WGJCFKOtK92W1tw==", + "integrity": "sha512-782hbmCrD723J2N8X5CtJR5bVuivwCzaKaYe/zn23WvuciexMgu5FpbbnpSfbOERlQ9ONN8yZMcjWf/jjj2t/g==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -936,7 +936,7 @@ "node_modules/@rush-temp/applicationinsights-example-dependencies": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-dependencies.tgz", - "integrity": "sha512-VjBR3vTtdeL2xYAkhJstxsvBaCjjLSX66JngFZd9Shb5OKVQvq9mDlTjqAVPNlJsA9l4mY7zpLdvqjdhopgERg==", + "integrity": "sha512-urNbNsZocNRYLyxGWjsclCReYj77rspXuwlmlEbcPPDG17B/b/G5oSpMX+LLE9OeLWgiWWTjnZ75txcCN1YhVA==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.11.1 < 2.x", @@ -954,7 +954,7 @@ "node_modules/@rush-temp/applicationinsights-example-shared-worker": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-example-shared-worker.tgz", - "integrity": "sha512-fgmYRe9TyA102FTrq1/RC1bniA6BTBLNxD5nmQArbjBOCQjuLBDa+m0Y8jxeLS3EznS8w94+P4Dio4H/0ehnxA==", + "integrity": "sha512-vQ7vS5mfy2666gOjFCAVlq0xvu6WGD0/gXO0yfD8UFOmmQVFtQDIYZHQut19xOXbEiEts4nRIpttd7bb5mOuag==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -980,7 +980,7 @@ "node_modules/@rush-temp/applicationinsights-js-release-tools": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-js-release-tools.tgz", - "integrity": "sha512-e9jw61D/jeRuLlSL+dQ2bFp8iqw6Q9ZMeboqX0CX0iYwjAPRiN/59ZK66D0UOgggNkqYgSEqgDi+ycw9XRtGnA==", + "integrity": "sha512-6sVB5NMzKj/P9v9UvZlA/IjQSkGeupaDliSt2IZqy+SlR59Hv335Ekz/5f54xMHu+QiARXJATbjX7lDfCMG8qw==", "dependencies": { "globby": "^11.0.0", "grunt": "^1.5.3" @@ -989,7 +989,7 @@ "node_modules/@rush-temp/applicationinsights-offlinechannel-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-offlinechannel-js.tgz", - "integrity": "sha512-2BKj2pwDwoosAH1HKMT9qtYLWEWacTNlYXS2esaw0AbQmfgOWkqU7r5SJ1UuX3elQxjqvwLRMCinzsSL5D98KQ==", + "integrity": "sha512-19H5/5rpWyCkvQ0VAAm5i8DM4K8AyiXdzYlH1TtzgnPquOUxMrnWXEU2evMmTRgOOrbHBi1h6yPe39CpWQbWBA==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1016,7 +1016,7 @@ "node_modules/@rush-temp/applicationinsights-osplugin-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-osplugin-js.tgz", - "integrity": "sha512-JI1bAUBrqo8lPhUw2GA4+5ZIx9MSfE47+E6S9e4FE+RiPfbXnJ0GnRLOClfqhqYLktl+1k7AFR1JXBtOyACOew==", + "integrity": "sha512-dBwAyZkE0XuRSYaVrqUP2yEDeysqU+2PgMJHXxQeM2yfiET+mtP7ufFAkXt/ug3+spyS43Ds2E5af+1JGp09+A==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1037,7 +1037,7 @@ "node_modules/@rush-temp/applicationinsights-perfmarkmeasure-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-perfmarkmeasure-js.tgz", - "integrity": "sha512-9XvAQfbB2UmBBn3SRA4Ze+kp8OXLROmH5rHPQsZwOirC7Nu/THzsd3ByvvVuz4WwoRXnm8zCbHPhNVaCT+ep+A==", + "integrity": "sha512-4IsPweGTnoCgjAr5uhng81pPT/g1vAG35Lw6vKVBtAliEAt0JlFpGg5IpB8pMjKJXEY9SkDtV8QKgCw/O5u11Q==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1062,7 +1062,7 @@ "node_modules/@rush-temp/applicationinsights-properties-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-properties-js.tgz", - "integrity": "sha512-DUUFwf4dwjNjMGYnYfBHrWNGccl9nuwmipWuADtvEfEjRDSX7wC7+ZAuJKTGmaUe6z58sRL+fv03WTK85S4Osg==", + "integrity": "sha512-ZLaIPMK/oaABTzNZGdIjJHNyToOvB3gbkXsyhfZ0fVCS9kXvnhRa06kxuD8oiWUYP5PaOnhW4MGpB6CrWO6MQQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1090,7 +1090,7 @@ "node_modules/@rush-temp/applicationinsights-rollup-es5": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-rollup-es5.tgz", - "integrity": "sha512-1Yw2QKlul+WlTRAHhchUxteaSDaeZjskW1H4R3BT7xv7yGZPi0dp4KtKdKAJZQ+/Z+Zxg4XXOWpuDmv/FYmFtQ==", + "integrity": "sha512-pZV3ytRYW9T6XrXLTRqAt5c23vrywlwfWQ1rrGVh78hlig+Ns/ZJw+jM4JwgSyvce8hcZiR+z1rm0xpKju+oJA==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -1114,7 +1114,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-gp8gJ52kIbJpkT406+PBS7rtyCSUnc72otGxnwywqWCuBJvO1O+qaOCIJBYL/wYk1lDpMKejDqG94vPSSQtnFg==", + "integrity": "sha512-WtYrHtc+6IgVGmHIahhl2aYUGuloDq9xCX6VuwObLmccrAqmYq0LYbCanjHi8ugorx/zwwQB37yY3y2WfaDGmw==", "dependencies": { "@nevware21/grunt-eslint-ts": "^0.2.2", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -1135,7 +1135,7 @@ "node_modules/@rush-temp/applicationinsights-shims": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-shims.tgz", - "integrity": "sha512-z9owAp7EJeQwsnWQTjZPV9eEs/8r0w0kqx9YqUK5KmH+8qYOlMnw+Aaw/pQgW2JeMybLSzkRrL4DmIUTxRivew==", + "integrity": "sha512-zKaWFb12Vr+Vi6EiPsHKp+dyQIkbGDptjL9BxVjZviwFHWYdVyZCRDwihi2DuKhWCnsXs1k4cE0fyQAPb+0Qaw==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -1157,7 +1157,7 @@ "node_modules/@rush-temp/applicationinsights-teechannel-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-teechannel-js.tgz", - "integrity": "sha512-YmUVgNnGCZp/Xi/6MMfhUSX0O4pnRZeQcKlZHlVieBUlQC0hgzNFnft0reOISROi8JYlr9tuRbXP3TCzt/1vzw==", + "integrity": "sha512-hRYwJycPiRggIiGwWHmKDWaWouV09B6ee5Vpdeqr/dFKdgA7s6ezaJwynziWrjKBuuyMW+rLIi3rdOaWSDDjLw==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1184,7 +1184,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-8Oa38KhNm/nQDfJtUeOc5itb2WDLJDin8pEygF+ct6u+bBaf20gJcRHayEL1kE+xqAyiZVBkuHagUXfD9nUALA==", + "integrity": "sha512-Dmp/qykXtLR3sMzRIE/qlbolEvpZpWfGH/2jakzqEc/jlB98IFMjqxmj4wPhIj0upPSdxrBek4WKNtuasl91gA==", "dependencies": { "tslib": "*", "typescript": "^4.9.3" @@ -1193,7 +1193,7 @@ "node_modules/@rush-temp/applicationinsights-web": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web.tgz", - "integrity": "sha512-oGvg1xTmeV5N3Rwb05IWs0UvgvB1wMXVbk+nb1+CKJkwzbRv29qkz7louDAA0mu/uh//yGsZPE/72uysBkmJmA==", + "integrity": "sha512-tB9XhhQiAKks15DLzrRGBtu8ojH78COeefbqBUQEFDOfUYVF3tP1xnmvI1iWdQlX4vgpPQBjQs2UgGZxPfVReQ==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1225,7 +1225,7 @@ "node_modules/@rush-temp/applicationinsights-web-basic": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web-basic.tgz", - "integrity": "sha512-ThqfxrDC9icmMwShueGd5TbNSb3hoUT1747h+YVSWS0RtAPcfEzWciQbA2v8M5njrRIbuPpcAC/WFtvSR/kMpg==", + "integrity": "sha512-jkN5S684ogV45t3FnA9nuy0jO3n8J7tz2OQtqLuoIOLqsIG/bkw5piezq5ppKFMhbXpsDNcWj4DX7i/2YCuPSA==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -1252,12 +1252,12 @@ "node_modules/@rush-temp/applicationinsights-web-config": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web-config.tgz", - "integrity": "sha512-FwPOZ+esirRqdKg9s7VTxtWqGJ9CQ/gIJ0PfUvTolAF9JZCVw5wQeHD4Tv/KiziZhB50CNaGshnPmLpWGVzo9g==" + "integrity": "sha512-WwlTM/noixyLMqKFBLKa9o88N/2Z3dA9m0R6Qc9UvBNseZqPIpvl1vRMDnmwjMMV6lV3FsmeSmjD7LCJphXF2Q==" }, "node_modules/@rush-temp/applicationinsights-web-snippet": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-web-snippet.tgz", - "integrity": "sha512-i3Pey5xpQ9I89tUduEeqEddndOPC9aatmIx94yPhgDdMek3S8hydq9qJNCA3Ql4B52JvHi881rrSCQnVwp6/SQ==", + "integrity": "sha512-CwWhN4T+KwfgP5b2ZVkGz4EGS73Lsxf7lcb4CWxcG0V9m8Cfi1z0HO5C458vxSrZkj/G7YAnBggiMi0p4MsIhw==", "dependencies": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -2639,9 +2639,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.795", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.795.tgz", - "integrity": "sha512-hHo4lK/8wb4NUa+NJYSFyJ0xedNHiR6ylilDtb8NUW9d4dmBFmGiecYEKCEbti1wTNzbKXLfl4hPWEkAFbHYlw==" + "version": "1.4.796", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz", + "integrity": "sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==" }, "node_modules/encodeurl": { "version": "1.0.2", @@ -3262,6 +3262,19 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6710,7 +6723,7 @@ }, "@rush-temp/1ds-core-js": { "version": "file:projects\\1ds-core-js.tgz", - "integrity": "sha512-wqTWM5FfPlt1VaWHtPrfJsWhwtHO0f0JgkM2O7kPNosZHB4/h6oUT2/8wrQMa9kht8BXujZe0mgSArIY2fTX5A==", + "integrity": "sha512-/Yn79SncrgzhGMHlOl/nGgScwGVo7fDzp21tAHDsb+3iZgfGiwRrDZP43qwzqWDtP4Bb52QN4gv1Ho0hvukd6g==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6737,7 +6750,7 @@ }, "@rush-temp/1ds-post-js": { "version": "file:projects\\1ds-post-js.tgz", - "integrity": "sha512-Tv2PCInJemZ7aZqFuAmbLOv1cqIgz4yuyjI2WTJ1k1ybrraRUNQd2e/ZYc3cw3dqNQvBDYT9QfHHmo+/4s2rSA==", + "integrity": "sha512-hB2tfsRGZPlfqUUu+MJW0am1S/IryLmiS2XOtFBIcMTl9Y7+9Cj+8Cv8aDat4jGMphVHrTKuEsjatVe0m3+X/A==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6758,7 +6771,7 @@ }, "@rush-temp/ai-test-framework": { "version": "file:projects\\ai-test-framework.tgz", - "integrity": "sha512-Bg6MiDIoWkKtTwDm8A66wZZ1t+09mx8u8SVJyFHcHZB0DptQQ1HoQamfkOA0JzS4oT3cd3bYYjTNJkE5cpYC1w==", + "integrity": "sha512-i8L9al7YfV205G5UQttp7Do21ziq98plr92VSnkVOOmz2dtB0kXtOdLtlVxtDvtZIoiGvo1wpU0j9mPUuLNdBw==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -6783,7 +6796,7 @@ }, "@rush-temp/applicationinsights-analytics-js": { "version": "file:projects\\applicationinsights-analytics-js.tgz", - "integrity": "sha512-i2CZyUTYgDZ+B2rhSMhHaUYEhFWBDwhHqUbh9n1Dy77S+ZxFi6+nmC6VmW5Z8nM/I5QZ24lKTkrCiI+xRuzuAg==", + "integrity": "sha512-KtNJ0vXfw47B6ORqA1wtgXfSIWA7LQ2LUNMAokNDr6vC/lLjLWPveg8adZo5ptFh5beffzt5n3yQWllvJVGV/A==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6810,7 +6823,7 @@ }, "@rush-temp/applicationinsights-cfgsync-js": { "version": "file:projects\\applicationinsights-cfgsync-js.tgz", - "integrity": "sha512-ZaF4qcLxoRQEL3q8YsNgjKLXNjk9crt8eOueSfD3yRpxzSIavkxWPkKqE2eMIKoGrXX+Pg4pL9e7rEx3e3pWUw==", + "integrity": "sha512-TVH5b9aeaKtBgp/afYUHE+2vYuVbuA4Cqewaqu6r/Qds3eQOvUzAfKlur1T+N54gVhcdKkC2aUXUaba23PPRcg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6838,7 +6851,7 @@ }, "@rush-temp/applicationinsights-channel-js": { "version": "file:projects\\applicationinsights-channel-js.tgz", - "integrity": "sha512-vygsnOvKJS3Io+Ewp+mt2Bqhl8Rg9de77w3epIX14kuwRI0QUUxZud176RGoetOZwBFActvbh0Nk36gKkiY/xA==", + "integrity": "sha512-Egx+Qwpb56RzxVSkcB4xR2FvgbJ55gTCzGN6tSOAUz1n34sWlTdV2zBqJjzrTYrhy/7Y/W6Q/VVuocwH9XzubA==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6864,7 +6877,7 @@ }, "@rush-temp/applicationinsights-chrome-debug-extension": { "version": "file:projects\\applicationinsights-chrome-debug-extension.tgz", - "integrity": "sha512-30AR1ZiaoNfwF8CjbkcWh2g8w8ECYRFNFhnNmJAjhTcqFyUbdBTifTNBKb4AOeog6DDkN6NWZx9qojQLGoFYbg==", + "integrity": "sha512-RCdFP4mjd5pIjglQIfWH8Yls+QiEdioYS5ziHDEZWyIbd+fYx7iHHRVaqKutMb7/T/LqCDUur0Rm/Ah+do+yYw==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -6897,7 +6910,7 @@ }, "@rush-temp/applicationinsights-clickanalytics-js": { "version": "file:projects\\applicationinsights-clickanalytics-js.tgz", - "integrity": "sha512-aXu0vdb+HNR6M+X5JoefcwwMFiQ03DE0St6cM1MEVONpvBC0s17rk245opy65aIulc/7wCPSLYMl4RLSWu+Q0w==", + "integrity": "sha512-AUkKc2bEuPomktpadeO/7nHAww9m+0bDefWkbEZZHvK+KgrG97ZhxzRpl/GGrnb43GujFyl0Hzot0OaPHtYBOA==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6921,7 +6934,7 @@ }, "@rush-temp/applicationinsights-common": { "version": "file:projects\\applicationinsights-common.tgz", - "integrity": "sha512-8m3iJe1Aa8lPzAJoDiyALTrDh4m89HcoGXGkjrq47wQ1d+GxIF0x/qPO6YvcRErPYDlBO9IzcWRQojCcH0IIlA==", + "integrity": "sha512-d0f4wTojw+nPN+xTB38NH6M6q4xhIVOH15t+HxRLRlWiR/mCxUa/Dsy1dnsRiAZRtNqxD+iFfGYLA9LEDZlwwg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6946,7 +6959,7 @@ }, "@rush-temp/applicationinsights-core-js": { "version": "file:projects\\applicationinsights-core-js.tgz", - "integrity": "sha512-CFC50QjPVur2gnlZxwcZ2Trd6pwxegt8ndiqTRYK6eGsskVcAeDvMi94hZjmh3LLDPSbUbjmw0TBoTM/+F7bJQ==", + "integrity": "sha512-5ixW1SnUFE3DhOPw5YudR3FXG/iKsa6GBEDFlsdiAVV5pkWUkJtfNfg8MBhJRfak8qOt3x/cIPq6RUmxRJyMcg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6974,7 +6987,7 @@ }, "@rush-temp/applicationinsights-debugplugin-js": { "version": "file:projects\\applicationinsights-debugplugin-js.tgz", - "integrity": "sha512-7wOjfBVjhxxmCvj3zF63fqCkqGdKTY8xsjomMRBYpM33NM7rN872gqScYWPMvIzxJsw/o996pfWF51upKc2Ojw==", + "integrity": "sha512-Tqm3AbMzBpweY1J7oDz8NKU1kfVLw73rS4hHsVkAIECepRsrCQVwHjk1H6N1Yf+08H2pdeXmBRGQ90CFX4SEvQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -6998,7 +7011,7 @@ }, "@rush-temp/applicationinsights-dependencies-js": { "version": "file:projects\\applicationinsights-dependencies-js.tgz", - "integrity": "sha512-Jrqd+HFn/DhAlQGvBp4xHnBg/sPj6dcJshUCKs9uoqIitA0rRS9W4D27kJ+GpzAfTe+eDFY3NfkYOj4+ON3nMg==", + "integrity": "sha512-vUGGj1dW27capHkHArIKwz79gnpLZaRtW11Tf9OZj6odeP/2wiH+zZzyS09/NPvcQrA1bUjE+npc5Nj4Sm+1Bg==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7025,7 +7038,7 @@ }, "@rush-temp/applicationinsights-example-aisku": { "version": "file:projects\\applicationinsights-example-aisku.tgz", - "integrity": "sha512-nC6XEmHj3+zwP9lfg0SG7U6K38THNl7v1NRJlb9KKjWWy1PptK4kJrAxpezF3ttkid9TFHkUdbXafJPHPXEcGA==", + "integrity": "sha512-gC6YuoTK9qfasA5LcgZXNmqkKBxbRFqENuJEkGC8GLh/ooC/02BDei+31deefPQNVPw6cP9V+kDrlLfRwMVCtQ==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.11.1 < 2.x", @@ -7042,7 +7055,7 @@ }, "@rush-temp/applicationinsights-example-cfgsync": { "version": "file:projects\\applicationinsights-example-cfgsync.tgz", - "integrity": "sha512-VxuKglaA0xhHc18AYgFDotTve6vPc0Zx2f1dPD+Gc6WXFDKOS6XOQyoG1tyjJ+UUXrwVxz+WGJCFKOtK92W1tw==", + "integrity": "sha512-782hbmCrD723J2N8X5CtJR5bVuivwCzaKaYe/zn23WvuciexMgu5FpbbnpSfbOERlQ9ONN8yZMcjWf/jjj2t/g==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -7067,7 +7080,7 @@ }, "@rush-temp/applicationinsights-example-dependencies": { "version": "file:projects\\applicationinsights-example-dependencies.tgz", - "integrity": "sha512-VjBR3vTtdeL2xYAkhJstxsvBaCjjLSX66JngFZd9Shb5OKVQvq9mDlTjqAVPNlJsA9l4mY7zpLdvqjdhopgERg==", + "integrity": "sha512-urNbNsZocNRYLyxGWjsclCReYj77rspXuwlmlEbcPPDG17B/b/G5oSpMX+LLE9OeLWgiWWTjnZ75txcCN1YhVA==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.11.1 < 2.x", @@ -7084,7 +7097,7 @@ }, "@rush-temp/applicationinsights-example-shared-worker": { "version": "file:projects\\applicationinsights-example-shared-worker.tgz", - "integrity": "sha512-fgmYRe9TyA102FTrq1/RC1bniA6BTBLNxD5nmQArbjBOCQjuLBDa+m0Y8jxeLS3EznS8w94+P4Dio4H/0ehnxA==", + "integrity": "sha512-vQ7vS5mfy2666gOjFCAVlq0xvu6WGD0/gXO0yfD8UFOmmQVFtQDIYZHQut19xOXbEiEts4nRIpttd7bb5mOuag==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -7109,7 +7122,7 @@ }, "@rush-temp/applicationinsights-js-release-tools": { "version": "file:projects\\applicationinsights-js-release-tools.tgz", - "integrity": "sha512-e9jw61D/jeRuLlSL+dQ2bFp8iqw6Q9ZMeboqX0CX0iYwjAPRiN/59ZK66D0UOgggNkqYgSEqgDi+ycw9XRtGnA==", + "integrity": "sha512-6sVB5NMzKj/P9v9UvZlA/IjQSkGeupaDliSt2IZqy+SlR59Hv335Ekz/5f54xMHu+QiARXJATbjX7lDfCMG8qw==", "requires": { "globby": "^11.0.0", "grunt": "^1.5.3" @@ -7117,7 +7130,7 @@ }, "@rush-temp/applicationinsights-offlinechannel-js": { "version": "file:projects\\applicationinsights-offlinechannel-js.tgz", - "integrity": "sha512-2BKj2pwDwoosAH1HKMT9qtYLWEWacTNlYXS2esaw0AbQmfgOWkqU7r5SJ1UuX3elQxjqvwLRMCinzsSL5D98KQ==", + "integrity": "sha512-19H5/5rpWyCkvQ0VAAm5i8DM4K8AyiXdzYlH1TtzgnPquOUxMrnWXEU2evMmTRgOOrbHBi1h6yPe39CpWQbWBA==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7143,7 +7156,7 @@ }, "@rush-temp/applicationinsights-osplugin-js": { "version": "file:projects\\applicationinsights-osplugin-js.tgz", - "integrity": "sha512-JI1bAUBrqo8lPhUw2GA4+5ZIx9MSfE47+E6S9e4FE+RiPfbXnJ0GnRLOClfqhqYLktl+1k7AFR1JXBtOyACOew==", + "integrity": "sha512-dBwAyZkE0XuRSYaVrqUP2yEDeysqU+2PgMJHXxQeM2yfiET+mtP7ufFAkXt/ug3+spyS43Ds2E5af+1JGp09+A==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7163,7 +7176,7 @@ }, "@rush-temp/applicationinsights-perfmarkmeasure-js": { "version": "file:projects\\applicationinsights-perfmarkmeasure-js.tgz", - "integrity": "sha512-9XvAQfbB2UmBBn3SRA4Ze+kp8OXLROmH5rHPQsZwOirC7Nu/THzsd3ByvvVuz4WwoRXnm8zCbHPhNVaCT+ep+A==", + "integrity": "sha512-4IsPweGTnoCgjAr5uhng81pPT/g1vAG35Lw6vKVBtAliEAt0JlFpGg5IpB8pMjKJXEY9SkDtV8QKgCw/O5u11Q==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7187,7 +7200,7 @@ }, "@rush-temp/applicationinsights-properties-js": { "version": "file:projects\\applicationinsights-properties-js.tgz", - "integrity": "sha512-DUUFwf4dwjNjMGYnYfBHrWNGccl9nuwmipWuADtvEfEjRDSX7wC7+ZAuJKTGmaUe6z58sRL+fv03WTK85S4Osg==", + "integrity": "sha512-ZLaIPMK/oaABTzNZGdIjJHNyToOvB3gbkXsyhfZ0fVCS9kXvnhRa06kxuD8oiWUYP5PaOnhW4MGpB6CrWO6MQQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7214,7 +7227,7 @@ }, "@rush-temp/applicationinsights-rollup-es5": { "version": "file:projects\\applicationinsights-rollup-es5.tgz", - "integrity": "sha512-1Yw2QKlul+WlTRAHhchUxteaSDaeZjskW1H4R3BT7xv7yGZPi0dp4KtKdKAJZQ+/Z+Zxg4XXOWpuDmv/FYmFtQ==", + "integrity": "sha512-pZV3ytRYW9T6XrXLTRqAt5c23vrywlwfWQ1rrGVh78hlig+Ns/ZJw+jM4JwgSyvce8hcZiR+z1rm0xpKju+oJA==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -7237,7 +7250,7 @@ }, "@rush-temp/applicationinsights-rollup-plugin-uglify3-js": { "version": "file:projects\\applicationinsights-rollup-plugin-uglify3-js.tgz", - "integrity": "sha512-gp8gJ52kIbJpkT406+PBS7rtyCSUnc72otGxnwywqWCuBJvO1O+qaOCIJBYL/wYk1lDpMKejDqG94vPSSQtnFg==", + "integrity": "sha512-WtYrHtc+6IgVGmHIahhl2aYUGuloDq9xCX6VuwObLmccrAqmYq0LYbCanjHi8ugorx/zwwQB37yY3y2WfaDGmw==", "requires": { "@nevware21/grunt-eslint-ts": "^0.2.2", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -7257,7 +7270,7 @@ }, "@rush-temp/applicationinsights-shims": { "version": "file:projects\\applicationinsights-shims.tgz", - "integrity": "sha512-z9owAp7EJeQwsnWQTjZPV9eEs/8r0w0kqx9YqUK5KmH+8qYOlMnw+Aaw/pQgW2JeMybLSzkRrL4DmIUTxRivew==", + "integrity": "sha512-zKaWFb12Vr+Vi6EiPsHKp+dyQIkbGDptjL9BxVjZviwFHWYdVyZCRDwihi2DuKhWCnsXs1k4cE0fyQAPb+0Qaw==", "requires": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -7278,7 +7291,7 @@ }, "@rush-temp/applicationinsights-teechannel-js": { "version": "file:projects\\applicationinsights-teechannel-js.tgz", - "integrity": "sha512-YmUVgNnGCZp/Xi/6MMfhUSX0O4pnRZeQcKlZHlVieBUlQC0hgzNFnft0reOISROi8JYlr9tuRbXP3TCzt/1vzw==", + "integrity": "sha512-hRYwJycPiRggIiGwWHmKDWaWouV09B6ee5Vpdeqr/dFKdgA7s6ezaJwynziWrjKBuuyMW+rLIi3rdOaWSDDjLw==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7304,7 +7317,7 @@ }, "@rush-temp/applicationinsights-test-module-type-check": { "version": "file:projects\\applicationinsights-test-module-type-check.tgz", - "integrity": "sha512-8Oa38KhNm/nQDfJtUeOc5itb2WDLJDin8pEygF+ct6u+bBaf20gJcRHayEL1kE+xqAyiZVBkuHagUXfD9nUALA==", + "integrity": "sha512-Dmp/qykXtLR3sMzRIE/qlbolEvpZpWfGH/2jakzqEc/jlB98IFMjqxmj4wPhIj0upPSdxrBek4WKNtuasl91gA==", "requires": { "tslib": "*", "typescript": "^4.9.3" @@ -7312,7 +7325,7 @@ }, "@rush-temp/applicationinsights-web": { "version": "file:projects\\applicationinsights-web.tgz", - "integrity": "sha512-oGvg1xTmeV5N3Rwb05IWs0UvgvB1wMXVbk+nb1+CKJkwzbRv29qkz7louDAA0mu/uh//yGsZPE/72uysBkmJmA==", + "integrity": "sha512-tB9XhhQiAKks15DLzrRGBtu8ojH78COeefbqBUQEFDOfUYVF3tP1xnmvI1iWdQlX4vgpPQBjQs2UgGZxPfVReQ==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7343,7 +7356,7 @@ }, "@rush-temp/applicationinsights-web-basic": { "version": "file:projects\\applicationinsights-web-basic.tgz", - "integrity": "sha512-ThqfxrDC9icmMwShueGd5TbNSb3hoUT1747h+YVSWS0RtAPcfEzWciQbA2v8M5njrRIbuPpcAC/WFtvSR/kMpg==", + "integrity": "sha512-jkN5S684ogV45t3FnA9nuy0jO3n8J7tz2OQtqLuoIOLqsIG/bkw5piezq5ppKFMhbXpsDNcWj4DX7i/2YCuPSA==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -7369,11 +7382,11 @@ }, "@rush-temp/applicationinsights-web-config": { "version": "file:projects\\applicationinsights-web-config.tgz", - "integrity": "sha512-FwPOZ+esirRqdKg9s7VTxtWqGJ9CQ/gIJ0PfUvTolAF9JZCVw5wQeHD4Tv/KiziZhB50CNaGshnPmLpWGVzo9g==" + "integrity": "sha512-WwlTM/noixyLMqKFBLKa9o88N/2Z3dA9m0R6Qc9UvBNseZqPIpvl1vRMDnmwjMMV6lV3FsmeSmjD7LCJphXF2Q==" }, "@rush-temp/applicationinsights-web-snippet": { "version": "file:projects\\applicationinsights-web-snippet.tgz", - "integrity": "sha512-i3Pey5xpQ9I89tUduEeqEddndOPC9aatmIx94yPhgDdMek3S8hydq9qJNCA3Ql4B52JvHi881rrSCQnVwp6/SQ==", + "integrity": "sha512-CwWhN4T+KwfgP5b2ZVkGz4EGS73Lsxf7lcb4CWxcG0V9m8Cfi1z0HO5C458vxSrZkj/G7YAnBggiMi0p4MsIhw==", "requires": { "@microsoft/api-extractor": "^7.40.0", "@microsoft/dynamicproto-js": "^2.0.3", @@ -8382,9 +8395,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.4.795", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.795.tgz", - "integrity": "sha512-hHo4lK/8wb4NUa+NJYSFyJ0xedNHiR6ylilDtb8NUW9d4dmBFmGiecYEKCEbti1wTNzbKXLfl4hPWEkAFbHYlw==" + "version": "1.4.796", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.796.tgz", + "integrity": "sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==" }, "encodeurl": { "version": "1.0.2", @@ -8870,6 +8883,12 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "optional": true + }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", diff --git a/shared/AppInsightsCore/Tests/Unit/src/AppInsightsCoreSize.Tests.ts b/shared/AppInsightsCore/Tests/Unit/src/AppInsightsCoreSize.Tests.ts index 27ee8b058..ef459f698 100644 --- a/shared/AppInsightsCore/Tests/Unit/src/AppInsightsCoreSize.Tests.ts +++ b/shared/AppInsightsCore/Tests/Unit/src/AppInsightsCoreSize.Tests.ts @@ -2,8 +2,8 @@ import { Assert, AITestClass } from "@microsoft/ai-test-framework"; import * as pako from "pako"; export class AppInsightsCoreSizeCheck extends AITestClass { - private readonly MAX_RAW_SIZE = 63; - private readonly MAX_BUNDLE_SIZE = 63; + private readonly MAX_RAW_SIZE = 64; + private readonly MAX_BUNDLE_SIZE = 64; private readonly MAX_RAW_DEFLATE_SIZE = 27; private readonly MAX_BUNDLE_DEFLATE_SIZE = 27; private readonly rawFilePath = "../dist/es5/applicationinsights-core-js.min.js"; diff --git a/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts b/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts index 3ad74c4d4..14baee9d1 100644 --- a/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts +++ b/shared/AppInsightsCore/Tests/Unit/src/ApplicationInsightsCore.Tests.ts @@ -338,6 +338,49 @@ export class ApplicationInsightsCoreTests extends AITestClass { } }); + this.testCase({ + name: "Initialization: channels adds and initialize with offline channel with channel config", + useFakeTimers: true, + test: () => { + let offlineChannelPlugin = new TestOfflineChannelPlugin(); + + let channelPlugin = new TestChannelPlugin(); + + + const appInsightsCore = new AppInsightsCore(); + appInsightsCore.initialize( + { instrumentationKey: "testIkey", channels: [[offlineChannelPlugin, channelPlugin]] }, + []); + this.clock.tick(1); + + const channelQueues = appInsightsCore.getChannels(); + Assert.equal(2, channelQueues.length, "Total number of channel queues"); + Assert.equal(offlineChannelPlugin._isInit, true, "offline channel is initialized"); + } + }); + + + this.testCase({ + name: "Initialization: channels adds and initialize with offline channel with extension config", + useFakeTimers: true, + test: () => { + let offlineChannelPlugin = new TestOfflineChannelPlugin(); + + let channelPlugin = new TestChannelPlugin(); + + + const appInsightsCore = new AppInsightsCore(); + appInsightsCore.initialize( + { instrumentationKey: "testIkey", channels: [[channelPlugin]] }, + [offlineChannelPlugin]); + + const channelQueues = appInsightsCore.getChannels(); + this.clock.tick(1); + Assert.equal(2, channelQueues.length, "Total number of channel queues"); + Assert.equal(offlineChannelPlugin._isInit, true, "offline channel is initialized"); + } + }); + this.testCase({ name: 'ApplicationInsightsCore: track adds required default fields if missing', useFakeTimers: true, @@ -1183,3 +1226,143 @@ class TrackPlugin implements IPlugin { this._nextPlugin?.processTelemetry(evt); } } + +class TestOfflineChannelPlugin implements IChannelControls { + public _nextPlugin: ITelemetryPlugin; + public isFlushInvoked = false; + public isUnloadInvoked = false; + public isTearDownInvoked = false; + public isResumeInvoked = false; + public isPauseInvoked = false; + public version: string = "1.0.33-Beta"; + + public processTelemetry; + + public identifier = "OfflineChannel"; + + public priority: number = 1000; + public events: ITelemetryItem[] = []; + + public _isInit: boolean = false; + + + constructor() { + this.processTelemetry = this._processTelemetry.bind(this); + } + public pause(): void { + this.isPauseInvoked = true; + } + + public resume(): void { + this.isResumeInvoked = true; + } + + public teardown(): void { + this.isTearDownInvoked = true; + } + + flush(async?: boolean, callBack?: () => void): void { + this.isFlushInvoked = true; + if (callBack) { + callBack(); + } + } + + onunloadFlush(async?: boolean) { + this.isUnloadInvoked = true; + } + + setNextPlugin(next: ITelemetryPlugin) { + this._nextPlugin = next; + } + + public initialize = (config: IConfiguration, core: IAppInsightsCore, extensions: IPlugin[], pluginChain?: any) => { + + setTimeout(() => { + let plugin = core.getPlugin("Sender"); + let channel = plugin && plugin.plugin; + this._isInit = channel && channel.isInitialized(); + }, 0); + + } + + public isInitialized = () => { + return this._isInit; + + } + + public _processTelemetry(env: ITelemetryItem) { + this.events.push(env); + + // Just calling processTelemetry as this is the original design of the Plugins (as opposed to the newer processNext()) + this._nextPlugin?.processTelemetry(env); + } + +} + +class TestChannelPlugin implements IChannelControls { + public _nextPlugin: ITelemetryPlugin; + public isFlushInvoked = false; + public isUnloadInvoked = false; + public isTearDownInvoked = false; + public isResumeInvoked = false; + public isPauseInvoked = false; + public version: string = "1.0.33-Beta"; + + public processTelemetry; + + public identifier = "Sender"; + + public priority: number = 1001; + public events: ITelemetryItem[] = []; + public _isInitialized: boolean = false; + + constructor() { + this.processTelemetry = this._processTelemetry.bind(this); + } + public pause(): void { + this.isPauseInvoked = true; + } + + public resume(): void { + this.isResumeInvoked = true; + } + + public teardown(): void { + this.isTearDownInvoked = true; + } + + flush(async?: boolean, callBack?: () => void): void { + this.isFlushInvoked = true; + if (callBack) { + callBack(); + } + } + + onunloadFlush(async?: boolean) { + this.isUnloadInvoked = true; + } + + setNextPlugin(next: ITelemetryPlugin) { + this._nextPlugin = next; + } + + public initialize = (config: IConfiguration) => { + this._isInitialized = true + } + + + public isInitialized = () => { + return this._isInitialized + + } + + + public _processTelemetry(env: ITelemetryItem) { + this.events.push(env); + + // Just calling processTelemetry as this is the original design of the Plugins (as opposed to the newer processNext()) + this._nextPlugin?.processTelemetry(env); + } +} + diff --git a/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts b/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts index c0ef2bc4d..0991472e8 100644 --- a/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts +++ b/shared/AppInsightsCore/src/JavaScriptSDK/AppInsightsCore.ts @@ -910,7 +910,7 @@ export class AppInsightsCore im arrAppend(cfgExtensions, _extensions); let rootCtx = _createTelCtx(); - + // Initializing the channels first if (_channels && _channels.length > 0) { initializePlugins(rootCtx.createNew(_channels), allExtensions);