@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
|
File without changes
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import Message from './messages.gen.js';
|
|
2
1
|
export interface Options {
|
|
3
2
|
connAttemptCount?: number;
|
|
4
3
|
connAttemptGap?: number;
|
|
@@ -8,12 +7,13 @@ declare type Start = {
|
|
|
8
7
|
ingestPoint: string;
|
|
9
8
|
pageNo: number;
|
|
10
9
|
timestamp: number;
|
|
11
|
-
url: string;
|
|
12
10
|
} & Options;
|
|
13
11
|
declare type Auth = {
|
|
14
12
|
type: 'auth';
|
|
15
13
|
token: string;
|
|
16
14
|
beaconSizeLimit?: number;
|
|
17
15
|
};
|
|
18
|
-
export declare type WorkerMessageData = null | 'stop' | Start | Auth | Array<
|
|
16
|
+
export declare type WorkerMessageData = null | 'stop' | Start | Auth | Array<{
|
|
17
|
+
_id: number;
|
|
18
|
+
}>;
|
|
19
19
|
export {};
|
package/cjs/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import App from './app/index.js';
|
|
2
2
|
export { default as App } from './app/index.js';
|
|
3
|
-
import * as _Messages from './
|
|
3
|
+
import * as _Messages from './common/messages.js';
|
|
4
4
|
export declare const Messages: typeof _Messages;
|
|
5
5
|
import type { Options as AppOptions } from './app/index.js';
|
|
6
6
|
import type { Options as ConsoleOptions } from './modules/console.js';
|
|
@@ -25,7 +25,7 @@ export default class API {
|
|
|
25
25
|
use<T>(fn: (app: App | null, options?: Options) => T): T;
|
|
26
26
|
isActive(): boolean;
|
|
27
27
|
start(startOpts?: Partial<StartOptions>): Promise<StartPromiseReturn>;
|
|
28
|
-
stop():
|
|
28
|
+
stop(): void;
|
|
29
29
|
getSessionToken(): string | null | undefined;
|
|
30
30
|
getSessionID(): string | null | undefined;
|
|
31
31
|
sessionID(): string | null | undefined;
|
package/cjs/index.js
CHANGED
|
@@ -4,8 +4,8 @@ exports.Messages = exports.App = void 0;
|
|
|
4
4
|
const index_js_1 = require("./app/index.js");
|
|
5
5
|
var index_js_2 = require("./app/index.js");
|
|
6
6
|
Object.defineProperty(exports, "App", { enumerable: true, get: function () { return index_js_2.default; } });
|
|
7
|
-
const
|
|
8
|
-
const _Messages = require("./
|
|
7
|
+
const messages_js_1 = require("./common/messages.js");
|
|
8
|
+
const _Messages = require("./common/messages.js");
|
|
9
9
|
exports.Messages = _Messages;
|
|
10
10
|
const connection_js_1 = require("./modules/connection.js");
|
|
11
11
|
const console_js_1 = require("./modules/console.js");
|
|
@@ -18,7 +18,6 @@ const performance_js_1 = require("./modules/performance.js");
|
|
|
18
18
|
const scroll_js_1 = require("./modules/scroll.js");
|
|
19
19
|
const viewport_js_1 = require("./modules/viewport.js");
|
|
20
20
|
const cssrules_js_1 = require("./modules/cssrules.js");
|
|
21
|
-
const adoptedStyleSheets_js_1 = require("./modules/adoptedStyleSheets.js");
|
|
22
21
|
const utils_js_1 = require("./utils.js");
|
|
23
22
|
const DOCS_SETUP = '/installation/setup-or';
|
|
24
23
|
function processOptions(obj) {
|
|
@@ -43,8 +42,8 @@ function processOptions(obj) {
|
|
|
43
42
|
obj.projectKey = obj.projectKey.toString();
|
|
44
43
|
}
|
|
45
44
|
}
|
|
46
|
-
if (obj.sessionToken != null) {
|
|
47
|
-
|
|
45
|
+
if (typeof obj.sessionToken !== 'string' && obj.sessionToken != null) {
|
|
46
|
+
console.warn(`OpenReplay: invalid options argument type. Please, check documentation on ${utils_js_1.DOCS_HOST}${DOCS_SETUP}`);
|
|
48
47
|
}
|
|
49
48
|
return true;
|
|
50
49
|
}
|
|
@@ -97,7 +96,6 @@ class API {
|
|
|
97
96
|
if (app !== null) {
|
|
98
97
|
(0, viewport_js_1.default)(app);
|
|
99
98
|
(0, cssrules_js_1.default)(app);
|
|
100
|
-
(0, adoptedStyleSheets_js_1.default)(app);
|
|
101
99
|
(0, connection_js_1.default)(app);
|
|
102
100
|
(0, console_js_1.default)(app, options);
|
|
103
101
|
(0, exception_js_1.default)(app, options);
|
|
@@ -131,7 +129,7 @@ class API {
|
|
|
131
129
|
// no-cors issue only with text/plain or not-set Content-Type
|
|
132
130
|
// req.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
|
|
133
131
|
req.send(JSON.stringify({
|
|
134
|
-
trackerVersion: '3.6.
|
|
132
|
+
trackerVersion: '3.6.4',
|
|
135
133
|
projectKey: options.projectKey,
|
|
136
134
|
doNotTrack,
|
|
137
135
|
// TODO: add precise reason (an exact API missing)
|
|
@@ -162,10 +160,7 @@ class API {
|
|
|
162
160
|
if (this.app === null) {
|
|
163
161
|
return;
|
|
164
162
|
}
|
|
165
|
-
this.app.stop();
|
|
166
|
-
const sessionHash = this.app.session.getSessionHash();
|
|
167
|
-
this.app.session.reset();
|
|
168
|
-
return sessionHash;
|
|
163
|
+
this.app.stop(true);
|
|
169
164
|
}
|
|
170
165
|
getSessionToken() {
|
|
171
166
|
if (this.app === null) {
|
|
@@ -200,7 +195,7 @@ class API {
|
|
|
200
195
|
}
|
|
201
196
|
setUserAnonymousID(id) {
|
|
202
197
|
if (typeof id === 'string' && this.app !== null) {
|
|
203
|
-
this.app.send(
|
|
198
|
+
this.app.send(new messages_js_1.UserAnonymousID(id));
|
|
204
199
|
}
|
|
205
200
|
}
|
|
206
201
|
userAnonymousID(id) {
|
|
@@ -228,7 +223,7 @@ class API {
|
|
|
228
223
|
catch (e) {
|
|
229
224
|
return;
|
|
230
225
|
}
|
|
231
|
-
this.app.send(
|
|
226
|
+
this.app.send(new messages_js_1.RawCustomEvent(key, payload));
|
|
232
227
|
}
|
|
233
228
|
}
|
|
234
229
|
}
|
|
@@ -240,7 +235,7 @@ class API {
|
|
|
240
235
|
catch (e) {
|
|
241
236
|
return;
|
|
242
237
|
}
|
|
243
|
-
this.app.send(
|
|
238
|
+
this.app.send(new messages_js_1.CustomIssue(key, payload));
|
|
244
239
|
}
|
|
245
240
|
}
|
|
246
241
|
}
|
|
@@ -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
|
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(new messages_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.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const guards_js_1 = require("../app/guards.js");
|
|
3
4
|
const utils_js_1 = require("../utils.js");
|
|
4
|
-
const
|
|
5
|
+
const messages_js_1 = require("../common/messages.js");
|
|
5
6
|
const printError = utils_js_1.IN_BROWSER && 'InstallTrigger' in window // detect Firefox
|
|
6
7
|
? (e) => e.message + '\n' + e.stack
|
|
7
8
|
: (e) => e.stack || e.message;
|
|
@@ -91,7 +92,7 @@ function default_1(app, opts) {
|
|
|
91
92
|
if (!Array.isArray(options.consoleMethods) || options.consoleMethods.length === 0) {
|
|
92
93
|
return;
|
|
93
94
|
}
|
|
94
|
-
const sendConsoleLog = app.safe((level, args) => app.send(
|
|
95
|
+
const sendConsoleLog = app.safe((level, args) => app.send(new messages_js_1.ConsoleLog(level, printf(args))));
|
|
95
96
|
let n;
|
|
96
97
|
const reset = () => {
|
|
97
98
|
n = 0;
|
|
@@ -100,7 +101,7 @@ function default_1(app, opts) {
|
|
|
100
101
|
app.ticker.attach(reset, 33, false);
|
|
101
102
|
const patchConsole = (console) => options.consoleMethods.forEach((method) => {
|
|
102
103
|
if (consoleMethods.indexOf(method) === -1) {
|
|
103
|
-
|
|
104
|
+
console.error(`OpenReplay: unsupported console method "${method}"`);
|
|
104
105
|
return;
|
|
105
106
|
}
|
|
106
107
|
const fn = console[method];
|
|
@@ -112,8 +113,21 @@ function default_1(app, opts) {
|
|
|
112
113
|
sendConsoleLog(method, args);
|
|
113
114
|
};
|
|
114
115
|
});
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
116
|
+
patchConsole(window.console);
|
|
117
|
+
app.nodes.attachNodeCallback(app.safe((node) => {
|
|
118
|
+
if ((0, guards_js_1.hasTag)(node, 'IFRAME')) {
|
|
119
|
+
// TODO: newContextCallback
|
|
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
|
+
}));
|
|
118
132
|
}
|
|
119
133
|
exports.default = default_1;
|
package/cjs/modules/cssrules.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
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
|
if (app === null) {
|
|
7
7
|
return;
|
|
8
8
|
}
|
|
9
9
|
if (!window.CSSStyleSheet) {
|
|
10
|
-
app.send(
|
|
10
|
+
app.send(new messages_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(new messages_js_1.CSSInsertRuleURLBased(nodeID, rule, index, app.getBaseHref()))
|
|
16
|
+
: (nodeID) => app.send(new messages_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
19
|
throw new Error('Owner Node not found');
|
|
@@ -23,19 +23,15 @@ function default_1(app) {
|
|
|
23
23
|
sendMessage(nodeID);
|
|
24
24
|
} // else error?
|
|
25
25
|
});
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
return deleteRule.call(this, index);
|
|
35
|
-
};
|
|
26
|
+
const { insertRule, deleteRule } = CSSStyleSheet.prototype;
|
|
27
|
+
CSSStyleSheet.prototype.insertRule = function (rule, index = 0) {
|
|
28
|
+
processOperation(this, index, rule);
|
|
29
|
+
return insertRule.call(this, rule, index);
|
|
30
|
+
};
|
|
31
|
+
CSSStyleSheet.prototype.deleteRule = function (index) {
|
|
32
|
+
processOperation(this, index);
|
|
33
|
+
return deleteRule.call(this, index);
|
|
36
34
|
};
|
|
37
|
-
patchContext(window);
|
|
38
|
-
app.observer.attachContextCallback(patchContext);
|
|
39
35
|
app.nodes.attachNodeCallback((node) => {
|
|
40
36
|
if (!(0, guards_js_1.hasTag)(node, 'STYLE') || !node.sheet) {
|
|
41
37
|
return;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type App from '../app/index.js';
|
|
2
|
-
import type Message from '../
|
|
2
|
+
import type Message from '../common/messages.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
|
|
14
|
+
export declare function getExceptionMessageFromEvent(e: ErrorEvent | PromiseRejectionEvent): Message | null;
|
|
15
15
|
export default function (app: App, opts: Partial<Options>): void;
|
|
16
16
|
export {};
|
package/cjs/modules/exception.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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_js_1 = require("../common/messages.js");
|
|
5
5
|
const error_stack_parser_1 = require("error-stack-parser");
|
|
6
6
|
function getDefaultStack(e) {
|
|
7
7
|
return [
|
|
@@ -20,10 +20,10 @@ function getExceptionMessage(error, fallbackStack) {
|
|
|
20
20
|
stack = error_stack_parser_1.default.parse(error);
|
|
21
21
|
}
|
|
22
22
|
catch (e) { }
|
|
23
|
-
return
|
|
23
|
+
return new messages_js_1.JSException(error.name, error.message, JSON.stringify(stack));
|
|
24
24
|
}
|
|
25
25
|
exports.getExceptionMessage = getExceptionMessage;
|
|
26
|
-
function getExceptionMessageFromEvent(e
|
|
26
|
+
function getExceptionMessageFromEvent(e) {
|
|
27
27
|
if (e instanceof ErrorEvent) {
|
|
28
28
|
if (e.error instanceof Error) {
|
|
29
29
|
return getExceptionMessage(e.error, getDefaultStack(e));
|
|
@@ -34,10 +34,10 @@ function getExceptionMessageFromEvent(e, context = window) {
|
|
|
34
34
|
name = 'Error';
|
|
35
35
|
message = e.message;
|
|
36
36
|
}
|
|
37
|
-
return
|
|
37
|
+
return new messages_js_1.JSException(name, message, JSON.stringify(getDefaultStack(e)));
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
|
-
else if ('PromiseRejectionEvent' in
|
|
40
|
+
else if ('PromiseRejectionEvent' in window && e instanceof PromiseRejectionEvent) {
|
|
41
41
|
if (e.reason instanceof Error) {
|
|
42
42
|
return getExceptionMessage(e.reason, []);
|
|
43
43
|
}
|
|
@@ -49,7 +49,7 @@ function getExceptionMessageFromEvent(e, context = window) {
|
|
|
49
49
|
catch (_) {
|
|
50
50
|
message = String(e.reason);
|
|
51
51
|
}
|
|
52
|
-
return
|
|
52
|
+
return new messages_js_1.JSException('Unhandled Promise Rejection', message, '[]');
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
return null;
|
|
@@ -59,19 +59,15 @@ function default_1(app, opts) {
|
|
|
59
59
|
const options = Object.assign({
|
|
60
60
|
captureExceptions: true,
|
|
61
61
|
}, opts);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
const msg = getExceptionMessageFromEvent(e
|
|
62
|
+
if (options.captureExceptions) {
|
|
63
|
+
const handler = (e) => {
|
|
64
|
+
const msg = getExceptionMessageFromEvent(e);
|
|
65
65
|
if (msg != null) {
|
|
66
66
|
app.send(msg);
|
|
67
67
|
}
|
|
68
|
-
}
|
|
69
|
-
app.attachEventListener(
|
|
70
|
-
app.attachEventListener(
|
|
71
|
-
}
|
|
72
|
-
if (options.captureExceptions) {
|
|
73
|
-
app.observer.attachContextCallback(patchContext);
|
|
74
|
-
patchContext(window);
|
|
68
|
+
};
|
|
69
|
+
app.attachEventListener(window, 'unhandledrejection', (e) => handler(e));
|
|
70
|
+
app.attachEventListener(window, 'error', (e) => handler(e));
|
|
75
71
|
}
|
|
76
72
|
}
|
|
77
73
|
exports.default = default_1;
|
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_js_1 = require("../common/messages.js");
|
|
5
5
|
const guards_js_1 = require("../app/guards.js");
|
|
6
6
|
function resolveURL(url, location = document.location) {
|
|
7
7
|
url = url.trim();
|
|
@@ -21,31 +21,16 @@ function resolveURL(url, location = document.location) {
|
|
|
21
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(new messages_js_1.SetNodeAttribute(id, 'src', PLACEHOLDER_SRC));
|
|
25
25
|
const { width, height } = node.getBoundingClientRect();
|
|
26
26
|
if (!node.hasAttribute('width')) {
|
|
27
|
-
app.send(
|
|
27
|
+
app.send(new messages_js_1.SetNodeAttribute(id, 'width', String(width)));
|
|
28
28
|
}
|
|
29
29
|
if (!node.hasAttribute('height')) {
|
|
30
|
-
app.send(
|
|
30
|
+
app.send(new messages_js_1.SetNodeAttribute(id, 'height', String(height)));
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
const
|
|
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 () {
|
|
33
|
+
const sendImgSrc = app.safe(function () {
|
|
49
34
|
const id = app.nodes.getID(this);
|
|
50
35
|
if (id === undefined) {
|
|
51
36
|
return;
|
|
@@ -57,15 +42,21 @@ function default_1(app) {
|
|
|
57
42
|
const resolvedSrc = resolveURL(src || ''); // Src type is null sometimes. - is it true?
|
|
58
43
|
if (naturalWidth === 0 && naturalHeight === 0) {
|
|
59
44
|
if ((0, utils_js_1.isURL)(resolvedSrc)) {
|
|
60
|
-
app.send(
|
|
45
|
+
app.send(new messages_js_1.ResourceTiming((0, utils_js_1.timestamp)(), 0, 0, 0, 0, 0, resolvedSrc, 'img'));
|
|
61
46
|
}
|
|
62
47
|
}
|
|
63
48
|
else if (resolvedSrc.length >= 1e5 || app.sanitizer.isMasked(id)) {
|
|
64
49
|
sendPlaceholder(id, this);
|
|
65
50
|
}
|
|
66
51
|
else {
|
|
67
|
-
|
|
68
|
-
|
|
52
|
+
app.send(new messages_js_1.SetNodeAttribute(id, 'src', resolvedSrc));
|
|
53
|
+
if (srcset) {
|
|
54
|
+
const resolvedSrcset = srcset
|
|
55
|
+
.split(',')
|
|
56
|
+
.map((str) => resolveURL(str))
|
|
57
|
+
.join(',');
|
|
58
|
+
app.send(new messages_js_1.SetNodeAttribute(id, 'srcset', resolvedSrcset));
|
|
59
|
+
}
|
|
69
60
|
}
|
|
70
61
|
});
|
|
71
62
|
const observer = new MutationObserver((mutations) => {
|
|
@@ -77,24 +68,23 @@ function default_1(app) {
|
|
|
77
68
|
return;
|
|
78
69
|
}
|
|
79
70
|
if (mutation.attributeName === 'src') {
|
|
80
|
-
|
|
71
|
+
const src = target.src;
|
|
72
|
+
app.send(new messages_js_1.SetNodeAttributeURLBased(id, 'src', src, app.getBaseHref()));
|
|
81
73
|
}
|
|
82
74
|
if (mutation.attributeName === 'srcset') {
|
|
83
|
-
|
|
75
|
+
const srcset = target.srcset;
|
|
76
|
+
app.send(new messages_js_1.SetNodeAttribute(id, 'srcset', srcset));
|
|
84
77
|
}
|
|
85
78
|
}
|
|
86
79
|
}
|
|
87
80
|
});
|
|
88
|
-
app.attachStopCallback(() => {
|
|
89
|
-
observer.disconnect();
|
|
90
|
-
});
|
|
91
81
|
app.nodes.attachNodeCallback((node) => {
|
|
92
82
|
if (!(0, guards_js_1.hasTag)(node, 'IMG')) {
|
|
93
83
|
return;
|
|
94
84
|
}
|
|
95
|
-
app.nodes.attachElementListener('error', node,
|
|
96
|
-
app.nodes.attachElementListener('load', node,
|
|
97
|
-
|
|
85
|
+
app.nodes.attachElementListener('error', node, sendImgSrc);
|
|
86
|
+
app.nodes.attachElementListener('load', node, sendImgSrc);
|
|
87
|
+
sendImgSrc.call(node);
|
|
98
88
|
observer.observe(node, { attributes: true, attributeFilter: ['src', 'srcset'] });
|
|
99
89
|
});
|
|
100
90
|
}
|
package/cjs/modules/input.js
CHANGED
|
@@ -3,7 +3,7 @@ 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_js_1 = require("../common/messages.js");
|
|
7
7
|
const INPUT_TYPES = ['text', 'password', 'email', 'search', 'number', 'range', 'date'];
|
|
8
8
|
function isTextEditable(node) {
|
|
9
9
|
if ((0, guards_js_1.hasTag)(node, 'TEXTAREA')) {
|
|
@@ -43,7 +43,7 @@ const labelElementFor = utils_js_1.IN_BROWSER && 'labels' in HTMLInputElement.pr
|
|
|
43
43
|
}
|
|
44
44
|
const id = node.id;
|
|
45
45
|
if (id) {
|
|
46
|
-
const labels =
|
|
46
|
+
const labels = document.querySelectorAll('label[for="' + id + '"]');
|
|
47
47
|
if (labels !== null && labels.length === 1) {
|
|
48
48
|
return labels[0];
|
|
49
49
|
}
|
|
@@ -74,7 +74,7 @@ function default_1(app, opts) {
|
|
|
74
74
|
function sendInputTarget(id, node) {
|
|
75
75
|
const label = getInputLabel(node);
|
|
76
76
|
if (label !== '') {
|
|
77
|
-
app.send(
|
|
77
|
+
app.send(new messages_js_1.SetInputTarget(id, label));
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
function sendInputValue(id, node) {
|
|
@@ -101,7 +101,7 @@ function default_1(app, opts) {
|
|
|
101
101
|
value = '';
|
|
102
102
|
break;
|
|
103
103
|
}
|
|
104
|
-
app.send(
|
|
104
|
+
app.send(new messages_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(new messages_js_1.SetInputChecked(id, node.checked));
|
|
143
143
|
}
|
|
144
144
|
});
|
|
145
145
|
});
|
|
@@ -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(new messages_js_1.SetInputChecked(id, node.checked));
|
|
167
167
|
return;
|
|
168
168
|
}
|
|
169
169
|
}));
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const messages_js_1 = require("../common/messages.js");
|
|
4
|
+
function default_1(app) {
|
|
5
|
+
if (!('PerformanceObserver' in window) || !('PerformanceLongTaskTiming' in window)) {
|
|
6
|
+
return;
|
|
7
|
+
}
|
|
8
|
+
const contexts = [
|
|
9
|
+
'unknown',
|
|
10
|
+
'self',
|
|
11
|
+
'same-origin-ancestor',
|
|
12
|
+
'same-origin-descendant',
|
|
13
|
+
'same-origin',
|
|
14
|
+
'cross-origin-ancestor',
|
|
15
|
+
'cross-origin-descendant',
|
|
16
|
+
'cross-origin-unreachable',
|
|
17
|
+
'multiple-contexts',
|
|
18
|
+
];
|
|
19
|
+
const containerTypes = ['window', 'iframe', 'embed', 'object'];
|
|
20
|
+
function longTask(entry) {
|
|
21
|
+
let type = '', src = '', id = '', name = '';
|
|
22
|
+
const container = entry.attribution[0];
|
|
23
|
+
if (container != null) {
|
|
24
|
+
type = container.containerType;
|
|
25
|
+
name = container.containerName;
|
|
26
|
+
id = container.containerId;
|
|
27
|
+
src = container.containerSrc;
|
|
28
|
+
}
|
|
29
|
+
app.send(new messages_js_1.LongTask(entry.startTime + performance.timing.navigationStart, entry.duration, Math.max(contexts.indexOf(entry.name), 0), Math.max(containerTypes.indexOf(type), 0), name, id, src));
|
|
30
|
+
}
|
|
31
|
+
const observer = new PerformanceObserver((list) => list.getEntries().forEach(longTask));
|
|
32
|
+
observer.observe({ entryTypes: ['longtask'] });
|
|
33
|
+
}
|
|
34
|
+
exports.default = default_1;
|
package/cjs/modules/mouse.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
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
|
const input_js_1 = require("./input.js");
|
|
7
|
-
function _getSelector(target
|
|
7
|
+
function _getSelector(target) {
|
|
8
8
|
let el = target;
|
|
9
9
|
let selector = null;
|
|
10
10
|
do {
|
|
@@ -34,16 +34,16 @@ function isClickable(element) {
|
|
|
34
34
|
element.onclick != null ||
|
|
35
35
|
element.getAttribute('role') === 'button');
|
|
36
36
|
//|| element.className.includes("btn")
|
|
37
|
-
// MBTODO:
|
|
37
|
+
// MBTODO: intersect addEventListener
|
|
38
38
|
}
|
|
39
|
-
//TODO: fix (typescript
|
|
40
|
-
function getTarget(target
|
|
39
|
+
//TODO: fix (typescript doesn't allow work when the guard is inside the function)
|
|
40
|
+
function getTarget(target) {
|
|
41
41
|
if (target instanceof Element) {
|
|
42
|
-
return _getTarget(target
|
|
42
|
+
return _getTarget(target);
|
|
43
43
|
}
|
|
44
44
|
return null;
|
|
45
45
|
}
|
|
46
|
-
function _getTarget(target
|
|
46
|
+
function _getTarget(target) {
|
|
47
47
|
let element = target;
|
|
48
48
|
while (element !== null && element !== document.documentElement) {
|
|
49
49
|
if ((0, utils_js_1.hasOpenreplayAttribute)(element, 'masked')) {
|
|
@@ -106,47 +106,38 @@ function default_1(app) {
|
|
|
106
106
|
});
|
|
107
107
|
const sendMouseMove = () => {
|
|
108
108
|
if (mousePositionChanged) {
|
|
109
|
-
app.send(
|
|
109
|
+
app.send(new messages_js_1.MouseMove(mousePositionX, mousePositionY));
|
|
110
110
|
mousePositionChanged = false;
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
113
|
+
const selectorMap = {};
|
|
114
|
+
function getSelector(id, target) {
|
|
115
|
+
return (selectorMap[id] = selectorMap[id] || _getSelector(target));
|
|
116
|
+
}
|
|
117
|
+
app.attachEventListener(document.documentElement, 'mouseover', (e) => {
|
|
118
|
+
const target = getTarget(e.target);
|
|
119
|
+
if (target !== mouseTarget) {
|
|
120
|
+
mouseTarget = target;
|
|
121
|
+
mouseTargetTime = performance.now();
|
|
117
122
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
mousePositionY = e.clientY + top;
|
|
129
|
-
mousePositionChanged = true;
|
|
130
|
-
}, false);
|
|
131
|
-
app.attachEventListener(document, 'click', (e) => {
|
|
132
|
-
const target = getTarget(e.target, document);
|
|
133
|
-
if ((!e.clientX && !e.clientY) || target === null) {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
const id = app.nodes.getID(target);
|
|
137
|
-
if (id !== undefined) {
|
|
138
|
-
sendMouseMove();
|
|
139
|
-
app.send((0, messages_gen_js_1.MouseClick)(id, mouseTarget === target ? Math.round(performance.now() - mouseTargetTime) : 0, getTargetLabel(target), getSelector(id, target)), true);
|
|
140
|
-
}
|
|
141
|
-
mouseTarget = null;
|
|
142
|
-
});
|
|
143
|
-
};
|
|
144
|
-
app.nodes.attachNodeCallback((node) => {
|
|
145
|
-
if ((0, guards_js_1.isDocument)(node)) {
|
|
146
|
-
patchDocument(node);
|
|
123
|
+
});
|
|
124
|
+
app.attachEventListener(document, 'mousemove', (e) => {
|
|
125
|
+
mousePositionX = e.clientX;
|
|
126
|
+
mousePositionY = e.clientY;
|
|
127
|
+
mousePositionChanged = true;
|
|
128
|
+
}, false);
|
|
129
|
+
app.attachEventListener(document, 'click', (e) => {
|
|
130
|
+
const target = getTarget(e.target);
|
|
131
|
+
if ((!e.clientX && !e.clientY) || target === null) {
|
|
132
|
+
return;
|
|
147
133
|
}
|
|
134
|
+
const id = app.nodes.getID(target);
|
|
135
|
+
if (id !== undefined) {
|
|
136
|
+
sendMouseMove();
|
|
137
|
+
app.send(new messages_js_1.MouseClick(id, mouseTarget === target ? Math.round(performance.now() - mouseTargetTime) : 0, getTargetLabel(target), getSelector(id, target)), true);
|
|
138
|
+
}
|
|
139
|
+
mouseTarget = null;
|
|
148
140
|
});
|
|
149
|
-
patchDocument(document);
|
|
150
141
|
app.ticker.attach(sendMouseMove, 10);
|
|
151
142
|
}
|
|
152
143
|
exports.default = default_1;
|