@openreplay/tracker 3.6.0-beta.0 → 3.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/app/guards.d.ts +1 -2
- package/cjs/app/guards.js +3 -6
- package/cjs/app/index.d.ts +22 -24
- package/cjs/app/index.js +84 -85
- package/cjs/app/logger.js +3 -6
- 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 -11
- package/cjs/app/observer/top_observer.js +23 -52
- package/cjs/app/sanitizer.d.ts +1 -1
- package/cjs/app/sanitizer.js +5 -5
- package/cjs/app/session.d.ts +2 -18
- package/cjs/app/session.js +6 -55
- 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/webworker.js +2 -0
- package/cjs/index.d.ts +10 -10
- package/cjs/index.js +37 -42
- 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 +20 -25
- 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 +22 -24
- package/lib/app/index.js +92 -93
- package/lib/app/logger.js +3 -6
- 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 -11
- package/lib/app/observer/top_observer.js +27 -56
- package/lib/app/sanitizer.d.ts +1 -1
- package/lib/app/sanitizer.js +7 -7
- package/lib/app/session.d.ts +2 -18
- package/lib/app/session.js +6 -55
- 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 +10 -10
- package/lib/index.js +50 -55
- 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 +20 -25
- 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 -494
- package/cjs/app/messages.js +0 -235
- package/cjs/common/messages.gen.d.ts +0 -382
- package/cjs/common/messages.gen.js +0 -62
- 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 -435
- package/lib/app/messages.js +0 -182
- package/lib/common/messages.gen.d.ts +0 -382
- package/lib/common/messages.gen.js +0 -59
- package/lib/modules/adoptedStyleSheets.d.ts +0 -2
- package/lib/modules/adoptedStyleSheets.js +0 -124
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,15 +1,13 @@
|
|
|
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>;
|
|
@@ -36,9 +34,9 @@ declare type CommitCallback = (messages: Array<Message>) => void;
|
|
|
36
34
|
declare type AppOptions = {
|
|
37
35
|
revID: string;
|
|
38
36
|
node_id: string;
|
|
39
|
-
session_reset_key: string;
|
|
40
37
|
session_token_key: string;
|
|
41
38
|
session_pageno_key: string;
|
|
39
|
+
session_reset_key: string;
|
|
42
40
|
local_uuid_key: string;
|
|
43
41
|
ingestPoint: string;
|
|
44
42
|
resourceBaseHref: string | null;
|
|
@@ -46,10 +44,10 @@ declare type AppOptions = {
|
|
|
46
44
|
__is_snippet: boolean;
|
|
47
45
|
__debug_report_edp: string | null;
|
|
48
46
|
__debug__?: LoggerOptions;
|
|
49
|
-
localStorage: Storage
|
|
50
|
-
sessionStorage: Storage
|
|
47
|
+
localStorage: Storage;
|
|
48
|
+
sessionStorage: Storage;
|
|
51
49
|
onStart?: StartCallback;
|
|
52
|
-
} & WebworkerOptions
|
|
50
|
+
} & WebworkerOptions;
|
|
53
51
|
export declare type Options = AppOptions & ObserverOptions & SanitizerOptions;
|
|
54
52
|
export declare const DEFAULT_INGEST_POINT = "https://api.openreplay.com/ingest";
|
|
55
53
|
export default class App {
|
|
@@ -63,36 +61,36 @@ export default class App {
|
|
|
63
61
|
readonly localStorage: Storage;
|
|
64
62
|
readonly sessionStorage: Storage;
|
|
65
63
|
private readonly messages;
|
|
66
|
-
readonly observer
|
|
64
|
+
private readonly observer;
|
|
67
65
|
private readonly startCallbacks;
|
|
68
66
|
private readonly stopCallbacks;
|
|
69
67
|
private readonly commitCallbacks;
|
|
70
68
|
private readonly options;
|
|
71
69
|
private readonly revID;
|
|
72
70
|
private activityState;
|
|
73
|
-
private
|
|
71
|
+
private version;
|
|
74
72
|
private readonly worker?;
|
|
75
|
-
constructor(projectKey: string,
|
|
73
|
+
constructor(projectKey: string, sessionToken: string | null | undefined, options: Partial<Options>);
|
|
76
74
|
private _debug;
|
|
77
75
|
send(message: Message, urgent?: boolean): void;
|
|
78
76
|
private commit;
|
|
79
77
|
safe<T extends (...args: any[]) => void>(fn: T): T;
|
|
80
78
|
attachCommitCallback(cb: CommitCallback): void;
|
|
81
79
|
attachStartCallback(cb: StartCallback): void;
|
|
82
|
-
attachStopCallback(cb:
|
|
80
|
+
attachStopCallback(cb: Function): void;
|
|
83
81
|
attachEventListener(target: EventTarget, type: string, listener: EventListener, useSafe?: boolean, useCapture?: boolean): void;
|
|
84
82
|
checkRequiredVersion(version: string): boolean;
|
|
85
|
-
private
|
|
83
|
+
private getStartInfo;
|
|
86
84
|
getSessionInfo(): {
|
|
87
85
|
userUUID: string | null;
|
|
88
86
|
projectKey: string;
|
|
89
87
|
revID: string;
|
|
88
|
+
timestamp: number;
|
|
90
89
|
trackerVersion: string;
|
|
91
90
|
isSnippet: boolean;
|
|
92
|
-
sessionID: string |
|
|
91
|
+
sessionID: string | null;
|
|
93
92
|
metadata: Record<string, string>;
|
|
94
93
|
userID: string | null;
|
|
95
|
-
timestamp: number;
|
|
96
94
|
};
|
|
97
95
|
getSessionToken(): string | undefined;
|
|
98
96
|
getSessionID(): string | undefined;
|
|
@@ -105,7 +103,7 @@ export default class App {
|
|
|
105
103
|
resetNextPageSession(flag: boolean): void;
|
|
106
104
|
private _start;
|
|
107
105
|
start(options?: StartOptions): Promise<StartPromiseReturn>;
|
|
108
|
-
stop(
|
|
106
|
+
stop(calledFromAPI?: boolean, restarting?: boolean): void;
|
|
109
107
|
restart(): void;
|
|
110
108
|
}
|
|
111
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;
|
|
@@ -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, sessionToken, 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.
|
|
35
|
+
this.version = '3.6.2'; // 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: 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,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.
|
|
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
|
-
|
|
73
|
-
|
|
69
|
+
this.localStorage = this.options.localStorage;
|
|
70
|
+
this.sessionStorage = this.options.sessionStorage;
|
|
71
|
+
if (sessionToken != null) {
|
|
72
|
+
this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
|
|
74
73
|
}
|
|
75
74
|
try {
|
|
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
|
-
|
|
78
|
-
|
|
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);
|
|
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(new messages_js_1.Timestamp((0, utils_js_1.timestamp)()));
|
|
134
134
|
this.worker.postMessage(this.messages);
|
|
135
|
-
this.commitCallbacks.forEach(
|
|
135
|
+
this.commitCallbacks.forEach(cb => cb(this.messages));
|
|
136
136
|
this.messages.length = 0;
|
|
137
137
|
}
|
|
138
138
|
}
|
|
@@ -143,8 +143,8 @@ class App {
|
|
|
143
143
|
fn.apply(this, args);
|
|
144
144
|
}
|
|
145
145
|
catch (e) {
|
|
146
|
-
app._debug(
|
|
147
|
-
// time:
|
|
146
|
+
app._debug("safe_fn_call", e);
|
|
147
|
+
// time: timestamp(),
|
|
148
148
|
// name: e.name,
|
|
149
149
|
// message: e.message,
|
|
150
150
|
// stack: e.stack
|
|
@@ -172,32 +172,30 @@ class App {
|
|
|
172
172
|
const reqVer = version.split(/[.-]/);
|
|
173
173
|
const ver = this.version.split(/[.-]/);
|
|
174
174
|
for (let i = 0; i < 3; i++) {
|
|
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])) {
|
|
175
|
+
if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
|
|
182
176
|
return false;
|
|
183
177
|
}
|
|
184
178
|
}
|
|
185
179
|
return true;
|
|
186
180
|
}
|
|
187
|
-
|
|
181
|
+
getStartInfo() {
|
|
188
182
|
return {
|
|
189
183
|
userUUID: this.localStorage.getItem(this.options.local_uuid_key),
|
|
190
184
|
projectKey: this.projectKey,
|
|
191
185
|
revID: this.revID,
|
|
186
|
+
timestamp: (0, utils_js_1.timestamp)(),
|
|
192
187
|
trackerVersion: this.version,
|
|
193
188
|
isSnippet: this.options.__is_snippet,
|
|
194
189
|
};
|
|
195
190
|
}
|
|
196
191
|
getSessionInfo() {
|
|
197
|
-
return Object.assign(Object.assign({}, this.session.getInfo()), this.
|
|
192
|
+
return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
|
|
198
193
|
}
|
|
199
194
|
getSessionToken() {
|
|
200
|
-
|
|
195
|
+
const token = this.sessionStorage.getItem(this.options.session_token_key);
|
|
196
|
+
if (token !== null) {
|
|
197
|
+
return token;
|
|
198
|
+
}
|
|
201
199
|
}
|
|
202
200
|
getSessionID() {
|
|
203
201
|
return this.session.getInfo().sessionID || undefined;
|
|
@@ -214,19 +212,18 @@ class App {
|
|
|
214
212
|
return this.options.resourceBaseHref;
|
|
215
213
|
}
|
|
216
214
|
else if (typeof this.options.resourceBaseHref === 'object') {
|
|
217
|
-
//
|
|
215
|
+
//switch between types
|
|
218
216
|
}
|
|
219
217
|
if (document.baseURI) {
|
|
220
218
|
return document.baseURI;
|
|
221
219
|
}
|
|
222
220
|
// IE only
|
|
223
|
-
return ((
|
|
224
|
-
location.origin + location.pathname);
|
|
221
|
+
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;
|
|
225
222
|
}
|
|
226
223
|
resolveResourceURL(resourceURL) {
|
|
227
224
|
const base = new URL(this.getBaseHref());
|
|
228
|
-
base.pathname +=
|
|
229
|
-
base.pathname.replace(/\/+/g,
|
|
225
|
+
base.pathname += "/" + new URL(resourceURL).pathname;
|
|
226
|
+
base.pathname.replace(/\/+/g, "/");
|
|
230
227
|
return base.toString();
|
|
231
228
|
}
|
|
232
229
|
isServiceURL(url) {
|
|
@@ -245,73 +242,72 @@ class App {
|
|
|
245
242
|
}
|
|
246
243
|
_start(startOpts) {
|
|
247
244
|
if (!this.worker) {
|
|
248
|
-
return Promise.resolve(UnsuccessfulStart(
|
|
245
|
+
return Promise.resolve(UnsuccessfulStart("No worker found: perhaps, CSP is not set."));
|
|
249
246
|
}
|
|
250
247
|
if (this.activityState !== ActivityState.NotActive) {
|
|
251
|
-
return Promise.resolve(UnsuccessfulStart(
|
|
248
|
+
return Promise.resolve(UnsuccessfulStart("OpenReplay: trying to call `start()` on the instance that has been started already."));
|
|
252
249
|
}
|
|
253
250
|
this.activityState = ActivityState.Starting;
|
|
254
|
-
|
|
251
|
+
let pageNo = 0;
|
|
252
|
+
const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
|
|
253
|
+
if (pageNoStr != null) {
|
|
254
|
+
pageNo = parseInt(pageNoStr);
|
|
255
|
+
pageNo++;
|
|
256
|
+
}
|
|
257
|
+
this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
|
|
258
|
+
const startInfo = this.getStartInfo();
|
|
255
259
|
const startWorkerMsg = {
|
|
256
|
-
type:
|
|
257
|
-
pageNo
|
|
260
|
+
type: "start",
|
|
261
|
+
pageNo,
|
|
258
262
|
ingestPoint: this.options.ingestPoint,
|
|
259
|
-
timestamp,
|
|
260
|
-
url: document.URL,
|
|
263
|
+
timestamp: startInfo.timestamp,
|
|
261
264
|
connAttemptCount: this.options.connAttemptCount,
|
|
262
265
|
connAttemptGap: this.options.connAttemptGap,
|
|
263
266
|
};
|
|
264
267
|
this.worker.postMessage(startWorkerMsg);
|
|
265
268
|
this.session.update({
|
|
266
|
-
//
|
|
267
|
-
// "updating" with old metadata in order to trigger session's UpdateCallbacks.
|
|
269
|
+
// "updating" with old metadata in order to trigger session's UpdateCallbacks.
|
|
268
270
|
// (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
|
|
269
271
|
metadata: startOpts.metadata || this.session.getInfo().metadata,
|
|
270
272
|
userID: startOpts.userID,
|
|
271
273
|
});
|
|
272
274
|
const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
|
|
273
275
|
this.sessionStorage.removeItem(this.options.session_reset_key);
|
|
274
|
-
return window
|
|
275
|
-
.fetch(this.options.ingestPoint + '/v1/web/start', {
|
|
276
|
+
return window.fetch(this.options.ingestPoint + '/v1/web/start', {
|
|
276
277
|
method: 'POST',
|
|
277
278
|
headers: {
|
|
278
279
|
'Content-Type': 'application/json',
|
|
279
280
|
},
|
|
280
|
-
body: JSON.stringify(Object.assign(Object.assign({},
|
|
281
|
+
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,
|
|
281
282
|
jsHeapSizeLimit: performance_js_1.jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
|
|
282
283
|
})
|
|
283
|
-
.then(
|
|
284
|
+
.then(r => {
|
|
284
285
|
if (r.status === 200) {
|
|
285
286
|
return r.json();
|
|
286
287
|
}
|
|
287
288
|
else {
|
|
288
|
-
return r
|
|
289
|
-
.text()
|
|
290
|
-
.then((text) => text === CANCELED
|
|
289
|
+
return r.text().then(text => text === CANCELED
|
|
291
290
|
? Promise.reject(CANCELED)
|
|
292
291
|
: Promise.reject(`Server error: ${r.status}. ${text}`));
|
|
293
292
|
}
|
|
294
293
|
})
|
|
295
|
-
.then(
|
|
294
|
+
.then(r => {
|
|
296
295
|
if (!this.worker) {
|
|
297
|
-
return Promise.reject(
|
|
296
|
+
return Promise.reject("no worker found after start request (this might not happen)");
|
|
298
297
|
}
|
|
299
|
-
const { token, userUUID, sessionID, beaconSizeLimit
|
|
300
|
-
} = r;
|
|
298
|
+
const { token, userUUID, sessionID, beaconSizeLimit } = r;
|
|
301
299
|
if (typeof token !== 'string' ||
|
|
302
300
|
typeof userUUID !== 'string' ||
|
|
303
|
-
//typeof startTimestamp !== 'number' ||
|
|
304
|
-
//typeof sessionID !== 'string' ||
|
|
305
301
|
(typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
|
|
306
302
|
return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
|
|
307
303
|
}
|
|
308
|
-
this.
|
|
304
|
+
this.sessionStorage.setItem(this.options.session_token_key, token);
|
|
309
305
|
this.localStorage.setItem(this.options.local_uuid_key, userUUID);
|
|
310
|
-
this.session.update({ sessionID
|
|
306
|
+
this.session.update({ sessionID }); // TODO: no no-explicit 'any'
|
|
311
307
|
const startWorkerMsg = {
|
|
312
|
-
type:
|
|
308
|
+
type: "auth",
|
|
313
309
|
token,
|
|
314
|
-
beaconSizeLimit
|
|
310
|
+
beaconSizeLimit
|
|
315
311
|
};
|
|
316
312
|
this.worker.postMessage(startWorkerMsg);
|
|
317
313
|
this.activityState = ActivityState.Active;
|
|
@@ -319,21 +315,21 @@ class App {
|
|
|
319
315
|
this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
|
|
320
316
|
this.observer.observe();
|
|
321
317
|
this.ticker.start();
|
|
322
|
-
this.notify.log(
|
|
318
|
+
this.notify.log("OpenReplay tracking started.");
|
|
323
319
|
// get rid of onStart ?
|
|
324
320
|
if (typeof this.options.onStart === 'function') {
|
|
325
321
|
this.options.onStart(onStartInfo);
|
|
326
322
|
}
|
|
327
323
|
return SuccessfulStart(onStartInfo);
|
|
328
324
|
})
|
|
329
|
-
.catch(
|
|
325
|
+
.catch(reason => {
|
|
326
|
+
this.sessionStorage.removeItem(this.options.session_token_key);
|
|
330
327
|
this.stop();
|
|
331
|
-
this.session.reset();
|
|
332
328
|
if (reason === CANCELED) {
|
|
333
329
|
return UnsuccessfulStart(CANCELED);
|
|
334
330
|
}
|
|
335
|
-
this.notify.log(
|
|
336
|
-
this._debug(
|
|
331
|
+
this.notify.log("OpenReplay was unable to start. ", reason);
|
|
332
|
+
this._debug("session_start", reason);
|
|
337
333
|
return UnsuccessfulStart(START_ERROR);
|
|
338
334
|
});
|
|
339
335
|
}
|
|
@@ -345,15 +341,15 @@ class App {
|
|
|
345
341
|
return new Promise((resolve) => {
|
|
346
342
|
const onVisibilityChange = () => {
|
|
347
343
|
if (!document.hidden) {
|
|
348
|
-
document.removeEventListener(
|
|
344
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
349
345
|
resolve(this._start(options));
|
|
350
346
|
}
|
|
351
347
|
};
|
|
352
|
-
document.addEventListener(
|
|
348
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
353
349
|
});
|
|
354
350
|
}
|
|
355
351
|
}
|
|
356
|
-
stop(
|
|
352
|
+
stop(calledFromAPI = false, restarting = false) {
|
|
357
353
|
if (this.activityState !== ActivityState.NotActive) {
|
|
358
354
|
try {
|
|
359
355
|
this.sanitizer.clear();
|
|
@@ -361,9 +357,12 @@ class App {
|
|
|
361
357
|
this.nodes.clear();
|
|
362
358
|
this.ticker.stop();
|
|
363
359
|
this.stopCallbacks.forEach((cb) => cb());
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
360
|
+
if (calledFromAPI) {
|
|
361
|
+
this.session.reset();
|
|
362
|
+
}
|
|
363
|
+
this.notify.log("OpenReplay tracking stopped.");
|
|
364
|
+
if (this.worker && !restarting) {
|
|
365
|
+
this.worker.postMessage("stop");
|
|
367
366
|
}
|
|
368
367
|
}
|
|
369
368
|
finally {
|
|
@@ -372,7 +371,7 @@ class App {
|
|
|
372
371
|
}
|
|
373
372
|
}
|
|
374
373
|
restart() {
|
|
375
|
-
this.stop(false);
|
|
374
|
+
this.stop(false, true);
|
|
376
375
|
this.start({ forceNew: false });
|
|
377
376
|
}
|
|
378
377
|
}
|
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.js
CHANGED
|
@@ -7,11 +7,9 @@ class Nodes {
|
|
|
7
7
|
this.nodeCallbacks = [];
|
|
8
8
|
this.elementListeners = new Map();
|
|
9
9
|
}
|
|
10
|
-
// Attached once per Tracker instance
|
|
11
10
|
attachNodeCallback(nodeCallback) {
|
|
12
11
|
this.nodeCallbacks.push(nodeCallback);
|
|
13
12
|
}
|
|
14
|
-
// TODO: what is the difference with app.attachEventListener. can we use only one of those?
|
|
15
13
|
attachElementListener(type, node, elementListener) {
|
|
16
14
|
const id = this.getID(node);
|
|
17
15
|
if (id === undefined) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const observer_js_1 = require("./observer.js");
|
|
4
|
-
const
|
|
4
|
+
const messages_js_1 = require("../../common/messages.js");
|
|
5
5
|
class IFrameObserver extends observer_js_1.default {
|
|
6
6
|
observe(iframe) {
|
|
7
7
|
const doc = iframe.contentDocument;
|
|
@@ -12,10 +12,10 @@ class IFrameObserver extends observer_js_1.default {
|
|
|
12
12
|
// Have to observe document, because the inner <html> might be changed
|
|
13
13
|
this.observeRoot(doc, (docID) => {
|
|
14
14
|
if (docID === undefined) {
|
|
15
|
-
console.log(
|
|
15
|
+
console.log("OpenReplay: Iframe document not bound");
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
|
-
this.app.send((0,
|
|
18
|
+
this.app.send((0, messages_js_1.CreateIFrameDocument)(hostID, docID));
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
21
|
}
|