@amplitude/session-replay-browser 1.2.7 → 1.3.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 (108) hide show
  1. package/lib/cjs/config/joined-config.d.ts +10 -0
  2. package/lib/cjs/config/joined-config.d.ts.map +1 -0
  3. package/lib/cjs/config/joined-config.js +62 -0
  4. package/lib/cjs/config/joined-config.js.map +1 -0
  5. package/lib/cjs/{config.d.ts → config/local-config.d.ts} +4 -3
  6. package/lib/cjs/config/local-config.d.ts.map +1 -0
  7. package/lib/cjs/{config.js → config/local-config.js} +8 -8
  8. package/lib/cjs/config/local-config.js.map +1 -0
  9. package/lib/cjs/config/remote-config.d.ts +28 -0
  10. package/lib/cjs/config/remote-config.d.ts.map +1 -0
  11. package/lib/cjs/config/remote-config.js +145 -0
  12. package/lib/cjs/config/remote-config.js.map +1 -0
  13. package/lib/cjs/config/types.d.ts +32 -0
  14. package/lib/cjs/config/types.d.ts.map +1 -0
  15. package/lib/cjs/config/types.js +2 -0
  16. package/lib/cjs/config/types.js.map +1 -0
  17. package/lib/cjs/events-manager.d.ts +7 -5
  18. package/lib/cjs/events-manager.d.ts.map +1 -1
  19. package/lib/cjs/events-manager.js +2 -6
  20. package/lib/cjs/events-manager.js.map +1 -1
  21. package/lib/cjs/identifiers.d.ts +5 -3
  22. package/lib/cjs/identifiers.d.ts.map +1 -1
  23. package/lib/cjs/identifiers.js +6 -8
  24. package/lib/cjs/identifiers.js.map +1 -1
  25. package/lib/cjs/index.d.ts +1 -1
  26. package/lib/cjs/index.d.ts.map +1 -1
  27. package/lib/cjs/session-idb-store.d.ts +4 -1
  28. package/lib/cjs/session-idb-store.d.ts.map +1 -1
  29. package/lib/cjs/session-idb-store.js +45 -3
  30. package/lib/cjs/session-idb-store.js.map +1 -1
  31. package/lib/cjs/session-replay-factory.js +2 -2
  32. package/lib/cjs/session-replay-factory.js.map +1 -1
  33. package/lib/cjs/session-replay.d.ts +8 -3
  34. package/lib/cjs/session-replay.d.ts.map +1 -1
  35. package/lib/cjs/session-replay.js +70 -47
  36. package/lib/cjs/session-replay.js.map +1 -1
  37. package/lib/cjs/typings/session-replay.d.ts +11 -15
  38. package/lib/cjs/typings/session-replay.d.ts.map +1 -1
  39. package/lib/cjs/typings/session-replay.js.map +1 -1
  40. package/lib/esm/config/joined-config.d.ts +10 -0
  41. package/lib/esm/config/joined-config.d.ts.map +1 -0
  42. package/lib/esm/config/joined-config.js +60 -0
  43. package/lib/esm/config/joined-config.js.map +1 -0
  44. package/lib/esm/{config.d.ts → config/local-config.d.ts} +4 -3
  45. package/lib/esm/config/local-config.d.ts.map +1 -0
  46. package/lib/esm/{config.js → config/local-config.js} +7 -7
  47. package/lib/esm/config/local-config.js.map +1 -0
  48. package/lib/esm/config/remote-config.d.ts +28 -0
  49. package/lib/esm/config/remote-config.d.ts.map +1 -0
  50. package/lib/esm/config/remote-config.js +143 -0
  51. package/lib/esm/config/remote-config.js.map +1 -0
  52. package/lib/esm/config/types.d.ts +32 -0
  53. package/lib/esm/config/types.d.ts.map +1 -0
  54. package/lib/esm/config/types.js +2 -0
  55. package/lib/esm/config/types.js.map +1 -0
  56. package/lib/esm/events-manager.d.ts +7 -5
  57. package/lib/esm/events-manager.d.ts.map +1 -1
  58. package/lib/esm/events-manager.js +2 -6
  59. package/lib/esm/events-manager.js.map +1 -1
  60. package/lib/esm/identifiers.d.ts +5 -3
  61. package/lib/esm/identifiers.d.ts.map +1 -1
  62. package/lib/esm/identifiers.js +6 -8
  63. package/lib/esm/identifiers.js.map +1 -1
  64. package/lib/esm/index.d.ts +1 -1
  65. package/lib/esm/index.d.ts.map +1 -1
  66. package/lib/esm/session-idb-store.d.ts +4 -1
  67. package/lib/esm/session-idb-store.d.ts.map +1 -1
  68. package/lib/esm/session-idb-store.js +45 -3
  69. package/lib/esm/session-idb-store.js.map +1 -1
  70. package/lib/esm/session-replay-factory.js +1 -1
  71. package/lib/esm/session-replay-factory.js.map +1 -1
  72. package/lib/esm/session-replay.d.ts +8 -3
  73. package/lib/esm/session-replay.d.ts.map +1 -1
  74. package/lib/esm/session-replay.js +71 -48
  75. package/lib/esm/session-replay.js.map +1 -1
  76. package/lib/esm/typings/session-replay.d.ts +11 -15
  77. package/lib/esm/typings/session-replay.d.ts.map +1 -1
  78. package/lib/esm/typings/session-replay.js.map +1 -1
  79. package/lib/scripts/amplitude-min.js +1 -1
  80. package/lib/scripts/amplitude-min.js.gz +0 -0
  81. package/lib/scripts/amplitude-min.umd.js +1 -1
  82. package/lib/scripts/amplitude-min.umd.js.gz +0 -0
  83. package/lib/scripts/config/joined-config.d.ts +10 -0
  84. package/lib/scripts/config/joined-config.d.ts.map +1 -0
  85. package/lib/scripts/{config.d.ts → config/local-config.d.ts} +4 -3
  86. package/lib/scripts/config/local-config.d.ts.map +1 -0
  87. package/lib/scripts/config/remote-config.d.ts +28 -0
  88. package/lib/scripts/config/remote-config.d.ts.map +1 -0
  89. package/lib/scripts/config/types.d.ts +32 -0
  90. package/lib/scripts/config/types.d.ts.map +1 -0
  91. package/lib/scripts/events-manager.d.ts +7 -5
  92. package/lib/scripts/events-manager.d.ts.map +1 -1
  93. package/lib/scripts/identifiers.d.ts +5 -3
  94. package/lib/scripts/identifiers.d.ts.map +1 -1
  95. package/lib/scripts/index.d.ts +1 -1
  96. package/lib/scripts/index.d.ts.map +1 -1
  97. package/lib/scripts/session-idb-store.d.ts +4 -1
  98. package/lib/scripts/session-idb-store.d.ts.map +1 -1
  99. package/lib/scripts/session-replay.d.ts +8 -3
  100. package/lib/scripts/session-replay.d.ts.map +1 -1
  101. package/lib/scripts/typings/session-replay.d.ts +11 -15
  102. package/lib/scripts/typings/session-replay.d.ts.map +1 -1
  103. package/package.json +2 -2
  104. package/lib/cjs/config.d.ts.map +0 -1
  105. package/lib/cjs/config.js.map +0 -1
  106. package/lib/esm/config.d.ts.map +0 -1
  107. package/lib/esm/config.js.map +0 -1
  108. package/lib/scripts/config.d.ts.map +0 -1
@@ -0,0 +1,10 @@
1
+ import { SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore, SessionReplayOptions } from '../typings/session-replay';
2
+ import { SessionReplayLocalConfig as ISessionReplayLocalConfig, SessionReplayRemoteConfigFetch as ISessionReplayRemoteConfigFetch, SessionReplayJoinedConfig } from './types';
3
+ export declare class SessionReplayJoinedConfigGenerator {
4
+ localConfig: ISessionReplayLocalConfig;
5
+ remoteConfigFetch: ISessionReplayRemoteConfigFetch;
6
+ sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;
7
+ constructor(apiKey: string, options: SessionReplayOptions, sessionIDBStore: AmplitudeSessionReplaySessionIDBStore);
8
+ generateJoinedConfig(sessionId?: number): Promise<SessionReplayJoinedConfig>;
9
+ }
10
+ //# sourceMappingURL=joined-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joined-config.d.ts","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,4BAA4B,IAAI,qCAAqC,EACrE,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,wBAAwB,IAAI,yBAAyB,EACrD,8BAA8B,IAAI,+BAA+B,EACjE,yBAAyB,EAC1B,MAAM,SAAS,CAAC;AAEjB,qBAAa,kCAAkC;IAC7C,WAAW,EAAE,yBAAyB,CAAC;IACvC,iBAAiB,EAAE,+BAA+B,CAAC;IACnD,eAAe,EAAE,qCAAqC,CAAC;gBAE3C,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,eAAe,EAAE,qCAAqC;IAS3G,oBAAoB,CAAC,SAAS,CAAC,EAAE,MAAM;CA8B9C"}
@@ -0,0 +1,62 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ exports.SessionReplayJoinedConfigGenerator = void 0;
3
+ var tslib_1 = require("tslib");
4
+ var local_config_1 = require("./local-config");
5
+ var remote_config_1 = require("./remote-config");
6
+ var SessionReplayJoinedConfigGenerator = /** @class */ (function () {
7
+ function SessionReplayJoinedConfigGenerator(apiKey, options, sessionIDBStore) {
8
+ this.sessionIDBStore = sessionIDBStore;
9
+ this.localConfig = new local_config_1.SessionReplayLocalConfig(apiKey, options);
10
+ this.remoteConfigFetch = new remote_config_1.SessionReplayRemoteConfigFetch({
11
+ localConfig: this.localConfig,
12
+ sessionIDBStore: this.sessionIDBStore,
13
+ });
14
+ }
15
+ SessionReplayJoinedConfigGenerator.prototype.generateJoinedConfig = function (sessionId) {
16
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
17
+ var config, samplingConfig, err_1, knownError;
18
+ return tslib_1.__generator(this, function (_a) {
19
+ switch (_a.label) {
20
+ case 0:
21
+ config = tslib_1.__assign({}, this.localConfig);
22
+ // Special case here as optOut is implemented via getter/setter
23
+ config.optOut = this.localConfig.optOut;
24
+ _a.label = 1;
25
+ case 1:
26
+ _a.trys.push([1, 3, , 4]);
27
+ return [4 /*yield*/, this.remoteConfigFetch.getSamplingConfig(sessionId)];
28
+ case 2:
29
+ samplingConfig = _a.sent();
30
+ if (samplingConfig && Object.keys(samplingConfig).length > 0) {
31
+ if (Object.prototype.hasOwnProperty.call(samplingConfig, 'capture_enabled')) {
32
+ config.captureEnabled = samplingConfig.capture_enabled;
33
+ }
34
+ else {
35
+ config.captureEnabled = false;
36
+ }
37
+ if (samplingConfig.sample_rate) {
38
+ config.sampleRate = samplingConfig.sample_rate;
39
+ }
40
+ }
41
+ else {
42
+ // If config API response was valid (ie 200), but no config returned, assume that
43
+ // customer has not yet set up config, and use sample rate from SDK options,
44
+ // allowing for immediate replay capture
45
+ config.captureEnabled = true;
46
+ }
47
+ return [3 /*break*/, 4];
48
+ case 3:
49
+ err_1 = _a.sent();
50
+ knownError = err_1;
51
+ this.localConfig.loggerProvider.warn(knownError.message);
52
+ config.captureEnabled = true;
53
+ return [3 /*break*/, 4];
54
+ case 4: return [2 /*return*/, config];
55
+ }
56
+ });
57
+ });
58
+ };
59
+ return SessionReplayJoinedConfigGenerator;
60
+ }());
61
+ exports.SessionReplayJoinedConfigGenerator = SessionReplayJoinedConfigGenerator;
62
+ //# sourceMappingURL=joined-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joined-config.js","sourceRoot":"","sources":["../../../src/config/joined-config.ts"],"names":[],"mappings":";;;AAIA,+CAA0D;AAC1D,iDAAiE;AAOjE;IAKE,4CAAY,MAAc,EAAE,OAA6B,EAAE,eAAsD;QAC/G,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,WAAW,GAAG,IAAI,uCAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjE,IAAI,CAAC,iBAAiB,GAAG,IAAI,8CAA8B,CAAC;YAC1D,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,eAAe,EAAE,IAAI,CAAC,eAAe;SACtC,CAAC,CAAC;IACL,CAAC;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;;;;wBAEf,qBAAM,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAA;;wBAA1E,cAAc,GAAG,SAAyD;wBAChF,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;yBAC9B;;;;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;;4BAG/B,sBAAO,MAAM,EAAC;;;;KACf;IACH,yCAAC;AAAD,CAAC,AA5CD,IA4CC;AA5CY,gFAAkC","sourcesContent":["import {\n SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore,\n SessionReplayOptions,\n} from '../typings/session-replay';\nimport { SessionReplayLocalConfig } from './local-config';\nimport { SessionReplayRemoteConfigFetch } from './remote-config';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n SessionReplayRemoteConfigFetch as ISessionReplayRemoteConfigFetch,\n SessionReplayJoinedConfig,\n} from './types';\n\nexport class SessionReplayJoinedConfigGenerator {\n localConfig: ISessionReplayLocalConfig;\n remoteConfigFetch: ISessionReplayRemoteConfigFetch;\n sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;\n\n constructor(apiKey: string, options: SessionReplayOptions, sessionIDBStore: AmplitudeSessionReplaySessionIDBStore) {\n this.sessionIDBStore = sessionIDBStore;\n this.localConfig = new SessionReplayLocalConfig(apiKey, options);\n this.remoteConfigFetch = new SessionReplayRemoteConfigFetch({\n localConfig: this.localConfig,\n sessionIDBStore: this.sessionIDBStore,\n });\n }\n\n async generateJoinedConfig(sessionId?: number) {\n const config: SessionReplayJoinedConfig = { ...this.localConfig };\n // Special case here as optOut is implemented via getter/setter\n config.optOut = this.localConfig.optOut;\n try {\n const samplingConfig = await this.remoteConfigFetch.getSamplingConfig(sessionId);\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 }\n } catch (err: unknown) {\n const knownError = err as Error;\n this.localConfig.loggerProvider.warn(knownError.message);\n config.captureEnabled = true;\n }\n\n return config;\n }\n}\n"]}
@@ -1,18 +1,19 @@
1
1
  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
- import { SessionReplayConfig as ISessionReplayConfig, SessionReplayOptions, SessionReplayPrivacyConfig } from './typings/session-replay';
4
+ import { SessionReplayOptions } from '../typings/session-replay';
5
+ import { SessionReplayLocalConfig as ISessionReplayLocalConfig, SessionReplayPrivacyConfig } from './types';
5
6
  export declare const getDefaultConfig: () => {
6
7
  flushMaxRetries: number;
7
8
  logLevel: LogLevel;
8
9
  loggerProvider: Logger;
9
10
  transportProvider: FetchTransport;
10
11
  };
11
- export declare class SessionReplayConfig extends Config implements ISessionReplayConfig {
12
+ export declare class SessionReplayLocalConfig extends Config implements ISessionReplayLocalConfig {
12
13
  apiKey: string;
13
14
  sampleRate: number;
14
15
  privacyConfig?: SessionReplayPrivacyConfig;
15
16
  debugMode?: boolean;
16
17
  constructor(apiKey: string, options: SessionReplayOptions);
17
18
  }
18
- //# sourceMappingURL=config.d.ts.map
19
+ //# sourceMappingURL=local-config.d.ts.map
@@ -0,0 +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,0BAA0B,EAAE,MAAM,SAAS,CAAC;AAE5G,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,0BAA0B,CAAC;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;gBAER,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;CAuB1D"}
@@ -1,10 +1,10 @@
1
1
  Object.defineProperty(exports, "__esModule", { value: true });
2
- exports.SessionReplayConfig = exports.getDefaultConfig = void 0;
2
+ exports.SessionReplayLocalConfig = exports.getDefaultConfig = void 0;
3
3
  var tslib_1 = require("tslib");
4
4
  var analytics_client_common_1 = require("@amplitude/analytics-client-common");
5
5
  var analytics_core_1 = require("@amplitude/analytics-core");
6
6
  var analytics_types_1 = require("@amplitude/analytics-types");
7
- var constants_1 = require("./constants");
7
+ var constants_1 = require("../constants");
8
8
  var getDefaultConfig = function () { return ({
9
9
  flushMaxRetries: 2,
10
10
  logLevel: analytics_types_1.LogLevel.Warn,
@@ -12,9 +12,9 @@ var getDefaultConfig = function () { return ({
12
12
  transportProvider: new analytics_client_common_1.FetchTransport(),
13
13
  }); };
14
14
  exports.getDefaultConfig = getDefaultConfig;
15
- var SessionReplayConfig = /** @class */ (function (_super) {
16
- tslib_1.__extends(SessionReplayConfig, _super);
17
- function SessionReplayConfig(apiKey, options) {
15
+ var SessionReplayLocalConfig = /** @class */ (function (_super) {
16
+ tslib_1.__extends(SessionReplayLocalConfig, _super);
17
+ function SessionReplayLocalConfig(apiKey, options) {
18
18
  var _this = this;
19
19
  var defaultConfig = (0, exports.getDefaultConfig)();
20
20
  _this = _super.call(this, tslib_1.__assign(tslib_1.__assign({ transportProvider: defaultConfig.transportProvider }, options), { apiKey: apiKey })) || this;
@@ -33,7 +33,7 @@ var SessionReplayConfig = /** @class */ (function (_super) {
33
33
  }
34
34
  return _this;
35
35
  }
36
- return SessionReplayConfig;
36
+ return SessionReplayLocalConfig;
37
37
  }(analytics_core_1.Config));
38
- exports.SessionReplayConfig = SessionReplayConfig;
39
- //# sourceMappingURL=config.js.map
38
+ exports.SessionReplayLocalConfig = SessionReplayLocalConfig;
39
+ //# sourceMappingURL=local-config.js.map
@@ -0,0 +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;IAMlD,kCAAY,MAAc,EAAE,OAA6B;QAAzD,iBAsBC;QArBC,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;QAE5D,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,AA7BD,CAA8C,uBAAM,GA6BnD;AA7BY,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, SessionReplayPrivacyConfig } 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?: SessionReplayPrivacyConfig;\n debugMode?: 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\n if (options.privacyConfig) {\n this.privacyConfig = options.privacyConfig;\n }\n if (options.debugMode) {\n this.debugMode = options.debugMode;\n }\n }\n}\n"]}
@@ -0,0 +1,28 @@
1
+ import { SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore } from '../typings/session-replay';
2
+ import { SessionReplayLocalConfig as ISessionReplayLocalConfig, SessionReplayRemoteConfig as ISessionReplayRemoteConfig, SessionReplayRemoteConfigFetch as ISessionReplayRemoteConfigFetch, SamplingConfig } from './types';
3
+ export declare const REMOTE_CONFIG_SERVER_URL = "https://sr-client-cfg.amplitude.com/config";
4
+ export declare const REMOTE_CONFIG_SERVER_URL_STAGING = "https://sr-client-cfg.stag2.amplitude.com/config";
5
+ export declare const REMOTE_CONFIG_SERVER_URL_EU = "https://sr-client-cfg.eu.amplitude.com/config";
6
+ export declare class SessionReplayRemoteConfigFetch implements ISessionReplayRemoteConfigFetch {
7
+ localConfig: ISessionReplayLocalConfig;
8
+ sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;
9
+ retryTimeout: number;
10
+ attempts: number;
11
+ lastFetchedSessionId: number | undefined;
12
+ sessionTargetingMatch: boolean;
13
+ constructor({ localConfig, sessionIDBStore, }: {
14
+ localConfig: ISessionReplayLocalConfig;
15
+ sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;
16
+ });
17
+ getRemoteConfig: (sessionId?: number) => Promise<ISessionReplayRemoteConfig | void>;
18
+ getSamplingConfig: (sessionId?: number) => Promise<SamplingConfig | void>;
19
+ getServerUrl(): "https://sr-client-cfg.amplitude.com/config" | "https://sr-client-cfg.stag2.amplitude.com/config" | "https://sr-client-cfg.eu.amplitude.com/config";
20
+ fetchRemoteConfig: (sessionId?: number) => Promise<ISessionReplayRemoteConfig | void>;
21
+ retryFetch: (sessionId?: number) => Promise<ISessionReplayRemoteConfig | void>;
22
+ parseAndStoreConfig: (res: Response, sessionId?: number) => Promise<ISessionReplayRemoteConfig>;
23
+ completeRequest({ err, success }: {
24
+ err?: string;
25
+ success?: string;
26
+ }): void;
27
+ }
28
+ //# sourceMappingURL=remote-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-config.d.ts","sourceRoot":"","sources":["../../../src/config/remote-config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,IAAI,qCAAqC,EAAE,MAAM,2BAA2B,CAAC;AAClH,OAAO,EACL,wBAAwB,IAAI,yBAAyB,EACrD,yBAAyB,IAAI,0BAA0B,EACvD,8BAA8B,IAAI,+BAA+B,EACjE,cAAc,EAEf,MAAM,SAAS,CAAC;AAKjB,eAAO,MAAM,wBAAwB,+CAA+C,CAAC;AACrF,eAAO,MAAM,gCAAgC,qDAAqD,CAAC;AACnG,eAAO,MAAM,2BAA2B,kDAAkD,CAAC;AAE3F,qBAAa,8BAA+B,YAAW,+BAA+B;IACpF,WAAW,EAAE,yBAAyB,CAAC;IACvC,eAAe,EAAE,qCAAqC,CAAC;IACvD,YAAY,SAAQ;IACpB,QAAQ,SAAK;IACb,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,qBAAqB,UAAS;gBAElB,EACV,WAAW,EACX,eAAe,GAChB,EAAE;QACD,WAAW,EAAE,yBAAyB,CAAC;QACvC,eAAe,EAAE,qCAAqC,CAAC;KACxD;IAKD,eAAe,eAAsB,MAAM,KAAG,QAAQ,0BAA0B,GAAG,IAAI,CAAC,CAQtF;IAEF,iBAAiB,eAAsB,MAAM,KAAG,QAAQ,cAAc,GAAG,IAAI,CAAC,CAG5E;IAEF,YAAY;IAYZ,iBAAiB,eAAsB,MAAM,KAAG,QAAQ,0BAA0B,GAAG,IAAI,CAAC,CAsCxF;IAEF,UAAU,eAAsB,MAAM,KAAG,QAAQ,0BAA0B,GAAG,IAAI,CAAC,CAGjF;IAEF,mBAAmB,QAAe,QAAQ,cAAc,MAAM,KAAG,QAAQ,0BAA0B,CAAC,CAMlG;IAEF,eAAe,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;CAOrE"}
@@ -0,0 +1,145 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ exports.SessionReplayRemoteConfigFetch = exports.REMOTE_CONFIG_SERVER_URL_EU = exports.REMOTE_CONFIG_SERVER_URL_STAGING = exports.REMOTE_CONFIG_SERVER_URL = void 0;
3
+ var tslib_1 = require("tslib");
4
+ var analytics_core_1 = require("@amplitude/analytics-core");
5
+ var analytics_types_1 = require("@amplitude/analytics-types");
6
+ var messages_1 = require("../messages");
7
+ var UNEXPECTED_NETWORK_ERROR_MESSAGE = 'Network error occurred, session replay remote config fetch failed';
8
+ var SUCCESS_REMOTE_CONFIG = 'Session replay remote config successfully fetched';
9
+ var MAX_RETRIES_EXCEEDED_MESSAGE = 'Session replay remote config fetch rejected due to exceeded retry count';
10
+ exports.REMOTE_CONFIG_SERVER_URL = 'https://sr-client-cfg.amplitude.com/config';
11
+ exports.REMOTE_CONFIG_SERVER_URL_STAGING = 'https://sr-client-cfg.stag2.amplitude.com/config';
12
+ exports.REMOTE_CONFIG_SERVER_URL_EU = 'https://sr-client-cfg.eu.amplitude.com/config';
13
+ var SessionReplayRemoteConfigFetch = /** @class */ (function () {
14
+ function SessionReplayRemoteConfigFetch(_a) {
15
+ var localConfig = _a.localConfig, sessionIDBStore = _a.sessionIDBStore;
16
+ var _this = this;
17
+ this.retryTimeout = 1000;
18
+ this.attempts = 0;
19
+ this.sessionTargetingMatch = false;
20
+ this.getRemoteConfig = function (sessionId) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
21
+ var idbRemoteConfig;
22
+ return tslib_1.__generator(this, function (_a) {
23
+ switch (_a.label) {
24
+ case 0: return [4 /*yield*/, this.sessionIDBStore.getRemoteConfig()];
25
+ case 1:
26
+ idbRemoteConfig = _a.sent();
27
+ if (idbRemoteConfig && idbRemoteConfig.lastFetchedSessionId === sessionId) {
28
+ return [2 /*return*/, idbRemoteConfig.config];
29
+ }
30
+ // Finally fetch via API
31
+ return [2 /*return*/, this.fetchRemoteConfig(sessionId)];
32
+ }
33
+ });
34
+ }); };
35
+ this.getSamplingConfig = function (sessionId) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
36
+ var remoteConfig;
37
+ return tslib_1.__generator(this, function (_a) {
38
+ switch (_a.label) {
39
+ case 0: return [4 /*yield*/, this.getRemoteConfig(sessionId)];
40
+ case 1:
41
+ remoteConfig = _a.sent();
42
+ return [2 /*return*/, remoteConfig === null || remoteConfig === void 0 ? void 0 : remoteConfig.sr_sampling_config];
43
+ }
44
+ });
45
+ }); };
46
+ this.fetchRemoteConfig = function (sessionId) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
47
+ var urlParams, options, serverUrl, res, parsedStatus, e_1;
48
+ return tslib_1.__generator(this, function (_a) {
49
+ switch (_a.label) {
50
+ case 0:
51
+ if (sessionId === this.lastFetchedSessionId && this.attempts >= this.localConfig.flushMaxRetries) {
52
+ return [2 /*return*/, this.completeRequest({ err: MAX_RETRIES_EXCEEDED_MESSAGE })];
53
+ }
54
+ else if (sessionId !== this.lastFetchedSessionId) {
55
+ this.lastFetchedSessionId = sessionId;
56
+ this.attempts = 0;
57
+ }
58
+ _a.label = 1;
59
+ case 1:
60
+ _a.trys.push([1, 3, , 4]);
61
+ urlParams = new URLSearchParams({
62
+ api_key: this.localConfig.apiKey,
63
+ config_keys: 'sessionReplay',
64
+ });
65
+ options = {
66
+ headers: {
67
+ 'Content-Type': 'application/json',
68
+ Accept: '*/*',
69
+ },
70
+ method: 'GET',
71
+ };
72
+ serverUrl = "".concat(this.getServerUrl(), "?").concat(urlParams.toString());
73
+ this.attempts += 1;
74
+ return [4 /*yield*/, fetch(serverUrl, options)];
75
+ case 2:
76
+ res = _a.sent();
77
+ if (res === null) {
78
+ return [2 /*return*/, this.completeRequest({ err: messages_1.UNEXPECTED_ERROR_MESSAGE })];
79
+ }
80
+ parsedStatus = new analytics_core_1.BaseTransport().buildStatus(res.status);
81
+ switch (parsedStatus) {
82
+ case analytics_types_1.Status.Success:
83
+ return [2 /*return*/, this.parseAndStoreConfig(res, sessionId)];
84
+ case analytics_types_1.Status.Failed:
85
+ return [2 /*return*/, this.retryFetch(sessionId)];
86
+ default:
87
+ return [2 /*return*/, this.completeRequest({ err: UNEXPECTED_NETWORK_ERROR_MESSAGE })];
88
+ }
89
+ return [3 /*break*/, 4];
90
+ case 3:
91
+ e_1 = _a.sent();
92
+ return [2 /*return*/, this.completeRequest({ err: e_1 })];
93
+ case 4: return [2 /*return*/];
94
+ }
95
+ });
96
+ }); };
97
+ this.retryFetch = function (sessionId) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
98
+ var _this = this;
99
+ return tslib_1.__generator(this, function (_a) {
100
+ switch (_a.label) {
101
+ case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, _this.attempts * _this.retryTimeout); })];
102
+ case 1:
103
+ _a.sent();
104
+ return [2 /*return*/, this.fetchRemoteConfig(sessionId)];
105
+ }
106
+ });
107
+ }); };
108
+ this.parseAndStoreConfig = function (res, sessionId) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
109
+ var remoteConfig;
110
+ return tslib_1.__generator(this, function (_a) {
111
+ switch (_a.label) {
112
+ case 0: return [4 /*yield*/, res.json()];
113
+ case 1:
114
+ remoteConfig = (_a.sent());
115
+ this.completeRequest({ success: SUCCESS_REMOTE_CONFIG });
116
+ void this.sessionIDBStore.storeRemoteConfig(remoteConfig.configs.sessionReplay, sessionId);
117
+ return [2 /*return*/, remoteConfig.configs.sessionReplay];
118
+ }
119
+ });
120
+ }); };
121
+ this.localConfig = localConfig;
122
+ this.sessionIDBStore = sessionIDBStore;
123
+ }
124
+ SessionReplayRemoteConfigFetch.prototype.getServerUrl = function () {
125
+ if (this.localConfig.serverZone === analytics_types_1.ServerZone.STAGING) {
126
+ return exports.REMOTE_CONFIG_SERVER_URL_STAGING;
127
+ }
128
+ if (this.localConfig.serverZone === analytics_types_1.ServerZone.EU) {
129
+ return exports.REMOTE_CONFIG_SERVER_URL_EU;
130
+ }
131
+ return exports.REMOTE_CONFIG_SERVER_URL;
132
+ };
133
+ SessionReplayRemoteConfigFetch.prototype.completeRequest = function (_a) {
134
+ var err = _a.err, success = _a.success;
135
+ if (err) {
136
+ throw new Error(err);
137
+ }
138
+ else if (success) {
139
+ this.localConfig.loggerProvider.log(success);
140
+ }
141
+ };
142
+ return SessionReplayRemoteConfigFetch;
143
+ }());
144
+ exports.SessionReplayRemoteConfigFetch = SessionReplayRemoteConfigFetch;
145
+ //# sourceMappingURL=remote-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remote-config.js","sourceRoot":"","sources":["../../../src/config/remote-config.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport } from '@amplitude/analytics-core';\nimport { ServerZone, Status } from '@amplitude/analytics-types';\nimport { UNEXPECTED_ERROR_MESSAGE } from '../messages';\nimport { SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore } from '../typings/session-replay';\nimport {\n SessionReplayLocalConfig as ISessionReplayLocalConfig,\n SessionReplayRemoteConfig as ISessionReplayRemoteConfig,\n SessionReplayRemoteConfigFetch as ISessionReplayRemoteConfigFetch,\n SamplingConfig,\n SessionReplayRemoteConfigAPIResponse,\n} from './types';\n\nconst UNEXPECTED_NETWORK_ERROR_MESSAGE = 'Network error occurred, session replay remote config fetch failed';\nconst SUCCESS_REMOTE_CONFIG = 'Session replay remote config successfully fetched';\nconst MAX_RETRIES_EXCEEDED_MESSAGE = 'Session replay remote config fetch rejected due to exceeded retry count';\nexport const REMOTE_CONFIG_SERVER_URL = 'https://sr-client-cfg.amplitude.com/config';\nexport const REMOTE_CONFIG_SERVER_URL_STAGING = 'https://sr-client-cfg.stag2.amplitude.com/config';\nexport const REMOTE_CONFIG_SERVER_URL_EU = 'https://sr-client-cfg.eu.amplitude.com/config';\n\nexport class SessionReplayRemoteConfigFetch implements ISessionReplayRemoteConfigFetch {\n localConfig: ISessionReplayLocalConfig;\n sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;\n retryTimeout = 1000;\n attempts = 0;\n lastFetchedSessionId: number | undefined;\n sessionTargetingMatch = false;\n\n constructor({\n localConfig,\n sessionIDBStore,\n }: {\n localConfig: ISessionReplayLocalConfig;\n sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;\n }) {\n this.localConfig = localConfig;\n this.sessionIDBStore = sessionIDBStore;\n }\n\n getRemoteConfig = async (sessionId?: number): Promise<ISessionReplayRemoteConfig | void> => {\n // Then check IndexedDB for session\n const idbRemoteConfig = await this.sessionIDBStore.getRemoteConfig();\n if (idbRemoteConfig && idbRemoteConfig.lastFetchedSessionId === sessionId) {\n return idbRemoteConfig.config;\n }\n // Finally fetch via API\n return this.fetchRemoteConfig(sessionId);\n };\n\n getSamplingConfig = async (sessionId?: number): Promise<SamplingConfig | void> => {\n const remoteConfig = await this.getRemoteConfig(sessionId);\n return remoteConfig?.sr_sampling_config;\n };\n\n getServerUrl() {\n if (this.localConfig.serverZone === ServerZone.STAGING) {\n return REMOTE_CONFIG_SERVER_URL_STAGING;\n }\n\n if (this.localConfig.serverZone === ServerZone.EU) {\n return REMOTE_CONFIG_SERVER_URL_EU;\n }\n\n return REMOTE_CONFIG_SERVER_URL;\n }\n\n fetchRemoteConfig = async (sessionId?: number): Promise<ISessionReplayRemoteConfig | void> => {\n if (sessionId === this.lastFetchedSessionId && this.attempts >= this.localConfig.flushMaxRetries) {\n return this.completeRequest({ err: MAX_RETRIES_EXCEEDED_MESSAGE });\n } else if (sessionId !== this.lastFetchedSessionId) {\n this.lastFetchedSessionId = sessionId;\n this.attempts = 0;\n }\n\n try {\n const urlParams = new URLSearchParams({\n api_key: this.localConfig.apiKey,\n config_keys: 'sessionReplay',\n });\n const options: RequestInit = {\n headers: {\n 'Content-Type': 'application/json',\n Accept: '*/*',\n },\n method: 'GET',\n };\n const serverUrl = `${this.getServerUrl()}?${urlParams.toString()}`;\n this.attempts += 1;\n const res = await fetch(serverUrl, options);\n if (res === null) {\n return this.completeRequest({ err: UNEXPECTED_ERROR_MESSAGE });\n }\n const parsedStatus = new BaseTransport().buildStatus(res.status);\n switch (parsedStatus) {\n case Status.Success:\n return this.parseAndStoreConfig(res, sessionId);\n case Status.Failed:\n return this.retryFetch(sessionId);\n default:\n return this.completeRequest({ err: UNEXPECTED_NETWORK_ERROR_MESSAGE });\n }\n } catch (e) {\n return this.completeRequest({ err: e as string });\n }\n };\n\n retryFetch = async (sessionId?: number): Promise<ISessionReplayRemoteConfig | void> => {\n await new Promise((resolve) => setTimeout(resolve, this.attempts * this.retryTimeout));\n return this.fetchRemoteConfig(sessionId);\n };\n\n parseAndStoreConfig = async (res: Response, sessionId?: number): Promise<ISessionReplayRemoteConfig> => {\n const remoteConfig: SessionReplayRemoteConfigAPIResponse =\n (await res.json()) as SessionReplayRemoteConfigAPIResponse;\n this.completeRequest({ success: SUCCESS_REMOTE_CONFIG });\n void this.sessionIDBStore.storeRemoteConfig(remoteConfig.configs.sessionReplay, sessionId);\n return remoteConfig.configs.sessionReplay;\n };\n\n completeRequest({ err, success }: { err?: string; success?: string }) {\n if (err) {\n throw new Error(err);\n } else if (success) {\n this.localConfig.loggerProvider.log(success);\n }\n }\n}\n"]}
@@ -0,0 +1,32 @@
1
+ import { Config, LogLevel, Logger } from '@amplitude/analytics-types';
2
+ export interface SamplingConfig {
3
+ sample_rate: number;
4
+ capture_enabled: boolean;
5
+ }
6
+ export interface SessionReplayRemoteConfig {
7
+ sr_sampling_config: SamplingConfig;
8
+ }
9
+ export interface SessionReplayRemoteConfigAPIResponse {
10
+ configs: {
11
+ sessionReplay: SessionReplayRemoteConfig;
12
+ };
13
+ }
14
+ export interface SessionReplayPrivacyConfig {
15
+ blockSelector?: string | string[];
16
+ }
17
+ export interface SessionReplayLocalConfig extends Config {
18
+ apiKey: string;
19
+ loggerProvider: Logger;
20
+ logLevel: LogLevel;
21
+ flushMaxRetries: number;
22
+ sampleRate: number;
23
+ privacyConfig?: SessionReplayPrivacyConfig;
24
+ debugMode?: boolean;
25
+ }
26
+ export interface SessionReplayJoinedConfig extends SessionReplayLocalConfig {
27
+ captureEnabled?: boolean;
28
+ }
29
+ export interface SessionReplayRemoteConfigFetch {
30
+ getSamplingConfig: (sessionId?: number) => Promise<SamplingConfig | void>;
31
+ }
32
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +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;AACD,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,EAAE,cAAc,CAAC;CACpC;AAED,MAAM,WAAW,oCAAoC;IACnD,OAAO,EAAE;QACP,aAAa,EAAE,yBAAyB,CAAC;KAC1C,CAAC;CACH;AACD,MAAM,WAAW,0BAA0B;IACzC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACnC;AAED,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,0BAA0B,CAAC;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,yBAA0B,SAAQ,wBAAwB;IACzE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,8BAA8B;IAC7C,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;CAC3E"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports, "__esModule", { value: true });
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/config/types.ts"],"names":[],"mappings":"","sourcesContent":["import { Config, LogLevel, Logger } from '@amplitude/analytics-types';\n\nexport interface SamplingConfig {\n sample_rate: number;\n capture_enabled: boolean;\n}\nexport interface SessionReplayRemoteConfig {\n sr_sampling_config: SamplingConfig;\n}\n\nexport interface SessionReplayRemoteConfigAPIResponse {\n configs: {\n sessionReplay: SessionReplayRemoteConfig;\n };\n}\nexport interface SessionReplayPrivacyConfig {\n blockSelector?: string | 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?: SessionReplayPrivacyConfig;\n debugMode?: boolean;\n}\n\nexport interface SessionReplayJoinedConfig extends SessionReplayLocalConfig {\n captureEnabled?: boolean;\n}\n\nexport interface SessionReplayRemoteConfigFetch {\n getSamplingConfig: (sessionId?: number) => Promise<SamplingConfig | void>;\n}\n"]}
@@ -1,15 +1,17 @@
1
- import { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager, SessionReplaySessionIDBStore as AmplitudeSessionReplayEventsStorage, SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination, Events, IDBStore, SessionReplayConfig } from './typings/session-replay';
1
+ import { SessionReplayJoinedConfig } from './config/types';
2
+ import { SessionReplayEventsManager as AmplitudeSessionReplayEventsManager, SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore, SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination, Events, IDBStore } from './typings/session-replay';
2
3
  export declare class SessionReplayEventsManager implements AmplitudeSessionReplayEventsManager {
3
4
  events: Events;
4
5
  currentSequenceId: number;
5
6
  maxPersistedEventsSize: number;
6
7
  interval: number;
7
8
  timeAtLastSend: number | null;
8
- sessionIDBStore: AmplitudeSessionReplayEventsStorage;
9
+ sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;
9
10
  trackDestination: AmplitudeSessionReplayTrackDestination;
10
- config: SessionReplayConfig;
11
- constructor({ config }: {
12
- config: SessionReplayConfig;
11
+ config: SessionReplayJoinedConfig;
12
+ constructor({ config, sessionIDBStore, }: {
13
+ config: SessionReplayJoinedConfig;
14
+ sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;
13
15
  });
14
16
  initialize({ sessionId, deviceId, shouldSendStoredEvents, }: {
15
17
  sessionId: number;
@@ -1 +1 @@
1
- {"version":3,"file":"events-manager.d.ts","sourceRoot":"","sources":["../../src/events-manager.ts"],"names":[],"mappings":"AACA,OAAO,EACL,0BAA0B,IAAI,mCAAmC,EACjE,4BAA4B,IAAI,mCAAmC,EACnE,6BAA6B,IAAI,sCAAsC,EACvE,MAAM,EACN,QAAQ,EAER,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAKlC,qBAAa,0BAA2B,YAAW,mCAAmC;IACpF,MAAM,EAAE,MAAM,CAAM;IACpB,iBAAiB,SAAK;IACtB,sBAAsB,SAAgC;IACtD,QAAQ,SAAgB;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,eAAe,EAAE,mCAAmC,CAAC;IACrD,gBAAgB,EAAE,sCAAsC,CAAC;IACzD,MAAM,EAAE,mBAAmB,CAAC;gBAEhB,EAAE,MAAM,EAAE,EAAE;QAAE,MAAM,EAAE,mBAAmB,CAAA;KAAE;IASjD,UAAU,CAAC,EACf,SAAS,EACT,QAAQ,EACR,sBAA8B,GAC/B,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,sBAAsB,CAAC,EAAE,OAAO,CAAC;KAClC;IAsBD,gBAAgB,CAAC,EACf,oBAAoB,EACpB,SAAS,EACT,QAAQ,GACT,EAAE;QACD,oBAAoB,EAAE,QAAQ,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAuBD,aAAa;IAKb,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAgB/F;;;;;OAKG;IACH,qBAAqB,oBAAqB,MAAM,KAAG,OAAO,CAYxD;IAEF,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAW3E,cAAc,CAAC,EACb,MAAM,EACN,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE;QACD,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAcK,KAAK,CAAC,QAAQ,UAAQ;CAK7B"}
1
+ {"version":3,"file":"events-manager.d.ts","sourceRoot":"","sources":["../../src/events-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EACL,0BAA0B,IAAI,mCAAmC,EACjE,4BAA4B,IAAI,qCAAqC,EACrE,6BAA6B,IAAI,sCAAsC,EACvE,MAAM,EACN,QAAQ,EAET,MAAM,0BAA0B,CAAC;AAIlC,qBAAa,0BAA2B,YAAW,mCAAmC;IACpF,MAAM,EAAE,MAAM,CAAM;IACpB,iBAAiB,SAAK;IACtB,sBAAsB,SAAgC;IACtD,QAAQ,SAAgB;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAQ;IACrC,eAAe,EAAE,qCAAqC,CAAC;IACvD,gBAAgB,EAAE,sCAAsC,CAAC;IACzD,MAAM,EAAE,yBAAyB,CAAC;gBAEtB,EACV,MAAM,EACN,eAAe,GAChB,EAAE;QACD,MAAM,EAAE,yBAAyB,CAAC;QAClC,eAAe,EAAE,qCAAqC,CAAC;KACxD;IAMK,UAAU,CAAC,EACf,SAAS,EACT,QAAQ,EACR,sBAA8B,GAC/B,EAAE;QACD,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,sBAAsB,CAAC,EAAE,OAAO,CAAC;KAClC;IAsBD,gBAAgB,CAAC,EACf,oBAAoB,EACpB,SAAS,EACT,QAAQ,GACT,EAAE;QACD,oBAAoB,EAAE,QAAQ,CAAC;QAC/B,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAuBD,aAAa;IAKb,QAAQ,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAgB/F;;;;;OAKG;IACH,qBAAqB,oBAAqB,MAAM,KAAG,OAAO,CAYxD;IAEF,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAW3E,cAAc,CAAC,EACb,MAAM,EACN,UAAU,EACV,SAAS,EACT,QAAQ,GACT,EAAE;QACD,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;KAClB;IAcK,KAAK,CAAC,QAAQ,UAAQ;CAK7B"}
@@ -3,11 +3,10 @@ exports.SessionReplayEventsManager = void 0;
3
3
  var tslib_1 = require("tslib");
4
4
  var constants_1 = require("./constants");
5
5
  var session_replay_1 = require("./typings/session-replay");
6
- var session_idb_store_1 = require("./session-idb-store");
7
6
  var track_destination_1 = require("./track-destination");
8
7
  var SessionReplayEventsManager = /** @class */ (function () {
9
8
  function SessionReplayEventsManager(_a) {
10
- var config = _a.config;
9
+ var config = _a.config, sessionIDBStore = _a.sessionIDBStore;
11
10
  var _this = this;
12
11
  this.events = [];
13
12
  this.currentSequenceId = 0;
@@ -35,10 +34,7 @@ var SessionReplayEventsManager = /** @class */ (function () {
35
34
  };
36
35
  this.config = config;
37
36
  this.trackDestination = new track_destination_1.SessionReplayTrackDestination({ loggerProvider: this.config.loggerProvider });
38
- this.sessionIDBStore = new session_idb_store_1.SessionReplaySessionIDBStore({
39
- loggerProvider: this.config.loggerProvider,
40
- apiKey: this.config.apiKey,
41
- });
37
+ this.sessionIDBStore = sessionIDBStore;
42
38
  }
43
39
  SessionReplayEventsManager.prototype.initialize = function (_a) {
44
40
  var sessionId = _a.sessionId, deviceId = _a.deviceId, _b = _a.shouldSendStoredEvents, shouldSendStoredEvents = _b === void 0 ? false : _b;
@@ -1 +1 @@
1
- {"version":3,"file":"events-manager.js","sourceRoot":"","sources":["../../src/events-manager.ts"],"names":[],"mappings":"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","sourcesContent":["import { MAX_EVENT_LIST_SIZE_IN_BYTES, MAX_INTERVAL, MIN_INTERVAL } from './constants';\nimport {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n SessionReplaySessionIDBStore as AmplitudeSessionReplayEventsStorage,\n SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination,\n Events,\n IDBStore,\n RecordingStatus,\n SessionReplayConfig,\n} from './typings/session-replay';\n\nimport { SessionReplaySessionIDBStore } from './session-idb-store';\nimport { SessionReplayTrackDestination } from './track-destination';\n\nexport class SessionReplayEventsManager implements AmplitudeSessionReplayEventsManager {\n events: Events = [];\n currentSequenceId = 0;\n maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;\n interval = MIN_INTERVAL;\n timeAtLastSend: number | null = null;\n sessionIDBStore: AmplitudeSessionReplayEventsStorage;\n trackDestination: AmplitudeSessionReplayTrackDestination;\n config: SessionReplayConfig;\n\n constructor({ config }: { config: SessionReplayConfig }) {\n this.config = config;\n this.trackDestination = new SessionReplayTrackDestination({ loggerProvider: this.config.loggerProvider });\n this.sessionIDBStore = new SessionReplaySessionIDBStore({\n loggerProvider: this.config.loggerProvider,\n apiKey: this.config.apiKey,\n });\n }\n\n async initialize({\n sessionId,\n deviceId,\n shouldSendStoredEvents = false,\n }: {\n sessionId: number;\n deviceId: string;\n shouldSendStoredEvents?: boolean;\n }) {\n this.timeAtLastSend = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n const storedReplaySessions = await this.sessionIDBStore.getAllSessionDataFromStore();\n\n const storedSequencesForSession = storedReplaySessions && storedReplaySessions[sessionId];\n if (storedReplaySessions && storedSequencesForSession && storedSequencesForSession.sessionSequences) {\n const storedSeqId = storedSequencesForSession.currentSequenceId;\n const lastSequence = storedSequencesForSession.sessionSequences[storedSeqId];\n if (lastSequence && lastSequence.status !== RecordingStatus.RECORDING) {\n this.currentSequenceId = storedSeqId + 1;\n this.events = [];\n } else {\n // Pick up recording where it was left off in another tab or window\n this.currentSequenceId = storedSeqId;\n this.events = lastSequence?.events || [];\n }\n }\n if (shouldSendStoredEvents && storedReplaySessions) {\n this.sendStoredEvents({ storedReplaySessions, deviceId, sessionId });\n }\n }\n\n sendStoredEvents({\n storedReplaySessions,\n sessionId,\n deviceId,\n }: {\n storedReplaySessions: IDBStore;\n sessionId: number;\n deviceId: string;\n }) {\n for (const storedSessionId in storedReplaySessions) {\n const storedSequences = storedReplaySessions[storedSessionId].sessionSequences;\n for (const storedSeqId in storedSequences) {\n const seq = storedSequences[storedSeqId];\n const numericSeqId = parseInt(storedSeqId, 10);\n const numericSessionId = parseInt(storedSessionId, 10);\n if (numericSessionId === sessionId && numericSeqId === this.currentSequenceId) {\n continue;\n }\n\n if (seq.events && seq.events.length && seq.status === RecordingStatus.RECORDING) {\n this.sendEventsList({\n events: seq.events,\n sequenceId: numericSeqId,\n sessionId: numericSessionId,\n deviceId,\n });\n }\n }\n }\n }\n\n resetSequence() {\n this.events = [];\n this.currentSequenceId = 0;\n }\n\n addEvent({ event, sessionId, deviceId }: { event: string; sessionId: number; deviceId: string }) {\n const shouldSplit = this.shouldSplitEventsList(event);\n if (shouldSplit) {\n this.sendEventsList({\n events: this.events,\n sequenceId: this.currentSequenceId,\n sessionId,\n deviceId,\n });\n this.events = [];\n this.currentSequenceId++;\n }\n this.events.push(event);\n void this.sessionIDBStore.storeEventsForSession(this.events, this.currentSequenceId, 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 = (nextEventString: string): boolean => {\n const sizeOfNextEvent = new Blob([nextEventString]).size;\n const sizeOfEventsList = new Blob(this.events).size;\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (this.timeAtLastSend !== null && Date.now() - this.timeAtLastSend > this.interval && this.events.length) {\n this.interval = Math.min(MAX_INTERVAL, this.interval + MIN_INTERVAL);\n this.timeAtLastSend = Date.now();\n return true;\n }\n return false;\n };\n\n sendEvents({ sessionId, deviceId }: { sessionId: number; deviceId: string }) {\n if (this.events.length && sessionId) {\n this.sendEventsList({\n events: this.events,\n sequenceId: this.currentSequenceId,\n sessionId,\n deviceId,\n });\n }\n }\n\n sendEventsList({\n events,\n sequenceId,\n sessionId,\n deviceId,\n }: {\n events: string[];\n sequenceId: number;\n sessionId: number;\n deviceId: string;\n }) {\n this.trackDestination.sendEventsList({\n events: events,\n sequenceId: sequenceId,\n sessionId: sessionId,\n flushMaxRetries: this.config.flushMaxRetries,\n apiKey: this.config.apiKey,\n deviceId: deviceId,\n sampleRate: this.config.sampleRate,\n serverZone: this.config.serverZone,\n onComplete: this.sessionIDBStore.cleanUpSessionEventsStore.bind(this.sessionIDBStore),\n });\n }\n\n async flush(useRetry = false) {\n if (this.trackDestination) {\n return this.trackDestination.flush(useRetry);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"events-manager.js","sourceRoot":"","sources":["../../src/events-manager.ts"],"names":[],"mappings":";;;AACA,yCAAuF;AACvF,2DAOkC;AAElC,yDAAoE;AAEpE;IAUE,oCAAY,EAMX;YALC,MAAM,YAAA,EACN,eAAe,qBAAA;QAFjB,iBAUC;QAnBD,WAAM,GAAW,EAAE,CAAC;QACpB,sBAAiB,GAAG,CAAC,CAAC;QACtB,2BAAsB,GAAG,wCAA4B,CAAC;QACtD,aAAQ,GAAG,wBAAY,CAAC;QACxB,mBAAc,GAAkB,IAAI,CAAC;QAmGrC;;;;;WAKG;QACH,0BAAqB,GAAG,UAAC,eAAuB;YAC9C,IAAM,eAAe,GAAG,IAAI,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC;YACzD,IAAM,gBAAgB,GAAG,IAAI,IAAI,CAAC,KAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;YACpD,IAAI,gBAAgB,GAAG,eAAe,IAAI,KAAI,CAAC,sBAAsB,EAAE;gBACrE,OAAO,IAAI,CAAC;aACb;YACD,IAAI,KAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAI,CAAC,cAAc,GAAG,KAAI,CAAC,QAAQ,IAAI,KAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC1G,KAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,wBAAY,EAAE,KAAI,CAAC,QAAQ,GAAG,wBAAY,CAAC,CAAC;gBACrE,KAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBACjC,OAAO,IAAI,CAAC;aACb;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAzGA,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,gBAAgB,GAAG,IAAI,iDAA6B,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAEK,+CAAU,GAAhB,UAAiB,EAQhB;YAPC,SAAS,eAAA,EACT,QAAQ,cAAA,EACR,8BAA8B,EAA9B,sBAAsB,mBAAG,KAAK,KAAA;;;;;;wBAM9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,4EAA4E;wBACjF,qBAAM,IAAI,CAAC,eAAe,CAAC,0BAA0B,EAAE,EAAA;;wBAA9E,oBAAoB,GAAG,SAAuD;wBAE9E,yBAAyB,GAAG,oBAAoB,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;wBAC1F,IAAI,oBAAoB,IAAI,yBAAyB,IAAI,yBAAyB,CAAC,gBAAgB,EAAE;4BAC7F,WAAW,GAAG,yBAAyB,CAAC,iBAAiB,CAAC;4BAC1D,YAAY,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;4BAC7E,IAAI,YAAY,IAAI,YAAY,CAAC,MAAM,KAAK,gCAAe,CAAC,SAAS,EAAE;gCACrE,IAAI,CAAC,iBAAiB,GAAG,WAAW,GAAG,CAAC,CAAC;gCACzC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;6BAClB;iCAAM;gCACL,mEAAmE;gCACnE,IAAI,CAAC,iBAAiB,GAAG,WAAW,CAAC;gCACrC,IAAI,CAAC,MAAM,GAAG,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,KAAI,EAAE,CAAC;6BAC1C;yBACF;wBACD,IAAI,sBAAsB,IAAI,oBAAoB,EAAE;4BAClD,IAAI,CAAC,gBAAgB,CAAC,EAAE,oBAAoB,sBAAA,EAAE,QAAQ,UAAA,EAAE,SAAS,WAAA,EAAE,CAAC,CAAC;yBACtE;;;;;KACF;IAED,qDAAgB,GAAhB,UAAiB,EAQhB;YAPC,oBAAoB,0BAAA,EACpB,SAAS,eAAA,EACT,QAAQ,cAAA;QAMR,KAAK,IAAM,eAAe,IAAI,oBAAoB,EAAE;YAClD,IAAM,eAAe,GAAG,oBAAoB,CAAC,eAAe,CAAC,CAAC,gBAAgB,CAAC;YAC/E,KAAK,IAAM,WAAW,IAAI,eAAe,EAAE;gBACzC,IAAM,GAAG,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;gBACzC,IAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC/C,IAAM,gBAAgB,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;gBACvD,IAAI,gBAAgB,KAAK,SAAS,IAAI,YAAY,KAAK,IAAI,CAAC,iBAAiB,EAAE;oBAC7E,SAAS;iBACV;gBAED,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,KAAK,gCAAe,CAAC,SAAS,EAAE;oBAC/E,IAAI,CAAC,cAAc,CAAC;wBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,UAAU,EAAE,YAAY;wBACxB,SAAS,EAAE,gBAAgB;wBAC3B,QAAQ,UAAA;qBACT,CAAC,CAAC;iBACJ;aACF;SACF;IACH,CAAC;IAED,kDAAa,GAAb;QACE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED,6CAAQ,GAAR,UAAS,EAAsF;YAApF,KAAK,WAAA,EAAE,SAAS,eAAA,EAAE,QAAQ,cAAA;QACnC,IAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,WAAW,EAAE;YACf,IAAI,CAAC,cAAc,CAAC;gBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,iBAAiB;gBAClC,SAAS,WAAA;gBACT,QAAQ,UAAA;aACT,CAAC,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YACjB,IAAI,CAAC,iBAAiB,EAAE,CAAC;SAC1B;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,KAAK,IAAI,CAAC,eAAe,CAAC,qBAAqB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,CAAC;IAClG,CAAC;IAsBD,+CAAU,GAAV,UAAW,EAAgE;YAA9D,SAAS,eAAA,EAAE,QAAQ,cAAA;QAC9B,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE;YACnC,IAAI,CAAC,cAAc,CAAC;gBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,iBAAiB;gBAClC,SAAS,WAAA;gBACT,QAAQ,UAAA;aACT,CAAC,CAAC;SACJ;IACH,CAAC;IAED,mDAAc,GAAd,UAAe,EAUd;YATC,MAAM,YAAA,EACN,UAAU,gBAAA,EACV,SAAS,eAAA,EACT,QAAQ,cAAA;QAOR,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC;YACnC,MAAM,EAAE,MAAM;YACd,UAAU,EAAE,UAAU;YACtB,SAAS,EAAE,SAAS;YACpB,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;YAC5C,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YAClC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;SACtF,CAAC,CAAC;IACL,CAAC;IAEK,0CAAK,GAAX,UAAY,QAAgB;QAAhB,yBAAA,EAAA,gBAAgB;;;gBAC1B,IAAI,IAAI,CAAC,gBAAgB,EAAE;oBACzB,sBAAO,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAC;iBAC9C;;;;KACF;IACH,iCAAC;AAAD,CAAC,AApKD,IAoKC;AApKY,gEAA0B","sourcesContent":["import { SessionReplayJoinedConfig } from './config/types';\nimport { MAX_EVENT_LIST_SIZE_IN_BYTES, MAX_INTERVAL, MIN_INTERVAL } from './constants';\nimport {\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore,\n SessionReplayTrackDestination as AmplitudeSessionReplayTrackDestination,\n Events,\n IDBStore,\n RecordingStatus,\n} from './typings/session-replay';\n\nimport { SessionReplayTrackDestination } from './track-destination';\n\nexport class SessionReplayEventsManager implements AmplitudeSessionReplayEventsManager {\n events: Events = [];\n currentSequenceId = 0;\n maxPersistedEventsSize = MAX_EVENT_LIST_SIZE_IN_BYTES;\n interval = MIN_INTERVAL;\n timeAtLastSend: number | null = null;\n sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;\n trackDestination: AmplitudeSessionReplayTrackDestination;\n config: SessionReplayJoinedConfig;\n\n constructor({\n config,\n sessionIDBStore,\n }: {\n config: SessionReplayJoinedConfig;\n sessionIDBStore: AmplitudeSessionReplaySessionIDBStore;\n }) {\n this.config = config;\n this.trackDestination = new SessionReplayTrackDestination({ loggerProvider: this.config.loggerProvider });\n this.sessionIDBStore = sessionIDBStore;\n }\n\n async initialize({\n sessionId,\n deviceId,\n shouldSendStoredEvents = false,\n }: {\n sessionId: number;\n deviceId: string;\n shouldSendStoredEvents?: boolean;\n }) {\n this.timeAtLastSend = Date.now(); // Initialize this so we have a point of comparison when events are recorded\n const storedReplaySessions = await this.sessionIDBStore.getAllSessionDataFromStore();\n\n const storedSequencesForSession = storedReplaySessions && storedReplaySessions[sessionId];\n if (storedReplaySessions && storedSequencesForSession && storedSequencesForSession.sessionSequences) {\n const storedSeqId = storedSequencesForSession.currentSequenceId;\n const lastSequence = storedSequencesForSession.sessionSequences[storedSeqId];\n if (lastSequence && lastSequence.status !== RecordingStatus.RECORDING) {\n this.currentSequenceId = storedSeqId + 1;\n this.events = [];\n } else {\n // Pick up recording where it was left off in another tab or window\n this.currentSequenceId = storedSeqId;\n this.events = lastSequence?.events || [];\n }\n }\n if (shouldSendStoredEvents && storedReplaySessions) {\n this.sendStoredEvents({ storedReplaySessions, deviceId, sessionId });\n }\n }\n\n sendStoredEvents({\n storedReplaySessions,\n sessionId,\n deviceId,\n }: {\n storedReplaySessions: IDBStore;\n sessionId: number;\n deviceId: string;\n }) {\n for (const storedSessionId in storedReplaySessions) {\n const storedSequences = storedReplaySessions[storedSessionId].sessionSequences;\n for (const storedSeqId in storedSequences) {\n const seq = storedSequences[storedSeqId];\n const numericSeqId = parseInt(storedSeqId, 10);\n const numericSessionId = parseInt(storedSessionId, 10);\n if (numericSessionId === sessionId && numericSeqId === this.currentSequenceId) {\n continue;\n }\n\n if (seq.events && seq.events.length && seq.status === RecordingStatus.RECORDING) {\n this.sendEventsList({\n events: seq.events,\n sequenceId: numericSeqId,\n sessionId: numericSessionId,\n deviceId,\n });\n }\n }\n }\n }\n\n resetSequence() {\n this.events = [];\n this.currentSequenceId = 0;\n }\n\n addEvent({ event, sessionId, deviceId }: { event: string; sessionId: number; deviceId: string }) {\n const shouldSplit = this.shouldSplitEventsList(event);\n if (shouldSplit) {\n this.sendEventsList({\n events: this.events,\n sequenceId: this.currentSequenceId,\n sessionId,\n deviceId,\n });\n this.events = [];\n this.currentSequenceId++;\n }\n this.events.push(event);\n void this.sessionIDBStore.storeEventsForSession(this.events, this.currentSequenceId, 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 = (nextEventString: string): boolean => {\n const sizeOfNextEvent = new Blob([nextEventString]).size;\n const sizeOfEventsList = new Blob(this.events).size;\n if (sizeOfEventsList + sizeOfNextEvent >= this.maxPersistedEventsSize) {\n return true;\n }\n if (this.timeAtLastSend !== null && Date.now() - this.timeAtLastSend > this.interval && this.events.length) {\n this.interval = Math.min(MAX_INTERVAL, this.interval + MIN_INTERVAL);\n this.timeAtLastSend = Date.now();\n return true;\n }\n return false;\n };\n\n sendEvents({ sessionId, deviceId }: { sessionId: number; deviceId: string }) {\n if (this.events.length && sessionId) {\n this.sendEventsList({\n events: this.events,\n sequenceId: this.currentSequenceId,\n sessionId,\n deviceId,\n });\n }\n }\n\n sendEventsList({\n events,\n sequenceId,\n sessionId,\n deviceId,\n }: {\n events: string[];\n sequenceId: number;\n sessionId: number;\n deviceId: string;\n }) {\n this.trackDestination.sendEventsList({\n events: events,\n sequenceId: sequenceId,\n sessionId: sessionId,\n flushMaxRetries: this.config.flushMaxRetries,\n apiKey: this.config.apiKey,\n deviceId: deviceId,\n sampleRate: this.config.sampleRate,\n serverZone: this.config.serverZone,\n onComplete: this.sessionIDBStore.cleanUpSessionEventsStore.bind(this.sessionIDBStore),\n });\n }\n\n async flush(useRetry = false) {\n if (this.trackDestination) {\n return this.trackDestination.flush(useRetry);\n }\n }\n}\n"]}
@@ -1,9 +1,11 @@
1
- import { Logger as ILogger } from '@amplitude/analytics-types';
2
- import { SessionIdentifiers as ISessionIdentifiers, SessionReplayOptions } from './typings/session-replay';
1
+ import { SessionIdentifiers as ISessionIdentifiers } from './typings/session-replay';
3
2
  export declare class SessionIdentifiers implements ISessionIdentifiers {
4
3
  deviceId?: string | undefined;
5
4
  sessionId?: number | undefined;
6
5
  sessionReplayId?: string | undefined;
7
- constructor(options: SessionReplayOptions, loggerProvider: ILogger);
6
+ constructor({ sessionId, deviceId }: {
7
+ sessionId?: number;
8
+ deviceId?: string;
9
+ });
8
10
  }
9
11
  //# sourceMappingURL=identifiers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../src/identifiers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAE3G,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEzB,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,OAAO;CAUnE"}
1
+ {"version":3,"file":"identifiers.d.ts","sourceRoot":"","sources":["../../src/identifiers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAErF,qBAAa,kBAAmB,YAAW,mBAAmB;IAC5D,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;gBAEzB,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;CAQ/E"}
@@ -2,14 +2,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
2
2
  exports.SessionIdentifiers = void 0;
3
3
  var helpers_1 = require("./helpers");
4
4
  var SessionIdentifiers = /** @class */ (function () {
5
- function SessionIdentifiers(options, loggerProvider) {
6
- this.deviceId = options.deviceId;
7
- this.sessionId = options.sessionId;
8
- if (options.sessionId && options.deviceId) {
9
- this.sessionReplayId = (0, helpers_1.generateSessionReplayId)(options.sessionId, options.deviceId);
10
- }
11
- else {
12
- loggerProvider.error('Please provide both sessionId and deviceId.');
5
+ function SessionIdentifiers(_a) {
6
+ var sessionId = _a.sessionId, deviceId = _a.deviceId;
7
+ this.deviceId = deviceId;
8
+ this.sessionId = sessionId;
9
+ if (sessionId && deviceId) {
10
+ this.sessionReplayId = (0, helpers_1.generateSessionReplayId)(sessionId, deviceId);
13
11
  }
14
12
  }
15
13
  return SessionIdentifiers;
@@ -1 +1 @@
1
- {"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/identifiers.ts"],"names":[],"mappings":";;AACA,qCAAoD;AAGpD;IAKE,4BAAY,OAA6B,EAAE,cAAuB;QAChE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QACjC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;QAEnC,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE;YACzC,IAAI,CAAC,eAAe,GAAG,IAAA,iCAAuB,EAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;SACrF;aAAM;YACL,cAAc,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;SACrE;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AAfD,IAeC;AAfY,gDAAkB","sourcesContent":["import { Logger as ILogger } from '@amplitude/analytics-types';\nimport { generateSessionReplayId } from './helpers';\nimport { SessionIdentifiers as ISessionIdentifiers, SessionReplayOptions } from './typings/session-replay';\n\nexport class SessionIdentifiers implements ISessionIdentifiers {\n deviceId?: string | undefined;\n sessionId?: number | undefined;\n sessionReplayId?: string | undefined;\n\n constructor(options: SessionReplayOptions, loggerProvider: ILogger) {\n this.deviceId = options.deviceId;\n this.sessionId = options.sessionId;\n\n if (options.sessionId && options.deviceId) {\n this.sessionReplayId = generateSessionReplayId(options.sessionId, options.deviceId);\n } else {\n loggerProvider.error('Please provide both sessionId and deviceId.');\n }\n }\n}\n"]}
1
+ {"version":3,"file":"identifiers.js","sourceRoot":"","sources":["../../src/identifiers.ts"],"names":[],"mappings":";;AAAA,qCAAoD;AAGpD;IAKE,4BAAY,EAAkE;YAAhE,SAAS,eAAA,EAAE,QAAQ,cAAA;QAC/B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,SAAS,IAAI,QAAQ,EAAE;YACzB,IAAI,CAAC,eAAe,GAAG,IAAA,iCAAuB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;SACrE;IACH,CAAC;IACH,yBAAC;AAAD,CAAC,AAbD,IAaC;AAbY,gDAAkB","sourcesContent":["import { generateSessionReplayId } from './helpers';\nimport { SessionIdentifiers as ISessionIdentifiers } from './typings/session-replay';\n\nexport class SessionIdentifiers implements ISessionIdentifiers {\n deviceId?: string | undefined;\n sessionId?: number | undefined;\n sessionReplayId?: string | undefined;\n\n constructor({ sessionId, deviceId }: { sessionId?: number; deviceId?: string }) {\n this.deviceId = deviceId;\n this.sessionId = sessionId;\n\n if (sessionId && deviceId) {\n this.sessionReplayId = generateSessionReplayId(sessionId, deviceId);\n }\n }\n}\n"]}
@@ -1,4 +1,4 @@
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) => void, getSessionId: () => number | undefined, getSessionReplayProperties: () => {
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
4
  //# 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,8DAAE,YAAY,4BAAE,0BAA0B;;GAAE,KAAK,wCAAE,QAAQ,YAAkB,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"}
@@ -1,5 +1,6 @@
1
1
  import { Logger as ILogger } from '@amplitude/analytics-types';
2
- import { SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore, Events, IDBStore } from './typings/session-replay';
2
+ import { SessionReplayRemoteConfig } from './config/types';
3
+ import { SessionReplaySessionIDBStore as AmplitudeSessionReplaySessionIDBStore, Events, IDBRemoteConfig, IDBStore } from './typings/session-replay';
3
4
  export declare class SessionReplaySessionIDBStore implements AmplitudeSessionReplaySessionIDBStore {
4
5
  apiKey: string | undefined;
5
6
  storageKey: string;
@@ -10,6 +11,8 @@ export declare class SessionReplaySessionIDBStore implements AmplitudeSessionRep
10
11
  });
11
12
  getAllSessionDataFromStore: () => Promise<IDBStore | undefined>;
12
13
  storeEventsForSession: (events: Events, sequenceId: number, sessionId: number) => Promise<void>;
14
+ storeRemoteConfig: (remoteConfig: SessionReplayRemoteConfig, sessionId?: number) => Promise<void>;
15
+ getRemoteConfig: () => Promise<IDBRemoteConfig | void>;
13
16
  cleanUpSessionEventsStore: (sessionId: number, sequenceId: number) => Promise<void>;
14
17
  }
15
18
  //# sourceMappingURL=session-idb-store.d.ts.map