@amplitude/session-replay-browser 1.2.3 → 1.2.4

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.
@@ -7,7 +7,7 @@ export declare class SessionReplay implements AmplitudeSessionReplay {
7
7
  identifiers: ISessionIdentifiers | undefined;
8
8
  eventsManager: AmplitudeSessionReplayEventsManager | undefined;
9
9
  loggerProvider: ILogger;
10
- stopRecordingEvents: ReturnType<typeof record> | null;
10
+ recordCancelCallback: ReturnType<typeof record> | null;
11
11
  constructor();
12
12
  init(apiKey: string, options: SessionReplayOptions): import("@amplitude/analytics-types").AmplitudeReturn<void>;
13
13
  protected _init(apiKey: string, options: SessionReplayOptions): Promise<void>;
@@ -24,6 +24,7 @@ export declare class SessionReplay implements AmplitudeSessionReplay {
24
24
  getShouldRecord(ignoreFocus?: boolean): boolean;
25
25
  getBlockSelectors(): string | string[] | undefined;
26
26
  recordEvents(): void;
27
+ stopRecordingEvents: () => void;
27
28
  getDeviceId(): string | undefined;
28
29
  getSessionId(): number | undefined;
29
30
  flush(useRetry?: boolean): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAQ,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAWhD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EACjE,kBAAkB,IAAI,mBAAmB,EACzC,mBAAmB,IAAI,oBAAoB,EAC3C,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,IAAI,SAAuC;IAC3C,MAAM,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,mCAAmC,GAAG,SAAS,CAAC;IAC/D,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,IAAI,CAAQ;;IAM7D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;cAIlC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAsBnE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAwBjD,kCAAkC;IAUlC,0BAA0B;;;IAwB1B,YAAY,aAEV;IAEF,aAAa,aAEX;IAEF,0BAA0B,CAAC,SAAS,CAAC,EAAE,MAAM;IAiBvC,UAAU,CAAC,sBAAsB,UAAQ;IAkB/C,YAAY;IAUZ,eAAe,CAAC,WAAW,UAAQ;IA8BnC,iBAAiB,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlD,YAAY;IAkCZ,WAAW;IAUX,YAAY;IAIN,KAAK,CAAC,QAAQ,UAAQ;IAM5B,QAAQ;CAST"}
1
+ {"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAQ,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAWhD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EACjE,kBAAkB,IAAI,mBAAmB,EACzC,mBAAmB,IAAI,oBAAoB,EAC3C,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,IAAI,SAAuC;IAC3C,MAAM,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,mCAAmC,GAAG,SAAS,CAAC;IAC/D,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,IAAI,CAAQ;;IAM9D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;cAIlC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAsBnE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAwBjD,kCAAkC;IAUlC,0BAA0B;;;IAwB1B,YAAY,aAEV;IAEF,aAAa,aAEX;IAEF,0BAA0B,CAAC,SAAS,CAAC,EAAE,MAAM;IAWvC,UAAU,CAAC,sBAAsB,UAAQ;IAkB/C,YAAY;IAUZ,eAAe,CAAC,WAAW,UAAQ;IA8BnC,iBAAiB,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlD,YAAY;IAmCZ,mBAAmB,aAQjB;IAEF,WAAW;IAUX,YAAY;IAIN,KAAK,CAAC,QAAQ,UAAQ;IAM5B,QAAQ;CAST"}
@@ -13,13 +13,23 @@ var SessionReplay = /** @class */ (function () {
13
13
  function SessionReplay() {
14
14
  var _this = this;
15
15
  this.name = '@amplitude/session-replay-browser';
16
- this.stopRecordingEvents = null;
16
+ this.recordCancelCallback = null;
17
17
  this.blurListener = function () {
18
18
  _this.stopRecordingAndSendEvents();
19
19
  };
20
20
  this.focusListener = function () {
21
21
  void _this.initialize();
22
22
  };
23
+ this.stopRecordingEvents = function () {
24
+ try {
25
+ _this.recordCancelCallback && _this.recordCancelCallback();
26
+ _this.recordCancelCallback = null;
27
+ }
28
+ catch (error) {
29
+ var typedError = error;
30
+ _this.loggerProvider.warn("Error occurred while stopping recording: ".concat(typedError.toString()));
31
+ }
32
+ };
23
33
  this.loggerProvider = new analytics_core_1.Logger();
24
34
  }
25
35
  SessionReplay.prototype.init = function (apiKey, options) {
@@ -107,14 +117,7 @@ var SessionReplay = /** @class */ (function () {
107
117
  };
108
118
  SessionReplay.prototype.stopRecordingAndSendEvents = function (sessionId) {
109
119
  var _a;
110
- try {
111
- this.stopRecordingEvents && this.stopRecordingEvents();
112
- this.stopRecordingEvents = null;
113
- }
114
- catch (error) {
115
- var typedError = error;
116
- this.loggerProvider.warn("Error occurred while stopping recording: ".concat(typedError.toString()));
117
- }
120
+ this.stopRecordingEvents();
118
121
  var sessionIdToSend = sessionId || ((_a = this.identifiers) === null || _a === void 0 ? void 0 : _a.sessionId);
119
122
  var deviceId = this.getDeviceId();
120
123
  this.eventsManager &&
@@ -204,7 +207,8 @@ var SessionReplay = /** @class */ (function () {
204
207
  if (!shouldRecord || !sessionId) {
205
208
  return;
206
209
  }
207
- this.stopRecordingEvents = (0, rrweb_1.record)({
210
+ this.stopRecordingEvents();
211
+ this.recordCancelCallback = (0, rrweb_1.record)({
208
212
  emit: function (event) {
209
213
  var globalScope = (0, analytics_client_common_1.getGlobalScope)();
210
214
  if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !_this.getShouldRecord()) {
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAnalyticsConnector, getGlobalScope } from '@amplitude/analytics-client-common';\nimport { Logger, returnWrapper } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { pack, record } from '@amplitude/rrweb';\nimport { SessionReplayConfig } from './config';\nimport {\n BLOCK_CLASS,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { SessionReplayEventsManager } from './events-manager';\nimport { generateHashCode, generateSessionReplayId, isSessionInSample, maskInputFn } from './helpers';\nimport { SessionIdentifiers } from './identifiers';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayConfig as ISessionReplayConfig,\n SessionReplayOptions,\n} from './typings/session-replay';\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: ISessionReplayConfig | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager | undefined;\n loggerProvider: ILogger;\n stopRecordingEvents: ReturnType<typeof record> | null = null;\n\n constructor() {\n this.loggerProvider = new Logger();\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.config = new SessionReplayConfig(apiKey, options);\n this.loggerProvider = this.config.loggerProvider;\n this.identifiers = new SessionIdentifiers(options, this.loggerProvider);\n\n this.eventsManager = new SessionReplayEventsManager({\n config: this.config,\n });\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.addEventListener('blur', this.blurListener);\n globalScope.addEventListener('focus', this.focusListener);\n }\n\n if (globalScope && globalScope.document && globalScope.document.hasFocus()) {\n await this.initialize(true);\n }\n }\n\n setSessionId(sessionId: number, deviceId?: string) {\n if (!this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot set session id.');\n return;\n }\n\n if (deviceId) {\n this.identifiers.deviceId = deviceId;\n }\n // use a consistent device id.\n const deviceIdForReplayId = this.getDeviceId();\n if (sessionId && deviceIdForReplayId) {\n this.identifiers.sessionReplayId = generateSessionReplayId(sessionId, deviceIdForReplayId);\n } else {\n this.loggerProvider.error('Must provide either session replay id or session id when starting a new session.');\n return;\n }\n\n this.stopRecordingAndSendEvents(this.identifiers.sessionId);\n this.identifiers.sessionId = sessionId;\n this.eventsManager && this.eventsManager.resetSequence();\n this.recordEvents();\n }\n\n getSessionReplayDebugPropertyValue() {\n let apiKeyHash = '';\n if (this.config) {\n apiKeyHash = generateHashCode(this.config.apiKey).toString();\n }\n return JSON.stringify({\n appHash: apiKeyHash,\n });\n }\n\n getSessionReplayProperties() {\n if (!this.config || !this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot get session recording properties.');\n return {};\n }\n\n // If the user is in debug mode, ignore the focus handler when tagging events.\n // this is a common mishap when someone is developing locally and not seeing events getting tagged.\n const ignoreFocus = !!this.config.debugMode;\n const shouldRecord = this.getShouldRecord(ignoreFocus);\n\n if (shouldRecord) {\n const eventProperties: { [key: string]: string | null } = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: this.identifiers.sessionReplayId ? this.identifiers.sessionReplayId : null,\n };\n if (this.config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = this.getSessionReplayDebugPropertyValue();\n }\n return eventProperties;\n }\n\n return {};\n }\n\n blurListener = () => {\n this.stopRecordingAndSendEvents();\n };\n\n focusListener = () => {\n void this.initialize();\n };\n\n stopRecordingAndSendEvents(sessionId?: number) {\n try {\n this.stopRecordingEvents && this.stopRecordingEvents();\n this.stopRecordingEvents = null;\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping recording: ${typedError.toString()}`);\n }\n\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return;\n }\n\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n deviceId &&\n (await this.eventsManager.initialize({\n sessionId: this.identifiers.sessionId,\n shouldSendStoredEvents,\n deviceId,\n }));\n\n this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord(ignoreFocus = false) {\n if (!this.identifiers || !this.config) {\n this.loggerProvider.error(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n const globalScope = getGlobalScope();\n if (!ignoreFocus && globalScope && globalScope.document && !globalScope.document.hasFocus()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} temporarily not recording due to lack of browser focus.`,\n );\n }\n return false;\n } else if (this.shouldOptOut()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n }\n return false;\n } else if (!this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return false;\n }\n\n const isInSample = isSessionInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`);\n }\n return isInSample;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n return this.config?.privacyConfig?.blockSelector;\n }\n\n recordEvents() {\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId) {\n return;\n }\n this.stopRecordingEvents = record({\n emit: (event) => {\n const globalScope = getGlobalScope();\n if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !this.getShouldRecord()) {\n this.stopRecordingAndSendEvents();\n return;\n }\n const eventString = JSON.stringify(event);\n const deviceId = this.getDeviceId();\n deviceId && this.eventsManager && this.eventsManager.addEvent({ event: eventString, sessionId, deviceId });\n },\n packFn: pack,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n // rrweb only exposes array type through its types, but arrays are also be supported. #class, ['#class', 'id']\n blockSelector: this.getBlockSelectors() as string,\n maskInputFn,\n recordCanvas: false,\n errorHandler: (error) => {\n const typedError = error as Error;\n this.loggerProvider.warn('Error while recording: ', typedError.toString());\n\n return true;\n },\n });\n }\n\n getDeviceId() {\n let identityStoreDeviceId: string | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreDeviceId = identityStore.getIdentity().deviceId;\n }\n\n return identityStoreDeviceId || this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n if (this.eventsManager) {\n return this.eventsManager.flush(useRetry);\n }\n }\n\n shutdown() {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n }\n\n this.stopRecordingAndSendEvents();\n }\n}\n"]}
1
+ {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAnalyticsConnector, getGlobalScope } from '@amplitude/analytics-client-common';\nimport { Logger, returnWrapper } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { pack, record } from '@amplitude/rrweb';\nimport { SessionReplayConfig } from './config';\nimport {\n BLOCK_CLASS,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { SessionReplayEventsManager } from './events-manager';\nimport { generateHashCode, generateSessionReplayId, isSessionInSample, maskInputFn } from './helpers';\nimport { SessionIdentifiers } from './identifiers';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayConfig as ISessionReplayConfig,\n SessionReplayOptions,\n} from './typings/session-replay';\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: ISessionReplayConfig | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager | undefined;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<typeof record> | null = null;\n\n constructor() {\n this.loggerProvider = new Logger();\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.config = new SessionReplayConfig(apiKey, options);\n this.loggerProvider = this.config.loggerProvider;\n this.identifiers = new SessionIdentifiers(options, this.loggerProvider);\n\n this.eventsManager = new SessionReplayEventsManager({\n config: this.config,\n });\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.addEventListener('blur', this.blurListener);\n globalScope.addEventListener('focus', this.focusListener);\n }\n\n if (globalScope && globalScope.document && globalScope.document.hasFocus()) {\n await this.initialize(true);\n }\n }\n\n setSessionId(sessionId: number, deviceId?: string) {\n if (!this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot set session id.');\n return;\n }\n\n if (deviceId) {\n this.identifiers.deviceId = deviceId;\n }\n // use a consistent device id.\n const deviceIdForReplayId = this.getDeviceId();\n if (sessionId && deviceIdForReplayId) {\n this.identifiers.sessionReplayId = generateSessionReplayId(sessionId, deviceIdForReplayId);\n } else {\n this.loggerProvider.error('Must provide either session replay id or session id when starting a new session.');\n return;\n }\n\n this.stopRecordingAndSendEvents(this.identifiers.sessionId);\n this.identifiers.sessionId = sessionId;\n this.eventsManager && this.eventsManager.resetSequence();\n this.recordEvents();\n }\n\n getSessionReplayDebugPropertyValue() {\n let apiKeyHash = '';\n if (this.config) {\n apiKeyHash = generateHashCode(this.config.apiKey).toString();\n }\n return JSON.stringify({\n appHash: apiKeyHash,\n });\n }\n\n getSessionReplayProperties() {\n if (!this.config || !this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot get session recording properties.');\n return {};\n }\n\n // If the user is in debug mode, ignore the focus handler when tagging events.\n // this is a common mishap when someone is developing locally and not seeing events getting tagged.\n const ignoreFocus = !!this.config.debugMode;\n const shouldRecord = this.getShouldRecord(ignoreFocus);\n\n if (shouldRecord) {\n const eventProperties: { [key: string]: string | null } = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: this.identifiers.sessionReplayId ? this.identifiers.sessionReplayId : null,\n };\n if (this.config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = this.getSessionReplayDebugPropertyValue();\n }\n return eventProperties;\n }\n\n return {};\n }\n\n blurListener = () => {\n this.stopRecordingAndSendEvents();\n };\n\n focusListener = () => {\n void this.initialize();\n };\n\n stopRecordingAndSendEvents(sessionId?: number) {\n this.stopRecordingEvents();\n\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return;\n }\n\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n deviceId &&\n (await this.eventsManager.initialize({\n sessionId: this.identifiers.sessionId,\n shouldSendStoredEvents,\n deviceId,\n }));\n\n this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord(ignoreFocus = false) {\n if (!this.identifiers || !this.config) {\n this.loggerProvider.error(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n const globalScope = getGlobalScope();\n if (!ignoreFocus && globalScope && globalScope.document && !globalScope.document.hasFocus()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} temporarily not recording due to lack of browser focus.`,\n );\n }\n return false;\n } else if (this.shouldOptOut()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n }\n return false;\n } else if (!this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return false;\n }\n\n const isInSample = isSessionInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`);\n }\n return isInSample;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n return this.config?.privacyConfig?.blockSelector;\n }\n\n recordEvents() {\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId) {\n return;\n }\n this.stopRecordingEvents();\n this.recordCancelCallback = record({\n emit: (event) => {\n const globalScope = getGlobalScope();\n if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !this.getShouldRecord()) {\n this.stopRecordingAndSendEvents();\n return;\n }\n const eventString = JSON.stringify(event);\n const deviceId = this.getDeviceId();\n deviceId && this.eventsManager && this.eventsManager.addEvent({ event: eventString, sessionId, deviceId });\n },\n packFn: pack,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n // rrweb only exposes array type through its types, but arrays are also be supported. #class, ['#class', 'id']\n blockSelector: this.getBlockSelectors() as string,\n maskInputFn,\n recordCanvas: false,\n errorHandler: (error) => {\n const typedError = error as Error;\n this.loggerProvider.warn('Error while recording: ', typedError.toString());\n\n return true;\n },\n });\n }\n\n stopRecordingEvents = () => {\n try {\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping recording: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n let identityStoreDeviceId: string | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreDeviceId = identityStore.getIdentity().deviceId;\n }\n\n return identityStoreDeviceId || this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n if (this.eventsManager) {\n return this.eventsManager.flush(useRetry);\n }\n }\n\n shutdown() {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n }\n\n this.stopRecordingAndSendEvents();\n }\n}\n"]}
@@ -7,7 +7,7 @@ export declare class SessionReplay implements AmplitudeSessionReplay {
7
7
  identifiers: ISessionIdentifiers | undefined;
8
8
  eventsManager: AmplitudeSessionReplayEventsManager | undefined;
9
9
  loggerProvider: ILogger;
10
- stopRecordingEvents: ReturnType<typeof record> | null;
10
+ recordCancelCallback: ReturnType<typeof record> | null;
11
11
  constructor();
12
12
  init(apiKey: string, options: SessionReplayOptions): import("@amplitude/analytics-types").AmplitudeReturn<void>;
13
13
  protected _init(apiKey: string, options: SessionReplayOptions): Promise<void>;
@@ -24,6 +24,7 @@ export declare class SessionReplay implements AmplitudeSessionReplay {
24
24
  getShouldRecord(ignoreFocus?: boolean): boolean;
25
25
  getBlockSelectors(): string | string[] | undefined;
26
26
  recordEvents(): void;
27
+ stopRecordingEvents: () => void;
27
28
  getDeviceId(): string | undefined;
28
29
  getSessionId(): number | undefined;
29
30
  flush(useRetry?: boolean): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAQ,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAWhD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EACjE,kBAAkB,IAAI,mBAAmB,EACzC,mBAAmB,IAAI,oBAAoB,EAC3C,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,IAAI,SAAuC;IAC3C,MAAM,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,mCAAmC,GAAG,SAAS,CAAC;IAC/D,cAAc,EAAE,OAAO,CAAC;IACxB,mBAAmB,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,IAAI,CAAQ;;IAM7D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;cAIlC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAsBnE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAwBjD,kCAAkC;IAUlC,0BAA0B;;;IAwB1B,YAAY,aAEV;IAEF,aAAa,aAEX;IAEF,0BAA0B,CAAC,SAAS,CAAC,EAAE,MAAM;IAiBvC,UAAU,CAAC,sBAAsB,UAAQ;IAkB/C,YAAY;IAUZ,eAAe,CAAC,WAAW,UAAQ;IA8BnC,iBAAiB,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlD,YAAY;IAkCZ,WAAW;IAUX,YAAY;IAIN,KAAK,CAAC,QAAQ,UAAQ;IAM5B,QAAQ;CAST"}
1
+ {"version":3,"file":"session-replay.d.ts","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAQ,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAWhD,OAAO,EACL,sBAAsB,EACtB,0BAA0B,IAAI,mCAAmC,EACjE,kBAAkB,IAAI,mBAAmB,EACzC,mBAAmB,IAAI,oBAAoB,EAC3C,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,IAAI,SAAuC;IAC3C,MAAM,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACzC,WAAW,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC7C,aAAa,EAAE,mCAAmC,GAAG,SAAS,CAAC;IAC/D,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,UAAU,CAAC,OAAO,MAAM,CAAC,GAAG,IAAI,CAAQ;;IAM9D,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;cAIlC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB;IAsBnE,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IAwBjD,kCAAkC;IAUlC,0BAA0B;;;IAwB1B,YAAY,aAEV;IAEF,aAAa,aAEX;IAEF,0BAA0B,CAAC,SAAS,CAAC,EAAE,MAAM;IAWvC,UAAU,CAAC,sBAAsB,UAAQ;IAkB/C,YAAY;IAUZ,eAAe,CAAC,WAAW,UAAQ;IA8BnC,iBAAiB,IAAI,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAIlD,YAAY;IAmCZ,mBAAmB,aAQjB;IAEF,WAAW;IAUX,YAAY;IAIN,KAAK,CAAC,QAAQ,UAAQ;IAM5B,QAAQ;CAST"}
@@ -11,13 +11,23 @@ var SessionReplay = /** @class */ (function () {
11
11
  function SessionReplay() {
12
12
  var _this = this;
13
13
  this.name = '@amplitude/session-replay-browser';
14
- this.stopRecordingEvents = null;
14
+ this.recordCancelCallback = null;
15
15
  this.blurListener = function () {
16
16
  _this.stopRecordingAndSendEvents();
17
17
  };
18
18
  this.focusListener = function () {
19
19
  void _this.initialize();
20
20
  };
21
+ this.stopRecordingEvents = function () {
22
+ try {
23
+ _this.recordCancelCallback && _this.recordCancelCallback();
24
+ _this.recordCancelCallback = null;
25
+ }
26
+ catch (error) {
27
+ var typedError = error;
28
+ _this.loggerProvider.warn("Error occurred while stopping recording: ".concat(typedError.toString()));
29
+ }
30
+ };
21
31
  this.loggerProvider = new Logger();
22
32
  }
23
33
  SessionReplay.prototype.init = function (apiKey, options) {
@@ -105,14 +115,7 @@ var SessionReplay = /** @class */ (function () {
105
115
  };
106
116
  SessionReplay.prototype.stopRecordingAndSendEvents = function (sessionId) {
107
117
  var _a;
108
- try {
109
- this.stopRecordingEvents && this.stopRecordingEvents();
110
- this.stopRecordingEvents = null;
111
- }
112
- catch (error) {
113
- var typedError = error;
114
- this.loggerProvider.warn("Error occurred while stopping recording: ".concat(typedError.toString()));
115
- }
118
+ this.stopRecordingEvents();
116
119
  var sessionIdToSend = sessionId || ((_a = this.identifiers) === null || _a === void 0 ? void 0 : _a.sessionId);
117
120
  var deviceId = this.getDeviceId();
118
121
  this.eventsManager &&
@@ -202,7 +205,8 @@ var SessionReplay = /** @class */ (function () {
202
205
  if (!shouldRecord || !sessionId) {
203
206
  return;
204
207
  }
205
- this.stopRecordingEvents = record({
208
+ this.stopRecordingEvents();
209
+ this.recordCancelCallback = record({
206
210
  emit: function (event) {
207
211
  var globalScope = getGlobalScope();
208
212
  if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !_this.getShouldRecord()) {
@@ -1 +1 @@
1
- {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAnalyticsConnector, getGlobalScope } from '@amplitude/analytics-client-common';\nimport { Logger, returnWrapper } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { pack, record } from '@amplitude/rrweb';\nimport { SessionReplayConfig } from './config';\nimport {\n BLOCK_CLASS,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { SessionReplayEventsManager } from './events-manager';\nimport { generateHashCode, generateSessionReplayId, isSessionInSample, maskInputFn } from './helpers';\nimport { SessionIdentifiers } from './identifiers';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayConfig as ISessionReplayConfig,\n SessionReplayOptions,\n} from './typings/session-replay';\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: ISessionReplayConfig | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager | undefined;\n loggerProvider: ILogger;\n stopRecordingEvents: ReturnType<typeof record> | null = null;\n\n constructor() {\n this.loggerProvider = new Logger();\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.config = new SessionReplayConfig(apiKey, options);\n this.loggerProvider = this.config.loggerProvider;\n this.identifiers = new SessionIdentifiers(options, this.loggerProvider);\n\n this.eventsManager = new SessionReplayEventsManager({\n config: this.config,\n });\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.addEventListener('blur', this.blurListener);\n globalScope.addEventListener('focus', this.focusListener);\n }\n\n if (globalScope && globalScope.document && globalScope.document.hasFocus()) {\n await this.initialize(true);\n }\n }\n\n setSessionId(sessionId: number, deviceId?: string) {\n if (!this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot set session id.');\n return;\n }\n\n if (deviceId) {\n this.identifiers.deviceId = deviceId;\n }\n // use a consistent device id.\n const deviceIdForReplayId = this.getDeviceId();\n if (sessionId && deviceIdForReplayId) {\n this.identifiers.sessionReplayId = generateSessionReplayId(sessionId, deviceIdForReplayId);\n } else {\n this.loggerProvider.error('Must provide either session replay id or session id when starting a new session.');\n return;\n }\n\n this.stopRecordingAndSendEvents(this.identifiers.sessionId);\n this.identifiers.sessionId = sessionId;\n this.eventsManager && this.eventsManager.resetSequence();\n this.recordEvents();\n }\n\n getSessionReplayDebugPropertyValue() {\n let apiKeyHash = '';\n if (this.config) {\n apiKeyHash = generateHashCode(this.config.apiKey).toString();\n }\n return JSON.stringify({\n appHash: apiKeyHash,\n });\n }\n\n getSessionReplayProperties() {\n if (!this.config || !this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot get session recording properties.');\n return {};\n }\n\n // If the user is in debug mode, ignore the focus handler when tagging events.\n // this is a common mishap when someone is developing locally and not seeing events getting tagged.\n const ignoreFocus = !!this.config.debugMode;\n const shouldRecord = this.getShouldRecord(ignoreFocus);\n\n if (shouldRecord) {\n const eventProperties: { [key: string]: string | null } = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: this.identifiers.sessionReplayId ? this.identifiers.sessionReplayId : null,\n };\n if (this.config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = this.getSessionReplayDebugPropertyValue();\n }\n return eventProperties;\n }\n\n return {};\n }\n\n blurListener = () => {\n this.stopRecordingAndSendEvents();\n };\n\n focusListener = () => {\n void this.initialize();\n };\n\n stopRecordingAndSendEvents(sessionId?: number) {\n try {\n this.stopRecordingEvents && this.stopRecordingEvents();\n this.stopRecordingEvents = null;\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping recording: ${typedError.toString()}`);\n }\n\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return;\n }\n\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n deviceId &&\n (await this.eventsManager.initialize({\n sessionId: this.identifiers.sessionId,\n shouldSendStoredEvents,\n deviceId,\n }));\n\n this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord(ignoreFocus = false) {\n if (!this.identifiers || !this.config) {\n this.loggerProvider.error(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n const globalScope = getGlobalScope();\n if (!ignoreFocus && globalScope && globalScope.document && !globalScope.document.hasFocus()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} temporarily not recording due to lack of browser focus.`,\n );\n }\n return false;\n } else if (this.shouldOptOut()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n }\n return false;\n } else if (!this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return false;\n }\n\n const isInSample = isSessionInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`);\n }\n return isInSample;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n return this.config?.privacyConfig?.blockSelector;\n }\n\n recordEvents() {\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId) {\n return;\n }\n this.stopRecordingEvents = record({\n emit: (event) => {\n const globalScope = getGlobalScope();\n if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !this.getShouldRecord()) {\n this.stopRecordingAndSendEvents();\n return;\n }\n const eventString = JSON.stringify(event);\n const deviceId = this.getDeviceId();\n deviceId && this.eventsManager && this.eventsManager.addEvent({ event: eventString, sessionId, deviceId });\n },\n packFn: pack,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n // rrweb only exposes array type through its types, but arrays are also be supported. #class, ['#class', 'id']\n blockSelector: this.getBlockSelectors() as string,\n maskInputFn,\n recordCanvas: false,\n errorHandler: (error) => {\n const typedError = error as Error;\n this.loggerProvider.warn('Error while recording: ', typedError.toString());\n\n return true;\n },\n });\n }\n\n getDeviceId() {\n let identityStoreDeviceId: string | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreDeviceId = identityStore.getIdentity().deviceId;\n }\n\n return identityStoreDeviceId || this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n if (this.eventsManager) {\n return this.eventsManager.flush(useRetry);\n }\n }\n\n shutdown() {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n }\n\n this.stopRecordingAndSendEvents();\n }\n}\n"]}
1
+ {"version":3,"file":"session-replay.js","sourceRoot":"","sources":["../../src/session-replay.ts"],"names":[],"mappings":"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","sourcesContent":["import { getAnalyticsConnector, getGlobalScope } from '@amplitude/analytics-client-common';\nimport { Logger, returnWrapper } from '@amplitude/analytics-core';\nimport { Logger as ILogger } from '@amplitude/analytics-types';\nimport { pack, record } from '@amplitude/rrweb';\nimport { SessionReplayConfig } from './config';\nimport {\n BLOCK_CLASS,\n DEFAULT_SESSION_REPLAY_PROPERTY,\n MASK_TEXT_CLASS,\n SESSION_REPLAY_DEBUG_PROPERTY,\n} from './constants';\nimport { SessionReplayEventsManager } from './events-manager';\nimport { generateHashCode, generateSessionReplayId, isSessionInSample, maskInputFn } from './helpers';\nimport { SessionIdentifiers } from './identifiers';\nimport {\n AmplitudeSessionReplay,\n SessionReplayEventsManager as AmplitudeSessionReplayEventsManager,\n SessionIdentifiers as ISessionIdentifiers,\n SessionReplayConfig as ISessionReplayConfig,\n SessionReplayOptions,\n} from './typings/session-replay';\n\nexport class SessionReplay implements AmplitudeSessionReplay {\n name = '@amplitude/session-replay-browser';\n config: ISessionReplayConfig | undefined;\n identifiers: ISessionIdentifiers | undefined;\n eventsManager: AmplitudeSessionReplayEventsManager | undefined;\n loggerProvider: ILogger;\n recordCancelCallback: ReturnType<typeof record> | null = null;\n\n constructor() {\n this.loggerProvider = new Logger();\n }\n\n init(apiKey: string, options: SessionReplayOptions) {\n return returnWrapper(this._init(apiKey, options));\n }\n\n protected async _init(apiKey: string, options: SessionReplayOptions) {\n this.config = new SessionReplayConfig(apiKey, options);\n this.loggerProvider = this.config.loggerProvider;\n this.identifiers = new SessionIdentifiers(options, this.loggerProvider);\n\n this.eventsManager = new SessionReplayEventsManager({\n config: this.config,\n });\n\n this.loggerProvider.log('Installing @amplitude/session-replay-browser.');\n\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.addEventListener('blur', this.blurListener);\n globalScope.addEventListener('focus', this.focusListener);\n }\n\n if (globalScope && globalScope.document && globalScope.document.hasFocus()) {\n await this.initialize(true);\n }\n }\n\n setSessionId(sessionId: number, deviceId?: string) {\n if (!this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot set session id.');\n return;\n }\n\n if (deviceId) {\n this.identifiers.deviceId = deviceId;\n }\n // use a consistent device id.\n const deviceIdForReplayId = this.getDeviceId();\n if (sessionId && deviceIdForReplayId) {\n this.identifiers.sessionReplayId = generateSessionReplayId(sessionId, deviceIdForReplayId);\n } else {\n this.loggerProvider.error('Must provide either session replay id or session id when starting a new session.');\n return;\n }\n\n this.stopRecordingAndSendEvents(this.identifiers.sessionId);\n this.identifiers.sessionId = sessionId;\n this.eventsManager && this.eventsManager.resetSequence();\n this.recordEvents();\n }\n\n getSessionReplayDebugPropertyValue() {\n let apiKeyHash = '';\n if (this.config) {\n apiKeyHash = generateHashCode(this.config.apiKey).toString();\n }\n return JSON.stringify({\n appHash: apiKeyHash,\n });\n }\n\n getSessionReplayProperties() {\n if (!this.config || !this.identifiers) {\n this.loggerProvider.error('Session replay init has not been called, cannot get session recording properties.');\n return {};\n }\n\n // If the user is in debug mode, ignore the focus handler when tagging events.\n // this is a common mishap when someone is developing locally and not seeing events getting tagged.\n const ignoreFocus = !!this.config.debugMode;\n const shouldRecord = this.getShouldRecord(ignoreFocus);\n\n if (shouldRecord) {\n const eventProperties: { [key: string]: string | null } = {\n [DEFAULT_SESSION_REPLAY_PROPERTY]: this.identifiers.sessionReplayId ? this.identifiers.sessionReplayId : null,\n };\n if (this.config.debugMode) {\n eventProperties[SESSION_REPLAY_DEBUG_PROPERTY] = this.getSessionReplayDebugPropertyValue();\n }\n return eventProperties;\n }\n\n return {};\n }\n\n blurListener = () => {\n this.stopRecordingAndSendEvents();\n };\n\n focusListener = () => {\n void this.initialize();\n };\n\n stopRecordingAndSendEvents(sessionId?: number) {\n this.stopRecordingEvents();\n\n const sessionIdToSend = sessionId || this.identifiers?.sessionId;\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n sessionIdToSend &&\n deviceId &&\n this.eventsManager.sendEvents({ sessionId: sessionIdToSend, deviceId });\n }\n\n async initialize(shouldSendStoredEvents = false) {\n if (!this.identifiers?.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return;\n }\n\n const deviceId = this.getDeviceId();\n this.eventsManager &&\n deviceId &&\n (await this.eventsManager.initialize({\n sessionId: this.identifiers.sessionId,\n shouldSendStoredEvents,\n deviceId,\n }));\n\n this.recordEvents();\n }\n\n shouldOptOut() {\n let identityStoreOptOut: boolean | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreOptOut = identityStore.getIdentity().optOut;\n }\n\n return identityStoreOptOut !== undefined ? identityStoreOptOut : this.config?.optOut;\n }\n\n getShouldRecord(ignoreFocus = false) {\n if (!this.identifiers || !this.config) {\n this.loggerProvider.error(`Session is not being recorded due to lack of config, please call sessionReplay.init.`);\n return false;\n }\n const globalScope = getGlobalScope();\n if (!ignoreFocus && globalScope && globalScope.document && !globalScope.document.hasFocus()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(\n `Session ${this.identifiers.sessionId} temporarily not recording due to lack of browser focus.`,\n );\n }\n return false;\n } else if (this.shouldOptOut()) {\n if (this.identifiers.sessionId) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to optOut config.`);\n }\n return false;\n } else if (!this.identifiers.sessionId) {\n this.loggerProvider.warn(`Session is not being recorded due to lack of session id.`);\n return false;\n }\n\n const isInSample = isSessionInSample(this.identifiers.sessionId, this.config.sampleRate);\n if (!isInSample) {\n this.loggerProvider.log(`Opting session ${this.identifiers.sessionId} out of recording due to sample rate.`);\n }\n return isInSample;\n }\n\n getBlockSelectors(): string | string[] | undefined {\n return this.config?.privacyConfig?.blockSelector;\n }\n\n recordEvents() {\n const shouldRecord = this.getShouldRecord();\n const sessionId = this.identifiers?.sessionId;\n if (!shouldRecord || !sessionId) {\n return;\n }\n this.stopRecordingEvents();\n this.recordCancelCallback = record({\n emit: (event) => {\n const globalScope = getGlobalScope();\n if ((globalScope && globalScope.document && !globalScope.document.hasFocus()) || !this.getShouldRecord()) {\n this.stopRecordingAndSendEvents();\n return;\n }\n const eventString = JSON.stringify(event);\n const deviceId = this.getDeviceId();\n deviceId && this.eventsManager && this.eventsManager.addEvent({ event: eventString, sessionId, deviceId });\n },\n packFn: pack,\n maskAllInputs: true,\n maskTextClass: MASK_TEXT_CLASS,\n blockClass: BLOCK_CLASS,\n // rrweb only exposes array type through its types, but arrays are also be supported. #class, ['#class', 'id']\n blockSelector: this.getBlockSelectors() as string,\n maskInputFn,\n recordCanvas: false,\n errorHandler: (error) => {\n const typedError = error as Error;\n this.loggerProvider.warn('Error while recording: ', typedError.toString());\n\n return true;\n },\n });\n }\n\n stopRecordingEvents = () => {\n try {\n this.recordCancelCallback && this.recordCancelCallback();\n this.recordCancelCallback = null;\n } catch (error) {\n const typedError = error as Error;\n this.loggerProvider.warn(`Error occurred while stopping recording: ${typedError.toString()}`);\n }\n };\n\n getDeviceId() {\n let identityStoreDeviceId: string | undefined;\n if (this.config?.instanceName) {\n const identityStore = getAnalyticsConnector(this.config.instanceName).identityStore;\n identityStoreDeviceId = identityStore.getIdentity().deviceId;\n }\n\n return identityStoreDeviceId || this.identifiers?.deviceId;\n }\n\n getSessionId() {\n return this.identifiers?.sessionId;\n }\n\n async flush(useRetry = false) {\n if (this.eventsManager) {\n return this.eventsManager.flush(useRetry);\n }\n }\n\n shutdown() {\n const globalScope = getGlobalScope();\n if (globalScope) {\n globalScope.removeEventListener('blur', this.blurListener);\n globalScope.removeEventListener('focus', this.focusListener);\n }\n\n this.stopRecordingAndSendEvents();\n }\n}\n"]}