@microsoft/applicationinsights-offlinechannel-js 0.3.6-nightly3.2502-14 → 0.3.7-nightly3.2503-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.
- package/dist/es5/applicationinsights-offlinechannel-js.js +199 -253
- package/dist/es5/applicationinsights-offlinechannel-js.js.map +1 -1
- package/dist/es5/applicationinsights-offlinechannel-js.min.js +2 -2
- package/dist/es5/applicationinsights-offlinechannel-js.min.js.map +1 -1
- package/dist-es5/Helpers/Utils.js +4 -4
- package/dist-es5/Helpers/Utils.js.map +1 -1
- package/dist-es5/InMemoryBatch.js +4 -4
- package/dist-es5/InMemoryBatch.js.map +1 -1
- package/dist-es5/Interfaces/IInMemoryBatch.js +1 -1
- package/dist-es5/Interfaces/IOfflineBatch.js +1 -1
- package/dist-es5/Interfaces/IOfflineIndexDb.js +1 -1
- package/dist-es5/Interfaces/IOfflineProvider.js +1 -1
- package/dist-es5/Interfaces/ISender.js +1 -1
- package/dist-es5/OfflineBatchHandler.js +5 -5
- package/dist-es5/OfflineBatchHandler.js.map +1 -1
- package/dist-es5/OfflineChannel.js +20 -20
- package/dist-es5/OfflineChannel.js.map +1 -1
- package/dist-es5/PayloadHelper.js +1 -1
- package/dist-es5/Providers/IndexDbHelper.js +54 -63
- package/dist-es5/Providers/IndexDbHelper.js.map +1 -1
- package/dist-es5/Providers/IndexDbProvider.js +10 -10
- package/dist-es5/Providers/IndexDbProvider.js.map +1 -1
- package/dist-es5/Providers/WebStorageProvider.js +8 -8
- package/dist-es5/Providers/WebStorageProvider.js.map +1 -1
- package/dist-es5/Sender.js +14 -15
- package/dist-es5/Sender.js.map +1 -1
- package/dist-es5/__DynamicConstants.js +6 -25
- package/dist-es5/__DynamicConstants.js.map +1 -1
- package/dist-es5/applicationinsights-offlinechannel-js.js +1 -1
- package/package.json +4 -4
- package/types/applicationinsights-offlinechannel-js.d.ts +1 -1
- package/types/applicationinsights-offlinechannel-js.namespaced.d.ts +1 -1
|
@@ -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.6-nightly3.2502-14';\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, mathFloor, mathMax, mathMin, 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_CRITICAL_CNT, _DYN_DATA, _DYN_DIAG_LOG, _DYN_GET_ITEMS, _DYN_INITIALIZE, _DYN_INSTRUMENTATION_KEY, _DYN_IS_COMPLETELY_IDLE, _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 } from \"./__DynamicConstants\";\r\nvar version = '0.3.7-nightly3.2503-02';\r\nvar DefaultOfflineIdentifier = \"OfflineChannel\";\r\nvar DefaultBatchInterval = 15000;\r\nvar DefaultInMemoMaxTime = 15000;\r\nvar PostChannelIdentifier = \"PostChannel\";\r\nvar PersistenceKeys = [EventPersistence.Critical, 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.Normal },\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.isOnline) {\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.isOnline();\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[_DYN_PERSISTENCE /* @min:%2epersistence */] = item[_DYN_PERSISTENCE /* @min:%2epersistence */] || (item.baseData && item.baseData[_DYN_PERSISTENCE /* @min:%2epersistence */]) || EventPersistence.Normal; // 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[_DYN_PERSISTENCE /* @min:%2epersistence */] == EventPersistence.Critical) {\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.createOneDSPayload) {\r\n payloadData = _offineSupport.createOneDSPayload(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.isOnline();\r\n if (!_sendNextBatchTimer) {\r\n var retryInterval = _retryAt ? mathMax(0, _retryAt - dateNow()) : 0;\r\n var timerValue = mathMax(_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 = mathFloor(Math.random() * backOffSlot * SlotDelayInSeconds) + 1;\r\n backOffDelay = linearFactor * backOffDelay;\r\n delayInSeconds = mathMax(mathMin(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.getOfflineSupport)) {\r\n _offineSupport = channel.getOfflineSupport();\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.Normal;\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.
|
|
2
|
+
* Application Insights JavaScript SDK - Offline Channel, 0.3.7-nightly3.2503-02
|
|
3
3
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -8,7 +8,7 @@ import dynamicProto from "@microsoft/dynamicproto-js";
|
|
|
8
8
|
import { getGlobalInst } from "@microsoft/applicationinsights-core-js";
|
|
9
9
|
import { createAsyncPromise, createAsyncRejectedPromise, createAsyncResolvedPromise, createTaskScheduler, doAwait, doAwaitResponse } from "@nevware21/ts-async";
|
|
10
10
|
import { getGlobal, isFunction, isPromiseLike, isString } from "@nevware21/ts-utils";
|
|
11
|
-
import { _DYN_CONTINUE, _DYN_DB_HDL,
|
|
11
|
+
import { _DYN_CONTINUE, _DYN_DB_HDL, _DYN_INDEX_OF, _DYN_IS_AVAILABLE, _DYN_LENGTH, _DYN_ONERROR, _DYN_ONSUCCESS, _DYN_OPEN_CURSOR, _DYN_PUSH, _DYN_REJECTED, _DYN_SPLIT, _DYN_THEN, _DYN_TRANSACTION, _DYN_VALUE } from "../__DynamicConstants";
|
|
12
12
|
//TODO: move all const to one file
|
|
13
13
|
//TODO: handle db names
|
|
14
14
|
var IndexedDBNames = ["indexedDB" /*, 'mozIndexedDB', 'webkitIndexedDB', 'msIndexedDb'*/];
|
|
@@ -37,43 +37,42 @@ var _dbContext = [];
|
|
|
37
37
|
* @param diagLog - The diagnostics logger to use
|
|
38
38
|
*/
|
|
39
39
|
function _getDbContext(dbName, diagLog) {
|
|
40
|
-
var _a;
|
|
41
40
|
var dbCtx = null;
|
|
42
41
|
for (var lp = 0; lp < _dbContext[_DYN_LENGTH /* @min:%2elength */]; lp++) {
|
|
43
42
|
dbCtx = _dbContext[lp];
|
|
44
|
-
if (dbCtx
|
|
43
|
+
if (dbCtx.name === dbName) {
|
|
45
44
|
return dbCtx;
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
// Create the global handle for the database
|
|
49
|
-
dbCtx =
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
dbCtx = {
|
|
49
|
+
name: dbName,
|
|
50
|
+
sch: createTaskScheduler(createAsyncPromise, "IndexedDbHelper[" + dbName + "]"),
|
|
51
|
+
dbHdl: [],
|
|
52
|
+
add: function (db) {
|
|
54
53
|
dbCtx.dbHdl[_DYN_PUSH /* @min:%2epush */](db);
|
|
55
54
|
_debugLog(dbName, "- dbOpened (add) -- hdls [" + dbCtx.dbHdl[_DYN_LENGTH /* @min:%2elength */] + "]");
|
|
56
55
|
},
|
|
57
|
-
|
|
56
|
+
remove: function (db) {
|
|
58
57
|
var hdls = dbCtx[_DYN_DB_HDL /* @min:%2edbHdl */];
|
|
59
58
|
for (var lp = 0; lp < hdls[_DYN_LENGTH /* @min:%2elength */]; lp++) {
|
|
60
59
|
if (hdls[lp] === db) {
|
|
61
|
-
hdls
|
|
60
|
+
hdls.splice(lp, 1);
|
|
62
61
|
break;
|
|
63
62
|
}
|
|
64
63
|
}
|
|
65
64
|
_debugLog(dbName, "- dbClosed (remove) -- hdls [" + dbCtx.dbHdl[_DYN_LENGTH /* @min:%2elength */] + "]");
|
|
66
65
|
},
|
|
67
|
-
|
|
66
|
+
isOpen: function () {
|
|
68
67
|
return dbCtx.dbHdl[_DYN_LENGTH /* @min:%2elength */] > 0;
|
|
69
68
|
},
|
|
70
|
-
|
|
69
|
+
openHdl: function () {
|
|
71
70
|
if (dbCtx.dbHdl[_DYN_LENGTH /* @min:%2elength */] > 0) {
|
|
72
71
|
return dbCtx[_DYN_DB_HDL /* @min:%2edbHdl */][0];
|
|
73
72
|
}
|
|
74
73
|
return null;
|
|
75
|
-
}
|
|
76
|
-
|
|
74
|
+
}
|
|
75
|
+
};
|
|
77
76
|
_dbContext[_DYN_PUSH /* @min:%2epush */](dbCtx);
|
|
78
77
|
return dbCtx;
|
|
79
78
|
}
|
|
@@ -147,19 +146,16 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
147
146
|
return createAsyncPromise(function (openResolve, openReject) {
|
|
148
147
|
var createdNewDb = false;
|
|
149
148
|
function _createDbCtx(dbContext, db, dbOpenRequest, isNew, isUpgrade) {
|
|
150
|
-
var
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
_a.txn = dbOpenRequest ? dbOpenRequest[_DYN_TRANSACTION /* @min:%2etransaction */] : null // Special case see the versionChangeFunc usage below
|
|
159
|
-
,
|
|
160
|
-
_a);
|
|
149
|
+
var crDbCtx = {
|
|
150
|
+
db: db,
|
|
151
|
+
dbName: dbName,
|
|
152
|
+
dbVersion: dbVersion,
|
|
153
|
+
ctx: null,
|
|
154
|
+
isNew: isNew,
|
|
155
|
+
txn: dbOpenRequest ? dbOpenRequest[_DYN_TRANSACTION /* @min:%2etransaction */] : null // Special case see the versionChangeFunc usage below
|
|
156
|
+
};
|
|
161
157
|
if (!isUpgrade) {
|
|
162
|
-
crDbCtx
|
|
158
|
+
crDbCtx.openStore = function (eventTable, doAction) {
|
|
163
159
|
return _openStore(crDbCtx, eventTable, doAction);
|
|
164
160
|
};
|
|
165
161
|
crDbCtx[_DYN_OPEN_CURSOR /* @min:%2eopenCursor */] = function (eventTable, query, cursorFunc) {
|
|
@@ -188,10 +184,10 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
188
184
|
// Special case handling, when a DB is first created calling createObjectStore() will
|
|
189
185
|
// automatically start a version change transaction which will block all other transactions
|
|
190
186
|
// from getting created, so we save the auto opened on here for reuse as part of opening the store
|
|
191
|
-
_debugLog(upgDbCtx
|
|
187
|
+
_debugLog(upgDbCtx.dbName, "on version change success");
|
|
192
188
|
if (!upgDbCtx.txn) {
|
|
193
189
|
upgDbCtx.txn = dbOpenRequest[_DYN_TRANSACTION /* @min:%2etransaction */];
|
|
194
|
-
_debugLog(upgDbCtx
|
|
190
|
+
_debugLog(upgDbCtx.dbName, "added open request");
|
|
195
191
|
}
|
|
196
192
|
}
|
|
197
193
|
else {
|
|
@@ -212,20 +208,20 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
212
208
|
opDbCtx.add(db);
|
|
213
209
|
db.onabort = function (evt) {
|
|
214
210
|
_debugLog(dbName, "onabort -- closing the Db");
|
|
215
|
-
opDbCtx
|
|
211
|
+
opDbCtx.remove(db);
|
|
216
212
|
};
|
|
217
213
|
db[_DYN_ONERROR /* @min:%2eonerror */] = function (evt) {
|
|
218
214
|
_debugLog(dbName, "onerror -- closing the Db");
|
|
219
|
-
opDbCtx
|
|
215
|
+
opDbCtx.remove(db);
|
|
220
216
|
};
|
|
221
217
|
db.onclose = function (evt) {
|
|
222
218
|
_debugLog(dbName, "onclose -- closing the Db");
|
|
223
|
-
opDbCtx
|
|
219
|
+
opDbCtx.remove(db);
|
|
224
220
|
};
|
|
225
221
|
db.onversionchange = function (evt) {
|
|
226
222
|
_debugLog(dbName, "onversionchange -- force closing the Db");
|
|
227
223
|
db.close();
|
|
228
|
-
opDbCtx
|
|
224
|
+
opDbCtx.remove(db);
|
|
229
225
|
};
|
|
230
226
|
var openDbCtx = null;
|
|
231
227
|
var dbHdl = null;
|
|
@@ -371,7 +367,7 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
371
367
|
var dbPromise = _dbFactory.databases();
|
|
372
368
|
dbPromise[_DYN_THEN /* @min:%2ethen */](function (databases) {
|
|
373
369
|
for (var lp = 0; lp < databases[_DYN_LENGTH /* @min:%2elength */]; lp++) {
|
|
374
|
-
if (databases[lp]
|
|
370
|
+
if (databases[lp].name === dbName) {
|
|
375
371
|
databasesResolve(databases[lp]);
|
|
376
372
|
return;
|
|
377
373
|
}
|
|
@@ -399,7 +395,7 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
399
395
|
// handling below to ensure we don't deadlock.
|
|
400
396
|
tx.oncomplete = function () {
|
|
401
397
|
// We need to capture the transaction close event as not all browsers are triggering the db onclose event
|
|
402
|
-
_debugLog(openDbCtx
|
|
398
|
+
_debugLog(openDbCtx.dbName, "txn.oncomplete");
|
|
403
399
|
};
|
|
404
400
|
// Ok, so now we have the transaction handling setup lets try and store the event
|
|
405
401
|
return {
|
|
@@ -460,8 +456,8 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
460
456
|
var values = [];
|
|
461
457
|
var cursorRequest = null;
|
|
462
458
|
var queryKeyRange = null;
|
|
463
|
-
if (simpleQuery && simpleQuery
|
|
464
|
-
queryKeyRange = simpleQuery
|
|
459
|
+
if (simpleQuery && simpleQuery.keyRange) {
|
|
460
|
+
queryKeyRange = simpleQuery.keyRange();
|
|
465
461
|
}
|
|
466
462
|
var storeCtx = _createStoreContext(openDbCtx, eventTable);
|
|
467
463
|
if (queryKeyRange) {
|
|
@@ -470,9 +466,8 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
470
466
|
else {
|
|
471
467
|
cursorRequest = storeCtx.store[_DYN_OPEN_CURSOR /* @min:%2eopenCursor */]();
|
|
472
468
|
}
|
|
473
|
-
cursorRequest
|
|
469
|
+
cursorRequest[_DYN_ONERROR /* @min:%2eonerror */] = _eventReject(storeCtx.db.dbName, ErrorMessageFailedToOpenCursor, openCursorReject, "openCursor");
|
|
474
470
|
cursorRequest[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = function (evt) {
|
|
475
|
-
var _a;
|
|
476
471
|
// Cursor was open/next iteration
|
|
477
472
|
var cursor = evt.target[Result];
|
|
478
473
|
if (!cursor) {
|
|
@@ -480,18 +475,16 @@ var IndexedDbHelper = /** @class */ (function () {
|
|
|
480
475
|
openCursorResolve(values);
|
|
481
476
|
return;
|
|
482
477
|
}
|
|
483
|
-
var processCursorState =
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
_a[_DYN_CONTINUE /* @min:continue */] = function () {
|
|
478
|
+
var processCursorState = {
|
|
479
|
+
store: storeCtx,
|
|
480
|
+
cursor: cursor,
|
|
481
|
+
continue: function () {
|
|
488
482
|
cursor[_DYN_CONTINUE /* @min:%2econtinue */]();
|
|
489
483
|
},
|
|
490
|
-
|
|
484
|
+
done: function () {
|
|
491
485
|
openCursorResolve(values);
|
|
492
486
|
} // Stops the cursor processing
|
|
493
|
-
|
|
494
|
-
_a);
|
|
487
|
+
};
|
|
495
488
|
var value = cursor[_DYN_VALUE /* @min:%2evalue */];
|
|
496
489
|
if (simpleQuery && !simpleQuery.isMatch(value)) {
|
|
497
490
|
processCursorState[_DYN_CONTINUE /* @min:%2econtinue */]();
|
|
@@ -547,7 +540,7 @@ var SimpleQuery = /** @class */ (function () {
|
|
|
547
540
|
var _queryCols = [];
|
|
548
541
|
var _keyRange = null;
|
|
549
542
|
dynamicProto(SimpleQuery, this, function (_this) {
|
|
550
|
-
_this
|
|
543
|
+
_this.keyRange = function () {
|
|
551
544
|
return _keyRange;
|
|
552
545
|
};
|
|
553
546
|
_this.parseQuery = function (query) {
|
|
@@ -558,10 +551,10 @@ var SimpleQuery = /** @class */ (function () {
|
|
|
558
551
|
var item = items[lp];
|
|
559
552
|
var idx = item[_DYN_INDEX_OF /* @min:%2eindexOf */]("=");
|
|
560
553
|
if (idx !== -1) {
|
|
561
|
-
var key = item
|
|
562
|
-
var value = item
|
|
554
|
+
var key = item.substring(0, idx);
|
|
555
|
+
var value = item.substring(idx + 1);
|
|
563
556
|
if (key[_DYN_INDEX_OF /* @min:%2eindexOf */]("#") === 0) {
|
|
564
|
-
key = key
|
|
557
|
+
key = key.substring(1);
|
|
565
558
|
if (!_keyRange) {
|
|
566
559
|
_keyRange = IDBKeyRange.bound(value, value + "\uffff");
|
|
567
560
|
}
|
|
@@ -572,20 +565,18 @@ var SimpleQuery = /** @class */ (function () {
|
|
|
572
565
|
}
|
|
573
566
|
};
|
|
574
567
|
_this.startsWith = function (columnName, value) {
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
_a));
|
|
568
|
+
_queryCols[_DYN_PUSH /* @min:%2epush */]({
|
|
569
|
+
name: columnName,
|
|
570
|
+
value: value,
|
|
571
|
+
type: 0 /* ValueQueryType.StartsWith */
|
|
572
|
+
});
|
|
581
573
|
};
|
|
582
574
|
_this.contains = function (columnName, value) {
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
_a));
|
|
575
|
+
_queryCols[_DYN_PUSH /* @min:%2epush */]({
|
|
576
|
+
name: columnName,
|
|
577
|
+
value: value,
|
|
578
|
+
type: 1 /* ValueQueryType.Contains */
|
|
579
|
+
});
|
|
589
580
|
};
|
|
590
581
|
_this.isMatch = function (value) {
|
|
591
582
|
// No query restriction so everything matches
|