@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/lib/entry.js CHANGED
@@ -56,12 +56,12 @@ fl[28] = 258, revfl[258] = 28;
56
56
  var _b = freb(fdeb, 0), revfd = _b.r;
57
57
  // map of value to reverse (assuming 16 bits)
58
58
  var rev = new u16(32768);
59
- for (var i = 0; i < 32768; ++i) {
59
+ for (var i$1 = 0; i$1 < 32768; ++i$1) {
60
60
  // reverse table algorithm from SO
61
- var x$1 = ((i & 0xAAAA) >> 1) | ((i & 0x5555) << 1);
61
+ var x$1 = ((i$1 & 0xAAAA) >> 1) | ((i$1 & 0x5555) << 1);
62
62
  x$1 = ((x$1 & 0xCCCC) >> 2) | ((x$1 & 0x3333) << 2);
63
63
  x$1 = ((x$1 & 0xF0F0) >> 4) | ((x$1 & 0x0F0F) << 4);
64
- rev[i] = (((x$1 & 0xFF00) >> 8) | ((x$1 & 0x00FF) << 8)) >> 1;
64
+ rev[i$1] = (((x$1 & 0xFF00) >> 8) | ((x$1 & 0x00FF) << 8)) >> 1;
65
65
  }
66
66
  // create huffman tree from u8 "map": index -> code length for code index
67
67
  // mb (max bits) must be at most 15
@@ -117,18 +117,18 @@ var hMap = (function (cd, mb, r) {
117
117
  });
118
118
  // fixed length tree
119
119
  var flt = new u8(288);
120
- for (var i = 0; i < 144; ++i)
121
- flt[i] = 8;
122
- for (var i = 144; i < 256; ++i)
123
- flt[i] = 9;
124
- for (var i = 256; i < 280; ++i)
125
- flt[i] = 7;
126
- for (var i = 280; i < 288; ++i)
127
- flt[i] = 8;
120
+ for (var i$1 = 0; i$1 < 144; ++i$1)
121
+ flt[i$1] = 8;
122
+ for (var i$1 = 144; i$1 < 256; ++i$1)
123
+ flt[i$1] = 9;
124
+ for (var i$1 = 256; i$1 < 280; ++i$1)
125
+ flt[i$1] = 7;
126
+ for (var i$1 = 280; i$1 < 288; ++i$1)
127
+ flt[i$1] = 8;
128
128
  // fixed distance tree
129
129
  var fdt = new u8(32);
130
- for (var i = 0; i < 32; ++i)
131
- fdt[i] = 5;
130
+ for (var i$1 = 0; i$1 < 32; ++i$1)
131
+ fdt[i$1] = 5;
132
132
  // fixed length map
133
133
  var flm = /*#__PURE__*/ hMap(flt, 9, 0);
134
134
  // fixed distance map
@@ -3645,6 +3645,27 @@ class Maintainer {
3645
3645
  }
3646
3646
  }
3647
3647
 
3648
+ // 4 levels, 128 frames between each level, 8_388_608 nodes per page
3649
+ // lets hope no one will need more :D
3650
+ const BITS_LEVEL = 2; // 4
3651
+ const BITS_ORDER = 7; // 128
3652
+ const BITS_NODE = 22; // 8_388_608
3653
+ const SHIFT_ORDER = BITS_NODE;
3654
+ const SHIFT_LEVEL = BITS_NODE + BITS_ORDER;
3655
+ const MASK_NODE = (1 << BITS_NODE) - 1;
3656
+ const MASK_ORDER = (1 << BITS_ORDER) - 1;
3657
+ const MASK_LEVEL = (1 << BITS_LEVEL) - 1;
3658
+ function pack(level, order, nodeId) {
3659
+ if (level < 0 || level > MASK_LEVEL)
3660
+ throw new RangeError('OR: nesting level overflow, max 4');
3661
+ if (order < 0 || order > MASK_ORDER)
3662
+ throw new RangeError('OR: frame order overflow, max 128');
3663
+ const v = ((level & MASK_LEVEL) << SHIFT_LEVEL) |
3664
+ ((order & MASK_ORDER) << SHIFT_ORDER) |
3665
+ (nodeId & MASK_NODE);
3666
+ return v >>> 0;
3667
+ }
3668
+
3648
3669
  class Nodes {
3649
3670
  constructor(params) {
3650
3671
  this.nodes = new Map();
@@ -3672,6 +3693,9 @@ class Nodes {
3672
3693
  }
3673
3694
  listeners.push([type, listener, useCapture]);
3674
3695
  };
3696
+ this.createFrameId = (level, frameOrder) => {
3697
+ return pack(level, frameOrder, 0);
3698
+ };
3675
3699
  this.unregisterNode = (node) => {
3676
3700
  const id = node[this.node_id];
3677
3701
  if (id !== undefined) {
@@ -3692,16 +3716,8 @@ class Nodes {
3692
3716
  this.maintainer = new Maintainer(this.nodes, this.unregisterNode, params.maintainer);
3693
3717
  this.maintainer.start();
3694
3718
  }
3695
- syntheticMode(frameOrder) {
3696
- const maxSafeNumber = Number.MAX_SAFE_INTEGER;
3697
- const placeholderSize = 99999999;
3698
- const nextFrameId = placeholderSize * frameOrder;
3699
- // I highly doubt that this will ever happen,
3700
- // but it will be easier to debug if it does
3701
- if (nextFrameId > maxSafeNumber) {
3702
- throw new Error('Placeholder id overflow');
3703
- }
3704
- this.nextNodeId = nextFrameId;
3719
+ crossdomainMode(level, frameOrder) {
3720
+ this.nextNodeId = this.createFrameId(level, frameOrder);
3705
3721
  }
3706
3722
  registerNode(node) {
3707
3723
  let id = node[this.node_id];
@@ -4909,7 +4925,7 @@ class TopObserver extends Observer {
4909
4925
  this.app.nodes.callNodeCallbacks(document, true);
4910
4926
  }, window.document.documentElement);
4911
4927
  }
4912
- crossdomainObserve(rootNodeId, frameOder) {
4928
+ crossdomainObserve(rootNodeId, frameOder, frameLevel) {
4913
4929
  const observer = this;
4914
4930
  Element.prototype.attachShadow = function () {
4915
4931
  // eslint-disable-next-line
@@ -4918,7 +4934,7 @@ class TopObserver extends Observer {
4918
4934
  return shadow;
4919
4935
  };
4920
4936
  this.app.nodes.clear();
4921
- this.app.nodes.syntheticMode(frameOder);
4937
+ this.app.nodes.crossdomainMode(frameLevel, frameOder);
4922
4938
  const iframeObserver = new IFrameObserver(this.app);
4923
4939
  this.iframeObservers.set(window.document, iframeObserver);
4924
4940
  iframeObserver.syntheticObserve(rootNodeId, window.document);
@@ -5272,7 +5288,7 @@ class App {
5272
5288
  this.stopCallbacks = [];
5273
5289
  this.commitCallbacks = [];
5274
5290
  this.activityState = ActivityState.NotActive;
5275
- this.version = '16.4.9'; // TODO: version compatability check inside each plugin.
5291
+ this.version = '16.4.10'; // TODO: version compatability check inside each plugin.
5276
5292
  this.socketMode = false;
5277
5293
  this.compressionThreshold = 24 * 1000;
5278
5294
  this.bc = null;
@@ -5282,10 +5298,8 @@ class App {
5282
5298
  this.rootId = null;
5283
5299
  this.pageFrames = [];
5284
5300
  this.frameOderNumber = 0;
5285
- this.features = {
5286
- 'feature-flags': true,
5287
- 'usability-test': true,
5288
- };
5301
+ this.frameLevel = 0;
5302
+ this.features = {};
5289
5303
  this.emptyBatchCounter = 0;
5290
5304
  /** used by child iframes for crossdomain only */
5291
5305
  this.parentActive = false;
@@ -5315,6 +5329,7 @@ class App {
5315
5329
  this.rootId = data.id;
5316
5330
  this.session.setSessionToken(data.token, this.projectKey);
5317
5331
  this.frameOderNumber = data.frameOrderNumber;
5332
+ this.frameLevel = data.frameLevel;
5318
5333
  this.debug.log('starting iframe tracking', data);
5319
5334
  this.allowAppStart();
5320
5335
  }
@@ -5364,8 +5379,8 @@ class App {
5364
5379
  line: proto.iframeId,
5365
5380
  id,
5366
5381
  token,
5367
- // since indexes go from 0 we +1
5368
5382
  frameOrderNumber: order,
5383
+ frameLevel: this.frameLevel + 1,
5369
5384
  };
5370
5385
  this.debug.log('Got child frame signal; nodeId', id, event.source, iframeData);
5371
5386
  // @ts-ignore
@@ -5852,6 +5867,7 @@ class App {
5852
5867
  * listen for messages from parent window, so we can signal that we're alive
5853
5868
  * */
5854
5869
  window.addEventListener('message', this.parentCrossDomainFrameListener);
5870
+ window.addEventListener('message', this.crossDomainIframeListener);
5855
5871
  setInterval(() => {
5856
5872
  if (document.hidden) {
5857
5873
  return;
@@ -6445,7 +6461,7 @@ class App {
6445
6461
  }
6446
6462
  await this.tagWatcher.fetchTags(this.options.ingestPoint, token);
6447
6463
  this.activityState = ActivityState.Active;
6448
- if (this.options.crossdomain?.enabled && !this.insideIframe) {
6464
+ if (this.options.crossdomain?.enabled) {
6449
6465
  void this.bootChildrenFrames();
6450
6466
  }
6451
6467
  if (canvasEnabled && !this.options.canvas.disableCanvas) {
@@ -6473,7 +6489,7 @@ class App {
6473
6489
  }
6474
6490
  else {
6475
6491
  if (this.insideIframe && this.rootId) {
6476
- this.observer.crossdomainObserve(this.rootId, this.frameOderNumber);
6492
+ this.observer.crossdomainObserve(this.rootId, this.frameOderNumber, this.frameLevel);
6477
6493
  }
6478
6494
  else {
6479
6495
  this.observer.observe();
@@ -6627,7 +6643,7 @@ class App {
6627
6643
  stop(stopWorker = true) {
6628
6644
  if (this.activityState !== ActivityState.NotActive) {
6629
6645
  try {
6630
- if (!this.insideIframe && this.options.crossdomain?.enabled) {
6646
+ if (this.options.crossdomain?.enabled) {
6631
6647
  this.killChildrenFrames();
6632
6648
  }
6633
6649
  this.attributeSender.clear();
@@ -7601,7 +7617,7 @@ function getUniqueSiblingClass(el) {
7601
7617
  return null;
7602
7618
  }
7603
7619
 
7604
- 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);})));}));};
7620
+ 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);})));}));};
7605
7621
 
7606
7622
  function getPaintBlocks(resources) {
7607
7623
  const paintBlocks = [];
@@ -7714,10 +7730,10 @@ function Timing (app, opts) {
7714
7730
  // onINP(): Chromium
7715
7731
  // onLCP(): Chromium, Firefox
7716
7732
  // onTTFB(): Chromium, Firefox, Safari
7717
- w(onVitalsSignal);
7718
- j(onVitalsSignal);
7719
- G(onVitalsSignal);
7720
- Q(onVitalsSignal);
7733
+ L(onVitalsSignal);
7734
+ S(onVitalsSignal);
7735
+ x(onVitalsSignal);
7736
+ $(onVitalsSignal);
7721
7737
  });
7722
7738
  app.attachStopCallback(function () {
7723
7739
  observer.disconnect();
@@ -8508,7 +8524,9 @@ class NetworkMessage {
8508
8524
  });
8509
8525
  if (!messageInfo)
8510
8526
  return null;
8511
- const isGraphql = messageInfo.url.includes("/graphql");
8527
+ const gqlHeader = "application/graphql-response";
8528
+ const isGraphql = messageInfo.url.includes("/graphql")
8529
+ || Object.values(messageInfo.request.headers).some(v => v.includes(gqlHeader));
8512
8530
  if (isGraphql && messageInfo.response.body && typeof messageInfo.response.body === 'string') {
8513
8531
  const isError = messageInfo.response.body.includes("errors");
8514
8532
  messageInfo.status = isError ? 400 : 200;
@@ -8763,15 +8781,6 @@ class BeaconProxy {
8763
8781
  }
8764
8782
  }
8765
8783
 
8766
- var RequestState;
8767
- (function (RequestState) {
8768
- RequestState[RequestState["UNSENT"] = 0] = "UNSENT";
8769
- RequestState[RequestState["OPENED"] = 1] = "OPENED";
8770
- RequestState[RequestState["HEADERS_RECEIVED"] = 2] = "HEADERS_RECEIVED";
8771
- RequestState[RequestState["LOADING"] = 3] = "LOADING";
8772
- RequestState[RequestState["DONE"] = 4] = "DONE";
8773
- })(RequestState || (RequestState = {}));
8774
-
8775
8784
  /**
8776
8785
  * I took inspiration in few stack exchange posts
8777
8786
  * and Tencent vConsole library (MIT)
@@ -8783,19 +8792,19 @@ class ResponseProxyHandler {
8783
8792
  constructor(resp, item) {
8784
8793
  this.resp = resp;
8785
8794
  this.item = item;
8786
- this.mockReader();
8787
8795
  }
8788
8796
  set(target, key, value) {
8789
8797
  return Reflect.set(target, key, value);
8790
8798
  }
8791
8799
  get(target, key) {
8792
8800
  const value = Reflect.get(target, key);
8801
+ if (key === "arrayBuffer" || key === "blob") {
8802
+ return typeof value === "function" ? value.bind(target) : value;
8803
+ }
8793
8804
  switch (key) {
8794
- case 'arrayBuffer':
8795
- case 'blob':
8796
- case 'formData':
8797
- case 'json':
8798
- case 'text':
8805
+ case "formData":
8806
+ case "json":
8807
+ case "text":
8799
8808
  return () => {
8800
8809
  this.item.responseType = key.toLowerCase();
8801
8810
  // @ts-ignore
@@ -8805,74 +8814,13 @@ class ResponseProxyHandler {
8805
8814
  });
8806
8815
  };
8807
8816
  }
8808
- if (typeof value === 'function') {
8817
+ if (typeof value === "function") {
8809
8818
  return value.bind(target);
8810
8819
  }
8811
8820
  else {
8812
8821
  return value;
8813
8822
  }
8814
8823
  }
8815
- mockReader() {
8816
- let readerReceivedValue;
8817
- if (!this.resp.body) {
8818
- // some browsers do not return `body` in some cases, like `OPTIONS` method
8819
- return;
8820
- }
8821
- if (typeof this.resp.body.getReader !== 'function') {
8822
- return;
8823
- }
8824
- const clonedResp = this.resp.clone();
8825
- const _getReader = clonedResp.body.getReader;
8826
- // @ts-ignore
8827
- clonedResp.body.getReader = () => {
8828
- const reader = _getReader.apply(this.resp.body);
8829
- // when readyState is already 4,
8830
- // it's not a chunked stream, or it had already been read.
8831
- // so should not update status.
8832
- if (this.item.readyState === RequestState.DONE) {
8833
- return reader;
8834
- }
8835
- const _read = reader.read;
8836
- const _cancel = reader.cancel;
8837
- this.item.responseType = 'arraybuffer';
8838
- // @ts-ignore
8839
- reader.read = () => {
8840
- return _read.apply(reader).then((result) => {
8841
- if (!readerReceivedValue) {
8842
- // @ts-ignore
8843
- readerReceivedValue = new Uint8Array(result.value);
8844
- }
8845
- else {
8846
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
8847
- const newValue = new Uint8Array(readerReceivedValue.length + result.value.length);
8848
- newValue.set(readerReceivedValue);
8849
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
8850
- newValue.set(result.value, readerReceivedValue.length);
8851
- readerReceivedValue = newValue;
8852
- }
8853
- this.item.endTime = performance.now();
8854
- this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
8855
- this.item.readyState = result.done ? 4 : 3;
8856
- this.item.statusText = result.done ? String(this.item.status) : 'Loading';
8857
- this.item.responseSize = readerReceivedValue.length;
8858
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
8859
- if (result.done) {
8860
- this.item.response = getStringResponseByType(this.item.responseType, readerReceivedValue);
8861
- }
8862
- return result;
8863
- });
8864
- };
8865
- reader.cancel = (...args) => {
8866
- this.item.cancelState = 2;
8867
- this.item.statusText = 'Cancel';
8868
- this.item.endTime = performance.now();
8869
- this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
8870
- this.item.response = getStringResponseByType(this.item.responseType, readerReceivedValue);
8871
- return _cancel.apply(reader, args);
8872
- };
8873
- return reader;
8874
- };
8875
- }
8876
8824
  }
8877
8825
  class FetchProxyHandler {
8878
8826
  constructor(ignoredHeaders, setSessionTokenHeader, sanitize, sendMessage, isServiceUrl, tokenUrlMatcher) {
@@ -8884,14 +8832,15 @@ class FetchProxyHandler {
8884
8832
  this.tokenUrlMatcher = tokenUrlMatcher;
8885
8833
  }
8886
8834
  apply(target, _, argsList) {
8835
+ var _a;
8887
8836
  const input = argsList[0];
8888
8837
  const init = argsList[1];
8889
8838
  if (!input ||
8890
8839
  // @ts-ignore
8891
- (typeof input !== 'string' && !(input === null || input === void 0 ? void 0 : input.url))) {
8840
+ (typeof input !== "string" && !(input === null || input === void 0 ? void 0 : input.url))) {
8892
8841
  return target.apply(window, argsList);
8893
8842
  }
8894
- const isORUrl = input instanceof URL || typeof input === 'string'
8843
+ const isORUrl = input instanceof URL || typeof input === "string"
8895
8844
  ? this.isServiceUrl(String(input))
8896
8845
  : this.isServiceUrl(String(input.url));
8897
8846
  if (isORUrl) {
@@ -8899,6 +8848,31 @@ class FetchProxyHandler {
8899
8848
  }
8900
8849
  const item = new NetworkMessage(this.ignoredHeaders, this.setSessionTokenHeader, this.sanitize);
8901
8850
  this.beforeFetch(item, input, init);
8851
+ const signal = (argsList[0] instanceof Request ? argsList[0].signal : undefined) ||
8852
+ ((_a = argsList[1]) === null || _a === void 0 ? void 0 : _a.signal);
8853
+ // guard to avoid double-send
8854
+ let abortedNotified = false;
8855
+ const notifyAbort = () => {
8856
+ if (abortedNotified)
8857
+ return;
8858
+ abortedNotified = true;
8859
+ item.endTime = performance.now();
8860
+ item.duration = item.endTime - (item.startTime || item.endTime);
8861
+ item.status = 0;
8862
+ item.statusText = "Aborted";
8863
+ item.readyState = 0;
8864
+ const msg = item.getMessage();
8865
+ if (msg)
8866
+ this.sendMessage(msg);
8867
+ };
8868
+ if (signal) {
8869
+ if (signal.aborted) {
8870
+ notifyAbort();
8871
+ }
8872
+ else {
8873
+ signal.addEventListener("abort", notifyAbort, { once: true });
8874
+ }
8875
+ }
8902
8876
  this.setSessionTokenHeader((name, value) => {
8903
8877
  if (this.tokenUrlMatcher !== undefined) {
8904
8878
  if (!this.tokenUrlMatcher(item.url)) {
@@ -8927,42 +8901,53 @@ class FetchProxyHandler {
8927
8901
  }
8928
8902
  });
8929
8903
  return target.apply(window, argsList)
8930
- .then(this.afterFetch(item))
8904
+ .then(this.afterFetch(item, () => {
8905
+ abortedNotified = true;
8906
+ }))
8931
8907
  .catch((e) => {
8932
- // mock finally
8933
8908
  item.endTime = performance.now();
8934
8909
  item.duration = item.endTime - (item.startTime || item.endTime);
8910
+ if (e && e.name === "AbortError") {
8911
+ item.status = 0;
8912
+ item.statusText = "Aborted";
8913
+ item.readyState = 0;
8914
+ if (!abortedNotified) {
8915
+ const msg = item.getMessage();
8916
+ if (msg)
8917
+ this.sendMessage(msg);
8918
+ }
8919
+ }
8935
8920
  throw e;
8936
8921
  });
8937
8922
  }
8938
8923
  beforeFetch(item, input, init) {
8939
- let url, method = 'GET', requestHeader = {};
8924
+ let url, method = "GET", requestHeader = {};
8940
8925
  // handle `input` content
8941
- if (typeof input === 'string') {
8926
+ if (typeof input === "string") {
8942
8927
  // when `input` is a string
8943
- method = (init === null || init === void 0 ? void 0 : init.method) || 'GET';
8928
+ method = (init === null || init === void 0 ? void 0 : init.method) || "GET";
8944
8929
  url = getURL(input);
8945
8930
  requestHeader = (init === null || init === void 0 ? void 0 : init.headers) || {};
8946
8931
  }
8947
8932
  else {
8948
8933
  // when `input` is a `Request` object
8949
- method = input.method || 'GET';
8934
+ method = input.method || "GET";
8950
8935
  url = getURL(input.url);
8951
8936
  requestHeader = input.headers;
8952
8937
  }
8953
8938
  item.method = method;
8954
- item.requestType = 'fetch';
8939
+ item.requestType = "fetch";
8955
8940
  item.requestHeader = requestHeader;
8956
8941
  item.url = url.toString();
8957
- item.name = (url.pathname.split('/').pop() || '') + url.search;
8942
+ item.name = (url.pathname.split("/").pop() || "") + url.search;
8958
8943
  item.status = 0;
8959
- item.statusText = 'Pending';
8944
+ item.statusText = "Pending";
8960
8945
  item.readyState = 1;
8961
8946
  if (!item.startTime) {
8962
8947
  // UNSENT
8963
8948
  item.startTime = performance.now();
8964
8949
  }
8965
- if (Object.prototype.toString.call(requestHeader) === '[object Headers]') {
8950
+ if (Object.prototype.toString.call(requestHeader) === "[object Headers]") {
8966
8951
  item.requestHeader = {};
8967
8952
  for (const [key, value] of requestHeader) {
8968
8953
  item.requestHeader[key] = value;
@@ -8983,8 +8968,10 @@ class FetchProxyHandler {
8983
8968
  item.requestData = genStringBody(init.body);
8984
8969
  }
8985
8970
  }
8986
- afterFetch(item) {
8971
+ afterFetch(item, onResolved) {
8987
8972
  return (resp) => {
8973
+ if (onResolved)
8974
+ onResolved === null || onResolved === void 0 ? void 0 : onResolved();
8988
8975
  item.endTime = performance.now();
8989
8976
  item.duration = item.endTime - (item.startTime || item.endTime);
8990
8977
  item.status = resp.status;
@@ -8993,7 +8980,8 @@ class FetchProxyHandler {
8993
8980
  item.header = {};
8994
8981
  for (const [key, value] of resp.headers) {
8995
8982
  item.header[key] = value;
8996
- isChunked = value.toLowerCase().indexOf('chunked') > -1 ? true : isChunked;
8983
+ isChunked =
8984
+ value.toLowerCase().indexOf("chunked") > -1 ? true : isChunked;
8997
8985
  }
8998
8986
  if (isChunked) {
8999
8987
  // when `transfer-encoding` is chunked, the response is a stream which is under loading,
@@ -9008,7 +8996,9 @@ class FetchProxyHandler {
9008
8996
  this.handleResponseBody(resp.clone(), item)
9009
8997
  .then((responseValue) => {
9010
8998
  item.responseSize =
9011
- typeof responseValue === 'string' ? responseValue.length : responseValue.byteLength;
8999
+ typeof responseValue === "string"
9000
+ ? responseValue.length
9001
+ : responseValue.byteLength;
9012
9002
  item.responseSizeText = formatByteSize(item.responseSize);
9013
9003
  item.response = getStringResponseByType(item.responseType, responseValue);
9014
9004
  const msg = item.getMessage();
@@ -9017,28 +9007,40 @@ class FetchProxyHandler {
9017
9007
  }
9018
9008
  })
9019
9009
  .catch((e) => {
9020
- if (e.name !== 'AbortError') {
9010
+ if (e.name === "AbortError") {
9011
+ item.status = 0;
9012
+ item.statusText = "Aborted";
9013
+ item.readyState = 0;
9014
+ const msg = item.getMessage();
9015
+ if (msg)
9016
+ this.sendMessage(msg);
9017
+ }
9018
+ else {
9021
9019
  throw e;
9022
9020
  }
9023
9021
  });
9024
9022
  }
9025
- return new Proxy(resp, new ResponseProxyHandler(resp, item));
9023
+ const ct = (resp.headers.get("content-type") || "").toLowerCase();
9024
+ const isTextLike = ct.includes("application/json") || ct.startsWith("text/");
9025
+ return isTextLike
9026
+ ? new Proxy(resp, new ResponseProxyHandler(resp, item))
9027
+ : resp;
9026
9028
  };
9027
9029
  }
9028
9030
  handleResponseBody(resp, item) {
9029
9031
  // parse response body by Content-Type
9030
- const contentType = resp.headers.get('content-type');
9031
- if (contentType && contentType.includes('application/json')) {
9032
- item.responseType = 'json';
9032
+ const contentType = resp.headers.get("content-type");
9033
+ if (contentType && contentType.includes("application/json")) {
9034
+ item.responseType = "json";
9033
9035
  return resp.text();
9034
9036
  }
9035
9037
  else if (contentType &&
9036
- (contentType.includes('text/html') || contentType.includes('text/plain'))) {
9037
- item.responseType = 'text';
9038
+ (contentType.includes("text/html") || contentType.includes("text/plain"))) {
9039
+ item.responseType = "text";
9038
9040
  return resp.text();
9039
9041
  }
9040
9042
  else {
9041
- item.responseType = 'arraybuffer';
9043
+ item.responseType = "arraybuffer";
9042
9044
  return resp.arrayBuffer();
9043
9045
  }
9044
9046
  }
@@ -9049,6 +9051,15 @@ class FetchProxy {
9049
9051
  }
9050
9052
  }
9051
9053
 
9054
+ var RequestState;
9055
+ (function (RequestState) {
9056
+ RequestState[RequestState["UNSENT"] = 0] = "UNSENT";
9057
+ RequestState[RequestState["OPENED"] = 1] = "OPENED";
9058
+ RequestState[RequestState["HEADERS_RECEIVED"] = 2] = "HEADERS_RECEIVED";
9059
+ RequestState[RequestState["LOADING"] = 3] = "LOADING";
9060
+ RequestState[RequestState["DONE"] = 4] = "DONE";
9061
+ })(RequestState || (RequestState = {}));
9062
+
9052
9063
  /**
9053
9064
  * I took inspiration in few stack exchange posts
9054
9065
  * and Tencent vConsole library (MIT)
@@ -9075,28 +9086,29 @@ class XHRProxyHandler {
9075
9086
  this.onTimeout();
9076
9087
  };
9077
9088
  this.item = new NetworkMessage(ignoredHeaders, setSessionTokenHeader, sanitize);
9078
- this.item.requestType = 'xhr';
9089
+ this.item.requestType = "xhr";
9079
9090
  }
9080
9091
  get(target, key) {
9081
9092
  switch (key) {
9082
- case 'open':
9093
+ case "open":
9083
9094
  return this.getOpen(target);
9084
- case 'send':
9095
+ case "send":
9085
9096
  this.setSessionTokenHeader((name, value) => {
9086
9097
  if (this.tokenUrlMatcher !== undefined) {
9087
9098
  if (!this.tokenUrlMatcher(this.item.url)) {
9088
9099
  return;
9089
9100
  }
9090
9101
  }
9091
- target.setRequestHeader(name, value);
9102
+ if (target.readyState === 1)
9103
+ target.setRequestHeader(name, value);
9092
9104
  });
9093
9105
  return this.getSend(target);
9094
- case 'setRequestHeader':
9106
+ case "setRequestHeader":
9095
9107
  return this.getSetRequestHeader(target);
9096
9108
  default:
9097
9109
  // eslint-disable-next-line no-case-declarations
9098
9110
  const value = Reflect.get(target, key);
9099
- if (typeof value === 'function') {
9111
+ if (typeof value === "function") {
9100
9112
  return value.bind(target);
9101
9113
  }
9102
9114
  else {
@@ -9106,11 +9118,11 @@ class XHRProxyHandler {
9106
9118
  }
9107
9119
  set(target, key, value) {
9108
9120
  switch (key) {
9109
- case 'onreadystatechange':
9121
+ case "onreadystatechange":
9110
9122
  return this.setOnReadyStateChange(target, key, value);
9111
- case 'onabort':
9123
+ case "onabort":
9112
9124
  return this.setOnAbort(target, key, value);
9113
- case 'ontimeout':
9125
+ case "ontimeout":
9114
9126
  return this.setOnTimeout(target, key, value);
9115
9127
  // not tracked methods
9116
9128
  }
@@ -9124,9 +9136,12 @@ class XHRProxyHandler {
9124
9136
  this.item.endTime = performance.now();
9125
9137
  this.item.duration = this.item.endTime - this.item.startTime;
9126
9138
  this.updateItemByReadyState();
9127
- setTimeout(() => {
9128
- this.item.response = getStringResponseByType(this.item.responseType, this.item.response);
9129
- }, 0);
9139
+ const rt = this.item.responseType || "";
9140
+ if (rt === "" || rt === "text" || rt === "json") {
9141
+ setTimeout(() => {
9142
+ this.item.response = getStringResponseByType(rt, this.XMLReq.response);
9143
+ }, 0);
9144
+ }
9130
9145
  if (this.XMLReq.readyState === RequestState.DONE) {
9131
9146
  const msg = this.item.getMessage();
9132
9147
  if (msg) {
@@ -9136,7 +9151,7 @@ class XHRProxyHandler {
9136
9151
  }
9137
9152
  onAbort() {
9138
9153
  this.item.cancelState = 1;
9139
- this.item.statusText = 'Abort';
9154
+ this.item.statusText = "Abort";
9140
9155
  const msg = this.item.getMessage();
9141
9156
  if (msg) {
9142
9157
  this.sendMessage(msg);
@@ -9144,27 +9159,28 @@ class XHRProxyHandler {
9144
9159
  }
9145
9160
  onTimeout() {
9146
9161
  this.item.cancelState = 3;
9147
- this.item.statusText = 'Timeout';
9162
+ this.item.statusText = "Timeout";
9148
9163
  const msg = this.item.getMessage();
9149
9164
  if (msg) {
9150
9165
  this.sendMessage(msg);
9151
9166
  }
9152
9167
  }
9153
9168
  getOpen(target) {
9154
- const targetFunction = Reflect.get(target, 'open');
9169
+ const targetFunction = Reflect.get(target, "open");
9155
9170
  return (...args) => {
9156
9171
  var _a, _b, _c;
9157
9172
  const method = args[0];
9158
9173
  const url = args[1];
9159
- this.item.method = method ? method.toUpperCase() : 'GET';
9160
- this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) || '';
9161
- 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 : '';
9174
+ this.item.method = method ? method.toUpperCase() : "GET";
9175
+ this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) || "";
9176
+ this.item.name =
9177
+ (_c = (_b = this.item.url) === null || _b === void 0 ? void 0 : _b.replace(new RegExp("/*$"), "").split("/").pop()) !== null && _c !== void 0 ? _c : "";
9162
9178
  this.item.getData = genGetDataByUrl(this.item.url, {});
9163
9179
  return targetFunction.apply(target, args);
9164
9180
  };
9165
9181
  }
9166
9182
  getSend(target) {
9167
- const targetFunction = Reflect.get(target, 'send');
9183
+ const targetFunction = Reflect.get(target, "send");
9168
9184
  return (...args) => {
9169
9185
  const data = args[0];
9170
9186
  this.item.requestData = genStringBody(data);
@@ -9172,7 +9188,7 @@ class XHRProxyHandler {
9172
9188
  };
9173
9189
  }
9174
9190
  getSetRequestHeader(target) {
9175
- const targetFunction = Reflect.get(target, 'setRequestHeader');
9191
+ const targetFunction = Reflect.get(target, "setRequestHeader");
9176
9192
  return (...args) => {
9177
9193
  if (!this.item.requestHeader) {
9178
9194
  this.item.requestHeader = {};
@@ -9208,34 +9224,44 @@ class XHRProxyHandler {
9208
9224
  case RequestState.UNSENT:
9209
9225
  case RequestState.OPENED:
9210
9226
  this.item.status = RequestState.UNSENT;
9211
- this.item.statusText = 'Pending';
9227
+ this.item.statusText = "Pending";
9212
9228
  if (!this.item.startTime) {
9213
9229
  this.item.startTime = performance.now();
9214
9230
  }
9215
9231
  break;
9216
9232
  case RequestState.HEADERS_RECEIVED:
9217
9233
  this.item.status = this.XMLReq.status;
9218
- this.item.statusText = 'Loading';
9234
+ this.item.statusText = "Loading";
9219
9235
  this.item.header = {};
9220
9236
  // eslint-disable-next-line no-case-declarations
9221
- const header = this.XMLReq.getAllResponseHeaders() || '', headerArr = header.split('\n');
9237
+ const header = this.XMLReq.getAllResponseHeaders() || "", headerArr = header.split("\n");
9222
9238
  // extract plain text to key-value format
9223
9239
  for (let i = 0; i < headerArr.length; i++) {
9224
9240
  const line = headerArr[i];
9225
9241
  if (!line) {
9226
9242
  continue;
9227
9243
  }
9228
- const arr = line.split(': ');
9244
+ const arr = line.split(": ");
9229
9245
  const key = arr[0];
9230
- this.item.header[key] = arr.slice(1).join(': ');
9246
+ this.item.header[key] = arr.slice(1).join(": ");
9231
9247
  }
9232
9248
  break;
9233
9249
  case RequestState.LOADING:
9234
9250
  this.item.status = this.XMLReq.status;
9235
- this.item.statusText = 'Loading';
9236
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9237
- this.item.responseSize = this.XMLReq.response.length;
9238
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
9251
+ this.item.statusText = "Loading";
9252
+ const response = this.XMLReq.response;
9253
+ if (response) {
9254
+ const respSize = typeof response === "string"
9255
+ ? response.length
9256
+ : response instanceof ArrayBuffer
9257
+ ? response.byteLength
9258
+ : typeof Blob !== "undefined" && response instanceof Blob
9259
+ ? response.size
9260
+ : 0;
9261
+ if (respSize) {
9262
+ this.item.responseSize = respSize;
9263
+ this.item.responseSizeText = formatByteSize(this.item.responseSize);
9264
+ }
9239
9265
  }
9240
9266
  break;
9241
9267
  case RequestState.DONE:
@@ -9244,16 +9270,30 @@ class XHRProxyHandler {
9244
9270
  // show status code when request completed
9245
9271
  this.item.statusText = String(this.item.status);
9246
9272
  this.item.endTime = performance.now();
9247
- this.item.duration = this.item.endTime - (this.item.startTime || this.item.endTime);
9248
- this.item.response = this.XMLReq.response;
9249
- if (!!this.XMLReq.response && this.XMLReq.response.length) {
9250
- this.item.responseSize = this.XMLReq.response.length;
9251
- this.item.responseSizeText = formatByteSize(this.item.responseSize);
9273
+ this.item.duration =
9274
+ this.item.endTime - (this.item.startTime || this.item.endTime);
9275
+ const resp = this.XMLReq.response;
9276
+ const respType = this.XMLReq.responseType || "";
9277
+ if (respType === "" || respType === "text" || respType === "json") {
9278
+ this.item.response = resp;
9279
+ }
9280
+ if (resp) {
9281
+ const respSize = typeof resp === "string"
9282
+ ? resp.length
9283
+ : resp instanceof ArrayBuffer
9284
+ ? resp.byteLength
9285
+ : typeof Blob !== "undefined" && resp instanceof Blob
9286
+ ? resp.size
9287
+ : 0;
9288
+ if (respSize) {
9289
+ this.item.responseSize = respSize;
9290
+ this.item.responseSizeText = formatByteSize(respSize);
9291
+ }
9252
9292
  }
9253
9293
  break;
9254
9294
  default:
9255
9295
  this.item.status = this.XMLReq.status;
9256
- this.item.statusText = 'Unknown';
9296
+ this.item.statusText = "Unknown";
9257
9297
  break;
9258
9298
  }
9259
9299
  }
@@ -9671,7 +9711,7 @@ class API {
9671
9711
  this.signalStartIssue = (reason, missingApi) => {
9672
9712
  const doNotTrack = this.checkDoNotTrack();
9673
9713
  console.log("Tracker couldn't start due to:", JSON.stringify({
9674
- trackerVersion: '16.4.9',
9714
+ trackerVersion: '16.4.10',
9675
9715
  projectKey: this.options.projectKey,
9676
9716
  doNotTrack,
9677
9717
  reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,