@amplitude/session-replay-browser 1.8.0 → 1.9.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 (106) hide show
  1. package/lib/cjs/config/joined-config.d.ts.map +1 -1
  2. package/lib/cjs/config/joined-config.js +22 -16
  3. package/lib/cjs/config/joined-config.js.map +1 -1
  4. package/lib/cjs/config/local-config.d.ts +2 -1
  5. package/lib/cjs/config/local-config.d.ts.map +1 -1
  6. package/lib/cjs/config/local-config.js.map +1 -1
  7. package/lib/cjs/config/types.d.ts +6 -0
  8. package/lib/cjs/config/types.d.ts.map +1 -1
  9. package/lib/cjs/config/types.js.map +1 -1
  10. package/lib/cjs/constants.d.ts +2 -0
  11. package/lib/cjs/constants.d.ts.map +1 -1
  12. package/lib/cjs/constants.js +3 -1
  13. package/lib/cjs/constants.js.map +1 -1
  14. package/lib/cjs/events/events-idb-store.d.ts +11 -4
  15. package/lib/cjs/events/events-idb-store.d.ts.map +1 -1
  16. package/lib/cjs/events/events-idb-store.js +38 -27
  17. package/lib/cjs/events/events-idb-store.js.map +1 -1
  18. package/lib/cjs/events/events-manager.d.ts +8 -3
  19. package/lib/cjs/events/events-manager.d.ts.map +1 -1
  20. package/lib/cjs/events/events-manager.js +9 -8
  21. package/lib/cjs/events/events-manager.js.map +1 -1
  22. package/lib/cjs/events/multi-manager.d.ts +26 -0
  23. package/lib/cjs/events/multi-manager.d.ts.map +1 -0
  24. package/lib/cjs/events/multi-manager.js +70 -0
  25. package/lib/cjs/events/multi-manager.js.map +1 -0
  26. package/lib/cjs/hooks/click.d.ts +25 -0
  27. package/lib/cjs/hooks/click.d.ts.map +1 -0
  28. package/lib/cjs/hooks/click.js +72 -0
  29. package/lib/cjs/hooks/click.js.map +1 -0
  30. package/lib/cjs/session-replay.d.ts +2 -2
  31. package/lib/cjs/session-replay.d.ts.map +1 -1
  32. package/lib/cjs/session-replay.js +44 -20
  33. package/lib/cjs/session-replay.js.map +1 -1
  34. package/lib/cjs/track-destination.d.ts +10 -1
  35. package/lib/cjs/track-destination.d.ts.map +1 -1
  36. package/lib/cjs/track-destination.js +9 -3
  37. package/lib/cjs/track-destination.js.map +1 -1
  38. package/lib/cjs/typings/session-replay.d.ts +38 -4
  39. package/lib/cjs/typings/session-replay.d.ts.map +1 -1
  40. package/lib/cjs/typings/session-replay.js.map +1 -1
  41. package/lib/esm/config/joined-config.d.ts.map +1 -1
  42. package/lib/esm/config/joined-config.js +22 -16
  43. package/lib/esm/config/joined-config.js.map +1 -1
  44. package/lib/esm/config/local-config.d.ts +2 -1
  45. package/lib/esm/config/local-config.d.ts.map +1 -1
  46. package/lib/esm/config/local-config.js.map +1 -1
  47. package/lib/esm/config/types.d.ts +6 -0
  48. package/lib/esm/config/types.d.ts.map +1 -1
  49. package/lib/esm/config/types.js.map +1 -1
  50. package/lib/esm/constants.d.ts +2 -0
  51. package/lib/esm/constants.d.ts.map +1 -1
  52. package/lib/esm/constants.js +2 -0
  53. package/lib/esm/constants.js.map +1 -1
  54. package/lib/esm/events/events-idb-store.d.ts +11 -4
  55. package/lib/esm/events/events-idb-store.d.ts.map +1 -1
  56. package/lib/esm/events/events-idb-store.js +38 -27
  57. package/lib/esm/events/events-idb-store.js.map +1 -1
  58. package/lib/esm/events/events-manager.d.ts +8 -3
  59. package/lib/esm/events/events-manager.d.ts.map +1 -1
  60. package/lib/esm/events/events-manager.js +9 -8
  61. package/lib/esm/events/events-manager.js.map +1 -1
  62. package/lib/esm/events/multi-manager.d.ts +26 -0
  63. package/lib/esm/events/multi-manager.d.ts.map +1 -0
  64. package/lib/esm/events/multi-manager.js +68 -0
  65. package/lib/esm/events/multi-manager.js.map +1 -0
  66. package/lib/esm/hooks/click.d.ts +25 -0
  67. package/lib/esm/hooks/click.d.ts.map +1 -0
  68. package/lib/esm/hooks/click.js +68 -0
  69. package/lib/esm/hooks/click.js.map +1 -0
  70. package/lib/esm/session-replay.d.ts +2 -2
  71. package/lib/esm/session-replay.d.ts.map +1 -1
  72. package/lib/esm/session-replay.js +46 -22
  73. package/lib/esm/session-replay.js.map +1 -1
  74. package/lib/esm/track-destination.d.ts +10 -1
  75. package/lib/esm/track-destination.d.ts.map +1 -1
  76. package/lib/esm/track-destination.js +9 -3
  77. package/lib/esm/track-destination.js.map +1 -1
  78. package/lib/esm/typings/session-replay.d.ts +38 -4
  79. package/lib/esm/typings/session-replay.d.ts.map +1 -1
  80. package/lib/esm/typings/session-replay.js.map +1 -1
  81. package/lib/scripts/amplitude-min.js +1 -1
  82. package/lib/scripts/amplitude-min.js.gz +0 -0
  83. package/lib/scripts/amplitude-min.umd.js +1 -1
  84. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  85. package/lib/scripts/config/joined-config.d.ts.map +1 -1
  86. package/lib/scripts/config/local-config.d.ts +2 -1
  87. package/lib/scripts/config/local-config.d.ts.map +1 -1
  88. package/lib/scripts/config/types.d.ts +6 -0
  89. package/lib/scripts/config/types.d.ts.map +1 -1
  90. package/lib/scripts/constants.d.ts +2 -0
  91. package/lib/scripts/constants.d.ts.map +1 -1
  92. package/lib/scripts/events/events-idb-store.d.ts +11 -4
  93. package/lib/scripts/events/events-idb-store.d.ts.map +1 -1
  94. package/lib/scripts/events/events-manager.d.ts +8 -3
  95. package/lib/scripts/events/events-manager.d.ts.map +1 -1
  96. package/lib/scripts/events/multi-manager.d.ts +26 -0
  97. package/lib/scripts/events/multi-manager.d.ts.map +1 -0
  98. package/lib/scripts/hooks/click.d.ts +25 -0
  99. package/lib/scripts/hooks/click.d.ts.map +1 -0
  100. package/lib/scripts/session-replay.d.ts +2 -2
  101. package/lib/scripts/session-replay.d.ts.map +1 -1
  102. package/lib/scripts/track-destination.d.ts +10 -1
  103. package/lib/scripts/track-destination.d.ts.map +1 -1
  104. package/lib/scripts/typings/session-replay.d.ts +38 -4
  105. package/lib/scripts/typings/session-replay.d.ts.map +1 -1
  106. package/package.json +7 -2
@@ -1 +1 @@
1
- {"version":3,"file":"joined-config.d.ts","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EACL,wBAAwB,IAAI,yBAAyB,EAErD,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAEjB,qBAAa,kCAAkC;IAC7C,WAAW,EAAE,yBAAyB,CAAC;IACvC,iBAAiB,EAAE,iBAAiB,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;gBAEhE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAInD,UAAU;IAOV,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;CA+HnF;AAED,eAAO,MAAM,wCAAwC,WAAkB,MAAM,WAAW,oBAAoB,gDAI3G,CAAC"}
1
+ {"version":3,"file":"joined-config.d.ts","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,EACL,wBAAwB,IAAI,yBAAyB,EAErD,yBAAyB,EACzB,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAEjB,qBAAa,kCAAkC;IAC7C,WAAW,EAAE,yBAAyB,CAAC;IACvC,iBAAiB,EAAE,iBAAiB,CAAC,yBAAyB,CAAC,GAAG,SAAS,CAAC;gBAEhE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAInD,UAAU;IAOV,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAsInF;AAED,eAAO,MAAM,wCAAwC,WAAkB,MAAM,WAAW,oBAAoB,gDAI3G,CAAC"}
@@ -29,10 +29,10 @@ var SessionReplayJoinedConfigGenerator = /** @class */ (function () {
29
29
  SessionReplayJoinedConfigGenerator.prototype.generateJoinedConfig = function (sessionId) {
30
30
  var _a, _b, _c;
31
31
  return tslib_1.__awaiter(this, void 0, void 0, function () {
32
- var config, remoteConfig, samplingConfig_1, privacyConfig, err_1, knownError, samplingConfig, remotePrivacyConfig, localPrivacyConfig, joinedPrivacyConfig, privacyConfigSelectorMap, selectorMap, _d, _e, _f, selector, selectorType;
33
- var e_1, _g;
34
- return tslib_1.__generator(this, function (_h) {
35
- switch (_h.label) {
32
+ var config, remoteConfig, samplingConfig_1, privacyConfig, _d, err_1, knownError, samplingConfig, remotePrivacyConfig, localPrivacyConfig, joinedPrivacyConfig, privacyConfigSelectorMap, selectorMap, _e, _f, _g, selector, selectorType;
33
+ var e_1, _h;
34
+ return tslib_1.__generator(this, function (_j) {
35
+ switch (_j.label) {
36
36
  case 0:
37
37
  config = tslib_1.__assign({}, this.localConfig);
38
38
  // Special case here as optOut is implemented via getter/setter
@@ -40,18 +40,24 @@ var SessionReplayJoinedConfigGenerator = /** @class */ (function () {
40
40
  // We always want captureEnabled to be true, unless there's an override
41
41
  // in the remote config.
42
42
  config.captureEnabled = true;
43
- _h.label = 1;
43
+ _j.label = 1;
44
44
  case 1:
45
- _h.trys.push([1, 4, , 5]);
45
+ _j.trys.push([1, 5, , 6]);
46
46
  if (!this.remoteConfigFetch) {
47
47
  return [2 /*return*/, config];
48
48
  }
49
49
  return [4 /*yield*/, this.remoteConfigFetch.getRemoteConfig('sessionReplay', 'sr_sampling_config', sessionId)];
50
50
  case 2:
51
- samplingConfig_1 = _h.sent();
51
+ samplingConfig_1 = _j.sent();
52
52
  return [4 /*yield*/, this.remoteConfigFetch.getRemoteConfig('sessionReplay', 'sr_privacy_config', sessionId)];
53
53
  case 3:
54
- privacyConfig = _h.sent();
54
+ privacyConfig = _j.sent();
55
+ // This is intentionally forced to only be set through the remote config.
56
+ _d = config;
57
+ return [4 /*yield*/, this.remoteConfigFetch.getRemoteConfig('sessionReplay', 'sr_interaction_config', sessionId)];
58
+ case 4:
59
+ // This is intentionally forced to only be set through the remote config.
60
+ _d.interactionConfig = _j.sent();
55
61
  if (samplingConfig_1 || privacyConfig) {
56
62
  remoteConfig = {};
57
63
  if (samplingConfig_1) {
@@ -61,14 +67,14 @@ var SessionReplayJoinedConfigGenerator = /** @class */ (function () {
61
67
  remoteConfig.sr_privacy_config = privacyConfig;
62
68
  }
63
69
  }
64
- return [3 /*break*/, 5];
65
- case 4:
66
- err_1 = _h.sent();
70
+ return [3 /*break*/, 6];
71
+ case 5:
72
+ err_1 = _j.sent();
67
73
  knownError = err_1;
68
74
  this.localConfig.loggerProvider.warn(knownError.message);
69
75
  config.captureEnabled = true;
70
- return [3 /*break*/, 5];
71
- case 5:
76
+ return [3 /*break*/, 6];
77
+ case 6:
72
78
  if (!remoteConfig) {
73
79
  return [2 /*return*/, config];
74
80
  }
@@ -162,8 +168,8 @@ var SessionReplayJoinedConfigGenerator = /** @class */ (function () {
162
168
  };
163
169
  selectorMap = tslib_1.__assign(tslib_1.__assign({}, privacyConfigSelectorMap(localPrivacyConfig)), privacyConfigSelectorMap(remotePrivacyConfig));
164
170
  try {
165
- for (_d = tslib_1.__values(Object.entries(selectorMap)), _e = _d.next(); !_e.done; _e = _d.next()) {
166
- _f = tslib_1.__read(_e.value, 2), selector = _f[0], selectorType = _f[1];
171
+ for (_e = tslib_1.__values(Object.entries(selectorMap)), _f = _e.next(); !_f.done; _f = _e.next()) {
172
+ _g = tslib_1.__read(_f.value, 2), selector = _g[0], selectorType = _g[1];
167
173
  if (selectorType === 'mask') {
168
174
  joinedPrivacyConfig.maskSelector.push(selector);
169
175
  }
@@ -178,7 +184,7 @@ var SessionReplayJoinedConfigGenerator = /** @class */ (function () {
178
184
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
179
185
  finally {
180
186
  try {
181
- if (_e && !_e.done && (_g = _d.return)) _g.call(_d);
187
+ if (_f && !_f.done && (_h = _e.return)) _h.call(_e);
182
188
  }
183
189
  finally { if (e_1) throw e_1.error; }
184
190
  }
@@ -1 +1 @@
1
- {"version":3,"file":"joined-config.js","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,iBA+JA;;;;AA/JA,8EAAgG;AAEhG,+CAA0D;AAQ1D;IAIE,4CAAY,MAAc,EAAE,OAA6B;QACvD,IAAI,CAAC,WAAW,GAAG,IAAI,uCAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAEK,uDAAU,GAAhB;;;;;;wBACE,KAAA,IAAI,CAAA;wBAAqB,qBAAM,IAAA,iDAAuB,EAA4B;gCAChF,WAAW,EAAE,IAAI,CAAC,WAAW;gCAC7B,UAAU,EAAE,CAAC,eAAe,CAAC;6BAC9B,CAAC,EAAA;;wBAHF,GAAK,iBAAiB,GAAG,SAGvB,CAAC;;;;;KACJ;IAEK,iEAAoB,GAA1B,UAA2B,SAAkB;;;;;;;;wBACrC,MAAM,wBAAmC,IAAI,CAAC,WAAW,CAAE,CAAC;wBAClE,+DAA+D;wBAC/D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;wBACxC,uEAAuE;wBACvE,wBAAwB;wBACxB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;;;;wBAG3B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;4BAC3B,sBAAO,MAAM,EAAC;yBACf;wBAEsB,qBAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CACjE,eAAe,EACf,oBAAoB,EACpB,SAAS,CACV,EAAA;;wBAJK,mBAAiB,SAItB;wBAEqB,qBAAM,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAChE,eAAe,EACf,mBAAmB,EACnB,SAAS,CACV,EAAA;;wBAJK,aAAa,GAAG,SAIrB;wBAED,IAAI,gBAAc,IAAI,aAAa,EAAE;4BACnC,YAAY,GAAG,EAAE,CAAC;4BAClB,IAAI,gBAAc,EAAE;gCAClB,YAAY,CAAC,kBAAkB,GAAG,gBAAc,CAAC;6BAClD;4BACD,IAAI,aAAa,EAAE;gCACjB,YAAY,CAAC,iBAAiB,GAAG,aAAa,CAAC;6BAChD;yBACF;;;;wBAEK,UAAU,GAAG,KAAY,CAAC;wBAChC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;wBACzD,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;;;wBAG/B,IAAI,CAAC,YAAY,EAAE;4BACjB,sBAAO,MAAM,EAAC;yBACf;wBAE2B,cAAc,GAA6C,YAAY,mBAAzD,EAAqB,mBAAmB,GAAK,YAAY,kBAAjB,CAAkB;wBACpG,IAAI,cAAc,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;4BAC5D,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,EAAE;gCAC3E,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC,eAAe,CAAC;6BACxD;iCAAM;gCACL,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC;6BAC/B;4BAED,IAAI,cAAc,CAAC,WAAW,EAAE;gCAC9B,MAAM,CAAC,UAAU,GAAG,cAAc,CAAC,WAAW,CAAC;6BAChD;yBACF;6BAAM;4BACL,iFAAiF;4BACjF,4EAA4E;4BAC5E,wCAAwC;4BACxC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;4BAC7B,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,KAAK,CACnC,oGAAoG,CACrG,CAAC;yBACH;wBAED,qFAAqF;wBACrF,oFAAoF;wBACpF,8DAA8D;wBAC9D,mCAAmC;wBACnC,EAAE;wBACF,oEAAoE;wBACpE,0FAA0F;wBAC1F,EAAE;wBACF,0FAA0F;wBAC1F,2BAA2B;wBAC3B,qCAAqC;wBACrC,4BAA4B;wBAC5B,KAAK;wBAEL,IAAI,mBAAmB,EAAE;4BACjB,kBAAkB,GAAkB,MAAA,MAAM,CAAC,aAAa,mCAAI,EAAE,CAAC;4BAE/D,mBAAmB,GAA0D;gCACjF,gBAAgB,EAAE,MAAA,MAAA,mBAAmB,CAAC,gBAAgB,mCAAI,kBAAkB,CAAC,gBAAgB,mCAAI,QAAQ;gCACzG,aAAa,EAAE,EAAE;gCACjB,YAAY,EAAE,EAAE;gCAChB,cAAc,EAAE,EAAE;6BACnB,CAAC;4BAEI,wBAAwB,GAAG,UAAC,aAA4B;;;gCAC5D,IAAM,WAAW,GAAgD,EAAE,CAAC;gCACpE,IAAI,OAAO,aAAa,CAAC,aAAa,KAAK,QAAQ,EAAE;oCACnD,aAAa,CAAC,aAAa,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;iCAC7D;;oCAED,KAAuB,IAAA,KAAA,iBAAA,MAAA,aAAa,CAAC,aAAa,mCAAI,EAAE,CAAA,gBAAA,4BAAE;wCAArD,IAAM,QAAQ,WAAA;wCACjB,WAAW,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC;qCACjC;;;;;;;;;;oCACD,KAAuB,IAAA,KAAA,iBAAA,MAAA,aAAa,CAAC,YAAY,mCAAI,EAAE,CAAA,gBAAA,4BAAE;wCAApD,IAAM,QAAQ,WAAA;wCACjB,WAAW,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC;qCAChC;;;;;;;;;;oCACD,KAAuB,IAAA,KAAA,iBAAA,MAAA,aAAa,CAAC,cAAc,mCAAI,EAAE,CAAA,gBAAA,4BAAE;wCAAtD,IAAM,QAAQ,WAAA;wCACjB,WAAW,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;qCAClC;;;;;;;;;gCACD,OAAO,WAAW,CAAC;4BACrB,CAAC,CAAC;4BAEI,WAAW,yCACZ,wBAAwB,CAAC,kBAAkB,CAAC,GAC5C,wBAAwB,CAAC,mBAAmB,CAAC,CACjD,CAAC;;gCAEF,KAAuC,KAAA,iBAAA,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA,4CAAE;oCAAzD,KAAA,2BAAwB,EAAvB,QAAQ,QAAA,EAAE,YAAY,QAAA;oCAChC,IAAI,YAAY,KAAK,MAAM,EAAE;wCAC3B,mBAAmB,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;qCACjD;yCAAM,IAAI,YAAY,KAAK,OAAO,EAAE;wCACnC,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;qCAClD;yCAAM,IAAI,YAAY,KAAK,QAAQ,EAAE;wCACpC,mBAAmB,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;qCACnD;iCACF;;;;;;;;;4BAED,MAAM,CAAC,aAAa,GAAG,mBAAmB,CAAC;yBAC5C;wBAED,sBAAO,MAAM,EAAC;;;;KACf;IACH,yCAAC;AAAD,CAAC,AA9ID,IA8IC;AA9IY,gFAAkC;AAgJxC,IAAM,wCAAwC,GAAG,UAAO,MAAc,EAAE,OAA6B;;;;;gBACpG,qBAAqB,GAAG,IAAI,kCAAkC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBACtF,qBAAM,qBAAqB,CAAC,UAAU,EAAE,EAAA;;gBAAxC,SAAwC,CAAC;gBACzC,sBAAO,qBAAqB,EAAC;;;KAC9B,CAAC;AAJW,QAAA,wCAAwC,4CAInD","sourcesContent":["import { RemoteConfigFetch, createRemoteConfigFetch } from '@amplitude/analytics-remote-config';\nimport { SessionReplayOptions } from '../typings/session-replay';\nimport { SessionReplayLocalConfig } from './local-config';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n PrivacyConfig,\n SessionReplayJoinedConfig,\n SessionReplayRemoteConfig,\n} from './types';\n\nexport class SessionReplayJoinedConfigGenerator {\n localConfig: ISessionReplayLocalConfig;\n remoteConfigFetch: RemoteConfigFetch<SessionReplayRemoteConfig> | undefined;\n\n constructor(apiKey: string, options: SessionReplayOptions) {\n this.localConfig = new SessionReplayLocalConfig(apiKey, options);\n }\n\n async initialize() {\n this.remoteConfigFetch = await createRemoteConfigFetch<SessionReplayRemoteConfig>({\n localConfig: this.localConfig,\n configKeys: ['sessionReplay'],\n });\n }\n\n async generateJoinedConfig(sessionId?: number): Promise<SessionReplayJoinedConfig> {\n const config: SessionReplayJoinedConfig = { ...this.localConfig };\n // Special case here as optOut is implemented via getter/setter\n config.optOut = this.localConfig.optOut;\n // We always want captureEnabled to be true, unless there's an override\n // in the remote config.\n config.captureEnabled = true;\n let remoteConfig: SessionReplayRemoteConfig | undefined;\n try {\n if (!this.remoteConfigFetch) {\n return config;\n }\n\n const samplingConfig = await this.remoteConfigFetch.getRemoteConfig(\n 'sessionReplay',\n 'sr_sampling_config',\n sessionId,\n );\n\n const privacyConfig = await this.remoteConfigFetch.getRemoteConfig(\n 'sessionReplay',\n 'sr_privacy_config',\n sessionId,\n );\n\n if (samplingConfig || privacyConfig) {\n remoteConfig = {};\n if (samplingConfig) {\n remoteConfig.sr_sampling_config = samplingConfig;\n }\n if (privacyConfig) {\n remoteConfig.sr_privacy_config = privacyConfig;\n }\n }\n } catch (err: unknown) {\n const knownError = err as Error;\n this.localConfig.loggerProvider.warn(knownError.message);\n config.captureEnabled = true;\n }\n\n if (!remoteConfig) {\n return config;\n }\n\n const { sr_sampling_config: samplingConfig, sr_privacy_config: remotePrivacyConfig } = remoteConfig;\n if (samplingConfig && Object.keys(samplingConfig).length > 0) {\n if (Object.prototype.hasOwnProperty.call(samplingConfig, 'capture_enabled')) {\n config.captureEnabled = samplingConfig.capture_enabled;\n } else {\n config.captureEnabled = false;\n }\n\n if (samplingConfig.sample_rate) {\n config.sampleRate = samplingConfig.sample_rate;\n }\n } else {\n // If config API response was valid (ie 200), but no config returned, assume that\n // customer has not yet set up config, and use sample rate from SDK options,\n // allowing for immediate replay capture\n config.captureEnabled = true;\n this.localConfig.loggerProvider.debug(\n 'Remote config successfully fetched, but no values set for project, Session Replay capture enabled.',\n );\n }\n\n // Remote config join acts somewhat like a left join between the remote and the local\n // config. That is, remote config has precedence over local values as with sampling.\n // However, non conflicting values will be added to the lists.\n // Here's an example to illustrate:\n //\n // Remote config: {'.selector1': 'MASK', '.selector2': 'UNMASK'}\n // Local config: {'.selector1': 'UNMASK', '.selector3': 'MASK'}\n //\n // Resolved config: {'.selector1': 'MASK', '.selector2': 'UNMASK', '.selector3': 'MASK'}\n // config.privacyConfig = {\n // ...(config.privacyConfig ?? {}),\n // ...remotePrivacyConfig,\n // };\n\n if (remotePrivacyConfig) {\n const localPrivacyConfig: PrivacyConfig = config.privacyConfig ?? {};\n\n const joinedPrivacyConfig: Required<PrivacyConfig> & { blockSelector: string[] } = {\n defaultMaskLevel: remotePrivacyConfig.defaultMaskLevel ?? localPrivacyConfig.defaultMaskLevel ?? 'medium',\n blockSelector: [],\n maskSelector: [],\n unmaskSelector: [],\n };\n\n const privacyConfigSelectorMap = (privacyConfig: PrivacyConfig): Record<string, 'mask' | 'unmask' | 'block'> => {\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {};\n if (typeof privacyConfig.blockSelector === 'string') {\n privacyConfig.blockSelector = [privacyConfig.blockSelector];\n }\n\n for (const selector of privacyConfig.blockSelector ?? []) {\n selectorMap[selector] = 'block';\n }\n for (const selector of privacyConfig.maskSelector ?? []) {\n selectorMap[selector] = 'mask';\n }\n for (const selector of privacyConfig.unmaskSelector ?? []) {\n selectorMap[selector] = 'unmask';\n }\n return selectorMap;\n };\n\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {\n ...privacyConfigSelectorMap(localPrivacyConfig),\n ...privacyConfigSelectorMap(remotePrivacyConfig),\n };\n\n for (const [selector, selectorType] of Object.entries(selectorMap)) {\n if (selectorType === 'mask') {\n joinedPrivacyConfig.maskSelector.push(selector);\n } else if (selectorType === 'block') {\n joinedPrivacyConfig.blockSelector.push(selector);\n } else if (selectorType === 'unmask') {\n joinedPrivacyConfig.unmaskSelector.push(selector);\n }\n }\n\n config.privacyConfig = joinedPrivacyConfig;\n }\n\n return config;\n }\n}\n\nexport const createSessionReplayJoinedConfigGenerator = async (apiKey: string, options: SessionReplayOptions) => {\n const joinedConfigGenerator = new SessionReplayJoinedConfigGenerator(apiKey, options);\n await joinedConfigGenerator.initialize();\n return joinedConfigGenerator;\n};\n"]}
1
+ {"version":3,"file":"joined-config.js","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"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","sourcesContent":["import { RemoteConfigFetch, createRemoteConfigFetch } from '@amplitude/analytics-remote-config';\nimport { SessionReplayOptions } from '../typings/session-replay';\nimport { SessionReplayLocalConfig } from './local-config';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n PrivacyConfig,\n SessionReplayJoinedConfig,\n SessionReplayRemoteConfig,\n} from './types';\n\nexport class SessionReplayJoinedConfigGenerator {\n localConfig: ISessionReplayLocalConfig;\n remoteConfigFetch: RemoteConfigFetch<SessionReplayRemoteConfig> | undefined;\n\n constructor(apiKey: string, options: SessionReplayOptions) {\n this.localConfig = new SessionReplayLocalConfig(apiKey, options);\n }\n\n async initialize() {\n this.remoteConfigFetch = await createRemoteConfigFetch<SessionReplayRemoteConfig>({\n localConfig: this.localConfig,\n configKeys: ['sessionReplay'],\n });\n }\n\n async generateJoinedConfig(sessionId?: number): Promise<SessionReplayJoinedConfig> {\n const config: SessionReplayJoinedConfig = { ...this.localConfig };\n // Special case here as optOut is implemented via getter/setter\n config.optOut = this.localConfig.optOut;\n // We always want captureEnabled to be true, unless there's an override\n // in the remote config.\n config.captureEnabled = true;\n let remoteConfig: SessionReplayRemoteConfig | undefined;\n try {\n if (!this.remoteConfigFetch) {\n return config;\n }\n\n const samplingConfig = await this.remoteConfigFetch.getRemoteConfig(\n 'sessionReplay',\n 'sr_sampling_config',\n sessionId,\n );\n\n const privacyConfig = await this.remoteConfigFetch.getRemoteConfig(\n 'sessionReplay',\n 'sr_privacy_config',\n sessionId,\n );\n\n // This is intentionally forced to only be set through the remote config.\n config.interactionConfig = await this.remoteConfigFetch.getRemoteConfig(\n 'sessionReplay',\n 'sr_interaction_config',\n sessionId,\n );\n\n if (samplingConfig || privacyConfig) {\n remoteConfig = {};\n if (samplingConfig) {\n remoteConfig.sr_sampling_config = samplingConfig;\n }\n if (privacyConfig) {\n remoteConfig.sr_privacy_config = privacyConfig;\n }\n }\n } catch (err: unknown) {\n const knownError = err as Error;\n this.localConfig.loggerProvider.warn(knownError.message);\n config.captureEnabled = true;\n }\n\n if (!remoteConfig) {\n return config;\n }\n\n const { sr_sampling_config: samplingConfig, sr_privacy_config: remotePrivacyConfig } = remoteConfig;\n if (samplingConfig && Object.keys(samplingConfig).length > 0) {\n if (Object.prototype.hasOwnProperty.call(samplingConfig, 'capture_enabled')) {\n config.captureEnabled = samplingConfig.capture_enabled;\n } else {\n config.captureEnabled = false;\n }\n\n if (samplingConfig.sample_rate) {\n config.sampleRate = samplingConfig.sample_rate;\n }\n } else {\n // If config API response was valid (ie 200), but no config returned, assume that\n // customer has not yet set up config, and use sample rate from SDK options,\n // allowing for immediate replay capture\n config.captureEnabled = true;\n this.localConfig.loggerProvider.debug(\n 'Remote config successfully fetched, but no values set for project, Session Replay capture enabled.',\n );\n }\n\n // Remote config join acts somewhat like a left join between the remote and the local\n // config. That is, remote config has precedence over local values as with sampling.\n // However, non conflicting values will be added to the lists.\n // Here's an example to illustrate:\n //\n // Remote config: {'.selector1': 'MASK', '.selector2': 'UNMASK'}\n // Local config: {'.selector1': 'UNMASK', '.selector3': 'MASK'}\n //\n // Resolved config: {'.selector1': 'MASK', '.selector2': 'UNMASK', '.selector3': 'MASK'}\n // config.privacyConfig = {\n // ...(config.privacyConfig ?? {}),\n // ...remotePrivacyConfig,\n // };\n\n if (remotePrivacyConfig) {\n const localPrivacyConfig: PrivacyConfig = config.privacyConfig ?? {};\n\n const joinedPrivacyConfig: Required<PrivacyConfig> & { blockSelector: string[] } = {\n defaultMaskLevel: remotePrivacyConfig.defaultMaskLevel ?? localPrivacyConfig.defaultMaskLevel ?? 'medium',\n blockSelector: [],\n maskSelector: [],\n unmaskSelector: [],\n };\n\n const privacyConfigSelectorMap = (privacyConfig: PrivacyConfig): Record<string, 'mask' | 'unmask' | 'block'> => {\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {};\n if (typeof privacyConfig.blockSelector === 'string') {\n privacyConfig.blockSelector = [privacyConfig.blockSelector];\n }\n\n for (const selector of privacyConfig.blockSelector ?? []) {\n selectorMap[selector] = 'block';\n }\n for (const selector of privacyConfig.maskSelector ?? []) {\n selectorMap[selector] = 'mask';\n }\n for (const selector of privacyConfig.unmaskSelector ?? []) {\n selectorMap[selector] = 'unmask';\n }\n return selectorMap;\n };\n\n const selectorMap: Record<string, 'mask' | 'unmask' | 'block'> = {\n ...privacyConfigSelectorMap(localPrivacyConfig),\n ...privacyConfigSelectorMap(remotePrivacyConfig),\n };\n\n for (const [selector, selectorType] of Object.entries(selectorMap)) {\n if (selectorType === 'mask') {\n joinedPrivacyConfig.maskSelector.push(selector);\n } else if (selectorType === 'block') {\n joinedPrivacyConfig.blockSelector.push(selector);\n } else if (selectorType === 'unmask') {\n joinedPrivacyConfig.unmaskSelector.push(selector);\n }\n }\n\n config.privacyConfig = joinedPrivacyConfig;\n }\n\n return config;\n }\n}\n\nexport const createSessionReplayJoinedConfigGenerator = async (apiKey: string, options: SessionReplayOptions) => {\n const joinedConfigGenerator = new SessionReplayJoinedConfigGenerator(apiKey, options);\n await joinedConfigGenerator.initialize();\n return joinedConfigGenerator;\n};\n"]}
@@ -2,7 +2,7 @@ import { FetchTransport } from '@amplitude/analytics-client-common';
2
2
  import { Config, Logger } from '@amplitude/analytics-core';
3
3
  import { LogLevel } from '@amplitude/analytics-types';
4
4
  import { SessionReplayOptions } from '../typings/session-replay';
5
- import { SessionReplayLocalConfig as ISessionReplayLocalConfig, PrivacyConfig } from './types';
5
+ import { SessionReplayLocalConfig as ISessionReplayLocalConfig, InteractionConfig, PrivacyConfig } from './types';
6
6
  export declare const getDefaultConfig: () => {
7
7
  flushMaxRetries: number;
8
8
  logLevel: LogLevel;
@@ -13,6 +13,7 @@ export declare class SessionReplayLocalConfig extends Config implements ISession
13
13
  apiKey: string;
14
14
  sampleRate: number;
15
15
  privacyConfig?: PrivacyConfig;
16
+ interactionConfig?: InteractionConfig;
16
17
  debugMode?: boolean;
17
18
  configEndpointUrl?: string;
18
19
  shouldInlineStylesheet?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"local-config.d.ts","sourceRoot":"","sources":["../../../src/config/local-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,wBAAwB,IAAI,yBAAyB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE/F,eAAO,MAAM,gBAAgB;;;;;CAK3B,CAAC;AAEH,qBAAa,wBAAyB,SAAQ,MAAO,YAAW,yBAAyB;IACvF,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;gBAErB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;CAyB1D"}
1
+ {"version":3,"file":"local-config.d.ts","sourceRoot":"","sources":["../../../src/config/local-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,wBAAwB,IAAI,yBAAyB,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAElH,eAAO,MAAM,gBAAgB;;;;;CAK3B,CAAC;AAEH,qBAAa,wBAAyB,SAAQ,MAAO,YAAW,yBAAyB;IACvF,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;gBAErB,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;CAyB1D"}
@@ -1 +1 @@
1
- {"version":3,"file":"local-config.js","sourceRoot":"","sources":["../../../src/config/local-config.ts"],"names":[],"mappings":";;;AAAA,8EAAoE;AACpE,4DAA2D;AAC3D,8DAAsD;AACtD,0CAAwE;AAIjE,IAAM,gBAAgB,GAAG,cAAM,OAAA,CAAC;IACrC,eAAe,EAAE,CAAC;IAClB,QAAQ,EAAE,0BAAQ,CAAC,IAAI;IACvB,cAAc,EAAE,IAAI,uBAAM,EAAE;IAC5B,iBAAiB,EAAE,IAAI,wCAAc,EAAE;CACxC,CAAC,EALoC,CAKpC,CAAC;AALU,QAAA,gBAAgB,oBAK1B;AAEH;IAA8C,oDAAM;IAQlD,kCAAY,MAAc,EAAE,OAA6B;QAAzD,iBAwBC;QAvBC,IAAM,aAAa,GAAG,IAAA,wBAAgB,GAAE,CAAC;gBACzC,sDACE,iBAAiB,EAAE,aAAa,CAAC,iBAAiB,IAC/C,OAAO,KACV,MAAM,QAAA,IACN;QACF,KAAI,CAAC,eAAe;YAClB,OAAO,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,CAAC,eAAe,IAAI,aAAa,CAAC,eAAe;gBAC/F,CAAC,CAAC,OAAO,CAAC,eAAe;gBACzB,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC;QAEpC,KAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,KAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,+BAAmB,CAAC;QAC5D,KAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,+BAAmB,CAAC;QAC5D,KAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,KAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAE7D,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,KAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;SAC5C;QACD,IAAI,OAAO,CAAC,SAAS,EAAE;YACrB,KAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;SACpC;;IACH,CAAC;IACH,+BAAC;AAAD,CAAC,AAjCD,CAA8C,uBAAM,GAiCnD;AAjCY,4DAAwB","sourcesContent":["import { FetchTransport } from '@amplitude/analytics-client-common';\nimport { Config, Logger } from '@amplitude/analytics-core';\nimport { LogLevel } from '@amplitude/analytics-types';\nimport { DEFAULT_SAMPLE_RATE, DEFAULT_SERVER_ZONE } from '../constants';\nimport { SessionReplayOptions } from '../typings/session-replay';\nimport { SessionReplayLocalConfig as ISessionReplayLocalConfig, PrivacyConfig } from './types';\n\nexport const getDefaultConfig = () => ({\n flushMaxRetries: 2,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n transportProvider: new FetchTransport(),\n});\n\nexport class SessionReplayLocalConfig extends Config implements ISessionReplayLocalConfig {\n apiKey: string;\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n debugMode?: boolean;\n configEndpointUrl?: string;\n shouldInlineStylesheet?: boolean;\n\n constructor(apiKey: string, options: SessionReplayOptions) {\n const defaultConfig = getDefaultConfig();\n super({\n transportProvider: defaultConfig.transportProvider,\n ...options,\n apiKey,\n });\n this.flushMaxRetries =\n options.flushMaxRetries !== undefined && options.flushMaxRetries <= defaultConfig.flushMaxRetries\n ? options.flushMaxRetries\n : defaultConfig.flushMaxRetries;\n\n this.apiKey = apiKey;\n this.sampleRate = options.sampleRate || DEFAULT_SAMPLE_RATE;\n this.serverZone = options.serverZone || DEFAULT_SERVER_ZONE;\n this.configEndpointUrl = options.configEndpointUrl;\n this.shouldInlineStylesheet = options.shouldInlineStylesheet;\n\n if (options.privacyConfig) {\n this.privacyConfig = options.privacyConfig;\n }\n if (options.debugMode) {\n this.debugMode = options.debugMode;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"local-config.js","sourceRoot":"","sources":["../../../src/config/local-config.ts"],"names":[],"mappings":";;;AAAA,8EAAoE;AACpE,4DAA2D;AAC3D,8DAAsD;AACtD,0CAAwE;AAIjE,IAAM,gBAAgB,GAAG,cAAM,OAAA,CAAC;IACrC,eAAe,EAAE,CAAC;IAClB,QAAQ,EAAE,0BAAQ,CAAC,IAAI;IACvB,cAAc,EAAE,IAAI,uBAAM,EAAE;IAC5B,iBAAiB,EAAE,IAAI,wCAAc,EAAE;CACxC,CAAC,EALoC,CAKpC,CAAC;AALU,QAAA,gBAAgB,oBAK1B;AAEH;IAA8C,oDAAM;IASlD,kCAAY,MAAc,EAAE,OAA6B;QAAzD,iBAwBC;QAvBC,IAAM,aAAa,GAAG,IAAA,wBAAgB,GAAE,CAAC;gBACzC,sDACE,iBAAiB,EAAE,aAAa,CAAC,iBAAiB,IAC/C,OAAO,KACV,MAAM,QAAA,IACN;QACF,KAAI,CAAC,eAAe;YAClB,OAAO,CAAC,eAAe,KAAK,SAAS,IAAI,OAAO,CAAC,eAAe,IAAI,aAAa,CAAC,eAAe;gBAC/F,CAAC,CAAC,OAAO,CAAC,eAAe;gBACzB,CAAC,CAAC,aAAa,CAAC,eAAe,CAAC;QAEpC,KAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,KAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,+BAAmB,CAAC;QAC5D,KAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,+BAAmB,CAAC;QAC5D,KAAI,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QACnD,KAAI,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAE7D,IAAI,OAAO,CAAC,aAAa,EAAE;YACzB,KAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;SAC5C;QACD,IAAI,OAAO,CAAC,SAAS,EAAE;YACrB,KAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;SACpC;;IACH,CAAC;IACH,+BAAC;AAAD,CAAC,AAlCD,CAA8C,uBAAM,GAkCnD;AAlCY,4DAAwB","sourcesContent":["import { FetchTransport } from '@amplitude/analytics-client-common';\nimport { Config, Logger } from '@amplitude/analytics-core';\nimport { LogLevel } from '@amplitude/analytics-types';\nimport { DEFAULT_SAMPLE_RATE, DEFAULT_SERVER_ZONE } from '../constants';\nimport { SessionReplayOptions } from '../typings/session-replay';\nimport { SessionReplayLocalConfig as ISessionReplayLocalConfig, InteractionConfig, PrivacyConfig } from './types';\n\nexport const getDefaultConfig = () => ({\n flushMaxRetries: 2,\n logLevel: LogLevel.Warn,\n loggerProvider: new Logger(),\n transportProvider: new FetchTransport(),\n});\n\nexport class SessionReplayLocalConfig extends Config implements ISessionReplayLocalConfig {\n apiKey: string;\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n interactionConfig?: InteractionConfig;\n debugMode?: boolean;\n configEndpointUrl?: string;\n shouldInlineStylesheet?: boolean;\n\n constructor(apiKey: string, options: SessionReplayOptions) {\n const defaultConfig = getDefaultConfig();\n super({\n transportProvider: defaultConfig.transportProvider,\n ...options,\n apiKey,\n });\n this.flushMaxRetries =\n options.flushMaxRetries !== undefined && options.flushMaxRetries <= defaultConfig.flushMaxRetries\n ? options.flushMaxRetries\n : defaultConfig.flushMaxRetries;\n\n this.apiKey = apiKey;\n this.sampleRate = options.sampleRate || DEFAULT_SAMPLE_RATE;\n this.serverZone = options.serverZone || DEFAULT_SERVER_ZONE;\n this.configEndpointUrl = options.configEndpointUrl;\n this.shouldInlineStylesheet = options.shouldInlineStylesheet;\n\n if (options.privacyConfig) {\n this.privacyConfig = options.privacyConfig;\n }\n if (options.debugMode) {\n this.debugMode = options.debugMode;\n }\n }\n}\n"]}
@@ -3,9 +3,14 @@ export interface SamplingConfig {
3
3
  sample_rate: number;
4
4
  capture_enabled: boolean;
5
5
  }
6
+ export interface InteractionConfig {
7
+ trackEveryNms?: number;
8
+ enabled: boolean;
9
+ }
6
10
  export type SessionReplayRemoteConfig = {
7
11
  sr_sampling_config?: SamplingConfig;
8
12
  sr_privacy_config?: PrivacyConfig;
13
+ sr_interaction_config?: InteractionConfig;
9
14
  };
10
15
  export interface SessionReplayRemoteConfigAPIResponse {
11
16
  configs: {
@@ -33,6 +38,7 @@ export interface SessionReplayLocalConfig extends Config {
33
38
  }
34
39
  export interface SessionReplayJoinedConfig extends SessionReplayLocalConfig {
35
40
  captureEnabled?: boolean;
41
+ interactionConfig?: InteractionConfig;
36
42
  }
37
43
  export interface SessionReplayRemoteConfigFetch {
38
44
  getServerUrl: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,iBAAiB,CAAC,EAAE,aAAa,CAAC;CACnC,CAAC;AAEF,MAAM,WAAW,oCAAoC;IACnD,OAAO,EAAE;QACP,aAAa,EAAE,yBAAyB,CAAC;KAC1C,CAAC;CACH;AAED,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,QAAQ,GACR,cAAc,CAAC;AAEnB,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAG3C,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAClC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,wBAAyB,SAAQ,MAAM;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,yBAA0B,SAAQ,wBAAwB;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3G,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IACrF,eAAe,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,kCAAkC;IACjD,oBAAoB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClF"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAEtE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,kBAAkB,CAAC,EAAE,cAAc,CAAC;IACpC,iBAAiB,CAAC,EAAE,aAAa,CAAC;IAClC,qBAAqB,CAAC,EAAE,iBAAiB,CAAC;CAC3C,CAAC;AAEF,MAAM,WAAW,oCAAoC;IACnD,OAAO,EAAE;QACP,aAAa,EAAE,yBAAyB,CAAC;KAC1C,CAAC;CACH;AAED,MAAM,MAAM,SAAS,GACjB,OAAO,GACP,QAAQ,GACR,cAAc,CAAC;AAEnB,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAG3C,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAClC,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,wBAAyB,SAAQ,MAAM;IACtD,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,yBAA0B,SAAQ,wBAAwB;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,MAAM,WAAW,8BAA8B;IAC7C,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,CAAC;IAC3G,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;IACrF,eAAe,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,kCAAkC;IACjD,oBAAoB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,yBAAyB,CAAC,CAAC;CAClF"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":";;AAuBa,QAAA,kBAAkB,GAAG,QAAQ,CAAC","sourcesContent":["import { Config, LogLevel, Logger } from '@amplitude/analytics-types';\n\nexport interface SamplingConfig {\n sample_rate: number;\n capture_enabled: boolean;\n}\n\nexport type SessionReplayRemoteConfig = {\n sr_sampling_config?: SamplingConfig;\n sr_privacy_config?: PrivacyConfig;\n};\n\nexport interface SessionReplayRemoteConfigAPIResponse {\n configs: {\n sessionReplay: SessionReplayRemoteConfig;\n };\n}\n\nexport type MaskLevel =\n | 'light' // only mask a subset of inputs that’s deemed sensitive - password, credit card, telephone #, email. These are information we never want to capture.\n | 'medium' // mask all inputs\n | 'conservative'; // mask all inputs and all texts\n\nexport const DEFAULT_MASK_LEVEL = 'medium';\n\n// err on the side of excluding more\nexport type PrivacyConfig = {\n blockSelector?: string | string[]; // exclude in the UI\n defaultMaskLevel?: MaskLevel;\n maskSelector?: string[];\n unmaskSelector?: string[];\n};\n\nexport interface SessionReplayLocalConfig extends Config {\n apiKey: string;\n loggerProvider: Logger;\n logLevel: LogLevel;\n flushMaxRetries: number;\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n debugMode?: boolean;\n configEndpointUrl?: string;\n shouldInlineStylesheet?: boolean;\n}\n\nexport interface SessionReplayJoinedConfig extends SessionReplayLocalConfig {\n captureEnabled?: boolean;\n}\n\nexport interface SessionReplayRemoteConfigFetch {\n getServerUrl: () => void;\n getSamplingConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig['sr_sampling_config'] | void>;\n fetchRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n getRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n}\n\nexport interface SessionReplayJoinedConfigGenerator {\n generateJoinedConfig: (sessionId?: number) => Promise<SessionReplayJoinedConfig>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":";;AA6Ba,QAAA,kBAAkB,GAAG,QAAQ,CAAC","sourcesContent":["import { Config, LogLevel, Logger } from '@amplitude/analytics-types';\n\nexport interface SamplingConfig {\n sample_rate: number;\n capture_enabled: boolean;\n}\n\nexport interface InteractionConfig {\n trackEveryNms?: number;\n enabled: boolean; // defaults to false\n}\n\nexport type SessionReplayRemoteConfig = {\n sr_sampling_config?: SamplingConfig;\n sr_privacy_config?: PrivacyConfig;\n sr_interaction_config?: InteractionConfig;\n};\n\nexport interface SessionReplayRemoteConfigAPIResponse {\n configs: {\n sessionReplay: SessionReplayRemoteConfig;\n };\n}\n\nexport type MaskLevel =\n | 'light' // only mask a subset of inputs that’s deemed sensitive - password, credit card, telephone #, email. These are information we never want to capture.\n | 'medium' // mask all inputs\n | 'conservative'; // mask all inputs and all texts\n\nexport const DEFAULT_MASK_LEVEL = 'medium';\n\n// err on the side of excluding more\nexport type PrivacyConfig = {\n blockSelector?: string | string[]; // exclude in the UI\n defaultMaskLevel?: MaskLevel;\n maskSelector?: string[];\n unmaskSelector?: string[];\n};\n\nexport interface SessionReplayLocalConfig extends Config {\n apiKey: string;\n loggerProvider: Logger;\n logLevel: LogLevel;\n flushMaxRetries: number;\n sampleRate: number;\n privacyConfig?: PrivacyConfig;\n debugMode?: boolean;\n configEndpointUrl?: string;\n shouldInlineStylesheet?: boolean;\n}\n\nexport interface SessionReplayJoinedConfig extends SessionReplayLocalConfig {\n captureEnabled?: boolean;\n interactionConfig?: InteractionConfig;\n}\n\nexport interface SessionReplayRemoteConfigFetch {\n getServerUrl: () => void;\n getSamplingConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig['sr_sampling_config'] | void>;\n fetchRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n getRemoteConfig: (sessionId?: number) => Promise<SessionReplayRemoteConfig | void>;\n}\n\nexport interface SessionReplayJoinedConfigGenerator {\n generateJoinedConfig: (sessionId?: number) => Promise<SessionReplayJoinedConfig>;\n}\n"]}
@@ -14,6 +14,8 @@ export declare const SESSION_REPLAY_EU_URL = "https://api-sr.eu.amplitude.com/se
14
14
  export declare const SESSION_REPLAY_STAGING_URL = "https://api-sr.stag2.amplitude.com/sessions/v2/track";
15
15
  export declare const STORAGE_PREFIX: string;
16
16
  export declare const MAX_EVENT_LIST_SIZE_IN_BYTES: number;
17
+ export declare const INTERACTION_MIN_INTERVAL = 30000;
18
+ export declare const INTERACTION_MAX_INTERVAL = 60000;
17
19
  export declare const MIN_INTERVAL = 500;
18
20
  export declare const MAX_INTERVAL: number;
19
21
  export declare const MAX_IDB_STORAGE_LENGTH: number;
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAE3D,eAAO,MAAM,+BAA+B,QAAuD,CAAC;AACpG,eAAO,MAAM,2BAA2B,kBAAkB,CAAC;AAC3D,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,eAAO,MAAM,6BAA6B,QAA0D,CAAC;AAErG,eAAO,MAAM,WAAW,cAAc,CAAC;AACvC,eAAO,MAAM,eAAe,aAAa,CAAC;AAC1C,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,yBAAyB,mDAAmD,CAAC;AAC1F,eAAO,MAAM,qBAAqB,sDAAsD,CAAC;AACzF,eAAO,MAAM,0BAA0B,yDAAyD,CAAC;AACjG,eAAO,MAAM,cAAc,QAAsC,CAAC;AAClE,eAAO,MAAM,4BAA4B,QAAc,CAAC;AACxD,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,YAAY,QAAY,CAAC;AACtC,eAAO,MAAM,sBAAsB,QAA0B,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAE3D,eAAO,MAAM,+BAA+B,QAAuD,CAAC;AACpG,eAAO,MAAM,2BAA2B,kBAAkB,CAAC;AAC3D,eAAO,MAAM,yBAAyB,gBAAgB,CAAC;AACvD,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,eAAO,MAAM,6BAA6B,QAA0D,CAAC;AAErG,eAAO,MAAM,WAAW,cAAc,CAAC;AACvC,eAAO,MAAM,eAAe,aAAa,CAAC;AAC1C,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAC9C,eAAO,MAAM,yBAAyB,mDAAmD,CAAC;AAC1F,eAAO,MAAM,qBAAqB,sDAAsD,CAAC;AACzF,eAAO,MAAM,0BAA0B,yDAAyD,CAAC;AACjG,eAAO,MAAM,cAAc,QAAsC,CAAC;AAClE,eAAO,MAAM,4BAA4B,QAAc,CAAC;AACxD,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,YAAY,MAAM,CAAC;AAChC,eAAO,MAAM,YAAY,QAAY,CAAC;AACtC,eAAO,MAAM,sBAAsB,QAA0B,CAAC"}
@@ -1,5 +1,5 @@
1
1
  Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.MAX_IDB_STORAGE_LENGTH = exports.MAX_INTERVAL = exports.MIN_INTERVAL = exports.MAX_EVENT_LIST_SIZE_IN_BYTES = exports.STORAGE_PREFIX = exports.SESSION_REPLAY_STAGING_URL = exports.SESSION_REPLAY_EU_URL = exports.SESSION_REPLAY_SERVER_URL = exports.UNMASK_TEXT_CLASS = exports.MASK_TEXT_CLASS = exports.BLOCK_CLASS = exports.SESSION_REPLAY_DEBUG_PROPERTY = exports.DEFAULT_SERVER_ZONE = exports.DEFAULT_SAMPLE_RATE = exports.DEFAULT_SESSION_END_EVENT = exports.DEFAULT_SESSION_START_EVENT = exports.DEFAULT_SESSION_REPLAY_PROPERTY = exports.DEFAULT_EVENT_PROPERTY_PREFIX = void 0;
2
+ exports.MAX_IDB_STORAGE_LENGTH = exports.MAX_INTERVAL = exports.MIN_INTERVAL = exports.INTERACTION_MAX_INTERVAL = exports.INTERACTION_MIN_INTERVAL = exports.MAX_EVENT_LIST_SIZE_IN_BYTES = exports.STORAGE_PREFIX = exports.SESSION_REPLAY_STAGING_URL = exports.SESSION_REPLAY_EU_URL = exports.SESSION_REPLAY_SERVER_URL = exports.UNMASK_TEXT_CLASS = exports.MASK_TEXT_CLASS = exports.BLOCK_CLASS = exports.SESSION_REPLAY_DEBUG_PROPERTY = exports.DEFAULT_SERVER_ZONE = exports.DEFAULT_SAMPLE_RATE = exports.DEFAULT_SESSION_END_EVENT = exports.DEFAULT_SESSION_START_EVENT = exports.DEFAULT_SESSION_REPLAY_PROPERTY = exports.DEFAULT_EVENT_PROPERTY_PREFIX = void 0;
3
3
  var analytics_core_1 = require("@amplitude/analytics-core");
4
4
  var analytics_types_1 = require("@amplitude/analytics-types");
5
5
  exports.DEFAULT_EVENT_PROPERTY_PREFIX = '[Amplitude]';
@@ -17,6 +17,8 @@ exports.SESSION_REPLAY_EU_URL = 'https://api-sr.eu.amplitude.com/sessions/v2/tra
17
17
  exports.SESSION_REPLAY_STAGING_URL = 'https://api-sr.stag2.amplitude.com/sessions/v2/track';
18
18
  exports.STORAGE_PREFIX = "".concat(analytics_core_1.AMPLITUDE_PREFIX, "_replay_unsent");
19
19
  exports.MAX_EVENT_LIST_SIZE_IN_BYTES = 1 * 1000000; // 1 MB
20
+ exports.INTERACTION_MIN_INTERVAL = 30000; // 30 seconds
21
+ exports.INTERACTION_MAX_INTERVAL = 60000; // 1 minute
20
22
  exports.MIN_INTERVAL = 500; // 500 ms
21
23
  exports.MAX_INTERVAL = 10 * 1000; // 10 seconds
22
24
  exports.MAX_IDB_STORAGE_LENGTH = 1000 * 60 * 60 * 24 * 3; // 3 days
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;AAAA,4DAA6D;AAC7D,8DAAwD;AAE3C,QAAA,6BAA6B,GAAG,aAAa,CAAC;AAE9C,QAAA,+BAA+B,GAAG,UAAG,qCAA6B,uBAAoB,CAAC;AACvF,QAAA,2BAA2B,GAAG,eAAe,CAAC;AAC9C,QAAA,yBAAyB,GAAG,aAAa,CAAC;AAC1C,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,mBAAmB,GAAG,4BAAU,CAAC,EAAE,CAAC;AAEpC,QAAA,6BAA6B,GAAG,UAAG,qCAA6B,0BAAuB,CAAC;AAExF,QAAA,WAAW,GAAG,WAAW,CAAC;AAC1B,QAAA,eAAe,GAAG,UAAU,CAAC;AAC7B,QAAA,iBAAiB,GAAG,YAAY,CAAC;AACjC,QAAA,yBAAyB,GAAG,gDAAgD,CAAC;AAC7E,QAAA,qBAAqB,GAAG,mDAAmD,CAAC;AAC5E,QAAA,0BAA0B,GAAG,sDAAsD,CAAC;AACpF,QAAA,cAAc,GAAG,UAAG,iCAAgB,mBAAgB,CAAC;AACrD,QAAA,4BAA4B,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO;AACnD,QAAA,YAAY,GAAG,GAAG,CAAC,CAAC,SAAS;AAC7B,QAAA,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AACvC,QAAA,sBAAsB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS","sourcesContent":["import { AMPLITUDE_PREFIX } from '@amplitude/analytics-core';\nimport { ServerZone } from '@amplitude/analytics-types';\n\nexport const DEFAULT_EVENT_PROPERTY_PREFIX = '[Amplitude]';\n\nexport const DEFAULT_SESSION_REPLAY_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay ID`;\nexport const DEFAULT_SESSION_START_EVENT = 'session_start';\nexport const DEFAULT_SESSION_END_EVENT = 'session_end';\nexport const DEFAULT_SAMPLE_RATE = 0;\nexport const DEFAULT_SERVER_ZONE = ServerZone.US;\n\nexport const SESSION_REPLAY_DEBUG_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay Debug`;\n\nexport const BLOCK_CLASS = 'amp-block';\nexport const MASK_TEXT_CLASS = 'amp-mask';\nexport const UNMASK_TEXT_CLASS = 'amp-unmask';\nexport const SESSION_REPLAY_SERVER_URL = 'https://api-sr.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_EU_URL = 'https://api-sr.eu.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_STAGING_URL = 'https://api-sr.stag2.amplitude.com/sessions/v2/track';\nexport const STORAGE_PREFIX = `${AMPLITUDE_PREFIX}_replay_unsent`;\nexport const MAX_EVENT_LIST_SIZE_IN_BYTES = 1 * 1000000; // 1 MB\nexport const MIN_INTERVAL = 500; // 500 ms\nexport const MAX_INTERVAL = 10 * 1000; // 10 seconds\nexport const MAX_IDB_STORAGE_LENGTH = 1000 * 60 * 60 * 24 * 3; // 3 days\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":";;AAAA,4DAA6D;AAC7D,8DAAwD;AAE3C,QAAA,6BAA6B,GAAG,aAAa,CAAC;AAE9C,QAAA,+BAA+B,GAAG,UAAG,qCAA6B,uBAAoB,CAAC;AACvF,QAAA,2BAA2B,GAAG,eAAe,CAAC;AAC9C,QAAA,yBAAyB,GAAG,aAAa,CAAC;AAC1C,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,mBAAmB,GAAG,4BAAU,CAAC,EAAE,CAAC;AAEpC,QAAA,6BAA6B,GAAG,UAAG,qCAA6B,0BAAuB,CAAC;AAExF,QAAA,WAAW,GAAG,WAAW,CAAC;AAC1B,QAAA,eAAe,GAAG,UAAU,CAAC;AAC7B,QAAA,iBAAiB,GAAG,YAAY,CAAC;AACjC,QAAA,yBAAyB,GAAG,gDAAgD,CAAC;AAC7E,QAAA,qBAAqB,GAAG,mDAAmD,CAAC;AAC5E,QAAA,0BAA0B,GAAG,sDAAsD,CAAC;AACpF,QAAA,cAAc,GAAG,UAAG,iCAAgB,mBAAgB,CAAC;AACrD,QAAA,4BAA4B,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,OAAO;AACnD,QAAA,wBAAwB,GAAG,KAAM,CAAC,CAAC,aAAa;AAChD,QAAA,wBAAwB,GAAG,KAAM,CAAC,CAAC,WAAW;AAC9C,QAAA,YAAY,GAAG,GAAG,CAAC,CAAC,SAAS;AAC7B,QAAA,YAAY,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;AACvC,QAAA,sBAAsB,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,SAAS","sourcesContent":["import { AMPLITUDE_PREFIX } from '@amplitude/analytics-core';\nimport { ServerZone } from '@amplitude/analytics-types';\n\nexport const DEFAULT_EVENT_PROPERTY_PREFIX = '[Amplitude]';\n\nexport const DEFAULT_SESSION_REPLAY_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay ID`;\nexport const DEFAULT_SESSION_START_EVENT = 'session_start';\nexport const DEFAULT_SESSION_END_EVENT = 'session_end';\nexport const DEFAULT_SAMPLE_RATE = 0;\nexport const DEFAULT_SERVER_ZONE = ServerZone.US;\n\nexport const SESSION_REPLAY_DEBUG_PROPERTY = `${DEFAULT_EVENT_PROPERTY_PREFIX} Session Replay Debug`;\n\nexport const BLOCK_CLASS = 'amp-block';\nexport const MASK_TEXT_CLASS = 'amp-mask';\nexport const UNMASK_TEXT_CLASS = 'amp-unmask';\nexport const SESSION_REPLAY_SERVER_URL = 'https://api-sr.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_EU_URL = 'https://api-sr.eu.amplitude.com/sessions/v2/track';\nexport const SESSION_REPLAY_STAGING_URL = 'https://api-sr.stag2.amplitude.com/sessions/v2/track';\nexport const STORAGE_PREFIX = `${AMPLITUDE_PREFIX}_replay_unsent`;\nexport const MAX_EVENT_LIST_SIZE_IN_BYTES = 1 * 1000000; // 1 MB\nexport const INTERACTION_MIN_INTERVAL = 30_000; // 30 seconds\nexport const INTERACTION_MAX_INTERVAL = 60_000; // 1 minute\nexport const MIN_INTERVAL = 500; // 500 ms\nexport const MAX_INTERVAL = 10 * 1000; // 10 seconds\nexport const MAX_IDB_STORAGE_LENGTH = 1000 * 60 * 60 * 24 * 3; // 3 days\n"]}
@@ -1,6 +1,6 @@
1
1
  import { Logger as ILogger } from '@amplitude/analytics-types';
2
2
  import { DBSchema, IDBPDatabase } from 'idb';
3
- import { SessionReplayEventsIDBStore as AmplitudeSessionReplayEventsIDBStore, Events, SendingSequencesIDBInput } from '../typings/session-replay';
3
+ import { SessionReplayEventsIDBStore as AmplitudeSessionReplayEventsIDBStore, EventType, Events, SendingSequencesIDBInput } from '../typings/session-replay';
4
4
  export declare const currentSequenceKey = "sessionCurrentSequence";
5
5
  export declare const sequencesToSendKey = "sequencesToSend";
6
6
  export declare const remoteConfigKey = "remoteConfig";
@@ -34,11 +34,15 @@ export declare class SessionReplayEventsIDBStore implements AmplitudeSessionRepl
34
34
  maxPersistedEventsSize: number;
35
35
  interval: number;
36
36
  timeAtLastSplit: number | null;
37
- constructor({ loggerProvider, apiKey }: {
37
+ private readonly minInterval;
38
+ private readonly maxInterval;
39
+ constructor({ loggerProvider, apiKey, minInterval, maxInterval, }: {
38
40
  loggerProvider: ILogger;
39
41
  apiKey: string;
42
+ minInterval?: number;
43
+ maxInterval?: number;
40
44
  });
41
- initialize(sessionId?: number): Promise<void>;
45
+ initialize(type: EventType, sessionId?: number): Promise<void>;
42
46
  /**
43
47
  * Determines whether to send the events list to the backend and start a new
44
48
  * empty events list, based on the size of the list as well as the last time sent
@@ -61,9 +65,12 @@ export declare class SessionReplayEventsIDBStore implements AmplitudeSessionRepl
61
65
  cleanUpSessionEventsStore: (sequenceId: number) => Promise<void>;
62
66
  transitionFromKeyValStore: (sessionId?: number) => Promise<void>;
63
67
  }
64
- export declare const createEventsIDBStore: ({ loggerProvider, apiKey, sessionId, }: {
68
+ export declare const createEventsIDBStore: ({ loggerProvider, apiKey, sessionId, type, minInterval, maxInterval, }: {
65
69
  loggerProvider: ILogger;
66
70
  apiKey: string;
71
+ type: EventType;
72
+ minInterval?: number | undefined;
73
+ maxInterval?: number | undefined;
67
74
  sessionId?: number | undefined;
68
75
  }) => Promise<SessionReplayEventsIDBStore>;
69
76
  //# sourceMappingURL=events-idb-store.d.ts.map
@@ -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,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"}
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,SAAS,EACT,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,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,EACV,cAAc,EACd,MAAM,EACN,WAAW,EACX,WAAW,GACZ,EAAE;QACD,cAAc,EAAE,OAAO,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;IAQK,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,MAAM;IAQpD;;;;;OAKG;IACH,qBAAqB,oCAAqC,MAAM,KAAG,OAAO,CAiBxE;IAEF,kBAAkB,kEAWhB;IAEF,oBAAoB,cAAqB,MAAM;;;;mBA0B7C;IAEF,yBAAyB,cAAqB,MAAM,SAAS,MAAM;;;;mBA8CjE;IAEF,kBAAkB,cAAqB,MAAM,iDAW3C;IAEF,yBAAyB,eAAsB,MAAM,mBAMnD;IAEF,yBAAyB,eAAsB,MAAM,mBA6EnD;CACH;AAED,eAAO,MAAM,oBAAoB;oBAQf,OAAO;YACf,MAAM;UACR,SAAS;;;;0CAQhB,CAAC"}
@@ -90,11 +90,10 @@ var createStore = function (dbName) { return tslib_1.__awaiter(_this, void 0, vo
90
90
  exports.createStore = createStore;
91
91
  var SessionReplayEventsIDBStore = /** @class */ (function () {
92
92
  function SessionReplayEventsIDBStore(_a) {
93
- var loggerProvider = _a.loggerProvider, apiKey = _a.apiKey;
93
+ var loggerProvider = _a.loggerProvider, apiKey = _a.apiKey, minInterval = _a.minInterval, maxInterval = _a.maxInterval;
94
94
  var _this = this;
95
95
  this.storageKey = '';
96
96
  this.maxPersistedEventsSize = constants_1.MAX_EVENT_LIST_SIZE_IN_BYTES;
97
- this.interval = constants_1.MIN_INTERVAL;
98
97
  this.timeAtLastSplit = null;
99
98
  /**
100
99
  * Determines whether to send the events list to the backend and start a new
@@ -108,8 +107,11 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
108
107
  if (sizeOfEventsList + sizeOfNextEvent >= _this.maxPersistedEventsSize) {
109
108
  return true;
110
109
  }
111
- if (_this.timeAtLastSplit !== null && Date.now() - _this.timeAtLastSplit > _this.interval && events.length) {
112
- _this.interval = Math.min(constants_1.MAX_INTERVAL, _this.interval + constants_1.MIN_INTERVAL);
110
+ if (_this.timeAtLastSplit !== null &&
111
+ _this.interval &&
112
+ Date.now() - _this.timeAtLastSplit > _this.interval &&
113
+ events.length) {
114
+ _this.interval = Math.min(_this.maxInterval, _this.interval + _this.minInterval);
113
115
  _this.timeAtLastSplit = Date.now();
114
116
  return true;
115
117
  }
@@ -173,43 +175,48 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
173
175
  return tslib_1.__generator(this, function (_b) {
174
176
  switch (_b.label) {
175
177
  case 0:
176
- _b.trys.push([0, 10, , 11]);
178
+ if (this.interval === 0) {
179
+ this.interval = this.minInterval;
180
+ }
181
+ _b.label = 1;
182
+ case 1:
183
+ _b.trys.push([1, 11, , 12]);
177
184
  tx = (_a = this.db) === null || _a === void 0 ? void 0 : _a.transaction(exports.currentSequenceKey, 'readwrite');
178
185
  if (!tx) {
179
186
  return [2 /*return*/];
180
187
  }
181
188
  return [4 /*yield*/, tx.store.get(sessionId)];
182
- case 1:
189
+ case 2:
183
190
  sequenceEvents = _b.sent();
184
- if (!!sequenceEvents) return [3 /*break*/, 3];
191
+ if (!!sequenceEvents) return [3 /*break*/, 4];
185
192
  return [4 /*yield*/, tx.store.put({ sessionId: sessionId, events: [event] })];
186
- case 2:
193
+ case 3:
187
194
  _b.sent();
188
195
  return [2 /*return*/];
189
- case 3:
196
+ case 4:
190
197
  eventsToSend = void 0;
191
- if (!this.shouldSplitEventsList(sequenceEvents.events, event)) return [3 /*break*/, 5];
198
+ if (!this.shouldSplitEventsList(sequenceEvents.events, event)) return [3 /*break*/, 6];
192
199
  eventsToSend = sequenceEvents.events;
193
200
  // set store to empty array
194
201
  return [4 /*yield*/, tx.store.put({ sessionId: sessionId, events: [event] })];
195
- case 4:
202
+ case 5:
196
203
  // set store to empty array
197
204
  _b.sent();
198
- return [3 /*break*/, 7];
199
- case 5:
205
+ return [3 /*break*/, 8];
206
+ case 6:
200
207
  updatedEvents = sequenceEvents.events.concat(event);
201
208
  return [4 /*yield*/, tx.store.put({ sessionId: sessionId, events: updatedEvents })];
202
- case 6:
209
+ case 7:
203
210
  _b.sent();
204
- _b.label = 7;
205
- case 7: return [4 /*yield*/, tx.done];
206
- case 8:
211
+ _b.label = 8;
212
+ case 8: return [4 /*yield*/, tx.done];
213
+ case 9:
207
214
  _b.sent();
208
215
  if (!eventsToSend) {
209
216
  return [2 /*return*/, undefined];
210
217
  }
211
218
  return [4 /*yield*/, this.storeSendingEvents(sessionId, eventsToSend)];
212
- case 9:
219
+ case 10:
213
220
  sequenceId = _b.sent();
214
221
  if (!sequenceId) {
215
222
  return [2 /*return*/, undefined];
@@ -219,11 +226,11 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
219
226
  sessionId: sessionId,
220
227
  sequenceId: sequenceId,
221
228
  }];
222
- case 10:
229
+ case 11:
223
230
  e_3 = _b.sent();
224
231
  this.loggerProvider.warn("".concat(messages_1.STORAGE_FAILURE, ": ").concat(e_3));
225
- return [3 /*break*/, 11];
226
- case 11: return [2 /*return*/, undefined];
232
+ return [3 /*break*/, 12];
233
+ case 12: return [2 /*return*/, undefined];
227
234
  }
228
235
  });
229
236
  }); };
@@ -375,14 +382,18 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
375
382
  }); };
376
383
  this.loggerProvider = loggerProvider;
377
384
  this.apiKey = apiKey;
385
+ this.maxInterval = maxInterval !== null && maxInterval !== void 0 ? maxInterval : constants_1.MAX_INTERVAL;
386
+ this.minInterval = minInterval !== null && minInterval !== void 0 ? minInterval : constants_1.MIN_INTERVAL;
387
+ this.interval = 0;
378
388
  }
379
- SessionReplayEventsIDBStore.prototype.initialize = function (sessionId) {
389
+ SessionReplayEventsIDBStore.prototype.initialize = function (type, sessionId) {
380
390
  return tslib_1.__awaiter(this, void 0, void 0, function () {
381
- var dbName, _a;
391
+ var dbSuffix, dbName, _a;
382
392
  return tslib_1.__generator(this, function (_b) {
383
393
  switch (_b.label) {
384
394
  case 0:
385
- dbName = "".concat(this.apiKey.substring(0, 10), "_amp_session_replay_events");
395
+ dbSuffix = type === 'replay' ? '' : "_".concat(type);
396
+ dbName = "".concat(this.apiKey.substring(0, 10), "_amp_session_replay_events").concat(dbSuffix);
386
397
  _a = this;
387
398
  return [4 /*yield*/, (0, exports.createStore)(dbName)];
388
399
  case 1:
@@ -400,14 +411,14 @@ var SessionReplayEventsIDBStore = /** @class */ (function () {
400
411
  }());
401
412
  exports.SessionReplayEventsIDBStore = SessionReplayEventsIDBStore;
402
413
  var createEventsIDBStore = function (_a) {
403
- var loggerProvider = _a.loggerProvider, apiKey = _a.apiKey, sessionId = _a.sessionId;
414
+ var loggerProvider = _a.loggerProvider, apiKey = _a.apiKey, sessionId = _a.sessionId, type = _a.type, minInterval = _a.minInterval, maxInterval = _a.maxInterval;
404
415
  return tslib_1.__awaiter(_this, void 0, void 0, function () {
405
416
  var eventsIDBStore;
406
417
  return tslib_1.__generator(this, function (_b) {
407
418
  switch (_b.label) {
408
419
  case 0:
409
- eventsIDBStore = new SessionReplayEventsIDBStore({ loggerProvider: loggerProvider, apiKey: apiKey });
410
- return [4 /*yield*/, eventsIDBStore.initialize(sessionId)];
420
+ eventsIDBStore = new SessionReplayEventsIDBStore({ loggerProvider: loggerProvider, apiKey: apiKey, minInterval: minInterval, maxInterval: maxInterval });
421
+ return [4 /*yield*/, eventsIDBStore.initialize(type, sessionId)];
411
422
  case 1:
412
423
  _b.sent();
413
424
  return [2 /*return*/, eventsIDBStore];
@@ -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, 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
+ {"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 EventType,\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: number;\n timeAtLastSplit: number | null = null;\n\n private readonly minInterval: number;\n private readonly maxInterval: number;\n\n constructor({\n loggerProvider,\n apiKey,\n minInterval,\n maxInterval,\n }: {\n loggerProvider: ILogger;\n apiKey: string;\n minInterval?: number;\n maxInterval?: number;\n }) {\n this.loggerProvider = loggerProvider;\n this.apiKey = apiKey;\n this.maxInterval = maxInterval ?? MAX_INTERVAL;\n this.minInterval = minInterval ?? MIN_INTERVAL;\n this.interval = 0;\n }\n\n async initialize(type: EventType, sessionId?: number) {\n const dbSuffix = type === 'replay' ? '' : `_${type}`;\n const dbName = `${this.apiKey.substring(0, 10)}_amp_session_replay_events${dbSuffix}`;\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 (\n this.timeAtLastSplit !== null &&\n this.interval &&\n Date.now() - this.timeAtLastSplit > this.interval &&\n events.length\n ) {\n this.interval = Math.min(this.maxInterval, this.interval + this.minInterval);\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 if (this.interval === 0) {\n this.interval = this.minInterval;\n }\n\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 type,\n minInterval,\n maxInterval,\n}: {\n loggerProvider: ILogger;\n apiKey: string;\n type: EventType;\n minInterval?: number;\n maxInterval?: number;\n sessionId?: number;\n}) => {\n const eventsIDBStore = new SessionReplayEventsIDBStore({ loggerProvider, apiKey, minInterval, maxInterval });\n await eventsIDBStore.initialize(type, sessionId);\n return eventsIDBStore;\n};\n"]}
@@ -1,7 +1,12 @@
1
- import { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager } from '../typings/session-replay';
1
+ import { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager, EventType } from '../typings/session-replay';
2
2
  import { SessionReplayJoinedConfig } from '../config/types';
3
- export declare const createEventsManager: ({ config, sessionId, }: {
3
+ import { PayloadBatcher } from '../track-destination';
4
+ export declare const createEventsManager: <Type extends EventType>({ config, sessionId, minInterval, maxInterval, type, payloadBatcher, }: {
4
5
  config: SessionReplayJoinedConfig;
6
+ type: Type;
7
+ minInterval?: number | undefined;
8
+ maxInterval?: number | undefined;
5
9
  sessionId?: number | undefined;
6
- }) => Promise<AmplitudeSessionReplayEventsManager>;
10
+ payloadBatcher?: PayloadBatcher | undefined;
11
+ }) => Promise<AmplitudeSessionReplayEventsManager<Type, string>>;
7
12
  //# sourceMappingURL=events-manager.d.ts.map