@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.
Files changed (90) hide show
  1. package/.eslintignore +1 -1
  2. package/LICENSE +1 -1
  3. package/cjs/app/guards.d.ts +1 -2
  4. package/cjs/app/guards.js +1 -5
  5. package/cjs/app/index.d.ts +13 -16
  6. package/cjs/app/index.js +45 -47
  7. package/cjs/app/nodes.d.ts +1 -1
  8. package/cjs/app/nodes.js +0 -2
  9. package/cjs/app/observer/iframe_observer.js +2 -2
  10. package/cjs/app/observer/observer.js +13 -13
  11. package/cjs/app/observer/shadow_root_observer.js +2 -2
  12. package/cjs/app/observer/top_observer.d.ts +0 -11
  13. package/cjs/app/observer/top_observer.js +12 -46
  14. package/cjs/app/session.d.ts +0 -6
  15. package/cjs/app/session.js +0 -46
  16. package/cjs/common/messages.d.ts +444 -0
  17. package/cjs/common/messages.js +743 -0
  18. package/cjs/common/types.d.ts +9 -0
  19. package/cjs/common/{interaction.js → types.js} +0 -0
  20. package/cjs/common/{interaction.d.ts → webworker.d.ts} +3 -3
  21. package/cjs/common/{messages.gen.js → webworker.js} +0 -1
  22. package/cjs/index.d.ts +2 -2
  23. package/cjs/index.js +9 -14
  24. package/cjs/modules/connection.js +2 -2
  25. package/cjs/modules/console.js +20 -6
  26. package/cjs/modules/cssrules.js +12 -16
  27. package/cjs/modules/exception.d.ts +2 -2
  28. package/cjs/modules/exception.js +12 -16
  29. package/cjs/modules/img.js +21 -31
  30. package/cjs/modules/input.js +6 -6
  31. package/cjs/modules/longtasks.d.ts +2 -0
  32. package/cjs/modules/longtasks.js +34 -0
  33. package/cjs/modules/mouse.js +33 -42
  34. package/cjs/modules/performance.js +2 -2
  35. package/cjs/modules/scroll.js +7 -16
  36. package/cjs/modules/timing.js +4 -4
  37. package/cjs/modules/viewport.js +4 -4
  38. package/lib/app/guards.d.ts +1 -2
  39. package/lib/app/guards.js +0 -3
  40. package/lib/app/index.d.ts +13 -16
  41. package/lib/app/index.js +46 -48
  42. package/lib/app/nodes.d.ts +1 -1
  43. package/lib/app/nodes.js +0 -2
  44. package/lib/app/observer/iframe_observer.js +1 -1
  45. package/lib/app/observer/observer.js +12 -12
  46. package/lib/app/observer/shadow_root_observer.js +1 -1
  47. package/lib/app/observer/top_observer.d.ts +0 -11
  48. package/lib/app/observer/top_observer.js +12 -46
  49. package/lib/app/session.d.ts +0 -6
  50. package/lib/app/session.js +0 -46
  51. package/lib/common/messages.d.ts +444 -0
  52. package/lib/common/messages.js +739 -0
  53. package/lib/common/tsconfig.tsbuildinfo +1 -1
  54. package/lib/common/types.d.ts +9 -0
  55. package/lib/common/{interaction.js → types.js} +0 -0
  56. package/lib/common/{interaction.d.ts → webworker.d.ts} +3 -3
  57. package/lib/common/webworker.js +1 -0
  58. package/lib/index.d.ts +2 -2
  59. package/lib/index.js +9 -14
  60. package/lib/modules/connection.js +2 -2
  61. package/lib/modules/console.js +20 -6
  62. package/lib/modules/cssrules.js +12 -16
  63. package/lib/modules/exception.d.ts +2 -2
  64. package/lib/modules/exception.js +12 -16
  65. package/lib/modules/img.js +21 -31
  66. package/lib/modules/input.js +6 -6
  67. package/lib/modules/longtasks.d.ts +2 -0
  68. package/lib/modules/longtasks.js +31 -0
  69. package/lib/modules/mouse.js +34 -43
  70. package/lib/modules/performance.js +2 -2
  71. package/lib/modules/scroll.js +8 -17
  72. package/lib/modules/timing.js +4 -4
  73. package/lib/modules/viewport.js +4 -4
  74. package/package.json +4 -3
  75. package/.prettierignore +0 -1
  76. package/cjs/app/messages.d.ts +0 -52
  77. package/cjs/app/messages.gen.d.ts +0 -57
  78. package/cjs/app/messages.gen.js +0 -493
  79. package/cjs/app/messages.js +0 -234
  80. package/cjs/common/messages.gen.d.ts +0 -382
  81. package/cjs/modules/adoptedStyleSheets.d.ts +0 -2
  82. package/cjs/modules/adoptedStyleSheets.js +0 -127
  83. package/lib/app/messages.d.ts +0 -52
  84. package/lib/app/messages.gen.d.ts +0 -57
  85. package/lib/app/messages.gen.js +0 -434
  86. package/lib/app/messages.js +0 -181
  87. package/lib/common/messages.gen.d.ts +0 -382
  88. package/lib/common/messages.gen.js +0 -2
  89. package/lib/modules/adoptedStyleSheets.d.ts +0 -2
  90. package/lib/modules/adoptedStyleSheets.js +0 -124
@@ -0,0 +1,9 @@
1
+ export interface Writer {
2
+ uint(n: number): boolean;
3
+ int(n: number): boolean;
4
+ string(s: string): boolean;
5
+ boolean(b: boolean): boolean;
6
+ }
7
+ export interface Message {
8
+ encode(w: Writer): boolean;
9
+ }
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<Message>;
16
+ export declare type WorkerMessageData = null | 'stop' | Start | Auth | Array<{
17
+ _id: number;
18
+ }>;
19
19
  export {};
@@ -1,3 +1,2 @@
1
1
  "use strict";
2
- // Auto-generated, do not edit
3
2
  Object.defineProperty(exports, "__esModule", { value: true });
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 './app/messages.gen.js';
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(): string | undefined;
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 messages_gen_js_1 = require("./app/messages.gen.js");
8
- const _Messages = require("./app/messages.gen.js");
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
- (0, utils_js_1.deprecationWarn)('`sessionToken` option', '`sessionHash` start() option', '/');
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.1',
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((0, messages_gen_js_1.UserAnonymousID)(id));
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((0, messages_gen_js_1.RawCustomEvent)(key, payload));
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((0, messages_gen_js_1.CustomIssue)(key, payload));
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 messages_gen_js_1 = require("../app/messages.gen.js");
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((0, messages_gen_js_1.ConnectionInformation)(Math.round(connection.downlink * 1000), connection.type || 'unknown'));
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
  }
@@ -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 messages_gen_js_1 = require("../app/messages.gen.js");
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((0, messages_gen_js_1.ConsoleLog)(level, printf(args))));
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
- app.debug.error(`OpenReplay: unsupported console method "${method}"`);
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
- const patchContext = app.safe((context) => patchConsole(context.console));
116
- patchContext(window);
117
- app.observer.attachContextCallback(patchContext);
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;
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const messages_gen_js_1 = require("../app/messages.gen.js");
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((0, messages_gen_js_1.TechnicalInfo)('no_stylesheet_prototype_in_window', ''));
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((0, messages_gen_js_1.CSSInsertRuleURLBased)(nodeID, rule, index, app.getBaseHref()))
16
- : (nodeID) => app.send((0, messages_gen_js_1.CSSDeleteRule)(nodeID, index));
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 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
- };
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 '../app/messages.gen.js';
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, context?: typeof globalThis): Message | null;
14
+ export declare function getExceptionMessageFromEvent(e: ErrorEvent | PromiseRejectionEvent): Message | null;
15
15
  export default function (app: App, opts: Partial<Options>): void;
16
16
  export {};
@@ -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 messages_gen_js_1 = require("../app/messages.gen.js");
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 (0, messages_gen_js_1.JSException)(error.name, error.message, JSON.stringify(stack));
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, context = window) {
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 (0, messages_gen_js_1.JSException)(name, message, JSON.stringify(getDefaultStack(e)));
37
+ return new messages_js_1.JSException(name, message, JSON.stringify(getDefaultStack(e)));
38
38
  }
39
39
  }
40
- else if ('PromiseRejectionEvent' in context && e instanceof context.PromiseRejectionEvent) {
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 (0, messages_gen_js_1.JSException)('Unhandled Promise Rejection', message, '[]');
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
- function patchContext(context) {
63
- function handler(e) {
64
- const msg = getExceptionMessageFromEvent(e, context);
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(context, 'unhandledrejection', handler);
70
- app.attachEventListener(context, 'error', handler);
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;
@@ -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 messages_gen_js_1 = require("../app/messages.gen.js");
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((0, messages_gen_js_1.SetNodeAttribute)(id, 'src', PLACEHOLDER_SRC));
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((0, messages_gen_js_1.SetNodeAttribute)(id, 'width', String(width)));
27
+ app.send(new messages_js_1.SetNodeAttribute(id, 'width', String(width)));
28
28
  }
29
29
  if (!node.hasAttribute('height')) {
30
- app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'height', String(height)));
30
+ app.send(new messages_js_1.SetNodeAttribute(id, 'height', String(height)));
31
31
  }
32
32
  }
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 () {
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((0, messages_gen_js_1.ResourceTiming)((0, utils_js_1.timestamp)(), 0, 0, 0, 0, 0, resolvedSrc, 'img'));
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
- sendSrc(id, this);
68
- sendSrcset(id, this);
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
- sendSrc(id, target);
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
- sendSrcset(id, target);
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, sendImgAttrs.bind(node));
96
- app.nodes.attachElementListener('load', node, sendImgAttrs.bind(node));
97
- sendImgAttrs.call(node);
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
  }
@@ -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 messages_gen_js_1 = require("../app/messages.gen.js");
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 = node.ownerDocument.querySelectorAll('label[for="' + id + '"]');
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((0, messages_gen_js_1.SetInputTarget)(id, label));
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((0, messages_gen_js_1.SetInputValue)(id, value, mask));
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((0, messages_gen_js_1.SetInputChecked)(id, node.checked));
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((0, messages_gen_js_1.SetInputChecked)(id, node.checked));
166
+ app.send(new messages_js_1.SetInputChecked(id, node.checked));
167
167
  return;
168
168
  }
169
169
  }));
@@ -0,0 +1,2 @@
1
+ import type App from '../app/index.js';
2
+ export default function (app: App): void;
@@ -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;
@@ -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 messages_gen_js_1 = require("../app/messages.gen.js");
5
+ const messages_js_1 = require("../common/messages.js");
6
6
  const input_js_1 = require("./input.js");
7
- function _getSelector(target, document) {
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: intersept addEventListener
37
+ // MBTODO: intersect addEventListener
38
38
  }
39
- //TODO: fix (typescript is not sure about target variable after assignation of svg)
40
- function getTarget(target, document) {
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, document);
42
+ return _getTarget(target);
43
43
  }
44
44
  return null;
45
45
  }
46
- function _getTarget(target, document) {
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((0, messages_gen_js_1.MouseMove)(mousePositionX, mousePositionY));
109
+ app.send(new messages_js_1.MouseMove(mousePositionX, mousePositionY));
110
110
  mousePositionChanged = false;
111
111
  }
112
112
  };
113
- const patchDocument = (document) => {
114
- const selectorMap = {};
115
- function getSelector(id, target) {
116
- return (selectorMap[id] = selectorMap[id] || _getSelector(target, document));
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
- app.attachEventListener(document.documentElement, 'mouseover', (e) => {
119
- const target = getTarget(e.target, document);
120
- if (target !== mouseTarget) {
121
- mouseTarget = target;
122
- mouseTargetTime = performance.now();
123
- }
124
- });
125
- app.attachEventListener(document, 'mousemove', (e) => {
126
- const { top, left } = app.observer.getDocumentOffset(document);
127
- mousePositionX = e.clientX + left;
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;