@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.
- package/cjs/app/guards.d.ts +18 -0
- package/cjs/app/guards.js +24 -0
- package/cjs/app/index.d.ts +5 -1
- package/cjs/app/index.js +55 -32
- package/cjs/app/nodes.d.ts +3 -3
- package/cjs/app/nodes.js +2 -2
- package/cjs/app/observer/observer.d.ts +1 -2
- package/cjs/app/observer/observer.js +73 -60
- package/cjs/app/observer/top_observer.js +3 -3
- package/cjs/app/sanitizer.d.ts +3 -1
- package/cjs/app/sanitizer.js +13 -2
- package/cjs/app/session.d.ts +2 -7
- package/cjs/app/session.js +24 -37
- package/cjs/index.js +2 -2
- package/cjs/modules/console.d.ts +1 -1
- package/cjs/modules/console.js +2 -1
- package/cjs/modules/cssrules.d.ts +1 -1
- package/cjs/modules/cssrules.js +2 -4
- package/cjs/modules/exception.d.ts +1 -1
- package/cjs/modules/img.d.ts +1 -1
- package/cjs/modules/img.js +14 -6
- package/cjs/modules/input.d.ts +2 -1
- package/cjs/modules/input.js +18 -20
- package/cjs/modules/longtasks.d.ts +1 -1
- package/cjs/modules/mouse.d.ts +1 -1
- package/cjs/modules/mouse.js +3 -2
- package/cjs/modules/performance.d.ts +1 -1
- package/cjs/modules/scroll.d.ts +1 -1
- package/cjs/modules/scroll.js +3 -2
- package/cjs/modules/timing.d.ts +1 -1
- package/cjs/modules/timing.js +2 -1
- package/cjs/modules/viewport.d.ts +1 -1
- package/lib/app/guards.d.ts +18 -0
- package/lib/app/guards.js +16 -0
- package/lib/app/index.d.ts +5 -1
- package/lib/app/index.js +56 -33
- package/lib/app/nodes.d.ts +3 -3
- package/lib/app/nodes.js +2 -2
- package/lib/app/observer/observer.d.ts +1 -2
- package/lib/app/observer/observer.js +70 -57
- package/lib/app/observer/top_observer.js +3 -3
- package/lib/app/sanitizer.d.ts +3 -1
- package/lib/app/sanitizer.js +13 -2
- package/lib/app/session.d.ts +2 -7
- package/lib/app/session.js +24 -37
- package/lib/common/tsconfig.tsbuildinfo +1 -1
- package/lib/index.js +2 -2
- package/lib/modules/console.d.ts +1 -1
- package/lib/modules/console.js +2 -1
- package/lib/modules/cssrules.d.ts +1 -1
- package/lib/modules/cssrules.js +2 -4
- package/lib/modules/exception.d.ts +1 -1
- package/lib/modules/img.d.ts +1 -1
- package/lib/modules/img.js +14 -6
- package/lib/modules/input.d.ts +2 -1
- package/lib/modules/input.js +18 -20
- package/lib/modules/longtasks.d.ts +1 -1
- package/lib/modules/mouse.d.ts +1 -1
- package/lib/modules/mouse.js +3 -2
- package/lib/modules/performance.d.ts +1 -1
- package/lib/modules/scroll.d.ts +1 -1
- package/lib/modules/scroll.js +3 -2
- package/lib/modules/timing.d.ts +1 -1
- package/lib/modules/timing.js +2 -1
- package/lib/modules/viewport.d.ts +1 -1
- package/package.json +7 -7
- package/cjs/app/context.d.ts +0 -18
- package/cjs/app/context.js +0 -73
- package/lib/app/context.d.ts +0 -18
- package/lib/app/context.js +0 -68
package/cjs/modules/input.js
CHANGED
|
@@ -2,24 +2,20 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getInputLabel = void 0;
|
|
4
4
|
const utils_js_1 = require("../utils.js");
|
|
5
|
+
const guards_js_1 = require("../app/guards.js");
|
|
5
6
|
const messages_js_1 = require("../common/messages.js");
|
|
7
|
+
const INPUT_TYPES = ['text', 'password', 'email', 'search', 'number', 'range', 'date'];
|
|
6
8
|
function isTextEditable(node) {
|
|
7
|
-
if (node
|
|
9
|
+
if ((0, guards_js_1.hasTag)(node, "TEXTAREA")) {
|
|
8
10
|
return true;
|
|
9
11
|
}
|
|
10
|
-
if (!(node
|
|
12
|
+
if (!(0, guards_js_1.hasTag)(node, "INPUT")) {
|
|
11
13
|
return false;
|
|
12
14
|
}
|
|
13
|
-
|
|
14
|
-
return (type === 'text' ||
|
|
15
|
-
type === 'password' ||
|
|
16
|
-
type === 'email' ||
|
|
17
|
-
type === 'search' ||
|
|
18
|
-
type === 'number' ||
|
|
19
|
-
type === 'range');
|
|
15
|
+
return INPUT_TYPES.includes(node.type);
|
|
20
16
|
}
|
|
21
17
|
function isCheckable(node) {
|
|
22
|
-
if (!(node
|
|
18
|
+
if (!(0, guards_js_1.hasTag)(node, "INPUT")) {
|
|
23
19
|
return false;
|
|
24
20
|
}
|
|
25
21
|
const type = node.type;
|
|
@@ -29,7 +25,7 @@ const labelElementFor = utils_js_1.IN_BROWSER && 'labels' in HTMLInputElement.pr
|
|
|
29
25
|
? (node) => {
|
|
30
26
|
let p = node;
|
|
31
27
|
while ((p = p.parentNode) !== null) {
|
|
32
|
-
if (p
|
|
28
|
+
if ((0, guards_js_1.hasTag)(p, "LABEL")) {
|
|
33
29
|
return p;
|
|
34
30
|
}
|
|
35
31
|
}
|
|
@@ -41,7 +37,7 @@ const labelElementFor = utils_js_1.IN_BROWSER && 'labels' in HTMLInputElement.pr
|
|
|
41
37
|
: (node) => {
|
|
42
38
|
let p = node;
|
|
43
39
|
while ((p = p.parentNode) !== null) {
|
|
44
|
-
if (p
|
|
40
|
+
if ((0, guards_js_1.hasTag)(p, "LABEL")) {
|
|
45
41
|
return p;
|
|
46
42
|
}
|
|
47
43
|
}
|
|
@@ -71,7 +67,8 @@ function default_1(app, opts) {
|
|
|
71
67
|
const options = Object.assign({
|
|
72
68
|
obscureInputNumbers: true,
|
|
73
69
|
obscureInputEmails: true,
|
|
74
|
-
defaultInputMode: 0 /* Plain */,
|
|
70
|
+
defaultInputMode: 0 /* InputMode.Plain */,
|
|
71
|
+
obscureInputDates: false,
|
|
75
72
|
}, opts);
|
|
76
73
|
function sendInputTarget(id, node) {
|
|
77
74
|
const label = getInputLabel(node);
|
|
@@ -83,22 +80,23 @@ function default_1(app, opts) {
|
|
|
83
80
|
let value = node.value;
|
|
84
81
|
let inputMode = options.defaultInputMode;
|
|
85
82
|
if (node.type === 'password' || (0, utils_js_1.hasOpenreplayAttribute)(node, 'hidden')) {
|
|
86
|
-
inputMode = 2 /* Hidden */;
|
|
83
|
+
inputMode = 2 /* InputMode.Hidden */;
|
|
87
84
|
}
|
|
88
85
|
else if ((0, utils_js_1.hasOpenreplayAttribute)(node, 'obscured') ||
|
|
89
|
-
(inputMode === 0 /* Plain */ &&
|
|
90
|
-
((options.obscureInputNumbers && /\d\d\d\d/.test(value)) ||
|
|
86
|
+
(inputMode === 0 /* InputMode.Plain */ &&
|
|
87
|
+
((options.obscureInputNumbers && node.type !== 'date' && /\d\d\d\d/.test(value)) ||
|
|
88
|
+
(options.obscureInputDates && node.type === 'date') ||
|
|
91
89
|
(options.obscureInputEmails &&
|
|
92
90
|
(node.type === 'email' || !!~value.indexOf('@')))))) {
|
|
93
|
-
inputMode = 1 /* Obscured */;
|
|
91
|
+
inputMode = 1 /* InputMode.Obscured */;
|
|
94
92
|
}
|
|
95
93
|
let mask = 0;
|
|
96
94
|
switch (inputMode) {
|
|
97
|
-
case 2 /* Hidden */:
|
|
95
|
+
case 2 /* InputMode.Hidden */:
|
|
98
96
|
mask = -1;
|
|
99
97
|
value = '';
|
|
100
98
|
break;
|
|
101
|
-
case 1 /* Obscured */:
|
|
99
|
+
case 1 /* InputMode.Obscured */:
|
|
102
100
|
mask = value.length;
|
|
103
101
|
value = '';
|
|
104
102
|
break;
|
|
@@ -148,7 +146,7 @@ function default_1(app, opts) {
|
|
|
148
146
|
return;
|
|
149
147
|
}
|
|
150
148
|
// TODO: support multiple select (?): use selectedOptions; Need send target?
|
|
151
|
-
if (node
|
|
149
|
+
if ((0, guards_js_1.hasTag)(node, "SELECT")) {
|
|
152
150
|
sendInputValue(id, node);
|
|
153
151
|
app.attachEventListener(node, "change", () => {
|
|
154
152
|
sendInputValue(id, node);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import App from "../app/index.js";
|
|
1
|
+
import type App from "../app/index.js";
|
|
2
2
|
export default function (app: App): void;
|
package/cjs/modules/mouse.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import App from "../app/index.js";
|
|
1
|
+
import type App from "../app/index.js";
|
|
2
2
|
export default function (app: App): void;
|
package/cjs/modules/mouse.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const guards_js_1 = require("../app/guards.js");
|
|
3
4
|
const utils_js_1 = require("../utils.js");
|
|
4
5
|
const messages_js_1 = require("../common/messages.js");
|
|
5
6
|
const input_js_1 = require("./input.js");
|
|
@@ -49,7 +50,7 @@ function _getTarget(target) {
|
|
|
49
50
|
}
|
|
50
51
|
element = element.parentElement;
|
|
51
52
|
}
|
|
52
|
-
if (
|
|
53
|
+
if ((0, guards_js_1.isSVGElement)(target)) {
|
|
53
54
|
let owner = target.ownerSVGElement;
|
|
54
55
|
while (owner !== null) {
|
|
55
56
|
target = owner;
|
|
@@ -79,7 +80,7 @@ function default_1(app) {
|
|
|
79
80
|
if (dl !== null) {
|
|
80
81
|
return dl;
|
|
81
82
|
}
|
|
82
|
-
if (target
|
|
83
|
+
if ((0, guards_js_1.hasTag)(target, "INPUT")) {
|
|
83
84
|
return (0, input_js_1.getInputLabel)(target);
|
|
84
85
|
}
|
|
85
86
|
if (isClickable(target)) {
|
package/cjs/modules/scroll.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import App from "../app/index.js";
|
|
1
|
+
import type App from "../app/index.js";
|
|
2
2
|
export default function (app: App): void;
|
package/cjs/modules/scroll.js
CHANGED
|
@@ -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,8 +23,8 @@ function default_1(app) {
|
|
|
22
23
|
documentScroll = false;
|
|
23
24
|
nodeScroll.clear();
|
|
24
25
|
});
|
|
25
|
-
app.nodes.attachNodeCallback(node => {
|
|
26
|
-
if (
|
|
26
|
+
app.nodes.attachNodeCallback((node, isStart) => {
|
|
27
|
+
if (isStart && (0, guards_js_1.isElementNode)(node) && node.scrollLeft + node.scrollTop > 0) {
|
|
27
28
|
nodeScroll.set(node, [node.scrollLeft, node.scrollTop]);
|
|
28
29
|
}
|
|
29
30
|
});
|
package/cjs/modules/timing.d.ts
CHANGED
package/cjs/modules/timing.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const guards_js_1 = require("../app/guards.js");
|
|
3
4
|
const utils_js_1 = require("../utils.js");
|
|
4
5
|
const messages_js_1 = require("../common/messages.js");
|
|
5
6
|
function getPaintBlocks(resources) {
|
|
@@ -9,7 +10,7 @@ function getPaintBlocks(resources) {
|
|
|
9
10
|
for (let i = 0; i < elements.length; i++) {
|
|
10
11
|
const element = elements[i];
|
|
11
12
|
let src = '';
|
|
12
|
-
if (element
|
|
13
|
+
if ((0, guards_js_1.hasTag)(element, "IMG")) {
|
|
13
14
|
src = element.currentSrc || element.src;
|
|
14
15
|
}
|
|
15
16
|
if (!src) {
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import App from "../app/index.js";
|
|
1
|
+
import type App from "../app/index.js";
|
|
2
2
|
export default function (app: App): void;
|
|
@@ -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,16 @@
|
|
|
1
|
+
export function isSVGElement(node) {
|
|
2
|
+
return node.namespaceURI === 'http://www.w3.org/2000/svg';
|
|
3
|
+
}
|
|
4
|
+
export function isElementNode(node) {
|
|
5
|
+
return node.nodeType === Node.ELEMENT_NODE;
|
|
6
|
+
}
|
|
7
|
+
export function isTextNode(node) {
|
|
8
|
+
return node.nodeType === Node.TEXT_NODE;
|
|
9
|
+
}
|
|
10
|
+
export function isRootNode(node) {
|
|
11
|
+
return node.nodeType === Node.DOCUMENT_NODE ||
|
|
12
|
+
node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
|
|
13
|
+
}
|
|
14
|
+
export function hasTag(el, tagName) {
|
|
15
|
+
return el.nodeName === tagName;
|
|
16
|
+
}
|
package/lib/app/index.d.ts
CHANGED
|
@@ -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/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.
|
|
32
|
+
this.version = '3.5.14'; // TODO: version compatability check inside each plugin.
|
|
33
33
|
this.projectKey = projectKey;
|
|
34
34
|
this.options = Object.assign({
|
|
35
35
|
revID: '',
|
|
@@ -43,10 +43,9 @@ export default class App {
|
|
|
43
43
|
verbose: false,
|
|
44
44
|
__is_snippet: false,
|
|
45
45
|
__debug_report_edp: null,
|
|
46
|
+
localStorage: window.localStorage,
|
|
47
|
+
sessionStorage: window.sessionStorage,
|
|
46
48
|
}, options);
|
|
47
|
-
if (sessionToken != null) {
|
|
48
|
-
sessionStorage.setItem(this.options.session_token_key, sessionToken);
|
|
49
|
-
}
|
|
50
49
|
this.revID = this.options.revID;
|
|
51
50
|
this.sanitizer = new Sanitizer(this, options);
|
|
52
51
|
this.nodes = new Nodes(this.options.node_id);
|
|
@@ -55,9 +54,22 @@ export default class App {
|
|
|
55
54
|
this.ticker.attach(() => this.commit());
|
|
56
55
|
this.debug = new Logger(this.options.__debug__);
|
|
57
56
|
this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent);
|
|
58
|
-
this.session = new Session(
|
|
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
|
+
});
|
|
66
|
+
this.localStorage = this.options.localStorage;
|
|
67
|
+
this.sessionStorage = this.options.sessionStorage;
|
|
68
|
+
if (sessionToken != null) {
|
|
69
|
+
this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
|
|
70
|
+
}
|
|
59
71
|
try {
|
|
60
|
-
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;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()};
|
|
61
73
|
`], { type: 'text/javascript' })));
|
|
62
74
|
this.worker.onerror = e => {
|
|
63
75
|
this._debug("webworker_error", e);
|
|
@@ -65,6 +77,7 @@ export default class App {
|
|
|
65
77
|
this.worker.onmessage = ({ data }) => {
|
|
66
78
|
if (data === "failed") {
|
|
67
79
|
this.stop();
|
|
80
|
+
this._debug("worker_failed", {}); // add context (from worker)
|
|
68
81
|
}
|
|
69
82
|
else if (data === "restart") {
|
|
70
83
|
this.stop();
|
|
@@ -76,9 +89,10 @@ export default class App {
|
|
|
76
89
|
this.worker.postMessage(null);
|
|
77
90
|
}
|
|
78
91
|
};
|
|
79
|
-
//
|
|
92
|
+
// keep better tactics, discard others?
|
|
80
93
|
this.attachEventListener(window, 'beforeunload', alertWorker, false);
|
|
81
|
-
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)
|
|
82
96
|
this.attachEventListener(document, 'visibilitychange', alertWorker, false);
|
|
83
97
|
}
|
|
84
98
|
catch (e) {
|
|
@@ -152,8 +166,8 @@ export default class App {
|
|
|
152
166
|
}
|
|
153
167
|
// TODO: full correct semantic
|
|
154
168
|
checkRequiredVersion(version) {
|
|
155
|
-
const reqVer = version.split(
|
|
156
|
-
const ver = this.version.split(
|
|
169
|
+
const reqVer = version.split(/[.-]/);
|
|
170
|
+
const ver = this.version.split(/[.-]/);
|
|
157
171
|
for (let i = 0; i < 3; i++) {
|
|
158
172
|
if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
|
|
159
173
|
return false;
|
|
@@ -163,7 +177,7 @@ export default class App {
|
|
|
163
177
|
}
|
|
164
178
|
getStartInfo() {
|
|
165
179
|
return {
|
|
166
|
-
userUUID: localStorage.getItem(this.options.local_uuid_key),
|
|
180
|
+
userUUID: this.localStorage.getItem(this.options.local_uuid_key),
|
|
167
181
|
projectKey: this.projectKey,
|
|
168
182
|
revID: this.revID,
|
|
169
183
|
timestamp: timestamp(),
|
|
@@ -175,7 +189,7 @@ export default class App {
|
|
|
175
189
|
return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
|
|
176
190
|
}
|
|
177
191
|
getSessionToken() {
|
|
178
|
-
const token = sessionStorage.getItem(this.options.session_token_key);
|
|
192
|
+
const token = this.sessionStorage.getItem(this.options.session_token_key);
|
|
179
193
|
if (token !== null) {
|
|
180
194
|
return token;
|
|
181
195
|
}
|
|
@@ -217,10 +231,10 @@ export default class App {
|
|
|
217
231
|
}
|
|
218
232
|
resetNextPageSession(flag) {
|
|
219
233
|
if (flag) {
|
|
220
|
-
sessionStorage.setItem(this.options.session_reset_key, 't');
|
|
234
|
+
this.sessionStorage.setItem(this.options.session_reset_key, 't');
|
|
221
235
|
}
|
|
222
236
|
else {
|
|
223
|
-
sessionStorage.removeItem(this.options.session_reset_key);
|
|
237
|
+
this.sessionStorage.removeItem(this.options.session_reset_key);
|
|
224
238
|
}
|
|
225
239
|
}
|
|
226
240
|
_start(startOpts) {
|
|
@@ -232,12 +246,12 @@ export default class App {
|
|
|
232
246
|
}
|
|
233
247
|
this.activityState = ActivityState.Starting;
|
|
234
248
|
let pageNo = 0;
|
|
235
|
-
const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
|
|
249
|
+
const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
|
|
236
250
|
if (pageNoStr != null) {
|
|
237
251
|
pageNo = parseInt(pageNoStr);
|
|
238
252
|
pageNo++;
|
|
239
253
|
}
|
|
240
|
-
sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
|
|
254
|
+
this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
|
|
241
255
|
const startInfo = this.getStartInfo();
|
|
242
256
|
const startWorkerMsg = {
|
|
243
257
|
type: "start",
|
|
@@ -247,15 +261,21 @@ export default class App {
|
|
|
247
261
|
connAttemptCount: this.options.connAttemptCount,
|
|
248
262
|
connAttemptGap: this.options.connAttemptGap,
|
|
249
263
|
};
|
|
250
|
-
this.worker.postMessage(startWorkerMsg);
|
|
251
|
-
|
|
252
|
-
|
|
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
|
+
});
|
|
271
|
+
const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
|
|
272
|
+
this.sessionStorage.removeItem(this.options.session_reset_key);
|
|
253
273
|
return window.fetch(this.options.ingestPoint + '/v1/web/start', {
|
|
254
274
|
method: 'POST',
|
|
255
275
|
headers: {
|
|
256
276
|
'Content-Type': 'application/json',
|
|
257
277
|
},
|
|
258
|
-
body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID:
|
|
278
|
+
body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory,
|
|
259
279
|
jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
|
|
260
280
|
})
|
|
261
281
|
.then(r => {
|
|
@@ -264,7 +284,7 @@ export default class App {
|
|
|
264
284
|
}
|
|
265
285
|
else {
|
|
266
286
|
return r.text().then(text => text === CANCELED
|
|
267
|
-
? Promise.reject(CANCELED)
|
|
287
|
+
? Promise.reject(CANCELED)
|
|
268
288
|
: Promise.reject(`Server error: ${r.status}. ${text}`));
|
|
269
289
|
}
|
|
270
290
|
})
|
|
@@ -278,29 +298,29 @@ export default class App {
|
|
|
278
298
|
(typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
|
|
279
299
|
return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
|
|
280
300
|
}
|
|
281
|
-
sessionStorage.setItem(this.options.session_token_key, token);
|
|
282
|
-
localStorage.setItem(this.options.local_uuid_key, userUUID);
|
|
283
|
-
this.session.update(
|
|
284
|
-
this.activityState = ActivityState.Active;
|
|
301
|
+
this.sessionStorage.setItem(this.options.session_token_key, token);
|
|
302
|
+
this.localStorage.setItem(this.options.local_uuid_key, userUUID);
|
|
303
|
+
this.session.update({ sessionID }); // TODO: no no-explicit 'any'
|
|
285
304
|
const startWorkerMsg = {
|
|
286
305
|
type: "auth",
|
|
287
306
|
token,
|
|
288
307
|
beaconSizeLimit
|
|
289
308
|
};
|
|
290
309
|
this.worker.postMessage(startWorkerMsg);
|
|
310
|
+
this.activityState = ActivityState.Active;
|
|
291
311
|
const onStartInfo = { sessionToken: token, userUUID, sessionID };
|
|
292
|
-
this.startCallbacks.forEach((cb) => cb(onStartInfo));
|
|
312
|
+
this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
|
|
293
313
|
this.observer.observe();
|
|
294
314
|
this.ticker.start();
|
|
295
315
|
this.notify.log("OpenReplay tracking started.");
|
|
296
|
-
//
|
|
316
|
+
// get rid of onStart ?
|
|
297
317
|
if (typeof this.options.onStart === 'function') {
|
|
298
318
|
this.options.onStart(onStartInfo);
|
|
299
319
|
}
|
|
300
320
|
return SuccessfulStart(onStartInfo);
|
|
301
321
|
})
|
|
302
322
|
.catch(reason => {
|
|
303
|
-
sessionStorage.removeItem(this.options.session_token_key);
|
|
323
|
+
this.sessionStorage.removeItem(this.options.session_token_key);
|
|
304
324
|
this.stop();
|
|
305
325
|
if (reason === CANCELED) {
|
|
306
326
|
return UnsuccessfulStart(CANCELED);
|
|
@@ -326,18 +346,21 @@ export default class App {
|
|
|
326
346
|
});
|
|
327
347
|
}
|
|
328
348
|
}
|
|
329
|
-
stop() {
|
|
349
|
+
stop(calledFromAPI = false) {
|
|
330
350
|
if (this.activityState !== ActivityState.NotActive) {
|
|
331
351
|
try {
|
|
332
|
-
if (this.worker) {
|
|
333
|
-
this.worker.postMessage("stop");
|
|
334
|
-
}
|
|
335
352
|
this.sanitizer.clear();
|
|
336
353
|
this.observer.disconnect();
|
|
337
354
|
this.nodes.clear();
|
|
338
355
|
this.ticker.stop();
|
|
339
356
|
this.stopCallbacks.forEach((cb) => cb());
|
|
357
|
+
if (calledFromAPI) {
|
|
358
|
+
this.session.reset();
|
|
359
|
+
}
|
|
340
360
|
this.notify.log("OpenReplay tracking stopped.");
|
|
361
|
+
if (this.worker) {
|
|
362
|
+
this.worker.postMessage("stop");
|
|
363
|
+
}
|
|
341
364
|
}
|
|
342
365
|
finally {
|
|
343
366
|
this.activityState = ActivityState.NotActive;
|
package/lib/app/nodes.d.ts
CHANGED
|
@@ -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/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];
|
|
@@ -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
|
|
9
|
+
private readonly attributesMap;
|
|
11
10
|
private readonly textSet;
|
|
12
11
|
constructor(app: App, isTopContext?: boolean);
|
|
13
12
|
private clear;
|