@microsoft/applicationinsights-offlinechannel-js 0.3.5-nightly3.2501-07 → 0.3.5-nightly3.2502-02

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.
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -15,7 +15,7 @@ import { InMemoryBatch } from "./InMemoryBatch";
15
15
  import { OfflineBatchHandler } from "./OfflineBatchHandler";
16
16
  import { Sender } from "./Sender";
17
17
  import { _DYN_ADD_EVENT, _DYN_BATCH_HANDLER, _DYN_CANCEL, _DYN_CLEAR, _DYN_CREATE_ONE_DSPAYLOAD, _DYN_CRITICAL_CNT, _DYN_DATA, _DYN_DIAG_LOG, _DYN_GET_ITEMS, _DYN_GET_OFFLINE_SUPPORT, _DYN_INITIALIZE, _DYN_INSTRUMENTATION_KEY, _DYN_IS_COMPLETELY_IDLE, _DYN_IS_ONLINE, _DYN_LENGTH, _DYN_MIN_PERSISTENCE_CACH0, _DYN_ONUNLOAD_FLUSH, _DYN_OVERRIDE_INSTRUMENTA1, _DYN_PERSISTENCE, _DYN_PROCESS_NEXT, _DYN_PUSH, _DYN_REFRESH, _DYN_SEND_NEXT_BATCH, _DYN_STATE, _DYN_TEARDOWN, _DYN__CRITICAL, _DYN__NORMAL } from "./__DynamicConstants";
18
- var version = '0.3.5-nightly3.2501-07';
18
+ var version = '0.3.5-nightly3.2502-02';
19
19
  var DefaultOfflineIdentifier = "OfflineChannel";
20
20
  var DefaultBatchInterval = 15000;
21
21
  var DefaultInMemoMaxTime = 15000;
@@ -1 +1 @@
1
- {"version":3,"file":"OfflineChannel.js.map","sources":["OfflineChannel.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\nimport { __extends } from \"tslib\";\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { BreezeChannelIdentifier, EventPersistence, createOfflineListener } from \"@microsoft/applicationinsights-common\";\r\nimport { BaseTelemetryPlugin, EventsDiscardedReason, _throwInternal, arrForEach, createProcessTelemetryContext, createUniqueNamespace, dateNow, mergeEvtNamespace, onConfigChange, runTargetUnload } from \"@microsoft/applicationinsights-core-js\";\r\nimport { createAsyncPromise, createTaskScheduler } from \"@nevware21/ts-async\";\r\nimport { arrSlice, isFunction, isString, objDeepFreeze, objForEachKey, scheduleTimeout } from \"@nevware21/ts-utils\";\r\nimport { EVT_DISCARD_STR, EVT_SENT_STR, EVT_STORE_STR, batchDropNotification, callNotification, isGreaterThanZero, isValidPersistenceLevel } from \"./Helpers/Utils\";\r\nimport { InMemoryBatch } from \"./InMemoryBatch\";\r\nimport { OfflineBatchHandler } from \"./OfflineBatchHandler\";\r\nimport { Sender } from \"./Sender\";\r\nimport { _DYN_ADD_EVENT, _DYN_BATCH_HANDLER, _DYN_CANCEL, _DYN_CLEAR, _DYN_CREATE_ONE_DSPAYLOAD, _DYN_CRITICAL_CNT, _DYN_DATA, _DYN_DIAG_LOG, _DYN_GET_ITEMS, _DYN_GET_OFFLINE_SUPPORT, _DYN_INITIALIZE, _DYN_INSTRUMENTATION_KEY, _DYN_IS_COMPLETELY_IDLE, _DYN_IS_ONLINE, _DYN_LENGTH, _DYN_MIN_PERSISTENCE_CACH0, _DYN_ONUNLOAD_FLUSH, _DYN_OVERRIDE_INSTRUMENTA1, _DYN_PERSISTENCE, _DYN_PROCESS_NEXT, _DYN_PUSH, _DYN_REFRESH, _DYN_SEND_NEXT_BATCH, _DYN_STATE, _DYN_TEARDOWN, _DYN__CRITICAL, _DYN__NORMAL } from \"./__DynamicConstants\";\r\nvar version = '0.3.5-nightly3.2501-07';\r\nvar DefaultOfflineIdentifier = \"OfflineChannel\";\r\nvar DefaultBatchInterval = 15000;\r\nvar DefaultInMemoMaxTime = 15000;\r\nvar PostChannelIdentifier = \"PostChannel\";\r\nvar PersistenceKeys = [EventPersistence[_DYN__CRITICAL /* @min:%2eCritical */], EventPersistence.Normal];\r\nvar undefValue = undefined;\r\nvar DefaultBatchSizeLimitBytes = 63000; // approx 64kb (the current Edge, Firefox and Chrome max limit)\r\nvar defaultOfflineChannelConfig = objDeepFreeze({\r\n maxStorageSizeInBytes: { isVal: isGreaterThanZero, v: 5000000 },\r\n storageKey: undefValue,\r\n minPersistenceLevel: { isVal: isValidPersistenceLevel, v: EventPersistence[_DYN__NORMAL /* @min:%2eNormal */] },\r\n providers: [1 /* eStorageProviders.LocalStorage */, 3 /* eStorageProviders.IndexedDb */],\r\n indexedDbName: undefValue,\r\n maxStorageItems: { isVal: isGreaterThanZero, v: undefValue },\r\n inMemoMaxTime: { isVal: isGreaterThanZero, v: DefaultInMemoMaxTime },\r\n maxRetry: { isVal: isGreaterThanZero, v: 1 },\r\n maxBatchsize: { isVal: isGreaterThanZero, v: DefaultBatchSizeLimitBytes },\r\n maxSentBatchInterval: { isVal: isGreaterThanZero, v: DefaultBatchInterval },\r\n primaryOnlineChannelId: [BreezeChannelIdentifier, PostChannelIdentifier],\r\n overrideInstrumentationKey: undefValue,\r\n senderCfg: {},\r\n splitEvts: false\r\n});\r\n//TODO: add tests for sharedAnanlytics\r\nvar OfflineChannel = /** @class */ (function (_super) {\r\n __extends(OfflineChannel, _super);\r\n function OfflineChannel() {\r\n var _this = _super.call(this) || this;\r\n _this.identifier = DefaultOfflineIdentifier;\r\n _this.priority = 1000; // before channel (post = 1011 and sender = 1001, teechannel = 999, localstorage: 1009)\r\n _this.version = version;\r\n dynamicProto(OfflineChannel, _this, function (_self, _base) {\r\n // Internal properties used for tracking the current state, these are \"true\" internal/private properties for this instance\r\n var _hasInitialized;\r\n var _paused;\r\n var _sender;\r\n var _urlCfg;\r\n var _offlineListener;\r\n var _inMemoFlushTimer;\r\n var _inMemoTimerOut;\r\n var _diagLogger;\r\n var _endpoint;\r\n var _maxBatchSize;\r\n var _sendNextBatchTimer;\r\n var _convertUndefined;\r\n var _retryAt;\r\n var _maxBatchInterval;\r\n var _consecutiveErrors;\r\n var _senderInst;\r\n var _taskScheduler;\r\n var _offineSupport;\r\n var _primaryChannelId;\r\n var _overrideIkey;\r\n var _evtsLimitInMemo;\r\n var _notificationManager;\r\n var _isLazyInit;\r\n var _dependencyPlugin;\r\n var _splitEvts;\r\n var _inMemoMap;\r\n _initDefaults();\r\n _self[_DYN_INITIALIZE /* @min:%2einitialize */] = function (coreConfig, core, extensions, pluginChain) {\r\n if (!_hasInitialized) {\r\n _base[_DYN_INITIALIZE /* @min:%2einitialize */](coreConfig, core, extensions);\r\n // keep setting hasInitialized status here to avoid re-initialize\r\n _hasInitialized = true;\r\n _diagLogger = _self[_DYN_DIAG_LOG /* @min:%2ediagLog */]();\r\n var evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"OfflineSender\"), core.evtNamespace && core.evtNamespace());\r\n _offlineListener = createOfflineListener(evtNamespace); // TODO: add config to be passed\r\n _taskScheduler = createTaskScheduler(createAsyncPromise, \"offline channel\");\r\n _notificationManager = core.getNotifyMgr();\r\n }\r\n // TODO: add refresh inside timer until dependency plugin is initialized\r\n scheduleTimeout(function () {\r\n try {\r\n var _dependencyPlugin_1 = _getDependencyPlugin(coreConfig, core);\r\n // make sure that online sender is initialized\r\n if (!_isLazyInit && _dependencyPlugin_1 && _dependencyPlugin_1.isInitialized()) {\r\n _isLazyInit = true;\r\n _createUrlConfig(coreConfig, core, extensions, pluginChain);\r\n var ctx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain);\r\n _sender[_DYN_INITIALIZE /* @min:%2einitialize */](coreConfig, core, ctx, _diagLogger, _primaryChannelId, _self._unloadHooks);\r\n _senderInst = _sender.getXhrInst();\r\n _offlineListener.addListener(function (val) {\r\n if (!val[_DYN_IS_ONLINE /* @min:%2eisOnline */]) {\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n }\r\n else {\r\n _setSendNextTimer();\r\n }\r\n });\r\n // need it for first time to confirm if there are any events\r\n _setSendNextTimer();\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n }, 0);\r\n };\r\n _self.processTelemetry = function (evt, itemCtx) {\r\n try {\r\n var onlineStatus = _offlineListener[_DYN_IS_ONLINE /* @min:%2eisOnline */]();\r\n itemCtx = itemCtx || _self._getTelCtx(itemCtx);\r\n if (!!onlineStatus || !_offineSupport || !_endpoint) {\r\n // if we can't get url from online sender or core config, process next\r\n _self[_DYN_PROCESS_NEXT /* @min:%2eprocessNext */](evt, itemCtx);\r\n return;\r\n }\r\n if (_hasInitialized && !_paused) {\r\n var shouldProcess = true;\r\n if (isFunction(_offineSupport.shouldProcess)) {\r\n shouldProcess = _offineSupport.shouldProcess(evt);\r\n }\r\n if (!shouldProcess) {\r\n _self[_DYN_PROCESS_NEXT /* @min:%2eprocessNext */](evt, itemCtx);\r\n return;\r\n }\r\n var item = evt;\r\n //TODO: add function to better get level\r\n item.persistence = item.persistence || (item.baseData && item.baseData.persistence) || EventPersistence[_DYN__NORMAL /* @min:%2eNormal */]; // in case the level is in baseData\r\n if (_shouldCacheEvent(_urlCfg, item) && _inMemoMap) {\r\n if (_overrideIkey) {\r\n item.iKey = _overrideIkey;\r\n }\r\n var added = _addEvtToMap(item);\r\n // inMemo is full\r\n if (!added) {\r\n _flushInMemoItems(false, item[_DYN_PERSISTENCE /* @min:%2epersistence */]);\r\n var retry = _addEvtToMap(item);\r\n if (!retry) {\r\n _evtDropNotification([evt], EventsDiscardedReason.QueueFull);\r\n _throwInternal(_diagLogger, 2 /* eLoggingSeverity.WARNING */, 105 /* _eInternalMessageId.InMemoryStorageBufferFull */, \"Maximum offline in-memory buffer size reached\", true);\r\n }\r\n }\r\n // start timer when the first should-cache event added\r\n _setupInMemoTimer();\r\n }\r\n else {\r\n // if should not cache,send event drop notification\r\n _evtDropNotification([item], EventsDiscardedReason.InvalidEvent);\r\n }\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n // hand off the telemetry item to the next plugin\r\n _self[_DYN_PROCESS_NEXT /* @min:%2eprocessNext */](evt, itemCtx);\r\n };\r\n _self.pause = function () {\r\n _paused = true;\r\n _clearScheduledTimer();\r\n _consecutiveErrors = 0;\r\n _retryAt = null;\r\n };\r\n _self.resume = function () {\r\n _paused = false;\r\n _clearScheduledTimer();\r\n _setupInMemoTimer();\r\n _setSendNextTimer();\r\n };\r\n _self[_DYN_ONUNLOAD_FLUSH /* @min:%2eonunloadFlush */] = function () {\r\n if (!_paused) {\r\n while (_hasEvts()) {\r\n _flushInMemoItems(true);\r\n }\r\n // TODO: unloadprovider might send events out of order\r\n }\r\n };\r\n _self.flush = function (sync, callBack, sendReason) {\r\n // TODO: should we implement normal flush\r\n return _self[_DYN_ONUNLOAD_FLUSH /* @min:%2eonunloadFlush */]();\r\n };\r\n _self.getOfflineListener = function () {\r\n return _offlineListener;\r\n };\r\n _self[_DYN_SEND_NEXT_BATCH /* @min:%2esendNextBatch */] = function () {\r\n // TODO: add callback function\r\n return _offineSupport && _setSendNextTimer();\r\n };\r\n _self._doTeardown = function (unloadCtx, unloadState) {\r\n _self[_DYN_ONUNLOAD_FLUSH /* @min:%2eonunloadFlush */]();\r\n _offlineListener && runTargetUnload(_offlineListener, false);\r\n var handler = _urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */];\r\n handler && handler[_DYN_TEARDOWN /* @min:%2eteardown */]();\r\n _clearScheduledTimer();\r\n _initDefaults();\r\n };\r\n _self[\"_getDbgPlgTargets\"] = function () {\r\n return [_urlCfg, _inMemoMap, _senderInst, _inMemoFlushTimer, _sendNextBatchTimer];\r\n };\r\n function _initDefaults() {\r\n _hasInitialized = false;\r\n _paused = false;\r\n _sender = new Sender();\r\n _urlCfg = null;\r\n _offlineListener = null;\r\n _diagLogger = null;\r\n _endpoint = null;\r\n _convertUndefined = undefValue;\r\n _maxBatchSize = null;\r\n _sendNextBatchTimer = null;\r\n _consecutiveErrors = null;\r\n _retryAt = null;\r\n _maxBatchInterval = null;\r\n _senderInst = null;\r\n _offineSupport = null;\r\n _primaryChannelId = null;\r\n _overrideIkey = null;\r\n _evtsLimitInMemo = null;\r\n _isLazyInit = false;\r\n _dependencyPlugin = null;\r\n _splitEvts = false;\r\n _inMemoMap = null;\r\n }\r\n function _shouldCacheEvent(urlConfig, item) {\r\n if ((item[_DYN_PERSISTENCE /* @min:%2epersistence */]) < urlConfig[_DYN_MIN_PERSISTENCE_CACH0 /* @min:%2eminPersistenceCacheLevel */]) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n function _setupInMemoTimer() {\r\n if (!_inMemoFlushTimer) {\r\n _inMemoFlushTimer = scheduleTimeout(function () {\r\n _flushInMemoItems();\r\n var hasEvts = _hasEvts();\r\n if (hasEvts && _inMemoFlushTimer) {\r\n _inMemoFlushTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n _setSendNextTimer();\r\n }, _inMemoTimerOut);\r\n _inMemoFlushTimer.unref();\r\n }\r\n else {\r\n // Restart the timer if not already running https://nevware21.github.io/ts-utils/typedoc/interfaces/ITimerHandler.html#enabled\r\n _inMemoFlushTimer.enabled = true;\r\n }\r\n }\r\n //flush only flush max batch size event, may still have events lefts\r\n function _flushInMemoItems(unload, mapKey) {\r\n try {\r\n // TODO: add while loop to flush everything\r\n var hasEvts_1 = false;\r\n // can use objForEachKey(_inMemoMap, (key)), but keys returned by this function is always string\r\n arrForEach(PersistenceKeys, function (key) {\r\n var inMemoBatch = _inMemoMap[key];\r\n var inMemo = inMemoBatch;\r\n var evts = inMemo && inMemo[_DYN_GET_ITEMS /* @min:%2egetItems */]();\r\n if (!evts || !evts[_DYN_LENGTH /* @min:%2elength */]) {\r\n return;\r\n }\r\n if (_splitEvts && mapKey && mapKey !== key) {\r\n // if split evts is set to true\r\n // specific mapkey is defined\r\n // for key !== mapkey, only check if there are any events left in order to refresh timer\r\n hasEvts_1 = hasEvts_1 || !!evts[_DYN_LENGTH /* @min:%2elength */];\r\n return;\r\n }\r\n var payloadArr = [];\r\n var size = 0;\r\n var idx = -1;\r\n var criticalCnt = 0;\r\n arrForEach(evts, function (evt, index) {\r\n var curEvt = evt;\r\n idx = index;\r\n var payload = _getPayload(curEvt);\r\n size += payload[_DYN_LENGTH /* @min:%2elength */];\r\n if (size > _maxBatchSize) {\r\n return;\r\n }\r\n if (curEvt.persistence == EventPersistence[_DYN__CRITICAL /* @min:%2eCritical */]) {\r\n criticalCnt++;\r\n }\r\n idx = index;\r\n payloadArr[_DYN_PUSH /* @min:%2epush */](payload);\r\n });\r\n if (!payloadArr[_DYN_LENGTH /* @min:%2elength */]) {\r\n return;\r\n }\r\n var sentItems = evts.slice(0, idx + 1);\r\n if (idx + 1 < evts[_DYN_LENGTH /* @min:%2elength */]) {\r\n // keep track if there is any remaining events\r\n hasEvts_1 = true;\r\n }\r\n _inMemoMap[key] = inMemoBatch.createNew(_endpoint, arrSlice(inMemo[_DYN_GET_ITEMS /* @min:%2egetItems */](), idx + 1), _evtsLimitInMemo);\r\n var payloadData = null;\r\n if (_offineSupport && _offineSupport[_DYN_CREATE_ONE_DSPAYLOAD /* @min:%2ecreateOneDSPayload */]) {\r\n payloadData = _offineSupport[_DYN_CREATE_ONE_DSPAYLOAD /* @min:%2ecreateOneDSPayload */](sentItems);\r\n if (payloadData) {\r\n payloadData[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = criticalCnt;\r\n }\r\n }\r\n else {\r\n payloadData = _constructPayloadData(payloadArr, criticalCnt);\r\n }\r\n var callback = function (res) {\r\n if (!res || !res[_DYN_STATE /* @min:%2estate */]) {\r\n return null;\r\n }\r\n var state = res[_DYN_STATE /* @min:%2estate */];\r\n if (state == 2 /* eBatchStoreStatus.Failure */) {\r\n if (!unload) {\r\n // for unload, just try to add each batch once\r\n arrForEach(sentItems, function (item) {\r\n _addEvtToMap(item);\r\n });\r\n _setupInMemoTimer();\r\n }\r\n else {\r\n // unload, drop events\r\n _evtDropNotification(sentItems, EventsDiscardedReason.NonRetryableStatus);\r\n }\r\n }\r\n else {\r\n // if eBatchStoreStatus is success\r\n _storeNotification(sentItems);\r\n }\r\n };\r\n if (payloadData && _urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */]) {\r\n var promise = _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */].storeBatch(payloadData, callback, unload);\r\n _queueStorageEvent(\"storeBatch\", promise);\r\n }\r\n });\r\n // this is outside loop\r\n if (!hasEvts_1) {\r\n _inMemoFlushTimer && _inMemoFlushTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n return null;\r\n }\r\n function _setSendNextTimer() {\r\n var isOnline = _offlineListener && _offlineListener[_DYN_IS_ONLINE /* @min:%2eisOnline */]();\r\n if (!_sendNextBatchTimer) {\r\n var retryInterval = _retryAt ? Math.max(0, _retryAt - dateNow()) : 0;\r\n var timerValue = Math.max(_maxBatchInterval, retryInterval);\r\n _sendNextBatchTimer = scheduleTimeout(function () {\r\n if (isOnline) {\r\n // is no isCompletelyIdle function is available, assume we can send\r\n if (isFunction(_sender[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */]) && !_sender[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */]()) {\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n else {\r\n var callback = function (res) {\r\n var state = res && res[_DYN_STATE /* @min:%2estate */];\r\n if (state !== 1 /* eBatchSendStatus.Complete */) {\r\n _consecutiveErrors++;\r\n }\r\n var data = res && res[_DYN_DATA /* @min:%2edata */];\r\n if (state === 1 /* eBatchSendStatus.Complete */ && data) {\r\n // if status is complete and data is null, means no data\r\n _sentNotification(data);\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n if (state === 3 /* eBatchSendStatus.Drop */) {\r\n batchDropNotification(_notificationManager, 1, 1 /* eBatchDiscardedReason.NonRetryableStatus */);\r\n }\r\n };\r\n if (_urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */]) {\r\n var promise = _urlCfg.batchHandler[_DYN_SEND_NEXT_BATCH /* @min:%2esendNextBatch */](callback, false, _senderInst);\r\n _queueStorageEvent(\"sendNextBatch\", promise);\r\n }\r\n }\r\n }\r\n else {\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n }\r\n // if offline, do nothing;\r\n }, timerValue);\r\n _sendNextBatchTimer.unref();\r\n }\r\n else {\r\n // only restart it when online\r\n if (isOnline) {\r\n _sendNextBatchTimer.enabled = true;\r\n _sendNextBatchTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n // if offline, do noting\r\n }\r\n }\r\n function _clearScheduledTimer() {\r\n _inMemoFlushTimer && _inMemoFlushTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n _inMemoFlushTimer = null;\r\n _sendNextBatchTimer = null;\r\n }\r\n function _queueStorageEvent(taskName, task) {\r\n if (_taskScheduler) {\r\n _taskScheduler.queue(function () {\r\n return task;\r\n }, taskName).catch(function (reason) {\r\n // Just handling any rejection to avoid an unhandled rejection event\r\n });\r\n }\r\n }\r\n function _setRetryTime(linearFactor) {\r\n if (linearFactor === void 0) { linearFactor = 1; }\r\n var SlotDelayInSeconds = 10;\r\n var delayInSeconds;\r\n if (_consecutiveErrors <= 1) {\r\n delayInSeconds = SlotDelayInSeconds;\r\n }\r\n else {\r\n var backOffSlot = (Math.pow(2, _consecutiveErrors) - 1) / 2;\r\n // tslint:disable-next-line:insecure-random\r\n var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\r\n backOffDelay = linearFactor * backOffDelay;\r\n delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\r\n }\r\n // TODO: Log the backoff time like the C# version does.\r\n var retryAfterTimeSpan = dateNow() + (delayInSeconds * 1000);\r\n // TODO: Log the retry at time like the C# version does.\r\n _retryAt = retryAfterTimeSpan;\r\n }\r\n function _getCoreItemCtx(coreConfig, core, extensions, pluginChain) {\r\n if (coreConfig) {\r\n // Make sure the extensionConfig exists\r\n coreConfig.extensionConfig = coreConfig.extensionConfig || {};\r\n }\r\n if (!pluginChain && core) {\r\n // Get the first plugin from the core\r\n pluginChain = core.getProcessTelContext().getNext();\r\n }\r\n var nextPlugin = null;\r\n var rootNext = _self._getTelCtx().getNext();\r\n if (rootNext) {\r\n nextPlugin = rootNext.getPlugin();\r\n }\r\n return createProcessTelemetryContext(pluginChain, coreConfig, core, nextPlugin);\r\n }\r\n function _getPayload(evt) {\r\n try {\r\n if (evt) {\r\n return _offineSupport && _offineSupport.serialize(evt, _convertUndefined);\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n return null;\r\n }\r\n function _constructPayloadData(payloadArr, criticalCnt) {\r\n try {\r\n if (!_offineSupport) {\r\n return null;\r\n }\r\n var cnt = criticalCnt || 0;\r\n var payload = _offineSupport.batch(payloadArr);\r\n var payloadData = _offineSupport.createPayload && _offineSupport.createPayload(payload);\r\n if (payloadData) {\r\n payloadData[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = cnt;\r\n return payloadData;\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n return null;\r\n }\r\n function _createUrlConfig(coreConfig, core, extensions, pluginChain) {\r\n _self._addHook(onConfigChange(coreConfig, function (details) {\r\n if (!isString(coreConfig[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */]) || !isString(coreConfig.endpointUrl)) {\r\n // if ikey or endpointUrl is promise, delay initialization\r\n _self.pause();\r\n return;\r\n }\r\n if (_paused) {\r\n _self.resume();\r\n }\r\n var storageConfig = null;\r\n var theConfig = details.cfg;\r\n var ctx = createProcessTelemetryContext(null, theConfig, core);\r\n storageConfig = ctx.getExtCfg(_self.identifier, defaultOfflineChannelConfig);\r\n // let channelIds = storageConfig.primaryOnlineChannelId;\r\n var onlineUrl = null;\r\n var channel = _getDependencyPlugin(coreConfig, core);\r\n if (!!channel.isInitialized() && isFunction(channel[_DYN_GET_OFFLINE_SUPPORT /* @min:%2egetOfflineSupport */])) {\r\n _offineSupport = channel[_DYN_GET_OFFLINE_SUPPORT /* @min:%2egetOfflineSupport */]();\r\n onlineUrl = isFunction(_offineSupport && _offineSupport.getUrl) && _offineSupport.getUrl();\r\n }\r\n else {\r\n return;\r\n }\r\n _overrideIkey = storageConfig[_DYN_OVERRIDE_INSTRUMENTA1 /* @min:%2eoverrideInstrumentationKey */];\r\n var urlConfig = _urlCfg;\r\n var curUrl = onlineUrl || coreConfig.endpointUrl || _endpoint;\r\n // NOTE: should add default endpoint value to core as well\r\n if (curUrl !== _endpoint) {\r\n var coreRootCtx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain);\r\n var providerContext = {\r\n itemCtx: coreRootCtx,\r\n storageConfig: storageConfig,\r\n id: _self.id,\r\n endpoint: curUrl,\r\n notificationMgr: _notificationManager\r\n };\r\n var oriHandler = _urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */];\r\n try {\r\n oriHandler && oriHandler[_DYN_TEARDOWN /* @min:%2eteardown */]();\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n var handler = new OfflineBatchHandler(_self[_DYN_DIAG_LOG /* @min:%2ediagLog */](), _self._unloadHooks);\r\n handler[_DYN_INITIALIZE /* @min:%2einitialize */](providerContext);\r\n urlConfig = {\r\n iKey: coreConfig[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */],\r\n url: curUrl,\r\n minPersistenceCacheLevel: storageConfig.minPersistenceLevel,\r\n coreRootCtx: coreRootCtx,\r\n providerContext: providerContext,\r\n batchHandler: handler\r\n };\r\n _evtsLimitInMemo = storageConfig.eventsLimitInMem;\r\n _inMemoMap = _inMemoMap || {};\r\n var newMap_1 = {};\r\n // transfer previous events to new buffer\r\n arrForEach(PersistenceKeys, function (key) {\r\n // when init map, we will initize a in memo batch for each EventPersistence key\r\n // evts to be transferred to new inMemo map\r\n var evts = null;\r\n if (_inMemoMap && _inMemoMap[key]) {\r\n var inMemoBatch = _inMemoMap[key];\r\n var curEvts = inMemoBatch && inMemoBatch[_DYN_GET_ITEMS /* @min:%2egetItems */]();\r\n if (curEvts && curEvts[_DYN_LENGTH /* @min:%2elength */]) {\r\n evts = arrSlice(curEvts);\r\n inMemoBatch && inMemoBatch[_DYN_CLEAR /* @min:%2eclear */]();\r\n }\r\n }\r\n newMap_1[key] = new InMemoryBatch(_self[_DYN_DIAG_LOG /* @min:%2ediagLog */](), curUrl, evts, _evtsLimitInMemo);\r\n });\r\n _inMemoMap = newMap_1;\r\n _inMemoTimerOut = storageConfig.inMemoMaxTime;\r\n var onlineConfig = ctx.getExtCfg(_primaryChannelId, {}) || {};\r\n _convertUndefined = onlineConfig.convertUndefined;\r\n _endpoint = curUrl;\r\n _setRetryTime();\r\n _maxBatchInterval = storageConfig.maxSentBatchInterval;\r\n _maxBatchSize = storageConfig.maxBatchsize;\r\n _splitEvts = storageConfig.splitEvts;\r\n }\r\n _urlCfg = urlConfig;\r\n _endpoint = curUrl;\r\n }));\r\n }\r\n function _getDependencyPlugin(coreConfig, core) {\r\n if (!_dependencyPlugin) {\r\n var ctx = createProcessTelemetryContext(null, coreConfig, core);\r\n var storageConfig = ctx.getExtCfg(_self.identifier, defaultOfflineChannelConfig);\r\n var channelIds = storageConfig.primaryOnlineChannelId;\r\n if (channelIds && channelIds[_DYN_LENGTH /* @min:%2elength */]) {\r\n arrForEach(channelIds, function (id) {\r\n var plugin = core.getPlugin(id);\r\n var channel = plugin && plugin.plugin;\r\n if (channel) {\r\n _dependencyPlugin = channel;\r\n return;\r\n }\r\n });\r\n }\r\n }\r\n return _dependencyPlugin;\r\n }\r\n function _hasEvts() {\r\n var hasEvts = false;\r\n objForEachKey(_inMemoMap, function (key) {\r\n var inMemoBatch = _inMemoMap[key];\r\n if (inMemoBatch && inMemoBatch.count()) {\r\n hasEvts = true;\r\n return -1;\r\n }\r\n });\r\n return hasEvts;\r\n }\r\n function _addEvtToMap(item) {\r\n // if split evts is false, all events will be saved into EventPersistence.Normal batch\r\n var mapKey = EventPersistence[_DYN__NORMAL /* @min:%2eNormal */];\r\n if (_splitEvts && item[_DYN_PERSISTENCE /* @min:%2epersistence */]) {\r\n mapKey = item[_DYN_PERSISTENCE /* @min:%2epersistence */];\r\n }\r\n var inMemoBatch = _inMemoMap[mapKey];\r\n return inMemoBatch[_DYN_ADD_EVENT /* @min:%2eaddEvent */](item);\r\n }\r\n function _callNotification(evtName, theArgs) {\r\n callNotification(_notificationManager, evtName, theArgs);\r\n }\r\n function _evtDropNotification(events, reason) {\r\n if (events && events[_DYN_LENGTH /* @min:%2elength */]) {\r\n _callNotification(EVT_DISCARD_STR, [events, reason]);\r\n }\r\n return;\r\n }\r\n function _sentNotification(batch) {\r\n if (batch && batch[_DYN_DATA /* @min:%2edata */]) {\r\n _callNotification(EVT_SENT_STR, [batch]);\r\n }\r\n return;\r\n }\r\n function _storeNotification(events) {\r\n if (events && events[_DYN_LENGTH /* @min:%2elength */]) {\r\n _callNotification(EVT_STORE_STR, [events]);\r\n }\r\n return;\r\n }\r\n });\r\n return _this;\r\n }\r\n /* ================================================================================================================\r\n * DO NOT add any code to these empty implementations as any code defined here will be removed, as\r\n * this class is using @dynamicProto which will implement the methods during the execution of the\r\n * dynamicProto() in the constructor.\r\n *\r\n * The final generated files will also have these implementations removed as part of the packaging process.\r\n *\r\n * These empty definitions exists only to keep the generated TypeScript definition files aligned with the\r\n * actual resulting implementation, this is so that TS is still happy to create extension classes from the\r\n * resulting definitions.\r\n *\r\n * This also keeps the generated *.d.ts files and documentation the same as they where prior to using dynamicProto()\r\n */\r\n /**\r\n * The function does the initial set up. It adds a notification listener to determine which events to remove.\r\n * @param coreConfig - The core configuration.\r\n * @param core - The AppInsights core.\r\n * @param extensions - An array of all the plugins being used.\r\n */\r\n OfflineChannel.prototype.initialize = function (coreConfig, core, extensions, pluginChain) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Process an event to add it to the local storage and then pass it to the next plugin.\r\n * @param event - The event that needs to be stored.\r\n * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\r\n * can optionally use this to access the current core instance or define / pass additional information\r\n * to later plugins (vs appending items to the telemetry item)\r\n */\r\n OfflineChannel.prototype.processTelemetry = function (evt, itemCtx) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n // ================================================================================================================\r\n /**\r\n * Pauses the adding of new events to the plugin. Also calls pause on the next\r\n * plugin.\r\n */\r\n OfflineChannel.prototype.pause = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Resumes the adding of new events to the plugin. Also calls resume on\r\n * the next plugin. Adds all events in storage to the next plugin.\r\n */\r\n OfflineChannel.prototype.resume = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Get offline listener\r\n * @returns offline listener\r\n */\r\n OfflineChannel.prototype.getOfflineListener = 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 *No op\r\n */\r\n OfflineChannel.prototype.flush = function (sync, callBack, sendReason) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Flush the batched events synchronously (if possible -- based on configuration).\r\n * Will not flush if the Send has been paused.\r\n */\r\n OfflineChannel.prototype.onunloadFlush = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Flush the next stored event batch\r\n */\r\n OfflineChannel.prototype.sendNextBatch = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n return OfflineChannel;\r\n}(BaseTelemetryPlugin));\r\nexport { OfflineChannel };\r\n//# sourceMappingURL=OfflineChannel.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC,gFAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;8DAkBM;AACN;AACA;;;;;2DAwCM,CAAC;;;;;0BACmB;AAC1B;AACA;AACA"}
1
+ {"version":3,"file":"OfflineChannel.js.map","sources":["OfflineChannel.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\nimport { __extends } from \"tslib\";\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { BreezeChannelIdentifier, EventPersistence, createOfflineListener } from \"@microsoft/applicationinsights-common\";\r\nimport { BaseTelemetryPlugin, EventsDiscardedReason, _throwInternal, arrForEach, createProcessTelemetryContext, createUniqueNamespace, dateNow, mergeEvtNamespace, onConfigChange, runTargetUnload } from \"@microsoft/applicationinsights-core-js\";\r\nimport { createAsyncPromise, createTaskScheduler } from \"@nevware21/ts-async\";\r\nimport { arrSlice, isFunction, isString, objDeepFreeze, objForEachKey, scheduleTimeout } from \"@nevware21/ts-utils\";\r\nimport { EVT_DISCARD_STR, EVT_SENT_STR, EVT_STORE_STR, batchDropNotification, callNotification, isGreaterThanZero, isValidPersistenceLevel } from \"./Helpers/Utils\";\r\nimport { InMemoryBatch } from \"./InMemoryBatch\";\r\nimport { OfflineBatchHandler } from \"./OfflineBatchHandler\";\r\nimport { Sender } from \"./Sender\";\r\nimport { _DYN_ADD_EVENT, _DYN_BATCH_HANDLER, _DYN_CANCEL, _DYN_CLEAR, _DYN_CREATE_ONE_DSPAYLOAD, _DYN_CRITICAL_CNT, _DYN_DATA, _DYN_DIAG_LOG, _DYN_GET_ITEMS, _DYN_GET_OFFLINE_SUPPORT, _DYN_INITIALIZE, _DYN_INSTRUMENTATION_KEY, _DYN_IS_COMPLETELY_IDLE, _DYN_IS_ONLINE, _DYN_LENGTH, _DYN_MIN_PERSISTENCE_CACH0, _DYN_ONUNLOAD_FLUSH, _DYN_OVERRIDE_INSTRUMENTA1, _DYN_PERSISTENCE, _DYN_PROCESS_NEXT, _DYN_PUSH, _DYN_REFRESH, _DYN_SEND_NEXT_BATCH, _DYN_STATE, _DYN_TEARDOWN, _DYN__CRITICAL, _DYN__NORMAL } from \"./__DynamicConstants\";\r\nvar version = '0.3.5-nightly3.2502-02';\r\nvar DefaultOfflineIdentifier = \"OfflineChannel\";\r\nvar DefaultBatchInterval = 15000;\r\nvar DefaultInMemoMaxTime = 15000;\r\nvar PostChannelIdentifier = \"PostChannel\";\r\nvar PersistenceKeys = [EventPersistence[_DYN__CRITICAL /* @min:%2eCritical */], EventPersistence.Normal];\r\nvar undefValue = undefined;\r\nvar DefaultBatchSizeLimitBytes = 63000; // approx 64kb (the current Edge, Firefox and Chrome max limit)\r\nvar defaultOfflineChannelConfig = objDeepFreeze({\r\n maxStorageSizeInBytes: { isVal: isGreaterThanZero, v: 5000000 },\r\n storageKey: undefValue,\r\n minPersistenceLevel: { isVal: isValidPersistenceLevel, v: EventPersistence[_DYN__NORMAL /* @min:%2eNormal */] },\r\n providers: [1 /* eStorageProviders.LocalStorage */, 3 /* eStorageProviders.IndexedDb */],\r\n indexedDbName: undefValue,\r\n maxStorageItems: { isVal: isGreaterThanZero, v: undefValue },\r\n inMemoMaxTime: { isVal: isGreaterThanZero, v: DefaultInMemoMaxTime },\r\n maxRetry: { isVal: isGreaterThanZero, v: 1 },\r\n maxBatchsize: { isVal: isGreaterThanZero, v: DefaultBatchSizeLimitBytes },\r\n maxSentBatchInterval: { isVal: isGreaterThanZero, v: DefaultBatchInterval },\r\n primaryOnlineChannelId: [BreezeChannelIdentifier, PostChannelIdentifier],\r\n overrideInstrumentationKey: undefValue,\r\n senderCfg: {},\r\n splitEvts: false\r\n});\r\n//TODO: add tests for sharedAnanlytics\r\nvar OfflineChannel = /** @class */ (function (_super) {\r\n __extends(OfflineChannel, _super);\r\n function OfflineChannel() {\r\n var _this = _super.call(this) || this;\r\n _this.identifier = DefaultOfflineIdentifier;\r\n _this.priority = 1000; // before channel (post = 1011 and sender = 1001, teechannel = 999, localstorage: 1009)\r\n _this.version = version;\r\n dynamicProto(OfflineChannel, _this, function (_self, _base) {\r\n // Internal properties used for tracking the current state, these are \"true\" internal/private properties for this instance\r\n var _hasInitialized;\r\n var _paused;\r\n var _sender;\r\n var _urlCfg;\r\n var _offlineListener;\r\n var _inMemoFlushTimer;\r\n var _inMemoTimerOut;\r\n var _diagLogger;\r\n var _endpoint;\r\n var _maxBatchSize;\r\n var _sendNextBatchTimer;\r\n var _convertUndefined;\r\n var _retryAt;\r\n var _maxBatchInterval;\r\n var _consecutiveErrors;\r\n var _senderInst;\r\n var _taskScheduler;\r\n var _offineSupport;\r\n var _primaryChannelId;\r\n var _overrideIkey;\r\n var _evtsLimitInMemo;\r\n var _notificationManager;\r\n var _isLazyInit;\r\n var _dependencyPlugin;\r\n var _splitEvts;\r\n var _inMemoMap;\r\n _initDefaults();\r\n _self[_DYN_INITIALIZE /* @min:%2einitialize */] = function (coreConfig, core, extensions, pluginChain) {\r\n if (!_hasInitialized) {\r\n _base[_DYN_INITIALIZE /* @min:%2einitialize */](coreConfig, core, extensions);\r\n // keep setting hasInitialized status here to avoid re-initialize\r\n _hasInitialized = true;\r\n _diagLogger = _self[_DYN_DIAG_LOG /* @min:%2ediagLog */]();\r\n var evtNamespace = mergeEvtNamespace(createUniqueNamespace(\"OfflineSender\"), core.evtNamespace && core.evtNamespace());\r\n _offlineListener = createOfflineListener(evtNamespace); // TODO: add config to be passed\r\n _taskScheduler = createTaskScheduler(createAsyncPromise, \"offline channel\");\r\n _notificationManager = core.getNotifyMgr();\r\n }\r\n // TODO: add refresh inside timer until dependency plugin is initialized\r\n scheduleTimeout(function () {\r\n try {\r\n var _dependencyPlugin_1 = _getDependencyPlugin(coreConfig, core);\r\n // make sure that online sender is initialized\r\n if (!_isLazyInit && _dependencyPlugin_1 && _dependencyPlugin_1.isInitialized()) {\r\n _isLazyInit = true;\r\n _createUrlConfig(coreConfig, core, extensions, pluginChain);\r\n var ctx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain);\r\n _sender[_DYN_INITIALIZE /* @min:%2einitialize */](coreConfig, core, ctx, _diagLogger, _primaryChannelId, _self._unloadHooks);\r\n _senderInst = _sender.getXhrInst();\r\n _offlineListener.addListener(function (val) {\r\n if (!val[_DYN_IS_ONLINE /* @min:%2eisOnline */]) {\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n }\r\n else {\r\n _setSendNextTimer();\r\n }\r\n });\r\n // need it for first time to confirm if there are any events\r\n _setSendNextTimer();\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n }, 0);\r\n };\r\n _self.processTelemetry = function (evt, itemCtx) {\r\n try {\r\n var onlineStatus = _offlineListener[_DYN_IS_ONLINE /* @min:%2eisOnline */]();\r\n itemCtx = itemCtx || _self._getTelCtx(itemCtx);\r\n if (!!onlineStatus || !_offineSupport || !_endpoint) {\r\n // if we can't get url from online sender or core config, process next\r\n _self[_DYN_PROCESS_NEXT /* @min:%2eprocessNext */](evt, itemCtx);\r\n return;\r\n }\r\n if (_hasInitialized && !_paused) {\r\n var shouldProcess = true;\r\n if (isFunction(_offineSupport.shouldProcess)) {\r\n shouldProcess = _offineSupport.shouldProcess(evt);\r\n }\r\n if (!shouldProcess) {\r\n _self[_DYN_PROCESS_NEXT /* @min:%2eprocessNext */](evt, itemCtx);\r\n return;\r\n }\r\n var item = evt;\r\n //TODO: add function to better get level\r\n item.persistence = item.persistence || (item.baseData && item.baseData.persistence) || EventPersistence[_DYN__NORMAL /* @min:%2eNormal */]; // in case the level is in baseData\r\n if (_shouldCacheEvent(_urlCfg, item) && _inMemoMap) {\r\n if (_overrideIkey) {\r\n item.iKey = _overrideIkey;\r\n }\r\n var added = _addEvtToMap(item);\r\n // inMemo is full\r\n if (!added) {\r\n _flushInMemoItems(false, item[_DYN_PERSISTENCE /* @min:%2epersistence */]);\r\n var retry = _addEvtToMap(item);\r\n if (!retry) {\r\n _evtDropNotification([evt], EventsDiscardedReason.QueueFull);\r\n _throwInternal(_diagLogger, 2 /* eLoggingSeverity.WARNING */, 105 /* _eInternalMessageId.InMemoryStorageBufferFull */, \"Maximum offline in-memory buffer size reached\", true);\r\n }\r\n }\r\n // start timer when the first should-cache event added\r\n _setupInMemoTimer();\r\n }\r\n else {\r\n // if should not cache,send event drop notification\r\n _evtDropNotification([item], EventsDiscardedReason.InvalidEvent);\r\n }\r\n return;\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n // hand off the telemetry item to the next plugin\r\n _self[_DYN_PROCESS_NEXT /* @min:%2eprocessNext */](evt, itemCtx);\r\n };\r\n _self.pause = function () {\r\n _paused = true;\r\n _clearScheduledTimer();\r\n _consecutiveErrors = 0;\r\n _retryAt = null;\r\n };\r\n _self.resume = function () {\r\n _paused = false;\r\n _clearScheduledTimer();\r\n _setupInMemoTimer();\r\n _setSendNextTimer();\r\n };\r\n _self[_DYN_ONUNLOAD_FLUSH /* @min:%2eonunloadFlush */] = function () {\r\n if (!_paused) {\r\n while (_hasEvts()) {\r\n _flushInMemoItems(true);\r\n }\r\n // TODO: unloadprovider might send events out of order\r\n }\r\n };\r\n _self.flush = function (sync, callBack, sendReason) {\r\n // TODO: should we implement normal flush\r\n return _self[_DYN_ONUNLOAD_FLUSH /* @min:%2eonunloadFlush */]();\r\n };\r\n _self.getOfflineListener = function () {\r\n return _offlineListener;\r\n };\r\n _self[_DYN_SEND_NEXT_BATCH /* @min:%2esendNextBatch */] = function () {\r\n // TODO: add callback function\r\n return _offineSupport && _setSendNextTimer();\r\n };\r\n _self._doTeardown = function (unloadCtx, unloadState) {\r\n _self[_DYN_ONUNLOAD_FLUSH /* @min:%2eonunloadFlush */]();\r\n _offlineListener && runTargetUnload(_offlineListener, false);\r\n var handler = _urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */];\r\n handler && handler[_DYN_TEARDOWN /* @min:%2eteardown */]();\r\n _clearScheduledTimer();\r\n _initDefaults();\r\n };\r\n _self[\"_getDbgPlgTargets\"] = function () {\r\n return [_urlCfg, _inMemoMap, _senderInst, _inMemoFlushTimer, _sendNextBatchTimer];\r\n };\r\n function _initDefaults() {\r\n _hasInitialized = false;\r\n _paused = false;\r\n _sender = new Sender();\r\n _urlCfg = null;\r\n _offlineListener = null;\r\n _diagLogger = null;\r\n _endpoint = null;\r\n _convertUndefined = undefValue;\r\n _maxBatchSize = null;\r\n _sendNextBatchTimer = null;\r\n _consecutiveErrors = null;\r\n _retryAt = null;\r\n _maxBatchInterval = null;\r\n _senderInst = null;\r\n _offineSupport = null;\r\n _primaryChannelId = null;\r\n _overrideIkey = null;\r\n _evtsLimitInMemo = null;\r\n _isLazyInit = false;\r\n _dependencyPlugin = null;\r\n _splitEvts = false;\r\n _inMemoMap = null;\r\n }\r\n function _shouldCacheEvent(urlConfig, item) {\r\n if ((item[_DYN_PERSISTENCE /* @min:%2epersistence */]) < urlConfig[_DYN_MIN_PERSISTENCE_CACH0 /* @min:%2eminPersistenceCacheLevel */]) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n function _setupInMemoTimer() {\r\n if (!_inMemoFlushTimer) {\r\n _inMemoFlushTimer = scheduleTimeout(function () {\r\n _flushInMemoItems();\r\n var hasEvts = _hasEvts();\r\n if (hasEvts && _inMemoFlushTimer) {\r\n _inMemoFlushTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n _setSendNextTimer();\r\n }, _inMemoTimerOut);\r\n _inMemoFlushTimer.unref();\r\n }\r\n else {\r\n // Restart the timer if not already running https://nevware21.github.io/ts-utils/typedoc/interfaces/ITimerHandler.html#enabled\r\n _inMemoFlushTimer.enabled = true;\r\n }\r\n }\r\n //flush only flush max batch size event, may still have events lefts\r\n function _flushInMemoItems(unload, mapKey) {\r\n try {\r\n // TODO: add while loop to flush everything\r\n var hasEvts_1 = false;\r\n // can use objForEachKey(_inMemoMap, (key)), but keys returned by this function is always string\r\n arrForEach(PersistenceKeys, function (key) {\r\n var inMemoBatch = _inMemoMap[key];\r\n var inMemo = inMemoBatch;\r\n var evts = inMemo && inMemo[_DYN_GET_ITEMS /* @min:%2egetItems */]();\r\n if (!evts || !evts[_DYN_LENGTH /* @min:%2elength */]) {\r\n return;\r\n }\r\n if (_splitEvts && mapKey && mapKey !== key) {\r\n // if split evts is set to true\r\n // specific mapkey is defined\r\n // for key !== mapkey, only check if there are any events left in order to refresh timer\r\n hasEvts_1 = hasEvts_1 || !!evts[_DYN_LENGTH /* @min:%2elength */];\r\n return;\r\n }\r\n var payloadArr = [];\r\n var size = 0;\r\n var idx = -1;\r\n var criticalCnt = 0;\r\n arrForEach(evts, function (evt, index) {\r\n var curEvt = evt;\r\n idx = index;\r\n var payload = _getPayload(curEvt);\r\n size += payload[_DYN_LENGTH /* @min:%2elength */];\r\n if (size > _maxBatchSize) {\r\n return;\r\n }\r\n if (curEvt.persistence == EventPersistence[_DYN__CRITICAL /* @min:%2eCritical */]) {\r\n criticalCnt++;\r\n }\r\n idx = index;\r\n payloadArr[_DYN_PUSH /* @min:%2epush */](payload);\r\n });\r\n if (!payloadArr[_DYN_LENGTH /* @min:%2elength */]) {\r\n return;\r\n }\r\n var sentItems = evts.slice(0, idx + 1);\r\n if (idx + 1 < evts[_DYN_LENGTH /* @min:%2elength */]) {\r\n // keep track if there is any remaining events\r\n hasEvts_1 = true;\r\n }\r\n _inMemoMap[key] = inMemoBatch.createNew(_endpoint, arrSlice(inMemo[_DYN_GET_ITEMS /* @min:%2egetItems */](), idx + 1), _evtsLimitInMemo);\r\n var payloadData = null;\r\n if (_offineSupport && _offineSupport[_DYN_CREATE_ONE_DSPAYLOAD /* @min:%2ecreateOneDSPayload */]) {\r\n payloadData = _offineSupport[_DYN_CREATE_ONE_DSPAYLOAD /* @min:%2ecreateOneDSPayload */](sentItems);\r\n if (payloadData) {\r\n payloadData[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = criticalCnt;\r\n }\r\n }\r\n else {\r\n payloadData = _constructPayloadData(payloadArr, criticalCnt);\r\n }\r\n var callback = function (res) {\r\n if (!res || !res[_DYN_STATE /* @min:%2estate */]) {\r\n return null;\r\n }\r\n var state = res[_DYN_STATE /* @min:%2estate */];\r\n if (state == 2 /* eBatchStoreStatus.Failure */) {\r\n if (!unload) {\r\n // for unload, just try to add each batch once\r\n arrForEach(sentItems, function (item) {\r\n _addEvtToMap(item);\r\n });\r\n _setupInMemoTimer();\r\n }\r\n else {\r\n // unload, drop events\r\n _evtDropNotification(sentItems, EventsDiscardedReason.NonRetryableStatus);\r\n }\r\n }\r\n else {\r\n // if eBatchStoreStatus is success\r\n _storeNotification(sentItems);\r\n }\r\n };\r\n if (payloadData && _urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */]) {\r\n var promise = _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */].storeBatch(payloadData, callback, unload);\r\n _queueStorageEvent(\"storeBatch\", promise);\r\n }\r\n });\r\n // this is outside loop\r\n if (!hasEvts_1) {\r\n _inMemoFlushTimer && _inMemoFlushTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n return null;\r\n }\r\n function _setSendNextTimer() {\r\n var isOnline = _offlineListener && _offlineListener[_DYN_IS_ONLINE /* @min:%2eisOnline */]();\r\n if (!_sendNextBatchTimer) {\r\n var retryInterval = _retryAt ? Math.max(0, _retryAt - dateNow()) : 0;\r\n var timerValue = Math.max(_maxBatchInterval, retryInterval);\r\n _sendNextBatchTimer = scheduleTimeout(function () {\r\n if (isOnline) {\r\n // is no isCompletelyIdle function is available, assume we can send\r\n if (isFunction(_sender[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */]) && !_sender[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */]()) {\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n else {\r\n var callback = function (res) {\r\n var state = res && res[_DYN_STATE /* @min:%2estate */];\r\n if (state !== 1 /* eBatchSendStatus.Complete */) {\r\n _consecutiveErrors++;\r\n }\r\n var data = res && res[_DYN_DATA /* @min:%2edata */];\r\n if (state === 1 /* eBatchSendStatus.Complete */ && data) {\r\n // if status is complete and data is null, means no data\r\n _sentNotification(data);\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n if (state === 3 /* eBatchSendStatus.Drop */) {\r\n batchDropNotification(_notificationManager, 1, 1 /* eBatchDiscardedReason.NonRetryableStatus */);\r\n }\r\n };\r\n if (_urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */]) {\r\n var promise = _urlCfg.batchHandler[_DYN_SEND_NEXT_BATCH /* @min:%2esendNextBatch */](callback, false, _senderInst);\r\n _queueStorageEvent(\"sendNextBatch\", promise);\r\n }\r\n }\r\n }\r\n else {\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n }\r\n // if offline, do nothing;\r\n }, timerValue);\r\n _sendNextBatchTimer.unref();\r\n }\r\n else {\r\n // only restart it when online\r\n if (isOnline) {\r\n _sendNextBatchTimer.enabled = true;\r\n _sendNextBatchTimer[_DYN_REFRESH /* @min:%2erefresh */]();\r\n }\r\n // if offline, do noting\r\n }\r\n }\r\n function _clearScheduledTimer() {\r\n _inMemoFlushTimer && _inMemoFlushTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n _sendNextBatchTimer && _sendNextBatchTimer[_DYN_CANCEL /* @min:%2ecancel */]();\r\n _inMemoFlushTimer = null;\r\n _sendNextBatchTimer = null;\r\n }\r\n function _queueStorageEvent(taskName, task) {\r\n if (_taskScheduler) {\r\n _taskScheduler.queue(function () {\r\n return task;\r\n }, taskName).catch(function (reason) {\r\n // Just handling any rejection to avoid an unhandled rejection event\r\n });\r\n }\r\n }\r\n function _setRetryTime(linearFactor) {\r\n if (linearFactor === void 0) { linearFactor = 1; }\r\n var SlotDelayInSeconds = 10;\r\n var delayInSeconds;\r\n if (_consecutiveErrors <= 1) {\r\n delayInSeconds = SlotDelayInSeconds;\r\n }\r\n else {\r\n var backOffSlot = (Math.pow(2, _consecutiveErrors) - 1) / 2;\r\n // tslint:disable-next-line:insecure-random\r\n var backOffDelay = Math.floor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\r\n backOffDelay = linearFactor * backOffDelay;\r\n delayInSeconds = Math.max(Math.min(backOffDelay, 3600), SlotDelayInSeconds);\r\n }\r\n // TODO: Log the backoff time like the C# version does.\r\n var retryAfterTimeSpan = dateNow() + (delayInSeconds * 1000);\r\n // TODO: Log the retry at time like the C# version does.\r\n _retryAt = retryAfterTimeSpan;\r\n }\r\n function _getCoreItemCtx(coreConfig, core, extensions, pluginChain) {\r\n if (coreConfig) {\r\n // Make sure the extensionConfig exists\r\n coreConfig.extensionConfig = coreConfig.extensionConfig || {};\r\n }\r\n if (!pluginChain && core) {\r\n // Get the first plugin from the core\r\n pluginChain = core.getProcessTelContext().getNext();\r\n }\r\n var nextPlugin = null;\r\n var rootNext = _self._getTelCtx().getNext();\r\n if (rootNext) {\r\n nextPlugin = rootNext.getPlugin();\r\n }\r\n return createProcessTelemetryContext(pluginChain, coreConfig, core, nextPlugin);\r\n }\r\n function _getPayload(evt) {\r\n try {\r\n if (evt) {\r\n return _offineSupport && _offineSupport.serialize(evt, _convertUndefined);\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n return null;\r\n }\r\n function _constructPayloadData(payloadArr, criticalCnt) {\r\n try {\r\n if (!_offineSupport) {\r\n return null;\r\n }\r\n var cnt = criticalCnt || 0;\r\n var payload = _offineSupport.batch(payloadArr);\r\n var payloadData = _offineSupport.createPayload && _offineSupport.createPayload(payload);\r\n if (payloadData) {\r\n payloadData[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = cnt;\r\n return payloadData;\r\n }\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n return null;\r\n }\r\n function _createUrlConfig(coreConfig, core, extensions, pluginChain) {\r\n _self._addHook(onConfigChange(coreConfig, function (details) {\r\n if (!isString(coreConfig[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */]) || !isString(coreConfig.endpointUrl)) {\r\n // if ikey or endpointUrl is promise, delay initialization\r\n _self.pause();\r\n return;\r\n }\r\n if (_paused) {\r\n _self.resume();\r\n }\r\n var storageConfig = null;\r\n var theConfig = details.cfg;\r\n var ctx = createProcessTelemetryContext(null, theConfig, core);\r\n storageConfig = ctx.getExtCfg(_self.identifier, defaultOfflineChannelConfig);\r\n // let channelIds = storageConfig.primaryOnlineChannelId;\r\n var onlineUrl = null;\r\n var channel = _getDependencyPlugin(coreConfig, core);\r\n if (!!channel.isInitialized() && isFunction(channel[_DYN_GET_OFFLINE_SUPPORT /* @min:%2egetOfflineSupport */])) {\r\n _offineSupport = channel[_DYN_GET_OFFLINE_SUPPORT /* @min:%2egetOfflineSupport */]();\r\n onlineUrl = isFunction(_offineSupport && _offineSupport.getUrl) && _offineSupport.getUrl();\r\n }\r\n else {\r\n return;\r\n }\r\n _overrideIkey = storageConfig[_DYN_OVERRIDE_INSTRUMENTA1 /* @min:%2eoverrideInstrumentationKey */];\r\n var urlConfig = _urlCfg;\r\n var curUrl = onlineUrl || coreConfig.endpointUrl || _endpoint;\r\n // NOTE: should add default endpoint value to core as well\r\n if (curUrl !== _endpoint) {\r\n var coreRootCtx = _getCoreItemCtx(coreConfig, core, extensions, pluginChain);\r\n var providerContext = {\r\n itemCtx: coreRootCtx,\r\n storageConfig: storageConfig,\r\n id: _self.id,\r\n endpoint: curUrl,\r\n notificationMgr: _notificationManager\r\n };\r\n var oriHandler = _urlCfg && _urlCfg[_DYN_BATCH_HANDLER /* @min:%2ebatchHandler */];\r\n try {\r\n oriHandler && oriHandler[_DYN_TEARDOWN /* @min:%2eteardown */]();\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n var handler = new OfflineBatchHandler(_self[_DYN_DIAG_LOG /* @min:%2ediagLog */](), _self._unloadHooks);\r\n handler[_DYN_INITIALIZE /* @min:%2einitialize */](providerContext);\r\n urlConfig = {\r\n iKey: coreConfig[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */],\r\n url: curUrl,\r\n minPersistenceCacheLevel: storageConfig.minPersistenceLevel,\r\n coreRootCtx: coreRootCtx,\r\n providerContext: providerContext,\r\n batchHandler: handler\r\n };\r\n _evtsLimitInMemo = storageConfig.eventsLimitInMem;\r\n _inMemoMap = _inMemoMap || {};\r\n var newMap_1 = {};\r\n // transfer previous events to new buffer\r\n arrForEach(PersistenceKeys, function (key) {\r\n // when init map, we will initize a in memo batch for each EventPersistence key\r\n // evts to be transferred to new inMemo map\r\n var evts = null;\r\n if (_inMemoMap && _inMemoMap[key]) {\r\n var inMemoBatch = _inMemoMap[key];\r\n var curEvts = inMemoBatch && inMemoBatch[_DYN_GET_ITEMS /* @min:%2egetItems */]();\r\n if (curEvts && curEvts[_DYN_LENGTH /* @min:%2elength */]) {\r\n evts = arrSlice(curEvts);\r\n inMemoBatch && inMemoBatch[_DYN_CLEAR /* @min:%2eclear */]();\r\n }\r\n }\r\n newMap_1[key] = new InMemoryBatch(_self[_DYN_DIAG_LOG /* @min:%2ediagLog */](), curUrl, evts, _evtsLimitInMemo);\r\n });\r\n _inMemoMap = newMap_1;\r\n _inMemoTimerOut = storageConfig.inMemoMaxTime;\r\n var onlineConfig = ctx.getExtCfg(_primaryChannelId, {}) || {};\r\n _convertUndefined = onlineConfig.convertUndefined;\r\n _endpoint = curUrl;\r\n _setRetryTime();\r\n _maxBatchInterval = storageConfig.maxSentBatchInterval;\r\n _maxBatchSize = storageConfig.maxBatchsize;\r\n _splitEvts = storageConfig.splitEvts;\r\n }\r\n _urlCfg = urlConfig;\r\n _endpoint = curUrl;\r\n }));\r\n }\r\n function _getDependencyPlugin(coreConfig, core) {\r\n if (!_dependencyPlugin) {\r\n var ctx = createProcessTelemetryContext(null, coreConfig, core);\r\n var storageConfig = ctx.getExtCfg(_self.identifier, defaultOfflineChannelConfig);\r\n var channelIds = storageConfig.primaryOnlineChannelId;\r\n if (channelIds && channelIds[_DYN_LENGTH /* @min:%2elength */]) {\r\n arrForEach(channelIds, function (id) {\r\n var plugin = core.getPlugin(id);\r\n var channel = plugin && plugin.plugin;\r\n if (channel) {\r\n _dependencyPlugin = channel;\r\n return;\r\n }\r\n });\r\n }\r\n }\r\n return _dependencyPlugin;\r\n }\r\n function _hasEvts() {\r\n var hasEvts = false;\r\n objForEachKey(_inMemoMap, function (key) {\r\n var inMemoBatch = _inMemoMap[key];\r\n if (inMemoBatch && inMemoBatch.count()) {\r\n hasEvts = true;\r\n return -1;\r\n }\r\n });\r\n return hasEvts;\r\n }\r\n function _addEvtToMap(item) {\r\n // if split evts is false, all events will be saved into EventPersistence.Normal batch\r\n var mapKey = EventPersistence[_DYN__NORMAL /* @min:%2eNormal */];\r\n if (_splitEvts && item[_DYN_PERSISTENCE /* @min:%2epersistence */]) {\r\n mapKey = item[_DYN_PERSISTENCE /* @min:%2epersistence */];\r\n }\r\n var inMemoBatch = _inMemoMap[mapKey];\r\n return inMemoBatch[_DYN_ADD_EVENT /* @min:%2eaddEvent */](item);\r\n }\r\n function _callNotification(evtName, theArgs) {\r\n callNotification(_notificationManager, evtName, theArgs);\r\n }\r\n function _evtDropNotification(events, reason) {\r\n if (events && events[_DYN_LENGTH /* @min:%2elength */]) {\r\n _callNotification(EVT_DISCARD_STR, [events, reason]);\r\n }\r\n return;\r\n }\r\n function _sentNotification(batch) {\r\n if (batch && batch[_DYN_DATA /* @min:%2edata */]) {\r\n _callNotification(EVT_SENT_STR, [batch]);\r\n }\r\n return;\r\n }\r\n function _storeNotification(events) {\r\n if (events && events[_DYN_LENGTH /* @min:%2elength */]) {\r\n _callNotification(EVT_STORE_STR, [events]);\r\n }\r\n return;\r\n }\r\n });\r\n return _this;\r\n }\r\n /* ================================================================================================================\r\n * DO NOT add any code to these empty implementations as any code defined here will be removed, as\r\n * this class is using @dynamicProto which will implement the methods during the execution of the\r\n * dynamicProto() in the constructor.\r\n *\r\n * The final generated files will also have these implementations removed as part of the packaging process.\r\n *\r\n * These empty definitions exists only to keep the generated TypeScript definition files aligned with the\r\n * actual resulting implementation, this is so that TS is still happy to create extension classes from the\r\n * resulting definitions.\r\n *\r\n * This also keeps the generated *.d.ts files and documentation the same as they where prior to using dynamicProto()\r\n */\r\n /**\r\n * The function does the initial set up. It adds a notification listener to determine which events to remove.\r\n * @param coreConfig - The core configuration.\r\n * @param core - The AppInsights core.\r\n * @param extensions - An array of all the plugins being used.\r\n */\r\n OfflineChannel.prototype.initialize = function (coreConfig, core, extensions, pluginChain) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Process an event to add it to the local storage and then pass it to the next plugin.\r\n * @param event - The event that needs to be stored.\r\n * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\r\n * can optionally use this to access the current core instance or define / pass additional information\r\n * to later plugins (vs appending items to the telemetry item)\r\n */\r\n OfflineChannel.prototype.processTelemetry = function (evt, itemCtx) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n // ================================================================================================================\r\n /**\r\n * Pauses the adding of new events to the plugin. Also calls pause on the next\r\n * plugin.\r\n */\r\n OfflineChannel.prototype.pause = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Resumes the adding of new events to the plugin. Also calls resume on\r\n * the next plugin. Adds all events in storage to the next plugin.\r\n */\r\n OfflineChannel.prototype.resume = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Get offline listener\r\n * @returns offline listener\r\n */\r\n OfflineChannel.prototype.getOfflineListener = 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 *No op\r\n */\r\n OfflineChannel.prototype.flush = function (sync, callBack, sendReason) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Flush the batched events synchronously (if possible -- based on configuration).\r\n * Will not flush if the Send has been paused.\r\n */\r\n OfflineChannel.prototype.onunloadFlush = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Flush the next stored event batch\r\n */\r\n OfflineChannel.prototype.sendNextBatch = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n return OfflineChannel;\r\n}(BaseTelemetryPlugin));\r\nexport { OfflineChannel };\r\n//# sourceMappingURL=OfflineChannel.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC,gFAAkC;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;8DAkBM;AACN;AACA;;;;;2DAwCM,CAAC;;;;;0BACmB;AAC1B;AACA;AACA"}
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"WebStorageProvider.js.map","sources":["WebStorageProvider.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { getGlobal, getJSON, isNotNullOrUndefined, onConfigChange } from \"@microsoft/applicationinsights-core-js\";\r\nimport { createAsyncRejectedPromise } from \"@nevware21/ts-async\";\r\nimport { batchDropNotification, forEachMap, getEndpointDomain, getTimeFromId, getTimeId } from \"../Helpers/Utils\";\r\nimport { PayloadHelper } from \"../PayloadHelper\";\r\nimport { _DYN_ADD_EVENT, _DYN_CLEAR, _DYN_CRITICAL_CNT, _DYN_DIAG_LOG, _DYN_ENDPOINT, _DYN_EVTS, _DYN_GET_NEXT_BATCH, _DYN_GET_TIME, _DYN_INITIALIZE, _DYN_IN_STORAGE_MAX_TIME, _DYN_IS_ARR, _DYN_ITEM_CTX, _DYN_LAST_ACCESS_TIME, _DYN_LENGTH, _DYN_MAX_CRITICAL_EVTS_DR3, _DYN_NAME, _DYN_NOTIFICATION_MGR, _DYN_PUSH, _DYN_REMOVE_EVENTS, _DYN_REMOVE_ITEM, _DYN_STORAGE_CONFIG, _DYN_STORAGE_KEY_PREFIX, _DYN_SUPPORTS_SYNC_REQUES4, _DYN_TEARDOWN, _DYN__EVENTS_TO_DROP_PER_2 } from \"../__DynamicConstants\";\r\n//TODO: move all const to one file\r\nvar EventsToDropAtOneTime = 10;\r\nvar Version = \"1\";\r\nvar DefaultStorageKey = \"AIOffline\";\r\nvar DefaultMaxStorageSizeInBytes = 5000000;\r\nvar MaxCriticalEvtsDropCnt = 2;\r\nvar DefaultMaxInStorageTime = 604800000; //7*24*60*60*1000 7days\r\n// Private helper methods that are not exposed as class methods\r\nfunction _isQuotaExceeded(storage, e) {\r\n var result = false;\r\n if (e instanceof DOMException) {\r\n // test name field too, because code might not be present\r\n if (e.code === 22 || e[_DYN_NAME /* @min:%2ename */] === \"QuotaExceededError\" || // everything except Firefox\r\n e.code === 1014 || e[_DYN_NAME /* @min:%2ename */] === \"NS_ERROR_DOM_QUOTA_REACHED\") { // Firefox\r\n if (storage && storage[_DYN_LENGTH /* @min:%2elength */] !== 0) {\r\n // acknowledge QuotaExceededError only if there's something already stored\r\n result = true;\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n/**\r\n* Check and return that the storage type exists and has space to use\r\n*/\r\nfunction _getAvailableStorage(type) {\r\n var global = getGlobal() || {};\r\n var storage = null;\r\n try {\r\n storage = (global[type]);\r\n if (storage) {\r\n var x = \"__storage_test__\";\r\n storage.setItem(x, x);\r\n storage[_DYN_REMOVE_ITEM /* @min:%2eremoveItem */](x);\r\n }\r\n }\r\n catch (e) {\r\n if (!_isQuotaExceeded(storage, e)) {\r\n // If not Quota exception then assume not available\r\n storage = null;\r\n }\r\n }\r\n return storage;\r\n}\r\n// will drop batches with no critical evts first\r\nfunction _dropEventsUpToPersistence(maxCnt, events, eventsToDropAtOneTime) {\r\n var dropKeys = [];\r\n var persistenceCnt = 0;\r\n var droppedEvents = 0;\r\n while (persistenceCnt <= maxCnt && droppedEvents < eventsToDropAtOneTime) {\r\n forEachMap(events, function (evt, key) {\r\n if (evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] === persistenceCnt) {\r\n dropKeys[_DYN_PUSH /* @min:%2epush */](key);\r\n droppedEvents++;\r\n }\r\n return (droppedEvents < eventsToDropAtOneTime);\r\n });\r\n if (droppedEvents > 0) {\r\n for (var lp = 0; lp < dropKeys[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n delete events[dropKeys[lp]];\r\n }\r\n return droppedEvents;\r\n }\r\n persistenceCnt++;\r\n }\r\n return droppedEvents;\r\n}\r\nfunction _dropMaxTimeEvents(maxStorageTime, events, eventsToDropAtOneTime, mgr) {\r\n var dropKeys = [];\r\n var droppedEvents = 0;\r\n var currentTime = (new Date())[_DYN_GET_TIME /* @min:%2egetTime */]() + 1; // handle appended random float number\r\n var minStartTime = (currentTime - maxStorageTime);\r\n try {\r\n forEachMap(events, function (evt, key) {\r\n var id = getTimeFromId(key);\r\n if (id <= minStartTime) {\r\n dropKeys[_DYN_PUSH /* @min:%2epush */](key);\r\n droppedEvents++;\r\n }\r\n return (droppedEvents < eventsToDropAtOneTime);\r\n });\r\n if (droppedEvents > 0) {\r\n for (var lp = 0; lp < dropKeys[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n delete events[dropKeys[lp]];\r\n }\r\n if (mgr) {\r\n batchDropNotification(mgr, droppedEvents, 3 /* eBatchDiscardedReason.MaxInStorageTimeExceeded */);\r\n }\r\n return true;\r\n }\r\n }\r\n catch (e) {\r\n // catch drop events error\r\n }\r\n return droppedEvents > 0;\r\n}\r\n/**\r\n * Class that implements storing of events using the WebStorage Api ((window||globalThis||self).localstorage, (window||globalThis||self).sessionStorage).\r\n */\r\nvar WebStorageProvider = /** @class */ (function () {\r\n /**\r\n * Creates a WebStorageProvider using the provider storageType\r\n * @param storageType - The type of Storage provider, normal values are \"localStorage\" or \"sessionStorage\"\r\n */\r\n function WebStorageProvider(storageType, id, unloadHookContainer) {\r\n dynamicProto(WebStorageProvider, this, function (_this) {\r\n var _storage = null;\r\n var _storageKeyPrefix = DefaultStorageKey;\r\n var _maxStorageSizeInBytes = DefaultMaxStorageSizeInBytes;\r\n var _payloadHelper = null;\r\n var _storageKey = null;\r\n var _endpoint = null;\r\n var _maxStorageTime = null;\r\n var _eventDropPerTime = null;\r\n var _maxCriticalCnt = null;\r\n var _notificationManager = null;\r\n _this.id = id;\r\n _storage = _getAvailableStorage(storageType) || null;\r\n _this[\"_getDbgPlgTargets\"] = function () {\r\n return [_storageKey, _maxStorageSizeInBytes, _maxStorageTime];\r\n };\r\n _this[_DYN_INITIALIZE /* @min:%2einitialize */] = function (providerContext, endpointUrl) {\r\n if (!_storage) {\r\n return false;\r\n }\r\n var storageConfig = providerContext[_DYN_STORAGE_CONFIG /* @min:%2estorageConfig */];\r\n var itemCtx = providerContext[_DYN_ITEM_CTX /* @min:%2eitemCtx */];\r\n _payloadHelper = new PayloadHelper(itemCtx[_DYN_DIAG_LOG /* @min:%2ediagLog */]());\r\n _endpoint = getEndpointDomain(endpointUrl || providerContext[_DYN_ENDPOINT /* @min:%2eendpoint */]);\r\n var autoClean = !!storageConfig.autoClean;\r\n _notificationManager = providerContext[_DYN_NOTIFICATION_MGR /* @min:%2enotificationMgr */];\r\n var unloadHook = onConfigChange(storageConfig, function () {\r\n _maxStorageSizeInBytes = storageConfig.maxStorageSizeInBytes || DefaultMaxStorageSizeInBytes; // value checks and defaults should be applied during core config\r\n _maxStorageTime = storageConfig[_DYN_IN_STORAGE_MAX_TIME /* @min:%2einStorageMaxTime */] || DefaultMaxInStorageTime; // TODO: handle 0\r\n var dropNum = storageConfig[_DYN__EVENTS_TO_DROP_PER_2 /* @min:%2eEventsToDropPerTime */];\r\n _eventDropPerTime = isNotNullOrUndefined(dropNum) ? dropNum : EventsToDropAtOneTime;\r\n _maxCriticalCnt = storageConfig[_DYN_MAX_CRITICAL_EVTS_DR3 /* @min:%2emaxCriticalEvtsDropCnt */] || MaxCriticalEvtsDropCnt;\r\n });\r\n unloadHookContainer && unloadHookContainer.add(unloadHook);\r\n // currently, won't handle endpoint change here\r\n // new endpoint will open a new db\r\n // endpoint change will be handled at offline batch level\r\n // namePrefix should not contain any \"_\"\r\n _storageKeyPrefix = storageConfig[_DYN_STORAGE_KEY_PREFIX /* @min:%2estorageKeyPrefix */] || DefaultStorageKey;\r\n _storageKey = _storageKeyPrefix + \"_\" + Version + \"_\" + _endpoint;\r\n if (autoClean) {\r\n // won't wait response here\r\n _this.clean();\r\n }\r\n // TODO: handle versoin Upgrade\r\n //_checkVersion();\r\n return true;\r\n };\r\n /**\r\n * Identifies whether this storage provider support synchronous requests\r\n */\r\n _this[_DYN_SUPPORTS_SYNC_REQUES4 /* @min:%2esupportsSyncRequests */] = function () {\r\n return true;\r\n };\r\n /**\r\n * Get all of the currently cached events from the storage mechanism\r\n */\r\n _this.getAllEvents = function (cnt) {\r\n try {\r\n if (!_storage) {\r\n // if not init, return null\r\n return;\r\n }\r\n return _getEvts(cnt);\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n /**\r\n * Get Next cached event from the storage mechanism\r\n */\r\n _this[_DYN_GET_NEXT_BATCH /* @min:%2egetNextBatch */] = function () {\r\n try {\r\n if (!_storage) {\r\n // if not init, return null\r\n return;\r\n }\r\n // set ordered to true, to make sure to get earliest events first\r\n return _getEvts(1, true);\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n function _getEvts(cnt, ordered) {\r\n var allItems = [];\r\n var theStore = _fetchStoredDb(_storageKey).db;\r\n if (theStore) {\r\n var events = theStore[_DYN_EVTS /* @min:%2eevts */];\r\n forEachMap(events, function (evt) {\r\n if (evt) {\r\n if (evt[_DYN_IS_ARR /* @min:%2eisArr */]) {\r\n evt = _payloadHelper.base64ToArr(evt);\r\n }\r\n allItems[_DYN_PUSH /* @min:%2epush */](evt);\r\n }\r\n if (cnt && allItems && allItems[_DYN_LENGTH /* @min:%2elength */] == cnt) {\r\n return false;\r\n }\r\n return true;\r\n }, ordered);\r\n }\r\n return allItems;\r\n }\r\n /**\r\n * Stores the value into the storage using the specified key.\r\n * @param key - The key value to use for the value\r\n * @param value - The actual value of the request\r\n */\r\n _this[_DYN_ADD_EVENT /* @min:%2eaddEvent */] = function (key, evt, itemCtx) {\r\n try {\r\n var theStore = _fetchStoredDb(_storageKey);\r\n evt.id = evt.id || getTimeId();\r\n evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] || 0;\r\n var events = theStore.db[_DYN_EVTS /* @min:%2eevts */];\r\n var id_1 = evt.id;\r\n if (evt && evt[_DYN_IS_ARR /* @min:%2eisArr */]) {\r\n evt = _payloadHelper.base64ToStr(evt);\r\n }\r\n var preDroppedCnt = 0;\r\n // eslint-disable-next-line no-constant-condition\r\n while (true && evt) {\r\n events[id_1] = evt;\r\n if (_updateStoredDb(theStore)) {\r\n // Database successfully updated\r\n if (preDroppedCnt && _notificationManager) {\r\n // only send notification when batches are updated successfully in storage\r\n batchDropNotification(_notificationManager, preDroppedCnt, 2 /* eBatchDiscardedReason.CleanStorage */);\r\n }\r\n return evt;\r\n }\r\n // Could not not add events to storage assuming its full, so drop events to make space\r\n // or max size exceeded\r\n delete events[id_1];\r\n var droppedCnt = _dropEventsUpToPersistence(_maxCriticalCnt, events, _eventDropPerTime);\r\n preDroppedCnt += droppedCnt;\r\n if (!droppedCnt) {\r\n // Can't free any space for event\r\n return createAsyncRejectedPromise(new Error(\"Unable to free up event space\"));\r\n }\r\n }\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n /**\r\n * Removes the value associated with the provided key\r\n * @param evts - The events to be removed\r\n */\r\n _this[_DYN_REMOVE_EVENTS /* @min:%2eremoveEvents */] = function (evts) {\r\n try {\r\n var theStore = _fetchStoredDb(_storageKey, false);\r\n var currentDb = theStore.db;\r\n if (currentDb) {\r\n var events = currentDb[_DYN_EVTS /* @min:%2eevts */];\r\n try {\r\n for (var i = 0; i < evts[_DYN_LENGTH /* @min:%2elength */]; ++i) {\r\n var evt = evts[i];\r\n delete events[evt.id];\r\n }\r\n // Update takes care of removing the DB if it's completely empty now\r\n if (_updateStoredDb(theStore)) {\r\n return evts;\r\n }\r\n }\r\n catch (e) {\r\n // Storage corrupted\r\n }\r\n // failure here so try and remove db to unblock following events\r\n evts = _clearDatabase(theStore.key);\r\n }\r\n return evts;\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n /**\r\n * Removes all entries from the storage provider for the current endpoint and returns them as part of the response, if there are any.\r\n */\r\n _this[_DYN_CLEAR /* @min:%2eclear */] = function () {\r\n try {\r\n var removedItems_1 = [];\r\n var theStore = _fetchStoredDb(_storageKey, false);\r\n var storedDb = theStore.db;\r\n if (storedDb) {\r\n var events_1 = storedDb[_DYN_EVTS /* @min:%2eevts */];\r\n forEachMap(events_1, function (evt) {\r\n if (evt) {\r\n delete events_1[evt.id];\r\n removedItems_1[_DYN_PUSH /* @min:%2epush */](evt);\r\n }\r\n return true;\r\n });\r\n _updateStoredDb(theStore);\r\n }\r\n return removedItems_1;\r\n }\r\n catch (e) {\r\n // Unable to clear the database\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n _this.clean = function () {\r\n var storeDetails = _fetchStoredDb(_storageKey, false);\r\n var currentDb = storeDetails.db;\r\n if (currentDb) {\r\n var events = currentDb[_DYN_EVTS /* @min:%2eevts */];\r\n try {\r\n var isDropped = _dropMaxTimeEvents(_maxStorageTime, events, _eventDropPerTime, _notificationManager);\r\n if (isDropped) {\r\n return _updateStoredDb(storeDetails);\r\n }\r\n return true;\r\n }\r\n catch (e) {\r\n // should not throw errors here\r\n // because we don't want to block following process\r\n }\r\n return false;\r\n }\r\n };\r\n /**\r\n * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\r\n * This attempts to update the lastAccessTime for any storedDb\r\n */\r\n _this[_DYN_TEARDOWN /* @min:%2eteardown */] = function () {\r\n try {\r\n var theStore = _fetchStoredDb(_storageKey, false);\r\n var storedDb = theStore.db;\r\n if (storedDb) {\r\n // reset the last access time\r\n storedDb[_DYN_LAST_ACCESS_TIME /* @min:%2elastAccessTime */] = 0;\r\n _updateStoredDb(theStore, false);\r\n }\r\n }\r\n catch (e) {\r\n // Add diagnostic logging\r\n }\r\n };\r\n /**\r\n * @ignore\r\n * Creates a new json store with the StorageJSON (may be null), a null db value indicates that the store\r\n * associated with the key is empty and should be removed.\r\n * @param dbKey - The key to associate with the database\r\n * @param db - The database\r\n */\r\n function _newStore(dbKey, db) {\r\n return {\r\n key: dbKey,\r\n db: db\r\n };\r\n }\r\n function _fetchStoredDb(dbKey, returnDefault) {\r\n var _a;\r\n if (returnDefault === void 0) { returnDefault = true; }\r\n var dbToStore = null;\r\n if (_storage) {\r\n var previousDb = _storage.getItem(dbKey);\r\n if (previousDb) {\r\n try {\r\n dbToStore = getJSON().parse(previousDb);\r\n }\r\n catch (e) {\r\n // storage corrupted\r\n _storage[_DYN_REMOVE_ITEM /* @min:%2eremoveItem */](dbKey);\r\n }\r\n }\r\n if (returnDefault && !dbToStore) {\r\n // Create and return a default empty database\r\n dbToStore = (_a = {\r\n evts: {}\r\n },\r\n _a[_DYN_LAST_ACCESS_TIME /* @min:lastAccessTime */] = 0,\r\n _a);\r\n }\r\n }\r\n return _newStore(dbKey, dbToStore);\r\n }\r\n function _updateStoredDb(jsonStore, updateLastAccessTime) {\r\n if (updateLastAccessTime === void 0) { updateLastAccessTime = true; }\r\n //let removeDb = true;\r\n var dbToStore = jsonStore.db;\r\n if (dbToStore) {\r\n if (updateLastAccessTime) {\r\n // Update the last access time\r\n dbToStore.lastAccessTime = (new Date())[_DYN_GET_TIME /* @min:%2egetTime */]();\r\n }\r\n }\r\n try {\r\n var jsonString = getJSON().stringify(dbToStore);\r\n if (jsonString[_DYN_LENGTH /* @min:%2elength */] > _maxStorageSizeInBytes) {\r\n // We can't store the database as it would exceed the configured max size\r\n return false;\r\n }\r\n _storage && _storage.setItem(jsonStore.key, jsonString);\r\n //}\r\n }\r\n catch (e) {\r\n // catch exception due to trying to store or clear JSON\r\n // We could not store the database\r\n return false;\r\n }\r\n return true;\r\n }\r\n function _clearDatabase(dbKey) {\r\n var removedItems = [];\r\n var storeDetails = _fetchStoredDb(dbKey, false);\r\n var currentDb = storeDetails.db;\r\n if (currentDb) {\r\n var events = currentDb[_DYN_EVTS /* @min:%2eevts */];\r\n try {\r\n forEachMap(events, function (evt) {\r\n if (evt) {\r\n removedItems[_DYN_PUSH /* @min:%2epush */](evt);\r\n }\r\n return true;\r\n });\r\n }\r\n catch (e) {\r\n // catch exception due to trying to store or clear JSON\r\n }\r\n // Remove the entire stored database\r\n _storage && _storage[_DYN_REMOVE_ITEM /* @min:%2eremoveItem */](storeDetails.key);\r\n }\r\n return removedItems;\r\n }\r\n });\r\n }\r\n /**\r\n * Initializes the provider using the config\r\n * @param providerContext The provider context that should be used to initialize the provider\r\n * @returns True if the provider is initialized and available for use otherwise false\r\n */\r\n WebStorageProvider.prototype.initialize = function (providerContext) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return false;\r\n };\r\n /**\r\n * Identifies whether this storage provider support synchronous requests\r\n */\r\n WebStorageProvider.prototype.supportsSyncRequests = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return false;\r\n };\r\n /**\r\n * Get all of the currently cached events from the storage mechanism\r\n */\r\n WebStorageProvider.prototype.getAllEvents = function (cnt) {\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 * Get the Next one cached batch from the storage mechanism\r\n */\r\n WebStorageProvider.prototype.getNextBatch = 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 * Stores the value into the storage using the specified key.\r\n * @param key - The key value to use for the value\r\n * @param evt - The actual event of the request\r\n * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\r\n * can optionally use this to access the current core instance or define / pass additional information\r\n * to later plugins (vs appending items to the telemetry item)\r\n */\r\n WebStorageProvider.prototype.addEvent = function (key, evt, itemCtx) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Removes the value associated with the provided key\r\n * @param evts - The events to be removed\r\n */\r\n WebStorageProvider.prototype.removeEvents = function (evts) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Removes all entries from the storage provider, if there are any.\r\n */\r\n WebStorageProvider.prototype.clear = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Removes all entries with stroage time longer than inStorageMaxTime from the storage provider\r\n */\r\n WebStorageProvider.prototype.clean = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\r\n */\r\n WebStorageProvider.prototype.teardown = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n return WebStorageProvider;\r\n}());\r\nexport { WebStorageProvider };\r\n//# sourceMappingURL=WebStorageProvider.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;0DAqEM,CAAC;;;;;8BACuB;AAC9B;AACA;AACA"}
1
+ {"version":3,"file":"WebStorageProvider.js.map","sources":["WebStorageProvider.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { getGlobal, getJSON, isNotNullOrUndefined, onConfigChange } from \"@microsoft/applicationinsights-core-js\";\r\nimport { createAsyncRejectedPromise } from \"@nevware21/ts-async\";\r\nimport { batchDropNotification, forEachMap, getEndpointDomain, getTimeFromId, getTimeId } from \"../Helpers/Utils\";\r\nimport { PayloadHelper } from \"../PayloadHelper\";\r\nimport { _DYN_ADD_EVENT, _DYN_CLEAR, _DYN_CRITICAL_CNT, _DYN_DIAG_LOG, _DYN_ENDPOINT, _DYN_EVTS, _DYN_GET_NEXT_BATCH, _DYN_GET_TIME, _DYN_INITIALIZE, _DYN_IN_STORAGE_MAX_TIME, _DYN_IS_ARR, _DYN_ITEM_CTX, _DYN_LAST_ACCESS_TIME, _DYN_LENGTH, _DYN_MAX_CRITICAL_EVTS_DR3, _DYN_NAME, _DYN_NOTIFICATION_MGR, _DYN_PUSH, _DYN_REMOVE_EVENTS, _DYN_REMOVE_ITEM, _DYN_STORAGE_CONFIG, _DYN_STORAGE_KEY_PREFIX, _DYN_SUPPORTS_SYNC_REQUES4, _DYN_TEARDOWN, _DYN__EVENTS_TO_DROP_PER_2 } from \"../__DynamicConstants\";\r\n//TODO: move all const to one file\r\nvar EventsToDropAtOneTime = 10;\r\nvar Version = \"1\";\r\nvar DefaultStorageKey = \"AIOffline\";\r\nvar DefaultMaxStorageSizeInBytes = 5000000;\r\nvar MaxCriticalEvtsDropCnt = 2;\r\nvar DefaultMaxInStorageTime = 604800000; //7*24*60*60*1000 7days\r\n// Private helper methods that are not exposed as class methods\r\nfunction _isQuotaExceeded(storage, e) {\r\n var result = false;\r\n if (e instanceof DOMException) {\r\n // test name field too, because code might not be present\r\n if (e.code === 22 || e[_DYN_NAME /* @min:%2ename */] === \"QuotaExceededError\" || // everything except Firefox\r\n e.code === 1014 || e[_DYN_NAME /* @min:%2ename */] === \"NS_ERROR_DOM_QUOTA_REACHED\") { // Firefox\r\n if (storage && storage[_DYN_LENGTH /* @min:%2elength */] !== 0) {\r\n // acknowledge QuotaExceededError only if there's something already stored\r\n result = true;\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n/**\r\n* Check and return that the storage type exists and has space to use\r\n*/\r\nfunction _getAvailableStorage(type) {\r\n var global = getGlobal() || {};\r\n var storage = null;\r\n try {\r\n storage = (global[type]);\r\n if (storage) {\r\n var x = \"__storage_test__\";\r\n storage.setItem(x, x);\r\n storage[_DYN_REMOVE_ITEM /* @min:%2eremoveItem */](x);\r\n }\r\n }\r\n catch (e) {\r\n if (!_isQuotaExceeded(storage, e)) {\r\n // If not Quota exception then assume not available\r\n storage = null;\r\n }\r\n }\r\n return storage;\r\n}\r\n// will drop batches with no critical evts first\r\nfunction _dropEventsUpToPersistence(maxCnt, events, eventsToDropAtOneTime) {\r\n var dropKeys = [];\r\n var persistenceCnt = 0;\r\n var droppedEvents = 0;\r\n while (persistenceCnt <= maxCnt && droppedEvents < eventsToDropAtOneTime) {\r\n forEachMap(events, function (evt, key) {\r\n if (evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] === persistenceCnt) {\r\n dropKeys[_DYN_PUSH /* @min:%2epush */](key);\r\n droppedEvents++;\r\n }\r\n return (droppedEvents < eventsToDropAtOneTime);\r\n });\r\n if (droppedEvents > 0) {\r\n for (var lp = 0; lp < dropKeys[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n delete events[dropKeys[lp]];\r\n }\r\n return droppedEvents;\r\n }\r\n persistenceCnt++;\r\n }\r\n return droppedEvents;\r\n}\r\nfunction _dropMaxTimeEvents(maxStorageTime, events, eventsToDropAtOneTime, mgr) {\r\n var dropKeys = [];\r\n var droppedEvents = 0;\r\n var currentTime = (new Date())[_DYN_GET_TIME /* @min:%2egetTime */]() + 1; // handle appended random float number\r\n var minStartTime = (currentTime - maxStorageTime);\r\n try {\r\n forEachMap(events, function (evt, key) {\r\n var id = getTimeFromId(key);\r\n if (id <= minStartTime) {\r\n dropKeys[_DYN_PUSH /* @min:%2epush */](key);\r\n droppedEvents++;\r\n }\r\n return (droppedEvents < eventsToDropAtOneTime);\r\n });\r\n if (droppedEvents > 0) {\r\n for (var lp = 0; lp < dropKeys[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n delete events[dropKeys[lp]];\r\n }\r\n if (mgr) {\r\n batchDropNotification(mgr, droppedEvents, 3 /* eBatchDiscardedReason.MaxInStorageTimeExceeded */);\r\n }\r\n return true;\r\n }\r\n }\r\n catch (e) {\r\n // catch drop events error\r\n }\r\n return droppedEvents > 0;\r\n}\r\n/**\r\n * Class that implements storing of events using the WebStorage Api ((window||globalThis||self).localstorage, (window||globalThis||self).sessionStorage).\r\n */\r\nvar WebStorageProvider = /** @class */ (function () {\r\n /**\r\n * Creates a WebStorageProvider using the provider storageType\r\n * @param storageType - The type of Storage provider, normal values are \"localStorage\" or \"sessionStorage\"\r\n */\r\n function WebStorageProvider(storageType, id, unloadHookContainer) {\r\n dynamicProto(WebStorageProvider, this, function (_this) {\r\n var _storage = null;\r\n var _storageKeyPrefix = DefaultStorageKey;\r\n var _maxStorageSizeInBytes = DefaultMaxStorageSizeInBytes;\r\n var _payloadHelper = null;\r\n var _storageKey = null;\r\n var _endpoint = null;\r\n var _maxStorageTime = null;\r\n var _eventDropPerTime = null;\r\n var _maxCriticalCnt = null;\r\n var _notificationManager = null;\r\n _this.id = id;\r\n _storage = _getAvailableStorage(storageType) || null;\r\n _this[\"_getDbgPlgTargets\"] = function () {\r\n return [_storageKey, _maxStorageSizeInBytes, _maxStorageTime];\r\n };\r\n _this[_DYN_INITIALIZE /* @min:%2einitialize */] = function (providerContext, endpointUrl) {\r\n if (!_storage) {\r\n return false;\r\n }\r\n var storageConfig = providerContext[_DYN_STORAGE_CONFIG /* @min:%2estorageConfig */];\r\n var itemCtx = providerContext[_DYN_ITEM_CTX /* @min:%2eitemCtx */];\r\n _payloadHelper = new PayloadHelper(itemCtx[_DYN_DIAG_LOG /* @min:%2ediagLog */]());\r\n _endpoint = getEndpointDomain(endpointUrl || providerContext[_DYN_ENDPOINT /* @min:%2eendpoint */]);\r\n var autoClean = !!storageConfig.autoClean;\r\n _notificationManager = providerContext[_DYN_NOTIFICATION_MGR /* @min:%2enotificationMgr */];\r\n var unloadHook = onConfigChange(storageConfig, function () {\r\n _maxStorageSizeInBytes = storageConfig.maxStorageSizeInBytes || DefaultMaxStorageSizeInBytes; // value checks and defaults should be applied during core config\r\n _maxStorageTime = storageConfig[_DYN_IN_STORAGE_MAX_TIME /* @min:%2einStorageMaxTime */] || DefaultMaxInStorageTime; // TODO: handle 0\r\n var dropNum = storageConfig[_DYN__EVENTS_TO_DROP_PER_2 /* @min:%2eEventsToDropPerTime */];\r\n _eventDropPerTime = isNotNullOrUndefined(dropNum) ? dropNum : EventsToDropAtOneTime;\r\n _maxCriticalCnt = storageConfig[_DYN_MAX_CRITICAL_EVTS_DR3 /* @min:%2emaxCriticalEvtsDropCnt */] || MaxCriticalEvtsDropCnt;\r\n });\r\n unloadHookContainer && unloadHookContainer.add(unloadHook);\r\n // currently, won't handle endpoint change here\r\n // new endpoint will open a new db\r\n // endpoint change will be handled at offline batch level\r\n // namePrefix should not contain any \"_\"\r\n _storageKeyPrefix = storageConfig[_DYN_STORAGE_KEY_PREFIX /* @min:%2estorageKeyPrefix */] || DefaultStorageKey;\r\n _storageKey = _storageKeyPrefix + \"_\" + Version + \"_\" + _endpoint;\r\n if (autoClean) {\r\n // won't wait response here\r\n _this.clean();\r\n }\r\n // TODO: handle versoin Upgrade\r\n //_checkVersion();\r\n return true;\r\n };\r\n /**\r\n * Identifies whether this storage provider support synchronous requests\r\n */\r\n _this[_DYN_SUPPORTS_SYNC_REQUES4 /* @min:%2esupportsSyncRequests */] = function () {\r\n return true;\r\n };\r\n /**\r\n * Get all of the currently cached events from the storage mechanism\r\n */\r\n _this.getAllEvents = function (cnt) {\r\n try {\r\n if (!_storage) {\r\n // if not init, return null\r\n return;\r\n }\r\n return _getEvts(cnt);\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n /**\r\n * Get Next cached event from the storage mechanism\r\n */\r\n _this[_DYN_GET_NEXT_BATCH /* @min:%2egetNextBatch */] = function () {\r\n try {\r\n if (!_storage) {\r\n // if not init, return null\r\n return;\r\n }\r\n // set ordered to true, to make sure to get earliest events first\r\n return _getEvts(1, true);\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n function _getEvts(cnt, ordered) {\r\n var allItems = [];\r\n var theStore = _fetchStoredDb(_storageKey).db;\r\n if (theStore) {\r\n var events = theStore[_DYN_EVTS /* @min:%2eevts */];\r\n forEachMap(events, function (evt) {\r\n if (evt) {\r\n if (evt[_DYN_IS_ARR /* @min:%2eisArr */]) {\r\n evt = _payloadHelper.base64ToArr(evt);\r\n }\r\n allItems[_DYN_PUSH /* @min:%2epush */](evt);\r\n }\r\n if (cnt && allItems && allItems[_DYN_LENGTH /* @min:%2elength */] == cnt) {\r\n return false;\r\n }\r\n return true;\r\n }, ordered);\r\n }\r\n return allItems;\r\n }\r\n /**\r\n * Stores the value into the storage using the specified key.\r\n * @param key - The key value to use for the value\r\n * @param value - The actual value of the request\r\n */\r\n _this[_DYN_ADD_EVENT /* @min:%2eaddEvent */] = function (key, evt, itemCtx) {\r\n try {\r\n var theStore = _fetchStoredDb(_storageKey);\r\n evt.id = evt.id || getTimeId();\r\n evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] || 0;\r\n var events = theStore.db[_DYN_EVTS /* @min:%2eevts */];\r\n var id_1 = evt.id;\r\n if (evt && evt[_DYN_IS_ARR /* @min:%2eisArr */]) {\r\n evt = _payloadHelper.base64ToStr(evt);\r\n }\r\n var preDroppedCnt = 0;\r\n // eslint-disable-next-line no-constant-condition\r\n while (true && evt) {\r\n events[id_1] = evt;\r\n if (_updateStoredDb(theStore)) {\r\n // Database successfully updated\r\n if (preDroppedCnt && _notificationManager) {\r\n // only send notification when batches are updated successfully in storage\r\n batchDropNotification(_notificationManager, preDroppedCnt, 2 /* eBatchDiscardedReason.CleanStorage */);\r\n }\r\n return evt;\r\n }\r\n // Could not not add events to storage assuming its full, so drop events to make space\r\n // or max size exceeded\r\n delete events[id_1];\r\n var droppedCnt = _dropEventsUpToPersistence(_maxCriticalCnt, events, _eventDropPerTime);\r\n preDroppedCnt += droppedCnt;\r\n if (!droppedCnt) {\r\n // Can't free any space for event\r\n return createAsyncRejectedPromise(new Error(\"Unable to free up event space\"));\r\n }\r\n }\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n /**\r\n * Removes the value associated with the provided key\r\n * @param evts - The events to be removed\r\n */\r\n _this[_DYN_REMOVE_EVENTS /* @min:%2eremoveEvents */] = function (evts) {\r\n try {\r\n var theStore = _fetchStoredDb(_storageKey, false);\r\n var currentDb = theStore.db;\r\n if (currentDb) {\r\n var events = currentDb[_DYN_EVTS /* @min:%2eevts */];\r\n try {\r\n for (var i = 0; i < evts[_DYN_LENGTH /* @min:%2elength */]; ++i) {\r\n var evt = evts[i];\r\n delete events[evt.id];\r\n }\r\n // Update takes care of removing the DB if it's completely empty now\r\n if (_updateStoredDb(theStore)) {\r\n return evts;\r\n }\r\n }\r\n catch (e) {\r\n // Storage corrupted\r\n }\r\n // failure here so try and remove db to unblock following events\r\n evts = _clearDatabase(theStore.key);\r\n }\r\n return evts;\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n /**\r\n * Removes all entries from the storage provider for the current endpoint and returns them as part of the response, if there are any.\r\n */\r\n _this[_DYN_CLEAR /* @min:%2eclear */] = function () {\r\n try {\r\n var removedItems_1 = [];\r\n var theStore = _fetchStoredDb(_storageKey, false);\r\n var storedDb = theStore.db;\r\n if (storedDb) {\r\n var events_1 = storedDb[_DYN_EVTS /* @min:%2eevts */];\r\n forEachMap(events_1, function (evt) {\r\n if (evt) {\r\n delete events_1[evt.id];\r\n removedItems_1[_DYN_PUSH /* @min:%2epush */](evt);\r\n }\r\n return true;\r\n });\r\n _updateStoredDb(theStore);\r\n }\r\n return removedItems_1;\r\n }\r\n catch (e) {\r\n // Unable to clear the database\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n _this.clean = function () {\r\n var storeDetails = _fetchStoredDb(_storageKey, false);\r\n var currentDb = storeDetails.db;\r\n if (currentDb) {\r\n var events = currentDb[_DYN_EVTS /* @min:%2eevts */];\r\n try {\r\n var isDropped = _dropMaxTimeEvents(_maxStorageTime, events, _eventDropPerTime, _notificationManager);\r\n if (isDropped) {\r\n return _updateStoredDb(storeDetails);\r\n }\r\n return true;\r\n }\r\n catch (e) {\r\n // should not throw errors here\r\n // because we don't want to block following process\r\n }\r\n return false;\r\n }\r\n };\r\n /**\r\n * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\r\n * This attempts to update the lastAccessTime for any storedDb\r\n */\r\n _this[_DYN_TEARDOWN /* @min:%2eteardown */] = function () {\r\n try {\r\n var theStore = _fetchStoredDb(_storageKey, false);\r\n var storedDb = theStore.db;\r\n if (storedDb) {\r\n // reset the last access time\r\n storedDb[_DYN_LAST_ACCESS_TIME /* @min:%2elastAccessTime */] = 0;\r\n _updateStoredDb(theStore, false);\r\n }\r\n }\r\n catch (e) {\r\n // Add diagnostic logging\r\n }\r\n };\r\n /**\r\n * @ignore\r\n * Creates a new json store with the StorageJSON (may be null), a null db value indicates that the store\r\n * associated with the key is empty and should be removed.\r\n * @param dbKey - The key to associate with the database\r\n * @param db - The database\r\n */\r\n function _newStore(dbKey, db) {\r\n return {\r\n key: dbKey,\r\n db: db\r\n };\r\n }\r\n function _fetchStoredDb(dbKey, returnDefault) {\r\n var _a;\r\n if (returnDefault === void 0) { returnDefault = true; }\r\n var dbToStore = null;\r\n if (_storage) {\r\n var previousDb = _storage.getItem(dbKey);\r\n if (previousDb) {\r\n try {\r\n dbToStore = getJSON().parse(previousDb);\r\n }\r\n catch (e) {\r\n // storage corrupted\r\n _storage[_DYN_REMOVE_ITEM /* @min:%2eremoveItem */](dbKey);\r\n }\r\n }\r\n if (returnDefault && !dbToStore) {\r\n // Create and return a default empty database\r\n dbToStore = (_a = {\r\n evts: {}\r\n },\r\n _a[_DYN_LAST_ACCESS_TIME /* @min:lastAccessTime */] = 0,\r\n _a);\r\n }\r\n }\r\n return _newStore(dbKey, dbToStore);\r\n }\r\n function _updateStoredDb(jsonStore, updateLastAccessTime) {\r\n if (updateLastAccessTime === void 0) { updateLastAccessTime = true; }\r\n //let removeDb = true;\r\n var dbToStore = jsonStore.db;\r\n if (dbToStore) {\r\n if (updateLastAccessTime) {\r\n // Update the last access time\r\n dbToStore.lastAccessTime = (new Date())[_DYN_GET_TIME /* @min:%2egetTime */]();\r\n }\r\n }\r\n try {\r\n var jsonString = getJSON().stringify(dbToStore);\r\n if (jsonString[_DYN_LENGTH /* @min:%2elength */] > _maxStorageSizeInBytes) {\r\n // We can't store the database as it would exceed the configured max size\r\n return false;\r\n }\r\n _storage && _storage.setItem(jsonStore.key, jsonString);\r\n //}\r\n }\r\n catch (e) {\r\n // catch exception due to trying to store or clear JSON\r\n // We could not store the database\r\n return false;\r\n }\r\n return true;\r\n }\r\n function _clearDatabase(dbKey) {\r\n var removedItems = [];\r\n var storeDetails = _fetchStoredDb(dbKey, false);\r\n var currentDb = storeDetails.db;\r\n if (currentDb) {\r\n var events = currentDb[_DYN_EVTS /* @min:%2eevts */];\r\n try {\r\n forEachMap(events, function (evt) {\r\n if (evt) {\r\n removedItems[_DYN_PUSH /* @min:%2epush */](evt);\r\n }\r\n return true;\r\n });\r\n }\r\n catch (e) {\r\n // catch exception due to trying to store or clear JSON\r\n }\r\n // Remove the entire stored database\r\n _storage && _storage[_DYN_REMOVE_ITEM /* @min:%2eremoveItem */](storeDetails.key);\r\n }\r\n return removedItems;\r\n }\r\n });\r\n }\r\n /**\r\n * Initializes the provider using the config\r\n * @param providerContext - The provider context that should be used to initialize the provider\r\n * @returns True if the provider is initialized and available for use otherwise false\r\n */\r\n WebStorageProvider.prototype.initialize = function (providerContext) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return false;\r\n };\r\n /**\r\n * Identifies whether this storage provider support synchronous requests\r\n */\r\n WebStorageProvider.prototype.supportsSyncRequests = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return false;\r\n };\r\n /**\r\n * Get all of the currently cached events from the storage mechanism\r\n */\r\n WebStorageProvider.prototype.getAllEvents = function (cnt) {\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 * Get the Next one cached batch from the storage mechanism\r\n */\r\n WebStorageProvider.prototype.getNextBatch = 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 * Stores the value into the storage using the specified key.\r\n * @param key - The key value to use for the value\r\n * @param evt - The actual event of the request\r\n * @param itemCtx - This is the context for the current request, ITelemetryPlugin instances\r\n * can optionally use this to access the current core instance or define / pass additional information\r\n * to later plugins (vs appending items to the telemetry item)\r\n */\r\n WebStorageProvider.prototype.addEvent = function (key, evt, itemCtx) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Removes the value associated with the provided key\r\n * @param evts - The events to be removed\r\n */\r\n WebStorageProvider.prototype.removeEvents = function (evts) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Removes all entries from the storage provider, if there are any.\r\n */\r\n WebStorageProvider.prototype.clear = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Removes all entries with stroage time longer than inStorageMaxTime from the storage provider\r\n */\r\n WebStorageProvider.prototype.clean = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return;\r\n };\r\n /**\r\n * Shuts-down the telemetry plugin. This is usually called when telemetry is shut down.\r\n */\r\n WebStorageProvider.prototype.teardown = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n return WebStorageProvider;\r\n}());\r\nexport { WebStorageProvider };\r\n//# sourceMappingURL=WebStorageProvider.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;0DAqEM,CAAC;;;;;8BACuB;AAC9B;AACA;AACA"}
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"Sender.js.map","sources":["Sender.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { BreezeChannelIdentifier, utlSetStoragePrefix } from \"@microsoft/applicationinsights-common\";\r\nimport { SenderPostManager, _throwInternal, createProcessTelemetryContext, formatErrorMessageXdr, getResponseText, onConfigChange, parseResponse, prependTransports } from \"@microsoft/applicationinsights-core-js\";\r\nimport { isFunction } from \"@nevware21/ts-utils\";\r\nimport { _DYN_ENABLE_SEND_PROMISE, _DYN_GET_EXT_CFG, _DYN_INITIALIZE, _DYN_IS_COMPLETELY_IDLE, _DYN_SEND_POST } from \"./__DynamicConstants\";\r\nvar DefaultOfflineIdentifier = \"OfflineChannel\";\r\nvar PostChannelId = \"PostChannel\";\r\nfunction isOverrideFn(httpXHROverride) {\r\n return httpXHROverride && httpXHROverride[_DYN_SEND_POST /* @min:%2esendPOST */];\r\n}\r\nvar Sender = /** @class */ (function () {\r\n function Sender() {\r\n var _consecutiveErrors; // How many times in a row a retryable error condition has occurred.\r\n var _retryAt; // The time to retry at in milliseconds from 1970/01/01 (this makes the timer calculation easy).\r\n var _paused; // Flag indicating that the sending should be paused\r\n var _enableSendPromise;\r\n var _alwaysUseCustomSend;\r\n var _isInitialized;\r\n var _diagLog;\r\n var _core;\r\n var _httpInterface;\r\n var _onlineChannelId;\r\n var _isOneDs;\r\n var _sendPostMgr;\r\n var _disableCredentials;\r\n var _fetchCredentials;\r\n dynamicProto(Sender, this, function (_self, _base) {\r\n //let _sendCredentials = true; // for 1ds\r\n _initDefaults();\r\n _self.pause = function () {\r\n _clearScheduledTimer();\r\n _paused = true;\r\n };\r\n _self.resume = function () {\r\n if (_paused) {\r\n _paused = false;\r\n _retryAt = null;\r\n }\r\n };\r\n _self.getXhrInst = function (sync) {\r\n // unload events will be saved. so not return unload interface\r\n return _httpInterface;\r\n };\r\n _self[_DYN_INITIALIZE /* @min:%2einitialize */] = function (config, core, cxt, diagLog, channelId, unloadHookContainer) {\r\n _diagLog = diagLog || core.logger;\r\n if (_isInitialized) {\r\n _throwInternal(_diagLog, 1 /* eLoggingSeverity.CRITICAL */, 28 /* _eInternalMessageId.SenderNotInitialized */, \"Sender is already initialized\");\r\n }\r\n _core = core;\r\n _consecutiveErrors = 0;\r\n _retryAt = null;\r\n // This function will be re-called whenever any referenced configuration is changed\r\n var hook = onConfigChange(config, function (details) {\r\n var config = details.cfg;\r\n if (config.storagePrefix) {\r\n utlSetStoragePrefix(config.storagePrefix);\r\n }\r\n var ctx = createProcessTelemetryContext(null, config, core);\r\n var offlineCfg = ctx[_DYN_GET_EXT_CFG /* @min:%2egetExtCfg */](DefaultOfflineIdentifier);\r\n _onlineChannelId = channelId || BreezeChannelIdentifier;\r\n var senderConfig = ctx[_DYN_GET_EXT_CFG /* @min:%2egetExtCfg */](_onlineChannelId, {});\r\n var offlineSenderCfg = offlineCfg.senderCfg || {};\r\n _fetchCredentials = null;\r\n if (_onlineChannelId == PostChannelId) {\r\n _isOneDs = true;\r\n var channelConfig = ctx[_DYN_GET_EXT_CFG /* @min:%2egetExtCfg */](PostChannelId);\r\n if (channelConfig && channelConfig[\"fetchCredentials\"]) {\r\n _fetchCredentials = channelConfig[\"fetchCredentials\"];\r\n }\r\n }\r\n _alwaysUseCustomSend = offlineSenderCfg.alwaysUseXhrOverride;\r\n // default true\r\n _enableSendPromise = !(senderConfig[_DYN_ENABLE_SEND_PROMISE /* @min:%2eenableSendPromise */] === false);\r\n var xhrOverride = offlineSenderCfg.httpXHROverride || senderConfig.httpXHROverride;\r\n var customInterface = isOverrideFn(xhrOverride) ? xhrOverride : null;\r\n _disableCredentials = !customInterface && _isOneDs;\r\n var sendPostMgrConfig = _getSendPostMgrConfig();\r\n if (!_sendPostMgr) {\r\n _sendPostMgr = new SenderPostManager();\r\n _sendPostMgr[_DYN_INITIALIZE /* @min:%2einitialize */](sendPostMgrConfig, _diagLog);\r\n }\r\n else {\r\n _sendPostMgr.SetConfig(sendPostMgrConfig);\r\n }\r\n var httpInterface = null;\r\n var customTransPorts = offlineSenderCfg.transports || senderConfig.transports || [];\r\n var theTransports = prependTransports([1 /* TransportType.Xhr */, 2 /* TransportType.Fetch */, 3 /* TransportType.Beacon */], customTransPorts);\r\n httpInterface = _sendPostMgr.getSenderInst(theTransports, false);\r\n var xhrInterface = _sendPostMgr.getFallbackInst();\r\n httpInterface = _alwaysUseCustomSend ? customInterface : (httpInterface || customInterface || xhrInterface);\r\n _httpInterface = httpInterface || xhrInterface;\r\n });\r\n unloadHookContainer && unloadHookContainer.add(hook);\r\n };\r\n _self[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */] = function () {\r\n var syncPayload = 0;\r\n try {\r\n var senderPlugin = _core.getPlugin(_onlineChannelId).plugin;\r\n if (senderPlugin && isFunction(senderPlugin[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */])) {\r\n if (!senderPlugin[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */]()) {\r\n return false;\r\n }\r\n }\r\n if (_sendPostMgr) {\r\n syncPayload = _sendPostMgr.getSyncFetchPayload();\r\n }\r\n }\r\n catch (e) {\r\n // if can't get idle status of online sender, then isidle status only depends on offine sender idle status\r\n }\r\n return !_paused && syncPayload === 0;\r\n };\r\n // partial 206, parse payload (not send again)\r\n _self._doTeardown = function (unloadCtx, unloadState) {\r\n _initDefaults();\r\n };\r\n /**\r\n * success handler\r\n */\r\n function _onSuccess(res, onComplete) {\r\n _doOnComplete(onComplete, 200, {}, res);\r\n }\r\n function _getSendPostMgrConfig() {\r\n var _a;\r\n var config = (_a = {},\r\n _a[_DYN_ENABLE_SEND_PROMISE /* @min:enableSendPromise */] = _enableSendPromise,\r\n _a.isOneDs = _isOneDs,\r\n _a.disableCredentials = _disableCredentials,\r\n _a.fetchCredentials = _fetchCredentials,\r\n _a.senderOnCompleteCallBack = _getOnCompleteFuncs(),\r\n _a);\r\n return config;\r\n }\r\n /**\r\n * error handler\r\n */\r\n function _onError(message, onComplete) {\r\n _throwInternal(_diagLog, 2 /* eLoggingSeverity.WARNING */, 26 /* _eInternalMessageId.OnError */, \"Failed to send telemetry.\", { message: message });\r\n _doOnComplete(onComplete, 400, {});\r\n }\r\n function _getOnCompleteFuncs() {\r\n var funcs = {\r\n xdrOnComplete: function (response, oncomplete) {\r\n return _xdrOnLoad(response, oncomplete);\r\n },\r\n fetchOnComplete: function (response, onComplete, resValue) {\r\n var status = response.status;\r\n return _handleResponse(onComplete, status, {}, resValue);\r\n },\r\n xhrOnComplete: function (request, oncomplete) {\r\n var response = getResponseText(request);\r\n return _handleResponse(oncomplete, request.status, {}, response);\r\n }\r\n };\r\n return funcs;\r\n }\r\n function _doOnComplete(oncomplete, status, headers, response) {\r\n try {\r\n oncomplete && oncomplete(status, headers, response);\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n }\r\n function _handleResponse(oncomplete, status, headers, response) {\r\n if (status == 206 && !_isOneDs) {\r\n // for breeze, 206 is partially success, currently consider success\r\n // TODO: handle partial success\r\n _doOnComplete(oncomplete, 200, headers, response); // TODO: doc (support partial success)-> partial success add known issue (breeze)\r\n }\r\n else if (status == 204 && _isOneDs) {\r\n // one collector\r\n _doOnComplete(oncomplete, 200, headers, response);\r\n }\r\n else {\r\n _doOnComplete(oncomplete, status, headers, response);\r\n }\r\n }\r\n function _clearScheduledTimer() {\r\n _retryAt = null;\r\n }\r\n /**\r\n * xdr state changes\r\n */\r\n function _xdrOnLoad(xdr, oncomplete) {\r\n var responseText = getResponseText(xdr);\r\n if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\r\n _consecutiveErrors = 0;\r\n _onSuccess(responseText, oncomplete);\r\n }\r\n else {\r\n var results = parseResponse(responseText, _diagLog);\r\n if (results && results.itemsAccepted) {\r\n // TODO: onPartial success for appInsights\r\n _onSuccess(responseText, oncomplete);\r\n }\r\n else {\r\n _onError(formatErrorMessageXdr(xdr), oncomplete);\r\n }\r\n }\r\n }\r\n function _initDefaults() {\r\n _self._appId = null;\r\n _consecutiveErrors = 0;\r\n _retryAt = null;\r\n _paused = false;\r\n _isInitialized = false;\r\n _core = null;\r\n _onlineChannelId = null;\r\n _sendPostMgr = null;\r\n }\r\n });\r\n }\r\n /**\r\n * Pause the sending (transmission) of events, this will cause all events to be batched only until the maximum limits are\r\n * hit at which point new events are dropped. Will also cause events to NOT be sent during page unload, so if Session storage\r\n * is disabled events will be lost.\r\n */\r\n Sender.prototype.pause = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Resume the sending (transmission) of events, this will restart the timer and any batched events will be sent using the normal\r\n * send interval.\r\n */\r\n Sender.prototype.resume = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n Sender.prototype.initialize = function (config, core, cxt, diagLog, channelId, unloadHookContainer) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Trigger the immediate send of buffered data; If executing asynchronously (the default) this may (not required) return\r\n * an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) that will resolve once the\r\n * send is complete. The actual implementation of the `IPromise` will be a native Promise (if supported) or the default\r\n * as supplied by [ts-async library](https://github.com/nevware21/ts-async)\r\n * @param async - Indicates if the events should be sent asynchronously\r\n * @param forcedSender - {SenderFunction} - Indicates the forcedSender, undefined if not passed\r\n * @returns - Nothing or optionally, if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\r\n * which will be resolved (or reject) once the send is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\r\n * should only be returned when async is true.\r\n */\r\n Sender.prototype.triggerSend = function (async, forcedSender, sendReason) {\r\n if (async === void 0) { async = true; }\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Check if there are no active requests being sent.\r\n * @returns True if idle, false otherwise.\r\n */\r\n Sender.prototype.isCompletelyIdle = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return false;\r\n };\r\n /**\r\n * Get current xhr instance\r\n */\r\n Sender.prototype.getXhrInst = function (sync) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n Sender.prototype._doTeardown = function (unloadCtx, unloadState) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n return Sender;\r\n}());\r\nexport { Sender };\r\n//# sourceMappingURL=Sender.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;iDAkDM,CAAC;;;;;kBACW;AAClB;AACA;AACA"}
1
+ {"version":3,"file":"Sender.js.map","sources":["Sender.js"],"sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT License.\r\nimport dynamicProto from \"@microsoft/dynamicproto-js\";\r\nimport { BreezeChannelIdentifier, utlSetStoragePrefix } from \"@microsoft/applicationinsights-common\";\r\nimport { SenderPostManager, _throwInternal, createProcessTelemetryContext, formatErrorMessageXdr, getResponseText, onConfigChange, parseResponse, prependTransports } from \"@microsoft/applicationinsights-core-js\";\r\nimport { isFunction } from \"@nevware21/ts-utils\";\r\nimport { _DYN_ENABLE_SEND_PROMISE, _DYN_GET_EXT_CFG, _DYN_INITIALIZE, _DYN_IS_COMPLETELY_IDLE, _DYN_SEND_POST } from \"./__DynamicConstants\";\r\nvar DefaultOfflineIdentifier = \"OfflineChannel\";\r\nvar PostChannelId = \"PostChannel\";\r\nfunction isOverrideFn(httpXHROverride) {\r\n return httpXHROverride && httpXHROverride[_DYN_SEND_POST /* @min:%2esendPOST */];\r\n}\r\nvar Sender = /** @class */ (function () {\r\n function Sender() {\r\n var _consecutiveErrors; // How many times in a row a retryable error condition has occurred.\r\n var _retryAt; // The time to retry at in milliseconds from 1970/01/01 (this makes the timer calculation easy).\r\n var _paused; // Flag indicating that the sending should be paused\r\n var _enableSendPromise;\r\n var _alwaysUseCustomSend;\r\n var _isInitialized;\r\n var _diagLog;\r\n var _core;\r\n var _httpInterface;\r\n var _onlineChannelId;\r\n var _isOneDs;\r\n var _sendPostMgr;\r\n var _disableCredentials;\r\n var _fetchCredentials;\r\n dynamicProto(Sender, this, function (_self, _base) {\r\n //let _sendCredentials = true; // for 1ds\r\n _initDefaults();\r\n _self.pause = function () {\r\n _clearScheduledTimer();\r\n _paused = true;\r\n };\r\n _self.resume = function () {\r\n if (_paused) {\r\n _paused = false;\r\n _retryAt = null;\r\n }\r\n };\r\n _self.getXhrInst = function (sync) {\r\n // unload events will be saved. so not return unload interface\r\n return _httpInterface;\r\n };\r\n _self[_DYN_INITIALIZE /* @min:%2einitialize */] = function (config, core, cxt, diagLog, channelId, unloadHookContainer) {\r\n _diagLog = diagLog || core.logger;\r\n if (_isInitialized) {\r\n _throwInternal(_diagLog, 1 /* eLoggingSeverity.CRITICAL */, 28 /* _eInternalMessageId.SenderNotInitialized */, \"Sender is already initialized\");\r\n }\r\n _core = core;\r\n _consecutiveErrors = 0;\r\n _retryAt = null;\r\n // This function will be re-called whenever any referenced configuration is changed\r\n var hook = onConfigChange(config, function (details) {\r\n var config = details.cfg;\r\n if (config.storagePrefix) {\r\n utlSetStoragePrefix(config.storagePrefix);\r\n }\r\n var ctx = createProcessTelemetryContext(null, config, core);\r\n var offlineCfg = ctx[_DYN_GET_EXT_CFG /* @min:%2egetExtCfg */](DefaultOfflineIdentifier);\r\n _onlineChannelId = channelId || BreezeChannelIdentifier;\r\n var senderConfig = ctx[_DYN_GET_EXT_CFG /* @min:%2egetExtCfg */](_onlineChannelId, {});\r\n var offlineSenderCfg = offlineCfg.senderCfg || {};\r\n _fetchCredentials = null;\r\n if (_onlineChannelId == PostChannelId) {\r\n _isOneDs = true;\r\n var channelConfig = ctx[_DYN_GET_EXT_CFG /* @min:%2egetExtCfg */](PostChannelId);\r\n if (channelConfig && channelConfig[\"fetchCredentials\"]) {\r\n _fetchCredentials = channelConfig[\"fetchCredentials\"];\r\n }\r\n }\r\n _alwaysUseCustomSend = offlineSenderCfg.alwaysUseXhrOverride;\r\n // default true\r\n _enableSendPromise = !(senderConfig[_DYN_ENABLE_SEND_PROMISE /* @min:%2eenableSendPromise */] === false);\r\n var xhrOverride = offlineSenderCfg.httpXHROverride || senderConfig.httpXHROverride;\r\n var customInterface = isOverrideFn(xhrOverride) ? xhrOverride : null;\r\n _disableCredentials = !customInterface && _isOneDs;\r\n var sendPostMgrConfig = _getSendPostMgrConfig();\r\n if (!_sendPostMgr) {\r\n _sendPostMgr = new SenderPostManager();\r\n _sendPostMgr[_DYN_INITIALIZE /* @min:%2einitialize */](sendPostMgrConfig, _diagLog);\r\n }\r\n else {\r\n _sendPostMgr.SetConfig(sendPostMgrConfig);\r\n }\r\n var httpInterface = null;\r\n var customTransPorts = offlineSenderCfg.transports || senderConfig.transports || [];\r\n var theTransports = prependTransports([1 /* TransportType.Xhr */, 2 /* TransportType.Fetch */, 3 /* TransportType.Beacon */], customTransPorts);\r\n httpInterface = _sendPostMgr.getSenderInst(theTransports, false);\r\n var xhrInterface = _sendPostMgr.getFallbackInst();\r\n httpInterface = _alwaysUseCustomSend ? customInterface : (httpInterface || customInterface || xhrInterface);\r\n _httpInterface = httpInterface || xhrInterface;\r\n });\r\n unloadHookContainer && unloadHookContainer.add(hook);\r\n };\r\n _self[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */] = function () {\r\n var syncPayload = 0;\r\n try {\r\n var senderPlugin = _core.getPlugin(_onlineChannelId).plugin;\r\n if (senderPlugin && isFunction(senderPlugin[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */])) {\r\n if (!senderPlugin[_DYN_IS_COMPLETELY_IDLE /* @min:%2eisCompletelyIdle */]()) {\r\n return false;\r\n }\r\n }\r\n if (_sendPostMgr) {\r\n syncPayload = _sendPostMgr.getSyncFetchPayload();\r\n }\r\n }\r\n catch (e) {\r\n // if can't get idle status of online sender, then isidle status only depends on offine sender idle status\r\n }\r\n return !_paused && syncPayload === 0;\r\n };\r\n // partial 206, parse payload (not send again)\r\n _self._doTeardown = function (unloadCtx, unloadState) {\r\n _initDefaults();\r\n };\r\n /**\r\n * success handler\r\n */\r\n function _onSuccess(res, onComplete) {\r\n _doOnComplete(onComplete, 200, {}, res);\r\n }\r\n function _getSendPostMgrConfig() {\r\n var _a;\r\n var config = (_a = {},\r\n _a[_DYN_ENABLE_SEND_PROMISE /* @min:enableSendPromise */] = _enableSendPromise,\r\n _a.isOneDs = _isOneDs,\r\n _a.disableCredentials = _disableCredentials,\r\n _a.fetchCredentials = _fetchCredentials,\r\n _a.senderOnCompleteCallBack = _getOnCompleteFuncs(),\r\n _a);\r\n return config;\r\n }\r\n /**\r\n * error handler\r\n */\r\n function _onError(message, onComplete) {\r\n _throwInternal(_diagLog, 2 /* eLoggingSeverity.WARNING */, 26 /* _eInternalMessageId.OnError */, \"Failed to send telemetry.\", { message: message });\r\n _doOnComplete(onComplete, 400, {});\r\n }\r\n function _getOnCompleteFuncs() {\r\n var funcs = {\r\n xdrOnComplete: function (response, oncomplete) {\r\n return _xdrOnLoad(response, oncomplete);\r\n },\r\n fetchOnComplete: function (response, onComplete, resValue) {\r\n var status = response.status;\r\n return _handleResponse(onComplete, status, {}, resValue);\r\n },\r\n xhrOnComplete: function (request, oncomplete) {\r\n var response = getResponseText(request);\r\n return _handleResponse(oncomplete, request.status, {}, response);\r\n }\r\n };\r\n return funcs;\r\n }\r\n function _doOnComplete(oncomplete, status, headers, response) {\r\n try {\r\n oncomplete && oncomplete(status, headers, response);\r\n }\r\n catch (e) {\r\n // eslint-disable-next-line no-empty\r\n }\r\n }\r\n function _handleResponse(oncomplete, status, headers, response) {\r\n if (status == 206 && !_isOneDs) {\r\n // for breeze, 206 is partially success, currently consider success\r\n // TODO: handle partial success\r\n _doOnComplete(oncomplete, 200, headers, response); // TODO: doc (support partial success)-> partial success add known issue (breeze)\r\n }\r\n else if (status == 204 && _isOneDs) {\r\n // one collector\r\n _doOnComplete(oncomplete, 200, headers, response);\r\n }\r\n else {\r\n _doOnComplete(oncomplete, status, headers, response);\r\n }\r\n }\r\n function _clearScheduledTimer() {\r\n _retryAt = null;\r\n }\r\n /**\r\n * xdr state changes\r\n */\r\n function _xdrOnLoad(xdr, oncomplete) {\r\n var responseText = getResponseText(xdr);\r\n if (xdr && (responseText + \"\" === \"200\" || responseText === \"\")) {\r\n _consecutiveErrors = 0;\r\n _onSuccess(responseText, oncomplete);\r\n }\r\n else {\r\n var results = parseResponse(responseText, _diagLog);\r\n if (results && results.itemsAccepted) {\r\n // TODO: onPartial success for appInsights\r\n _onSuccess(responseText, oncomplete);\r\n }\r\n else {\r\n _onError(formatErrorMessageXdr(xdr), oncomplete);\r\n }\r\n }\r\n }\r\n function _initDefaults() {\r\n _self._appId = null;\r\n _consecutiveErrors = 0;\r\n _retryAt = null;\r\n _paused = false;\r\n _isInitialized = false;\r\n _core = null;\r\n _onlineChannelId = null;\r\n _sendPostMgr = null;\r\n }\r\n });\r\n }\r\n /**\r\n * Pause the sending (transmission) of events, this will cause all events to be batched only until the maximum limits are\r\n * hit at which point new events are dropped. Will also cause events to NOT be sent during page unload, so if Session storage\r\n * is disabled events will be lost.\r\n */\r\n Sender.prototype.pause = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Resume the sending (transmission) of events, this will restart the timer and any batched events will be sent using the normal\r\n * send interval.\r\n */\r\n Sender.prototype.resume = function () {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n Sender.prototype.initialize = function (config, core, cxt, diagLog, channelId, unloadHookContainer) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Trigger the immediate send of buffered data; If executing asynchronously (the default) this may (not required) return\r\n * an [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html) that will resolve once the\r\n * send is complete. The actual implementation of the `IPromise` will be a native Promise (if supported) or the default\r\n * as supplied by [ts-async library](https://github.com/nevware21/ts-async)\r\n * @param async - Indicates if the events should be sent asynchronously\r\n * @param forcedSender - Indicates the forcedSender, undefined if not passed\r\n * @returns - Nothing or optionally, if occurring asynchronously a [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\r\n * which will be resolved (or reject) once the send is complete, the [IPromise](https://nevware21.github.io/ts-async/typedoc/interfaces/IPromise.html)\r\n * should only be returned when async is true.\r\n */\r\n Sender.prototype.triggerSend = function (async, forcedSender, sendReason) {\r\n if (async === void 0) { async = true; }\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n /**\r\n * Check if there are no active requests being sent.\r\n * @returns True if idle, false otherwise.\r\n */\r\n Sender.prototype.isCompletelyIdle = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return false;\r\n };\r\n /**\r\n * Get current xhr instance\r\n */\r\n Sender.prototype.getXhrInst = function (sync) {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n return null;\r\n };\r\n Sender.prototype._doTeardown = function (unloadCtx, unloadState) {\r\n // @DynamicProtoStub -- DO NOT add any code as this will be removed during packaging\r\n };\r\n return Sender;\r\n}());\r\nexport { Sender };\r\n//# sourceMappingURL=Sender.js.map"],"names":[],"mappings":";;;;AAA4D;AAC1B;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;iDAkDM,CAAC;;;;;kBACW;AAClB;AACA;AACA"}
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
 
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2501-07
2
+ * Application Insights JavaScript SDK - Offline Channel, 0.3.5-nightly3.2502-02
3
3
  * Copyright (c) Microsoft and contributors. All rights reserved.
4
4
  */
5
5
  export { BatchSendStatus, BatchStoreStatus, StorageType } from "./Interfaces/IOfflineBatch";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/applicationinsights-offlinechannel-js",
3
- "version": "0.3.5-nightly3.2501-07",
3
+ "version": "0.3.5-nightly3.2502-02",
4
4
  "description": "Microsoft Application Insights JavaScript SDK Offline Channel",
5
5
  "homepage": "https://github.com/microsoft/ApplicationInsights-JS#readme",
6
6
  "author": "Microsoft Application Insights Team",
@@ -31,10 +31,10 @@
31
31
  "dependencies": {
32
32
  "@microsoft/dynamicproto-js": "^2.0.3",
33
33
  "@microsoft/applicationinsights-shims": "3.0.1",
34
- "@microsoft/applicationinsights-core-js": "3.3.5-nightly3.2501-07",
35
- "@microsoft/applicationinsights-common": "3.3.5-nightly3.2501-07",
36
- "@nevware21/ts-utils": ">= 0.11.3 < 2.x",
37
- "@nevware21/ts-async": ">= 0.5.2 < 2.x"
34
+ "@microsoft/applicationinsights-core-js": "3.3.5-nightly3.2502-02",
35
+ "@microsoft/applicationinsights-common": "3.3.5-nightly3.2502-02",
36
+ "@nevware21/ts-utils": ">= 0.11.6 < 2.x",
37
+ "@nevware21/ts-async": ">= 0.5.4 < 2.x"
38
38
  },
39
39
  "peerDependencies": {
40
40
  "tslib": ">= 1.0.0"