@openreplay/tracker 3.3.0 → 3.4.1
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/index.d.ts +6 -1
- package/cjs/app/index.js +49 -19
- package/cjs/app/observer.d.ts +19 -2
- package/cjs/app/observer.js +119 -39
- package/cjs/index.js +11 -7
- package/cjs/messages/index.d.ts +8 -0
- package/cjs/messages/index.js +15 -0
- package/cjs/messages/webworker.d.ts +1 -0
- package/cjs/messages/writer.js +3 -0
- package/cjs/modules/console.js +1 -1
- package/cjs/modules/cssrules.js +1 -2
- package/cjs/modules/img.js +2 -2
- package/cjs/modules/mouse.d.ts +5 -1
- package/cjs/modules/mouse.js +8 -3
- package/cjs/modules/timing.js +20 -15
- package/cjs/utils.d.ts +1 -1
- package/cjs/utils.js +3 -12
- package/cjs/vendors/finder/finder.js +12 -8
- package/lib/app/index.d.ts +6 -1
- package/lib/app/index.js +51 -21
- package/lib/app/observer.d.ts +19 -2
- package/lib/app/observer.js +121 -41
- package/lib/index.js +12 -8
- package/lib/messages/index.d.ts +8 -0
- package/lib/messages/index.js +14 -0
- package/lib/messages/tsconfig.tsbuildinfo +1 -1
- package/lib/messages/webworker.d.ts +1 -0
- package/lib/messages/writer.js +3 -0
- package/lib/modules/console.js +1 -1
- package/lib/modules/cssrules.js +1 -2
- package/lib/modules/img.js +3 -3
- package/lib/modules/mouse.d.ts +5 -1
- package/lib/modules/mouse.js +8 -3
- package/lib/modules/timing.js +20 -15
- package/lib/utils.d.ts +1 -1
- package/lib/utils.js +1 -9
- package/lib/vendors/finder/finder.js +12 -8
- package/package.json +2 -1
package/cjs/messages/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MouseClick = exports.CSSInsertRuleURLBased = exports.PageClose = exports.CustomIssue = exports.TechnicalInfo = exports.SetCSSDataURLBased = exports.SetNodeAttributeURLBased = exports.LongTask = exports.SetPageVisibility = exports.ConnectionInformation = exports.ResourceTiming = exports.PerformanceTrack = exports.GraphQL = exports.NgRx = exports.MobX = exports.Vuex = exports.Redux = exports.StateAction = exports.OTable = exports.Profiler = exports.Fetch = exports.CSSDeleteRule = exports.CSSInsertRule = exports.Metadata = exports.UserAnonymousID = exports.UserID = exports.RawCustomEvent = exports.JSException = exports.PageRenderTiming = exports.PageLoadTiming = exports.ConsoleLog = exports.MouseMove = exports.SetInputChecked = exports.SetInputValue = exports.SetInputTarget = exports.SetNodeScroll = exports.SetNodeData = exports.RemoveNodeAttribute = exports.SetNodeAttribute = exports.RemoveNode = exports.MoveNode = exports.CreateTextNode = exports.CreateElementNode = exports.CreateDocument = exports.SetViewportScroll = exports.SetViewportSize = exports.SetPageLocation = exports.Timestamp = exports.BatchMeta = exports.classes = void 0;
|
|
4
|
+
exports.CreateIFrameDocument = void 0;
|
|
4
5
|
function bindNew(Class) {
|
|
5
6
|
function _Class(...args) {
|
|
6
7
|
return new Class(...args);
|
|
@@ -777,3 +778,17 @@ class _MouseClick {
|
|
|
777
778
|
}
|
|
778
779
|
exports.MouseClick = bindNew(_MouseClick);
|
|
779
780
|
exports.classes.set(69, exports.MouseClick);
|
|
781
|
+
class _CreateIFrameDocument {
|
|
782
|
+
constructor(frameID, id) {
|
|
783
|
+
this.frameID = frameID;
|
|
784
|
+
this.id = id;
|
|
785
|
+
this._id = 70;
|
|
786
|
+
}
|
|
787
|
+
encode(writer) {
|
|
788
|
+
return writer.uint(70) &&
|
|
789
|
+
writer.uint(this.frameID) &&
|
|
790
|
+
writer.uint(this.id);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
exports.CreateIFrameDocument = bindNew(_CreateIFrameDocument);
|
|
794
|
+
exports.classes.set(70, exports.CreateIFrameDocument);
|
package/cjs/messages/writer.js
CHANGED
|
@@ -78,6 +78,9 @@ class Writer {
|
|
|
78
78
|
return this.offset <= this.size;
|
|
79
79
|
}
|
|
80
80
|
uint(value) {
|
|
81
|
+
if (value < 0 || value > Number.MAX_SAFE_INTEGER) {
|
|
82
|
+
value = 0;
|
|
83
|
+
}
|
|
81
84
|
while (value >= 0x80) {
|
|
82
85
|
this.data[this.offset++] = value % 0x100 | 0x80;
|
|
83
86
|
value = Math.floor(value / 128);
|
package/cjs/modules/console.js
CHANGED
|
@@ -101,7 +101,7 @@ function default_1(app, opts) {
|
|
|
101
101
|
app.ticker.attach(reset, 33, false);
|
|
102
102
|
options.consoleMethods.forEach((method) => {
|
|
103
103
|
if (consoleMethods.indexOf(method) === -1) {
|
|
104
|
-
console.error(`
|
|
104
|
+
console.error(`OpenReplay: unsupported console method "${method}"`);
|
|
105
105
|
return;
|
|
106
106
|
}
|
|
107
107
|
const fn = console[method];
|
package/cjs/modules/cssrules.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const messages_1 = require("../messages");
|
|
4
|
-
const utils_1 = require("../utils");
|
|
5
4
|
function default_1(app) {
|
|
6
5
|
if (app === null) {
|
|
7
6
|
return;
|
|
@@ -12,7 +11,7 @@ function default_1(app) {
|
|
|
12
11
|
}
|
|
13
12
|
const processOperation = app.safe((stylesheet, index, rule) => {
|
|
14
13
|
const sendMessage = typeof rule === 'string'
|
|
15
|
-
? (nodeID) => app.send(new messages_1.CSSInsertRuleURLBased(nodeID, rule, index,
|
|
14
|
+
? (nodeID) => app.send(new messages_1.CSSInsertRuleURLBased(nodeID, rule, index, app.getBaseHref()))
|
|
16
15
|
: (nodeID) => app.send(new messages_1.CSSDeleteRule(nodeID, index));
|
|
17
16
|
// TODO: Extend messages to maintain nested rules (CSSGroupingRule prototype, as well as CSSKeyframesRule)
|
|
18
17
|
if (stylesheet.ownerNode == null) {
|
package/cjs/modules/img.js
CHANGED
|
@@ -18,7 +18,7 @@ function default_1(app) {
|
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
else if (src.length < 1e5) {
|
|
21
|
-
app.send(new messages_1.SetNodeAttributeURLBased(id, 'src', src,
|
|
21
|
+
app.send(new messages_1.SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref()));
|
|
22
22
|
}
|
|
23
23
|
});
|
|
24
24
|
const observer = new MutationObserver((mutations) => {
|
|
@@ -30,7 +30,7 @@ function default_1(app) {
|
|
|
30
30
|
return;
|
|
31
31
|
}
|
|
32
32
|
const src = target.src;
|
|
33
|
-
app.send(new messages_1.SetNodeAttributeURLBased(id, 'src', src,
|
|
33
|
+
app.send(new messages_1.SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref()));
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
});
|
package/cjs/modules/mouse.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { Options as FinderOptions } from '../vendors/finder/finder';
|
|
2
2
|
import App from '../app';
|
|
3
|
+
interface HeatmapsOptions {
|
|
4
|
+
finder: FinderOptions;
|
|
5
|
+
}
|
|
3
6
|
export interface Options {
|
|
4
|
-
|
|
7
|
+
heatmaps: boolean | HeatmapsOptions;
|
|
5
8
|
}
|
|
6
9
|
export default function (app: App, opts: Partial<Options>): void;
|
|
10
|
+
export {};
|
package/cjs/modules/mouse.js
CHANGED
|
@@ -67,7 +67,12 @@ function getTargetLabel(target) {
|
|
|
67
67
|
}
|
|
68
68
|
function default_1(app, opts) {
|
|
69
69
|
const options = Object.assign({
|
|
70
|
-
|
|
70
|
+
heatmaps: {
|
|
71
|
+
finder: {
|
|
72
|
+
threshold: 5,
|
|
73
|
+
maxNumberOfTries: 600,
|
|
74
|
+
},
|
|
75
|
+
},
|
|
71
76
|
}, opts);
|
|
72
77
|
let mousePositionX = -1;
|
|
73
78
|
let mousePositionY = -1;
|
|
@@ -88,11 +93,11 @@ function default_1(app, opts) {
|
|
|
88
93
|
};
|
|
89
94
|
const selectorMap = {};
|
|
90
95
|
function getSelector(id, target) {
|
|
91
|
-
if (options.
|
|
96
|
+
if (options.heatmaps === false) {
|
|
92
97
|
return '';
|
|
93
98
|
}
|
|
94
99
|
return selectorMap[id] = selectorMap[id] ||
|
|
95
|
-
finder_1.finder(target, options.
|
|
100
|
+
finder_1.finder(target, options.heatmaps === true ? undefined : options.heatmaps.finder);
|
|
96
101
|
}
|
|
97
102
|
app.attachEventListener(document.documentElement, 'mouseover', (e) => {
|
|
98
103
|
const target = getTarget(e.target);
|
package/cjs/modules/timing.js
CHANGED
|
@@ -68,33 +68,38 @@ function default_1(app, opts) {
|
|
|
68
68
|
options.captureResourceTimings = false;
|
|
69
69
|
}
|
|
70
70
|
if (!options.captureResourceTimings) {
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
return;
|
|
72
|
+
} // Resources are necessary for all timings
|
|
73
|
+
const mQueue = [];
|
|
74
|
+
function sendOnStart(m) {
|
|
75
|
+
if (app.active()) {
|
|
76
|
+
app.send(m);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
mQueue.push(m);
|
|
80
|
+
}
|
|
73
81
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
82
|
+
app.attachStartCallback(function () {
|
|
83
|
+
mQueue.forEach(m => app.send(m));
|
|
84
|
+
});
|
|
85
|
+
let resources = {};
|
|
77
86
|
function resourceTiming(entry) {
|
|
78
87
|
if (entry.duration <= 0 || !utils_1.isURL(entry.name) || app.isServiceURL(entry.name))
|
|
79
88
|
return;
|
|
80
89
|
if (resources !== null) {
|
|
81
90
|
resources[entry.name] = entry.startTime + entry.duration;
|
|
82
91
|
}
|
|
83
|
-
|
|
92
|
+
sendOnStart(new messages_1.ResourceTiming(entry.startTime + performance.timing.navigationStart, entry.duration, entry.responseStart && entry.startTime
|
|
84
93
|
? entry.responseStart - entry.startTime
|
|
85
94
|
: 0, entry.transferSize > entry.encodedBodySize
|
|
86
95
|
? entry.transferSize - entry.encodedBodySize
|
|
87
96
|
: 0, entry.encodedBodySize || 0, entry.decodedBodySize || 0, entry.name, entry.initiatorType));
|
|
88
97
|
}
|
|
89
|
-
const observer =
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (observer !== null) {
|
|
93
|
-
performance.getEntriesByType('resource').forEach(resourceTiming);
|
|
94
|
-
observer.observe({ entryTypes: ['resource'] });
|
|
95
|
-
}
|
|
98
|
+
const observer = new PerformanceObserver((list) => list.getEntries().forEach(resourceTiming));
|
|
99
|
+
performance.getEntriesByType('resource').forEach(resourceTiming);
|
|
100
|
+
observer.observe({ entryTypes: ['resource'] });
|
|
96
101
|
let firstPaint = 0, firstContentfulPaint = 0;
|
|
97
|
-
if (options.capturePageLoadTimings
|
|
102
|
+
if (options.capturePageLoadTimings) {
|
|
98
103
|
let pageLoadTimingSent = false;
|
|
99
104
|
app.ticker.attach(() => {
|
|
100
105
|
if (pageLoadTimingSent) {
|
|
@@ -122,7 +127,7 @@ function default_1(app, opts) {
|
|
|
122
127
|
}
|
|
123
128
|
}, 30);
|
|
124
129
|
}
|
|
125
|
-
if (options.capturePageRenderTimings
|
|
130
|
+
if (options.capturePageRenderTimings) {
|
|
126
131
|
let visuallyComplete = 0, interactiveWindowStartTime = 0, interactiveWindowTickTime = 0, paintBlocks = null;
|
|
127
132
|
let pageRenderTimingSent = false;
|
|
128
133
|
app.ticker.attach(() => {
|
package/cjs/utils.d.ts
CHANGED
|
@@ -2,7 +2,6 @@ export declare function timestamp(): number;
|
|
|
2
2
|
export declare const stars: (str: string) => string;
|
|
3
3
|
export declare function normSpaces(str: string): string;
|
|
4
4
|
export declare function isURL(s: string): boolean;
|
|
5
|
-
export declare function getBaseURI(): string;
|
|
6
5
|
export declare const IN_BROWSER: boolean;
|
|
7
6
|
export declare const log: {
|
|
8
7
|
(...data: any[]): void;
|
|
@@ -12,6 +11,7 @@ export declare const warn: {
|
|
|
12
11
|
(...data: any[]): void;
|
|
13
12
|
(message?: any, ...optionalParams: any[]): void;
|
|
14
13
|
};
|
|
14
|
+
export declare const DOCS_HOST = "https://docs.openreplay.com";
|
|
15
15
|
export declare function deprecationWarn(nameOfFeature: string, useInstead: string, docsPath?: string): void;
|
|
16
16
|
export declare function getLabelAttribute(e: Element): string | null;
|
|
17
17
|
export declare function hasOpenreplayAttribute(e: Element, name: string): boolean;
|
package/cjs/utils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.hasOpenreplayAttribute = exports.getLabelAttribute = exports.deprecationWarn = exports.
|
|
3
|
+
exports.hasOpenreplayAttribute = exports.getLabelAttribute = exports.deprecationWarn = exports.DOCS_HOST = exports.warn = exports.log = exports.IN_BROWSER = exports.isURL = exports.normSpaces = exports.stars = exports.timestamp = void 0;
|
|
4
4
|
function timestamp() {
|
|
5
5
|
return Math.round(performance.now()) + performance.timing.navigationStart;
|
|
6
6
|
}
|
|
@@ -17,25 +17,16 @@ function isURL(s) {
|
|
|
17
17
|
return s.substr(0, 8) === 'https://' || s.substr(0, 7) === 'http://';
|
|
18
18
|
}
|
|
19
19
|
exports.isURL = isURL;
|
|
20
|
-
function getBaseURI() {
|
|
21
|
-
var _a, _b;
|
|
22
|
-
if (document.baseURI) {
|
|
23
|
-
return document.baseURI;
|
|
24
|
-
}
|
|
25
|
-
// IE only
|
|
26
|
-
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;
|
|
27
|
-
}
|
|
28
|
-
exports.getBaseURI = getBaseURI;
|
|
29
20
|
exports.IN_BROWSER = !(typeof window === "undefined");
|
|
30
21
|
exports.log = console.log;
|
|
31
22
|
exports.warn = console.warn;
|
|
32
|
-
|
|
23
|
+
exports.DOCS_HOST = 'https://docs.openreplay.com';
|
|
33
24
|
const warnedFeatures = {};
|
|
34
25
|
function deprecationWarn(nameOfFeature, useInstead, docsPath = "/") {
|
|
35
26
|
if (warnedFeatures[nameOfFeature]) {
|
|
36
27
|
return;
|
|
37
28
|
}
|
|
38
|
-
exports.warn(`OpenReplay: ${nameOfFeature} is deprecated. ${useInstead ? `Please, use ${useInstead} instead.` : ""} Visit ${DOCS_HOST}${docsPath} for more information.`);
|
|
29
|
+
exports.warn(`OpenReplay: ${nameOfFeature} is deprecated. ${useInstead ? `Please, use ${useInstead} instead.` : ""} Visit ${exports.DOCS_HOST}${docsPath} for more information.`);
|
|
39
30
|
warnedFeatures[nameOfFeature] = true;
|
|
40
31
|
}
|
|
41
32
|
exports.deprecationWarn = deprecationWarn;
|
|
@@ -215,42 +215,46 @@ function maybe(...level) {
|
|
|
215
215
|
function notEmpty(value) {
|
|
216
216
|
return value !== null && value !== undefined;
|
|
217
217
|
}
|
|
218
|
-
function
|
|
218
|
+
function combinations(stack, path = []) {
|
|
219
|
+
const paths = [];
|
|
219
220
|
if (stack.length > 0) {
|
|
220
221
|
for (let node of stack[0]) {
|
|
221
|
-
|
|
222
|
+
paths.push(...combinations(stack.slice(1, stack.length), path.concat(node)));
|
|
222
223
|
}
|
|
223
224
|
}
|
|
224
225
|
else {
|
|
225
|
-
|
|
226
|
+
paths.push(path);
|
|
226
227
|
}
|
|
228
|
+
return paths;
|
|
227
229
|
}
|
|
228
230
|
function sort(paths) {
|
|
229
231
|
return Array.from(paths).sort((a, b) => penalty(a) - penalty(b));
|
|
230
232
|
}
|
|
231
|
-
function
|
|
233
|
+
function optimize(path, input, scope = {
|
|
232
234
|
counter: 0,
|
|
233
235
|
visited: new Map()
|
|
234
236
|
}) {
|
|
237
|
+
const paths = [];
|
|
235
238
|
if (path.length > 2 && path.length > config.optimizedMinLength) {
|
|
236
239
|
for (let i = 1; i < path.length - 1; i++) {
|
|
237
240
|
if (scope.counter > config.maxNumberOfTries) {
|
|
238
|
-
return; // Okay At least I tried!
|
|
241
|
+
return paths; // Okay At least I tried!
|
|
239
242
|
}
|
|
240
243
|
scope.counter += 1;
|
|
241
244
|
const newPath = [...path];
|
|
242
245
|
newPath.splice(i, 1);
|
|
243
246
|
const newPathKey = selector(newPath);
|
|
244
247
|
if (scope.visited.has(newPathKey)) {
|
|
245
|
-
return;
|
|
248
|
+
return paths;
|
|
246
249
|
}
|
|
247
250
|
if (unique(newPath) && same(newPath, input)) {
|
|
248
|
-
|
|
251
|
+
paths.push(newPath);
|
|
249
252
|
scope.visited.set(newPathKey, true);
|
|
250
|
-
|
|
253
|
+
paths.push(...optimize(newPath, input, scope));
|
|
251
254
|
}
|
|
252
255
|
}
|
|
253
256
|
}
|
|
257
|
+
return paths;
|
|
254
258
|
}
|
|
255
259
|
function same(path, input) {
|
|
256
260
|
return rootDocument.querySelector(selector(path)) === input;
|
package/lib/app/index.d.ts
CHANGED
|
@@ -15,8 +15,10 @@ export declare type Options = {
|
|
|
15
15
|
session_pageno_key: string;
|
|
16
16
|
local_uuid_key: string;
|
|
17
17
|
ingestPoint: string;
|
|
18
|
+
resourceBaseHref: string | null;
|
|
18
19
|
__is_snippet: boolean;
|
|
19
20
|
__debug_report_edp: string | null;
|
|
21
|
+
__debug_log: boolean;
|
|
20
22
|
onStart?: (info: OnStartInfo) => void;
|
|
21
23
|
} & ObserverOptions & WebworkerOptions;
|
|
22
24
|
declare type Callback = () => void;
|
|
@@ -38,7 +40,7 @@ export default class App {
|
|
|
38
40
|
private version;
|
|
39
41
|
private readonly worker?;
|
|
40
42
|
constructor(projectKey: string, sessionToken: string | null | undefined, opts: Partial<Options>);
|
|
41
|
-
private
|
|
43
|
+
private _debug;
|
|
42
44
|
send(message: Message, urgent?: boolean): void;
|
|
43
45
|
private commit;
|
|
44
46
|
addCommitCallback(cb: CommitCallback): void;
|
|
@@ -49,6 +51,9 @@ export default class App {
|
|
|
49
51
|
getSessionToken(): string | undefined;
|
|
50
52
|
getSessionID(): string | undefined;
|
|
51
53
|
getHost(): string;
|
|
54
|
+
getProjectKey(): string;
|
|
55
|
+
getBaseHref(): string;
|
|
56
|
+
resolveResourceURL(resourceURL: string): string;
|
|
52
57
|
isServiceURL(url: string): boolean;
|
|
53
58
|
active(): boolean;
|
|
54
59
|
private _start;
|
package/lib/app/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { timestamp, log } from '../utils';
|
|
2
|
-
import { Timestamp
|
|
1
|
+
import { timestamp, log, warn } from '../utils';
|
|
2
|
+
import { Timestamp } from '../messages';
|
|
3
3
|
import Nodes from './nodes';
|
|
4
4
|
import Observer from './observer';
|
|
5
5
|
import Ticker from './ticker';
|
|
@@ -14,7 +14,7 @@ export default class App {
|
|
|
14
14
|
this.commitCallbacks = [];
|
|
15
15
|
this._sessionID = null;
|
|
16
16
|
this.isActive = false;
|
|
17
|
-
this.version = '3.
|
|
17
|
+
this.version = '3.4.1';
|
|
18
18
|
this.projectKey = projectKey;
|
|
19
19
|
this.options = Object.assign({
|
|
20
20
|
revID: '',
|
|
@@ -23,10 +23,13 @@ export default class App {
|
|
|
23
23
|
session_pageno_key: '__openreplay_pageno',
|
|
24
24
|
local_uuid_key: '__openreplay_uuid',
|
|
25
25
|
ingestPoint: DEFAULT_INGEST_POINT,
|
|
26
|
+
resourceBaseHref: null,
|
|
26
27
|
__is_snippet: false,
|
|
27
28
|
__debug_report_edp: null,
|
|
29
|
+
__debug_log: false,
|
|
28
30
|
obscureTextEmails: true,
|
|
29
31
|
obscureTextNumbers: false,
|
|
32
|
+
captureIFrames: false,
|
|
30
33
|
}, opts);
|
|
31
34
|
if (sessionToken != null) {
|
|
32
35
|
sessionStorage.setItem(this.options.session_token_key, sessionToken);
|
|
@@ -37,12 +40,11 @@ export default class App {
|
|
|
37
40
|
this.ticker = new Ticker(this);
|
|
38
41
|
this.ticker.attach(() => this.commit());
|
|
39
42
|
try {
|
|
40
|
-
this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,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)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,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)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const k=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,k);const E=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,E);const z=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,z);const w=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,w);const I=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,I);const L=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,L);const T=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,T);const C=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,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)}});s.set(39,C);const A=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,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)}});s.set(40,A);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const U=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,U);const N=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,N);const O=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,O);const q=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,q);const D=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,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)}});s.set(48,D);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,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)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,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)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,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)}});s.set(59,j);const K=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,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)}});s.set(60,K);const G=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,G);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,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)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,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)}});s.set(69,W);const Y="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class Z{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>=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=Y.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let tt,st=1e6,it=4e5,nt=new Z(it),et="",rt="",ot=0,ht=0,ct=0,ut=0,at=!0;function dt(){return new i(ot,ut,ht).encode(nt)}const lt=[];let gt,ft=!1,pt=0,mt=8e3,_t=10;function yt(){if(at||""===rt||""===et)return;const t=nt.flush();ft?lt.push(t):(ft=!0,function t(s){const i=new XMLHttpRequest;i.open("POST",et+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+rt),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(this.status>=400)return vt(),lt.length=0,403===this.status?void self.postMessage("restart"):void self.postMessage(null);const s=lt.shift();s?t(s):ft=!1}},i.onerror=function(i){if(pt>=_t)return vt(),void self.postMessage(null);pt++,setTimeout(()=>t(s),mt)},i.send(s.buffer)}(t)),at=!0,dt()}function vt(){et="",rt="",clearInterval(tt),nt.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(yt(),void vt()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ht=i.timestamp:i instanceof J&&(i.hidden?gt=setTimeout(()=>self.postMessage("restart"),3e5):clearTimeout(gt)),nt.checkpoint(),!i.encode(nt)&&(yt(),!i.encode(nt)))for(;!i.encode(nt);){if(it===st)return console.warn("OpenReplay: beacon size overflow."),nt.reset(),void dt();it=Math.min(2*it,st),nt=new Z(it),dt()}ut++,at=!1}):(et=t.ingestPoint||et,rt=t.token||rt,ot=t.pageNo||ot,ht=t.startTimestamp||ht,ct=t.timeAdjustment||ct,_t=t.connAttemptCount||_t,mt=t.connAttemptGap||mt,st=t.beaconSizeLimit||st,it=Math.min(st,t.beaconSize||it),nt.isEmpty()&&dt(),void(null==tt&&(tt=setInterval(yt,2e4))));yt()};
|
|
43
|
+
this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function s(...s){return new t(...s)}return s.prototype=t.prototype,s}const s=new Map;const i=t(class{constructor(t,s,i){this.pageNo=t,this.firstIndex=s,this.timestamp=i,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});s.set(80,i);const n=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});s.set(0,n);const e=t(class{constructor(t,s,i){this.url=t,this.referrer=s,this.navigationStart=i,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});s.set(4,e);const r=t(class{constructor(t,s){this.width=t,this.height=s,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});s.set(5,r);const o=t(class{constructor(t,s){this.x=t,this.y=s,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});s.set(6,o);const h=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});s.set(7,h);const c=t(class{constructor(t,s,i,n,e){this.id=t,this.parentID=s,this.index=i,this.tag=n,this.svg=e,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)}});s.set(8,c);const u=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(9,u);const a=t(class{constructor(t,s,i){this.id=t,this.parentID=s,this.index=i,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});s.set(10,a);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});s.set(11,d);const l=t(class{constructor(t,s,i){this.id=t,this.name=s,this.value=i,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});s.set(12,l);const g=t(class{constructor(t,s){this.id=t,this.name=s,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});s.set(13,g);const f=t(class{constructor(t,s){this.id=t,this.data=s,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});s.set(14,f);const p=t(class{constructor(t,s,i){this.id=t,this.x=s,this.y=i,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});s.set(16,p);const m=t(class{constructor(t,s){this.id=t,this.label=s,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});s.set(17,m);const _=t(class{constructor(t,s,i){this.id=t,this.value=s,this.mask=i,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});s.set(18,_);const y=t(class{constructor(t,s){this.id=t,this.checked=s,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});s.set(19,y);const v=t(class{constructor(t,s){this.x=t,this.y=s,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});s.set(20,v);const S=t(class{constructor(t,s){this.level=t,this.value=s,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});s.set(22,S);const b=t(class{constructor(t,s,i,n,e,r,o,h,c){this.requestStart=t,this.responseStart=s,this.responseEnd=i,this.domContentLoadedEventStart=n,this.domContentLoadedEventEnd=e,this.loadEventStart=r,this.loadEventEnd=o,this.firstPaint=h,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)}});s.set(23,b);const x=t(class{constructor(t,s,i){this.speedIndex=t,this.visuallyComplete=s,this.timeToInteractive=i,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});s.set(24,x);const E=t(class{constructor(t,s,i){this.name=t,this.message=s,this.payload=i,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});s.set(25,E);const k=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});s.set(27,k);const I=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});s.set(28,I);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});s.set(29,z);const w=t(class{constructor(t,s){this.key=t,this.value=s,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});s.set(30,w);const T=t(class{constructor(t,s,i){this.id=t,this.rule=s,this.index=i,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});s.set(37,T);const L=t(class{constructor(t,s){this.id=t,this.index=s,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});s.set(38,L);const A=t(class{constructor(t,s,i,n,e,r,o){this.method=t,this.url=s,this.request=i,this.response=n,this.status=e,this.timestamp=r,this.duration=o,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)}});s.set(39,A);const C=t(class{constructor(t,s,i,n){this.name=t,this.duration=s,this.args=i,this.result=n,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)}});s.set(40,C);const M=t(class{constructor(t,s){this.key=t,this.value=s,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});s.set(41,M);const R=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});s.set(42,R);const N=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(44,N);const D=t(class{constructor(t,s){this.mutation=t,this.state=s,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});s.set(45,D);const U=t(class{constructor(t,s){this.type=t,this.payload=s,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});s.set(46,U);const O=t(class{constructor(t,s,i){this.action=t,this.state=s,this.duration=i,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});s.set(47,O);const q=t(class{constructor(t,s,i,n){this.operationKind=t,this.operationName=s,this.variables=i,this.response=n,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)}});s.set(48,q);const H=t(class{constructor(t,s,i,n){this.frames=t,this.ticks=s,this.totalJSHeapSize=i,this.usedJSHeapSize=n,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)}});s.set(49,H);const P=t(class{constructor(t,s,i,n,e,r,o,h){this.timestamp=t,this.duration=s,this.ttfb=i,this.headerSize=n,this.encodedBodySize=e,this.decodedBodySize=r,this.url=o,this.initiator=h,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)}});s.set(53,P);const B=t(class{constructor(t,s){this.downlink=t,this.type=s,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});s.set(54,B);const J=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});s.set(55,J);const j=t(class{constructor(t,s,i,n,e,r,o){this.timestamp=t,this.duration=s,this.context=i,this.containerType=n,this.containerSrc=e,this.containerId=r,this.containerName=o,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)}});s.set(59,j);const G=t(class{constructor(t,s,i,n){this.id=t,this.name=s,this.value=i,this.baseURL=n,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)}});s.set(60,G);const K=t(class{constructor(t,s,i){this.id=t,this.data=s,this.baseURL=i,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});s.set(61,K);const X=t(class{constructor(t,s){this.type=t,this.value=s,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});s.set(63,X);const F=t(class{constructor(t,s){this.name=t,this.payload=s,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});s.set(64,F);const Q=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});s.set(65,Q);const V=t(class{constructor(t,s,i,n){this.id=t,this.rule=s,this.index=i,this.baseURL=n,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)}});s.set(67,V);const W=t(class{constructor(t,s,i,n){this.id=t,this.hesitationTime=s,this.label=i,this.selector=n,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)}});s.set(69,W);const Y=t(class{constructor(t,s){this.frameID=t,this.id=s,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});s.set(70,Y);const Z="function"==typeof TextEncoder?new TextEncoder:{encode(t){const s=t.length,i=new Uint8Array(3*s);let n=-1;for(var e=0,r=0,o=0;o!==s;){if(e=t.charCodeAt(o),o+=1,e>=55296&&e<=56319){if(o===s){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;break}if(!((r=t.charCodeAt(o))>=56320&&r<=57343)){i[n+=1]=239,i[n+=1]=191,i[n+=1]=189;continue}if(o+=1,(e=1024*(e-55296)+r-56320+65536)>65535){i[n+=1]=240|e>>>18,i[n+=1]=128|e>>>12&63,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e;continue}}e<=127?i[n+=1]=0|e:e<=2047?(i[n+=1]=192|e>>>6,i[n+=1]=128|63&e):(i[n+=1]=224|e>>>12,i[n+=1]=128|e>>>6&63,i[n+=1]=128|63&e)}return i.subarray(0,n+1)}};class tt{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 s=Z.encode(t),i=s.byteLength;return!(!this.uint(i)||this.offset+i>this.size)&&(this.data.set(s,this.offset),this.offset+=i,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}let st,it=1e6,nt=4e5,et=new tt(nt),rt="",ot="",ht=0,ct=0,ut=0,at=0,dt=!0;function lt(){return new i(ht,at,ct).encode(et)}const gt=[];let ft,pt=!1,mt=0,_t=8e3,yt=10;function vt(){if(dt||""===ot||""===rt)return;const t=et.flush();pt?gt.push(t):(pt=!0,function t(s){const i=new XMLHttpRequest;i.open("POST",rt+"/v1/web/i",!1),i.setRequestHeader("Authorization","Bearer "+ot),i.onreadystatechange=function(){if(4===this.readyState){if(0==this.status)return;if(this.status>=400)return St(),gt.length=0,401===this.status?void self.postMessage("restart"):void self.postMessage(null);const s=gt.shift();s?t(s):pt=!1}},i.onerror=function(i){if(mt>=yt)return St(),void self.postMessage(null);mt++,setTimeout(()=>t(s),_t)},i.send(s.buffer)}(t)),dt=!0,lt()}function St(){rt="",ot="",clearInterval(st),et.reset()}self.onmessage=({data:t})=>{if(null!==t)return"stop"===t?(vt(),void St()):Array.isArray(t)?void t.forEach(t=>{const i=new(s.get(t._id));if(Object.assign(i,t),i instanceof n?ct=i.timestamp:i instanceof J&&(i.hidden?ft=setTimeout(()=>self.postMessage("restart"),3e5):clearTimeout(ft)),et.checkpoint(),!i.encode(et)&&(vt(),!i.encode(et)))for(;!i.encode(et);){if(nt===it)return console.warn("OpenReplay: beacon size overflow."),et.reset(),void lt();nt=Math.min(2*nt,it),et=new tt(nt),lt()}at++,dt=!1}):(rt=t.ingestPoint||rt,ot=t.token||ot,ht=t.pageNo||ht,ct=t.startTimestamp||ct,ut=t.timeAdjustment||ut,yt=t.connAttemptCount||yt,_t=t.connAttemptGap||_t,it=t.beaconSizeLimit||it,nt=Math.min(it,t.beaconSize||nt),et.isEmpty()&<(),void(null==st&&(st=setInterval(vt,2e4))));vt()};
|
|
41
44
|
`], { type: 'text/javascript' })));
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
// }
|
|
45
|
+
this.worker.onerror = e => {
|
|
46
|
+
this._debug("webworker_error", e);
|
|
47
|
+
};
|
|
46
48
|
let lastTs = timestamp();
|
|
47
49
|
let fileno = 0;
|
|
48
50
|
this.worker.onmessage = ({ data }) => {
|
|
@@ -59,25 +61,30 @@ export default class App {
|
|
|
59
61
|
this.worker.postMessage(null);
|
|
60
62
|
}
|
|
61
63
|
};
|
|
64
|
+
// TODO:on start
|
|
62
65
|
// TODO: keep better tactics, discard others (look https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon)
|
|
63
66
|
this.attachEventListener(window, 'beforeunload', alertWorker, false);
|
|
64
67
|
this.attachEventListener(document, 'mouseleave', alertWorker, false, false);
|
|
65
68
|
this.attachEventListener(document, 'visibilitychange', alertWorker, false);
|
|
66
69
|
}
|
|
67
70
|
catch (e) {
|
|
68
|
-
this.
|
|
71
|
+
this._debug("worker_start", e);
|
|
69
72
|
}
|
|
70
73
|
}
|
|
71
|
-
|
|
74
|
+
_debug(context, e) {
|
|
72
75
|
if (this.options.__debug_report_edp !== null) {
|
|
73
76
|
fetch(this.options.__debug_report_edp, {
|
|
74
77
|
method: 'POST',
|
|
78
|
+
headers: { 'Content-Type': 'application/json' },
|
|
75
79
|
body: JSON.stringify({
|
|
76
80
|
context,
|
|
77
81
|
error: `${e}`
|
|
78
82
|
})
|
|
79
83
|
});
|
|
80
84
|
}
|
|
85
|
+
if (this.options.__debug_log) {
|
|
86
|
+
warn("OpenReplay errror: ", context, e);
|
|
87
|
+
}
|
|
81
88
|
}
|
|
82
89
|
send(message, urgent = false) {
|
|
83
90
|
if (!this.isActive) {
|
|
@@ -106,12 +113,11 @@ export default class App {
|
|
|
106
113
|
fn.apply(this, args);
|
|
107
114
|
}
|
|
108
115
|
catch (e) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
})));
|
|
116
|
+
this._debug("safe_fn_call", e);
|
|
117
|
+
// time: timestamp(),
|
|
118
|
+
// name: e.name,
|
|
119
|
+
// message: e.message,
|
|
120
|
+
// stack: e.stack
|
|
115
121
|
}
|
|
116
122
|
}; // TODO: correct typing
|
|
117
123
|
}
|
|
@@ -138,7 +144,30 @@ export default class App {
|
|
|
138
144
|
return this._sessionID || undefined;
|
|
139
145
|
}
|
|
140
146
|
getHost() {
|
|
141
|
-
return new URL(this.options.ingestPoint).
|
|
147
|
+
return new URL(this.options.ingestPoint).hostname;
|
|
148
|
+
}
|
|
149
|
+
getProjectKey() {
|
|
150
|
+
return this.projectKey;
|
|
151
|
+
}
|
|
152
|
+
getBaseHref() {
|
|
153
|
+
var _a, _b;
|
|
154
|
+
if (typeof this.options.resourceBaseHref === 'string') {
|
|
155
|
+
return this.options.resourceBaseHref;
|
|
156
|
+
}
|
|
157
|
+
else if (typeof this.options.resourceBaseHref === 'object') {
|
|
158
|
+
//switch between types
|
|
159
|
+
}
|
|
160
|
+
if (document.baseURI) {
|
|
161
|
+
return document.baseURI;
|
|
162
|
+
}
|
|
163
|
+
// IE only
|
|
164
|
+
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;
|
|
165
|
+
}
|
|
166
|
+
resolveResourceURL(resourceURL) {
|
|
167
|
+
const base = new URL(this.getBaseHref());
|
|
168
|
+
base.pathname += "/" + new URL(resourceURL).pathname;
|
|
169
|
+
base.pathname.replace(/\/+/g, "/");
|
|
170
|
+
return base.toString();
|
|
142
171
|
}
|
|
143
172
|
isServiceURL(url) {
|
|
144
173
|
return url.startsWith(this.options.ingestPoint);
|
|
@@ -148,10 +177,10 @@ export default class App {
|
|
|
148
177
|
}
|
|
149
178
|
_start(reset) {
|
|
150
179
|
if (!this.isActive) {
|
|
151
|
-
this.isActive = true;
|
|
152
180
|
if (!this.worker) {
|
|
153
|
-
|
|
181
|
+
return Promise.reject("No worker found: perhaps, CSP is not set.");
|
|
154
182
|
}
|
|
183
|
+
this.isActive = true;
|
|
155
184
|
let pageNo = 0;
|
|
156
185
|
const pageNoStr = sessionStorage.getItem(this.options.session_pageno_key);
|
|
157
186
|
if (pageNoStr != null) {
|
|
@@ -209,7 +238,7 @@ export default class App {
|
|
|
209
238
|
this._sessionID = sessionID;
|
|
210
239
|
}
|
|
211
240
|
if (!this.worker) {
|
|
212
|
-
throw new Error("
|
|
241
|
+
throw new Error("no worker found after start request (this might not happen)");
|
|
213
242
|
}
|
|
214
243
|
this.worker.postMessage({ token, beaconSizeLimit });
|
|
215
244
|
this.startCallbacks.forEach((cb) => cb());
|
|
@@ -224,7 +253,8 @@ export default class App {
|
|
|
224
253
|
})
|
|
225
254
|
.catch(e => {
|
|
226
255
|
this.stop();
|
|
227
|
-
|
|
256
|
+
warn("OpenReplay was unable to start. ", e);
|
|
257
|
+
this._debug("session_start", e);
|
|
228
258
|
throw e;
|
|
229
259
|
});
|
|
230
260
|
}
|
package/lib/app/observer.d.ts
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
import App from './index';
|
|
2
|
+
interface Window extends WindowProxy {
|
|
3
|
+
HTMLInputElement: typeof HTMLInputElement;
|
|
4
|
+
HTMLLinkElement: typeof HTMLLinkElement;
|
|
5
|
+
HTMLStyleElement: typeof HTMLStyleElement;
|
|
6
|
+
SVGStyleElement: typeof SVGStyleElement;
|
|
7
|
+
HTMLIFrameElement: typeof HTMLIFrameElement;
|
|
8
|
+
Text: typeof Text;
|
|
9
|
+
Element: typeof Element;
|
|
10
|
+
}
|
|
2
11
|
export interface Options {
|
|
3
12
|
obscureTextEmails: boolean;
|
|
4
13
|
obscureTextNumbers: boolean;
|
|
14
|
+
captureIFrames: boolean;
|
|
5
15
|
}
|
|
6
16
|
export default class Observer {
|
|
7
17
|
private readonly app;
|
|
18
|
+
private readonly options;
|
|
19
|
+
private readonly context;
|
|
8
20
|
private readonly observer;
|
|
9
21
|
private readonly commited;
|
|
10
22
|
private readonly recents;
|
|
@@ -12,9 +24,10 @@ export default class Observer {
|
|
|
12
24
|
private readonly attributesList;
|
|
13
25
|
private readonly textSet;
|
|
14
26
|
private readonly textMasked;
|
|
15
|
-
|
|
16
|
-
constructor(app: App, opts: Options);
|
|
27
|
+
constructor(app: App, options: Options, context?: Window);
|
|
17
28
|
private clear;
|
|
29
|
+
private isInstance;
|
|
30
|
+
private isIgnored;
|
|
18
31
|
private sendNodeAttribute;
|
|
19
32
|
private sendNodeData;
|
|
20
33
|
private bindNode;
|
|
@@ -23,6 +36,10 @@ export default class Observer {
|
|
|
23
36
|
private _commitNode;
|
|
24
37
|
private commitNode;
|
|
25
38
|
private commitNodes;
|
|
39
|
+
private iframeObservers;
|
|
40
|
+
private handleIframe;
|
|
41
|
+
private observeIframe;
|
|
26
42
|
observe(): void;
|
|
27
43
|
disconnect(): void;
|
|
28
44
|
}
|
|
45
|
+
export {};
|