@amplitude/session-replay-browser 1.14.3 → 1.15.1-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.
Files changed (120) hide show
  1. package/lib/cjs/config/local-config.d.ts +2 -1
  2. package/lib/cjs/config/local-config.d.ts.map +1 -1
  3. package/lib/cjs/config/local-config.js +2 -0
  4. package/lib/cjs/config/local-config.js.map +1 -1
  5. package/lib/cjs/config/types.d.ts +2 -0
  6. package/lib/cjs/config/types.d.ts.map +1 -1
  7. package/lib/cjs/config/types.js.map +1 -1
  8. package/lib/cjs/events/base-events-store.d.ts +31 -0
  9. package/lib/cjs/events/base-events-store.d.ts.map +1 -0
  10. package/lib/cjs/events/base-events-store.js +47 -0
  11. package/lib/cjs/events/base-events-store.js.map +1 -0
  12. package/lib/cjs/events/event-compressor.js +2 -2
  13. package/lib/cjs/events/event-compressor.js.map +1 -1
  14. package/lib/cjs/events/events-idb-store.d.ts +16 -40
  15. package/lib/cjs/events/events-idb-store.d.ts.map +1 -1
  16. package/lib/cjs/events/events-idb-store.js +146 -139
  17. package/lib/cjs/events/events-idb-store.js.map +1 -1
  18. package/lib/cjs/events/events-manager.d.ts +3 -2
  19. package/lib/cjs/events/events-manager.d.ts.map +1 -1
  20. package/lib/cjs/events/events-manager.js +51 -18
  21. package/lib/cjs/events/events-manager.js.map +1 -1
  22. package/lib/cjs/events/events-memory-store.d.ts +15 -0
  23. package/lib/cjs/events/events-memory-store.d.ts.map +1 -0
  24. package/lib/cjs/events/events-memory-store.js +84 -0
  25. package/lib/cjs/events/events-memory-store.js.map +1 -0
  26. package/lib/cjs/helpers.d.ts +1 -0
  27. package/lib/cjs/helpers.d.ts.map +1 -1
  28. package/lib/cjs/hooks/click.d.ts.map +1 -1
  29. package/lib/cjs/hooks/click.js +3 -0
  30. package/lib/cjs/hooks/click.js.map +1 -1
  31. package/lib/cjs/index.d.ts +1 -1
  32. package/lib/cjs/index.d.ts.map +1 -1
  33. package/lib/cjs/index.js.map +1 -1
  34. package/lib/cjs/session-replay.d.ts.map +1 -1
  35. package/lib/cjs/session-replay.js +26 -18
  36. package/lib/cjs/session-replay.js.map +1 -1
  37. package/lib/cjs/track-destination.d.ts.map +1 -1
  38. package/lib/cjs/track-destination.js +3 -4
  39. package/lib/cjs/track-destination.js.map +1 -1
  40. package/lib/cjs/typings/session-replay.d.ts +20 -12
  41. package/lib/cjs/typings/session-replay.d.ts.map +1 -1
  42. package/lib/cjs/typings/session-replay.js.map +1 -1
  43. package/lib/cjs/version.d.ts +1 -1
  44. package/lib/cjs/version.d.ts.map +1 -1
  45. package/lib/cjs/version.js +1 -1
  46. package/lib/cjs/version.js.map +1 -1
  47. package/lib/esm/config/local-config.d.ts +2 -1
  48. package/lib/esm/config/local-config.d.ts.map +1 -1
  49. package/lib/esm/config/local-config.js +2 -0
  50. package/lib/esm/config/local-config.js.map +1 -1
  51. package/lib/esm/config/types.d.ts +2 -0
  52. package/lib/esm/config/types.d.ts.map +1 -1
  53. package/lib/esm/config/types.js.map +1 -1
  54. package/lib/esm/events/base-events-store.d.ts +31 -0
  55. package/lib/esm/events/base-events-store.d.ts.map +1 -0
  56. package/lib/esm/events/base-events-store.js +45 -0
  57. package/lib/esm/events/base-events-store.js.map +1 -0
  58. package/lib/esm/events/event-compressor.js +1 -1
  59. package/lib/esm/events/event-compressor.js.map +1 -1
  60. package/lib/esm/events/events-idb-store.d.ts +16 -40
  61. package/lib/esm/events/events-idb-store.d.ts.map +1 -1
  62. package/lib/esm/events/events-idb-store.js +146 -138
  63. package/lib/esm/events/events-idb-store.js.map +1 -1
  64. package/lib/esm/events/events-manager.d.ts +3 -2
  65. package/lib/esm/events/events-manager.d.ts.map +1 -1
  66. package/lib/esm/events/events-manager.js +51 -18
  67. package/lib/esm/events/events-manager.js.map +1 -1
  68. package/lib/esm/events/events-memory-store.d.ts +15 -0
  69. package/lib/esm/events/events-memory-store.d.ts.map +1 -0
  70. package/lib/esm/events/events-memory-store.js +82 -0
  71. package/lib/esm/events/events-memory-store.js.map +1 -0
  72. package/lib/esm/helpers.d.ts +1 -0
  73. package/lib/esm/helpers.d.ts.map +1 -1
  74. package/lib/esm/hooks/click.d.ts.map +1 -1
  75. package/lib/esm/hooks/click.js +3 -0
  76. package/lib/esm/hooks/click.js.map +1 -1
  77. package/lib/esm/index.d.ts +1 -1
  78. package/lib/esm/index.d.ts.map +1 -1
  79. package/lib/esm/index.js.map +1 -1
  80. package/lib/esm/session-replay.d.ts.map +1 -1
  81. package/lib/esm/session-replay.js +26 -18
  82. package/lib/esm/session-replay.js.map +1 -1
  83. package/lib/esm/track-destination.d.ts.map +1 -1
  84. package/lib/esm/track-destination.js +3 -4
  85. package/lib/esm/track-destination.js.map +1 -1
  86. package/lib/esm/typings/session-replay.d.ts +20 -12
  87. package/lib/esm/typings/session-replay.d.ts.map +1 -1
  88. package/lib/esm/typings/session-replay.js.map +1 -1
  89. package/lib/esm/version.d.ts +1 -1
  90. package/lib/esm/version.d.ts.map +1 -1
  91. package/lib/esm/version.js +1 -1
  92. package/lib/esm/version.js.map +1 -1
  93. package/lib/scripts/amplitude-min.js +1 -1
  94. package/lib/scripts/amplitude-min.js.gz +0 -0
  95. package/lib/scripts/amplitude-min.umd.js +1 -1
  96. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  97. package/lib/scripts/config/local-config.d.ts +2 -1
  98. package/lib/scripts/config/local-config.d.ts.map +1 -1
  99. package/lib/scripts/config/types.d.ts +2 -0
  100. package/lib/scripts/config/types.d.ts.map +1 -1
  101. package/lib/scripts/events/base-events-store.d.ts +31 -0
  102. package/lib/scripts/events/base-events-store.d.ts.map +1 -0
  103. package/lib/scripts/events/events-idb-store.d.ts +16 -40
  104. package/lib/scripts/events/events-idb-store.d.ts.map +1 -1
  105. package/lib/scripts/events/events-manager.d.ts +3 -2
  106. package/lib/scripts/events/events-manager.d.ts.map +1 -1
  107. package/lib/scripts/events/events-memory-store.d.ts +15 -0
  108. package/lib/scripts/events/events-memory-store.d.ts.map +1 -0
  109. package/lib/scripts/helpers.d.ts +1 -0
  110. package/lib/scripts/helpers.d.ts.map +1 -1
  111. package/lib/scripts/hooks/click.d.ts.map +1 -1
  112. package/lib/scripts/index.d.ts +1 -1
  113. package/lib/scripts/index.d.ts.map +1 -1
  114. package/lib/scripts/session-replay.d.ts.map +1 -1
  115. package/lib/scripts/track-destination.d.ts.map +1 -1
  116. package/lib/scripts/typings/session-replay.d.ts +20 -12
  117. package/lib/scripts/typings/session-replay.d.ts.map +1 -1
  118. package/lib/scripts/version.d.ts +1 -1
  119. package/lib/scripts/version.d.ts.map +1 -1
  120. package/package.json +5 -3
@@ -2,11 +2,12 @@ var _this = this;
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createEventsManager = void 0;
4
4
  var tslib_1 = require("tslib");
5
- var events_idb_store_1 = require("./events-idb-store");
6
- var track_destination_1 = require("../track-destination");
7
5
  var helpers_1 = require("../helpers");
6
+ var track_destination_1 = require("../track-destination");
7
+ var events_idb_store_1 = require("./events-idb-store");
8
+ var events_memory_store_1 = require("./events-memory-store");
8
9
  var createEventsManager = function (_a) {
9
- var config = _a.config, sessionId = _a.sessionId, minInterval = _a.minInterval, maxInterval = _a.maxInterval, type = _a.type, payloadBatcher = _a.payloadBatcher;
10
+ var config = _a.config, sessionId = _a.sessionId, minInterval = _a.minInterval, maxInterval = _a.maxInterval, type = _a.type, payloadBatcher = _a.payloadBatcher, storeType = _a.storeType;
10
11
  return tslib_1.__awaiter(_this, void 0, void 0, function () {
11
12
  function flush(useRetry) {
12
13
  if (useRetry === void 0) { useRetry = false; }
@@ -16,22 +17,46 @@ var createEventsManager = function (_a) {
16
17
  });
17
18
  });
18
19
  }
19
- var trackDestination, eventsIDBStore, sendEventsList, sendCurrentSequenceEvents, sendStoredEvents, addEvent;
20
+ var trackDestination, getMemoryStore, getIdbStoreOrFallback, store, _b, sendEventsList, sendCurrentSequenceEvents, sendStoredEvents, addEvent;
20
21
  var _this = this;
21
- return tslib_1.__generator(this, function (_b) {
22
- switch (_b.label) {
22
+ return tslib_1.__generator(this, function (_c) {
23
+ switch (_c.label) {
23
24
  case 0:
24
25
  trackDestination = new track_destination_1.SessionReplayTrackDestination({ loggerProvider: config.loggerProvider, payloadBatcher: payloadBatcher });
25
- return [4 /*yield*/, (0, events_idb_store_1.createEventsIDBStore)({
26
+ getMemoryStore = function () {
27
+ return new events_memory_store_1.InMemoryEventsStore({
26
28
  loggerProvider: config.loggerProvider,
27
- apiKey: config.apiKey,
28
- sessionId: sessionId,
29
- minInterval: minInterval,
30
29
  maxInterval: maxInterval,
31
- type: type,
32
- })];
30
+ minInterval: minInterval,
31
+ });
32
+ };
33
+ getIdbStoreOrFallback = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
34
+ var store;
35
+ return tslib_1.__generator(this, function (_a) {
36
+ switch (_a.label) {
37
+ case 0: return [4 /*yield*/, events_idb_store_1.SessionReplayEventsIDBStore.new(type, {
38
+ loggerProvider: config.loggerProvider,
39
+ minInterval: minInterval,
40
+ maxInterval: maxInterval,
41
+ apiKey: config.apiKey,
42
+ }, sessionId)];
43
+ case 1:
44
+ store = _a.sent();
45
+ config.loggerProvider.log('Failed to initialize idb store, falling back to memory store.');
46
+ return [2 /*return*/, store !== null && store !== void 0 ? store : getMemoryStore()];
47
+ }
48
+ });
49
+ }); };
50
+ if (!(storeType === 'idb')) return [3 /*break*/, 2];
51
+ return [4 /*yield*/, getIdbStoreOrFallback()];
33
52
  case 1:
34
- eventsIDBStore = _b.sent();
53
+ _b = _c.sent();
54
+ return [3 /*break*/, 3];
55
+ case 2:
56
+ _b = getMemoryStore();
57
+ _c.label = 3;
58
+ case 3:
59
+ store = _b;
35
60
  sendEventsList = function (_a) {
36
61
  var events = _a.events, sessionId = _a.sessionId, deviceId = _a.deviceId, sequenceId = _a.sequenceId;
37
62
  if (config.debugMode) {
@@ -46,7 +71,6 @@ var createEventsManager = function (_a) {
46
71
  }
47
72
  trackDestination.sendEventsList({
48
73
  events: events,
49
- sequenceId: sequenceId,
50
74
  sessionId: sessionId,
51
75
  flushMaxRetries: config.flushMaxRetries,
52
76
  apiKey: config.apiKey,
@@ -55,12 +79,21 @@ var createEventsManager = function (_a) {
55
79
  serverZone: config.serverZone,
56
80
  version: config.version,
57
81
  type: type,
58
- onComplete: eventsIDBStore.cleanUpSessionEventsStore.bind(eventsIDBStore),
82
+ onComplete: function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
83
+ return tslib_1.__generator(this, function (_a) {
84
+ switch (_a.label) {
85
+ case 0: return [4 /*yield*/, store.cleanUpSessionEventsStore(sessionId, sequenceId)];
86
+ case 1:
87
+ _a.sent();
88
+ return [2 /*return*/];
89
+ }
90
+ });
91
+ }); },
59
92
  });
60
93
  };
61
94
  sendCurrentSequenceEvents = function (_a) {
62
95
  var sessionId = _a.sessionId, deviceId = _a.deviceId;
63
- eventsIDBStore
96
+ store
64
97
  .storeCurrentSequence(sessionId)
65
98
  .then(function (currentSequence) {
66
99
  if (currentSequence) {
@@ -82,7 +115,7 @@ var createEventsManager = function (_a) {
82
115
  var sequencesToSend;
83
116
  return tslib_1.__generator(this, function (_b) {
84
117
  switch (_b.label) {
85
- case 0: return [4 /*yield*/, eventsIDBStore.getSequencesToSend()];
118
+ case 0: return [4 /*yield*/, store.getSequencesToSend()];
86
119
  case 1:
87
120
  sequencesToSend = _b.sent();
88
121
  sequencesToSend &&
@@ -101,7 +134,7 @@ var createEventsManager = function (_a) {
101
134
  };
102
135
  addEvent = function (_a) {
103
136
  var event = _a.event, sessionId = _a.sessionId, deviceId = _a.deviceId;
104
- eventsIDBStore
137
+ store
105
138
  .addEventToCurrentSequence(sessionId, event.data)
106
139
  .then(function (sequenceToSend) {
107
140
  return (sequenceToSend &&
@@ -1 +1 @@
1
- {"version":3,"file":"events-manager.js","sourceRoot":"","sources":["../../../src/events/events-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n EventType,\n} from '../typings/session-replay';\n\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { createEventsIDBStore } from './events-idb-store';\nimport { PayloadBatcher, SessionReplayTrackDestination } from '../track-destination';\nimport { getStorageSize } from '../helpers';\n\nexport const createEventsManager = async <Type extends EventType>({\n config,\n sessionId,\n minInterval,\n maxInterval,\n type,\n payloadBatcher,\n}: {\n config: SessionReplayJoinedConfig;\n type: Type;\n minInterval?: number;\n maxInterval?: number;\n sessionId?: number;\n payloadBatcher?: PayloadBatcher;\n}): Promise<AmplitudeSessionReplayEventsManager<Type, string>> => {\n const trackDestination = new SessionReplayTrackDestination({ loggerProvider: config.loggerProvider, payloadBatcher });\n\n const eventsIDBStore = await createEventsIDBStore({\n loggerProvider: config.loggerProvider,\n apiKey: config.apiKey,\n sessionId,\n minInterval,\n maxInterval,\n type,\n });\n\n /**\n * Immediately sends events to the track destination.\n */\n const sendEventsList = ({\n events,\n sessionId,\n deviceId,\n sequenceId,\n }: {\n events: string[];\n sessionId: number;\n deviceId: string;\n sequenceId: number;\n }) => {\n if (config.debugMode) {\n getStorageSize()\n .then(({ totalStorageSize, percentOfQuota, usageDetails }) => {\n config.loggerProvider.debug(\n `Total storage size: ${totalStorageSize} KB, percentage of quota: ${percentOfQuota}%, usage details: ${usageDetails}`,\n );\n })\n .catch(() => {\n // swallow error\n });\n }\n\n trackDestination.sendEventsList({\n events: events,\n sequenceId: sequenceId,\n sessionId: sessionId,\n flushMaxRetries: config.flushMaxRetries,\n apiKey: config.apiKey,\n deviceId: deviceId,\n sampleRate: config.sampleRate,\n serverZone: config.serverZone,\n version: config.version,\n type,\n onComplete: eventsIDBStore.cleanUpSessionEventsStore.bind(eventsIDBStore),\n });\n };\n\n const sendCurrentSequenceEvents = ({ sessionId, deviceId }: { sessionId: number; deviceId: string }) => {\n eventsIDBStore\n .storeCurrentSequence(sessionId)\n .then((currentSequence) => {\n if (currentSequence) {\n sendEventsList({\n sequenceId: currentSequence.sequenceId,\n events: currentSequence.events,\n sessionId: currentSequence.sessionId,\n deviceId,\n });\n }\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to get current sequence of session replay events for session:', e);\n });\n };\n\n const sendStoredEvents = async ({ deviceId }: { deviceId: string }) => {\n const sequencesToSend = await eventsIDBStore.getSequencesToSend();\n sequencesToSend &&\n sequencesToSend.forEach((sequence) => {\n sendEventsList({\n sequenceId: sequence.sequenceId,\n events: sequence.events,\n sessionId: sequence.sessionId,\n deviceId,\n });\n });\n };\n\n const addEvent = ({\n event,\n sessionId,\n deviceId,\n }: {\n event: { type: Type; data: string };\n sessionId: number;\n deviceId: string;\n }) => {\n eventsIDBStore\n .addEventToCurrentSequence(sessionId, event.data)\n .then((sequenceToSend) => {\n return (\n sequenceToSend &&\n sendEventsList({\n sequenceId: sequenceToSend.sequenceId,\n events: sequenceToSend.events,\n sessionId: sequenceToSend.sessionId,\n deviceId,\n })\n );\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to add event to session replay capture:', e);\n });\n };\n\n async function flush(useRetry = false) {\n return trackDestination.flush(useRetry);\n }\n\n return {\n sendCurrentSequenceEvents,\n addEvent,\n sendStoredEvents,\n flush,\n };\n};\n"]}
1
+ {"version":3,"file":"events-manager.js","sourceRoot":"","sources":["../../../src/events/events-manager.ts"],"names":[],"mappings":"AAAA,iBAyKA;;;;AAjKA,sCAA4C;AAC5C,0DAAqF;AACrF,uDAAiE;AACjE,6DAA4D;AAErD,IAAM,mBAAmB,GAAG,UAA+B,EAgBjE;QAfC,MAAM,YAAA,EACN,SAAS,eAAA,EACT,WAAW,iBAAA,EACX,WAAW,iBAAA,EACX,IAAI,UAAA,EACJ,cAAc,oBAAA,EACd,SAAS,eAAA;;QA0IT,SAAe,KAAK,CAAC,QAAgB;YAAhB,yBAAA,EAAA,gBAAgB;;;oBACnC,sBAAO,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAC;;;SACzC;;;;;;oBAlIK,gBAAgB,GAAG,IAAI,iDAA6B,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,cAAc,gBAAA,EAAE,CAAC,CAAC;oBAEhH,cAAc,GAAG;wBACrB,OAAO,IAAI,yCAAmB,CAAC;4BAC7B,cAAc,EAAE,MAAM,CAAC,cAAc;4BACrC,WAAW,aAAA;4BACX,WAAW,aAAA;yBACZ,CAAC,CAAC;oBACL,CAAC,CAAC;oBAEI,qBAAqB,GAAG;;;;wCACd,qBAAM,8CAA2B,CAAC,GAAG,CACjD,IAAI,EACJ;wCACE,cAAc,EAAE,MAAM,CAAC,cAAc;wCACrC,WAAW,aAAA;wCACX,WAAW,aAAA;wCACX,MAAM,EAAE,MAAM,CAAC,MAAM;qCACtB,EACD,SAAS,CACV,EAAA;;oCATK,KAAK,GAAG,SASb;oCACD,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;oCAC3F,sBAAO,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,cAAc,EAAE,EAAC;;;yBAClC,CAAC;yBAEiC,CAAA,SAAS,KAAK,KAAK,CAAA,EAAnB,wBAAmB;oBAAG,qBAAM,qBAAqB,EAAE,EAAA;;oBAA7B,KAAA,SAA6B,CAAA;;;oBAAG,KAAA,cAAc,EAAE,CAAA;;;oBAAnG,KAAK,KAA8F;oBAKnG,cAAc,GAAG,UAAC,EAUvB;4BATC,MAAM,YAAA,EACN,SAAS,eAAA,EACT,QAAQ,cAAA,EACR,UAAU,gBAAA;wBAOV,IAAI,MAAM,CAAC,SAAS,EAAE;4BACpB,IAAA,wBAAc,GAAE;iCACb,IAAI,CAAC,UAAC,EAAkD;oCAAhD,gBAAgB,sBAAA,EAAE,cAAc,oBAAA,EAAE,YAAY,kBAAA;gCACrD,MAAM,CAAC,cAAc,CAAC,KAAK,CACzB,8BAAuB,gBAAgB,uCAA6B,cAAc,+BAAqB,YAAY,CAAE,CACtH,CAAC;4BACJ,CAAC,CAAC;iCACD,KAAK,CAAC;gCACL,gBAAgB;4BAClB,CAAC,CAAC,CAAC;yBACN;wBAED,gBAAgB,CAAC,cAAc,CAAC;4BAC9B,MAAM,EAAE,MAAM;4BACd,SAAS,EAAE,SAAS;4BACpB,eAAe,EAAE,MAAM,CAAC,eAAe;4BACvC,MAAM,EAAE,MAAM,CAAC,MAAM;4BACrB,QAAQ,EAAE,QAAQ;4BAClB,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,UAAU,EAAE,MAAM,CAAC,UAAU;4BAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;4BACvB,IAAI,MAAA;4BACJ,UAAU,EAAE;;;gDACV,qBAAM,KAAK,CAAC,yBAAyB,CAAC,SAAS,EAAE,UAAU,CAAC,EAAA;;4CAA5D,SAA4D,CAAC;4CAC7D,sBAAO;;;iCACR;yBACF,CAAC,CAAC;oBACL,CAAC,CAAC;oBAEI,yBAAyB,GAAG,UAAC,EAAgE;4BAA9D,SAAS,eAAA,EAAE,QAAQ,cAAA;wBACtD,KAAK;6BACF,oBAAoB,CAAC,SAAS,CAAC;6BAC/B,IAAI,CAAC,UAAC,eAAe;4BACpB,IAAI,eAAe,EAAE;gCACnB,cAAc,CAAC;oCACb,UAAU,EAAE,eAAe,CAAC,UAAU;oCACtC,MAAM,EAAE,eAAe,CAAC,MAAM;oCAC9B,SAAS,EAAE,eAAe,CAAC,SAAS;oCACpC,QAAQ,UAAA;iCACT,CAAC,CAAC;6BACJ;wBACH,CAAC,CAAC;6BACD,KAAK,CAAC,UAAC,CAAC;4BACP,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,sEAAsE,EAAE,CAAC,CAAC,CAAC;wBACxG,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC;oBAEI,gBAAgB,GAAG,UAAO,EAAkC;4BAAhC,QAAQ,cAAA;;;;;4CAChB,qBAAM,KAAK,CAAC,kBAAkB,EAAE,EAAA;;wCAAlD,eAAe,GAAG,SAAgC;wCACxD,eAAe;4CACb,eAAe,CAAC,OAAO,CAAC,UAAC,QAAQ;gDAC/B,cAAc,CAAC;oDACb,UAAU,EAAE,QAAQ,CAAC,UAAU;oDAC/B,MAAM,EAAE,QAAQ,CAAC,MAAM;oDACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;oDAC7B,QAAQ,UAAA;iDACT,CAAC,CAAC;4CACL,CAAC,CAAC,CAAC;;;;;qBACN,CAAC;oBAEI,QAAQ,GAAG,UAAC,EAQjB;4BAPC,KAAK,WAAA,EACL,SAAS,eAAA,EACT,QAAQ,cAAA;wBAMR,KAAK;6BACF,yBAAyB,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC;6BAChD,IAAI,CAAC,UAAC,cAAc;4BACnB,OAAO,CACL,cAAc;gCACd,cAAc,CAAC;oCACb,UAAU,EAAE,cAAc,CAAC,UAAU;oCACrC,MAAM,EAAE,cAAc,CAAC,MAAM;oCAC7B,SAAS,EAAE,cAAc,CAAC,SAAS;oCACnC,QAAQ,UAAA;iCACT,CAAC,CACH,CAAC;wBACJ,CAAC,CAAC;6BACD,KAAK,CAAC,UAAC,CAAC;4BACP,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,gDAAgD,EAAE,CAAC,CAAC,CAAC;wBAClF,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC;oBAMF,sBAAO;4BACL,yBAAyB,2BAAA;4BACzB,QAAQ,UAAA;4BACR,gBAAgB,kBAAA;4BAChB,KAAK,OAAA;yBACN,EAAC;;;;CACH,CAAC;AA3JW,QAAA,mBAAmB,uBA2J9B","sourcesContent":["import {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n EventsStore,\n EventType,\n StoreType,\n} from '../typings/session-replay';\n\nimport { SessionReplayJoinedConfig } from '../config/types';\nimport { getStorageSize } from '../helpers';\nimport { PayloadBatcher, SessionReplayTrackDestination } from '../track-destination';\nimport { SessionReplayEventsIDBStore } from './events-idb-store';\nimport { InMemoryEventsStore } from './events-memory-store';\n\nexport const createEventsManager = async <Type extends EventType>({\n config,\n sessionId,\n minInterval,\n maxInterval,\n type,\n payloadBatcher,\n storeType,\n}: {\n config: SessionReplayJoinedConfig;\n type: Type;\n minInterval?: number;\n maxInterval?: number;\n sessionId?: number;\n payloadBatcher?: PayloadBatcher;\n storeType: StoreType;\n}): Promise<AmplitudeSessionReplayEventsManager<Type, string>> => {\n const trackDestination = new SessionReplayTrackDestination({ loggerProvider: config.loggerProvider, payloadBatcher });\n\n const getMemoryStore = (): EventsStore<number> => {\n return new InMemoryEventsStore({\n loggerProvider: config.loggerProvider,\n maxInterval,\n minInterval,\n });\n };\n\n const getIdbStoreOrFallback = async (): Promise<EventsStore<number>> => {\n const store = await SessionReplayEventsIDBStore.new(\n type,\n {\n loggerProvider: config.loggerProvider,\n minInterval,\n maxInterval,\n apiKey: config.apiKey,\n },\n sessionId,\n );\n config.loggerProvider.log('Failed to initialize idb store, falling back to memory store.');\n return store ?? getMemoryStore();\n };\n\n const store: EventsStore<number> = storeType === 'idb' ? await getIdbStoreOrFallback() : getMemoryStore();\n\n /**\n * Immediately sends events to the track destination.\n */\n const sendEventsList = ({\n events,\n sessionId,\n deviceId,\n sequenceId,\n }: {\n events: string[];\n sessionId: number;\n deviceId: string;\n sequenceId?: number;\n }) => {\n if (config.debugMode) {\n getStorageSize()\n .then(({ totalStorageSize, percentOfQuota, usageDetails }) => {\n config.loggerProvider.debug(\n `Total storage size: ${totalStorageSize} KB, percentage of quota: ${percentOfQuota}%, usage details: ${usageDetails}`,\n );\n })\n .catch(() => {\n // swallow error\n });\n }\n\n trackDestination.sendEventsList({\n events: events,\n sessionId: sessionId,\n flushMaxRetries: config.flushMaxRetries,\n apiKey: config.apiKey,\n deviceId: deviceId,\n sampleRate: config.sampleRate,\n serverZone: config.serverZone,\n version: config.version,\n type,\n onComplete: async () => {\n await store.cleanUpSessionEventsStore(sessionId, sequenceId);\n return;\n },\n });\n };\n\n const sendCurrentSequenceEvents = ({ sessionId, deviceId }: { sessionId: number; deviceId: string }) => {\n store\n .storeCurrentSequence(sessionId)\n .then((currentSequence) => {\n if (currentSequence) {\n sendEventsList({\n sequenceId: currentSequence.sequenceId,\n events: currentSequence.events,\n sessionId: currentSequence.sessionId,\n deviceId,\n });\n }\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to get current sequence of session replay events for session:', e);\n });\n };\n\n const sendStoredEvents = async ({ deviceId }: { deviceId: string }) => {\n const sequencesToSend = await store.getSequencesToSend();\n sequencesToSend &&\n sequencesToSend.forEach((sequence) => {\n sendEventsList({\n sequenceId: sequence.sequenceId,\n events: sequence.events,\n sessionId: sequence.sessionId,\n deviceId,\n });\n });\n };\n\n const addEvent = ({\n event,\n sessionId,\n deviceId,\n }: {\n event: { type: Type; data: string };\n sessionId: number;\n deviceId: string;\n }) => {\n store\n .addEventToCurrentSequence(sessionId, event.data)\n .then((sequenceToSend) => {\n return (\n sequenceToSend &&\n sendEventsList({\n sequenceId: sequenceToSend.sequenceId,\n events: sequenceToSend.events,\n sessionId: sequenceToSend.sessionId,\n deviceId,\n })\n );\n })\n .catch((e) => {\n config.loggerProvider.warn('Failed to add event to session replay capture:', e);\n });\n };\n\n async function flush(useRetry = false) {\n return trackDestination.flush(useRetry);\n }\n\n return {\n sendCurrentSequenceEvents,\n addEvent,\n sendStoredEvents,\n flush,\n };\n};\n"]}
@@ -0,0 +1,15 @@
1
+ import { Events, SendingSequencesReturn } from '../typings/session-replay';
2
+ import { BaseEventsStore } from './base-events-store';
3
+ export declare class InMemoryEventsStore extends BaseEventsStore<number> {
4
+ private finalizedSequences;
5
+ private sequences;
6
+ private sequenceId;
7
+ private resetCurrentSequence;
8
+ private addSequence;
9
+ getSequencesToSend(): Promise<SendingSequencesReturn<number>[] | undefined>;
10
+ storeCurrentSequence(sessionId: number): Promise<SendingSequencesReturn<number> | undefined>;
11
+ addEventToCurrentSequence(sessionId: number, event: string): Promise<SendingSequencesReturn<number> | undefined>;
12
+ storeSendingEvents(sessionId: number, events: Events): Promise<number | undefined>;
13
+ cleanUpSessionEventsStore(_sessionId: number, sequenceId?: number): Promise<void>;
14
+ }
15
+ //# sourceMappingURL=events-memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-memory-store.d.ts","sourceRoot":"","sources":["../../../src/events/events-memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,qBAAa,mBAAoB,SAAQ,eAAe,CAAC,MAAM,CAAC;IAC9D,OAAO,CAAC,kBAAkB,CAA+D;IACzF,OAAO,CAAC,SAAS,CAAgC;IACjD,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,WAAW;IAQb,kBAAkB,IAAI,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC;IAQ3E,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAO5F,yBAAyB,CAC7B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,sBAAsB,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAehD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAMlF,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKxF"}
@@ -0,0 +1,84 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ exports.InMemoryEventsStore = void 0;
3
+ var tslib_1 = require("tslib");
4
+ var base_events_store_1 = require("./base-events-store");
5
+ var InMemoryEventsStore = /** @class */ (function (_super) {
6
+ tslib_1.__extends(InMemoryEventsStore, _super);
7
+ function InMemoryEventsStore() {
8
+ var _this = _super !== null && _super.apply(this, arguments) || this;
9
+ _this.finalizedSequences = {};
10
+ _this.sequences = {};
11
+ _this.sequenceId = 0;
12
+ return _this;
13
+ }
14
+ InMemoryEventsStore.prototype.resetCurrentSequence = function (sessionId) {
15
+ this.sequences[sessionId] = [];
16
+ };
17
+ InMemoryEventsStore.prototype.addSequence = function (sessionId) {
18
+ var sequenceId = this.sequenceId++;
19
+ var events = tslib_1.__spreadArray([], tslib_1.__read(this.sequences[sessionId]), false);
20
+ this.finalizedSequences[sequenceId] = { sessionId: sessionId, events: events };
21
+ this.resetCurrentSequence(sessionId);
22
+ return { sequenceId: sequenceId, events: events, sessionId: sessionId };
23
+ };
24
+ InMemoryEventsStore.prototype.getSequencesToSend = function () {
25
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
26
+ return tslib_1.__generator(this, function (_a) {
27
+ return [2 /*return*/, Object.entries(this.finalizedSequences).map(function (_a) {
28
+ var _b = tslib_1.__read(_a, 2), sequenceId = _b[0], _c = _b[1], sessionId = _c.sessionId, events = _c.events;
29
+ return ({
30
+ sequenceId: Number(sequenceId),
31
+ sessionId: sessionId,
32
+ events: events,
33
+ });
34
+ })];
35
+ });
36
+ });
37
+ };
38
+ InMemoryEventsStore.prototype.storeCurrentSequence = function (sessionId) {
39
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
40
+ return tslib_1.__generator(this, function (_a) {
41
+ if (!this.sequences[sessionId]) {
42
+ return [2 /*return*/, undefined];
43
+ }
44
+ return [2 /*return*/, this.addSequence(sessionId)];
45
+ });
46
+ });
47
+ };
48
+ InMemoryEventsStore.prototype.addEventToCurrentSequence = function (sessionId, event) {
49
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
50
+ var sequenceReturn;
51
+ return tslib_1.__generator(this, function (_a) {
52
+ if (!this.sequences[sessionId]) {
53
+ this.resetCurrentSequence(sessionId);
54
+ }
55
+ if (this.shouldSplitEventsList(this.sequences[sessionId], event)) {
56
+ sequenceReturn = this.addSequence(sessionId);
57
+ }
58
+ this.sequences[sessionId].push(event);
59
+ return [2 /*return*/, sequenceReturn];
60
+ });
61
+ });
62
+ };
63
+ InMemoryEventsStore.prototype.storeSendingEvents = function (sessionId, events) {
64
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
65
+ return tslib_1.__generator(this, function (_a) {
66
+ this.finalizedSequences[this.sequenceId] = { sessionId: sessionId, events: events };
67
+ return [2 /*return*/, this.sequenceId++];
68
+ });
69
+ });
70
+ };
71
+ InMemoryEventsStore.prototype.cleanUpSessionEventsStore = function (_sessionId, sequenceId) {
72
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
73
+ return tslib_1.__generator(this, function (_a) {
74
+ if (sequenceId !== undefined) {
75
+ delete this.finalizedSequences[sequenceId];
76
+ }
77
+ return [2 /*return*/];
78
+ });
79
+ });
80
+ };
81
+ return InMemoryEventsStore;
82
+ }(base_events_store_1.BaseEventsStore));
83
+ exports.InMemoryEventsStore = InMemoryEventsStore;
84
+ //# sourceMappingURL=events-memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events-memory-store.js","sourceRoot":"","sources":["../../../src/events/events-memory-store.ts"],"names":[],"mappings":";;;AACA,yDAAsD;AAEtD;IAAyC,+CAAuB;IAAhE;QAAA,qEA6DC;QA5DS,wBAAkB,GAA4D,EAAE,CAAC;QACjF,eAAS,GAA6B,EAAE,CAAC;QACzC,gBAAU,GAAG,CAAC,CAAC;;IA0DzB,CAAC;IAxDS,kDAAoB,GAA5B,UAA6B,SAAiB;QAC5C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;IAEO,yCAAW,GAAnB,UAAoB,SAAiB;QACnC,IAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,IAAM,MAAM,4CAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,SAAC,CAAC;QAC9C,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,WAAA,EAAE,MAAM,QAAA,EAAE,CAAC;QAC5D,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;QACrC,OAAO,EAAE,UAAU,YAAA,EAAE,MAAM,QAAA,EAAE,SAAS,WAAA,EAAE,CAAC;IAC3C,CAAC;IAEK,gDAAkB,GAAxB;;;gBACE,sBAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,GAAG,CAAC,UAAC,EAAmC;4BAAnC,KAAA,qBAAmC,EAAlC,UAAU,QAAA,EAAE,UAAqB,EAAnB,SAAS,eAAA,EAAE,MAAM,YAAA;wBAAQ,OAAA,CAAC;4BAC3F,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;4BAC9B,SAAS,WAAA;4BACT,MAAM,QAAA;yBACP,CAAC;oBAJ0F,CAI1F,CAAC,EAAC;;;KACL;IAEK,kDAAoB,GAA1B,UAA2B,SAAiB;;;gBAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;oBAC9B,sBAAO,SAAS,EAAC;iBAClB;gBACD,sBAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAC;;;KACpC;IAEK,uDAAyB,GAA/B,UACE,SAAiB,EACjB,KAAa;;;;gBAEb,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;oBAC9B,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;iBACtC;gBAGD,IAAI,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,EAAE;oBAChE,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;iBAC9C;gBAED,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAEtC,sBAAO,cAAc,EAAC;;;KACvB;IAEK,gDAAkB,GAAxB,UAAyB,SAAiB,EAAE,MAAc;;;gBACxD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,SAAS,WAAA,EAAE,MAAM,QAAA,EAAE,CAAC;gBAEjE,sBAAO,IAAI,CAAC,UAAU,EAAE,EAAC;;;KAC1B;IAEK,uDAAyB,GAA/B,UAAgC,UAAkB,EAAE,UAAmB;;;gBACrE,IAAI,UAAU,KAAK,SAAS,EAAE;oBAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;iBAC5C;;;;KACF;IACH,0BAAC;AAAD,CAAC,AA7DD,CAAyC,mCAAe,GA6DvD;AA7DY,kDAAmB","sourcesContent":["import { Events, SendingSequencesReturn } from '../typings/session-replay';\nimport { BaseEventsStore } from './base-events-store';\n\nexport class InMemoryEventsStore extends BaseEventsStore<number> {\n private finalizedSequences: Record<number, { sessionId: number; events: string[] }> = {};\n private sequences: Record<number, string[]> = {};\n private sequenceId = 0;\n\n private resetCurrentSequence(sessionId: number) {\n this.sequences[sessionId] = [];\n }\n\n private addSequence(sessionId: number): SendingSequencesReturn<number> {\n const sequenceId = this.sequenceId++;\n const events = [...this.sequences[sessionId]];\n this.finalizedSequences[sequenceId] = { sessionId, events };\n this.resetCurrentSequence(sessionId);\n return { sequenceId, events, sessionId };\n }\n\n async getSequencesToSend(): Promise<SendingSequencesReturn<number>[] | undefined> {\n return Object.entries(this.finalizedSequences).map(([sequenceId, { sessionId, events }]) => ({\n sequenceId: Number(sequenceId),\n sessionId,\n events,\n }));\n }\n\n async storeCurrentSequence(sessionId: number): Promise<SendingSequencesReturn<number> | undefined> {\n if (!this.sequences[sessionId]) {\n return undefined;\n }\n return this.addSequence(sessionId);\n }\n\n async addEventToCurrentSequence(\n sessionId: number,\n event: string,\n ): Promise<SendingSequencesReturn<number> | undefined> {\n if (!this.sequences[sessionId]) {\n this.resetCurrentSequence(sessionId);\n }\n\n let sequenceReturn: SendingSequencesReturn<number> | undefined;\n if (this.shouldSplitEventsList(this.sequences[sessionId], event)) {\n sequenceReturn = this.addSequence(sessionId);\n }\n\n this.sequences[sessionId].push(event);\n\n return sequenceReturn;\n }\n\n async storeSendingEvents(sessionId: number, events: Events): Promise<number | undefined> {\n this.finalizedSequences[this.sequenceId] = { sessionId, events };\n\n return this.sequenceId++;\n }\n\n async cleanUpSessionEventsStore(_sessionId: number, sequenceId?: number): Promise<void> {\n if (sequenceId !== undefined) {\n delete this.finalizedSequences[sequenceId];\n }\n }\n}\n"]}
@@ -22,6 +22,7 @@ export declare const getDebugConfig: (config: SessionReplayJoinedConfig) => {
22
22
  shouldInlineStylesheet?: boolean | undefined;
23
23
  version?: import("./config/types").SessionReplayVersion | undefined;
24
24
  performanceConfig?: import("./config/types").SessionReplayPerformanceConfig | undefined;
25
+ storeType: import("./typings/session-replay").StoreType;
25
26
  flushIntervalMillis: number;
26
27
  flushQueueSize: number;
27
28
  instanceName?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,aAAa,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAMxD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAoFvD,eAAO,MAAM,MAAM,gBACH,MAAM,GAAG,OAAO,WAAW,aAAa,YAC/C,MAAM,WAAW,WAAW,GAAG,IAAI,KAAG,MAE5C,CAAC;AAEJ,eAAO,MAAM,gBAAgB,QAAkB,MAAM,WASpD,CAAC;AAEF,eAAO,MAAM,iBAAiB,cAAwB,MAAM,cAAc,MAAM,YAM/E,CAAC;AAEF,eAAO,MAAM,aAAa,cAGzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAAe,MAAM,YAAY,MAAM,KAAG,MAE7E,CAAC;AAEF,eAAO,MAAM,YAAY,gBAAiB,MAAM,iBAAiB,KAAG,MAUnE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAa,QAAQ,WAAW,CAa1D,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;CAO/D,CAAC"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/helpers.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiC,aAAa,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAEzG,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAMxD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAoFvD,eAAO,MAAM,MAAM,gBACH,MAAM,GAAG,OAAO,WAAW,aAAa,YAC/C,MAAM,WAAW,WAAW,GAAG,IAAI,KAAG,MAE5C,CAAC;AAEJ,eAAO,MAAM,gBAAgB,QAAkB,MAAM,WASpD,CAAC;AAEF,eAAO,MAAM,iBAAiB,cAAwB,MAAM,cAAc,MAAM,YAM/E,CAAC;AAEF,eAAO,MAAM,aAAa,cAGzB,CAAC;AAEF,eAAO,MAAM,uBAAuB,cAAe,MAAM,YAAY,MAAM,KAAG,MAE7E,CAAC;AAEF,eAAO,MAAM,YAAY,gBAAiB,MAAM,iBAAiB,KAAG,MAUnE,CAAC;AAEF,eAAO,MAAM,cAAc,QAAa,QAAQ,WAAW,CAa1D,CAAC;AAEF,eAAO,MAAM,cAAc,WAAY,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;CAO/D,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../../src/hooks/click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAqB,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,0BAA0B,IAAI,mCAAmC,EAAE,MAAM,2BAA2B,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAGF,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,KAAK,OAAO,GAAG;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACrC,aAAa,EAAE,mCAAmC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAC3E,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,cAU7B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAyB1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,wBA2C3C,CAAC"}
1
+ {"version":3,"file":"click.d.ts","sourceRoot":"","sources":["../../../src/hooks/click.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAqB,MAAM,wBAAwB,CAAC;AAErF,OAAO,EAAE,0BAA0B,IAAI,mCAAmC,EAAE,MAAM,2BAA2B,CAAC;AAC9G,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAKvD,MAAM,MAAM,UAAU,GAAG;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAGF,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjE,KAAK,OAAO,GAAG;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACrC,aAAa,EAAE,mCAAmC,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;CAC3E,CAAC;AAIF,eAAO,MAAM,eAAe,EAAE,cAU7B,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,cAyB1B,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,wBA8C3C,CAAC"}
@@ -60,6 +60,9 @@ var clickHook = function (_a) {
60
60
  return;
61
61
  }
62
62
  var x = e.x, y = e.y;
63
+ if (x === undefined || y === undefined) {
64
+ return;
65
+ }
63
66
  var node = rrweb_1.record.mirror.getNode(e.id);
64
67
  var selector;
65
68
  if (node) {
@@ -1 +1 @@
1
- {"version":3,"file":"click.js","sourceRoot":"","sources":["../../../src/hooks/click.ts"],"names":[],"mappings":"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","sourcesContent":["import { mouseInteractionCallBack, MouseInteractions } from '@amplitude/rrweb-types';\nimport { record, utils } from '@amplitude/rrweb';\nimport { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager } from '../typings/session-replay';\nimport { PayloadBatcher } from 'src/track-destination';\nimport { finder } from '../libs/finder';\nimport { getGlobalScope } from '@amplitude/analytics-client-common';\n\n// exported for testing\nexport type ClickEvent = {\n timestamp: number;\n x: number;\n y: number;\n viewportWidth: number;\n viewportHeight: number;\n pageUrl: string;\n selector?: string;\n type: 'click';\n};\n\n// exported for testing\nexport type ClickEventWithCount = ClickEvent & { count: number };\n\ntype Options = {\n sessionId: number;\n deviceIdFn: () => string | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager<'interaction', string>;\n};\n\nconst HOUR_IN_MILLISECONDS = 3_600_000;\n\nexport const clickNonBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n record.count = 1;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n return { version, events: clickEvents };\n};\n\nexport const clickBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n\n const reduced = clickEvents.reduce<Record<string, ClickEventWithCount>>((prev, curr) => {\n const { x, y, selector, timestamp } = curr;\n\n // round down to nearest hour.\n const hour = timestamp - (timestamp % HOUR_IN_MILLISECONDS);\n\n const k = `${x}:${y}:${selector ?? ''}:${hour}`;\n if (!prev[k]) {\n prev[k] = { ...curr, timestamp: hour, count: 1 };\n } else {\n prev[k].count += 1;\n }\n return prev;\n }, {});\n\n return { version, events: Object.values(reduced) };\n};\n\nexport const clickHook: (options: Options) => mouseInteractionCallBack =\n ({ eventsManager, sessionId, deviceIdFn }) =>\n (e) => {\n if (e.type !== MouseInteractions.Click) {\n return;\n }\n\n const globalScope = getGlobalScope();\n if (!globalScope) {\n return;\n }\n\n const { location, innerHeight, innerWidth } = globalScope;\n // it only makes sense to send events if a pageUrl exists\n if (!location) {\n return;\n }\n\n const { x, y } = e;\n\n const node = record.mirror.getNode(e.id);\n let selector;\n if (node) {\n selector = finder(node as Element);\n }\n\n const { left: scrollX, top: scrollY } = utils.getWindowScroll(globalScope as unknown as Window);\n\n const event: ClickEvent = {\n x: x + scrollX,\n y: y + scrollY,\n selector,\n\n viewportHeight: innerHeight,\n viewportWidth: innerWidth,\n pageUrl: location.href,\n timestamp: Date.now(),\n type: 'click',\n };\n const deviceId = deviceIdFn();\n if (deviceId) {\n eventsManager.addEvent({ sessionId, event: { type: 'interaction', data: JSON.stringify(event) }, deviceId });\n }\n };\n"]}
1
+ {"version":3,"file":"click.js","sourceRoot":"","sources":["../../../src/hooks/click.ts"],"names":[],"mappings":"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","sourcesContent":["import { mouseInteractionCallBack, MouseInteractions } from '@amplitude/rrweb-types';\nimport { record, utils } from '@amplitude/rrweb';\nimport { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager } from '../typings/session-replay';\nimport { PayloadBatcher } from 'src/track-destination';\nimport { finder } from '../libs/finder';\nimport { getGlobalScope } from '@amplitude/analytics-client-common';\n\n// exported for testing\nexport type ClickEvent = {\n timestamp: number;\n x: number;\n y: number;\n viewportWidth: number;\n viewportHeight: number;\n pageUrl: string;\n selector?: string;\n type: 'click';\n};\n\n// exported for testing\nexport type ClickEventWithCount = ClickEvent & { count: number };\n\ntype Options = {\n sessionId: number;\n deviceIdFn: () => string | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager<'interaction', string>;\n};\n\nconst HOUR_IN_MILLISECONDS = 3_600_000;\n\nexport const clickNonBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n record.count = 1;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n return { version, events: clickEvents };\n};\n\nexport const clickBatcher: PayloadBatcher = ({ version, events }) => {\n const clickEvents: ClickEvent[] = [];\n events.forEach((evt: string) => {\n const record = JSON.parse(evt) as Record<string, unknown>;\n if (record.type === 'click') {\n clickEvents.push(record as ClickEvent);\n }\n });\n\n const reduced = clickEvents.reduce<Record<string, ClickEventWithCount>>((prev, curr) => {\n const { x, y, selector, timestamp } = curr;\n\n // round down to nearest hour.\n const hour = timestamp - (timestamp % HOUR_IN_MILLISECONDS);\n\n const k = `${x}:${y}:${selector ?? ''}:${hour}`;\n if (!prev[k]) {\n prev[k] = { ...curr, timestamp: hour, count: 1 };\n } else {\n prev[k].count += 1;\n }\n return prev;\n }, {});\n\n return { version, events: Object.values(reduced) };\n};\n\nexport const clickHook: (options: Options) => mouseInteractionCallBack =\n ({ eventsManager, sessionId, deviceIdFn }) =>\n (e) => {\n if (e.type !== MouseInteractions.Click) {\n return;\n }\n\n const globalScope = getGlobalScope();\n if (!globalScope) {\n return;\n }\n\n const { location, innerHeight, innerWidth } = globalScope;\n // it only makes sense to send events if a pageUrl exists\n if (!location) {\n return;\n }\n\n const { x, y } = e;\n if (x === undefined || y === undefined) {\n return;\n }\n\n const node = record.mirror.getNode(e.id);\n let selector;\n if (node) {\n selector = finder(node as Element);\n }\n\n const { left: scrollX, top: scrollY } = utils.getWindowScroll(globalScope as unknown as Window);\n\n const event: ClickEvent = {\n x: x + scrollX,\n y: y + scrollY,\n selector,\n\n viewportHeight: innerHeight,\n viewportWidth: innerWidth,\n pageUrl: location.href,\n timestamp: Date.now(),\n type: 'click',\n };\n const deviceId = deviceIdFn();\n if (deviceId) {\n eventsManager.addEvent({ sessionId, event: { type: 'interaction', data: JSON.stringify(event) }, deviceId });\n }\n };\n"]}
@@ -1,5 +1,5 @@
1
1
  export declare const init: (apiKey: string, options: import("./typings/session-replay").SessionReplayOptions) => import("@amplitude/analytics-types").AmplitudeReturn<void>, setSessionId: (sessionId: number, deviceId?: string | undefined) => import("@amplitude/analytics-types").AmplitudeReturn<void>, getSessionId: () => number | undefined, getSessionReplayProperties: () => {
2
2
  [key: string]: string | boolean | null;
3
3
  }, flush: (useRetry: boolean) => Promise<void>, shutdown: () => void;
4
- export { SessionReplayOptions } from './typings/session-replay';
4
+ export { SessionReplayOptions, StoreType } from './typings/session-replay';
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,eAAO,MAAQ,IAAI,oJAAE,YAAY,oHAAE,YAAY,4BAAE,0BAA0B;;GAAE,KAAK,wCAAE,QAAQ,YAAkB,CAAC;AAC/G,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,eAAO,MAAQ,IAAI,oJAAE,YAAY,oHAAE,YAAY,4BAAE,0BAA0B;;GAAE,KAAK,wCAAE,QAAQ,YAAkB,CAAC;AAC/G,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,4FAAqD;AACtC,QAAA,IAAI,GAA8E,gCAAa,OAAzF,QAAA,YAAY,GAAgE,gCAAa,eAA3E,QAAA,YAAY,GAAkD,gCAAa,eAA7D,QAAA,0BAA0B,GAAsB,gCAAa,6BAAjC,QAAA,KAAK,GAAe,gCAAa,QAA1B,QAAA,QAAQ,GAAK,gCAAa,UAAC","sourcesContent":["import sessionReplay from './session-replay-factory';\nexport const { init, setSessionId, getSessionId, getSessionReplayProperties, flush, shutdown } = sessionReplay;\nexport { SessionReplayOptions } from './typings/session-replay';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,4FAAqD;AACtC,QAAA,IAAI,GAA8E,gCAAa,OAAzF,QAAA,YAAY,GAAgE,gCAAa,eAA3E,QAAA,YAAY,GAAkD,gCAAa,eAA7D,QAAA,0BAA0B,GAAsB,gCAAa,6BAAjC,QAAA,KAAK,GAAe,gCAAa,QAA1B,QAAA,QAAQ,GAAK,gCAAa,UAAC","sourcesContent":["import sessionReplay from './session-replay-factory';\nexport const { init, setSessionId, getSessionId, getSessionReplayProperties, flush, shutdown } = sessionReplay;\nexport { SessionReplayOptions, StoreType } from './typings/session-replay';\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAY,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C,OAAO,EAAE,yBAAyB,EAAE,kCAAkC,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAEL,gBAAgB,EAMjB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EAIjE,kBAAkB,IAAI,mBAAmB,EACzC,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,KAAK,KAAK,IAAI,CAAC;AAE5D,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,IAAI,SAAuC;IAC3C,MAAM,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C,qBAAqB,EAAE,kCAAkC,GAAG,SAAS,CAAC;IACtE,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC7C,aAAa,CAAC,EAAE,mCAAmC,CAAC,QAAQ,GAAG,aAAa,EAAE,MAAM,CAAC,CAAC;IACtF,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,IAAI,CAAQ;IAC9D,UAAU,SAAK;IACf,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAG7C,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,OAAO,CAAC,UAAU,CAAC,CAAiB;;IAMpC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAIlD,OAAO,CAAC,sBAAsB,CAmB5B;cAEc,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IA8DnE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAI3C,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAoB5D,0BAA0B;;;IAsC1B,YAAY,aAEV;IAEF,aAAa,aAIX;IAEF;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAIvB;IAEF,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM;IAS7B,UAAU,CAAC,sBAAsB,UAAQ;IAgBzC,YAAY;IAUZ,eAAe;IAwBf,iBAAiB,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAWlD,oBAAoB,IAAI,MAAM,GAAG,SAAS;IAa1C,YAAY;IAsEZ,mBAAmB,cACN,gBAAgB;;kDAkC3B;IAEF,mBAAmB,aASjB;IAEF,WAAW;IAIX,YAAY;IAIN,KAAK,CAAC,QAAQ,UAAQ;IAI5B,QAAQ;CAKT"}
1
+ {"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAY,MAAM,4BAA4B,CAAC;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAG1C,OAAO,EAAE,yBAAyB,EAAE,kCAAkC,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAEL,gBAAgB,EAMjB,MAAM,aAAa,CAAC;AAOrB,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EAIjE,kBAAkB,IAAI,mBAAmB,EACzC,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,KAAK,WAAW,GAAG,CAAC,CAAC,EAAE,mBAAmB,GAAG,KAAK,KAAK,IAAI,CAAC;AAE5D,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,IAAI,SAAuC;IAC3C,MAAM,EAAE,yBAAyB,GAAG,SAAS,CAAC;IAC9C,qBAAqB,EAAE,kCAAkC,GAAG,SAAS,CAAC;IACtE,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC7C,aAAa,CAAC,EAAE,mCAAmC,CAAC,QAAQ,GAAG,aAAa,EAAE,MAAM,CAAC,CAAC;IACtF,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,IAAI,CAAQ;IAC9D,UAAU,SAAK;IACf,eAAe,EAAE,eAAe,GAAG,SAAS,CAAC;IAG7C,YAAY,EAAE,WAAW,EAAE,CAAM;IACjC,OAAO,CAAC,UAAU,CAAC,CAAiB;;IAMpC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAIlD,OAAO,CAAC,sBAAsB,CAmB5B;cAEc,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAqEnE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAI3C,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAoB5D,0BAA0B;;;IAsC1B,YAAY,aAEV;IAEF,aAAa,aAIX;IAEF;;;;OAIG;IACH,OAAO,CAAC,iBAAiB,CAIvB;IAEF,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM;IAS7B,UAAU,CAAC,sBAAsB,UAAQ;IAgBzC,YAAY;IAUZ,eAAe;IAwBf,iBAAiB,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAWlD,oBAAoB,IAAI,MAAM,GAAG,SAAS;IAa1C,YAAY;IAsEZ,mBAAmB,cACN,gBAAgB;;kDAkC3B;IAEF,mBAAmB,aASjB;IAEF,WAAW;IAIX,YAAY;IAIN,KAAK,CAAC,QAAQ,UAAQ;IAI5B,QAAQ;CAKT"}
@@ -118,24 +118,24 @@ var SessionReplay = /** @class */ (function () {
118
118
  return (0, analytics_core_1.returnWrapper)(this._init(apiKey, options));
119
119
  };
120
120
  SessionReplay.prototype._init = function (apiKey, options) {
121
- var _a, _b, _c;
121
+ var _a, _b, _c, _d;
122
122
  return tslib_1.__awaiter(this, void 0, void 0, function () {
123
- var _d, _e, scrollWatcher, managers, rrwebEventManager, error_1, typedError, payloadBatcher, interactionEventManager, error_2, typedError;
124
- return tslib_1.__generator(this, function (_f) {
125
- switch (_f.label) {
123
+ var _e, _f, scrollWatcher, managers, storeType, rrwebEventManager, error_1, typedError, payloadBatcher, interactionEventManager, error_2, typedError;
124
+ return tslib_1.__generator(this, function (_g) {
125
+ switch (_g.label) {
126
126
  case 0:
127
127
  this.loggerProvider = options.loggerProvider || new analytics_core_1.Logger();
128
128
  Object.prototype.hasOwnProperty.call(options, 'logLevel') &&
129
129
  this.loggerProvider.enable(options.logLevel);
130
130
  this.identifiers = new identifiers_1.SessionIdentifiers({ sessionId: options.sessionId, deviceId: options.deviceId });
131
- _d = this;
131
+ _e = this;
132
132
  return [4 /*yield*/, (0, joined_config_1.createSessionReplayJoinedConfigGenerator)(apiKey, options)];
133
133
  case 1:
134
- _d.joinedConfigGenerator = _f.sent();
135
- _e = this;
134
+ _e.joinedConfigGenerator = _g.sent();
135
+ _f = this;
136
136
  return [4 /*yield*/, this.joinedConfigGenerator.generateJoinedConfig(this.identifiers.sessionId)];
137
137
  case 2:
138
- _e.config = _f.sent();
138
+ _f.config = _g.sent();
139
139
  if (options.sessionId && ((_a = this.config.interactionConfig) === null || _a === void 0 ? void 0 : _a.enabled)) {
140
140
  scrollWatcher = scroll_1.ScrollWatcher.default({
141
141
  sessionId: options.sessionId,
@@ -145,43 +145,51 @@ var SessionReplay = /** @class */ (function () {
145
145
  this.scrollHook = scrollWatcher.hook.bind(scrollWatcher);
146
146
  }
147
147
  managers = [];
148
- _f.label = 3;
148
+ storeType = this.config.storeType;
149
+ if (storeType === 'idb' && !((_b = (0, analytics_client_common_1.getGlobalScope)()) === null || _b === void 0 ? void 0 : _b.indexedDB)) {
150
+ storeType = 'memory';
151
+ this.loggerProvider.warn('Could not use preferred indexedDB storage, reverting to in memory option.');
152
+ }
153
+ this.loggerProvider.log("Using ".concat(storeType, " for event storage."));
154
+ _g.label = 3;
149
155
  case 3:
150
- _f.trys.push([3, 5, , 6]);
156
+ _g.trys.push([3, 5, , 6]);
151
157
  return [4 /*yield*/, (0, events_manager_1.createEventsManager)({
152
158
  config: this.config,
153
159
  sessionId: this.identifiers.sessionId,
154
160
  type: 'replay',
161
+ storeType: storeType,
155
162
  })];
156
163
  case 4:
157
- rrwebEventManager = _f.sent();
164
+ rrwebEventManager = _g.sent();
158
165
  managers.push({ name: 'replay', manager: rrwebEventManager });
159
166
  return [3 /*break*/, 6];
160
167
  case 5:
161
- error_1 = _f.sent();
168
+ error_1 = _g.sent();
162
169
  typedError = error_1;
163
170
  this.loggerProvider.warn("Error occurred while creating replay events manager: ".concat(typedError.toString()));
164
171
  return [3 /*break*/, 6];
165
172
  case 6:
166
- if (!((_b = this.config.interactionConfig) === null || _b === void 0 ? void 0 : _b.enabled)) return [3 /*break*/, 10];
173
+ if (!((_c = this.config.interactionConfig) === null || _c === void 0 ? void 0 : _c.enabled)) return [3 /*break*/, 10];
167
174
  payloadBatcher = this.config.interactionConfig.batch ? click_1.clickBatcher : click_1.clickNonBatcher;
168
- _f.label = 7;
175
+ _g.label = 7;
169
176
  case 7:
170
- _f.trys.push([7, 9, , 10]);
177
+ _g.trys.push([7, 9, , 10]);
171
178
  return [4 /*yield*/, (0, events_manager_1.createEventsManager)({
172
179
  config: this.config,
173
180
  sessionId: this.identifiers.sessionId,
174
181
  type: 'interaction',
175
- minInterval: (_c = this.config.interactionConfig.trackEveryNms) !== null && _c !== void 0 ? _c : constants_1.INTERACTION_MIN_INTERVAL,
182
+ minInterval: (_d = this.config.interactionConfig.trackEveryNms) !== null && _d !== void 0 ? _d : constants_1.INTERACTION_MIN_INTERVAL,
176
183
  maxInterval: constants_1.INTERACTION_MAX_INTERVAL,
177
184
  payloadBatcher: payloadBatcher,
185
+ storeType: storeType,
178
186
  })];
179
187
  case 8:
180
- interactionEventManager = _f.sent();
188
+ interactionEventManager = _g.sent();
181
189
  managers.push({ name: 'interaction', manager: interactionEventManager });
182
190
  return [3 /*break*/, 10];
183
191
  case 9:
184
- error_2 = _f.sent();
192
+ error_2 = _g.sent();
185
193
  typedError = error_2;
186
194
  this.loggerProvider.warn("Error occurred while creating interaction events manager: ".concat(typedError.toString()));
187
195
  return [3 /*break*/, 10];