posthog-js 1.77.2 → 1.78.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.
package/lib/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.77.2",
3
+ "version": "1.78.0",
4
4
  "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.",
5
5
  "repository": "https://github.com/PostHog/posthog-js",
6
6
  "author": "hey@posthog.com",
@@ -24,6 +24,7 @@ export declare class SessionRecording {
24
24
  recorderVersion?: string;
25
25
  isIdle: boolean;
26
26
  constructor(instance: PostHog);
27
+ private getSessionManager;
27
28
  startRecordingIfEnabled(): void;
28
29
  started(): boolean;
29
30
  stopRecording(): void;
@@ -96,6 +96,13 @@ var SessionRecording = /** @class */ (function () {
96
96
  _this._flushBuffer();
97
97
  });
98
98
  }
99
+ SessionRecording.prototype.getSessionManager = function () {
100
+ if (!this.instance.sessionManager) {
101
+ logger.error('Session recording started without valid sessionManager');
102
+ return;
103
+ }
104
+ return this.instance.sessionManager;
105
+ };
99
106
  SessionRecording.prototype.startRecordingIfEnabled = function () {
100
107
  if (this.isRecordingEnabled()) {
101
108
  this.startCaptureAndTrySendingQueuedSnapshots();
@@ -178,14 +185,18 @@ var SessionRecording = /** @class */ (function () {
178
185
  };
179
186
  SessionRecording.prototype._startCapture = function () {
180
187
  var _this = this;
181
- // According to the rrweb docs, rrweb is not supported on IE11 and below:
182
- // "rrweb does not support IE11 and below because it uses the MutationObserver API which was supported by these browsers."
183
- // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note
184
- //
185
- // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.
186
- // Instead, when we load "recorder.js", the first JS error is about "Object.assign" being undefined.
187
- // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.
188
+ var sessionManager = this.getSessionManager();
189
+ if (!sessionManager) {
190
+ return;
191
+ }
188
192
  if (typeof Object.assign === 'undefined') {
193
+ // According to the rrweb docs, rrweb is not supported on IE11 and below:
194
+ // "rrweb does not support IE11 and below because it uses the MutationObserver API which was supported by these browsers."
195
+ // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note
196
+ //
197
+ // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.
198
+ // Instead, when we load "recorder.js", the first JS error is about "Object.assign" being undefined.
199
+ // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.
189
200
  return;
190
201
  }
191
202
  // We do not switch recorder versions midway through a recording.
@@ -194,7 +205,7 @@ var SessionRecording = /** @class */ (function () {
194
205
  }
195
206
  this.captureStarted = true;
196
207
  // We want to ensure the sessionManager is reset if necessary on load of the recorder
197
- this.instance.sessionManager.checkAndGetSessionAndWindowId();
208
+ sessionManager.checkAndGetSessionAndWindowId();
198
209
  var recorderJS = this.getRecordingVersion() === 'v2' ? 'recorder-v2.js' : 'recorder.js';
199
210
  // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is
200
211
  // imported) or matches the requested recorder version, don't load script. Otherwise, remotely import
@@ -216,6 +227,10 @@ var SessionRecording = /** @class */ (function () {
216
227
  return event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE && ACTIVE_SOURCES.indexOf((_a = event.data) === null || _a === void 0 ? void 0 : _a.source) !== -1;
217
228
  };
218
229
  SessionRecording.prototype._updateWindowAndSessionIds = function (event) {
230
+ var sessionManager = this.getSessionManager();
231
+ if (!sessionManager) {
232
+ return;
233
+ }
219
234
  // Some recording events are triggered by non-user events (e.g. "X minutes ago" text updating on the screen).
220
235
  // We don't want to extend the session or trigger a new session in these cases. These events are designated by event
221
236
  // type -> incremental update, and source -> mutation.
@@ -238,7 +253,7 @@ var SessionRecording = /** @class */ (function () {
238
253
  return;
239
254
  }
240
255
  // We only want to extend the session if it is an interactive event.
241
- var _a = this.instance.sessionManager.checkAndGetSessionAndWindowId(!isUserInteraction, event.timestamp), windowId = _a.windowId, sessionId = _a.sessionId;
256
+ var _a = sessionManager.checkAndGetSessionAndWindowId(!isUserInteraction, event.timestamp), windowId = _a.windowId, sessionId = _a.sessionId;
242
257
  if ([FULL_SNAPSHOT_EVENT_TYPE, META_EVENT_TYPE].indexOf(event.type) === -1 &&
243
258
  (this.windowId !== windowId || this.sessionId !== sessionId)) {
244
259
  this._tryTakeFullSnapshot();
@@ -1 +1 @@
1
- {"version":3,"file":"sessionrecording.js","sourceRoot":"","sources":["../../../src/extensions/sessionrecording.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EACH,yCAAyC,EACzC,qCAAqC,EACrC,8CAA8C,GACjD,MAAM,cAAc,CAAA;AACrB,OAAO,EACH,oBAAoB,EACpB,wBAAwB,EACxB,+BAA+B,EAC/B,eAAe,EACf,mBAAmB,EAGnB,wBAAwB,GAC3B,MAAM,0BAA0B,CAAA;AAIjC,OAAO,MAAM,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAEzD,IAAM,aAAa,GAAG,KAAK,CAAA;AAE3B,MAAM,CAAC,IAAM,kCAAkC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAA,CAAC,YAAY;AAC5E,MAAM,CAAC,IAAM,wBAAwB,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,CAAA,CAAC,+BAA+B;AACzF,MAAM,CAAC,IAAM,wBAAwB,GAAG,IAAI,CAAA,CAAC,YAAY;AACzD,MAAM,CAAC,IAAM,2BAA2B,GAAG,kBAAkB,CAAA;AAE7D,oHAAoH;AACpH,+CAA+C;AAC/C,2DAA2D;AAE3D,4CAA4C;AAC5C,IAAK,iBAiBJ;AAjBD,WAAK,iBAAiB;IAClB,iEAAY,CAAA;IACZ,mEAAa,CAAA;IACb,iFAAoB,CAAA;IACpB,6DAAU,CAAA;IACV,6EAAkB,CAAA;IAClB,2DAAS,CAAA;IACT,mEAAa,CAAA;IACb,iFAAoB,CAAA;IACpB,6EAAkB,CAAA;IAClB,6EAAkB,CAAA;IAClB,0DAAS,CAAA;IACT,wDAAQ,CAAA;IACR,0DAAS,CAAA;IACT,kFAAqB,CAAA;IACrB,oEAAc,CAAA;IACd,oFAAsB,CAAA;AAC1B,CAAC,EAjBI,iBAAiB,KAAjB,iBAAiB,QAiBrB;AAED,IAAM,cAAc,GAAG;IACnB,iBAAiB,CAAC,SAAS;IAC3B,iBAAiB,CAAC,gBAAgB;IAClC,iBAAiB,CAAC,MAAM;IACxB,iBAAiB,CAAC,cAAc;IAChC,iBAAiB,CAAC,KAAK;IACvB,iBAAiB,CAAC,SAAS;IAC3B,iBAAiB,CAAC,gBAAgB;IAClC,iBAAiB,CAAC,IAAI;CACzB,CAAA;AAED;IAwBI,0BAAY,QAAiB;QAA7B,iBAcC;QAhCO,0BAAqB,GAAW,IAAI,CAAC,GAAG,EAAE,CAAA;QAgBlD,WAAM,GAAG,KAAK,CAAA;QAGV,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;QAC3B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA,CAAC,qDAAqD;QACvE,IAAI,CAAC,QAAQ,GAAG,aAAa,CAAA;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACpB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;QACrB,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;QAE3B,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE;YACpC,KAAI,CAAC,YAAY,EAAE,CAAA;QACvB,CAAC,CAAC,CAAA;IACN,CAAC;IAED,kDAAuB,GAAvB;QACI,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;YAC3B,IAAI,CAAC,wCAAwC,EAAE,CAAA;SAClD;aAAM;YACH,IAAI,CAAC,aAAa,EAAE,CAAA;SACvB;IACL,CAAC;IAED,kCAAO,GAAP;QACI,OAAO,IAAI,CAAC,cAAc,CAAA;IAC9B,CAAC;IAED,wCAAa,GAAb;QACI,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE;YACvC,IAAI,CAAC,SAAS,EAAE,CAAA;YAChB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;YAC1B,IAAI,CAAC,cAAc,GAAG,KAAK,CAAA;SAC9B;IACL,CAAC;IAED,6CAAkB,GAAlB;QACI,IAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,qCAAqC,CAAC,CAAA;QAC/F,IAAM,mBAAmB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAA;QAClF,OAAO,mBAAmB,IAAI,mBAAmB,CAAA;IACrD,CAAC;IAED,qDAA0B,GAA1B;QACI,IAAM,mBAAmB,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,yCAAyC,CAAC,CAAA;QACnG,IAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAA;QACpF,OAAO,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,mBAAmB,CAAA;IACrD,CAAC;IAED,8CAAmB,GAAnB;;QACI,IAAM,4BAA4B,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,8CAA8C,CAAC,CAAA;QAC/G,IAAM,4BAA4B,GAAG,MAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,mBAAmB,CAAC,0CAAE,eAAe,CAAA;QACnG,OAAO,4BAA4B,IAAI,4BAA4B,IAAI,IAAI,CAAA;IAC/E,CAAC;IAED,8CAAmB,GAAnB,UAAoB,QAAwB;;;QACxC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;YAC3B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ;gBAC9B,GAAC,qCAAqC,IAAG,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;gBACvE,GAAC,yCAAyC,IAAG,MAAA,QAAQ,CAAC,gBAAgB,0CAAE,0BAA0B;gBAClG,GAAC,8CAA8C,IAAG,MAAA,QAAQ,CAAC,gBAAgB,0CAAE,eAAe;oBAC9F,CAAA;SACL;QACD,IAAI,MAAA,QAAQ,CAAC,gBAAgB,0CAAE,QAAQ,EAAE;YACrC,IAAI,CAAC,QAAQ,GAAG,MAAA,QAAQ,CAAC,gBAAgB,0CAAE,QAAQ,CAAA;SACtD;QAED,IAAI,MAAA,QAAQ,CAAC,gBAAgB,0CAAE,eAAe,EAAE;YAC5C,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,gBAAgB,CAAC,eAAe,CAAA;SACnE;QACD,IAAI,CAAC,uBAAuB,EAAE,CAAA;IAClC,CAAC;IAED,8BAAG,GAAH,UAAI,OAAe,EAAE,KAAuC;;QAAvC,sBAAA,EAAA,aAAuC;QACxD,MAAA,IAAI,CAAC,QAAQ,CAAC,gBAAgB,0CAAE,WAAW,CAAC;YACxC,IAAI,EAAE,CAAC;YACP,IAAI,EAAE;gBACF,MAAM,EAAE,iBAAiB;gBACzB,OAAO,EAAE;oBACL,KAAK,OAAA;oBACL,KAAK,EAAE,EAAE;oBACT,yEAAyE;oBACzE,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;iBACrC;aACJ;YACD,SAAS,EAAE,UAAU,EAAE;SAC1B,CAAC,CAAA;IACN,CAAC;IAEO,mEAAwC,GAAhD;QAAA,iBAQC;QAPG,yEAAyE;QACzE,wEAAwE;QACxE,IAAI,IAAI,CAAC,cAAc,EAAE;YACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;YAChB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,UAAC,UAAU,IAAK,OAAA,KAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,EAAzC,CAAyC,CAAC,CAAA;SACpF;QACD,IAAI,CAAC,aAAa,EAAE,CAAA;IACxB,CAAC;IAEO,wCAAa,GAArB;QAAA,iBAwCC;QAvCG,yEAAyE;QACzE,0HAA0H;QAC1H,4EAA4E;QAC5E,EAAE;QACF,2GAA2G;QAC3G,oGAAoG;QACpG,qGAAqG;QACrG,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,WAAW,EAAE;YACtC,OAAM;SACT;QAED,iEAAiE;QACjE,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE;YAC9E,OAAM;SACT;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAA;QAC1B,qFAAqF;QACrF,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,6BAA6B,EAAE,CAAA;QAE5D,IAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAA;QAEzF,oGAAoG;QACpG,qGAAqG;QACrG,oDAAoD;QACpD,IAAI,IAAI,CAAC,QAAQ,CAAC,yBAAyB,KAAK,IAAI,CAAC,mBAAmB,EAAE,EAAE;YACxE,UAAU,CACN,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,kBAAW,UAAU,gBAAM,MAAM,CAAC,WAAW,CAAE,EACtF,UAAC,GAAG;gBACA,IAAI,GAAG,EAAE;oBACL,OAAO,MAAM,CAAC,KAAK,CAAC,yBAAkB,UAAU,CAAE,EAAE,GAAG,CAAC,CAAA;iBAC3D;gBAED,KAAI,CAAC,eAAe,EAAE,CAAA;YAC1B,CAAC,CACJ,CAAA;SACJ;aAAM;YACH,IAAI,CAAC,eAAe,EAAE,CAAA;SACzB;IACL,CAAC;IAEO,8CAAmB,GAA3B,UAA4B,KAAoB;;QAC5C,OAAO,KAAK,CAAC,IAAI,KAAK,+BAA+B,IAAI,cAAc,CAAC,OAAO,CAAC,MAAA,KAAK,CAAC,IAAI,0CAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;IAC9G,CAAC;IAEO,qDAA0B,GAAlC,UAAmC,KAAoB;QACnD,6GAA6G;QAC7G,oHAAoH;QACpH,sDAAsD;QAEtD,IAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAEzD,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YACpC,iEAAiE;YACjE,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,qBAAqB,GAAG,kCAAkC,EAAE;gBACnF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;aACrB;SACJ;QAED,IAAI,iBAAiB,EAAE;YACnB,IAAI,CAAC,qBAAqB,GAAG,KAAK,CAAC,SAAS,CAAA;YAC5C,IAAI,IAAI,CAAC,MAAM,EAAE;gBACb,sGAAsG;gBACtG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;gBACnB,IAAI,CAAC,oBAAoB,EAAE,CAAA;aAC9B;SACJ;QAED,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,OAAM;SACT;QAED,oEAAoE;QAC9D,IAAA,KAA0B,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,6BAA6B,CACtF,CAAC,iBAAiB,EAClB,KAAK,CAAC,SAAS,CAClB,EAHO,QAAQ,cAAA,EAAE,SAAS,eAG1B,CAAA;QAED,IACI,CAAC,wBAAwB,EAAE,eAAe,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtE,CAAC,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,EAC9D;YACE,IAAI,CAAC,oBAAoB,EAAE,CAAA;SAC9B;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;IAC9B,CAAC;IAEO,+CAAoB,GAA5B;;QACI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;YACtB,OAAO,KAAK,CAAA;SACf;QACD,IAAI;YACA,MAAA,IAAI,CAAC,WAAW,0CAAE,gBAAgB,EAAE,CAAA;YACpC,OAAO,IAAI,CAAA;SACd;QAAC,OAAO,CAAC,EAAE;YACR,4GAA4G;YAC5G,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,CAAC,CAAC,CAAA;YAC9C,OAAO,KAAK,CAAA;SACf;IACL,CAAC;IAEO,0CAAe,GAAvB;;QAAA,iBAkFC;;QAjFG,6HAA6H;QAC7H,IAAM,uBAAuB,GAAiC;YAC1D,4DAA4D;YAC5D,6DAA6D;YAC7D,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,SAAS;YACxB,WAAW,EAAE,iBAAiB;YAC9B,aAAa,EAAE,SAAS;YACxB,gBAAgB,EAAE,SAAS;YAC3B,UAAU,EAAE,SAAS;YACrB,aAAa,EAAE,IAAI;YACnB,gBAAgB,EAAE,EAAE;YACpB,WAAW,EAAE,SAAS;YACtB,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,KAAK;YACnB,gBAAgB,EAAE,IAAI;YACtB,wBAAwB,EAAE,KAAK;SAClC,CAAA;QACD,qEAAqE;QACrE,kEAAkE;QAClE,6DAA6D;QAC7D,aAAa;QACb,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAA;QAE1E,oDAAoD;QACpD,IAAM,2BAA2B,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAA;;YACjF,KAA2B,IAAA,KAAA,SAAA,MAAM,CAAC,OAAO,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA,gBAAA,4BAAE;gBAAnE,IAAA,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;gBAClB,IAAI,GAAG,IAAI,uBAAuB,EAAE;oBAChC,6DAA6D;oBAC7D,aAAa;oBACb,uBAAuB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;iBACvC;aACJ;;;;;;;;;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACnB,MAAM,CAAC,KAAK,CACR,sGAAsG,CACzG,CAAA;YACD,OAAM;SACT;QAED,IAAI,CAAC,mBAAmB;YACpB,MAAA,IAAI,CAAC,mBAAmB,mCACxB,IAAI,mBAAmB,CAAC,IAAI,CAAC,WAAY,EAAE;gBACvC,aAAa,EAAE,UAAC,EAAE,EAAE,IAAI;oBACpB,IAAM,OAAO,GAAG,sCAA+B,EAAE,+EAA4E,CAAA;oBAC7H,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE;wBAChB,IAAI,EAAE,IAAI;qBACb,CAAC,CAAA;oBAEF,KAAI,CAAC,GAAG,CAAC,qBAAqB,GAAG,OAAO,EAAE,MAAM,CAAC,CAAA;gBACrD,CAAC;aACJ,CAAC,CAAA;QAEN,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,YAC7B,IAAI,EAAE,UAAC,KAAK;gBACR,KAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;YAC3B,CAAC,EACD,OAAO,EACF,MAAc,CAAC,kBAAkB,IAAI,IAAI,CAAC,0BAA0B,EAAE;gBACnE,CAAC,CAAC,CAAE,MAAc,CAAC,kBAAkB,CAAC,sBAAsB,EAAE,CAAC;gBAC/D,CAAC,CAAC,EAAE,IACT,uBAAuB,EAC5B,CAAA;QAEF,0HAA0H;QAC1H,wEAAwE;QACxE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,UAAC,SAAS;;YACpC,sGAAsG;YACtG,IAAI;gBACA,IAAI,SAAS,KAAK,WAAW,EAAE;oBAC3B,MAAA,KAAI,CAAC,WAAW,0CAAE,cAAc,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;iBAChF;aACJ;YAAC,OAAO,CAAC,EAAE;gBACR,MAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,CAAC,CAAC,CAAA;aAC9D;QACL,CAAC,CAAC,CAAA;QAEF,iEAAiE;QACjE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA;IACvB,CAAC;IAED,sCAAW,GAAX,UAAY,QAAuB;QAC/B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE;YAC3C,OAAM;SACT;QAED,IAAM,cAAc,GAAG,IAAI,CAAC,mBAAmB;YAC3C,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YACtD,CAAC,CAAC,QAAQ,CAAA;QAEd,IAAI,CAAC,cAAc,EAAE;YACjB,OAAM;SACT;QAEK,IAAA,KAAkB,oBAAoB,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,EAA9E,KAAK,WAAA,EAAE,IAAI,UAAmE,CAAA;QAEtF,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAA;QAEtC,IAAI,IAAI,CAAC,MAAM,EAAE;YACb,wEAAwE;YACxE,OAAM;SACT;QAED,IAAM,UAAU,GAAG;YACf,eAAe,EAAE,IAAI;YACrB,cAAc,EAAE,KAAK;YACrB,WAAW,EAAE,IAAI,CAAC,SAAS;YAC3B,UAAU,EAAE,IAAI,CAAC,QAAQ;SAC5B,CAAA;QAED,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;SAC5C;aAAM;YACH,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;SAClC;IACL,CAAC;IAEO,uCAAY,GAApB;QACI,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACvB,YAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;YACnC,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAA;SACpC;QAED,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9C,IAAI,CAAC,gBAAgB,CAAC;gBAClB,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACjC,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBAChC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;gBAClC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;aACnC,CAAC,CAAA;SACL;QAED,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;QAEvB,OAAO;YACH,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,EAAE;YACR,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;SAC1B,CAAA;IACL,CAAC;IAEO,mDAAwB,GAAhC,UAAiC,UAAsB;QAAvD,iBAkBC;;QAjBG,IAAM,eAAe,GAAG,CAAC,GAAG,CAAC,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,IAAI,CAAC,MAAM,KAAI,CAAC,CAAC,CAAA,CAAC,2DAA2D;QACvH,IACI,CAAC,IAAI,CAAC,MAAM;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,eAAe,GAAG,eAAe,GAAG,wBAAwB;YAC1F,IAAI,CAAC,MAAM,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAC1C;YACE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAA;SACpC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,eAAe,CAAA;QAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAA;QAEhD,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACxB,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC;gBAC/B,KAAI,CAAC,YAAY,EAAE,CAAA;YACvB,CAAC,EAAE,wBAAwB,CAAC,CAAA;SAC/B;IACL,CAAC;IAEO,2CAAgB,GAAxB,UAAyB,UAAsB;QAC3C,oGAAoG;QACpG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,EAAE;YAC3C,SAAS,EAAE,KAAK;YAChB,MAAM,EAAE,MAAM;YACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,2BAA2B;YACtC,QAAQ,EAAE;gBACN,mBAAmB,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI,KAAK,wBAAwB;aACnF;SACJ,CAAC,CAAA;IACN,CAAC;IACL,uBAAC;AAAD,CAAC,AApZD,IAoZC","sourcesContent":["import {\n CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE,\n} from '../constants'\nimport {\n ensureMaxMessageSize,\n FULL_SNAPSHOT_EVENT_TYPE,\n INCREMENTAL_SNAPSHOT_EVENT_TYPE,\n META_EVENT_TYPE,\n MutationRateLimiter,\n recordOptions,\n rrwebRecord,\n truncateLargeConsoleLogs,\n} from './sessionrecording-utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, Properties } from '../types'\nimport type { eventWithTime, listenerHandler } from '@rrweb/types'\nimport Config from '../config'\nimport { logger, loadScript, _timestamp } from '../utils'\n\nconst BASE_ENDPOINT = '/s/'\n\nexport const RECORDING_IDLE_ACTIVITY_TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes\nexport const RECORDING_MAX_EVENT_SIZE = 1024 * 1024 * 0.9 // ~1mb (with some wiggle room)\nexport const RECORDING_BUFFER_TIMEOUT = 2000 // 2 seconds\nexport const SESSION_RECORDING_BATCH_KEY = 'sessionRecording'\n\n// NOTE: Importing this type is problematic as we can't safely bundle it to a TS definition so, instead we redefine.\n// import type { record } from 'rrweb2/typings'\n// import type { recordOptions } from 'rrweb/typings/types'\n\n// Copied from rrweb typings to avoid import\nenum IncrementalSource {\n Mutation = 0,\n MouseMove = 1,\n MouseInteraction = 2,\n Scroll = 3,\n ViewportResize = 4,\n Input = 5,\n TouchMove = 6,\n MediaInteraction = 7,\n StyleSheetRule = 8,\n CanvasMutation = 9,\n Font = 10,\n Log = 11,\n Drag = 12,\n StyleDeclaration = 13,\n Selection = 14,\n AdoptedStyleSheet = 15,\n}\n\nconst ACTIVE_SOURCES = [\n IncrementalSource.MouseMove,\n IncrementalSource.MouseInteraction,\n IncrementalSource.Scroll,\n IncrementalSource.ViewportResize,\n IncrementalSource.Input,\n IncrementalSource.TouchMove,\n IncrementalSource.MediaInteraction,\n IncrementalSource.Drag,\n]\n\nexport class SessionRecording {\n private instance: PostHog\n private emit: boolean\n private endpoint: string\n private windowId: string | null\n private sessionId: string | null\n private lastActivityTimestamp: number = Date.now()\n private flushBufferTimer?: any\n private buffer?: {\n size: number\n data: any[]\n sessionId: string | null\n windowId: string | null\n }\n private mutationRateLimiter?: MutationRateLimiter\n\n captureStarted: boolean\n snapshots: any[]\n stopRrweb: listenerHandler | undefined\n receivedDecide: boolean\n rrwebRecord: rrwebRecord | undefined\n recorderVersion?: string\n isIdle = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.captureStarted = false\n this.snapshots = []\n this.emit = false // Controls whether data is sent to the server or not\n this.endpoint = BASE_ENDPOINT\n this.stopRrweb = undefined\n this.windowId = null\n this.sessionId = null\n this.receivedDecide = false\n\n window.addEventListener('beforeunload', () => {\n this._flushBuffer()\n })\n }\n\n startRecordingIfEnabled() {\n if (this.isRecordingEnabled()) {\n this.startCaptureAndTrySendingQueuedSnapshots()\n } else {\n this.stopRecording()\n }\n }\n\n started() {\n return this.captureStarted\n }\n\n stopRecording() {\n if (this.captureStarted && this.stopRrweb) {\n this.stopRrweb()\n this.stopRrweb = undefined\n this.captureStarted = false\n }\n }\n\n isRecordingEnabled() {\n const enabled_server_side = !!this.instance.get_property(SESSION_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = !this.instance.get_config('disable_session_recording')\n return enabled_server_side && enabled_client_side\n }\n\n isConsoleLogCaptureEnabled() {\n const enabled_server_side = !!this.instance.get_property(CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = this.instance.get_config('enable_recording_console_log')\n return enabled_client_side ?? enabled_server_side\n }\n\n getRecordingVersion() {\n const recordingVersion_server_side = this.instance.get_property(SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE)\n const recordingVersion_client_side = this.instance.get_config('session_recording')?.recorderVersion\n return recordingVersion_client_side || recordingVersion_server_side || 'v1'\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.receivedDecide = true\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [SESSION_RECORDING_ENABLED_SERVER_SIDE]: !!response['sessionRecording'],\n [CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE]: response.sessionRecording?.consoleLogRecordingEnabled,\n [SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE]: response.sessionRecording?.recorderVersion,\n })\n }\n if (response.sessionRecording?.endpoint) {\n this.endpoint = response.sessionRecording?.endpoint\n }\n\n if (response.sessionRecording?.recorderVersion) {\n this.recorderVersion = response.sessionRecording.recorderVersion\n }\n this.startRecordingIfEnabled()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n this.instance.sessionRecording?.onRRwebEmit({\n type: 6,\n data: {\n plugin: 'rrweb/console@1',\n payload: {\n level,\n trace: [],\n // Even though it is a string we stringify it as thats what rrweb expects\n payload: [JSON.stringify(message)],\n },\n },\n timestamp: _timestamp(),\n })\n }\n\n private startCaptureAndTrySendingQueuedSnapshots() {\n // Only submit data after we've received a decide response to account for\n // changing endpoints and the feature being disabled on the server side.\n if (this.receivedDecide) {\n this.emit = true\n this.snapshots.forEach((properties) => this._captureSnapshotBuffered(properties))\n }\n this._startCapture()\n }\n\n private _startCapture() {\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n if (typeof Object.assign === 'undefined') {\n return\n }\n\n // We do not switch recorder versions midway through a recording.\n if (this.captureStarted || this.instance.get_config('disable_session_recording')) {\n return\n }\n\n this.captureStarted = true\n // We want to ensure the sessionManager is reset if necessary on load of the recorder\n this.instance.sessionManager.checkAndGetSessionAndWindowId()\n\n const recorderJS = this.getRecordingVersion() === 'v2' ? 'recorder-v2.js' : 'recorder.js'\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported) or matches the requested recorder version, don't load script. Otherwise, remotely import\n // recorder.js from cdn since it hasn't been loaded.\n if (this.instance.__loaded_recorder_version !== this.getRecordingVersion()) {\n loadScript(\n this.instance.get_config('api_host') + `/static/${recorderJS}?v=${Config.LIB_VERSION}`,\n (err) => {\n if (err) {\n return logger.error(`Could not load ${recorderJS}`, err)\n }\n\n this._onScriptLoaded()\n }\n )\n } else {\n this._onScriptLoaded()\n }\n }\n\n private _isInteractiveEvent(event: eventWithTime) {\n return event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE && ACTIVE_SOURCES.indexOf(event.data?.source) !== -1\n }\n\n private _updateWindowAndSessionIds(event: eventWithTime) {\n // Some recording events are triggered by non-user events (e.g. \"X minutes ago\" text updating on the screen).\n // We don't want to extend the session or trigger a new session in these cases. These events are designated by event\n // type -> incremental update, and source -> mutation.\n\n const isUserInteraction = this._isInteractiveEvent(event)\n\n if (!isUserInteraction && !this.isIdle) {\n // We check if the lastActivityTimestamp is old enough to go idle\n if (event.timestamp - this.lastActivityTimestamp > RECORDING_IDLE_ACTIVITY_TIMEOUT_MS) {\n this.isIdle = true\n }\n }\n\n if (isUserInteraction) {\n this.lastActivityTimestamp = event.timestamp\n if (this.isIdle) {\n // Remove the idle state if set and trigger a full snapshot as we will have ingored previous mutations\n this.isIdle = false\n this._tryTakeFullSnapshot()\n }\n }\n\n if (this.isIdle) {\n return\n }\n\n // We only want to extend the session if it is an interactive event.\n const { windowId, sessionId } = this.instance.sessionManager.checkAndGetSessionAndWindowId(\n !isUserInteraction,\n event.timestamp\n )\n\n if (\n [FULL_SNAPSHOT_EVENT_TYPE, META_EVENT_TYPE].indexOf(event.type) === -1 &&\n (this.windowId !== windowId || this.sessionId !== sessionId)\n ) {\n this._tryTakeFullSnapshot()\n }\n this.windowId = windowId\n this.sessionId = sessionId\n }\n\n private _tryTakeFullSnapshot(): boolean {\n if (!this.captureStarted) {\n return false\n }\n try {\n this.rrwebRecord?.takeFullSnapshot()\n return true\n } catch (e) {\n // Sometimes a race can occur where the recorder is not fully started yet, so we can't take a full snapshot.\n logger.error('Error taking full snapshot.', e)\n return false\n }\n }\n\n private _onScriptLoaded() {\n // rrweb config info: https://github.com/rrweb-io/rrweb/blob/7d5d0033258d6c29599fb08412202d9a2c7b9413/src/record/index.ts#L28\n const sessionRecordingOptions: recordOptions<eventWithTime> = {\n // select set of rrweb config options we expose to our users\n // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n blockClass: 'ph-no-capture',\n blockSelector: undefined,\n ignoreClass: 'ph-ignore-input',\n maskTextClass: 'ph-mask',\n maskTextSelector: undefined,\n maskTextFn: undefined,\n maskAllInputs: true,\n maskInputOptions: {},\n maskInputFn: undefined,\n slimDOMOptions: {},\n collectFonts: false,\n inlineStylesheet: true,\n recordCrossOriginIframes: false,\n }\n // We switched from loading all of rrweb to just the record part, but\n // keep backwards compatibility if someone hasn't upgraded PostHog\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.rrwebRecord = window.rrweb ? window.rrweb.record : window.rrwebRecord\n\n // only allows user to set our 'allowlisted' options\n const userSessionRecordingOptions = this.instance.get_config('session_recording')\n for (const [key, value] of Object.entries(userSessionRecordingOptions || {})) {\n if (key in sessionRecordingOptions) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n sessionRecordingOptions[key] = value\n }\n }\n\n if (!this.rrwebRecord) {\n logger.error(\n 'onScriptLoaded was called but rrwebRecord is not available. This indicates something has gone wrong.'\n )\n return\n }\n\n this.mutationRateLimiter =\n this.mutationRateLimiter ??\n new MutationRateLimiter(this.rrwebRecord!, {\n onBlockedNode: (id, node) => {\n const message = `Too many mutations on node '${id}'. Rate limiting. This could be due to SVG animations or something similar`\n logger.log(message, {\n node: node,\n })\n\n this.log('[PostHog Recorder] ' + message, 'warn')\n },\n })\n\n this.stopRrweb = this.rrwebRecord({\n emit: (event) => {\n this.onRRwebEmit(event)\n },\n plugins:\n (window as any).rrwebConsoleRecord && this.isConsoleLogCaptureEnabled()\n ? [(window as any).rrwebConsoleRecord.getRecordConsolePlugin()]\n : [],\n ...sessionRecordingOptions,\n })\n\n // :TRICKY: rrweb does not capture navigation within SPA-s, so hook into our $pageview events to get access to all events.\n // Dropping the initial event is fine (it's always captured by rrweb).\n this.instance._addCaptureHook((eventName) => {\n // If anything could go wrong here it has the potential to block the main loop so we catch all errors.\n try {\n if (eventName === '$pageview') {\n this.rrwebRecord?.addCustomEvent('$pageview', { href: window.location.href })\n }\n } catch (e) {\n logger.error('Could not add $pageview to rrweb session', e)\n }\n })\n\n // We reset the last activity timestamp, resetting the idle timer\n this.lastActivityTimestamp = Date.now()\n this.isIdle = false\n }\n\n onRRwebEmit(rawEvent: eventWithTime) {\n if (!rawEvent || typeof rawEvent !== 'object') {\n return\n }\n\n const throttledEvent = this.mutationRateLimiter\n ? this.mutationRateLimiter.throttleMutations(rawEvent)\n : rawEvent\n\n if (!throttledEvent) {\n return\n }\n\n const { event, size } = ensureMaxMessageSize(truncateLargeConsoleLogs(throttledEvent))\n\n this._updateWindowAndSessionIds(event)\n\n if (this.isIdle) {\n // When in an idle state we keep recording, but don't capture the events\n return\n }\n\n const properties = {\n $snapshot_bytes: size,\n $snapshot_data: event,\n $session_id: this.sessionId,\n $window_id: this.windowId,\n }\n\n if (this.emit) {\n this._captureSnapshotBuffered(properties)\n } else {\n this.snapshots.push(properties)\n }\n }\n\n private _flushBuffer() {\n if (this.flushBufferTimer) {\n clearTimeout(this.flushBufferTimer)\n this.flushBufferTimer = undefined\n }\n\n if (this.buffer && this.buffer.data.length !== 0) {\n this._captureSnapshot({\n $snapshot_bytes: this.buffer.size,\n $snapshot_data: this.buffer.data,\n $session_id: this.buffer.sessionId,\n $window_id: this.buffer.windowId,\n })\n }\n\n this.buffer = undefined\n\n return {\n size: 0,\n data: [],\n sessionId: this.sessionId,\n windowId: this.windowId,\n }\n }\n\n private _captureSnapshotBuffered(properties: Properties) {\n const additionalBytes = 2 + (this.buffer?.data.length || 0) // 2 bytes for the array brackets and 1 byte for each comma\n if (\n !this.buffer ||\n this.buffer.size + properties.$snapshot_bytes + additionalBytes > RECORDING_MAX_EVENT_SIZE ||\n this.buffer.sessionId !== this.sessionId\n ) {\n this.buffer = this._flushBuffer()\n }\n\n this.buffer.size += properties.$snapshot_bytes\n this.buffer.data.push(properties.$snapshot_data)\n\n if (!this.flushBufferTimer) {\n this.flushBufferTimer = setTimeout(() => {\n this._flushBuffer()\n }, RECORDING_BUFFER_TIMEOUT)\n }\n }\n\n private _captureSnapshot(properties: Properties) {\n // :TRICKY: Make sure we batch these requests, use a custom endpoint and don't truncate the strings.\n this.instance.capture('$snapshot', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: this.endpoint,\n _noTruncate: true,\n _batchKey: SESSION_RECORDING_BATCH_KEY,\n _metrics: {\n rrweb_full_snapshot: properties.$snapshot_data.type === FULL_SNAPSHOT_EVENT_TYPE,\n },\n })\n }\n}\n"]}
1
+ {"version":3,"file":"sessionrecording.js","sourceRoot":"","sources":["../../../src/extensions/sessionrecording.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_ENABLED_SERVER_SIDE,\n SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE,\n} from '../constants'\nimport {\n ensureMaxMessageSize,\n FULL_SNAPSHOT_EVENT_TYPE,\n INCREMENTAL_SNAPSHOT_EVENT_TYPE,\n META_EVENT_TYPE,\n MutationRateLimiter,\n recordOptions,\n rrwebRecord,\n truncateLargeConsoleLogs,\n} from './sessionrecording-utils'\nimport { PostHog } from '../posthog-core'\nimport { DecideResponse, Properties } from '../types'\nimport type { eventWithTime, listenerHandler } from '@rrweb/types'\nimport Config from '../config'\nimport { logger, loadScript, _timestamp } from '../utils'\n\nconst BASE_ENDPOINT = '/s/'\n\nexport const RECORDING_IDLE_ACTIVITY_TIMEOUT_MS = 5 * 60 * 1000 // 5 minutes\nexport const RECORDING_MAX_EVENT_SIZE = 1024 * 1024 * 0.9 // ~1mb (with some wiggle room)\nexport const RECORDING_BUFFER_TIMEOUT = 2000 // 2 seconds\nexport const SESSION_RECORDING_BATCH_KEY = 'sessionRecording'\n\n// NOTE: Importing this type is problematic as we can't safely bundle it to a TS definition so, instead we redefine.\n// import type { record } from 'rrweb2/typings'\n// import type { recordOptions } from 'rrweb/typings/types'\n\n// Copied from rrweb typings to avoid import\nenum IncrementalSource {\n Mutation = 0,\n MouseMove = 1,\n MouseInteraction = 2,\n Scroll = 3,\n ViewportResize = 4,\n Input = 5,\n TouchMove = 6,\n MediaInteraction = 7,\n StyleSheetRule = 8,\n CanvasMutation = 9,\n Font = 10,\n Log = 11,\n Drag = 12,\n StyleDeclaration = 13,\n Selection = 14,\n AdoptedStyleSheet = 15,\n}\n\nconst ACTIVE_SOURCES = [\n IncrementalSource.MouseMove,\n IncrementalSource.MouseInteraction,\n IncrementalSource.Scroll,\n IncrementalSource.ViewportResize,\n IncrementalSource.Input,\n IncrementalSource.TouchMove,\n IncrementalSource.MediaInteraction,\n IncrementalSource.Drag,\n]\n\nexport class SessionRecording {\n private instance: PostHog\n private emit: boolean\n private endpoint: string\n private windowId: string | null\n private sessionId: string | null\n private lastActivityTimestamp: number = Date.now()\n private flushBufferTimer?: any\n private buffer?: {\n size: number\n data: any[]\n sessionId: string | null\n windowId: string | null\n }\n private mutationRateLimiter?: MutationRateLimiter\n\n captureStarted: boolean\n snapshots: any[]\n stopRrweb: listenerHandler | undefined\n receivedDecide: boolean\n rrwebRecord: rrwebRecord | undefined\n recorderVersion?: string\n isIdle = false\n\n constructor(instance: PostHog) {\n this.instance = instance\n this.captureStarted = false\n this.snapshots = []\n this.emit = false // Controls whether data is sent to the server or not\n this.endpoint = BASE_ENDPOINT\n this.stopRrweb = undefined\n this.windowId = null\n this.sessionId = null\n this.receivedDecide = false\n\n window.addEventListener('beforeunload', () => {\n this._flushBuffer()\n })\n }\n\n private getSessionManager() {\n if (!this.instance.sessionManager) {\n logger.error('Session recording started without valid sessionManager')\n return\n }\n\n return this.instance.sessionManager\n }\n\n startRecordingIfEnabled() {\n if (this.isRecordingEnabled()) {\n this.startCaptureAndTrySendingQueuedSnapshots()\n } else {\n this.stopRecording()\n }\n }\n\n started() {\n return this.captureStarted\n }\n\n stopRecording() {\n if (this.captureStarted && this.stopRrweb) {\n this.stopRrweb()\n this.stopRrweb = undefined\n this.captureStarted = false\n }\n }\n\n isRecordingEnabled() {\n const enabled_server_side = !!this.instance.get_property(SESSION_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = !this.instance.get_config('disable_session_recording')\n return enabled_server_side && enabled_client_side\n }\n\n isConsoleLogCaptureEnabled() {\n const enabled_server_side = !!this.instance.get_property(CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE)\n const enabled_client_side = this.instance.get_config('enable_recording_console_log')\n return enabled_client_side ?? enabled_server_side\n }\n\n getRecordingVersion() {\n const recordingVersion_server_side = this.instance.get_property(SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE)\n const recordingVersion_client_side = this.instance.get_config('session_recording')?.recorderVersion\n return recordingVersion_client_side || recordingVersion_server_side || 'v1'\n }\n\n afterDecideResponse(response: DecideResponse) {\n this.receivedDecide = true\n if (this.instance.persistence) {\n this.instance.persistence.register({\n [SESSION_RECORDING_ENABLED_SERVER_SIDE]: !!response['sessionRecording'],\n [CONSOLE_LOG_RECORDING_ENABLED_SERVER_SIDE]: response.sessionRecording?.consoleLogRecordingEnabled,\n [SESSION_RECORDING_RECORDER_VERSION_SERVER_SIDE]: response.sessionRecording?.recorderVersion,\n })\n }\n if (response.sessionRecording?.endpoint) {\n this.endpoint = response.sessionRecording?.endpoint\n }\n\n if (response.sessionRecording?.recorderVersion) {\n this.recorderVersion = response.sessionRecording.recorderVersion\n }\n this.startRecordingIfEnabled()\n }\n\n log(message: string, level: 'log' | 'warn' | 'error' = 'log') {\n this.instance.sessionRecording?.onRRwebEmit({\n type: 6,\n data: {\n plugin: 'rrweb/console@1',\n payload: {\n level,\n trace: [],\n // Even though it is a string we stringify it as thats what rrweb expects\n payload: [JSON.stringify(message)],\n },\n },\n timestamp: _timestamp(),\n })\n }\n\n private startCaptureAndTrySendingQueuedSnapshots() {\n // Only submit data after we've received a decide response to account for\n // changing endpoints and the feature being disabled on the server side.\n if (this.receivedDecide) {\n this.emit = true\n this.snapshots.forEach((properties) => this._captureSnapshotBuffered(properties))\n }\n this._startCapture()\n }\n\n private _startCapture() {\n const sessionManager = this.getSessionManager()\n if (!sessionManager) {\n return\n }\n if (typeof Object.assign === 'undefined') {\n // According to the rrweb docs, rrweb is not supported on IE11 and below:\n // \"rrweb does not support IE11 and below because it uses the MutationObserver API which was supported by these browsers.\"\n // https://github.com/rrweb-io/rrweb/blob/master/guide.md#compatibility-note\n //\n // However, MutationObserver does exist on IE11, it just doesn't work well and does not detect all changes.\n // Instead, when we load \"recorder.js\", the first JS error is about \"Object.assign\" being undefined.\n // Thus instead of MutationObserver, we look for this function and block recording if it's undefined.\n return\n }\n\n // We do not switch recorder versions midway through a recording.\n if (this.captureStarted || this.instance.get_config('disable_session_recording')) {\n return\n }\n\n this.captureStarted = true\n // We want to ensure the sessionManager is reset if necessary on load of the recorder\n sessionManager.checkAndGetSessionAndWindowId()\n\n const recorderJS = this.getRecordingVersion() === 'v2' ? 'recorder-v2.js' : 'recorder.js'\n\n // If recorder.js is already loaded (if array.full.js snippet is used or posthog-js/dist/recorder is\n // imported) or matches the requested recorder version, don't load script. Otherwise, remotely import\n // recorder.js from cdn since it hasn't been loaded.\n if (this.instance.__loaded_recorder_version !== this.getRecordingVersion()) {\n loadScript(\n this.instance.get_config('api_host') + `/static/${recorderJS}?v=${Config.LIB_VERSION}`,\n (err) => {\n if (err) {\n return logger.error(`Could not load ${recorderJS}`, err)\n }\n\n this._onScriptLoaded()\n }\n )\n } else {\n this._onScriptLoaded()\n }\n }\n\n private _isInteractiveEvent(event: eventWithTime) {\n return event.type === INCREMENTAL_SNAPSHOT_EVENT_TYPE && ACTIVE_SOURCES.indexOf(event.data?.source) !== -1\n }\n\n private _updateWindowAndSessionIds(event: eventWithTime) {\n const sessionManager = this.getSessionManager()\n if (!sessionManager) {\n return\n }\n // Some recording events are triggered by non-user events (e.g. \"X minutes ago\" text updating on the screen).\n // We don't want to extend the session or trigger a new session in these cases. These events are designated by event\n // type -> incremental update, and source -> mutation.\n\n const isUserInteraction = this._isInteractiveEvent(event)\n\n if (!isUserInteraction && !this.isIdle) {\n // We check if the lastActivityTimestamp is old enough to go idle\n if (event.timestamp - this.lastActivityTimestamp > RECORDING_IDLE_ACTIVITY_TIMEOUT_MS) {\n this.isIdle = true\n }\n }\n\n if (isUserInteraction) {\n this.lastActivityTimestamp = event.timestamp\n if (this.isIdle) {\n // Remove the idle state if set and trigger a full snapshot as we will have ingored previous mutations\n this.isIdle = false\n this._tryTakeFullSnapshot()\n }\n }\n\n if (this.isIdle) {\n return\n }\n\n // We only want to extend the session if it is an interactive event.\n const { windowId, sessionId } = sessionManager.checkAndGetSessionAndWindowId(\n !isUserInteraction,\n event.timestamp\n )\n\n if (\n [FULL_SNAPSHOT_EVENT_TYPE, META_EVENT_TYPE].indexOf(event.type) === -1 &&\n (this.windowId !== windowId || this.sessionId !== sessionId)\n ) {\n this._tryTakeFullSnapshot()\n }\n this.windowId = windowId\n this.sessionId = sessionId\n }\n\n private _tryTakeFullSnapshot(): boolean {\n if (!this.captureStarted) {\n return false\n }\n try {\n this.rrwebRecord?.takeFullSnapshot()\n return true\n } catch (e) {\n // Sometimes a race can occur where the recorder is not fully started yet, so we can't take a full snapshot.\n logger.error('Error taking full snapshot.', e)\n return false\n }\n }\n\n private _onScriptLoaded() {\n // rrweb config info: https://github.com/rrweb-io/rrweb/blob/7d5d0033258d6c29599fb08412202d9a2c7b9413/src/record/index.ts#L28\n const sessionRecordingOptions: recordOptions<eventWithTime> = {\n // select set of rrweb config options we expose to our users\n // see https://github.com/rrweb-io/rrweb/blob/master/guide.md\n blockClass: 'ph-no-capture',\n blockSelector: undefined,\n ignoreClass: 'ph-ignore-input',\n maskTextClass: 'ph-mask',\n maskTextSelector: undefined,\n maskTextFn: undefined,\n maskAllInputs: true,\n maskInputOptions: {},\n maskInputFn: undefined,\n slimDOMOptions: {},\n collectFonts: false,\n inlineStylesheet: true,\n recordCrossOriginIframes: false,\n }\n // We switched from loading all of rrweb to just the record part, but\n // keep backwards compatibility if someone hasn't upgraded PostHog\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.rrwebRecord = window.rrweb ? window.rrweb.record : window.rrwebRecord\n\n // only allows user to set our 'allowlisted' options\n const userSessionRecordingOptions = this.instance.get_config('session_recording')\n for (const [key, value] of Object.entries(userSessionRecordingOptions || {})) {\n if (key in sessionRecordingOptions) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n sessionRecordingOptions[key] = value\n }\n }\n\n if (!this.rrwebRecord) {\n logger.error(\n 'onScriptLoaded was called but rrwebRecord is not available. This indicates something has gone wrong.'\n )\n return\n }\n\n this.mutationRateLimiter =\n this.mutationRateLimiter ??\n new MutationRateLimiter(this.rrwebRecord!, {\n onBlockedNode: (id, node) => {\n const message = `Too many mutations on node '${id}'. Rate limiting. This could be due to SVG animations or something similar`\n logger.log(message, {\n node: node,\n })\n\n this.log('[PostHog Recorder] ' + message, 'warn')\n },\n })\n\n this.stopRrweb = this.rrwebRecord({\n emit: (event) => {\n this.onRRwebEmit(event)\n },\n plugins:\n (window as any).rrwebConsoleRecord && this.isConsoleLogCaptureEnabled()\n ? [(window as any).rrwebConsoleRecord.getRecordConsolePlugin()]\n : [],\n ...sessionRecordingOptions,\n })\n\n // :TRICKY: rrweb does not capture navigation within SPA-s, so hook into our $pageview events to get access to all events.\n // Dropping the initial event is fine (it's always captured by rrweb).\n this.instance._addCaptureHook((eventName) => {\n // If anything could go wrong here it has the potential to block the main loop so we catch all errors.\n try {\n if (eventName === '$pageview') {\n this.rrwebRecord?.addCustomEvent('$pageview', { href: window.location.href })\n }\n } catch (e) {\n logger.error('Could not add $pageview to rrweb session', e)\n }\n })\n\n // We reset the last activity timestamp, resetting the idle timer\n this.lastActivityTimestamp = Date.now()\n this.isIdle = false\n }\n\n onRRwebEmit(rawEvent: eventWithTime) {\n if (!rawEvent || typeof rawEvent !== 'object') {\n return\n }\n\n const throttledEvent = this.mutationRateLimiter\n ? this.mutationRateLimiter.throttleMutations(rawEvent)\n : rawEvent\n\n if (!throttledEvent) {\n return\n }\n\n const { event, size } = ensureMaxMessageSize(truncateLargeConsoleLogs(throttledEvent))\n\n this._updateWindowAndSessionIds(event)\n\n if (this.isIdle) {\n // When in an idle state we keep recording, but don't capture the events\n return\n }\n\n const properties = {\n $snapshot_bytes: size,\n $snapshot_data: event,\n $session_id: this.sessionId,\n $window_id: this.windowId,\n }\n\n if (this.emit) {\n this._captureSnapshotBuffered(properties)\n } else {\n this.snapshots.push(properties)\n }\n }\n\n private _flushBuffer() {\n if (this.flushBufferTimer) {\n clearTimeout(this.flushBufferTimer)\n this.flushBufferTimer = undefined\n }\n\n if (this.buffer && this.buffer.data.length !== 0) {\n this._captureSnapshot({\n $snapshot_bytes: this.buffer.size,\n $snapshot_data: this.buffer.data,\n $session_id: this.buffer.sessionId,\n $window_id: this.buffer.windowId,\n })\n }\n\n this.buffer = undefined\n\n return {\n size: 0,\n data: [],\n sessionId: this.sessionId,\n windowId: this.windowId,\n }\n }\n\n private _captureSnapshotBuffered(properties: Properties) {\n const additionalBytes = 2 + (this.buffer?.data.length || 0) // 2 bytes for the array brackets and 1 byte for each comma\n if (\n !this.buffer ||\n this.buffer.size + properties.$snapshot_bytes + additionalBytes > RECORDING_MAX_EVENT_SIZE ||\n this.buffer.sessionId !== this.sessionId\n ) {\n this.buffer = this._flushBuffer()\n }\n\n this.buffer.size += properties.$snapshot_bytes\n this.buffer.data.push(properties.$snapshot_data)\n\n if (!this.flushBufferTimer) {\n this.flushBufferTimer = setTimeout(() => {\n this._flushBuffer()\n }, RECORDING_BUFFER_TIMEOUT)\n }\n }\n\n private _captureSnapshot(properties: Properties) {\n // :TRICKY: Make sure we batch these requests, use a custom endpoint and don't truncate the strings.\n this.instance.capture('$snapshot', properties, {\n transport: 'XHR',\n method: 'POST',\n endpoint: this.endpoint,\n _noTruncate: true,\n _batchKey: SESSION_RECORDING_BATCH_KEY,\n _metrics: {\n rrweb_full_snapshot: properties.$snapshot_data.type === FULL_SNAPSHOT_EVENT_TYPE,\n },\n })\n }\n}\n"]}
@@ -20,19 +20,19 @@ export declare class PostHog {
20
20
  __loaded: boolean;
21
21
  __loaded_recorder_version: 'v1' | 'v2' | undefined;
22
22
  config: PostHogConfig;
23
- persistence: PostHogPersistence;
24
23
  rateLimiter: RateLimiter;
25
- sessionPersistence: PostHogPersistence;
26
- sessionManager: SessionIdManager;
27
24
  pageViewManager: PageViewManager;
28
25
  featureFlags: PostHogFeatureFlags;
29
26
  surveys: PostHogSurveys;
30
27
  toolbar: Toolbar;
31
- sessionRecording: SessionRecording | undefined;
32
- webPerformance: WebPerformanceObserver | undefined;
33
- exceptionAutocapture: ExceptionObserver | undefined;
34
- _requestQueue: RequestQueue;
35
- _retryQueue: RetryQueue;
28
+ persistence?: PostHogPersistence;
29
+ sessionPersistence?: PostHogPersistence;
30
+ sessionManager?: SessionIdManager;
31
+ _requestQueue?: RequestQueue;
32
+ _retryQueue?: RetryQueue;
33
+ sessionRecording?: SessionRecording;
34
+ webPerformance?: WebPerformanceObserver;
35
+ exceptionAutocapture?: ExceptionObserver;
36
36
  _triggered_notifs: any;
37
37
  compression: Partial<Record<Compression, boolean>>;
38
38
  _jsc: JSC;
@@ -106,6 +106,7 @@ var defaultConfig = function () {
106
106
  loaded: __NOOP,
107
107
  store_google: true,
108
108
  custom_campaign_params: [],
109
+ custom_blocked_useragents: [],
109
110
  save_referrer: true,
110
111
  test: false,
111
112
  verbose: false,
@@ -256,12 +257,6 @@ var PostHog = /** @class */ (function () {
256
257
  this.pageViewManager = new PageViewManager();
257
258
  this.surveys = new PostHogSurveys(this);
258
259
  this.rateLimiter = new RateLimiter();
259
- // these are created in _init() after we have the config
260
- this._requestQueue = undefined;
261
- this._retryQueue = undefined;
262
- this.persistence = undefined;
263
- this.sessionPersistence = undefined;
264
- this.sessionManager = undefined;
265
260
  // NOTE: See the property definition for deprecation notice
266
261
  this.people = {
267
262
  set: function (prop, to, callback) {
@@ -463,9 +458,10 @@ var PostHog = /** @class */ (function () {
463
458
  this.featureFlags.setReloadingPaused(false);
464
459
  };
465
460
  PostHog.prototype._start_queue_if_opted_in = function () {
461
+ var _a;
466
462
  if (!this.has_opted_out_capturing()) {
467
463
  if (this.get_config('request_batching')) {
468
- this._requestQueue.poll();
464
+ (_a = this._requestQueue) === null || _a === void 0 ? void 0 : _a.poll();
469
465
  }
470
466
  }
471
467
  };
@@ -513,6 +509,7 @@ var PostHog = /** @class */ (function () {
513
509
  }
514
510
  };
515
511
  PostHog.prototype._handle_unload = function () {
512
+ var _a, _b;
516
513
  if (!this.get_config('request_batching')) {
517
514
  if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {
518
515
  this.capture('$pageleave', null, { transport: 'sendBeacon' });
@@ -522,8 +519,8 @@ var PostHog = /** @class */ (function () {
522
519
  if (this.get_config('capture_pageview') && this.get_config('capture_pageleave')) {
523
520
  this.capture('$pageleave');
524
521
  }
525
- this._requestQueue.unload();
526
- this._retryQueue.unload();
522
+ (_a = this._requestQueue) === null || _a === void 0 ? void 0 : _a.unload();
523
+ (_b = this._retryQueue) === null || _b === void 0 ? void 0 : _b.unload();
527
524
  };
528
525
  PostHog.prototype._handle_queued_event = function (url, data, options) {
529
526
  var jsonData = JSON.stringify(data);
@@ -535,6 +532,9 @@ var PostHog = /** @class */ (function () {
535
532
  };
536
533
  PostHog.prototype._send_request = function (url, data, options, callback) {
537
534
  var _a;
535
+ if (!this.__loaded || !this._retryQueue) {
536
+ return;
537
+ }
538
538
  if (this.rateLimiter.isRateLimited(options._batchKey)) {
539
539
  if (this.get_config('debug')) {
540
540
  console.warn('[PostHog SendRequest] is quota limited. Dropping request.');
@@ -714,8 +714,8 @@ var PostHog = /** @class */ (function () {
714
714
  if (options === void 0) { options = __NOOPTIONS; }
715
715
  // While developing, a developer might purposefully _not_ call init(),
716
716
  // in this case, we would like capture to be a noop.
717
- if (!this.__loaded) {
718
- return;
717
+ if (!this.__loaded || !this.sessionPersistence || !this._requestQueue) {
718
+ return logger.unintializedWarning('posthog.capture');
719
719
  }
720
720
  if (userOptedOut(this, false)) {
721
721
  return;
@@ -730,7 +730,7 @@ var PostHog = /** @class */ (function () {
730
730
  console.error('No event name provided to posthog.capture');
731
731
  return;
732
732
  }
733
- if (_isBlockedUA(userAgent)) {
733
+ if (_isBlockedUA(userAgent, this.get_config('custom_blocked_useragents'))) {
734
734
  return;
735
735
  }
736
736
  // update persistence
@@ -777,6 +777,9 @@ var PostHog = /** @class */ (function () {
777
777
  _each(this.__captureHooks, function (callback) { return callback(eventName); });
778
778
  };
779
779
  PostHog.prototype._calculate_event_properties = function (event_name, event_properties) {
780
+ if (!this.persistence || !this.sessionPersistence) {
781
+ return event_properties;
782
+ }
780
783
  // set defaults
781
784
  var start_timestamp = this.persistence.remove_event_timer(event_name);
782
785
  var properties = __assign({}, event_properties);
@@ -860,7 +863,8 @@ var PostHog = /** @class */ (function () {
860
863
  * @param {Number} [days] How many days since the user's last visit to store the super properties
861
864
  */
862
865
  PostHog.prototype.register = function (properties, days) {
863
- this.persistence.register(properties, days);
866
+ var _a;
867
+ (_a = this.persistence) === null || _a === void 0 ? void 0 : _a.register(properties, days);
864
868
  };
865
869
  /**
866
870
  * Register a set of super properties only once. These will not
@@ -886,7 +890,8 @@ var PostHog = /** @class */ (function () {
886
890
  * @param {Number} [days] How many days since the users last visit to store the super properties
887
891
  */
888
892
  PostHog.prototype.register_once = function (properties, default_value, days) {
889
- this.persistence.register_once(properties, default_value, days);
893
+ var _a;
894
+ (_a = this.persistence) === null || _a === void 0 ? void 0 : _a.register_once(properties, default_value, days);
890
895
  };
891
896
  /**
892
897
  * Register a set of super properties, which are included with all events, but only
@@ -912,7 +917,8 @@ var PostHog = /** @class */ (function () {
912
917
  * @param {Object} properties An associative array of properties to store about the user
913
918
  */
914
919
  PostHog.prototype.register_for_session = function (properties) {
915
- this.sessionPersistence.register(properties);
920
+ var _a;
921
+ (_a = this.sessionPersistence) === null || _a === void 0 ? void 0 : _a.register(properties);
916
922
  };
917
923
  /**
918
924
  * Delete a super property stored with the current user.
@@ -920,7 +926,8 @@ var PostHog = /** @class */ (function () {
920
926
  * @param {String} property The name of the super property to remove
921
927
  */
922
928
  PostHog.prototype.unregister = function (property) {
923
- this.persistence.unregister(property);
929
+ var _a;
930
+ (_a = this.persistence) === null || _a === void 0 ? void 0 : _a.unregister(property);
924
931
  };
925
932
  /**
926
933
  * Delete a session super property stored with the current user.
@@ -928,7 +935,8 @@ var PostHog = /** @class */ (function () {
928
935
  * @param {String} property The name of the session super property to remove
929
936
  */
930
937
  PostHog.prototype.unregister_for_session = function (property) {
931
- this.sessionPersistence.unregister(property);
938
+ var _a;
939
+ (_a = this.sessionPersistence) === null || _a === void 0 ? void 0 : _a.unregister(property);
932
940
  };
933
941
  PostHog.prototype._register_single = function (prop, value) {
934
942
  var _a;
@@ -1022,7 +1030,8 @@ var PostHog = /** @class */ (function () {
1022
1030
  * @returns {Function} A function that can be called to unsubscribe the listener. E.g. Used by useEffect when the component unmounts.
1023
1031
  */
1024
1032
  PostHog.prototype.onSessionId = function (callback) {
1025
- return this.sessionManager.onSessionId(callback);
1033
+ var _a, _b;
1034
+ return (_b = (_a = this.sessionManager) === null || _a === void 0 ? void 0 : _a.onSessionId(callback)) !== null && _b !== void 0 ? _b : (function () { });
1026
1035
  };
1027
1036
  /** Get list of all surveys. */
1028
1037
  PostHog.prototype.getSurveys = function (callback, forceReload) {
@@ -1081,6 +1090,9 @@ var PostHog = /** @class */ (function () {
1081
1090
  * @param {Object} [userPropertiesToSetOnce] Optional: An associative array of properties to store about the user. If property is previously set, this does not override that value.
1082
1091
  */
1083
1092
  PostHog.prototype.identify = function (new_distinct_id, userPropertiesToSet, userPropertiesToSetOnce) {
1093
+ if (!this.__loaded || !this.persistence) {
1094
+ return logger.unintializedWarning('posthog.identify');
1095
+ }
1084
1096
  //if the new_distinct_id has not been set ignore the identify event
1085
1097
  if (!new_distinct_id) {
1086
1098
  console.error('Unique user id has not been set in posthog.identify');
@@ -1220,11 +1232,15 @@ var PostHog = /** @class */ (function () {
1220
1232
  * Useful for clearing data when a user logs out.
1221
1233
  */
1222
1234
  PostHog.prototype.reset = function (reset_device_id) {
1235
+ var _a, _b, _c, _d;
1236
+ if (!this.__loaded) {
1237
+ return logger.unintializedWarning('posthog.reset');
1238
+ }
1223
1239
  var device_id = this.get_property('$device_id');
1224
- this.persistence.clear();
1225
- this.sessionPersistence.clear();
1226
- this.persistence.set_user_state('anonymous');
1227
- this.sessionManager.resetSessionId();
1240
+ (_a = this.persistence) === null || _a === void 0 ? void 0 : _a.clear();
1241
+ (_b = this.sessionPersistence) === null || _b === void 0 ? void 0 : _b.clear();
1242
+ (_c = this.persistence) === null || _c === void 0 ? void 0 : _c.set_user_state('anonymous');
1243
+ (_d = this.sessionManager) === null || _d === void 0 ? void 0 : _d.resetSessionId();
1228
1244
  var uuid = this.get_config('get_device_id')(uuidv7());
1229
1245
  this.register_once({
1230
1246
  distinct_id: uuid,
@@ -1260,7 +1276,8 @@ var PostHog = /** @class */ (function () {
1260
1276
  * Any actual internal use case for the session_id should be handled by the sessionManager.
1261
1277
  */
1262
1278
  PostHog.prototype.get_session_id = function () {
1263
- return this.sessionManager.checkAndGetSessionAndWindowId(true).sessionId;
1279
+ var _a, _b;
1280
+ return (_b = (_a = this.sessionManager) === null || _a === void 0 ? void 0 : _a.checkAndGetSessionAndWindowId(true).sessionId) !== null && _b !== void 0 ? _b : '';
1264
1281
  };
1265
1282
  /**
1266
1283
  * Returns the Replay url for the current session.
@@ -1271,6 +1288,9 @@ var PostHog = /** @class */ (function () {
1271
1288
  */
1272
1289
  PostHog.prototype.get_session_replay_url = function (options) {
1273
1290
  var _a;
1291
+ if (!this.sessionManager) {
1292
+ return '';
1293
+ }
1274
1294
  var host = this.config.ui_host || this.config.api_host;
1275
1295
  var _b = this.sessionManager.checkAndGetSessionAndWindowId(true), sessionId = _b.sessionId, sessionStartTimestamp = _b.sessionStartTimestamp;
1276
1296
  var url = host + '/replay/' + sessionId;
@@ -1459,6 +1479,7 @@ var PostHog = /** @class */ (function () {
1459
1479
  * @param {Object} config A dictionary of new configuration values to update
1460
1480
  */
1461
1481
  PostHog.prototype.set_config = function (config) {
1482
+ var _a, _b;
1462
1483
  var oldConfig = __assign({}, this.config);
1463
1484
  if (_isObject(config)) {
1464
1485
  _extend(this.config, config);
@@ -1468,12 +1489,8 @@ var PostHog = /** @class */ (function () {
1468
1489
  if (!this.get_config('disable_persistence')) {
1469
1490
  this.config.disable_persistence = this.config.disable_cookie;
1470
1491
  }
1471
- if (this.persistence) {
1472
- this.persistence.update_config(this.config);
1473
- }
1474
- if (this.sessionPersistence) {
1475
- this.sessionPersistence.update_config(this.config);
1476
- }
1492
+ (_a = this.persistence) === null || _a === void 0 ? void 0 : _a.update_config(this.config);
1493
+ (_b = this.sessionPersistence) === null || _b === void 0 ? void 0 : _b.update_config(this.config);
1477
1494
  if (localStore.is_supported() && localStore.get('ph_debug') === 'true') {
1478
1495
  this.config.debug = true;
1479
1496
  }
@@ -1547,7 +1564,8 @@ var PostHog = /** @class */ (function () {
1547
1564
  * @param {String} property_name The name of the super property you want to retrieve
1548
1565
  */
1549
1566
  PostHog.prototype.get_property = function (property_name) {
1550
- return this.persistence['props'][property_name];
1567
+ var _a;
1568
+ return (_a = this.persistence) === null || _a === void 0 ? void 0 : _a['props'][property_name];
1551
1569
  };
1552
1570
  /**
1553
1571
  * Returns the value of the session super property named property_name. If no such
@@ -1569,7 +1587,8 @@ var PostHog = /** @class */ (function () {
1569
1587
  * @param {String} property_name The name of the session super property you want to retrieve
1570
1588
  */
1571
1589
  PostHog.prototype.getSessionProperty = function (property_name) {
1572
- return this.sessionPersistence['props'][property_name];
1590
+ var _a;
1591
+ return (_a = this.sessionPersistence) === null || _a === void 0 ? void 0 : _a['props'][property_name];
1573
1592
  };
1574
1593
  PostHog.prototype.toString = function () {
1575
1594
  var _a;
@@ -1617,6 +1636,7 @@ var PostHog = /** @class */ (function () {
1617
1636
  * @param {boolean} [options.enable_persistence] If true, will re-enable sdk persistence
1618
1637
  */
1619
1638
  PostHog.prototype._gdpr_update_persistence = function (options) {
1639
+ var _a, _b, _c, _d;
1620
1640
  var disabled;
1621
1641
  if (options && options['clear_persistence']) {
1622
1642
  disabled = true;
@@ -1627,11 +1647,11 @@ var PostHog = /** @class */ (function () {
1627
1647
  else {
1628
1648
  return;
1629
1649
  }
1630
- if (!this.get_config('disable_persistence') && this.persistence.disabled !== disabled) {
1631
- this.persistence.set_disabled(disabled);
1650
+ if (!this.get_config('disable_persistence') && ((_a = this.persistence) === null || _a === void 0 ? void 0 : _a.disabled) !== disabled) {
1651
+ (_b = this.persistence) === null || _b === void 0 ? void 0 : _b.set_disabled(disabled);
1632
1652
  }
1633
- if (!this.get_config('disable_persistence') && this.sessionPersistence.disabled !== disabled) {
1634
- this.sessionPersistence.set_disabled(disabled);
1653
+ if (!this.get_config('disable_persistence') && ((_c = this.sessionPersistence) === null || _c === void 0 ? void 0 : _c.disabled) !== disabled) {
1654
+ (_d = this.sessionPersistence) === null || _d === void 0 ? void 0 : _d.set_disabled(disabled);
1635
1655
  }
1636
1656
  };
1637
1657
  // call a base gdpr function after constructing the appropriate token and options args