@amplitude/session-replay-browser 1.5.1 → 1.5.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"events-idb-store.d.ts","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAU,MAAM,KAAK,CAAC;AAGrD,OAAO,EACL,2BAA2B,IAAI,oCAAoC,EACnE,MAAM,EACN,wBAAwB,EAEzB,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC/C,sBAAsB,EAAE;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE;YACL,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,eAAe,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,wBAAwB,CAAC;QAChC,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,oBAAoB,QAAgB,QAAQ,WAAW,GAAG,IAAI,CAkB1E,CAAC;AAUF,eAAO,MAAM,kBAAkB,OAAQ,aAAa,eAAe,CAAC;;;CAmBnE,CAAC;AAEF,eAAO,MAAM,WAAW,WAAkB,MAAM,2CAI/C,CAAC;AAEF,qBAAa,2BAA4B,YAAW,oCAAoC;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IAC9C,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,sBAAsB,SAAgC;IACtD,QAAQ,SAAgB;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAE1B,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAK7E,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM;IAOnC;;;;;OAKG;IACH,qBAAqB,oCAAqC,MAAM,KAAG,OAAO,CAYxE;IAEF,kBAAkB,kEAWhB;IAEF,oBAAoB,cAAqB,MAAM;;;;mBA0B7C;IAEF,yBAAyB,cAAqB,MAAM,SAAS,MAAM;;;;mBA0CjE;IAEF,kBAAkB,cAAqB,MAAM,iDAW3C;IAEF,yBAAyB,eAAsB,MAAM,mBAMnD;IAEF,yBAAyB,eAAsB,MAAM,mBAqEnD;CACH;AAED,eAAO,MAAM,oBAAoB;oBAKf,OAAO;YACf,MAAM;;0CAMf,CAAC"}
1
+ {"version":3,"file":"events-idb-store.d.ts","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAU,MAAM,KAAK,CAAC;AAGrD,OAAO,EACL,2BAA2B,IAAI,oCAAoC,EACnE,MAAM,EACN,wBAAwB,EAEzB,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC/C,sBAAsB,EAAE;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE;YACL,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,eAAe,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,wBAAwB,CAAC;QAChC,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,oBAAoB,QAAgB,QAAQ,WAAW,GAAG,IAAI,CA4B1E,CAAC;AAUF,eAAO,MAAM,kBAAkB,OAAQ,aAAa,eAAe,CAAC;;;CAmBnE,CAAC;AAEF,eAAO,MAAM,WAAW,WAAkB,MAAM,2CAI/C,CAAC;AAEF,qBAAa,2BAA4B,YAAW,oCAAoC;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IAC9C,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,sBAAsB,SAAgC;IACtD,QAAQ,SAAgB;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAE1B,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAK7E,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM;IAOnC;;;;;OAKG;IACH,qBAAqB,oCAAqC,MAAM,KAAG,OAAO,CAYxE;IAEF,kBAAkB,kEAWhB;IAEF,oBAAoB,cAAqB,MAAM;;;;mBA0B7C;IAEF,yBAAyB,cAAqB,MAAM,SAAS,MAAM;;;;mBA0CjE;IAEF,kBAAkB,cAAqB,MAAM,iDAW3C;IAEF,yBAAyB,eAAsB,MAAM,mBAMnD;IAEF,yBAAyB,eAAsB,MAAM,mBA6EnD;CACH;AAED,eAAO,MAAM,oBAAoB;oBAKf,OAAO;YACf,MAAM;;0CAMf,CAAC"}
@@ -13,8 +13,14 @@ exports.sequencesToSendKey = 'sequencesToSend';
13
13
  exports.remoteConfigKey = 'remoteConfig';
14
14
  var keyValDatabaseExists = function () {
15
15
  var globalScope = (0, analytics_client_common_1.getGlobalScope)();
16
- return new Promise(function (resolve) {
17
- if (globalScope) {
16
+ return new Promise(function (resolve, reject) {
17
+ if (!globalScope) {
18
+ return reject(new Error('Global scope not found'));
19
+ }
20
+ if (!globalScope.indexedDB) {
21
+ return reject(new Error('Session Replay: cannot find indexedDB'));
22
+ }
23
+ try {
18
24
  var request_1 = globalScope.indexedDB.open('keyval-store');
19
25
  request_1.onupgradeneeded = function () {
20
26
  if (request_1.result.version === 1) {
@@ -28,6 +34,9 @@ var keyValDatabaseExists = function () {
28
34
  resolve(request_1.result);
29
35
  };
30
36
  }
37
+ catch (e) {
38
+ reject(e);
39
+ }
31
40
  });
32
41
  };
33
42
  exports.keyValDatabaseExists = keyValDatabaseExists;
@@ -260,17 +269,19 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
260
269
  });
261
270
  }); };
262
271
  this.transitionFromKeyValStore = function (sessionId) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
263
- var keyValDb, transitionCurrentSessionSequences, storageKey, getAllRequest_1, transitionPromise, globalScope, e_6;
272
+ var keyValDb, transitionCurrentSessionSequences_1, storageKey, getAllRequest_1, transitionPromise, globalScope, e_6, e_7;
264
273
  var _this = this;
265
274
  return tslib_1.__generator(this, function (_a) {
266
275
  switch (_a.label) {
267
- case 0: return [4 /*yield*/, (0, exports.keyValDatabaseExists)()];
276
+ case 0:
277
+ _a.trys.push([0, 6, , 7]);
278
+ return [4 /*yield*/, (0, exports.keyValDatabaseExists)()];
268
279
  case 1:
269
280
  keyValDb = _a.sent();
270
281
  if (!keyValDb) {
271
282
  return [2 /*return*/];
272
283
  }
273
- transitionCurrentSessionSequences = function (numericSessionId, sessionStore) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
284
+ transitionCurrentSessionSequences_1 = function (numericSessionId, sessionStore) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
274
285
  var currentSessionSequences, promisesToBatch;
275
286
  var _this = this;
276
287
  return tslib_1.__generator(this, function (_a) {
@@ -318,7 +329,7 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
318
329
  var numericSessionId = parseInt(storedSessionId, 10);
319
330
  var oldSessionStore = storedReplaySessionContexts[numericSessionId];
320
331
  if (sessionId === numericSessionId) {
321
- promisesToBatch_1.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));
332
+ promisesToBatch_1.push(transitionCurrentSessionSequences_1(numericSessionId, oldSessionStore));
322
333
  }
323
334
  else {
324
335
  var oldSessionSequences_1 = oldSessionStore.sessionSequences;
@@ -353,7 +364,12 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
353
364
  e_6 = _a.sent();
354
365
  this.loggerProvider.warn("Failed to transition session replay events from keyval to new store: ".concat(e_6));
355
366
  return [3 /*break*/, 5];
356
- case 5: return [2 /*return*/];
367
+ case 5: return [3 /*break*/, 7];
368
+ case 6:
369
+ e_7 = _a.sent();
370
+ this.loggerProvider.warn("Failed to access keyval store: ".concat(e_7, ". For more information, visit: https://www.docs.developers.amplitude.com/session-replay/sdks/standalone/#indexeddb-best-practices"));
371
+ return [3 /*break*/, 7];
372
+ case 7: return [2 /*return*/];
357
373
  }
358
374
  });
359
375
  }); };
@@ -1 +1 @@
1
- {"version":3,"file":"events-idb-store.js","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '@amplitude/analytics-client-common';\nimport { STORAGE_PREFIX } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\nimport { MAX_EVENT_LIST_SIZE_IN_BYTES, MAX_INTERVAL, MIN_INTERVAL } from '../constants';\nimport { STORAGE_FAILURE } from '../messages';\nimport {\n SessionReplayEventsIDBStore as AmplitudeSessionReplayEventsIDBStore,\n Events,\n SendingSequencesIDBInput,\n SendingSequencesIDBReturn,\n} from '../typings/session-replay';\nimport { IDBStore, IDBStoreSession, RecordingStatus } from './legacy-idb-types';\n\nexport const currentSequenceKey = 'sessionCurrentSequence';\nexport const sequencesToSendKey = 'sequencesToSend';\nexport const remoteConfigKey = 'remoteConfig';\n\nexport interface SessionReplayDB extends DBSchema {\n sessionCurrentSequence: {\n key: number;\n value: {\n sessionId: number;\n events: Events;\n };\n };\n sequencesToSend: {\n key: number;\n value: SendingSequencesIDBInput;\n indexes: { sessionId: number };\n };\n}\n\nexport const keyValDatabaseExists = function (): Promise<IDBDatabase | void> {\n const globalScope = getGlobalScope();\n return new Promise((resolve) => {\n if (globalScope) {\n const request = globalScope.indexedDB.open('keyval-store');\n request.onupgradeneeded = function () {\n if (request.result.version === 1) {\n request.result.close();\n request.transaction && request.transaction.abort();\n globalScope.indexedDB.deleteDatabase('keyval-store');\n resolve();\n }\n };\n request.onsuccess = function () {\n resolve(request.result);\n };\n }\n });\n};\n\nconst batchPromiseAll = async (promiseBatch: Promise<any>[]) => {\n while (promiseBatch.length > 0) {\n const chunkSize = 10;\n const batch = promiseBatch.splice(0, chunkSize);\n await Promise.all(batch);\n }\n};\n\nexport const defineObjectStores = (db: IDBPDatabase<SessionReplayDB>) => {\n let sequencesStore;\n let currentSequenceStore;\n if (!db.objectStoreNames.contains(currentSequenceKey)) {\n currentSequenceStore = db.createObjectStore(currentSequenceKey, {\n keyPath: 'sessionId',\n });\n }\n if (!db.objectStoreNames.contains(sequencesToSendKey)) {\n sequencesStore = db.createObjectStore(sequencesToSendKey, {\n keyPath: 'sequenceId',\n autoIncrement: true,\n });\n sequencesStore.createIndex('sessionId', 'sessionId');\n }\n return {\n sequencesStore,\n currentSequenceStore,\n };\n};\n\nexport const createStore = async (dbName: string) => {\n return await openDB<SessionReplayDB>(dbName, 1, {\n upgrade: defineObjectStores,\n });\n};\n\nexport class SessionReplayEventsIDBStore implements AmplitudeSessionReplayEventsIDBStore {\n apiKey: string;\n db: IDBPDatabase<SessionReplayDB> | undefined;\n loggerProvider: ILogger;\n storageKey = '';\n maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;\n interval = MIN_INTERVAL;\n timeAtLastSplit: number | null = null;\n\n constructor({ loggerProvider, apiKey }: { loggerProvider: ILogger; apiKey: string }) {\n this.loggerProvider = loggerProvider;\n this.apiKey = apiKey;\n }\n\n async initialize(sessionId?: number) {\n const dbName = `${this.apiKey.substring(0, 10)}_amp_session_replay_events`;\n this.db = await createStore(dbName);\n this.timeAtLastSplit = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n await this.transitionFromKeyValStore(sessionId);\n }\n\n /**\n * Determines whether to send the events list to the backend and start a new\n * empty events list, based on the size of the list as well as the last time sent\n * @param nextEventString\n * @returns boolean\n */\n shouldSplitEventsList = (events: Events, nextEventString: string): boolean => {\n const sizeOfNextEvent = new Blob([nextEventString]).size;\n const sizeOfEventsList = new Blob(events).size;\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (this.timeAtLastSplit !== null && Date.now() - this.timeAtLastSplit > this.interval && events.length) {\n this.interval = Math.min(MAX_INTERVAL, this.interval + MIN_INTERVAL);\n this.timeAtLastSplit = Date.now();\n return true;\n }\n return false;\n };\n\n getSequencesToSend = async () => {\n try {\n const sequencesToSend = (await this.db?.getAll<'sequencesToSend'>(\n sequencesToSendKey,\n )) as SendingSequencesIDBReturn[];\n\n return sequencesToSend;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeCurrentSequence = async (sessionId: number) => {\n try {\n if (!this.db) {\n return undefined;\n }\n const currentSequenceData = await this.db.get<'sessionCurrentSequence'>(currentSequenceKey, sessionId);\n if (!currentSequenceData) {\n return undefined;\n }\n\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: currentSequenceData.events,\n });\n\n await this.db.put<'sessionCurrentSequence'>(currentSequenceKey, { sessionId, events: [] });\n\n return {\n ...currentSequenceData,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n addEventToCurrentSequence = async (sessionId: number, event: string) => {\n try {\n const tx = this.db?.transaction<'sessionCurrentSequence', 'readwrite'>(currentSequenceKey, 'readwrite');\n if (!tx) {\n return;\n }\n const sequenceEvents = await tx.store.get(sessionId);\n if (!sequenceEvents) {\n await tx.store.put({ sessionId, events: [event] });\n return;\n }\n let eventsToSend;\n if (this.shouldSplitEventsList(sequenceEvents.events, event)) {\n eventsToSend = sequenceEvents.events;\n // set store to empty array\n await tx.store.put({ sessionId, events: [event] });\n } else {\n // add event to array\n const updatedEvents = sequenceEvents.events.concat(event);\n await tx.store.put({ sessionId, events: updatedEvents });\n }\n\n await tx.done;\n if (!eventsToSend) {\n return undefined;\n }\n\n const sequenceId = await this.storeSendingEvents(sessionId, eventsToSend);\n\n if (!sequenceId) {\n return undefined;\n }\n\n return {\n events: eventsToSend,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeSendingEvents = async (sessionId: number, events: Events) => {\n try {\n const sequenceId = await this.db?.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: events,\n });\n return sequenceId;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n cleanUpSessionEventsStore = async (sequenceId: number) => {\n try {\n await this.db?.delete<'sequencesToSend'>(sequencesToSendKey, sequenceId);\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n };\n\n transitionFromKeyValStore = async (sessionId?: number) => {\n const keyValDb = await keyValDatabaseExists();\n if (!keyValDb) {\n return;\n }\n\n const transitionCurrentSessionSequences = async (numericSessionId: number, sessionStore: IDBStoreSession) => {\n const currentSessionSequences = sessionStore.sessionSequences;\n const promisesToBatch: Promise<number | SendingSequencesIDBReturn | undefined>[] = [];\n\n Object.keys(currentSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n const sequence = currentSessionSequences[numericSequenceId];\n if (numericSequenceId === sessionStore.currentSequenceId) {\n const eventAddPromises: Promise<SendingSequencesIDBReturn | undefined>[] = sequence.events.map(\n async (event) => this.addEventToCurrentSequence(numericSessionId, event),\n );\n promisesToBatch.concat(eventAddPromises);\n } else if (sequence.status !== RecordingStatus.SENT) {\n promisesToBatch.push(this.storeSendingEvents(numericSessionId, sequence.events));\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n };\n\n const storageKey = `${STORAGE_PREFIX}_${this.apiKey.substring(0, 10)}`;\n try {\n const getAllRequest = keyValDb.transaction('keyval').objectStore('keyval').getAll(storageKey);\n const transitionPromise = new Promise<void>((resolve) => {\n getAllRequest.onsuccess = async (e) => {\n const storedReplaySessionContextList = e && ((e.target as IDBRequest).result as IDBStore[]);\n const storedReplaySessionContexts = storedReplaySessionContextList && storedReplaySessionContextList[0];\n if (storedReplaySessionContexts) {\n const promisesToBatch: Promise<any>[] = [];\n\n Object.keys(storedReplaySessionContexts).forEach((storedSessionId) => {\n const numericSessionId = parseInt(storedSessionId, 10);\n const oldSessionStore = storedReplaySessionContexts[numericSessionId];\n\n if (sessionId === numericSessionId) {\n promisesToBatch.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));\n } else {\n const oldSessionSequences = oldSessionStore.sessionSequences;\n Object.keys(oldSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n if (oldSessionSequences[numericSequenceId].status !== RecordingStatus.SENT) {\n promisesToBatch.push(\n this.storeSendingEvents(numericSessionId, oldSessionSequences[numericSequenceId].events),\n );\n }\n });\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n }\n resolve();\n };\n });\n\n await transitionPromise;\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.indexedDB.deleteDatabase('keyval-store');\n }\n } catch (e) {\n this.loggerProvider.warn(`Failed to transition session replay events from keyval to new store: ${e as string}`);\n }\n };\n}\n\nexport const createEventsIDBStore = async ({\n loggerProvider,\n apiKey,\n sessionId,\n}: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId?: number;\n}) => {\n const eventsIDBStore = new SessionReplayEventsIDBStore({ loggerProvider, apiKey });\n await eventsIDBStore.initialize(sessionId);\n return eventsIDBStore;\n};\n"]}
1
+ {"version":3,"file":"events-idb-store.js","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '@amplitude/analytics-client-common';\nimport { STORAGE_PREFIX } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\nimport { MAX_EVENT_LIST_SIZE_IN_BYTES, MAX_INTERVAL, MIN_INTERVAL } from '../constants';\nimport { STORAGE_FAILURE } from '../messages';\nimport {\n SessionReplayEventsIDBStore as AmplitudeSessionReplayEventsIDBStore,\n Events,\n SendingSequencesIDBInput,\n SendingSequencesIDBReturn,\n} from '../typings/session-replay';\nimport { IDBStore, IDBStoreSession, RecordingStatus } from './legacy-idb-types';\n\nexport const currentSequenceKey = 'sessionCurrentSequence';\nexport const sequencesToSendKey = 'sequencesToSend';\nexport const remoteConfigKey = 'remoteConfig';\n\nexport interface SessionReplayDB extends DBSchema {\n sessionCurrentSequence: {\n key: number;\n value: {\n sessionId: number;\n events: Events;\n };\n };\n sequencesToSend: {\n key: number;\n value: SendingSequencesIDBInput;\n indexes: { sessionId: number };\n };\n}\n\nexport const keyValDatabaseExists = function (): Promise<IDBDatabase | void> {\n const globalScope = getGlobalScope();\n return new Promise((resolve, reject) => {\n if (!globalScope) {\n return reject(new Error('Global scope not found'));\n }\n\n if (!globalScope.indexedDB) {\n return reject(new Error('Session Replay: cannot find indexedDB'));\n }\n\n try {\n const request = globalScope.indexedDB.open('keyval-store');\n request.onupgradeneeded = function () {\n if (request.result.version === 1) {\n request.result.close();\n request.transaction && request.transaction.abort();\n globalScope.indexedDB.deleteDatabase('keyval-store');\n resolve();\n }\n };\n request.onsuccess = function () {\n resolve(request.result);\n };\n } catch (e) {\n reject(e);\n }\n });\n};\n\nconst batchPromiseAll = async (promiseBatch: Promise<any>[]) => {\n while (promiseBatch.length > 0) {\n const chunkSize = 10;\n const batch = promiseBatch.splice(0, chunkSize);\n await Promise.all(batch);\n }\n};\n\nexport const defineObjectStores = (db: IDBPDatabase<SessionReplayDB>) => {\n let sequencesStore;\n let currentSequenceStore;\n if (!db.objectStoreNames.contains(currentSequenceKey)) {\n currentSequenceStore = db.createObjectStore(currentSequenceKey, {\n keyPath: 'sessionId',\n });\n }\n if (!db.objectStoreNames.contains(sequencesToSendKey)) {\n sequencesStore = db.createObjectStore(sequencesToSendKey, {\n keyPath: 'sequenceId',\n autoIncrement: true,\n });\n sequencesStore.createIndex('sessionId', 'sessionId');\n }\n return {\n sequencesStore,\n currentSequenceStore,\n };\n};\n\nexport const createStore = async (dbName: string) => {\n return await openDB<SessionReplayDB>(dbName, 1, {\n upgrade: defineObjectStores,\n });\n};\n\nexport class SessionReplayEventsIDBStore implements AmplitudeSessionReplayEventsIDBStore {\n apiKey: string;\n db: IDBPDatabase<SessionReplayDB> | undefined;\n loggerProvider: ILogger;\n storageKey = '';\n maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;\n interval = MIN_INTERVAL;\n timeAtLastSplit: number | null = null;\n\n constructor({ loggerProvider, apiKey }: { loggerProvider: ILogger; apiKey: string }) {\n this.loggerProvider = loggerProvider;\n this.apiKey = apiKey;\n }\n\n async initialize(sessionId?: number) {\n const dbName = `${this.apiKey.substring(0, 10)}_amp_session_replay_events`;\n this.db = await createStore(dbName);\n this.timeAtLastSplit = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n await this.transitionFromKeyValStore(sessionId);\n }\n\n /**\n * Determines whether to send the events list to the backend and start a new\n * empty events list, based on the size of the list as well as the last time sent\n * @param nextEventString\n * @returns boolean\n */\n shouldSplitEventsList = (events: Events, nextEventString: string): boolean => {\n const sizeOfNextEvent = new Blob([nextEventString]).size;\n const sizeOfEventsList = new Blob(events).size;\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (this.timeAtLastSplit !== null && Date.now() - this.timeAtLastSplit > this.interval && events.length) {\n this.interval = Math.min(MAX_INTERVAL, this.interval + MIN_INTERVAL);\n this.timeAtLastSplit = Date.now();\n return true;\n }\n return false;\n };\n\n getSequencesToSend = async () => {\n try {\n const sequencesToSend = (await this.db?.getAll<'sequencesToSend'>(\n sequencesToSendKey,\n )) as SendingSequencesIDBReturn[];\n\n return sequencesToSend;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeCurrentSequence = async (sessionId: number) => {\n try {\n if (!this.db) {\n return undefined;\n }\n const currentSequenceData = await this.db.get<'sessionCurrentSequence'>(currentSequenceKey, sessionId);\n if (!currentSequenceData) {\n return undefined;\n }\n\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: currentSequenceData.events,\n });\n\n await this.db.put<'sessionCurrentSequence'>(currentSequenceKey, { sessionId, events: [] });\n\n return {\n ...currentSequenceData,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n addEventToCurrentSequence = async (sessionId: number, event: string) => {\n try {\n const tx = this.db?.transaction<'sessionCurrentSequence', 'readwrite'>(currentSequenceKey, 'readwrite');\n if (!tx) {\n return;\n }\n const sequenceEvents = await tx.store.get(sessionId);\n if (!sequenceEvents) {\n await tx.store.put({ sessionId, events: [event] });\n return;\n }\n let eventsToSend;\n if (this.shouldSplitEventsList(sequenceEvents.events, event)) {\n eventsToSend = sequenceEvents.events;\n // set store to empty array\n await tx.store.put({ sessionId, events: [event] });\n } else {\n // add event to array\n const updatedEvents = sequenceEvents.events.concat(event);\n await tx.store.put({ sessionId, events: updatedEvents });\n }\n\n await tx.done;\n if (!eventsToSend) {\n return undefined;\n }\n\n const sequenceId = await this.storeSendingEvents(sessionId, eventsToSend);\n\n if (!sequenceId) {\n return undefined;\n }\n\n return {\n events: eventsToSend,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeSendingEvents = async (sessionId: number, events: Events) => {\n try {\n const sequenceId = await this.db?.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: events,\n });\n return sequenceId;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n cleanUpSessionEventsStore = async (sequenceId: number) => {\n try {\n await this.db?.delete<'sequencesToSend'>(sequencesToSendKey, sequenceId);\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n };\n\n transitionFromKeyValStore = async (sessionId?: number) => {\n try {\n const keyValDb = await keyValDatabaseExists();\n if (!keyValDb) {\n return;\n }\n\n const transitionCurrentSessionSequences = async (numericSessionId: number, sessionStore: IDBStoreSession) => {\n const currentSessionSequences = sessionStore.sessionSequences;\n const promisesToBatch: Promise<number | SendingSequencesIDBReturn | undefined>[] = [];\n\n Object.keys(currentSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n const sequence = currentSessionSequences[numericSequenceId];\n if (numericSequenceId === sessionStore.currentSequenceId) {\n const eventAddPromises: Promise<SendingSequencesIDBReturn | undefined>[] = sequence.events.map(\n async (event) => this.addEventToCurrentSequence(numericSessionId, event),\n );\n promisesToBatch.concat(eventAddPromises);\n } else if (sequence.status !== RecordingStatus.SENT) {\n promisesToBatch.push(this.storeSendingEvents(numericSessionId, sequence.events));\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n };\n\n const storageKey = `${STORAGE_PREFIX}_${this.apiKey.substring(0, 10)}`;\n try {\n const getAllRequest = keyValDb.transaction('keyval').objectStore('keyval').getAll(storageKey);\n const transitionPromise = new Promise<void>((resolve) => {\n getAllRequest.onsuccess = async (e) => {\n const storedReplaySessionContextList = e && ((e.target as IDBRequest).result as IDBStore[]);\n const storedReplaySessionContexts = storedReplaySessionContextList && storedReplaySessionContextList[0];\n if (storedReplaySessionContexts) {\n const promisesToBatch: Promise<any>[] = [];\n\n Object.keys(storedReplaySessionContexts).forEach((storedSessionId) => {\n const numericSessionId = parseInt(storedSessionId, 10);\n const oldSessionStore = storedReplaySessionContexts[numericSessionId];\n\n if (sessionId === numericSessionId) {\n promisesToBatch.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));\n } else {\n const oldSessionSequences = oldSessionStore.sessionSequences;\n Object.keys(oldSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n if (oldSessionSequences[numericSequenceId].status !== RecordingStatus.SENT) {\n promisesToBatch.push(\n this.storeSendingEvents(numericSessionId, oldSessionSequences[numericSequenceId].events),\n );\n }\n });\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n }\n resolve();\n };\n });\n\n await transitionPromise;\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.indexedDB.deleteDatabase('keyval-store');\n }\n } catch (e) {\n this.loggerProvider.warn(`Failed to transition session replay events from keyval to new store: ${e as string}`);\n }\n } catch (e) {\n this.loggerProvider.warn(\n `Failed to access keyval store: ${\n e as string\n }. For more information, visit: https://www.docs.developers.amplitude.com/session-replay/sdks/standalone/#indexeddb-best-practices`,\n );\n }\n };\n}\n\nexport const createEventsIDBStore = async ({\n loggerProvider,\n apiKey,\n sessionId,\n}: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId?: number;\n}) => {\n const eventsIDBStore = new SessionReplayEventsIDBStore({ loggerProvider, apiKey });\n await eventsIDBStore.initialize(sessionId);\n return eventsIDBStore;\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"events-idb-store.d.ts","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAU,MAAM,KAAK,CAAC;AAGrD,OAAO,EACL,2BAA2B,IAAI,oCAAoC,EACnE,MAAM,EACN,wBAAwB,EAEzB,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC/C,sBAAsB,EAAE;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE;YACL,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,eAAe,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,wBAAwB,CAAC;QAChC,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,oBAAoB,QAAgB,QAAQ,WAAW,GAAG,IAAI,CAkB1E,CAAC;AAUF,eAAO,MAAM,kBAAkB,OAAQ,aAAa,eAAe,CAAC;;;CAmBnE,CAAC;AAEF,eAAO,MAAM,WAAW,WAAkB,MAAM,2CAI/C,CAAC;AAEF,qBAAa,2BAA4B,YAAW,oCAAoC;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IAC9C,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,sBAAsB,SAAgC;IACtD,QAAQ,SAAgB;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAE1B,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAK7E,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM;IAOnC;;;;;OAKG;IACH,qBAAqB,oCAAqC,MAAM,KAAG,OAAO,CAYxE;IAEF,kBAAkB,kEAWhB;IAEF,oBAAoB,cAAqB,MAAM;;;;mBA0B7C;IAEF,yBAAyB,cAAqB,MAAM,SAAS,MAAM;;;;mBA0CjE;IAEF,kBAAkB,cAAqB,MAAM,iDAW3C;IAEF,yBAAyB,eAAsB,MAAM,mBAMnD;IAEF,yBAAyB,eAAsB,MAAM,mBAqEnD;CACH;AAED,eAAO,MAAM,oBAAoB;oBAKf,OAAO;YACf,MAAM;;0CAMf,CAAC"}
1
+ {"version":3,"file":"events-idb-store.d.ts","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAU,MAAM,KAAK,CAAC;AAGrD,OAAO,EACL,2BAA2B,IAAI,oCAAoC,EACnE,MAAM,EACN,wBAAwB,EAEzB,MAAM,2BAA2B,CAAC;AAGnC,eAAO,MAAM,kBAAkB,2BAA2B,CAAC;AAC3D,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAE9C,MAAM,WAAW,eAAgB,SAAQ,QAAQ;IAC/C,sBAAsB,EAAE;QACtB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE;YACL,SAAS,EAAE,MAAM,CAAC;YAClB,MAAM,EAAE,MAAM,CAAC;SAChB,CAAC;KACH,CAAC;IACF,eAAe,EAAE;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,wBAAwB,CAAC;QAChC,OAAO,EAAE;YAAE,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;KAChC,CAAC;CACH;AAED,eAAO,MAAM,oBAAoB,QAAgB,QAAQ,WAAW,GAAG,IAAI,CA4B1E,CAAC;AAUF,eAAO,MAAM,kBAAkB,OAAQ,aAAa,eAAe,CAAC;;;CAmBnE,CAAC;AAEF,eAAO,MAAM,WAAW,WAAkB,MAAM,2CAI/C,CAAC;AAEF,qBAAa,2BAA4B,YAAW,oCAAoC;IACtF,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,YAAY,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IAC9C,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,SAAM;IAChB,sBAAsB,SAAgC;IACtD,QAAQ,SAAgB;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;gBAE1B,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE;QAAE,cAAc,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAK7E,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM;IAOnC;;;;;OAKG;IACH,qBAAqB,oCAAqC,MAAM,KAAG,OAAO,CAYxE;IAEF,kBAAkB,kEAWhB;IAEF,oBAAoB,cAAqB,MAAM;;;;mBA0B7C;IAEF,yBAAyB,cAAqB,MAAM,SAAS,MAAM;;;;mBA0CjE;IAEF,kBAAkB,cAAqB,MAAM,iDAW3C;IAEF,yBAAyB,eAAsB,MAAM,mBAMnD;IAEF,yBAAyB,eAAsB,MAAM,mBA6EnD;CACH;AAED,eAAO,MAAM,oBAAoB;oBAKf,OAAO;YACf,MAAM;;0CAMf,CAAC"}
@@ -10,8 +10,14 @@ export var sequencesToSendKey = 'sequencesToSend';
10
10
  export var remoteConfigKey = 'remoteConfig';
11
11
  export var keyValDatabaseExists = function () {
12
12
  var globalScope = getGlobalScope();
13
- return new Promise(function (resolve) {
14
- if (globalScope) {
13
+ return new Promise(function (resolve, reject) {
14
+ if (!globalScope) {
15
+ return reject(new Error('Global scope not found'));
16
+ }
17
+ if (!globalScope.indexedDB) {
18
+ return reject(new Error('Session Replay: cannot find indexedDB'));
19
+ }
20
+ try {
15
21
  var request_1 = globalScope.indexedDB.open('keyval-store');
16
22
  request_1.onupgradeneeded = function () {
17
23
  if (request_1.result.version === 1) {
@@ -25,6 +31,9 @@ export var keyValDatabaseExists = function () {
25
31
  resolve(request_1.result);
26
32
  };
27
33
  }
34
+ catch (e) {
35
+ reject(e);
36
+ }
28
37
  });
29
38
  };
30
39
  var batchPromiseAll = function (promiseBatch) { return __awaiter(void 0, void 0, void 0, function () {
@@ -254,17 +263,19 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
254
263
  });
255
264
  }); };
256
265
  this.transitionFromKeyValStore = function (sessionId) { return __awaiter(_this, void 0, void 0, function () {
257
- var keyValDb, transitionCurrentSessionSequences, storageKey, getAllRequest_1, transitionPromise, globalScope, e_6;
266
+ var keyValDb, transitionCurrentSessionSequences_1, storageKey, getAllRequest_1, transitionPromise, globalScope, e_6, e_7;
258
267
  var _this = this;
259
268
  return __generator(this, function (_a) {
260
269
  switch (_a.label) {
261
- case 0: return [4 /*yield*/, keyValDatabaseExists()];
270
+ case 0:
271
+ _a.trys.push([0, 6, , 7]);
272
+ return [4 /*yield*/, keyValDatabaseExists()];
262
273
  case 1:
263
274
  keyValDb = _a.sent();
264
275
  if (!keyValDb) {
265
276
  return [2 /*return*/];
266
277
  }
267
- transitionCurrentSessionSequences = function (numericSessionId, sessionStore) { return __awaiter(_this, void 0, void 0, function () {
278
+ transitionCurrentSessionSequences_1 = function (numericSessionId, sessionStore) { return __awaiter(_this, void 0, void 0, function () {
268
279
  var currentSessionSequences, promisesToBatch;
269
280
  var _this = this;
270
281
  return __generator(this, function (_a) {
@@ -312,7 +323,7 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
312
323
  var numericSessionId = parseInt(storedSessionId, 10);
313
324
  var oldSessionStore = storedReplaySessionContexts[numericSessionId];
314
325
  if (sessionId === numericSessionId) {
315
- promisesToBatch_1.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));
326
+ promisesToBatch_1.push(transitionCurrentSessionSequences_1(numericSessionId, oldSessionStore));
316
327
  }
317
328
  else {
318
329
  var oldSessionSequences_1 = oldSessionStore.sessionSequences;
@@ -347,7 +358,12 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
347
358
  e_6 = _a.sent();
348
359
  this.loggerProvider.warn("Failed to transition session replay events from keyval to new store: ".concat(e_6));
349
360
  return [3 /*break*/, 5];
350
- case 5: return [2 /*return*/];
361
+ case 5: return [3 /*break*/, 7];
362
+ case 6:
363
+ e_7 = _a.sent();
364
+ this.loggerProvider.warn("Failed to access keyval store: ".concat(e_7, ". For more information, visit: https://www.docs.developers.amplitude.com/session-replay/sdks/standalone/#indexeddb-best-practices"));
365
+ return [3 /*break*/, 7];
366
+ case 7: return [2 /*return*/];
351
367
  }
352
368
  });
353
369
  }); };
@@ -1 +1 @@
1
- {"version":3,"file":"events-idb-store.js","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '@amplitude/analytics-client-common';\nimport { STORAGE_PREFIX } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\nimport { MAX_EVENT_LIST_SIZE_IN_BYTES, MAX_INTERVAL, MIN_INTERVAL } from '../constants';\nimport { STORAGE_FAILURE } from '../messages';\nimport {\n SessionReplayEventsIDBStore as AmplitudeSessionReplayEventsIDBStore,\n Events,\n SendingSequencesIDBInput,\n SendingSequencesIDBReturn,\n} from '../typings/session-replay';\nimport { IDBStore, IDBStoreSession, RecordingStatus } from './legacy-idb-types';\n\nexport const currentSequenceKey = 'sessionCurrentSequence';\nexport const sequencesToSendKey = 'sequencesToSend';\nexport const remoteConfigKey = 'remoteConfig';\n\nexport interface SessionReplayDB extends DBSchema {\n sessionCurrentSequence: {\n key: number;\n value: {\n sessionId: number;\n events: Events;\n };\n };\n sequencesToSend: {\n key: number;\n value: SendingSequencesIDBInput;\n indexes: { sessionId: number };\n };\n}\n\nexport const keyValDatabaseExists = function (): Promise<IDBDatabase | void> {\n const globalScope = getGlobalScope();\n return new Promise((resolve) => {\n if (globalScope) {\n const request = globalScope.indexedDB.open('keyval-store');\n request.onupgradeneeded = function () {\n if (request.result.version === 1) {\n request.result.close();\n request.transaction && request.transaction.abort();\n globalScope.indexedDB.deleteDatabase('keyval-store');\n resolve();\n }\n };\n request.onsuccess = function () {\n resolve(request.result);\n };\n }\n });\n};\n\nconst batchPromiseAll = async (promiseBatch: Promise<any>[]) => {\n while (promiseBatch.length > 0) {\n const chunkSize = 10;\n const batch = promiseBatch.splice(0, chunkSize);\n await Promise.all(batch);\n }\n};\n\nexport const defineObjectStores = (db: IDBPDatabase<SessionReplayDB>) => {\n let sequencesStore;\n let currentSequenceStore;\n if (!db.objectStoreNames.contains(currentSequenceKey)) {\n currentSequenceStore = db.createObjectStore(currentSequenceKey, {\n keyPath: 'sessionId',\n });\n }\n if (!db.objectStoreNames.contains(sequencesToSendKey)) {\n sequencesStore = db.createObjectStore(sequencesToSendKey, {\n keyPath: 'sequenceId',\n autoIncrement: true,\n });\n sequencesStore.createIndex('sessionId', 'sessionId');\n }\n return {\n sequencesStore,\n currentSequenceStore,\n };\n};\n\nexport const createStore = async (dbName: string) => {\n return await openDB<SessionReplayDB>(dbName, 1, {\n upgrade: defineObjectStores,\n });\n};\n\nexport class SessionReplayEventsIDBStore implements AmplitudeSessionReplayEventsIDBStore {\n apiKey: string;\n db: IDBPDatabase<SessionReplayDB> | undefined;\n loggerProvider: ILogger;\n storageKey = '';\n maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;\n interval = MIN_INTERVAL;\n timeAtLastSplit: number | null = null;\n\n constructor({ loggerProvider, apiKey }: { loggerProvider: ILogger; apiKey: string }) {\n this.loggerProvider = loggerProvider;\n this.apiKey = apiKey;\n }\n\n async initialize(sessionId?: number) {\n const dbName = `${this.apiKey.substring(0, 10)}_amp_session_replay_events`;\n this.db = await createStore(dbName);\n this.timeAtLastSplit = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n await this.transitionFromKeyValStore(sessionId);\n }\n\n /**\n * Determines whether to send the events list to the backend and start a new\n * empty events list, based on the size of the list as well as the last time sent\n * @param nextEventString\n * @returns boolean\n */\n shouldSplitEventsList = (events: Events, nextEventString: string): boolean => {\n const sizeOfNextEvent = new Blob([nextEventString]).size;\n const sizeOfEventsList = new Blob(events).size;\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (this.timeAtLastSplit !== null && Date.now() - this.timeAtLastSplit > this.interval && events.length) {\n this.interval = Math.min(MAX_INTERVAL, this.interval + MIN_INTERVAL);\n this.timeAtLastSplit = Date.now();\n return true;\n }\n return false;\n };\n\n getSequencesToSend = async () => {\n try {\n const sequencesToSend = (await this.db?.getAll<'sequencesToSend'>(\n sequencesToSendKey,\n )) as SendingSequencesIDBReturn[];\n\n return sequencesToSend;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeCurrentSequence = async (sessionId: number) => {\n try {\n if (!this.db) {\n return undefined;\n }\n const currentSequenceData = await this.db.get<'sessionCurrentSequence'>(currentSequenceKey, sessionId);\n if (!currentSequenceData) {\n return undefined;\n }\n\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: currentSequenceData.events,\n });\n\n await this.db.put<'sessionCurrentSequence'>(currentSequenceKey, { sessionId, events: [] });\n\n return {\n ...currentSequenceData,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n addEventToCurrentSequence = async (sessionId: number, event: string) => {\n try {\n const tx = this.db?.transaction<'sessionCurrentSequence', 'readwrite'>(currentSequenceKey, 'readwrite');\n if (!tx) {\n return;\n }\n const sequenceEvents = await tx.store.get(sessionId);\n if (!sequenceEvents) {\n await tx.store.put({ sessionId, events: [event] });\n return;\n }\n let eventsToSend;\n if (this.shouldSplitEventsList(sequenceEvents.events, event)) {\n eventsToSend = sequenceEvents.events;\n // set store to empty array\n await tx.store.put({ sessionId, events: [event] });\n } else {\n // add event to array\n const updatedEvents = sequenceEvents.events.concat(event);\n await tx.store.put({ sessionId, events: updatedEvents });\n }\n\n await tx.done;\n if (!eventsToSend) {\n return undefined;\n }\n\n const sequenceId = await this.storeSendingEvents(sessionId, eventsToSend);\n\n if (!sequenceId) {\n return undefined;\n }\n\n return {\n events: eventsToSend,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeSendingEvents = async (sessionId: number, events: Events) => {\n try {\n const sequenceId = await this.db?.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: events,\n });\n return sequenceId;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n cleanUpSessionEventsStore = async (sequenceId: number) => {\n try {\n await this.db?.delete<'sequencesToSend'>(sequencesToSendKey, sequenceId);\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n };\n\n transitionFromKeyValStore = async (sessionId?: number) => {\n const keyValDb = await keyValDatabaseExists();\n if (!keyValDb) {\n return;\n }\n\n const transitionCurrentSessionSequences = async (numericSessionId: number, sessionStore: IDBStoreSession) => {\n const currentSessionSequences = sessionStore.sessionSequences;\n const promisesToBatch: Promise<number | SendingSequencesIDBReturn | undefined>[] = [];\n\n Object.keys(currentSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n const sequence = currentSessionSequences[numericSequenceId];\n if (numericSequenceId === sessionStore.currentSequenceId) {\n const eventAddPromises: Promise<SendingSequencesIDBReturn | undefined>[] = sequence.events.map(\n async (event) => this.addEventToCurrentSequence(numericSessionId, event),\n );\n promisesToBatch.concat(eventAddPromises);\n } else if (sequence.status !== RecordingStatus.SENT) {\n promisesToBatch.push(this.storeSendingEvents(numericSessionId, sequence.events));\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n };\n\n const storageKey = `${STORAGE_PREFIX}_${this.apiKey.substring(0, 10)}`;\n try {\n const getAllRequest = keyValDb.transaction('keyval').objectStore('keyval').getAll(storageKey);\n const transitionPromise = new Promise<void>((resolve) => {\n getAllRequest.onsuccess = async (e) => {\n const storedReplaySessionContextList = e && ((e.target as IDBRequest).result as IDBStore[]);\n const storedReplaySessionContexts = storedReplaySessionContextList && storedReplaySessionContextList[0];\n if (storedReplaySessionContexts) {\n const promisesToBatch: Promise<any>[] = [];\n\n Object.keys(storedReplaySessionContexts).forEach((storedSessionId) => {\n const numericSessionId = parseInt(storedSessionId, 10);\n const oldSessionStore = storedReplaySessionContexts[numericSessionId];\n\n if (sessionId === numericSessionId) {\n promisesToBatch.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));\n } else {\n const oldSessionSequences = oldSessionStore.sessionSequences;\n Object.keys(oldSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n if (oldSessionSequences[numericSequenceId].status !== RecordingStatus.SENT) {\n promisesToBatch.push(\n this.storeSendingEvents(numericSessionId, oldSessionSequences[numericSequenceId].events),\n );\n }\n });\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n }\n resolve();\n };\n });\n\n await transitionPromise;\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.indexedDB.deleteDatabase('keyval-store');\n }\n } catch (e) {\n this.loggerProvider.warn(`Failed to transition session replay events from keyval to new store: ${e as string}`);\n }\n };\n}\n\nexport const createEventsIDBStore = async ({\n loggerProvider,\n apiKey,\n sessionId,\n}: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId?: number;\n}) => {\n const eventsIDBStore = new SessionReplayEventsIDBStore({ loggerProvider, apiKey });\n await eventsIDBStore.initialize(sessionId);\n return eventsIDBStore;\n};\n"]}
1
+ {"version":3,"file":"events-idb-store.js","sourceRoot":"","sources":["../../../src/events/events-idb-store.ts"],"names":[],"mappings":"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","sourcesContent":["import { getGlobalScope } from '@amplitude/analytics-client-common';\nimport { STORAGE_PREFIX } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { DBSchema, IDBPDatabase, openDB } from 'idb';\nimport { MAX_EVENT_LIST_SIZE_IN_BYTES, MAX_INTERVAL, MIN_INTERVAL } from '../constants';\nimport { STORAGE_FAILURE } from '../messages';\nimport {\n SessionReplayEventsIDBStore as AmplitudeSessionReplayEventsIDBStore,\n Events,\n SendingSequencesIDBInput,\n SendingSequencesIDBReturn,\n} from '../typings/session-replay';\nimport { IDBStore, IDBStoreSession, RecordingStatus } from './legacy-idb-types';\n\nexport const currentSequenceKey = 'sessionCurrentSequence';\nexport const sequencesToSendKey = 'sequencesToSend';\nexport const remoteConfigKey = 'remoteConfig';\n\nexport interface SessionReplayDB extends DBSchema {\n sessionCurrentSequence: {\n key: number;\n value: {\n sessionId: number;\n events: Events;\n };\n };\n sequencesToSend: {\n key: number;\n value: SendingSequencesIDBInput;\n indexes: { sessionId: number };\n };\n}\n\nexport const keyValDatabaseExists = function (): Promise<IDBDatabase | void> {\n const globalScope = getGlobalScope();\n return new Promise((resolve, reject) => {\n if (!globalScope) {\n return reject(new Error('Global scope not found'));\n }\n\n if (!globalScope.indexedDB) {\n return reject(new Error('Session Replay: cannot find indexedDB'));\n }\n\n try {\n const request = globalScope.indexedDB.open('keyval-store');\n request.onupgradeneeded = function () {\n if (request.result.version === 1) {\n request.result.close();\n request.transaction && request.transaction.abort();\n globalScope.indexedDB.deleteDatabase('keyval-store');\n resolve();\n }\n };\n request.onsuccess = function () {\n resolve(request.result);\n };\n } catch (e) {\n reject(e);\n }\n });\n};\n\nconst batchPromiseAll = async (promiseBatch: Promise<any>[]) => {\n while (promiseBatch.length > 0) {\n const chunkSize = 10;\n const batch = promiseBatch.splice(0, chunkSize);\n await Promise.all(batch);\n }\n};\n\nexport const defineObjectStores = (db: IDBPDatabase<SessionReplayDB>) => {\n let sequencesStore;\n let currentSequenceStore;\n if (!db.objectStoreNames.contains(currentSequenceKey)) {\n currentSequenceStore = db.createObjectStore(currentSequenceKey, {\n keyPath: 'sessionId',\n });\n }\n if (!db.objectStoreNames.contains(sequencesToSendKey)) {\n sequencesStore = db.createObjectStore(sequencesToSendKey, {\n keyPath: 'sequenceId',\n autoIncrement: true,\n });\n sequencesStore.createIndex('sessionId', 'sessionId');\n }\n return {\n sequencesStore,\n currentSequenceStore,\n };\n};\n\nexport const createStore = async (dbName: string) => {\n return await openDB<SessionReplayDB>(dbName, 1, {\n upgrade: defineObjectStores,\n });\n};\n\nexport class SessionReplayEventsIDBStore implements AmplitudeSessionReplayEventsIDBStore {\n apiKey: string;\n db: IDBPDatabase<SessionReplayDB> | undefined;\n loggerProvider: ILogger;\n storageKey = '';\n maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;\n interval = MIN_INTERVAL;\n timeAtLastSplit: number | null = null;\n\n constructor({ loggerProvider, apiKey }: { loggerProvider: ILogger; apiKey: string }) {\n this.loggerProvider = loggerProvider;\n this.apiKey = apiKey;\n }\n\n async initialize(sessionId?: number) {\n const dbName = `${this.apiKey.substring(0, 10)}_amp_session_replay_events`;\n this.db = await createStore(dbName);\n this.timeAtLastSplit = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n await this.transitionFromKeyValStore(sessionId);\n }\n\n /**\n * Determines whether to send the events list to the backend and start a new\n * empty events list, based on the size of the list as well as the last time sent\n * @param nextEventString\n * @returns boolean\n */\n shouldSplitEventsList = (events: Events, nextEventString: string): boolean => {\n const sizeOfNextEvent = new Blob([nextEventString]).size;\n const sizeOfEventsList = new Blob(events).size;\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (this.timeAtLastSplit !== null && Date.now() - this.timeAtLastSplit > this.interval && events.length) {\n this.interval = Math.min(MAX_INTERVAL, this.interval + MIN_INTERVAL);\n this.timeAtLastSplit = Date.now();\n return true;\n }\n return false;\n };\n\n getSequencesToSend = async () => {\n try {\n const sequencesToSend = (await this.db?.getAll<'sequencesToSend'>(\n sequencesToSendKey,\n )) as SendingSequencesIDBReturn[];\n\n return sequencesToSend;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeCurrentSequence = async (sessionId: number) => {\n try {\n if (!this.db) {\n return undefined;\n }\n const currentSequenceData = await this.db.get<'sessionCurrentSequence'>(currentSequenceKey, sessionId);\n if (!currentSequenceData) {\n return undefined;\n }\n\n const sequenceId = await this.db.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: currentSequenceData.events,\n });\n\n await this.db.put<'sessionCurrentSequence'>(currentSequenceKey, { sessionId, events: [] });\n\n return {\n ...currentSequenceData,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n addEventToCurrentSequence = async (sessionId: number, event: string) => {\n try {\n const tx = this.db?.transaction<'sessionCurrentSequence', 'readwrite'>(currentSequenceKey, 'readwrite');\n if (!tx) {\n return;\n }\n const sequenceEvents = await tx.store.get(sessionId);\n if (!sequenceEvents) {\n await tx.store.put({ sessionId, events: [event] });\n return;\n }\n let eventsToSend;\n if (this.shouldSplitEventsList(sequenceEvents.events, event)) {\n eventsToSend = sequenceEvents.events;\n // set store to empty array\n await tx.store.put({ sessionId, events: [event] });\n } else {\n // add event to array\n const updatedEvents = sequenceEvents.events.concat(event);\n await tx.store.put({ sessionId, events: updatedEvents });\n }\n\n await tx.done;\n if (!eventsToSend) {\n return undefined;\n }\n\n const sequenceId = await this.storeSendingEvents(sessionId, eventsToSend);\n\n if (!sequenceId) {\n return undefined;\n }\n\n return {\n events: eventsToSend,\n sessionId,\n sequenceId,\n };\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n storeSendingEvents = async (sessionId: number, events: Events) => {\n try {\n const sequenceId = await this.db?.put<'sequencesToSend'>(sequencesToSendKey, {\n sessionId: sessionId,\n events: events,\n });\n return sequenceId;\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n return undefined;\n };\n\n cleanUpSessionEventsStore = async (sequenceId: number) => {\n try {\n await this.db?.delete<'sequencesToSend'>(sequencesToSendKey, sequenceId);\n } catch (e) {\n this.loggerProvider.warn(`${STORAGE_FAILURE}: ${e as string}`);\n }\n };\n\n transitionFromKeyValStore = async (sessionId?: number) => {\n try {\n const keyValDb = await keyValDatabaseExists();\n if (!keyValDb) {\n return;\n }\n\n const transitionCurrentSessionSequences = async (numericSessionId: number, sessionStore: IDBStoreSession) => {\n const currentSessionSequences = sessionStore.sessionSequences;\n const promisesToBatch: Promise<number | SendingSequencesIDBReturn | undefined>[] = [];\n\n Object.keys(currentSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n const sequence = currentSessionSequences[numericSequenceId];\n if (numericSequenceId === sessionStore.currentSequenceId) {\n const eventAddPromises: Promise<SendingSequencesIDBReturn | undefined>[] = sequence.events.map(\n async (event) => this.addEventToCurrentSequence(numericSessionId, event),\n );\n promisesToBatch.concat(eventAddPromises);\n } else if (sequence.status !== RecordingStatus.SENT) {\n promisesToBatch.push(this.storeSendingEvents(numericSessionId, sequence.events));\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n };\n\n const storageKey = `${STORAGE_PREFIX}_${this.apiKey.substring(0, 10)}`;\n try {\n const getAllRequest = keyValDb.transaction('keyval').objectStore('keyval').getAll(storageKey);\n const transitionPromise = new Promise<void>((resolve) => {\n getAllRequest.onsuccess = async (e) => {\n const storedReplaySessionContextList = e && ((e.target as IDBRequest).result as IDBStore[]);\n const storedReplaySessionContexts = storedReplaySessionContextList && storedReplaySessionContextList[0];\n if (storedReplaySessionContexts) {\n const promisesToBatch: Promise<any>[] = [];\n\n Object.keys(storedReplaySessionContexts).forEach((storedSessionId) => {\n const numericSessionId = parseInt(storedSessionId, 10);\n const oldSessionStore = storedReplaySessionContexts[numericSessionId];\n\n if (sessionId === numericSessionId) {\n promisesToBatch.push(transitionCurrentSessionSequences(numericSessionId, oldSessionStore));\n } else {\n const oldSessionSequences = oldSessionStore.sessionSequences;\n Object.keys(oldSessionSequences).forEach((sequenceId) => {\n const numericSequenceId = parseInt(sequenceId, 10);\n if (oldSessionSequences[numericSequenceId].status !== RecordingStatus.SENT) {\n promisesToBatch.push(\n this.storeSendingEvents(numericSessionId, oldSessionSequences[numericSequenceId].events),\n );\n }\n });\n }\n });\n\n await batchPromiseAll(promisesToBatch);\n }\n resolve();\n };\n });\n\n await transitionPromise;\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.indexedDB.deleteDatabase('keyval-store');\n }\n } catch (e) {\n this.loggerProvider.warn(`Failed to transition session replay events from keyval to new store: ${e as string}`);\n }\n } catch (e) {\n this.loggerProvider.warn(\n `Failed to access keyval store: ${\n e as string\n }. For more information, visit: https://www.docs.developers.amplitude.com/session-replay/sdks/standalone/#indexeddb-best-practices`,\n );\n }\n };\n}\n\nexport const createEventsIDBStore = async ({\n loggerProvider,\n apiKey,\n sessionId,\n}: {\n loggerProvider: ILogger;\n apiKey: string;\n sessionId?: number;\n}) => {\n const eventsIDBStore = new SessionReplayEventsIDBStore({ loggerProvider, apiKey });\n await eventsIDBStore.initialize(sessionId);\n return eventsIDBStore;\n};\n"]}