@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/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
|
-
|
|
3700
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
5290
|
-
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
7722
|
-
|
|
7723
|
-
|
|
7724
|
-
|
|
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
|
|
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
|
|
8799
|
-
case
|
|
8800
|
-
case
|
|
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 ===
|
|
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 !==
|
|
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 ===
|
|
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 =
|
|
8928
|
+
let url, method = "GET", requestHeader = {};
|
|
8944
8929
|
// handle `input` content
|
|
8945
|
-
if (typeof input ===
|
|
8930
|
+
if (typeof input === "string") {
|
|
8946
8931
|
// when `input` is a string
|
|
8947
|
-
method = (init === null || init === void 0 ? void 0 : init.method) ||
|
|
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 ||
|
|
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 =
|
|
8943
|
+
item.requestType = "fetch";
|
|
8959
8944
|
item.requestHeader = requestHeader;
|
|
8960
8945
|
item.url = url.toString();
|
|
8961
|
-
item.name = (url.pathname.split(
|
|
8946
|
+
item.name = (url.pathname.split("/").pop() || "") + url.search;
|
|
8962
8947
|
item.status = 0;
|
|
8963
|
-
item.statusText =
|
|
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) ===
|
|
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 =
|
|
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 ===
|
|
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
|
|
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
|
-
|
|
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(
|
|
9035
|
-
if (contentType && contentType.includes(
|
|
9036
|
-
item.responseType =
|
|
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(
|
|
9041
|
-
item.responseType =
|
|
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 =
|
|
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 =
|
|
9093
|
+
this.item.requestType = "xhr";
|
|
9083
9094
|
}
|
|
9084
9095
|
get(target, key) {
|
|
9085
9096
|
switch (key) {
|
|
9086
|
-
case
|
|
9097
|
+
case "open":
|
|
9087
9098
|
return this.getOpen(target);
|
|
9088
|
-
case
|
|
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.
|
|
9106
|
+
if (target.readyState === 1)
|
|
9107
|
+
target.setRequestHeader(name, value);
|
|
9096
9108
|
});
|
|
9097
9109
|
return this.getSend(target);
|
|
9098
|
-
case
|
|
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 ===
|
|
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
|
|
9125
|
+
case "onreadystatechange":
|
|
9114
9126
|
return this.setOnReadyStateChange(target, key, value);
|
|
9115
|
-
case
|
|
9127
|
+
case "onabort":
|
|
9116
9128
|
return this.setOnAbort(target, key, value);
|
|
9117
|
-
case
|
|
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
|
-
|
|
9132
|
-
|
|
9133
|
-
|
|
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 =
|
|
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 =
|
|
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,
|
|
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() :
|
|
9164
|
-
this.item.url = ((_a = url.toString) === null || _a === void 0 ? void 0 : _a.call(url)) ||
|
|
9165
|
-
this.item.name =
|
|
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,
|
|
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,
|
|
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 =
|
|
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 =
|
|
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() ||
|
|
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 =
|
|
9240
|
-
|
|
9241
|
-
|
|
9242
|
-
|
|
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 =
|
|
9252
|
-
|
|
9253
|
-
|
|
9254
|
-
|
|
9255
|
-
|
|
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 =
|
|
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.
|
|
9718
|
+
trackerVersion: '16.4.10',
|
|
9679
9719
|
projectKey: this.options.projectKey,
|
|
9680
9720
|
doNotTrack,
|
|
9681
9721
|
reason: missingApi.length ? `missing api: ${missingApi.join(',')}` : reason,
|