@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.
- package/cjs/app/guards.d.ts +2 -1
- package/cjs/app/guards.js +1 -1
- package/cjs/app/index.d.ts +1 -1
- package/cjs/app/index.js +37 -18
- package/cjs/app/nodes.d.ts +2 -2
- package/cjs/app/nodes.js +2 -2
- package/cjs/app/observer/observer.d.ts +2 -3
- package/cjs/app/observer/observer.js +56 -35
- package/cjs/app/sanitizer.d.ts +3 -1
- package/cjs/app/sanitizer.js +12 -1
- package/cjs/app/session.d.ts +2 -7
- package/cjs/app/session.js +24 -37
- package/cjs/index.js +2 -2
- package/cjs/modules/img.js +12 -5
- package/cjs/modules/input.d.ts +1 -0
- package/cjs/modules/input.js +5 -8
- package/cjs/modules/scroll.js +6 -5
- package/lib/app/guards.d.ts +2 -1
- package/lib/app/guards.js +1 -1
- package/lib/app/index.d.ts +1 -1
- package/lib/app/index.js +38 -19
- package/lib/app/nodes.d.ts +2 -2
- package/lib/app/nodes.js +2 -2
- package/lib/app/observer/observer.d.ts +2 -3
- package/lib/app/observer/observer.js +56 -35
- package/lib/app/sanitizer.d.ts +3 -1
- package/lib/app/sanitizer.js +12 -1
- 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/img.js +12 -5
- package/lib/modules/input.d.ts +1 -0
- package/lib/modules/input.js +5 -8
- package/lib/modules/scroll.js +6 -5
- package/package.json +2 -2
package/cjs/app/session.js
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
delete sessInfo.userID;
|
|
13
|
+
handleUpdate(newInfo) {
|
|
14
|
+
if (newInfo.userID == null) {
|
|
15
|
+
delete newInfo.userID;
|
|
26
16
|
}
|
|
27
|
-
if (
|
|
28
|
-
delete
|
|
17
|
+
if (newInfo.sessionID == null) {
|
|
18
|
+
delete newInfo.sessionID;
|
|
29
19
|
}
|
|
30
|
-
this.callbacks.forEach(cb => cb(
|
|
20
|
+
this.callbacks.forEach(cb => cb(newInfo));
|
|
31
21
|
}
|
|
32
|
-
update(
|
|
33
|
-
if (userID
|
|
34
|
-
this.
|
|
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(
|
|
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.
|
|
54
|
-
this.handleUpdate();
|
|
35
|
+
this.metadata[key] = value;
|
|
36
|
+
this.handleUpdate({ metadata: { [key]: value } });
|
|
55
37
|
}
|
|
56
38
|
setUserID(userID) {
|
|
57
|
-
this.
|
|
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
|
|
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) {
|
package/cjs/modules/img.js
CHANGED
|
@@ -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"
|
|
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
|
-
|
|
48
|
-
|
|
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;
|
package/cjs/modules/input.d.ts
CHANGED
package/cjs/modules/input.js
CHANGED
|
@@ -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
|
-
|
|
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 */;
|
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,11 +23,11 @@ function default_1(app) {
|
|
|
22
23
|
documentScroll = false;
|
|
23
24
|
nodeScroll.clear();
|
|
24
25
|
});
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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) {
|
package/lib/app/guards.d.ts
CHANGED
|
@@ -10,7 +10,8 @@ declare type TagTypeMap = {
|
|
|
10
10
|
SELECT: HTMLSelectElement;
|
|
11
11
|
LABEL: HTMLLabelElement;
|
|
12
12
|
IFRAME: HTMLIFrameElement;
|
|
13
|
-
STYLE: HTMLStyleElement
|
|
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
package/lib/app/index.d.ts
CHANGED
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
|
|
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(
|
|
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
|
-
//
|
|
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);
|
|
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:
|
|
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)
|
|
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(
|
|
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
|
-
//
|
|
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;
|
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;
|
|
@@ -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
|
|
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;
|