@openreplay/tracker 3.6.2 → 4.0.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/.eslintignore +8 -0
- package/.prettierignore +1 -0
- package/LICENSE +1 -1
- package/cjs/app/guards.d.ts +2 -1
- package/cjs/app/guards.js +6 -3
- package/cjs/app/index.d.ts +28 -23
- package/cjs/app/index.js +107 -86
- package/cjs/app/logger.js +6 -3
- package/cjs/app/messages.d.ts +52 -0
- package/cjs/app/messages.gen.d.ts +58 -0
- package/cjs/app/messages.gen.js +501 -0
- package/cjs/app/messages.js +234 -0
- package/cjs/app/nodes.d.ts +1 -1
- package/cjs/app/nodes.js +2 -0
- package/cjs/app/observer/iframe_observer.d.ts +1 -1
- package/cjs/app/observer/iframe_observer.js +3 -3
- package/cjs/app/observer/observer.d.ts +2 -3
- package/cjs/app/observer/observer.js +50 -52
- package/cjs/app/observer/shadow_root_observer.d.ts +1 -1
- package/cjs/app/observer/shadow_root_observer.js +3 -3
- package/cjs/app/observer/top_observer.d.ts +13 -2
- package/cjs/app/observer/top_observer.js +58 -23
- package/cjs/app/sanitizer.d.ts +1 -1
- package/cjs/app/sanitizer.js +5 -5
- package/cjs/app/session.d.ts +20 -2
- package/cjs/app/session.js +65 -6
- package/cjs/app/ticker.d.ts +1 -1
- package/cjs/common/{webworker.d.ts → interaction.d.ts} +5 -5
- package/cjs/common/{types.js → interaction.js} +0 -0
- package/cjs/common/messages.gen.d.ts +388 -0
- package/cjs/common/{webworker.js → messages.gen.js} +1 -0
- package/cjs/index.d.ts +10 -9
- package/cjs/index.js +47 -36
- package/cjs/modules/adoptedStyleSheets.d.ts +2 -0
- package/cjs/modules/adoptedStyleSheets.js +127 -0
- package/cjs/modules/connection.d.ts +1 -1
- package/cjs/modules/connection.js +2 -2
- package/cjs/modules/console.d.ts +1 -1
- package/cjs/modules/console.js +7 -21
- package/cjs/modules/cssrules.d.ts +1 -1
- package/cjs/modules/cssrules.js +18 -14
- package/cjs/modules/exception.d.ts +3 -3
- package/cjs/modules/exception.js +23 -18
- package/cjs/modules/img.d.ts +1 -1
- package/cjs/modules/img.js +39 -26
- package/cjs/modules/input.d.ts +1 -1
- package/cjs/modules/input.js +21 -21
- package/cjs/modules/mouse.d.ts +1 -1
- package/cjs/modules/mouse.js +50 -43
- package/cjs/modules/performance.d.ts +1 -1
- package/cjs/modules/performance.js +2 -2
- package/cjs/modules/scroll.d.ts +1 -1
- package/cjs/modules/scroll.js +16 -7
- package/cjs/modules/timing.d.ts +1 -1
- package/cjs/modules/timing.js +14 -26
- package/cjs/modules/viewport.d.ts +1 -1
- package/cjs/modules/viewport.js +4 -4
- package/cjs/utils.js +7 -7
- package/cjs/vendors/finder/finder.js +53 -48
- package/lib/app/guards.d.ts +2 -1
- package/lib/app/guards.js +4 -2
- package/lib/app/index.d.ts +28 -23
- package/lib/app/index.js +115 -94
- package/lib/app/logger.js +6 -3
- package/lib/app/messages.d.ts +52 -0
- package/lib/app/messages.gen.d.ts +58 -0
- package/lib/app/messages.gen.js +441 -0
- package/lib/app/messages.js +181 -0
- package/lib/app/nodes.d.ts +1 -1
- package/lib/app/nodes.js +2 -0
- package/lib/app/observer/iframe_observer.d.ts +1 -1
- package/lib/app/observer/iframe_observer.js +3 -3
- package/lib/app/observer/observer.d.ts +2 -3
- package/lib/app/observer/observer.js +51 -53
- package/lib/app/observer/shadow_root_observer.d.ts +1 -1
- package/lib/app/observer/shadow_root_observer.js +3 -3
- package/lib/app/observer/top_observer.d.ts +13 -2
- package/lib/app/observer/top_observer.js +62 -27
- package/lib/app/sanitizer.d.ts +1 -1
- package/lib/app/sanitizer.js +7 -7
- package/lib/app/session.d.ts +20 -2
- package/lib/app/session.js +65 -6
- package/lib/app/ticker.d.ts +1 -1
- package/lib/common/{webworker.d.ts → interaction.d.ts} +5 -5
- package/lib/common/{types.js → interaction.js} +0 -0
- package/lib/common/messages.gen.d.ts +388 -0
- package/lib/common/messages.gen.js +2 -0
- package/lib/common/tsconfig.tsbuildinfo +1 -1
- package/lib/index.d.ts +10 -9
- package/lib/index.js +60 -49
- package/lib/modules/adoptedStyleSheets.d.ts +2 -0
- package/lib/modules/adoptedStyleSheets.js +124 -0
- package/lib/modules/connection.d.ts +1 -1
- package/lib/modules/connection.js +2 -2
- package/lib/modules/console.d.ts +1 -1
- package/lib/modules/console.js +8 -22
- package/lib/modules/cssrules.d.ts +1 -1
- package/lib/modules/cssrules.js +19 -15
- package/lib/modules/exception.d.ts +3 -3
- package/lib/modules/exception.js +23 -18
- package/lib/modules/img.d.ts +1 -1
- package/lib/modules/img.js +41 -28
- package/lib/modules/input.d.ts +1 -1
- package/lib/modules/input.js +23 -23
- package/lib/modules/mouse.d.ts +1 -1
- package/lib/modules/mouse.js +53 -46
- package/lib/modules/performance.d.ts +1 -1
- package/lib/modules/performance.js +3 -3
- package/lib/modules/scroll.d.ts +1 -1
- package/lib/modules/scroll.js +17 -8
- package/lib/modules/timing.d.ts +1 -1
- package/lib/modules/timing.js +16 -28
- package/lib/modules/viewport.d.ts +1 -1
- package/lib/modules/viewport.js +4 -4
- package/lib/utils.js +7 -7
- package/lib/vendors/finder/finder.js +53 -48
- package/package.json +27 -10
- package/cjs/common/messages.d.ts +0 -444
- package/cjs/common/messages.js +0 -794
- package/cjs/common/types.d.ts +0 -9
- package/cjs/modules/longtasks.d.ts +0 -2
- package/cjs/modules/longtasks.js +0 -26
- package/lib/common/messages.d.ts +0 -444
- package/lib/common/messages.js +0 -790
- package/lib/common/types.d.ts +0 -9
- package/lib/common/webworker.js +0 -1
- package/lib/modules/longtasks.d.ts +0 -2
- package/lib/modules/longtasks.js +0 -23
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const messages_gen_js_1 = require("../app/messages.gen.js");
|
|
4
|
+
const guards_js_1 = require("../app/guards.js");
|
|
5
|
+
function hasAdoptedSS(node) {
|
|
6
|
+
return ((0, guards_js_1.isRootNode)(node) &&
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
!!node.adoptedStyleSheets);
|
|
9
|
+
}
|
|
10
|
+
function default_1(app) {
|
|
11
|
+
if (app === null) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
if (!hasAdoptedSS(document)) {
|
|
15
|
+
app.attachStartCallback(() => {
|
|
16
|
+
// MBTODO: pre-start sendQueue app
|
|
17
|
+
app.send((0, messages_gen_js_1.TechnicalInfo)('no_adopted_stylesheets', ''));
|
|
18
|
+
});
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
let nextID = 0xf;
|
|
22
|
+
const styleSheetIDMap = new Map();
|
|
23
|
+
const adoptedStyleSheetsOwnings = new Map();
|
|
24
|
+
const updateAdoptedStyleSheets = (root) => {
|
|
25
|
+
let nodeID = app.nodes.getID(root);
|
|
26
|
+
if (root === document) {
|
|
27
|
+
nodeID = 0; // main document doesn't have nodeID. ID count starts from the documentElement
|
|
28
|
+
}
|
|
29
|
+
if (!nodeID) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
let pastOwning = adoptedStyleSheetsOwnings.get(nodeID);
|
|
33
|
+
if (!pastOwning) {
|
|
34
|
+
pastOwning = [];
|
|
35
|
+
}
|
|
36
|
+
const nowOwning = [];
|
|
37
|
+
const styleSheets = root.adoptedStyleSheets;
|
|
38
|
+
for (const s of styleSheets) {
|
|
39
|
+
let sheetID = styleSheetIDMap.get(s);
|
|
40
|
+
const init = !sheetID;
|
|
41
|
+
if (!sheetID) {
|
|
42
|
+
sheetID = ++nextID;
|
|
43
|
+
}
|
|
44
|
+
nowOwning.push(sheetID);
|
|
45
|
+
if (!pastOwning.includes(sheetID)) {
|
|
46
|
+
app.send((0, messages_gen_js_1.AdoptedSSAddOwner)(sheetID, nodeID));
|
|
47
|
+
}
|
|
48
|
+
if (init) {
|
|
49
|
+
const rules = s.cssRules;
|
|
50
|
+
for (let i = 0; i < rules.length; i++) {
|
|
51
|
+
app.send((0, messages_gen_js_1.AdoptedSSInsertRuleURLBased)(sheetID, rules[i].cssText, i, app.getBaseHref()));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
for (const sheetID of pastOwning) {
|
|
56
|
+
if (!nowOwning.includes(sheetID)) {
|
|
57
|
+
app.send((0, messages_gen_js_1.AdoptedSSRemoveOwner)(sheetID, nodeID));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
adoptedStyleSheetsOwnings.set(nodeID, nowOwning);
|
|
61
|
+
};
|
|
62
|
+
function patchAdoptedStyleSheets(prototype) {
|
|
63
|
+
const nativeAdoptedStyleSheetsDescriptor = Object.getOwnPropertyDescriptor(prototype, 'adoptedStyleSheets');
|
|
64
|
+
if (nativeAdoptedStyleSheetsDescriptor) {
|
|
65
|
+
Object.defineProperty(prototype, 'adoptedStyleSheets', Object.assign(Object.assign({}, nativeAdoptedStyleSheetsDescriptor), { set: function (value) {
|
|
66
|
+
// @ts-ignore
|
|
67
|
+
const retVal = nativeAdoptedStyleSheetsDescriptor.set.call(this, value);
|
|
68
|
+
updateAdoptedStyleSheets(this);
|
|
69
|
+
return retVal;
|
|
70
|
+
} }));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const patchContext = (context) => {
|
|
74
|
+
patchAdoptedStyleSheets(context.Document.prototype);
|
|
75
|
+
patchAdoptedStyleSheets(context.ShadowRoot.prototype);
|
|
76
|
+
//@ts-ignore TODO: configure ts (use necessary lib)
|
|
77
|
+
const { insertRule, deleteRule, replace, replaceSync } = context.CSSStyleSheet.prototype;
|
|
78
|
+
//@ts-ignore
|
|
79
|
+
context.CSSStyleSheet.prototype.replace = function (text) {
|
|
80
|
+
return replace.call(this, text).then((sheet) => {
|
|
81
|
+
const sheetID = styleSheetIDMap.get(this);
|
|
82
|
+
if (sheetID) {
|
|
83
|
+
app.send((0, messages_gen_js_1.AdoptedSSReplaceURLBased)(sheetID, text, app.getBaseHref()));
|
|
84
|
+
}
|
|
85
|
+
return sheet;
|
|
86
|
+
});
|
|
87
|
+
};
|
|
88
|
+
//@ts-ignore
|
|
89
|
+
context.CSSStyleSheet.prototype.replaceSync = function (text) {
|
|
90
|
+
const sheetID = styleSheetIDMap.get(this);
|
|
91
|
+
if (sheetID) {
|
|
92
|
+
app.send((0, messages_gen_js_1.AdoptedSSReplaceURLBased)(sheetID, text, app.getBaseHref()));
|
|
93
|
+
}
|
|
94
|
+
return replaceSync.call(this, text);
|
|
95
|
+
};
|
|
96
|
+
context.CSSStyleSheet.prototype.insertRule = function (rule, index = 0) {
|
|
97
|
+
const sheetID = styleSheetIDMap.get(this);
|
|
98
|
+
if (sheetID) {
|
|
99
|
+
app.send((0, messages_gen_js_1.AdoptedSSInsertRuleURLBased)(sheetID, rule, index, app.getBaseHref()));
|
|
100
|
+
}
|
|
101
|
+
return insertRule.call(this, rule, index);
|
|
102
|
+
};
|
|
103
|
+
context.CSSStyleSheet.prototype.deleteRule = function (index) {
|
|
104
|
+
const sheetID = styleSheetIDMap.get(this);
|
|
105
|
+
if (sheetID) {
|
|
106
|
+
app.send((0, messages_gen_js_1.AdoptedSSDeleteRule)(sheetID, index));
|
|
107
|
+
}
|
|
108
|
+
return deleteRule.call(this, index);
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
patchContext(window);
|
|
112
|
+
app.observer.attachContextCallback(patchContext);
|
|
113
|
+
app.attachStopCallback(() => {
|
|
114
|
+
styleSheetIDMap.clear();
|
|
115
|
+
adoptedStyleSheetsOwnings.clear();
|
|
116
|
+
});
|
|
117
|
+
// So far main Document is not triggered with nodeCallbacks
|
|
118
|
+
app.attachStartCallback(() => {
|
|
119
|
+
updateAdoptedStyleSheets(document);
|
|
120
|
+
});
|
|
121
|
+
app.nodes.attachNodeCallback((node) => {
|
|
122
|
+
if (hasAdoptedSS(node)) {
|
|
123
|
+
updateAdoptedStyleSheets(node);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
exports.default = default_1;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import App from
|
|
1
|
+
import App from '../app/index.js';
|
|
2
2
|
export default function (app: App): void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const messages_gen_js_1 = require("../app/messages.gen.js");
|
|
4
4
|
function default_1(app) {
|
|
5
5
|
const connection = navigator.connection ||
|
|
6
6
|
navigator.mozConnection ||
|
|
@@ -8,7 +8,7 @@ function default_1(app) {
|
|
|
8
8
|
if (connection === undefined) {
|
|
9
9
|
return;
|
|
10
10
|
}
|
|
11
|
-
const sendConnectionInformation = () => app.send(
|
|
11
|
+
const sendConnectionInformation = () => app.send((0, messages_gen_js_1.ConnectionInformation)(Math.round(connection.downlink * 1000), connection.type || 'unknown'));
|
|
12
12
|
sendConnectionInformation();
|
|
13
13
|
connection.addEventListener('change', sendConnectionInformation);
|
|
14
14
|
}
|
package/cjs/modules/console.d.ts
CHANGED
package/cjs/modules/console.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const guards_js_1 = require("../app/guards.js");
|
|
4
3
|
const utils_js_1 = require("../utils.js");
|
|
5
|
-
const
|
|
4
|
+
const messages_gen_js_1 = require("../app/messages.gen.js");
|
|
6
5
|
const printError = utils_js_1.IN_BROWSER && 'InstallTrigger' in window // detect Firefox
|
|
7
6
|
? (e) => e.message + '\n' + e.stack
|
|
8
7
|
: (e) => e.stack || e.message;
|
|
@@ -89,11 +88,10 @@ function default_1(app, opts) {
|
|
|
89
88
|
consoleMethods,
|
|
90
89
|
consoleThrottling: 30,
|
|
91
90
|
}, opts);
|
|
92
|
-
if (!Array.isArray(options.consoleMethods) ||
|
|
93
|
-
options.consoleMethods.length === 0) {
|
|
91
|
+
if (!Array.isArray(options.consoleMethods) || options.consoleMethods.length === 0) {
|
|
94
92
|
return;
|
|
95
93
|
}
|
|
96
|
-
const sendConsoleLog = app.safe((level, args) => app.send(
|
|
94
|
+
const sendConsoleLog = app.safe((level, args) => app.send((0, messages_gen_js_1.ConsoleLog)(level, printf(args))));
|
|
97
95
|
let n;
|
|
98
96
|
const reset = () => {
|
|
99
97
|
n = 0;
|
|
@@ -102,7 +100,7 @@ function default_1(app, opts) {
|
|
|
102
100
|
app.ticker.attach(reset, 33, false);
|
|
103
101
|
const patchConsole = (console) => options.consoleMethods.forEach((method) => {
|
|
104
102
|
if (consoleMethods.indexOf(method) === -1) {
|
|
105
|
-
|
|
103
|
+
app.debug.error(`OpenReplay: unsupported console method "${method}"`);
|
|
106
104
|
return;
|
|
107
105
|
}
|
|
108
106
|
const fn = console[method];
|
|
@@ -114,20 +112,8 @@ function default_1(app, opts) {
|
|
|
114
112
|
sendConsoleLog(method, args);
|
|
115
113
|
};
|
|
116
114
|
});
|
|
117
|
-
patchConsole(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
let context = node.contentWindow;
|
|
121
|
-
if (context) {
|
|
122
|
-
patchConsole(context.console);
|
|
123
|
-
}
|
|
124
|
-
app.attachEventListener(node, "load", () => {
|
|
125
|
-
if (node.contentWindow !== context) {
|
|
126
|
-
context = node.contentWindow;
|
|
127
|
-
patchConsole(context.console);
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
}));
|
|
115
|
+
const patchContext = app.safe((context) => patchConsole(context.console));
|
|
116
|
+
patchContext(window);
|
|
117
|
+
app.observer.attachContextCallback(patchContext);
|
|
132
118
|
}
|
|
133
119
|
exports.default = default_1;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type App from
|
|
1
|
+
import type App from '../app/index.js';
|
|
2
2
|
export default function (app: App | null): void;
|
package/cjs/modules/cssrules.js
CHANGED
|
@@ -1,39 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const messages_gen_js_1 = require("../app/messages.gen.js");
|
|
4
4
|
const guards_js_1 = require("../app/guards.js");
|
|
5
5
|
function default_1(app) {
|
|
6
6
|
if (app === null) {
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
9
9
|
if (!window.CSSStyleSheet) {
|
|
10
|
-
app.send(
|
|
10
|
+
app.send((0, messages_gen_js_1.TechnicalInfo)('no_stylesheet_prototype_in_window', ''));
|
|
11
11
|
return;
|
|
12
12
|
}
|
|
13
13
|
const processOperation = app.safe((stylesheet, index, rule) => {
|
|
14
14
|
const sendMessage = typeof rule === 'string'
|
|
15
|
-
? (nodeID) => app.send(
|
|
16
|
-
: (nodeID) => app.send(
|
|
15
|
+
? (nodeID) => app.send((0, messages_gen_js_1.CSSInsertRuleURLBased)(nodeID, rule, index, app.getBaseHref()))
|
|
16
|
+
: (nodeID) => app.send((0, messages_gen_js_1.CSSDeleteRule)(nodeID, index));
|
|
17
17
|
// TODO: Extend messages to maintain nested rules (CSSGroupingRule prototype, as well as CSSKeyframesRule)
|
|
18
18
|
if (stylesheet.ownerNode == null) {
|
|
19
|
-
throw new Error(
|
|
19
|
+
throw new Error('Owner Node not found');
|
|
20
20
|
}
|
|
21
21
|
const nodeID = app.nodes.getID(stylesheet.ownerNode);
|
|
22
22
|
if (nodeID !== undefined) {
|
|
23
23
|
sendMessage(nodeID);
|
|
24
24
|
} // else error?
|
|
25
25
|
});
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
const patchContext = (context) => {
|
|
27
|
+
const { insertRule, deleteRule } = context.CSSStyleSheet.prototype;
|
|
28
|
+
context.CSSStyleSheet.prototype.insertRule = function (rule, index = 0) {
|
|
29
|
+
processOperation(this, index, rule);
|
|
30
|
+
return insertRule.call(this, rule, index);
|
|
31
|
+
};
|
|
32
|
+
context.CSSStyleSheet.prototype.deleteRule = function (index) {
|
|
33
|
+
processOperation(this, index);
|
|
34
|
+
return deleteRule.call(this, index);
|
|
35
|
+
};
|
|
34
36
|
};
|
|
37
|
+
patchContext(window);
|
|
38
|
+
app.observer.attachContextCallback(patchContext);
|
|
35
39
|
app.nodes.attachNodeCallback((node) => {
|
|
36
|
-
if (!(0, guards_js_1.hasTag)(node,
|
|
40
|
+
if (!(0, guards_js_1.hasTag)(node, 'STYLE') || !node.sheet) {
|
|
37
41
|
return;
|
|
38
42
|
}
|
|
39
43
|
if (node.textContent !== null && node.textContent.trim().length > 0) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type App from
|
|
2
|
-
import type Message from
|
|
1
|
+
import type App from '../app/index.js';
|
|
2
|
+
import type Message from '../app/messages.gen.js';
|
|
3
3
|
export interface Options {
|
|
4
4
|
captureExceptions: boolean;
|
|
5
5
|
}
|
|
@@ -11,6 +11,6 @@ interface StackFrame {
|
|
|
11
11
|
source?: string;
|
|
12
12
|
}
|
|
13
13
|
export declare function getExceptionMessage(error: Error, fallbackStack: Array<StackFrame>): Message;
|
|
14
|
-
export declare function getExceptionMessageFromEvent(e: ErrorEvent | PromiseRejectionEvent): Message | null;
|
|
14
|
+
export declare function getExceptionMessageFromEvent(e: ErrorEvent | PromiseRejectionEvent, context?: typeof globalThis): Message | null;
|
|
15
15
|
export default function (app: App, opts: Partial<Options>): void;
|
|
16
16
|
export {};
|
package/cjs/modules/exception.js
CHANGED
|
@@ -1,28 +1,29 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getExceptionMessageFromEvent = exports.getExceptionMessage = void 0;
|
|
4
|
-
const
|
|
4
|
+
const messages_gen_js_1 = require("../app/messages.gen.js");
|
|
5
5
|
const error_stack_parser_1 = require("error-stack-parser");
|
|
6
6
|
function getDefaultStack(e) {
|
|
7
|
-
return [
|
|
7
|
+
return [
|
|
8
|
+
{
|
|
8
9
|
columnNumber: e.colno,
|
|
9
10
|
lineNumber: e.lineno,
|
|
10
11
|
fileName: e.filename,
|
|
11
|
-
functionName:
|
|
12
|
-
source:
|
|
13
|
-
}
|
|
12
|
+
functionName: '',
|
|
13
|
+
source: '',
|
|
14
|
+
},
|
|
15
|
+
];
|
|
14
16
|
}
|
|
15
17
|
function getExceptionMessage(error, fallbackStack) {
|
|
16
18
|
let stack = fallbackStack;
|
|
17
19
|
try {
|
|
18
20
|
stack = error_stack_parser_1.default.parse(error);
|
|
19
21
|
}
|
|
20
|
-
catch (e) {
|
|
21
|
-
|
|
22
|
-
return new messages_js_1.JSException(error.name, error.message, JSON.stringify(stack));
|
|
22
|
+
catch (e) { }
|
|
23
|
+
return (0, messages_gen_js_1.JSException)(error.name, error.message, JSON.stringify(stack));
|
|
23
24
|
}
|
|
24
25
|
exports.getExceptionMessage = getExceptionMessage;
|
|
25
|
-
function getExceptionMessageFromEvent(e) {
|
|
26
|
+
function getExceptionMessageFromEvent(e, context = window) {
|
|
26
27
|
if (e instanceof ErrorEvent) {
|
|
27
28
|
if (e.error instanceof Error) {
|
|
28
29
|
return getExceptionMessage(e.error, getDefaultStack(e));
|
|
@@ -33,10 +34,10 @@ function getExceptionMessageFromEvent(e) {
|
|
|
33
34
|
name = 'Error';
|
|
34
35
|
message = e.message;
|
|
35
36
|
}
|
|
36
|
-
return
|
|
37
|
+
return (0, messages_gen_js_1.JSException)(name, message, JSON.stringify(getDefaultStack(e)));
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
|
-
else if ('PromiseRejectionEvent' in
|
|
40
|
+
else if ('PromiseRejectionEvent' in context && e instanceof context.PromiseRejectionEvent) {
|
|
40
41
|
if (e.reason instanceof Error) {
|
|
41
42
|
return getExceptionMessage(e.reason, []);
|
|
42
43
|
}
|
|
@@ -48,7 +49,7 @@ function getExceptionMessageFromEvent(e) {
|
|
|
48
49
|
catch (_) {
|
|
49
50
|
message = String(e.reason);
|
|
50
51
|
}
|
|
51
|
-
return
|
|
52
|
+
return (0, messages_gen_js_1.JSException)('Unhandled Promise Rejection', message, '[]');
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
return null;
|
|
@@ -58,15 +59,19 @@ function default_1(app, opts) {
|
|
|
58
59
|
const options = Object.assign({
|
|
59
60
|
captureExceptions: true,
|
|
60
61
|
}, opts);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
const msg = getExceptionMessageFromEvent(e);
|
|
62
|
+
function patchContext(context) {
|
|
63
|
+
function handler(e) {
|
|
64
|
+
const msg = getExceptionMessageFromEvent(e, context);
|
|
64
65
|
if (msg != null) {
|
|
65
66
|
app.send(msg);
|
|
66
67
|
}
|
|
67
|
-
}
|
|
68
|
-
app.attachEventListener(
|
|
69
|
-
app.attachEventListener(
|
|
68
|
+
}
|
|
69
|
+
app.attachEventListener(context, 'unhandledrejection', handler);
|
|
70
|
+
app.attachEventListener(context, 'error', handler);
|
|
71
|
+
}
|
|
72
|
+
if (options.captureExceptions) {
|
|
73
|
+
app.observer.attachContextCallback(patchContext);
|
|
74
|
+
patchContext(window);
|
|
70
75
|
}
|
|
71
76
|
}
|
|
72
77
|
exports.default = default_1;
|
package/cjs/modules/img.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type App from
|
|
1
|
+
import type App from '../app/index.js';
|
|
2
2
|
export default function (app: App): void;
|
package/cjs/modules/img.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const utils_js_1 = require("../utils.js");
|
|
4
|
-
const
|
|
4
|
+
const messages_gen_js_1 = require("../app/messages.gen.js");
|
|
5
5
|
const guards_js_1 = require("../app/guards.js");
|
|
6
6
|
function resolveURL(url, location = document.location) {
|
|
7
7
|
url = url.trim();
|
|
@@ -18,19 +18,34 @@ function resolveURL(url, location = document.location) {
|
|
|
18
18
|
return location.origin + location.pathname + url;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
const PLACEHOLDER_SRC =
|
|
21
|
+
const PLACEHOLDER_SRC = 'https://static.openreplay.com/tracker/placeholder.jpeg';
|
|
22
22
|
function default_1(app) {
|
|
23
23
|
function sendPlaceholder(id, node) {
|
|
24
|
-
app.send(
|
|
24
|
+
app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'src', PLACEHOLDER_SRC));
|
|
25
25
|
const { width, height } = node.getBoundingClientRect();
|
|
26
|
-
if (!node.hasAttribute(
|
|
27
|
-
app.send(
|
|
26
|
+
if (!node.hasAttribute('width')) {
|
|
27
|
+
app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'width', String(width)));
|
|
28
28
|
}
|
|
29
|
-
if (!node.hasAttribute(
|
|
30
|
-
app.send(
|
|
29
|
+
if (!node.hasAttribute('height')) {
|
|
30
|
+
app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'height', String(height)));
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
const
|
|
33
|
+
const sendSrcset = function (id, img) {
|
|
34
|
+
const { srcset } = img;
|
|
35
|
+
if (!srcset) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const resolvedSrcset = srcset
|
|
39
|
+
.split(',')
|
|
40
|
+
.map((str) => resolveURL(str))
|
|
41
|
+
.join(',');
|
|
42
|
+
app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'srcset', resolvedSrcset));
|
|
43
|
+
};
|
|
44
|
+
const sendSrc = function (id, img) {
|
|
45
|
+
const src = img.src;
|
|
46
|
+
app.send((0, messages_gen_js_1.SetNodeAttributeURLBased)(id, 'src', src, app.getBaseHref()));
|
|
47
|
+
};
|
|
48
|
+
const sendImgAttrs = app.safe(function () {
|
|
34
49
|
const id = app.nodes.getID(this);
|
|
35
50
|
if (id === undefined) {
|
|
36
51
|
return;
|
|
@@ -42,47 +57,45 @@ function default_1(app) {
|
|
|
42
57
|
const resolvedSrc = resolveURL(src || ''); // Src type is null sometimes. - is it true?
|
|
43
58
|
if (naturalWidth === 0 && naturalHeight === 0) {
|
|
44
59
|
if ((0, utils_js_1.isURL)(resolvedSrc)) {
|
|
45
|
-
app.send(
|
|
60
|
+
app.send((0, messages_gen_js_1.ResourceTiming)((0, utils_js_1.timestamp)(), 0, 0, 0, 0, 0, resolvedSrc, 'img'));
|
|
46
61
|
}
|
|
47
62
|
}
|
|
48
63
|
else if (resolvedSrc.length >= 1e5 || app.sanitizer.isMasked(id)) {
|
|
49
64
|
sendPlaceholder(id, this);
|
|
50
65
|
}
|
|
51
66
|
else {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const resolvedSrcset = srcset.split(',').map(str => resolveURL(str)).join(',');
|
|
55
|
-
app.send(new messages_js_1.SetNodeAttribute(id, 'srcset', resolvedSrcset));
|
|
56
|
-
}
|
|
67
|
+
sendSrc(id, this);
|
|
68
|
+
sendSrcset(id, this);
|
|
57
69
|
}
|
|
58
70
|
});
|
|
59
71
|
const observer = new MutationObserver((mutations) => {
|
|
60
72
|
for (const mutation of mutations) {
|
|
61
|
-
if (mutation.type ===
|
|
73
|
+
if (mutation.type === 'attributes') {
|
|
62
74
|
const target = mutation.target;
|
|
63
75
|
const id = app.nodes.getID(target);
|
|
64
76
|
if (id === undefined) {
|
|
65
77
|
return;
|
|
66
78
|
}
|
|
67
|
-
if (mutation.attributeName ===
|
|
68
|
-
|
|
69
|
-
app.send(new messages_js_1.SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref()));
|
|
79
|
+
if (mutation.attributeName === 'src') {
|
|
80
|
+
sendSrc(id, target);
|
|
70
81
|
}
|
|
71
|
-
if (mutation.attributeName ===
|
|
72
|
-
|
|
73
|
-
app.send(new messages_js_1.SetNodeAttribute(id, 'srcset', srcset));
|
|
82
|
+
if (mutation.attributeName === 'srcset') {
|
|
83
|
+
sendSrcset(id, target);
|
|
74
84
|
}
|
|
75
85
|
}
|
|
76
86
|
}
|
|
77
87
|
});
|
|
88
|
+
app.attachStopCallback(() => {
|
|
89
|
+
observer.disconnect();
|
|
90
|
+
});
|
|
78
91
|
app.nodes.attachNodeCallback((node) => {
|
|
79
|
-
if (!(0, guards_js_1.hasTag)(node,
|
|
92
|
+
if (!(0, guards_js_1.hasTag)(node, 'IMG')) {
|
|
80
93
|
return;
|
|
81
94
|
}
|
|
82
|
-
app.nodes.attachElementListener('error', node,
|
|
83
|
-
app.nodes.attachElementListener('load', node,
|
|
84
|
-
|
|
85
|
-
observer.observe(node, { attributes: true, attributeFilter: [
|
|
95
|
+
app.nodes.attachElementListener('error', node, sendImgAttrs.bind(node));
|
|
96
|
+
app.nodes.attachElementListener('load', node, sendImgAttrs.bind(node));
|
|
97
|
+
sendImgAttrs.call(node);
|
|
98
|
+
observer.observe(node, { attributes: true, attributeFilter: ['src', 'srcset'] });
|
|
86
99
|
});
|
|
87
100
|
}
|
|
88
101
|
exports.default = default_1;
|
package/cjs/modules/input.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type App from
|
|
1
|
+
import type App from '../app/index.js';
|
|
2
2
|
declare type TextEditableElement = HTMLInputElement | HTMLTextAreaElement;
|
|
3
3
|
export declare function getInputLabel(node: TextEditableElement): string;
|
|
4
4
|
export declare const enum InputMode {
|
package/cjs/modules/input.js
CHANGED
|
@@ -3,19 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.getInputLabel = void 0;
|
|
4
4
|
const utils_js_1 = require("../utils.js");
|
|
5
5
|
const guards_js_1 = require("../app/guards.js");
|
|
6
|
-
const
|
|
6
|
+
const messages_gen_js_1 = require("../app/messages.gen.js");
|
|
7
7
|
const INPUT_TYPES = ['text', 'password', 'email', 'search', 'number', 'range', 'date'];
|
|
8
8
|
function isTextEditable(node) {
|
|
9
|
-
if ((0, guards_js_1.hasTag)(node,
|
|
9
|
+
if ((0, guards_js_1.hasTag)(node, 'TEXTAREA')) {
|
|
10
10
|
return true;
|
|
11
11
|
}
|
|
12
|
-
if (!(0, guards_js_1.hasTag)(node,
|
|
12
|
+
if (!(0, guards_js_1.hasTag)(node, 'INPUT')) {
|
|
13
13
|
return false;
|
|
14
14
|
}
|
|
15
15
|
return INPUT_TYPES.includes(node.type);
|
|
16
16
|
}
|
|
17
17
|
function isCheckable(node) {
|
|
18
|
-
if (!(0, guards_js_1.hasTag)(node,
|
|
18
|
+
if (!(0, guards_js_1.hasTag)(node, 'INPUT')) {
|
|
19
19
|
return false;
|
|
20
20
|
}
|
|
21
21
|
const type = node.type;
|
|
@@ -25,7 +25,7 @@ const labelElementFor = utils_js_1.IN_BROWSER && 'labels' in HTMLInputElement.pr
|
|
|
25
25
|
? (node) => {
|
|
26
26
|
let p = node;
|
|
27
27
|
while ((p = p.parentNode) !== null) {
|
|
28
|
-
if ((0, guards_js_1.hasTag)(p,
|
|
28
|
+
if ((0, guards_js_1.hasTag)(p, 'LABEL')) {
|
|
29
29
|
return p;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -37,13 +37,13 @@ const labelElementFor = utils_js_1.IN_BROWSER && 'labels' in HTMLInputElement.pr
|
|
|
37
37
|
: (node) => {
|
|
38
38
|
let p = node;
|
|
39
39
|
while ((p = p.parentNode) !== null) {
|
|
40
|
-
if ((0, guards_js_1.hasTag)(p,
|
|
40
|
+
if ((0, guards_js_1.hasTag)(p, 'LABEL')) {
|
|
41
41
|
return p;
|
|
42
42
|
}
|
|
43
43
|
}
|
|
44
44
|
const id = node.id;
|
|
45
45
|
if (id) {
|
|
46
|
-
const labels =
|
|
46
|
+
const labels = node.ownerDocument.querySelectorAll('label[for="' + id + '"]');
|
|
47
47
|
if (labels !== null && labels.length === 1) {
|
|
48
48
|
return labels[0];
|
|
49
49
|
}
|
|
@@ -53,12 +53,13 @@ function getInputLabel(node) {
|
|
|
53
53
|
let label = (0, utils_js_1.getLabelAttribute)(node);
|
|
54
54
|
if (label === null) {
|
|
55
55
|
const labelElement = labelElementFor(node);
|
|
56
|
-
label =
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
56
|
+
label =
|
|
57
|
+
(labelElement && labelElement.innerText) ||
|
|
58
|
+
node.placeholder ||
|
|
59
|
+
node.name ||
|
|
60
|
+
node.id ||
|
|
61
|
+
node.className ||
|
|
62
|
+
node.type;
|
|
62
63
|
}
|
|
63
64
|
return (0, utils_js_1.normSpaces)(label).slice(0, 100);
|
|
64
65
|
}
|
|
@@ -73,7 +74,7 @@ function default_1(app, opts) {
|
|
|
73
74
|
function sendInputTarget(id, node) {
|
|
74
75
|
const label = getInputLabel(node);
|
|
75
76
|
if (label !== '') {
|
|
76
|
-
app.send(
|
|
77
|
+
app.send((0, messages_gen_js_1.SetInputTarget)(id, label));
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
function sendInputValue(id, node) {
|
|
@@ -86,8 +87,7 @@ function default_1(app, opts) {
|
|
|
86
87
|
(inputMode === 0 /* Plain */ &&
|
|
87
88
|
((options.obscureInputNumbers && node.type !== 'date' && /\d\d\d\d/.test(value)) ||
|
|
88
89
|
(options.obscureInputDates && node.type === 'date') ||
|
|
89
|
-
(options.obscureInputEmails &&
|
|
90
|
-
(node.type === 'email' || !!~value.indexOf('@')))))) {
|
|
90
|
+
(options.obscureInputEmails && (node.type === 'email' || !!~value.indexOf('@')))))) {
|
|
91
91
|
inputMode = 1 /* Obscured */;
|
|
92
92
|
}
|
|
93
93
|
let mask = 0;
|
|
@@ -101,7 +101,7 @@ function default_1(app, opts) {
|
|
|
101
101
|
value = '';
|
|
102
102
|
break;
|
|
103
103
|
}
|
|
104
|
-
app.send(
|
|
104
|
+
app.send((0, messages_gen_js_1.SetInputValue)(id, value, mask));
|
|
105
105
|
}
|
|
106
106
|
const inputValues = new Map();
|
|
107
107
|
const checkableValues = new Map();
|
|
@@ -139,7 +139,7 @@ function default_1(app, opts) {
|
|
|
139
139
|
}
|
|
140
140
|
if (checked !== node.checked) {
|
|
141
141
|
checkableValues.set(id, node.checked);
|
|
142
|
-
app.send(
|
|
142
|
+
app.send((0, messages_gen_js_1.SetInputChecked)(id, node.checked));
|
|
143
143
|
}
|
|
144
144
|
});
|
|
145
145
|
});
|
|
@@ -150,9 +150,9 @@ function default_1(app, opts) {
|
|
|
150
150
|
return;
|
|
151
151
|
}
|
|
152
152
|
// TODO: support multiple select (?): use selectedOptions; Need send target?
|
|
153
|
-
if ((0, guards_js_1.hasTag)(node,
|
|
153
|
+
if ((0, guards_js_1.hasTag)(node, 'SELECT')) {
|
|
154
154
|
sendInputValue(id, node);
|
|
155
|
-
app.attachEventListener(node,
|
|
155
|
+
app.attachEventListener(node, 'change', () => {
|
|
156
156
|
sendInputValue(id, node);
|
|
157
157
|
});
|
|
158
158
|
}
|
|
@@ -163,7 +163,7 @@ function default_1(app, opts) {
|
|
|
163
163
|
}
|
|
164
164
|
if (isCheckable(node)) {
|
|
165
165
|
checkableValues.set(id, node.checked);
|
|
166
|
-
app.send(
|
|
166
|
+
app.send((0, messages_gen_js_1.SetInputChecked)(id, node.checked));
|
|
167
167
|
return;
|
|
168
168
|
}
|
|
169
169
|
}));
|
package/cjs/modules/mouse.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type App from
|
|
1
|
+
import type App from '../app/index.js';
|
|
2
2
|
export default function (app: App): void;
|