@openreplay/tracker 16.4.9 → 16.4.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/entry.js CHANGED
@@ -60,12 +60,12 @@ fl[28] = 258, revfl[258] = 28;
60
60
  var _b = freb(fdeb, 0), revfd = _b.r;
61
61
  // map of value to reverse (assuming 16 bits)
62
62
  var rev = new u16(32768);
63
- for (var i = 0; i < 32768; ++i) {
63
+ for (var i$1 = 0; i$1 < 32768; ++i$1) {
64
64
  // reverse table algorithm from SO
65
- var x$1 = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);
65
+ var x$1 = ((i$1 & 0xAAAA) >> 1) | ((i$1 & 0x5555) << 1);
66
66
  x$1 = ((x$1 & 0xCCCC) >> 2) | ((x$1 & 0x3333) << 2);
67
67
  x$1 = ((x$1 & 0xF0F0) >> 4) | ((x$1 & 0x0F0F) << 4);
68
- rev[i] = (((x$1 & 0xFF00) >> 8) | ((x$1 & 0x00FF) << 8)) >> 1;
68
+ rev[i$1] = (((x$1 & 0xFF00) >> 8) | ((x$1 & 0x00FF) << 8)) >> 1;
69
69
  }
70
70
  // create huffman tree from u8 "map": index -> code length for code index
71
71
  // mb (max bits) must be at most 15
@@ -121,18 +121,18 @@ var hMap = (function (cd, mb, r) {
121
121
  });
122
122
  // fixed length tree
123
123
  var flt = new u8(288);
124
- for (var i = 0; i < 144; ++i)
125
- flt[i] = 8;
126
- for (var i = 144; i < 256; ++i)
127
- flt[i] = 9;
128
- for (var i = 256; i < 280; ++i)
129
- flt[i] = 7;
130
- for (var i = 280; i < 288; ++i)
131
- flt[i] = 8;
124
+ for (var i$1 = 0; i$1 < 144; ++i$1)
125
+ flt[i$1] = 8;
126
+ for (var i$1 = 144; i$1 < 256; ++i$1)
127
+ flt[i$1] = 9;
128
+ for (var i$1 = 256; i$1 < 280; ++i$1)
129
+ flt[i$1] = 7;
130
+ for (var i$1 = 280; i$1 < 288; ++i$1)
131
+ flt[i$1] = 8;
132
132
  // fixed distance tree
133
133
  var fdt = new u8(32);
134
- for (var i = 0; i < 32; ++i)
135
- fdt[i] = 5;
134
+ for (var i$1 = 0; i$1 < 32; ++i$1)
135
+ fdt[i$1] = 5;
136
136
  // fixed length map
137
137
  var flm = /*#__PURE__*/ hMap(flt, 9, 0);
138
138
  // fixed distance map
@@ -3649,6 +3649,27 @@ class Maintainer {
3649
3649
  }
3650
3650
  }
3651
3651
 
3652
+ // 4 levels, 128 frames between each level, 8_388_608 nodes per page
3653
+ // lets hope no one will need more :D
3654
+ const BITS_LEVEL = 2; // 4
3655
+ const BITS_ORDER = 7; // 128
3656
+ const BITS_NODE = 22; // 8_388_608
3657
+ const SHIFT_ORDER = BITS_NODE;
3658
+ const SHIFT_LEVEL = BITS_NODE + BITS_ORDER;
3659
+ const MASK_NODE = (1 << BITS_NODE) - 1;
3660
+ const MASK_ORDER = (1 << BITS_ORDER) - 1;
3661
+ const MASK_LEVEL = (1 << BITS_LEVEL) - 1;
3662
+ function pack(level, order, nodeId) {
3663
+ if (level < 0 || level > MASK_LEVEL)
3664
+ throw new RangeError('OR: nesting level overflow, max 4');
3665
+ if (order < 0 || order > MASK_ORDER)
3666
+ throw new RangeError('OR: frame order overflow, max 128');
3667
+ const v = ((level & MASK_LEVEL) << SHIFT_LEVEL) |
3668
+ ((order & MASK_ORDER) << SHIFT_ORDER) |
3669
+ (nodeId & MASK_NODE);
3670
+ return v >>> 0;
3671
+ }
3672
+
3652
3673
  class Nodes {
3653
3674
  constructor(params) {
3654
3675
  this.nodes = new Map();
@@ -3676,6 +3697,9 @@ class Nodes {
3676
3697
  }
3677
3698
  listeners.push([type, listener, useCapture]);
3678
3699
  };
3700
+ this.createFrameId = (level, frameOrder) => {
3701
+ return pack(level, frameOrder, 0);
3702
+ };
3679
3703
  this.unregisterNode = (node) => {
3680
3704
  const id = node[this.node_id];
3681
3705
  if (id !== undefined) {
@@ -3696,16 +3720,8 @@ class Nodes {
3696
3720
  this.maintainer = new Maintainer(this.nodes, this.unregisterNode, params.maintainer);
3697
3721
  this.maintainer.start();
3698
3722
  }
3699
- syntheticMode(frameOrder) {
3700
- const maxSafeNumber = Number.MAX_SAFE_INTEGER;
3701
- const placeholderSize = 99999999;
3702
- const nextFrameId = placeholderSize * frameOrder;
3703
- // I highly doubt that this will ever happen,
3704
- // but it will be easier to debug if it does
3705
- if (nextFrameId > maxSafeNumber) {
3706
- throw new Error('Placeholder id overflow');
3707
- }
3708
- this.nextNodeId = nextFrameId;
3723
+ crossdomainMode(level, frameOrder) {
3724
+ this.nextNodeId = this.createFrameId(level, frameOrder);
3709
3725
  }
3710
3726
  registerNode(node) {
3711
3727
  let id = node[this.node_id];
@@ -4913,7 +4929,7 @@ class TopObserver extends Observer {
4913
4929
  this.app.nodes.callNodeCallbacks(document, true);
4914
4930
  }, window.document.documentElement);
4915
4931
  }
4916
- crossdomainObserve(rootNodeId, frameOder) {
4932
+ crossdomainObserve(rootNodeId, frameOder, frameLevel) {
4917
4933
  const observer = this;
4918
4934
  Element.prototype.attachShadow = function () {
4919
4935
  // eslint-disable-next-line
@@ -4922,7 +4938,7 @@ class TopObserver extends Observer {
4922
4938
  return shadow;
4923
4939
  };
4924
4940
  this.app.nodes.clear();
4925
- this.app.nodes.syntheticMode(frameOder);
4941
+ this.app.nodes.crossdomainMode(frameLevel, frameOder);
4926
4942
  const iframeObserver = new IFrameObserver(this.app);
4927
4943
  this.iframeObservers.set(window.document, iframeObserver);
4928
4944
  iframeObserver.syntheticObserve(rootNodeId, window.document);
@@ -5276,7 +5292,7 @@ class App {
5276
5292
  this.stopCallbacks = [];
5277
5293
  this.commitCallbacks = [];
5278
5294
  this.activityState = ActivityState.NotActive;
5279
- this.version = '16.4.9'; // TODO: version compatability check inside each plugin.
5295
+ this.version = '16.4.10'; // TODO: version compatability check inside each plugin.
5280
5296
  this.socketMode = false;
5281
5297
  this.compressionThreshold = 24 * 1000;
5282
5298
  this.bc = null;
@@ -5286,10 +5302,8 @@ class App {
5286
5302
  this.rootId = null;
5287
5303
  this.pageFrames = [];
5288
5304
  this.frameOderNumber = 0;
5289
- this.features = {
5290
- 'feature-flags': true,
5291
- 'usability-test': true,
5292
- };
5305
+ this.frameLevel = 0;
5306
+ this.features = {};
5293
5307
  this.emptyBatchCounter = 0;
5294
5308
  /** used by child iframes for crossdomain only */
5295
5309
  this.parentActive = false;
@@ -5319,6 +5333,7 @@ class App {
5319
5333
  this.rootId = data.id;
5320
5334
  this.session.setSessionToken(data.token, this.projectKey);
5321
5335
  this.frameOderNumber = data.frameOrderNumber;
5336
+ this.frameLevel = data.frameLevel;
5322
5337
  this.debug.log('starting iframe tracking', data);
5323
5338
  this.allowAppStart();
5324
5339
  }
@@ -5368,8 +5383,8 @@ class App {
5368
5383
  line: proto.iframeId,
5369
5384
  id,
5370
5385
  token,
5371
- // since indexes go from 0 we +1
5372
5386
  frameOrderNumber: order,
5387
+ frameLevel: this.frameLevel + 1,
5373
5388
  };
5374
5389
  this.debug.log('Got child frame signal; nodeId', id, event.source, iframeData);
5375
5390
  // @ts-ignore
@@ -5856,6 +5871,7 @@ class App {
5856
5871
  * listen for messages from parent window, so we can signal that we're alive
5857
5872
  * */
5858
5873
  window.addEventListener('message', this.parentCrossDomainFrameListener);
5874
+ window.addEventListener('message', this.crossDomainIframeListener);
5859
5875
  setInterval(() => {
5860
5876
  if (document.hidden) {
5861
5877
  return;
@@ -6449,7 +6465,7 @@ class App {
6449
6465
  }
6450
6466
  await this.tagWatcher.fetchTags(this.options.ingestPoint, token);
6451
6467
  this.activityState = ActivityState.Active;
6452
- if (this.options.crossdomain?.enabled && !this.insideIframe) {
6468
+ if (this.options.crossdomain?.enabled) {
6453
6469
  void this.bootChildrenFrames();
6454
6470
  }
6455
6471
  if (canvasEnabled && !this.options.canvas.disableCanvas) {
@@ -6477,7 +6493,7 @@ class App {
6477
6493
  }
6478
6494
  else {
6479
6495
  if (this.insideIframe && this.rootId) {
6480
- this.observer.crossdomainObserve(this.rootId, this.frameOderNumber);
6496
+ this.observer.crossdomainObserve(this.rootId, this.frameOderNumber, this.frameLevel);
6481
6497
  }
6482
6498
  else {
6483
6499
  this.observer.observe();
@@ -6631,7 +6647,7 @@ class App {
6631
6647
  stop(stopWorker = true) {
6632
6648
  if (this.activityState !== ActivityState.NotActive) {
6633
6649
  try {
6634
- if (!this.insideIframe && this.options.crossdomain?.enabled) {
6650
+ if (this.options.crossdomain?.enabled) {
6635
6651
  this.killChildrenFrames();
6636
6652
  }
6637
6653
  this.attributeSender.clear();
@@ -7605,7 +7621,7 @@ function getUniqueSiblingClass(el) {
7605
7621
  return null;
7606
7622
  }
7607
7623
 
7608
- var e,o=-1,a=function(e){addEventListener("pageshow",(function(n){n.persisted&&(o=n.timeStamp,e(n));}),true);},c=function(){var e=self.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),r="navigate";o>=0?r="back-forward-cache":t&&(document.prerendering||u()>0?r="prerender":document.wasDiscarded?r="restore":t.type&&(r=t.type.replace(/_/g,"-")));return {name:e,value:void 0===n?-1:n,rating:"good",delta:0,entries:[],id:"v4-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:r}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var r=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries());}));}));return r.observe(Object.assign({type:e,buffered:!0},t||{})),r}}catch(e){}},d=function(e,n,t,r){var i,o;return function(a){n.value>=0&&(a||r)&&((o=n.value-(i||0))||void 0===i)&&(i=n.value,n.delta=o,n.rating=function(e,n){return e>n[1]?"poor":e>n[0]?"needs-improvement":"good"}(n.value,t),e(n));}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}));},p=function(e){document.addEventListener("visibilitychange",(function(){"hidden"===document.visibilityState&&e();}));},v=function(e){var n=false;return function(){n||(e(),n=true);}},m=-1,h=function(){return "hidden"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){"hidden"===document.visibilityState&&m>-1&&(m="visibilitychange"===e.type?e.timeStamp:0,T());},y=function(){addEventListener("visibilitychange",g,true),addEventListener("prerenderingchange",g,true);},T=function(){removeEventListener("visibilitychange",g,true),removeEventListener("prerenderingchange",g,true);},E=function(){return m<0&&(m=h(),y(),a((function(){setTimeout((function(){m=h(),y();}),0);}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener("prerenderingchange",(function(){return e()}),true):e();},b=[1800,3e3],S=function(e,n){n=n||{},C((function(){var t,r=E(),i=f("FCP"),o=s("paint",(function(e){e.forEach((function(e){"first-contentful-paint"===e.name&&(o.disconnect(),e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries.push(e),t(true)));}));}));o&&(t=d(e,i,b,n.reportAllChanges),a((function(r){i=f("FCP"),t=d(e,i,b,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,t(true);}));})));}));},L=[.1,.25],w=function(e,n){n=n||{},S(v((function(){var t,r=f("CLS",0),i=0,o=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=o[0],t=o[o.length-1];i&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(i+=e.value,o.push(e)):(i=e.value,o=[e]);}})),i>r.value&&(r.value=i,r.entries=o,t());},u=s("layout-shift",c);u&&(t=d(e,r,L,n.reportAllChanges),p((function(){c(u.takeRecords()),t(true);})),a((function(){i=0,r=f("CLS",0),t=d(e,r,L,n.reportAllChanges),l((function(){return t()}));})),setTimeout(t,0));})));},A=0,I=1/0,P=0,M=function(e){e.forEach((function(e){e.interactionId&&(I=Math.min(I,e.interactionId),P=Math.max(P,e.interactionId),A=P?(P-I)/7+1:0);}));},k=function(){return e?A:performance.interactionCount||0},F=function(){"interactionCount"in performance||e||(e=s("event",M,{type:"event",buffered:true,durationThreshold:0}));},D=[],x=new Map,R=0,B=function(){var e=Math.min(D.length-1,Math.floor((k()-R)/50));return D[e]},H=[],q=function(e){if(H.forEach((function(n){return n(e)})),e.interactionId||"first-input"===e.entryType){var n=D[D.length-1],t=x.get(e.interactionId);if(t||D.length<10||e.duration>n.latency){if(t)e.duration>t.latency?(t.entries=[e],t.latency=e.duration):e.duration===t.latency&&e.startTime===t.entries[0].startTime&&t.entries.push(e);else {var r={id:e.interactionId,latency:e.duration,entries:[e]};x.set(r.id,r),D.push(r);}D.sort((function(e,n){return n.latency-e.latency})),D.length>10&&D.splice(10).forEach((function(e){return x.delete(e.id)}));}}},O=function(e){var n=self.requestIdleCallback||self.setTimeout,t=-1;return e=v(e),"hidden"===document.visibilityState?e():(t=n(e),p(e)),t},N=[200,500],j=function(e,n){"PerformanceEventTiming"in self&&"interactionId"in PerformanceEventTiming.prototype&&(n=n||{},C((function(){var t;F();var r,i=f("INP"),o=function(e){O((function(){e.forEach(q);var n=B();n&&n.latency!==i.value&&(i.value=n.latency,i.entries=n.entries,r());}));},c=s("event",o,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});r=d(e,i,N,n.reportAllChanges),c&&(c.observe({type:"first-input",buffered:true}),p((function(){o(c.takeRecords()),r(true);})),a((function(){R=k(),D.length=0,x.clear(),i=f("INP"),r=d(e,i,N,n.reportAllChanges);})));})));},_=[2500,4e3],z={},G=function(e,n){n=n||{},C((function(){var t,r=E(),i=f("LCP"),o=function(e){n.reportAllChanges||(e=e.slice(-1)),e.forEach((function(e){e.startTime<r.firstHiddenTime&&(i.value=Math.max(e.startTime-u(),0),i.entries=[e],t());}));},c=s("largest-contentful-paint",o);if(c){t=d(e,i,_,n.reportAllChanges);var m=v((function(){z[i.id]||(o(c.takeRecords()),c.disconnect(),z[i.id]=true,t(true));}));["keydown","click"].forEach((function(e){addEventListener(e,(function(){return O(m)}),{once:true,capture:true});})),p(m),a((function(r){i=f("LCP"),t=d(e,i,_,n.reportAllChanges),l((function(){i.value=performance.now()-r.timeStamp,z[i.id]=true,t(true);}));}));}}));},J=[800,1800],K=function e(n){document.prerendering?C((function(){return e(n)})):"complete"!==document.readyState?addEventListener("load",(function(){return e(n)}),true):setTimeout(n,0);},Q=function(e,n){n=n||{};var t=f("TTFB"),r=d(e,t,J,n.reportAllChanges);K((function(){var i=c();i&&(t.value=Math.max(i.responseStart-u(),0),t.entries=[i],r(true),a((function(){t=f("TTFB",0),(r=d(e,t,J,n.reportAllChanges))(true);})));}));};
7624
+ let e=-1;const t=t=>{addEventListener("pageshow",(n=>{n.persisted&&(e=n.timeStamp,t(n));}),true);},n=(e,t,n,i)=>{let s,o;return r=>{t.value>=0&&(r||i)&&(o=t.value-(s??0),(o||void 0===s)&&(s=t.value,t.delta=o,t.rating=((e,t)=>e>t[1]?"poor":e>t[0]?"needs-improvement":"good")(t.value,n),e(t)));}},i=e=>{requestAnimationFrame((()=>requestAnimationFrame((()=>e()))));},s=()=>{const e=performance.getEntriesByType("navigation")[0];if(e&&e.responseStart>0&&e.responseStart<performance.now())return e},o=()=>{const e=s();return e?.activationStart??0},r=(t,n=-1)=>{const i=s();let r="navigate";e>=0?r="back-forward-cache":i&&(document.prerendering||o()>0?r="prerender":document.wasDiscarded?r="restore":i.type&&(r=i.type.replace(/_/g,"-")));return {name:t,value:n,rating:"good",delta:0,entries:[],id:`v5-${Date.now()}-${Math.floor(8999999999999*Math.random())+1e12}`,navigationType:r}},c=new WeakMap;function a(e,t){return c.get(e)||c.set(e,new t),c.get(e)}class d{t;i=0;o=[];h(e){if(e.hadRecentInput)return;const t=this.o[0],n=this.o.at(-1);this.i&&t&&n&&e.startTime-n.startTime<1e3&&e.startTime-t.startTime<5e3?(this.i+=e.value,this.o.push(e)):(this.i=e.value,this.o=[e]),this.t?.(e);}}const h=(e,t,n={})=>{try{if(PerformanceObserver.supportedEntryTypes.includes(e)){const i=new PerformanceObserver((e=>{Promise.resolve().then((()=>{t(e.getEntries());}));}));return i.observe({type:e,buffered:!0,...n}),i}}catch{}},f=e=>{let t=false;return ()=>{t||(e(),t=true);}};let u=-1;const l=new Set,m=()=>"hidden"!==document.visibilityState||document.prerendering?1/0:0,p=e=>{if("hidden"===document.visibilityState){if("visibilitychange"===e.type)for(const e of l)e();isFinite(u)||(u="visibilitychange"===e.type?e.timeStamp:0,removeEventListener("prerenderingchange",p,true));}},v=()=>{if(u<0){const e=o(),n=document.prerendering?void 0:globalThis.performance.getEntriesByType("visibility-state").filter((t=>"hidden"===t.name&&t.startTime>e))[0]?.startTime;u=n??m(),addEventListener("visibilitychange",p,true),addEventListener("prerenderingchange",p,true),t((()=>{setTimeout((()=>{u=m();}));}));}return {get firstHiddenTime(){return u},onHidden(e){l.add(e);}}},g=e=>{document.prerendering?addEventListener("prerenderingchange",(()=>e()),true):e();},y=[1800,3e3],E=(e,s={})=>{g((()=>{const c=v();let a,d=r("FCP");const f=h("paint",(e=>{for(const t of e)"first-contentful-paint"===t.name&&(f.disconnect(),t.startTime<c.firstHiddenTime&&(d.value=Math.max(t.startTime-o(),0),d.entries.push(t),a(true)));}));f&&(a=n(e,d,y,s.reportAllChanges),t((t=>{d=r("FCP"),a=n(e,d,y,s.reportAllChanges),i((()=>{d.value=performance.now()-t.timeStamp,a(true);}));})));}));},b=[.1,.25],L=(e,s={})=>{const o=v();E(f((()=>{let c,f=r("CLS",0);const u=a(s,d),l=e=>{for(const t of e)u.h(t);u.i>f.value&&(f.value=u.i,f.entries=u.o,c());},m=h("layout-shift",l);m&&(c=n(e,f,b,s.reportAllChanges),o.onHidden((()=>{l(m.takeRecords()),c(true);})),t((()=>{u.i=0,f=r("CLS",0),c=n(e,f,b,s.reportAllChanges),i((()=>c()));})),setTimeout(c));})));};let P=0,T=1/0,_=0;const M=e=>{for(const t of e)t.interactionId&&(T=Math.min(T,t.interactionId),_=Math.max(_,t.interactionId),P=_?(_-T)/7+1:0);};let w;const C=()=>w?P:performance.interactionCount??0,I=()=>{"interactionCount"in performance||w||(w=h("event",M,{type:"event",buffered:true,durationThreshold:0}));};let F=0;class k{u=[];l=new Map;m;p;v(){F=C(),this.u.length=0,this.l.clear();}L(){const e=Math.min(this.u.length-1,Math.floor((C()-F)/50));return this.u[e]}h(e){if(this.m?.(e),!e.interactionId&&"first-input"!==e.entryType)return;const t=this.u.at(-1);let n=this.l.get(e.interactionId);if(n||this.u.length<10||e.duration>t.P){if(n?e.duration>n.P?(n.entries=[e],n.P=e.duration):e.duration===n.P&&e.startTime===n.entries[0].startTime&&n.entries.push(e):(n={id:e.interactionId,entries:[e],P:e.duration},this.l.set(n.id,n),this.u.push(n)),this.u.sort(((e,t)=>t.P-e.P)),this.u.length>10){const e=this.u.splice(10);for(const t of e)this.l.delete(t.id);}this.p?.(n);}}}const A=e=>{const t=globalThis.requestIdleCallback||setTimeout;"hidden"===document.visibilityState?e():(e=f(e),addEventListener("visibilitychange",e,{once:true,capture:true}),t((()=>{e(),removeEventListener("visibilitychange",e,{capture:true});})));},B=[200,500],S=(e,i={})=>{if(!globalThis.PerformanceEventTiming||!("interactionId"in PerformanceEventTiming.prototype))return;const s=v();g((()=>{I();let o,c=r("INP");const d=a(i,k),f=e=>{A((()=>{for(const t of e)d.h(t);const t=d.L();t&&t.P!==c.value&&(c.value=t.P,c.entries=t.entries,o());}));},u=h("event",f,{durationThreshold:i.durationThreshold??40});o=n(e,c,B,i.reportAllChanges),u&&(u.observe({type:"first-input",buffered:true}),s.onHidden((()=>{f(u.takeRecords()),o(true);})),t((()=>{d.v(),c=r("INP"),o=n(e,c,B,i.reportAllChanges);})));}));};class N{m;h(e){this.m?.(e);}}const q=[2500,4e3],x=(e,s={})=>{g((()=>{const c=v();let d,u=r("LCP");const l=a(s,N),m=e=>{s.reportAllChanges||(e=e.slice(-1));for(const t of e)l.h(t),t.startTime<c.firstHiddenTime&&(u.value=Math.max(t.startTime-o(),0),u.entries=[t],d());},p=h("largest-contentful-paint",m);if(p){d=n(e,u,q,s.reportAllChanges);const o=f((()=>{m(p.takeRecords()),p.disconnect(),d(true);})),c=e=>{e.isTrusted&&(A(o),removeEventListener(e.type,c,{capture:true}));};for(const e of ["keydown","click","visibilitychange"])addEventListener(e,c,{capture:true});t((t=>{u=r("LCP"),d=n(e,u,q,s.reportAllChanges),i((()=>{u.value=performance.now()-t.timeStamp,d(true);}));}));}}));},H=[800,1800],O=e=>{document.prerendering?g((()=>O(e))):"complete"!==document.readyState?addEventListener("load",(()=>O(e)),true):setTimeout(e);},$=(e,i={})=>{let c=r("TTFB"),a=n(e,c,H,i.reportAllChanges);O((()=>{const d=s();d&&(c.value=Math.max(d.responseStart-o(),0),c.entries=[d],a(true),t((()=>{c=r("TTFB",0),a=n(e,c,H,i.reportAllChanges),a(true);})));}));};
7609
7625
 
7610
7626
  function getPaintBlocks(resources) {
7611
7627
  const paintBlocks = [];
@@ -7718,10 +7734,10 @@ function Timing (app, opts) {
7718
7734
  // onINP(): Chromium
7719
7735
  // onLCP(): Chromium, Firefox
7720
7736
  // onTTFB(): Chromium, Firefox, Safari
7721
- w(onVitalsSignal);
7722
- j(onVitalsSignal);
7723
- G(onVitalsSignal);
7724
- Q(onVitalsSignal);
7737
+ L(onVitalsSignal);
7738
+ S(onVitalsSignal);
7739
+ x(onVitalsSignal);
7740
+ $(onVitalsSignal);
7725
7741
  });
7726
7742
  app.attachStopCallback(function () {
7727
7743
  observer.disconnect();
@@ -8512,7 +8528,9 @@ class NetworkMessage {
8512
8528
  });
8513
8529
  if (!messageInfo)
8514
8530
  return null;
8515
- const isGraphql = messageInfo.url.includes("/graphql");
8531
+ const gqlHeader = "application/graphql-response";
8532
+ const isGraphql = messageInfo.url.includes("/graphql")
8533
+ || Object.values(messageInfo.request.headers).some(v => v.includes(gqlHeader));
8516
8534
  if (isGraphql && messageInfo.response.body && typeof messageInfo.response.body === 'string') {
8517
8535
  const isError = messageInfo.response.body.includes("errors");
8518
8536
  messageInfo.status = isError ? 400 : 200;
@@ -8767,15 +8785,6 @@ class BeaconProxy {
8767
8785
  }
8768
8786
  }
8769
8787
 
8770
- var RequestState;
8771
- (function (RequestState) {
8772
- RequestState[RequestState["UNSENT"] = 0] = "UNSENT";
8773
- RequestState[RequestState["OPENED"] = 1] = "OPENED";
8774
- RequestState[RequestState["HEADERS_RECEIVED"] = 2] = "HEADERS_RECEIVED";
8775
- RequestState[RequestState["LOADING"] = 3] = "LOADING";
8776
- RequestState[RequestState["DONE"] = 4] = "DONE";
8777
- })(RequestState || (RequestState = {}));
8778
-
8779
8788
  /**
8780
8789
  * I took inspiration in few stack exchange posts
8781
8790
  * and Tencent vConsole library (MIT)
@@ -8787,19 +8796,19 @@ class ResponseProxyHandler {
8787
8796
  constructor(resp, item) {
8788
8797
  this.resp = resp;
8789
8798
  this.item = item;
8790
- this.mockReader();
8791
8799
  }
8792
8800
  set(target, key, value) {
8793
8801
  return Reflect.set(target, key, value);
8794
8802
  }
8795
8803
  get(target, key) {
8796
8804
  const value = Reflect.get(target, key);
8805
+ if (key === "arrayBuffer" || key === "blob") {
8806
+ return typeof value === "function" ? value.bind(target) : value;
8807
+ }
8797
8808
  switch (key) {
8798
- case 'arrayBuffer':
8799
- case 'blob':
8800
- case 'formData':
8801
- case 'json':
8802
- case 'text':
8809
+ case "formData":
8810
+ case "json":
8811
+ case "text":
8803
8812
  return () => {
8804
8813
  this.item.responseType = key.toLowerCase();
8805
8814
  // @ts-ignore
@@ -8809,74 +8818,13 @@ class ResponseProxyHandler {
8809
8818
  });
8810
8819
  };
8811
8820
  }
8812
- if (typeof value === 'function') {
8821
+ if (typeof value === "function") {
8813
8822
  return value.bind(target);
8814
8823
  }
8815
8824
  else {
8816
8825
  return value;
8817
8826
  }
8818
8827
  }
8819
- mockReader() {
8820
- let readerReceivedValue;
8821
- if (!this.resp.body) {
8822
- // some browsers do not return `body` in some cases, like `OPTIONS` method
8823
- return;
8824
- }
8825
- if (typeof this.resp.body.getReader !== 'function') {
8826
- return;
8827
- }
8828
- const clonedResp = this.resp.clone();
8829
- const _getReader = clonedResp.body.getReader;
8830
- // @ts-ignore
8831
- clonedResp.body.getReader = () => {
8832
- const reader = _getReader.apply(this.resp.body);
8833
- // when readyState is already 4,
8834
- // it's not a chunked stream, or it had already been read.
8835
- // so should not update status.
8836
- if (this.item.readyState === RequestState.DONE) {
8837
- return reader;
8838
- }
8839
- const _read = reader.read;
8840
- const _cancel = reader.cancel;
8841
- this.item.responseType = 'arraybuffer';
8842
- // @ts-ignore
8843
- reader.read = () => {
8844
- return _read.apply(reader).then((result) => {
8845
- if (!readerReceivedValue) {
8846
- // @ts-ignore
8847
- readerReceivedValue = new Uint8Array(result.value);
8848
- }
8849
- else {
8850
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
8851
- const newValue = new Uint8Array(readerReceivedValue.length + result.value.length);
8852
- newValue.set(readerReceivedValue);
8853
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
8854
- newValue.set(result.value, readerReceivedValue.length);
8855
- readerReceivedValue = newValue;
8856
- }
8857
- this.item.endTime = performance.now();
8858
- this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
8859
- this.item.readyState = result.done ? 4 : 3;
8860
- this.item.statusText = result.done ? String(this.item.status) : 'Loading';
8861
- this.item.responseSize = readerReceivedValue.length;
8862
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
8863
- if (result.done) {
8864
- this.item.response = getStringResponseByType(this.item.responseType, readerReceivedValue);
8865
- }
8866
- return result;
8867
- });
8868
- };
8869
- reader.cancel = (...args) => {
8870
- this.item.cancelState = 2;
8871
- this.item.statusText = 'Cancel';
8872
- this.item.endTime = performance.now();
8873
- this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
8874
- this.item.response = getStringResponseByType(this.item.responseType, readerReceivedValue);
8875
- return _cancel.apply(reader, args);
8876
- };
8877
- return reader;
8878
- };
8879
- }
8880
8828
  }
8881
8829
  class FetchProxyHandler {
8882
8830
  constructor(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher) {
@@ -8888,14 +8836,15 @@ class FetchProxyHandler {
8888
8836
  this.tokenUrlMatcher = tokenUrlMatcher;
8889
8837
  }
8890
8838
  apply(target, _, argsList) {
8839
+ var _a;
8891
8840
  const input = argsList[0];
8892
8841
  const init = argsList[1];
8893
8842
  if (!input ||
8894
8843
  // @ts-ignore
8895
- (typeof input !== 'string' && !(input === null || input === void 0 ? void 0 : input.url))) {
8844
+ (typeof input !== "string" && !(input === null || input === void 0 ? void 0 : input.url))) {
8896
8845
  return target.apply(window, argsList);
8897
8846
  }
8898
- const isORUrl = input instanceof URL || typeof input === 'string'
8847
+ const isORUrl = input instanceof URL || typeof input === "string"
8899
8848
  ? this.isServiceUrl(String(input))
8900
8849
  : this.isServiceUrl(String(input.url));
8901
8850
  if (isORUrl) {
@@ -8903,6 +8852,31 @@ class FetchProxyHandler {
8903
8852
  }
8904
8853
  const item = new NetworkMessage(this.ignoredHeaders, this.setSessionTokenHeader, this.sanitize);
8905
8854
  this.beforeFetch(item, input, init);
8855
+ const signal = (argsList[0] instanceof Request ? argsList[0].signal : undefined) ||
8856
+ ((_a = argsList[1]) === null || _a === void 0 ? void 0 : _a.signal);
8857
+ // guard to avoid double-send
8858
+ let abortedNotified = false;
8859
+ const notifyAbort = () => {
8860
+ if (abortedNotified)
8861
+ return;
8862
+ abortedNotified = true;
8863
+ item.endTime = performance.now();
8864
+ item.duration = item.endTime - (item.startTime || item.endTime);
8865
+ item.status = 0;
8866
+ item.statusText = "Aborted";
8867
+ item.readyState = 0;
8868
+ const msg = item.getMessage();
8869
+ if (msg)
8870
+ this.sendMessage(msg);
8871
+ };
8872
+ if (signal) {
8873
+ if (signal.aborted) {
8874
+ notifyAbort();
8875
+ }
8876
+ else {
8877
+ signal.addEventListener("abort", notifyAbort, { once: true });
8878
+ }
8879
+ }
8906
8880
  this.setSessionTokenHeader((name, value) => {
8907
8881
  if (this.tokenUrlMatcher !== undefined) {
8908
8882
  if (!this.tokenUrlMatcher(item.url)) {
@@ -8931,42 +8905,53 @@ class FetchProxyHandler {
8931
8905
  }
8932
8906
  });
8933
8907
  return target.apply(window, argsList)
8934
- .then(this.afterFetch(item))
8908
+ .then(this.afterFetch(item, () => {
8909
+ abortedNotified = true;
8910
+ }))
8935
8911
  .catch((e) => {
8936
- // mock finally
8937
8912
  item.endTime = performance.now();
8938
8913
  item.duration = item.endTime - (item.startTime || item.endTime);
8914
+ if (e && e.name === "AbortError") {
8915
+ item.status = 0;
8916
+ item.statusText = "Aborted";
8917
+ item.readyState = 0;
8918
+ if (!abortedNotified) {
8919
+ const msg = item.getMessage();
8920
+ if (msg)
8921
+ this.sendMessage(msg);
8922
+ }
8923
+ }
8939
8924
  throw e;
8940
8925
  });
8941
8926
  }
8942
8927
  beforeFetch(item, input, init) {
8943
- let url, method = 'GET', requestHeader = {};
8928
+ let url, method = "GET", requestHeader = {};
8944
8929
  // handle `input` content
8945
- if (typeof input === 'string') {
8930
+ if (typeof input === "string") {
8946
8931
  // when `input` is a string
8947
- method = (init === null || init === void 0 ? void 0 : init.method) || 'GET';
8932
+ method = (init === null || init === void 0 ? void 0 : init.method) || "GET";
8948
8933
  url = getURL(input);
8949
8934
  requestHeader = (init === null || init === void 0 ? void 0 : init.headers) || {};
8950
8935
  }
8951
8936
  else {
8952
8937
  // when `input` is a `Request` object
8953
- method = input.method || 'GET';
8938
+ method = input.method || "GET";
8954
8939
  url = getURL(input.url);
8955
8940
  requestHeader = input.headers;
8956
8941
  }
8957
8942
  item.method = method;
8958
- item.requestType = 'fetch';
8943
+ item.requestType = "fetch";
8959
8944
  item.requestHeader = requestHeader;
8960
8945
  item.url = url.toString();
8961
- item.name = (url.pathname.split('/').pop() || '') + url.search;
8946
+ item.name = (url.pathname.split("/").pop() || "") + url.search;
8962
8947
  item.status = 0;
8963
- item.statusText = 'Pending';
8948
+ item.statusText = "Pending";
8964
8949
  item.readyState = 1;
8965
8950
  if (!item.startTime) {
8966
8951
  // UNSENT
8967
8952
  item.startTime = performance.now();
8968
8953
  }
8969
- if (Object.prototype.toString.call(requestHeader) === '[object Headers]') {
8954
+ if (Object.prototype.toString.call(requestHeader) === "[object Headers]") {
8970
8955
  item.requestHeader = {};
8971
8956
  for (const [key, value] of requestHeader) {
8972
8957
  item.requestHeader[key] = value;
@@ -8987,8 +8972,10 @@ class FetchProxyHandler {
8987
8972
  item.requestData = genStringBody(init.body);
8988
8973
  }
8989
8974
  }
8990
- afterFetch(item) {
8975
+ afterFetch(item, onResolved) {
8991
8976
  return (resp) => {
8977
+ if (onResolved)
8978
+ onResolved === null || onResolved === void 0 ? void 0 : onResolved();
8992
8979
  item.endTime = performance.now();
8993
8980
  item.duration = item.endTime - (item.startTime || item.endTime);
8994
8981
  item.status = resp.status;
@@ -8997,7 +8984,8 @@ class FetchProxyHandler {
8997
8984
  item.header = {};
8998
8985
  for (const [key, value] of resp.headers) {
8999
8986
  item.header[key] = value;
9000
- isChunked = value.toLowerCase().indexOf('chunked') > -1 ? true : isChunked;
8987
+ isChunked =
8988
+ value.toLowerCase().indexOf("chunked") > -1 ? true : isChunked;
9001
8989
  }
9002
8990
  if (isChunked) {
9003
8991
  // when `transfer-encoding` is chunked, the response is a stream which is under loading,
@@ -9012,7 +9000,9 @@ class FetchProxyHandler {
9012
9000
  this.handleResponseBody(resp.clone(), item)
9013
9001
  .then((responseValue) => {
9014
9002
  item.responseSize =
9015
- typeof responseValue === 'string' ? responseValue.length : responseValue.byteLength;
9003
+ typeof responseValue === "string"
9004
+ ? responseValue.length
9005
+ : responseValue.byteLength;
9016
9006
  item.responseSizeText = formatByteSize(item.responseSize);
9017
9007
  item.response = getStringResponseByType(item.responseType, responseValue);
9018
9008
  const msg = item.getMessage();
@@ -9021,28 +9011,40 @@ class FetchProxyHandler {
9021
9011
  }
9022
9012
  })
9023
9013
  .catch((e) => {
9024
- if (e.name !== 'AbortError') {
9014
+ if (e.name === "AbortError") {
9015
+ item.status = 0;
9016
+ item.statusText = "Aborted";
9017
+ item.readyState = 0;
9018
+ const msg = item.getMessage();
9019
+ if (msg)
9020
+ this.sendMessage(msg);
9021
+ }
9022
+ else {
9025
9023
  throw e;
9026
9024
  }
9027
9025
  });
9028
9026
  }
9029
- return new Proxy(resp, new ResponseProxyHandler(resp, item));
9027
+ const ct = (resp.headers.get("content-type") || "").toLowerCase();
9028
+ const isTextLike = ct.includes("application/json") || ct.startsWith("text/");
9029
+ return isTextLike
9030
+ ? new Proxy(resp, new ResponseProxyHandler(resp, item))
9031
+ : resp;
9030
9032
  };
9031
9033
  }
9032
9034
  handleResponseBody(resp, item) {
9033
9035
  // parse response body by Content-Type
9034
- const contentType = resp.headers.get('content-type');
9035
- if (contentType && contentType.includes('application/json')) {
9036
- item.responseType = 'json';
9036
+ const contentType = resp.headers.get("content-type");
9037
+ if (contentType && contentType.includes("application/json")) {
9038
+ item.responseType = "json";
9037
9039
  return resp.text();
9038
9040
  }
9039
9041
  else if (contentType &&
9040
- (contentType.includes('text/html') || contentType.includes('text/plain'))) {
9041
- item.responseType = 'text';
9042
+ (contentType.includes("text/html") || contentType.includes("text/plain"))) {
9043
+ item.responseType = "text";
9042
9044
  return resp.text();
9043
9045
  }
9044
9046
  else {
9045
- item.responseType = 'arraybuffer';
9047
+ item.responseType = "arraybuffer";
9046
9048
  return resp.arrayBuffer();
9047
9049
  }
9048
9050
  }
@@ -9053,6 +9055,15 @@ class FetchProxy {
9053
9055
  }
9054
9056
  }
9055
9057
 
9058
+ var RequestState;
9059
+ (function (RequestState) {
9060
+ RequestState[RequestState["UNSENT"] = 0] = "UNSENT";
9061
+ RequestState[RequestState["OPENED"] = 1] = "OPENED";
9062
+ RequestState[RequestState["HEADERS_RECEIVED"] = 2] = "HEADERS_RECEIVED";
9063
+ RequestState[RequestState["LOADING"] = 3] = "LOADING";
9064
+ RequestState[RequestState["DONE"] = 4] = "DONE";
9065
+ })(RequestState || (RequestState = {}));
9066
+
9056
9067
  /**
9057
9068
  * I took inspiration in few stack exchange posts
9058
9069
  * and Tencent vConsole library (MIT)
@@ -9079,28 +9090,29 @@ class XHRProxyHandler {
9079
9090
  this.onTimeout();
9080
9091
  };
9081
9092
  this.item = new NetworkMessage(ignoredHeaders, setSessionTokenHeader, sanitize);
9082
- this.item.requestType = 'xhr';
9093
+ this.item.requestType = "xhr";
9083
9094
  }
9084
9095
  get(target, key) {
9085
9096
  switch (key) {
9086
- case 'open':
9097
+ case "open":
9087
9098
  return this.getOpen(target);
9088
- case 'send':
9099
+ case "send":
9089
9100
  this.setSessionTokenHeader((name, value) => {
9090
9101
  if (this.tokenUrlMatcher !== undefined) {
9091
9102
  if (!this.tokenUrlMatcher(this.item.url)) {
9092
9103
  return;
9093
9104
  }
9094
9105
  }
9095
- target.setRequestHeader(name, value);
9106
+ if (target.readyState === 1)
9107
+ target.setRequestHeader(name, value);
9096
9108
  });
9097
9109
  return this.getSend(target);
9098
- case 'setRequestHeader':
9110
+ case "setRequestHeader":
9099
9111
  return this.getSetRequestHeader(target);
9100
9112
  default:
9101
9113
  // eslint-disable-next-line no-case-declarations
9102
9114
  const value = Reflect.get(target, key);
9103
- if (typeof value === 'function') {
9115
+ if (typeof value === "function") {
9104
9116
  return value.bind(target);
9105
9117
  }
9106
9118
  else {
@@ -9110,11 +9122,11 @@ class XHRProxyHandler {
9110
9122
  }
9111
9123
  set(target, key, value) {
9112
9124
  switch (key) {
9113
- case 'onreadystatechange':
9125
+ case "onreadystatechange":
9114
9126
  return this.setOnReadyStateChange(target, key, value);
9115
- case 'onabort':
9127
+ case "onabort":
9116
9128
  return this.setOnAbort(target, key, value);
9117
- case 'ontimeout':
9129
+ case "ontimeout":
9118
9130
  return this.setOnTimeout(target, key, value);
9119
9131
  // not tracked methods
9120
9132
  }
@@ -9128,9 +9140,12 @@ class XHRProxyHandler {
9128
9140
  this.item.endTime = performance.now();
9129
9141
  this.item.duration = this.item.endTime - this.item.startTime;
9130
9142
  this.updateItemByReadyState();
9131
- setTimeout(() => {
9132
- this.item.response = getStringResponseByType(this.item.responseType, this.item.response);
9133
- }, 0);
9143
+ const rt = this.item.responseType || "";
9144
+ if (rt === "" || rt === "text" || rt === "json") {
9145
+ setTimeout(() => {
9146
+ this.item.response = getStringResponseByType(rt, this.XMLReq.response);
9147
+ }, 0);
9148
+ }
9134
9149
  if (this.XMLReq.readyState === RequestState.DONE) {
9135
9150
  const msg = this.item.getMessage();
9136
9151
  if (msg) {
@@ -9140,7 +9155,7 @@ class XHRProxyHandler {
9140
9155
  }
9141
9156
  onAbort() {
9142
9157
  this.item.cancelState = 1;
9143
- this.item.statusText = 'Abort';
9158
+ this.item.statusText = "Abort";
9144
9159
  const msg = this.item.getMessage();
9145
9160
  if (msg) {
9146
9161
  this.sendMessage(msg);
@@ -9148,27 +9163,28 @@ class XHRProxyHandler {
9148
9163
  }
9149
9164
  onTimeout() {
9150
9165
  this.item.cancelState = 3;
9151
- this.item.statusText = 'Timeout';
9166
+ this.item.statusText = "Timeout";
9152
9167
  const msg = this.item.getMessage();
9153
9168
  if (msg) {
9154
9169
  this.sendMessage(msg);
9155
9170
  }
9156
9171
  }
9157
9172
  getOpen(target) {
9158
- const targetFunction = Reflect.get(target, 'open');
9173
+ const targetFunction = Reflect.get(target, "open");
9159
9174
  return (...args) => {
9160
9175
  var _a, _b, _c;
9161
9176
  const method = args[0];
9162
9177
  const url = args[1];
9163
- this.item.method = method ? method.toUpperCase() : 'GET';
9164
- this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) || '';
9165
- this.item.name = (_c = (_b = this.item.url) === null || _b === void 0 ? void 0 : _b.replace(new RegExp('/*$'), '').split('/').pop()) !== null && _c !== void 0 ? _c : '';
9178
+ this.item.method = method ? method.toUpperCase() : "GET";
9179
+ this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) || "";
9180
+ this.item.name =
9181
+ (_c = (_b = this.item.url) === null || _b === void 0 ? void 0 : _b.replace(new RegExp("/*$"), "").split("/").pop()) !== null && _c !== void 0 ? _c : "";
9166
9182
  this.item.getData = genGetDataByUrl(this.item.url, {});
9167
9183
  return targetFunction.apply(target, args);
9168
9184
  };
9169
9185
  }
9170
9186
  getSend(target) {
9171
- const targetFunction = Reflect.get(target, 'send');
9187
+ const targetFunction = Reflect.get(target, "send");
9172
9188
  return (...args) => {
9173
9189
  const data = args[0];
9174
9190
  this.item.requestData = genStringBody(data);
@@ -9176,7 +9192,7 @@ class XHRProxyHandler {
9176
9192
  };
9177
9193
  }
9178
9194
  getSetRequestHeader(target) {
9179
- const targetFunction = Reflect.get(target, 'setRequestHeader');
9195
+ const targetFunction = Reflect.get(target, "setRequestHeader");
9180
9196
  return (...args) => {
9181
9197
  if (!this.item.requestHeader) {
9182
9198
  this.item.requestHeader = {};
@@ -9212,34 +9228,44 @@ class XHRProxyHandler {
9212
9228
  case RequestState.UNSENT:
9213
9229
  case RequestState.OPENED:
9214
9230
  this.item.status = RequestState.UNSENT;
9215
- this.item.statusText = 'Pending';
9231
+ this.item.statusText = "Pending";
9216
9232
  if (!this.item.startTime) {
9217
9233
  this.item.startTime = performance.now();
9218
9234
  }
9219
9235
  break;
9220
9236
  case RequestState.HEADERS_RECEIVED:
9221
9237
  this.item.status = this.XMLReq.status;
9222
- this.item.statusText = 'Loading';
9238
+ this.item.statusText = "Loading";
9223
9239
  this.item.header = {};
9224
9240
  // eslint-disable-next-line no-case-declarations
9225
- const header = this.XMLReq.getAllResponseHeaders() || '', headerArr = header.split('\n');
9241
+ const header = this.XMLReq.getAllResponseHeaders() || "", headerArr = header.split("\n");
9226
9242
  // extract plain text to key-value format
9227
9243
  for (let i = 0; i < headerArr.length; i++) {
9228
9244
  const line = headerArr[i];
9229
9245
  if (!line) {
9230
9246
  continue;
9231
9247
  }
9232
- const arr = line.split(': ');
9248
+ const arr = line.split(": ");
9233
9249
  const key = arr[0];
9234
- this.item.header[key] = arr.slice(1).join(': ');
9250
+ this.item.header[key] = arr.slice(1).join(": ");
9235
9251
  }
9236
9252
  break;
9237
9253
  case RequestState.LOADING:
9238
9254
  this.item.status = this.XMLReq.status;
9239
- this.item.statusText = 'Loading';
9240
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9241
- this.item.responseSize = this.XMLReq.response.length;
9242
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
9255
+ this.item.statusText = "Loading";
9256
+ const response = this.XMLReq.response;
9257
+ if (response) {
9258
+ const respSize = typeof response === "string"
9259
+ ? response.length
9260
+ : response instanceof ArrayBuffer
9261
+ ? response.byteLength
9262
+ : typeof Blob !== "undefined" && response instanceof Blob
9263
+ ? response.size
9264
+ : 0;
9265
+ if (respSize) {
9266
+ this.item.responseSize = respSize;
9267
+ this.item.responseSizeText = formatByteSize(this.item.responseSize);
9268
+ }
9243
9269
  }
9244
9270
  break;
9245
9271
  case RequestState.DONE:
@@ -9248,16 +9274,30 @@ class XHRProxyHandler {
9248
9274
  // show status code when request completed
9249
9275
  this.item.statusText = String(this.item.status);
9250
9276
  this.item.endTime = performance.now();
9251
- this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
9252
- this.item.response = this.XMLReq.response;
9253
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9254
- this.item.responseSize = this.XMLReq.response.length;
9255
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
9277
+ this.item.duration =
9278
+ this.item.endTime - (this.item.startTime || this.item.endTime);
9279
+ const resp = this.XMLReq.response;
9280
+ const respType = this.XMLReq.responseType || "";
9281
+ if (respType === "" || respType === "text" || respType === "json") {
9282
+ this.item.response = resp;
9283
+ }
9284
+ if (resp) {
9285
+ const respSize = typeof resp === "string"
9286
+ ? resp.length
9287
+ : resp instanceof ArrayBuffer
9288
+ ? resp.byteLength
9289
+ : typeof Blob !== "undefined" && resp instanceof Blob
9290
+ ? resp.size
9291
+ : 0;
9292
+ if (respSize) {
9293
+ this.item.responseSize = respSize;
9294
+ this.item.responseSizeText = formatByteSize(respSize);
9295
+ }
9256
9296
  }
9257
9297
  break;
9258
9298
  default:
9259
9299
  this.item.status = this.XMLReq.status;
9260
- this.item.statusText = 'Unknown';
9300
+ this.item.statusText = "Unknown";
9261
9301
  break;
9262
9302
  }
9263
9303
  }
@@ -9675,7 +9715,7 @@ class API {
9675
9715
  this.signalStartIssue = (reason, missingApi) => {
9676
9716
  const doNotTrack = this.checkDoNotTrack();
9677
9717
  console.log("Tracker couldn't start due to:", JSON.stringify({
9678
- trackerVersion: '16.4.9',
9718
+ trackerVersion: '16.4.10',
9679
9719
  projectKey: this.options.projectKey,
9680
9720
  doNotTrack,
9681
9721
  reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,