@microsoft/applicationinsights-core-js 2.8.0-beta.2203-02 → 2.8.0-beta.2203-03

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/browser/applicationinsights-core-js.integrity.json +9 -9
  2. package/browser/applicationinsights-core-js.js +197 -10
  3. package/browser/applicationinsights-core-js.js.map +1 -1
  4. package/browser/applicationinsights-core-js.min.js +2 -2
  5. package/browser/applicationinsights-core-js.min.js.map +1 -1
  6. package/dist/applicationinsights-core-js.api.json +751 -33
  7. package/dist/applicationinsights-core-js.api.md +26 -0
  8. package/dist/applicationinsights-core-js.d.ts +73 -2
  9. package/dist/applicationinsights-core-js.js +197 -10
  10. package/dist/applicationinsights-core-js.js.map +1 -1
  11. package/dist/applicationinsights-core-js.min.js +2 -2
  12. package/dist/applicationinsights-core-js.min.js.map +1 -1
  13. package/dist/applicationinsights-core-js.rollup.d.ts +73 -2
  14. package/dist-esm/JavaScriptSDK/AppInsightsCore.js +1 -1
  15. package/dist-esm/JavaScriptSDK/BaseCore.js +183 -10
  16. package/dist-esm/JavaScriptSDK/BaseCore.js.map +1 -1
  17. package/dist-esm/JavaScriptSDK/BaseTelemetryPlugin.js +8 -2
  18. package/dist-esm/JavaScriptSDK/BaseTelemetryPlugin.js.map +1 -1
  19. package/dist-esm/JavaScriptSDK/ChannelController.js +1 -1
  20. package/dist-esm/JavaScriptSDK/Constants.js +1 -1
  21. package/dist-esm/JavaScriptSDK/CookieMgr.js +1 -1
  22. package/dist-esm/JavaScriptSDK/CoreUtils.js +1 -1
  23. package/dist-esm/JavaScriptSDK/DataCacheHelper.js +1 -1
  24. package/dist-esm/JavaScriptSDK/DbgExtensionUtils.js +1 -1
  25. package/dist-esm/JavaScriptSDK/DiagnosticLogger.js +1 -1
  26. package/dist-esm/JavaScriptSDK/EnvUtils.js +1 -1
  27. package/dist-esm/JavaScriptSDK/EventHelpers.js +1 -1
  28. package/dist-esm/JavaScriptSDK/HelperFuncs.js +2 -2
  29. package/dist-esm/JavaScriptSDK/HelperFuncs.js.map +1 -1
  30. package/dist-esm/JavaScriptSDK/InstrumentHooks.js +1 -1
  31. package/dist-esm/JavaScriptSDK/InternalConstants.js +1 -1
  32. package/dist-esm/JavaScriptSDK/NotificationManager.js +1 -1
  33. package/dist-esm/JavaScriptSDK/PerfManager.js +1 -1
  34. package/dist-esm/JavaScriptSDK/ProcessTelemetryContext.js +16 -2
  35. package/dist-esm/JavaScriptSDK/ProcessTelemetryContext.js.map +1 -1
  36. package/dist-esm/JavaScriptSDK/RandomHelper.js +1 -1
  37. package/dist-esm/JavaScriptSDK/TelemetryHelpers.js +1 -1
  38. package/dist-esm/JavaScriptSDK/TelemetryInitializerPlugin.js +1 -1
  39. package/dist-esm/JavaScriptSDK/UnloadHandlerContainer.js +32 -0
  40. package/dist-esm/JavaScriptSDK/UnloadHandlerContainer.js.map +1 -0
  41. package/dist-esm/JavaScriptSDK.Enums/EventsDiscardedReason.js +1 -1
  42. package/dist-esm/JavaScriptSDK.Enums/LoggingEnums.js +1 -1
  43. package/dist-esm/JavaScriptSDK.Enums/SendRequestReason.js +1 -1
  44. package/dist-esm/JavaScriptSDK.Enums/TelemetryUnloadReason.js +1 -1
  45. package/dist-esm/JavaScriptSDK.Interfaces/IAppInsightsCore.js +1 -1
  46. package/dist-esm/JavaScriptSDK.Interfaces/IChannelControls.js +1 -1
  47. package/dist-esm/JavaScriptSDK.Interfaces/IConfiguration.js +1 -1
  48. package/dist-esm/JavaScriptSDK.Interfaces/ICookieMgr.js +1 -1
  49. package/dist-esm/JavaScriptSDK.Interfaces/IDbgExtension.js +1 -1
  50. package/dist-esm/JavaScriptSDK.Interfaces/IDiagnosticLogger.js +1 -1
  51. package/dist-esm/JavaScriptSDK.Interfaces/IInstrumentHooks.js +1 -1
  52. package/dist-esm/JavaScriptSDK.Interfaces/INotificationListener.js +1 -1
  53. package/dist-esm/JavaScriptSDK.Interfaces/INotificationManager.js +1 -1
  54. package/dist-esm/JavaScriptSDK.Interfaces/IPerfEvent.js +1 -1
  55. package/dist-esm/JavaScriptSDK.Interfaces/IPerfManager.js +1 -1
  56. package/dist-esm/JavaScriptSDK.Interfaces/IProcessTelemetryContext.js +1 -1
  57. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryInitializers.js +1 -1
  58. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryItem.js +1 -1
  59. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryPlugin.js +1 -1
  60. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryPluginChain.js +1 -1
  61. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryUnloadState.js +1 -1
  62. package/dist-esm/applicationinsights-core-js.js +2 -1
  63. package/dist-esm/applicationinsights-core-js.js.map +1 -1
  64. package/package.json +1 -1
  65. package/src/JavaScriptSDK/BaseCore.ts +233 -10
  66. package/src/JavaScriptSDK/BaseTelemetryPlugin.ts +16 -2
  67. package/src/JavaScriptSDK/HelperFuncs.ts +1 -1
  68. package/src/JavaScriptSDK/ProcessTelemetryContext.ts +16 -2
  69. package/src/JavaScriptSDK/UnloadHandlerContainer.ts +44 -0
  70. package/src/JavaScriptSDK.Enums/SendRequestReason.ts +5 -0
  71. package/src/JavaScriptSDK.Enums/TelemetryUnloadReason.ts +3 -3
  72. package/src/JavaScriptSDK.Interfaces/IAppInsightsCore.ts +29 -2
  73. package/types/JavaScriptSDK/BaseCore.d.ts +17 -1
  74. package/types/JavaScriptSDK/BaseTelemetryPlugin.d.ts +6 -0
  75. package/types/JavaScriptSDK/ProcessTelemetryContext.d.ts +2 -0
  76. package/types/JavaScriptSDK/UnloadHandlerContainer.d.ts +11 -0
  77. package/types/JavaScriptSDK.Enums/SendRequestReason.d.ts +4 -0
  78. package/types/JavaScriptSDK.Enums/TelemetryUnloadReason.d.ts +13 -1
  79. package/types/JavaScriptSDK.Interfaces/IAppInsightsCore.d.ts +24 -1
  80. package/types/applicationinsights-core-js.d.ts +1 -0
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Microsoft Application Insights Core Javascript SDK, 2.8.0-beta.2203-02
2
+ * Microsoft Application Insights Core Javascript SDK, 2.8.0-beta.2203-03
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  *
5
5
  * Microsoft Application Insights Team
@@ -195,11 +195,26 @@ export declare class BaseCore implements IAppInsightsCore {
195
195
  * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed
196
196
  */
197
197
  addTelemetryInitializer(telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler | void;
198
+ /**
199
+ * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered
200
+ * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous
201
+ * unload call return `true` stating that all plugins reported that they also unloaded, the recommended
202
+ * approach is to create a new instance and initialize that instance.
203
+ * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable
204
+ * to successfully remove any global references or they may just be completing the unload process asynchronously.
205
+ */
206
+ unload(isAsync?: boolean, unloadComplete?: () => void): void;
198
207
  getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T>;
208
+ addPlugin<T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting: boolean, doAsync: boolean, addCb?: (added?: boolean) => void): void;
199
209
  /**
200
210
  * Returns the unique event namespace that should be used
201
211
  */
202
212
  evtNamespace(): string;
213
+ /**
214
+ * Add an unload handler that will be called when the SDK is being unloaded
215
+ * @param handler - the handler
216
+ */
217
+ addUnloadCb(handler: UnloadHandler): void;
203
218
  protected releaseQueue(): void;
204
219
  }
205
220
 
@@ -269,6 +284,11 @@ export declare abstract class BaseTelemetryPlugin implements ITelemetryPlugin {
269
284
  */
270
285
  teardown(unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState): void | boolean;
271
286
  abstract processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void;
287
+ /**
288
+ * Add an unload handler that will be called when the SDK is being unloaded
289
+ * @param handler - the handler
290
+ */
291
+ protected _addUnloadCb(handler: UnloadHandler): void;
272
292
  /**
273
293
  * Add this hook so that it is automatically removed during unloading
274
294
  * @param hooks - The single hook or an array of IInstrumentHook objects
@@ -311,11 +331,17 @@ export declare function createEnumStyle<T>(values: T): T;
311
331
  * @param plugins - The plugin instances that will be executed
312
332
  * @param config - The current config
313
333
  * @param core - The current core instance
334
+ * @param startAt - Identifies the next plugin to execute, if null there is no "next" plugin and if undefined it should assume the start of the chain
314
335
  */
315
336
  export declare function createProcessTelemetryContext(telemetryChain: ITelemetryPluginChain, config: IConfiguration, core: IAppInsightsCore, startAt?: IPlugin): IProcessTelemetryContext;
316
337
 
317
338
  export declare function createUniqueNamespace(name: string, includeVersion?: boolean): string;
318
339
 
340
+ export declare function createUnloadHandlerContainer(): {
341
+ add: (handler: UnloadHandler) => void;
342
+ run: (unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void;
343
+ };
344
+
319
345
  /**
320
346
  * Return the current time via the Date now() function (if available) and falls back to (new Date()).getTime() if now() is unavailable (IE8 or less)
321
347
  * https://caniuse.com/#search=Date.now
@@ -787,15 +813,36 @@ export declare interface IAppInsightsCore extends IPerfManagerProvider {
787
813
  * Return a new instance of the IProcessTelemetryContext for processing events
788
814
  */
789
815
  getProcessTelContext(): IProcessTelemetryContext;
816
+ /**
817
+ * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered
818
+ * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous
819
+ * unload call return `true` stating that all plugins reported that they also unloaded, the recommended
820
+ * approach is to create a new instance and initialize that instance.
821
+ * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable
822
+ * to successfully remove any global references or they may just be completing the unload process asynchronously.
823
+ */
824
+ unload(isAsync?: boolean, unloadComplete?: () => void): void;
790
825
  /**
791
826
  * Find and return the (first) plugin with the specified identifier if present
792
827
  * @param pluginIdentifier
793
828
  */
794
829
  getPlugin<T extends IPlugin = IPlugin>(pluginIdentifier: string): ILoadedPlugin<T>;
830
+ /**
831
+ * Add a new plugin to the installation
832
+ * @param plugin - The new plugin to add
833
+ * @param replaceExisting - should any existing plugin be replaced
834
+ * @param doAsync - Should the add be performed asynchronously
835
+ */
836
+ addPlugin<T extends IPlugin = ITelemetryPlugin>(plugin: T, replaceExisting: boolean, doAsync: boolean, addCb?: (added?: boolean) => void): void;
795
837
  /**
796
838
  * Returns the unique event namespace that should be used when registering events
797
839
  */
798
840
  evtNamespace(): string;
841
+ /**
842
+ * Add a handler that will be called when the SDK is being unloaded
843
+ * @param handler - the handler
844
+ */
845
+ addUnloadCb(handler: UnloadHandler): void;
799
846
  }
800
847
 
801
848
  declare interface IBaseProcessingContext {
@@ -1497,6 +1544,7 @@ declare interface ILoadedPlugin<T extends IPlugin> {
1497
1544
  * (unless it's also been re-initialized)
1498
1545
  */
1499
1546
  setEnabled: (isEnabled: boolean) => void;
1547
+ remove: (isAsync?: boolean, removeCb?: (removed?: boolean) => void) => void;
1500
1548
  }
1501
1549
 
1502
1550
  /**
@@ -2108,6 +2156,11 @@ export declare interface ITelemetryUnloadState {
2108
2156
  flushComplete?: boolean;
2109
2157
  }
2110
2158
 
2159
+ export declare interface IUnloadHandlerContainer {
2160
+ add: (handler: UnloadHandler) => void;
2161
+ run: (itemCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void;
2162
+ }
2163
+
2111
2164
  /**
2112
2165
  * Helper to support backward compatibility for users that use the legacy cookie handling functions and the use the internal
2113
2166
  * CoreUtils._canUseCookies global flag to enable/disable cookies usage.
@@ -2528,6 +2581,10 @@ export declare const enum SendRequestReason {
2528
2581
  * The event(s) being sent as a retry
2529
2582
  */
2530
2583
  Retry = 5,
2584
+ /**
2585
+ * The SDK is unloading
2586
+ */
2587
+ SdkUnload = 6,
2531
2588
  /**
2532
2589
  * Maximum batch size would be exceeded
2533
2590
  */
@@ -2623,7 +2680,19 @@ declare const enum TelemetryUnloadReason {
2623
2680
  /**
2624
2681
  * Teardown has been called without any context.
2625
2682
  */
2626
- ManualTeardown = 0
2683
+ ManualTeardown = 0,
2684
+ /**
2685
+ * Just this plugin is being removed
2686
+ */
2687
+ PluginUnload = 1,
2688
+ /**
2689
+ * This instance of the plugin is being removed and replaced
2690
+ */
2691
+ PluginReplace = 2,
2692
+ /**
2693
+ * The entire SDK is being unloaded
2694
+ */
2695
+ SdkUnload = 50
2627
2696
  }
2628
2697
 
2629
2698
  export declare function throwError(message: string): never;
@@ -2637,6 +2706,8 @@ export declare function uaDisallowsSameSiteNone(userAgent: string): boolean;
2637
2706
 
2638
2707
  export declare const Undefined = "undefined";
2639
2708
 
2709
+ export declare type UnloadHandler = (itemCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void;
2710
+
2640
2711
  export declare function useXDomainRequest(): boolean | undefined;
2641
2712
 
2642
2713
  export { }
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Core, 2.8.0-beta.2203-02
2
+ * Application Insights JavaScript SDK - Core, 2.8.0-beta.2203-03
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
  import { __extendsFn as __extends } from "@microsoft/applicationinsights-shims";
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Core, 2.8.0-beta.2203-02
2
+ * Application Insights JavaScript SDK - Core, 2.8.0-beta.2203-03
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -8,20 +8,24 @@
8
8
  import { __spreadArrayFn as __spreadArray } from "@microsoft/applicationinsights-shims";
9
9
  import { objCreateFn } from "@microsoft/applicationinsights-shims";
10
10
  import dynamicProto from "@microsoft/dynamicproto-js";
11
- import { createProcessTelemetryContext, createTelemetryProxyChain } from "./ProcessTelemetryContext";
11
+ import { createProcessTelemetryContext, createProcessTelemetryUnloadContext, createTelemetryProxyChain } from "./ProcessTelemetryContext";
12
12
  import { initializePlugins, sortPlugins, _getPluginState } from "./TelemetryHelpers";
13
13
  import { getGblPerfMgr, PerfManager } from "./PerfManager";
14
14
  import { createCookieMgr } from "./CookieMgr";
15
- import { arrForEach, isNullOrUndefined, toISOString, getSetValue, setValue, throwError, isNotTruthy, isFunction, objFreeze, proxyFunctions } from "./HelperFuncs";
15
+ import { arrForEach, isNullOrUndefined, toISOString, getSetValue, setValue, throwError, isNotTruthy, isFunction, objFreeze, proxyFunctionAs, proxyFunctions } from "./HelperFuncs";
16
16
  import { strExtensionConfig, strIKey } from "./Constants";
17
17
  import { DiagnosticLogger, _InternalLogMessage } from "./DiagnosticLogger";
18
18
  import { getDebugListener } from "./DbgExtensionUtils";
19
19
  import { ChannelControllerPriority, createChannelControllerPlugin, createChannelQueues } from "./ChannelController";
20
20
  import { TelemetryInitializerPlugin } from "./TelemetryInitializerPlugin";
21
21
  import { createUniqueNamespace } from "./DataCacheHelper";
22
+ import { createUnloadHandlerContainer } from "./UnloadHandlerContainer";
22
23
  import { strAddNotificationListener, strDisabled, strEventsDiscarded, strEventsSendRequest, strEventsSent, strRemoveNotificationListener, strTeardown } from "./InternalConstants";
23
24
  var strValidationError = "Plugins must provide initialize method";
24
25
  var strNotificationManager = "_notificationManager";
26
+ var strSdkUnloadingError = "SDK is still unloading...";
27
+ var strSdkNotInitialized = "SDK is not initialized";
28
+ var strPluginUnloadFailed = "Failed to unload plugin";
25
29
  /**
26
30
  * Helper to create the default performance manager
27
31
  * @param core
@@ -63,6 +67,16 @@ function _validateExtensions(logger, channelPriority, allExtensions) {
63
67
  core: coreExtensions
64
68
  };
65
69
  }
70
+ function _isPluginPresent(thePlugin, plugins) {
71
+ var exists = false;
72
+ arrForEach(plugins, function (plugin) {
73
+ if (plugin === thePlugin) {
74
+ exists = true;
75
+ return -1;
76
+ }
77
+ });
78
+ return exists;
79
+ }
66
80
  function _createDummyNotificationManager() {
67
81
  var _a;
68
82
  return objCreateFn((_a = {},
@@ -88,9 +102,11 @@ var BaseCore = /** @class */ (function () {
88
102
  var _channelControl;
89
103
  var _channelConfig;
90
104
  var _channelQueue;
105
+ var _isUnloading;
91
106
  var _telemetryInitializerPlugin;
92
107
  var _internalLogsEventName;
93
108
  var _evtNamespace;
109
+ var _unloadHandlers;
94
110
  var _debugListener;
95
111
  /**
96
112
  * Internal log poller
@@ -101,6 +117,9 @@ var BaseCore = /** @class */ (function () {
101
117
  _initDefaults();
102
118
  _self.isInitialized = function () { return _isInitialized; };
103
119
  _self.initialize = function (config, extensions, logger, notificationManager) {
120
+ if (_isUnloading) {
121
+ throwError(strSdkUnloadingError);
122
+ }
104
123
  // Make sure core is only initialized once
105
124
  if (_self.isInitialized()) {
106
125
  throwError("Core should not be initialized more than once");
@@ -116,8 +135,7 @@ var BaseCore = /** @class */ (function () {
116
135
  _initPerfManager(config);
117
136
  config.extensions = isNullOrUndefined(config.extensions) ? [] : config.extensions;
118
137
  // add notification to the extensions in the config so other plugins can access it
119
- var extConfig = getSetValue(config, strExtensionConfig);
120
- extConfig.NotificationManager = notificationManager;
138
+ _initExtConfig(config);
121
139
  if (logger) {
122
140
  _self.logger = logger;
123
141
  }
@@ -146,7 +164,7 @@ var BaseCore = /** @class */ (function () {
146
164
  setValue(telemetryItem, "time", toISOString(new Date()), null, isNotTruthy);
147
165
  // Common Schema 4.0
148
166
  setValue(telemetryItem, "ver", "4.0", null, isNullOrUndefined);
149
- if (_self.isInitialized()) {
167
+ if (!_isUnloading && _self.isInitialized()) {
150
168
  // Process the telemetry plugin chain
151
169
  _createTelCtx().processNext(telemetryItem);
152
170
  }
@@ -171,18 +189,18 @@ var BaseCore = /** @class */ (function () {
171
189
  * called.
172
190
  * @param {INotificationListener} listener - An INotificationListener object.
173
191
  */
174
- _self.addNotificationListener = function (listener) {
192
+ _self[strAddNotificationListener] = function (listener) {
175
193
  if (_notificationManager) {
176
- _notificationManager.addNotificationListener(listener);
194
+ _notificationManager[strAddNotificationListener](listener);
177
195
  }
178
196
  };
179
197
  /**
180
198
  * Removes all instances of the listener.
181
199
  * @param {INotificationListener} listener - INotificationListener to remove.
182
200
  */
183
- _self.removeNotificationListener = function (listener) {
201
+ _self[strRemoveNotificationListener] = function (listener) {
184
202
  if (_notificationManager) {
185
- _notificationManager.removeNotificationListener(listener);
203
+ _notificationManager[strRemoveNotificationListener](listener);
186
204
  }
187
205
  };
188
206
  _self.getCookieMgr = function () {
@@ -246,10 +264,89 @@ var BaseCore = /** @class */ (function () {
246
264
  };
247
265
  // Add addTelemetryInitializer
248
266
  proxyFunctions(_self, function () { return _telemetryInitializerPlugin; }, ["addTelemetryInitializer"]);
267
+ _self.unload = function (isAsync, unloadComplete, cbTimeout) {
268
+ if (isAsync === void 0) { isAsync = true; }
269
+ if (!_isInitialized) {
270
+ // The SDK is not initialized
271
+ throwError(strSdkNotInitialized);
272
+ }
273
+ // Check if the SDK still unloading so throw
274
+ if (_isUnloading) {
275
+ // The SDK is already unloading
276
+ throwError(strSdkUnloadingError);
277
+ }
278
+ var unloadState = {
279
+ reason: 50 /* SdkUnload */,
280
+ isAsync: isAsync,
281
+ flushComplete: false
282
+ };
283
+ var processUnloadCtx = createProcessTelemetryUnloadContext(_getPluginChain(), _self.config, _self);
284
+ processUnloadCtx.onComplete(function () {
285
+ _initDefaults();
286
+ unloadComplete && unloadComplete(unloadState);
287
+ }, _self);
288
+ function _doUnload(flushComplete) {
289
+ unloadState.flushComplete = flushComplete;
290
+ _isUnloading = true;
291
+ // Run all of the unload handlers first (before unloading the plugins)
292
+ _unloadHandlers.run(processUnloadCtx, unloadState);
293
+ // Stop polling the internal logs
294
+ _self.stopPollingInternalLogs();
295
+ // Start unloading the components, from this point onwards the SDK should be considered to be in an unstable state
296
+ processUnloadCtx.processNext(unloadState);
297
+ }
298
+ if (_channelControl) {
299
+ _channelControl.flush(isAsync, _doUnload, 6 /* SdkUnload */, cbTimeout);
300
+ }
301
+ else {
302
+ _doUnload(true);
303
+ }
304
+ };
249
305
  _self.getPlugin = _getPlugin;
306
+ _self.addPlugin = function (plugin, replaceExisting, isAsync, addCb) {
307
+ if (isAsync === void 0) { isAsync = true; }
308
+ if (!plugin) {
309
+ addCb && addCb(false);
310
+ _logOrThrowError(strValidationError);
311
+ return;
312
+ }
313
+ var existingPlugin = _getPlugin(plugin.identifier);
314
+ if (existingPlugin && !replaceExisting) {
315
+ addCb && addCb(false);
316
+ _logOrThrowError("Plugin [" + plugin.identifier + "] is already loaded!");
317
+ return;
318
+ }
319
+ function _addPlugin(removed) {
320
+ _configExtensions.push(plugin);
321
+ // Re-Initialize the plugin chain
322
+ _initPluginChain(_self.config);
323
+ addCb && addCb(true);
324
+ }
325
+ if (existingPlugin) {
326
+ var removedPlugins = [existingPlugin.plugin];
327
+ var unloadState = {
328
+ reason: 2 /* PluginReplace */,
329
+ isAsync: isAsync
330
+ };
331
+ _removePlugins(removedPlugins, unloadState, function (removed) {
332
+ if (!removed) {
333
+ // Previous plugin was successfully removed or was not installed
334
+ addCb && addCb(false);
335
+ }
336
+ else {
337
+ _addPlugin(true);
338
+ }
339
+ });
340
+ }
341
+ else {
342
+ _addPlugin(false);
343
+ }
344
+ };
250
345
  _self.evtNamespace = function () {
251
346
  return _evtNamespace;
252
347
  };
348
+ // Create the addUnloadCb
349
+ proxyFunctionAs(_self, "addUnloadCb", function () { return _unloadHandlers; }, "add");
253
350
  function _initDefaults() {
254
351
  _isInitialized = false;
255
352
  // Use a default logger so initialization errors are not dropped on the floor with full logging
@@ -268,8 +365,10 @@ var BaseCore = /** @class */ (function () {
268
365
  _channelControl = null;
269
366
  _channelConfig = null;
270
367
  _channelQueue = null;
368
+ _isUnloading = false;
271
369
  _internalLogsEventName = null;
272
370
  _evtNamespace = createUniqueNamespace("AIBaseCore", true);
371
+ _unloadHandlers = createUnloadHandlerContainer();
273
372
  }
274
373
  function _createTelCtx() {
275
374
  return createProcessTelemetryContext(_getPluginChain(), _self.config, _self);
@@ -335,6 +434,21 @@ var BaseCore = /** @class */ (function () {
335
434
  isEnabled: function () {
336
435
  var pluginState = _getPluginState(thePlugin);
337
436
  return !pluginState[strTeardown] && !pluginState[strDisabled];
437
+ },
438
+ remove: function (isAsync, removeCb) {
439
+ if (isAsync === void 0) { isAsync = true; }
440
+ var pluginsToRemove = [thePlugin];
441
+ var unloadState = {
442
+ reason: 1 /* PluginUnload */,
443
+ isAsync: isAsync
444
+ };
445
+ _removePlugins(pluginsToRemove, unloadState, function (removed) {
446
+ if (removed) {
447
+ // Re-Initialize the plugin chain
448
+ _initPluginChain(_self.config);
449
+ }
450
+ removeCb && removeCb(removed);
451
+ });
338
452
  }
339
453
  };
340
454
  }
@@ -352,6 +466,48 @@ var BaseCore = /** @class */ (function () {
352
466
  }
353
467
  return _pluginChain;
354
468
  }
469
+ function _removePlugins(thePlugins, unloadState, removeComplete) {
470
+ if (thePlugins && thePlugins.length > 0) {
471
+ var unloadChain = createTelemetryProxyChain(thePlugins, _self.config, _self);
472
+ var unloadCtx = createProcessTelemetryUnloadContext(unloadChain, _self.config, _self);
473
+ unloadCtx.onComplete(function () {
474
+ var removed = false;
475
+ // Remove the listed config extensions
476
+ var newConfigExtensions = [];
477
+ arrForEach(_configExtensions, function (plugin, idx) {
478
+ if (!_isPluginPresent(plugin, thePlugins)) {
479
+ newConfigExtensions.push(plugin);
480
+ }
481
+ else {
482
+ removed = true;
483
+ }
484
+ });
485
+ _configExtensions = newConfigExtensions;
486
+ // Re-Create the channel config
487
+ var newChannelConfig = [];
488
+ if (_channelConfig) {
489
+ arrForEach(_channelConfig, function (queue, idx) {
490
+ var newQueue = [];
491
+ arrForEach(queue, function (channel) {
492
+ if (!_isPluginPresent(channel, thePlugins)) {
493
+ newQueue.push(channel);
494
+ }
495
+ else {
496
+ removed = true;
497
+ }
498
+ });
499
+ newChannelConfig.push(newQueue);
500
+ });
501
+ _channelConfig = newChannelConfig;
502
+ }
503
+ removeComplete && removeComplete(removed);
504
+ });
505
+ unloadCtx.processNext(unloadState);
506
+ }
507
+ else {
508
+ removeComplete(false);
509
+ }
510
+ }
355
511
  function _flushInternalLogs() {
356
512
  var queue = _self.logger ? _self.logger.queue : [];
357
513
  if (queue) {
@@ -389,6 +545,20 @@ var BaseCore = /** @class */ (function () {
389
545
  setValue(_self.config, "createPerfMgr", _createPerfManager);
390
546
  }
391
547
  }
548
+ function _initExtConfig(config) {
549
+ var extConfig = getSetValue(config, strExtensionConfig);
550
+ extConfig.NotificationManager = _notificationManager;
551
+ }
552
+ function _logOrThrowError(message) {
553
+ var logger = _self.logger;
554
+ if (logger) {
555
+ // there should always be a logger
556
+ logger.throwInternal(2 /* WARNING */, 73 /* PluginException */, message);
557
+ }
558
+ else {
559
+ throwError(message);
560
+ }
561
+ }
392
562
  });
393
563
  }
394
564
  // Removed Stub for BaseCore.prototype.initialize.
@@ -406,8 +576,11 @@ var BaseCore = /** @class */ (function () {
406
576
  // Removed Stub for BaseCore.prototype.pollInternalLogs.
407
577
  // Removed Stub for BaseCore.prototype.stopPollingInternalLogs.
408
578
  // Removed Stub for BaseCore.prototype.addTelemetryInitializer.
579
+ // Removed Stub for BaseCore.prototype.unload.
409
580
  // Removed Stub for BaseCore.prototype.getPlugin.
581
+ // Removed Stub for BaseCore.prototype.addPlugin.
410
582
  // Removed Stub for BaseCore.prototype.evtNamespace.
583
+ // Removed Stub for BaseCore.prototype.addUnloadCb.
411
584
  // Removed Stub for BaseCore.prototype.releaseQueue.
412
585
  return BaseCore;
413
586
  }());
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCore.js.map","sources":["BaseCore.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\n\"use strict\";\r\nimport { __spreadArray } from \"tslib\";\r\nimport { objCreateFn } from \"@microsoft/applicationinsights-shims\";\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { createProcessTelemetryContext, createTelemetryProxyChain } from \"./ProcessTelemetryContext\";\r\nimport { initializePlugins, sortPlugins, _getPluginState } from \"./TelemetryHelpers\";\r\nimport { getGblPerfMgr, PerfManager } from \"./PerfManager\";\r\nimport { createCookieMgr } from \"./CookieMgr\";\r\nimport { arrForEach, isNullOrUndefined, toISOString, getSetValue, setValue, throwError, isNotTruthy, isFunction, objFreeze, proxyFunctions } from \"./HelperFuncs\";\r\nimport { strExtensionConfig, strIKey } from \"./Constants\";\r\nimport { DiagnosticLogger, _InternalLogMessage } from \"./DiagnosticLogger\";\r\nimport { getDebugListener } from \"./DbgExtensionUtils\";\r\nimport { ChannelControllerPriority, createChannelControllerPlugin, createChannelQueues } from \"./ChannelController\";\r\nimport { TelemetryInitializerPlugin } from \"./TelemetryInitializerPlugin\";\r\nimport { createUniqueNamespace } from \"./DataCacheHelper\";\r\nimport { strAddNotificationListener, strDisabled, strEventsDiscarded, strEventsSendRequest, strEventsSent, strRemoveNotificationListener, strTeardown } from \"./InternalConstants\";\r\nvar strValidationError = \"Plugins must provide initialize method\";\r\nvar strNotificationManager = \"_notificationManager\";\r\n/**\r\n * Helper to create the default performance manager\r\n * @param core\r\n * @param notificationMgr\r\n */\r\nfunction _createPerfManager(core, notificationMgr) {\r\n return new PerfManager(notificationMgr);\r\n}\r\nfunction _validateExtensions(logger, channelPriority, allExtensions) {\r\n // Concat all available extensions\r\n var coreExtensions = [];\r\n // Check if any two extensions have the same priority, then warn to console\r\n // And extract the local extensions from the\r\n var extPriorities = {};\r\n // Extension validation\r\n arrForEach(allExtensions, function (ext) {\r\n if (isNullOrUndefined(ext) || isNullOrUndefined(ext.initialize)) {\r\n throwError(strValidationError);\r\n }\r\n var extPriority = ext.priority;\r\n var identifier = ext.identifier;\r\n if (ext && extPriority) {\r\n if (!isNullOrUndefined(extPriorities[extPriority])) {\r\n logger.warnToConsole(\"Two extensions have same priority #\" + extPriority + \" - \" + extPriorities[extPriority] + \", \" + identifier);\r\n }\r\n else {\r\n // set a value\r\n extPriorities[extPriority] = identifier;\r\n }\r\n }\r\n // Split extensions to core and channelController\r\n if (!extPriority || extPriority < channelPriority) {\r\n // Add to core extension that will be managed by BaseCore\r\n coreExtensions.push(ext);\r\n }\r\n });\r\n return {\r\n all: allExtensions,\r\n core: coreExtensions\r\n };\r\n}\r\nfunction _createDummyNotificationManager() {\r\n var _a;\r\n return objCreateFn((_a = {},\r\n _a[strAddNotificationListener] = function (listener) { },\r\n _a[strRemoveNotificationListener] = function (listener) { },\r\n _a[strEventsSent] = function (events) { },\r\n _a[strEventsDiscarded] = function (events, reason) { },\r\n _a[strEventsSendRequest] = function (sendReason, isAsync) { },\r\n _a));\r\n}\r\nvar BaseCore = /** @class */ (function () {\r\n function BaseCore() {\r\n // NOTE!: DON'T set default values here, instead set them in the _initDefaults() function as it is also called during teardown()\r\n var _isInitialized;\r\n var _eventQueue;\r\n var _notificationManager;\r\n var _perfManager;\r\n var _cfgPerfManager;\r\n var _cookieManager;\r\n var _pluginChain;\r\n var _configExtensions;\r\n var _coreExtensions;\r\n var _channelControl;\r\n var _channelConfig;\r\n var _channelQueue;\r\n var _telemetryInitializerPlugin;\r\n var _internalLogsEventName;\r\n var _evtNamespace;\r\n var _debugListener;\r\n /**\r\n * Internal log poller\r\n */\r\n var _internalLogPoller = 0;\r\n dynamicProto(BaseCore, this, function (_self) {\r\n // Set the default values (also called during teardown)\r\n _initDefaults();\r\n _self.isInitialized = function () { return _isInitialized; };\r\n _self.initialize = function (config, extensions, logger, notificationManager) {\r\n // Make sure core is only initialized once\r\n if (_self.isInitialized()) {\r\n throwError(\"Core should not be initialized more than once\");\r\n }\r\n if (!config || isNullOrUndefined(config.instrumentationKey)) {\r\n throwError(\"Please provide instrumentation key\");\r\n }\r\n _notificationManager = notificationManager;\r\n // For backward compatibility only\r\n _self[strNotificationManager] = notificationManager;\r\n _self.config = config || {};\r\n _initDebugListener(config);\r\n _initPerfManager(config);\r\n config.extensions = isNullOrUndefined(config.extensions) ? [] : config.extensions;\r\n // add notification to the extensions in the config so other plugins can access it\r\n var extConfig = getSetValue(config, strExtensionConfig);\r\n extConfig.NotificationManager = notificationManager;\r\n if (logger) {\r\n _self.logger = logger;\r\n }\r\n // Extension validation\r\n _configExtensions = [];\r\n _configExtensions.push.apply(_configExtensions, __spreadArray(__spreadArray([], extensions, false), config.extensions, false));\r\n _channelConfig = (config || {}).channels;\r\n _initPluginChain(config);\r\n if (_self.getTransmissionControls().length === 0) {\r\n throwError(\"No channels available\");\r\n }\r\n _isInitialized = true;\r\n _self.releaseQueue();\r\n };\r\n _self.getTransmissionControls = function () {\r\n var controls = [];\r\n arrForEach(_channelQueue, function (channels) {\r\n controls.push(channels.queue);\r\n });\r\n return objFreeze(controls);\r\n };\r\n _self.track = function (telemetryItem) {\r\n // setup default iKey if not passed in\r\n setValue(telemetryItem, strIKey, _self.config.instrumentationKey, null, isNotTruthy);\r\n // add default timestamp if not passed in\r\n setValue(telemetryItem, \"time\", toISOString(new Date()), null, isNotTruthy);\r\n // Common Schema 4.0\r\n setValue(telemetryItem, \"ver\", \"4.0\", null, isNullOrUndefined);\r\n if (_self.isInitialized()) {\r\n // Process the telemetry plugin chain\r\n _createTelCtx().processNext(telemetryItem);\r\n }\r\n else {\r\n // Queue events until all extensions are initialized\r\n _eventQueue.push(telemetryItem);\r\n }\r\n };\r\n _self.getProcessTelContext = _createTelCtx;\r\n _self.getNotifyMgr = function () {\r\n if (!_notificationManager) {\r\n // Create Dummy notification manager\r\n _notificationManager = _createDummyNotificationManager();\r\n // For backward compatibility only\r\n _self[strNotificationManager] = _notificationManager;\r\n }\r\n return _notificationManager;\r\n };\r\n /**\r\n * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\r\n * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\r\n * called.\r\n * @param {INotificationListener} listener - An INotificationListener object.\r\n */\r\n _self.addNotificationListener = function (listener) {\r\n if (_notificationManager) {\r\n _notificationManager.addNotificationListener(listener);\r\n }\r\n };\r\n /**\r\n * Removes all instances of the listener.\r\n * @param {INotificationListener} listener - INotificationListener to remove.\r\n */\r\n _self.removeNotificationListener = function (listener) {\r\n if (_notificationManager) {\r\n _notificationManager.removeNotificationListener(listener);\r\n }\r\n };\r\n _self.getCookieMgr = function () {\r\n if (!_cookieManager) {\r\n _cookieManager = createCookieMgr(_self.config, _self.logger);\r\n }\r\n return _cookieManager;\r\n };\r\n _self.setCookieMgr = function (cookieMgr) {\r\n _cookieManager = cookieMgr;\r\n };\r\n _self.getPerfMgr = function () {\r\n if (!_perfManager && !_cfgPerfManager) {\r\n if (_self.config && _self.config.enablePerfMgr && isFunction(_self.config.createPerfMgr)) {\r\n _cfgPerfManager = _self.config.createPerfMgr(_self, _self.getNotifyMgr());\r\n }\r\n }\r\n return _perfManager || _cfgPerfManager || getGblPerfMgr();\r\n };\r\n _self.setPerfMgr = function (perfMgr) {\r\n _perfManager = perfMgr;\r\n };\r\n _self.eventCnt = function () {\r\n return _eventQueue.length;\r\n };\r\n _self.releaseQueue = function () {\r\n if (_isInitialized && _eventQueue.length > 0) {\r\n var eventQueue = _eventQueue;\r\n _eventQueue = [];\r\n arrForEach(eventQueue, function (event) {\r\n _createTelCtx().processNext(event);\r\n });\r\n }\r\n };\r\n /**\r\n * Periodically check logger.queue for log messages to be flushed\r\n */\r\n _self.pollInternalLogs = function (eventName) {\r\n _internalLogsEventName = eventName;\r\n var interval = _self.config.diagnosticLogInterval;\r\n if (!interval || !(interval > 0)) {\r\n interval = 10000;\r\n }\r\n if (_internalLogPoller) {\r\n clearInterval(_internalLogPoller);\r\n }\r\n _internalLogPoller = setInterval(function () {\r\n _flushInternalLogs();\r\n }, interval);\r\n return _internalLogPoller;\r\n };\r\n /**\r\n * Stop polling log messages from logger.queue\r\n */\r\n _self.stopPollingInternalLogs = function () {\r\n if (_internalLogPoller) {\r\n clearInterval(_internalLogPoller);\r\n _internalLogPoller = 0;\r\n _flushInternalLogs();\r\n }\r\n };\r\n // Add addTelemetryInitializer\r\n proxyFunctions(_self, function () { return _telemetryInitializerPlugin; }, [\"addTelemetryInitializer\"]);\r\n _self.getPlugin = _getPlugin;\r\n _self.evtNamespace = function () {\r\n return _evtNamespace;\r\n };\r\n function _initDefaults() {\r\n _isInitialized = false;\r\n // Use a default logger so initialization errors are not dropped on the floor with full logging\r\n _self.logger = new DiagnosticLogger({ loggingLevelConsole: 1 /* CRITICAL */ });\r\n _self.config = null;\r\n _self._extensions = [];\r\n _telemetryInitializerPlugin = new TelemetryInitializerPlugin();\r\n _eventQueue = [];\r\n _notificationManager = null;\r\n _perfManager = null;\r\n _cfgPerfManager = null;\r\n _cookieManager = null;\r\n _pluginChain = null;\r\n _coreExtensions = null;\r\n _configExtensions = null;\r\n _channelControl = null;\r\n _channelConfig = null;\r\n _channelQueue = null;\r\n _internalLogsEventName = null;\r\n _evtNamespace = createUniqueNamespace(\"AIBaseCore\", true);\r\n }\r\n function _createTelCtx() {\r\n return createProcessTelemetryContext(_getPluginChain(), _self.config, _self);\r\n }\r\n // Initialize or Re-initialize the plugins\r\n function _initPluginChain(config) {\r\n // Extension validation\r\n var theExtensions = _validateExtensions(_self.logger, ChannelControllerPriority, _configExtensions);\r\n _coreExtensions = theExtensions.core;\r\n _pluginChain = null;\r\n // Sort the complete set of extensions by priority\r\n var allExtensions = theExtensions.all;\r\n // Initialize the Channel Queues and the channel plugins first\r\n _channelQueue = objFreeze(createChannelQueues(_channelConfig, allExtensions, config, _self));\r\n if (_channelControl) {\r\n // During add / remove of a plugin this may get called again, so don't re-add if already present\r\n // But we also want the controller as the last, so remove if already present\r\n // And reusing the existing instance, just in case an installed plugin has a reference and\r\n // is using it.\r\n var idx = allExtensions.indexOf(_channelControl);\r\n if (idx !== -1) {\r\n allExtensions.splice(idx, 1);\r\n }\r\n idx = _coreExtensions.indexOf(_channelControl);\r\n if (idx !== -1) {\r\n _coreExtensions.splice(idx, 1);\r\n }\r\n _channelControl._setQueue(_channelQueue);\r\n }\r\n else {\r\n _channelControl = createChannelControllerPlugin(_channelQueue, _self);\r\n }\r\n // Add on \"channelController\" as the last \"plugin\"\r\n allExtensions.push(_channelControl);\r\n _coreExtensions.push(_channelControl);\r\n // Required to allow plugins to call core.getPlugin() during their own initialization\r\n _self._extensions = sortPlugins(allExtensions);\r\n // Initialize the controls\r\n _channelControl.initialize(config, _self, allExtensions);\r\n initializePlugins(_createTelCtx(), allExtensions);\r\n // Now reset the extensions to just those being managed by Basecore\r\n _self._extensions = objFreeze(sortPlugins(_coreExtensions || [])).slice();\r\n }\r\n function _getPlugin(pluginIdentifier) {\r\n var theExt = null;\r\n var thePlugin = null;\r\n arrForEach(_self._extensions, function (ext) {\r\n if (ext.identifier === pluginIdentifier && ext !== _channelControl && ext !== _telemetryInitializerPlugin) {\r\n thePlugin = ext;\r\n return -1;\r\n }\r\n });\r\n if (!thePlugin && _channelControl) {\r\n // Check the channel Controller\r\n thePlugin = _channelControl.getChannel(pluginIdentifier);\r\n }\r\n if (thePlugin) {\r\n theExt = {\r\n plugin: thePlugin,\r\n setEnabled: function (enabled) {\r\n _getPluginState(thePlugin)[strDisabled] = !enabled;\r\n },\r\n isEnabled: function () {\r\n var pluginState = _getPluginState(thePlugin);\r\n return !pluginState[strTeardown] && !pluginState[strDisabled];\r\n }\r\n };\r\n }\r\n return theExt;\r\n }\r\n function _getPluginChain() {\r\n if (!_pluginChain) {\r\n // copy the collection of extensions\r\n var extensions = (_coreExtensions || []).slice();\r\n // During add / remove this may get called again, so don't readd if already present\r\n if (extensions.indexOf(_telemetryInitializerPlugin) === -1) {\r\n extensions.push(_telemetryInitializerPlugin);\r\n }\r\n _pluginChain = createTelemetryProxyChain(sortPlugins(extensions), _self.config, _self);\r\n }\r\n return _pluginChain;\r\n }\r\n function _flushInternalLogs() {\r\n var queue = _self.logger ? _self.logger.queue : [];\r\n if (queue) {\r\n arrForEach(queue, function (logMessage) {\r\n var item = {\r\n name: _internalLogsEventName ? _internalLogsEventName : \"InternalMessageId: \" + logMessage.messageId,\r\n iKey: _self.config.instrumentationKey,\r\n time: toISOString(new Date()),\r\n baseType: _InternalLogMessage.dataType,\r\n baseData: { message: logMessage.message }\r\n };\r\n _self.track(item);\r\n });\r\n queue.length = 0;\r\n }\r\n }\r\n function _initDebugListener(config) {\r\n if (config.disableDbgExt === true && _debugListener) {\r\n // Remove any previously loaded debug listener\r\n _notificationManager[strRemoveNotificationListener](_debugListener);\r\n _debugListener = null;\r\n }\r\n if (_notificationManager && !_debugListener && config.disableDbgExt !== true) {\r\n _debugListener = getDebugListener(config);\r\n _notificationManager[strAddNotificationListener](_debugListener);\r\n }\r\n }\r\n function _initPerfManager(config) {\r\n if (!config.enablePerfMgr && _cfgPerfManager) {\r\n // Remove any existing config based performance manager\r\n _cfgPerfManager = null;\r\n }\r\n if (config.enablePerfMgr) {\r\n // Set the performance manager creation function if not defined\r\n setValue(_self.config, \"createPerfMgr\", _createPerfManager);\r\n }\r\n }\r\n });\r\n }\r\n BaseCore.prototype.initialize = function (config, extensions, logger, notificationManager) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.getTransmissionControls = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.track = function (telemetryItem) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.getProcessTelContext = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.getNotifyMgr = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n /**\r\n * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\r\n * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\r\n * called.\r\n * @param {INotificationListener} listener - An INotificationListener object.\r\n */\r\n BaseCore.prototype.addNotificationListener = function (listener) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Removes all instances of the listener.\r\n * @param {INotificationListener} listener - INotificationListener to remove.\r\n */\r\n BaseCore.prototype.removeNotificationListener = function (listener) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Get the current cookie manager for this instance\r\n */\r\n BaseCore.prototype.getCookieMgr = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n /**\r\n * Set the current cookie manager for this instance\r\n * @param cookieMgr - The manager, if set to null/undefined will cause the default to be created\r\n */\r\n BaseCore.prototype.setCookieMgr = function (cookieMgr) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.getPerfMgr = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.setPerfMgr = function (perfMgr) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.eventCnt = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return 0;\r\n };\r\n /**\r\n * Periodically check logger.queue for\r\n */\r\n BaseCore.prototype.pollInternalLogs = function (eventName) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return 0;\r\n };\r\n /**\r\n * Periodically check logger.queue for\r\n */\r\n BaseCore.prototype.stopPollingInternalLogs = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Add a telemetry processor to decorate or drop telemetry events.\r\n * @param telemetryInitializer - The Telemetry Initializer function\r\n * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed\r\n */\r\n BaseCore.prototype.addTelemetryInitializer = function (telemetryInitializer) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.getPlugin = function (pluginIdentifier) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n /**\r\n * Returns the unique event namespace that should be used\r\n */\r\n BaseCore.prototype.evtNamespace = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.releaseQueue = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n return BaseCore;\r\n}());\r\nexport { BaseCore };\r\n//# sourceMappingURL=BaseCore.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC;AACA,wFAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;oDA6FM;AACN;AACA;AACA;AACA"}
1
+ {"version":3,"file":"BaseCore.js.map","sources":["BaseCore.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\n\"use strict\";\r\nimport { __spreadArray } from \"tslib\";\r\nimport { objCreateFn } from \"@microsoft/applicationinsights-shims\";\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { createProcessTelemetryContext, createProcessTelemetryUnloadContext, createTelemetryProxyChain } from \"./ProcessTelemetryContext\";\r\nimport { initializePlugins, sortPlugins, _getPluginState } from \"./TelemetryHelpers\";\r\nimport { getGblPerfMgr, PerfManager } from \"./PerfManager\";\r\nimport { createCookieMgr } from \"./CookieMgr\";\r\nimport { arrForEach, isNullOrUndefined, toISOString, getSetValue, setValue, throwError, isNotTruthy, isFunction, objFreeze, proxyFunctionAs, proxyFunctions } from \"./HelperFuncs\";\r\nimport { strExtensionConfig, strIKey } from \"./Constants\";\r\nimport { DiagnosticLogger, _InternalLogMessage } from \"./DiagnosticLogger\";\r\nimport { getDebugListener } from \"./DbgExtensionUtils\";\r\nimport { ChannelControllerPriority, createChannelControllerPlugin, createChannelQueues } from \"./ChannelController\";\r\nimport { TelemetryInitializerPlugin } from \"./TelemetryInitializerPlugin\";\r\nimport { createUniqueNamespace } from \"./DataCacheHelper\";\r\nimport { createUnloadHandlerContainer } from \"./UnloadHandlerContainer\";\r\nimport { strAddNotificationListener, strDisabled, strEventsDiscarded, strEventsSendRequest, strEventsSent, strRemoveNotificationListener, strTeardown } from \"./InternalConstants\";\r\nvar strValidationError = \"Plugins must provide initialize method\";\r\nvar strNotificationManager = \"_notificationManager\";\r\nvar strSdkUnloadingError = \"SDK is still unloading...\";\r\nvar strSdkNotInitialized = \"SDK is not initialized\";\r\nvar strPluginUnloadFailed = \"Failed to unload plugin\";\r\n/**\r\n * Helper to create the default performance manager\r\n * @param core\r\n * @param notificationMgr\r\n */\r\nfunction _createPerfManager(core, notificationMgr) {\r\n return new PerfManager(notificationMgr);\r\n}\r\nfunction _validateExtensions(logger, channelPriority, allExtensions) {\r\n // Concat all available extensions\r\n var coreExtensions = [];\r\n // Check if any two extensions have the same priority, then warn to console\r\n // And extract the local extensions from the\r\n var extPriorities = {};\r\n // Extension validation\r\n arrForEach(allExtensions, function (ext) {\r\n if (isNullOrUndefined(ext) || isNullOrUndefined(ext.initialize)) {\r\n throwError(strValidationError);\r\n }\r\n var extPriority = ext.priority;\r\n var identifier = ext.identifier;\r\n if (ext && extPriority) {\r\n if (!isNullOrUndefined(extPriorities[extPriority])) {\r\n logger.warnToConsole(\"Two extensions have same priority #\" + extPriority + \" - \" + extPriorities[extPriority] + \", \" + identifier);\r\n }\r\n else {\r\n // set a value\r\n extPriorities[extPriority] = identifier;\r\n }\r\n }\r\n // Split extensions to core and channelController\r\n if (!extPriority || extPriority < channelPriority) {\r\n // Add to core extension that will be managed by BaseCore\r\n coreExtensions.push(ext);\r\n }\r\n });\r\n return {\r\n all: allExtensions,\r\n core: coreExtensions\r\n };\r\n}\r\nfunction _isPluginPresent(thePlugin, plugins) {\r\n var exists = false;\r\n arrForEach(plugins, function (plugin) {\r\n if (plugin === thePlugin) {\r\n exists = true;\r\n return -1;\r\n }\r\n });\r\n return exists;\r\n}\r\nfunction _createDummyNotificationManager() {\r\n var _a;\r\n return objCreateFn((_a = {},\r\n _a[strAddNotificationListener] = function (listener) { },\r\n _a[strRemoveNotificationListener] = function (listener) { },\r\n _a[strEventsSent] = function (events) { },\r\n _a[strEventsDiscarded] = function (events, reason) { },\r\n _a[strEventsSendRequest] = function (sendReason, isAsync) { },\r\n _a));\r\n}\r\nvar BaseCore = /** @class */ (function () {\r\n function BaseCore() {\r\n // NOTE!: DON'T set default values here, instead set them in the _initDefaults() function as it is also called during teardown()\r\n var _isInitialized;\r\n var _eventQueue;\r\n var _notificationManager;\r\n var _perfManager;\r\n var _cfgPerfManager;\r\n var _cookieManager;\r\n var _pluginChain;\r\n var _configExtensions;\r\n var _coreExtensions;\r\n var _channelControl;\r\n var _channelConfig;\r\n var _channelQueue;\r\n var _isUnloading;\r\n var _telemetryInitializerPlugin;\r\n var _internalLogsEventName;\r\n var _evtNamespace;\r\n var _unloadHandlers;\r\n var _debugListener;\r\n /**\r\n * Internal log poller\r\n */\r\n var _internalLogPoller = 0;\r\n dynamicProto(BaseCore, this, function (_self) {\r\n // Set the default values (also called during teardown)\r\n _initDefaults();\r\n _self.isInitialized = function () { return _isInitialized; };\r\n _self.initialize = function (config, extensions, logger, notificationManager) {\r\n if (_isUnloading) {\r\n throwError(strSdkUnloadingError);\r\n }\r\n // Make sure core is only initialized once\r\n if (_self.isInitialized()) {\r\n throwError(\"Core should not be initialized more than once\");\r\n }\r\n if (!config || isNullOrUndefined(config.instrumentationKey)) {\r\n throwError(\"Please provide instrumentation key\");\r\n }\r\n _notificationManager = notificationManager;\r\n // For backward compatibility only\r\n _self[strNotificationManager] = notificationManager;\r\n _self.config = config || {};\r\n _initDebugListener(config);\r\n _initPerfManager(config);\r\n config.extensions = isNullOrUndefined(config.extensions) ? [] : config.extensions;\r\n // add notification to the extensions in the config so other plugins can access it\r\n _initExtConfig(config);\r\n if (logger) {\r\n _self.logger = logger;\r\n }\r\n // Extension validation\r\n _configExtensions = [];\r\n _configExtensions.push.apply(_configExtensions, __spreadArray(__spreadArray([], extensions, false), config.extensions, false));\r\n _channelConfig = (config || {}).channels;\r\n _initPluginChain(config);\r\n if (_self.getTransmissionControls().length === 0) {\r\n throwError(\"No channels available\");\r\n }\r\n _isInitialized = true;\r\n _self.releaseQueue();\r\n };\r\n _self.getTransmissionControls = function () {\r\n var controls = [];\r\n arrForEach(_channelQueue, function (channels) {\r\n controls.push(channels.queue);\r\n });\r\n return objFreeze(controls);\r\n };\r\n _self.track = function (telemetryItem) {\r\n // setup default iKey if not passed in\r\n setValue(telemetryItem, strIKey, _self.config.instrumentationKey, null, isNotTruthy);\r\n // add default timestamp if not passed in\r\n setValue(telemetryItem, \"time\", toISOString(new Date()), null, isNotTruthy);\r\n // Common Schema 4.0\r\n setValue(telemetryItem, \"ver\", \"4.0\", null, isNullOrUndefined);\r\n if (!_isUnloading && _self.isInitialized()) {\r\n // Process the telemetry plugin chain\r\n _createTelCtx().processNext(telemetryItem);\r\n }\r\n else {\r\n // Queue events until all extensions are initialized\r\n _eventQueue.push(telemetryItem);\r\n }\r\n };\r\n _self.getProcessTelContext = _createTelCtx;\r\n _self.getNotifyMgr = function () {\r\n if (!_notificationManager) {\r\n // Create Dummy notification manager\r\n _notificationManager = _createDummyNotificationManager();\r\n // For backward compatibility only\r\n _self[strNotificationManager] = _notificationManager;\r\n }\r\n return _notificationManager;\r\n };\r\n /**\r\n * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\r\n * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\r\n * called.\r\n * @param {INotificationListener} listener - An INotificationListener object.\r\n */\r\n _self[strAddNotificationListener] = function (listener) {\r\n if (_notificationManager) {\r\n _notificationManager[strAddNotificationListener](listener);\r\n }\r\n };\r\n /**\r\n * Removes all instances of the listener.\r\n * @param {INotificationListener} listener - INotificationListener to remove.\r\n */\r\n _self[strRemoveNotificationListener] = function (listener) {\r\n if (_notificationManager) {\r\n _notificationManager[strRemoveNotificationListener](listener);\r\n }\r\n };\r\n _self.getCookieMgr = function () {\r\n if (!_cookieManager) {\r\n _cookieManager = createCookieMgr(_self.config, _self.logger);\r\n }\r\n return _cookieManager;\r\n };\r\n _self.setCookieMgr = function (cookieMgr) {\r\n _cookieManager = cookieMgr;\r\n };\r\n _self.getPerfMgr = function () {\r\n if (!_perfManager && !_cfgPerfManager) {\r\n if (_self.config && _self.config.enablePerfMgr && isFunction(_self.config.createPerfMgr)) {\r\n _cfgPerfManager = _self.config.createPerfMgr(_self, _self.getNotifyMgr());\r\n }\r\n }\r\n return _perfManager || _cfgPerfManager || getGblPerfMgr();\r\n };\r\n _self.setPerfMgr = function (perfMgr) {\r\n _perfManager = perfMgr;\r\n };\r\n _self.eventCnt = function () {\r\n return _eventQueue.length;\r\n };\r\n _self.releaseQueue = function () {\r\n if (_isInitialized && _eventQueue.length > 0) {\r\n var eventQueue = _eventQueue;\r\n _eventQueue = [];\r\n arrForEach(eventQueue, function (event) {\r\n _createTelCtx().processNext(event);\r\n });\r\n }\r\n };\r\n /**\r\n * Periodically check logger.queue for log messages to be flushed\r\n */\r\n _self.pollInternalLogs = function (eventName) {\r\n _internalLogsEventName = eventName;\r\n var interval = _self.config.diagnosticLogInterval;\r\n if (!interval || !(interval > 0)) {\r\n interval = 10000;\r\n }\r\n if (_internalLogPoller) {\r\n clearInterval(_internalLogPoller);\r\n }\r\n _internalLogPoller = setInterval(function () {\r\n _flushInternalLogs();\r\n }, interval);\r\n return _internalLogPoller;\r\n };\r\n /**\r\n * Stop polling log messages from logger.queue\r\n */\r\n _self.stopPollingInternalLogs = function () {\r\n if (_internalLogPoller) {\r\n clearInterval(_internalLogPoller);\r\n _internalLogPoller = 0;\r\n _flushInternalLogs();\r\n }\r\n };\r\n // Add addTelemetryInitializer\r\n proxyFunctions(_self, function () { return _telemetryInitializerPlugin; }, [\"addTelemetryInitializer\"]);\r\n _self.unload = function (isAsync, unloadComplete, cbTimeout) {\r\n if (isAsync === void 0) { isAsync = true; }\r\n if (!_isInitialized) {\r\n // The SDK is not initialized\r\n throwError(strSdkNotInitialized);\r\n }\r\n // Check if the SDK still unloading so throw\r\n if (_isUnloading) {\r\n // The SDK is already unloading\r\n throwError(strSdkUnloadingError);\r\n }\r\n var unloadState = {\r\n reason: 50 /* SdkUnload */,\r\n isAsync: isAsync,\r\n flushComplete: false\r\n };\r\n var processUnloadCtx = createProcessTelemetryUnloadContext(_getPluginChain(), _self.config, _self);\r\n processUnloadCtx.onComplete(function () {\r\n _initDefaults();\r\n unloadComplete && unloadComplete(unloadState);\r\n }, _self);\r\n function _doUnload(flushComplete) {\r\n unloadState.flushComplete = flushComplete;\r\n _isUnloading = true;\r\n // Run all of the unload handlers first (before unloading the plugins)\r\n _unloadHandlers.run(processUnloadCtx, unloadState);\r\n // Stop polling the internal logs\r\n _self.stopPollingInternalLogs();\r\n // Start unloading the components, from this point onwards the SDK should be considered to be in an unstable state\r\n processUnloadCtx.processNext(unloadState);\r\n }\r\n if (_channelControl) {\r\n _channelControl.flush(isAsync, _doUnload, 6 /* SdkUnload */, cbTimeout);\r\n }\r\n else {\r\n _doUnload(true);\r\n }\r\n };\r\n _self.getPlugin = _getPlugin;\r\n _self.addPlugin = function (plugin, replaceExisting, isAsync, addCb) {\r\n if (isAsync === void 0) { isAsync = true; }\r\n if (!plugin) {\r\n addCb && addCb(false);\r\n _logOrThrowError(strValidationError);\r\n return;\r\n }\r\n var existingPlugin = _getPlugin(plugin.identifier);\r\n if (existingPlugin && !replaceExisting) {\r\n addCb && addCb(false);\r\n _logOrThrowError(\"Plugin [\" + plugin.identifier + \"] is already loaded!\");\r\n return;\r\n }\r\n function _addPlugin(removed) {\r\n _configExtensions.push(plugin);\r\n // Re-Initialize the plugin chain\r\n _initPluginChain(_self.config);\r\n addCb && addCb(true);\r\n }\r\n if (existingPlugin) {\r\n var removedPlugins = [existingPlugin.plugin];\r\n var unloadState = {\r\n reason: 2 /* PluginReplace */,\r\n isAsync: isAsync\r\n };\r\n _removePlugins(removedPlugins, unloadState, function (removed) {\r\n if (!removed) {\r\n // Previous plugin was successfully removed or was not installed\r\n addCb && addCb(false);\r\n }\r\n else {\r\n _addPlugin(true);\r\n }\r\n });\r\n }\r\n else {\r\n _addPlugin(false);\r\n }\r\n };\r\n _self.evtNamespace = function () {\r\n return _evtNamespace;\r\n };\r\n // Create the addUnloadCb\r\n proxyFunctionAs(_self, \"addUnloadCb\", function () { return _unloadHandlers; }, \"add\");\r\n function _initDefaults() {\r\n _isInitialized = false;\r\n // Use a default logger so initialization errors are not dropped on the floor with full logging\r\n _self.logger = new DiagnosticLogger({ loggingLevelConsole: 1 /* CRITICAL */ });\r\n _self.config = null;\r\n _self._extensions = [];\r\n _telemetryInitializerPlugin = new TelemetryInitializerPlugin();\r\n _eventQueue = [];\r\n _notificationManager = null;\r\n _perfManager = null;\r\n _cfgPerfManager = null;\r\n _cookieManager = null;\r\n _pluginChain = null;\r\n _coreExtensions = null;\r\n _configExtensions = null;\r\n _channelControl = null;\r\n _channelConfig = null;\r\n _channelQueue = null;\r\n _isUnloading = false;\r\n _internalLogsEventName = null;\r\n _evtNamespace = createUniqueNamespace(\"AIBaseCore\", true);\r\n _unloadHandlers = createUnloadHandlerContainer();\r\n }\r\n function _createTelCtx() {\r\n return createProcessTelemetryContext(_getPluginChain(), _self.config, _self);\r\n }\r\n // Initialize or Re-initialize the plugins\r\n function _initPluginChain(config) {\r\n // Extension validation\r\n var theExtensions = _validateExtensions(_self.logger, ChannelControllerPriority, _configExtensions);\r\n _coreExtensions = theExtensions.core;\r\n _pluginChain = null;\r\n // Sort the complete set of extensions by priority\r\n var allExtensions = theExtensions.all;\r\n // Initialize the Channel Queues and the channel plugins first\r\n _channelQueue = objFreeze(createChannelQueues(_channelConfig, allExtensions, config, _self));\r\n if (_channelControl) {\r\n // During add / remove of a plugin this may get called again, so don't re-add if already present\r\n // But we also want the controller as the last, so remove if already present\r\n // And reusing the existing instance, just in case an installed plugin has a reference and\r\n // is using it.\r\n var idx = allExtensions.indexOf(_channelControl);\r\n if (idx !== -1) {\r\n allExtensions.splice(idx, 1);\r\n }\r\n idx = _coreExtensions.indexOf(_channelControl);\r\n if (idx !== -1) {\r\n _coreExtensions.splice(idx, 1);\r\n }\r\n _channelControl._setQueue(_channelQueue);\r\n }\r\n else {\r\n _channelControl = createChannelControllerPlugin(_channelQueue, _self);\r\n }\r\n // Add on \"channelController\" as the last \"plugin\"\r\n allExtensions.push(_channelControl);\r\n _coreExtensions.push(_channelControl);\r\n // Required to allow plugins to call core.getPlugin() during their own initialization\r\n _self._extensions = sortPlugins(allExtensions);\r\n // Initialize the controls\r\n _channelControl.initialize(config, _self, allExtensions);\r\n initializePlugins(_createTelCtx(), allExtensions);\r\n // Now reset the extensions to just those being managed by Basecore\r\n _self._extensions = objFreeze(sortPlugins(_coreExtensions || [])).slice();\r\n }\r\n function _getPlugin(pluginIdentifier) {\r\n var theExt = null;\r\n var thePlugin = null;\r\n arrForEach(_self._extensions, function (ext) {\r\n if (ext.identifier === pluginIdentifier && ext !== _channelControl && ext !== _telemetryInitializerPlugin) {\r\n thePlugin = ext;\r\n return -1;\r\n }\r\n });\r\n if (!thePlugin && _channelControl) {\r\n // Check the channel Controller\r\n thePlugin = _channelControl.getChannel(pluginIdentifier);\r\n }\r\n if (thePlugin) {\r\n theExt = {\r\n plugin: thePlugin,\r\n setEnabled: function (enabled) {\r\n _getPluginState(thePlugin)[strDisabled] = !enabled;\r\n },\r\n isEnabled: function () {\r\n var pluginState = _getPluginState(thePlugin);\r\n return !pluginState[strTeardown] && !pluginState[strDisabled];\r\n },\r\n remove: function (isAsync, removeCb) {\r\n if (isAsync === void 0) { isAsync = true; }\r\n var pluginsToRemove = [thePlugin];\r\n var unloadState = {\r\n reason: 1 /* PluginUnload */,\r\n isAsync: isAsync\r\n };\r\n _removePlugins(pluginsToRemove, unloadState, function (removed) {\r\n if (removed) {\r\n // Re-Initialize the plugin chain\r\n _initPluginChain(_self.config);\r\n }\r\n removeCb && removeCb(removed);\r\n });\r\n }\r\n };\r\n }\r\n return theExt;\r\n }\r\n function _getPluginChain() {\r\n if (!_pluginChain) {\r\n // copy the collection of extensions\r\n var extensions = (_coreExtensions || []).slice();\r\n // During add / remove this may get called again, so don't readd if already present\r\n if (extensions.indexOf(_telemetryInitializerPlugin) === -1) {\r\n extensions.push(_telemetryInitializerPlugin);\r\n }\r\n _pluginChain = createTelemetryProxyChain(sortPlugins(extensions), _self.config, _self);\r\n }\r\n return _pluginChain;\r\n }\r\n function _removePlugins(thePlugins, unloadState, removeComplete) {\r\n if (thePlugins && thePlugins.length > 0) {\r\n var unloadChain = createTelemetryProxyChain(thePlugins, _self.config, _self);\r\n var unloadCtx = createProcessTelemetryUnloadContext(unloadChain, _self.config, _self);\r\n unloadCtx.onComplete(function () {\r\n var removed = false;\r\n // Remove the listed config extensions\r\n var newConfigExtensions = [];\r\n arrForEach(_configExtensions, function (plugin, idx) {\r\n if (!_isPluginPresent(plugin, thePlugins)) {\r\n newConfigExtensions.push(plugin);\r\n }\r\n else {\r\n removed = true;\r\n }\r\n });\r\n _configExtensions = newConfigExtensions;\r\n // Re-Create the channel config\r\n var newChannelConfig = [];\r\n if (_channelConfig) {\r\n arrForEach(_channelConfig, function (queue, idx) {\r\n var newQueue = [];\r\n arrForEach(queue, function (channel) {\r\n if (!_isPluginPresent(channel, thePlugins)) {\r\n newQueue.push(channel);\r\n }\r\n else {\r\n removed = true;\r\n }\r\n });\r\n newChannelConfig.push(newQueue);\r\n });\r\n _channelConfig = newChannelConfig;\r\n }\r\n removeComplete && removeComplete(removed);\r\n });\r\n unloadCtx.processNext(unloadState);\r\n }\r\n else {\r\n removeComplete(false);\r\n }\r\n }\r\n function _flushInternalLogs() {\r\n var queue = _self.logger ? _self.logger.queue : [];\r\n if (queue) {\r\n arrForEach(queue, function (logMessage) {\r\n var item = {\r\n name: _internalLogsEventName ? _internalLogsEventName : \"InternalMessageId: \" + logMessage.messageId,\r\n iKey: _self.config.instrumentationKey,\r\n time: toISOString(new Date()),\r\n baseType: _InternalLogMessage.dataType,\r\n baseData: { message: logMessage.message }\r\n };\r\n _self.track(item);\r\n });\r\n queue.length = 0;\r\n }\r\n }\r\n function _initDebugListener(config) {\r\n if (config.disableDbgExt === true && _debugListener) {\r\n // Remove any previously loaded debug listener\r\n _notificationManager[strRemoveNotificationListener](_debugListener);\r\n _debugListener = null;\r\n }\r\n if (_notificationManager && !_debugListener && config.disableDbgExt !== true) {\r\n _debugListener = getDebugListener(config);\r\n _notificationManager[strAddNotificationListener](_debugListener);\r\n }\r\n }\r\n function _initPerfManager(config) {\r\n if (!config.enablePerfMgr && _cfgPerfManager) {\r\n // Remove any existing config based performance manager\r\n _cfgPerfManager = null;\r\n }\r\n if (config.enablePerfMgr) {\r\n // Set the performance manager creation function if not defined\r\n setValue(_self.config, \"createPerfMgr\", _createPerfManager);\r\n }\r\n }\r\n function _initExtConfig(config) {\r\n var extConfig = getSetValue(config, strExtensionConfig);\r\n extConfig.NotificationManager = _notificationManager;\r\n }\r\n function _logOrThrowError(message) {\r\n var logger = _self.logger;\r\n if (logger) {\r\n // there should always be a logger\r\n logger.throwInternal(2 /* WARNING */, 73 /* PluginException */, message);\r\n }\r\n else {\r\n throwError(message);\r\n }\r\n }\r\n });\r\n }\r\n BaseCore.prototype.initialize = function (config, extensions, logger, notificationManager) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.getTransmissionControls = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.track = function (telemetryItem) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.getProcessTelContext = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.getNotifyMgr = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n /**\r\n * Adds a notification listener. The SDK calls methods on the listener when an appropriate notification is raised.\r\n * The added plugins must raise notifications. If the plugins do not implement the notifications, then no methods will be\r\n * called.\r\n * @param {INotificationListener} listener - An INotificationListener object.\r\n */\r\n BaseCore.prototype.addNotificationListener = function (listener) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Removes all instances of the listener.\r\n * @param {INotificationListener} listener - INotificationListener to remove.\r\n */\r\n BaseCore.prototype.removeNotificationListener = function (listener) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Get the current cookie manager for this instance\r\n */\r\n BaseCore.prototype.getCookieMgr = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n /**\r\n * Set the current cookie manager for this instance\r\n * @param cookieMgr - The manager, if set to null/undefined will cause the default to be created\r\n */\r\n BaseCore.prototype.setCookieMgr = function (cookieMgr) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.getPerfMgr = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.setPerfMgr = function (perfMgr) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.eventCnt = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return 0;\r\n };\r\n /**\r\n * Periodically check logger.queue for\r\n */\r\n BaseCore.prototype.pollInternalLogs = function (eventName) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return 0;\r\n };\r\n /**\r\n * Periodically check logger.queue for\r\n */\r\n BaseCore.prototype.stopPollingInternalLogs = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Add a telemetry processor to decorate or drop telemetry events.\r\n * @param telemetryInitializer - The Telemetry Initializer function\r\n * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed\r\n */\r\n BaseCore.prototype.addTelemetryInitializer = function (telemetryInitializer) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Unload and Tear down the SDK and any initialized plugins, after calling this the SDK will be considered\r\n * to be un-initialized and non-operational, re-initializing the SDK should only be attempted if the previous\r\n * unload call return `true` stating that all plugins reported that they also unloaded, the recommended\r\n * approach is to create a new instance and initialize that instance.\r\n * This is due to possible unexpected side effects caused by plugins not supporting unload / teardown, unable\r\n * to successfully remove any global references or they may just be completing the unload process asynchronously.\r\n */\r\n BaseCore.prototype.unload = function (isAsync, unloadComplete) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.getPlugin = function (pluginIdentifier) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n BaseCore.prototype.addPlugin = function (plugin, replaceExisting, doAsync, addCb) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Returns the unique event namespace that should be used\r\n */\r\n BaseCore.prototype.evtNamespace = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n /**\r\n * Add an unload handler that will be called when the SDK is being unloaded\r\n * @param handler - the handler\r\n */\r\n BaseCore.prototype.addUnloadCb = function (handler) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n BaseCore.prototype.releaseQueue = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n return BaseCore;\r\n}());\r\nexport { BaseCore };\r\n//# sourceMappingURL=BaseCore.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC;AACA,wFAAsC;AACtC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;;;;;;;;;oDAmHM;AACN;AACA;AACA;AACA"}