@openreplay/tracker 3.4.17-beta.1 → 3.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -18,7 +18,14 @@ import Tracker from '@openreplay/tracker';
18
18
  const tracker = new Tracker({
19
19
  projectKey: YOUR_PROJECT_KEY,
20
20
  });
21
- tracker.start();
21
+ tracker.start({
22
+ userID: "Mr.Smith",
23
+ metadata: {
24
+ version: "3.5.0",
25
+ balance: "10M",
26
+ role: "admin",
27
+ }
28
+ });
22
29
  ```
23
30
 
24
31
  Then you can use OpenReplay JavaScript API anywhere in your code.
@@ -2,14 +2,21 @@ import Message from "../messages/message.js";
2
2
  import Nodes from "./nodes.js";
3
3
  import Sanitizer from "./sanitizer.js";
4
4
  import Ticker from "./ticker.js";
5
+ import Logger from "./logger.js";
5
6
  import type { Options as ObserverOptions } from "./observer/top_observer.js";
6
7
  import type { Options as SanitizerOptions } from "./sanitizer.js";
8
+ import type { Options as LoggerOptions } from "./logger.js";
7
9
  import type { Options as WebworkerOptions } from "../messages/webworker.js";
8
10
  export interface OnStartInfo {
9
11
  sessionID: string;
10
12
  sessionToken: string;
11
13
  userUUID: string;
12
14
  }
15
+ export interface StartOptions {
16
+ userID?: string;
17
+ metadata?: Record<string, string>;
18
+ forceNew: boolean;
19
+ }
13
20
  declare type AppOptions = {
14
21
  revID: string;
15
22
  node_id: string;
@@ -19,20 +26,24 @@ declare type AppOptions = {
19
26
  local_uuid_key: string;
20
27
  ingestPoint: string;
21
28
  resourceBaseHref: string | null;
29
+ verbose: boolean;
22
30
  __is_snippet: boolean;
23
31
  __debug_report_edp: string | null;
24
- __debug_log: boolean;
32
+ __debug__?: LoggerOptions;
25
33
  onStart?: (info: OnStartInfo) => void;
26
34
  } & WebworkerOptions;
27
35
  export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
28
36
  declare type Callback = () => void;
29
37
  declare type CommitCallback = (messages: Array<Message>) => void;
38
+ export declare const CANCELED = "canceled";
30
39
  export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
31
40
  export default class App {
32
41
  readonly nodes: Nodes;
33
42
  readonly ticker: Ticker;
34
43
  readonly projectKey: string;
35
44
  readonly sanitizer: Sanitizer;
45
+ readonly debug: Logger;
46
+ readonly notify: Logger;
36
47
  private readonly messages;
37
48
  private readonly observer;
38
49
  private readonly startCallbacks;
@@ -41,19 +52,34 @@ export default class App {
41
52
  private readonly options;
42
53
  private readonly revID;
43
54
  private _sessionID;
44
- private isActive;
55
+ private _userID;
56
+ private _metadata;
57
+ private activityState;
45
58
  private version;
46
59
  private readonly worker?;
47
60
  constructor(projectKey: string, sessionToken: string | null | undefined, options: Partial<Options>);
48
61
  private _debug;
62
+ private readonly preStartMessages;
49
63
  send(message: Message, urgent?: boolean): void;
50
64
  private commit;
51
65
  attachCommitCallback(cb: CommitCallback): void;
52
- addCommitCallback(cb: CommitCallback): void;
53
66
  safe<T extends (...args: any[]) => void>(fn: T): T;
54
67
  attachStartCallback(cb: Callback): void;
55
68
  attachStopCallback(cb: Callback): void;
56
69
  attachEventListener(target: EventTarget, type: string, listener: EventListener, useSafe?: boolean, useCapture?: boolean): void;
70
+ checkRequiredVersion(version: string): boolean;
71
+ private getStartInfo;
72
+ getSessionInfo(): {
73
+ userUUID: string | null;
74
+ projectKey: string;
75
+ revID: string;
76
+ timestamp: number;
77
+ trackerVersion: string;
78
+ userID: string | null;
79
+ isSnippet: boolean;
80
+ sessionID: string | null;
81
+ metadata: Record<string, string>;
82
+ };
57
83
  getSessionToken(): string | undefined;
58
84
  getSessionID(): string | undefined;
59
85
  getHost(): string;
@@ -64,7 +90,7 @@ export default class App {
64
90
  active(): boolean;
65
91
  resetNextPageSession(flag: boolean): void;
66
92
  private _start;
67
- start(reset?: boolean): Promise<OnStartInfo>;
93
+ start(options?: StartOptions): Promise<OnStartInfo>;
68
94
  stop(): void;
69
95
  }
70
96
  export {};
package/cjs/app/index.js CHANGED
@@ -1,24 +1,38 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_INGEST_POINT = void 0;
3
+ exports.DEFAULT_INGEST_POINT = exports.CANCELED = void 0;
4
4
  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
8
  const sanitizer_js_1 = require("./sanitizer.js");
9
9
  const ticker_js_1 = require("./ticker.js");
10
+ const logger_js_1 = require("./logger.js");
10
11
  const performance_js_1 = require("../modules/performance.js");
12
+ var ActivityState;
13
+ (function (ActivityState) {
14
+ ActivityState[ActivityState["NotActive"] = 0] = "NotActive";
15
+ ActivityState[ActivityState["Starting"] = 1] = "Starting";
16
+ ActivityState[ActivityState["Active"] = 2] = "Active";
17
+ })(ActivityState || (ActivityState = {}));
18
+ exports.CANCELED = "canceled";
11
19
  // TODO: use backendHost only
12
20
  exports.DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest';
13
21
  class App {
14
22
  constructor(projectKey, sessionToken, options) {
23
+ // if (options.onStart !== undefined) {
24
+ // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
25
+ // } ?? maybe onStart is good
15
26
  this.messages = [];
16
27
  this.startCallbacks = [];
17
28
  this.stopCallbacks = [];
18
29
  this.commitCallbacks = [];
19
30
  this._sessionID = null;
20
- this.isActive = false;
21
- this.version = '3.4.17-beta.1';
31
+ this._userID = null;
32
+ this._metadata = {};
33
+ this.activityState = ActivityState.NotActive;
34
+ this.version = '3.5.2'; // TODO: version compatability check inside each plugin.
35
+ this.preStartMessages = [];
22
36
  this.projectKey = projectKey;
23
37
  this.options = Object.assign({
24
38
  revID: '',
@@ -29,9 +43,9 @@ class App {
29
43
  local_uuid_key: '__openreplay_uuid',
30
44
  ingestPoint: exports.DEFAULT_INGEST_POINT,
31
45
  resourceBaseHref: null,
46
+ verbose: false,
32
47
  __is_snippet: false,
33
48
  __debug_report_edp: null,
34
- __debug_log: false,
35
49
  }, options);
36
50
  if (sessionToken != null) {
37
51
  sessionStorage.setItem(this.options.session_token_key, sessionToken);
@@ -42,8 +56,10 @@ class App {
42
56
  this.observer = new top_observer_js_1.default(this, options);
43
57
  this.ticker = new ticker_js_1.default(this);
44
58
  this.ticker.attach(() => this.commit());
59
+ this.debug = new logger_js_1.default(this.options.__debug__);
60
+ this.notify = new logger_js_1.default(this.options.verbose ? logger_js_1.LogLevel.Warnings : logger_js_1.LogLevel.Silent);
45
61
  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()};
62
+ 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
63
  `], { type: 'text/javascript' })));
48
64
  this.worker.onerror = e => {
49
65
  this._debug("webworker_error", e);
@@ -56,7 +72,11 @@ class App {
56
72
  }
57
73
  else if (data === "restart") {
58
74
  this.stop();
59
- this.start(true);
75
+ this.start({
76
+ forceNew: true,
77
+ userID: this._userID || undefined,
78
+ metadata: this._metadata || undefined,
79
+ });
60
80
  }
61
81
  };
62
82
  const alertWorker = () => {
@@ -84,14 +104,19 @@ class App {
84
104
  })
85
105
  });
86
106
  }
87
- if (this.options.__debug_log) {
88
- (0, utils_js_1.warn)("OpenReplay error: ", context, e);
89
- }
107
+ this.debug.error("OpenReplay error: ", context, e);
90
108
  }
91
109
  send(message, urgent = false) {
92
- if (!this.isActive) {
110
+ if (this.activityState === ActivityState.NotActive) {
93
111
  return;
94
112
  }
113
+ if (this.activityState === ActivityState.Starting) {
114
+ this.preStartMessages.push(message);
115
+ }
116
+ if (this.preStartMessages.length) {
117
+ this.messages.push(...this.preStartMessages);
118
+ this.preStartMessages.length = 0;
119
+ }
95
120
  this.messages.push(message);
96
121
  if (urgent) {
97
122
  this.commit();
@@ -108,10 +133,6 @@ class App {
108
133
  attachCommitCallback(cb) {
109
134
  this.commitCallbacks.push(cb);
110
135
  }
111
- // @Depricated (TODO: remove in 3.5.*)
112
- addCommitCallback(cb) {
113
- this.attachCommitCallback(cb);
114
- }
115
136
  safe(fn) {
116
137
  const app = this;
117
138
  return function (...args) {
@@ -140,6 +161,30 @@ class App {
140
161
  this.attachStartCallback(() => target.addEventListener(type, listener, useCapture));
141
162
  this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture));
142
163
  }
164
+ checkRequiredVersion(version) {
165
+ const reqVer = version.split('.');
166
+ const ver = this.version.split('.');
167
+ for (let i = 0; i < ver.length; i++) {
168
+ if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
169
+ return false;
170
+ }
171
+ }
172
+ return true;
173
+ }
174
+ getStartInfo() {
175
+ return {
176
+ userUUID: localStorage.getItem(this.options.local_uuid_key),
177
+ projectKey: this.projectKey,
178
+ revID: this.revID,
179
+ timestamp: (0, utils_js_1.timestamp)(),
180
+ trackerVersion: this.version,
181
+ userID: this._userID,
182
+ isSnippet: this.options.__is_snippet,
183
+ };
184
+ }
185
+ getSessionInfo() {
186
+ return Object.assign({ sessionID: this._sessionID, metadata: this._metadata }, this.getStartInfo());
187
+ }
143
188
  getSessionToken() {
144
189
  const token = sessionStorage.getItem(this.options.session_token_key);
145
190
  if (token !== null) {
@@ -179,7 +224,7 @@ class App {
179
224
  return url.startsWith(this.options.ingestPoint);
180
225
  }
181
226
  active() {
182
- return this.isActive;
227
+ return this.activityState === ActivityState.Active;
183
228
  }
184
229
  resetNextPageSession(flag) {
185
230
  if (flag) {
@@ -189,116 +234,102 @@ class App {
189
234
  sessionStorage.removeItem(this.options.session_reset_key);
190
235
  }
191
236
  }
192
- _start(reset) {
193
- if (!this.isActive) {
237
+ _start(startOpts) {
238
+ if (!this.worker) {
239
+ return Promise.reject("No worker found: perhaps, CSP is not set.");
240
+ }
241
+ if (this.activityState !== ActivityState.NotActive) {
242
+ return Promise.reject("OpenReplay: trying to call `start()` on the instance that has been started already.");
243
+ }
244
+ this.activityState = ActivityState.Starting;
245
+ let pageNo = 0;
246
+ const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
247
+ if (pageNoStr != null) {
248
+ pageNo = parseInt(pageNoStr);
249
+ pageNo++;
250
+ }
251
+ sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
252
+ this._userID = startOpts.userID || null;
253
+ this._metadata = startOpts.metadata || {}; // TODO: update both dynamically on corresponding messages
254
+ const startInfo = this.getStartInfo();
255
+ const messageData = {
256
+ ingestPoint: this.options.ingestPoint,
257
+ pageNo,
258
+ startTimestamp: startInfo.timestamp,
259
+ connAttemptCount: this.options.connAttemptCount,
260
+ connAttemptGap: this.options.connAttemptGap,
261
+ };
262
+ this.worker.postMessage(messageData); // brings delay of 10th ms?
263
+ const sReset = sessionStorage.getItem(this.options.session_reset_key);
264
+ sessionStorage.removeItem(this.options.session_reset_key);
265
+ return window.fetch(this.options.ingestPoint + '/v1/web/start', {
266
+ method: 'POST',
267
+ headers: {
268
+ 'Content-Type': 'application/json',
269
+ },
270
+ body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { token: sessionStorage.getItem(this.options.session_token_key), deviceMemory: performance_js_1.deviceMemory,
271
+ jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
272
+ })
273
+ .then(r => {
274
+ if (r.status === 200) {
275
+ return r.json();
276
+ }
277
+ else {
278
+ return r.text().then(text => text === exports.CANCELED
279
+ ? Promise.reject(exports.CANCELED) // TODO: return {error: CANCELED} instead
280
+ : Promise.reject(`Server error: ${r.status}. ${text}`));
281
+ }
282
+ })
283
+ .then(r => {
194
284
  if (!this.worker) {
195
- return Promise.reject("No worker found: perhaps, CSP is not set.");
285
+ return Promise.reject("no worker found after start request (this might not happen)");
196
286
  }
197
- this.isActive = true;
198
- let pageNo = 0;
199
- const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
200
- if (pageNoStr != null) {
201
- pageNo = parseInt(pageNoStr);
202
- pageNo++;
287
+ const { token, userUUID, sessionID, beaconSizeLimit } = r;
288
+ if (typeof token !== 'string' ||
289
+ typeof userUUID !== 'string' ||
290
+ (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
291
+ return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
203
292
  }
204
- sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
205
- const startTimestamp = (0, utils_js_1.timestamp)();
206
- const messageData = {
207
- ingestPoint: this.options.ingestPoint,
208
- pageNo,
209
- startTimestamp,
210
- connAttemptCount: this.options.connAttemptCount,
211
- connAttemptGap: this.options.connAttemptGap,
212
- };
213
- this.worker.postMessage(messageData); // brings delay of 10th ms?
214
- // let token = sessionStorage.getItem(this.options.session_token_key)
215
- // const tokenIsActive = localStorage.getItem("__or_at_" + token)
216
- // if (tokenIsActive) {
217
- // token = null
218
- // }
219
- const sReset = sessionStorage.getItem(this.options.session_reset_key);
220
- sessionStorage.removeItem(this.options.session_reset_key);
221
- return window.fetch(this.options.ingestPoint + '/v1/web/start', {
222
- method: 'POST',
223
- headers: {
224
- 'Content-Type': 'application/json',
225
- },
226
- body: JSON.stringify({
227
- token: sessionStorage.getItem(this.options.session_token_key),
228
- userUUID: localStorage.getItem(this.options.local_uuid_key),
229
- projectKey: this.projectKey,
230
- revID: this.revID,
231
- timestamp: startTimestamp,
232
- trackerVersion: this.version,
233
- isSnippet: this.options.__is_snippet,
234
- deviceMemory: performance_js_1.deviceMemory,
235
- jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit,
236
- reset: reset || sReset !== null,
237
- }),
238
- })
239
- .then(r => {
240
- if (r.status === 200) {
241
- return r.json();
242
- }
243
- else { // TODO: handle canceling && 403
244
- return r.text().then(text => {
245
- throw new Error(`Server error: ${r.status}. ${text}`);
246
- });
247
- }
248
- })
249
- .then(r => {
250
- const { token, userUUID, sessionID, beaconSizeLimit } = r;
251
- if (typeof token !== 'string' ||
252
- typeof userUUID !== 'string' ||
253
- (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
254
- throw new Error(`Incorrect server response: ${JSON.stringify(r)}`);
255
- }
256
- sessionStorage.setItem(this.options.session_token_key, token);
257
- localStorage.setItem(this.options.local_uuid_key, userUUID);
258
- // localStorage.setItem("__or_at_" + token, "true")
259
- // this.attachEventListener(window, 'beforeunload', ()=>{
260
- // localStorage.removeItem("__or_at_" + token)
261
- // }, false);
262
- // this.attachEventListener(window, 'pagehide', ()=>{
263
- // localStorage.removeItem("__or_at_" + token)
264
- // }, false);
265
- if (typeof sessionID === 'string') {
266
- this._sessionID = sessionID;
267
- }
268
- if (!this.worker) {
269
- throw new Error("no worker found after start request (this might not happen)");
270
- }
271
- this.worker.postMessage({ token, beaconSizeLimit });
272
- this.startCallbacks.forEach((cb) => cb());
273
- this.observer.observe();
274
- this.ticker.start();
275
- (0, utils_js_1.log)("OpenReplay tracking started.");
276
- const onStartInfo = { sessionToken: token, userUUID, sessionID };
277
- if (typeof this.options.onStart === 'function') {
278
- this.options.onStart(onStartInfo);
279
- }
280
- return onStartInfo;
281
- })
282
- .catch(e => {
283
- sessionStorage.removeItem(this.options.session_token_key);
284
- this.stop();
285
- (0, utils_js_1.warn)("OpenReplay was unable to start. ", e);
286
- this._debug("session_start", e);
287
- throw e;
288
- });
289
- }
290
- return Promise.reject("Player is already active");
293
+ sessionStorage.setItem(this.options.session_token_key, token);
294
+ localStorage.setItem(this.options.local_uuid_key, userUUID);
295
+ if (typeof sessionID === 'string') {
296
+ this._sessionID = sessionID;
297
+ }
298
+ this.activityState = ActivityState.Active;
299
+ this.worker.postMessage({ token, beaconSizeLimit });
300
+ this.startCallbacks.forEach((cb) => cb());
301
+ this.observer.observe();
302
+ this.ticker.start();
303
+ Object.entries(this._metadata).forEach(([key, value]) => this.send(new index_js_1.Metadata(key, value)));
304
+ this.notify.log("OpenReplay tracking started.");
305
+ // TODO: get rid of onStart
306
+ const onStartInfo = { sessionToken: token, userUUID, sessionID };
307
+ if (typeof this.options.onStart === 'function') {
308
+ this.options.onStart(onStartInfo);
309
+ }
310
+ return onStartInfo;
311
+ })
312
+ .catch(reason => {
313
+ sessionStorage.removeItem(this.options.session_token_key);
314
+ this.stop();
315
+ //if (reason === CANCELED) { return Promise.resolve(CANCELED) } // TODO: what to return ????? Throwing is baad
316
+ if (reason !== exports.CANCELED) {
317
+ this.notify.log("OpenReplay was unable to start. ", reason);
318
+ this._debug("session_start", reason);
319
+ }
320
+ return Promise.reject(reason);
321
+ });
291
322
  }
292
- start(reset = false) {
323
+ start(options = { forceNew: false }) {
293
324
  if (!document.hidden) {
294
- return this._start(reset);
325
+ return this._start(options);
295
326
  }
296
327
  else {
297
328
  return new Promise((resolve) => {
298
329
  const onVisibilityChange = () => {
299
330
  if (!document.hidden) {
300
331
  document.removeEventListener("visibilitychange", onVisibilityChange);
301
- resolve(this._start(reset));
332
+ resolve(this._start(options));
302
333
  }
303
334
  };
304
335
  document.addEventListener("visibilitychange", onVisibilityChange);
@@ -306,7 +337,7 @@ class App {
306
337
  }
307
338
  }
308
339
  stop() {
309
- if (this.isActive) {
340
+ if (this.activityState !== ActivityState.NotActive) {
310
341
  try {
311
342
  if (this.worker) {
312
343
  this.worker.postMessage("stop");
@@ -316,10 +347,10 @@ class App {
316
347
  this.nodes.clear();
317
348
  this.ticker.stop();
318
349
  this.stopCallbacks.forEach((cb) => cb());
319
- (0, utils_js_1.log)("OpenReplay tracking stopped.");
350
+ this.notify.log("OpenReplay tracking stopped.");
320
351
  }
321
352
  finally {
322
- this.isActive = false;
353
+ this.activityState = ActivityState.NotActive;
323
354
  }
324
355
  }
325
356
  }
@@ -0,0 +1,27 @@
1
+ export declare const LogLevel: {
2
+ readonly Verbose: 4;
3
+ readonly Errors: 4;
4
+ readonly Warnings: 3;
5
+ readonly Log: 2;
6
+ readonly Silent: 0;
7
+ };
8
+ declare type LogLevel = typeof LogLevel[keyof typeof LogLevel];
9
+ declare type CustomLevel = {
10
+ error: boolean;
11
+ warn: boolean;
12
+ log: boolean;
13
+ };
14
+ interface _Options {
15
+ level: LogLevel | CustomLevel;
16
+ messages?: number[];
17
+ }
18
+ export declare type Options = true | _Options | LogLevel;
19
+ export default class Logger {
20
+ private readonly options;
21
+ private readonly opts;
22
+ constructor(options?: Options);
23
+ log(...args: any): void;
24
+ warn(...args: any): void;
25
+ error(...args: any): void;
26
+ }
27
+ export {};
package/cjs/app/logger.js CHANGED
@@ -1 +1,43 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LogLevel = void 0;
4
+ exports.LogLevel = {
5
+ Verbose: 4,
6
+ Errors: 4,
7
+ Warnings: 3,
8
+ Log: 2,
9
+ Silent: 0,
10
+ };
11
+ function IsCustomLevel(l) {
12
+ return typeof l === 'object';
13
+ }
14
+ class Logger {
15
+ constructor(options = exports.LogLevel.Silent) {
16
+ this.options = options;
17
+ this.opts = options === true
18
+ ? { level: exports.LogLevel.Verbose }
19
+ : typeof options === "number" ? { level: options } : options;
20
+ }
21
+ log(...args) {
22
+ if (IsCustomLevel(this.opts.level)
23
+ ? this.opts.level.log
24
+ : this.opts.level >= exports.LogLevel.Log) {
25
+ console.log(...args);
26
+ }
27
+ }
28
+ warn(...args) {
29
+ if (IsCustomLevel(this.opts.level)
30
+ ? this.opts.level.warn
31
+ : this.opts.level >= exports.LogLevel.Warnings) {
32
+ console.warn(...args);
33
+ }
34
+ }
35
+ error(...args) {
36
+ if (IsCustomLevel(this.opts.level)
37
+ ? this.opts.level.error
38
+ : this.opts.level >= exports.LogLevel.Errors) {
39
+ console.error(...args);
40
+ }
41
+ }
42
+ }
43
+ exports.default = Logger;
package/cjs/index.d.ts CHANGED
@@ -2,18 +2,20 @@ import App from "./app/index.js";
2
2
  export { default as App } from './app/index.js';
3
3
  import * as _Messages from "./messages/index.js";
4
4
  export declare const Messages: typeof _Messages;
5
- import { Options as AppOptions } from "./app/index.js";
6
- import { Options as ConsoleOptions } from "./modules/console.js";
7
- import { Options as ExceptionOptions } from "./modules/exception.js";
8
- import { Options as InputOptions } from "./modules/input.js";
9
- import { Options as PerformanceOptions } from "./modules/performance.js";
10
- import { Options as TimingOptions } from "./modules/timing.js";
11
- export type { OnStartInfo } from './app/index.js';
5
+ import type { Options as AppOptions } from "./app/index.js";
6
+ import type { Options as ConsoleOptions } from "./modules/console.js";
7
+ import type { Options as ExceptionOptions } from "./modules/exception.js";
8
+ import type { Options as InputOptions } from "./modules/input.js";
9
+ import type { Options as PerformanceOptions } from "./modules/performance.js";
10
+ import type { Options as TimingOptions } from "./modules/timing.js";
11
+ import type { StartOptions } from './app/index.js';
12
+ import type { OnStartInfo } from './app/index.js';
12
13
  export declare type Options = Partial<AppOptions & ConsoleOptions & ExceptionOptions & InputOptions & PerformanceOptions & TimingOptions> & {
13
14
  projectID?: number;
14
15
  projectKey: string;
15
16
  sessionToken?: string;
16
17
  respectDoNotTrack?: boolean;
18
+ autoResetOnWindowOpen?: boolean;
17
19
  __DISABLE_SECURE_MODE?: boolean;
18
20
  };
19
21
  export default class API {
@@ -22,8 +24,7 @@ export default class API {
22
24
  constructor(options: Options);
23
25
  use<T>(fn: (app: App | null, options?: Options) => T): T;
24
26
  isActive(): boolean;
25
- active(): boolean;
26
- start(): Promise<import("./app/index.js").OnStartInfo>;
27
+ start(startOpts?: StartOptions): Promise<OnStartInfo>;
27
28
  stop(): void;
28
29
  getSessionToken(): string | null | undefined;
29
30
  getSessionID(): string | null | undefined;
@@ -37,5 +38,4 @@ export default class API {
37
38
  event(key: string, payload: any, issue?: boolean): void;
38
39
  issue(key: string, payload: any): void;
39
40
  handleError: (e: Error | ErrorEvent | PromiseRejectionEvent) => void;
40
- resetNextPageSession(flag: boolean): void;
41
41
  }