@openreplay/tracker 3.6.0-beta.0 → 3.6.2

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 (126) hide show
  1. package/cjs/app/guards.d.ts +1 -2
  2. package/cjs/app/guards.js +3 -6
  3. package/cjs/app/index.d.ts +22 -24
  4. package/cjs/app/index.js +84 -85
  5. package/cjs/app/logger.js +3 -6
  6. package/cjs/app/nodes.js +0 -2
  7. package/cjs/app/observer/iframe_observer.d.ts +1 -1
  8. package/cjs/app/observer/iframe_observer.js +3 -3
  9. package/cjs/app/observer/observer.d.ts +3 -2
  10. package/cjs/app/observer/observer.js +52 -50
  11. package/cjs/app/observer/shadow_root_observer.d.ts +1 -1
  12. package/cjs/app/observer/shadow_root_observer.js +3 -3
  13. package/cjs/app/observer/top_observer.d.ts +2 -11
  14. package/cjs/app/observer/top_observer.js +23 -52
  15. package/cjs/app/sanitizer.d.ts +1 -1
  16. package/cjs/app/sanitizer.js +5 -5
  17. package/cjs/app/session.d.ts +2 -18
  18. package/cjs/app/session.js +6 -55
  19. package/cjs/app/ticker.d.ts +1 -1
  20. package/cjs/common/messages.d.ts +444 -0
  21. package/cjs/common/messages.js +794 -0
  22. package/cjs/common/types.d.ts +9 -0
  23. package/cjs/common/{interaction.js → types.js} +0 -0
  24. package/cjs/common/{interaction.d.ts → webworker.d.ts} +5 -5
  25. package/cjs/common/webworker.js +2 -0
  26. package/cjs/index.d.ts +10 -10
  27. package/cjs/index.js +37 -42
  28. package/cjs/modules/connection.d.ts +1 -1
  29. package/cjs/modules/connection.js +2 -2
  30. package/cjs/modules/console.d.ts +1 -1
  31. package/cjs/modules/console.js +21 -7
  32. package/cjs/modules/cssrules.d.ts +1 -1
  33. package/cjs/modules/cssrules.js +14 -18
  34. package/cjs/modules/exception.d.ts +3 -3
  35. package/cjs/modules/exception.js +20 -25
  36. package/cjs/modules/img.d.ts +1 -1
  37. package/cjs/modules/img.js +26 -39
  38. package/cjs/modules/input.d.ts +1 -1
  39. package/cjs/modules/input.js +21 -21
  40. package/cjs/modules/longtasks.d.ts +2 -0
  41. package/cjs/modules/longtasks.js +26 -0
  42. package/cjs/modules/mouse.d.ts +1 -1
  43. package/cjs/modules/mouse.js +43 -50
  44. package/cjs/modules/performance.d.ts +1 -1
  45. package/cjs/modules/performance.js +2 -2
  46. package/cjs/modules/scroll.d.ts +1 -1
  47. package/cjs/modules/scroll.js +7 -16
  48. package/cjs/modules/timing.d.ts +1 -1
  49. package/cjs/modules/timing.js +26 -14
  50. package/cjs/modules/viewport.d.ts +1 -1
  51. package/cjs/modules/viewport.js +4 -4
  52. package/cjs/utils.js +7 -7
  53. package/cjs/vendors/finder/finder.js +48 -53
  54. package/lib/app/guards.d.ts +1 -2
  55. package/lib/app/guards.js +2 -4
  56. package/lib/app/index.d.ts +22 -24
  57. package/lib/app/index.js +92 -93
  58. package/lib/app/logger.js +3 -6
  59. package/lib/app/nodes.js +0 -2
  60. package/lib/app/observer/iframe_observer.d.ts +1 -1
  61. package/lib/app/observer/iframe_observer.js +3 -3
  62. package/lib/app/observer/observer.d.ts +3 -2
  63. package/lib/app/observer/observer.js +53 -51
  64. package/lib/app/observer/shadow_root_observer.d.ts +1 -1
  65. package/lib/app/observer/shadow_root_observer.js +3 -3
  66. package/lib/app/observer/top_observer.d.ts +2 -11
  67. package/lib/app/observer/top_observer.js +27 -56
  68. package/lib/app/sanitizer.d.ts +1 -1
  69. package/lib/app/sanitizer.js +7 -7
  70. package/lib/app/session.d.ts +2 -18
  71. package/lib/app/session.js +6 -55
  72. package/lib/app/ticker.d.ts +1 -1
  73. package/lib/common/messages.d.ts +444 -0
  74. package/lib/common/messages.js +790 -0
  75. package/lib/common/tsconfig.tsbuildinfo +1 -1
  76. package/lib/common/types.d.ts +9 -0
  77. package/lib/common/{interaction.js → types.js} +0 -0
  78. package/lib/common/{interaction.d.ts → webworker.d.ts} +5 -5
  79. package/lib/common/webworker.js +1 -0
  80. package/lib/index.d.ts +10 -10
  81. package/lib/index.js +50 -55
  82. package/lib/modules/connection.d.ts +1 -1
  83. package/lib/modules/connection.js +2 -2
  84. package/lib/modules/console.d.ts +1 -1
  85. package/lib/modules/console.js +22 -8
  86. package/lib/modules/cssrules.d.ts +1 -1
  87. package/lib/modules/cssrules.js +15 -19
  88. package/lib/modules/exception.d.ts +3 -3
  89. package/lib/modules/exception.js +20 -25
  90. package/lib/modules/img.d.ts +1 -1
  91. package/lib/modules/img.js +28 -41
  92. package/lib/modules/input.d.ts +1 -1
  93. package/lib/modules/input.js +23 -23
  94. package/lib/modules/longtasks.d.ts +2 -0
  95. package/lib/modules/longtasks.js +23 -0
  96. package/lib/modules/mouse.d.ts +1 -1
  97. package/lib/modules/mouse.js +46 -53
  98. package/lib/modules/performance.d.ts +1 -1
  99. package/lib/modules/performance.js +3 -3
  100. package/lib/modules/scroll.d.ts +1 -1
  101. package/lib/modules/scroll.js +8 -17
  102. package/lib/modules/timing.d.ts +1 -1
  103. package/lib/modules/timing.js +28 -16
  104. package/lib/modules/viewport.d.ts +1 -1
  105. package/lib/modules/viewport.js +4 -4
  106. package/lib/utils.js +7 -7
  107. package/lib/vendors/finder/finder.js +48 -53
  108. package/package.json +10 -27
  109. package/.eslintignore +0 -8
  110. package/.prettierignore +0 -1
  111. package/cjs/app/messages.d.ts +0 -52
  112. package/cjs/app/messages.gen.d.ts +0 -57
  113. package/cjs/app/messages.gen.js +0 -494
  114. package/cjs/app/messages.js +0 -235
  115. package/cjs/common/messages.gen.d.ts +0 -382
  116. package/cjs/common/messages.gen.js +0 -62
  117. package/cjs/modules/adoptedStyleSheets.d.ts +0 -2
  118. package/cjs/modules/adoptedStyleSheets.js +0 -127
  119. package/lib/app/messages.d.ts +0 -52
  120. package/lib/app/messages.gen.d.ts +0 -57
  121. package/lib/app/messages.gen.js +0 -435
  122. package/lib/app/messages.js +0 -182
  123. package/lib/common/messages.gen.d.ts +0 -382
  124. package/lib/common/messages.gen.js +0 -59
  125. package/lib/modules/adoptedStyleSheets.d.ts +0 -2
  126. package/lib/modules/adoptedStyleSheets.js +0 -124
package/lib/app/index.js CHANGED
@@ -1,14 +1,14 @@
1
- import { Timestamp, Metadata, UserID } from './messages.gen.js';
2
- import { timestamp as now } from '../utils.js';
3
- import Nodes from './nodes.js';
4
- import Observer from './observer/top_observer.js';
5
- import Sanitizer from './sanitizer.js';
6
- import Ticker from './ticker.js';
7
- import Logger, { LogLevel } from './logger.js';
8
- import Session from './session.js';
9
- import { deviceMemory, jsHeapSizeLimit } from '../modules/performance.js';
10
- const CANCELED = 'canceled';
11
- const START_ERROR = ':(';
1
+ import { Timestamp, Metadata, UserID } from "../common/messages.js";
2
+ import { timestamp } from "../utils.js";
3
+ import Nodes from "./nodes.js";
4
+ import Observer from "./observer/top_observer.js";
5
+ import Sanitizer from "./sanitizer.js";
6
+ import Ticker from "./ticker.js";
7
+ import Logger, { LogLevel } from "./logger.js";
8
+ import Session from "./session.js";
9
+ import { deviceMemory, jsHeapSizeLimit } from "../modules/performance.js";
10
+ const CANCELED = "canceled";
11
+ const START_ERROR = ":(";
12
12
  const UnsuccessfulStart = (reason) => ({ reason, success: false });
13
13
  const SuccessfulStart = (body) => (Object.assign(Object.assign({}, body), { success: true }));
14
14
  var ActivityState;
@@ -20,7 +20,7 @@ var ActivityState;
20
20
  // TODO: use backendHost only
21
21
  export const DEFAULT_INGEST_POINT = 'https://api.openreplay.com/ingest';
22
22
  export default class App {
23
- constructor(projectKey, sessionHash, options) {
23
+ constructor(projectKey, sessionToken, options) {
24
24
  // if (options.onStart !== undefined) {
25
25
  // deprecationWarn("'onStart' option", "tracker.start().then(/* handle session info */)")
26
26
  // } ?? maybe onStart is good
@@ -29,7 +29,7 @@ export default class App {
29
29
  this.stopCallbacks = [];
30
30
  this.commitCallbacks = [];
31
31
  this.activityState = ActivityState.NotActive;
32
- this.version = '3.5.16'; // TODO: version compatability check inside each plugin.
32
+ this.version = '3.6.2'; // TODO: version compatability check inside each plugin.
33
33
  this.projectKey = projectKey;
34
34
  this.options = Object.assign({
35
35
  revID: '',
@@ -43,8 +43,8 @@ export default class App {
43
43
  verbose: false,
44
44
  __is_snippet: false,
45
45
  __debug_report_edp: null,
46
- localStorage: null,
47
- sessionStorage: null,
46
+ localStorage: window.localStorage,
47
+ sessionStorage: window.sessionStorage,
48
48
  }, options);
49
49
  this.revID = this.options.revID;
50
50
  this.sanitizer = new Sanitizer(this, options);
@@ -54,32 +54,32 @@ export default class App {
54
54
  this.ticker.attach(() => this.commit());
55
55
  this.debug = new Logger(this.options.__debug__);
56
56
  this.notify = new Logger(this.options.verbose ? LogLevel.Warnings : LogLevel.Silent);
57
- this.localStorage = this.options.localStorage || window.localStorage;
58
- this.sessionStorage = this.options.sessionStorage || window.sessionStorage;
59
- this.session = new Session(this, this.options);
57
+ this.session = new Session();
60
58
  this.session.attachUpdateCallback(({ userID, metadata }) => {
61
- if (userID != null) {
62
- // TODO: nullable userID
63
- this.send(UserID(userID));
59
+ if (userID != null) { // TODO: nullable userID
60
+ this.send(new UserID(userID));
64
61
  }
65
62
  if (metadata != null) {
66
- Object.entries(metadata).forEach(([key, value]) => this.send(Metadata(key, value)));
63
+ Object.entries(metadata).forEach(([key, value]) => this.send(new Metadata(key, value)));
67
64
  }
68
65
  });
69
- if (sessionHash != null) {
70
- this.session.applySessionHash(sessionHash);
66
+ this.localStorage = this.options.localStorage;
67
+ this.sessionStorage = this.options.sessionStorage;
68
+ if (sessionToken != null) {
69
+ this.sessionStorage.setItem(this.options.session_token_key, sessionToken);
71
70
  }
72
71
  try {
73
- this.worker = new Worker(URL.createObjectURL(new Blob(['"use strict";var t;!function(t){t[t.BatchMetadata=81]="BatchMetadata",t[t.PartitionedMessage=82]="PartitionedMessage",t[t.Timestamp=0]="Timestamp",t[t.SetPageLocation=4]="SetPageLocation",t[t.SetViewportSize=5]="SetViewportSize",t[t.SetViewportScroll=6]="SetViewportScroll",t[t.CreateDocument=7]="CreateDocument",t[t.CreateElementNode=8]="CreateElementNode",t[t.CreateTextNode=9]="CreateTextNode",t[t.MoveNode=10]="MoveNode",t[t.RemoveNode=11]="RemoveNode",t[t.SetNodeAttribute=12]="SetNodeAttribute",t[t.RemoveNodeAttribute=13]="RemoveNodeAttribute",t[t.SetNodeData=14]="SetNodeData",t[t.SetNodeScroll=16]="SetNodeScroll",t[t.SetInputTarget=17]="SetInputTarget",t[t.SetInputValue=18]="SetInputValue",t[t.SetInputChecked=19]="SetInputChecked",t[t.MouseMove=20]="MouseMove",t[t.ConsoleLog=22]="ConsoleLog",t[t.PageLoadTiming=23]="PageLoadTiming",t[t.PageRenderTiming=24]="PageRenderTiming",t[t.JSException=25]="JSException",t[t.RawCustomEvent=27]="RawCustomEvent",t[t.UserID=28]="UserID",t[t.UserAnonymousID=29]="UserAnonymousID",t[t.Metadata=30]="Metadata",t[t.CSSInsertRule=37]="CSSInsertRule",t[t.CSSDeleteRule=38]="CSSDeleteRule",t[t.Fetch=39]="Fetch",t[t.Profiler=40]="Profiler",t[t.OTable=41]="OTable",t[t.StateAction=42]="StateAction",t[t.Redux=44]="Redux",t[t.Vuex=45]="Vuex",t[t.MobX=46]="MobX",t[t.NgRx=47]="NgRx",t[t.GraphQL=48]="GraphQL",t[t.PerformanceTrack=49]="PerformanceTrack",t[t.ResourceTiming=53]="ResourceTiming",t[t.ConnectionInformation=54]="ConnectionInformation",t[t.SetPageVisibility=55]="SetPageVisibility",t[t.LongTask=59]="LongTask",t[t.SetNodeAttributeURLBased=60]="SetNodeAttributeURLBased",t[t.SetCSSDataURLBased=61]="SetCSSDataURLBased",t[t.TechnicalInfo=63]="TechnicalInfo",t[t.CustomIssue=64]="CustomIssue",t[t.CSSInsertRuleURLBased=67]="CSSInsertRuleURLBased",t[t.MouseClick=69]="MouseClick",t[t.CreateIFrameDocument=70]="CreateIFrameDocument",t[t.AdoptedSSReplaceURLBased=71]="AdoptedSSReplaceURLBased",t[t.AdoptedSSInsertRuleURLBased=73]="AdoptedSSInsertRuleURLBased",t[t.AdoptedSSDeleteRule=75]="AdoptedSSDeleteRule",t[t.AdoptedSSAddOwner=76]="AdoptedSSAddOwner",t[t.AdoptedSSRemoveOwner=77]="AdoptedSSRemoveOwner"}(t||(t={}));class e{constructor(t,e,i,s=10,n=1e3){this.onUnauthorised=e,this.onFailure=i,this.MAX_ATTEMPTS_COUNT=s,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(e=>{if(401===e.status)return this.busy=!1,void this.onUnauthorised();if(e.status>=400)return void this.retry(t);this.attemptsCount=0;const i=this.queue.shift();i?this.sendBatch(i):this.busy=!1}).catch(e=>{console.warn("OpenReplay:",e),this.retry(t)})}clean(){this.queue.length=0}}const i="function"==typeof TextEncoder?new TextEncoder:{encode(t){const e=t.length,i=new Uint8Array(3*e);let s=-1;for(let n=0,r=0,h=0;h!==e;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===e){i[s+=1]=239,i[s+=1]=191,i[s+=1]=189;break}if(r=t.charCodeAt(h),!(r>=56320&&r<=57343)){i[s+=1]=239,i[s+=1]=191,i[s+=1]=189;continue}if(n=1024*(n-55296)+r-56320+65536,h+=1,n>65535){i[s+=1]=240|n>>>18,i[s+=1]=128|n>>>12&63,i[s+=1]=128|n>>>6&63,i[s+=1]=128|63&n;continue}}n<=127?i[s+=1]=0|n:n<=2047?(i[s+=1]=192|n>>>6,i[s+=1]=128|63&n):(i[s+=1]=224|n>>>12,i[s+=1]=128|n>>>6&63,i[s+=1]=128|63&n)}return i.subarray(0,s+1)}};class s extends class{constructor(t){this.size=t,this.offset=0,this.checkpointOffset=0,this.data=new Uint8Array(t)}getCurrentOffset(){return this.offset}checkpoint(){this.checkpointOffset=this.offset}isEmpty(){return 0===this.offset}skip(t){return this.offset+=t,this.offset<=this.size}set(t,e){this.data.set(t,e)}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 e=i.encode(t),s=e.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(e,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}{encode(e){switch(e[0]){case t.BatchMetadata:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.int(e[4])&&this.string(e[5]);case t.PartitionedMessage:return this.uint(e[1])&&this.uint(e[2]);case t.Timestamp:return this.uint(e[1]);case t.SetPageLocation:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.SetViewportSize:return this.uint(e[1])&&this.uint(e[2]);case t.SetViewportScroll:return this.int(e[1])&&this.int(e[2]);case t.CreateDocument:return!0;case t.CreateElementNode:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.string(e[4])&&this.boolean(e[5]);case t.CreateTextNode:case t.MoveNode:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3]);case t.RemoveNode:return this.uint(e[1]);case t.SetNodeAttribute:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.RemoveNodeAttribute:case t.SetNodeData:return this.uint(e[1])&&this.string(e[2]);case t.SetNodeScroll:return this.uint(e[1])&&this.int(e[2])&&this.int(e[3]);case t.SetInputTarget:return this.uint(e[1])&&this.string(e[2]);case t.SetInputValue:return this.uint(e[1])&&this.string(e[2])&&this.int(e[3]);case t.SetInputChecked:return this.uint(e[1])&&this.boolean(e[2]);case t.MouseMove:return this.uint(e[1])&&this.uint(e[2]);case t.ConsoleLog:return this.string(e[1])&&this.string(e[2]);case t.PageLoadTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.uint(e[7])&&this.uint(e[8])&&this.uint(e[9]);case t.PageRenderTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3]);case t.JSException:return this.string(e[1])&&this.string(e[2])&&this.string(e[3]);case t.RawCustomEvent:return this.string(e[1])&&this.string(e[2]);case t.UserID:case t.UserAnonymousID:return this.string(e[1]);case t.Metadata:return this.string(e[1])&&this.string(e[2]);case t.CSSInsertRule:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.CSSDeleteRule:return this.uint(e[1])&&this.uint(e[2]);case t.Fetch:return this.string(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.uint(e[7]);case t.Profiler:return this.string(e[1])&&this.uint(e[2])&&this.string(e[3])&&this.string(e[4]);case t.OTable:return this.string(e[1])&&this.string(e[2]);case t.StateAction:return this.string(e[1]);case t.Redux:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.Vuex:case t.MobX:return this.string(e[1])&&this.string(e[2]);case t.NgRx:return this.string(e[1])&&this.string(e[2])&&this.uint(e[3]);case t.GraphQL:return this.string(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4]);case t.PerformanceTrack:return this.int(e[1])&&this.int(e[2])&&this.uint(e[3])&&this.uint(e[4]);case t.ResourceTiming:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.uint(e[5])&&this.uint(e[6])&&this.string(e[7])&&this.string(e[8]);case t.ConnectionInformation:return this.uint(e[1])&&this.string(e[2]);case t.SetPageVisibility:return this.boolean(e[1]);case t.LongTask:return this.uint(e[1])&&this.uint(e[2])&&this.uint(e[3])&&this.uint(e[4])&&this.string(e[5])&&this.string(e[6])&&this.string(e[7]);case t.SetNodeAttributeURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3])&&this.string(e[4]);case t.SetCSSDataURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.TechnicalInfo:case t.CustomIssue:return this.string(e[1])&&this.string(e[2]);case t.CSSInsertRuleURLBased:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3])&&this.string(e[4]);case t.MouseClick:return this.uint(e[1])&&this.uint(e[2])&&this.string(e[3])&&this.string(e[4]);case t.CreateIFrameDocument:return this.uint(e[1])&&this.uint(e[2]);case t.AdoptedSSReplaceURLBased:return this.uint(e[1])&&this.string(e[2])&&this.string(e[3]);case t.AdoptedSSInsertRuleURLBased:return this.uint(e[1])&&this.string(e[2])&&this.uint(e[3])&&this.string(e[4]);case t.AdoptedSSDeleteRule:case t.AdoptedSSAddOwner:case t.AdoptedSSRemoveOwner:return this.uint(e[1])&&this.uint(e[2])}}}class n{constructor(t,e,i,n){this.pageNo=t,this.timestamp=e,this.url=i,this.onBatch=n,this.nextIndex=0,this.beaconSize=2e5,this.encoder=new s(this.beaconSize),this.sizeBuffer=new Uint8Array(3),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}writeType(t){return this.encoder.uint(t[0])}writeFields(t){return this.encoder.encode(t)}writeSizeAt(t,e){for(let e=0;e<3;e++)this.sizeBuffer[e]=t>>8*e;this.encoder.set(this.sizeBuffer,e)}prepare(){if(!this.encoder.isEmpty())return;const e=[t.BatchMetadata,1,this.pageNo,this.nextIndex,this.timestamp,this.url];this.writeType(e),this.writeFields(e),this.isEmpty=!0}writeWithSize(e){const i=this.encoder;if(!this.writeType(e)||!i.skip(3))return!1;const s=i.getCurrentOffset(),n=this.writeFields(e);if(n){const n=i.getCurrentOffset()-s;if(n>16777215)return console.warn("OpenReplay: max message size overflow."),!1;this.writeSizeAt(n,s-3),i.checkpoint(),this.isEmpty=this.isEmpty&&e[0]===t.Timestamp,this.nextIndex++}return n}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(e){if(e[0]===t.Timestamp&&(this.timestamp=e[1]),e[0]===t.SetPageLocation&&(this.url=e[1]),!this.writeWithSize(e))for(this.finaliseBatch();!this.writeWithSize(e);){if(this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message.",e),this.encoder.reset(),void this.prepare();this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.encoder=new s(this.beaconSize),this.prepare()}}finaliseBatch(){this.isEmpty||(this.onBatch(this.encoder.flush()),this.prepare())}clean(){this.encoder.reset()}}var r;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(r||(r={}));let h=null,a=null;function o(){a&&a.finaliseBatch()}function u(){r.Stopping,null!==d&&(clearInterval(d),d=null),a&&(a.clean(),a=null),r.NotActive}r.NotActive;let c,d=null;self.onmessage=({data:i})=>{if(null!=i){if("stop"===i)return o(),void u();if(Array.isArray(i)){if(!a)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const e=a;i.forEach(i=>{i[0]===t.SetPageVisibility&&(i[1]?c=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(c)),e.writeMessage(i)})}else{if("start"===i.type)return r.Starting,h=new e(i.ingestPoint,()=>{self.postMessage("restart")},()=>{h&&(h.clean(),h=null),u(),self.postMessage("failed")},i.connAttemptCount,i.connAttemptGap),a=new n(i.pageNo,i.timestamp,i.url,t=>h&&h.push(t)),null===d&&(d=setInterval(o,1e4)),r.Active;if("auth"===i.type){if(!h)throw new Error("WebWorker: sender not initialised. Received auth.");if(!a)throw new Error("WebWorker: writer not initialised. Received auth.");return h.authorise(i.token),void(i.beaconSizeLimit&&a.setBeaconSizeLimit(i.beaconSizeLimit))}}}else o()};'], { type: 'text/javascript' })));
74
- this.worker.onerror = (e) => {
75
- this._debug('webworker_error', e);
72
+ this.worker = new Worker(URL.createObjectURL(new Blob([`"use strict";function t(t){function i(...i){return new t(...i)}return i.prototype=t.prototype,i}const i=new Map;const s=t(class{constructor(t,i,s){this.pageNo=t,this.firstIndex=i,this.timestamp=s,this._id=80}encode(t){return t.uint(80)&&t.uint(this.pageNo)&&t.uint(this.firstIndex)&&t.int(this.timestamp)}});i.set(80,s);const e=t(class{constructor(t){this.timestamp=t,this._id=0}encode(t){return t.uint(0)&&t.uint(this.timestamp)}});i.set(0,e);const n=t(class{constructor(t,i,s){this.url=t,this.referrer=i,this.navigationStart=s,this._id=4}encode(t){return t.uint(4)&&t.string(this.url)&&t.string(this.referrer)&&t.uint(this.navigationStart)}});i.set(4,n);const r=t(class{constructor(t,i){this.width=t,this.height=i,this._id=5}encode(t){return t.uint(5)&&t.uint(this.width)&&t.uint(this.height)}});i.set(5,r);const h=t(class{constructor(t,i){this.x=t,this.y=i,this._id=6}encode(t){return t.uint(6)&&t.int(this.x)&&t.int(this.y)}});i.set(6,h);const o=t(class{constructor(){this._id=7}encode(t){return t.uint(7)}});i.set(7,o);const c=t(class{constructor(t,i,s,e,n){this.id=t,this.parentID=i,this.index=s,this.tag=e,this.svg=n,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)}});i.set(8,c);const a=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=9}encode(t){return t.uint(9)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(9,a);const u=t(class{constructor(t,i,s){this.id=t,this.parentID=i,this.index=s,this._id=10}encode(t){return t.uint(10)&&t.uint(this.id)&&t.uint(this.parentID)&&t.uint(this.index)}});i.set(10,u);const d=t(class{constructor(t){this.id=t,this._id=11}encode(t){return t.uint(11)&&t.uint(this.id)}});i.set(11,d);const l=t(class{constructor(t,i,s){this.id=t,this.name=i,this.value=s,this._id=12}encode(t){return t.uint(12)&&t.uint(this.id)&&t.string(this.name)&&t.string(this.value)}});i.set(12,l);const p=t(class{constructor(t,i){this.id=t,this.name=i,this._id=13}encode(t){return t.uint(13)&&t.uint(this.id)&&t.string(this.name)}});i.set(13,p);const g=t(class{constructor(t,i){this.id=t,this.data=i,this._id=14}encode(t){return t.uint(14)&&t.uint(this.id)&&t.string(this.data)}});i.set(14,g);const m=t(class{constructor(t,i,s){this.id=t,this.x=i,this.y=s,this._id=16}encode(t){return t.uint(16)&&t.uint(this.id)&&t.int(this.x)&&t.int(this.y)}});i.set(16,m);const f=t(class{constructor(t,i){this.id=t,this.label=i,this._id=17}encode(t){return t.uint(17)&&t.uint(this.id)&&t.string(this.label)}});i.set(17,f);const y=t(class{constructor(t,i,s){this.id=t,this.value=i,this.mask=s,this._id=18}encode(t){return t.uint(18)&&t.uint(this.id)&&t.string(this.value)&&t.int(this.mask)}});i.set(18,y);const _=t(class{constructor(t,i){this.id=t,this.checked=i,this._id=19}encode(t){return t.uint(19)&&t.uint(this.id)&&t.boolean(this.checked)}});i.set(19,_);const v=t(class{constructor(t,i){this.x=t,this.y=i,this._id=20}encode(t){return t.uint(20)&&t.uint(this.x)&&t.uint(this.y)}});i.set(20,v);const S=t(class{constructor(t,i){this.level=t,this.value=i,this._id=22}encode(t){return t.uint(22)&&t.string(this.level)&&t.string(this.value)}});i.set(22,S);const b=t(class{constructor(t,i,s,e,n,r,h,o,c){this.requestStart=t,this.responseStart=i,this.responseEnd=s,this.domContentLoadedEventStart=e,this.domContentLoadedEventEnd=n,this.loadEventStart=r,this.loadEventEnd=h,this.firstPaint=o,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)}});i.set(23,b);const w=t(class{constructor(t,i,s){this.speedIndex=t,this.visuallyComplete=i,this.timeToInteractive=s,this._id=24}encode(t){return t.uint(24)&&t.uint(this.speedIndex)&&t.uint(this.visuallyComplete)&&t.uint(this.timeToInteractive)}});i.set(24,w);const E=t(class{constructor(t,i,s){this.name=t,this.message=i,this.payload=s,this._id=25}encode(t){return t.uint(25)&&t.string(this.name)&&t.string(this.message)&&t.string(this.payload)}});i.set(25,E);const x=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=27}encode(t){return t.uint(27)&&t.string(this.name)&&t.string(this.payload)}});i.set(27,x);const T=t(class{constructor(t){this.id=t,this._id=28}encode(t){return t.uint(28)&&t.string(this.id)}});i.set(28,T);const z=t(class{constructor(t){this.id=t,this._id=29}encode(t){return t.uint(29)&&t.string(this.id)}});i.set(29,z);const k=t(class{constructor(t,i){this.key=t,this.value=i,this._id=30}encode(t){return t.uint(30)&&t.string(this.key)&&t.string(this.value)}});i.set(30,k);const A=t(class{constructor(t,i,s){this.id=t,this.rule=i,this.index=s,this._id=37}encode(t){return t.uint(37)&&t.uint(this.id)&&t.string(this.rule)&&t.uint(this.index)}});i.set(37,A);const I=t(class{constructor(t,i){this.id=t,this.index=i,this._id=38}encode(t){return t.uint(38)&&t.uint(this.id)&&t.uint(this.index)}});i.set(38,I);const L=t(class{constructor(t,i,s,e,n,r,h){this.method=t,this.url=i,this.request=s,this.response=e,this.status=n,this.timestamp=r,this.duration=h,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)}});i.set(39,L);const C=t(class{constructor(t,i,s,e){this.name=t,this.duration=i,this.args=s,this.result=e,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)}});i.set(40,C);const M=t(class{constructor(t,i){this.key=t,this.value=i,this._id=41}encode(t){return t.uint(41)&&t.string(this.key)&&t.string(this.value)}});i.set(41,M);const N=t(class{constructor(t){this.type=t,this._id=42}encode(t){return t.uint(42)&&t.string(this.type)}});i.set(42,N);const B=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=44}encode(t){return t.uint(44)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(44,B);const U=t(class{constructor(t,i){this.mutation=t,this.state=i,this._id=45}encode(t){return t.uint(45)&&t.string(this.mutation)&&t.string(this.state)}});i.set(45,U);const R=t(class{constructor(t,i){this.type=t,this.payload=i,this._id=46}encode(t){return t.uint(46)&&t.string(this.type)&&t.string(this.payload)}});i.set(46,R);const O=t(class{constructor(t,i,s){this.action=t,this.state=i,this.duration=s,this._id=47}encode(t){return t.uint(47)&&t.string(this.action)&&t.string(this.state)&&t.uint(this.duration)}});i.set(47,O);const P=t(class{constructor(t,i,s,e){this.operationKind=t,this.operationName=i,this.variables=s,this.response=e,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)}});i.set(48,P);const q=t(class{constructor(t,i,s,e){this.frames=t,this.ticks=i,this.totalJSHeapSize=s,this.usedJSHeapSize=e,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)}});i.set(49,q);const D=t(class{constructor(t,i,s,e,n,r,h,o){this.timestamp=t,this.duration=i,this.ttfb=s,this.headerSize=e,this.encodedBodySize=n,this.decodedBodySize=r,this.url=h,this.initiator=o,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)}});i.set(53,D);const W=t(class{constructor(t,i){this.downlink=t,this.type=i,this._id=54}encode(t){return t.uint(54)&&t.uint(this.downlink)&&t.string(this.type)}});i.set(54,W);const H=t(class{constructor(t){this.hidden=t,this._id=55}encode(t){return t.uint(55)&&t.boolean(this.hidden)}});i.set(55,H);const J=t(class{constructor(t,i,s,e,n,r,h){this.timestamp=t,this.duration=i,this.context=s,this.containerType=e,this.containerSrc=n,this.containerId=r,this.containerName=h,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)}});i.set(59,J);const F=t(class{constructor(t,i,s,e){this.id=t,this.name=i,this.value=s,this.baseURL=e,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)}});i.set(60,F);const X=t(class{constructor(t,i,s){this.id=t,this.data=i,this.baseURL=s,this._id=61}encode(t){return t.uint(61)&&t.uint(this.id)&&t.string(this.data)&&t.string(this.baseURL)}});i.set(61,X);const G=t(class{constructor(t,i){this.type=t,this.value=i,this._id=63}encode(t){return t.uint(63)&&t.string(this.type)&&t.string(this.value)}});i.set(63,G);const K=t(class{constructor(t,i){this.name=t,this.payload=i,this._id=64}encode(t){return t.uint(64)&&t.string(this.name)&&t.string(this.payload)}});i.set(64,K);const j=t(class{constructor(){this._id=65}encode(t){return t.uint(65)}});i.set(65,j);const Q=t(class{constructor(t,i,s,e){this.id=t,this.rule=i,this.index=s,this.baseURL=e,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)}});i.set(67,Q);const V=t(class{constructor(t,i,s,e){this.id=t,this.hesitationTime=i,this.label=s,this.selector=e,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)}});i.set(69,V);const Y=t(class{constructor(t,i){this.frameID=t,this.id=i,this._id=70}encode(t){return t.uint(70)&&t.uint(this.frameID)&&t.uint(this.id)}});i.set(70,Y);class Z{constructor(t,i,s,e=10,n=1e3){this.onUnauthorised=i,this.onFailure=s,this.MAX_ATTEMPTS_COUNT=e,this.ATTEMPT_TIMEOUT=n,this.attemptsCount=0,this.busy=!1,this.queue=[],this.token=null,this.ingestURL=t+"/v1/web/i"}authorise(t){this.token=t}push(t){this.busy||!this.token?this.queue.push(t):this.sendBatch(t)}retry(t){this.attemptsCount>=this.MAX_ATTEMPTS_COUNT?this.onFailure():(this.attemptsCount++,setTimeout(()=>this.sendBatch(t),this.ATTEMPT_TIMEOUT*this.attemptsCount))}sendBatch(t){this.busy=!0,fetch(this.ingestURL,{body:t,method:"POST",headers:{Authorization:"Bearer "+this.token},keepalive:t.length<65536}).then(i=>{if(401===i.status)return this.busy=!1,void this.onUnauthorised();if(i.status>=400)return void this.retry(t);this.attemptsCount=0;const s=this.queue.shift();s?this.sendBatch(s):this.busy=!1}).catch(i=>{console.warn("OpenReplay:",i),this.retry(t)})}clean(){this.queue.length=0}}const tt="function"==typeof TextEncoder?new TextEncoder:{encode(t){const i=t.length,s=new Uint8Array(3*i);let e=-1;for(var n=0,r=0,h=0;h!==i;){if(n=t.charCodeAt(h),h+=1,n>=55296&&n<=56319){if(h===i){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;break}if(!((r=t.charCodeAt(h))>=56320&&r<=57343)){s[e+=1]=239,s[e+=1]=191,s[e+=1]=189;continue}if(h+=1,(n=1024*(n-55296)+r-56320+65536)>65535){s[e+=1]=240|n>>>18,s[e+=1]=128|n>>>12&63,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n;continue}}n<=127?s[e+=1]=0|n:n<=2047?(s[e+=1]=192|n>>>6,s[e+=1]=128|63&n):(s[e+=1]=224|n>>>12,s[e+=1]=128|n>>>6&63,s[e+=1]=128|63&n)}return s.subarray(0,e+1)}};class it{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 i=tt.encode(t),s=i.byteLength;return!(!this.uint(s)||this.offset+s>this.size)&&(this.data.set(i,this.offset),this.offset+=s,!0)}reset(){this.offset=0,this.checkpointOffset=0}flush(){const t=this.data.slice(0,this.checkpointOffset);return this.reset(),t}}class st{constructor(t,i,s){this.pageNo=t,this.timestamp=i,this.onBatch=s,this.nextIndex=0,this.beaconSize=2e5,this.writer=new it(this.beaconSize),this.isEmpty=!0,this.beaconSizeLimit=1e6,this.prepare()}prepare(){this.writer.isEmpty()&&new s(this.pageNo,this.nextIndex,this.timestamp).encode(this.writer)}write(t){const i=t.encode(this.writer);return i&&(this.isEmpty=!1,this.writer.checkpoint(),this.nextIndex++),i}setBeaconSizeLimit(t){this.beaconSizeLimit=t}writeMessage(t){for(t instanceof e&&(this.timestamp=t.timestamp);!this.write(t);){if(this.finaliseBatch(),this.beaconSize===this.beaconSizeLimit)return console.warn("OpenReplay: beacon size overflow. Skipping large message."),this.writer.reset(),this.prepare(),void(this.isEmpty=!0);this.beaconSize=Math.min(2*this.beaconSize,this.beaconSizeLimit),this.writer=new it(this.beaconSize),this.prepare(),this.isEmpty=!0}}finaliseBatch(){this.isEmpty||(this.onBatch(this.writer.flush()),this.prepare(),this.isEmpty=!0)}clean(){this.writer.reset()}}var et;!function(t){t[t.NotActive=0]="NotActive",t[t.Starting=1]="Starting",t[t.Stopping=2]="Stopping",t[t.Active=3]="Active"}(et||(et={}));let nt=null,rt=null;function ht(){rt&&rt.finaliseBatch()}function ot(){et.Stopping,null!==at&&(clearInterval(at),at=null),rt&&(rt.clean(),rt=null),et.NotActive}et.NotActive;let ct,at=null;self.onmessage=({data:t})=>{if(null!=t){if("stop"===t)return ht(),void ot();if(Array.isArray(t)){if(!rt)throw new Error("WebWorker: writer not initialised. Service Should be Started.");const s=rt;t.forEach(t=>{const e=new(i.get(t._id));Object.assign(e,t),e instanceof H&&(e.hidden?ct=setTimeout(()=>self.postMessage("restart"),18e5):clearTimeout(ct)),s.writeMessage(e)})}else{if("start"===t.type)return et.Starting,nt=new Z(t.ingestPoint,()=>{self.postMessage("restart")},()=>{nt&&(nt.clean(),nt=null),ot(),self.postMessage("failed")},t.connAttemptCount,t.connAttemptGap),rt=new st(t.pageNo,t.timestamp,t=>nt&&nt.push(t)),null===at&&(at=setInterval(ht,1e4)),et.Active;if("auth"===t.type){if(!nt)throw new Error("WebWorker: sender not initialised. Received auth.");if(!rt)throw new Error("WebWorker: writer not initialised. Received auth.");return nt.authorise(t.token),void(t.beaconSizeLimit&&rt.setBeaconSizeLimit(t.beaconSizeLimit))}}}else ht()};
73
+ `], { type: 'text/javascript' })));
74
+ this.worker.onerror = e => {
75
+ this._debug("webworker_error", e);
76
76
  };
77
77
  this.worker.onmessage = ({ data }) => {
78
- if (data === 'failed') {
78
+ if (data === "failed") {
79
79
  this.stop();
80
- this._debug('worker_failed', {}); // add context (from worker)
80
+ this._debug("worker_failed", {}); // add context (from worker)
81
81
  }
82
- else if (data === 'restart') {
82
+ else if (data === "restart") {
83
83
  this.stop();
84
84
  this.start({ forceNew: true });
85
85
  }
@@ -96,7 +96,7 @@ export default class App {
96
96
  this.attachEventListener(document, 'visibilitychange', alertWorker, false);
97
97
  }
98
98
  catch (e) {
99
- this._debug('worker_start', e);
99
+ this._debug("worker_start", e);
100
100
  }
101
101
  }
102
102
  _debug(context, e) {
@@ -106,20 +106,20 @@ export default class App {
106
106
  headers: { 'Content-Type': 'application/json' },
107
107
  body: JSON.stringify({
108
108
  context,
109
- error: `${e}`,
110
- }),
109
+ error: `${e}`
110
+ })
111
111
  });
112
112
  }
113
- this.debug.error('OpenReplay error: ', context, e);
113
+ this.debug.error("OpenReplay error: ", context, e);
114
114
  }
115
115
  send(message, urgent = false) {
116
116
  if (this.activityState === ActivityState.NotActive) {
117
117
  return;
118
118
  }
119
119
  this.messages.push(message);
120
- // TODO: commit on start if there were `urgent` sends;
120
+ // TODO: commit on start if there were `urgent` sends;
121
121
  // Clearify where urgent can be used for;
122
- // Clearify workflow for each type of message in case it was sent before start
122
+ // Clearify workflow for each type of message in case it was sent before start
123
123
  // (like Fetch before start; maybe add an option "preCapture: boolean" or sth alike)
124
124
  if (this.activityState === ActivityState.Active && urgent) {
125
125
  this.commit();
@@ -127,9 +127,9 @@ export default class App {
127
127
  }
128
128
  commit() {
129
129
  if (this.worker && this.messages.length) {
130
- this.messages.unshift(Timestamp(now()));
130
+ this.messages.unshift(new Timestamp(timestamp()));
131
131
  this.worker.postMessage(this.messages);
132
- this.commitCallbacks.forEach((cb) => cb(this.messages));
132
+ this.commitCallbacks.forEach(cb => cb(this.messages));
133
133
  this.messages.length = 0;
134
134
  }
135
135
  }
@@ -140,8 +140,8 @@ export default class App {
140
140
  fn.apply(this, args);
141
141
  }
142
142
  catch (e) {
143
- app._debug('safe_fn_call', e);
144
- // time: now(),
143
+ app._debug("safe_fn_call", e);
144
+ // time: timestamp(),
145
145
  // name: e.name,
146
146
  // message: e.message,
147
147
  // stack: e.stack
@@ -169,32 +169,30 @@ export default class App {
169
169
  const reqVer = version.split(/[.-]/);
170
170
  const ver = this.version.split(/[.-]/);
171
171
  for (let i = 0; i < 3; i++) {
172
- if (isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
173
- return false;
174
- }
175
- if (Number(ver[i]) > Number(reqVer[i])) {
176
- return true;
177
- }
178
- if (Number(ver[i]) < Number(reqVer[i])) {
172
+ if (Number(ver[i]) < Number(reqVer[i]) || isNaN(Number(ver[i])) || isNaN(Number(reqVer[i]))) {
179
173
  return false;
180
174
  }
181
175
  }
182
176
  return true;
183
177
  }
184
- getTrackerInfo() {
178
+ getStartInfo() {
185
179
  return {
186
180
  userUUID: this.localStorage.getItem(this.options.local_uuid_key),
187
181
  projectKey: this.projectKey,
188
182
  revID: this.revID,
183
+ timestamp: timestamp(),
189
184
  trackerVersion: this.version,
190
185
  isSnippet: this.options.__is_snippet,
191
186
  };
192
187
  }
193
188
  getSessionInfo() {
194
- return Object.assign(Object.assign({}, this.session.getInfo()), this.getTrackerInfo());
189
+ return Object.assign(Object.assign({}, this.session.getInfo()), this.getStartInfo());
195
190
  }
196
191
  getSessionToken() {
197
- return this.session.getSessionToken();
192
+ const token = this.sessionStorage.getItem(this.options.session_token_key);
193
+ if (token !== null) {
194
+ return token;
195
+ }
198
196
  }
199
197
  getSessionID() {
200
198
  return this.session.getInfo().sessionID || undefined;
@@ -211,19 +209,18 @@ export default class App {
211
209
  return this.options.resourceBaseHref;
212
210
  }
213
211
  else if (typeof this.options.resourceBaseHref === 'object') {
214
- //TODO: switch between types
212
+ //switch between types
215
213
  }
216
214
  if (document.baseURI) {
217
215
  return document.baseURI;
218
216
  }
219
217
  // IE only
220
- return (((_b = (_a = document.head) === null || _a === void 0 ? void 0 : _a.getElementsByTagName('base')[0]) === null || _b === void 0 ? void 0 : _b.getAttribute('href')) ||
221
- location.origin + location.pathname);
218
+ 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;
222
219
  }
223
220
  resolveResourceURL(resourceURL) {
224
221
  const base = new URL(this.getBaseHref());
225
- base.pathname += '/' + new URL(resourceURL).pathname;
226
- base.pathname.replace(/\/+/g, '/');
222
+ base.pathname += "/" + new URL(resourceURL).pathname;
223
+ base.pathname.replace(/\/+/g, "/");
227
224
  return base.toString();
228
225
  }
229
226
  isServiceURL(url) {
@@ -242,73 +239,72 @@ export default class App {
242
239
  }
243
240
  _start(startOpts) {
244
241
  if (!this.worker) {
245
- return Promise.resolve(UnsuccessfulStart('No worker found: perhaps, CSP is not set.'));
242
+ return Promise.resolve(UnsuccessfulStart("No worker found: perhaps, CSP is not set."));
246
243
  }
247
244
  if (this.activityState !== ActivityState.NotActive) {
248
- return Promise.resolve(UnsuccessfulStart('OpenReplay: trying to call `start()` on the instance that has been started already.'));
245
+ return Promise.resolve(UnsuccessfulStart("OpenReplay: trying to call `start()` on the instance that has been started already."));
249
246
  }
250
247
  this.activityState = ActivityState.Starting;
251
- const timestamp = now();
248
+ let pageNo = 0;
249
+ const pageNoStr = this.sessionStorage.getItem(this.options.session_pageno_key);
250
+ if (pageNoStr != null) {
251
+ pageNo = parseInt(pageNoStr);
252
+ pageNo++;
253
+ }
254
+ this.sessionStorage.setItem(this.options.session_pageno_key, pageNo.toString());
255
+ const startInfo = this.getStartInfo();
252
256
  const startWorkerMsg = {
253
- type: 'start',
254
- pageNo: this.session.incPageNo(),
257
+ type: "start",
258
+ pageNo,
255
259
  ingestPoint: this.options.ingestPoint,
256
- timestamp,
257
- url: document.URL,
260
+ timestamp: startInfo.timestamp,
258
261
  connAttemptCount: this.options.connAttemptCount,
259
262
  connAttemptGap: this.options.connAttemptGap,
260
263
  };
261
264
  this.worker.postMessage(startWorkerMsg);
262
265
  this.session.update({
263
- // TODO: transparent "session" module logic AND explicit internal api for plugins.
264
- // "updating" with old metadata in order to trigger session's UpdateCallbacks.
266
+ // "updating" with old metadata in order to trigger session's UpdateCallbacks.
265
267
  // (for the case of internal .start() calls, like on "restart" webworker signal or assistent connection in tracker-assist )
266
268
  metadata: startOpts.metadata || this.session.getInfo().metadata,
267
269
  userID: startOpts.userID,
268
270
  });
269
271
  const sReset = this.sessionStorage.getItem(this.options.session_reset_key);
270
272
  this.sessionStorage.removeItem(this.options.session_reset_key);
271
- return window
272
- .fetch(this.options.ingestPoint + '/v1/web/start', {
273
+ return window.fetch(this.options.ingestPoint + '/v1/web/start', {
273
274
  method: 'POST',
274
275
  headers: {
275
276
  'Content-Type': 'application/json',
276
277
  },
277
- body: JSON.stringify(Object.assign(Object.assign({}, this.getTrackerInfo()), { timestamp, userID: this.session.getInfo().userID, token: this.session.getSessionToken(), deviceMemory,
278
+ body: JSON.stringify(Object.assign(Object.assign({}, startInfo), { userID: this.session.getInfo().userID, token: this.sessionStorage.getItem(this.options.session_token_key), deviceMemory,
278
279
  jsHeapSizeLimit, reset: startOpts.forceNew || sReset !== null })),
279
280
  })
280
- .then((r) => {
281
+ .then(r => {
281
282
  if (r.status === 200) {
282
283
  return r.json();
283
284
  }
284
285
  else {
285
- return r
286
- .text()
287
- .then((text) => text === CANCELED
286
+ return r.text().then(text => text === CANCELED
288
287
  ? Promise.reject(CANCELED)
289
288
  : Promise.reject(`Server error: ${r.status}. ${text}`));
290
289
  }
291
290
  })
292
- .then((r) => {
291
+ .then(r => {
293
292
  if (!this.worker) {
294
- return Promise.reject('no worker found after start request (this might not happen)');
293
+ return Promise.reject("no worker found after start request (this might not happen)");
295
294
  }
296
- const { token, userUUID, sessionID, beaconSizeLimit, startTimestamp, // real startTS, derived from sessionID
297
- } = r;
295
+ const { token, userUUID, sessionID, beaconSizeLimit } = r;
298
296
  if (typeof token !== 'string' ||
299
297
  typeof userUUID !== 'string' ||
300
- //typeof startTimestamp !== 'number' ||
301
- //typeof sessionID !== 'string' ||
302
298
  (typeof beaconSizeLimit !== 'number' && typeof beaconSizeLimit !== 'undefined')) {
303
299
  return Promise.reject(`Incorrect server response: ${JSON.stringify(r)}`);
304
300
  }
305
- this.session.setSessionToken(token);
301
+ this.sessionStorage.setItem(this.options.session_token_key, token);
306
302
  this.localStorage.setItem(this.options.local_uuid_key, userUUID);
307
- this.session.update({ sessionID, timestamp: startTimestamp || timestamp }); // TODO: no no-explicit 'any'
303
+ this.session.update({ sessionID }); // TODO: no no-explicit 'any'
308
304
  const startWorkerMsg = {
309
- type: 'auth',
305
+ type: "auth",
310
306
  token,
311
- beaconSizeLimit,
307
+ beaconSizeLimit
312
308
  };
313
309
  this.worker.postMessage(startWorkerMsg);
314
310
  this.activityState = ActivityState.Active;
@@ -316,21 +312,21 @@ export default class App {
316
312
  this.startCallbacks.forEach((cb) => cb(onStartInfo)); // TODO: start as early as possible (before receiving the token)
317
313
  this.observer.observe();
318
314
  this.ticker.start();
319
- this.notify.log('OpenReplay tracking started.');
315
+ this.notify.log("OpenReplay tracking started.");
320
316
  // get rid of onStart ?
321
317
  if (typeof this.options.onStart === 'function') {
322
318
  this.options.onStart(onStartInfo);
323
319
  }
324
320
  return SuccessfulStart(onStartInfo);
325
321
  })
326
- .catch((reason) => {
322
+ .catch(reason => {
323
+ this.sessionStorage.removeItem(this.options.session_token_key);
327
324
  this.stop();
328
- this.session.reset();
329
325
  if (reason === CANCELED) {
330
326
  return UnsuccessfulStart(CANCELED);
331
327
  }
332
- this.notify.log('OpenReplay was unable to start. ', reason);
333
- this._debug('session_start', reason);
328
+ this.notify.log("OpenReplay was unable to start. ", reason);
329
+ this._debug("session_start", reason);
334
330
  return UnsuccessfulStart(START_ERROR);
335
331
  });
336
332
  }
@@ -342,15 +338,15 @@ export default class App {
342
338
  return new Promise((resolve) => {
343
339
  const onVisibilityChange = () => {
344
340
  if (!document.hidden) {
345
- document.removeEventListener('visibilitychange', onVisibilityChange);
341
+ document.removeEventListener("visibilitychange", onVisibilityChange);
346
342
  resolve(this._start(options));
347
343
  }
348
344
  };
349
- document.addEventListener('visibilitychange', onVisibilityChange);
345
+ document.addEventListener("visibilitychange", onVisibilityChange);
350
346
  });
351
347
  }
352
348
  }
353
- stop(stopWorker = true) {
349
+ stop(calledFromAPI = false, restarting = false) {
354
350
  if (this.activityState !== ActivityState.NotActive) {
355
351
  try {
356
352
  this.sanitizer.clear();
@@ -358,9 +354,12 @@ export default class App {
358
354
  this.nodes.clear();
359
355
  this.ticker.stop();
360
356
  this.stopCallbacks.forEach((cb) => cb());
361
- this.notify.log('OpenReplay tracking stopped.');
362
- if (this.worker && stopWorker) {
363
- this.worker.postMessage('stop');
357
+ if (calledFromAPI) {
358
+ this.session.reset();
359
+ }
360
+ this.notify.log("OpenReplay tracking stopped.");
361
+ if (this.worker && !restarting) {
362
+ this.worker.postMessage("stop");
364
363
  }
365
364
  }
366
365
  finally {
@@ -369,7 +368,7 @@ export default class App {
369
368
  }
370
369
  }
371
370
  restart() {
372
- this.stop(false);
371
+ this.stop(false, true);
373
372
  this.start({ forceNew: false });
374
373
  }
375
374
  }
package/lib/app/logger.js CHANGED
@@ -10,12 +10,9 @@ function IsCustomLevel(l) {
10
10
  }
11
11
  export default class Logger {
12
12
  constructor(options = LogLevel.Silent) {
13
- this.options =
14
- options === true
15
- ? { level: LogLevel.Verbose }
16
- : typeof options === 'number'
17
- ? { level: options }
18
- : options;
13
+ this.options = options === true
14
+ ? { level: LogLevel.Verbose }
15
+ : typeof options === "number" ? { level: options } : options;
19
16
  }
20
17
  log(...args) {
21
18
  if (IsCustomLevel(this.options.level)
package/lib/app/nodes.js CHANGED
@@ -5,11 +5,9 @@ export default class Nodes {
5
5
  this.nodeCallbacks = [];
6
6
  this.elementListeners = new Map();
7
7
  }
8
- // Attached once per Tracker instance
9
8
  attachNodeCallback(nodeCallback) {
10
9
  this.nodeCallbacks.push(nodeCallback);
11
10
  }
12
- // TODO: what is the difference with app.attachEventListener. can we use only one of those?
13
11
  attachElementListener(type, node, elementListener) {
14
12
  const id = this.getID(node);
15
13
  if (id === undefined) {
@@ -1,4 +1,4 @@
1
- import Observer from './observer.js';
1
+ import Observer from "./observer.js";
2
2
  export default class IFrameObserver extends Observer {
3
3
  observe(iframe: HTMLIFrameElement): void;
4
4
  }
@@ -1,5 +1,5 @@
1
- import Observer from './observer.js';
2
- import { CreateIFrameDocument } from '../messages.gen.js';
1
+ import Observer from "./observer.js";
2
+ import { CreateIFrameDocument } from "../../common/messages.js";
3
3
  export default class IFrameObserver extends Observer {
4
4
  observe(iframe) {
5
5
  const doc = iframe.contentDocument;
@@ -10,7 +10,7 @@ export default class IFrameObserver extends Observer {
10
10
  // Have to observe document, because the inner <html> might be changed
11
11
  this.observeRoot(doc, (docID) => {
12
12
  if (docID === undefined) {
13
- console.log('OpenReplay: Iframe document not bound');
13
+ console.log("OpenReplay: Iframe document not bound");
14
14
  return;
15
15
  }
16
16
  this.app.send(CreateIFrameDocument(hostID, docID));
@@ -1,4 +1,4 @@
1
- import App from '../index.js';
1
+ import App from "../index.js";
2
2
  export default abstract class Observer {
3
3
  protected readonly app: App;
4
4
  protected readonly isTopContext: boolean;
@@ -13,8 +13,9 @@ export default abstract class Observer {
13
13
  private sendNodeAttribute;
14
14
  private sendNodeData;
15
15
  private bindNode;
16
+ private unbindChildNode;
16
17
  private bindTree;
17
- private unbindTree;
18
+ private unbindNode;
18
19
  private _commitNode;
19
20
  private commitNode;
20
21
  private commitNodes;