@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 +216 -176
- package/dist/cjs/entry.js.map +1 -1
- package/dist/cjs/index.js +216 -176
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/main/app/index.d.ts +1 -0
- package/dist/cjs/main/app/nodes/idSeq.d.ts +14 -0
- package/dist/cjs/main/app/nodes/index.d.ts +2 -1
- package/dist/cjs/main/app/observer/top_observer.d.ts +1 -1
- package/dist/lib/entry.js +216 -176
- package/dist/lib/entry.js.map +1 -1
- package/dist/lib/index.js +216 -176
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/main/app/index.d.ts +1 -0
- package/dist/lib/main/app/nodes/idSeq.d.ts +14 -0
- package/dist/lib/main/app/nodes/index.d.ts +2 -1
- package/dist/lib/main/app/observer/top_observer.d.ts +1 -1
- package/dist/types/main/app/index.d.ts +1 -0
- package/dist/types/main/app/nodes/idSeq.d.ts +14 -0
- package/dist/types/main/app/nodes/index.d.ts +2 -1
- package/dist/types/main/app/observer/top_observer.d.ts +1 -1
- package/package.json +2 -2
package/dist/lib/index.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
|
-
|
|
3696
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
5286
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
7718
|
-
|
|
7719
|
-
|
|
7720
|
-
|
|
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
|
|
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
|
|
8795
|
-
case
|
|
8796
|
-
case
|
|
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 ===
|
|
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 !==
|
|
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 ===
|
|
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 =
|
|
8924
|
+
let url, method = "GET", requestHeader = {};
|
|
8940
8925
|
// handle `input` content
|
|
8941
|
-
if (typeof input ===
|
|
8926
|
+
if (typeof input === "string") {
|
|
8942
8927
|
// when `input` is a string
|
|
8943
|
-
method = (init === null || init === void 0 ? void 0 : init.method) ||
|
|
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 ||
|
|
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 =
|
|
8939
|
+
item.requestType = "fetch";
|
|
8955
8940
|
item.requestHeader = requestHeader;
|
|
8956
8941
|
item.url = url.toString();
|
|
8957
|
-
item.name = (url.pathname.split(
|
|
8942
|
+
item.name = (url.pathname.split("/").pop() || "") + url.search;
|
|
8958
8943
|
item.status = 0;
|
|
8959
|
-
item.statusText =
|
|
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) ===
|
|
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 =
|
|
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 ===
|
|
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
|
|
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
|
-
|
|
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(
|
|
9031
|
-
if (contentType && contentType.includes(
|
|
9032
|
-
item.responseType =
|
|
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(
|
|
9037
|
-
item.responseType =
|
|
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 =
|
|
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 =
|
|
9089
|
+
this.item.requestType = "xhr";
|
|
9079
9090
|
}
|
|
9080
9091
|
get(target, key) {
|
|
9081
9092
|
switch (key) {
|
|
9082
|
-
case
|
|
9093
|
+
case "open":
|
|
9083
9094
|
return this.getOpen(target);
|
|
9084
|
-
case
|
|
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.
|
|
9102
|
+
if (target.readyState === 1)
|
|
9103
|
+
target.setRequestHeader(name, value);
|
|
9092
9104
|
});
|
|
9093
9105
|
return this.getSend(target);
|
|
9094
|
-
case
|
|
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 ===
|
|
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
|
|
9121
|
+
case "onreadystatechange":
|
|
9110
9122
|
return this.setOnReadyStateChange(target, key, value);
|
|
9111
|
-
case
|
|
9123
|
+
case "onabort":
|
|
9112
9124
|
return this.setOnAbort(target, key, value);
|
|
9113
|
-
case
|
|
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
|
-
|
|
9128
|
-
|
|
9129
|
-
|
|
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 =
|
|
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 =
|
|
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,
|
|
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() :
|
|
9160
|
-
this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) ||
|
|
9161
|
-
this.item.name =
|
|
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,
|
|
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,
|
|
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 =
|
|
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 =
|
|
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() ||
|
|
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 =
|
|
9236
|
-
|
|
9237
|
-
|
|
9238
|
-
|
|
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 =
|
|
9248
|
-
|
|
9249
|
-
|
|
9250
|
-
|
|
9251
|
-
|
|
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 =
|
|
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.
|
|
9714
|
+
trackerVersion: '16.4.10',
|
|
9675
9715
|
projectKey: this.options.projectKey,
|
|
9676
9716
|
doNotTrack,
|
|
9677
9717
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|