@openreplay/tracker 3.5.16-beta.3 → 3.6.0-beta.0
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/.eslintignore +8 -0
- package/.prettierignore +1 -0
- package/cjs/app/guards.d.ts +2 -1
- package/cjs/app/guards.js +6 -3
- package/cjs/app/index.d.ts +24 -22
- package/cjs/app/index.js +85 -85
- package/cjs/app/logger.js +6 -3
- package/cjs/app/messages.d.ts +52 -0
- package/cjs/app/messages.gen.d.ts +57 -0
- package/cjs/app/messages.gen.js +494 -0
- package/cjs/app/messages.js +235 -0
- package/cjs/app/nodes.d.ts +1 -1
- package/cjs/app/nodes.js +4 -7
- package/cjs/app/observer/iframe_observer.d.ts +1 -1
- package/cjs/app/observer/iframe_observer.js +3 -3
- package/cjs/app/observer/observer.d.ts +2 -2
- package/cjs/app/observer/observer.js +52 -46
- package/cjs/app/observer/shadow_root_observer.d.ts +1 -1
- package/cjs/app/observer/shadow_root_observer.js +3 -3
- package/cjs/app/observer/top_observer.d.ts +11 -2
- package/cjs/app/observer/top_observer.js +52 -23
- package/cjs/app/sanitizer.d.ts +1 -1
- package/cjs/app/sanitizer.js +5 -5
- package/cjs/app/session.d.ts +18 -2
- package/cjs/app/session.js +55 -6
- package/cjs/app/ticker.d.ts +1 -1
- package/cjs/common/{webworker.d.ts → interaction.d.ts} +5 -5
- package/cjs/common/{types.js → interaction.js} +0 -0
- package/cjs/common/messages.gen.d.ts +382 -0
- package/cjs/common/messages.gen.js +62 -0
- package/cjs/index.d.ts +10 -10
- package/cjs/index.js +42 -37
- package/cjs/modules/adoptedStyleSheets.d.ts +2 -0
- package/cjs/modules/adoptedStyleSheets.js +127 -0
- package/cjs/modules/connection.d.ts +1 -1
- package/cjs/modules/connection.js +2 -2
- package/cjs/modules/console.d.ts +1 -1
- package/cjs/modules/console.js +7 -21
- package/cjs/modules/cssrules.d.ts +1 -1
- package/cjs/modules/cssrules.js +18 -14
- package/cjs/modules/exception.d.ts +3 -3
- package/cjs/modules/exception.js +25 -20
- package/cjs/modules/img.d.ts +1 -1
- package/cjs/modules/img.js +39 -26
- package/cjs/modules/input.d.ts +1 -1
- package/cjs/modules/input.js +35 -31
- package/cjs/modules/mouse.d.ts +1 -1
- package/cjs/modules/mouse.js +50 -43
- package/cjs/modules/performance.d.ts +1 -1
- package/cjs/modules/performance.js +2 -2
- package/cjs/modules/scroll.d.ts +1 -1
- package/cjs/modules/scroll.js +16 -7
- package/cjs/modules/timing.d.ts +1 -1
- package/cjs/modules/timing.js +14 -26
- package/cjs/modules/viewport.d.ts +1 -1
- package/cjs/modules/viewport.js +4 -4
- package/cjs/utils.js +7 -7
- package/cjs/vendors/finder/finder.js +53 -48
- package/lib/app/guards.d.ts +2 -1
- package/lib/app/guards.js +4 -2
- package/lib/app/index.d.ts +24 -22
- package/lib/app/index.js +93 -93
- package/lib/app/logger.js +6 -3
- package/lib/app/messages.d.ts +52 -0
- package/lib/app/messages.gen.d.ts +57 -0
- package/lib/app/messages.gen.js +435 -0
- package/lib/app/messages.js +182 -0
- package/lib/app/nodes.d.ts +1 -1
- package/lib/app/nodes.js +4 -7
- package/lib/app/observer/iframe_observer.d.ts +1 -1
- package/lib/app/observer/iframe_observer.js +3 -3
- package/lib/app/observer/observer.d.ts +2 -2
- package/lib/app/observer/observer.js +53 -47
- package/lib/app/observer/shadow_root_observer.d.ts +1 -1
- package/lib/app/observer/shadow_root_observer.js +3 -3
- package/lib/app/observer/top_observer.d.ts +11 -2
- package/lib/app/observer/top_observer.js +56 -27
- package/lib/app/sanitizer.d.ts +1 -1
- package/lib/app/sanitizer.js +7 -7
- package/lib/app/session.d.ts +18 -2
- package/lib/app/session.js +55 -6
- package/lib/app/ticker.d.ts +1 -1
- package/lib/common/{webworker.d.ts → interaction.d.ts} +5 -5
- package/lib/common/{types.js → interaction.js} +0 -0
- package/lib/common/messages.gen.d.ts +382 -0
- package/lib/common/messages.gen.js +59 -0
- package/lib/common/tsconfig.tsbuildinfo +1 -1
- package/lib/index.d.ts +10 -10
- package/lib/index.js +55 -50
- package/lib/modules/adoptedStyleSheets.d.ts +2 -0
- package/lib/modules/adoptedStyleSheets.js +124 -0
- package/lib/modules/connection.d.ts +1 -1
- package/lib/modules/connection.js +2 -2
- package/lib/modules/console.d.ts +1 -1
- package/lib/modules/console.js +8 -22
- package/lib/modules/cssrules.d.ts +1 -1
- package/lib/modules/cssrules.js +19 -15
- package/lib/modules/exception.d.ts +3 -3
- package/lib/modules/exception.js +25 -20
- package/lib/modules/img.d.ts +1 -1
- package/lib/modules/img.js +41 -28
- package/lib/modules/input.d.ts +1 -1
- package/lib/modules/input.js +37 -33
- package/lib/modules/mouse.d.ts +1 -1
- package/lib/modules/mouse.js +53 -46
- package/lib/modules/performance.d.ts +1 -1
- package/lib/modules/performance.js +3 -3
- package/lib/modules/scroll.d.ts +1 -1
- package/lib/modules/scroll.js +17 -8
- package/lib/modules/timing.d.ts +1 -1
- package/lib/modules/timing.js +16 -28
- package/lib/modules/viewport.d.ts +1 -1
- package/lib/modules/viewport.js +4 -4
- package/lib/utils.js +7 -7
- package/lib/vendors/finder/finder.js +53 -48
- package/package.json +27 -10
- package/cjs/common/messages.d.ts +0 -444
- package/cjs/common/messages.js +0 -794
- package/cjs/common/types.d.ts +0 -9
- package/cjs/common/webworker.js +0 -2
- package/cjs/modules/longtasks.d.ts +0 -2
- package/cjs/modules/longtasks.js +0 -26
- package/lib/common/messages.d.ts +0 -444
- package/lib/common/messages.js +0 -790
- package/lib/common/types.d.ts +0 -9
- package/lib/common/webworker.js +0 -1
- package/lib/modules/longtasks.d.ts +0 -2
- package/lib/modules/longtasks.js +0 -23
package/.eslintignore
ADDED
package/.prettierignore
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*.gen.ts
|
package/cjs/app/guards.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
export declare function isSVGElement(node: Element): node is SVGElement;
|
|
2
2
|
export declare function isElementNode(node: Node): node is Element;
|
|
3
3
|
export declare function isTextNode(node: Node): node is Text;
|
|
4
|
-
export declare function
|
|
4
|
+
export declare function isDocument(node: Node): node is Document;
|
|
5
|
+
export declare function isRootNode(node: Node): node is Document | DocumentFragment;
|
|
5
6
|
declare type TagTypeMap = {
|
|
6
7
|
HTML: HTMLHtmlElement;
|
|
7
8
|
IMG: HTMLImageElement;
|
package/cjs/app/guards.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.hasTag = exports.isRootNode = exports.isTextNode = exports.isElementNode = exports.isSVGElement = void 0;
|
|
3
|
+
exports.hasTag = exports.isRootNode = exports.isDocument = exports.isTextNode = exports.isElementNode = exports.isSVGElement = void 0;
|
|
4
4
|
function isSVGElement(node) {
|
|
5
5
|
return node.namespaceURI === 'http://www.w3.org/2000/svg';
|
|
6
6
|
}
|
|
@@ -13,9 +13,12 @@ function isTextNode(node) {
|
|
|
13
13
|
return node.nodeType === Node.TEXT_NODE;
|
|
14
14
|
}
|
|
15
15
|
exports.isTextNode = isTextNode;
|
|
16
|
+
function isDocument(node) {
|
|
17
|
+
return node.nodeType === Node.DOCUMENT_NODE;
|
|
18
|
+
}
|
|
19
|
+
exports.isDocument = isDocument;
|
|
16
20
|
function isRootNode(node) {
|
|
17
|
-
return node.nodeType === Node.DOCUMENT_NODE ||
|
|
18
|
-
node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
|
|
21
|
+
return node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
|
|
19
22
|
}
|
|
20
23
|
exports.isRootNode = isRootNode;
|
|
21
24
|
function hasTag(el, tagName) {
|
package/cjs/app/index.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import type Message from
|
|
2
|
-
import Nodes from
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import type { Options as
|
|
9
|
-
import type { Options as
|
|
10
|
-
import type { Options as
|
|
1
|
+
import type Message from './messages.gen.js';
|
|
2
|
+
import Nodes from './nodes.js';
|
|
3
|
+
import Observer from './observer/top_observer.js';
|
|
4
|
+
import Sanitizer from './sanitizer.js';
|
|
5
|
+
import Ticker from './ticker.js';
|
|
6
|
+
import Logger from './logger.js';
|
|
7
|
+
import Session from './session.js';
|
|
8
|
+
import type { Options as ObserverOptions } from './observer/top_observer.js';
|
|
9
|
+
import type { Options as SanitizerOptions } from './sanitizer.js';
|
|
10
|
+
import type { Options as LoggerOptions } from './logger.js';
|
|
11
|
+
import type { Options as SessOptions } from './session.js';
|
|
12
|
+
import type { Options as WebworkerOptions } from '../common/interaction.js';
|
|
11
13
|
export interface StartOptions {
|
|
12
14
|
userID?: string;
|
|
13
15
|
metadata?: Record<string, string>;
|
|
@@ -34,9 +36,9 @@ declare type CommitCallback = (messages: Array<Message>) => void;
|
|
|
34
36
|
declare type AppOptions = {
|
|
35
37
|
revID: string;
|
|
36
38
|
node_id: string;
|
|
39
|
+
session_reset_key: string;
|
|
37
40
|
session_token_key: string;
|
|
38
41
|
session_pageno_key: string;
|
|
39
|
-
session_reset_key: string;
|
|
40
42
|
local_uuid_key: string;
|
|
41
43
|
ingestPoint: string;
|
|
42
44
|
resourceBaseHref: string | null;
|
|
@@ -44,10 +46,10 @@ declare type AppOptions = {
|
|
|
44
46
|
__is_snippet: boolean;
|
|
45
47
|
__debug_report_edp: string | null;
|
|
46
48
|
__debug__?: LoggerOptions;
|
|
47
|
-
localStorage: Storage;
|
|
48
|
-
sessionStorage: Storage;
|
|
49
|
+
localStorage: Storage | null;
|
|
50
|
+
sessionStorage: Storage | null;
|
|
49
51
|
onStart?: StartCallback;
|
|
50
|
-
} & WebworkerOptions;
|
|
52
|
+
} & WebworkerOptions & SessOptions;
|
|
51
53
|
export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
|
|
52
54
|
export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
|
|
53
55
|
export default class App {
|
|
@@ -61,36 +63,36 @@ export default class App {
|
|
|
61
63
|
readonly localStorage: Storage;
|
|
62
64
|
readonly sessionStorage: Storage;
|
|
63
65
|
private readonly messages;
|
|
64
|
-
|
|
66
|
+
readonly observer: Observer;
|
|
65
67
|
private readonly startCallbacks;
|
|
66
68
|
private readonly stopCallbacks;
|
|
67
69
|
private readonly commitCallbacks;
|
|
68
70
|
private readonly options;
|
|
69
71
|
private readonly revID;
|
|
70
72
|
private activityState;
|
|
71
|
-
private version;
|
|
73
|
+
private readonly version;
|
|
72
74
|
private readonly worker?;
|
|
73
|
-
constructor(projectKey: string,
|
|
75
|
+
constructor(projectKey: string, sessionHash: string | undefined, options: Partial<Options>);
|
|
74
76
|
private _debug;
|
|
75
77
|
send(message: Message, urgent?: boolean): void;
|
|
76
78
|
private commit;
|
|
77
79
|
safe<T extends (...args: any[]) => void>(fn: T): T;
|
|
78
80
|
attachCommitCallback(cb: CommitCallback): void;
|
|
79
81
|
attachStartCallback(cb: StartCallback): void;
|
|
80
|
-
attachStopCallback(cb:
|
|
82
|
+
attachStopCallback(cb: () => any): void;
|
|
81
83
|
attachEventListener(target: EventTarget, type: string, listener: EventListener, useSafe?: boolean, useCapture?: boolean): void;
|
|
82
84
|
checkRequiredVersion(version: string): boolean;
|
|
83
|
-
private
|
|
85
|
+
private getTrackerInfo;
|
|
84
86
|
getSessionInfo(): {
|
|
85
87
|
userUUID: string | null;
|
|
86
88
|
projectKey: string;
|
|
87
89
|
revID: string;
|
|
88
|
-
timestamp: number;
|
|
89
90
|
trackerVersion: string;
|
|
90
91
|
isSnippet: boolean;
|
|
91
|
-
sessionID: string |
|
|
92
|
+
sessionID: string | undefined;
|
|
92
93
|
metadata: Record<string, string>;
|
|
93
94
|
userID: string | null;
|
|
95
|
+
timestamp: number;
|
|
94
96
|
};
|
|
95
97
|
getSessionToken(): string | undefined;
|
|
96
98
|
getSessionID(): string | undefined;
|
|
@@ -103,7 +105,7 @@ export default class App {
|
|
|
103
105
|
resetNextPageSession(flag: boolean): void;
|
|
104
106
|
private _start;
|
|
105
107
|
start(options?: StartOptions): Promise<StartPromiseReturn>;
|
|
106
|
-
stop(
|
|
108
|
+
stop(stopWorker?: boolean): void;
|
|
107
109
|
restart(): void;
|
|
108
110
|
}
|
|
109
111
|
export {};
|
package/cjs/app/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DEFAULT_INGEST_POINT = void 0;
|
|
4
|
-
const
|
|
4
|
+
const messages_gen_js_1 = require("./messages.gen.js");
|
|
5
5
|
const utils_js_1 = require("../utils.js");
|
|
6
6
|
const nodes_js_1 = require("./nodes.js");
|
|
7
7
|
const top_observer_js_1 = require("./observer/top_observer.js");
|
|
@@ -10,8 +10,8 @@ const ticker_js_1 = require("./ticker.js");
|
|
|
10
10
|
const logger_js_1 = require("./logger.js");
|
|
11
11
|
const session_js_1 = require("./session.js");
|
|
12
12
|
const performance_js_1 = require("../modules/performance.js");
|
|
13
|
-
const CANCELED =
|
|
14
|
-
const START_ERROR =
|
|
13
|
+
const CANCELED = 'canceled';
|
|
14
|
+
const START_ERROR = ':(';
|
|
15
15
|
const UnsuccessfulStart = (reason) => ({ reason, success: false });
|
|
16
16
|
const SuccessfulStart = (body) => (Object.assign(Object.assign({}, body), { success: true }));
|
|
17
17
|
var ActivityState;
|
|
@@ -23,7 +23,7 @@ var ActivityState;
|
|
|
23
23
|
// TODO: use backendHost only
|
|
24
24
|
exports.DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest';
|
|
25
25
|
class App {
|
|
26
|
-
constructor(projectKey,
|
|
26
|
+
constructor(projectKey, sessionHash, options) {
|
|
27
27
|
// if (options.onStart !== undefined) {
|
|
28
28
|
// deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
|
|
29
29
|
// } ?? maybe onStart is good
|
|
@@ -32,7 +32,7 @@ class App {
|
|
|
32
32
|
this.stopCallbacks = [];
|
|
33
33
|
this.commitCallbacks = [];
|
|
34
34
|
this.activityState = ActivityState.NotActive;
|
|
35
|
-
this.version = '3.5.16
|
|
35
|
+
this.version = '3.5.16'; // TODO: version compatability check inside each plugin.
|
|
36
36
|
this.projectKey = projectKey;
|
|
37
37
|
this.options = Object.assign({
|
|
38
38
|
revID: '',
|
|
@@ -46,8 +46,8 @@ class App {
|
|
|
46
46
|
verbose: false,
|
|
47
47
|
__is_snippet: false,
|
|
48
48
|
__debug_report_edp: null,
|
|
49
|
-
localStorage:
|
|
50
|
-
sessionStorage:
|
|
49
|
+
localStorage: null,
|
|
50
|
+
sessionStorage: null,
|
|
51
51
|
}, options);
|
|
52
52
|
this.revID = this.options.revID;
|
|
53
53
|
this.sanitizer = new sanitizer_js_1.default(this, options);
|
|
@@ -57,32 +57,32 @@ class App {
|
|
|
57
57
|
this.ticker.attach(() => this.commit());
|
|
58
58
|
this.debug = new logger_js_1.default(this.options.__debug__);
|
|
59
59
|
this.notify = new logger_js_1.default(this.options.verbose ? logger_js_1.LogLevel.Warnings : logger_js_1.LogLevel.Silent);
|
|
60
|
-
this.
|
|
60
|
+
this.localStorage = this.options.localStorage || window.localStorage;
|
|
61
|
+
this.sessionStorage = this.options.sessionStorage || window.sessionStorage;
|
|
62
|
+
this.session = new session_js_1.default(this, this.options);
|
|
61
63
|
this.session.attachUpdateCallback(({ userID, metadata }) => {
|
|
62
|
-
if (userID != null) {
|
|
63
|
-
|
|
64
|
+
if (userID != null) {
|
|
65
|
+
// TODO: nullable userID
|
|
66
|
+
this.send((0, messages_gen_js_1.UserID)(userID));
|
|
64
67
|
}
|
|
65
68
|
if (metadata != null) {
|
|
66
|
-
Object.entries(metadata).forEach(([key, value]) => this.send(
|
|
69
|
+
Object.entries(metadata).forEach(([key, value]) => this.send((0, messages_gen_js_1.Metadata)(key, value)));
|
|
67
70
|
}
|
|
68
71
|
});
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (sessionToken != null) {
|
|
72
|
-
this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
|
|
72
|
+
if (sessionHash != null) {
|
|
73
|
+
this.session.applySessionHash(sessionHash);
|
|
73
74
|
}
|
|
74
75
|
try {
|
|
75
|
-
this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function i(...i){return new t(...i)}return i.prototype=t.prototype,i}const i=new Map;const s=t(class{constructor(t,i,s){this.pageNo=t,this.firstIndex=i,this.timestamp=s,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});i.set(80,s);const e=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});i.set(0,e);const n=t(class{constructor(t,i,s){this.url=t,this.referrer=i,this.navigationStart=s,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});i.set(4,n);const r=t(class{constructor(t,i){this.width=t,this.height=i,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});i.set(5,r);const h=t(class{constructor(t,i){this.x=t,this.y=i,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});i.set(6,h);const o=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});i.set(7,o);const c=t(class{constructor(t,i,s,e,n){this.id=t,this.parentID=i,this.index=s,this.tag=e,this.svg=n,this._id=8}encode(t){return t.uint(8)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)&&t.string(this.tag)&&t.boolean(this.svg)}});i.set(8,c);const a=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(9,a);const u=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(10,u);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});i.set(11,d);const l=t(class{constructor(t,i,s){this.id=t,this.name=i,this.value=s,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});i.set(12,l);const p=t(class{constructor(t,i){this.id=t,this.name=i,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});i.set(13,p);const g=t(class{constructor(t,i){this.id=t,this.data=i,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});i.set(14,g);const m=t(class{constructor(t,i,s){this.id=t,this.x=i,this.y=s,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});i.set(16,m);const f=t(class{constructor(t,i){this.id=t,this.label=i,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});i.set(17,f);const y=t(class{constructor(t,i,s){this.id=t,this.value=i,this.mask=s,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});i.set(18,y);const _=t(class{constructor(t,i){this.id=t,this.checked=i,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});i.set(19,_);const v=t(class{constructor(t,i){this.x=t,this.y=i,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});i.set(20,v);const S=t(class{constructor(t,i){this.level=t,this.value=i,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});i.set(22,S);const b=t(class{constructor(t,i,s,e,n,r,h,o,c){this.requestStart=t,this.responseStart=i,this.responseEnd=s,this.domContentLoadedEventStart=e,this.domContentLoadedEventEnd=n,this.loadEventStart=r,this.loadEventEnd=h,this.firstPaint=o,this.firstContentfulPaint=c,this._id=23}encode(t){return t.uint(23)&&t.uint(this.requestStart)&&t.uint(this.responseStart)&&t.uint(this.responseEnd)&&t.uint(this.domContentLoadedEventStart)&&t.uint(this.domContentLoadedEventEnd)&&t.uint(this.loadEventStart)&&t.uint(this.loadEventEnd)&&t.uint(this.firstPaint)&&t.uint(this.firstContentfulPaint)}});i.set(23,b);const w=t(class{constructor(t,i,s){this.speedIndex=t,this.visuallyComplete=i,this.timeToInteractive=s,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});i.set(24,w);const E=t(class{constructor(t,i,s){this.name=t,this.message=i,this.payload=s,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});i.set(25,E);const x=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});i.set(27,x);const T=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});i.set(28,T);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});i.set(29,z);const k=t(class{constructor(t,i){this.key=t,this.value=i,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});i.set(30,k);const A=t(class{constructor(t,i,s){this.id=t,this.rule=i,this.index=s,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});i.set(37,A);const I=t(class{constructor(t,i){this.id=t,this.index=i,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});i.set(38,I);const L=t(class{constructor(t,i,s,e,n,r,h){this.method=t,this.url=i,this.request=s,this.response=e,this.status=n,this.timestamp=r,this.duration=h,this._id=39}encode(t){return t.uint(39)&&t.string(this.method)&&t.string(this.url)&&t.string(this.request)&&t.string(this.response)&&t.uint(this.status)&&t.uint(this.timestamp)&&t.uint(this.duration)}});i.set(39,L);const C=t(class{constructor(t,i,s,e){this.name=t,this.duration=i,this.args=s,this.result=e,this._id=40}encode(t){return t.uint(40)&&t.string(this.name)&&t.uint(this.duration)&&t.string(this.args)&&t.string(this.result)}});i.set(40,C);const M=t(class{constructor(t,i){this.key=t,this.value=i,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});i.set(41,M);const N=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});i.set(42,N);const B=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(44,B);const U=t(class{constructor(t,i){this.mutation=t,this.state=i,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});i.set(45,U);const R=t(class{constructor(t,i){this.type=t,this.payload=i,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});i.set(46,R);const O=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(47,O);const P=t(class{constructor(t,i,s,e){this.operationKind=t,this.operationName=i,this.variables=s,this.response=e,this._id=48}encode(t){return t.uint(48)&&t.string(this.operationKind)&&t.string(this.operationName)&&t.string(this.variables)&&t.string(this.response)}});i.set(48,P);const q=t(class{constructor(t,i,s,e){this.frames=t,this.ticks=i,this.totalJSHeapSize=s,this.usedJSHeapSize=e,this._id=49}encode(t){return t.uint(49)&&t.int(this.frames)&&t.int(this.ticks)&&t.uint(this.totalJSHeapSize)&&t.uint(this.usedJSHeapSize)}});i.set(49,q);const D=t(class{constructor(t,i,s,e,n,r,h,o){this.timestamp=t,this.duration=i,this.ttfb=s,this.headerSize=e,this.encodedBodySize=n,this.decodedBodySize=r,this.url=h,this.initiator=o,this._id=53}encode(t){return t.uint(53)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.ttfb)&&t.uint(this.headerSize)&&t.uint(this.encodedBodySize)&&t.uint(this.decodedBodySize)&&t.string(this.url)&&t.string(this.initiator)}});i.set(53,D);const W=t(class{constructor(t,i){this.downlink=t,this.type=i,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});i.set(54,W);const H=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});i.set(55,H);const J=t(class{constructor(t,i,s,e,n,r,h){this.timestamp=t,this.duration=i,this.context=s,this.containerType=e,this.containerSrc=n,this.containerId=r,this.containerName=h,this._id=59}encode(t){return t.uint(59)&&t.uint(this.timestamp)&&t.uint(this.duration)&&t.uint(this.context)&&t.uint(this.containerType)&&t.string(this.containerSrc)&&t.string(this.containerId)&&t.string(this.containerName)}});i.set(59,J);const F=t(class{constructor(t,i,s,e){this.id=t,this.name=i,this.value=s,this.baseURL=e,this._id=60}encode(t){return t.uint(60)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)&&t.string(this.baseURL)}});i.set(60,F);const X=t(class{constructor(t,i,s){this.id=t,this.data=i,this.baseURL=s,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});i.set(61,X);const G=t(class{constructor(t,i){this.type=t,this.value=i,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});i.set(63,G);const K=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});i.set(64,K);const j=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});i.set(65,j);const Q=t(class{constructor(t,i,s,e){this.id=t,this.rule=i,this.index=s,this.baseURL=e,this._id=67}encode(t){return t.uint(67)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)&&t.string(this.baseURL)}});i.set(67,Q);const V=t(class{constructor(t,i,s,e){this.id=t,this.hesitationTime=i,this.label=s,this.selector=e,this._id=69}encode(t){return t.uint(69)&&t.uint(this.id)&&t.uint(this.hesitationTime)&&t.string(this.label)&&t.string(this.selector)}});i.set(69,V);const Y=t(class{constructor(t,i){this.frameID=t,this.id=i,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});i.set(70,Y);class Z{constructor(t,i,s,e=10,n=1e3){this.onUnauthorised=i,this.onFailure=s,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();if(i.status>=400)return void this.retry(t);this.attemptsCount=0;const s=this.queue.shift();s?this.sendBatch(s):this.busy=!1}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0}}const tt="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(var n=0,r=0,h=0;h!==i;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===i){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;break}if(!((r=t.charCodeAt(h))>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(h+=1,(n=1024*(n-55296)+r-56320+65536)>65535){s[e+=1]=240|n>>>18,s[e+=1]=128|n>>>12&63,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n;continue}}n<=127?s[e+=1]=0|n:n<=2047?(s[e+=1]=192|n>>>6,s[e+=1]=128|63&n):(s[e+=1]=224|n>>>12,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n)}return s.subarray(0,e+1)}};class it{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}boolean(t){return this.data[this.offset++]=+t,this.offset<=this.size}uint(t){for((t<0||t>Number.MAX_SAFE_INTEGER)&&(t=0);t>=128;)this.data[this.offset++]=t%256|128,t=Math.floor(t/128);return this.data[this.offset++]=t,this.offset<=this.size}int(t){return t=Math.round(t),this.uint(t>=0?2*t:-2*t-1)}string(t){const i=tt.encode(t),s=i.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(i,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}class st{constructor(t,i,s){this.pageNo=t,this.timestamp=i,this.onBatch=s,this.nextIndex=0,this.beaconSize=2e5,this.writer=new it(this.beaconSize),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}prepare(){this.writer.isEmpty()&&new s(this.pageNo,this.nextIndex,this.timestamp).encode(this.writer)}write(t){const i=t.encode(this.writer);return i&&(this.isEmpty=!1,this.writer.checkpoint(),this.nextIndex++),i}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){for(t instanceof e&&(this.timestamp=t.timestamp);!this.write(t);){if(this.finaliseBatch(),this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message."),this.writer.reset(),this.prepare(),void(this.isEmpty=!0);this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.writer=new it(this.beaconSize),this.prepare(),this.isEmpty=!0}}finaliseBatch(){this.isEmpty||(this.onBatch(this.writer.flush()),this.prepare(),this.isEmpty=!0)}clean(){this.writer.reset()}}var et;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(et||(et={}));let nt=null,rt=null;function ht(){rt&&rt.finaliseBatch()}function ot(){et.Stopping,null!==at&&(clearInterval(at),at=null),rt&&(rt.clean(),rt=null),et.NotActive}et.NotActive;let ct,at=null;self.onmessage=({data:t})=>{if(null!=t){if("stop"===t)return ht(),void ot();if(Array.isArray(t)){if(!rt)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const s=rt;t.forEach(t=>{const e=new(i.get(t._id));Object.assign(e,t),e instanceof H&&(e.hidden?ct=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ct)),s.writeMessage(e)})}else{if("start"===t.type)return et.Starting,nt=new Z(t.ingestPoint,()=>{self.postMessage("restart")},()=>{nt&&(nt.clean(),nt=null),ot(),self.postMessage("failed")},t.connAttemptCount,t.connAttemptGap),rt=new st(t.pageNo,t.timestamp,t=>nt&&nt.push(t)),null===at&&(at=setInterval(ht,1e4)),et.Active;if("auth"===t.type){if(!nt)throw new Error("WebWorker: sender not initialised. Received auth.");if(!rt)throw new Error("WebWorker: writer not initialised. Received auth.");return nt.authorise(t.token),void(t.beaconSizeLimit&&rt.setBeaconSizeLimit(t.beaconSizeLimit))}}}else ht()};
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
this._debug("webworker_error", e);
|
|
76
|
+
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";var t;!function(t){t[t.BatchMetadata=81]="BatchMetadata",t[t.PartitionedMessage=82]="PartitionedMessage",t[t.Timestamp=0]="Timestamp",t[t.SetPageLocation=4]="SetPageLocation",t[t.SetViewportSize=5]="SetViewportSize",t[t.SetViewportScroll=6]="SetViewportScroll",t[t.CreateDocument=7]="CreateDocument",t[t.CreateElementNode=8]="CreateElementNode",t[t.CreateTextNode=9]="CreateTextNode",t[t.MoveNode=10]="MoveNode",t[t.RemoveNode=11]="RemoveNode",t[t.SetNodeAttribute=12]="SetNodeAttribute",t[t.RemoveNodeAttribute=13]="RemoveNodeAttribute",t[t.SetNodeData=14]="SetNodeData",t[t.SetNodeScroll=16]="SetNodeScroll",t[t.SetInputTarget=17]="SetInputTarget",t[t.SetInputValue=18]="SetInputValue",t[t.SetInputChecked=19]="SetInputChecked",t[t.MouseMove=20]="MouseMove",t[t.ConsoleLog=22]="ConsoleLog",t[t.PageLoadTiming=23]="PageLoadTiming",t[t.PageRenderTiming=24]="PageRenderTiming",t[t.JSException=25]="JSException",t[t.RawCustomEvent=27]="RawCustomEvent",t[t.UserID=28]="UserID",t[t.UserAnonymousID=29]="UserAnonymousID",t[t.Metadata=30]="Metadata",t[t.CSSInsertRule=37]="CSSInsertRule",t[t.CSSDeleteRule=38]="CSSDeleteRule",t[t.Fetch=39]="Fetch",t[t.Profiler=40]="Profiler",t[t.OTable=41]="OTable",t[t.StateAction=42]="StateAction",t[t.Redux=44]="Redux",t[t.Vuex=45]="Vuex",t[t.MobX=46]="MobX",t[t.NgRx=47]="NgRx",t[t.GraphQL=48]="GraphQL",t[t.PerformanceTrack=49]="PerformanceTrack",t[t.ResourceTiming=53]="ResourceTiming",t[t.ConnectionInformation=54]="ConnectionInformation",t[t.SetPageVisibility=55]="SetPageVisibility",t[t.LongTask=59]="LongTask",t[t.SetNodeAttributeURLBased=60]="SetNodeAttributeURLBased",t[t.SetCSSDataURLBased=61]="SetCSSDataURLBased",t[t.TechnicalInfo=63]="TechnicalInfo",t[t.CustomIssue=64]="CustomIssue",t[t.CSSInsertRuleURLBased=67]="CSSInsertRuleURLBased",t[t.MouseClick=69]="MouseClick",t[t.CreateIFrameDocument=70]="CreateIFrameDocument",t[t.AdoptedSSReplaceURLBased=71]="AdoptedSSReplaceURLBased",t[t.AdoptedSSInsertRuleURLBased=73]="AdoptedSSInsertRuleURLBased",t[t.AdoptedSSDeleteRule=75]="AdoptedSSDeleteRule",t[t.AdoptedSSAddOwner=76]="AdoptedSSAddOwner",t[t.AdoptedSSRemoveOwner=77]="AdoptedSSRemoveOwner"}(t||(t={}));class e{constructor(t,e,i,s=10,n=1e3){this.onUnauthorised=e,this.onFailure=i,this.MAX_ATTEMPTS_COUNT=s,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(e=>{if(401===e.status)return this.busy=!1,void this.onUnauthorised();if(e.status>=400)return void this.retry(t);this.attemptsCount=0;const i=this.queue.shift();i?this.sendBatch(i):this.busy=!1}).catch(e=>{console.warn("OpenReplay:",e),this.retry(t)})}clean(){this.queue.length=0}}const i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const e=t.length,i=new Uint8Array(3*e);let s=-1;for(let n=0,r=0,h=0;h!==e;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===e){i[s+=1]=239,i[s+=1]=191,i[s+=1]=189;break}if(r=t.charCodeAt(h),!(r>=56320&&r<=57343)){i[s+=1]=239,i[s+=1]=191,i[s+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>65535){i[s+=1]=240|n>>>18,i[s+=1]=128|n>>>12&63,i[s+=1]=128|n>>>6&63,i[s+=1]=128|63&n;continue}}n<=127?i[s+=1]=0|n:n<=2047?(i[s+=1]=192|n>>>6,i[s+=1]=128|63&n):(i[s+=1]=224|n>>>12,i[s+=1]=128|n>>>6&63,i[s+=1]=128|63&n)}return i.subarray(0,s+1)}};class s extends class{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}getCurrentOffset(){return this.offset}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}skip(t){return this.offset+=t,this.offset<=this.size}set(t,e){this.data.set(t,e)}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 e=i.encode(t),s=e.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(e,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}}{encode(e){switch(e[0]){case t.BatchMetadata:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.int(e[4])&&this.string(e[5]);case t.PartitionedMessage:return this.uint(e[1])&&this.uint(e[2]);case t.Timestamp:return this.uint(e[1]);case t.SetPageLocation:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.SetViewportSize:return this.uint(e[1])&&this.uint(e[2]);case t.SetViewportScroll:return this.int(e[1])&&this.int(e[2]);case t.CreateDocument:return!0;case t.CreateElementNode:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.string(e[4])&&this.boolean(e[5]);case t.CreateTextNode:case t.MoveNode:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3]);case t.RemoveNode:return this.uint(e[1]);case t.SetNodeAttribute:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.RemoveNodeAttribute:case t.SetNodeData:return this.uint(e[1])&&this.string(e[2]);case t.SetNodeScroll:return this.uint(e[1])&&this.int(e[2])&&this.int(e[3]);case t.SetInputTarget:return this.uint(e[1])&&this.string(e[2]);case t.SetInputValue:return this.uint(e[1])&&this.string(e[2])&&this.int(e[3]);case t.SetInputChecked:return this.uint(e[1])&&this.boolean(e[2]);case t.MouseMove:return this.uint(e[1])&&this.uint(e[2]);case t.ConsoleLog:return this.string(e[1])&&this.string(e[2]);case t.PageLoadTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.uint(e[7])&&this.uint(e[8])&&this.uint(e[9]);case t.PageRenderTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3]);case t.JSException:return this.string(e[1])&&this.string(e[2])&&this.string(e[3]);case t.RawCustomEvent:return this.string(e[1])&&this.string(e[2]);case t.UserID:case t.UserAnonymousID:return this.string(e[1]);case t.Metadata:return this.string(e[1])&&this.string(e[2]);case t.CSSInsertRule:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.CSSDeleteRule:return this.uint(e[1])&&this.uint(e[2]);case t.Fetch:return this.string(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.uint(e[7]);case t.Profiler:return this.string(e[1])&&this.uint(e[2])&&this.string(e[3])&&this.string(e[4]);case t.OTable:return this.string(e[1])&&this.string(e[2]);case t.StateAction:return this.string(e[1]);case t.Redux:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.Vuex:case t.MobX:return this.string(e[1])&&this.string(e[2]);case t.NgRx:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.GraphQL:return this.string(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4]);case t.PerformanceTrack:return this.int(e[1])&&this.int(e[2])&&this.uint(e[3])&&this.uint(e[4]);case t.ResourceTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.string(e[7])&&this.string(e[8]);case t.ConnectionInformation:return this.uint(e[1])&&this.string(e[2]);case t.SetPageVisibility:return this.boolean(e[1]);case t.LongTask:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.string(e[5])&&this.string(e[6])&&this.string(e[7]);case t.SetNodeAttributeURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4]);case t.SetCSSDataURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.TechnicalInfo:case t.CustomIssue:return this.string(e[1])&&this.string(e[2]);case t.CSSInsertRuleURLBased:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3])&&this.string(e[4]);case t.MouseClick:return this.uint(e[1])&&this.uint(e[2])&&this.string(e[3])&&this.string(e[4]);case t.CreateIFrameDocument:return this.uint(e[1])&&this.uint(e[2]);case t.AdoptedSSReplaceURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.AdoptedSSInsertRuleURLBased:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3])&&this.string(e[4]);case t.AdoptedSSDeleteRule:case t.AdoptedSSAddOwner:case t.AdoptedSSRemoveOwner:return this.uint(e[1])&&this.uint(e[2])}}}class n{constructor(t,e,i,n){this.pageNo=t,this.timestamp=e,this.url=i,this.onBatch=n,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(this.beaconSize),this.sizeBuffer=new Uint8Array(3),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}writeType(t){return this.encoder.uint(t[0])}writeFields(t){return this.encoder.encode(t)}writeSizeAt(t,e){for(let e=0;e<3;e++)this.sizeBuffer[e]=t>>8*e;this.encoder.set(this.sizeBuffer,e)}prepare(){if(!this.encoder.isEmpty())return;const e=[t.BatchMetadata,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(e),this.writeFields(e),this.isEmpty=!0}writeWithSize(e){const i=this.encoder;if(!this.writeType(e)||!i.skip(3))return!1;const s=i.getCurrentOffset(),n=this.writeFields(e);if(n){const n=i.getCurrentOffset()-s;if(n>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(n,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&e[0]===t.Timestamp,this.nextIndex++}return n}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(e){if(e[0]===t.Timestamp&&(this.timestamp=e[1]),e[0]===t.SetPageLocation&&(this.url=e[1]),!this.writeWithSize(e))for(this.finaliseBatch();!this.writeWithSize(e);){if(this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message.",e),this.encoder.reset(),void this.prepare();this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.encoder=new s(this.beaconSize),this.prepare()}}finaliseBatch(){this.isEmpty||(this.onBatch(this.encoder.flush()),this.prepare())}clean(){this.encoder.reset()}}var r;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(r||(r={}));let h=null,a=null;function o(){a&&a.finaliseBatch()}function u(){r.Stopping,null!==d&&(clearInterval(d),d=null),a&&(a.clean(),a=null),r.NotActive}r.NotActive;let c,d=null;self.onmessage=({data:i})=>{if(null!=i){if("stop"===i)return o(),void u();if(Array.isArray(i)){if(!a)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const e=a;i.forEach(i=>{i[0]===t.SetPageVisibility&&(i[1]?c=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(c)),e.writeMessage(i)})}else{if("start"===i.type)return r.Starting,h=new e(i.ingestPoint,()=>{self.postMessage("restart")},()=>{h&&(h.clean(),h=null),u(),self.postMessage("failed")},i.connAttemptCount,i.connAttemptGap),a=new n(i.pageNo,i.timestamp,i.url,t=>h&&h.push(t)),null===d&&(d=setInterval(o,1e4)),r.Active;if("auth"===i.type){if(!h)throw new Error("WebWorker: sender not initialised. Received auth.");if(!a)throw new Error("WebWorker: writer not initialised. Received auth.");return h.authorise(i.token),void(i.beaconSizeLimit&&a.setBeaconSizeLimit(i.beaconSizeLimit))}}}else o()};'], { type: 'text/javascript' })));
|
|
77
|
+
this.worker.onerror = (e) => {
|
|
78
|
+
this._debug('webworker_error', e);
|
|
79
79
|
};
|
|
80
80
|
this.worker.onmessage = ({ data }) => {
|
|
81
|
-
if (data ===
|
|
81
|
+
if (data === 'failed') {
|
|
82
82
|
this.stop();
|
|
83
|
-
this._debug(
|
|
83
|
+
this._debug('worker_failed', {}); // add context (from worker)
|
|
84
84
|
}
|
|
85
|
-
else if (data ===
|
|
85
|
+
else if (data === 'restart') {
|
|
86
86
|
this.stop();
|
|
87
87
|
this.start({ forceNew: true });
|
|
88
88
|
}
|
|
@@ -99,7 +99,7 @@ class App {
|
|
|
99
99
|
this.attachEventListener(document, 'visibilitychange', alertWorker, false);
|
|
100
100
|
}
|
|
101
101
|
catch (e) {
|
|
102
|
-
this._debug(
|
|
102
|
+
this._debug('worker_start', e);
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
_debug(context, e) {
|
|
@@ -109,20 +109,20 @@ class App {
|
|
|
109
109
|
headers: { 'Content-Type': 'application/json' },
|
|
110
110
|
body: JSON.stringify({
|
|
111
111
|
context,
|
|
112
|
-
error: `${e}
|
|
113
|
-
})
|
|
112
|
+
error: `${e}`,
|
|
113
|
+
}),
|
|
114
114
|
});
|
|
115
115
|
}
|
|
116
|
-
this.debug.error(
|
|
116
|
+
this.debug.error('OpenReplay error: ', context, e);
|
|
117
117
|
}
|
|
118
118
|
send(message, urgent = false) {
|
|
119
119
|
if (this.activityState === ActivityState.NotActive) {
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
122
|
this.messages.push(message);
|
|
123
|
-
// TODO: commit on start if there were `urgent` sends;
|
|
123
|
+
// TODO: commit on start if there were `urgent` sends;
|
|
124
124
|
// Clearify where urgent can be used for;
|
|
125
|
-
// Clearify workflow for each type of message in case it was sent before start
|
|
125
|
+
// Clearify workflow for each type of message in case it was sent before start
|
|
126
126
|
// (like Fetch before start; maybe add an option "preCapture: boolean" or sth alike)
|
|
127
127
|
if (this.activityState === ActivityState.Active && urgent) {
|
|
128
128
|
this.commit();
|
|
@@ -130,9 +130,9 @@ class App {
|
|
|
130
130
|
}
|
|
131
131
|
commit() {
|
|
132
132
|
if (this.worker && this.messages.length) {
|
|
133
|
-
this.messages.unshift(
|
|
133
|
+
this.messages.unshift((0, messages_gen_js_1.Timestamp)((0, utils_js_1.timestamp)()));
|
|
134
134
|
this.worker.postMessage(this.messages);
|
|
135
|
-
this.commitCallbacks.forEach(cb => cb(this.messages));
|
|
135
|
+
this.commitCallbacks.forEach((cb) => cb(this.messages));
|
|
136
136
|
this.messages.length = 0;
|
|
137
137
|
}
|
|
138
138
|
}
|
|
@@ -143,9 +143,8 @@ class App {
|
|
|
143
143
|
fn.apply(this, args);
|
|
144
144
|
}
|
|
145
145
|
catch (e) {
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
// time: timestamp(),
|
|
146
|
+
app._debug('safe_fn_call', e);
|
|
147
|
+
// time: now(),
|
|
149
148
|
// name: e.name,
|
|
150
149
|
// message: e.message,
|
|
151
150
|
// stack: e.stack
|
|
@@ -173,30 +172,32 @@ class App {
|
|
|
173
172
|
const reqVer = version.split(/[.-]/);
|
|
174
173
|
const ver = this.version.split(/[.-]/);
|
|
175
174
|
for (let i = 0; i < 3; i++) {
|
|
176
|
-
if (
|
|
175
|
+
if (isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
if (Number(ver[i]) > Number(reqVer[i])) {
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
if (Number(ver[i]) < Number(reqVer[i])) {
|
|
177
182
|
return false;
|
|
178
183
|
}
|
|
179
184
|
}
|
|
180
185
|
return true;
|
|
181
186
|
}
|
|
182
|
-
|
|
187
|
+
getTrackerInfo() {
|
|
183
188
|
return {
|
|
184
189
|
userUUID: this.localStorage.getItem(this.options.local_uuid_key),
|
|
185
190
|
projectKey: this.projectKey,
|
|
186
191
|
revID: this.revID,
|
|
187
|
-
timestamp: (0, utils_js_1.timestamp)(),
|
|
188
192
|
trackerVersion: this.version,
|
|
189
193
|
isSnippet: this.options.__is_snippet,
|
|
190
194
|
};
|
|
191
195
|
}
|
|
192
196
|
getSessionInfo() {
|
|
193
|
-
return Object.assign(Object.assign({}, this.session.getInfo()), this.
|
|
197
|
+
return Object.assign(Object.assign({}, this.session.getInfo()), this.getTrackerInfo());
|
|
194
198
|
}
|
|
195
199
|
getSessionToken() {
|
|
196
|
-
|
|
197
|
-
if (token !== null) {
|
|
198
|
-
return token;
|
|
199
|
-
}
|
|
200
|
+
return this.session.getSessionToken();
|
|
200
201
|
}
|
|
201
202
|
getSessionID() {
|
|
202
203
|
return this.session.getInfo().sessionID || undefined;
|
|
@@ -213,18 +214,19 @@ class App {
|
|
|
213
214
|
return this.options.resourceBaseHref;
|
|
214
215
|
}
|
|
215
216
|
else if (typeof this.options.resourceBaseHref === 'object') {
|
|
216
|
-
//switch between
|
|
217
|
+
//TODO: switch between types
|
|
217
218
|
}
|
|
218
219
|
if (document.baseURI) {
|
|
219
220
|
return document.baseURI;
|
|
220
221
|
}
|
|
221
222
|
// IE only
|
|
222
|
-
return ((_b = (_a = document.head) === null || _a === void 0 ? void 0 : _a.getElementsByTagName(
|
|
223
|
+
return (((_b = (_a = document.head) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('base')[0]) === null || _b === void 0 ? void 0 : _b.getAttribute('href')) ||
|
|
224
|
+
location.origin + location.pathname);
|
|
223
225
|
}
|
|
224
226
|
resolveResourceURL(resourceURL) {
|
|
225
227
|
const base = new URL(this.getBaseHref());
|
|
226
|
-
base.pathname +=
|
|
227
|
-
base.pathname.replace(/\/+/g,
|
|
228
|
+
base.pathname += '/' + new URL(resourceURL).pathname;
|
|
229
|
+
base.pathname.replace(/\/+/g, '/');
|
|
228
230
|
return base.toString();
|
|
229
231
|
}
|
|
230
232
|
isServiceURL(url) {
|
|
@@ -243,72 +245,73 @@ class App {
|
|
|
243
245
|
}
|
|
244
246
|
_start(startOpts) {
|
|
245
247
|
if (!this.worker) {
|
|
246
|
-
return Promise.resolve(UnsuccessfulStart(
|
|
248
|
+
return Promise.resolve(UnsuccessfulStart('No worker found: perhaps, CSP is not set.'));
|
|
247
249
|
}
|
|
248
250
|
if (this.activityState !== ActivityState.NotActive) {
|
|
249
|
-
return Promise.resolve(UnsuccessfulStart(
|
|
251
|
+
return Promise.resolve(UnsuccessfulStart('OpenReplay: trying to call `start()` on the instance that has been started already.'));
|
|
250
252
|
}
|
|
251
253
|
this.activityState = ActivityState.Starting;
|
|
252
|
-
|
|
253
|
-
const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
|
|
254
|
-
if (pageNoStr != null) {
|
|
255
|
-
pageNo = parseInt(pageNoStr);
|
|
256
|
-
pageNo++;
|
|
257
|
-
}
|
|
258
|
-
this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
|
|
259
|
-
const startInfo = this.getStartInfo();
|
|
254
|
+
const timestamp = (0, utils_js_1.timestamp)();
|
|
260
255
|
const startWorkerMsg = {
|
|
261
|
-
type:
|
|
262
|
-
pageNo,
|
|
256
|
+
type: 'start',
|
|
257
|
+
pageNo: this.session.incPageNo(),
|
|
263
258
|
ingestPoint: this.options.ingestPoint,
|
|
264
|
-
timestamp
|
|
259
|
+
timestamp,
|
|
260
|
+
url: document.URL,
|
|
265
261
|
connAttemptCount: this.options.connAttemptCount,
|
|
266
262
|
connAttemptGap: this.options.connAttemptGap,
|
|
267
263
|
};
|
|
268
264
|
this.worker.postMessage(startWorkerMsg);
|
|
269
265
|
this.session.update({
|
|
270
|
-
// "
|
|
266
|
+
// TODO: transparent "session" module logic AND explicit internal api for plugins.
|
|
267
|
+
// "updating" with old metadata in order to trigger session's UpdateCallbacks.
|
|
271
268
|
// (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
|
|
272
269
|
metadata: startOpts.metadata || this.session.getInfo().metadata,
|
|
273
270
|
userID: startOpts.userID,
|
|
274
271
|
});
|
|
275
272
|
const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
|
|
276
273
|
this.sessionStorage.removeItem(this.options.session_reset_key);
|
|
277
|
-
return window
|
|
274
|
+
return window
|
|
275
|
+
.fetch(this.options.ingestPoint + '/v1/web/start', {
|
|
278
276
|
method: 'POST',
|
|
279
277
|
headers: {
|
|
280
278
|
'Content-Type': 'application/json',
|
|
281
279
|
},
|
|
282
|
-
body: JSON.stringify(Object.assign(Object.assign({},
|
|
280
|
+
body: JSON.stringify(Object.assign(Object.assign({}, this.getTrackerInfo()), { timestamp, userID: this.session.getInfo().userID, token: this.session.getSessionToken(), deviceMemory: performance_js_1.deviceMemory,
|
|
283
281
|
jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
|
|
284
282
|
})
|
|
285
|
-
.then(r => {
|
|
283
|
+
.then((r) => {
|
|
286
284
|
if (r.status === 200) {
|
|
287
285
|
return r.json();
|
|
288
286
|
}
|
|
289
287
|
else {
|
|
290
|
-
return r
|
|
288
|
+
return r
|
|
289
|
+
.text()
|
|
290
|
+
.then((text) => text === CANCELED
|
|
291
291
|
? Promise.reject(CANCELED)
|
|
292
292
|
: Promise.reject(`Server error: ${r.status}. ${text}`));
|
|
293
293
|
}
|
|
294
294
|
})
|
|
295
|
-
.then(r => {
|
|
295
|
+
.then((r) => {
|
|
296
296
|
if (!this.worker) {
|
|
297
|
-
return Promise.reject(
|
|
297
|
+
return Promise.reject('no worker found after start request (this might not happen)');
|
|
298
298
|
}
|
|
299
|
-
const { token, userUUID, sessionID, beaconSizeLimit
|
|
299
|
+
const { token, userUUID, sessionID, beaconSizeLimit, startTimestamp, // real startTS, derived from sessionID
|
|
300
|
+
} = r;
|
|
300
301
|
if (typeof token !== 'string' ||
|
|
301
302
|
typeof userUUID !== 'string' ||
|
|
303
|
+
//typeof startTimestamp !== 'number' ||
|
|
304
|
+
//typeof sessionID !== 'string' ||
|
|
302
305
|
(typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
|
|
303
306
|
return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
|
|
304
307
|
}
|
|
305
|
-
this.
|
|
308
|
+
this.session.setSessionToken(token);
|
|
306
309
|
this.localStorage.setItem(this.options.local_uuid_key, userUUID);
|
|
307
|
-
this.session.update({ sessionID }); // TODO: no no-explicit 'any'
|
|
310
|
+
this.session.update({ sessionID, timestamp: startTimestamp || timestamp }); // TODO: no no-explicit 'any'
|
|
308
311
|
const startWorkerMsg = {
|
|
309
|
-
type:
|
|
312
|
+
type: 'auth',
|
|
310
313
|
token,
|
|
311
|
-
beaconSizeLimit
|
|
314
|
+
beaconSizeLimit,
|
|
312
315
|
};
|
|
313
316
|
this.worker.postMessage(startWorkerMsg);
|
|
314
317
|
this.activityState = ActivityState.Active;
|
|
@@ -316,21 +319,21 @@ class App {
|
|
|
316
319
|
this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
|
|
317
320
|
this.observer.observe();
|
|
318
321
|
this.ticker.start();
|
|
319
|
-
this.notify.log(
|
|
322
|
+
this.notify.log('OpenReplay tracking started.');
|
|
320
323
|
// get rid of onStart ?
|
|
321
324
|
if (typeof this.options.onStart === 'function') {
|
|
322
325
|
this.options.onStart(onStartInfo);
|
|
323
326
|
}
|
|
324
327
|
return SuccessfulStart(onStartInfo);
|
|
325
328
|
})
|
|
326
|
-
.catch(reason => {
|
|
327
|
-
this.sessionStorage.removeItem(this.options.session_token_key);
|
|
329
|
+
.catch((reason) => {
|
|
328
330
|
this.stop();
|
|
331
|
+
this.session.reset();
|
|
329
332
|
if (reason === CANCELED) {
|
|
330
333
|
return UnsuccessfulStart(CANCELED);
|
|
331
334
|
}
|
|
332
|
-
this.notify.log(
|
|
333
|
-
this._debug(
|
|
335
|
+
this.notify.log('OpenReplay was unable to start. ', reason);
|
|
336
|
+
this._debug('session_start', reason);
|
|
334
337
|
return UnsuccessfulStart(START_ERROR);
|
|
335
338
|
});
|
|
336
339
|
}
|
|
@@ -342,15 +345,15 @@ class App {
|
|
|
342
345
|
return new Promise((resolve) => {
|
|
343
346
|
const onVisibilityChange = () => {
|
|
344
347
|
if (!document.hidden) {
|
|
345
|
-
document.removeEventListener(
|
|
348
|
+
document.removeEventListener('visibilitychange', onVisibilityChange);
|
|
346
349
|
resolve(this._start(options));
|
|
347
350
|
}
|
|
348
351
|
};
|
|
349
|
-
document.addEventListener(
|
|
352
|
+
document.addEventListener('visibilitychange', onVisibilityChange);
|
|
350
353
|
});
|
|
351
354
|
}
|
|
352
355
|
}
|
|
353
|
-
stop(
|
|
356
|
+
stop(stopWorker = true) {
|
|
354
357
|
if (this.activityState !== ActivityState.NotActive) {
|
|
355
358
|
try {
|
|
356
359
|
this.sanitizer.clear();
|
|
@@ -358,12 +361,9 @@ class App {
|
|
|
358
361
|
this.nodes.clear();
|
|
359
362
|
this.ticker.stop();
|
|
360
363
|
this.stopCallbacks.forEach((cb) => cb());
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
this.notify.log("OpenReplay tracking stopped.");
|
|
365
|
-
if (this.worker && !restarting) {
|
|
366
|
-
this.worker.postMessage("stop");
|
|
364
|
+
this.notify.log('OpenReplay tracking stopped.');
|
|
365
|
+
if (this.worker && stopWorker) {
|
|
366
|
+
this.worker.postMessage('stop');
|
|
367
367
|
}
|
|
368
368
|
}
|
|
369
369
|
finally {
|
|
@@ -372,7 +372,7 @@ class App {
|
|
|
372
372
|
}
|
|
373
373
|
}
|
|
374
374
|
restart() {
|
|
375
|
-
this.stop(false
|
|
375
|
+
this.stop(false);
|
|
376
376
|
this.start({ forceNew: false });
|
|
377
377
|
}
|
|
378
378
|
}
|
package/cjs/app/logger.js
CHANGED
|
@@ -13,9 +13,12 @@ function IsCustomLevel(l) {
|
|
|
13
13
|
}
|
|
14
14
|
class Logger {
|
|
15
15
|
constructor(options = exports.LogLevel.Silent) {
|
|
16
|
-
this.options =
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
this.options =
|
|
17
|
+
options === true
|
|
18
|
+
? { level: exports.LogLevel.Verbose }
|
|
19
|
+
: typeof options === 'number'
|
|
20
|
+
? { level: options }
|
|
21
|
+
: options;
|
|
19
22
|
}
|
|
20
23
|
log(...args) {
|
|
21
24
|
if (IsCustomLevel(this.options.level)
|