@openreplay/tracker 3.3.0 → 3.4.1

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