@openreplay/tracker 3.5.12 → 3.5.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/cjs/app/guards.d.ts +18 -0
  2. package/cjs/app/guards.js +24 -0
  3. package/cjs/app/index.d.ts +5 -1
  4. package/cjs/app/index.js +55 -32
  5. package/cjs/app/nodes.d.ts +3 -3
  6. package/cjs/app/nodes.js +2 -2
  7. package/cjs/app/observer/observer.d.ts +1 -2
  8. package/cjs/app/observer/observer.js +73 -60
  9. package/cjs/app/observer/top_observer.js +3 -3
  10. package/cjs/app/sanitizer.d.ts +3 -1
  11. package/cjs/app/sanitizer.js +13 -2
  12. package/cjs/app/session.d.ts +2 -7
  13. package/cjs/app/session.js +24 -37
  14. package/cjs/index.js +2 -2
  15. package/cjs/modules/console.d.ts +1 -1
  16. package/cjs/modules/console.js +2 -1
  17. package/cjs/modules/cssrules.d.ts +1 -1
  18. package/cjs/modules/cssrules.js +2 -4
  19. package/cjs/modules/exception.d.ts +1 -1
  20. package/cjs/modules/img.d.ts +1 -1
  21. package/cjs/modules/img.js +14 -6
  22. package/cjs/modules/input.d.ts +2 -1
  23. package/cjs/modules/input.js +18 -20
  24. package/cjs/modules/longtasks.d.ts +1 -1
  25. package/cjs/modules/mouse.d.ts +1 -1
  26. package/cjs/modules/mouse.js +3 -2
  27. package/cjs/modules/performance.d.ts +1 -1
  28. package/cjs/modules/scroll.d.ts +1 -1
  29. package/cjs/modules/scroll.js +3 -2
  30. package/cjs/modules/timing.d.ts +1 -1
  31. package/cjs/modules/timing.js +2 -1
  32. package/cjs/modules/viewport.d.ts +1 -1
  33. package/lib/app/guards.d.ts +18 -0
  34. package/lib/app/guards.js +16 -0
  35. package/lib/app/index.d.ts +5 -1
  36. package/lib/app/index.js +56 -33
  37. package/lib/app/nodes.d.ts +3 -3
  38. package/lib/app/nodes.js +2 -2
  39. package/lib/app/observer/observer.d.ts +1 -2
  40. package/lib/app/observer/observer.js +70 -57
  41. package/lib/app/observer/top_observer.js +3 -3
  42. package/lib/app/sanitizer.d.ts +3 -1
  43. package/lib/app/sanitizer.js +13 -2
  44. package/lib/app/session.d.ts +2 -7
  45. package/lib/app/session.js +24 -37
  46. package/lib/common/tsconfig.tsbuildinfo +1 -1
  47. package/lib/index.js +2 -2
  48. package/lib/modules/console.d.ts +1 -1
  49. package/lib/modules/console.js +2 -1
  50. package/lib/modules/cssrules.d.ts +1 -1
  51. package/lib/modules/cssrules.js +2 -4
  52. package/lib/modules/exception.d.ts +1 -1
  53. package/lib/modules/img.d.ts +1 -1
  54. package/lib/modules/img.js +14 -6
  55. package/lib/modules/input.d.ts +2 -1
  56. package/lib/modules/input.js +18 -20
  57. package/lib/modules/longtasks.d.ts +1 -1
  58. package/lib/modules/mouse.d.ts +1 -1
  59. package/lib/modules/mouse.js +3 -2
  60. package/lib/modules/performance.d.ts +1 -1
  61. package/lib/modules/scroll.d.ts +1 -1
  62. package/lib/modules/scroll.js +3 -2
  63. package/lib/modules/timing.d.ts +1 -1
  64. package/lib/modules/timing.js +2 -1
  65. package/lib/modules/viewport.d.ts +1 -1
  66. package/package.json +7 -7
  67. package/cjs/app/context.d.ts +0 -18
  68. package/cjs/app/context.js +0 -73
  69. package/lib/app/context.d.ts +0 -18
  70. package/lib/app/context.js +0 -68
@@ -0,0 +1,18 @@
1
+ export declare function isSVGElement(node: Element): node is SVGElement;
2
+ export declare function isElementNode(node: Node): node is Element;
3
+ export declare function isTextNode(node: Node): node is Text;
4
+ export declare function isRootNode(node: Node): boolean;
5
+ declare type TagTypeMap = {
6
+ HTML: HTMLHtmlElement;
7
+ IMG: HTMLImageElement;
8
+ INPUT: HTMLInputElement;
9
+ TEXTAREA: HTMLTextAreaElement;
10
+ SELECT: HTMLSelectElement;
11
+ LABEL: HTMLLabelElement;
12
+ IFRAME: HTMLIFrameElement;
13
+ STYLE: HTMLStyleElement;
14
+ style: SVGStyleElement;
15
+ LINK: HTMLLinkElement;
16
+ };
17
+ export declare function hasTag<T extends keyof TagTypeMap>(el: Node, tagName: T): el is TagTypeMap[typeof tagName];
18
+ export {};
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasTag = exports.isRootNode = exports.isTextNode = exports.isElementNode = exports.isSVGElement = void 0;
4
+ function isSVGElement(node) {
5
+ return node.namespaceURI === 'http://www.w3.org/2000/svg';
6
+ }
7
+ exports.isSVGElement = isSVGElement;
8
+ function isElementNode(node) {
9
+ return node.nodeType === Node.ELEMENT_NODE;
10
+ }
11
+ exports.isElementNode = isElementNode;
12
+ function isTextNode(node) {
13
+ return node.nodeType === Node.TEXT_NODE;
14
+ }
15
+ exports.isTextNode = isTextNode;
16
+ function isRootNode(node) {
17
+ return node.nodeType === Node.DOCUMENT_NODE ||
18
+ node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
19
+ }
20
+ exports.isRootNode = isRootNode;
21
+ function hasTag(el, tagName) {
22
+ return el.nodeName === tagName;
23
+ }
24
+ exports.hasTag = hasTag;
@@ -44,6 +44,8 @@ declare type AppOptions = {
44
44
  __is_snippet: boolean;
45
45
  __debug_report_edp: string | null;
46
46
  __debug__?: LoggerOptions;
47
+ localStorage: Storage;
48
+ sessionStorage: Storage;
47
49
  onStart?: StartCallback;
48
50
  } & WebworkerOptions;
49
51
  export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
@@ -56,6 +58,8 @@ export default class App {
56
58
  readonly debug: Logger;
57
59
  readonly notify: Logger;
58
60
  readonly session: Session;
61
+ readonly localStorage: Storage;
62
+ readonly sessionStorage: Storage;
59
63
  private readonly messages;
60
64
  private readonly observer;
61
65
  private readonly startCallbacks;
@@ -99,6 +103,6 @@ export default class App {
99
103
  resetNextPageSession(flag: boolean): void;
100
104
  private _start;
101
105
  start(options?: StartOptions): Promise<StartPromiseReturn>;
102
- stop(): void;
106
+ stop(calledFromAPI?: boolean): void;
103
107
  }
104
108
  export {};
package/cjs/app/index.js CHANGED
@@ -32,7 +32,7 @@ class App {
32
32
  this.stopCallbacks = [];
33
33
  this.commitCallbacks = [];
34
34
  this.activityState = ActivityState.NotActive;
35
- this.version = '3.5.12'; // TODO: version compatability check inside each plugin.
35
+ this.version = '3.5.14'; // TODO: version compatability check inside each plugin.
36
36
  this.projectKey = projectKey;
37
37
  this.options = Object.assign({
38
38
  revID: '',
@@ -46,10 +46,9 @@ class App {
46
46
  verbose: false,
47
47
  __is_snippet: false,
48
48
  __debug_report_edp: null,
49
+ localStorage: window.localStorage,
50
+ sessionStorage: window.sessionStorage,
49
51
  }, options);
50
- if (sessionToken != null) {
51
- sessionStorage.setItem(this.options.session_token_key, sessionToken);
52
- }
53
52
  this.revID = this.options.revID;
54
53
  this.sanitizer = new sanitizer_js_1.default(this, options);
55
54
  this.nodes = new nodes_js_1.default(this.options.node_id);
@@ -58,9 +57,22 @@ class App {
58
57
  this.ticker.attach(() => this.commit());
59
58
  this.debug = new logger_js_1.default(this.options.__debug__);
60
59
  this.notify = new logger_js_1.default(this.options.verbose ? logger_js_1.LogLevel.Warnings : logger_js_1.LogLevel.Silent);
61
- this.session = new session_js_1.default(this);
60
+ this.session = new session_js_1.default();
61
+ this.session.attachUpdateCallback(({ userID, metadata }) => {
62
+ if (userID != null) { // TODO: nullable userID
63
+ this.send(new messages_js_1.UserID(userID));
64
+ }
65
+ if (metadata != null) {
66
+ Object.entries(metadata).forEach(([key, value]) => this.send(new messages_js_1.Metadata(key, value)));
67
+ }
68
+ });
69
+ this.localStorage = this.options.localStorage;
70
+ this.sessionStorage = this.options.sessionStorage;
71
+ if (sessionToken != null) {
72
+ this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
73
+ }
62
74
  try {
63
- this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function i(...i){return new t(...i)}return i.prototype=t.prototype,i}const i=new Map;const s=t(class{constructor(t,i,s){this.pageNo=t,this.firstIndex=i,this.timestamp=s,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});i.set(80,s);const e=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});i.set(0,e);const n=t(class{constructor(t,i,s){this.url=t,this.referrer=i,this.navigationStart=s,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});i.set(4,n);const r=t(class{constructor(t,i){this.width=t,this.height=i,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});i.set(5,r);const h=t(class{constructor(t,i){this.x=t,this.y=i,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});i.set(6,h);const o=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});i.set(7,o);const c=t(class{constructor(t,i,s,e,n){this.id=t,this.parentID=i,this.index=s,this.tag=e,this.svg=n,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});i.set(8,c);const a=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(9,a);const u=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(10,u);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});i.set(11,d);const l=t(class{constructor(t,i,s){this.id=t,this.name=i,this.value=s,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});i.set(12,l);const p=t(class{constructor(t,i){this.id=t,this.name=i,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});i.set(13,p);const m=t(class{constructor(t,i){this.id=t,this.data=i,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});i.set(14,m);const g=t(class{constructor(t,i,s){this.id=t,this.x=i,this.y=s,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});i.set(16,g);const f=t(class{constructor(t,i){this.id=t,this.label=i,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});i.set(17,f);const y=t(class{constructor(t,i,s){this.id=t,this.value=i,this.mask=s,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});i.set(18,y);const _=t(class{constructor(t,i){this.id=t,this.checked=i,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});i.set(19,_);const v=t(class{constructor(t,i){this.x=t,this.y=i,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});i.set(20,v);const b=t(class{constructor(t,i){this.level=t,this.value=i,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});i.set(22,b);const S=t(class{constructor(t,i,s,e,n,r,h,o,c){this.requestStart=t,this.responseStart=i,this.responseEnd=s,this.domContentLoadedEventStart=e,this.domContentLoadedEventEnd=n,this.loadEventStart=r,this.loadEventEnd=h,this.firstPaint=o,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});i.set(23,S);const w=t(class{constructor(t,i,s){this.speedIndex=t,this.visuallyComplete=i,this.timeToInteractive=s,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});i.set(24,w);const E=t(class{constructor(t,i,s){this.name=t,this.message=i,this.payload=s,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});i.set(25,E);const x=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});i.set(27,x);const T=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});i.set(28,T);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});i.set(29,z);const k=t(class{constructor(t,i){this.key=t,this.value=i,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});i.set(30,k);const I=t(class{constructor(t,i,s){this.id=t,this.rule=i,this.index=s,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});i.set(37,I);const M=t(class{constructor(t,i){this.id=t,this.index=i,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});i.set(38,M);const B=t(class{constructor(t,i,s,e,n,r,h){this.method=t,this.url=i,this.request=s,this.response=e,this.status=n,this.timestamp=r,this.duration=h,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});i.set(39,B);const L=t(class{constructor(t,i,s,e){this.name=t,this.duration=i,this.args=s,this.result=e,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});i.set(40,L);const C=t(class{constructor(t,i){this.key=t,this.value=i,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});i.set(41,C);const A=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});i.set(42,A);const U=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(44,U);const N=t(class{constructor(t,i){this.mutation=t,this.state=i,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});i.set(45,N);const R=t(class{constructor(t,i){this.type=t,this.payload=i,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});i.set(46,R);const O=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(47,O);const P=t(class{constructor(t,i,s,e){this.operationKind=t,this.operationName=i,this.variables=s,this.response=e,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});i.set(48,P);const q=t(class{constructor(t,i,s,e){this.frames=t,this.ticks=i,this.totalJSHeapSize=s,this.usedJSHeapSize=e,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});i.set(49,q);const D=t(class{constructor(t,i,s,e,n,r,h,o){this.timestamp=t,this.duration=i,this.ttfb=s,this.headerSize=e,this.encodedBodySize=n,this.decodedBodySize=r,this.url=h,this.initiator=o,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});i.set(53,D);const W=t(class{constructor(t,i){this.downlink=t,this.type=i,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});i.set(54,W);const H=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});i.set(55,H);const J=t(class{constructor(t,i,s,e,n,r,h){this.timestamp=t,this.duration=i,this.context=s,this.containerType=e,this.containerSrc=n,this.containerId=r,this.containerName=h,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});i.set(59,J);const F=t(class{constructor(t,i,s,e){this.id=t,this.name=i,this.value=s,this.baseURL=e,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});i.set(60,F);const X=t(class{constructor(t,i,s){this.id=t,this.data=i,this.baseURL=s,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});i.set(61,X);const G=t(class{constructor(t,i){this.type=t,this.value=i,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});i.set(63,G);const K=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});i.set(64,K);const j=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});i.set(65,j);const Q=t(class{constructor(t,i,s,e){this.id=t,this.rule=i,this.index=s,this.baseURL=e,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});i.set(67,Q);const V=t(class{constructor(t,i,s,e){this.id=t,this.hesitationTime=i,this.label=s,this.selector=e,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});i.set(69,V);const Y=t(class{constructor(t,i){this.frameID=t,this.id=i,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});i.set(70,Y);class Z{constructor(t,i,s,e=10,n=1e3){this.onUnauthorised=i,this.onFailure=s,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();if(i.status>=400)return void this.retry(t);this.attemptsCount=0;const s=this.queue.shift();s?this.sendBatch(s):this.busy=!1}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0}}const tt="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(var n=0,r=0,h=0;h!==i;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===i){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;break}if(!((r=t.charCodeAt(h))>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(h+=1,(n=1024*(n-55296)+r-56320+65536)>65535){s[e+=1]=240|n>>>18,s[e+=1]=128|n>>>12&63,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n;continue}}n<=127?s[e+=1]=0|n:n<=2047?(s[e+=1]=192|n>>>6,s[e+=1]=128|63&n):(s[e+=1]=224|n>>>12,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n)}return s.subarray(0,e+1)}};class it{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const i=tt.encode(t),s=i.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(i,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}class st{constructor(t,i,s){this.pageNo=t,this.timestamp=i,this.onBatch=s,this.nextIndex=0,this.beaconSize=2e5,this.writer=new it(this.beaconSize),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepareBatchMeta()}prepareBatchMeta(){return new s(this.pageNo,this.nextIndex,this.timestamp).encode(this.writer)}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){if(t instanceof e&&(this.timestamp=t.timestamp),!t.encode(this.writer))for(this.isEmpty||(this.onBatch(this.writer.flush()),this.prepareBatchMeta());!t.encode(this.writer);){if(this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message."),this.writer.reset(),this.prepareBatchMeta(),void(this.isEmpty=!0);this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.writer=new it(this.beaconSize),this.prepareBatchMeta()}this.writer.checkpoint(),this.nextIndex++,this.isEmpty=!1}finaliseBatch(){this.isEmpty||(this.onBatch(this.writer.flush()),this.prepareBatchMeta(),this.isEmpty=!0)}clean(){this.writer.reset()}}let et=null,nt=null;function rt(){nt&&nt.finaliseBatch()}function ht(){null!==ct&&(clearInterval(ct),ct=null),nt&&(nt.clean(),nt=null)}let ot,ct=null;self.onmessage=({data:t})=>{if(null!=t){if("stop"===t)return rt(),void ht();if(Array.isArray(t)){if(!nt)throw new Error("WebWorker: writer not initialised.");const s=nt;t.forEach(t=>{const e=new(i.get(t._id));Object.assign(e,t),e instanceof H&&(e.hidden?ot=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ot)),s.writeMessage(e)})}else{if("start"===t.type)return et=new Z(t.ingestPoint,()=>{self.postMessage("restart")},()=>{et&&(et.clean(),et=null),ht(),self.postMessage("failed")},t.connAttemptCount,t.connAttemptGap),nt=new st(t.pageNo,t.timestamp,t=>et&&et.push(t)),void(null===ct&&(ct=setInterval(rt,1e4)));if("auth"===t.type){if(!et)throw new Error("WebWorker: sender not initialised. Recieved auth.");if(!nt)throw new Error("WebWorker: writer not initialised. Recieved auth.");return et.authorise(t.token),void(t.beaconSizeLimit&&nt.setBeaconSizeLimit(t.beaconSizeLimit))}}}else rt()};
75
+ this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function i(...i){return new t(...i)}return i.prototype=t.prototype,i}const i=new Map;const s=t(class{constructor(t,i,s){this.pageNo=t,this.firstIndex=i,this.timestamp=s,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});i.set(80,s);const e=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});i.set(0,e);const n=t(class{constructor(t,i,s){this.url=t,this.referrer=i,this.navigationStart=s,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});i.set(4,n);const r=t(class{constructor(t,i){this.width=t,this.height=i,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});i.set(5,r);const h=t(class{constructor(t,i){this.x=t,this.y=i,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});i.set(6,h);const o=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});i.set(7,o);const c=t(class{constructor(t,i,s,e,n){this.id=t,this.parentID=i,this.index=s,this.tag=e,this.svg=n,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});i.set(8,c);const a=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(9,a);const u=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(10,u);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});i.set(11,d);const l=t(class{constructor(t,i,s){this.id=t,this.name=i,this.value=s,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});i.set(12,l);const p=t(class{constructor(t,i){this.id=t,this.name=i,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});i.set(13,p);const g=t(class{constructor(t,i){this.id=t,this.data=i,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});i.set(14,g);const m=t(class{constructor(t,i,s){this.id=t,this.x=i,this.y=s,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});i.set(16,m);const f=t(class{constructor(t,i){this.id=t,this.label=i,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});i.set(17,f);const y=t(class{constructor(t,i,s){this.id=t,this.value=i,this.mask=s,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});i.set(18,y);const _=t(class{constructor(t,i){this.id=t,this.checked=i,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});i.set(19,_);const v=t(class{constructor(t,i){this.x=t,this.y=i,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});i.set(20,v);const S=t(class{constructor(t,i){this.level=t,this.value=i,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});i.set(22,S);const b=t(class{constructor(t,i,s,e,n,r,h,o,c){this.requestStart=t,this.responseStart=i,this.responseEnd=s,this.domContentLoadedEventStart=e,this.domContentLoadedEventEnd=n,this.loadEventStart=r,this.loadEventEnd=h,this.firstPaint=o,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});i.set(23,b);const w=t(class{constructor(t,i,s){this.speedIndex=t,this.visuallyComplete=i,this.timeToInteractive=s,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});i.set(24,w);const E=t(class{constructor(t,i,s){this.name=t,this.message=i,this.payload=s,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});i.set(25,E);const x=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});i.set(27,x);const T=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});i.set(28,T);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});i.set(29,z);const k=t(class{constructor(t,i){this.key=t,this.value=i,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});i.set(30,k);const A=t(class{constructor(t,i,s){this.id=t,this.rule=i,this.index=s,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});i.set(37,A);const I=t(class{constructor(t,i){this.id=t,this.index=i,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});i.set(38,I);const L=t(class{constructor(t,i,s,e,n,r,h){this.method=t,this.url=i,this.request=s,this.response=e,this.status=n,this.timestamp=r,this.duration=h,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});i.set(39,L);const C=t(class{constructor(t,i,s,e){this.name=t,this.duration=i,this.args=s,this.result=e,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});i.set(40,C);const M=t(class{constructor(t,i){this.key=t,this.value=i,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});i.set(41,M);const N=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});i.set(42,N);const B=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(44,B);const U=t(class{constructor(t,i){this.mutation=t,this.state=i,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});i.set(45,U);const R=t(class{constructor(t,i){this.type=t,this.payload=i,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});i.set(46,R);const O=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(47,O);const P=t(class{constructor(t,i,s,e){this.operationKind=t,this.operationName=i,this.variables=s,this.response=e,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});i.set(48,P);const q=t(class{constructor(t,i,s,e){this.frames=t,this.ticks=i,this.totalJSHeapSize=s,this.usedJSHeapSize=e,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});i.set(49,q);const D=t(class{constructor(t,i,s,e,n,r,h,o){this.timestamp=t,this.duration=i,this.ttfb=s,this.headerSize=e,this.encodedBodySize=n,this.decodedBodySize=r,this.url=h,this.initiator=o,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});i.set(53,D);const W=t(class{constructor(t,i){this.downlink=t,this.type=i,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});i.set(54,W);const H=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});i.set(55,H);const J=t(class{constructor(t,i,s,e,n,r,h){this.timestamp=t,this.duration=i,this.context=s,this.containerType=e,this.containerSrc=n,this.containerId=r,this.containerName=h,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});i.set(59,J);const F=t(class{constructor(t,i,s,e){this.id=t,this.name=i,this.value=s,this.baseURL=e,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});i.set(60,F);const X=t(class{constructor(t,i,s){this.id=t,this.data=i,this.baseURL=s,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});i.set(61,X);const G=t(class{constructor(t,i){this.type=t,this.value=i,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});i.set(63,G);const K=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});i.set(64,K);const j=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});i.set(65,j);const Q=t(class{constructor(t,i,s,e){this.id=t,this.rule=i,this.index=s,this.baseURL=e,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});i.set(67,Q);const V=t(class{constructor(t,i,s,e){this.id=t,this.hesitationTime=i,this.label=s,this.selector=e,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});i.set(69,V);const Y=t(class{constructor(t,i){this.frameID=t,this.id=i,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});i.set(70,Y);class Z{constructor(t,i,s,e=10,n=1e3){this.onUnauthorised=i,this.onFailure=s,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();if(i.status>=400)return void this.retry(t);this.attemptsCount=0;const s=this.queue.shift();s?this.sendBatch(s):this.busy=!1}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0}}const tt="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(var n=0,r=0,h=0;h!==i;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===i){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;break}if(!((r=t.charCodeAt(h))>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(h+=1,(n=1024*(n-55296)+r-56320+65536)>65535){s[e+=1]=240|n>>>18,s[e+=1]=128|n>>>12&63,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n;continue}}n<=127?s[e+=1]=0|n:n<=2047?(s[e+=1]=192|n>>>6,s[e+=1]=128|63&n):(s[e+=1]=224|n>>>12,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n)}return s.subarray(0,e+1)}};class it{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const i=tt.encode(t),s=i.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(i,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}class st{constructor(t,i,s){this.pageNo=t,this.timestamp=i,this.onBatch=s,this.nextIndex=0,this.beaconSize=2e5,this.writer=new it(this.beaconSize),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}prepare(){this.writer.isEmpty()&&new s(this.pageNo,this.nextIndex,this.timestamp).encode(this.writer)}write(t){const i=t.encode(this.writer);return i&&(this.isEmpty=!1,this.writer.checkpoint(),this.nextIndex++),i}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){for(t instanceof e&&(this.timestamp=t.timestamp);!this.write(t);){if(this.finaliseBatch(),this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message."),this.writer.reset(),this.prepare(),void(this.isEmpty=!0);this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.writer=new it(this.beaconSize),this.prepare(),this.isEmpty=!0}}finaliseBatch(){this.isEmpty||(this.onBatch(this.writer.flush()),this.prepare(),this.isEmpty=!0)}clean(){this.writer.reset()}}var et;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(et||(et={}));let nt=null,rt=null;function ht(){rt&&rt.finaliseBatch()}function ot(){et.Stopping,null!==at&&(clearInterval(at),at=null),rt&&(rt.clean(),rt=null),et.NotActive}et.NotActive;let ct,at=null;self.onmessage=({data:t})=>{if(null!=t){if("stop"===t)return ht(),void ot();if(Array.isArray(t)){if(!rt)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const s=rt;t.forEach(t=>{const e=new(i.get(t._id));Object.assign(e,t),e instanceof H&&(e.hidden?ct=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ct)),s.writeMessage(e)})}else{if("start"===t.type)return et.Starting,nt=new Z(t.ingestPoint,()=>{self.postMessage("restart")},()=>{nt&&(nt.clean(),nt=null),ot(),self.postMessage("failed")},t.connAttemptCount,t.connAttemptGap),rt=new st(t.pageNo,t.timestamp,t=>nt&&nt.push(t)),null===at&&(at=setInterval(ht,1e4)),et.Active;if("auth"===t.type){if(!nt)throw new Error("WebWorker: sender not initialised. Received auth.");if(!rt)throw new Error("WebWorker: writer not initialised. Received auth.");return nt.authorise(t.token),void(t.beaconSizeLimit&&rt.setBeaconSizeLimit(t.beaconSizeLimit))}}}else ht()};
64
76
  `], { type: 'text/javascript' })));
65
77
  this.worker.onerror = e => {
66
78
  this._debug("webworker_error", e);
@@ -68,6 +80,7 @@ class App {
68
80
  this.worker.onmessage = ({ data }) => {
69
81
  if (data === "failed") {
70
82
  this.stop();
83
+ this._debug("worker_failed", {}); // add context (from worker)
71
84
  }
72
85
  else if (data === "restart") {
73
86
  this.stop();
@@ -79,9 +92,10 @@ class App {
79
92
  this.worker.postMessage(null);
80
93
  }
81
94
  };
82
- // TODO: keep better tactics, discard others (look https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon)
95
+ // keep better tactics, discard others?
83
96
  this.attachEventListener(window, 'beforeunload', alertWorker, false);
84
- this.attachEventListener(document, 'mouseleave', alertWorker, false, false);
97
+ this.attachEventListener(document.body, 'mouseleave', alertWorker, false, false);
98
+ // TODO: stop session after inactivity timeout (make configurable)
85
99
  this.attachEventListener(document, 'visibilitychange', alertWorker, false);
86
100
  }
87
101
  catch (e) {
@@ -155,8 +169,8 @@ class App {
155
169
  }
156
170
  // TODO: full correct semantic
157
171
  checkRequiredVersion(version) {
158
- const reqVer = version.split('.');
159
- const ver = this.version.split('.');
172
+ const reqVer = version.split(/[.-]/);
173
+ const ver = this.version.split(/[.-]/);
160
174
  for (let i = 0; i < 3; i++) {
161
175
  if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
162
176
  return false;
@@ -166,7 +180,7 @@ class App {
166
180
  }
167
181
  getStartInfo() {
168
182
  return {
169
- userUUID: localStorage.getItem(this.options.local_uuid_key),
183
+ userUUID: this.localStorage.getItem(this.options.local_uuid_key),
170
184
  projectKey: this.projectKey,
171
185
  revID: this.revID,
172
186
  timestamp: (0, utils_js_1.timestamp)(),
@@ -178,7 +192,7 @@ class App {
178
192
  return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
179
193
  }
180
194
  getSessionToken() {
181
- const token = sessionStorage.getItem(this.options.session_token_key);
195
+ const token = this.sessionStorage.getItem(this.options.session_token_key);
182
196
  if (token !== null) {
183
197
  return token;
184
198
  }
@@ -220,10 +234,10 @@ class App {
220
234
  }
221
235
  resetNextPageSession(flag) {
222
236
  if (flag) {
223
- sessionStorage.setItem(this.options.session_reset_key, 't');
237
+ this.sessionStorage.setItem(this.options.session_reset_key, 't');
224
238
  }
225
239
  else {
226
- sessionStorage.removeItem(this.options.session_reset_key);
240
+ this.sessionStorage.removeItem(this.options.session_reset_key);
227
241
  }
228
242
  }
229
243
  _start(startOpts) {
@@ -235,12 +249,12 @@ class App {
235
249
  }
236
250
  this.activityState = ActivityState.Starting;
237
251
  let pageNo = 0;
238
- const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
252
+ const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
239
253
  if (pageNoStr != null) {
240
254
  pageNo = parseInt(pageNoStr);
241
255
  pageNo++;
242
256
  }
243
- sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
257
+ this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
244
258
  const startInfo = this.getStartInfo();
245
259
  const startWorkerMsg = {
246
260
  type: "start",
@@ -250,15 +264,21 @@ class App {
250
264
  connAttemptCount: this.options.connAttemptCount,
251
265
  connAttemptGap: this.options.connAttemptGap,
252
266
  };
253
- this.worker.postMessage(startWorkerMsg); // brings delay of 10th ms?
254
- const sReset = sessionStorage.getItem(this.options.session_reset_key);
255
- sessionStorage.removeItem(this.options.session_reset_key);
267
+ this.worker.postMessage(startWorkerMsg);
268
+ this.session.update({
269
+ // "updating" with old metadata in order to trigger session's UpdateCallbacks.
270
+ // (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
271
+ metadata: startOpts.metadata || this.session.getInfo().metadata,
272
+ userID: startOpts.userID,
273
+ });
274
+ const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
275
+ this.sessionStorage.removeItem(this.options.session_reset_key);
256
276
  return window.fetch(this.options.ingestPoint + '/v1/web/start', {
257
277
  method: 'POST',
258
278
  headers: {
259
279
  'Content-Type': 'application/json',
260
280
  },
261
- body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: startOpts.userID || this.session.getInfo().userID, token: sessionStorage.getItem(this.options.session_token_key), deviceMemory: performance_js_1.deviceMemory,
281
+ body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory: performance_js_1.deviceMemory,
262
282
  jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
263
283
  })
264
284
  .then(r => {
@@ -267,7 +287,7 @@ class App {
267
287
  }
268
288
  else {
269
289
  return r.text().then(text => text === CANCELED
270
- ? Promise.reject(CANCELED) // TODO: return {error: CANCELED} instead
290
+ ? Promise.reject(CANCELED)
271
291
  : Promise.reject(`Server error: ${r.status}. ${text}`));
272
292
  }
273
293
  })
@@ -281,29 +301,29 @@ class App {
281
301
  (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
282
302
  return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
283
303
  }
284
- sessionStorage.setItem(this.options.session_token_key, token);
285
- localStorage.setItem(this.options.local_uuid_key, userUUID);
286
- this.session.update(Object.assign({ sessionID }, startOpts));
287
- this.activityState = ActivityState.Active;
304
+ this.sessionStorage.setItem(this.options.session_token_key, token);
305
+ this.localStorage.setItem(this.options.local_uuid_key, userUUID);
306
+ this.session.update({ sessionID }); // TODO: no no-explicit 'any'
288
307
  const startWorkerMsg = {
289
308
  type: "auth",
290
309
  token,
291
310
  beaconSizeLimit
292
311
  };
293
312
  this.worker.postMessage(startWorkerMsg);
313
+ this.activityState = ActivityState.Active;
294
314
  const onStartInfo = { sessionToken: token, userUUID, sessionID };
295
- this.startCallbacks.forEach((cb) => cb(onStartInfo));
315
+ this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
296
316
  this.observer.observe();
297
317
  this.ticker.start();
298
318
  this.notify.log("OpenReplay tracking started.");
299
- // TODO: get rid of onStart
319
+ // get rid of onStart ?
300
320
  if (typeof this.options.onStart === 'function') {
301
321
  this.options.onStart(onStartInfo);
302
322
  }
303
323
  return SuccessfulStart(onStartInfo);
304
324
  })
305
325
  .catch(reason => {
306
- sessionStorage.removeItem(this.options.session_token_key);
326
+ this.sessionStorage.removeItem(this.options.session_token_key);
307
327
  this.stop();
308
328
  if (reason === CANCELED) {
309
329
  return UnsuccessfulStart(CANCELED);
@@ -329,18 +349,21 @@ class App {
329
349
  });
330
350
  }
331
351
  }
332
- stop() {
352
+ stop(calledFromAPI = false) {
333
353
  if (this.activityState !== ActivityState.NotActive) {
334
354
  try {
335
- if (this.worker) {
336
- this.worker.postMessage("stop");
337
- }
338
355
  this.sanitizer.clear();
339
356
  this.observer.disconnect();
340
357
  this.nodes.clear();
341
358
  this.ticker.stop();
342
359
  this.stopCallbacks.forEach((cb) => cb());
360
+ if (calledFromAPI) {
361
+ this.session.reset();
362
+ }
343
363
  this.notify.log("OpenReplay tracking stopped.");
364
+ if (this.worker) {
365
+ this.worker.postMessage("stop");
366
+ }
344
367
  }
345
368
  finally {
346
369
  this.activityState = ActivityState.NotActive;
@@ -1,4 +1,4 @@
1
- declare type NodeCallback = (node: Node) => void;
1
+ declare type NodeCallback = (node: Node, isStart: boolean) => void;
2
2
  export default class Nodes {
3
3
  private readonly node_id;
4
4
  private readonly nodes;
@@ -7,9 +7,9 @@ export default class Nodes {
7
7
  constructor(node_id: string);
8
8
  attachNodeCallback(nodeCallback: NodeCallback): void;
9
9
  attachElementListener(type: string, node: Element, elementListener: EventListener): void;
10
- registerNode(node: Node): [number, boolean];
10
+ registerNode(node: Node): [id: number, isNew: boolean];
11
11
  unregisterNode(node: Node): number | undefined;
12
- callNodeCallbacks(node: Node): void;
12
+ callNodeCallbacks(node: Node, isStart: boolean): void;
13
13
  getID(node: Node): number | undefined;
14
14
  getNode(id: number): Node | undefined;
15
15
  clear(): void;
package/cjs/app/nodes.js CHANGED
@@ -47,8 +47,8 @@ class Nodes {
47
47
  }
48
48
  return id;
49
49
  }
50
- callNodeCallbacks(node) {
51
- this.nodeCallbacks.forEach((cb) => cb(node));
50
+ callNodeCallbacks(node, isStart) {
51
+ this.nodeCallbacks.forEach((cb) => cb(node, isStart));
52
52
  }
53
53
  getID(node) {
54
54
  return node[this.node_id];
@@ -5,9 +5,8 @@ export default abstract class Observer {
5
5
  private readonly observer;
6
6
  private readonly commited;
7
7
  private readonly recents;
8
- private readonly myNodes;
9
8
  private readonly indexes;
10
- private readonly attributesList;
9
+ private readonly attributesMap;
11
10
  private readonly textSet;
12
11
  constructor(app: App, isTopContext?: boolean);
13
12
  private clear;