@microsoft/1ds-post-js 3.1.8 → 3.1.11

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 (56) hide show
  1. package/README.md +124 -5
  2. package/bundle/{ms.post-3.1.8.gbl.js → ms.post-3.1.11.gbl.js} +353 -172
  3. package/bundle/ms.post-3.1.11.gbl.js.map +1 -0
  4. package/bundle/ms.post-3.1.11.gbl.min.js +7 -0
  5. package/bundle/ms.post-3.1.11.gbl.min.js.map +1 -0
  6. package/bundle/ms.post-3.1.11.integrity.json +46 -0
  7. package/bundle/{ms.post-3.1.8.js → ms.post-3.1.11.js} +353 -172
  8. package/bundle/ms.post-3.1.11.js.map +1 -0
  9. package/bundle/ms.post-3.1.11.min.js +7 -0
  10. package/bundle/ms.post-3.1.11.min.js.map +1 -0
  11. package/bundle/ms.post.gbl.js +352 -171
  12. package/bundle/ms.post.gbl.js.map +1 -1
  13. package/bundle/ms.post.gbl.min.js +2 -2
  14. package/bundle/ms.post.gbl.min.js.map +1 -1
  15. package/bundle/ms.post.integrity.json +17 -17
  16. package/bundle/ms.post.js +352 -171
  17. package/bundle/ms.post.js.map +1 -1
  18. package/bundle/ms.post.min.js +2 -2
  19. package/bundle/ms.post.min.js.map +1 -1
  20. package/dist/ms.post.js +238 -116
  21. package/dist/ms.post.js.map +1 -1
  22. package/dist/ms.post.min.js +2 -2
  23. package/dist/ms.post.min.js.map +1 -1
  24. package/dist-esm/src/BatchNotificationActions.js +1 -1
  25. package/dist-esm/src/ClockSkewManager.js +1 -1
  26. package/dist-esm/src/Constants.d.ts +25 -0
  27. package/dist-esm/src/Constants.js +31 -0
  28. package/dist-esm/src/Constants.js.map +1 -0
  29. package/dist-esm/src/DataModels.d.ts +55 -0
  30. package/dist-esm/src/DataModels.js +1 -1
  31. package/dist-esm/src/EventBatch.d.ts +5 -2
  32. package/dist-esm/src/EventBatch.js +35 -15
  33. package/dist-esm/src/EventBatch.js.map +1 -1
  34. package/dist-esm/src/HttpManager.d.ts +2 -2
  35. package/dist-esm/src/HttpManager.js +172 -85
  36. package/dist-esm/src/HttpManager.js.map +1 -1
  37. package/dist-esm/src/Index.js +1 -1
  38. package/dist-esm/src/KillSwitch.js +1 -1
  39. package/dist-esm/src/PostChannel.js +55 -31
  40. package/dist-esm/src/PostChannel.js.map +1 -1
  41. package/dist-esm/src/RetryPolicy.js +1 -1
  42. package/dist-esm/src/Serializer.js +1 -1
  43. package/dist-esm/src/typings/XDomainRequest.js +1 -1
  44. package/package.json +3 -3
  45. package/src/Constants.ts +28 -0
  46. package/src/DataModels.ts +68 -0
  47. package/src/EventBatch.ts +47 -14
  48. package/src/HttpManager.ts +206 -84
  49. package/src/PostChannel.ts +60 -31
  50. package/bundle/ms.post-3.1.8.gbl.js.map +0 -1
  51. package/bundle/ms.post-3.1.8.gbl.min.js +0 -7
  52. package/bundle/ms.post-3.1.8.gbl.min.js.map +0 -1
  53. package/bundle/ms.post-3.1.8.integrity.json +0 -46
  54. package/bundle/ms.post-3.1.8.js.map +0 -1
  55. package/bundle/ms.post-3.1.8.min.js +0 -7
  56. package/bundle/ms.post-3.1.8.min.js.map +0 -1
@@ -8,7 +8,7 @@ import {
8
8
  EventLatency, NotificationManager, EventsDiscardedReason, IPlugin, ITelemetryItem,
9
9
  IAppInsightsCore, isValueAssigned, addPageUnloadEventListener, addPageHideEventListener, addPageShowEventListener, setProcessTelemetryTimings,
10
10
  isWindowObjectAvailable, IProcessTelemetryContext, SendRequestReason, arrForEach,
11
- LoggingSeverity, _ExtendedInternalMessageId, doPerf, objForEachKey, optimizeObject, isChromium, getWindow, EventSendType, addEventHandler, getDocument,
11
+ LoggingSeverity, _ExtendedInternalMessageId, doPerf, objForEachKey, optimizeObject, isChromium, getWindow, EventSendType, addEventHandler, getDocument, isBeaconsSupported, isReactNative, isFetchSupported, isNumber,
12
12
  } from "@microsoft/1ds-core-js";
13
13
  import {
14
14
  IChannelConfiguration, RT_PROFILE, NRT_PROFILE, IPostChannel,
@@ -16,22 +16,27 @@ import {
16
16
  EventBatchNotificationReason,
17
17
  } from "./DataModels";
18
18
  import { EventBatch } from "./EventBatch";
19
- import HttpManager from "./HttpManager";
19
+ import { HttpManager } from "./HttpManager";
20
20
  import RetryPolicy from "./RetryPolicy";
21
21
  import dynamicProto from "@microsoft/dynamicproto-js";
22
+ import { strMsaDeviceTicket } from "./Constants";
22
23
 
23
24
  const FlushCheckTimer = 0.250; // This needs to be in seconds, so this is 250ms
24
25
  const MaxNumberEventPerBatch = 500;
25
26
  const EventsDroppedAtOneTime = 20;
26
27
  const MaxSendAttempts = 6;
28
+ const MaxSyncUnloadSendAttempts = 2; // Assuming 2 based on beforeunload and unload
27
29
  const MaxBackoffCount = 4;
28
30
  const globalContext = isWindowObjectAvailable ? window : this;
29
31
  const MaxConnections = 2;
30
- const MaxRetries = 1;
32
+ const MaxRequestRetriesBeforeBackoff = 1;
31
33
 
32
34
  const strEventsDiscarded = "eventsDiscarded";
33
35
  const strOverrideInstrumentationKey = "overrideInstrumentationKey";
34
36
 
37
+ const strMaxEventRetryAttempts = "maxEventRetryAttempts";
38
+ const strMaxUnloadEventRetryAttempts = "maxUnloadEventRetryAttempts";
39
+
35
40
  interface IPostChannelBatchQueue {
36
41
  /**
37
42
  * This is the actual queue of event batches
@@ -85,13 +90,16 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
85
90
  let _delayedBatchReason: SendRequestReason;
86
91
  let _optimizeObject: boolean = true;
87
92
  let _isPageUnloadTriggered = false;
93
+ let _disableXhrSync = false;
94
+ let _maxEventSendAttempts: number = MaxSendAttempts;
95
+ let _maxUnloadEventSendAttempts: number = MaxSyncUnloadSendAttempts;
88
96
 
89
97
  dynamicProto(PostChannel, this, (_self, _base) => {
90
98
  _initializeProfiles();
91
99
  _clearQueues();
92
100
  _setAutoLimits();
93
101
 
94
- _httpManager = new HttpManager(MaxNumberEventPerBatch, MaxConnections, MaxRetries, {
102
+ _httpManager = new HttpManager(MaxNumberEventPerBatch, MaxConnections, MaxRequestRetriesBeforeBackoff, {
95
103
  requeue: _requeueEvents,
96
104
  send: _sendingEvent,
97
105
  sent: _eventsSentEvent,
@@ -119,14 +127,7 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
119
127
  // Only try and use the optimizeObject() if this appears to be a chromium based browser and it has not been explicitly disabled
120
128
  _optimizeObject = !_config.disableOptimizeObj && isChromium();
121
129
 
122
- var existingGetWParamMethod = extendedCore.getWParam;
123
- extendedCore.getWParam = () => {
124
- var wparam = 0;
125
- if (_config.ignoreMc1Ms0CookieProcessing) {
126
- wparam = wparam | 2;
127
- }
128
- return wparam | existingGetWParamMethod();
129
- };
130
+ _hookWParam(extendedCore);
130
131
 
131
132
  if (_config.eventsLimitInMem > 0) {
132
133
  _queueSizeLimit = _config.eventsLimitInMem;
@@ -140,6 +141,15 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
140
141
  _autoFlushEventsLimit = _config.autoFlushEventsLimit;
141
142
  }
142
143
 
144
+ _disableXhrSync = _config.disableXhrSync;
145
+ if (isNumber(_config[strMaxEventRetryAttempts])) {
146
+ _maxEventSendAttempts = _config[strMaxEventRetryAttempts];
147
+ }
148
+
149
+ if (isNumber(_config[strMaxUnloadEventRetryAttempts])) {
150
+ _maxUnloadEventSendAttempts = _config[strMaxUnloadEventRetryAttempts];
151
+ }
152
+
143
153
  _setAutoLimits();
144
154
 
145
155
  if (_config.httpXHROverride && _config.httpXHROverride.sendPOST) {
@@ -156,27 +166,12 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
156
166
  _self._notificationManager = coreConfig.extensionConfig.NotificationManager;
157
167
  _httpManager.initialize(endpointUrl, _self.core as IExtendedAppInsightsCore, _self, _xhrOverride, _config);
158
168
 
159
- function _handleUnloadEvents(evt: any) {
160
- let theEvt = evt || getWindow().event; // IE 8 does not pass the event
161
- if (theEvt.type !== "beforeunload") {
162
- // Only set the unload trigger if not beforeunload event as beforeunload can be cancelled while the other events can't
163
- _isPageUnloadTriggered = true;
164
- _httpManager.setUnloading(_isPageUnloadTriggered);
165
- }
166
-
167
- _releaseAllQueues(EventSendType.SendBeacon, SendRequestReason.Unload);
168
- }
169
-
170
169
  let excludePageUnloadEvents = coreConfig.disablePageUnloadEvents || [];
171
170
 
172
171
  // When running in Web browsers try to send all telemetry if page is unloaded
173
172
  addPageUnloadEventListener(_handleUnloadEvents, excludePageUnloadEvents);
174
173
  addPageHideEventListener(_handleUnloadEvents, excludePageUnloadEvents);
175
- addPageShowEventListener((evt) => {
176
- // Handle the page becoming visible again
177
- _isPageUnloadTriggered = false;
178
- _httpManager.setUnloading(_isPageUnloadTriggered);
179
- }, coreConfig.disablePageShowEvents);
174
+ addPageShowEventListener(_handleShowEvents, coreConfig.disablePageShowEvents);
180
175
 
181
176
  _self.setInitialized(true);
182
177
  }, () => ({ coreConfig, core, extensions }));
@@ -221,6 +216,35 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
221
216
  _self.processNext(event, itemCtx);
222
217
  };
223
218
 
219
+ function _hookWParam(extendedCore: IExtendedAppInsightsCore) {
220
+ var existingGetWParamMethod = extendedCore.getWParam;
221
+ extendedCore.getWParam = () => {
222
+ var wparam = 0;
223
+ if (_config.ignoreMc1Ms0CookieProcessing) {
224
+ wparam = wparam | 2;
225
+ }
226
+ return wparam | existingGetWParamMethod();
227
+ };
228
+ }
229
+
230
+ // Moving event handlers out from the initialize closure so that any local variables can be garbage collected
231
+ function _handleUnloadEvents(evt: any) {
232
+ let theEvt = evt || getWindow().event; // IE 8 does not pass the event
233
+ if (theEvt.type !== "beforeunload") {
234
+ // Only set the unload trigger if not beforeunload event as beforeunload can be cancelled while the other events can't
235
+ _isPageUnloadTriggered = true;
236
+ _httpManager.setUnloading(_isPageUnloadTriggered);
237
+ }
238
+
239
+ _releaseAllQueues(EventSendType.SendBeacon, SendRequestReason.Unload);
240
+ }
241
+
242
+ function _handleShowEvents(evt: any) {
243
+ // Handle the page becoming visible again
244
+ _isPageUnloadTriggered = false;
245
+ _httpManager.setUnloading(_isPageUnloadTriggered);
246
+ }
247
+
224
248
  function _addEventToQueues(event: IPostTransmissionTelemetryItem, append: boolean) {
225
249
  // If send attempt field is undefined we should set it to 0.
226
250
  if (!event.sendAttempt) {
@@ -420,7 +444,7 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
420
444
  };
421
445
 
422
446
  _self.setMsaAuthTicket = (ticket: string) => {
423
- _httpManager.addHeader("AuthMsaDeviceTicket", ticket);
447
+ _httpManager.addHeader(strMsaDeviceTicket, ticket);
424
448
  };
425
449
 
426
450
  _self.hasEvents = _hasEvents;
@@ -613,7 +637,7 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
613
637
 
614
638
  const latency = event.latency;
615
639
  let eventBatch = _getEventBatch(event.iKey, latency, true);
616
- if (eventBatch.addEvents([event], append)) {
640
+ if (eventBatch.addEvent(event)) {
617
641
  if (latency !== EventLatency.Immediate) {
618
642
  _queueSize++;
619
643
 
@@ -804,6 +828,11 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
804
828
  */
805
829
  function _requeueEvents(batches: EventBatch[], reason?: number) {
806
830
  let droppedEvents: IPostTransmissionTelemetryItem[] = [];
831
+ let maxSendAttempts = _maxEventSendAttempts;
832
+ if (_isPageUnloadTriggered) {
833
+ // If a page unlaod has been triggered reduce the number of times we try to "retry"
834
+ maxSendAttempts = _maxUnloadEventSendAttempts;
835
+ }
807
836
 
808
837
  arrForEach(batches, (theBatch) => {
809
838
  if (theBatch && theBatch.count() > 0) {
@@ -816,7 +845,7 @@ export default class PostChannel extends BaseTelemetryPlugin implements IChannel
816
845
  theEvent.sync = false;
817
846
  }
818
847
 
819
- if (theEvent.sendAttempt < MaxSendAttempts) {
848
+ if (theEvent.sendAttempt < maxSendAttempts) {
820
849
  // Reset the event timings
821
850
  setProcessTelemetryTimings(theEvent, _self.identifier);
822
851
  _addEventToQueues(theEvent, false);