@microsoft/applicationinsights-core-js 2.8.0-nightly.2202-06 → 2.8.0-nightly.2204-06

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 (167) hide show
  1. package/browser/applicationinsights-core-js.integrity.json +9 -9
  2. package/browser/applicationinsights-core-js.js +2440 -1199
  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 +16710 -8876
  7. package/dist/applicationinsights-core-js.api.md +465 -140
  8. package/dist/applicationinsights-core-js.d.ts +856 -217
  9. package/dist/applicationinsights-core-js.js +2440 -1199
  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 +856 -217
  14. package/dist-esm/JavaScriptSDK/AppInsightsCore.js +4 -72
  15. package/dist-esm/JavaScriptSDK/AppInsightsCore.js.map +1 -1
  16. package/dist-esm/JavaScriptSDK/BaseCore.js +496 -99
  17. package/dist-esm/JavaScriptSDK/BaseCore.js.map +1 -1
  18. package/dist-esm/JavaScriptSDK/BaseTelemetryPlugin.js +120 -21
  19. package/dist-esm/JavaScriptSDK/BaseTelemetryPlugin.js.map +1 -1
  20. package/dist-esm/JavaScriptSDK/ChannelController.js +202 -87
  21. package/dist-esm/JavaScriptSDK/ChannelController.js.map +1 -1
  22. package/dist-esm/JavaScriptSDK/Constants.js +1 -1
  23. package/dist-esm/JavaScriptSDK/CookieMgr.js +4 -4
  24. package/dist-esm/JavaScriptSDK/CookieMgr.js.map +1 -1
  25. package/dist-esm/JavaScriptSDK/CoreUtils.js +7 -148
  26. package/dist-esm/JavaScriptSDK/CoreUtils.js.map +1 -1
  27. package/dist-esm/JavaScriptSDK/DataCacheHelper.js +93 -0
  28. package/dist-esm/JavaScriptSDK/DataCacheHelper.js.map +1 -0
  29. package/dist-esm/JavaScriptSDK/DbgExtensionUtils.js +1 -1
  30. package/dist-esm/JavaScriptSDK/DiagnosticLogger.js +45 -12
  31. package/dist-esm/JavaScriptSDK/DiagnosticLogger.js.map +1 -1
  32. package/dist-esm/JavaScriptSDK/EnvUtils.js +13 -12
  33. package/dist-esm/JavaScriptSDK/EnvUtils.js.map +1 -1
  34. package/dist-esm/JavaScriptSDK/EventHelpers.js +477 -0
  35. package/dist-esm/JavaScriptSDK/EventHelpers.js.map +1 -0
  36. package/dist-esm/JavaScriptSDK/HelperFuncs.js +80 -86
  37. package/dist-esm/JavaScriptSDK/HelperFuncs.js.map +1 -1
  38. package/dist-esm/JavaScriptSDK/InstrumentHooks.js +3 -1
  39. package/dist-esm/JavaScriptSDK/InstrumentHooks.js.map +1 -1
  40. package/dist-esm/JavaScriptSDK/InternalConstants.js +28 -0
  41. package/dist-esm/JavaScriptSDK/InternalConstants.js.map +1 -0
  42. package/dist-esm/JavaScriptSDK/NotificationManager.js +37 -42
  43. package/dist-esm/JavaScriptSDK/NotificationManager.js.map +1 -1
  44. package/dist-esm/JavaScriptSDK/PerfManager.js +1 -1
  45. package/dist-esm/JavaScriptSDK/ProcessTelemetryContext.js +430 -119
  46. package/dist-esm/JavaScriptSDK/ProcessTelemetryContext.js.map +1 -1
  47. package/dist-esm/JavaScriptSDK/RandomHelper.js +30 -4
  48. package/dist-esm/JavaScriptSDK/RandomHelper.js.map +1 -1
  49. package/dist-esm/JavaScriptSDK/TelemetryHelpers.js +60 -14
  50. package/dist-esm/JavaScriptSDK/TelemetryHelpers.js.map +1 -1
  51. package/dist-esm/JavaScriptSDK/TelemetryInitializerPlugin.js +81 -0
  52. package/dist-esm/JavaScriptSDK/TelemetryInitializerPlugin.js.map +1 -0
  53. package/dist-esm/JavaScriptSDK/UnloadHandlerContainer.js +33 -0
  54. package/dist-esm/JavaScriptSDK/UnloadHandlerContainer.js.map +1 -0
  55. package/dist-esm/JavaScriptSDK.Enums/EnumHelperFuncs.js +51 -0
  56. package/dist-esm/JavaScriptSDK.Enums/EnumHelperFuncs.js.map +1 -0
  57. package/dist-esm/JavaScriptSDK.Enums/EventsDiscardedReason.js +10 -9
  58. package/dist-esm/JavaScriptSDK.Enums/EventsDiscardedReason.js.map +1 -1
  59. package/dist-esm/JavaScriptSDK.Enums/LoggingEnums.js +90 -96
  60. package/dist-esm/JavaScriptSDK.Enums/LoggingEnums.js.map +1 -1
  61. package/dist-esm/JavaScriptSDK.Enums/SendRequestReason.js +1 -1
  62. package/dist-esm/JavaScriptSDK.Enums/TelemetryUnloadReason.js +8 -0
  63. package/dist-esm/JavaScriptSDK.Enums/TelemetryUnloadReason.js.map +1 -0
  64. package/dist-esm/JavaScriptSDK.Enums/TelemetryUpdateReason.js +8 -0
  65. package/dist-esm/JavaScriptSDK.Enums/TelemetryUpdateReason.js.map +1 -0
  66. package/dist-esm/JavaScriptSDK.Interfaces/IAppInsightsCore.js +1 -2
  67. package/dist-esm/JavaScriptSDK.Interfaces/IAppInsightsCore.js.map +1 -1
  68. package/dist-esm/JavaScriptSDK.Interfaces/IChannelControls.js +1 -1
  69. package/dist-esm/JavaScriptSDK.Interfaces/IConfiguration.js +1 -1
  70. package/dist-esm/JavaScriptSDK.Interfaces/ICookieMgr.js +1 -1
  71. package/dist-esm/JavaScriptSDK.Interfaces/IDbgExtension.js +1 -1
  72. package/dist-esm/JavaScriptSDK.Interfaces/IDiagnosticLogger.js +1 -1
  73. package/dist-esm/JavaScriptSDK.Interfaces/IInstrumentHooks.js +1 -1
  74. package/dist-esm/JavaScriptSDK.Interfaces/INotificationListener.js +1 -1
  75. package/dist-esm/JavaScriptSDK.Interfaces/INotificationManager.js +1 -1
  76. package/dist-esm/JavaScriptSDK.Interfaces/IPerfEvent.js +1 -1
  77. package/dist-esm/JavaScriptSDK.Interfaces/IPerfManager.js +1 -1
  78. package/dist-esm/JavaScriptSDK.Interfaces/IProcessTelemetryContext.js +1 -1
  79. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryInitializers.js +6 -0
  80. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryInitializers.js.map +1 -0
  81. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryItem.js +1 -1
  82. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryPlugin.js +1 -1
  83. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryPluginChain.js +1 -2
  84. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryPluginChain.js.map +1 -1
  85. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryUnloadState.js +8 -0
  86. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryUnloadState.js.map +1 -0
  87. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryUpdateState.js +8 -0
  88. package/dist-esm/JavaScriptSDK.Interfaces/ITelemetryUpdateState.js.map +1 -0
  89. package/dist-esm/JavaScriptSDK.Interfaces/IUnloadableComponent.js +6 -0
  90. package/dist-esm/JavaScriptSDK.Interfaces/IUnloadableComponent.js.map +1 -0
  91. package/dist-esm/applicationinsights-core-js.js +13 -7
  92. package/dist-esm/applicationinsights-core-js.js.map +1 -1
  93. package/package.json +2 -2
  94. package/src/JavaScriptSDK/AppInsightsCore.ts +4 -105
  95. package/src/JavaScriptSDK/BaseCore.ts +696 -120
  96. package/src/JavaScriptSDK/BaseTelemetryPlugin.ts +205 -31
  97. package/src/JavaScriptSDK/ChannelController.ts +242 -103
  98. package/src/JavaScriptSDK/CookieMgr.ts +7 -5
  99. package/src/JavaScriptSDK/CoreUtils.ts +8 -172
  100. package/src/JavaScriptSDK/DataCacheHelper.ts +106 -0
  101. package/src/JavaScriptSDK/DiagnosticLogger.ts +49 -12
  102. package/src/JavaScriptSDK/EnvUtils.ts +13 -12
  103. package/src/JavaScriptSDK/EventHelpers.ts +550 -0
  104. package/src/JavaScriptSDK/HelperFuncs.ts +114 -97
  105. package/src/JavaScriptSDK/InstrumentHooks.ts +4 -2
  106. package/src/JavaScriptSDK/InternalConstants.ts +26 -0
  107. package/src/JavaScriptSDK/NotificationManager.ts +34 -37
  108. package/src/JavaScriptSDK/PerfManager.ts +4 -7
  109. package/src/JavaScriptSDK/ProcessTelemetryContext.ts +543 -134
  110. package/src/JavaScriptSDK/RandomHelper.ts +35 -3
  111. package/src/JavaScriptSDK/TelemetryHelpers.ts +83 -21
  112. package/src/JavaScriptSDK/TelemetryInitializerPlugin.ts +111 -0
  113. package/src/JavaScriptSDK/UnloadHandlerContainer.ts +46 -0
  114. package/src/JavaScriptSDK.Enums/EnumHelperFuncs.ts +56 -0
  115. package/src/JavaScriptSDK.Enums/EventsDiscardedReason.ts +48 -8
  116. package/src/JavaScriptSDK.Enums/LoggingEnums.ts +183 -87
  117. package/src/JavaScriptSDK.Enums/SendRequestReason.ts +5 -0
  118. package/src/JavaScriptSDK.Enums/TelemetryUnloadReason.ts +27 -0
  119. package/src/JavaScriptSDK.Enums/TelemetryUpdateReason.ts +27 -0
  120. package/src/JavaScriptSDK.Interfaces/IAppInsightsCore.ts +82 -2
  121. package/src/JavaScriptSDK.Interfaces/IChannelControls.ts +16 -5
  122. package/src/JavaScriptSDK.Interfaces/IInstrumentHooks.ts +16 -6
  123. package/src/JavaScriptSDK.Interfaces/IProcessTelemetryContext.ts +94 -14
  124. package/src/JavaScriptSDK.Interfaces/ITelemetryInitializers.ts +16 -0
  125. package/src/JavaScriptSDK.Interfaces/ITelemetryPlugin.ts +28 -10
  126. package/src/JavaScriptSDK.Interfaces/ITelemetryPluginChain.ts +9 -11
  127. package/src/JavaScriptSDK.Interfaces/ITelemetryUnloadState.ts +10 -0
  128. package/src/JavaScriptSDK.Interfaces/ITelemetryUpdateState.ts +34 -0
  129. package/src/JavaScriptSDK.Interfaces/IUnloadableComponent.ts +17 -0
  130. package/types/JavaScriptSDK/AppInsightsCore.d.ts +0 -21
  131. package/types/JavaScriptSDK/BaseCore.d.ts +81 -3
  132. package/types/JavaScriptSDK/BaseTelemetryPlugin.d.ts +53 -10
  133. package/types/JavaScriptSDK/ChannelController.d.ts +16 -17
  134. package/types/JavaScriptSDK/CoreUtils.d.ts +1 -48
  135. package/types/JavaScriptSDK/DataCacheHelper.d.ts +13 -0
  136. package/types/JavaScriptSDK/DiagnosticLogger.d.ts +23 -0
  137. package/types/JavaScriptSDK/EventHelpers.d.ts +154 -0
  138. package/types/JavaScriptSDK/HelperFuncs.d.ts +37 -32
  139. package/types/JavaScriptSDK/InternalConstants.d.ts +20 -0
  140. package/types/JavaScriptSDK/PerfManager.d.ts +1 -1
  141. package/types/JavaScriptSDK/ProcessTelemetryContext.d.ts +69 -6
  142. package/types/JavaScriptSDK/RandomHelper.d.ts +6 -0
  143. package/types/JavaScriptSDK/TelemetryHelpers.d.ts +23 -3
  144. package/types/JavaScriptSDK/TelemetryInitializerPlugin.d.ts +16 -0
  145. package/types/JavaScriptSDK/UnloadHandlerContainer.d.ts +11 -0
  146. package/types/JavaScriptSDK.Enums/EnumHelperFuncs.d.ts +34 -0
  147. package/types/JavaScriptSDK.Enums/EventsDiscardedReason.d.ts +14 -9
  148. package/types/JavaScriptSDK.Enums/LoggingEnums.d.ts +89 -86
  149. package/types/JavaScriptSDK.Enums/SendRequestReason.d.ts +4 -0
  150. package/types/JavaScriptSDK.Enums/TelemetryUnloadReason.d.ts +21 -0
  151. package/types/JavaScriptSDK.Enums/TelemetryUpdateReason.d.ts +20 -0
  152. package/types/JavaScriptSDK.Interfaces/IAppInsightsCore.d.ts +72 -1
  153. package/types/JavaScriptSDK.Interfaces/IChannelControls.d.ts +16 -5
  154. package/types/JavaScriptSDK.Interfaces/IInstrumentHooks.d.ts +9 -0
  155. package/types/JavaScriptSDK.Interfaces/IProcessTelemetryContext.d.ts +82 -11
  156. package/types/JavaScriptSDK.Interfaces/ITelemetryInitializers.d.ts +13 -0
  157. package/types/JavaScriptSDK.Interfaces/ITelemetryPlugin.d.ts +25 -8
  158. package/types/JavaScriptSDK.Interfaces/ITelemetryPluginChain.d.ts +9 -10
  159. package/types/JavaScriptSDK.Interfaces/ITelemetryUnloadState.d.ts +6 -0
  160. package/types/JavaScriptSDK.Interfaces/ITelemetryUpdateState.d.ts +22 -0
  161. package/types/JavaScriptSDK.Interfaces/IUnloadableComponent.d.ts +13 -0
  162. package/types/applicationinsights-core-js.d.ts +20 -10
  163. package/types/tsdoc-metadata.json +1 -1
  164. package/dist-esm/JavaScriptSDK/TelemetryPluginChain.js +0 -76
  165. package/dist-esm/JavaScriptSDK/TelemetryPluginChain.js.map +0 -1
  166. package/src/JavaScriptSDK/TelemetryPluginChain.ts +0 -120
  167. package/types/JavaScriptSDK/TelemetryPluginChain.d.ts +0 -32
@@ -2,6 +2,7 @@
2
2
  // Licensed under the MIT License.
3
3
  import { getCrypto, getMsCrypto, isIE } from "./EnvUtils";
4
4
  import { dateNow } from "./HelperFuncs";
5
+ import { strEmpty } from "./InternalConstants";
5
6
 
6
7
  const UInt32Mask = 0x100000000;
7
8
  const MaxUInt32 = 0xffffffff;
@@ -52,12 +53,14 @@ export function randomValue(maxValue: number) {
52
53
  * @param signed - True to return a signed 32-bit number (-0x80000000..0x7FFFFFFF) otherwise an unsigned one (0x000000..0xFFFFFFFF)
53
54
  */
54
55
  export function random32(signed?: boolean) {
55
- let value;
56
+ let value = 0;
56
57
  let c = getCrypto() || getMsCrypto();
57
58
  if (c && c.getRandomValues) {
58
59
  // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF)
59
60
  value = c.getRandomValues(new Uint32Array(1))[0] & MaxUInt32;
60
- } else if (isIE()) {
61
+ }
62
+
63
+ if (value === 0 && isIE()) {
61
64
  // For IE 6, 7, 8 (especially on XP) Math.random is not very random
62
65
  if (!_mwcSeeded) {
63
66
  // Set the seed for the Mwc algorithm
@@ -67,7 +70,9 @@ export function random32(signed?: boolean) {
67
70
  // Don't use Math.random for IE
68
71
  // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF)
69
72
  value = mwcRandom32() & MaxUInt32;
70
- } else {
73
+ }
74
+
75
+ if (value === 0) {
71
76
  // Make sure the number is converted into the specified range (-0x80000000..0x7FFFFFFF)
72
77
  value = Math.floor((UInt32Mask * Math.random()) | 0);
73
78
  }
@@ -112,3 +117,30 @@ export function mwcRandom32(signed?: boolean) {
112
117
  return value;
113
118
  }
114
119
 
120
+ /**
121
+ * Generate random base64 id string.
122
+ * The default length is 22 which is 132-bits so almost the same as a GUID but as base64 (the previous default was 5)
123
+ * @param maxLength - Optional value to specify the length of the id to be generated, defaults to 22
124
+ */
125
+ export function newId(maxLength = 22): string {
126
+ const base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
127
+
128
+ // Start with an initial random number, consuming the value in reverse byte order
129
+ let number = random32() >>> 0; // Make sure it's a +ve number
130
+ let chars = 0;
131
+ let result = strEmpty;
132
+ while (result.length < maxLength) {
133
+ chars ++;
134
+ result += base64chars.charAt(number & 0x3F);
135
+ number >>>= 6; // Zero fill with right shift
136
+ if (chars === 5) {
137
+ // 5 base64 characters === 30 bits so we don't have enough bits for another base64 char
138
+ // So add on another 30 bits and make sure it's +ve
139
+ number = (((random32() << 2) & 0xFFFFFFFF) | (number & 0x03)) >>> 0;
140
+ chars = 0; // We need to reset the number every 5 chars (30 bits)
141
+ }
142
+ }
143
+
144
+ return result;
145
+ }
146
+
@@ -3,16 +3,28 @@
3
3
  "use strict";
4
4
 
5
5
  import { IPlugin, ITelemetryPlugin } from "../JavaScriptSDK.Interfaces/ITelemetryPlugin";
6
- import { _InternalLogMessage } from "./DiagnosticLogger";
7
- import { _InternalMessageId } from "../JavaScriptSDK.Enums/LoggingEnums";
8
- import { ProcessTelemetryContext } from "./ProcessTelemetryContext";
6
+ import { IProcessTelemetryContext, IProcessTelemetryUnloadContext } from "../JavaScriptSDK.Interfaces/IProcessTelemetryContext";
9
7
  import { ITelemetryPluginChain } from "../JavaScriptSDK.Interfaces/ITelemetryPluginChain";
10
8
  import { arrForEach, isFunction } from "./HelperFuncs";
9
+ import { strCore, strDoTeardown, strIsInitialized, strPriority, strProcessTelemetry, strSetNextPlugin, strTeardown } from "./InternalConstants";
10
+ import { createElmNodeData } from "./DataCacheHelper";
11
+ import { IAppInsightsCore } from "../JavaScriptSDK.Interfaces/IAppInsightsCore";
12
+ import { IUnloadableComponent } from "../JavaScriptSDK.Interfaces/IUnloadableComponent";
13
+ import { ITelemetryUnloadState } from "../JavaScriptSDK.Interfaces/ITelemetryUnloadState";
11
14
 
12
- let processTelemetry = "processTelemetry";
13
- let priority = "priority";
14
- let setNextPlugin = "setNextPlugin";
15
- let isInitialized = "isInitialized";
15
+ const strDoUnload = "_doUnload";
16
+ export interface IPluginState {
17
+ core?: IAppInsightsCore;
18
+ isInitialized?: boolean;
19
+ tearDown?: boolean;
20
+ disabled?: boolean;
21
+ }
22
+
23
+ const pluginStateData = createElmNodeData("plugin");
24
+
25
+ export function _getPluginState(plugin: IPlugin): IPluginState {
26
+ return pluginStateData.get<IPluginState>(plugin, "state", {}, true)
27
+ }
16
28
 
17
29
  /**
18
30
  * Initialize the queue of plugins
@@ -21,23 +33,32 @@ let isInitialized = "isInitialized";
21
33
  * @param core THe current core instance
22
34
  * @param extensions The extensions
23
35
  */
24
- export function initializePlugins(processContext:ProcessTelemetryContext, extensions: IPlugin[]) {
36
+ export function initializePlugins(processContext: IProcessTelemetryContext, extensions: IPlugin[]) {
25
37
 
26
38
  // Set the next plugin and identified the uninitialized plugins
27
- let initPlugins:ITelemetryPlugin[] = [];
28
- let lastPlugin:ITelemetryPlugin = null;
29
- let proxy:ITelemetryPluginChain = processContext.getNext();
39
+ let initPlugins: ITelemetryPlugin[] = [];
40
+ let lastPlugin: ITelemetryPlugin = null;
41
+ let proxy: ITelemetryPluginChain = processContext.getNext();
42
+ let pluginState: IPluginState;
30
43
  while (proxy) {
31
44
  let thePlugin = proxy.getPlugin();
32
45
  if (thePlugin) {
33
46
  if (lastPlugin &&
34
- isFunction(lastPlugin[setNextPlugin]) &&
35
- isFunction(thePlugin[processTelemetry])) {
47
+ isFunction(lastPlugin[strSetNextPlugin]) &&
48
+ isFunction(thePlugin[strProcessTelemetry])) {
36
49
  // Set this plugin as the next for the previous one
37
- lastPlugin[setNextPlugin](thePlugin);
50
+ lastPlugin[strSetNextPlugin](thePlugin);
51
+ }
52
+
53
+ let isInitialized = false;
54
+ if (isFunction(thePlugin[strIsInitialized])) {
55
+ isInitialized = thePlugin[strIsInitialized]();
56
+ } else {
57
+ pluginState = _getPluginState(thePlugin);
58
+ isInitialized = pluginState[strIsInitialized];
38
59
  }
39
60
 
40
- if (!isFunction(thePlugin[isInitialized]) || !thePlugin[isInitialized]()) {
61
+ if (!isInitialized) {
41
62
  initPlugins.push(thePlugin);
42
63
  }
43
64
 
@@ -46,23 +67,35 @@ export function initializePlugins(processContext:ProcessTelemetryContext, extens
46
67
  }
47
68
  }
48
69
 
49
- // Now initiatilize the plugins
70
+ // Now initialize the plugins
50
71
  arrForEach(initPlugins, thePlugin => {
72
+ let core = processContext.core();
73
+
51
74
  thePlugin.initialize(
52
75
  processContext.getCfg(),
53
- processContext.core(),
76
+ core,
54
77
  extensions,
55
78
  processContext.getNext());
79
+
80
+ pluginState = _getPluginState(thePlugin);
81
+
82
+ // Only add the core to the state if the plugin didn't set it (doesn't extent from BaseTelemetryPlugin)
83
+ if (!thePlugin[strCore] && !pluginState[strCore]) {
84
+ pluginState[strCore] = core;
85
+ }
86
+
87
+ pluginState[strIsInitialized] = true;
88
+ delete pluginState[strTeardown];
56
89
  });
57
90
  }
58
91
 
59
- export function sortPlugins(plugins:IPlugin[]) {
92
+ export function sortPlugins<T = IPlugin>(plugins:T[]) {
60
93
  // Sort by priority
61
94
  return plugins.sort((extA, extB) => {
62
95
  let result = 0;
63
- let bHasProcess = isFunction(extB[processTelemetry]);
64
- if (isFunction(extA[processTelemetry])) {
65
- result = bHasProcess ? extA[priority] - extB[priority] : 1;
96
+ let bHasProcess = isFunction(extB[strProcessTelemetry]);
97
+ if (isFunction(extA[strProcessTelemetry])) {
98
+ result = bHasProcess ? extA[strPriority] - extB[strPriority] : 1;
66
99
  } else if (bHasProcess) {
67
100
  result = -1;
68
101
  }
@@ -70,4 +103,33 @@ export function sortPlugins(plugins:IPlugin[]) {
70
103
  return result;
71
104
  });
72
105
  // sort complete
106
+ }
107
+
108
+ /**
109
+ * Teardown / Unload helper to perform teardown/unloading operations for the provided components synchronously or asynchronously, this will call any
110
+ * _doTeardown() or _doUnload() functions on the provided components to allow them to finish removal.
111
+ * @param components - The components you want to unload
112
+ * @param unloadCtx - This is the context that should be used during unloading.
113
+ * @param unloadState - The details / state of the unload process, it holds details like whether it should be unloaded synchronously or asynchronously and the reason for the unload.
114
+ * @param asyncCallback - An optional callback that the plugin must call if it returns true to inform the caller that it has completed any async unload/teardown operations.
115
+ * @returns boolean - true if the plugin has or will call asyncCallback, this allows the plugin to perform any asynchronous operations.
116
+ */
117
+ export function unloadComponents(components: any | IUnloadableComponent[], unloadCtx?: IProcessTelemetryUnloadContext, unloadState?: ITelemetryUnloadState, asyncCallback?: () => void): void | boolean {
118
+ let idx = 0;
119
+
120
+ function _doUnload(): void | boolean {
121
+ while (idx < components.length) {
122
+ let component = components[idx++];
123
+ if (component) {
124
+ let func = component[strDoUnload] || component[strDoTeardown];
125
+ if (isFunction(func)) {
126
+ if (func.call(component, unloadCtx, unloadState, _doUnload) === true) {
127
+ return true;
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+
134
+ return _doUnload();
73
135
  }
@@ -0,0 +1,111 @@
1
+ // // Copyright (c) Microsoft Corporation. All rights reserved.
2
+ // // Licensed under the MIT License.
3
+
4
+ import dynamicProto from "@microsoft/dynamicproto-js";
5
+ import { eLoggingSeverity, _eInternalMessageId } from "../JavaScriptSDK.Enums/LoggingEnums";
6
+ import { IProcessTelemetryContext } from "../JavaScriptSDK.Interfaces/IProcessTelemetryContext";
7
+ import { ITelemetryInitializerContainer, ITelemetryInitializerHandler, TelemetryInitializerFunction } from "../JavaScriptSDK.Interfaces/ITelemetryInitializers";
8
+ import { ITelemetryItem } from "../JavaScriptSDK.Interfaces/ITelemetryItem";
9
+ import { BaseTelemetryPlugin } from "./BaseTelemetryPlugin";
10
+ import { _throwInternal } from "./DiagnosticLogger";
11
+ import { dumpObj } from "./EnvUtils";
12
+ import { arrForEach, getExceptionName } from "./HelperFuncs";
13
+ import { strDoTeardown } from "./InternalConstants";
14
+
15
+ interface _IInternalTelemetryInitializerHandler {
16
+ id: number;
17
+ fn: TelemetryInitializerFunction;
18
+ }
19
+
20
+ export class TelemetryInitializerPlugin extends BaseTelemetryPlugin implements ITelemetryInitializerContainer {
21
+
22
+ public identifier: string = "TelemetryInitializerPlugin";
23
+ priority: number = 199;
24
+
25
+ constructor() {
26
+ super();
27
+
28
+ // NOTE!: DON'T set default values here, instead set them in the _initDefaults() function as it is also called during teardown()
29
+ let _id: number;
30
+ let _initializers: _IInternalTelemetryInitializerHandler[];
31
+
32
+ _initDefaults();
33
+
34
+ dynamicProto(TelemetryInitializerPlugin, this, (_self, _base) => {
35
+
36
+ _self.addTelemetryInitializer = (telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler => {
37
+ let theInitializer = {
38
+ id: _id++,
39
+ fn: telemetryInitializer
40
+ };
41
+
42
+ _initializers.push(theInitializer);
43
+
44
+ let handler: ITelemetryInitializerHandler = {
45
+ remove: () => {
46
+ arrForEach(_initializers, (initializer, idx) => {
47
+ if (initializer.id === theInitializer.id) {
48
+ _initializers.splice(idx, 1);
49
+ return -1;
50
+ }
51
+ });
52
+ }
53
+ }
54
+
55
+ return handler;
56
+ }
57
+
58
+ _self.processTelemetry = (item: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void => {
59
+ var doNotSendItem = false;
60
+ var telemetryInitializersCount = _initializers.length;
61
+ for (var i = 0; i < telemetryInitializersCount; ++i) {
62
+ var telemetryInitializer = _initializers[i];
63
+ if (telemetryInitializer) {
64
+ try {
65
+ if (telemetryInitializer.fn.apply(null, [item]) === false) {
66
+ doNotSendItem = true;
67
+ break;
68
+ }
69
+ } catch (e) {
70
+ // log error but dont stop executing rest of the telemetry initializers
71
+ // doNotSendItem = true;
72
+ _throwInternal(
73
+ itemCtx.diagLog(),
74
+ eLoggingSeverity.CRITICAL,
75
+ _eInternalMessageId.TelemetryInitializerFailed,
76
+ "One of telemetry initializers failed, telemetry item will not be sent: " + getExceptionName(e),
77
+ { exception: dumpObj(e) }, true);
78
+ }
79
+ }
80
+ }
81
+
82
+ if (!doNotSendItem) {
83
+ _self.processNext(item, itemCtx);
84
+ }
85
+ };
86
+
87
+ _self[strDoTeardown] = () => {
88
+ _initDefaults();
89
+ };
90
+ });
91
+
92
+ function _initDefaults() {
93
+ _id = 0;
94
+ _initializers = [];
95
+ }
96
+ }
97
+
98
+ /**
99
+ * Add a telemetry processor to decorate or drop telemetry events.
100
+ * @param telemetryInitializer - The Telemetry Initializer function
101
+ * @returns - A ITelemetryInitializerHandler to enable the initializer to be removed
102
+ */
103
+ public addTelemetryInitializer(telemetryInitializer: TelemetryInitializerFunction): ITelemetryInitializerHandler {
104
+ // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging
105
+ return null;
106
+ }
107
+
108
+ public processTelemetry(env: ITelemetryItem, itemCtx?: IProcessTelemetryContext): void {
109
+ // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging
110
+ }
111
+ }
@@ -0,0 +1,46 @@
1
+ // Copyright (c) Microsoft Corporation. All rights reserved.
2
+ // Licensed under the MIT License.
3
+
4
+ import { eLoggingSeverity, _eInternalMessageId } from "../JavaScriptSDK.Enums/LoggingEnums";
5
+ import { IProcessTelemetryUnloadContext } from "../JavaScriptSDK.Interfaces/IProcessTelemetryContext";
6
+ import { ITelemetryUnloadState } from "../JavaScriptSDK.Interfaces/ITelemetryUnloadState";
7
+ import { _throwInternal } from "./DiagnosticLogger";
8
+ import { dumpObj } from "./EnvUtils";
9
+ import { arrForEach } from "./HelperFuncs";
10
+
11
+ export type UnloadHandler = (itemCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void;
12
+
13
+ export interface IUnloadHandlerContainer {
14
+ add: (handler: UnloadHandler) => void;
15
+ run: (itemCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) => void
16
+ }
17
+
18
+ export function createUnloadHandlerContainer() {
19
+ let handlers: UnloadHandler[] = [];
20
+
21
+ function _addHandler(handler: UnloadHandler) {
22
+ if (handler) {
23
+ handlers.push(handler);
24
+ }
25
+ }
26
+
27
+ function _runHandlers(unloadCtx: IProcessTelemetryUnloadContext, unloadState: ITelemetryUnloadState) {
28
+ arrForEach(handlers, (handler) => {
29
+ try {
30
+ handler(unloadCtx, unloadState);
31
+ } catch (e) {
32
+ _throwInternal(
33
+ unloadCtx.diagLog(),
34
+ eLoggingSeverity.WARNING,
35
+ _eInternalMessageId.PluginException,
36
+ "Unexpected error calling unload handler - " + dumpObj(e));
37
+ }
38
+ });
39
+ handlers = [];
40
+ }
41
+
42
+ return {
43
+ add: _addHandler,
44
+ run: _runHandlers
45
+ }
46
+ }
@@ -0,0 +1,56 @@
1
+ // Copyright (c) Microsoft Corporation. All rights reserved.
2
+ // Licensed under the MIT License.
3
+
4
+ import { objForEachKey, deepFreeze } from "../JavaScriptSDK/HelperFuncs";
5
+
6
+ export declare type EnumValue<E = any> = { readonly [key in keyof E]: E[key] };
7
+ export declare type EnumMap<E = any, I = E> = { readonly [key in keyof E extends string ? keyof E : never]: key extends string ? key : keyof E } & I;
8
+
9
+ /**
10
+ * Create an enum style object which has both the key => value and value => key mappings
11
+ * @param values - The values to populate on the new object
12
+ * @returns
13
+ */
14
+ export function createEnumStyle<E>(values: { [key in keyof E]: E[keyof E] }): EnumValue<E> {
15
+ let enumClass: any = {};
16
+ objForEachKey(values, (field, value) => {
17
+ enumClass[field] = value;
18
+ enumClass[value] = field;
19
+ });
20
+
21
+ return deepFreeze(enumClass);
22
+ }
23
+
24
+ /**
25
+ * Create a 2 index map that maps an enum's key as both the key and value, X["key"] => "key" and X[0] => "keyof 0".
26
+ * @param values - The values to populate on the new object
27
+ * @returns
28
+ */
29
+ export function createEnumMap<E, I = keyof E>(values: { [key in keyof E]: E[keyof E] }): EnumMap<E, I> {
30
+ let mapClass: any = {};
31
+ objForEachKey(values, (field, value) => {
32
+ mapClass[field] = field;
33
+ mapClass[value] = field;
34
+ });
35
+
36
+ return deepFreeze(mapClass);
37
+ }
38
+
39
+ /**
40
+ * Create a 2 index map that maps an enum's key and value to the defined map value, X["key"] => mapValue and X[0] => mapValue.
41
+ * Generic values
42
+ * - E = the const enum type (typeof eRequestHeaders);
43
+ * - V = Identifies the valid values for the keys, this should include both the enum numeric and string key of the type. The
44
+ * resulting "Value" of each entry identifies the valid values withing the assignments.
45
+ * @param values - The values to populate on the new object
46
+ * @returns
47
+ */
48
+ export function createValueMap<E, V = E>(values: { [key in keyof E]: [ eValue: E[keyof E], mapValue: V[keyof V]] }): V {
49
+ let mapClass: any = {};
50
+ objForEachKey(values, (field, value) => {
51
+ mapClass[field] = value[1];
52
+ mapClass[value[0]] = value[1];
53
+ });
54
+
55
+ return deepFreeze(mapClass);
56
+ }
@@ -1,31 +1,71 @@
1
1
  // Copyright (c) Microsoft Corporation. All rights reserved.
2
2
  // Licensed under the MIT License.
3
+
4
+ import { createEnumStyle } from "../JavaScriptSDK.Enums/EnumHelperFuncs";
5
+
6
+ /**
7
+ * The eEventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.
8
+ */
9
+ export const enum eEventsDiscardedReason {
10
+ /**
11
+ * Unknown.
12
+ */
13
+ Unknown = 0,
14
+ /**
15
+ * Status set to non-retryable.
16
+ */
17
+ NonRetryableStatus = 1,
18
+ /**
19
+ * The event is invalid.
20
+ */
21
+ InvalidEvent = 2,
22
+ /**
23
+ * The size of the event is too large.
24
+ */
25
+ SizeLimitExceeded = 3,
26
+ /**
27
+ * The server is not accepting events from this instrumentation key.
28
+ */
29
+ KillSwitch = 4,
30
+ /**
31
+ * The event queue is full.
32
+ */
33
+ QueueFull = 5
34
+ }
35
+
3
36
  /**
4
37
  * The EventsDiscardedReason enumeration contains a set of values that specify the reason for discarding an event.
5
38
  */
6
- export const EventsDiscardedReason = {
39
+ export const EventsDiscardedReason = createEnumStyle<typeof eEventsDiscardedReason>({
7
40
  /**
8
41
  * Unknown.
9
42
  */
10
- Unknown: 0,
43
+ Unknown: eEventsDiscardedReason.Unknown,
44
+
11
45
  /**
12
46
  * Status set to non-retryable.
13
47
  */
14
- NonRetryableStatus: 1,
48
+ NonRetryableStatus: eEventsDiscardedReason.NonRetryableStatus,
49
+
15
50
  /**
16
51
  * The event is invalid.
17
52
  */
18
- InvalidEvent: 2,
53
+ InvalidEvent: eEventsDiscardedReason.InvalidEvent,
54
+
19
55
  /**
20
56
  * The size of the event is too large.
21
57
  */
22
- SizeLimitExceeded: 3,
58
+ SizeLimitExceeded: eEventsDiscardedReason.SizeLimitExceeded,
59
+
23
60
  /**
24
61
  * The server is not accepting events from this instrumentation key.
25
62
  */
26
- KillSwitch: 4,
63
+ KillSwitch: eEventsDiscardedReason.KillSwitch,
64
+
27
65
  /**
28
66
  * The event queue is full.
29
67
  */
30
- QueueFull: 5
31
- };
68
+ QueueFull: eEventsDiscardedReason.QueueFull
69
+ });
70
+
71
+ export type EventsDiscardedReason = number | eEventsDiscardedReason;