@openreplay/tracker 3.5.16 → 3.6.0

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 (128) hide show
  1. package/.eslintignore +8 -0
  2. package/.prettierignore +1 -0
  3. package/LICENSE +1 -1
  4. package/cjs/app/guards.d.ts +2 -1
  5. package/cjs/app/guards.js +6 -3
  6. package/cjs/app/index.d.ts +28 -23
  7. package/cjs/app/index.js +107 -86
  8. package/cjs/app/logger.js +6 -3
  9. package/cjs/app/messages.d.ts +52 -0
  10. package/cjs/app/messages.gen.d.ts +57 -0
  11. package/cjs/app/messages.gen.js +493 -0
  12. package/cjs/app/messages.js +234 -0
  13. package/cjs/app/nodes.d.ts +1 -1
  14. package/cjs/app/nodes.js +2 -0
  15. package/cjs/app/observer/iframe_observer.d.ts +1 -1
  16. package/cjs/app/observer/iframe_observer.js +3 -3
  17. package/cjs/app/observer/observer.d.ts +2 -3
  18. package/cjs/app/observer/observer.js +50 -52
  19. package/cjs/app/observer/shadow_root_observer.d.ts +1 -1
  20. package/cjs/app/observer/shadow_root_observer.js +3 -3
  21. package/cjs/app/observer/top_observer.d.ts +13 -2
  22. package/cjs/app/observer/top_observer.js +58 -23
  23. package/cjs/app/sanitizer.d.ts +1 -1
  24. package/cjs/app/sanitizer.js +5 -5
  25. package/cjs/app/session.d.ts +20 -2
  26. package/cjs/app/session.js +65 -6
  27. package/cjs/app/ticker.d.ts +1 -1
  28. package/cjs/common/{webworker.d.ts → interaction.d.ts} +5 -5
  29. package/cjs/common/{types.js → interaction.js} +0 -0
  30. package/cjs/common/messages.gen.d.ts +382 -0
  31. package/cjs/common/{webworker.js → messages.gen.js} +1 -0
  32. package/cjs/index.d.ts +10 -9
  33. package/cjs/index.js +47 -36
  34. package/cjs/modules/adoptedStyleSheets.d.ts +2 -0
  35. package/cjs/modules/adoptedStyleSheets.js +127 -0
  36. package/cjs/modules/connection.d.ts +1 -1
  37. package/cjs/modules/connection.js +2 -2
  38. package/cjs/modules/console.d.ts +1 -1
  39. package/cjs/modules/console.js +7 -21
  40. package/cjs/modules/cssrules.d.ts +1 -1
  41. package/cjs/modules/cssrules.js +18 -14
  42. package/cjs/modules/exception.d.ts +3 -3
  43. package/cjs/modules/exception.js +23 -18
  44. package/cjs/modules/img.d.ts +1 -1
  45. package/cjs/modules/img.js +39 -26
  46. package/cjs/modules/input.d.ts +1 -1
  47. package/cjs/modules/input.js +21 -21
  48. package/cjs/modules/mouse.d.ts +1 -1
  49. package/cjs/modules/mouse.js +50 -43
  50. package/cjs/modules/performance.d.ts +1 -1
  51. package/cjs/modules/performance.js +2 -2
  52. package/cjs/modules/scroll.d.ts +1 -1
  53. package/cjs/modules/scroll.js +16 -7
  54. package/cjs/modules/timing.d.ts +1 -1
  55. package/cjs/modules/timing.js +14 -26
  56. package/cjs/modules/viewport.d.ts +1 -1
  57. package/cjs/modules/viewport.js +4 -4
  58. package/cjs/utils.js +7 -7
  59. package/cjs/vendors/finder/finder.js +53 -48
  60. package/lib/app/guards.d.ts +2 -1
  61. package/lib/app/guards.js +4 -2
  62. package/lib/app/index.d.ts +28 -23
  63. package/lib/app/index.js +115 -94
  64. package/lib/app/logger.js +6 -3
  65. package/lib/app/messages.d.ts +52 -0
  66. package/lib/app/messages.gen.d.ts +57 -0
  67. package/lib/app/messages.gen.js +434 -0
  68. package/lib/app/messages.js +181 -0
  69. package/lib/app/nodes.d.ts +1 -1
  70. package/lib/app/nodes.js +2 -0
  71. package/lib/app/observer/iframe_observer.d.ts +1 -1
  72. package/lib/app/observer/iframe_observer.js +3 -3
  73. package/lib/app/observer/observer.d.ts +2 -3
  74. package/lib/app/observer/observer.js +51 -53
  75. package/lib/app/observer/shadow_root_observer.d.ts +1 -1
  76. package/lib/app/observer/shadow_root_observer.js +3 -3
  77. package/lib/app/observer/top_observer.d.ts +13 -2
  78. package/lib/app/observer/top_observer.js +62 -27
  79. package/lib/app/sanitizer.d.ts +1 -1
  80. package/lib/app/sanitizer.js +7 -7
  81. package/lib/app/session.d.ts +20 -2
  82. package/lib/app/session.js +65 -6
  83. package/lib/app/ticker.d.ts +1 -1
  84. package/lib/common/{webworker.d.ts → interaction.d.ts} +5 -5
  85. package/lib/common/{types.js → interaction.js} +0 -0
  86. package/lib/common/messages.gen.d.ts +382 -0
  87. package/lib/common/messages.gen.js +2 -0
  88. package/lib/common/tsconfig.tsbuildinfo +1 -1
  89. package/lib/index.d.ts +10 -9
  90. package/lib/index.js +60 -49
  91. package/lib/modules/adoptedStyleSheets.d.ts +2 -0
  92. package/lib/modules/adoptedStyleSheets.js +124 -0
  93. package/lib/modules/connection.d.ts +1 -1
  94. package/lib/modules/connection.js +2 -2
  95. package/lib/modules/console.d.ts +1 -1
  96. package/lib/modules/console.js +8 -22
  97. package/lib/modules/cssrules.d.ts +1 -1
  98. package/lib/modules/cssrules.js +19 -15
  99. package/lib/modules/exception.d.ts +3 -3
  100. package/lib/modules/exception.js +23 -18
  101. package/lib/modules/img.d.ts +1 -1
  102. package/lib/modules/img.js +41 -28
  103. package/lib/modules/input.d.ts +1 -1
  104. package/lib/modules/input.js +23 -23
  105. package/lib/modules/mouse.d.ts +1 -1
  106. package/lib/modules/mouse.js +53 -46
  107. package/lib/modules/performance.d.ts +1 -1
  108. package/lib/modules/performance.js +3 -3
  109. package/lib/modules/scroll.d.ts +1 -1
  110. package/lib/modules/scroll.js +17 -8
  111. package/lib/modules/timing.d.ts +1 -1
  112. package/lib/modules/timing.js +16 -28
  113. package/lib/modules/viewport.d.ts +1 -1
  114. package/lib/modules/viewport.js +4 -4
  115. package/lib/utils.js +7 -7
  116. package/lib/vendors/finder/finder.js +53 -48
  117. package/package.json +27 -10
  118. package/cjs/common/messages.d.ts +0 -444
  119. package/cjs/common/messages.js +0 -794
  120. package/cjs/common/types.d.ts +0 -9
  121. package/cjs/modules/longtasks.d.ts +0 -2
  122. package/cjs/modules/longtasks.js +0 -26
  123. package/lib/common/messages.d.ts +0 -444
  124. package/lib/common/messages.js +0 -790
  125. package/lib/common/types.d.ts +0 -9
  126. package/lib/common/webworker.js +0 -1
  127. package/lib/modules/longtasks.d.ts +0 -2
  128. 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 "../app/index.js";
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 messages_js_1 = require("../common/messages.js");
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(new messages_js_1.ConnectionInformation(Math.round(connection.downlink * 1000), connection.type || 'unknown'));
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
  }
@@ -1,4 +1,4 @@
1
- import type App from "../app/index.js";
1
+ import type App from '../app/index.js';
2
2
  export interface Options {
3
3
  consoleMethods: Array<string> | null;
4
4
  consoleThrottling: number;
@@ -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 messages_js_1 = require("../common/messages.js");
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(new messages_js_1.ConsoleLog(level, printf(args))));
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
- console.error(`OpenReplay: unsupported console method "${method}"`);
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(window.console);
118
- app.nodes.attachNodeCallback(app.safe(node => {
119
- if ((0, guards_js_1.hasTag)(node, "IFRAME")) { // 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
- }));
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 "../app/index.js";
1
+ import type App from '../app/index.js';
2
2
  export default function (app: App | null): void;
@@ -1,39 +1,43 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const messages_js_1 = require("../common/messages.js");
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(new messages_js_1.TechnicalInfo("no_stylesheet_prototype_in_window", ""));
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(new messages_js_1.CSSInsertRuleURLBased(nodeID, rule, index, app.getBaseHref()))
16
- : (nodeID) => app.send(new messages_js_1.CSSDeleteRule(nodeID, index));
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("Owner Node not found");
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 { 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);
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, "STYLE") || !node.sheet) {
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 "../app/index.js";
2
- import type Message from "../common/messages.js";
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 {};
@@ -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 messages_js_1 = require("../common/messages.js");
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 new messages_js_1.JSException(name, message, JSON.stringify(getDefaultStack(e)));
37
+ return (0, messages_gen_js_1.JSException)(name, message, JSON.stringify(getDefaultStack(e)));
37
38
  }
38
39
  }
39
- else if ('PromiseRejectionEvent' in window && e instanceof PromiseRejectionEvent) {
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 new messages_js_1.JSException('Unhandled Promise Rejection', message, '[]');
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
- if (options.captureExceptions) {
62
- const handler = (e) => {
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(window, 'unhandledrejection', (e) => handler(e));
69
- app.attachEventListener(window, 'error', (e) => handler(e));
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;
@@ -1,2 +1,2 @@
1
- import type App from "../app/index.js";
1
+ import type App from '../app/index.js';
2
2
  export default function (app: App): void;
@@ -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_js_1 = require("../common/messages.js");
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 = "https://static.openreplay.com/tracker/placeholder.jpeg";
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(new messages_js_1.SetNodeAttribute(id, "src", PLACEHOLDER_SRC));
24
+ app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'src', PLACEHOLDER_SRC));
25
25
  const { width, height } = node.getBoundingClientRect();
26
- if (!node.hasAttribute("width")) {
27
- app.send(new messages_js_1.SetNodeAttribute(id, "width", String(width)));
26
+ if (!node.hasAttribute('width')) {
27
+ app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'width', String(width)));
28
28
  }
29
- if (!node.hasAttribute("height")) {
30
- app.send(new messages_js_1.SetNodeAttribute(id, "height", String(height)));
29
+ if (!node.hasAttribute('height')) {
30
+ app.send((0, messages_gen_js_1.SetNodeAttribute)(id, 'height', String(height)));
31
31
  }
32
32
  }
33
- const sendImgSrc = app.safe(function () {
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(new messages_js_1.ResourceTiming((0, utils_js_1.timestamp)(), 0, 0, 0, 0, 0, resolvedSrc, 'img'));
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
- app.send(new messages_js_1.SetNodeAttribute(id, 'src', resolvedSrc));
53
- if (srcset) {
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 === "attributes") {
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 === "src") {
68
- const src = target.src;
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 === "srcset") {
72
- const srcset = target.srcset;
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, "IMG")) {
92
+ if (!(0, guards_js_1.hasTag)(node, 'IMG')) {
80
93
  return;
81
94
  }
82
- app.nodes.attachElementListener('error', node, sendImgSrc);
83
- app.nodes.attachElementListener('load', node, sendImgSrc);
84
- sendImgSrc.call(node);
85
- observer.observe(node, { attributes: true, attributeFilter: ["src", "srcset"] });
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;
@@ -1,4 +1,4 @@
1
- import type App from "../app/index.js";
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 {
@@ -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 messages_js_1 = require("../common/messages.js");
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, "TEXTAREA")) {
9
+ if ((0, guards_js_1.hasTag)(node, 'TEXTAREA')) {
10
10
  return true;
11
11
  }
12
- if (!(0, guards_js_1.hasTag)(node, "INPUT")) {
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, "INPUT")) {
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, "LABEL")) {
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, "LABEL")) {
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 = document.querySelectorAll('label[for="' + id + '"]');
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 = (labelElement && labelElement.innerText)
57
- || node.placeholder
58
- || node.name
59
- || node.id
60
- || node.className
61
- || node.type;
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(new messages_js_1.SetInputTarget(id, label));
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(new messages_js_1.SetInputValue(id, value, mask));
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(new messages_js_1.SetInputChecked(id, node.checked));
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, "SELECT")) {
153
+ if ((0, guards_js_1.hasTag)(node, 'SELECT')) {
154
154
  sendInputValue(id, node);
155
- app.attachEventListener(node, "change", () => {
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(new messages_js_1.SetInputChecked(id, node.checked));
166
+ app.send((0, messages_gen_js_1.SetInputChecked)(id, node.checked));
167
167
  return;
168
168
  }
169
169
  }));
@@ -1,2 +1,2 @@
1
- import type App from "../app/index.js";
1
+ import type App from '../app/index.js';
2
2
  export default function (app: App): void;