@openreplay/tracker 3.6.1 → 3.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +1 -1
- package/LICENSE +1 -1
- package/cjs/app/guards.d.ts +1 -2
- package/cjs/app/guards.js +1 -5
- package/cjs/app/index.d.ts +13 -16
- package/cjs/app/index.js +45 -47
- package/cjs/app/nodes.d.ts +1 -1
- package/cjs/app/nodes.js +0 -2
- package/cjs/app/observer/iframe_observer.js +2 -2
- package/cjs/app/observer/observer.js +13 -13
- package/cjs/app/observer/shadow_root_observer.js +2 -2
- package/cjs/app/observer/top_observer.d.ts +0 -11
- package/cjs/app/observer/top_observer.js +12 -46
- package/cjs/app/session.d.ts +0 -6
- package/cjs/app/session.js +0 -46
- package/cjs/common/messages.d.ts +444 -0
- package/cjs/common/messages.js +743 -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} +3 -3
- package/cjs/common/{messages.gen.js → webworker.js} +0 -1
- package/cjs/index.d.ts +2 -2
- package/cjs/index.js +9 -14
- package/cjs/modules/connection.js +2 -2
- package/cjs/modules/console.js +20 -6
- package/cjs/modules/cssrules.js +12 -16
- package/cjs/modules/exception.d.ts +2 -2
- package/cjs/modules/exception.js +12 -16
- package/cjs/modules/img.js +21 -31
- package/cjs/modules/input.js +6 -6
- package/cjs/modules/longtasks.d.ts +2 -0
- package/cjs/modules/longtasks.js +34 -0
- package/cjs/modules/mouse.js +33 -42
- package/cjs/modules/performance.js +2 -2
- package/cjs/modules/scroll.js +7 -16
- package/cjs/modules/timing.js +4 -4
- package/cjs/modules/viewport.js +4 -4
- package/lib/app/guards.d.ts +1 -2
- package/lib/app/guards.js +0 -3
- package/lib/app/index.d.ts +13 -16
- package/lib/app/index.js +46 -48
- package/lib/app/nodes.d.ts +1 -1
- package/lib/app/nodes.js +0 -2
- package/lib/app/observer/iframe_observer.js +1 -1
- package/lib/app/observer/observer.js +12 -12
- package/lib/app/observer/shadow_root_observer.js +1 -1
- package/lib/app/observer/top_observer.d.ts +0 -11
- package/lib/app/observer/top_observer.js +12 -46
- package/lib/app/session.d.ts +0 -6
- package/lib/app/session.js +0 -46
- package/lib/common/messages.d.ts +444 -0
- package/lib/common/messages.js +739 -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} +3 -3
- package/lib/common/webworker.js +1 -0
- package/lib/index.d.ts +2 -2
- package/lib/index.js +9 -14
- package/lib/modules/connection.js +2 -2
- package/lib/modules/console.js +20 -6
- package/lib/modules/cssrules.js +12 -16
- package/lib/modules/exception.d.ts +2 -2
- package/lib/modules/exception.js +12 -16
- package/lib/modules/img.js +21 -31
- package/lib/modules/input.js +6 -6
- package/lib/modules/longtasks.d.ts +2 -0
- package/lib/modules/longtasks.js +31 -0
- package/lib/modules/mouse.js +34 -43
- package/lib/modules/performance.js +2 -2
- package/lib/modules/scroll.js +8 -17
- package/lib/modules/timing.js +4 -4
- package/lib/modules/viewport.js +4 -4
- package/package.json +4 -3
- 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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.jsHeapSizeLimit = exports.deviceMemory = void 0;
|
|
4
4
|
const utils_js_1 = require("../utils.js");
|
|
5
|
-
const
|
|
5
|
+
const messages_js_1 = require("../common/messages.js");
|
|
6
6
|
const perf = utils_js_1.IN_BROWSER && 'performance' in window && 'memory' in performance // works in Chrome only
|
|
7
7
|
? performance
|
|
8
8
|
: { memory: {} };
|
|
@@ -34,7 +34,7 @@ function default_1(app, opts) {
|
|
|
34
34
|
if (frames === undefined || ticks === undefined) {
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
37
|
-
app.send(
|
|
37
|
+
app.send(new messages_js_1.PerformanceTrack(frames, ticks, perf.memory.totalJSHeapSize || 0, perf.memory.usedJSHeapSize || 0));
|
|
38
38
|
ticks = frames = document.hidden ? -1 : 0;
|
|
39
39
|
};
|
|
40
40
|
app.attachStartCallback(() => {
|
package/cjs/modules/scroll.js
CHANGED
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const messages_js_1 = require("../common/messages.js");
|
|
4
4
|
const guards_js_1 = require("../app/guards.js");
|
|
5
5
|
function default_1(app) {
|
|
6
6
|
let documentScroll = false;
|
|
7
7
|
const nodeScroll = new Map();
|
|
8
|
-
|
|
9
|
-
if (target instanceof Element) {
|
|
10
|
-
nodeScroll.set(target, [target.scrollLeft, target.scrollTop]);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
const sendSetViewportScroll = app.safe(() => app.send((0, messages_gen_js_1.SetViewportScroll)(window.pageXOffset ||
|
|
8
|
+
const sendSetViewportScroll = app.safe(() => app.send(new messages_js_1.SetViewportScroll(window.pageXOffset ||
|
|
14
9
|
(document.documentElement && document.documentElement.scrollLeft) ||
|
|
15
10
|
(document.body && document.body.scrollLeft) ||
|
|
16
11
|
0, window.pageYOffset ||
|
|
@@ -20,7 +15,7 @@ function default_1(app) {
|
|
|
20
15
|
const sendSetNodeScroll = app.safe((s, node) => {
|
|
21
16
|
const id = app.nodes.getID(node);
|
|
22
17
|
if (id !== undefined) {
|
|
23
|
-
app.send(
|
|
18
|
+
app.send(new messages_js_1.SetNodeScroll(id, s[0], s[1]));
|
|
24
19
|
}
|
|
25
20
|
});
|
|
26
21
|
app.attachStartCallback(sendSetViewportScroll);
|
|
@@ -32,20 +27,16 @@ function default_1(app) {
|
|
|
32
27
|
if (isStart && (0, guards_js_1.isElementNode)(node) && node.scrollLeft + node.scrollTop > 0) {
|
|
33
28
|
nodeScroll.set(node, [node.scrollLeft, node.scrollTop]);
|
|
34
29
|
}
|
|
35
|
-
else if ((0, guards_js_1.isRootNode)(node)) {
|
|
36
|
-
// scroll is not-composed event (https://javascript.info/shadow-dom-events)
|
|
37
|
-
app.attachEventListener(node, 'scroll', (e) => {
|
|
38
|
-
setNodeScroll(e.target);
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
30
|
});
|
|
42
|
-
app.attachEventListener(
|
|
31
|
+
app.attachEventListener(window, 'scroll', (e) => {
|
|
43
32
|
const target = e.target;
|
|
44
33
|
if (target === document) {
|
|
45
34
|
documentScroll = true;
|
|
46
35
|
return;
|
|
47
36
|
}
|
|
48
|
-
|
|
37
|
+
if (target instanceof Element) {
|
|
38
|
+
nodeScroll.set(target, [target.scrollLeft, target.scrollTop]);
|
|
39
|
+
}
|
|
49
40
|
});
|
|
50
41
|
app.ticker.attach(() => {
|
|
51
42
|
if (documentScroll) {
|
package/cjs/modules/timing.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const guards_js_1 = require("../app/guards.js");
|
|
4
4
|
const utils_js_1 = require("../utils.js");
|
|
5
|
-
const
|
|
5
|
+
const messages_js_1 = require("../common/messages.js");
|
|
6
6
|
function getPaintBlocks(resources) {
|
|
7
7
|
const paintBlocks = [];
|
|
8
8
|
const elements = document.getElementsByTagName('*');
|
|
@@ -75,7 +75,7 @@ function default_1(app, opts) {
|
|
|
75
75
|
if (resources !== null) {
|
|
76
76
|
resources[entry.name] = entry.startTime + entry.duration;
|
|
77
77
|
}
|
|
78
|
-
app.send(
|
|
78
|
+
app.send(new messages_js_1.ResourceTiming(entry.startTime + performance.timing.navigationStart, entry.duration, entry.responseStart && entry.startTime ? entry.responseStart - entry.startTime : 0, entry.transferSize > entry.encodedBodySize ? entry.transferSize - entry.encodedBodySize : 0, entry.encodedBodySize || 0, entry.decodedBodySize || 0, entry.name, entry.initiatorType));
|
|
79
79
|
}
|
|
80
80
|
const observer = new PerformanceObserver((list) => list.getEntries().forEach(resourceTiming));
|
|
81
81
|
let prevSessionID;
|
|
@@ -113,7 +113,7 @@ function default_1(app, opts) {
|
|
|
113
113
|
if (performance.timing.loadEventEnd || performance.now() > 30000) {
|
|
114
114
|
pageLoadTimingSent = true;
|
|
115
115
|
const { navigationStart, requestStart, responseStart, responseEnd, domContentLoadedEventStart, domContentLoadedEventEnd, loadEventStart, loadEventEnd, } = performance.timing;
|
|
116
|
-
app.send(
|
|
116
|
+
app.send(new messages_js_1.PageLoadTiming(requestStart - navigationStart || 0, responseStart - navigationStart || 0, responseEnd - navigationStart || 0, domContentLoadedEventStart - navigationStart || 0, domContentLoadedEventEnd - navigationStart || 0, loadEventStart - navigationStart || 0, loadEventEnd - navigationStart || 0, firstPaint, firstContentfulPaint));
|
|
117
117
|
}
|
|
118
118
|
}, 30);
|
|
119
119
|
}
|
|
@@ -148,7 +148,7 @@ function default_1(app, opts) {
|
|
|
148
148
|
? Math.max(interactiveWindowStartTime, firstContentfulPaint, performance.timing.domContentLoadedEventEnd - performance.timing.navigationStart ||
|
|
149
149
|
0)
|
|
150
150
|
: 0;
|
|
151
|
-
app.send(
|
|
151
|
+
app.send(new messages_js_1.PageRenderTiming(speedIndex, firstContentfulPaint > visuallyComplete ? firstContentfulPaint : visuallyComplete, timeToInteractive));
|
|
152
152
|
}
|
|
153
153
|
});
|
|
154
154
|
}
|
package/cjs/modules/viewport.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const messages_js_1 = require("../common/messages.js");
|
|
4
4
|
function default_1(app) {
|
|
5
5
|
let url, width, height;
|
|
6
6
|
let navigationStart = performance.timing.navigationStart;
|
|
@@ -8,7 +8,7 @@ function default_1(app) {
|
|
|
8
8
|
const { URL } = document;
|
|
9
9
|
if (URL !== url) {
|
|
10
10
|
url = URL;
|
|
11
|
-
app.send(
|
|
11
|
+
app.send(new messages_js_1.SetPageLocation(url, document.referrer, navigationStart));
|
|
12
12
|
navigationStart = 0;
|
|
13
13
|
}
|
|
14
14
|
});
|
|
@@ -17,12 +17,12 @@ function default_1(app) {
|
|
|
17
17
|
if (innerWidth !== width || innerHeight !== height) {
|
|
18
18
|
width = innerWidth;
|
|
19
19
|
height = innerHeight;
|
|
20
|
-
app.send(
|
|
20
|
+
app.send(new messages_js_1.SetViewportSize(width, height));
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
23
|
const sendSetPageVisibility = document.hidden === undefined
|
|
24
24
|
? Function.prototype
|
|
25
|
-
: app.safe(() => app.send(
|
|
25
|
+
: app.safe(() => app.send(new messages_js_1.SetPageVisibility(document.hidden)));
|
|
26
26
|
app.attachStartCallback(() => {
|
|
27
27
|
url = '';
|
|
28
28
|
width = height = -1;
|
package/lib/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/lib/app/guards.js
CHANGED
|
@@ -7,9 +7,6 @@ export function isElementNode(node) {
|
|
|
7
7
|
export function isTextNode(node) {
|
|
8
8
|
return node.nodeType === Node.TEXT_NODE;
|
|
9
9
|
}
|
|
10
|
-
export function isDocument(node) {
|
|
11
|
-
return node.nodeType === Node.DOCUMENT_NODE;
|
|
12
|
-
}
|
|
13
10
|
export function isRootNode(node) {
|
|
14
11
|
return node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE;
|
|
15
12
|
}
|
package/lib/app/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import type Message from '
|
|
1
|
+
import type Message from '../common/messages.js';
|
|
2
2
|
import Nodes from './nodes.js';
|
|
3
|
-
import Observer from './observer/top_observer.js';
|
|
4
3
|
import Sanitizer from './sanitizer.js';
|
|
5
4
|
import Ticker from './ticker.js';
|
|
6
5
|
import Logger from './logger.js';
|
|
@@ -8,13 +7,11 @@ import Session from './session.js';
|
|
|
8
7
|
import type { Options as ObserverOptions } from './observer/top_observer.js';
|
|
9
8
|
import type { Options as SanitizerOptions } from './sanitizer.js';
|
|
10
9
|
import type { Options as LoggerOptions } from './logger.js';
|
|
11
|
-
import type { Options as
|
|
12
|
-
import type { Options as WebworkerOptions } from '../common/interaction.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,7 +61,7 @@ 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;
|
|
@@ -73,27 +70,27 @@ export default class App {
|
|
|
73
70
|
private activityState;
|
|
74
71
|
private readonly 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: () => any
|
|
79
|
+
attachStartCallback(cb: StartCallback): void;
|
|
80
|
+
attachStopCallback(cb: () => any): 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
91
|
sessionID: string | undefined;
|
|
94
92
|
metadata: Record<string, string>;
|
|
95
93
|
userID: string | null;
|
|
96
|
-
timestamp: number;
|
|
97
94
|
projectID?: string | undefined;
|
|
98
95
|
};
|
|
99
96
|
getSessionToken(): string | undefined;
|
|
@@ -108,7 +105,7 @@ export default class App {
|
|
|
108
105
|
resetNextPageSession(flag: boolean): void;
|
|
109
106
|
private _start;
|
|
110
107
|
start(options?: StartOptions): Promise<StartPromiseReturn>;
|
|
111
|
-
stop(
|
|
108
|
+
stop(calledFromAPI?: boolean, restarting?: boolean): void;
|
|
112
109
|
restart(): void;
|
|
113
110
|
}
|
|
114
111
|
export {};
|
package/lib/app/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Timestamp, Metadata, UserID } from '
|
|
2
|
-
import { timestamp
|
|
1
|
+
import { Timestamp, Metadata, UserID } from '../common/messages.js';
|
|
2
|
+
import { timestamp } from '../utils.js';
|
|
3
3
|
import Nodes from './nodes.js';
|
|
4
4
|
import Observer from './observer/top_observer.js';
|
|
5
5
|
import Sanitizer from './sanitizer.js';
|
|
@@ -29,7 +29,7 @@ export default class App {
|
|
|
29
29
|
this.stopCallbacks = [];
|
|
30
30
|
this.commitCallbacks = [];
|
|
31
31
|
this.activityState = ActivityState.NotActive;
|
|
32
|
-
this.version = '3.6.
|
|
32
|
+
this.version = '3.6.4'; // TODO: version compatability check inside each plugin.
|
|
33
33
|
this.projectKey = projectKey;
|
|
34
34
|
this.options = Object.assign({
|
|
35
35
|
revID: '',
|
|
@@ -43,8 +43,8 @@ export default class App {
|
|
|
43
43
|
verbose: false,
|
|
44
44
|
__is_snippet: false,
|
|
45
45
|
__debug_report_edp: null,
|
|
46
|
-
localStorage: window
|
|
47
|
-
sessionStorage: window
|
|
46
|
+
localStorage: window.localStorage,
|
|
47
|
+
sessionStorage: window.sessionStorage,
|
|
48
48
|
}, options);
|
|
49
49
|
this.revID = this.options.revID;
|
|
50
50
|
this.sanitizer = new Sanitizer(this, options);
|
|
@@ -54,24 +54,23 @@ export default class App {
|
|
|
54
54
|
this.ticker.attach(() => this.commit());
|
|
55
55
|
this.debug = new Logger(this.options.__debug__);
|
|
56
56
|
this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent);
|
|
57
|
-
this.localStorage = this.options.localStorage || window.localStorage;
|
|
58
|
-
this.sessionStorage = this.options.sessionStorage || window.sessionStorage;
|
|
59
57
|
this.session = new Session(this, this.options);
|
|
60
58
|
this.session.attachUpdateCallback(({ userID, metadata }) => {
|
|
61
59
|
if (userID != null) {
|
|
62
60
|
// TODO: nullable userID
|
|
63
|
-
this.send(UserID(userID));
|
|
61
|
+
this.send(new UserID(userID));
|
|
64
62
|
}
|
|
65
63
|
if (metadata != null) {
|
|
66
|
-
Object.entries(metadata).forEach(([key, value]) => this.send(Metadata(key, value)));
|
|
64
|
+
Object.entries(metadata).forEach(([key, value]) => this.send(new Metadata(key, value)));
|
|
67
65
|
}
|
|
68
66
|
});
|
|
69
|
-
|
|
67
|
+
this.localStorage = this.options.localStorage;
|
|
68
|
+
this.sessionStorage = this.options.sessionStorage;
|
|
70
69
|
if (sessionToken != null) {
|
|
71
|
-
this.
|
|
70
|
+
this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
|
|
72
71
|
}
|
|
73
72
|
try {
|
|
74
|
-
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' })));
|
|
73
|
+
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(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 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()};'], { type: 'text/javascript' })));
|
|
75
74
|
this.worker.onerror = (e) => {
|
|
76
75
|
this._debug('webworker_error', e);
|
|
77
76
|
};
|
|
@@ -128,7 +127,7 @@ export default class App {
|
|
|
128
127
|
}
|
|
129
128
|
commit() {
|
|
130
129
|
if (this.worker && this.messages.length) {
|
|
131
|
-
this.messages.unshift(Timestamp(
|
|
130
|
+
this.messages.unshift(new Timestamp(timestamp()));
|
|
132
131
|
this.worker.postMessage(this.messages);
|
|
133
132
|
this.commitCallbacks.forEach((cb) => cb(this.messages));
|
|
134
133
|
this.messages.length = 0;
|
|
@@ -142,7 +141,7 @@ export default class App {
|
|
|
142
141
|
}
|
|
143
142
|
catch (e) {
|
|
144
143
|
app._debug('safe_fn_call', e);
|
|
145
|
-
// time:
|
|
144
|
+
// time: timestamp(),
|
|
146
145
|
// name: e.name,
|
|
147
146
|
// message: e.message,
|
|
148
147
|
// stack: e.stack
|
|
@@ -150,28 +149,20 @@ export default class App {
|
|
|
150
149
|
}; // TODO: correct typing
|
|
151
150
|
}
|
|
152
151
|
attachCommitCallback(cb) {
|
|
153
|
-
// TODO!: what if start callback added when activityState === Active ?
|
|
154
|
-
// For example - attachEventListener() called during dynamic <iframe> appearance
|
|
155
152
|
this.commitCallbacks.push(cb);
|
|
156
153
|
}
|
|
157
|
-
attachStartCallback(cb
|
|
158
|
-
if (useSafe) {
|
|
159
|
-
cb = this.safe(cb);
|
|
160
|
-
}
|
|
154
|
+
attachStartCallback(cb) {
|
|
161
155
|
this.startCallbacks.push(cb);
|
|
162
156
|
}
|
|
163
|
-
attachStopCallback(cb
|
|
164
|
-
if (useSafe) {
|
|
165
|
-
cb = this.safe(cb);
|
|
166
|
-
}
|
|
157
|
+
attachStopCallback(cb) {
|
|
167
158
|
this.stopCallbacks.push(cb);
|
|
168
159
|
}
|
|
169
160
|
attachEventListener(target, type, listener, useSafe = true, useCapture = true) {
|
|
170
161
|
if (useSafe) {
|
|
171
162
|
listener = this.safe(listener);
|
|
172
163
|
}
|
|
173
|
-
this.attachStartCallback(() => target.addEventListener(type, listener, useCapture)
|
|
174
|
-
this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture)
|
|
164
|
+
this.attachStartCallback(() => target.addEventListener(type, listener, useCapture));
|
|
165
|
+
this.attachStopCallback(() => target.removeEventListener(type, listener, useCapture));
|
|
175
166
|
}
|
|
176
167
|
// TODO: full correct semantic
|
|
177
168
|
checkRequiredVersion(version) {
|
|
@@ -190,20 +181,24 @@ export default class App {
|
|
|
190
181
|
}
|
|
191
182
|
return true;
|
|
192
183
|
}
|
|
193
|
-
|
|
184
|
+
getStartInfo() {
|
|
194
185
|
return {
|
|
195
186
|
userUUID: this.localStorage.getItem(this.options.local_uuid_key),
|
|
196
187
|
projectKey: this.projectKey,
|
|
197
188
|
revID: this.revID,
|
|
189
|
+
timestamp: timestamp(),
|
|
198
190
|
trackerVersion: this.version,
|
|
199
191
|
isSnippet: this.options.__is_snippet,
|
|
200
192
|
};
|
|
201
193
|
}
|
|
202
194
|
getSessionInfo() {
|
|
203
|
-
return Object.assign(Object.assign({}, this.session.getInfo()), this.
|
|
195
|
+
return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
|
|
204
196
|
}
|
|
205
197
|
getSessionToken() {
|
|
206
|
-
|
|
198
|
+
const token = this.sessionStorage.getItem(this.options.session_token_key);
|
|
199
|
+
if (token !== null) {
|
|
200
|
+
return token;
|
|
201
|
+
}
|
|
207
202
|
}
|
|
208
203
|
getSessionID() {
|
|
209
204
|
return this.session.getInfo().sessionID || undefined;
|
|
@@ -228,7 +223,7 @@ export default class App {
|
|
|
228
223
|
return this.options.resourceBaseHref;
|
|
229
224
|
}
|
|
230
225
|
else if (typeof this.options.resourceBaseHref === 'object') {
|
|
231
|
-
//
|
|
226
|
+
//switch between types
|
|
232
227
|
}
|
|
233
228
|
if (document.baseURI) {
|
|
234
229
|
return document.baseURI;
|
|
@@ -265,16 +260,19 @@ export default class App {
|
|
|
265
260
|
return Promise.resolve(UnsuccessfulStart('OpenReplay: trying to call `start()` on the instance that has been started already.'));
|
|
266
261
|
}
|
|
267
262
|
this.activityState = ActivityState.Starting;
|
|
268
|
-
|
|
269
|
-
|
|
263
|
+
let pageNo = 0;
|
|
264
|
+
const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
|
|
265
|
+
if (pageNoStr != null) {
|
|
266
|
+
pageNo = parseInt(pageNoStr);
|
|
267
|
+
pageNo++;
|
|
270
268
|
}
|
|
271
|
-
|
|
269
|
+
this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
|
|
270
|
+
const startInfo = this.getStartInfo();
|
|
272
271
|
const startWorkerMsg = {
|
|
273
272
|
type: 'start',
|
|
274
|
-
pageNo
|
|
273
|
+
pageNo,
|
|
275
274
|
ingestPoint: this.options.ingestPoint,
|
|
276
|
-
timestamp,
|
|
277
|
-
url: document.URL,
|
|
275
|
+
timestamp: startInfo.timestamp,
|
|
278
276
|
connAttemptCount: this.options.connAttemptCount,
|
|
279
277
|
connAttemptGap: this.options.connAttemptGap,
|
|
280
278
|
};
|
|
@@ -294,7 +292,7 @@ export default class App {
|
|
|
294
292
|
headers: {
|
|
295
293
|
'Content-Type': 'application/json',
|
|
296
294
|
},
|
|
297
|
-
body: JSON.stringify(Object.assign(Object.assign({},
|
|
295
|
+
body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory,
|
|
298
296
|
jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
|
|
299
297
|
})
|
|
300
298
|
.then((r) => {
|
|
@@ -313,29 +311,26 @@ export default class App {
|
|
|
313
311
|
if (!this.worker) {
|
|
314
312
|
return Promise.reject('no worker found after start request (this might not happen)');
|
|
315
313
|
}
|
|
316
|
-
const { token, userUUID, sessionID,
|
|
317
|
-
} = r;
|
|
314
|
+
const { token, userUUID, sessionID, beaconSizeLimit } = r;
|
|
318
315
|
if (typeof token !== 'string' ||
|
|
319
316
|
typeof userUUID !== 'string' ||
|
|
320
|
-
//typeof startTimestamp !== 'number' ||
|
|
321
|
-
//typeof sessionID !== 'string' ||
|
|
322
317
|
(typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
|
|
323
318
|
return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
|
|
324
319
|
}
|
|
325
|
-
this.
|
|
320
|
+
this.sessionStorage.setItem(this.options.session_token_key, token);
|
|
326
321
|
this.localStorage.setItem(this.options.local_uuid_key, userUUID);
|
|
327
|
-
this.session.update({ sessionID
|
|
322
|
+
this.session.update({ sessionID }); // TODO: no no-explicit 'any'
|
|
328
323
|
const startWorkerMsg = {
|
|
329
324
|
type: 'auth',
|
|
330
325
|
token,
|
|
331
326
|
beaconSizeLimit,
|
|
332
327
|
};
|
|
333
328
|
this.worker.postMessage(startWorkerMsg);
|
|
329
|
+
this.activityState = ActivityState.Active;
|
|
334
330
|
const onStartInfo = { sessionToken: token, userUUID, sessionID };
|
|
335
331
|
this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
|
|
336
332
|
this.observer.observe();
|
|
337
333
|
this.ticker.start();
|
|
338
|
-
this.activityState = ActivityState.Active;
|
|
339
334
|
this.notify.log('OpenReplay tracking started.');
|
|
340
335
|
// get rid of onStart ?
|
|
341
336
|
if (typeof this.options.onStart === 'function') {
|
|
@@ -344,8 +339,8 @@ export default class App {
|
|
|
344
339
|
return SuccessfulStart(onStartInfo);
|
|
345
340
|
})
|
|
346
341
|
.catch((reason) => {
|
|
342
|
+
this.sessionStorage.removeItem(this.options.session_token_key);
|
|
347
343
|
this.stop();
|
|
348
|
-
this.session.reset();
|
|
349
344
|
if (reason === CANCELED) {
|
|
350
345
|
return UnsuccessfulStart(CANCELED);
|
|
351
346
|
}
|
|
@@ -370,7 +365,7 @@ export default class App {
|
|
|
370
365
|
});
|
|
371
366
|
}
|
|
372
367
|
}
|
|
373
|
-
stop(
|
|
368
|
+
stop(calledFromAPI = false, restarting = false) {
|
|
374
369
|
if (this.activityState !== ActivityState.NotActive) {
|
|
375
370
|
try {
|
|
376
371
|
this.sanitizer.clear();
|
|
@@ -378,8 +373,11 @@ export default class App {
|
|
|
378
373
|
this.nodes.clear();
|
|
379
374
|
this.ticker.stop();
|
|
380
375
|
this.stopCallbacks.forEach((cb) => cb());
|
|
376
|
+
if (calledFromAPI) {
|
|
377
|
+
this.session.reset();
|
|
378
|
+
}
|
|
381
379
|
this.notify.log('OpenReplay tracking stopped.');
|
|
382
|
-
if (this.worker &&
|
|
380
|
+
if (this.worker && !restarting) {
|
|
383
381
|
this.worker.postMessage('stop');
|
|
384
382
|
}
|
|
385
383
|
}
|
|
@@ -389,7 +387,7 @@ export default class App {
|
|
|
389
387
|
}
|
|
390
388
|
}
|
|
391
389
|
restart() {
|
|
392
|
-
this.stop(false);
|
|
390
|
+
this.stop(false, true);
|
|
393
391
|
this.start({ forceNew: false });
|
|
394
392
|
}
|
|
395
393
|
}
|
package/lib/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;
|
package/lib/app/nodes.js
CHANGED
|
@@ -5,11 +5,9 @@ export default class Nodes {
|
|
|
5
5
|
this.nodeCallbacks = [];
|
|
6
6
|
this.elementListeners = new Map();
|
|
7
7
|
}
|
|
8
|
-
// Attached once per Tracker instance
|
|
9
8
|
attachNodeCallback(nodeCallback) {
|
|
10
9
|
this.nodeCallbacks.push(nodeCallback);
|
|
11
10
|
}
|
|
12
|
-
// TODO: what is the difference with app.attachEventListener. can we use only one of those?
|
|
13
11
|
attachElementListener(type, node, elementListener) {
|
|
14
12
|
const id = this.getID(node);
|
|
15
13
|
if (id === undefined) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Observer from './observer.js';
|
|
2
|
-
import { CreateIFrameDocument } from '
|
|
2
|
+
import { CreateIFrameDocument } from '../../common/messages.js';
|
|
3
3
|
export default class IFrameObserver extends Observer {
|
|
4
4
|
observe(iframe) {
|
|
5
5
|
const doc = iframe.contentDocument;
|