@openreplay/tracker 3.5.13-beta.0 → 3.5.13

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.
@@ -1,61 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const messages_js_1 = require("../common/messages.js");
4
- var ActivityState;
5
- (function (ActivityState) {
6
- ActivityState[ActivityState["NotActive"] = 0] = "NotActive";
7
- ActivityState[ActivityState["Starting"] = 1] = "Starting";
8
- ActivityState[ActivityState["Active"] = 2] = "Active";
9
- })(ActivityState || (ActivityState = {}));
10
3
  class Session {
11
- constructor(app) {
12
- this.app = app;
4
+ constructor() {
13
5
  this.metadata = {};
14
6
  this.userID = null;
15
7
  this.sessionID = null;
16
- this.activityState = ActivityState.NotActive;
17
8
  this.callbacks = [];
18
9
  }
19
10
  attachUpdateCallback(cb) {
20
11
  this.callbacks.push(cb);
21
12
  }
22
- handleUpdate() {
23
- const sessInfo = this.getInfo();
24
- if (sessInfo.userID == null) {
25
- delete sessInfo.userID;
13
+ handleUpdate(newInfo) {
14
+ if (newInfo.userID == null) {
15
+ delete newInfo.userID;
26
16
  }
27
- if (sessInfo.sessionID == null) {
28
- delete sessInfo.sessionID;
17
+ if (newInfo.sessionID == null) {
18
+ delete newInfo.sessionID;
29
19
  }
30
- this.callbacks.forEach(cb => cb(sessInfo));
20
+ this.callbacks.forEach(cb => cb(newInfo));
31
21
  }
32
- update({ userID, metadata, sessionID }) {
33
- if (userID != null) { // TODO clear nullable/undefinable types
34
- this._setUserID(userID);
22
+ update(newInfo) {
23
+ if (newInfo.userID !== undefined) { // TODO clear nullable/undefinable types
24
+ this.userID = newInfo.userID;
35
25
  }
36
- if (metadata !== undefined) {
37
- Object.entries(metadata).forEach(kv => this._setMetadata(...kv));
26
+ if (newInfo.metadata !== undefined) {
27
+ Object.entries(newInfo.metadata).forEach(([k, v]) => this.metadata[k] = v);
38
28
  }
39
- if (sessionID !== undefined) {
40
- this.sessionID = sessionID;
29
+ if (newInfo.sessionID !== undefined) {
30
+ this.sessionID = newInfo.sessionID;
41
31
  }
42
- this.handleUpdate();
43
- }
44
- _setMetadata(key, value) {
45
- this.app.send(new messages_js_1.Metadata(key, value));
46
- this.metadata[key] = value;
47
- }
48
- _setUserID(userID) {
49
- this.app.send(new messages_js_1.UserID(userID));
50
- this.userID = userID;
32
+ this.handleUpdate(newInfo);
51
33
  }
52
34
  setMetadata(key, value) {
53
- this._setMetadata(key, value);
54
- this.handleUpdate();
35
+ this.metadata[key] = value;
36
+ this.handleUpdate({ metadata: { [key]: value } });
55
37
  }
56
38
  setUserID(userID) {
57
- this._setUserID(userID);
58
- this.handleUpdate();
39
+ this.userID = userID;
40
+ this.handleUpdate({ userID });
59
41
  }
60
42
  getInfo() {
61
43
  return {
@@ -64,5 +46,10 @@ class Session {
64
46
  userID: this.userID,
65
47
  };
66
48
  }
49
+ reset() {
50
+ this.metadata = {};
51
+ this.userID = null;
52
+ this.sessionID = null;
53
+ }
67
54
  }
68
55
  exports.default = Session;
package/cjs/index.js CHANGED
@@ -127,7 +127,7 @@ class API {
127
127
  // no-cors issue only with text/plain or not-set Content-Type
128
128
  // req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
129
129
  req.send(JSON.stringify({
130
- trackerVersion: '3.5.13-beta.0',
130
+ trackerVersion: '3.5.13',
131
131
  projectKey: options.projectKey,
132
132
  doNotTrack,
133
133
  // TODO: add precise reason (an exact API missing)
@@ -158,7 +158,7 @@ class API {
158
158
  if (this.app === null) {
159
159
  return;
160
160
  }
161
- this.app.stop();
161
+ this.app.stop(true);
162
162
  }
163
163
  getSessionToken() {
164
164
  if (this.app === null) {
@@ -20,7 +20,7 @@ function default_1(app) {
20
20
  if (id === undefined) {
21
21
  return;
22
22
  }
23
- const { src, complete, naturalWidth, naturalHeight } = this;
23
+ const { src, complete, naturalWidth, naturalHeight, srcset } = this;
24
24
  if (!complete) {
25
25
  return;
26
26
  }
@@ -34,18 +34,25 @@ function default_1(app) {
34
34
  }
35
35
  else {
36
36
  app.send(new messages_js_1.SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref()));
37
+ srcset && app.send(new messages_js_1.SetNodeAttribute(id, 'srcset', srcset));
37
38
  }
38
39
  });
39
40
  const observer = new MutationObserver((mutations) => {
40
41
  for (const mutation of mutations) {
41
- if (mutation.type === "attributes" && mutation.attributeName === "src") {
42
+ if (mutation.type === "attributes") {
42
43
  const target = mutation.target;
43
44
  const id = app.nodes.getID(target);
44
45
  if (id === undefined) {
45
46
  return;
46
47
  }
47
- const src = target.src;
48
- app.send(new messages_js_1.SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref()));
48
+ if (mutation.attributeName === "src") {
49
+ const src = target.src;
50
+ app.send(new messages_js_1.SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref()));
51
+ }
52
+ if (mutation.attributeName === "srcset") {
53
+ const srcset = target.srcset;
54
+ app.send(new messages_js_1.SetNodeAttribute(id, 'srcset', srcset));
55
+ }
49
56
  }
50
57
  }
51
58
  });
@@ -56,7 +63,7 @@ function default_1(app) {
56
63
  app.nodes.attachElementListener('error', node, sendImgSrc);
57
64
  app.nodes.attachElementListener('load', node, sendImgSrc);
58
65
  sendImgSrc.call(node);
59
- observer.observe(node, { attributes: true });
66
+ observer.observe(node, { attributes: true, attributeFilter: ["src", "srcset"] });
60
67
  });
61
68
  }
62
69
  exports.default = default_1;
@@ -10,6 +10,7 @@ export interface Options {
10
10
  obscureInputNumbers: boolean;
11
11
  obscureInputEmails: boolean;
12
12
  defaultInputMode: InputMode;
13
+ obscureInputDates: boolean;
13
14
  }
14
15
  export default function (app: App, opts: Partial<Options>): void;
15
16
  export {};
@@ -4,6 +4,7 @@ exports.getInputLabel = void 0;
4
4
  const utils_js_1 = require("../utils.js");
5
5
  const guards_js_1 = require("../app/guards.js");
6
6
  const messages_js_1 = require("../common/messages.js");
7
+ const INPUT_TYPES = ['text', 'password', 'email', 'search', 'number', 'range', 'date'];
7
8
  function isTextEditable(node) {
8
9
  if ((0, guards_js_1.hasTag)(node, "TEXTAREA")) {
9
10
  return true;
@@ -11,13 +12,7 @@ function isTextEditable(node) {
11
12
  if (!(0, guards_js_1.hasTag)(node, "INPUT")) {
12
13
  return false;
13
14
  }
14
- const type = node.type;
15
- return (type === 'text' ||
16
- type === 'password' ||
17
- type === 'email' ||
18
- type === 'search' ||
19
- type === 'number' ||
20
- type === 'range');
15
+ return INPUT_TYPES.includes(node.type);
21
16
  }
22
17
  function isCheckable(node) {
23
18
  if (!(0, guards_js_1.hasTag)(node, "INPUT")) {
@@ -73,6 +68,7 @@ function default_1(app, opts) {
73
68
  obscureInputNumbers: true,
74
69
  obscureInputEmails: true,
75
70
  defaultInputMode: 0 /* InputMode.Plain */,
71
+ obscureInputDates: false,
76
72
  }, opts);
77
73
  function sendInputTarget(id, node) {
78
74
  const label = getInputLabel(node);
@@ -88,7 +84,8 @@ function default_1(app, opts) {
88
84
  }
89
85
  else if ((0, utils_js_1.hasOpenreplayAttribute)(node, 'obscured') ||
90
86
  (inputMode === 0 /* InputMode.Plain */ &&
91
- ((options.obscureInputNumbers && /\d\d\d\d/.test(value)) ||
87
+ ((options.obscureInputNumbers && node.type !== 'date' && /\d\d\d\d/.test(value)) ||
88
+ (options.obscureInputDates && node.type === 'date') ||
92
89
  (options.obscureInputEmails &&
93
90
  (node.type === 'email' || !!~value.indexOf('@')))))) {
94
91
  inputMode = 1 /* InputMode.Obscured */;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const messages_js_1 = require("../common/messages.js");
4
+ const guards_js_1 = require("../app/guards.js");
4
5
  function default_1(app) {
5
6
  let documentScroll = false;
6
7
  const nodeScroll = new Map();
@@ -22,11 +23,11 @@ function default_1(app) {
22
23
  documentScroll = false;
23
24
  nodeScroll.clear();
24
25
  });
25
- // app.nodes.attachNodeCallback(node => {
26
- // if (isElementNode(node) && node.scrollLeft + node.scrollTop > 0) {
27
- // nodeScroll.set(node, [node.scrollLeft, node.scrollTop]);
28
- // }
29
- // })
26
+ app.nodes.attachNodeCallback((node, isStart) => {
27
+ if (isStart && (0, guards_js_1.isElementNode)(node) && node.scrollLeft + node.scrollTop > 0) {
28
+ nodeScroll.set(node, [node.scrollLeft, node.scrollTop]);
29
+ }
30
+ });
30
31
  app.attachEventListener(window, 'scroll', (e) => {
31
32
  const target = e.target;
32
33
  if (target === document) {
@@ -10,7 +10,8 @@ declare type TagTypeMap = {
10
10
  SELECT: HTMLSelectElement;
11
11
  LABEL: HTMLLabelElement;
12
12
  IFRAME: HTMLIFrameElement;
13
- STYLE: HTMLStyleElement | SVGStyleElement;
13
+ STYLE: HTMLStyleElement;
14
+ style: SVGStyleElement;
14
15
  LINK: HTMLLinkElement;
15
16
  };
16
17
  export declare function hasTag<T extends keyof TagTypeMap>(el: Node, tagName: T): el is TagTypeMap[typeof tagName];
package/lib/app/guards.js CHANGED
@@ -12,5 +12,5 @@ export function isRootNode(node) {
12
12
  node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
13
13
  }
14
14
  export function hasTag(el, tagName) {
15
- return el.nodeName.toUpperCase() === tagName;
15
+ return el.nodeName === tagName;
16
16
  }
@@ -103,6 +103,6 @@ export default class App {
103
103
  resetNextPageSession(flag: boolean): void;
104
104
  private _start;
105
105
  start(options?: StartOptions): Promise<StartPromiseReturn>;
106
- stop(): void;
106
+ stop(calledFromAPI?: boolean): void;
107
107
  }
108
108
  export {};
package/lib/app/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Timestamp } from "../common/messages.js";
1
+ import { Timestamp, Metadata, UserID } from "../common/messages.js";
2
2
  import { timestamp } from "../utils.js";
3
3
  import Nodes from "./nodes.js";
4
4
  import Observer from "./observer/top_observer.js";
@@ -29,7 +29,7 @@ export default class App {
29
29
  this.stopCallbacks = [];
30
30
  this.commitCallbacks = [];
31
31
  this.activityState = ActivityState.NotActive;
32
- this.version = '3.5.13-beta.0'; // TODO: version compatability check inside each plugin.
32
+ this.version = '3.5.13'; // TODO: version compatability check inside each plugin.
33
33
  this.projectKey = projectKey;
34
34
  this.options = Object.assign({
35
35
  revID: '',
@@ -54,14 +54,22 @@ export default class App {
54
54
  this.ticker.attach(() => this.commit());
55
55
  this.debug = new Logger(this.options.__debug__);
56
56
  this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent);
57
- this.session = new Session(this);
57
+ this.session = new Session();
58
+ this.session.attachUpdateCallback(({ userID, metadata }) => {
59
+ if (userID != null) { // TODO: nullable userID
60
+ this.send(new UserID(userID));
61
+ }
62
+ if (metadata != null) {
63
+ Object.entries(metadata).forEach(([key, value]) => this.send(new Metadata(key, value)));
64
+ }
65
+ });
58
66
  this.localStorage = this.options.localStorage;
59
67
  this.sessionStorage = this.options.sessionStorage;
60
68
  if (sessionToken != null) {
61
69
  this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
62
70
  }
63
71
  try {
64
- 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()};
72
+ 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,ht=et.NotActive;function ot(){rt&&rt.finaliseBatch()}function ct(){ht=et.Stopping,null!==ut&&(clearInterval(ut),ut=null),rt&&(rt.clean(),rt=null),ht=et.NotActive}let at,ut=null;self.onmessage=({data:t})=>{if(null!=t){if("stop"===t)return ot(),void ct();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?at=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(at)),s.writeMessage(e)})}else{if("start"===t.type)return ht=et.Starting,nt=new Z(t.ingestPoint,()=>{self.postMessage("restart")},()=>{nt&&(nt.clean(),nt=null),ct(),self.postMessage("failed")},t.connAttemptCount,t.connAttemptGap),rt=new st(t.pageNo,t.timestamp,t=>nt&&nt.push(t)),null===ut&&(ut=setInterval(ot,1e4)),ht=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 ot()};
65
73
  `], { type: 'text/javascript' })));
66
74
  this.worker.onerror = e => {
67
75
  this._debug("webworker_error", e);
@@ -69,6 +77,7 @@ export default class App {
69
77
  this.worker.onmessage = ({ data }) => {
70
78
  if (data === "failed") {
71
79
  this.stop();
80
+ this._debug("worker_failed", {}); // add context (from worker)
72
81
  }
73
82
  else if (data === "restart") {
74
83
  this.stop();
@@ -80,9 +89,10 @@ export default class App {
80
89
  this.worker.postMessage(null);
81
90
  }
82
91
  };
83
- // TODO: keep better tactics, discard others (look https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon)
92
+ // keep better tactics, discard others?
84
93
  this.attachEventListener(window, 'beforeunload', alertWorker, false);
85
- this.attachEventListener(document, 'mouseleave', alertWorker, false, false);
94
+ this.attachEventListener(document.body, 'mouseleave', alertWorker, false, false);
95
+ // TODO: stop session after inactivity timeout (make configurable)
86
96
  this.attachEventListener(document, 'visibilitychange', alertWorker, false);
87
97
  }
88
98
  catch (e) {
@@ -156,8 +166,8 @@ export default class App {
156
166
  }
157
167
  // TODO: full correct semantic
158
168
  checkRequiredVersion(version) {
159
- const reqVer = version.split('.');
160
- const ver = this.version.split('.');
169
+ const reqVer = version.split(/[.-]/);
170
+ const ver = this.version.split(/[.-]/);
161
171
  for (let i = 0; i < 3; i++) {
162
172
  if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
163
173
  return false;
@@ -251,7 +261,13 @@ export default class App {
251
261
  connAttemptCount: this.options.connAttemptCount,
252
262
  connAttemptGap: this.options.connAttemptGap,
253
263
  };
254
- this.worker.postMessage(startWorkerMsg); // brings delay of 10th ms?
264
+ this.worker.postMessage(startWorkerMsg);
265
+ this.session.update({
266
+ // "updating" with old metadata in order to trigger session's UpdateCallbacks.
267
+ // (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
268
+ metadata: startOpts.metadata || this.session.getInfo().metadata,
269
+ userID: startOpts.userID,
270
+ });
255
271
  const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
256
272
  this.sessionStorage.removeItem(this.options.session_reset_key);
257
273
  return window.fetch(this.options.ingestPoint + '/v1/web/start', {
@@ -259,7 +275,7 @@ export default class App {
259
275
  headers: {
260
276
  'Content-Type': 'application/json',
261
277
  },
262
- body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: startOpts.userID || this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory,
278
+ body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory,
263
279
  jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
264
280
  })
265
281
  .then(r => {
@@ -268,7 +284,7 @@ export default class App {
268
284
  }
269
285
  else {
270
286
  return r.text().then(text => text === CANCELED
271
- ? Promise.reject(CANCELED) // TODO: return {error: CANCELED} instead
287
+ ? Promise.reject(CANCELED)
272
288
  : Promise.reject(`Server error: ${r.status}. ${text}`));
273
289
  }
274
290
  })
@@ -284,20 +300,20 @@ export default class App {
284
300
  }
285
301
  this.sessionStorage.setItem(this.options.session_token_key, token);
286
302
  this.localStorage.setItem(this.options.local_uuid_key, userUUID);
287
- this.session.update(Object.assign({ sessionID }, startOpts));
288
- this.activityState = ActivityState.Active;
303
+ this.session.update({ sessionID }); // TODO: no no-explicit 'any'
289
304
  const startWorkerMsg = {
290
305
  type: "auth",
291
306
  token,
292
307
  beaconSizeLimit
293
308
  };
294
309
  this.worker.postMessage(startWorkerMsg);
310
+ this.activityState = ActivityState.Active;
295
311
  const onStartInfo = { sessionToken: token, userUUID, sessionID };
296
- this.startCallbacks.forEach((cb) => cb(onStartInfo));
312
+ this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
297
313
  this.observer.observe();
298
314
  this.ticker.start();
299
315
  this.notify.log("OpenReplay tracking started.");
300
- // TODO: get rid of onStart
316
+ // get rid of onStart ?
301
317
  if (typeof this.options.onStart === 'function') {
302
318
  this.options.onStart(onStartInfo);
303
319
  }
@@ -330,18 +346,21 @@ export default class App {
330
346
  });
331
347
  }
332
348
  }
333
- stop() {
349
+ stop(calledFromAPI = false) {
334
350
  if (this.activityState !== ActivityState.NotActive) {
335
351
  try {
336
- if (this.worker) {
337
- this.worker.postMessage("stop");
338
- }
339
352
  this.sanitizer.clear();
340
353
  this.observer.disconnect();
341
354
  this.nodes.clear();
342
355
  this.ticker.stop();
343
356
  this.stopCallbacks.forEach((cb) => cb());
357
+ if (calledFromAPI) {
358
+ this.session.reset();
359
+ }
344
360
  this.notify.log("OpenReplay tracking stopped.");
361
+ if (this.worker) {
362
+ this.worker.postMessage("stop");
363
+ }
345
364
  }
346
365
  finally {
347
366
  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;
@@ -9,7 +9,7 @@ export default class Nodes {
9
9
  attachElementListener(type: string, node: Element, elementListener: EventListener): void;
10
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/lib/app/nodes.js CHANGED
@@ -45,8 +45,8 @@ export default class Nodes {
45
45
  }
46
46
  return id;
47
47
  }
48
- callNodeCallbacks(node) {
49
- this.nodeCallbacks.forEach((cb) => cb(node));
48
+ callNodeCallbacks(node, isStart) {
49
+ this.nodeCallbacks.forEach((cb) => cb(node, isStart));
50
50
  }
51
51
  getID(node) {
52
52
  return node[this.node_id];
@@ -4,11 +4,10 @@ export default abstract class Observer {
4
4
  protected readonly isTopContext: boolean;
5
5
  private readonly observer;
6
6
  private readonly commited;
7
+ private readonly recents;
7
8
  private readonly indexes;
8
- private readonly attributesList;
9
+ private readonly attributesMap;
9
10
  private readonly textSet;
10
- private readonly newSet;
11
- private readonly affectedSet;
12
11
  constructor(app: App, isTopContext?: boolean);
13
12
  private clear;
14
13
  private sendNodeAttribute;