@microsoft/applicationinsights-offlinechannel-js 0.1.1-nightly3.2402-16 → 0.1.1-nightly3.2402-22
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/README.md +1 -1
- package/dist/es5/applicationinsights-offlinechannel-js.js +1506 -1382
- 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 +79 -3
- package/dist-es5/Helpers/Utils.js.map +1 -1
- package/dist-es5/InMemoryBatch.js +3 -3
- 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 +3 -3
- package/dist-es5/OfflineBatchHandler.js.map +1 -1
- package/dist-es5/OfflineChannel.js +107 -39
- package/dist-es5/OfflineChannel.js.map +1 -1
- package/dist-es5/PayloadHelper.js +1 -1
- package/dist-es5/Providers/IndexDbHelper.js +1 -1
- package/dist-es5/Providers/IndexDbProvider.js +18 -12
- package/dist-es5/Providers/IndexDbProvider.js.map +1 -1
- package/dist-es5/Providers/WebStorageProvider.js +35 -33
- package/dist-es5/Providers/WebStorageProvider.js.map +1 -1
- package/dist-es5/Sender.js +1 -1
- package/dist-es5/__DynamicConstants.js +16 -13
- package/dist-es5/__DynamicConstants.js.map +1 -1
- package/dist-es5/applicationinsights-offlinechannel-js.js +1 -1
- package/package.json +3 -3
- package/types/applicationinsights-offlinechannel-js.d.ts +8 -4
- package/types/applicationinsights-offlinechannel-js.namespaced.d.ts +45 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexDbProvider.js.map","sources":["IndexDbProvider.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 { EventPersistence } from \"@microsoft/applicationinsights-common\";\r\nimport { isNotNullOrUndefined, isNumber, newGuid, onConfigChange } from \"@microsoft/applicationinsights-core-js\";\r\nimport { createAsyncAllPromise, createAsyncPromise, doAwait, doAwaitResponse } from \"@nevware21/ts-async\";\r\nimport { getEndpointDomain, getTimeFromId, getTimeId } from \"../Helpers/Utils\";\r\nimport { _DYN_ADD_EVENT, _DYN_CONTINUE, _DYN_CRITICAL_CNT, _DYN_DIAG_LOG, _DYN_ENDPOINT, _DYN_GET_NEXT_BATCH, _DYN_GET_TIME, _DYN_INITIALIZE, _DYN_INSTRUMENTATION_KEY, _DYN_IN_STORAGE_MAX_TIME, _DYN_IS_AVAILABLE, _DYN_ITEM_CTX, _DYN_LENGTH, _DYN_MAX_CRITICAL_EVTS_DR4, _DYN_MAX_STORAGE_SIZE_IN_2, _DYN_ONERROR, _DYN_ONSUCCESS, _DYN_OPEN_STORE, _DYN_PUSH, _DYN_REMOVE_EVENTS, _DYN_SPLICE, _DYN_STORAGE_CONFIG, _DYN_STORAGE_KEY_PREFIX, _DYN_SUPPORTS_SYNC_REQUES5, _DYN_TEARDOWN, _DYN_THEN, _DYN__EVENTS_TO_DROP_PER_3 } from \"../__DynamicConstants\";\r\nimport { IndexedDbHelper } from \"./IndexDbHelper\";\r\n//TODO: move all const to one file\r\nvar EventsToDropAtOneTime = 10; // If we fail to add a new event this is the max number of events we will attempt to remove to make space\r\nvar StoreVersion = 1; // The Current version for the stored items, this will be used in the future for versioning\r\nvar OrhpanedEventThresholdInMs = 10080000; // 7 days\r\nvar MaxSizeLimit = 5000000; // 5Mb\r\nvar UnknowniKey = \"Unknown\";\r\nvar ErrorMessageUnableToAddEvent = \"DBError: Unable to add event\";\r\nvar MaxCriticalEvtsDropCnt = 2;\r\nexport var DefaultDbName = \"AIOffline\"; // Db Name including the version number on the end so that if we ever have to upgrade old and new code can co-exist\r\nexport var DbVersion = 1; // The Current version of the database (Used to trigger upgrades)\r\nexport var EventObjectStoreName = \"Evts\";\r\n/**\r\n* Checks if the value is a valid EventPersistence.\r\n* @param {enum} value - The value that needs to be checked.\r\n* @return {boolean} True if the value is in EventPersistence, false otherwise.\r\n*/\r\nexport function isValidPersistenceLevel(value) {\r\n return (isNumber(value) && value >= 0 /* eLoggingSeverity.DISABLED */ && value <= EventPersistence.Critical);\r\n}\r\nfunction _getTime() {\r\n return new Date()[_DYN_GET_TIME /* @min:%2egetTime */]();\r\n}\r\nfunction _createDb(db) {\r\n // data in the same db must have same endpoint url\r\n if (!db.objectStoreNames.contains(EventObjectStoreName)) {\r\n var evtStore = db.createObjectStore(EventObjectStoreName, { keyPath: \"id\" });\r\n evtStore.createIndex(\"criticalCnt\", \"criticalCnt\", { unique: false });\r\n }\r\n}\r\nfunction _getEvents(values) {\r\n var events = [];\r\n for (var lp = 0; lp < values[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n var item = values[lp];\r\n if (item && item.evt) {\r\n events[_DYN_PUSH /* @min:%2epush */](item.evt);\r\n }\r\n }\r\n return events;\r\n}\r\nfunction _addEventByTime(values, newValue) {\r\n for (var idx = 0; idx < values[_DYN_LENGTH /* @min:%2elength */]; idx++) {\r\n if (newValue.tm < values[idx].tm) {\r\n values[_DYN_SPLICE /* @min:%2esplice */](idx, 0, newValue);\r\n return;\r\n }\r\n }\r\n values[_DYN_PUSH /* @min:%2epush */](newValue);\r\n}\r\nfunction _getId(key, values) {\r\n var len = values[_DYN_LENGTH /* @min:%2elength */];\r\n for (var lp = 0; lp < len; lp++) {\r\n if (key === values[lp].id) {\r\n return lp;\r\n }\r\n }\r\n return -1;\r\n}\r\nfunction _cursorContinueEvent(cursorState, value) {\r\n return function (evt) {\r\n return cursorState[_DYN_CONTINUE /* @min:%2econtinue */]();\r\n };\r\n}\r\nfunction _cursorDeleteAndContinue(cursorState, value) {\r\n var deleteRequest = cursorState.cursor.delete();\r\n deleteRequest[_DYN_ONERROR /* @min:%2eonerror */] = _cursorContinueEvent(cursorState);\r\n deleteRequest[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = _cursorContinueEvent(cursorState);\r\n return 1 /* CursorProcessResult.Waiting */;\r\n}\r\nfunction _getAllEvents(dbCtx, cursorQuery, cnt) {\r\n // Open the Db store returning the embedded promise for handling resolving and rejecting the request chain\r\n return dbCtx.openCursor(EventObjectStoreName, cursorQuery, function (cursorState, value, values) {\r\n values[_DYN_PUSH /* @min:%2epush */](value);\r\n if (cnt && values && values[_DYN_LENGTH /* @min:%2elength */] == cnt) {\r\n return 2 /* CursorProcessResult.Complete */;\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n}\r\nfunction _deleteEvents(dbCtx, eventPrefixQuery, shouldDelete) {\r\n // Open the Event object store\r\n return dbCtx.openCursor(EventObjectStoreName, eventPrefixQuery, function (deleteCursorState, value, values) {\r\n if (shouldDelete(value)) {\r\n values[_DYN_PUSH /* @min:%2epush */](value);\r\n return _cursorDeleteAndContinue(deleteCursorState, value);\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n}\r\nfunction _dropMaxTimeEvents(dbCtx, maxTime) {\r\n return createAsyncPromise(function (deleteEvtsResolve, deleteEvtsReject) {\r\n return _deleteEvents(dbCtx, null, function (value) {\r\n if (!value || !value.evt) {\r\n return true;\r\n }\r\n var addedTime = getTimeFromId(value.id);\r\n var minStartTime = _getTime() + 1 - maxTime;\r\n if (addedTime <= minStartTime) {\r\n return true;\r\n }\r\n return false;\r\n })[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n deleteEvtsResolve(values);\r\n }, deleteEvtsReject);\r\n });\r\n}\r\nfunction _dropEventsUpToPersistence(dbCtx, maxpriorityCnt, maxDropCnt) {\r\n return createAsyncPromise(function (dropEventsResolve, dropEventsReject) {\r\n var droppedEvents = 0;\r\n function _resolveWithDroppedEvents() {\r\n dropEventsResolve(droppedEvents);\r\n }\r\n function _dropEvent(deleteStoreCtx, dropItem) {\r\n return createAsyncPromise(function (deleteResolve) {\r\n var deleteRequest = deleteStoreCtx.store.delete(dropItem.key);\r\n deleteRequest[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = function (evt) {\r\n droppedEvents++;\r\n deleteResolve();\r\n };\r\n deleteRequest[_DYN_ONERROR /* @min:%2eonerror */] = function (evt) {\r\n deleteResolve();\r\n };\r\n });\r\n }\r\n function _processCandidates(dropCandidates) {\r\n if (dropCandidates[_DYN_LENGTH /* @min:%2elength */] === 0) {\r\n _resolveWithDroppedEvents();\r\n return;\r\n }\r\n dbCtx[_DYN_OPEN_STORE /* @min:%2eopenStore */](EventObjectStoreName, function (deleteStoreCtx) {\r\n var deleteEvts = [];\r\n for (var lp = 0; lp < dropCandidates[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n deleteEvts[_DYN_PUSH /* @min:%2epush */](_dropEvent(deleteStoreCtx, dropCandidates[lp]));\r\n }\r\n return createAsyncAllPromise(deleteEvts)[_DYN_THEN /* @min:%2ethen */](_resolveWithDroppedEvents, _resolveWithDroppedEvents);\r\n });\r\n }\r\n // Get all of the candidates that we may delete\r\n var cursorPromise = dbCtx.openCursor(EventObjectStoreName, null, function (cursorState, value, values) {\r\n if (value.evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] <= maxpriorityCnt) {\r\n _addEventByTime(values, value);\r\n if (values[_DYN_LENGTH /* @min:%2elength */] > maxDropCnt) {\r\n values.splice(values[_DYN_LENGTH /* @min:%2elength */] - 1, 1);\r\n }\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n cursorPromise[_DYN_THEN /* @min:%2ethen */](_processCandidates, function () {\r\n dropEventsResolve(0);\r\n });\r\n });\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 IndexedDbProvider = /** @class */ (function () {\r\n /**\r\n * Creates a WebStorageProvider using the provider storageType\r\n */\r\n function IndexedDbProvider(id, unloadHookContainer) {\r\n dynamicProto(IndexedDbProvider, this, function (_this) {\r\n var _indexedDb = null;\r\n var _dbName = null;\r\n var _iKey = UnknowniKey;\r\n var _storageId = null; // Used as a unique id so that when active on multiple tabs (threads) the apps don't corrupts each other\r\n var _autoClean = null;\r\n var _endpoint = null;\r\n var _storageKeyPrefix = null;\r\n var _maxStorageTime = null;\r\n var _eventDropPerTime = null;\r\n var _maxCriticalCnt = null;\r\n var _maxStorageSizeInBytes = null;\r\n _this.id = id;\r\n _this[_DYN_INITIALIZE /* @min:%2einitialize */] = function (providerContext) {\r\n var diagLog = providerContext.itemCtx[_DYN_DIAG_LOG /* @min:%2ediagLog */]();\r\n _indexedDb = new IndexedDbHelper(diagLog);\r\n if (!_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n _indexedDb = null;\r\n return false;\r\n }\r\n var coreConfig = providerContext[_DYN_ITEM_CTX /* @min:%2eitemCtx */].getCfg();\r\n var itemCtx = providerContext[_DYN_ITEM_CTX /* @min:%2eitemCtx */];\r\n _iKey = itemCtx.getCfg()[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */] || coreConfig[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */];\r\n var storageConfig = providerContext[_DYN_STORAGE_CONFIG /* @min:%2estorageConfig */];\r\n _storageId = _this.id || providerContext.id || newGuid();\r\n _endpoint = getEndpointDomain(providerContext[_DYN_ENDPOINT /* @min:%2eendpoint */]);\r\n _autoClean = !!storageConfig.autoClean;\r\n _storageKeyPrefix = storageConfig[_DYN_STORAGE_KEY_PREFIX /* @min:%2estorageKeyPrefix */] || DefaultDbName;\r\n _dbName = _storageKeyPrefix + \"_\" + DbVersion + \"_\" + _endpoint;\r\n // currently, won't handle endpoint change\r\n // new endpoint will open a new db\r\n // endpoint change will be handled at offline batch lavel\r\n // namePrefix should not contain any \"_\"\r\n var unloadHook = onConfigChange(storageConfig, function () {\r\n _maxStorageTime = storageConfig[_DYN_IN_STORAGE_MAX_TIME /* @min:%2einStorageMaxTime */] || OrhpanedEventThresholdInMs; // TODO: handle 0\r\n _maxStorageSizeInBytes = storageConfig[_DYN_MAX_STORAGE_SIZE_IN_2 /* @min:%2emaxStorageSizeInBytes */] || MaxSizeLimit; // value checks and defaults should be applied during core config\r\n var dropNum = storageConfig[_DYN__EVENTS_TO_DROP_PER_3 /* @min:%2eEventsToDropPerTime */];\r\n _eventDropPerTime = isNotNullOrUndefined(dropNum) ? dropNum : EventsToDropAtOneTime;\r\n _maxCriticalCnt = storageConfig[_DYN_MAX_CRITICAL_EVTS_DR4 /* @min:%2emaxCriticalEvtsDropCnt */] || MaxCriticalEvtsDropCnt;\r\n });\r\n unloadHookContainer && unloadHookContainer.add(unloadHook);\r\n if (_dbName) {\r\n doAwaitResponse(_this.clean(!_autoClean), function (response) {\r\n _openDb(function (dbCtx) {\r\n return true;\r\n })[_DYN_THEN /* @min:%2ethen */](function (value) {\r\n // All done, but as initialize isn't waiting just ignore\r\n }, function (reason) {\r\n // clear and stop using indexedDb\r\n diagLog.warnToConsole(\"IndexedDbProvider failed to initialize - \" + (reason || \"<unknown>\"));\r\n _indexedDb = null;\r\n });\r\n });\r\n }\r\n return true;\r\n };\r\n _this[\"_getDbgPlgTargets\"] = function () {\r\n return [_dbName, _maxStorageSizeInBytes, _maxStorageTime, _indexedDb];\r\n };\r\n /**\r\n * Identifies whether this storage provider support synchronious requests\r\n */\r\n _this[_DYN_SUPPORTS_SYNC_REQUES5 /* @min:%2esupportsSyncRequests */] = function () {\r\n return false;\r\n };\r\n /**\r\n * Get all of the currently cached events( with given number) from the storage mechanism\r\n */\r\n _this.getAllEvents = function (cnt) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return [];\r\n }\r\n return _openDb(function (dbCtx) {\r\n return createAsyncPromise(function (allEventsResolve, allEventsReject) {\r\n _getAllEvents(dbCtx, null, cnt)[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n //TODO: orderEvents By CriticalCnt\r\n allEventsResolve(_getEvents(values));\r\n }, allEventsReject);\r\n });\r\n });\r\n };\r\n /**\r\n * Get all of the currently cached events( with given number) from the storage mechanism\r\n */\r\n _this[_DYN_GET_NEXT_BATCH /* @min:%2egetNextBatch */] = function () {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return [];\r\n }\r\n // Start an asynchronous set of events to access the Db, this first one will wait until all current outstanding\r\n // events are completed or rejected\r\n return _openDb(function (dbCtx) {\r\n return createAsyncPromise(function (allEventsResolve, allEventsReject) {\r\n _getAllEvents(dbCtx, null, 1)[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n allEventsResolve(_getEvents(values));\r\n }, allEventsReject);\r\n });\r\n });\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, item, itemCtx) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return item;\r\n }\r\n item.id = item.id || getTimeId();\r\n item[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = item[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] || 0;\r\n return _openDb(function (dbCtx) {\r\n var eventKey = key || item.id;\r\n var dbItem = {\r\n id: eventKey,\r\n evt: item,\r\n tm: _getTime(),\r\n v: StoreVersion\r\n };\r\n return _addDbEvent(dbCtx, dbItem, true);\r\n });\r\n };\r\n /**\r\n * Removes the values\r\n * @param evts\r\n */\r\n _this[_DYN_REMOVE_EVENTS /* @min:%2eremoveEvents */] = function (evts) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return [];\r\n }\r\n var removedEvents = [];\r\n return createAsyncPromise(function (removeEventsResolve, removeEventsReject) {\r\n // Open the Db store, this will handling resolving and rejecting this promise via the passed resolve/reject functions\r\n _openDb(function (dbCtx) {\r\n return dbCtx.openCursor(EventObjectStoreName, null, function (cursorState, value, values) {\r\n if (_getId(value.id, evts) !== -1) {\r\n var deleteRequest = cursorState.cursor.delete();\r\n deleteRequest[_DYN_ONERROR /* @min:%2eonerror */] = _cursorContinueEvent(cursorState);\r\n deleteRequest[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = function () {\r\n removedEvents[_DYN_PUSH /* @min:%2epush */](value.evt);\r\n cursorState[_DYN_CONTINUE /* @min:%2econtinue */]();\r\n };\r\n return 1 /* CursorProcessResult.Waiting */;\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n })[_DYN_THEN /* @min:%2ethen */](function () {\r\n removeEventsResolve(removedEvents); // Resolve the RemoveEvents call promise\r\n }, function (reason) {\r\n removeEventsResolve(removedEvents); // Resolve the RemoveEvents call promise\r\n });\r\n });\r\n };\r\n /**\r\n * Removes all entries from the storage provider and returns them as part of the response, if there are any.\r\n */\r\n _this.clear = function (disable) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]() || !!disable) {\r\n return [];\r\n }\r\n return createAsyncPromise(function (clearResolve, clearReject) {\r\n _openDb(function (dbCtx) {\r\n //delete all evts\r\n return _deleteEvents(dbCtx, null, function (value) {\r\n return true;\r\n });\r\n })[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n clearResolve(_getEvents(values));\r\n }, function (reason) {\r\n clearResolve([]);\r\n });\r\n });\r\n };\r\n _this.clean = function (disable) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]() || !!disable) {\r\n return false;\r\n }\r\n return createAsyncPromise(function (cleanResolve, cleanReject) {\r\n _openDb(function (dbCtx) {\r\n if (dbCtx.isNew) {\r\n return [];\r\n }\r\n return _dropMaxTimeEvents(dbCtx, _maxStorageTime);\r\n })[_DYN_THEN /* @min:%2ethen */](function (value) {\r\n cleanResolve(value && value[_DYN_LENGTH /* @min:%2elength */] > 0);\r\n }, function (reason) {\r\n cleanResolve(false);\r\n });\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 if (_indexedDb) {\r\n _indexedDb.closeDb(_dbName);\r\n }\r\n };\r\n /**\r\n * Schedules the opening of the database if not already open\r\n */\r\n function _openDb(processFunc) {\r\n function _handleDbUpgrade(dbCtx) {\r\n return createAsyncPromise(function (createResolve, createReject) {\r\n try {\r\n _createDb(dbCtx.db);\r\n }\r\n catch (e) {\r\n createReject(e);\r\n }\r\n createResolve();\r\n });\r\n }\r\n function _handleDbOpen(dbCtx) {\r\n return createAsyncPromise(function (openResolve, openReject) {\r\n var providerCtx = {\r\n iKey: _iKey,\r\n id: _endpoint,\r\n storageId: _storageId\r\n };\r\n dbCtx.ctx = providerCtx;\r\n doAwait(processFunc(dbCtx), openResolve, openReject);\r\n });\r\n }\r\n return _indexedDb.openDb(_dbName, DbVersion, _handleDbOpen, _handleDbUpgrade);\r\n }\r\n function _addDbEvent(dbCtx, dbItem, doRetry) {\r\n return createAsyncPromise(function (addEventResolve, addEventReject) {\r\n function dropEvents(droppedFunc) {\r\n // Try and clear space by dropping the Normal level events, note dropEvents promise never rejects\r\n _dropEventsUpToPersistence(dbCtx, _maxCriticalCnt, _eventDropPerTime)[_DYN_THEN /* @min:%2ethen */](function (droppedCount) {\r\n droppedFunc(droppedCount);\r\n }, function (reason) {\r\n // won't throw errors here, unblock following process\r\n droppedFunc(0);\r\n });\r\n }\r\n function _insertNewEvent() {\r\n dbCtx[_DYN_OPEN_STORE /* @min:%2eopenStore */](EventObjectStoreName, function (storeCtx) {\r\n var request = storeCtx.store.put(dbItem);\r\n request[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = function (evt) {\r\n addEventResolve(dbItem.evt);\r\n };\r\n request[_DYN_ONERROR /* @min:%2eonerror */] = function (evt) {\r\n if (!doRetry) {\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n return;\r\n }\r\n function _retryAddEvent(dropCount) {\r\n if (dropCount === 0) {\r\n // We failed to free up space so just reject\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n }\r\n // Retry sending the event\r\n _addDbEvent(dbCtx, dbItem, false)[_DYN_THEN /* @min:%2ethen */](function (theItem) {\r\n addEventResolve(dbItem.evt); // Resolve the calling add Event promise\r\n }, function () {\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n });\r\n }\r\n dropEvents(function (droppedCount) {\r\n if (droppedCount > 0) {\r\n // We dropped some events so lets try adding the item again\r\n _retryAddEvent(droppedCount);\r\n }\r\n else {\r\n // We have already tried to remove all we can\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n }\r\n });\r\n };\r\n }).catch(function (e) {\r\n addEventReject(e);\r\n });\r\n }\r\n _insertNewEvent();\r\n });\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 IndexedDbProvider.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 IndexedDbProvider.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 IndexedDbProvider.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 * Get all of the currently cached events from the storage mechanism\r\n */\r\n IndexedDbProvider.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 * 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 IndexedDbProvider.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 IndexedDbProvider.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 IndexedDbProvider.prototype.clear = function (disable) {\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 IndexedDbProvider.prototype.clean = function (disable) {\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 IndexedDbProvider.prototype.teardown = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n return IndexedDbProvider;\r\n}());\r\nexport { IndexedDbProvider };\r\n//# sourceMappingURL=IndexDbProvider.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;AACA;AACA;AACA;;;;;;;;yDAqEM,CAAC;;;;;6BACsB;AAC7B;AACA;AACA"}
|
|
1
|
+
{"version":3,"file":"IndexDbProvider.js.map","sources":["IndexDbProvider.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 { EventPersistence } from \"@microsoft/applicationinsights-common\";\r\nimport { isNotNullOrUndefined, isNumber, newGuid, onConfigChange } from \"@microsoft/applicationinsights-core-js\";\r\nimport { createAsyncAllPromise, createAsyncPromise, doAwait, doAwaitResponse } from \"@nevware21/ts-async\";\r\nimport { batchDropNotification, getEndpointDomain, getTimeFromId, getTimeId } from \"../Helpers/Utils\";\r\nimport { _DYN_ADD_EVENT, _DYN_CLEAR, _DYN_CONTINUE, _DYN_CRITICAL_CNT, _DYN_DIAG_LOG, _DYN_ENDPOINT, _DYN_GET_NEXT_BATCH, _DYN_GET_TIME, _DYN_INITIALIZE, _DYN_INSTRUMENTATION_KEY, _DYN_IN_STORAGE_MAX_TIME, _DYN_IS_AVAILABLE, _DYN_ITEM_CTX, _DYN_LENGTH, _DYN_MAX_CRITICAL_EVTS_DR3, _DYN_NOTIFICATION_MGR, _DYN_ONERROR, _DYN_ONSUCCESS, _DYN_OPEN_STORE, _DYN_PUSH, _DYN_REMOVE_EVENTS, _DYN_SPLICE, _DYN_STORAGE_CONFIG, _DYN_STORAGE_KEY_PREFIX, _DYN_SUPPORTS_SYNC_REQUES4, _DYN_TEARDOWN, _DYN_THEN, _DYN__EVENTS_TO_DROP_PER_2 } from \"../__DynamicConstants\";\r\nimport { IndexedDbHelper } from \"./IndexDbHelper\";\r\n//TODO: move all const to one file\r\nvar EventsToDropAtOneTime = 10; // If we fail to add a new event this is the max number of events we will attempt to remove to make space\r\nvar StoreVersion = 1; // The Current version for the stored items, this will be used in the future for versioning\r\nvar OrhpanedEventThresholdInMs = 10080000; // 7 days\r\nvar UnknowniKey = \"Unknown\";\r\nvar ErrorMessageUnableToAddEvent = \"DBError: Unable to add event\";\r\nvar MaxCriticalEvtsDropCnt = 2;\r\nexport var DefaultDbName = \"AIOffline\"; // Db Name including the version number on the end so that if we ever have to upgrade old and new code can co-exist\r\nexport var DbVersion = 1; // The Current version of the database (Used to trigger upgrades)\r\nexport var EventObjectStoreName = \"Evts\";\r\n/**\r\n* Checks if the value is a valid EventPersistence.\r\n* @param {enum} value - The value that needs to be checked.\r\n* @return {boolean} True if the value is in EventPersistence, false otherwise.\r\n*/\r\nexport function isValidPersistenceLevel(value) {\r\n return (isNumber(value) && value >= 0 /* eLoggingSeverity.DISABLED */ && value <= EventPersistence.Critical);\r\n}\r\nfunction _getTime() {\r\n return new Date()[_DYN_GET_TIME /* @min:%2egetTime */]();\r\n}\r\nfunction _createDb(db) {\r\n // data in the same db must have same endpoint url\r\n if (!db.objectStoreNames.contains(EventObjectStoreName)) {\r\n var evtStore = db.createObjectStore(EventObjectStoreName, { keyPath: \"id\" });\r\n evtStore.createIndex(\"criticalCnt\", \"criticalCnt\", { unique: false });\r\n }\r\n}\r\nfunction _getEvents(values) {\r\n var events = [];\r\n for (var lp = 0; lp < values[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n var item = values[lp];\r\n if (item && item.evt) {\r\n events[_DYN_PUSH /* @min:%2epush */](item.evt);\r\n }\r\n }\r\n return events;\r\n}\r\nfunction _addEventByTime(values, newValue) {\r\n for (var idx = 0; idx < values[_DYN_LENGTH /* @min:%2elength */]; idx++) {\r\n if (newValue.tm < values[idx].tm) {\r\n values[_DYN_SPLICE /* @min:%2esplice */](idx, 0, newValue);\r\n return;\r\n }\r\n }\r\n values[_DYN_PUSH /* @min:%2epush */](newValue);\r\n}\r\nfunction _getId(key, values) {\r\n var len = values[_DYN_LENGTH /* @min:%2elength */];\r\n for (var lp = 0; lp < len; lp++) {\r\n if (key === values[lp].id) {\r\n return lp;\r\n }\r\n }\r\n return -1;\r\n}\r\nfunction _cursorContinueEvent(cursorState, value) {\r\n return function (evt) {\r\n return cursorState[_DYN_CONTINUE /* @min:%2econtinue */]();\r\n };\r\n}\r\nfunction _cursorDeleteAndContinue(cursorState, value) {\r\n var deleteRequest = cursorState.cursor.delete();\r\n deleteRequest[_DYN_ONERROR /* @min:%2eonerror */] = _cursorContinueEvent(cursorState);\r\n deleteRequest[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = _cursorContinueEvent(cursorState);\r\n return 1 /* CursorProcessResult.Waiting */;\r\n}\r\nfunction _getAllEvents(dbCtx, cursorQuery, cnt) {\r\n // Open the Db store returning the embedded promise for handling resolving and rejecting the request chain\r\n return dbCtx.openCursor(EventObjectStoreName, cursorQuery, function (cursorState, value, values) {\r\n values[_DYN_PUSH /* @min:%2epush */](value);\r\n if (cnt && values && values[_DYN_LENGTH /* @min:%2elength */] == cnt) {\r\n return 2 /* CursorProcessResult.Complete */;\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n}\r\nfunction _deleteEvents(dbCtx, eventPrefixQuery, shouldDelete) {\r\n // Open the Event object store\r\n return dbCtx.openCursor(EventObjectStoreName, eventPrefixQuery, function (deleteCursorState, value, values) {\r\n if (shouldDelete(value)) {\r\n values[_DYN_PUSH /* @min:%2epush */](value);\r\n return _cursorDeleteAndContinue(deleteCursorState, value);\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n}\r\nfunction _dropMaxTimeEvents(dbCtx, maxTime) {\r\n return createAsyncPromise(function (deleteEvtsResolve, deleteEvtsReject) {\r\n return _deleteEvents(dbCtx, null, function (value) {\r\n if (!value || !value.evt) {\r\n return true;\r\n }\r\n var addedTime = getTimeFromId(value.id);\r\n var minStartTime = _getTime() + 1 - maxTime;\r\n if (addedTime <= minStartTime) {\r\n return true;\r\n }\r\n return false;\r\n })[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n deleteEvtsResolve(values);\r\n }, deleteEvtsReject);\r\n });\r\n}\r\nfunction _dropEventsUpToPersistence(dbCtx, maxpriorityCnt, maxDropCnt) {\r\n return createAsyncPromise(function (dropEventsResolve, dropEventsReject) {\r\n var droppedEvents = 0;\r\n function _resolveWithDroppedEvents() {\r\n dropEventsResolve(droppedEvents);\r\n }\r\n function _dropEvent(deleteStoreCtx, dropItem) {\r\n return createAsyncPromise(function (deleteResolve) {\r\n var deleteRequest = deleteStoreCtx.store.delete(dropItem.key);\r\n deleteRequest[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = function (evt) {\r\n droppedEvents++;\r\n deleteResolve();\r\n };\r\n deleteRequest[_DYN_ONERROR /* @min:%2eonerror */] = function (evt) {\r\n deleteResolve();\r\n };\r\n });\r\n }\r\n function _processCandidates(dropCandidates) {\r\n if (dropCandidates[_DYN_LENGTH /* @min:%2elength */] === 0) {\r\n _resolveWithDroppedEvents();\r\n return;\r\n }\r\n dbCtx[_DYN_OPEN_STORE /* @min:%2eopenStore */](EventObjectStoreName, function (deleteStoreCtx) {\r\n var deleteEvts = [];\r\n for (var lp = 0; lp < dropCandidates[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n deleteEvts[_DYN_PUSH /* @min:%2epush */](_dropEvent(deleteStoreCtx, dropCandidates[lp]));\r\n }\r\n return createAsyncAllPromise(deleteEvts)[_DYN_THEN /* @min:%2ethen */](_resolveWithDroppedEvents, _resolveWithDroppedEvents);\r\n });\r\n }\r\n // Get all of the candidates that we may delete\r\n var cursorPromise = dbCtx.openCursor(EventObjectStoreName, null, function (cursorState, value, values) {\r\n if (value.evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] <= maxpriorityCnt) {\r\n _addEventByTime(values, value);\r\n if (values[_DYN_LENGTH /* @min:%2elength */] > maxDropCnt) {\r\n values.splice(values[_DYN_LENGTH /* @min:%2elength */] - 1, 1);\r\n }\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n cursorPromise[_DYN_THEN /* @min:%2ethen */](_processCandidates, function () {\r\n dropEventsResolve(0);\r\n });\r\n });\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 IndexedDbProvider = /** @class */ (function () {\r\n /**\r\n * Creates a WebStorageProvider using the provider storageType\r\n */\r\n function IndexedDbProvider(id, unloadHookContainer) {\r\n dynamicProto(IndexedDbProvider, this, function (_this) {\r\n var _indexedDb = null;\r\n var _dbName = null;\r\n var _iKey = UnknowniKey;\r\n var _storageId = null; // Used as a unique id so that when active on multiple tabs (threads) the apps don't corrupts each other\r\n var _autoClean = null;\r\n var _endpoint = null;\r\n var _storageKeyPrefix = 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 _this[_DYN_INITIALIZE /* @min:%2einitialize */] = function (providerContext) {\r\n var diagLog = providerContext.itemCtx[_DYN_DIAG_LOG /* @min:%2ediagLog */]();\r\n _indexedDb = new IndexedDbHelper(diagLog);\r\n if (!_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n _indexedDb = null;\r\n return false;\r\n }\r\n var coreConfig = providerContext[_DYN_ITEM_CTX /* @min:%2eitemCtx */].getCfg();\r\n var itemCtx = providerContext[_DYN_ITEM_CTX /* @min:%2eitemCtx */];\r\n _iKey = itemCtx.getCfg()[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */] || coreConfig[_DYN_INSTRUMENTATION_KEY /* @min:%2einstrumentationKey */];\r\n var storageConfig = providerContext[_DYN_STORAGE_CONFIG /* @min:%2estorageConfig */];\r\n _storageId = _this.id || providerContext.id || newGuid();\r\n _notificationManager = providerContext[_DYN_NOTIFICATION_MGR /* @min:%2enotificationMgr */];\r\n _endpoint = getEndpointDomain(providerContext[_DYN_ENDPOINT /* @min:%2eendpoint */]);\r\n _autoClean = !!storageConfig.autoClean;\r\n _storageKeyPrefix = storageConfig[_DYN_STORAGE_KEY_PREFIX /* @min:%2estorageKeyPrefix */] || DefaultDbName;\r\n _dbName = _storageKeyPrefix + \"_\" + DbVersion + \"_\" + _endpoint;\r\n // currently, won't handle endpoint change\r\n // new endpoint will open a new db\r\n // endpoint change will be handled at offline batch lavel\r\n // namePrefix should not contain any \"_\"\r\n var unloadHook = onConfigChange(storageConfig, function () {\r\n _maxStorageTime = storageConfig[_DYN_IN_STORAGE_MAX_TIME /* @min:%2einStorageMaxTime */] || OrhpanedEventThresholdInMs; // 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 if (_dbName) {\r\n doAwaitResponse(_this.clean(!_autoClean), function (response) {\r\n _openDb(function (dbCtx) {\r\n return true;\r\n })[_DYN_THEN /* @min:%2ethen */](function (value) {\r\n // All done, but as initialize isn't waiting just ignore\r\n }, function (reason) {\r\n // clear and stop using indexedDb\r\n diagLog.warnToConsole(\"IndexedDbProvider failed to initialize - \" + (reason || \"<unknown>\"));\r\n _indexedDb = null;\r\n });\r\n });\r\n }\r\n return true;\r\n };\r\n _this[\"_getDbgPlgTargets\"] = function () {\r\n return [_dbName, _endpoint, _maxStorageTime, _indexedDb];\r\n };\r\n /**\r\n * Identifies whether this storage provider support synchronious requests\r\n */\r\n _this[_DYN_SUPPORTS_SYNC_REQUES4 /* @min:%2esupportsSyncRequests */] = function () {\r\n return false;\r\n };\r\n /**\r\n * Get all of the currently cached events( with given number) from the storage mechanism\r\n */\r\n _this.getAllEvents = function (cnt) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return [];\r\n }\r\n return _openDb(function (dbCtx) {\r\n return createAsyncPromise(function (allEventsResolve, allEventsReject) {\r\n _getAllEvents(dbCtx, null, cnt)[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n //TODO: orderEvents By CriticalCnt\r\n allEventsResolve(_getEvents(values));\r\n }, allEventsReject);\r\n });\r\n });\r\n };\r\n /**\r\n * Get all of the currently cached events( with given number) from the storage mechanism\r\n */\r\n _this[_DYN_GET_NEXT_BATCH /* @min:%2egetNextBatch */] = function () {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return [];\r\n }\r\n // Start an asynchronous set of events to access the Db, this first one will wait until all current outstanding\r\n // events are completed or rejected\r\n return _openDb(function (dbCtx) {\r\n return createAsyncPromise(function (allEventsResolve, allEventsReject) {\r\n _getAllEvents(dbCtx, null, 1)[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n allEventsResolve(_getEvents(values));\r\n }, allEventsReject);\r\n });\r\n });\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, item, itemCtx) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return item;\r\n }\r\n item.id = item.id || getTimeId();\r\n item[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] = item[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] || 0;\r\n return _openDb(function (dbCtx) {\r\n var eventKey = key || item.id;\r\n var dbItem = {\r\n id: eventKey,\r\n evt: item,\r\n tm: _getTime(),\r\n v: StoreVersion\r\n };\r\n return _addDbEvent(dbCtx, dbItem, true);\r\n });\r\n };\r\n /**\r\n * Removes the values\r\n * @param evts\r\n */\r\n _this[_DYN_REMOVE_EVENTS /* @min:%2eremoveEvents */] = function (evts) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]()) {\r\n return [];\r\n }\r\n var removedEvents = [];\r\n return createAsyncPromise(function (removeEventsResolve, removeEventsReject) {\r\n // Open the Db store, this will handling resolving and rejecting this promise via the passed resolve/reject functions\r\n _openDb(function (dbCtx) {\r\n return dbCtx.openCursor(EventObjectStoreName, null, function (cursorState, value, values) {\r\n if (_getId(value.id, evts) !== -1) {\r\n var deleteRequest = cursorState.cursor.delete();\r\n deleteRequest[_DYN_ONERROR /* @min:%2eonerror */] = _cursorContinueEvent(cursorState);\r\n deleteRequest[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = function () {\r\n removedEvents[_DYN_PUSH /* @min:%2epush */](value.evt);\r\n cursorState[_DYN_CONTINUE /* @min:%2econtinue */]();\r\n };\r\n return 1 /* CursorProcessResult.Waiting */;\r\n }\r\n return 0 /* CursorProcessResult.Continue */;\r\n });\r\n })[_DYN_THEN /* @min:%2ethen */](function () {\r\n removeEventsResolve(removedEvents); // Resolve the RemoveEvents call promise\r\n }, function (reason) {\r\n removeEventsResolve(removedEvents); // Resolve the RemoveEvents call promise\r\n });\r\n });\r\n };\r\n /**\r\n * Removes all entries from the storage provider and returns them as part of the response, if there are any.\r\n */\r\n _this[_DYN_CLEAR /* @min:%2eclear */] = function (disable) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]() || !!disable) {\r\n return [];\r\n }\r\n return createAsyncPromise(function (clearResolve, clearReject) {\r\n _openDb(function (dbCtx) {\r\n //delete all evts\r\n return _deleteEvents(dbCtx, null, function (value) {\r\n return true;\r\n });\r\n })[_DYN_THEN /* @min:%2ethen */](function (values) {\r\n clearResolve(_getEvents(values));\r\n }, function (reason) {\r\n clearResolve([]);\r\n });\r\n });\r\n };\r\n _this.clean = function (disable) {\r\n if (_indexedDb == null || !_indexedDb[_DYN_IS_AVAILABLE /* @min:%2eisAvailable */]() || !!disable) {\r\n return false;\r\n }\r\n return createAsyncPromise(function (cleanResolve, cleanReject) {\r\n _openDb(function (dbCtx) {\r\n if (dbCtx.isNew) {\r\n return [];\r\n }\r\n return _dropMaxTimeEvents(dbCtx, _maxStorageTime);\r\n })[_DYN_THEN /* @min:%2ethen */](function (value) {\r\n var cnt = value && value[_DYN_LENGTH /* @min:%2elength */];\r\n if (_notificationManager && cnt) {\r\n batchDropNotification(_notificationManager, cnt, 3 /* eBatchDiscardedReason.MaxInStorageTimeExceeded */);\r\n }\r\n cleanResolve(cnt && cnt > 0);\r\n }, function (reason) {\r\n cleanResolve(false);\r\n });\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 if (_indexedDb) {\r\n _indexedDb.closeDb(_dbName);\r\n }\r\n };\r\n /**\r\n * Schedules the opening of the database if not already open\r\n */\r\n function _openDb(processFunc) {\r\n function _handleDbUpgrade(dbCtx) {\r\n return createAsyncPromise(function (createResolve, createReject) {\r\n try {\r\n _createDb(dbCtx.db);\r\n }\r\n catch (e) {\r\n createReject(e);\r\n }\r\n createResolve();\r\n });\r\n }\r\n function _handleDbOpen(dbCtx) {\r\n return createAsyncPromise(function (openResolve, openReject) {\r\n var providerCtx = {\r\n iKey: _iKey,\r\n id: _endpoint,\r\n storageId: _storageId\r\n };\r\n dbCtx.ctx = providerCtx;\r\n doAwait(processFunc(dbCtx), openResolve, openReject);\r\n });\r\n }\r\n return _indexedDb.openDb(_dbName, DbVersion, _handleDbOpen, _handleDbUpgrade);\r\n }\r\n function _addDbEvent(dbCtx, dbItem, doRetry) {\r\n return createAsyncPromise(function (addEventResolve, addEventReject) {\r\n function dropEvents(droppedFunc) {\r\n // Try and clear space by dropping the Normal level events, note dropEvents promise never rejects\r\n _dropEventsUpToPersistence(dbCtx, _maxCriticalCnt, _eventDropPerTime)[_DYN_THEN /* @min:%2ethen */](function (droppedCount) {\r\n if (_notificationManager && droppedCount) {\r\n batchDropNotification(_notificationManager, droppedCount, 2 /* eBatchDiscardedReason.CleanStorage */);\r\n }\r\n droppedFunc(droppedCount);\r\n }, function (reason) {\r\n // won't throw errors here, unblock following process\r\n droppedFunc(0);\r\n });\r\n }\r\n function _insertNewEvent() {\r\n dbCtx[_DYN_OPEN_STORE /* @min:%2eopenStore */](EventObjectStoreName, function (storeCtx) {\r\n var request = storeCtx.store.put(dbItem);\r\n request[_DYN_ONSUCCESS /* @min:%2eonsuccess */] = function (evt) {\r\n addEventResolve(dbItem.evt);\r\n };\r\n request[_DYN_ONERROR /* @min:%2eonerror */] = function (evt) {\r\n if (!doRetry) {\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n return;\r\n }\r\n function _retryAddEvent(dropCount) {\r\n if (dropCount === 0) {\r\n // We failed to free up space so just reject\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n }\r\n // Retry sending the event\r\n _addDbEvent(dbCtx, dbItem, false)[_DYN_THEN /* @min:%2ethen */](function (theItem) {\r\n addEventResolve(dbItem.evt); // Resolve the calling add Event promise\r\n }, function () {\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n });\r\n }\r\n dropEvents(function (droppedCount) {\r\n if (droppedCount > 0) {\r\n // We dropped some events so lets try adding the item again\r\n _retryAddEvent(droppedCount);\r\n }\r\n else {\r\n // We have already tried to remove all we can\r\n addEventReject(new Error(ErrorMessageUnableToAddEvent)); // Reject the calling promise\r\n }\r\n });\r\n };\r\n }).catch(function (e) {\r\n addEventReject(e);\r\n });\r\n }\r\n _insertNewEvent();\r\n });\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 IndexedDbProvider.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 IndexedDbProvider.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 IndexedDbProvider.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 * Get all of the currently cached events from the storage mechanism\r\n */\r\n IndexedDbProvider.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 * 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 IndexedDbProvider.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 IndexedDbProvider.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 IndexedDbProvider.prototype.clear = function (disable) {\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 IndexedDbProvider.prototype.clean = function (disable) {\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 IndexedDbProvider.prototype.teardown = function () {\r\n // @DynamicProtoStub - DO NOT add any code as this will be removed during packaging\r\n };\r\n return IndexedDbProvider;\r\n}());\r\nexport { IndexedDbProvider };\r\n//# sourceMappingURL=IndexDbProvider.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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;yDAqEM,CAAC;;;;;6BACsB;AAC7B;AACA;AACA"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Application Insights JavaScript SDK - Offline Channel, 0.1.1-nightly3.2402-
|
|
2
|
+
* Application Insights JavaScript SDK - Offline Channel, 0.1.1-nightly3.2402-22
|
|
3
3
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
import dynamicProto from "@microsoft/dynamicproto-js";
|
|
8
|
-
import { getGlobal, getJSON, isNotNullOrUndefined,
|
|
8
|
+
import { getGlobal, getJSON, isNotNullOrUndefined, onConfigChange } from "@microsoft/applicationinsights-core-js";
|
|
9
9
|
import { createAsyncRejectedPromise } from "@nevware21/ts-async";
|
|
10
|
-
import { getEndpointDomain, getTimeFromId, getTimeId } from "../Helpers/Utils";
|
|
10
|
+
import { batchDropNotification, forEachMap, getEndpointDomain, getTimeFromId, getTimeId } from "../Helpers/Utils";
|
|
11
11
|
import { PayloadHelper } from "../PayloadHelper";
|
|
12
|
-
import { _DYN_ADD_EVENT, _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,
|
|
12
|
+
import { _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";
|
|
13
13
|
//TODO: move all const to one file
|
|
14
14
|
var EventsToDropAtOneTime = 10;
|
|
15
15
|
var Version = "1";
|
|
@@ -54,24 +54,13 @@ function _getAvailableStorage(type) {
|
|
|
54
54
|
}
|
|
55
55
|
return storage;
|
|
56
56
|
}
|
|
57
|
-
function _forEachMap(map, callback) {
|
|
58
|
-
if (map) {
|
|
59
|
-
var keys = objKeys(map);
|
|
60
|
-
for (var lp = 0; lp < keys[_DYN_LENGTH /* @min:%2elength */]; lp++) {
|
|
61
|
-
var key = keys[lp];
|
|
62
|
-
if (!callback(map[key], key)) {
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
57
|
// will drop batches with no critical evts first
|
|
69
58
|
function _dropEventsUpToPersistence(maxCnt, events, eventsToDropAtOneTime) {
|
|
70
59
|
var dropKeys = [];
|
|
71
60
|
var persistenceCnt = 0;
|
|
72
61
|
var droppedEvents = 0;
|
|
73
62
|
while (persistenceCnt <= maxCnt && droppedEvents < eventsToDropAtOneTime) {
|
|
74
|
-
|
|
63
|
+
forEachMap(events, function (evt, key) {
|
|
75
64
|
if (evt[_DYN_CRITICAL_CNT /* @min:%2ecriticalCnt */] === persistenceCnt) {
|
|
76
65
|
dropKeys[_DYN_PUSH /* @min:%2epush */](key);
|
|
77
66
|
droppedEvents++;
|
|
@@ -82,19 +71,19 @@ function _dropEventsUpToPersistence(maxCnt, events, eventsToDropAtOneTime) {
|
|
|
82
71
|
for (var lp = 0; lp < dropKeys[_DYN_LENGTH /* @min:%2elength */]; lp++) {
|
|
83
72
|
delete events[dropKeys[lp]];
|
|
84
73
|
}
|
|
85
|
-
return
|
|
74
|
+
return droppedEvents;
|
|
86
75
|
}
|
|
87
76
|
persistenceCnt++;
|
|
88
77
|
}
|
|
89
|
-
return droppedEvents
|
|
78
|
+
return droppedEvents;
|
|
90
79
|
}
|
|
91
|
-
function _dropMaxTimeEvents(maxStorageTime, events, eventsToDropAtOneTime) {
|
|
80
|
+
function _dropMaxTimeEvents(maxStorageTime, events, eventsToDropAtOneTime, mgr) {
|
|
92
81
|
var dropKeys = [];
|
|
93
82
|
var droppedEvents = 0;
|
|
94
83
|
var currentTime = (new Date())[_DYN_GET_TIME /* @min:%2egetTime */]() + 1; // handle appended random float number
|
|
95
84
|
var minStartTime = (currentTime - maxStorageTime);
|
|
96
85
|
try {
|
|
97
|
-
|
|
86
|
+
forEachMap(events, function (evt, key) {
|
|
98
87
|
var id = getTimeFromId(key);
|
|
99
88
|
if (id <= minStartTime) {
|
|
100
89
|
dropKeys[_DYN_PUSH /* @min:%2epush */](key);
|
|
@@ -106,6 +95,9 @@ function _dropMaxTimeEvents(maxStorageTime, events, eventsToDropAtOneTime) {
|
|
|
106
95
|
for (var lp = 0; lp < dropKeys[_DYN_LENGTH /* @min:%2elength */]; lp++) {
|
|
107
96
|
delete events[dropKeys[lp]];
|
|
108
97
|
}
|
|
98
|
+
if (mgr) {
|
|
99
|
+
batchDropNotification(mgr, droppedEvents, 3 /* eBatchDiscardedReason.MaxInStorageTimeExceeded */);
|
|
100
|
+
}
|
|
109
101
|
return true;
|
|
110
102
|
}
|
|
111
103
|
}
|
|
@@ -133,6 +125,7 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
133
125
|
var _maxStorageTime = null;
|
|
134
126
|
var _eventDropPerTime = null;
|
|
135
127
|
var _maxCriticalCnt = null;
|
|
128
|
+
var _notificationManager = null;
|
|
136
129
|
_this.id = id;
|
|
137
130
|
_storage = _getAvailableStorage(storageType) || null;
|
|
138
131
|
_this["_getDbgPlgTargets"] = function () {
|
|
@@ -147,12 +140,13 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
147
140
|
_payloadHelper = new PayloadHelper(itemCtx[_DYN_DIAG_LOG /* @min:%2ediagLog */]());
|
|
148
141
|
_endpoint = getEndpointDomain(endpointUrl || providerContext[_DYN_ENDPOINT /* @min:%2eendpoint */]);
|
|
149
142
|
var autoClean = !!storageConfig.autoClean;
|
|
143
|
+
_notificationManager = providerContext[_DYN_NOTIFICATION_MGR /* @min:%2enotificationMgr */];
|
|
150
144
|
var unloadHook = onConfigChange(storageConfig, function () {
|
|
151
|
-
_maxStorageSizeInBytes = storageConfig
|
|
145
|
+
_maxStorageSizeInBytes = storageConfig.maxStorageSizeInBytes || DefaultMaxStorageSizeInBytes; // value checks and defaults should be applied during core config
|
|
152
146
|
_maxStorageTime = storageConfig[_DYN_IN_STORAGE_MAX_TIME /* @min:%2einStorageMaxTime */] || DefaultMaxInStorageTime; // TODO: handle 0
|
|
153
|
-
var dropNum = storageConfig[
|
|
147
|
+
var dropNum = storageConfig[_DYN__EVENTS_TO_DROP_PER_2 /* @min:%2eEventsToDropPerTime */];
|
|
154
148
|
_eventDropPerTime = isNotNullOrUndefined(dropNum) ? dropNum : EventsToDropAtOneTime;
|
|
155
|
-
_maxCriticalCnt = storageConfig[
|
|
149
|
+
_maxCriticalCnt = storageConfig[_DYN_MAX_CRITICAL_EVTS_DR3 /* @min:%2emaxCriticalEvtsDropCnt */] || MaxCriticalEvtsDropCnt;
|
|
156
150
|
});
|
|
157
151
|
unloadHookContainer && unloadHookContainer.add(unloadHook);
|
|
158
152
|
// currently, won't handle endpoint change here
|
|
@@ -172,7 +166,7 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
172
166
|
/**
|
|
173
167
|
* Identifies whether this storage provider support synchronous requests
|
|
174
168
|
*/
|
|
175
|
-
_this[
|
|
169
|
+
_this[_DYN_SUPPORTS_SYNC_REQUES4 /* @min:%2esupportsSyncRequests */] = function () {
|
|
176
170
|
return true;
|
|
177
171
|
};
|
|
178
172
|
/**
|
|
@@ -199,18 +193,19 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
199
193
|
// if not init, return null
|
|
200
194
|
return;
|
|
201
195
|
}
|
|
202
|
-
|
|
196
|
+
// set ordered to true, to make sure to get earliest events first
|
|
197
|
+
return _getEvts(1, true);
|
|
203
198
|
}
|
|
204
199
|
catch (e) {
|
|
205
200
|
return createAsyncRejectedPromise(e);
|
|
206
201
|
}
|
|
207
202
|
};
|
|
208
|
-
function _getEvts(cnt) {
|
|
203
|
+
function _getEvts(cnt, ordered) {
|
|
209
204
|
var allItems = [];
|
|
210
205
|
var theStore = _fetchStoredDb(_storageKey).db;
|
|
211
206
|
if (theStore) {
|
|
212
207
|
var events = theStore[_DYN_EVTS /* @min:%2eevts */];
|
|
213
|
-
|
|
208
|
+
forEachMap(events, function (evt) {
|
|
214
209
|
if (evt) {
|
|
215
210
|
if (evt[_DYN_IS_ARR /* @min:%2eisArr */]) {
|
|
216
211
|
evt = _payloadHelper.base64ToArr(evt);
|
|
@@ -221,7 +216,7 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
221
216
|
return false;
|
|
222
217
|
}
|
|
223
218
|
return true;
|
|
224
|
-
});
|
|
219
|
+
}, ordered);
|
|
225
220
|
}
|
|
226
221
|
return allItems;
|
|
227
222
|
}
|
|
@@ -240,17 +235,24 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
240
235
|
if (evt && evt[_DYN_IS_ARR /* @min:%2eisArr */]) {
|
|
241
236
|
evt = _payloadHelper.base64ToStr(evt);
|
|
242
237
|
}
|
|
238
|
+
var preDroppedCnt = 0;
|
|
243
239
|
// eslint-disable-next-line no-constant-condition
|
|
244
240
|
while (true && evt) {
|
|
245
241
|
events[id_1] = evt;
|
|
246
242
|
if (_updateStoredDb(theStore)) {
|
|
247
243
|
// Database successfully updated
|
|
244
|
+
if (preDroppedCnt && _notificationManager) {
|
|
245
|
+
// only send notification when batches are updated successfully in storage
|
|
246
|
+
batchDropNotification(_notificationManager, preDroppedCnt, 2 /* eBatchDiscardedReason.CleanStorage */);
|
|
247
|
+
}
|
|
248
248
|
return evt;
|
|
249
249
|
}
|
|
250
250
|
// Could not not add events to storage assuming its full, so drop events to make space
|
|
251
251
|
// or max size exceeded
|
|
252
252
|
delete events[id_1];
|
|
253
|
-
|
|
253
|
+
var droppedCnt = _dropEventsUpToPersistence(_maxCriticalCnt, events, _eventDropPerTime);
|
|
254
|
+
preDroppedCnt += droppedCnt;
|
|
255
|
+
if (!droppedCnt) {
|
|
254
256
|
// Can't free any space for event
|
|
255
257
|
return createAsyncRejectedPromise(new Error("Unable to free up event space"));
|
|
256
258
|
}
|
|
@@ -295,14 +297,14 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
295
297
|
/**
|
|
296
298
|
* Removes all entries from the storage provider for the current endpoint and returns them as part of the response, if there are any.
|
|
297
299
|
*/
|
|
298
|
-
_this
|
|
300
|
+
_this[_DYN_CLEAR /* @min:%2eclear */] = function () {
|
|
299
301
|
try {
|
|
300
302
|
var removedItems_1 = [];
|
|
301
303
|
var theStore = _fetchStoredDb(_storageKey, false);
|
|
302
304
|
var storedDb = theStore.db;
|
|
303
305
|
if (storedDb) {
|
|
304
306
|
var events_1 = storedDb[_DYN_EVTS /* @min:%2eevts */];
|
|
305
|
-
|
|
307
|
+
forEachMap(events_1, function (evt) {
|
|
306
308
|
if (evt) {
|
|
307
309
|
delete events_1[evt.id];
|
|
308
310
|
removedItems_1[_DYN_PUSH /* @min:%2epush */](evt);
|
|
@@ -324,7 +326,7 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
324
326
|
if (currentDb) {
|
|
325
327
|
var events = currentDb[_DYN_EVTS /* @min:%2eevts */];
|
|
326
328
|
try {
|
|
327
|
-
var isDropped = _dropMaxTimeEvents(_maxStorageTime, events, _eventDropPerTime);
|
|
329
|
+
var isDropped = _dropMaxTimeEvents(_maxStorageTime, events, _eventDropPerTime, _notificationManager);
|
|
328
330
|
if (isDropped) {
|
|
329
331
|
return _updateStoredDb(storeDetails);
|
|
330
332
|
}
|
|
@@ -427,7 +429,7 @@ var WebStorageProvider = /** @class */ (function () {
|
|
|
427
429
|
if (currentDb) {
|
|
428
430
|
var events = currentDb[_DYN_EVTS /* @min:%2eevts */];
|
|
429
431
|
try {
|
|
430
|
-
|
|
432
|
+
forEachMap(events, function (evt) {
|
|
431
433
|
if (evt) {
|
|
432
434
|
removedItems[_DYN_PUSH /* @min:%2epush */](evt);
|
|
433
435
|
}
|
|
@@ -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, objKeys, onConfigChange } from \"@microsoft/applicationinsights-core-js\";\r\nimport { createAsyncRejectedPromise } from \"@nevware21/ts-async\";\r\nimport { getEndpointDomain, getTimeFromId, getTimeId } from \"../Helpers/Utils\";\r\nimport { PayloadHelper } from \"../PayloadHelper\";\r\nimport { _DYN_ADD_EVENT, _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_DR4, _DYN_MAX_STORAGE_SIZE_IN_2, _DYN_NAME, _DYN_PUSH, _DYN_REMOVE_EVENTS, _DYN_REMOVE_ITEM, _DYN_STORAGE_CONFIG, _DYN_STORAGE_KEY_PREFIX, _DYN_SUPPORTS_SYNC_REQUES5, _DYN_TEARDOWN, _DYN__EVENTS_TO_DROP_PER_3 } 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 = 10080000; //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\nfunction _forEachMap(map, callback) {\r\n if (map) {\r\n var keys = objKeys(map);\r\n for (var lp = 0; lp < keys[_DYN_LENGTH /* @min:%2elength */]; lp++) {\r\n var key = keys[lp];\r\n if (!callback(map[key], key)) {\r\n break;\r\n }\r\n }\r\n }\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 true;\r\n }\r\n persistenceCnt++;\r\n }\r\n return droppedEvents > 0;\r\n}\r\nfunction _dropMaxTimeEvents(maxStorageTime, events, eventsToDropAtOneTime) {\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 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 _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 var unloadHook = onConfigChange(storageConfig, function () {\r\n _maxStorageSizeInBytes = storageConfig[_DYN_MAX_STORAGE_SIZE_IN_2 /* @min:%2emaxStorageSizeInBytes */] || 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_3 /* @min:%2eEventsToDropPerTime */];\r\n _eventDropPerTime = isNotNullOrUndefined(dropNum) ? dropNum : EventsToDropAtOneTime;\r\n _maxCriticalCnt = storageConfig[_DYN_MAX_CRITICAL_EVTS_DR4 /* @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_REQUES5 /* @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 return _getEvts(1);\r\n }\r\n catch (e) {\r\n return createAsyncRejectedPromise(e);\r\n }\r\n };\r\n function _getEvts(cnt) {\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 });\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 // 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 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 if (!_dropEventsUpToPersistence(_maxCriticalCnt, events, _eventDropPerTime)) {\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.clear = 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);\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\r\n * @param forceRemove\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;;;;;;;;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 = 10080000; //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\r\n * @param forceRemove\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"}
|
package/dist-es5/Sender.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*
|
|
2
|
-
* Application Insights JavaScript SDK - Offline Channel, 0.1.1-nightly3.2402-
|
|
2
|
+
* Application Insights JavaScript SDK - Offline Channel, 0.1.1-nightly3.2402-22
|
|
3
3
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
4
4
|
*/
|
|
5
5
|
|
|
@@ -15,8 +15,9 @@ export var _DYN_ENDPOINT = "endpoint"; // Count: 4
|
|
|
15
15
|
export var _DYN_ADD_EVENT = "addEvent"; // Count: 8
|
|
16
16
|
export var _DYN_COUNT = "count"; // Count: 5
|
|
17
17
|
export var _DYN_PUSH = "push"; // Count: 18
|
|
18
|
-
export var _DYN_LENGTH = "length"; // Count:
|
|
19
|
-
export var
|
|
18
|
+
export var _DYN_LENGTH = "length"; // Count: 52
|
|
19
|
+
export var _DYN_CLEAR = "clear"; // Count: 5
|
|
20
|
+
export var _DYN_GET_ITEMS = "getItems"; // Count: 4
|
|
20
21
|
export var _DYN_SPLIT = "split"; // Count: 5
|
|
21
22
|
export var _DYN_SPLICE = "splice"; // Count: 4
|
|
22
23
|
export var _DYN_INITIALIZE = "initialize"; // Count: 10
|
|
@@ -28,24 +29,27 @@ export var _DYN_REASON = "reason"; // Count: 5
|
|
|
28
29
|
export var _DYN_REJECTED = "rejected"; // Count: 7
|
|
29
30
|
export var _DYN_GET_NEXT_BATCH = "getNextBatch"; // Count: 5
|
|
30
31
|
export var _DYN_REMOVE_EVENTS = "removeEvents"; // Count: 3
|
|
31
|
-
export var _DYN_DATA = "data"; // Count:
|
|
32
|
+
export var _DYN_DATA = "data"; // Count: 16
|
|
32
33
|
export var _DYN_SEND_POST = "sendPOST"; // Count: 4
|
|
33
34
|
export var _DYN_ATTEMP_CNT = "attempCnt"; // Count: 4
|
|
34
|
-
export var _DYN_STATE = "state"; // Count:
|
|
35
|
-
export var _DYN_TEARDOWN = "teardown"; // Count:
|
|
35
|
+
export var _DYN_STATE = "state"; // Count: 9
|
|
36
|
+
export var _DYN_TEARDOWN = "teardown"; // Count: 6
|
|
36
37
|
export var _DYN_IS_ARR = "isArr"; // Count: 5
|
|
37
38
|
export var _DYN_INDEX_OF = "indexOf"; // Count: 9
|
|
38
39
|
export var _DYN_IS_ONLINE = "isOnline"; // Count: 3
|
|
39
40
|
export var _DYN_CANCEL = "cancel"; // Count: 5
|
|
40
|
-
export var _DYN_REFRESH = "refresh"; // Count: 5
|
|
41
41
|
export var _DYN_PROCESS_NEXT = "processNext"; // Count: 3
|
|
42
|
-
export var _DYN_PERSISTENCE = "persistence"; // Count:
|
|
42
|
+
export var _DYN_PERSISTENCE = "persistence"; // Count: 8
|
|
43
|
+
export var _DYN_ONUNLOAD_FLUSH = "onunloadFlush"; // Count: 3
|
|
44
|
+
export var _DYN_BATCH_HANDLER = "batchHandler"; // Count: 3
|
|
43
45
|
export var _DYN_MIN_PERSISTENCE_CACH0 = "minPersistenceCacheLevel"; // Count: 2
|
|
46
|
+
export var _DYN_REFRESH = "refresh"; // Count: 4
|
|
44
47
|
export var _DYN_IS_COMPLETELY_IDLE = "isCompletelyIdle"; // Count: 5
|
|
45
48
|
export var _DYN_CRITICAL_CNT = "criticalCnt"; // Count: 7
|
|
46
49
|
export var _DYN_GET_OFFLINE_SUPPORT = "getOfflineSupport"; // Count: 2
|
|
47
50
|
export var _DYN_OVERRIDE_INSTRUMENTA1 = "overrideInstrumentationKey"; // Count: 2
|
|
48
51
|
export var _DYN_INSTRUMENTATION_KEY = "instrumentationKey"; // Count: 3
|
|
52
|
+
export var _DYN_NOTIFICATION_MGR = "notificationMgr"; // Count: 3
|
|
49
53
|
export var _DYN_TO_STRING = "toString"; // Count: 5
|
|
50
54
|
export var _DYN_URL_STRING = "urlString"; // Count: 4
|
|
51
55
|
export var _DYN_SET_REQUEST_HEADER = "setRequestHeader"; // Count: 2
|
|
@@ -55,7 +59,7 @@ export var _DYN_REPLACE = "replace"; // Count: 4
|
|
|
55
59
|
export var _DYN_CHAR_CODE_AT = "charCodeAt"; // Count: 3
|
|
56
60
|
export var _DYN_CHAR_AT = "charAt"; // Count: 8
|
|
57
61
|
export var _DYN_FROM_CHAR_CODE = "fromCharCode"; // Count: 3
|
|
58
|
-
export var _DYN_GET_TIME = "getTime"; // Count:
|
|
62
|
+
export var _DYN_GET_TIME = "getTime"; // Count: 5
|
|
59
63
|
export var _DYN_NAME = "name"; // Count: 7
|
|
60
64
|
export var _DYN_DB_HDL = "dbHdl"; // Count: 7
|
|
61
65
|
export var _DYN_IS_AVAILABLE = "isAvailable"; // Count: 8
|
|
@@ -71,10 +75,9 @@ export var _DYN_CONTINUE = "continue"; // Count: 7
|
|
|
71
75
|
export var _DYN_SUBSTRING = "substring"; // Count: 3
|
|
72
76
|
export var _DYN_STORAGE_KEY_PREFIX = "storageKeyPrefix"; // Count: 2
|
|
73
77
|
export var _DYN_IN_STORAGE_MAX_TIME = "inStorageMaxTime"; // Count: 2
|
|
74
|
-
export var
|
|
75
|
-
export var
|
|
76
|
-
export var
|
|
77
|
-
export var _DYN_SUPPORTS_SYNC_REQUES5 = "supportsSyncRequests"; // Count: 2
|
|
78
|
+
export var _DYN__EVENTS_TO_DROP_PER_2 = "EventsToDropPerTime"; // Count: 2
|
|
79
|
+
export var _DYN_MAX_CRITICAL_EVTS_DR3 = "maxCriticalEvtsDropCnt"; // Count: 2
|
|
80
|
+
export var _DYN_SUPPORTS_SYNC_REQUES4 = "supportsSyncRequests"; // Count: 2
|
|
78
81
|
export var _DYN_REMOVE_ITEM = "removeItem"; // Count: 3
|
|
79
82
|
export var _DYN_EVTS = "evts"; // Count: 6
|
|
80
83
|
export var _DYN_LAST_ACCESS_TIME = "lastAccessTime"; // Count: 3
|