@openreplay/tracker 3.4.15 → 3.4.17

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.
@@ -0,0 +1,18 @@
1
+ export interface Window extends globalThis.Window {
2
+ HTMLInputElement: typeof HTMLInputElement;
3
+ HTMLLinkElement: typeof HTMLLinkElement;
4
+ HTMLStyleElement: typeof HTMLStyleElement;
5
+ SVGStyleElement: typeof SVGStyleElement;
6
+ HTMLIFrameElement: typeof HTMLIFrameElement;
7
+ Text: typeof Text;
8
+ Element: typeof Element;
9
+ ShadowRoot: typeof ShadowRoot;
10
+ }
11
+ declare type WindowConstructor = Document | Element | Text | ShadowRoot | HTMLInputElement | HTMLLinkElement | HTMLStyleElement | HTMLIFrameElement;
12
+ declare type Constructor<T> = {
13
+ new (...args: any[]): T;
14
+ name: string;
15
+ };
16
+ export declare function isInstance<T extends WindowConstructor>(node: Node, constr: Constructor<T>): node is T;
17
+ export declare function inDocument(node: Node): boolean;
18
+ export {};
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inDocument = exports.isInstance = void 0;
4
+ // TODO: we need a type expert here so we won't have to ignore the lines
5
+ // TODO: use it everywhere (static function; export from which file? <-- global Window typing required)
6
+ function isInstance(node, constr) {
7
+ const doc = node.ownerDocument;
8
+ if (!doc) { // null if Document
9
+ return constr.name === 'Document';
10
+ }
11
+ let context =
12
+ // @ts-ignore (for EI, Safary)
13
+ doc.parentWindow ||
14
+ doc.defaultView; // TODO: smart global typing for Window object
15
+ while (context.parent && context.parent !== context) {
16
+ // @ts-ignore
17
+ if (node instanceof context[constr.name]) {
18
+ return true;
19
+ }
20
+ // @ts-ignore
21
+ context = context.parent;
22
+ }
23
+ // @ts-ignore
24
+ return node instanceof context[constr.name];
25
+ }
26
+ exports.isInstance = isInstance;
27
+ function inDocument(node) {
28
+ const doc = node.ownerDocument;
29
+ if (!doc) {
30
+ return false;
31
+ }
32
+ if (doc.contains(node)) {
33
+ return true;
34
+ }
35
+ let context =
36
+ // @ts-ignore (for EI, Safary)
37
+ doc.parentWindow ||
38
+ doc.defaultView;
39
+ while (context.parent && context.parent !== context) {
40
+ if (context.document.contains(node)) {
41
+ return true;
42
+ }
43
+ // @ts-ignore
44
+ context = context.parent;
45
+ }
46
+ return false;
47
+ }
48
+ exports.inDocument = inDocument;
@@ -1,19 +1,25 @@
1
1
  import Message from "../messages/message.js";
2
2
  import Nodes from "./nodes.js";
3
- import Observer from "./observer/top_observer.js";
3
+ import Sanitizer from "./sanitizer.js";
4
4
  import Ticker from "./ticker.js";
5
5
  import type { Options as ObserverOptions } from "./observer/top_observer.js";
6
+ import type { Options as SanitizerOptions } from "./sanitizer.js";
6
7
  import type { Options as WebworkerOptions } from "../messages/webworker.js";
7
8
  export interface OnStartInfo {
8
9
  sessionID: string;
9
10
  sessionToken: string;
10
11
  userUUID: string;
11
12
  }
12
- export declare type Options = {
13
+ export interface StartOptions {
14
+ userID?: string;
15
+ forceNew: boolean;
16
+ }
17
+ declare type AppOptions = {
13
18
  revID: string;
14
19
  node_id: string;
15
20
  session_token_key: string;
16
21
  session_pageno_key: string;
22
+ session_reset_key: string;
17
23
  local_uuid_key: string;
18
24
  ingestPoint: string;
19
25
  resourceBaseHref: string | null;
@@ -21,7 +27,8 @@ export declare type Options = {
21
27
  __debug_report_edp: string | null;
22
28
  __debug_log: boolean;
23
29
  onStart?: (info: OnStartInfo) => void;
24
- } & ObserverOptions & WebworkerOptions;
30
+ } & WebworkerOptions;
31
+ export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
25
32
  declare type Callback = () => void;
26
33
  declare type CommitCallback = (messages: Array<Message>) => void;
27
34
  export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
@@ -29,18 +36,20 @@ export default class App {
29
36
  readonly nodes: Nodes;
30
37
  readonly ticker: Ticker;
31
38
  readonly projectKey: string;
39
+ readonly sanitizer: Sanitizer;
32
40
  private readonly messages;
33
- readonly observer: Observer;
41
+ private readonly observer;
34
42
  private readonly startCallbacks;
35
43
  private readonly stopCallbacks;
36
44
  private readonly commitCallbacks;
37
45
  private readonly options;
38
46
  private readonly revID;
39
47
  private _sessionID;
48
+ private _userID;
40
49
  private isActive;
41
50
  private version;
42
51
  private readonly worker?;
43
- constructor(projectKey: string, sessionToken: string | null | undefined, opts: Partial<Options>);
52
+ constructor(projectKey: string, sessionToken: string | null | undefined, options: Partial<Options>);
44
53
  private _debug;
45
54
  send(message: Message, urgent?: boolean): void;
46
55
  private commit;
@@ -58,8 +67,9 @@ export default class App {
58
67
  resolveResourceURL(resourceURL: string): string;
59
68
  isServiceURL(url: string): boolean;
60
69
  active(): boolean;
70
+ resetNextPageSession(flag: boolean): void;
61
71
  private _start;
62
- start(reset?: boolean): Promise<OnStartInfo>;
72
+ start(options?: StartOptions): Promise<OnStartInfo>;
63
73
  stop(): void;
64
74
  }
65
75
  export {};
package/cjs/app/index.js CHANGED
@@ -5,45 +5,45 @@ const utils_js_1 = require("../utils.js");
5
5
  const index_js_1 = require("../messages/index.js");
6
6
  const nodes_js_1 = require("./nodes.js");
7
7
  const top_observer_js_1 = require("./observer/top_observer.js");
8
+ const sanitizer_js_1 = require("./sanitizer.js");
8
9
  const ticker_js_1 = require("./ticker.js");
9
10
  const performance_js_1 = require("../modules/performance.js");
10
11
  // TODO: use backendHost only
11
12
  exports.DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest';
12
13
  class App {
13
- constructor(projectKey, sessionToken, opts) {
14
+ constructor(projectKey, sessionToken, options) {
14
15
  this.messages = [];
15
16
  this.startCallbacks = [];
16
17
  this.stopCallbacks = [];
17
18
  this.commitCallbacks = [];
18
19
  this._sessionID = null;
19
20
  this.isActive = false;
20
- this.version = '3.4.15';
21
+ this.version = '3.4.17';
21
22
  this.projectKey = projectKey;
22
23
  this.options = Object.assign({
23
24
  revID: '',
24
25
  node_id: '__openreplay_id',
25
26
  session_token_key: '__openreplay_token',
26
27
  session_pageno_key: '__openreplay_pageno',
28
+ session_reset_key: '__openreplay_reset',
27
29
  local_uuid_key: '__openreplay_uuid',
28
30
  ingestPoint: exports.DEFAULT_INGEST_POINT,
29
31
  resourceBaseHref: null,
30
32
  __is_snippet: false,
31
33
  __debug_report_edp: null,
32
34
  __debug_log: false,
33
- obscureTextEmails: true,
34
- obscureTextNumbers: false,
35
- captureIFrames: false,
36
- }, opts);
35
+ }, options);
37
36
  if (sessionToken != null) {
38
37
  sessionStorage.setItem(this.options.session_token_key, sessionToken);
39
38
  }
40
39
  this.revID = this.options.revID;
40
+ this.sanitizer = new sanitizer_js_1.default(this, options);
41
41
  this.nodes = new nodes_js_1.default(this.options.node_id);
42
- this.observer = new top_observer_js_1.default(this, this.options);
42
+ this.observer = new top_observer_js_1.default(this, options);
43
43
  this.ticker = new ticker_js_1.default(this);
44
44
  this.ticker.attach(() => this.commit());
45
45
  try {
46
- this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,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)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,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)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const E=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,E);const k=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,k);const I=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,I);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,z);const w=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,w);const T=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,T);const L=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,L);const A=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,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)}});s.set(39,A);const C=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,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)}});s.set(40,C);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const N=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,N);const D=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,D);const U=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,U);const O=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,O);const q=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,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)}});s.set(48,q);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,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)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,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)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,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)}});s.set(59,j);const G=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,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)}});s.set(60,G);const K=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,K);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,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)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,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)}});s.set(69,W);const Y=t(class{constructor(t,s){this.frameID=t,this.id=s,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});s.set(70,Y);const Z="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class tt{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 s=Z.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let st=1e6,it=2e5,nt=new tt(it),et="",rt="",ot=0,ht=0,ct=0,ut=0,at=!0;function dt(){return new i(ot,ut,ht).encode(nt)}let lt=null;const gt=[];let ft,pt=!1,mt=0,_t=8e3,yt=10;function vt(){if(at||""===rt||""===et)return;const t=nt.flush();pt?gt.push(t):(pt=!0,function t(s){const i=new XMLHttpRequest;i.open("POST",et+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+rt),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(this.status>=400)return St(),gt.length=0,401===this.status?void self.postMessage("restart"):void self.postMessage(null);const s=gt.shift();s?t(s):pt=!1}},i.onerror=function(i){if(mt>=yt)return St(),void self.postMessage(null);mt++,setTimeout(()=>t(s),_t)},i.send(s.buffer)}(t)),at=!0,dt()}function St(){et="",rt="",null!==lt&&(clearInterval(lt),lt=null),nt.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(vt(),void St()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ht=i.timestamp:i instanceof J&&(i.hidden?ft=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ft)),nt.checkpoint(),!i.encode(nt)&&(vt(),!i.encode(nt)))for(;!i.encode(nt);){if(it===st)return console.warn("OpenReplay: beacon size overflow."),nt.reset(),void dt();it=Math.min(2*it,st),nt=new tt(it),dt()}ut++,at=!1}):(et=t.ingestPoint||et,rt=t.token||rt,ot=t.pageNo||ot,ht=t.startTimestamp||ht,ct=t.timeAdjustment||ct,yt=t.connAttemptCount||yt,_t=t.connAttemptGap||_t,st=t.beaconSizeLimit||st,it=Math.min(st,t.beaconSize||it),nt.isEmpty()&&dt(),void(null===lt&&(lt=setInterval(vt,1e4))));vt()};
46
+ this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,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)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,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)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const E=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,E);const k=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,k);const I=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,I);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,z);const w=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,w);const T=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,T);const L=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,L);const A=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,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)}});s.set(39,A);const C=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,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)}});s.set(40,C);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const N=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,N);const D=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,D);const U=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,U);const O=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,O);const q=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,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)}});s.set(48,q);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,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)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,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)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,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)}});s.set(59,j);const G=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,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)}});s.set(60,G);const K=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,K);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,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)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,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)}});s.set(69,W);const Y=t(class{constructor(t,s){this.frameID=t,this.id=s,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});s.set(70,Y);const Z="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class tt{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 s=Z.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let st=1e6,it=2e5,nt=new tt(it),et="",rt="",ot=0,ht=0,ct=0,ut=0,at=!0;function dt(){return new i(ot,ut,ht).encode(nt)}let lt=null;const gt=[];let ft,pt=!1,mt=0,_t=8e3,yt=10;function vt(){if(at||""===rt||""===et)return;const t=nt.flush();pt?gt.push(t):(pt=!0,function t(s){const i=new XMLHttpRequest;i.open("POST",et+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+rt),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(this.status>=400)return pt=!1,St(),gt.length=0,401===this.status?void self.postMessage("restart"):void self.postMessage(null);const s=gt.shift();s?t(s):pt=!1}},i.onerror=function(i){if(mt>=yt)return St(),void self.postMessage(null);mt++,setTimeout(()=>t(s),_t)},i.send(s.buffer)}(t)),at=!0,dt()}function St(){et="",rt="",null!==lt&&(clearInterval(lt),lt=null),nt.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(vt(),void St()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ht=i.timestamp:i instanceof J&&(i.hidden?ft=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ft)),nt.checkpoint(),!i.encode(nt)&&(vt(),!i.encode(nt)))for(;!i.encode(nt);){if(it===st)return console.warn("OpenReplay: beacon size overflow."),nt.reset(),void dt();it=Math.min(2*it,st),nt=new tt(it),dt()}ut++,at=!1}):(et=t.ingestPoint||et,rt=t.token||rt,ot=t.pageNo||ot,ht=t.startTimestamp||ht,ct=t.timeAdjustment||ct,yt=t.connAttemptCount||yt,_t=t.connAttemptGap||_t,st=t.beaconSizeLimit||st,it=Math.min(st,t.beaconSize||it),nt.isEmpty()&&dt(),void(null===lt&&(lt=setInterval(vt,1e4))));vt()};
47
47
  `], { type: 'text/javascript' })));
48
48
  this.worker.onerror = e => {
49
49
  this._debug("webworker_error", e);
@@ -56,7 +56,10 @@ class App {
56
56
  }
57
57
  else if (data === "restart") {
58
58
  this.stop();
59
- this.start(true);
59
+ this.start({
60
+ forceNew: true,
61
+ userID: this._userID,
62
+ });
60
63
  }
61
64
  };
62
65
  const alertWorker = () => {
@@ -181,114 +184,126 @@ class App {
181
184
  active() {
182
185
  return this.isActive;
183
186
  }
184
- _start(reset) {
185
- if (!this.isActive) {
186
- if (!this.worker) {
187
- return Promise.reject("No worker found: perhaps, CSP is not set.");
187
+ resetNextPageSession(flag) {
188
+ if (flag) {
189
+ sessionStorage.setItem(this.options.session_reset_key, 't');
190
+ }
191
+ else {
192
+ sessionStorage.removeItem(this.options.session_reset_key);
193
+ }
194
+ }
195
+ _start(startOpts) {
196
+ if (!this.worker) {
197
+ return Promise.reject("No worker found: perhaps, CSP is not set.");
198
+ }
199
+ if (this.isActive) {
200
+ return Promise.reject("OpenReplay: trying to call `start()` on the instance that has been started already.");
201
+ }
202
+ this.isActive = true;
203
+ let pageNo = 0;
204
+ const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
205
+ if (pageNoStr != null) {
206
+ pageNo = parseInt(pageNoStr);
207
+ pageNo++;
208
+ }
209
+ sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
210
+ const startTimestamp = (0, utils_js_1.timestamp)();
211
+ const messageData = {
212
+ ingestPoint: this.options.ingestPoint,
213
+ pageNo,
214
+ startTimestamp,
215
+ connAttemptCount: this.options.connAttemptCount,
216
+ connAttemptGap: this.options.connAttemptGap,
217
+ };
218
+ this.worker.postMessage(messageData); // brings delay of 10th ms?
219
+ // let token = sessionStorage.getItem(this.options.session_token_key)
220
+ // const tokenIsActive = localStorage.getItem("__or_at_" + token)
221
+ // if (tokenIsActive) {
222
+ // token = null
223
+ // }
224
+ const sReset = sessionStorage.getItem(this.options.session_reset_key);
225
+ sessionStorage.removeItem(this.options.session_reset_key);
226
+ this._userID = startOpts.userID || undefined;
227
+ return window.fetch(this.options.ingestPoint + '/v1/web/start', {
228
+ method: 'POST',
229
+ headers: {
230
+ 'Content-Type': 'application/json',
231
+ },
232
+ body: JSON.stringify({
233
+ token: sessionStorage.getItem(this.options.session_token_key),
234
+ userUUID: localStorage.getItem(this.options.local_uuid_key),
235
+ projectKey: this.projectKey,
236
+ revID: this.revID,
237
+ timestamp: startTimestamp,
238
+ trackerVersion: this.version,
239
+ isSnippet: this.options.__is_snippet,
240
+ deviceMemory: performance_js_1.deviceMemory,
241
+ jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit,
242
+ reset: startOpts.forceNew || sReset !== null,
243
+ userID: this._userID,
244
+ }),
245
+ })
246
+ .then(r => {
247
+ if (r.status === 200) {
248
+ return r.json();
188
249
  }
189
- this.isActive = true;
190
- let pageNo = 0;
191
- const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
192
- if (pageNoStr != null) {
193
- pageNo = parseInt(pageNoStr);
194
- pageNo++;
250
+ else { // TODO: handle canceling && 403
251
+ return r.text().then(text => {
252
+ throw new Error(`Server error: ${r.status}. ${text}`);
253
+ });
195
254
  }
196
- sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
197
- const startTimestamp = (0, utils_js_1.timestamp)();
198
- const messageData = {
199
- ingestPoint: this.options.ingestPoint,
200
- pageNo,
201
- startTimestamp,
202
- connAttemptCount: this.options.connAttemptCount,
203
- connAttemptGap: this.options.connAttemptGap,
204
- };
205
- this.worker.postMessage(messageData); // brings delay of 10th ms?
206
- let token = sessionStorage.getItem(this.options.session_token_key);
207
- const tokenIsActive = localStorage.getItem("__or_at_" + token);
208
- if (tokenIsActive) {
209
- token = null;
255
+ })
256
+ .then(r => {
257
+ const { token, userUUID, sessionID, beaconSizeLimit } = r;
258
+ if (typeof token !== 'string' ||
259
+ typeof userUUID !== 'string' ||
260
+ (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
261
+ throw new Error(`Incorrect server response: ${JSON.stringify(r)}`);
210
262
  }
211
- return window.fetch(this.options.ingestPoint + '/v1/web/start', {
212
- method: 'POST',
213
- headers: {
214
- 'Content-Type': 'application/json',
215
- },
216
- body: JSON.stringify({
217
- token,
218
- userUUID: localStorage.getItem(this.options.local_uuid_key),
219
- projectKey: this.projectKey,
220
- revID: this.revID,
221
- timestamp: startTimestamp,
222
- trackerVersion: this.version,
223
- isSnippet: this.options.__is_snippet,
224
- deviceMemory: performance_js_1.deviceMemory,
225
- jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit,
226
- reset,
227
- }),
228
- })
229
- .then(r => {
230
- if (r.status === 200) {
231
- return r.json();
232
- }
233
- else { // TODO: handle canceling && 403
234
- return r.text().then(text => {
235
- throw new Error(`Server error: ${r.status}. ${text}`);
236
- });
237
- }
238
- })
239
- .then(r => {
240
- const { token, userUUID, sessionID, beaconSizeLimit } = r;
241
- if (typeof token !== 'string' ||
242
- typeof userUUID !== 'string' ||
243
- (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
244
- throw new Error(`Incorrect server response: ${JSON.stringify(r)}`);
245
- }
246
- sessionStorage.setItem(this.options.session_token_key, token);
247
- localStorage.setItem(this.options.local_uuid_key, userUUID);
248
- localStorage.setItem("__or_at_" + token, "true");
249
- this.attachEventListener(window, 'beforeunload', () => {
250
- localStorage.removeItem("__or_at_" + token);
251
- }, false);
252
- this.attachEventListener(window, 'pagehide', () => {
253
- localStorage.removeItem("__or_at_" + token);
254
- }, false);
255
- if (typeof sessionID === 'string') {
256
- this._sessionID = sessionID;
257
- }
258
- if (!this.worker) {
259
- throw new Error("no worker found after start request (this might not happen)");
260
- }
261
- this.worker.postMessage({ token, beaconSizeLimit });
262
- this.startCallbacks.forEach((cb) => cb());
263
- this.observer.observe();
264
- this.ticker.start();
265
- (0, utils_js_1.log)("OpenReplay tracking started.");
266
- const onStartInfo = { sessionToken: token, userUUID, sessionID };
267
- if (typeof this.options.onStart === 'function') {
268
- this.options.onStart(onStartInfo);
269
- }
270
- return onStartInfo;
271
- })
272
- .catch(e => {
273
- sessionStorage.removeItem(this.options.session_token_key);
274
- this.stop();
275
- (0, utils_js_1.warn)("OpenReplay was unable to start. ", e);
276
- this._debug("session_start", e);
277
- throw e;
278
- });
279
- }
280
- return Promise.reject("Player is already active");
263
+ sessionStorage.setItem(this.options.session_token_key, token);
264
+ localStorage.setItem(this.options.local_uuid_key, userUUID);
265
+ // localStorage.setItem("__or_at_" + token, "true")
266
+ // this.attachEventListener(window, 'beforeunload', ()=>{
267
+ // localStorage.removeItem("__or_at_" + token)
268
+ // }, false);
269
+ // this.attachEventListener(window, 'pagehide', ()=>{
270
+ // localStorage.removeItem("__or_at_" + token)
271
+ // }, false);
272
+ if (typeof sessionID === 'string') {
273
+ this._sessionID = sessionID;
274
+ }
275
+ if (!this.worker) {
276
+ throw new Error("no worker found after start request (this might not happen)");
277
+ }
278
+ this.worker.postMessage({ token, beaconSizeLimit });
279
+ this.startCallbacks.forEach((cb) => cb());
280
+ this.observer.observe();
281
+ this.ticker.start();
282
+ (0, utils_js_1.log)("OpenReplay tracking started.");
283
+ const onStartInfo = { sessionToken: token, userUUID, sessionID };
284
+ if (typeof this.options.onStart === 'function') {
285
+ this.options.onStart(onStartInfo);
286
+ }
287
+ return onStartInfo;
288
+ })
289
+ .catch(e => {
290
+ sessionStorage.removeItem(this.options.session_token_key);
291
+ this.stop();
292
+ (0, utils_js_1.warn)("OpenReplay was unable to start. ", e);
293
+ this._debug("session_start", e);
294
+ throw e;
295
+ });
281
296
  }
282
- start(reset = false) {
297
+ start(options = { forceNew: false }) {
283
298
  if (!document.hidden) {
284
- return this._start(reset);
299
+ return this._start(options);
285
300
  }
286
301
  else {
287
302
  return new Promise((resolve) => {
288
303
  const onVisibilityChange = () => {
289
304
  if (!document.hidden) {
290
305
  document.removeEventListener("visibilitychange", onVisibilityChange);
291
- resolve(this._start(reset));
306
+ resolve(this._start(options));
292
307
  }
293
308
  };
294
309
  document.addEventListener("visibilitychange", onVisibilityChange);
@@ -301,6 +316,7 @@ class App {
301
316
  if (this.worker) {
302
317
  this.worker.postMessage("stop");
303
318
  }
319
+ this.sanitizer.clear();
304
320
  this.observer.disconnect();
305
321
  this.nodes.clear();
306
322
  this.ticker.stop();
@@ -1,25 +1,5 @@
1
1
  import App from "../index.js";
2
- export interface Window extends globalThis.Window {
3
- HTMLInputElement: typeof HTMLInputElement;
4
- HTMLLinkElement: typeof HTMLLinkElement;
5
- HTMLStyleElement: typeof HTMLStyleElement;
6
- SVGStyleElement: typeof SVGStyleElement;
7
- HTMLIFrameElement: typeof HTMLIFrameElement;
8
- Text: typeof Text;
9
- Element: typeof Element;
10
- ShadowRoot: typeof ShadowRoot;
11
- }
12
- declare type WindowConstructor = Document | Element | Text | ShadowRoot | HTMLInputElement | HTMLLinkElement | HTMLStyleElement | HTMLIFrameElement;
13
- declare type Constructor<T> = {
14
- new (...args: any[]): T;
15
- name: string;
16
- };
17
- export declare function isInstance<T extends WindowConstructor>(node: Node, constr: Constructor<T>): node is T;
18
- export interface Options {
19
- obscureTextEmails: boolean;
20
- obscureTextNumbers: boolean;
21
- }
22
- export default abstract class Observer<AdditionalOptions = {}> {
2
+ export default abstract class Observer {
23
3
  protected readonly app: App;
24
4
  protected readonly context: Window;
25
5
  private readonly observer;
@@ -29,14 +9,10 @@ export default abstract class Observer<AdditionalOptions = {}> {
29
9
  private readonly indexes;
30
10
  private readonly attributesList;
31
11
  private readonly textSet;
32
- private readonly textMasked;
33
- protected readonly options: Options & AdditionalOptions;
34
12
  private readonly inUpperContext;
35
- constructor(app: App, options: Partial<Options> & AdditionalOptions, context?: Window);
13
+ constructor(app: App, context?: Window);
36
14
  private clear;
37
15
  private sendNodeAttribute;
38
- getInnerTextSecure(el: HTMLElement): string;
39
- private checkObscure;
40
16
  private sendNodeData;
41
17
  private bindNode;
42
18
  private bindTree;
@@ -47,4 +23,3 @@ export default abstract class Observer<AdditionalOptions = {}> {
47
23
  protected observeRoot(node: Node, beforeCommit: (id?: number) => unknown, nodeToBind?: Node): void;
48
24
  disconnect(): void;
49
25
  }
50
- export {};