@openreplay/tracker 3.5.16-beta.3 → 3.6.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/.eslintignore +8 -0
  2. package/.prettierignore +1 -0
  3. package/cjs/app/guards.d.ts +2 -1
  4. package/cjs/app/guards.js +6 -3
  5. package/cjs/app/index.d.ts +24 -22
  6. package/cjs/app/index.js +85 -85
  7. package/cjs/app/logger.js +6 -3
  8. package/cjs/app/messages.d.ts +52 -0
  9. package/cjs/app/messages.gen.d.ts +57 -0
  10. package/cjs/app/messages.gen.js +494 -0
  11. package/cjs/app/messages.js +235 -0
  12. package/cjs/app/nodes.d.ts +1 -1
  13. package/cjs/app/nodes.js +4 -7
  14. package/cjs/app/observer/iframe_observer.d.ts +1 -1
  15. package/cjs/app/observer/iframe_observer.js +3 -3
  16. package/cjs/app/observer/observer.d.ts +2 -2
  17. package/cjs/app/observer/observer.js +52 -46
  18. package/cjs/app/observer/shadow_root_observer.d.ts +1 -1
  19. package/cjs/app/observer/shadow_root_observer.js +3 -3
  20. package/cjs/app/observer/top_observer.d.ts +11 -2
  21. package/cjs/app/observer/top_observer.js +52 -23
  22. package/cjs/app/sanitizer.d.ts +1 -1
  23. package/cjs/app/sanitizer.js +5 -5
  24. package/cjs/app/session.d.ts +18 -2
  25. package/cjs/app/session.js +55 -6
  26. package/cjs/app/ticker.d.ts +1 -1
  27. package/cjs/common/{webworker.d.ts → interaction.d.ts} +5 -5
  28. package/cjs/common/{types.js → interaction.js} +0 -0
  29. package/cjs/common/messages.gen.d.ts +382 -0
  30. package/cjs/common/messages.gen.js +62 -0
  31. package/cjs/index.d.ts +10 -10
  32. package/cjs/index.js +42 -37
  33. package/cjs/modules/adoptedStyleSheets.d.ts +2 -0
  34. package/cjs/modules/adoptedStyleSheets.js +127 -0
  35. package/cjs/modules/connection.d.ts +1 -1
  36. package/cjs/modules/connection.js +2 -2
  37. package/cjs/modules/console.d.ts +1 -1
  38. package/cjs/modules/console.js +7 -21
  39. package/cjs/modules/cssrules.d.ts +1 -1
  40. package/cjs/modules/cssrules.js +18 -14
  41. package/cjs/modules/exception.d.ts +3 -3
  42. package/cjs/modules/exception.js +25 -20
  43. package/cjs/modules/img.d.ts +1 -1
  44. package/cjs/modules/img.js +39 -26
  45. package/cjs/modules/input.d.ts +1 -1
  46. package/cjs/modules/input.js +35 -31
  47. package/cjs/modules/mouse.d.ts +1 -1
  48. package/cjs/modules/mouse.js +50 -43
  49. package/cjs/modules/performance.d.ts +1 -1
  50. package/cjs/modules/performance.js +2 -2
  51. package/cjs/modules/scroll.d.ts +1 -1
  52. package/cjs/modules/scroll.js +16 -7
  53. package/cjs/modules/timing.d.ts +1 -1
  54. package/cjs/modules/timing.js +14 -26
  55. package/cjs/modules/viewport.d.ts +1 -1
  56. package/cjs/modules/viewport.js +4 -4
  57. package/cjs/utils.js +7 -7
  58. package/cjs/vendors/finder/finder.js +53 -48
  59. package/lib/app/guards.d.ts +2 -1
  60. package/lib/app/guards.js +4 -2
  61. package/lib/app/index.d.ts +24 -22
  62. package/lib/app/index.js +93 -93
  63. package/lib/app/logger.js +6 -3
  64. package/lib/app/messages.d.ts +52 -0
  65. package/lib/app/messages.gen.d.ts +57 -0
  66. package/lib/app/messages.gen.js +435 -0
  67. package/lib/app/messages.js +182 -0
  68. package/lib/app/nodes.d.ts +1 -1
  69. package/lib/app/nodes.js +4 -7
  70. package/lib/app/observer/iframe_observer.d.ts +1 -1
  71. package/lib/app/observer/iframe_observer.js +3 -3
  72. package/lib/app/observer/observer.d.ts +2 -2
  73. package/lib/app/observer/observer.js +53 -47
  74. package/lib/app/observer/shadow_root_observer.d.ts +1 -1
  75. package/lib/app/observer/shadow_root_observer.js +3 -3
  76. package/lib/app/observer/top_observer.d.ts +11 -2
  77. package/lib/app/observer/top_observer.js +56 -27
  78. package/lib/app/sanitizer.d.ts +1 -1
  79. package/lib/app/sanitizer.js +7 -7
  80. package/lib/app/session.d.ts +18 -2
  81. package/lib/app/session.js +55 -6
  82. package/lib/app/ticker.d.ts +1 -1
  83. package/lib/common/{webworker.d.ts → interaction.d.ts} +5 -5
  84. package/lib/common/{types.js → interaction.js} +0 -0
  85. package/lib/common/messages.gen.d.ts +382 -0
  86. package/lib/common/messages.gen.js +59 -0
  87. package/lib/common/tsconfig.tsbuildinfo +1 -1
  88. package/lib/index.d.ts +10 -10
  89. package/lib/index.js +55 -50
  90. package/lib/modules/adoptedStyleSheets.d.ts +2 -0
  91. package/lib/modules/adoptedStyleSheets.js +124 -0
  92. package/lib/modules/connection.d.ts +1 -1
  93. package/lib/modules/connection.js +2 -2
  94. package/lib/modules/console.d.ts +1 -1
  95. package/lib/modules/console.js +8 -22
  96. package/lib/modules/cssrules.d.ts +1 -1
  97. package/lib/modules/cssrules.js +19 -15
  98. package/lib/modules/exception.d.ts +3 -3
  99. package/lib/modules/exception.js +25 -20
  100. package/lib/modules/img.d.ts +1 -1
  101. package/lib/modules/img.js +41 -28
  102. package/lib/modules/input.d.ts +1 -1
  103. package/lib/modules/input.js +37 -33
  104. package/lib/modules/mouse.d.ts +1 -1
  105. package/lib/modules/mouse.js +53 -46
  106. package/lib/modules/performance.d.ts +1 -1
  107. package/lib/modules/performance.js +3 -3
  108. package/lib/modules/scroll.d.ts +1 -1
  109. package/lib/modules/scroll.js +17 -8
  110. package/lib/modules/timing.d.ts +1 -1
  111. package/lib/modules/timing.js +16 -28
  112. package/lib/modules/viewport.d.ts +1 -1
  113. package/lib/modules/viewport.js +4 -4
  114. package/lib/utils.js +7 -7
  115. package/lib/vendors/finder/finder.js +53 -48
  116. package/package.json +27 -10
  117. package/cjs/common/messages.d.ts +0 -444
  118. package/cjs/common/messages.js +0 -794
  119. package/cjs/common/types.d.ts +0 -9
  120. package/cjs/common/webworker.js +0 -2
  121. package/cjs/modules/longtasks.d.ts +0 -2
  122. package/cjs/modules/longtasks.js +0 -26
  123. package/lib/common/messages.d.ts +0 -444
  124. package/lib/common/messages.js +0 -790
  125. package/lib/common/types.d.ts +0 -9
  126. package/lib/common/webworker.js +0 -1
  127. package/lib/modules/longtasks.d.ts +0 -2
  128. package/lib/modules/longtasks.js +0 -23
package/.eslintignore ADDED
@@ -0,0 +1,8 @@
1
+ node_modules
2
+ npm-debug.log
3
+ lib
4
+ cjs
5
+ build
6
+ .cache
7
+ .eslintrc.cjs
8
+ *.gen.ts
@@ -0,0 +1 @@
1
+ *.gen.ts
@@ -1,7 +1,8 @@
1
1
  export declare function isSVGElement(node: Element): node is SVGElement;
2
2
  export declare function isElementNode(node: Node): node is Element;
3
3
  export declare function isTextNode(node: Node): node is Text;
4
- export declare function isRootNode(node: Node): boolean;
4
+ export declare function isDocument(node: Node): node is Document;
5
+ export declare function isRootNode(node: Node): node is Document | DocumentFragment;
5
6
  declare type TagTypeMap = {
6
7
  HTML: HTMLHtmlElement;
7
8
  IMG: HTMLImageElement;
package/cjs/app/guards.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.hasTag = exports.isRootNode = exports.isTextNode = exports.isElementNode = exports.isSVGElement = void 0;
3
+ exports.hasTag = exports.isRootNode = exports.isDocument = exports.isTextNode = exports.isElementNode = exports.isSVGElement = void 0;
4
4
  function isSVGElement(node) {
5
5
  return node.namespaceURI === 'http://www.w3.org/2000/svg';
6
6
  }
@@ -13,9 +13,12 @@ function isTextNode(node) {
13
13
  return node.nodeType === Node.TEXT_NODE;
14
14
  }
15
15
  exports.isTextNode = isTextNode;
16
+ function isDocument(node) {
17
+ return node.nodeType === Node.DOCUMENT_NODE;
18
+ }
19
+ exports.isDocument = isDocument;
16
20
  function isRootNode(node) {
17
- return node.nodeType === Node.DOCUMENT_NODE ||
18
- node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
21
+ return node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
19
22
  }
20
23
  exports.isRootNode = isRootNode;
21
24
  function hasTag(el, tagName) {
@@ -1,13 +1,15 @@
1
- import type Message from "../common/messages.js";
2
- import Nodes from "./nodes.js";
3
- import Sanitizer from "./sanitizer.js";
4
- import Ticker from "./ticker.js";
5
- import Logger from "./logger.js";
6
- import Session from "./session.js";
7
- import type { Options as ObserverOptions } from "./observer/top_observer.js";
8
- import type { Options as SanitizerOptions } from "./sanitizer.js";
9
- import type { Options as LoggerOptions } from "./logger.js";
10
- import type { Options as WebworkerOptions } from "../common/webworker.js";
1
+ import type Message from './messages.gen.js';
2
+ import Nodes from './nodes.js';
3
+ import Observer from './observer/top_observer.js';
4
+ import Sanitizer from './sanitizer.js';
5
+ import Ticker from './ticker.js';
6
+ import Logger from './logger.js';
7
+ import Session from './session.js';
8
+ import type { Options as ObserverOptions } from './observer/top_observer.js';
9
+ import type { Options as SanitizerOptions } from './sanitizer.js';
10
+ import type { Options as LoggerOptions } from './logger.js';
11
+ import type { Options as SessOptions } from './session.js';
12
+ import type { Options as WebworkerOptions } from '../common/interaction.js';
11
13
  export interface StartOptions {
12
14
  userID?: string;
13
15
  metadata?: Record<string, string>;
@@ -34,9 +36,9 @@ declare type CommitCallback = (messages: Array<Message>) => void;
34
36
  declare type AppOptions = {
35
37
  revID: string;
36
38
  node_id: string;
39
+ session_reset_key: string;
37
40
  session_token_key: string;
38
41
  session_pageno_key: string;
39
- session_reset_key: string;
40
42
  local_uuid_key: string;
41
43
  ingestPoint: string;
42
44
  resourceBaseHref: string | null;
@@ -44,10 +46,10 @@ declare type AppOptions = {
44
46
  __is_snippet: boolean;
45
47
  __debug_report_edp: string | null;
46
48
  __debug__?: LoggerOptions;
47
- localStorage: Storage;
48
- sessionStorage: Storage;
49
+ localStorage: Storage | null;
50
+ sessionStorage: Storage | null;
49
51
  onStart?: StartCallback;
50
- } & WebworkerOptions;
52
+ } & WebworkerOptions & SessOptions;
51
53
  export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
52
54
  export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
53
55
  export default class App {
@@ -61,36 +63,36 @@ export default class App {
61
63
  readonly localStorage: Storage;
62
64
  readonly sessionStorage: Storage;
63
65
  private readonly messages;
64
- private readonly observer;
66
+ readonly observer: Observer;
65
67
  private readonly startCallbacks;
66
68
  private readonly stopCallbacks;
67
69
  private readonly commitCallbacks;
68
70
  private readonly options;
69
71
  private readonly revID;
70
72
  private activityState;
71
- private version;
73
+ private readonly version;
72
74
  private readonly worker?;
73
- constructor(projectKey: string, sessionToken: string | null | undefined, options: Partial<Options>);
75
+ constructor(projectKey: string, sessionHash: string | undefined, options: Partial<Options>);
74
76
  private _debug;
75
77
  send(message: Message, urgent?: boolean): void;
76
78
  private commit;
77
79
  safe<T extends (...args: any[]) => void>(fn: T): T;
78
80
  attachCommitCallback(cb: CommitCallback): void;
79
81
  attachStartCallback(cb: StartCallback): void;
80
- attachStopCallback(cb: Function): void;
82
+ attachStopCallback(cb: () => any): void;
81
83
  attachEventListener(target: EventTarget, type: string, listener: EventListener, useSafe?: boolean, useCapture?: boolean): void;
82
84
  checkRequiredVersion(version: string): boolean;
83
- private getStartInfo;
85
+ private getTrackerInfo;
84
86
  getSessionInfo(): {
85
87
  userUUID: string | null;
86
88
  projectKey: string;
87
89
  revID: string;
88
- timestamp: number;
89
90
  trackerVersion: string;
90
91
  isSnippet: boolean;
91
- sessionID: string | null;
92
+ sessionID: string | undefined;
92
93
  metadata: Record<string, string>;
93
94
  userID: string | null;
95
+ timestamp: number;
94
96
  };
95
97
  getSessionToken(): string | undefined;
96
98
  getSessionID(): string | undefined;
@@ -103,7 +105,7 @@ export default class App {
103
105
  resetNextPageSession(flag: boolean): void;
104
106
  private _start;
105
107
  start(options?: StartOptions): Promise<StartPromiseReturn>;
106
- stop(calledFromAPI?: boolean, restarting?: boolean): void;
108
+ stop(stopWorker?: boolean): void;
107
109
  restart(): void;
108
110
  }
109
111
  export {};
package/cjs/app/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DEFAULT_INGEST_POINT = void 0;
4
- const messages_js_1 = require("../common/messages.js");
4
+ const messages_gen_js_1 = require("./messages.gen.js");
5
5
  const utils_js_1 = require("../utils.js");
6
6
  const nodes_js_1 = require("./nodes.js");
7
7
  const top_observer_js_1 = require("./observer/top_observer.js");
@@ -10,8 +10,8 @@ const ticker_js_1 = require("./ticker.js");
10
10
  const logger_js_1 = require("./logger.js");
11
11
  const session_js_1 = require("./session.js");
12
12
  const performance_js_1 = require("../modules/performance.js");
13
- const CANCELED = "canceled";
14
- const START_ERROR = ":(";
13
+ const CANCELED = 'canceled';
14
+ const START_ERROR = ':(';
15
15
  const UnsuccessfulStart = (reason) => ({ reason, success: false });
16
16
  const SuccessfulStart = (body) => (Object.assign(Object.assign({}, body), { success: true }));
17
17
  var ActivityState;
@@ -23,7 +23,7 @@ var ActivityState;
23
23
  // TODO: use backendHost only
24
24
  exports.DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest';
25
25
  class App {
26
- constructor(projectKey, sessionToken, options) {
26
+ constructor(projectKey, sessionHash, options) {
27
27
  // if (options.onStart !== undefined) {
28
28
  // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
29
29
  // } ?? maybe onStart is good
@@ -32,7 +32,7 @@ class App {
32
32
  this.stopCallbacks = [];
33
33
  this.commitCallbacks = [];
34
34
  this.activityState = ActivityState.NotActive;
35
- this.version = '3.5.16-beta.3'; // TODO: version compatability check inside each plugin.
35
+ this.version = '3.5.16'; // TODO: version compatability check inside each plugin.
36
36
  this.projectKey = projectKey;
37
37
  this.options = Object.assign({
38
38
  revID: '',
@@ -46,8 +46,8 @@ class App {
46
46
  verbose: false,
47
47
  __is_snippet: false,
48
48
  __debug_report_edp: null,
49
- localStorage: window.localStorage,
50
- sessionStorage: window.sessionStorage,
49
+ localStorage: null,
50
+ sessionStorage: null,
51
51
  }, options);
52
52
  this.revID = this.options.revID;
53
53
  this.sanitizer = new sanitizer_js_1.default(this, options);
@@ -57,32 +57,32 @@ class App {
57
57
  this.ticker.attach(() => this.commit());
58
58
  this.debug = new logger_js_1.default(this.options.__debug__);
59
59
  this.notify = new logger_js_1.default(this.options.verbose ? logger_js_1.LogLevel.Warnings : logger_js_1.LogLevel.Silent);
60
- this.session = new session_js_1.default();
60
+ this.localStorage = this.options.localStorage || window.localStorage;
61
+ this.sessionStorage = this.options.sessionStorage || window.sessionStorage;
62
+ this.session = new session_js_1.default(this, this.options);
61
63
  this.session.attachUpdateCallback(({ userID, metadata }) => {
62
- if (userID != null) { // TODO: nullable userID
63
- this.send(new messages_js_1.UserID(userID));
64
+ if (userID != null) {
65
+ // TODO: nullable userID
66
+ this.send((0, messages_gen_js_1.UserID)(userID));
64
67
  }
65
68
  if (metadata != null) {
66
- Object.entries(metadata).forEach(([key, value]) => this.send(new messages_js_1.Metadata(key, value)));
69
+ Object.entries(metadata).forEach(([key, value]) => this.send((0, messages_gen_js_1.Metadata)(key, value)));
67
70
  }
68
71
  });
69
- this.localStorage = this.options.localStorage;
70
- this.sessionStorage = this.options.sessionStorage;
71
- if (sessionToken != null) {
72
- this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
72
+ if (sessionHash != null) {
73
+ this.session.applySessionHash(sessionHash);
73
74
  }
74
75
  try {
75
- this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function i(...i){return new t(...i)}return i.prototype=t.prototype,i}const i=new Map;const s=t(class{constructor(t,i,s){this.pageNo=t,this.firstIndex=i,this.timestamp=s,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});i.set(80,s);const e=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});i.set(0,e);const n=t(class{constructor(t,i,s){this.url=t,this.referrer=i,this.navigationStart=s,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});i.set(4,n);const r=t(class{constructor(t,i){this.width=t,this.height=i,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});i.set(5,r);const h=t(class{constructor(t,i){this.x=t,this.y=i,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});i.set(6,h);const o=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});i.set(7,o);const c=t(class{constructor(t,i,s,e,n){this.id=t,this.parentID=i,this.index=s,this.tag=e,this.svg=n,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});i.set(8,c);const a=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(9,a);const u=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(10,u);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});i.set(11,d);const l=t(class{constructor(t,i,s){this.id=t,this.name=i,this.value=s,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});i.set(12,l);const p=t(class{constructor(t,i){this.id=t,this.name=i,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});i.set(13,p);const g=t(class{constructor(t,i){this.id=t,this.data=i,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});i.set(14,g);const m=t(class{constructor(t,i,s){this.id=t,this.x=i,this.y=s,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});i.set(16,m);const f=t(class{constructor(t,i){this.id=t,this.label=i,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});i.set(17,f);const y=t(class{constructor(t,i,s){this.id=t,this.value=i,this.mask=s,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});i.set(18,y);const _=t(class{constructor(t,i){this.id=t,this.checked=i,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});i.set(19,_);const v=t(class{constructor(t,i){this.x=t,this.y=i,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});i.set(20,v);const S=t(class{constructor(t,i){this.level=t,this.value=i,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});i.set(22,S);const b=t(class{constructor(t,i,s,e,n,r,h,o,c){this.requestStart=t,this.responseStart=i,this.responseEnd=s,this.domContentLoadedEventStart=e,this.domContentLoadedEventEnd=n,this.loadEventStart=r,this.loadEventEnd=h,this.firstPaint=o,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});i.set(23,b);const w=t(class{constructor(t,i,s){this.speedIndex=t,this.visuallyComplete=i,this.timeToInteractive=s,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});i.set(24,w);const E=t(class{constructor(t,i,s){this.name=t,this.message=i,this.payload=s,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});i.set(25,E);const x=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});i.set(27,x);const T=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});i.set(28,T);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});i.set(29,z);const k=t(class{constructor(t,i){this.key=t,this.value=i,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});i.set(30,k);const A=t(class{constructor(t,i,s){this.id=t,this.rule=i,this.index=s,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});i.set(37,A);const I=t(class{constructor(t,i){this.id=t,this.index=i,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});i.set(38,I);const L=t(class{constructor(t,i,s,e,n,r,h){this.method=t,this.url=i,this.request=s,this.response=e,this.status=n,this.timestamp=r,this.duration=h,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});i.set(39,L);const C=t(class{constructor(t,i,s,e){this.name=t,this.duration=i,this.args=s,this.result=e,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});i.set(40,C);const M=t(class{constructor(t,i){this.key=t,this.value=i,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});i.set(41,M);const N=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});i.set(42,N);const B=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(44,B);const U=t(class{constructor(t,i){this.mutation=t,this.state=i,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});i.set(45,U);const R=t(class{constructor(t,i){this.type=t,this.payload=i,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});i.set(46,R);const O=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(47,O);const P=t(class{constructor(t,i,s,e){this.operationKind=t,this.operationName=i,this.variables=s,this.response=e,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});i.set(48,P);const q=t(class{constructor(t,i,s,e){this.frames=t,this.ticks=i,this.totalJSHeapSize=s,this.usedJSHeapSize=e,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});i.set(49,q);const D=t(class{constructor(t,i,s,e,n,r,h,o){this.timestamp=t,this.duration=i,this.ttfb=s,this.headerSize=e,this.encodedBodySize=n,this.decodedBodySize=r,this.url=h,this.initiator=o,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});i.set(53,D);const W=t(class{constructor(t,i){this.downlink=t,this.type=i,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});i.set(54,W);const H=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});i.set(55,H);const J=t(class{constructor(t,i,s,e,n,r,h){this.timestamp=t,this.duration=i,this.context=s,this.containerType=e,this.containerSrc=n,this.containerId=r,this.containerName=h,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});i.set(59,J);const F=t(class{constructor(t,i,s,e){this.id=t,this.name=i,this.value=s,this.baseURL=e,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});i.set(60,F);const X=t(class{constructor(t,i,s){this.id=t,this.data=i,this.baseURL=s,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});i.set(61,X);const G=t(class{constructor(t,i){this.type=t,this.value=i,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});i.set(63,G);const K=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});i.set(64,K);const j=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});i.set(65,j);const Q=t(class{constructor(t,i,s,e){this.id=t,this.rule=i,this.index=s,this.baseURL=e,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});i.set(67,Q);const V=t(class{constructor(t,i,s,e){this.id=t,this.hesitationTime=i,this.label=s,this.selector=e,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});i.set(69,V);const Y=t(class{constructor(t,i){this.frameID=t,this.id=i,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});i.set(70,Y);class Z{constructor(t,i,s,e=10,n=1e3){this.onUnauthorised=i,this.onFailure=s,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();if(i.status>=400)return void this.retry(t);this.attemptsCount=0;const s=this.queue.shift();s?this.sendBatch(s):this.busy=!1}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0}}const tt="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(var n=0,r=0,h=0;h!==i;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===i){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;break}if(!((r=t.charCodeAt(h))>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(h+=1,(n=1024*(n-55296)+r-56320+65536)>65535){s[e+=1]=240|n>>>18,s[e+=1]=128|n>>>12&63,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n;continue}}n<=127?s[e+=1]=0|n:n<=2047?(s[e+=1]=192|n>>>6,s[e+=1]=128|63&n):(s[e+=1]=224|n>>>12,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n)}return s.subarray(0,e+1)}};class it{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const i=tt.encode(t),s=i.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(i,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}class st{constructor(t,i,s){this.pageNo=t,this.timestamp=i,this.onBatch=s,this.nextIndex=0,this.beaconSize=2e5,this.writer=new it(this.beaconSize),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}prepare(){this.writer.isEmpty()&&new s(this.pageNo,this.nextIndex,this.timestamp).encode(this.writer)}write(t){const i=t.encode(this.writer);return i&&(this.isEmpty=!1,this.writer.checkpoint(),this.nextIndex++),i}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){for(t instanceof e&&(this.timestamp=t.timestamp);!this.write(t);){if(this.finaliseBatch(),this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message."),this.writer.reset(),this.prepare(),void(this.isEmpty=!0);this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.writer=new it(this.beaconSize),this.prepare(),this.isEmpty=!0}}finaliseBatch(){this.isEmpty||(this.onBatch(this.writer.flush()),this.prepare(),this.isEmpty=!0)}clean(){this.writer.reset()}}var et;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(et||(et={}));let nt=null,rt=null;function ht(){rt&&rt.finaliseBatch()}function ot(){et.Stopping,null!==at&&(clearInterval(at),at=null),rt&&(rt.clean(),rt=null),et.NotActive}et.NotActive;let ct,at=null;self.onmessage=({data:t})=>{if(null!=t){if("stop"===t)return ht(),void ot();if(Array.isArray(t)){if(!rt)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const s=rt;t.forEach(t=>{const e=new(i.get(t._id));Object.assign(e,t),e instanceof H&&(e.hidden?ct=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ct)),s.writeMessage(e)})}else{if("start"===t.type)return et.Starting,nt=new Z(t.ingestPoint,()=>{self.postMessage("restart")},()=>{nt&&(nt.clean(),nt=null),ot(),self.postMessage("failed")},t.connAttemptCount,t.connAttemptGap),rt=new st(t.pageNo,t.timestamp,t=>nt&&nt.push(t)),null===at&&(at=setInterval(ht,1e4)),et.Active;if("auth"===t.type){if(!nt)throw new Error("WebWorker: sender not initialised. Received auth.");if(!rt)throw new Error("WebWorker: writer not initialised. Received auth.");return nt.authorise(t.token),void(t.beaconSizeLimit&&rt.setBeaconSizeLimit(t.beaconSizeLimit))}}}else ht()};
76
- `], { type: 'text/javascript' })));
77
- this.worker.onerror = e => {
78
- this._debug("webworker_error", e);
76
+ this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";var t;!function(t){t[t.BatchMetadata=81]="BatchMetadata",t[t.PartitionedMessage=82]="PartitionedMessage",t[t.Timestamp=0]="Timestamp",t[t.SetPageLocation=4]="SetPageLocation",t[t.SetViewportSize=5]="SetViewportSize",t[t.SetViewportScroll=6]="SetViewportScroll",t[t.CreateDocument=7]="CreateDocument",t[t.CreateElementNode=8]="CreateElementNode",t[t.CreateTextNode=9]="CreateTextNode",t[t.MoveNode=10]="MoveNode",t[t.RemoveNode=11]="RemoveNode",t[t.SetNodeAttribute=12]="SetNodeAttribute",t[t.RemoveNodeAttribute=13]="RemoveNodeAttribute",t[t.SetNodeData=14]="SetNodeData",t[t.SetNodeScroll=16]="SetNodeScroll",t[t.SetInputTarget=17]="SetInputTarget",t[t.SetInputValue=18]="SetInputValue",t[t.SetInputChecked=19]="SetInputChecked",t[t.MouseMove=20]="MouseMove",t[t.ConsoleLog=22]="ConsoleLog",t[t.PageLoadTiming=23]="PageLoadTiming",t[t.PageRenderTiming=24]="PageRenderTiming",t[t.JSException=25]="JSException",t[t.RawCustomEvent=27]="RawCustomEvent",t[t.UserID=28]="UserID",t[t.UserAnonymousID=29]="UserAnonymousID",t[t.Metadata=30]="Metadata",t[t.CSSInsertRule=37]="CSSInsertRule",t[t.CSSDeleteRule=38]="CSSDeleteRule",t[t.Fetch=39]="Fetch",t[t.Profiler=40]="Profiler",t[t.OTable=41]="OTable",t[t.StateAction=42]="StateAction",t[t.Redux=44]="Redux",t[t.Vuex=45]="Vuex",t[t.MobX=46]="MobX",t[t.NgRx=47]="NgRx",t[t.GraphQL=48]="GraphQL",t[t.PerformanceTrack=49]="PerformanceTrack",t[t.ResourceTiming=53]="ResourceTiming",t[t.ConnectionInformation=54]="ConnectionInformation",t[t.SetPageVisibility=55]="SetPageVisibility",t[t.LongTask=59]="LongTask",t[t.SetNodeAttributeURLBased=60]="SetNodeAttributeURLBased",t[t.SetCSSDataURLBased=61]="SetCSSDataURLBased",t[t.TechnicalInfo=63]="TechnicalInfo",t[t.CustomIssue=64]="CustomIssue",t[t.CSSInsertRuleURLBased=67]="CSSInsertRuleURLBased",t[t.MouseClick=69]="MouseClick",t[t.CreateIFrameDocument=70]="CreateIFrameDocument",t[t.AdoptedSSReplaceURLBased=71]="AdoptedSSReplaceURLBased",t[t.AdoptedSSInsertRuleURLBased=73]="AdoptedSSInsertRuleURLBased",t[t.AdoptedSSDeleteRule=75]="AdoptedSSDeleteRule",t[t.AdoptedSSAddOwner=76]="AdoptedSSAddOwner",t[t.AdoptedSSRemoveOwner=77]="AdoptedSSRemoveOwner"}(t||(t={}));class e{constructor(t,e,i,s=10,n=1e3){this.onUnauthorised=e,this.onFailure=i,this.MAX_ATTEMPTS_COUNT=s,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(e=>{if(401===e.status)return this.busy=!1,void this.onUnauthorised();if(e.status>=400)return void this.retry(t);this.attemptsCount=0;const i=this.queue.shift();i?this.sendBatch(i):this.busy=!1}).catch(e=>{console.warn("OpenReplay:",e),this.retry(t)})}clean(){this.queue.length=0}}const i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const e=t.length,i=new Uint8Array(3*e);let s=-1;for(let n=0,r=0,h=0;h!==e;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===e){i[s+=1]=239,i[s+=1]=191,i[s+=1]=189;break}if(r=t.charCodeAt(h),!(r>=56320&&r<=57343)){i[s+=1]=239,i[s+=1]=191,i[s+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>65535){i[s+=1]=240|n>>>18,i[s+=1]=128|n>>>12&63,i[s+=1]=128|n>>>6&63,i[s+=1]=128|63&n;continue}}n<=127?i[s+=1]=0|n:n<=2047?(i[s+=1]=192|n>>>6,i[s+=1]=128|63&n):(i[s+=1]=224|n>>>12,i[s+=1]=128|n>>>6&63,i[s+=1]=128|63&n)}return i.subarray(0,s+1)}};class s extends class{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}getCurrentOffset(){return this.offset}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}skip(t){return this.offset+=t,this.offset<=this.size}set(t,e){this.data.set(t,e)}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const e=i.encode(t),s=e.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(e,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(e){switch(e[0]){case t.BatchMetadata:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.int(e[4])&&this.string(e[5]);case t.PartitionedMessage:return this.uint(e[1])&&this.uint(e[2]);case t.Timestamp:return this.uint(e[1]);case t.SetPageLocation:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.SetViewportSize:return this.uint(e[1])&&this.uint(e[2]);case t.SetViewportScroll:return this.int(e[1])&&this.int(e[2]);case t.CreateDocument:return!0;case t.CreateElementNode:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.string(e[4])&&this.boolean(e[5]);case t.CreateTextNode:case t.MoveNode:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3]);case t.RemoveNode:return this.uint(e[1]);case t.SetNodeAttribute:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.RemoveNodeAttribute:case t.SetNodeData:return this.uint(e[1])&&this.string(e[2]);case t.SetNodeScroll:return this.uint(e[1])&&this.int(e[2])&&this.int(e[3]);case t.SetInputTarget:return this.uint(e[1])&&this.string(e[2]);case t.SetInputValue:return this.uint(e[1])&&this.string(e[2])&&this.int(e[3]);case t.SetInputChecked:return this.uint(e[1])&&this.boolean(e[2]);case t.MouseMove:return this.uint(e[1])&&this.uint(e[2]);case t.ConsoleLog:return this.string(e[1])&&this.string(e[2]);case t.PageLoadTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.uint(e[7])&&this.uint(e[8])&&this.uint(e[9]);case t.PageRenderTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3]);case t.JSException:return this.string(e[1])&&this.string(e[2])&&this.string(e[3]);case t.RawCustomEvent:return this.string(e[1])&&this.string(e[2]);case t.UserID:case t.UserAnonymousID:return this.string(e[1]);case t.Metadata:return this.string(e[1])&&this.string(e[2]);case t.CSSInsertRule:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.CSSDeleteRule:return this.uint(e[1])&&this.uint(e[2]);case t.Fetch:return this.string(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.uint(e[7]);case t.Profiler:return this.string(e[1])&&this.uint(e[2])&&this.string(e[3])&&this.string(e[4]);case t.OTable:return this.string(e[1])&&this.string(e[2]);case t.StateAction:return this.string(e[1]);case t.Redux:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.Vuex:case t.MobX:return this.string(e[1])&&this.string(e[2]);case t.NgRx:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.GraphQL:return this.string(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4]);case t.PerformanceTrack:return this.int(e[1])&&this.int(e[2])&&this.uint(e[3])&&this.uint(e[4]);case t.ResourceTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.string(e[7])&&this.string(e[8]);case t.ConnectionInformation:return this.uint(e[1])&&this.string(e[2]);case t.SetPageVisibility:return this.boolean(e[1]);case t.LongTask:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.string(e[5])&&this.string(e[6])&&this.string(e[7]);case t.SetNodeAttributeURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4]);case t.SetCSSDataURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.TechnicalInfo:case t.CustomIssue:return this.string(e[1])&&this.string(e[2]);case t.CSSInsertRuleURLBased:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3])&&this.string(e[4]);case t.MouseClick:return this.uint(e[1])&&this.uint(e[2])&&this.string(e[3])&&this.string(e[4]);case t.CreateIFrameDocument:return this.uint(e[1])&&this.uint(e[2]);case t.AdoptedSSReplaceURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.AdoptedSSInsertRuleURLBased:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3])&&this.string(e[4]);case t.AdoptedSSDeleteRule:case t.AdoptedSSAddOwner:case t.AdoptedSSRemoveOwner:return this.uint(e[1])&&this.uint(e[2])}}}class n{constructor(t,e,i,n){this.pageNo=t,this.timestamp=e,this.url=i,this.onBatch=n,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(this.beaconSize),this.sizeBuffer=new Uint8Array(3),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}writeType(t){return this.encoder.uint(t[0])}writeFields(t){return this.encoder.encode(t)}writeSizeAt(t,e){for(let e=0;e<3;e++)this.sizeBuffer[e]=t>>8*e;this.encoder.set(this.sizeBuffer,e)}prepare(){if(!this.encoder.isEmpty())return;const e=[t.BatchMetadata,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(e),this.writeFields(e),this.isEmpty=!0}writeWithSize(e){const i=this.encoder;if(!this.writeType(e)||!i.skip(3))return!1;const s=i.getCurrentOffset(),n=this.writeFields(e);if(n){const n=i.getCurrentOffset()-s;if(n>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(n,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&e[0]===t.Timestamp,this.nextIndex++}return n}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(e){if(e[0]===t.Timestamp&&(this.timestamp=e[1]),e[0]===t.SetPageLocation&&(this.url=e[1]),!this.writeWithSize(e))for(this.finaliseBatch();!this.writeWithSize(e);){if(this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message.",e),this.encoder.reset(),void this.prepare();this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.encoder=new s(this.beaconSize),this.prepare()}}finaliseBatch(){this.isEmpty||(this.onBatch(this.encoder.flush()),this.prepare())}clean(){this.encoder.reset()}}var r;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(r||(r={}));let h=null,a=null;function o(){a&&a.finaliseBatch()}function u(){r.Stopping,null!==d&&(clearInterval(d),d=null),a&&(a.clean(),a=null),r.NotActive}r.NotActive;let c,d=null;self.onmessage=({data:i})=>{if(null!=i){if("stop"===i)return o(),void u();if(Array.isArray(i)){if(!a)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const e=a;i.forEach(i=>{i[0]===t.SetPageVisibility&&(i[1]?c=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(c)),e.writeMessage(i)})}else{if("start"===i.type)return r.Starting,h=new e(i.ingestPoint,()=>{self.postMessage("restart")},()=>{h&&(h.clean(),h=null),u(),self.postMessage("failed")},i.connAttemptCount,i.connAttemptGap),a=new n(i.pageNo,i.timestamp,i.url,t=>h&&h.push(t)),null===d&&(d=setInterval(o,1e4)),r.Active;if("auth"===i.type){if(!h)throw new Error("WebWorker: sender not initialised. Received auth.");if(!a)throw new Error("WebWorker: writer not initialised. Received auth.");return h.authorise(i.token),void(i.beaconSizeLimit&&a.setBeaconSizeLimit(i.beaconSizeLimit))}}}else o()};'], { type: 'text/javascript' })));
77
+ this.worker.onerror = (e) => {
78
+ this._debug('webworker_error', e);
79
79
  };
80
80
  this.worker.onmessage = ({ data }) => {
81
- if (data === "failed") {
81
+ if (data === 'failed') {
82
82
  this.stop();
83
- this._debug("worker_failed", {}); // add context (from worker)
83
+ this._debug('worker_failed', {}); // add context (from worker)
84
84
  }
85
- else if (data === "restart") {
85
+ else if (data === 'restart') {
86
86
  this.stop();
87
87
  this.start({ forceNew: true });
88
88
  }
@@ -99,7 +99,7 @@ class App {
99
99
  this.attachEventListener(document, 'visibilitychange', alertWorker, false);
100
100
  }
101
101
  catch (e) {
102
- this._debug("worker_start", e);
102
+ this._debug('worker_start', e);
103
103
  }
104
104
  }
105
105
  _debug(context, e) {
@@ -109,20 +109,20 @@ class App {
109
109
  headers: { 'Content-Type': 'application/json' },
110
110
  body: JSON.stringify({
111
111
  context,
112
- error: `${e}`
113
- })
112
+ error: `${e}`,
113
+ }),
114
114
  });
115
115
  }
116
- this.debug.error("OpenReplay error: ", context, e);
116
+ this.debug.error('OpenReplay error: ', context, e);
117
117
  }
118
118
  send(message, urgent = false) {
119
119
  if (this.activityState === ActivityState.NotActive) {
120
120
  return;
121
121
  }
122
122
  this.messages.push(message);
123
- // TODO: commit on start if there were `urgent` sends;
123
+ // TODO: commit on start if there were `urgent` sends;
124
124
  // Clearify where urgent can be used for;
125
- // Clearify workflow for each type of message in case it was sent before start
125
+ // Clearify workflow for each type of message in case it was sent before start
126
126
  // (like Fetch before start; maybe add an option "preCapture: boolean" or sth alike)
127
127
  if (this.activityState === ActivityState.Active && urgent) {
128
128
  this.commit();
@@ -130,9 +130,9 @@ class App {
130
130
  }
131
131
  commit() {
132
132
  if (this.worker && this.messages.length) {
133
- this.messages.unshift(new messages_js_1.Timestamp((0, utils_js_1.timestamp)()));
133
+ this.messages.unshift((0, messages_gen_js_1.Timestamp)((0, utils_js_1.timestamp)()));
134
134
  this.worker.postMessage(this.messages);
135
- this.commitCallbacks.forEach(cb => cb(this.messages));
135
+ this.commitCallbacks.forEach((cb) => cb(this.messages));
136
136
  this.messages.length = 0;
137
137
  }
138
138
  }
@@ -143,9 +143,8 @@ class App {
143
143
  fn.apply(this, args);
144
144
  }
145
145
  catch (e) {
146
- console.error(e);
147
- app._debug("safe_fn_call", e);
148
- // time: timestamp(),
146
+ app._debug('safe_fn_call', e);
147
+ // time: now(),
149
148
  // name: e.name,
150
149
  // message: e.message,
151
150
  // stack: e.stack
@@ -173,30 +172,32 @@ class App {
173
172
  const reqVer = version.split(/[.-]/);
174
173
  const ver = this.version.split(/[.-]/);
175
174
  for (let i = 0; i < 3; i++) {
176
- if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
175
+ if (isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
176
+ return false;
177
+ }
178
+ if (Number(ver[i]) > Number(reqVer[i])) {
179
+ return true;
180
+ }
181
+ if (Number(ver[i]) < Number(reqVer[i])) {
177
182
  return false;
178
183
  }
179
184
  }
180
185
  return true;
181
186
  }
182
- getStartInfo() {
187
+ getTrackerInfo() {
183
188
  return {
184
189
  userUUID: this.localStorage.getItem(this.options.local_uuid_key),
185
190
  projectKey: this.projectKey,
186
191
  revID: this.revID,
187
- timestamp: (0, utils_js_1.timestamp)(),
188
192
  trackerVersion: this.version,
189
193
  isSnippet: this.options.__is_snippet,
190
194
  };
191
195
  }
192
196
  getSessionInfo() {
193
- return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
197
+ return Object.assign(Object.assign({}, this.session.getInfo()), this.getTrackerInfo());
194
198
  }
195
199
  getSessionToken() {
196
- const token = this.sessionStorage.getItem(this.options.session_token_key);
197
- if (token !== null) {
198
- return token;
199
- }
200
+ return this.session.getSessionToken();
200
201
  }
201
202
  getSessionID() {
202
203
  return this.session.getInfo().sessionID || undefined;
@@ -213,18 +214,19 @@ class App {
213
214
  return this.options.resourceBaseHref;
214
215
  }
215
216
  else if (typeof this.options.resourceBaseHref === 'object') {
216
- //switch between types
217
+ //TODO: switch between types
217
218
  }
218
219
  if (document.baseURI) {
219
220
  return document.baseURI;
220
221
  }
221
222
  // IE only
222
- return ((_b = (_a = document.head) === null || _a === void 0 ? void 0 : _a.getElementsByTagName("base")[0]) === null || _b === void 0 ? void 0 : _b.getAttribute("href")) || location.origin + location.pathname;
223
+ return (((_b = (_a = document.head) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('base')[0]) === null || _b === void 0 ? void 0 : _b.getAttribute('href')) ||
224
+ location.origin + location.pathname);
223
225
  }
224
226
  resolveResourceURL(resourceURL) {
225
227
  const base = new URL(this.getBaseHref());
226
- base.pathname += "/" + new URL(resourceURL).pathname;
227
- base.pathname.replace(/\/+/g, "/");
228
+ base.pathname += '/' + new URL(resourceURL).pathname;
229
+ base.pathname.replace(/\/+/g, '/');
228
230
  return base.toString();
229
231
  }
230
232
  isServiceURL(url) {
@@ -243,72 +245,73 @@ class App {
243
245
  }
244
246
  _start(startOpts) {
245
247
  if (!this.worker) {
246
- return Promise.resolve(UnsuccessfulStart("No worker found: perhaps, CSP is not set."));
248
+ return Promise.resolve(UnsuccessfulStart('No worker found: perhaps, CSP is not set.'));
247
249
  }
248
250
  if (this.activityState !== ActivityState.NotActive) {
249
- return Promise.resolve(UnsuccessfulStart("OpenReplay: trying to call `start()` on the instance that has been started already."));
251
+ return Promise.resolve(UnsuccessfulStart('OpenReplay: trying to call `start()` on the instance that has been started already.'));
250
252
  }
251
253
  this.activityState = ActivityState.Starting;
252
- let pageNo = 0;
253
- const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
254
- if (pageNoStr != null) {
255
- pageNo = parseInt(pageNoStr);
256
- pageNo++;
257
- }
258
- this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
259
- const startInfo = this.getStartInfo();
254
+ const timestamp = (0, utils_js_1.timestamp)();
260
255
  const startWorkerMsg = {
261
- type: "start",
262
- pageNo,
256
+ type: 'start',
257
+ pageNo: this.session.incPageNo(),
263
258
  ingestPoint: this.options.ingestPoint,
264
- timestamp: startInfo.timestamp,
259
+ timestamp,
260
+ url: document.URL,
265
261
  connAttemptCount: this.options.connAttemptCount,
266
262
  connAttemptGap: this.options.connAttemptGap,
267
263
  };
268
264
  this.worker.postMessage(startWorkerMsg);
269
265
  this.session.update({
270
- // "updating" with old metadata in order to trigger session's UpdateCallbacks.
266
+ // TODO: transparent "session" module logic AND explicit internal api for plugins.
267
+ // "updating" with old metadata in order to trigger session's UpdateCallbacks.
271
268
  // (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
272
269
  metadata: startOpts.metadata || this.session.getInfo().metadata,
273
270
  userID: startOpts.userID,
274
271
  });
275
272
  const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
276
273
  this.sessionStorage.removeItem(this.options.session_reset_key);
277
- return window.fetch(this.options.ingestPoint + '/v1/web/start', {
274
+ return window
275
+ .fetch(this.options.ingestPoint + '/v1/web/start', {
278
276
  method: 'POST',
279
277
  headers: {
280
278
  'Content-Type': 'application/json',
281
279
  },
282
- body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory: performance_js_1.deviceMemory,
280
+ body: JSON.stringify(Object.assign(Object.assign({}, this.getTrackerInfo()), { timestamp, userID: this.session.getInfo().userID, token: this.session.getSessionToken(), deviceMemory: performance_js_1.deviceMemory,
283
281
  jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
284
282
  })
285
- .then(r => {
283
+ .then((r) => {
286
284
  if (r.status === 200) {
287
285
  return r.json();
288
286
  }
289
287
  else {
290
- return r.text().then(text => text === CANCELED
288
+ return r
289
+ .text()
290
+ .then((text) => text === CANCELED
291
291
  ? Promise.reject(CANCELED)
292
292
  : Promise.reject(`Server error: ${r.status}. ${text}`));
293
293
  }
294
294
  })
295
- .then(r => {
295
+ .then((r) => {
296
296
  if (!this.worker) {
297
- return Promise.reject("no worker found after start request (this might not happen)");
297
+ return Promise.reject('no worker found after start request (this might not happen)');
298
298
  }
299
- const { token, userUUID, sessionID, beaconSizeLimit } = r;
299
+ const { token, userUUID, sessionID, beaconSizeLimit, startTimestamp, // real startTS, derived from sessionID
300
+ } = r;
300
301
  if (typeof token !== 'string' ||
301
302
  typeof userUUID !== 'string' ||
303
+ //typeof startTimestamp !== 'number' ||
304
+ //typeof sessionID !== 'string' ||
302
305
  (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
303
306
  return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
304
307
  }
305
- this.sessionStorage.setItem(this.options.session_token_key, token);
308
+ this.session.setSessionToken(token);
306
309
  this.localStorage.setItem(this.options.local_uuid_key, userUUID);
307
- this.session.update({ sessionID }); // TODO: no no-explicit 'any'
310
+ this.session.update({ sessionID, timestamp: startTimestamp || timestamp }); // TODO: no no-explicit 'any'
308
311
  const startWorkerMsg = {
309
- type: "auth",
312
+ type: 'auth',
310
313
  token,
311
- beaconSizeLimit
314
+ beaconSizeLimit,
312
315
  };
313
316
  this.worker.postMessage(startWorkerMsg);
314
317
  this.activityState = ActivityState.Active;
@@ -316,21 +319,21 @@ class App {
316
319
  this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
317
320
  this.observer.observe();
318
321
  this.ticker.start();
319
- this.notify.log("OpenReplay tracking started.");
322
+ this.notify.log('OpenReplay tracking started.');
320
323
  // get rid of onStart ?
321
324
  if (typeof this.options.onStart === 'function') {
322
325
  this.options.onStart(onStartInfo);
323
326
  }
324
327
  return SuccessfulStart(onStartInfo);
325
328
  })
326
- .catch(reason => {
327
- this.sessionStorage.removeItem(this.options.session_token_key);
329
+ .catch((reason) => {
328
330
  this.stop();
331
+ this.session.reset();
329
332
  if (reason === CANCELED) {
330
333
  return UnsuccessfulStart(CANCELED);
331
334
  }
332
- this.notify.log("OpenReplay was unable to start. ", reason);
333
- this._debug("session_start", reason);
335
+ this.notify.log('OpenReplay was unable to start. ', reason);
336
+ this._debug('session_start', reason);
334
337
  return UnsuccessfulStart(START_ERROR);
335
338
  });
336
339
  }
@@ -342,15 +345,15 @@ class App {
342
345
  return new Promise((resolve) => {
343
346
  const onVisibilityChange = () => {
344
347
  if (!document.hidden) {
345
- document.removeEventListener("visibilitychange", onVisibilityChange);
348
+ document.removeEventListener('visibilitychange', onVisibilityChange);
346
349
  resolve(this._start(options));
347
350
  }
348
351
  };
349
- document.addEventListener("visibilitychange", onVisibilityChange);
352
+ document.addEventListener('visibilitychange', onVisibilityChange);
350
353
  });
351
354
  }
352
355
  }
353
- stop(calledFromAPI = false, restarting = false) {
356
+ stop(stopWorker = true) {
354
357
  if (this.activityState !== ActivityState.NotActive) {
355
358
  try {
356
359
  this.sanitizer.clear();
@@ -358,12 +361,9 @@ class App {
358
361
  this.nodes.clear();
359
362
  this.ticker.stop();
360
363
  this.stopCallbacks.forEach((cb) => cb());
361
- if (calledFromAPI) {
362
- this.session.reset();
363
- }
364
- this.notify.log("OpenReplay tracking stopped.");
365
- if (this.worker && !restarting) {
366
- this.worker.postMessage("stop");
364
+ this.notify.log('OpenReplay tracking stopped.');
365
+ if (this.worker && stopWorker) {
366
+ this.worker.postMessage('stop');
367
367
  }
368
368
  }
369
369
  finally {
@@ -372,7 +372,7 @@ class App {
372
372
  }
373
373
  }
374
374
  restart() {
375
- this.stop(false, true);
375
+ this.stop(false);
376
376
  this.start({ forceNew: false });
377
377
  }
378
378
  }
package/cjs/app/logger.js CHANGED
@@ -13,9 +13,12 @@ function IsCustomLevel(l) {
13
13
  }
14
14
  class Logger {
15
15
  constructor(options = exports.LogLevel.Silent) {
16
- this.options = options === true
17
- ? { level: exports.LogLevel.Verbose }
18
- : typeof options === "number" ? { level: options } : options;
16
+ this.options =
17
+ options === true
18
+ ? { level: exports.LogLevel.Verbose }
19
+ : typeof options === 'number'
20
+ ? { level: options }
21
+ : options;
19
22
  }
20
23
  log(...args) {
21
24
  if (IsCustomLevel(this.options.level)