@openreplay/tracker 3.6.0 → 3.6.3
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/LICENSE +1 -1
- package/cjs/app/guards.d.ts +1 -2
- package/cjs/app/guards.js +3 -6
- package/cjs/app/index.d.ts +23 -28
- package/cjs/app/index.js +83 -101
- package/cjs/app/logger.js +3 -6
- package/cjs/app/nodes.d.ts +1 -1
- package/cjs/app/nodes.js +0 -2
- 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 +3 -2
- package/cjs/app/observer/observer.js +52 -50
- 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 +2 -13
- package/cjs/app/observer/top_observer.js +23 -58
- package/cjs/app/sanitizer.d.ts +1 -1
- package/cjs/app/sanitizer.js +5 -5
- package/cjs/app/session.d.ts +2 -20
- package/cjs/app/session.js +6 -65
- package/cjs/app/ticker.d.ts +1 -1
- package/cjs/common/messages.d.ts +444 -0
- package/cjs/common/messages.js +794 -0
- package/cjs/common/types.d.ts +9 -0
- package/cjs/common/{interaction.js → types.js} +0 -0
- package/cjs/common/{interaction.d.ts → webworker.d.ts} +5 -5
- package/cjs/common/{messages.gen.js → webworker.js} +0 -1
- package/cjs/index.d.ts +9 -10
- package/cjs/index.js +36 -47
- 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 +21 -7
- package/cjs/modules/cssrules.d.ts +1 -1
- package/cjs/modules/cssrules.js +14 -18
- package/cjs/modules/exception.d.ts +3 -3
- package/cjs/modules/exception.js +18 -23
- package/cjs/modules/img.d.ts +1 -1
- package/cjs/modules/img.js +26 -39
- package/cjs/modules/input.d.ts +1 -1
- package/cjs/modules/input.js +21 -21
- package/cjs/modules/longtasks.d.ts +2 -0
- package/cjs/modules/longtasks.js +26 -0
- package/cjs/modules/mouse.d.ts +1 -1
- package/cjs/modules/mouse.js +43 -50
- 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 +7 -16
- package/cjs/modules/timing.d.ts +1 -1
- package/cjs/modules/timing.js +26 -14
- 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 +48 -53
- package/lib/app/guards.d.ts +1 -2
- package/lib/app/guards.js +2 -4
- package/lib/app/index.d.ts +23 -28
- package/lib/app/index.js +91 -109
- package/lib/app/logger.js +3 -6
- package/lib/app/nodes.d.ts +1 -1
- package/lib/app/nodes.js +0 -2
- 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 +3 -2
- package/lib/app/observer/observer.js +53 -51
- 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 +2 -13
- package/lib/app/observer/top_observer.js +27 -62
- package/lib/app/sanitizer.d.ts +1 -1
- package/lib/app/sanitizer.js +7 -7
- package/lib/app/session.d.ts +2 -20
- package/lib/app/session.js +6 -65
- package/lib/app/ticker.d.ts +1 -1
- package/lib/common/messages.d.ts +444 -0
- package/lib/common/messages.js +790 -0
- package/lib/common/tsconfig.tsbuildinfo +1 -1
- package/lib/common/types.d.ts +9 -0
- package/lib/common/{interaction.js → types.js} +0 -0
- package/lib/common/{interaction.d.ts → webworker.d.ts} +5 -5
- package/lib/common/webworker.js +1 -0
- package/lib/index.d.ts +9 -10
- package/lib/index.js +49 -60
- 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 +22 -8
- package/lib/modules/cssrules.d.ts +1 -1
- package/lib/modules/cssrules.js +15 -19
- package/lib/modules/exception.d.ts +3 -3
- package/lib/modules/exception.js +18 -23
- package/lib/modules/img.d.ts +1 -1
- package/lib/modules/img.js +28 -41
- package/lib/modules/input.d.ts +1 -1
- package/lib/modules/input.js +23 -23
- package/lib/modules/longtasks.d.ts +2 -0
- package/lib/modules/longtasks.js +23 -0
- package/lib/modules/mouse.d.ts +1 -1
- package/lib/modules/mouse.js +46 -53
- 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 +8 -17
- package/lib/modules/timing.d.ts +1 -1
- package/lib/modules/timing.js +28 -16
- 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 +48 -53
- package/package.json +10 -27
- package/.eslintignore +0 -8
- package/.prettierignore +0 -1
- package/cjs/app/messages.d.ts +0 -52
- package/cjs/app/messages.gen.d.ts +0 -57
- package/cjs/app/messages.gen.js +0 -493
- package/cjs/app/messages.js +0 -234
- package/cjs/common/messages.gen.d.ts +0 -382
- package/cjs/modules/adoptedStyleSheets.d.ts +0 -2
- package/cjs/modules/adoptedStyleSheets.js +0 -127
- package/lib/app/messages.d.ts +0 -52
- package/lib/app/messages.gen.d.ts +0 -57
- package/lib/app/messages.gen.js +0 -434
- package/lib/app/messages.js +0 -181
- package/lib/common/messages.gen.d.ts +0 -382
- package/lib/common/messages.gen.js +0 -2
- package/lib/modules/adoptedStyleSheets.d.ts +0 -2
- package/lib/modules/adoptedStyleSheets.js +0 -124
package/LICENSE
CHANGED
package/cjs/app/guards.d.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
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
|
|
5
|
-
export declare function isRootNode(node: Node): node is Document | DocumentFragment;
|
|
4
|
+
export declare function isRootNode(node: Node): boolean;
|
|
6
5
|
declare type TagTypeMap = {
|
|
7
6
|
HTML: HTMLHtmlElement;
|
|
8
7
|
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.
|
|
3
|
+
exports.hasTag = exports.isRootNode = 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,12 +13,9 @@ 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;
|
|
20
16
|
function isRootNode(node) {
|
|
21
|
-
return node.nodeType === Node.DOCUMENT_NODE ||
|
|
17
|
+
return node.nodeType === Node.DOCUMENT_NODE ||
|
|
18
|
+
node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
|
|
22
19
|
}
|
|
23
20
|
exports.isRootNode = isRootNode;
|
|
24
21
|
function hasTag(el, tagName) {
|
package/cjs/app/index.d.ts
CHANGED
|
@@ -1,20 +1,17 @@
|
|
|
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
|
|
11
|
-
import type { Options as SessOptions } from './session.js';
|
|
12
|
-
import type { Options as WebworkerOptions } from '../common/interaction.js';
|
|
1
|
+
import type Message from "../common/messages.js";
|
|
2
|
+
import Nodes from "./nodes.js";
|
|
3
|
+
import Sanitizer from "./sanitizer.js";
|
|
4
|
+
import Ticker from "./ticker.js";
|
|
5
|
+
import Logger from "./logger.js";
|
|
6
|
+
import Session from "./session.js";
|
|
7
|
+
import type { Options as ObserverOptions } from "./observer/top_observer.js";
|
|
8
|
+
import type { Options as SanitizerOptions } from "./sanitizer.js";
|
|
9
|
+
import type { Options as LoggerOptions } from "./logger.js";
|
|
10
|
+
import type { Options as WebworkerOptions } from "../common/webworker.js";
|
|
13
11
|
export interface StartOptions {
|
|
14
12
|
userID?: string;
|
|
15
13
|
metadata?: Record<string, string>;
|
|
16
14
|
forceNew?: boolean;
|
|
17
|
-
sessionHash?: string;
|
|
18
15
|
}
|
|
19
16
|
interface OnStartInfo {
|
|
20
17
|
sessionID: string;
|
|
@@ -37,9 +34,9 @@ declare type CommitCallback = (messages: Array<Message>) => void;
|
|
|
37
34
|
declare type AppOptions = {
|
|
38
35
|
revID: string;
|
|
39
36
|
node_id: string;
|
|
40
|
-
session_reset_key: string;
|
|
41
37
|
session_token_key: string;
|
|
42
38
|
session_pageno_key: string;
|
|
39
|
+
session_reset_key: string;
|
|
43
40
|
local_uuid_key: string;
|
|
44
41
|
ingestPoint: string;
|
|
45
42
|
resourceBaseHref: string | null;
|
|
@@ -47,10 +44,10 @@ declare type AppOptions = {
|
|
|
47
44
|
__is_snippet: boolean;
|
|
48
45
|
__debug_report_edp: string | null;
|
|
49
46
|
__debug__?: LoggerOptions;
|
|
50
|
-
localStorage: Storage
|
|
51
|
-
sessionStorage: Storage
|
|
47
|
+
localStorage: Storage;
|
|
48
|
+
sessionStorage: Storage;
|
|
52
49
|
onStart?: StartCallback;
|
|
53
|
-
} & WebworkerOptions
|
|
50
|
+
} & WebworkerOptions;
|
|
54
51
|
export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
|
|
55
52
|
export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
|
|
56
53
|
export default class App {
|
|
@@ -64,41 +61,39 @@ export default class App {
|
|
|
64
61
|
readonly localStorage: Storage;
|
|
65
62
|
readonly sessionStorage: Storage;
|
|
66
63
|
private readonly messages;
|
|
67
|
-
readonly observer
|
|
64
|
+
private readonly observer;
|
|
68
65
|
private readonly startCallbacks;
|
|
69
66
|
private readonly stopCallbacks;
|
|
70
67
|
private readonly commitCallbacks;
|
|
71
68
|
private readonly options;
|
|
72
69
|
private readonly revID;
|
|
73
70
|
private activityState;
|
|
74
|
-
private
|
|
71
|
+
private version;
|
|
75
72
|
private readonly worker?;
|
|
76
|
-
constructor(projectKey: string, sessionToken: string | undefined, options: Partial<Options>);
|
|
73
|
+
constructor(projectKey: string, sessionToken: string | null | undefined, options: Partial<Options>);
|
|
77
74
|
private _debug;
|
|
78
75
|
send(message: Message, urgent?: boolean): void;
|
|
79
76
|
private commit;
|
|
80
77
|
safe<T extends (...args: any[]) => void>(fn: T): T;
|
|
81
78
|
attachCommitCallback(cb: CommitCallback): void;
|
|
82
|
-
attachStartCallback(cb: StartCallback
|
|
83
|
-
attachStopCallback(cb:
|
|
79
|
+
attachStartCallback(cb: StartCallback): void;
|
|
80
|
+
attachStopCallback(cb: Function): void;
|
|
84
81
|
attachEventListener(target: EventTarget, type: string, listener: EventListener, useSafe?: boolean, useCapture?: boolean): void;
|
|
85
82
|
checkRequiredVersion(version: string): boolean;
|
|
86
|
-
private
|
|
83
|
+
private getStartInfo;
|
|
87
84
|
getSessionInfo(): {
|
|
88
85
|
userUUID: string | null;
|
|
89
86
|
projectKey: string;
|
|
90
87
|
revID: string;
|
|
88
|
+
timestamp: number;
|
|
91
89
|
trackerVersion: string;
|
|
92
90
|
isSnippet: boolean;
|
|
93
|
-
sessionID: string |
|
|
91
|
+
sessionID: string | null;
|
|
94
92
|
metadata: Record<string, string>;
|
|
95
93
|
userID: string | null;
|
|
96
|
-
timestamp: number;
|
|
97
|
-
projectID?: string | undefined;
|
|
98
94
|
};
|
|
99
95
|
getSessionToken(): string | undefined;
|
|
100
96
|
getSessionID(): string | undefined;
|
|
101
|
-
getSessionURL(): string | undefined;
|
|
102
97
|
getHost(): string;
|
|
103
98
|
getProjectKey(): string;
|
|
104
99
|
getBaseHref(): string;
|
|
@@ -108,7 +103,7 @@ export default class App {
|
|
|
108
103
|
resetNextPageSession(flag: boolean): void;
|
|
109
104
|
private _start;
|
|
110
105
|
start(options?: StartOptions): Promise<StartPromiseReturn>;
|
|
111
|
-
stop(
|
|
106
|
+
stop(calledFromAPI?: boolean, restarting?: boolean): void;
|
|
112
107
|
restart(): void;
|
|
113
108
|
}
|
|
114
109
|
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_js_1 = require("../common/messages.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;
|
|
@@ -32,7 +32,7 @@ class App {
|
|
|
32
32
|
this.stopCallbacks = [];
|
|
33
33
|
this.commitCallbacks = [];
|
|
34
34
|
this.activityState = ActivityState.NotActive;
|
|
35
|
-
this.version = '3.6.
|
|
35
|
+
this.version = '3.6.3'; // 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: window
|
|
50
|
-
sessionStorage: window
|
|
49
|
+
localStorage: window.localStorage,
|
|
50
|
+
sessionStorage: window.sessionStorage,
|
|
51
51
|
}, options);
|
|
52
52
|
this.revID = this.options.revID;
|
|
53
53
|
this.sanitizer = new sanitizer_js_1.default(this, options);
|
|
@@ -57,33 +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.
|
|
61
|
-
this.sessionStorage = this.options.sessionStorage || window.sessionStorage;
|
|
62
|
-
this.session = new session_js_1.default(this, this.options);
|
|
60
|
+
this.session = new session_js_1.default();
|
|
63
61
|
this.session.attachUpdateCallback(({ userID, metadata }) => {
|
|
64
|
-
if (userID != null) {
|
|
65
|
-
|
|
66
|
-
this.send((0, messages_gen_js_1.UserID)(userID));
|
|
62
|
+
if (userID != null) { // TODO: nullable userID
|
|
63
|
+
this.send(new messages_js_1.UserID(userID));
|
|
67
64
|
}
|
|
68
65
|
if (metadata != null) {
|
|
69
|
-
Object.entries(metadata).forEach(([key, value]) => this.send(
|
|
66
|
+
Object.entries(metadata).forEach(([key, value]) => this.send(new messages_js_1.Metadata(key, value)));
|
|
70
67
|
}
|
|
71
68
|
});
|
|
72
|
-
|
|
69
|
+
this.localStorage = this.options.localStorage;
|
|
70
|
+
this.sessionStorage = this.options.sessionStorage;
|
|
73
71
|
if (sessionToken != null) {
|
|
74
|
-
this.
|
|
72
|
+
this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
|
|
75
73
|
}
|
|
76
74
|
try {
|
|
77
|
-
this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";class t{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 i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(let 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),!(r>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>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 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,i){this.data.set(t,i)}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 s=i.encode(t),e=s.byteLength;return!(!this.uint(e)||this.offset+e>this.size)&&(this.data.set(s,this.offset),this.offset+=e,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(t){switch(t[0]){case 81:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.int(t[4])&&this.string(t[5]);case 82:return this.uint(t[1])&&this.uint(t[2]);case 0:return this.uint(t[1]);case 4:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 5:return this.uint(t[1])&&this.uint(t[2]);case 6:return this.int(t[1])&&this.int(t[2]);case 7:return!0;case 8:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.string(t[4])&&this.boolean(t[5]);case 9:case 10:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 11:return this.uint(t[1]);case 12:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 13:case 14:return this.uint(t[1])&&this.string(t[2]);case 16:return this.uint(t[1])&&this.int(t[2])&&this.int(t[3]);case 17:return this.uint(t[1])&&this.string(t[2]);case 18:return this.uint(t[1])&&this.string(t[2])&&this.int(t[3]);case 19:return this.uint(t[1])&&this.boolean(t[2]);case 20:return this.uint(t[1])&&this.uint(t[2]);case 22:return this.string(t[1])&&this.string(t[2]);case 23:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7])&&this.uint(t[8])&&this.uint(t[9]);case 24:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3]);case 25:return this.string(t[1])&&this.string(t[2])&&this.string(t[3]);case 27:return this.string(t[1])&&this.string(t[2]);case 28:case 29:return this.string(t[1]);case 30:return this.string(t[1])&&this.string(t[2]);case 37:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3]);case 38:return this.uint(t[1])&&this.uint(t[2]);case 39:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.uint(t[7]);case 40:return this.string(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 41:return this.string(t[1])&&this.string(t[2]);case 42:return this.string(t[1]);case 44:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 45:case 46:return this.string(t[1])&&this.string(t[2]);case 47:return this.string(t[1])&&this.string(t[2])&&this.uint(t[3]);case 48:return this.string(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 49:return this.int(t[1])&&this.int(t[2])&&this.uint(t[3])&&this.uint(t[4]);case 53:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.uint(t[5])&&this.uint(t[6])&&this.string(t[7])&&this.string(t[8]);case 54:return this.uint(t[1])&&this.string(t[2]);case 55:return this.boolean(t[1]);case 59:return this.uint(t[1])&&this.uint(t[2])&&this.uint(t[3])&&this.uint(t[4])&&this.string(t[5])&&this.string(t[6])&&this.string(t[7]);case 60:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3])&&this.string(t[4]);case 61:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 63:case 64:return this.string(t[1])&&this.string(t[2]);case 67:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 69:return this.uint(t[1])&&this.uint(t[2])&&this.string(t[3])&&this.string(t[4]);case 70:return this.uint(t[1])&&this.uint(t[2]);case 71:return this.uint(t[1])&&this.string(t[2])&&this.string(t[3]);case 73:return this.uint(t[1])&&this.string(t[2])&&this.uint(t[3])&&this.string(t[4]);case 75:case 76:case 77:return this.uint(t[1])&&this.uint(t[2])}}}class e{constructor(t,i,e,n){this.pageNo=t,this.timestamp=i,this.url=e,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,i){for(let i=0;i<3;i++)this.sizeBuffer[i]=t>>8*i;this.encoder.set(this.sizeBuffer,i)}prepare(){if(!this.encoder.isEmpty())return;const t=[81,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(t),this.writeFields(t),this.isEmpty=!0}writeWithSize(t){const i=this.encoder;if(!this.writeType(t)||!i.skip(3))return!1;const s=i.getCurrentOffset(),e=this.writeFields(t);if(e){const e=i.getCurrentOffset()-s;if(e>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(e,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&0===t[0],this.nextIndex++}return e}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){if(0===t[0]&&(this.timestamp=t[1]),4===t[0]&&(this.url=t[1]),!this.writeWithSize(t))for(this.finaliseBatch();!this.writeWithSize(t);){if(this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message.",t,this),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 n;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(n||(n={}));let r=null,h=null;function u(){h&&h.finaliseBatch()}function a(){n.Stopping,null!==c&&(clearInterval(c),c=null),h&&(h.clean(),h=null),n.NotActive}n.NotActive;let o,c=null;self.onmessage=({data:i})=>{if(null!=i){if("stop"===i)return u(),void a();if(Array.isArray(i)){if(!h)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const t=h;i.forEach(i=>{55===i[0]&&(i[1]?o=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(o)),t.writeMessage(i)})}else{if("start"===i.type)return n.Starting,r=new t(i.ingestPoint,()=>{self.postMessage("restart")},()=>{r&&(r.clean(),r=null),a(),self.postMessage("failed")},i.connAttemptCount,i.connAttemptGap),h=new e(i.pageNo,i.timestamp,i.url,t=>r&&r.push(t)),null===c&&(c=setInterval(u,1e4)),n.Active;if("auth"===i.type){if(!r)throw new Error("WebWorker: sender not initialised. Received auth.");if(!h)throw new Error("WebWorker: writer not initialised. Received auth.");return r.authorise(i.token),void(i.beaconSizeLimit&&h.setBeaconSizeLimit(i.beaconSizeLimit))}}}else u()};'], { type: 'text/javascript' })));
|
|
78
|
-
|
|
79
|
-
|
|
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
|
+
`], { type: 'text/javascript' })));
|
|
77
|
+
this.worker.onerror = e => {
|
|
78
|
+
this._debug("webworker_error", e);
|
|
80
79
|
};
|
|
81
80
|
this.worker.onmessage = ({ data }) => {
|
|
82
|
-
if (data ===
|
|
81
|
+
if (data === "failed") {
|
|
83
82
|
this.stop();
|
|
84
|
-
this._debug(
|
|
83
|
+
this._debug("worker_failed", {}); // add context (from worker)
|
|
85
84
|
}
|
|
86
|
-
else if (data ===
|
|
85
|
+
else if (data === "restart") {
|
|
87
86
|
this.stop();
|
|
88
87
|
this.start({ forceNew: true });
|
|
89
88
|
}
|
|
@@ -100,7 +99,7 @@ class App {
|
|
|
100
99
|
this.attachEventListener(document, 'visibilitychange', alertWorker, false);
|
|
101
100
|
}
|
|
102
101
|
catch (e) {
|
|
103
|
-
this._debug(
|
|
102
|
+
this._debug("worker_start", e);
|
|
104
103
|
}
|
|
105
104
|
}
|
|
106
105
|
_debug(context, e) {
|
|
@@ -110,11 +109,11 @@ class App {
|
|
|
110
109
|
headers: { 'Content-Type': 'application/json' },
|
|
111
110
|
body: JSON.stringify({
|
|
112
111
|
context,
|
|
113
|
-
error: `${e}
|
|
114
|
-
})
|
|
112
|
+
error: `${e}`
|
|
113
|
+
})
|
|
115
114
|
});
|
|
116
115
|
}
|
|
117
|
-
this.debug.error(
|
|
116
|
+
this.debug.error("OpenReplay error: ", context, e);
|
|
118
117
|
}
|
|
119
118
|
send(message, urgent = false) {
|
|
120
119
|
if (this.activityState === ActivityState.NotActive) {
|
|
@@ -131,9 +130,9 @@ class App {
|
|
|
131
130
|
}
|
|
132
131
|
commit() {
|
|
133
132
|
if (this.worker && this.messages.length) {
|
|
134
|
-
this.messages.unshift(
|
|
133
|
+
this.messages.unshift(new messages_js_1.Timestamp((0, utils_js_1.timestamp)()));
|
|
135
134
|
this.worker.postMessage(this.messages);
|
|
136
|
-
this.commitCallbacks.forEach(
|
|
135
|
+
this.commitCallbacks.forEach(cb => cb(this.messages));
|
|
137
136
|
this.messages.length = 0;
|
|
138
137
|
}
|
|
139
138
|
}
|
|
@@ -144,8 +143,8 @@ class App {
|
|
|
144
143
|
fn.apply(this, args);
|
|
145
144
|
}
|
|
146
145
|
catch (e) {
|
|
147
|
-
app._debug(
|
|
148
|
-
// time:
|
|
146
|
+
app._debug("safe_fn_call", e);
|
|
147
|
+
// time: timestamp(),
|
|
149
148
|
// name: e.name,
|
|
150
149
|
// message: e.message,
|
|
151
150
|
// stack: e.stack
|
|
@@ -153,72 +152,57 @@ class App {
|
|
|
153
152
|
}; // TODO: correct typing
|
|
154
153
|
}
|
|
155
154
|
attachCommitCallback(cb) {
|
|
156
|
-
// TODO!: what if start callback added when activityState === Active ?
|
|
157
|
-
// For example - attachEventListener() called during dynamic <iframe> appearance
|
|
158
155
|
this.commitCallbacks.push(cb);
|
|
159
156
|
}
|
|
160
|
-
attachStartCallback(cb
|
|
161
|
-
if (useSafe) {
|
|
162
|
-
cb = this.safe(cb);
|
|
163
|
-
}
|
|
157
|
+
attachStartCallback(cb) {
|
|
164
158
|
this.startCallbacks.push(cb);
|
|
165
159
|
}
|
|
166
|
-
attachStopCallback(cb
|
|
167
|
-
if (useSafe) {
|
|
168
|
-
cb = this.safe(cb);
|
|
169
|
-
}
|
|
160
|
+
attachStopCallback(cb) {
|
|
170
161
|
this.stopCallbacks.push(cb);
|
|
171
162
|
}
|
|
172
163
|
attachEventListener(target, type, listener, useSafe = true, useCapture = true) {
|
|
173
164
|
if (useSafe) {
|
|
174
165
|
listener = this.safe(listener);
|
|
175
166
|
}
|
|
176
|
-
this.attachStartCallback(() => target.addEventListener(type, listener, useCapture)
|
|
177
|
-
this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture)
|
|
167
|
+
this.attachStartCallback(() => target.addEventListener(type, listener, useCapture));
|
|
168
|
+
this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture));
|
|
178
169
|
}
|
|
179
170
|
// TODO: full correct semantic
|
|
180
171
|
checkRequiredVersion(version) {
|
|
181
172
|
const reqVer = version.split(/[.-]/);
|
|
182
173
|
const ver = this.version.split(/[.-]/);
|
|
183
174
|
for (let i = 0; i < 3; i++) {
|
|
184
|
-
if (isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
|
|
185
|
-
return false;
|
|
186
|
-
}
|
|
187
175
|
if (Number(ver[i]) > Number(reqVer[i])) {
|
|
188
176
|
return true;
|
|
189
177
|
}
|
|
190
|
-
if (Number(ver[i]) < Number(reqVer[i])) {
|
|
178
|
+
if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
|
|
191
179
|
return false;
|
|
192
180
|
}
|
|
193
181
|
}
|
|
194
182
|
return true;
|
|
195
183
|
}
|
|
196
|
-
|
|
184
|
+
getStartInfo() {
|
|
197
185
|
return {
|
|
198
186
|
userUUID: this.localStorage.getItem(this.options.local_uuid_key),
|
|
199
187
|
projectKey: this.projectKey,
|
|
200
188
|
revID: this.revID,
|
|
189
|
+
timestamp: (0, utils_js_1.timestamp)(),
|
|
201
190
|
trackerVersion: this.version,
|
|
202
191
|
isSnippet: this.options.__is_snippet,
|
|
203
192
|
};
|
|
204
193
|
}
|
|
205
194
|
getSessionInfo() {
|
|
206
|
-
return Object.assign(Object.assign({}, this.session.getInfo()), this.
|
|
195
|
+
return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
|
|
207
196
|
}
|
|
208
197
|
getSessionToken() {
|
|
209
|
-
|
|
198
|
+
const token = this.sessionStorage.getItem(this.options.session_token_key);
|
|
199
|
+
if (token !== null) {
|
|
200
|
+
return token;
|
|
201
|
+
}
|
|
210
202
|
}
|
|
211
203
|
getSessionID() {
|
|
212
204
|
return this.session.getInfo().sessionID || undefined;
|
|
213
205
|
}
|
|
214
|
-
getSessionURL() {
|
|
215
|
-
const { projectID, sessionID } = this.session.getInfo();
|
|
216
|
-
if (!projectID || !sessionID) {
|
|
217
|
-
this.debug.error('OpenReplay error: Unable to build session URL');
|
|
218
|
-
return undefined;
|
|
219
|
-
}
|
|
220
|
-
return this.options.ingestPoint.replace(/\/ingest$/, `${projectID}/session/${sessionID}`);
|
|
221
|
-
}
|
|
222
206
|
getHost() {
|
|
223
207
|
return new URL(this.options.ingestPoint).hostname;
|
|
224
208
|
}
|
|
@@ -231,19 +215,18 @@ class App {
|
|
|
231
215
|
return this.options.resourceBaseHref;
|
|
232
216
|
}
|
|
233
217
|
else if (typeof this.options.resourceBaseHref === 'object') {
|
|
234
|
-
//
|
|
218
|
+
//switch between types
|
|
235
219
|
}
|
|
236
220
|
if (document.baseURI) {
|
|
237
221
|
return document.baseURI;
|
|
238
222
|
}
|
|
239
223
|
// IE only
|
|
240
|
-
return ((
|
|
241
|
-
location.origin + location.pathname);
|
|
224
|
+
return ((_b = (_a = document.head) === null || _a === void 0 ? void 0 : _a.getElementsByTagName("base")[0]) === null || _b === void 0 ? void 0 : _b.getAttribute("href")) || location.origin + location.pathname;
|
|
242
225
|
}
|
|
243
226
|
resolveResourceURL(resourceURL) {
|
|
244
227
|
const base = new URL(this.getBaseHref());
|
|
245
|
-
base.pathname +=
|
|
246
|
-
base.pathname.replace(/\/+/g,
|
|
228
|
+
base.pathname += "/" + new URL(resourceURL).pathname;
|
|
229
|
+
base.pathname.replace(/\/+/g, "/");
|
|
247
230
|
return base.toString();
|
|
248
231
|
}
|
|
249
232
|
isServiceURL(url) {
|
|
@@ -262,28 +245,30 @@ class App {
|
|
|
262
245
|
}
|
|
263
246
|
_start(startOpts) {
|
|
264
247
|
if (!this.worker) {
|
|
265
|
-
return Promise.resolve(UnsuccessfulStart(
|
|
248
|
+
return Promise.resolve(UnsuccessfulStart("No worker found: perhaps, CSP is not set."));
|
|
266
249
|
}
|
|
267
250
|
if (this.activityState !== ActivityState.NotActive) {
|
|
268
|
-
return Promise.resolve(UnsuccessfulStart(
|
|
251
|
+
return Promise.resolve(UnsuccessfulStart("OpenReplay: trying to call `start()` on the instance that has been started already."));
|
|
269
252
|
}
|
|
270
253
|
this.activityState = ActivityState.Starting;
|
|
271
|
-
|
|
272
|
-
|
|
254
|
+
let pageNo = 0;
|
|
255
|
+
const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
|
|
256
|
+
if (pageNoStr != null) {
|
|
257
|
+
pageNo = parseInt(pageNoStr);
|
|
258
|
+
pageNo++;
|
|
273
259
|
}
|
|
274
|
-
|
|
260
|
+
this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
|
|
261
|
+
const startInfo = this.getStartInfo();
|
|
275
262
|
const startWorkerMsg = {
|
|
276
|
-
type:
|
|
277
|
-
pageNo
|
|
263
|
+
type: "start",
|
|
264
|
+
pageNo,
|
|
278
265
|
ingestPoint: this.options.ingestPoint,
|
|
279
|
-
timestamp,
|
|
280
|
-
url: document.URL,
|
|
266
|
+
timestamp: startInfo.timestamp,
|
|
281
267
|
connAttemptCount: this.options.connAttemptCount,
|
|
282
268
|
connAttemptGap: this.options.connAttemptGap,
|
|
283
269
|
};
|
|
284
270
|
this.worker.postMessage(startWorkerMsg);
|
|
285
271
|
this.session.update({
|
|
286
|
-
// TODO: transparent "session" module logic AND explicit internal api for plugins.
|
|
287
272
|
// "updating" with old metadata in order to trigger session's UpdateCallbacks.
|
|
288
273
|
// (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
|
|
289
274
|
metadata: startOpts.metadata || this.session.getInfo().metadata,
|
|
@@ -291,69 +276,63 @@ class App {
|
|
|
291
276
|
});
|
|
292
277
|
const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
|
|
293
278
|
this.sessionStorage.removeItem(this.options.session_reset_key);
|
|
294
|
-
return window
|
|
295
|
-
.fetch(this.options.ingestPoint + '/v1/web/start', {
|
|
279
|
+
return window.fetch(this.options.ingestPoint + '/v1/web/start', {
|
|
296
280
|
method: 'POST',
|
|
297
281
|
headers: {
|
|
298
282
|
'Content-Type': 'application/json',
|
|
299
283
|
},
|
|
300
|
-
body: JSON.stringify(Object.assign(Object.assign({},
|
|
284
|
+
body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory: performance_js_1.deviceMemory,
|
|
301
285
|
jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
|
|
302
286
|
})
|
|
303
|
-
.then(
|
|
287
|
+
.then(r => {
|
|
304
288
|
if (r.status === 200) {
|
|
305
289
|
return r.json();
|
|
306
290
|
}
|
|
307
291
|
else {
|
|
308
|
-
return r
|
|
309
|
-
.text()
|
|
310
|
-
.then((text) => text === CANCELED
|
|
292
|
+
return r.text().then(text => text === CANCELED
|
|
311
293
|
? Promise.reject(CANCELED)
|
|
312
294
|
: Promise.reject(`Server error: ${r.status}. ${text}`));
|
|
313
295
|
}
|
|
314
296
|
})
|
|
315
|
-
.then(
|
|
297
|
+
.then(r => {
|
|
316
298
|
if (!this.worker) {
|
|
317
|
-
return Promise.reject(
|
|
299
|
+
return Promise.reject("no worker found after start request (this might not happen)");
|
|
318
300
|
}
|
|
319
|
-
const { token, userUUID, sessionID,
|
|
320
|
-
} = r;
|
|
301
|
+
const { token, userUUID, sessionID, beaconSizeLimit } = r;
|
|
321
302
|
if (typeof token !== 'string' ||
|
|
322
303
|
typeof userUUID !== 'string' ||
|
|
323
|
-
//typeof startTimestamp !== 'number' ||
|
|
324
|
-
//typeof sessionID !== 'string' ||
|
|
325
304
|
(typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
|
|
326
305
|
return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
|
|
327
306
|
}
|
|
328
|
-
this.
|
|
307
|
+
this.sessionStorage.setItem(this.options.session_token_key, token);
|
|
329
308
|
this.localStorage.setItem(this.options.local_uuid_key, userUUID);
|
|
330
|
-
this.session.update({ sessionID
|
|
309
|
+
this.session.update({ sessionID }); // TODO: no no-explicit 'any'
|
|
331
310
|
const startWorkerMsg = {
|
|
332
|
-
type:
|
|
311
|
+
type: "auth",
|
|
333
312
|
token,
|
|
334
|
-
beaconSizeLimit
|
|
313
|
+
beaconSizeLimit
|
|
335
314
|
};
|
|
336
315
|
this.worker.postMessage(startWorkerMsg);
|
|
316
|
+
this.activityState = ActivityState.Active;
|
|
337
317
|
const onStartInfo = { sessionToken: token, userUUID, sessionID };
|
|
338
318
|
this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
|
|
339
319
|
this.observer.observe();
|
|
340
320
|
this.ticker.start();
|
|
341
|
-
this.
|
|
342
|
-
this.notify.log('OpenReplay tracking started.');
|
|
321
|
+
this.notify.log("OpenReplay tracking started.");
|
|
343
322
|
// get rid of onStart ?
|
|
344
323
|
if (typeof this.options.onStart === 'function') {
|
|
345
324
|
this.options.onStart(onStartInfo);
|
|
346
325
|
}
|
|
347
326
|
return SuccessfulStart(onStartInfo);
|
|
348
327
|
})
|
|
349
|
-
.catch(
|
|
328
|
+
.catch(reason => {
|
|
329
|
+
this.sessionStorage.removeItem(this.options.session_token_key);
|
|
350
330
|
this.stop();
|
|
351
|
-
this.session.reset();
|
|
352
331
|
if (reason === CANCELED) {
|
|
353
332
|
return UnsuccessfulStart(CANCELED);
|
|
354
333
|
}
|
|
355
|
-
this.notify.log(
|
|
356
|
-
this._debug(
|
|
334
|
+
this.notify.log("OpenReplay was unable to start. ", reason);
|
|
335
|
+
this._debug("session_start", reason);
|
|
357
336
|
return UnsuccessfulStart(START_ERROR);
|
|
358
337
|
});
|
|
359
338
|
}
|
|
@@ -365,15 +344,15 @@ class App {
|
|
|
365
344
|
return new Promise((resolve) => {
|
|
366
345
|
const onVisibilityChange = () => {
|
|
367
346
|
if (!document.hidden) {
|
|
368
|
-
document.removeEventListener(
|
|
347
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
369
348
|
resolve(this._start(options));
|
|
370
349
|
}
|
|
371
350
|
};
|
|
372
|
-
document.addEventListener(
|
|
351
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
373
352
|
});
|
|
374
353
|
}
|
|
375
354
|
}
|
|
376
|
-
stop(
|
|
355
|
+
stop(calledFromAPI = false, restarting = false) {
|
|
377
356
|
if (this.activityState !== ActivityState.NotActive) {
|
|
378
357
|
try {
|
|
379
358
|
this.sanitizer.clear();
|
|
@@ -381,9 +360,12 @@ class App {
|
|
|
381
360
|
this.nodes.clear();
|
|
382
361
|
this.ticker.stop();
|
|
383
362
|
this.stopCallbacks.forEach((cb) => cb());
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
363
|
+
if (calledFromAPI) {
|
|
364
|
+
this.session.reset();
|
|
365
|
+
}
|
|
366
|
+
this.notify.log("OpenReplay tracking stopped.");
|
|
367
|
+
if (this.worker && !restarting) {
|
|
368
|
+
this.worker.postMessage("stop");
|
|
387
369
|
}
|
|
388
370
|
}
|
|
389
371
|
finally {
|
|
@@ -392,7 +374,7 @@ class App {
|
|
|
392
374
|
}
|
|
393
375
|
}
|
|
394
376
|
restart() {
|
|
395
|
-
this.stop(false);
|
|
377
|
+
this.stop(false, true);
|
|
396
378
|
this.start({ forceNew: false });
|
|
397
379
|
}
|
|
398
380
|
}
|
package/cjs/app/logger.js
CHANGED
|
@@ -13,12 +13,9 @@ function IsCustomLevel(l) {
|
|
|
13
13
|
}
|
|
14
14
|
class Logger {
|
|
15
15
|
constructor(options = exports.LogLevel.Silent) {
|
|
16
|
-
this.options =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
: typeof options === 'number'
|
|
20
|
-
? { level: options }
|
|
21
|
-
: options;
|
|
16
|
+
this.options = options === true
|
|
17
|
+
? { level: exports.LogLevel.Verbose }
|
|
18
|
+
: typeof options === "number" ? { level: options } : options;
|
|
22
19
|
}
|
|
23
20
|
log(...args) {
|
|
24
21
|
if (IsCustomLevel(this.options.level)
|
package/cjs/app/nodes.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export default class Nodes {
|
|
|
7
7
|
constructor(node_id: string);
|
|
8
8
|
attachNodeCallback(nodeCallback: NodeCallback): void;
|
|
9
9
|
attachElementListener(type: string, node: Element, elementListener: EventListener): void;
|
|
10
|
-
registerNode(node: Node): [
|
|
10
|
+
registerNode(node: Node): [id: number, isNew: boolean];
|
|
11
11
|
unregisterNode(node: Node): number | undefined;
|
|
12
12
|
cleanTree(): void;
|
|
13
13
|
callNodeCallbacks(node: Node, isStart: boolean): void;
|