@openreplay/tracker 3.6.0 → 3.6.3

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/LICENSE +1 -1
  2. package/cjs/app/guards.d.ts +1 -2
  3. package/cjs/app/guards.js +3 -6
  4. package/cjs/app/index.d.ts +23 -28
  5. package/cjs/app/index.js +83 -101
  6. package/cjs/app/logger.js +3 -6
  7. package/cjs/app/nodes.d.ts +1 -1
  8. package/cjs/app/nodes.js +0 -2
  9. package/cjs/app/observer/iframe_observer.d.ts +1 -1
  10. package/cjs/app/observer/iframe_observer.js +3 -3
  11. package/cjs/app/observer/observer.d.ts +3 -2
  12. package/cjs/app/observer/observer.js +52 -50
  13. package/cjs/app/observer/shadow_root_observer.d.ts +1 -1
  14. package/cjs/app/observer/shadow_root_observer.js +3 -3
  15. package/cjs/app/observer/top_observer.d.ts +2 -13
  16. package/cjs/app/observer/top_observer.js +23 -58
  17. package/cjs/app/sanitizer.d.ts +1 -1
  18. package/cjs/app/sanitizer.js +5 -5
  19. package/cjs/app/session.d.ts +2 -20
  20. package/cjs/app/session.js +6 -65
  21. package/cjs/app/ticker.d.ts +1 -1
  22. package/cjs/common/messages.d.ts +444 -0
  23. package/cjs/common/messages.js +794 -0
  24. package/cjs/common/types.d.ts +9 -0
  25. package/cjs/common/{interaction.js → types.js} +0 -0
  26. package/cjs/common/{interaction.d.ts → webworker.d.ts} +5 -5
  27. package/cjs/common/{messages.gen.js → webworker.js} +0 -1
  28. package/cjs/index.d.ts +9 -10
  29. package/cjs/index.js +36 -47
  30. package/cjs/modules/connection.d.ts +1 -1
  31. package/cjs/modules/connection.js +2 -2
  32. package/cjs/modules/console.d.ts +1 -1
  33. package/cjs/modules/console.js +21 -7
  34. package/cjs/modules/cssrules.d.ts +1 -1
  35. package/cjs/modules/cssrules.js +14 -18
  36. package/cjs/modules/exception.d.ts +3 -3
  37. package/cjs/modules/exception.js +18 -23
  38. package/cjs/modules/img.d.ts +1 -1
  39. package/cjs/modules/img.js +26 -39
  40. package/cjs/modules/input.d.ts +1 -1
  41. package/cjs/modules/input.js +21 -21
  42. package/cjs/modules/longtasks.d.ts +2 -0
  43. package/cjs/modules/longtasks.js +26 -0
  44. package/cjs/modules/mouse.d.ts +1 -1
  45. package/cjs/modules/mouse.js +43 -50
  46. package/cjs/modules/performance.d.ts +1 -1
  47. package/cjs/modules/performance.js +2 -2
  48. package/cjs/modules/scroll.d.ts +1 -1
  49. package/cjs/modules/scroll.js +7 -16
  50. package/cjs/modules/timing.d.ts +1 -1
  51. package/cjs/modules/timing.js +26 -14
  52. package/cjs/modules/viewport.d.ts +1 -1
  53. package/cjs/modules/viewport.js +4 -4
  54. package/cjs/utils.js +7 -7
  55. package/cjs/vendors/finder/finder.js +48 -53
  56. package/lib/app/guards.d.ts +1 -2
  57. package/lib/app/guards.js +2 -4
  58. package/lib/app/index.d.ts +23 -28
  59. package/lib/app/index.js +91 -109
  60. package/lib/app/logger.js +3 -6
  61. package/lib/app/nodes.d.ts +1 -1
  62. package/lib/app/nodes.js +0 -2
  63. package/lib/app/observer/iframe_observer.d.ts +1 -1
  64. package/lib/app/observer/iframe_observer.js +3 -3
  65. package/lib/app/observer/observer.d.ts +3 -2
  66. package/lib/app/observer/observer.js +53 -51
  67. package/lib/app/observer/shadow_root_observer.d.ts +1 -1
  68. package/lib/app/observer/shadow_root_observer.js +3 -3
  69. package/lib/app/observer/top_observer.d.ts +2 -13
  70. package/lib/app/observer/top_observer.js +27 -62
  71. package/lib/app/sanitizer.d.ts +1 -1
  72. package/lib/app/sanitizer.js +7 -7
  73. package/lib/app/session.d.ts +2 -20
  74. package/lib/app/session.js +6 -65
  75. package/lib/app/ticker.d.ts +1 -1
  76. package/lib/common/messages.d.ts +444 -0
  77. package/lib/common/messages.js +790 -0
  78. package/lib/common/tsconfig.tsbuildinfo +1 -1
  79. package/lib/common/types.d.ts +9 -0
  80. package/lib/common/{interaction.js → types.js} +0 -0
  81. package/lib/common/{interaction.d.ts → webworker.d.ts} +5 -5
  82. package/lib/common/webworker.js +1 -0
  83. package/lib/index.d.ts +9 -10
  84. package/lib/index.js +49 -60
  85. package/lib/modules/connection.d.ts +1 -1
  86. package/lib/modules/connection.js +2 -2
  87. package/lib/modules/console.d.ts +1 -1
  88. package/lib/modules/console.js +22 -8
  89. package/lib/modules/cssrules.d.ts +1 -1
  90. package/lib/modules/cssrules.js +15 -19
  91. package/lib/modules/exception.d.ts +3 -3
  92. package/lib/modules/exception.js +18 -23
  93. package/lib/modules/img.d.ts +1 -1
  94. package/lib/modules/img.js +28 -41
  95. package/lib/modules/input.d.ts +1 -1
  96. package/lib/modules/input.js +23 -23
  97. package/lib/modules/longtasks.d.ts +2 -0
  98. package/lib/modules/longtasks.js +23 -0
  99. package/lib/modules/mouse.d.ts +1 -1
  100. package/lib/modules/mouse.js +46 -53
  101. package/lib/modules/performance.d.ts +1 -1
  102. package/lib/modules/performance.js +3 -3
  103. package/lib/modules/scroll.d.ts +1 -1
  104. package/lib/modules/scroll.js +8 -17
  105. package/lib/modules/timing.d.ts +1 -1
  106. package/lib/modules/timing.js +28 -16
  107. package/lib/modules/viewport.d.ts +1 -1
  108. package/lib/modules/viewport.js +4 -4
  109. package/lib/utils.js +7 -7
  110. package/lib/vendors/finder/finder.js +48 -53
  111. package/package.json +10 -27
  112. package/.eslintignore +0 -8
  113. package/.prettierignore +0 -1
  114. package/cjs/app/messages.d.ts +0 -52
  115. package/cjs/app/messages.gen.d.ts +0 -57
  116. package/cjs/app/messages.gen.js +0 -493
  117. package/cjs/app/messages.js +0 -234
  118. package/cjs/common/messages.gen.d.ts +0 -382
  119. package/cjs/modules/adoptedStyleSheets.d.ts +0 -2
  120. package/cjs/modules/adoptedStyleSheets.js +0 -127
  121. package/lib/app/messages.d.ts +0 -52
  122. package/lib/app/messages.gen.d.ts +0 -57
  123. package/lib/app/messages.gen.js +0 -434
  124. package/lib/app/messages.js +0 -181
  125. package/lib/common/messages.gen.d.ts +0 -382
  126. package/lib/common/messages.gen.js +0 -2
  127. package/lib/modules/adoptedStyleSheets.d.ts +0 -2
  128. package/lib/modules/adoptedStyleSheets.js +0 -124
package/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2022 Asayer, Inc
1
+ Copyright (c) 2021 OpenReplay.com <support@openreplay.com>
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a copy
4
4
  of this software and associated documentation files (the "Software"), to deal
@@ -1,8 +1,7 @@
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 isDocument(node: Node): node is Document;
5
- export declare function isRootNode(node: Node): node is Document | DocumentFragment;
4
+ export declare function isRootNode(node: Node): boolean;
6
5
  declare type TagTypeMap = {
7
6
  HTML: HTMLHtmlElement;
8
7
  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.isDocument = exports.isTextNode = exports.isElementNode = exports.isSVGElement = void 0;
3
+ exports.hasTag = exports.isRootNode = 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,12 +13,9 @@ 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;
20
16
  function isRootNode(node) {
21
- return node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
17
+ return node.nodeType === Node.DOCUMENT_NODE ||
18
+ node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
22
19
  }
23
20
  exports.isRootNode = isRootNode;
24
21
  function hasTag(el, tagName) {
@@ -1,20 +1,17 @@
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';
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";
13
11
  export interface StartOptions {
14
12
  userID?: string;
15
13
  metadata?: Record<string, string>;
16
14
  forceNew?: boolean;
17
- sessionHash?: string;
18
15
  }
19
16
  interface OnStartInfo {
20
17
  sessionID: string;
@@ -37,9 +34,9 @@ declare type CommitCallback = (messages: Array<Message>) => void;
37
34
  declare type AppOptions = {
38
35
  revID: string;
39
36
  node_id: string;
40
- session_reset_key: string;
41
37
  session_token_key: string;
42
38
  session_pageno_key: string;
39
+ session_reset_key: string;
43
40
  local_uuid_key: string;
44
41
  ingestPoint: string;
45
42
  resourceBaseHref: string | null;
@@ -47,10 +44,10 @@ declare type AppOptions = {
47
44
  __is_snippet: boolean;
48
45
  __debug_report_edp: string | null;
49
46
  __debug__?: LoggerOptions;
50
- localStorage: Storage | null;
51
- sessionStorage: Storage | null;
47
+ localStorage: Storage;
48
+ sessionStorage: Storage;
52
49
  onStart?: StartCallback;
53
- } & WebworkerOptions & SessOptions;
50
+ } & WebworkerOptions;
54
51
  export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
55
52
  export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
56
53
  export default class App {
@@ -64,41 +61,39 @@ export default class App {
64
61
  readonly localStorage: Storage;
65
62
  readonly sessionStorage: Storage;
66
63
  private readonly messages;
67
- readonly observer: Observer;
64
+ private readonly observer;
68
65
  private readonly startCallbacks;
69
66
  private readonly stopCallbacks;
70
67
  private readonly commitCallbacks;
71
68
  private readonly options;
72
69
  private readonly revID;
73
70
  private activityState;
74
- private readonly version;
71
+ private version;
75
72
  private readonly worker?;
76
- constructor(projectKey: string, sessionToken: string | undefined, options: Partial<Options>);
73
+ constructor(projectKey: string, sessionToken: string | null | undefined, options: Partial<Options>);
77
74
  private _debug;
78
75
  send(message: Message, urgent?: boolean): void;
79
76
  private commit;
80
77
  safe<T extends (...args: any[]) => void>(fn: T): T;
81
78
  attachCommitCallback(cb: CommitCallback): void;
82
- attachStartCallback(cb: StartCallback, useSafe?: boolean): void;
83
- attachStopCallback(cb: () => any, useSafe?: boolean): void;
79
+ attachStartCallback(cb: StartCallback): void;
80
+ attachStopCallback(cb: Function): void;
84
81
  attachEventListener(target: EventTarget, type: string, listener: EventListener, useSafe?: boolean, useCapture?: boolean): void;
85
82
  checkRequiredVersion(version: string): boolean;
86
- private getTrackerInfo;
83
+ private getStartInfo;
87
84
  getSessionInfo(): {
88
85
  userUUID: string | null;
89
86
  projectKey: string;
90
87
  revID: string;
88
+ timestamp: number;
91
89
  trackerVersion: string;
92
90
  isSnippet: boolean;
93
- sessionID: string | undefined;
91
+ sessionID: string | null;
94
92
  metadata: Record<string, string>;
95
93
  userID: string | null;
96
- timestamp: number;
97
- projectID?: string | undefined;
98
94
  };
99
95
  getSessionToken(): string | undefined;
100
96
  getSessionID(): string | undefined;
101
- getSessionURL(): string | undefined;
102
97
  getHost(): string;
103
98
  getProjectKey(): string;
104
99
  getBaseHref(): string;
@@ -108,7 +103,7 @@ export default class App {
108
103
  resetNextPageSession(flag: boolean): void;
109
104
  private _start;
110
105
  start(options?: StartOptions): Promise<StartPromiseReturn>;
111
- stop(stopWorker?: boolean): void;
106
+ stop(calledFromAPI?: boolean, restarting?: boolean): void;
112
107
  restart(): void;
113
108
  }
114
109
  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_gen_js_1 = require("./messages.gen.js");
4
+ const messages_js_1 = require("../common/messages.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;
@@ -32,7 +32,7 @@ class App {
32
32
  this.stopCallbacks = [];
33
33
  this.commitCallbacks = [];
34
34
  this.activityState = ActivityState.NotActive;
35
- this.version = '3.6.0'; // TODO: version compatability check inside each plugin.
35
+ this.version = '3.6.3'; // 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 === null || window === void 0 ? void 0 : window.localStorage,
50
- sessionStorage: window === null || window === void 0 ? void 0 : window.sessionStorage,
49
+ localStorage: window.localStorage,
50
+ sessionStorage: window.sessionStorage,
51
51
  }, options);
52
52
  this.revID = this.options.revID;
53
53
  this.sanitizer = new sanitizer_js_1.default(this, options);
@@ -57,33 +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.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);
60
+ this.session = new session_js_1.default();
63
61
  this.session.attachUpdateCallback(({ userID, metadata }) => {
64
- if (userID != null) {
65
- // TODO: nullable userID
66
- this.send((0, messages_gen_js_1.UserID)(userID));
62
+ if (userID != null) { // TODO: nullable userID
63
+ this.send(new messages_js_1.UserID(userID));
67
64
  }
68
65
  if (metadata != null) {
69
- Object.entries(metadata).forEach(([key, value]) => this.send((0, messages_gen_js_1.Metadata)(key, value)));
66
+ Object.entries(metadata).forEach(([key, value]) => this.send(new messages_js_1.Metadata(key, value)));
70
67
  }
71
68
  });
72
- // @depricated (use sessionHash on start instead)
69
+ this.localStorage = this.options.localStorage;
70
+ this.sessionStorage = this.options.sessionStorage;
73
71
  if (sessionToken != null) {
74
- this.session.applySessionHash(sessionToken);
72
+ this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
75
73
  }
76
74
  try {
77
- this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{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 i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(let 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),!(r>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>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 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,i){this.data.set(t,i)}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 s=i.encode(t),e=s.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(s,this.offset),this.offset+=e,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(t){switch(t[0]){case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 82:return this.uint(t[1])&&this.uint(t[2]);case 0:return this.uint(t[1]);case 4:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:return this.uint(t[1])&&this.uint(t[2]);case 6:return this.int(t[1])&&this.int(t[2]);case 7:return!0;case 8:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.string(t[4])&&this.boolean(t[5]);case 9:case 10:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 11:return this.uint(t[1]);case 12:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:return this.uint(t[1])&&this.string(t[2]);case 16:return this.uint(t[1])&&this.int(t[2])&&this.int(t[3]);case 17:return this.uint(t[1])&&this.string(t[2]);case 18:return this.uint(t[1])&&this.string(t[2])&&this.int(t[3]);case 19:return this.uint(t[1])&&this.boolean(t[2]);case 20:return this.uint(t[1])&&this.uint(t[2]);case 22:return this.string(t[1])&&this.string(t[2]);case 23:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8])&&this.uint(t[9]);case 24:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 25:return this.string(t[1])&&this.string(t[2])&&this.string(t[3]);case 27:return this.string(t[1])&&this.string(t[2]);case 28:case 29:return this.string(t[1]);case 30:return this.string(t[1])&&this.string(t[2]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);case 38:return this.uint(t[1])&&this.uint(t[2]);case 39:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7]);case 40:return this.string(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 41:return this.string(t[1])&&this.string(t[2]);case 42:return this.string(t[1]);case 44:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 45:case 46:return this.string(t[1])&&this.string(t[2]);case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 53:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.string(t[7])&&this.string(t[8]);case 54:return this.uint(t[1])&&this.string(t[2]);case 55:return this.boolean(t[1]);case 59:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6])&&this.string(t[7]);case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 61:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 63:case 64:return this.string(t[1])&&this.string(t[2]);case 67:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 70:return this.uint(t[1])&&this.uint(t[2]);case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 75:case 76:case 77:return this.uint(t[1])&&this.uint(t[2])}}}class e{constructor(t,i,e,n){this.pageNo=t,this.timestamp=i,this.url=e,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,i){for(let i=0;i<3;i++)this.sizeBuffer[i]=t>>8*i;this.encoder.set(this.sizeBuffer,i)}prepare(){if(!this.encoder.isEmpty())return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(t),this.writeFields(t),this.isEmpty=!0}writeWithSize(t){const i=this.encoder;if(!this.writeType(t)||!i.skip(3))return!1;const s=i.getCurrentOffset(),e=this.writeFields(t);if(e){const e=i.getCurrentOffset()-s;if(e>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(e,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){if(0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),!this.writeWithSize(t))for(this.finaliseBatch();!this.writeWithSize(t);){if(this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),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 n;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(n||(n={}));let r=null,h=null;function u(){h&&h.finaliseBatch()}function a(){n.Stopping,null!==c&&(clearInterval(c),c=null),h&&(h.clean(),h=null),n.NotActive}n.NotActive;let o,c=null;self.onmessage=({data:i})=>{if(null!=i){if("stop"===i)return u(),void a();if(Array.isArray(i)){if(!h)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const t=h;i.forEach(i=>{55===i[0]&&(i[1]?o=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(o)),t.writeMessage(i)})}else{if("start"===i.type)return n.Starting,r=new t(i.ingestPoint,()=>{self.postMessage("restart")},()=>{r&&(r.clean(),r=null),a(),self.postMessage("failed")},i.connAttemptCount,i.connAttemptGap),h=new e(i.pageNo,i.timestamp,i.url,t=>r&&r.push(t)),null===c&&(c=setInterval(u,1e4)),n.Active;if("auth"===i.type){if(!r)throw new Error("WebWorker: sender not initialised. Received auth.");if(!h)throw new Error("WebWorker: writer not initialised. Received auth.");return r.authorise(i.token),void(i.beaconSizeLimit&&h.setBeaconSizeLimit(i.beaconSizeLimit))}}}else u()};'], { type: 'text/javascript' })));
78
- this.worker.onerror = (e) => {
79
- this._debug('webworker_error', e);
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);
80
79
  };
81
80
  this.worker.onmessage = ({ data }) => {
82
- if (data === 'failed') {
81
+ if (data === "failed") {
83
82
  this.stop();
84
- this._debug('worker_failed', {}); // add context (from worker)
83
+ this._debug("worker_failed", {}); // add context (from worker)
85
84
  }
86
- else if (data === 'restart') {
85
+ else if (data === "restart") {
87
86
  this.stop();
88
87
  this.start({ forceNew: true });
89
88
  }
@@ -100,7 +99,7 @@ class App {
100
99
  this.attachEventListener(document, 'visibilitychange', alertWorker, false);
101
100
  }
102
101
  catch (e) {
103
- this._debug('worker_start', e);
102
+ this._debug("worker_start", e);
104
103
  }
105
104
  }
106
105
  _debug(context, e) {
@@ -110,11 +109,11 @@ class App {
110
109
  headers: { 'Content-Type': 'application/json' },
111
110
  body: JSON.stringify({
112
111
  context,
113
- error: `${e}`,
114
- }),
112
+ error: `${e}`
113
+ })
115
114
  });
116
115
  }
117
- this.debug.error('OpenReplay error: ', context, e);
116
+ this.debug.error("OpenReplay error: ", context, e);
118
117
  }
119
118
  send(message, urgent = false) {
120
119
  if (this.activityState === ActivityState.NotActive) {
@@ -131,9 +130,9 @@ class App {
131
130
  }
132
131
  commit() {
133
132
  if (this.worker && this.messages.length) {
134
- this.messages.unshift((0, messages_gen_js_1.Timestamp)((0, utils_js_1.timestamp)()));
133
+ this.messages.unshift(new messages_js_1.Timestamp((0, utils_js_1.timestamp)()));
135
134
  this.worker.postMessage(this.messages);
136
- this.commitCallbacks.forEach((cb) => cb(this.messages));
135
+ this.commitCallbacks.forEach(cb => cb(this.messages));
137
136
  this.messages.length = 0;
138
137
  }
139
138
  }
@@ -144,8 +143,8 @@ class App {
144
143
  fn.apply(this, args);
145
144
  }
146
145
  catch (e) {
147
- app._debug('safe_fn_call', e);
148
- // time: now(),
146
+ app._debug("safe_fn_call", e);
147
+ // time: timestamp(),
149
148
  // name: e.name,
150
149
  // message: e.message,
151
150
  // stack: e.stack
@@ -153,72 +152,57 @@ class App {
153
152
  }; // TODO: correct typing
154
153
  }
155
154
  attachCommitCallback(cb) {
156
- // TODO!: what if start callback added when activityState === Active ?
157
- // For example - attachEventListener() called during dynamic <iframe> appearance
158
155
  this.commitCallbacks.push(cb);
159
156
  }
160
- attachStartCallback(cb, useSafe = false) {
161
- if (useSafe) {
162
- cb = this.safe(cb);
163
- }
157
+ attachStartCallback(cb) {
164
158
  this.startCallbacks.push(cb);
165
159
  }
166
- attachStopCallback(cb, useSafe = false) {
167
- if (useSafe) {
168
- cb = this.safe(cb);
169
- }
160
+ attachStopCallback(cb) {
170
161
  this.stopCallbacks.push(cb);
171
162
  }
172
163
  attachEventListener(target, type, listener, useSafe = true, useCapture = true) {
173
164
  if (useSafe) {
174
165
  listener = this.safe(listener);
175
166
  }
176
- this.attachStartCallback(() => target.addEventListener(type, listener, useCapture), useSafe);
177
- this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture), useSafe);
167
+ this.attachStartCallback(() => target.addEventListener(type, listener, useCapture));
168
+ this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture));
178
169
  }
179
170
  // TODO: full correct semantic
180
171
  checkRequiredVersion(version) {
181
172
  const reqVer = version.split(/[.-]/);
182
173
  const ver = this.version.split(/[.-]/);
183
174
  for (let i = 0; i < 3; i++) {
184
- if (isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
185
- return false;
186
- }
187
175
  if (Number(ver[i]) > Number(reqVer[i])) {
188
176
  return true;
189
177
  }
190
- if (Number(ver[i]) < Number(reqVer[i])) {
178
+ if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
191
179
  return false;
192
180
  }
193
181
  }
194
182
  return true;
195
183
  }
196
- getTrackerInfo() {
184
+ getStartInfo() {
197
185
  return {
198
186
  userUUID: this.localStorage.getItem(this.options.local_uuid_key),
199
187
  projectKey: this.projectKey,
200
188
  revID: this.revID,
189
+ timestamp: (0, utils_js_1.timestamp)(),
201
190
  trackerVersion: this.version,
202
191
  isSnippet: this.options.__is_snippet,
203
192
  };
204
193
  }
205
194
  getSessionInfo() {
206
- return Object.assign(Object.assign({}, this.session.getInfo()), this.getTrackerInfo());
195
+ return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
207
196
  }
208
197
  getSessionToken() {
209
- return this.session.getSessionToken();
198
+ const token = this.sessionStorage.getItem(this.options.session_token_key);
199
+ if (token !== null) {
200
+ return token;
201
+ }
210
202
  }
211
203
  getSessionID() {
212
204
  return this.session.getInfo().sessionID || undefined;
213
205
  }
214
- getSessionURL() {
215
- const { projectID, sessionID } = this.session.getInfo();
216
- if (!projectID || !sessionID) {
217
- this.debug.error('OpenReplay error: Unable to build session URL');
218
- return undefined;
219
- }
220
- return this.options.ingestPoint.replace(/\/ingest$/, `${projectID}/session/${sessionID}`);
221
- }
222
206
  getHost() {
223
207
  return new URL(this.options.ingestPoint).hostname;
224
208
  }
@@ -231,19 +215,18 @@ class App {
231
215
  return this.options.resourceBaseHref;
232
216
  }
233
217
  else if (typeof this.options.resourceBaseHref === 'object') {
234
- //TODO: switch between types
218
+ //switch between types
235
219
  }
236
220
  if (document.baseURI) {
237
221
  return document.baseURI;
238
222
  }
239
223
  // IE only
240
- return (((_b = (_a = document.head) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('base')[0]) === null || _b === void 0 ? void 0 : _b.getAttribute('href')) ||
241
- location.origin + location.pathname);
224
+ 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;
242
225
  }
243
226
  resolveResourceURL(resourceURL) {
244
227
  const base = new URL(this.getBaseHref());
245
- base.pathname += '/' + new URL(resourceURL).pathname;
246
- base.pathname.replace(/\/+/g, '/');
228
+ base.pathname += "/" + new URL(resourceURL).pathname;
229
+ base.pathname.replace(/\/+/g, "/");
247
230
  return base.toString();
248
231
  }
249
232
  isServiceURL(url) {
@@ -262,28 +245,30 @@ class App {
262
245
  }
263
246
  _start(startOpts) {
264
247
  if (!this.worker) {
265
- 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."));
266
249
  }
267
250
  if (this.activityState !== ActivityState.NotActive) {
268
- 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."));
269
252
  }
270
253
  this.activityState = ActivityState.Starting;
271
- if (startOpts.sessionHash) {
272
- this.session.applySessionHash(startOpts.sessionHash);
254
+ let pageNo = 0;
255
+ const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
256
+ if (pageNoStr != null) {
257
+ pageNo = parseInt(pageNoStr);
258
+ pageNo++;
273
259
  }
274
- const timestamp = (0, utils_js_1.timestamp)();
260
+ this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
261
+ const startInfo = this.getStartInfo();
275
262
  const startWorkerMsg = {
276
- type: 'start',
277
- pageNo: this.session.incPageNo(),
263
+ type: "start",
264
+ pageNo,
278
265
  ingestPoint: this.options.ingestPoint,
279
- timestamp,
280
- url: document.URL,
266
+ timestamp: startInfo.timestamp,
281
267
  connAttemptCount: this.options.connAttemptCount,
282
268
  connAttemptGap: this.options.connAttemptGap,
283
269
  };
284
270
  this.worker.postMessage(startWorkerMsg);
285
271
  this.session.update({
286
- // TODO: transparent "session" module logic AND explicit internal api for plugins.
287
272
  // "updating" with old metadata in order to trigger session's UpdateCallbacks.
288
273
  // (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
289
274
  metadata: startOpts.metadata || this.session.getInfo().metadata,
@@ -291,69 +276,63 @@ class App {
291
276
  });
292
277
  const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
293
278
  this.sessionStorage.removeItem(this.options.session_reset_key);
294
- return window
295
- .fetch(this.options.ingestPoint + '/v1/web/start', {
279
+ return window.fetch(this.options.ingestPoint + '/v1/web/start', {
296
280
  method: 'POST',
297
281
  headers: {
298
282
  'Content-Type': 'application/json',
299
283
  },
300
- body: JSON.stringify(Object.assign(Object.assign({}, this.getTrackerInfo()), { timestamp, userID: this.session.getInfo().userID, token: this.session.getSessionToken(), deviceMemory: performance_js_1.deviceMemory,
284
+ 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,
301
285
  jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
302
286
  })
303
- .then((r) => {
287
+ .then(r => {
304
288
  if (r.status === 200) {
305
289
  return r.json();
306
290
  }
307
291
  else {
308
- return r
309
- .text()
310
- .then((text) => text === CANCELED
292
+ return r.text().then(text => text === CANCELED
311
293
  ? Promise.reject(CANCELED)
312
294
  : Promise.reject(`Server error: ${r.status}. ${text}`));
313
295
  }
314
296
  })
315
- .then((r) => {
297
+ .then(r => {
316
298
  if (!this.worker) {
317
- return Promise.reject('no worker found after start request (this might not happen)');
299
+ return Promise.reject("no worker found after start request (this might not happen)");
318
300
  }
319
- const { token, userUUID, sessionID, projectID, beaconSizeLimit, startTimestamp, // real startTS, derived from sessionID
320
- } = r;
301
+ const { token, userUUID, sessionID, beaconSizeLimit } = r;
321
302
  if (typeof token !== 'string' ||
322
303
  typeof userUUID !== 'string' ||
323
- //typeof startTimestamp !== 'number' ||
324
- //typeof sessionID !== 'string' ||
325
304
  (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
326
305
  return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
327
306
  }
328
- this.session.setSessionToken(token);
307
+ this.sessionStorage.setItem(this.options.session_token_key, token);
329
308
  this.localStorage.setItem(this.options.local_uuid_key, userUUID);
330
- this.session.update({ sessionID, timestamp: startTimestamp || timestamp, projectID }); // TODO: no no-explicit 'any'
309
+ this.session.update({ sessionID }); // TODO: no no-explicit 'any'
331
310
  const startWorkerMsg = {
332
- type: 'auth',
311
+ type: "auth",
333
312
  token,
334
- beaconSizeLimit,
313
+ beaconSizeLimit
335
314
  };
336
315
  this.worker.postMessage(startWorkerMsg);
316
+ this.activityState = ActivityState.Active;
337
317
  const onStartInfo = { sessionToken: token, userUUID, sessionID };
338
318
  this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
339
319
  this.observer.observe();
340
320
  this.ticker.start();
341
- this.activityState = ActivityState.Active;
342
- this.notify.log('OpenReplay tracking started.');
321
+ this.notify.log("OpenReplay tracking started.");
343
322
  // get rid of onStart ?
344
323
  if (typeof this.options.onStart === 'function') {
345
324
  this.options.onStart(onStartInfo);
346
325
  }
347
326
  return SuccessfulStart(onStartInfo);
348
327
  })
349
- .catch((reason) => {
328
+ .catch(reason => {
329
+ this.sessionStorage.removeItem(this.options.session_token_key);
350
330
  this.stop();
351
- this.session.reset();
352
331
  if (reason === CANCELED) {
353
332
  return UnsuccessfulStart(CANCELED);
354
333
  }
355
- this.notify.log('OpenReplay was unable to start. ', reason);
356
- this._debug('session_start', reason);
334
+ this.notify.log("OpenReplay was unable to start. ", reason);
335
+ this._debug("session_start", reason);
357
336
  return UnsuccessfulStart(START_ERROR);
358
337
  });
359
338
  }
@@ -365,15 +344,15 @@ class App {
365
344
  return new Promise((resolve) => {
366
345
  const onVisibilityChange = () => {
367
346
  if (!document.hidden) {
368
- document.removeEventListener('visibilitychange', onVisibilityChange);
347
+ document.removeEventListener("visibilitychange", onVisibilityChange);
369
348
  resolve(this._start(options));
370
349
  }
371
350
  };
372
- document.addEventListener('visibilitychange', onVisibilityChange);
351
+ document.addEventListener("visibilitychange", onVisibilityChange);
373
352
  });
374
353
  }
375
354
  }
376
- stop(stopWorker = true) {
355
+ stop(calledFromAPI = false, restarting = false) {
377
356
  if (this.activityState !== ActivityState.NotActive) {
378
357
  try {
379
358
  this.sanitizer.clear();
@@ -381,9 +360,12 @@ class App {
381
360
  this.nodes.clear();
382
361
  this.ticker.stop();
383
362
  this.stopCallbacks.forEach((cb) => cb());
384
- this.notify.log('OpenReplay tracking stopped.');
385
- if (this.worker && stopWorker) {
386
- this.worker.postMessage('stop');
363
+ if (calledFromAPI) {
364
+ this.session.reset();
365
+ }
366
+ this.notify.log("OpenReplay tracking stopped.");
367
+ if (this.worker && !restarting) {
368
+ this.worker.postMessage("stop");
387
369
  }
388
370
  }
389
371
  finally {
@@ -392,7 +374,7 @@ class App {
392
374
  }
393
375
  }
394
376
  restart() {
395
- this.stop(false);
377
+ this.stop(false, true);
396
378
  this.start({ forceNew: false });
397
379
  }
398
380
  }
package/cjs/app/logger.js CHANGED
@@ -13,12 +13,9 @@ function IsCustomLevel(l) {
13
13
  }
14
14
  class Logger {
15
15
  constructor(options = exports.LogLevel.Silent) {
16
- this.options =
17
- options === true
18
- ? { level: exports.LogLevel.Verbose }
19
- : typeof options === 'number'
20
- ? { level: options }
21
- : options;
16
+ this.options = options === true
17
+ ? { level: exports.LogLevel.Verbose }
18
+ : typeof options === "number" ? { level: options } : options;
22
19
  }
23
20
  log(...args) {
24
21
  if (IsCustomLevel(this.options.level)
@@ -7,7 +7,7 @@ export default class Nodes {
7
7
  constructor(node_id: string);
8
8
  attachNodeCallback(nodeCallback: NodeCallback): void;
9
9
  attachElementListener(type: string, node: Element, elementListener: EventListener): void;
10
- registerNode(node: Node): [/*id:*/ number, /*isNew:*/ boolean];
10
+ registerNode(node: Node): [id: number, isNew: boolean];
11
11
  unregisterNode(node: Node): number | undefined;
12
12
  cleanTree(): void;
13
13
  callNodeCallbacks(node: Node, isStart: boolean): void;