@buoy-gg/network 7.0.78 → 7.0.80
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/README.md +76 -2
- package/lib/commonjs/expo-network.js +1 -0
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/index.web.js +1 -1
- package/lib/commonjs/netinfo.js +1 -0
- package/lib/commonjs/network/components/NetworkEventDetailView.js +2 -2
- package/lib/commonjs/network/components/NetworkEventDetailView.web.js +2 -2
- package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -2
- package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +1 -1
- package/lib/commonjs/network/components/NetworkModal.js +1 -1
- package/lib/commonjs/network/components/sockets/NetworkSocketsButton.js +1 -0
- package/lib/commonjs/network/components/sockets/NetworkSocketsScreen.js +1 -0
- package/lib/commonjs/network/components/sockets/SocketFrameView.js +1 -0
- package/lib/commonjs/network/components/sockets/SocketListView.js +1 -0
- package/lib/commonjs/network/components/sockets/SocketRows.js +1 -0
- package/lib/commonjs/network/components/sockets/SocketTricksView.js +1 -0
- package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -1
- package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -1
- package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -1
- package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -1
- package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -1
- package/lib/commonjs/network/conditions/connectivity/netInfoFacade.js +1 -0
- package/lib/commonjs/network/conditions/connectivity/patchNetwork.js +1 -0
- package/lib/commonjs/network/conditions/pacer.js +1 -0
- package/lib/commonjs/network/conditions/profiles.js +1 -0
- package/lib/commonjs/network/conditions/remoteState.js +1 -0
- package/lib/commonjs/network/conditions/store.js +1 -1
- package/lib/commonjs/network/conditions/wait.js +1 -1
- package/lib/commonjs/network/conditions/xhr.js +1 -1
- package/lib/commonjs/network/hooks/useSocketsState.js +1 -0
- package/lib/commonjs/network/overrides/engine.js +1 -1
- package/lib/commonjs/network/overrides/matchRule.js +1 -1
- package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -1
- package/lib/commonjs/network/sockets/findProblems.js +1 -0
- package/lib/commonjs/network/sockets/foldFrames.js +1 -0
- package/lib/commonjs/network/sockets/format.js +1 -0
- package/lib/commonjs/network/sockets/readMessage.js +1 -0
- package/lib/commonjs/network/sockets/socketMoments.js +1 -0
- package/lib/commonjs/network/sockets/socketStore.js +1 -0
- package/lib/commonjs/network/sockets/socketsSyncAdapter.js +1 -0
- package/lib/commonjs/network/sockets/types.js +1 -0
- package/lib/commonjs/network/sockets/webSocketPatch.js +1 -0
- package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -1
- package/lib/commonjs/network/utils/generateNetworkCopyText.js +1 -0
- package/lib/commonjs/network/utils/networkEventStore.js +1 -1
- package/lib/commonjs/network/utils/networkListener.js +4 -4
- package/lib/commonjs/network/utils/startNetworkCapture.js +1 -1
- package/lib/commonjs/preset.js +1 -1
- package/lib/module/expo-network.js +1 -0
- package/lib/module/index.js +1 -1
- package/lib/module/index.web.js +1 -1
- package/lib/module/netinfo.js +1 -0
- package/lib/module/network/components/NetworkEventDetailView.js +2 -2
- package/lib/module/network/components/NetworkEventDetailView.web.js +2 -2
- package/lib/module/network/components/NetworkEventItemCompact.js +2 -2
- package/lib/module/network/components/NetworkEventItemCompact.web.js +1 -1
- package/lib/module/network/components/NetworkModal.js +1 -1
- package/lib/module/network/components/sockets/NetworkSocketsButton.js +1 -0
- package/lib/module/network/components/sockets/NetworkSocketsScreen.js +1 -0
- package/lib/module/network/components/sockets/SocketFrameView.js +1 -0
- package/lib/module/network/components/sockets/SocketListView.js +1 -0
- package/lib/module/network/components/sockets/SocketRows.js +1 -0
- package/lib/module/network/components/sockets/SocketTricksView.js +1 -0
- package/lib/module/network/conditions/NetworkConditionsControl.js +1 -1
- package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -1
- package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -1
- package/lib/module/network/conditions/NetworkFloatingTool.js +1 -1
- package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -1
- package/lib/module/network/conditions/connectivity/netInfoFacade.js +1 -0
- package/lib/module/network/conditions/connectivity/patchNetwork.js +1 -0
- package/lib/module/network/conditions/pacer.js +1 -0
- package/lib/module/network/conditions/profiles.js +1 -0
- package/lib/module/network/conditions/remoteState.js +1 -0
- package/lib/module/network/conditions/store.js +1 -1
- package/lib/module/network/conditions/wait.js +1 -1
- package/lib/module/network/conditions/xhr.js +1 -1
- package/lib/module/network/hooks/useSocketsState.js +1 -0
- package/lib/module/network/overrides/engine.js +1 -1
- package/lib/module/network/overrides/matchRule.js +1 -1
- package/lib/module/network/overrides/overrideRulesStore.js +1 -1
- package/lib/module/network/sockets/findProblems.js +1 -0
- package/lib/module/network/sockets/foldFrames.js +1 -0
- package/lib/module/network/sockets/format.js +1 -0
- package/lib/module/network/sockets/readMessage.js +1 -0
- package/lib/module/network/sockets/socketMoments.js +1 -0
- package/lib/module/network/sockets/socketStore.js +1 -0
- package/lib/module/network/sockets/socketsSyncAdapter.js +1 -0
- package/lib/module/network/sockets/types.js +1 -0
- package/lib/module/network/sockets/webSocketPatch.js +1 -0
- package/lib/module/network/sync/networkSyncAdapter.js +1 -1
- package/lib/module/network/utils/generateNetworkCopyText.js +23 -22
- package/lib/module/network/utils/networkEventStore.js +1 -1
- package/lib/module/network/utils/networkListener.js +4 -4
- package/lib/module/network/utils/startNetworkCapture.js +1 -1
- package/lib/module/preset.js +1 -1
- package/lib/typescript/expo-network.d.ts +2 -0
- package/lib/typescript/index.d.ts +14 -2
- package/lib/typescript/index.web.d.ts +7 -2
- package/lib/typescript/netinfo.d.ts +3 -0
- package/lib/typescript/network/components/sockets/NetworkSocketsButton.d.ts +17 -0
- package/lib/typescript/network/components/sockets/NetworkSocketsScreen.d.ts +19 -0
- package/lib/typescript/network/components/sockets/SocketFrameView.d.ts +9 -0
- package/lib/typescript/network/components/sockets/SocketListView.d.ts +9 -0
- package/lib/typescript/network/components/sockets/SocketRows.d.ts +19 -0
- package/lib/typescript/network/components/sockets/SocketTricksView.d.ts +23 -0
- package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts +5 -2
- package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts +4 -3
- package/lib/typescript/network/conditions/connectivity/netInfoFacade.d.ts +3 -0
- package/lib/typescript/network/conditions/connectivity/patchNetwork.d.ts +24 -0
- package/lib/typescript/network/conditions/pacer.d.ts +16 -0
- package/lib/typescript/network/conditions/profiles.d.ts +57 -0
- package/lib/typescript/network/conditions/remoteState.d.ts +4 -0
- package/lib/typescript/network/conditions/store.d.ts +45 -19
- package/lib/typescript/network/conditions/xhr.d.ts +1 -1
- package/lib/typescript/network/hooks/useSocketsState.d.ts +3 -0
- package/lib/typescript/network/overrides/engine.d.ts +14 -0
- package/lib/typescript/network/overrides/matchRule.d.ts +3 -0
- package/lib/typescript/network/overrides/overrideRulesStore.d.ts +22 -0
- package/lib/typescript/network/overrides/types.d.ts +33 -0
- package/lib/typescript/network/sockets/findProblems.d.ts +31 -0
- package/lib/typescript/network/sockets/foldFrames.d.ts +50 -0
- package/lib/typescript/network/sockets/format.d.ts +19 -0
- package/lib/typescript/network/sockets/readMessage.d.ts +41 -0
- package/lib/typescript/network/sockets/socketMoments.d.ts +24 -0
- package/lib/typescript/network/sockets/socketStore.d.ts +94 -0
- package/lib/typescript/network/sockets/socketsSyncAdapter.d.ts +66 -0
- package/lib/typescript/network/sockets/types.d.ts +139 -0
- package/lib/typescript/network/sockets/webSocketPatch.d.ts +57 -0
- package/lib/typescript/network/sync/networkSyncAdapter.d.ts +29 -12
- package/lib/typescript/network/types/index.d.ts +6 -0
- package/lib/typescript/network/utils/networkListener.d.ts +10 -0
- package/lib/web/index.mjs +60 -59
- package/package.json +26 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.MAX_PARSE_CHARS=exports.MAX_FRAME_CHARS=exports.HIDDEN=void 0;exports.hideSecrets=hideSecrets;exports.hideUrlSecrets=hideUrlSecrets;exports.readMessage=readMessage;exports.scrubText=scrubText;exports.socketKey=socketKey;var _sharedUi=require("@buoy-gg/shared-ui");const MAX_FRAME_CHARS=exports.MAX_FRAME_CHARS=64*1024;const HIDDEN=exports.HIDDEN="[hidden]";const TYPE_KEYS=["type","event","op","action","method"];const CORRELATION_KEYS=["requestId","request_id","correlationId","correlation_id","ref","id"];const REPLY_KEYS=["success","ok","result","error","status"];const PING_TYPE=/^(ping|pong|heartbeat|hb|keep-?alive)$/i;const PING_TEXT=new Set(["2","3","ping","pong","heartbeat","primus::ping","primus::pong"]);const AUTH_TYPE=/^(auth|authenticate|authorize|login|sign-?in|connection_init)$/i;const JWT=/\beyJ[\w-]{6,}\.[\w-]{6,}\.[\w-]*/g;const SOCKET_IO=/^4[0-6](?:\/[^,]*,)?(\d*)([[{].*)$/s;const MAX_PARSE_CHARS=exports.MAX_PARSE_CHARS=256*1024;const KEY_VALUE=/("?)([\w.-]{2,64})\1(\s*[:=]\s*)("(?:[^"\\]|\\.)*(?:"|$)|(?:(?:Bearer|Basic|Token)\s+)?[^\s,;&}\]"]+)/gi;const AUTH_SCHEME=/\b(Bearer|Basic|Token)\s+[\w.~+/=-]{8,}/g;const AUTH_PAYLOAD=/("payload"\s*:\s*)("(?:[^"\\]|\\.)*(?:"|$)|[^\s,}\]]+)/;const TYPE_IN_TEXT=/"(?:type|event|op|action|method)"\s*:\s*"([^"\\]{1,80})"/;function binarySize(e){if(typeof ArrayBuffer!=="undefined"){if(e instanceof ArrayBuffer)return e.byteLength;if(ArrayBuffer.isView(e))return e.byteLength}if(typeof Blob!=="undefined"&&e instanceof Blob)return e.size;return null}function hexPreview(e){try{const t=e instanceof ArrayBuffer?new Uint8Array(e):ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):null;if(!t)return"";const s=Array.from(t.subarray(0,32),i=>i.toString(16).padStart(2,"0")).join(" ");return t.byteLength>32?`${s} \u2026`:s}catch{return""}}function hideSecrets(e,t=0){if(t>20)return e!==null&&typeof e==="object"?HIDDEN:typeof e==="string"?e.replace(JWT,HIDDEN):e;if(typeof e==="string")return e.replace(JWT,HIDDEN);if(Array.isArray(e))return e.map(s=>hideSecrets(s,t+1));if(e&&typeof e==="object"){const s={};for(const[i,n]of Object.entries(e)){s[i]=(0,_sharedUi.classifyKey)(i)==="secret"&&n!=null&&n!==""?HIDDEN:hideSecrets(n,t+1)}return s}return e}function scrubText(e,t=0){return e.replace(KEY_VALUE,(s,i,n,r,c)=>{if((0,_sharedUi.classifyKey)(n)==="secret")return`${i}${n}${i}${r}${c.startsWith('"')?`"${HIDDEN}"`:HIDDEN}`;if(c.startsWith('"')&&c.length>2&&t<3){const u=c.endsWith('"')&&c.length>1;const y=c.slice(1,u?-1:void 0);return`${i}${n}${i}${r}"${scrubText(y,t+1)}${u?'"':""}`}return s}).replace(AUTH_SCHEME,`$1 ${HIDDEN}`).replace(JWT,HIDDEN)}function hideUrlSecrets(e){const t=e.replace(/^([a-z][\w+.-]*:\/\/[^/@:?#]*):[^/@?#]*@/i,`$1:${HIDDEN}@`);const s=t.indexOf("?");if(s===-1)return t.replace(JWT,HIDDEN);const i=t.slice(s+1).split("&").map(n=>{const r=n.indexOf("=");if(r===-1)return n;let c=n.slice(0,r);try{c=decodeURIComponent(c)}catch{}return(0,_sharedUi.classifyKey)(c)==="secret"?`${n.slice(0,r)}=${HIDDEN}`:n}).join("&");return`${t.slice(0,s)}?${i}`.replace(JWT,HIDDEN)}function socketKey(e){const t=e.search(/[?#]/);return t===-1?e:e.slice(0,t)}function pick(e,t){for(const s of t){const i=e[s];if(typeof i==="string"&&i)return i;if(typeof i==="number"&&Number.isFinite(i))return String(i)}return void 0}const PHOENIX_REPLY="phx_reply";function readObject(e){const t=pick(e,TYPE_KEYS);return{type:t,correlationId:pick(e,CORRELATION_KEYS),replyShaped:t===PHOENIX_REPLY||REPLY_KEYS.some(s=>s in e)}}function readPhoenix(e){if(e.length!==5||typeof e[2]!=="string"||typeof e[3]!=="string")return null;const t=e[1];return{type:e[3],correlationId:typeof t==="string"||typeof t==="number"?String(t):void 0,replyShaped:e[3]===PHOENIX_REPLY}}function readMessage(e){const t=binarySize(e);if(t!==null){const f=hexPreview(e);return{data:`[binary, ${t} bytes]${f?` ${f}`:""}`,size:t,binary:true}}const s=typeof e==="string"?e:String(e);const i=s.length;if(i>MAX_PARSE_CHARS){const f=s.slice(0,MAX_FRAME_CHARS);const p=f.trimStart()[0];const d=TYPE_IN_TEXT.exec(f.slice(0,4096))?.[1];const A=d?scrubText(d):void 0;const S=d&&AUTH_TYPE.test(d)?f.replace(AUTH_PAYLOAD,`$1"${HIDDEN}"`):f;return{data:scrubText(S).replace(/\beyJ[\w-]{6,}(?:\.[\w-]*)?$/,HIDDEN),size:i,truncated:true,...p==="{"||p==="["?{json:true}:{},...A?{type:A}:{}}}const n=s.trim();if(PING_TEXT.has(n.toLowerCase()))return{data:s,size:i,ping:true,type:n};let r;let c=false;let u;const y=SOCKET_IO.exec(n);try{if(y){r=JSON.parse(y[2]);u=y[1]||void 0}else if(n.startsWith("{")||n.startsWith("[")){r=JSON.parse(n);c=true}}catch{r=void 0}let o={};let h=false;let a;if(y&&r&&typeof r==="object"){const f=n[1]==="3"||n[1]==="6";if(Array.isArray(r)){o=f?{correlationId:u,replyShaped:true}:{type:typeof r[0]==="string"?r[0]:void 0,correlationId:u}}a=`${n.slice(0,n.length-y[2].length)}${JSON.stringify(hideSecrets(r))}`}else if(r&&typeof r==="object"&&!Array.isArray(r)){const f=r;o=readObject(f);let p=hideSecrets(f);if(o.type&&AUTH_TYPE.test(o.type)&&"payload"in p&&p.payload!=null){p={...p,payload:HIDDEN}}a=JSON.stringify(p)}else if(c){if(Array.isArray(r)){o=readPhoenix(r)??{};h=o.type!==void 0&&r[2]==="phoenix"}a=JSON.stringify(hideSecrets(r))}else{a=scrubText(s)}if(o.correlationId)o.correlationId=scrubText(o.correlationId);if(o.type)o.type=scrubText(o.type);const g=h||!!o.type&&PING_TYPE.test(o.type);const l=a.length>MAX_FRAME_CHARS;return{data:l?a.slice(0,MAX_FRAME_CHARS):a,size:i,...l?{truncated:l}:{},...c||y?{json:true}:{},...o,...g?{ping:g}:{}}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.onSocketMoment=onSocketMoment;exports.toSocketMoment=toSocketMoment;var _format=require("./format");var _socketStore=require("./socketStore");function toSocketMoment(e,o){const t={id:`socket-${e.id}`,source:"socket",timestamp:e.timestamp,subtitle:(0,_format.shortUrl)(o),originalEvent:e,correlationId:e.socketId};switch(e.kind){case"open":return{...t,title:"Socket opened",status:"success"};case"error":return{...t,title:"Socket error",status:"error"};case"close":return{...t,title:`Socket ${(0,_format.closeLabel)(e.code,e.neverOpened).toLowerCase()}${e.byBuoy?" (Buoy)":""}`,status:e.code===1e3||e.code===1001?"neutral":"error"};case"message":if(e.fake!=="inject")return null;return{...t,title:`Buoy pushed ${e.type??"a message"}`,status:"neutral"}}}function onSocketMoment(e){return _socketStore.socketStore.onEvent(o=>{const t=_socketStore.socketStore.getState().connections.find(r=>r.id===o.socketId);const s=toSocketMoment(o,t?.url??"");if(s)e(s)})}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.isToolingSocket=isToolingSocket;exports.socketStore=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _store=require("../conditions/store");var _findProblems=require("./findProblems");var _readMessage=require("./readMessage");var _webSocketPatch=require("./webSocketPatch");const LATE_REPLY_MS=2*6e4;const MAX_FRAMES=1e3;const MAX_CONNECTIONS=50;const MAX_ANSWERED_URLS=50;const MAX_ANSWERED_TYPES=200;const HEALTHY_MS=3e4;const TOOLING_PATH=/\/(hot|message|inspector\/(device|debug)|debugger-proxy|__expo[^/?]*)(?:[/?]|$)/;const TOOLING_PORT=/^wss?:\/\/[^/]+:8097(?:\/|$)/;function isToolingSocket(u){return(0,_sharedUi.isBuoyRequest)(u)||TOOLING_PATH.test(u)||TOOLING_PORT.test(u)}class SocketStore extends _sharedUi.BaseEventStore{connections=new Map;controls=new Map;pending=new Map;answered=new Map;socketSeq=0;frameSeq=0;blocked=false;offline=false;installed=false;mirror=false;remote=null;capturingSince=null;mirrored=null;cache=null;version=0;recheck=null;retryOnAccess=null;constructor(){super({storeName:"sockets",maxEvents:MAX_FRAMES})}install(){if(this.installed||this.mirror)return this.installed;if((0,_sharedUi.getAccountAccess)().status==="locked"){this.retryOnAccess??=(0,_sharedUi.subscribeAccountAccess)(()=>{if((0,_sharedUi.getAccountAccess)().status!=="locked"&&this.install()){this.retryOnAccess?.();this.retryOnAccess=null}});return false}this.installed=(0,_webSocketPatch.installWebSocketPatch)(this);if(this.installed){this.capturingSince=Date.now();(0,_store.subscribeNetworkConditions)(()=>this.syncOffline());this.syncOffline()}return this.installed}startCapturing(){this.install()}stopCapturing(){}isCapturing(){return this.installed}disableCapture(){this.mirror=true;super.disableCapture()}bump(){this.notifyArrayListeners()}nextFrameId(){return`f${++this.frameSeq}`}setConnection(e,t){const n=this.connections.get(e);if(n)this.connections.set(e,{...n,...t})}push(e){this.addEvent(e)}register(e,t,n){if(this.mirror||isToolingSocket(e)||(0,_sharedUi.getAccountAccess)().status==="locked")return null;const s=`s${++this.socketSeq}`;const i=(0,_readMessage.hideUrlSecrets)(e);const o=(0,_readMessage.socketKey)(i);let r;for(const c of this.connections.values())if((0,_readMessage.socketKey)(c.url)===o)r=c;const a=r?.openedAt!==void 0&&(r.closedAt??Date.now())-r.openedAt>=HEALTHY_MS;const f=r?.state==="closed"&&r.closeCode!==1e3&&!a;const d=f?r.attempt+1:1;this.connections.set(s,{id:s,url:i,...t?.length?{protocols:t}:{},attempt:d,state:"connecting",createdAt:Date.now(),sent:0,received:0,bytesSent:0,bytesReceived:0,pings:0});this.controls.set(s,n);this.trimConnections();this.bump();return s}trimConnections(){if(this.connections.size<=MAX_CONNECTIONS)return;for(const e of this.connections.values()){if(this.connections.size<=MAX_CONNECTIONS)break;if(e.state!=="closed")continue;this.connections.delete(e.id);this.controls.delete(e.id);this.pending.delete(e.id)}}open(e){const t=Date.now();this.setConnection(e,{state:"open",openedAt:t});this.push({id:this.nextFrameId(),socketId:e,kind:"open",timestamp:t})}close(e,t,n,s){const i=this.connections.get(e);if(!i||i.state==="closed")return;const o=Date.now();this.setConnection(e,{state:"closed",closedAt:o,closeCode:t,closeReason:n||void 0,...s?{closedByBuoy:true}:{},frozen:false});this.controls.delete(e);this.pending.delete(e);this.trimConnections();this.push({id:this.nextFrameId(),socketId:e,kind:"close",timestamp:o,...t!==void 0?{code:t}:{},...n?{reason:n}:{},...s?{byBuoy:s}:{},...i.openedAt===void 0?{neverOpened:true}:{}})}error(e){this.push({id:this.nextFrameId(),socketId:e,kind:"error",timestamp:Date.now()})}message(e,t,n,s){const i=this.connections.get(e);if(!i||(0,_sharedUi.getAccountAccess)().status==="locked")return void 0;const o=(0,_readMessage.readMessage)(n);const r=Date.now();const a=this.nextFrameId();const f={id:a,socketId:e,kind:"message",direction:t,timestamp:r,data:o.data,size:o.size,...o.binary?{binary:true}:{},...o.truncated?{truncated:true}:{},...o.json?{json:true}:{},...o.type?{type:o.type}:{},...o.correlationId?{correlationId:o.correlationId}:{},...o.ping?{ping:true}:{},...s?.fake?{fake:s.fake}:{},...s?.held?{held:true}:{},...s?.sentWhileClosed?{sentWhileClosed:true}:{}};const d=t==="out";this.setConnection(e,{lastMessageAt:r,...o.ping?{pings:i.pings+1}:d?{sent:i.sent+1,bytesSent:i.bytesSent+o.size}:{received:i.received+1,bytesReceived:i.bytesReceived+o.size}});if(o.correlationId&&!s?.held&&!(d&&s?.sentWhileClosed)){let c=this.pending.get(e);if(d){if(!c)this.pending.set(e,c=new Map);c.set(o.correlationId,{frameId:a,at:r});this.scheduleRecheck()}else{const h=c?.get(o.correlationId);if(h&&r-h.at>LATE_REPLY_MS)c.delete(o.correlationId);const k=h&&r-h.at<=LATE_REPLY_MS?h.frameId:void 0;const l=k?this.events.find(p=>p.id===k):void 0;if(l&&(o.replyShaped||o.type&&o.type===l.type)){c.delete(o.correlationId);f.replyTo=l.id;const p=r-l.timestamp;this.events=this.events.map(m=>m.id===l.id?{...m,replyId:a,replyMs:p}:m);if(l.type)this.rememberAnswered((0,_readMessage.socketKey)(i.url),l.type)}}}this.push(f);return a}rememberAnswered(e,t){let n=this.answered.get(e);if(n)this.answered.delete(e);else n=new Set;this.answered.set(e,n);n.delete(t);n.add(t);while(n.size>MAX_ANSWERED_TYPES)n.delete(n.values().next().value);while(this.answered.size>MAX_ANSWERED_URLS)this.answered.delete(this.answered.keys().next().value)}scheduleRecheck(){if(this.recheck)clearTimeout(this.recheck);this.recheck=null;const e=Date.now();let t=Infinity;for(const[n,s]of this.pending){for(const[i,o]of s){const r=e-o.at;if(r>LATE_REPLY_MS)s.delete(i);else t=Math.min(t,r<_findProblems.REPLY_TIMEOUT_MS?o.at+_findProblems.REPLY_TIMEOUT_MS:o.at+LATE_REPLY_MS+1)}if(s.size===0)this.pending.delete(n)}if(t===Infinity)return;this.recheck=setTimeout(()=>{this.recheck=null;this.bump();this.scheduleRecheck()},Math.max(0,t-e)+100)}cutOff(){if(this.offline)return"Offline (Buoy)";return this.blocked?"Blocked by Buoy":null}isFrozen(e){return this.connections.get(e)?.frozen===true}syncOffline(){const e=(0,_store.conditionsCanApply)()&&((0,_store.getNetworkCondition)()==="offline"||["offline","noInternet"].includes((0,_store.getEffectiveNetworkConnection)()));if(e===this.offline)return;this.offline=e;if(e){for(const t of[...this.controls.values()])t.fakeClose(1006,"Offline (Buoy)")}this.bump()}getState(){if(this.mirrored)return this.mirrored;if(this.cache?.version===this.version&&this.cache.state.frames===this.events)return this.cache.state;const e=[...this.connections.values()].reverse();const t=this.getEvents();const n={connections:e,frames:t,problems:(0,_findProblems.findProblems)(t,e,Date.now(),this.answered),tests:{blocked:this.blocked,offline:this.offline,frozen:e.filter(s=>s.frozen).map(s=>s.id)},capturingSince:this.capturingSince};this.cache={version:this.version,state:n};return n}getFrame(e){return this.getState().frames.find(t=>t.id===e)}subscribeState(e){return this.subscribeToEvents(()=>e())}setRemote(e){this.remote=e}async loadFrame(e){if(this.remote)return this.remote.getFrame(e);const t=this.getFrame(e);if(!t)return null;const n=t.replyId??t.replyTo;return{frame:t,partner:n?this.getFrame(n)??null:null}}applySnapshot(e){this.mirrored=e;this.notifyArrayListeners()}async act(e){if(this.remote)return this.remote.act(e);return this.actLocal(e)}actLocal(e){const t="socketId"in e?this.controls.get(e.socketId):void 0;const n=s=>({ok:false,message:this.connections.has(s)?`Socket ${s} is closed.`:`No socket ${s}. Read get_sockets for ids.`});switch(e.action){case"inject":{if(!t)return n(e.socketId);const s=t.inject(e.data);return{ok:true,frameId:s,message:`Pushed the message into the app on ${e.socketId}, as if the server sent it.`}}case"send":{if(!t)return n(e.socketId);const s=this.connections.get(e.socketId)?.state==="connecting";const i=t.send(e.data);const o=i?this.getFrame(i)?.held:false;return o?{ok:false,frameId:i,message:s?`Held back: ${e.socketId} is still connecting, so the server did not get it. Try again once it's open.`:`Held back: ${e.socketId} is frozen, blocked or offline, so the server did not get it.`}:{ok:true,frameId:i,message:`Sent to the server on ${e.socketId}.`}}case"close":{if(!t)return n(e.socketId);const s=e.code??1006;if(!Number.isInteger(s)||s<1e3||s>4999){return{ok:false,message:`Close code ${s} isn't a WebSocket close code. Use 1000-4999, like 1006, 1008 or 1001.`}}const i=e.reason??(s===1006?"Dropped by Buoy":"Closed by Buoy");t.fakeClose(s,i);return{ok:true,message:`Closed ${e.socketId} with code ${s}. The app got the close; watch for its reconnect.`}}case"freeze":{if(!t)return n(e.socketId);this.setConnection(e.socketId,{frozen:e.frozen});this.bump();return{ok:true,message:e.frozen?`Froze ${e.socketId}: it still looks open, but no messages get through either way.`:`Unfroze ${e.socketId}. Messages held while frozen are lost.`}}case"block":{this.blocked=e.blocked;if(e.blocked)for(const s of[...this.controls.values()])s.fakeClose(1006,"Blocked by Buoy");this.bump();return{ok:true,message:e.blocked?"Blocked: open sockets dropped, and every new one fails until you unblock.":"Unblocked: new sockets can connect again."}}case"reset":{this.blocked=false;for(const s of this.connections.values())if(s.frozen)this.setConnection(s.id,{frozen:false});this.bump();return{ok:true,message:"Reset: no socket is frozen or blocked. The app reconnects on its own schedule."}}case"clear":{this.clearEvents();return{ok:true,message:"Cleared the message list."}}}}clearEvents(){for(const[e,t]of this.connections)if(t.state==="closed")this.connections.delete(e);this.pending.clear();this.answered.clear();super.clearEvents()}notifyArrayListeners(){this.version++;super.notifyArrayListeners()}}const socketStore=exports.socketStore=new SocketStore;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.SNAPSHOT_TEXT=exports.SNAPSHOT_FRAMES=exports.LIST_BODY_TEXT=void 0;exports.matchesType=matchesType;exports.querySockets=querySockets;exports.socketsSyncAdapter=void 0;var _foldFrames=require("./foldFrames");var _readMessage=require("./readMessage");var _socketStore=require("./socketStore");const SNAPSHOT_FRAMES=exports.SNAPSHOT_FRAMES=300;const SNAPSHOT_TEXT=exports.SNAPSHOT_TEXT=1e3;const PREVIEW_TEXT=200;const LIST_BODY_TEXT=exports.LIST_BODY_TEXT=4e3;function cut(t,e){if(!t.data||t.data.length<=e)return t;return{...t,data:t.data.slice(0,e),dataCut:true}}function matchesType(t,e){if(!t)return false;const r=e.toLowerCase();const n=t.toLowerCase();return r.endsWith("*")?(0,_foldFrames.matchesPrefix)(n,r.slice(0,-1)):n.includes(r)}function querySockets(t,e={}){const r=new Set(t.problems.flatMap(o=>o.frameIds));let n=t.frames;if(e.frameId)n=n.filter(o=>o.id===e.frameId||o.replyTo===e.frameId||o.replyId===e.frameId);if(e.socketId)n=n.filter(o=>o.socketId===e.socketId);if(!e.includePings&&!e.frameId)n=n.filter(o=>!o.ping);if(e.type)n=n.filter(o=>matchesType(o.type,e.type));if(e.direction==="lifecycle")n=n.filter(o=>o.kind!=="message");else if(e.direction)n=n.filter(o=>o.direction===e.direction);if(e.problems)n=n.filter(o=>r.has(o.id));if(e.since)n=n.filter(o=>o.timestamp>=e.since);const c=n.length;const i=typeof e.limit==="number"&&e.limit>=0?Math.min(e.limit,500):50;const d=n.slice(0,i).map(o=>e.frameId?o:cut(o,e.includeBodies?LIST_BODY_TEXT:PREVIEW_TEXT));const s=e.socketId?t.connections.find(o=>o.id===e.socketId):void 0;const a=s?(0,_readMessage.socketKey)(s.url):void 0;return{connections:e.socketId?t.connections.filter(o=>o.id===e.socketId):t.connections,problems:e.socketId?t.problems.filter(o=>o.socketId?o.socketId===e.socketId:!!o.url&&(0,_readMessage.socketKey)(o.url)===a):t.problems,tests:t.tests,capturingSince:t.capturingSince,frames:d,total:c,flagged:[...r]}}function readAction(t){if(!t||typeof t!=="object")return null;const e=t;const r=typeof e.socketId==="string"?e.socketId:"";const n=typeof e.data==="string"?e.data:e.data!==void 0?JSON.stringify(e.data):void 0;switch(e.action){case"inject":case"send":return r&&n!==void 0?{action:e.action,socketId:r,data:n}:null;case"close":return r?{action:"close",socketId:r,...typeof e.code==="number"?{code:e.code}:{},...typeof e.reason==="string"?{reason:e.reason}:{}}:null;case"freeze":return r?{action:"freeze",socketId:r,frozen:e.frozen!==false}:null;case"block":return{action:"block",blocked:e.blocked!==false};case"reset":case"clear":return{action:e.action};default:return null}}const socketsSyncAdapter=exports.socketsSyncAdapter={version:1,getSnapshot:()=>{const t=_socketStore.socketStore.getState();return{...t,frames:t.frames.slice(0,SNAPSHOT_FRAMES).map(e=>cut(e,SNAPSHOT_TEXT))}},subscribe:t=>_socketStore.socketStore.subscribeState(t),actions:{getFrame:t=>{const e=t&&typeof t==="object"?t.id:void 0;if(typeof e!=="string")return null;const r=_socketStore.socketStore.getFrame(e);if(!r)return null;const n=r.replyId??r.replyTo;return{frame:r,partner:n?_socketStore.socketStore.getFrame(n)??null:null}},query:t=>querySockets(_socketStore.socketStore.getState(),t??{}),act:t=>{const e=readAction(t);if(!e){return{ok:false,message:"Unknown or incomplete action. inject/send need socketId and data; close/freeze need socketId."}}return _socketStore.socketStore.actLocal(e)}}};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.installWebSocketPatch=installWebSocketPatch;exports.isWebSocketPatched=isWebSocketPatched;const EVENT_TYPES=["open","message","close","error"];const CONNECTING=0;const OPEN=1;const CLOSED=3;const PATCHED=Symbol.for("buoy.websocket.patched");const BUOY_CLOSE_CODE=4999;function call(n,f,d){try{if(typeof f==="function")f.call(n,d);else if(f&&typeof f.handleEvent==="function"){f.handleEvent(d)}}catch(g){const h=globalThis.reportError;if(typeof h==="function")h(g);else console.error(g)}}function safe(n){try{return n()}catch(f){if(typeof __DEV__!=="undefined"&&__DEV__)console.warn("[Buoy] Couldn't record a socket event:",f);return void 0}}function fakeEvent(n,f,d){return{type:n,target:f,currentTarget:f,isTrusted:false,timeStamp:Date.now(),defaultPrevented:false,preventDefault(){},stopPropagation(){},stopImmediatePropagation(){},...d}}function isWebSocketPatched(){const n=globalThis.WebSocket;return typeof n==="function"&&n[PATCHED]===true}function installWebSocketPatch(n){const f=globalThis;const d=f.WebSocket;if(typeof d!=="function"||d[PATCHED])return false;const g=d.prototype;const h=g.send;const x=g.close;const P=g.addEventListener;const D=g.removeEventListener;class I extends d{static[PATCHED]=true;constructor(c,i,...m){super(c,i,...m);const l=this;const _={open:[],message:[],close:[],error:[]};let a=false;let S=false;let o=null;const E=Object.getOwnPropertyDescriptor(l,"readyState");let T=E&&"value"in E?E.value:void 0;const O=()=>E&&"value"in E?T:Reflect.get(g,"readyState",l);Object.defineProperty(l,"readyState",{configurable:true,enumerable:true,get:()=>a?CLOSED:S?CONNECTING:O(),set:e=>{T=e}});const v=()=>{const e=a;a=false;try{x.call(l,BUOY_CLOSE_CODE,"Closed by Buoy")}catch{}finally{a=e}};const k=(e,t)=>{const s=_[e];let r=false;const u=t;const y=u?.stopImmediatePropagation;if(u&&typeof y==="function"){try{u.stopImmediatePropagation=()=>{r=true;y.call(u)}}catch{}}for(const p of[...s]){if(r)break;const b=s.indexOf(p);if(b===-1)continue;if(p.once)s.splice(b,1);call(l,p.listener,t)}};for(const e of EVENT_TYPES){Object.defineProperty(l,`on${e}`,{configurable:true,enumerable:true,get:()=>_[e].find(t=>t.attr)?.listener??null,set:t=>{const s=_[e];const r=s.find(u=>u.attr);if(typeof t==="function"){if(r)r.listener=t;else s.push({listener:t,once:false,capture:false,attr:true})}else if(r){s.splice(s.indexOf(r),1)}}})}const W=e=>typeof e==="boolean"?e:!!e?.capture;l.__buoyAdd=(e,t,s)=>{const r=_[e];if(!r)return false;const u=W(s);if(!t||r.some(b=>!b.attr&&b.listener===t&&b.capture===u))return true;const y=typeof s==="object"?s:void 0;if(y?.signal?.aborted)return true;const p={listener:t,once:!!y?.once,capture:u};r.push(p);y?.signal?.addEventListener?.("abort",()=>{const b=r.indexOf(p);if(b!==-1)r.splice(b,1)},{once:true});return true};l.__buoyRemove=(e,t,s)=>{const r=_[e];if(!r)return false;const u=W(s);const y=r.findIndex(p=>!p.attr&&p.listener===t&&p.capture===u);if(y!==-1)r.splice(y,1);return true};l.__buoySend=e=>{if(!o)return h.call(l,e);if(a){safe(()=>n.message(o,"out",e,{sentWhileClosed:true,held:true}));return}if(S){safe(()=>n.message(o,"out",e,{sentWhileClosed:true,held:true}));const t=globalThis.DOMException;throw typeof t==="function"?new t("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.","InvalidStateError"):new Error("INVALID_STATE_ERR")}if(O()!==OPEN){safe(()=>n.message(o,"out",e,{sentWhileClosed:true}));return h.call(l,e)}if(safe(()=>n.cutOff()!==null||n.isFrozen(o))===true){safe(()=>n.message(o,"out",e,{held:true}));return}safe(()=>n.message(o,"out",e));return h.call(l,e)};const C={inject(e){if(!o)return void 0;const t=safe(()=>n.message(o,"in",e,{fake:"inject"}));k("message",fakeEvent("message",l,{data:e,origin:"",lastEventId:"",ports:[]}));return t},send(e){if(!o)return void 0;const t=a||O()!==OPEN||safe(()=>n.cutOff()!==null||n.isFrozen(o))===true;const s=safe(()=>n.message(o,"out",e,t?{fake:"send",held:t}:{fake:"send"}));if(!t)h.call(l,e);return s},fakeClose(e,t){if(a)return;a=true;if(o&&e===1006)safe(()=>n.error(o));if(o)safe(()=>n.close(o,e,t,true));if(e===1006)k("error",fakeEvent("error",l,{message:t}));k("close",fakeEvent("close",l,{code:e,reason:t,wasClean:e!==1006}));v()},isOpen:()=>!a&&O()===OPEN};const N=typeof c==="string"?c:String(c);const A=i==null?void 0:Array.isArray(i)?i:[i];o=safe(()=>n.register(N,A,C))??null;for(const e of EVENT_TYPES){P.call(l,e,t=>{if(a||S){if(e==="open")v();return}if(o){const s=o;const r=e==="open"?safe(()=>n.cutOff()):null;if(r)return C.fakeClose(1006,r);if(e==="open")safe(()=>n.open(s));else if(e==="close")safe(()=>n.close(s,t?.code,t?.reason,false));else if(e==="error")safe(()=>n.error(s));else{const u=safe(()=>n.cutOff()!==null||n.isFrozen(s))===true;safe(()=>n.message(s,"in",t?.data,u?{held:u}:void 0));if(u)return}}k(e,t)})}const w=o?safe(()=>n.cutOff()):null;if(w){S=true;v();setTimeout(()=>C.fakeClose(1006,w),0)}}addEventListener(c,i,m){if(this.__buoyAdd?.(c,i,m))return;return P.call(this,c,i,m)}removeEventListener(c,i,m){if(this.__buoyRemove?.(c,i,m))return;return D.call(this,c,i,m)}send(c){const i=this;return i.__buoySend?i.__buoySend(c):h.call(i,c)}}f.WebSocket=I;return true}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkSyncAdapter=exports.SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_BODY_INLINE_LIMIT=void 0;var _store=require("../conditions/store");var _networkEventStore=require("../utils/networkEventStore");var _networkSavedStore=require("../utils/networkSavedStore");var _overrideRulesStore=require("../overrides/overrideRulesStore");var _presets=require("../overrides/presets");var _engine=require("../overrides/engine");var _networkListener=require("../utils/networkListener");var _types=require("../overrides/types");var _sharedUi=require("@buoy-gg/shared-ui");const SNAPSHOT_BODY_INLINE_LIMIT=exports.SNAPSHOT_BODY_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;function shouldStripBody(e,t){if(e===void 0)return false;if((t??0)>SNAPSHOT_BODY_INLINE_LIMIT)return true;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_BODY_INLINE_LIMIT)}const wireCache=new WeakMap;const strippedCache=new WeakMap;function toWireEvent(e){const t=wireCache.get(e);if(t)return t;let n;try{n=buildWireEvent(e)}catch{n=buildMetadataOnly(e)}wireCache.set(e,n);return n}function buildMetadataOnly(e){const t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0};let n=1024;try{n=(0,_sharedUi.approxJsonSize)(t,SNAPSHOT_EVENTS_BUDGET).bytes}catch{}return{event:t,bytes:n}}function buildWireEvent(e){const t=shouldStripBody(e.requestData,e.requestSize);const n=shouldStripBody(e.responseData,e.responseSize);const r=toWireGraphqlVariables(e.graphqlVariables);const o=toWireHeaders(e.requestHeaders);const s=toWireHeaders(e.responseHeaders);const d=t||n||r!==e.graphqlVariables||o!==e.requestHeaders||s!==e.responseHeaders;let i=e;if(d){i={...e};if(t){i.requestData=void 0;i.requestBodyOmitted=true}if(n){i.responseData=void 0;i.responseBodyOmitted=true}if(r!==e.graphqlVariables){i.graphqlVariables=r}if(o!==e.requestHeaders){i.requestHeaders=o;i.headersOmitted=true}if(s!==e.responseHeaders){i.responseHeaders=s;i.headersOmitted=true}}return{event:i,bytes:(0,_sharedUi.approxJsonSize)(i,SNAPSHOT_EVENTS_BUDGET).bytes}}function toStrippedEvent(e){const t=strippedCache.get(e);if(t)return t;const{event:n}=toWireEvent(e);const r={...n};if(r.requestData!==void 0){r.requestData=void 0;r.requestBodyOmitted=true}if(r.responseData!==void 0){r.responseData=void 0;r.responseBodyOmitted=true}if(r.graphqlVariables!==void 0){r.graphqlVariables=toWireGraphqlVariables(r.graphqlVariables,true)}const o={event:r,bytes:(0,_sharedUi.approxJsonSize)(r,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,o);return o}function fitEventsToBudget(e){const t=new Array(e.length);let n=0;for(let r=0;r<e.length;r++){const o=toWireEvent(e[r]);if(n+o.bytes<=SNAPSHOT_EVENTS_BUDGET){t[r]=o.event;n+=o.bytes}else{const s=toStrippedEvent(e[r]);t[r]=s.event;n+=s.bytes}}return t}function toWireGraphqlVariables(e,t=false){if(!e)return e;if(!t&&!shouldStripBody(e,void 0))return e;const n={};for(const[r,o]of Object.entries(e)){if(typeof o==="string"&&o.length<=64)n[r]=o;else if(typeof o==="number"||typeof o==="boolean"){n[r]=o}}return Object.keys(n).length>0?n:void 0}const SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_HEADER_VALUE_LIMIT=64;function toWireHeaders(e){if(!e)return e;let t=false;const n={};for(const[r,o]of Object.entries(e)){if(typeof o!=="string")continue;if(o.length<=SNAPSHOT_HEADER_VALUE_LIMIT){n[r]=o}else{n[r]=`${o.slice(0,SNAPSHOT_HEADER_VALUE_LIMIT)}\u2026 [${o.length-SNAPSHOT_HEADER_VALUE_LIMIT} more]`;t=true}}return t?n:e}const stripLargeRuleBodies=e=>{let t=false;const n=e.rules.map(r=>{if(!r.body||r.body.length<=SNAPSHOT_BODY_INLINE_LIMIT){return r}t=true;return{...r,body:void 0,bodyOmitted:true}});return t?{...e,rules:n}:e};const resolveEvent=e=>_networkEventStore.networkEventStore.getEventById(e)??_networkSavedStore.networkSavedStore.getEventById(e);const readId=e=>e&&typeof e==="object"?e.id:void 0;const readBool=(e,t)=>!!(e&&typeof e==="object"&&e[t]);const inactiveStamp=()=>(0,_engine.overridesCanApply)()?{}:{active:false,inactiveReason:_engine.OVERRIDES_INACTIVE_REASON};const VALID_KINDS=["respond","fail","delay"];function readRuleDraft(e,t){if(!e||typeof e!=="object")return null;const n=e.rule??e;if(!n||typeof n!=="object")return null;const r=n;const o=typeof r.urlPattern==="string"&&r.urlPattern.trim()?r.urlPattern.trim():t?.urlPattern??"";if(!o)return null;const s=VALID_KINDS.includes(r.kind)?r.kind:t?.kind??"respond";return{id:typeof r.id==="string"?r.id:void 0,enabled:r.enabled!==false,name:typeof r.name==="string"?r.name:t?.name,urlPattern:o,methods:Array.isArray(r.methods)?r.methods.filter(d=>typeof d==="string").map(d=>d.toUpperCase()):t?.methods,requireHeader:typeof r.requireHeader==="string"&&r.requireHeader.trim()?r.requireHeader.trim():void 0,bodyIncludes:typeof r.bodyIncludes==="string"&&r.bodyIncludes?r.bodyIncludes.slice(0,4096):t?.bodyIncludes,kind:s,status:typeof r.status==="number"?r.status:t?.status,statusText:typeof r.statusText==="string"?r.statusText:t?.statusText,headers:r.headers&&typeof r.headers==="object"?r.headers:t?.headers,body:patchedBody(r,t),failKind:r.failKind==="timeout"?"timeout":void 0,delayMs:typeof r.delayMs==="number"?r.delayMs:void 0,times:typeof r.times==="number"?r.times:null,alternate:r.alternate===true}}const isPlainObject=e=>!!e&&typeof e==="object"&&!Array.isArray(e);function deepMerge(e,t,n="",r={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t)){if(t.length>0&&t.length<e.length){r.shrunk.push({path:n||"(root)",have:e.length,sent:t.length})}return t}if(!isPlainObject(e)||!isPlainObject(t))return t;const o={...e};for(const[s,d]of Object.entries(t)){const i=n?`${n}.${s}`:s;if(s in e){const u=(0,_sharedUi.shapeKind)(e[s]);const l=(0,_sharedUi.shapeKind)(d);if((u==="array"||u==="object")&&u!==l){r.breaks.push({path:i,from:u,to:l})}o[s]=deepMerge(e[s],d,i,r)}else{o[s]=d}}return o}function patchViolations(e,t){if(e.body!=null||!isPlainObject(e.bodyPatch)||typeof t!=="string")return[];try{return(0,_sharedUi.typedEditViolations)(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function patchedBody(e,t){if(typeof e.body==="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);const n=t?.body??(isPlainObject(e.bodyPatch)&&typeof e.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(r=>r.id===e.id)?.body:void 0);if(isPlainObject(e.bodyPatch)&&typeof n==="string"){try{return JSON.stringify(deepMerge(JSON.parse(n),e.bodyPatch),null,2)}catch{return n}}return n}function existingRule(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const n=t.id;if(typeof n!=="string")return null;const r=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===n);return r?{...r}:null}function preservedBody(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const n=t;if(n.bodyOmitted!==true||typeof n.id!=="string")return null;const r=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===n.id);return r?{body:r.body}:null}function baseFromRequest(e){if(!e||typeof e!=="object")return null;const t=e.fromRequestId;if(typeof t!=="string"||!t)return null;const n=resolveEvent(t);return n?(0,_presets.draftFromEvent)(n):null}const networkSyncAdapter=exports.networkSyncAdapter={dispose:()=>{_overrideRulesStore.overrideRulesStore.setEnabled(false)},version:6,getSnapshot:()=>{_networkEventStore.networkEventStore.ensureInterception();return{conditions:{version:1,runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.getNetworkCondition)(),available:(0,_store.conditionsCanApply)()},events:fitEventsToBudget(_networkEventStore.networkEventStore.getEvents()),overrides:stripLargeRuleBodies(_overrideRulesStore.overrideRulesStore.getState()),saved:_networkSavedStore.networkSavedStore.getRecords().map(e=>({...e,event:toWireEvent(e.event).event}))}},subscribe:e=>{const t=_networkEventStore.networkEventStore.subscribeToEvents(e);const n=(0,_store.subscribeNetworkConditions)(e);const r=_networkSavedStore.networkSavedStore.subscribe(e);const o=_overrideRulesStore.overrideRulesStore.subscribe(e);return()=>{n();t();r();o()}},actions:{getNetworkConditions:()=>({runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.getNetworkCondition)(),available:(0,_store.conditionsCanApply)()}),setNetworkConditions:e=>{const t=e&&typeof e==="object"?e.profile:void 0;return{runtimeId:_store.networkConditionsRuntimeId,profile:(0,_store.setNetworkCondition)(t),available:(0,_store.conditionsCanApply)()}},clearEvents:()=>{_networkEventStore.networkEventStore.clearEvents()},getEventBody:e=>{const t=readId(e);if(!t)return null;const n=resolveEvent(t);if(!n)return null;return{url:n.url??null,method:n.method??null,status:n.status??null,override:n.override??null,requestData:n.requestData??null,responseData:n.responseData??null,requestHeaders:n.requestHeaders??null,responseHeaders:n.responseHeaders??null}},setPinned:e=>{const t=readId(e);if(!t)return null;const n=resolveEvent(t);if(!n)return null;const r=readBool(e,"pinned");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).pinned;if(o===r)return{ok:true};return _networkSavedStore.networkSavedStore.togglePin(n)},setSaved:e=>{const t=readId(e);if(!t)return null;const n=resolveEvent(t);if(!n)return null;const r=readBool(e,"saved");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).saved;if(o===r)return{ok:true};return _networkSavedStore.networkSavedStore.toggleSave(n)},removeSavedRecord:e=>{const t=e&&typeof e==="object"?e.key:void 0;if(!t)return null;_networkSavedStore.networkSavedStore.remove(t);return{ok:true}},clearSavedRequests:()=>{_networkSavedStore.networkSavedStore.clearSaved();return{ok:true}},clearPinnedRequests:()=>{_networkSavedStore.networkSavedStore.clearPinned();return{ok:true}},setOverridesEnabled:e=>{_overrideRulesStore.overrideRulesStore.setEnabled(readBool(e,"enabled"));return{ok:true,enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,...inactiveStamp()}},upsertOverrideRule:e=>{const t=e?.rule??e;const n=!!t&&t.body==null&&(isPlainObject(t.bodyPatch)||typeof t.bodyPath==="string");const r=baseFromRequest(e)??preservedBody(e)??(n?existingRule(e):null);if(t&&typeof t.bodyPath==="string"&&t.body==null){const d=r?.body??(typeof t.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(l=>l.id===t.id)?.body:void 0);if(typeof d!=="string"){return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."}}if(t.bodyValue===void 0){return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${t.bodyPath}" to.`}}let i;try{i=JSON.parse(d)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}const u=(0,_sharedUi.patchFromPath)(i,t.bodyPath,t.bodyValue);if(!u.ok)return{ok:false,error:`Refused: ${u.error}`};t.bodyPatch=u.patch;delete t.bodyPath;delete t.bodyValue}if(t&&isPlainObject(t.bodyPatch)&&t.body==null){const d=r?.body??(typeof t.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(i=>i.id===t.id)?.body:void 0);if(typeof d!=="string"){return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."}}if(t.force!==true){let i;try{const l=(0,_sharedUi.expandKeyedArrays)(JSON.parse(d),t.bodyPatch);i=l.error;if(l.notes.length)t.bodyPatch=l.patch}catch{}if(i){return{ok:false,error:`Refused: ${i}`}}const u=patchViolations(t,d);if(u.length>0){return{ok:false,error:(0,_sharedUi.refusalText)(u,"response body",(0,_sharedUi.suggestedPatch)(t.bodyPatch,u)),violations:u}}}}const o=readRuleDraft(e,r);if(!o){const d=e?.fromRequestId;return{ok:false,error:d?`No captured request \`${d}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}const s=_overrideRulesStore.overrideRulesStore.upsertRule(o);if(!s)return{ok:false,error:"Override rule limit reached."};if(s.enabled)_overrideRulesStore.overrideRulesStore.setEnabled(true);return{ok:true,rule:{id:s.id,urlPattern:s.urlPattern,enabled:s.enabled,kind:s.kind,status:s.status,times:s.times,bodySize:s.body?s.body.length:0},...s.times===void 0||s.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${s.id}\`). If you meant only the next one, set times:1.`}:{},...inactiveStamp()}},setOverrideRuleEnabled:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.setRuleEnabled(t,readBool(e,"enabled"));return{ok:true,...inactiveStamp()}},deleteOverrideRule:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.removeRule(t);return{ok:true}},clearOverrideRules:()=>{_overrideRulesStore.overrideRulesStore.clearRules();return{ok:true}},replaceOverrideRules:async e=>{const t=e??{};if(!Array.isArray(t.rules)){return{ok:false,error:"replaceOverrideRules needs `rules`: an array of rules, first match first."}}if(t.rules.length>_types.MAX_RULES){return{ok:false,error:`Too many rules: ${t.rules.length}. The most is ${_types.MAX_RULES}.`}}await _overrideRulesStore.overrideRulesStore.ensureLoaded();const n=_overrideRulesStore.overrideRulesStore.replaceAllRules(t.rules,t.enabled!==false);if(!n)return{ok:false,error:"This copy of the Network tool only mirrors a device, so it can't replace rules."};return{ok:true,count:n.length,enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,...inactiveStamp()}},listOverrideRules:async()=>{await _overrideRulesStore.overrideRulesStore.ensureLoaded();return _overrideRulesStore.overrideRulesStore.getState()},getOverrideRuleBody:e=>{const t=readId(e);if(!t)return null;const n=_overrideRulesStore.overrideRulesStore.getState().rules.find(r=>r.id===t);if(!n)return null;return{body:n.body??null}},getCaptureStatus:()=>{const e=_networkEventStore.networkEventStore.getSubscriberCounts().total;let t=null;let n=null;try{t=(0,_networkListener.isNetworkListening)();n=(0,_networkListener.getNetworkListenerCount)()}catch{}let r=null;try{r=(0,_networkListener.isNetworkInterceptionLive)()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:r,listenerCount:n,eventCount:_networkEventStore.networkEventStore.getEvents().length}},debugOverrides:e=>{const{url:t,method:n}=e&&typeof e==="object"?e:{};const r=typeof t==="string"?t:"https://example.com/";const o=typeof n==="string"&&n.trim()?n.trim().toUpperCase():"GET";return{tested:{url:r,method:o},interceptorInstalled:(0,_networkListener.isNetworkListening)(),listenerCount:(0,_networkListener.getNetworkListenerCount)(),engine:(0,_engine.inspectEngine)(r,o),store:{enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,autoPaused:_overrideRulesStore.overrideRulesStore.getState().autoPaused,ruleCount:_overrideRulesStore.overrideRulesStore.getState().rules.length,rulesVisibleToEngine:_overrideRulesStore.overrideRulesStore.getRules().length}}}}};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkSyncAdapter=exports.SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_BODY_INLINE_LIMIT=void 0;var _store=require("../conditions/store");var _networkEventStore=require("../utils/networkEventStore");var _networkSavedStore=require("../utils/networkSavedStore");var _overrideRulesStore=require("../overrides/overrideRulesStore");var _presets=require("../overrides/presets");var _engine=require("../overrides/engine");var _networkListener=require("../utils/networkListener");var _types=require("../overrides/types");var _sharedUi=require("@buoy-gg/shared-ui");const SNAPSHOT_BODY_INLINE_LIMIT=exports.SNAPSHOT_BODY_INLINE_LIMIT=16*1024;const SNAPSHOT_EVENTS_BUDGET=exports.SNAPSHOT_EVENTS_BUDGET=1.25*1024*1024;function shouldStripBody(e,t){if(e===void 0)return false;if((t??0)>SNAPSHOT_BODY_INLINE_LIMIT)return true;return(0,_sharedUi.isOverWireBudget)(e,SNAPSHOT_BODY_INLINE_LIMIT)}const wireCache=new WeakMap;const strippedCache=new WeakMap;function toWireEvent(e){const t=wireCache.get(e);if(t)return t;let n;try{n=buildWireEvent(e)}catch{n=buildMetadataOnly(e)}wireCache.set(e,n);return n}function buildMetadataOnly(e){const t={...e,requestData:void 0,responseData:void 0,graphqlVariables:void 0,requestBodyOmitted:e.requestData!==void 0?true:void 0,responseBodyOmitted:e.responseData!==void 0?true:void 0};let n=1024;try{n=(0,_sharedUi.approxJsonSize)(t,SNAPSHOT_EVENTS_BUDGET).bytes}catch{}return{event:t,bytes:n}}function buildWireEvent(e){const t=shouldStripBody(e.requestData,e.requestSize);const n=shouldStripBody(e.responseData,e.responseSize);const r=toWireGraphqlVariables(e.graphqlVariables);const o=toWireHeaders(e.requestHeaders);const s=toWireHeaders(e.responseHeaders);const d=t||n||r!==e.graphqlVariables||o!==e.requestHeaders||s!==e.responseHeaders;let i=e;if(d){i={...e};if(t){i.requestData=void 0;i.requestBodyOmitted=true}if(n){i.responseData=void 0;i.responseBodyOmitted=true}if(r!==e.graphqlVariables){i.graphqlVariables=r}if(o!==e.requestHeaders){i.requestHeaders=o;i.headersOmitted=true}if(s!==e.responseHeaders){i.responseHeaders=s;i.headersOmitted=true}}return{event:i,bytes:(0,_sharedUi.approxJsonSize)(i,SNAPSHOT_EVENTS_BUDGET).bytes}}function toStrippedEvent(e){const t=strippedCache.get(e);if(t)return t;const{event:n}=toWireEvent(e);const r={...n};if(r.requestData!==void 0){r.requestData=void 0;r.requestBodyOmitted=true}if(r.responseData!==void 0){r.responseData=void 0;r.responseBodyOmitted=true}if(r.graphqlVariables!==void 0){r.graphqlVariables=toWireGraphqlVariables(r.graphqlVariables,true)}const o={event:r,bytes:(0,_sharedUi.approxJsonSize)(r,SNAPSHOT_EVENTS_BUDGET).bytes};strippedCache.set(e,o);return o}function fitEventsToBudget(e){const t=new Array(e.length);let n=0;for(let r=0;r<e.length;r++){const o=toWireEvent(e[r]);if(n+o.bytes<=SNAPSHOT_EVENTS_BUDGET){t[r]=o.event;n+=o.bytes}else{const s=toStrippedEvent(e[r]);t[r]=s.event;n+=s.bytes}}return t}function toWireGraphqlVariables(e,t=false){if(!e)return e;if(!t&&!shouldStripBody(e,void 0))return e;const n={};for(const[r,o]of Object.entries(e)){if(typeof o==="string"&&o.length<=64)n[r]=o;else if(typeof o==="number"||typeof o==="boolean"){n[r]=o}}return Object.keys(n).length>0?n:void 0}const SNAPSHOT_HEADER_VALUE_LIMIT=exports.SNAPSHOT_HEADER_VALUE_LIMIT=64;function toWireHeaders(e){if(!e)return e;let t=false;const n={};for(const[r,o]of Object.entries(e)){if(typeof o!=="string")continue;if(o.length<=SNAPSHOT_HEADER_VALUE_LIMIT){n[r]=o}else{n[r]=`${o.slice(0,SNAPSHOT_HEADER_VALUE_LIMIT)}\u2026 [${o.length-SNAPSHOT_HEADER_VALUE_LIMIT} more]`;t=true}}return t?n:e}const stripLargeRuleBodies=e=>{let t=false;const n=e.rules.map(r=>{if(!r.body||r.body.length<=SNAPSHOT_BODY_INLINE_LIMIT){return r}t=true;return{...r,body:void 0,bodyOmitted:true}});return t?{...e,rules:n}:e};const resolveEvent=e=>_networkEventStore.networkEventStore.getEventById(e)??_networkSavedStore.networkSavedStore.getEventById(e);const readId=e=>e&&typeof e==="object"?e.id:void 0;const readBool=(e,t)=>!!(e&&typeof e==="object"&&e[t]);const inactiveStamp=()=>(0,_engine.overridesCanApply)()?{}:{active:false,inactiveReason:_engine.OVERRIDES_INACTIVE_REASON};const VALID_KINDS=["respond","fail","delay"];function readRuleDraft(e,t){if(!e||typeof e!=="object")return null;const n=e.rule??e;if(!n||typeof n!=="object")return null;const r=n;const o=typeof r.urlPattern==="string"&&r.urlPattern.trim()?r.urlPattern.trim():t?.urlPattern??"";if(!o)return null;const s=VALID_KINDS.includes(r.kind)?r.kind:t?.kind??"respond";return{id:typeof r.id==="string"?r.id:void 0,enabled:r.enabled!==false,name:typeof r.name==="string"?r.name:t?.name,urlPattern:o,methods:Array.isArray(r.methods)?r.methods.filter(d=>typeof d==="string").map(d=>d.toUpperCase()):t?.methods,requireHeader:typeof r.requireHeader==="string"&&r.requireHeader.trim()?r.requireHeader.trim():void 0,bodyIncludes:typeof r.bodyIncludes==="string"&&r.bodyIncludes?r.bodyIncludes.slice(0,4096):t?.bodyIncludes,graphqlOperation:typeof r.graphqlOperation==="string"&&r.graphqlOperation?r.graphqlOperation.slice(0,200):t?.graphqlOperation,graphqlVariables:typeof r.graphqlVariables==="string"?r.graphqlVariables.slice(0,4096):t?.graphqlVariables,bodyJson:typeof r.bodyJson==="string"&&r.bodyJson.length<=4096?r.bodyJson:t?.bodyJson,graphqlSingle:r.graphqlSingle===true?true:t?.graphqlSingle,sandbox:r.sandbox===true?true:void 0,kind:s,status:typeof r.status==="number"?r.status:t?.status,statusText:typeof r.statusText==="string"?r.statusText:t?.statusText,headers:r.headers&&typeof r.headers==="object"?r.headers:t?.headers,body:patchedBody(r,t),failKind:r.failKind==="timeout"?"timeout":void 0,delayMs:typeof r.delayMs==="number"?r.delayMs:void 0,times:typeof r.times==="number"?r.times:null,alternate:r.alternate===true}}const isPlainObject=e=>!!e&&typeof e==="object"&&!Array.isArray(e);const isBodyPatch=e=>isPlainObject(e)||Array.isArray(e);function deepMerge(e,t,n="",r={shrunk:[],breaks:[]}){if(Array.isArray(e)&&Array.isArray(t)){if(t.length>0&&t.length<e.length){r.shrunk.push({path:n||"(root)",have:e.length,sent:t.length})}return t}if(!isPlainObject(e)||!isPlainObject(t))return t;const o={...e};for(const[s,d]of Object.entries(t)){const i=n?`${n}.${s}`:s;if(s in e){const u=(0,_sharedUi.shapeKind)(e[s]);const l=(0,_sharedUi.shapeKind)(d);if((u==="array"||u==="object")&&u!==l){r.breaks.push({path:i,from:u,to:l})}o[s]=deepMerge(e[s],d,i,r)}else{o[s]=d}}return o}function patchViolations(e,t){if(e.body!=null||!isBodyPatch(e.bodyPatch)||typeof t!=="string")return[];try{return(0,_sharedUi.typedEditViolations)(JSON.parse(t),e.bodyPatch,{noun:"response body"})}catch{return[]}}function patchedBody(e,t){if(typeof e.body==="string")return e.body;if(e.body!=null)return JSON.stringify(e.body,null,2);const n=t?.body??(isBodyPatch(e.bodyPatch)&&typeof e.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(r=>r.id===e.id)?.body:void 0);if(isBodyPatch(e.bodyPatch)&&typeof n==="string"){try{return JSON.stringify(deepMerge(JSON.parse(n),e.bodyPatch),null,2)}catch{return n}}return n}function existingRule(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const n=t.id;if(typeof n!=="string")return null;const r=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===n);return r?{...r}:null}function preservedBody(e){if(!e||typeof e!=="object")return null;const t=e.rule??e;if(!t||typeof t!=="object")return null;const n=t;if(n.bodyOmitted!==true||typeof n.id!=="string")return null;const r=_overrideRulesStore.overrideRulesStore.getState().rules.find(o=>o.id===n.id);return r?{body:r.body}:null}function baseFromRequest(e){if(!e||typeof e!=="object")return null;const t=e.fromRequestId;if(typeof t!=="string"||!t)return null;const n=resolveEvent(t);return n?(0,_presets.draftFromEvent)(n):null}const networkSyncAdapter=exports.networkSyncAdapter={dispose:()=>{_overrideRulesStore.overrideRulesStore.setEnabled(false)},version:6,getSnapshot:()=>{_networkEventStore.networkEventStore.ensureInterception();return{conditions:(0,_store.getNetworkConditions)(),events:fitEventsToBudget(_networkEventStore.networkEventStore.getEvents()),overrides:stripLargeRuleBodies(_overrideRulesStore.overrideRulesStore.getState()),saved:_networkSavedStore.networkSavedStore.getRecords().map(e=>({...e,event:toWireEvent(e.event).event}))}},subscribe:e=>{const t=_networkEventStore.networkEventStore.subscribeToEvents(e);const n=(0,_store.subscribeNetworkConditions)(e);const r=_networkSavedStore.networkSavedStore.subscribe(e);const o=_overrideRulesStore.overrideRulesStore.subscribe(e);return()=>{n();t();r();o()}},actions:{getNetworkConditions:_store.getNetworkConditions,setNetworkConditions:_store.setNetworkConditions,clearEvents:()=>{_networkEventStore.networkEventStore.clearEvents()},getEventBody:e=>{const t=readId(e);if(!t)return null;const n=resolveEvent(t);if(!n)return null;return{url:n.url??null,method:n.method??null,status:n.status??null,override:n.override??null,condition:n.condition??null,requestData:n.requestData??null,responseData:n.responseData??null,requestHeaders:n.requestHeaders??null,responseHeaders:n.responseHeaders??null}},setPinned:e=>{const t=readId(e);if(!t)return null;const n=resolveEvent(t);if(!n)return null;const r=readBool(e,"pinned");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).pinned;if(o===r)return{ok:true};return _networkSavedStore.networkSavedStore.togglePin(n)},setSaved:e=>{const t=readId(e);if(!t)return null;const n=resolveEvent(t);if(!n)return null;const r=readBool(e,"saved");const o=(0,_networkSavedStore.flagsForEventId)(_networkSavedStore.networkSavedStore.getState(),t).saved;if(o===r)return{ok:true};return _networkSavedStore.networkSavedStore.toggleSave(n)},removeSavedRecord:e=>{const t=e&&typeof e==="object"?e.key:void 0;if(!t)return null;_networkSavedStore.networkSavedStore.remove(t);return{ok:true}},clearSavedRequests:()=>{_networkSavedStore.networkSavedStore.clearSaved();return{ok:true}},clearPinnedRequests:()=>{_networkSavedStore.networkSavedStore.clearPinned();return{ok:true}},setOverridesEnabled:e=>{_overrideRulesStore.overrideRulesStore.setEnabled(readBool(e,"enabled"));return{ok:true,enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,...inactiveStamp()}},upsertOverrideRule:e=>{const t=e?.rule??e;const n=!!t&&t.body==null&&(isBodyPatch(t.bodyPatch)||typeof t.bodyPath==="string");const r=baseFromRequest(e)??preservedBody(e)??(n?existingRule(e):null);if(t&&typeof t.bodyPath==="string"&&t.body==null){const d=r?.body??(typeof t.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(l=>l.id===t.id)?.body:void 0);if(typeof d!=="string"){return{ok:false,error:"bodyPath needs something to patch: send fromRequestId (the captured request whose real response it addresses) or the id of an existing rule."}}if(t.bodyValue===void 0){return{ok:false,error:`Refused: sent \`bodyPath\` without \`bodyValue\`. Say what to set "${t.bodyPath}" to.`}}let i;try{i=JSON.parse(d)}catch{return{ok:false,error:"The captured response body is not JSON, so it cannot be addressed by path. Send a whole `body` instead."}}const u=(0,_sharedUi.patchFromPath)(i,t.bodyPath,t.bodyValue);if(!u.ok)return{ok:false,error:`Refused: ${u.error}`};t.bodyPatch=u.patch;delete t.bodyPath;delete t.bodyValue}if(t&&isBodyPatch(t.bodyPatch)&&t.body==null){const d=r?.body??(typeof t.id==="string"?_overrideRulesStore.overrideRulesStore.getState().rules.find(u=>u.id===t.id)?.body:void 0);if(typeof d!=="string"){return{ok:false,error:"bodyPatch needs something to patch: send fromRequestId (the captured request whose real response the patch is merged into) or the id of an existing rule."}}let i;try{const u=(0,_sharedUi.expandKeyedArrays)(JSON.parse(d),t.bodyPatch);i=u.error;if(u.notes.length)t.bodyPatch=u.patch}catch{}if(i){return{ok:false,error:`Refused: ${i}`}}if(t.force!==true){const u=patchViolations(t,d);if(u.length>0){return{ok:false,error:(0,_sharedUi.refusalText)(u,"response body",(0,_sharedUi.suggestedPatch)(t.bodyPatch,u)),violations:u}}}}const o=readRuleDraft(e,r);if(!o){const d=e?.fromRequestId;return{ok:false,error:d?`No captured request \`${d}\` \u2014 it may have been cleared. Send a urlPattern instead.`:"A rule needs a non-empty urlPattern."}}const s=_overrideRulesStore.overrideRulesStore.upsertRule(o);if(!s)return{ok:false,error:"Override rule limit reached."};if(s.enabled)_overrideRulesStore.overrideRulesStore.setEnabled(true);return{ok:true,rule:{id:s.id,urlPattern:s.urlPattern,enabled:s.enabled,kind:s.kind,status:s.status,times:s.times,bodySize:s.body?s.body.length:0},...s.times===void 0||s.times===null?{lingers:`This rule has no \`times\` budget, so it overrides EVERY matching request until it is disabled or deleted (id \`${s.id}\`). If you meant only the next one, set times:1.`}:{},...inactiveStamp()}},setOverrideRuleEnabled:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.setRuleEnabled(t,readBool(e,"enabled"));return{ok:true,...inactiveStamp()}},deleteOverrideRule:e=>{const t=readId(e);if(!t)return{ok:false,error:"Missing rule id."};_overrideRulesStore.overrideRulesStore.removeRule(t);return{ok:true}},clearOverrideRules:()=>{_overrideRulesStore.overrideRulesStore.clearRules();return{ok:true}},replaceOverrideRules:async e=>{const t=e??{};if(!Array.isArray(t.rules)){return{ok:false,error:"replaceOverrideRules needs `rules`: an array of rules, first match first."}}if(t.rules.length>_types.MAX_RULES){return{ok:false,error:`Too many rules: ${t.rules.length}. The most is ${_types.MAX_RULES}.`}}await _overrideRulesStore.overrideRulesStore.ensureLoaded();const n=_overrideRulesStore.overrideRulesStore.replaceAllRules(t.rules,t.enabled!==false);if(!n)return{ok:false,error:"This copy of the Network tool only mirrors a device, so it can't replace rules."};const r=await _overrideRulesStore.overrideRulesStore.saveChecked();return{ok:true,count:n.length,enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,saved:r,...inactiveStamp()}},listOverrideRules:async()=>{await _overrideRulesStore.overrideRulesStore.ensureLoaded();return _overrideRulesStore.overrideRulesStore.getState()},getOverrideRuleBody:e=>{const t=readId(e);if(!t)return null;const n=_overrideRulesStore.overrideRulesStore.getState().rules.find(r=>r.id===t);if(!n)return null;return{body:n.body??null}},getCaptureStatus:()=>{const e=_networkEventStore.networkEventStore.getSubscriberCounts().total;let t=null;let n=null;try{t=(0,_networkListener.isNetworkListening)();n=(0,_networkListener.getNetworkListenerCount)()}catch{}let r=null;try{r=(0,_networkListener.isNetworkInterceptionLive)()}catch{}return{capturing:e>0,subscribers:e,interceptorInstalled:t,interceptorLive:r,listenerCount:n,eventCount:_networkEventStore.networkEventStore.getEvents().length}},debugOverrides:e=>{const{url:t,method:n}=e&&typeof e==="object"?e:{};const r=typeof t==="string"?t:"https://example.com/";const o=typeof n==="string"&&n.trim()?n.trim().toUpperCase():"GET";return{tested:{url:r,method:o},interceptorInstalled:(0,_networkListener.isNetworkListening)(),listenerCount:(0,_networkListener.getNetworkListenerCount)(),engine:(0,_engine.inspectEngine)(r,o),store:{enabled:_overrideRulesStore.overrideRulesStore.getState().enabled,autoPaused:_overrideRulesStore.overrideRulesStore.getState().autoPaused,ruleCount:_overrideRulesStore.overrideRulesStore.getState().rules.length,rulesVisibleToEngine:_overrideRulesStore.overrideRulesStore.getRules().length}}}}};
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
`}if(s.includeStatus){const o=e.status||"Pending";r+=`**Status:** ${o}${e.statusText?` (${e.statusText})`:""}
|
|
6
6
|
`}if(s.includeClient&&e.requestClient){r+=`**Client:** ${e.requestClient}
|
|
7
7
|
`}if(e.condition)r+=`Conditions: ${e.condition.profile} (+${e.condition.delayMs} ms)
|
|
8
|
+
`;if(e.condition?.uploadCap?.note)r+=`${e.condition.uploadCap.note}
|
|
8
9
|
`;if(s.includeDuration&&e.duration){r+=`**Duration:** ${e.duration}ms
|
|
9
10
|
`}if(s.includeTimestamp){r+=`**Timestamp:** ${new Date(e.timestamp).toISOString()}
|
|
10
11
|
`}if(s.includeSizes){const o=e.requestSize?formatBytes(e.requestSize):"N/A";const t=e.responseSize?formatBytes(e.responseSize):"N/A";r+=`**Request Size:** ${o}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkEventStore=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _extractOperationName=require("./extractOperationName");var _networkListener=require("./networkListener");var _networkSavedStore=require("./networkSavedStore");const BOOT_BUFFER_MAX=200;class NetworkEventStore extends _sharedUi.BaseEventStore{replaceEvents(t){super.replaceEvents(t.filter(e=>!(0,_sharedUi.isBuoyRequest)(e.url)))}pendingRequests=new Map;rawListenerUnsubscribe=null;bootBuffer=[];bootBufferUnsubscribe=null;mirrorMode=false;constructor(){super({storeName:"network",maxEvents:500})}startBootCapture(){if((0,_sharedUi.getAccountAccess)().status==="locked")return;if(this.mirrorMode||this.bootBufferUnsubscribe||this.isCapturing()){return}const t=(0,_networkListener.networkListener)();if(!t.isActive){t.startListening()}this.bootBufferUnsubscribe=(0,_networkListener.addNetworkListener)(e=>{this.bootBuffer.push(e);if(this.bootBuffer.length>BOOT_BUFFER_MAX)this.bootBuffer.shift()})}takeBootBuffer(){if(this.bootBufferUnsubscribe){this.bootBufferUnsubscribe();this.bootBufferUnsubscribe=null}const t=this.bootBuffer;this.bootBuffer=[];return t}startCapturing(){const t=(0,_networkListener.networkListener)();if(!t.isActive){t.startListening()}for(const e of this.takeBootBuffer()){this.processNetworkEvent(e)}if(!this.rawListenerUnsubscribe){this.rawListenerUnsubscribe=(0,_networkListener.addNetworkListener)(e=>{this.processNetworkEvent(e)})}t.adoptEarlyRequests()}stopCapturing(){this.takeBootBuffer();if(this.rawListenerUnsubscribe){this.rawListenerUnsubscribe();this.rawListenerUnsubscribe=null}if((0,_networkListener.getNetworkListenerCount)()===0){(0,_networkListener.stopNetworkListener)()}}disableCapture(){this.mirrorMode=true;this.takeBootBuffer();if((0,_networkListener.getNetworkListenerCount)()===0){(0,_networkListener.stopNetworkListener)()}super.disableCapture()}isCapturing(){return this.rawListenerUnsubscribe!==null}ensureInterception(){if(!this.isCapturing())return;(0,_networkListener.networkListener)().startListening()}subscribeToEvents(t){const e=super.subscribeToEvents(t);this.ensureInterception();return e}processNetworkEvent(t){if((0,_sharedUi.getAccountAccess)().status==="locked")return;const{request:e}=t;if((0,_sharedUi.isBuoyRequest)(e.url))return;if(t.type==="request"){if(this.events.some(u=>u.id===e.id))return;const r=e.params?`?${new URLSearchParams(e.params).toString()}`:"";const s=`${e.url}${r}`;let n;let o;if(e.client==="graphql"){const u=(0,_extractOperationName.extractOperationName)(e.data);n=u||void 0;if(e.data&&typeof e.data==="object"&&"variables"in e.data&&e.data.variables&&typeof e.data.variables==="object"){o=e.data.variables}}const a={id:e.id,method:e.method,url:s,host:this.extractHost(e.url),path:this.extractPath(e.url),query:r,timestamp:t.timestamp.getTime(),requestHeaders:e.headers||{},requestData:e.data,requestSize:this.getDataSize(e.data),responseHeaders:{},requestClient:e.client,operationName:n,graphqlVariables:o,override:t.override,condition:t.condition};this.pendingRequests.set(e.id,a);this.events=[a,...this.events].slice(0,this.maxEvents);this.notify(a);this.notifyArrayListeners()}else if(t.type==="request-body"){const r=this.events.find(n=>n.id===e.id);if(!r)return;const s={...r,requestData:e.data,requestSize:this.getDataSize(e.data)};if(e.client==="graphql"){s.operationName=(0,_extractOperationName.extractOperationName)(e.data)||void 0;const n=e.data?.variables;if(n&&typeof n==="object")s.graphqlVariables=n}this.events=this.events.map(n=>n.id===e.id?s:n);if(this.pendingRequests.has(e.id))this.pendingRequests.set(e.id,s);_networkSavedStore.networkSavedStore.syncFromLive(s);this.notify(s);this.notifyArrayListeners()}else if(t.type==="response"||t.type==="error"){const r=this.events.findIndex(s=>s.id===e.id);if(r!==-1){const s={...this.events[r],duration:t.duration,timings:t.timings};if(t.response){s.status=t.response.status;s.statusText=t.response.statusText;s.responseHeaders=t.response.headers||{};s.responseData=t.response.body;s.responseSize=t.response.size||0;s.responseType=t.response.headers?.["content-type"]}if(t.error){s.error=t.error.message;s.status=s.status||0}if(t.override)s.override=t.override;this.events=this.events.map((n,o)=>o===r?s:n);this.pendingRequests.delete(e.id);_networkSavedStore.networkSavedStore.syncFromLive(s);this.notify(s);this.notifyArrayListeners()}}}extractHost(t){try{const e=new URL(t);return e.hostname}catch{return""}}extractPath(t){try{const e=new URL(t);return e.pathname}catch{return t}}getDataSize(t){if(!t)return 0;if(typeof t==="string")return t.length;try{return JSON.stringify(t).length}catch{return 0}}getEventById(t){return this.events.find(e=>e.id===t)}clearEvents(){super.clearEvents();this.pendingRequests.clear()}onEvent(t,e=true){const r=this.subscribe(t);if(e&&this.events.length>0){const s=[...this.events].reverse();for(const n of s){try{t(n)}catch{}}}return r}getStats(){const t=this.events.length;const e=this.events.filter(i=>i.status&&i.status>=200&&i.status<300).length;const r=this.events.filter(i=>i.error||i.status&&i.status>=400).length;const s=this.events.filter(i=>!i.status&&!i.error).length;const n=this.events.filter(i=>i.duration).map(i=>i.duration);const o=n.length>0?n.reduce((i,c)=>i+c,0)/n.length:0;const a=this.events.reduce((i,c)=>i+(c.requestSize||0),0);const u=this.events.reduce((i,c)=>i+(c.responseSize||0),0);return{totalRequests:t,successfulRequests:e,failedRequests:r,pendingRequests:s,totalDataSent:a,totalDataReceived:u,averageDuration:Math.round(o)}}filterEvents(t){let e=[...this.events];if(t.method){e=e.filter(r=>r.method===t.method)}if(t.status){switch(t.status){case"success":e=e.filter(r=>r.status&&r.status>=200&&r.status<300);break;case"error":e=e.filter(r=>r.error||r.status&&r.status>=400);break;case"pending":e=e.filter(r=>!r.status&&!r.error);break}}if(t.searchText){const r=t.searchText.toLowerCase();e=e.filter(s=>s.url.toLowerCase().includes(r)||s.method.toLowerCase().includes(r)||s.error&&s.error.toLowerCase().includes(r))}if(t.host){e=e.filter(r=>r.host===t.host)}return e}}const networkEventStore=exports.networkEventStore=new NetworkEventStore;
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkEventStore=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _extractOperationName=require("./extractOperationName");var _networkListener=require("./networkListener");var _networkSavedStore=require("./networkSavedStore");const BOOT_BUFFER_MAX=200;class NetworkEventStore extends _sharedUi.BaseEventStore{replaceEvents(t){super.replaceEvents(t.filter(e=>!(0,_sharedUi.isBuoyRequest)(e.url)))}pendingRequests=new Map;rawListenerUnsubscribe=null;bootBuffer=[];bootBufferUnsubscribe=null;mirrorMode=false;constructor(){super({storeName:"network",maxEvents:500})}startBootCapture(){if((0,_sharedUi.getAccountAccess)().status==="locked")return;if(this.mirrorMode||this.bootBufferUnsubscribe||this.isCapturing()){return}const t=(0,_networkListener.networkListener)();if(!t.isActive){t.startListening()}this.bootBufferUnsubscribe=(0,_networkListener.addNetworkListener)(e=>{this.bootBuffer.push(e);if(this.bootBuffer.length>BOOT_BUFFER_MAX)this.bootBuffer.shift()})}takeBootBuffer(){if(this.bootBufferUnsubscribe){this.bootBufferUnsubscribe();this.bootBufferUnsubscribe=null}const t=this.bootBuffer;this.bootBuffer=[];return t}startCapturing(){const t=(0,_networkListener.networkListener)();if(!t.isActive){t.startListening()}for(const e of this.takeBootBuffer()){this.processNetworkEvent(e)}if(!this.rawListenerUnsubscribe){this.rawListenerUnsubscribe=(0,_networkListener.addNetworkListener)(e=>{this.processNetworkEvent(e)})}t.adoptEarlyRequests()}stopCapturing(){this.takeBootBuffer();if(this.rawListenerUnsubscribe){this.rawListenerUnsubscribe();this.rawListenerUnsubscribe=null}if((0,_networkListener.getNetworkListenerCount)()===0){(0,_networkListener.stopNetworkListener)()}}disableCapture(){this.mirrorMode=true;this.takeBootBuffer();if((0,_networkListener.getNetworkListenerCount)()===0){(0,_networkListener.stopNetworkListener)()}super.disableCapture()}isCapturing(){return this.rawListenerUnsubscribe!==null}ensureInterception(){if(!this.isCapturing())return;(0,_networkListener.networkListener)().startListening()}subscribeToEvents(t){const e=super.subscribeToEvents(t);this.ensureInterception();return e}processNetworkEvent(t){if((0,_sharedUi.getAccountAccess)().status==="locked")return;const{request:e}=t;if((0,_sharedUi.isBuoyRequest)(e.url))return;if(t.type==="request"){if(this.events.some(u=>u.id===e.id))return;const r=e.params?`?${new URLSearchParams(e.params).toString()}`:"";const s=`${e.url}${r}`;let n;let o;if(e.client==="graphql"){const u=(0,_extractOperationName.extractOperationName)(e.data);n=u||void 0;if(e.data&&typeof e.data==="object"&&"variables"in e.data&&e.data.variables&&typeof e.data.variables==="object"){o=e.data.variables}}const a={id:e.id,method:e.method,url:s,host:this.extractHost(e.url),path:this.extractPath(e.url),query:r,timestamp:t.timestamp.getTime(),requestHeaders:e.headers||{},requestData:e.data,requestSize:this.getDataSize(e.data),responseHeaders:{},requestClient:e.client,operationName:n,graphqlVariables:o,override:t.override,condition:t.condition};this.pendingRequests.set(e.id,a);this.events=[a,...this.events].slice(0,this.maxEvents);this.notify(a);this.notifyArrayListeners()}else if(t.type==="request-body"){const r=this.events.find(n=>n.id===e.id);if(!r)return;const s={...r,requestData:e.data,requestSize:this.getDataSize(e.data)};if(e.client==="graphql"){s.operationName=(0,_extractOperationName.extractOperationName)(e.data)||void 0;const n=e.data?.variables;if(n&&typeof n==="object")s.graphqlVariables=n}this.events=this.events.map(n=>n.id===e.id?s:n);if(this.pendingRequests.has(e.id))this.pendingRequests.set(e.id,s);_networkSavedStore.networkSavedStore.syncFromLive(s);this.notify(s);this.notifyArrayListeners()}else if(t.type==="response"||t.type==="error"){const r=this.events.findIndex(s=>s.id===e.id);if(r!==-1){const s={...this.events[r],duration:t.duration,timings:t.timings};if(t.response){s.status=t.response.status;s.statusText=t.response.statusText;s.responseHeaders=t.response.headers||{};s.responseData=t.response.body;s.responseJson=typeof t.response.json==="boolean"?t.response.json:void 0;s.responseTruncated=t.response.truncated===true||void 0;s.responseUnread=t.response.unread===true||void 0;s.responseSize=t.response.size||0;s.responseType=t.response.headers?.["content-type"]}if(t.error){s.error=t.error.message;s.status=s.status||0}if(t.override)s.override=t.override;this.events=this.events.map((n,o)=>o===r?s:n);this.pendingRequests.delete(e.id);_networkSavedStore.networkSavedStore.syncFromLive(s);this.notify(s);this.notifyArrayListeners()}}}extractHost(t){try{const e=new URL(t);return e.hostname}catch{return""}}extractPath(t){try{const e=new URL(t);return e.pathname}catch{return t}}getDataSize(t){if(!t)return 0;if(typeof t==="string")return t.length;try{return JSON.stringify(t).length}catch{return 0}}getEventById(t){return this.events.find(e=>e.id===t)}clearEvents(){super.clearEvents();this.pendingRequests.clear()}onEvent(t,e=true){const r=this.subscribe(t);if(e&&this.events.length>0){const s=[...this.events].reverse();for(const n of s){try{t(n)}catch{}}}return r}getStats(){const t=this.events.length;const e=this.events.filter(i=>i.status&&i.status>=200&&i.status<300).length;const r=this.events.filter(i=>i.error||i.status&&i.status>=400).length;const s=this.events.filter(i=>!i.status&&!i.error).length;const n=this.events.filter(i=>i.duration).map(i=>i.duration);const o=n.length>0?n.reduce((i,c)=>i+c,0)/n.length:0;const a=this.events.reduce((i,c)=>i+(c.requestSize||0),0);const u=this.events.reduce((i,c)=>i+(c.responseSize||0),0);return{totalRequests:t,successfulRequests:e,failedRequests:r,pendingRequests:s,totalDataSent:a,totalDataReceived:u,averageDuration:Math.round(o)}}filterEvents(t){let e=[...this.events];if(t.method){e=e.filter(r=>r.method===t.method)}if(t.status){switch(t.status){case"success":e=e.filter(r=>r.status&&r.status>=200&&r.status<300);break;case"error":e=e.filter(r=>r.error||r.status&&r.status>=400);break;case"pending":e=e.filter(r=>!r.status&&!r.error);break}}if(t.searchText){const r=t.searchText.toLowerCase();e=e.filter(s=>s.url.toLowerCase().includes(r)||s.method.toLowerCase().includes(r)||s.error&&s.error.toLowerCase().includes(r))}if(t.host){e=e.filter(r=>r.host===t.host)}return e}}const networkEventStore=exports.networkEventStore=new NetworkEventStore;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.stopNetworkListener=exports.startNetworkListener=exports.removeAllNetworkListeners=exports.networkListener=exports.isNetworkListening=exports.isNetworkInterceptionLive=exports.getNetworkListenerCount=exports.addNetworkListener=exports.BUOY_XHR_INTERCEPTOR_FLAG=exports.BUOY_FETCH_INTERCEPTOR_FLAG=void 0;var _sharedUi=require("@buoy-gg/shared-ui");var _resolveRequestUrl=require("./resolveRequestUrl");var _requestId=require("./requestId");var _xhr=require("../conditions/xhr");var _store=require("../conditions/store");var _wait=require("../conditions/wait");var _engine=require("../overrides/engine");var _applyToXhr=require("../overrides/applyToXhr");var _applyToFetch=require("../overrides/applyToFetch");var _types=require("../overrides/types");var _httpCompletion=require("./httpCompletion");var _realNow=require("./realNow");let devOrigin;function injectedHeaders(
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.stopNetworkListener=exports.startNetworkListener=exports.removeAllNetworkListeners=exports.networkListener=exports.isNetworkListening=exports.isNetworkInterceptionLive=exports.getNetworkListenerCount=exports.addNetworkListener=exports.BUOY_XHR_INTERCEPTOR_FLAG=exports.BUOY_FETCH_INTERCEPTOR_FLAG=void 0;var _pacer=require("../conditions/pacer");var _sharedUi=require("@buoy-gg/shared-ui");var _resolveRequestUrl=require("./resolveRequestUrl");var _requestId=require("./requestId");var _xhr=require("../conditions/xhr");var _store=require("../conditions/store");var _wait=require("../conditions/wait");var _engine=require("../overrides/engine");var _applyToXhr=require("../overrides/applyToXhr");var _applyToFetch=require("../overrides/applyToFetch");var _types=require("../overrides/types");var _httpCompletion=require("./httpCompletion");var _realNow=require("./realNow");let devOrigin;function injectedHeaders(R){const e=globalThis.__buoyHeaderInjectors;if(!e||e.length===0)return void 0;let t;for(const s of e){try{const l=s(R);if(l)t={...t,...l}}catch{}}return t}function devServerOrigin(){if(devOrigin!==void 0)return devOrigin;devOrigin=null;try{if(typeof __DEV__!=="undefined"&&!__DEV__)return devOrigin;const R=require("react-native");const e=R?.NativeModules?.SourceCode;const t=e?.getConstants?.().scriptURL??e?.scriptURL;if(typeof t==="string"&&/^https?:\/\//.test(t)){const s=new URL(t);devOrigin=`${s.protocol}//${s.host}`}}catch{devOrigin=null}return devOrigin}let insideFetchHandoff=false;const EARLY_NETWORK_KEY=Symbol.for("buoy.earlyNetwork");function headersToRecord(R){const e={};if(!R)return e;if(typeof Headers!=="undefined"&&R instanceof Headers)R.forEach((t,s)=>{e[s]=t});else if(Array.isArray(R))for(const[t,s]of R)e[t]=s;else Object.assign(e,R);return e}const BUOY_FETCH_INTERCEPTOR_FLAG=exports.BUOY_FETCH_INTERCEPTOR_FLAG="__buoyNetworkFetchIntercepted";const BUOY_XHR_INTERCEPTOR_FLAG=exports.BUOY_XHR_INTERCEPTOR_FLAG="__buoyNetworkXhrIntercepted";const STREAMED_CONTENT_TYPES=["text/event-stream","application/x-ndjson","application/stream+json"];const STREAMING_PLACEHOLDER="[streaming\u2026]";let angularPageSeen=false;function isAngularPage(){if(angularPageSeen)return true;const R=globalThis.document;angularPageSeen=!!R?.querySelector?.("[ng-version]");return angularPageSeen}function isStreamedContentType(R){if(!R)return false;const e=R.toLowerCase();return STREAMED_CONTENT_TYPES.some(t=>e.includes(t))}const INTERNAL_HOSTS_KEY="__BUOY_INTERNAL_HOSTS__";function isInternalBuoyHost(R){const e=globalThis[INTERNAL_HOSTS_KEY];if(!(e instanceof Set)||e.size===0)return false;let t;try{t=new URL(R).host.toLowerCase()}catch{return false}for(const s of e){if(typeof s==="string"&&s&&t===s.toLowerCase())return true}return false}class NetworkListener{listeners=[];isListening=false;patchedFetch=null;patchedXHROpen=null;patchedXHRSend=null;patchedXHRSetRequestHeader=null;fetchGeneration=0;xhrGeneration=0;constructor(){this.originalFetch=globalThis.fetch;this.originalXHROpen=XMLHttpRequest.prototype.open;this.originalXHRSend=XMLHttpRequest.prototype.send;this.originalXHRSetRequestHeader=XMLHttpRequest.prototype.setRequestHeader}shouldIgnoreUrl(e){if((0,_sharedUi.isBuoyRequest)(e))return true;try{const t=new URL(e);if(t.hostname==="keygen.sh"||t.hostname.endsWith(".keygen.sh"))return true;if((t.hostname==="buoy.gg"||t.hostname==="www.buoy.gg")&&(t.pathname.startsWith("/api/license")||t.pathname.startsWith("/api/settings/")))return true;const s=t.hostname==="localhost"||t.hostname==="127.0.0.1"||t.hostname==="10.0.2.2";if(s&&["8081","8802"].includes(t.port))return true;const l=devServerOrigin();if(l&&`${t.protocol}//${t.host}`===l)return true}catch{return false}return isInternalBuoyHost(e)}emit(e){this.listeners.forEach(t=>{try{t(e)}catch(s){}})}parseUrl(e){let t=null;const s=e.indexOf("?");if(s>-1){t={};e.substring(s+1).split("&").forEach(l=>{const[c,o]=l.split("=");if(c&&o!==void 0){t[c]=decodeURIComponent(o.replace(/\+/g," "))}})}return{url:s>-1?e.substring(0,s):e,params:t}}async readStreamedBody(e,t=256*1024){const s=e.body;if(!s||typeof s.getReader!=="function"){const f=await e.text();return f.length>t?{body:`${f.slice(0,t)}
|
|
2
2
|
|
|
3
|
-
... [truncated]`,size:f.length}:{body:f,size:f.length}}const
|
|
3
|
+
... [truncated]`,size:f.length,truncated:true}:{body:f,size:f.length}}const l=s.getReader();const c=new TextDecoder;let o="";let h=0;let b=false;try{for(;;){const{done:f,value:i}=await l.read();if(f)break;h+=i?.byteLength??0;if(!b){o+=c.decode(i,{stream:true});if(h>=t){o=`${o.slice(0,t)}
|
|
4
4
|
|
|
5
|
-
... [truncated]`;
|
|
5
|
+
... [truncated]`;b=true;break}}}if(!b)o+=c.decode()}finally{try{void Promise.resolve(l.cancel()).catch(()=>{})}catch{}try{l.releaseLock()}catch{}}return{body:o,size:h,truncated:b||void 0}}async processResponseBody(e,t=1024*1024){try{const s=e.headers.get("content-length");if(s){const o=parseInt(s,10);if(!isNaN(o)&&o>t){return{body:`[Response too large: ${this.formatBytes(o)}]`,size:o,truncated:true,json:false}}}const l=await e.text();const c=l.length;if(c>t){const o=l.substring(0,t);const h=c-t;return{body:`${o}
|
|
6
6
|
|
|
7
|
-
... [truncated, ${this.formatBytes(l)} omitted]`,size:a,truncated:true}}try{return{body:JSON.parse(c),size:a,truncated:false}}catch{return{body:c,size:a,truncated:false}}}catch(r){return{body:"~~~ unable to read body ~~~",size:0,truncated:false}}}formatBytes(e){if(e===0)return"0 B";const t=1024;const r=["B","KB","MB","GB"];const c=Math.floor(Math.log(e)/Math.log(t));return`${Math.round(e/Math.pow(t,c)*100)/100} ${r[c]}`}handleXHRResponse(e,t,r,c,a,n,l,m,f=false,i="xhr",d,L){const y=m?(0,_realNow.realNow)()-m:0;const h=e._buoyTtfb;const H=h===void 0?void 0:{ttfb:h,download:Math.max(0,y-h)};if(f||e.status===0){this.emit({type:"error",timestamp:new Date,duration:y,request:{id:t||"unknown",url:r,method:c,headers:a,data:n,params:l||void 0,client:i},error:{message:f?"Request failed":"Network error or request aborted"},override:d,condition:L});return}let s;let p=0;try{const o=e.response;if(e.responseType==="json"&&o){s=o;p=JSON.stringify(o).length}else if(e.responseType===""||e.responseType==="text"){if(e.responseText){p=e.responseText.length;try{s=JSON.parse(e.responseText)}catch{s=e.responseText}}}else if(e.responseType==="arraybuffer"){if(o){try{const q=new TextDecoder("utf-8").decode(o);p=q.length;try{s=JSON.parse(q)}catch{s=q}}catch(q){s=`[arraybuffer response - ${o.byteLength||0} bytes]`;p=o.byteLength||0}}else{s=`[arraybuffer response - no data]`;p=0}}else if(e.responseType==="blob"){if(o instanceof Blob){s=`[blob response - ${o.size} bytes, type: ${o.type||"unknown"}]`;p=o.size}else if(o){try{s=typeof o==="string"?JSON.parse(o):o;p=JSON.stringify(s).length}catch{s=`[blob response - unable to parse]`;p=0}}else{s=`[blob response - no data]`;p=0}}else if(o){if(typeof o==="string"){s=o;p=o.length;try{s=JSON.parse(o)}catch{}}else if(typeof o==="object"){s=o;p=JSON.stringify(o).length}else{s=String(o);p=String(o).length}}}catch(o){s="~~~ unable to read body ~~~"}const w={};try{const o=e.getAllResponseHeaders();if(o){o.split("\r\n").forEach(q=>{if(q){const R=q.indexOf(": ");if(R>0){const v=q.substring(0,R).toLowerCase();const u=q.substring(R+2);w[v]=u}}})}}catch{}if((0,_httpCompletion.xhrCompletionKind)(e.status)==="response"){this.emit({type:"response",timestamp:new Date,duration:y,timings:H,request:{id:t||"unknown",url:r,method:c,headers:a,data:n,params:l||void 0,client:i},response:{status:e.status,statusText:(0,_httpCompletion.httpStatusText)(e.status,e.statusText),headers:w,body:s,size:p},override:d,condition:L})}else{this.emit({type:"error",timestamp:new Date,duration:y,request:{id:t||"unknown",url:r,method:c,headers:a,data:n,params:l||void 0,client:i},response:{status:e.status,statusText:e.statusText,headers:w,body:s,size:p},error:{message:"Network Error"},override:d,condition:L})}}isFetchInterceptionLive(){return globalThis.fetch[BUOY_FETCH_INTERCEPTOR_FLAG]===true}isXhrInterceptionLive(){return XMLHttpRequest.prototype.send[BUOY_XHR_INTERCEPTOR_FLAG]===true}isInterceptionLive(){return this.isFetchInterceptionLive()&&this.isXhrInterceptionLive()}startListening(){const e=this.isListening&&this.isFetchInterceptionLive();const t=this.isListening&&this.isXhrInterceptionLive();if(e&&t){return}if(!e){this.installFetchInterceptor()}if(!t){this.installXhrInterceptor()}this.isListening=true;if(__DEV__){}}installFetchInterceptor(){const e=this;const t=globalThis.fetch.bind(globalThis);this.originalFetch=globalThis.fetch;const r=++this.fetchGeneration;const c=async(a,n)=>{const l=(0,_resolveRequestUrl.resolveRequestUrl)(typeof a==="string"?a:a instanceof URL?a.href:a.url);if(r!==e.fetchGeneration){return t(a,n)}if(n?.__buoyInternal||e.shouldIgnoreUrl(l)){const u=insideFetchHandoff;insideFetchHandoff=true;try{return t(a,n)}finally{insideFetchHandoff=u}}const m=(0,_realNow.realNow)();const f=(0,_requestId.nextRequestId)("fetch");const i=typeof a==="object"&&"method"in a?a:void 0;const d=n?.method??i?.method??"GET";const L=n?.signal!==void 0?n.signal:i?.signal;(0,_wait.throwIfAborted)(L);const y=(0,_store.snapshotNetworkCondition)(l);const{url:h,params:H}=e.parseUrl(l);let s={};const p=n?.headers??i?.headers;if(p){if(p instanceof Headers){p.forEach((u,b)=>{s[b]=u})}else if(Array.isArray(p)){p.forEach(([u,b])=>{s[u]=b})}else{s={...p}}}Object.assign(s,injectedHeaders(l));let w;if(n?.body){if(typeof n.body==="string"){try{w=JSON.parse(n.body)}catch{w=n.body}}else{w=n.body}}const o=s["X-Request-Client"]||s["x-request-client"]||"fetch";const q=y?.profile!=="offline"&&(0,_applyToFetch.canSynthesizeResponse)()?(0,_engine.accountCheckFor)(l,d,s,typeof n?.body==="string"?n.body:void 0):null;if(q)await q;const R=y?.profile!=="offline"&&(0,_applyToFetch.canSynthesizeResponse)()?(0,_engine.overrideForRequest)(l,d,s,typeof n?.body==="string"?n.body:void 0):null;const v=R?(0,_types.markForOutcome)(R):void 0;e.emit({type:"request",timestamp:new Date,request:{id:f||"unknown",url:h,method:d,headers:s,data:w,params:H||void 0,client:o},override:v,condition:y});if(n?.body===void 0&&i?.body&&!i.bodyUsed){try{const u=i.clone();void e.readStreamedBody(u).then(({body:b})=>{try{w=JSON.parse(b)}catch{w=b}e.emit({type:"request-body",timestamp:new Date,request:{id:f||"unknown",url:h,method:d,data:w,client:o}})}).catch(()=>{})}catch{}}try{if(y||R)await(0,_wait.waitBeforeDispatch)((y?.delayMs??0)+(R?.delayMs??0),L);(0,_wait.throwIfAborted)(L);if(y?.profile==="offline")throw new TypeError("Network request failed (Buoy Offline)");if(R?.kind==="fail")throw(0,_applyToFetch.synthesizeFetchError)(R);let u;if(R?.kind==="respond"){u=(0,_applyToFetch.synthesizeResponse)(l,R)}else{const T=insideFetchHandoff;insideFetchHandoff=true;let _;try{_=t(a,n)}finally{insideFetchHandoff=T}u=await _}const b=(0,_realNow.realNow)()-m;const N=typeof u.body?.getReader==="function"||isStreamedContentType(u.headers?.get?.("content-type"));const S=u.clone();const{body:x,size:k}=N?{body:STREAMING_PLACEHOLDER,size:0}:await e.processResponseBody(S);const X=(0,_realNow.realNow)()-m;const O=Math.max(0,X-b);const I=O>0?{ttfb:b,download:O}:void 0;const E={};u.headers.forEach((T,_)=>{E[_.toLowerCase()]=T});e.emit({type:"response",timestamp:new Date,duration:X,timings:I,request:{id:f||"unknown",url:h,method:d,headers:s,data:w,params:H||void 0,client:o},response:{status:u.status,statusText:u.statusText,headers:E,body:x,size:k},override:v,condition:y});if(N){const T=u.headers?.get?.("content-type");void e.readStreamedBody(S,isStreamedContentType(T)?void 0:1024*1024).then(_=>{let C=_.body;if(T?.includes("json")){try{C=JSON.parse(_.body)}catch{}}e.emit({type:"response",timestamp:new Date,duration:(0,_realNow.realNow)()-m,timings:I,request:{id:f||"unknown",url:h,method:d,headers:s,data:w,params:H||void 0,client:o},response:{status:u.status,statusText:u.statusText,headers:E,body:C,size:_.size},override:v,condition:y})}).catch(()=>{})}return u}catch(u){const b=(0,_realNow.realNow)()-m;e.emit({type:"error",timestamp:new Date,duration:b,request:{id:f||"unknown",url:h,method:d,headers:s,data:w,params:H||void 0,client:o},error:{message:u instanceof Error?u.message:"Network error",stack:u instanceof Error?u.stack:void 0},override:v,condition:y});throw u}};c[BUOY_FETCH_INTERCEPTOR_FLAG]=true;this.patchedFetch=c;globalThis.fetch=this.patchedFetch}installXhrInterceptor(){const e=this;const t=XMLHttpRequest.prototype.open;const r=XMLHttpRequest.prototype.send;const c=XMLHttpRequest.prototype.setRequestHeader;this.originalXHROpen=t;this.originalXHRSend=r;this.originalXHRSetRequestHeader=c;const a=++this.xhrGeneration;const n=new WeakMap;const l=function(i,d,L,y,h){const H=t.call(this,i,d,L??true,y,h);if(a===e.xhrGeneration){n.get(this)?.();const s=this;s._buoyRequestId=(0,_requestId.nextRequestId)("xhr");s._method=i;s._url=(0,_resolveRequestUrl.resolveRequestUrl)(d);s._buoyStartTime=(0,_realNow.realNow)();s._requestHeaders={}}return H};const m=function(i,d){const L=this;if(a===e.xhrGeneration&&L._requestHeaders){L._requestHeaders[i]=d}return c.call(this,i,d)};const f=function(i){if(a!==e.xhrGeneration||insideFetchHandoff){return r.call(this,i)}if((0,_applyToXhr.hasPendingStandardRequest)(this))throw new DOMException("The request has already been sent.","InvalidStateError");if(this.readyState!==1||this._sent){return r.call(this,i)}const d=this;const L=d._buoyRequestId;const y=d._method||"GET";const h=d._url||"";const H=(0,_realNow.realNow)();d._buoyStartTime=H;d._buoyTtfb=void 0;const s=d._requestHeaders||{};Object.assign(s,injectedHeaders(h));if(e.shouldIgnoreUrl(h)){return r.call(this,i)}const{url:p,params:w}=e.parseUrl(h);let o;if(i){if(typeof i==="string"){try{o=JSON.parse(i)}catch{o=i}}else{o=i}}const q=s["X-Request-Client"]||s["x-request-client"];const R=s["Accept"]||s["accept"]||"";const v=R.includes("application/json")&&R.includes("text/plain")&&R.includes("*/*")&&!isAngularPage();const u=q||(v?"axios":"xhr");const b=(0,_store.snapshotNetworkCondition)(h);const N=b?.profile==="offline"?null:(0,_engine.overrideForRequest)(h,y,s,typeof i==="string"?i:void 0);const S=N?(0,_types.markForOutcome)(N):void 0;e.emit({type:"request",timestamp:new Date,request:{id:L||"unknown",url:p,method:y,headers:s,data:o,params:w||void 0,client:u},override:S,condition:b});let x=false;const k=(_=false)=>{if(x)return;x=true;e.handleXHRResponse(this,L||"unknown",p,y,s,o,w,H||0,_,u,S,b);X()};const X=()=>{n.delete(this);this.removeEventListener("load",O);this.removeEventListener("error",I);this.removeEventListener("abort",E);this.removeEventListener("readystatechange",T)};n.set(this,X);const O=()=>{k(false)};const I=()=>{k(true)};const E=()=>{k(true)};const T=()=>{if(this.readyState===2){const _=this;if(_._buoyTtfb===void 0&&_._buoyStartTime){_._buoyTtfb=(0,_realNow.realNow)()-_._buoyStartTime}}if(this.readyState===4&&!x){k(false)}};this.addEventListener("load",O);this.addEventListener("error",I);this.addEventListener("abort",E);this.addEventListener("readystatechange",T);if(b){(0,_xhr.runConditionXhr)(this,h,b,N,()=>r.call(this,i));return}if(N){const _=(0,_applyToXhr.runOverride)(this,h,N,()=>r.call(this,i));if(_)return}return r.call(this,i)};f[BUOY_XHR_INTERCEPTOR_FLAG]=true;this.patchedXHROpen=l;this.patchedXHRSend=f;this.patchedXHRSetRequestHeader=m;XMLHttpRequest.prototype.open=this.patchedXHROpen;XMLHttpRequest.prototype.send=this.patchedXHRSend;XMLHttpRequest.prototype.setRequestHeader=this.patchedXHRSetRequestHeader}stopListening(){if(!this.isListening){return}this.fetchGeneration++;this.xhrGeneration++;if(this.patchedFetch&&globalThis.fetch===this.patchedFetch){globalThis.fetch=this.originalFetch}if(this.patchedXHROpen&&XMLHttpRequest.prototype.open===this.patchedXHROpen){XMLHttpRequest.prototype.open=this.originalXHROpen}if(this.patchedXHRSend&&XMLHttpRequest.prototype.send===this.patchedXHRSend){XMLHttpRequest.prototype.send=this.originalXHRSend}if(this.patchedXHRSetRequestHeader&&XMLHttpRequest.prototype.setRequestHeader===this.patchedXHRSetRequestHeader){XMLHttpRequest.prototype.setRequestHeader=this.originalXHRSetRequestHeader}this.patchedFetch=null;this.patchedXHROpen=null;this.patchedXHRSend=null;this.patchedXHRSetRequestHeader=null;this.isListening=false;if(__DEV__){}}adoptEarlyRequests(){const e=globalThis.__BUOY_EARLY_NETWORK__;if(e?.version!==1)return;for(const t of e.adopt()){try{if(t.kind==="fetch")this.adoptEarlyFetch(t);else this.adoptEarlyXhr(t)}catch{}}}adoptEarlyFetch(e){const{input:t,init:r}=e;const c=typeof t==="object"&&"method"in t?t:void 0;const a=(0,_resolveRequestUrl.resolveRequestUrl)(typeof t==="string"?t:t instanceof URL?t.href:t.url);if(this.shouldIgnoreUrl(a))return;const n=(0,_requestId.nextRequestId)("fetch");const l=r?.method??c?.method??"GET";const{url:m,params:f}=this.parseUrl(a);const i=headersToRecord(r?.headers??c?.headers);let d=r?.body;if(typeof d==="string"){try{d=JSON.parse(d)}catch{}}const L=i["X-Request-Client"]||i["x-request-client"]||"fetch";const y=()=>({id:n,url:m,method:l,headers:i,data:d,params:f||void 0,client:L});this.emit({type:"request",timestamp:new Date(e.start),request:y()});if(e.requestCopy){void this.readStreamedBody(e.requestCopy).then(({body:h})=>{try{d=JSON.parse(h)}catch{d=h}this.emit({type:"request-body",timestamp:new Date,request:{id:n,url:m,method:l,data:d,client:L}})}).catch(()=>{})}void e.settled.then(async({response:h,clone:H,error:s,headersAt:p})=>{if(!h){this.emit({type:"error",timestamp:new Date,duration:p-e.start,request:y(),error:{message:s instanceof Error?s.message:"Network error",stack:s instanceof Error?s.stack:void 0}});return}const{body:w,size:o}=H?await this.processResponseBody(H):{body:STREAMING_PLACEHOLDER,size:0};const q=Math.max(0,(0,_realNow.realNow)()-e.start);const R=p-e.start;const v={};h.headers.forEach((u,b)=>{v[b.toLowerCase()]=u});this.emit({type:"response",timestamp:new Date,duration:q,timings:q>R?{ttfb:R,download:q-R}:void 0,request:y(),response:{status:h.status,statusText:h.statusText,headers:v,body:w,size:o}})})}adoptEarlyXhr(e){const t=(0,_resolveRequestUrl.resolveRequestUrl)(e.url);if(this.shouldIgnoreUrl(t))return;const r=(0,_requestId.nextRequestId)("xhr");const c=e.method.toUpperCase();const{url:a,params:n}=this.parseUrl(t);let l=e.body;if(typeof l==="string"){try{l=JSON.parse(l)}catch{}}const m=e.headers["X-Request-Client"]||e.headers["x-request-client"]||"xhr";this.emit({type:"request",timestamp:new Date(e.start),request:{id:r,url:a,method:c,headers:e.headers,data:l,params:n||void 0,client:m}});const f=e.xhr;const i=()=>{const d=(f._buoyEarlyEnd??(0,_realNow.realNow)())-e.start;this.handleXHRResponse(f,r,a,c,e.headers,l,n,(0,_realNow.realNow)()-d,false,m)};if(f.readyState===4)i();else f.addEventListener("loadend",i,{once:true})}addListener(e){this.listeners.push(e);return()=>{const t=this.listeners.indexOf(e);if(t>-1){this.listeners.splice(t,1)}}}removeAllListeners(){this.listeners=[]}get isActive(){return this.isListening}get listenerCount(){return this.listeners.length}}let _networkListener=null;const getNetworkListener=()=>{if(!_networkListener){_networkListener=new NetworkListener}return _networkListener};const networkListener=exports.networkListener=getNetworkListener;const startNetworkListener=()=>getNetworkListener().startListening();exports.startNetworkListener=startNetworkListener;const stopNetworkListener=()=>_networkListener?.stopListening();exports.stopNetworkListener=stopNetworkListener;const addNetworkListener=g=>getNetworkListener().addListener(g);exports.addNetworkListener=addNetworkListener;const removeAllNetworkListeners=()=>_networkListener?.removeAllListeners();exports.removeAllNetworkListeners=removeAllNetworkListeners;const isNetworkListening=()=>_networkListener?.isActive??false;exports.isNetworkListening=isNetworkListening;const getNetworkListenerCount=()=>_networkListener?.listenerCount??0;exports.getNetworkListenerCount=getNetworkListenerCount;const isNetworkInterceptionLive=()=>_networkListener?.isInterceptionLive()??false;exports.isNetworkInterceptionLive=isNetworkInterceptionLive;
|
|
7
|
+
... [truncated, ${this.formatBytes(h)} omitted]`,size:c,truncated:true,json:false}}try{return{body:JSON.parse(l),size:c,truncated:false,json:true}}catch{return{body:l,size:c,truncated:false,json:false}}}catch(s){return{body:"~~~ unable to read body ~~~",json:false,unread:true,size:0,truncated:false}}}formatBytes(e){if(e===0)return"0 B";const t=1024;const s=["B","KB","MB","GB"];const l=Math.floor(Math.log(e)/Math.log(t));return`${Math.round(e/Math.pow(t,l)*100)/100} ${s[l]}`}handleXHRResponse(e,t,s,l,c,o,h,b,f=false,i="xhr",r,g){const L=b?(0,_realNow.realNow)()-b:0;const u=e._buoyTtfb;const q=u===void 0?void 0:{ttfb:u,download:Math.max(0,L-u)};if(f||e.status===0){this.emit({type:"error",timestamp:new Date,duration:L,request:{id:t||"unknown",url:s,method:l,headers:c,data:o,params:h||void 0,client:i},error:{message:f?"Request failed":"Network error or request aborted"},override:r,condition:g});return}let n;let y=false;let w=false;let p=0;try{const a=e.response;if(e.responseType==="json"){const _=e.status===204||e.status===205||e.status===304||l.toUpperCase()==="HEAD"||e.getResponseHeader?.("content-length")==="0";if(a===null){n=void 0;w=!_;p=0}else{n=a;y=true;p=JSON.stringify(a).length}}else if(e.responseType===""||e.responseType==="text"){if(e.responseText){p=e.responseText.length;try{n=JSON.parse(e.responseText);y=true}catch{n=e.responseText}}}else if(e.responseType==="arraybuffer"){if(a){try{const _=new TextDecoder("utf-8").decode(a);p=_.length;try{n=JSON.parse(_);y=true}catch{n=_}}catch(_){n=`[arraybuffer response - ${a.byteLength||0} bytes]`;w=true;p=a.byteLength||0}}else{n=`[arraybuffer response - no data]`;w=true;p=0}}else if(e.responseType==="blob"){if(a instanceof Blob){n=`[blob response - ${a.size} bytes, type: ${a.type||"unknown"}]`;w=true;p=a.size}else if(a){try{n=typeof a==="string"?JSON.parse(a):a;p=JSON.stringify(n).length}catch{n=`[blob response - unable to parse]`;w=true;p=0}}else{n=`[blob response - no data]`;w=true;p=0}}else if(a){if(typeof a==="string"){n=a;p=a.length;try{n=JSON.parse(a);y=true}catch{}}else if(typeof a==="object"){n=a;p=JSON.stringify(a).length}else{n=String(a);p=String(a).length}}}catch(a){n="~~~ unable to read body ~~~";w=true}if(g?.downloadBytesPerSecond&&(!e.responseType||e.responseType==="text"||e.responseType==="json")){const a=e._response;if(typeof a==="string")p=(0,_pacer.utf8Length)(a)}const T={};try{const a=e.getAllResponseHeaders();if(a){a.split("\r\n").forEach(_=>{if(_){const m=_.indexOf(": ");if(m>0){const v=_.substring(0,m).toLowerCase();const N=_.substring(m+2);T[v]=N}}})}}catch{}if((0,_httpCompletion.xhrCompletionKind)(e.status)==="response"){this.emit({type:"response",timestamp:new Date,duration:L,timings:q,request:{id:t||"unknown",url:s,method:l,headers:c,data:o,params:h||void 0,client:i},response:{status:e.status,statusText:(0,_httpCompletion.httpStatusText)(e.status,e.statusText),headers:T,body:n,size:p,json:y,unread:w||void 0},override:r,condition:g})}else{this.emit({type:"error",timestamp:new Date,duration:L,request:{id:t||"unknown",url:s,method:l,headers:c,data:o,params:h||void 0,client:i},response:{status:e.status,statusText:e.statusText,headers:T,body:n,size:p},error:{message:"Network Error"},override:r,condition:g})}}isFetchInterceptionLive(){return globalThis.fetch[BUOY_FETCH_INTERCEPTOR_FLAG]===true}isXhrInterceptionLive(){return XMLHttpRequest.prototype.send[BUOY_XHR_INTERCEPTOR_FLAG]===true}isInterceptionLive(){return this.isFetchInterceptionLive()&&this.isXhrInterceptionLive()}startListening(){const e=this.isListening&&this.isFetchInterceptionLive();const t=this.isListening&&this.isXhrInterceptionLive();if(e&&t){return}if(!e){this.installFetchInterceptor()}if(!t){this.installXhrInterceptor()}this.isListening=true;if(__DEV__){}}installFetchInterceptor(){const e=this;const t=globalThis.fetch.bind(globalThis);this.originalFetch=globalThis.fetch;const s=++this.fetchGeneration;const l=async(c,o)=>{const h=(0,_resolveRequestUrl.resolveRequestUrl)(typeof c==="string"?c:c instanceof URL?c.href:c.url);if(s!==e.fetchGeneration){return t(c,o)}if(o?.__buoyInternal||e.shouldIgnoreUrl(h)){const d=insideFetchHandoff;insideFetchHandoff=true;try{return t(c,o)}finally{insideFetchHandoff=d}}const b=(0,_realNow.realNow)();const f=(0,_requestId.nextRequestId)("fetch");const i=typeof c==="object"&&"method"in c?c:void 0;const r=o?.method??i?.method??"GET";const g=o?.signal!==void 0?o.signal:i?.signal;(0,_wait.throwIfAborted)(g);const L=(0,_store.snapshotNetworkCondition)(h);const u=L?.uploadBytesPerSecond?{...L,uploadCap:(0,_pacer.uploadBodySize)(c,o)}:L;const{url:q,params:n}=e.parseUrl(h);let y={};const w=o?.headers??i?.headers;if(w){if(w instanceof Headers){w.forEach((d,H)=>{y[H]=d})}else if(Array.isArray(w)){w.forEach(([d,H])=>{y[d]=H})}else{y={...w}}}Object.assign(y,injectedHeaders(h));let p;if(o?.body){if(typeof o.body==="string"){try{p=JSON.parse(o.body)}catch{p=o.body}}else{p=o.body}}const T=y["X-Request-Client"]||y["x-request-client"]||"fetch";if(u?.profile!=="offline"&&(0,_applyToFetch.canSynthesizeResponse)())await(0,_engine.overrideRulesReady)();let a=typeof o?.body==="string"?o.body:void 0;if(a===void 0&&o?.body===void 0&&i&&!i.bodyUsed&&r!=="GET"&&r!=="HEAD"&&(0,_engine.overrideRulesNeedBody)()){try{a=(await e.readStreamedBody(i.clone())).body}catch{}}const _=u?.profile!=="offline"&&(0,_applyToFetch.canSynthesizeResponse)()?(0,_engine.accountCheckFor)(h,r,y,a):null;if(_)await _;const m=u?.profile!=="offline"&&(0,_applyToFetch.canSynthesizeResponse)()?(0,_engine.overrideForRequest)(h,r,y,a):null;const v=m?(0,_types.markForOutcome)(m):void 0;e.emit({type:"request",timestamp:new Date,request:{id:f||"unknown",url:q,method:r,headers:y,data:p,params:n||void 0,client:T},override:v,condition:u});const N=d=>{try{p=JSON.parse(d)}catch{p=d}e.emit({type:"request-body",timestamp:new Date,request:{id:f||"unknown",url:q,method:r,data:p,client:T}})};if(o?.body===void 0&&i&&typeof a==="string"){N(a)}else if(!u?.uploadBytesPerSecond&&o?.body===void 0&&i&&!i.bodyUsed&&r!=="GET"&&r!=="HEAD"){try{const d=i.clone();void e.readStreamedBody(d).then(({body:H})=>{if(H)N(H)}).catch(()=>{})}catch{}}try{if(u||m)await(0,_wait.waitBeforeDispatch)((u?.delayMs??0)+(m?.delayMs??0),g);(0,_wait.throwIfAborted)(g);if(u?.profile==="offline")throw new TypeError("Network request failed (Buoy Offline)");if(m?.kind==="fail")throw(0,_applyToFetch.synthesizeFetchError)(m);if(u?.uploadBytesPerSecond){await(0,_pacer.paceByteCount)(u.uploadCap?.knownBytes??0,u.uploadBytesPerSecond,g);(0,_wait.throwIfAborted)(g)}let d;if(m?.kind==="respond"){d=(0,_applyToFetch.synthesizeResponse)(h,m)}else{const k=insideFetchHandoff;insideFetchHandoff=true;let S;try{S=t(c,o)}finally{insideFetchHandoff=k}d=await S}if(u?.downloadBytesPerSecond){const k={};d.headers.forEach((O,X)=>{k[X.toLowerCase()]=O});let S=0;let I=0;const M=[];const Y=(O,X)=>{const U=new Uint8Array(I);let W=0;for(const Q of M){U.set(Q,W);W+=Q.byteLength}let J=O?new TextDecoder().decode(U):STREAMING_PLACEHOLDER;let K=false;if(O&&k["content-type"]?.includes("json")){try{J=JSON.parse(J);K=true}catch{}}const V=S>I;const $=!O||X!==void 0;e.emit({type:X!==void 0?"error":"response",timestamp:new Date,duration:(0,_realNow.realNow)()-b,request:{id:f,url:q,method:r,headers:y,data:p,params:n||void 0,client:T},response:{status:d.status,statusText:d.statusText,headers:k,body:J,size:S,json:K&&!V&&!$,truncated:V&&!$,...$?{unread:true}:{}},...X!==void 0?{error:{message:X instanceof Error?X.message:String(X)}}:{},override:v,condition:u})};Y(false);return(0,_pacer.paceResponse)(d,u.downloadBytesPerSecond,g,(O,X)=>{if(O){S+=O.byteLength;const U=Math.min(O.byteLength,65536-I);if(U>0){M.push(O.slice(0,U));I+=U}}else Y(true,X)},r.toUpperCase()==="HEAD")}const H=(0,_realNow.realNow)()-b;const B=typeof d.body?.getReader==="function"||isStreamedContentType(d.headers?.get?.("content-type"));const C=d.clone();const{body:j,size:D,json:P,truncated:z,unread:G}=B?{body:STREAMING_PLACEHOLDER,size:0,json:false,truncated:false,unread:true}:await e.processResponseBody(C);const E=(0,_realNow.realNow)()-b;const F=Math.max(0,E-H);const A=F>0?{ttfb:H,download:F}:void 0;const x={};d.headers.forEach((k,S)=>{x[S.toLowerCase()]=k});e.emit({type:"response",timestamp:new Date,duration:E,timings:A,request:{id:f||"unknown",url:q,method:r,headers:y,data:p,params:n||void 0,client:T},response:{status:d.status,statusText:d.statusText,headers:x,body:j,size:D,json:P,truncated:z||void 0,unread:G||void 0},override:v,condition:u});if(B){const k=d.headers?.get?.("content-type");void e.readStreamedBody(C,isStreamedContentType(k)?void 0:1024*1024).then(S=>{let I=S.body;let M=false;if(k?.toLowerCase().includes("json")){try{I=JSON.parse(S.body);M=true}catch{}}e.emit({type:"response",timestamp:new Date,duration:(0,_realNow.realNow)()-b,timings:A,request:{id:f||"unknown",url:q,method:r,headers:y,data:p,params:n||void 0,client:T},response:{status:d.status,statusText:d.statusText,headers:x,body:I,size:S.size,json:M,truncated:S.truncated},override:v,condition:u})}).catch(()=>{})}return d}catch(d){const H=(0,_realNow.realNow)()-b;e.emit({type:"error",timestamp:new Date,duration:H,request:{id:f||"unknown",url:q,method:r,headers:y,data:p,params:n||void 0,client:T},error:{message:d instanceof Error?d.message:"Network error",stack:d instanceof Error?d.stack:void 0},override:v,condition:u});throw d}};l[BUOY_FETCH_INTERCEPTOR_FLAG]=true;this.patchedFetch=l;globalThis.fetch=this.patchedFetch}installXhrInterceptor(){const e=this;const t=XMLHttpRequest.prototype.open;const s=XMLHttpRequest.prototype.send;const l=XMLHttpRequest.prototype.setRequestHeader;this.originalXHROpen=t;this.originalXHRSend=s;this.originalXHRSetRequestHeader=l;const c=++this.xhrGeneration;const o=new WeakMap;const h=function(i,r,g,L,u){const q=t.call(this,i,r,g??true,L,u);if(c===e.xhrGeneration){o.get(this)?.();const n=this;n._buoyRequestId=(0,_requestId.nextRequestId)("xhr");n._method=i;n._url=(0,_resolveRequestUrl.resolveRequestUrl)(r);n._buoyStartTime=(0,_realNow.realNow)();n._requestHeaders={};n._buoyAsync=g!==false;n._buoyRestoreAbort?.();n._buoyWaitedForRules=false;n._buoyHeldSend=false;n._buoyOpenSeq=(n._buoyOpenSeq??0)+1}return q};const b=function(i,r){const g=this;if(c===e.xhrGeneration&&g._requestHeaders){g._requestHeaders[i]=r}return l.call(this,i,r)};const f=function(i){if(c!==e.xhrGeneration||insideFetchHandoff){return s.call(this,i)}if((0,_applyToXhr.hasPendingStandardRequest)(this))throw new DOMException("The request has already been sent.","InvalidStateError");if(this.readyState!==1||this._sent){return s.call(this,i)}const r=this;if(r._buoyHeldSend)throw new DOMException("The request has already been sent.","InvalidStateError");if(!(0,_engine.overrideRulesLoaded)()&&r._buoyAsync!==false&&!r._buoyWaitedForRules){r._buoyWaitedForRules=true;r._buoyHeldSend=true;const E=r._buoyOpenSeq;let F=false;const A=Object.prototype.hasOwnProperty.call(this,"abort")?this.abort:void 0;const x=()=>{if(r._buoyRestoreAbort!==x)return;r._buoyRestoreAbort=void 0;if(A)this.abort=A;else delete this.abort};r._buoyRestoreAbort=x;const k=A??Object.getPrototypeOf(this).abort;this.abort=function(){F=true;r._buoyHeldSend=false;x();return k.call(this)};const S=()=>{x();if(F||r._buoyOpenSeq!==E)return;r._buoyHeldSend=false;if(this.readyState===1&&!this._sent)f.call(this,i)};void(0,_engine.overrideRulesReady)().then(S,S);return}const g=r._buoyRequestId;const L=r._method||"GET";const u=r._url||"";const q=(0,_realNow.realNow)();r._buoyStartTime=q;r._buoyTtfb=void 0;const n=r._requestHeaders||{};Object.assign(n,injectedHeaders(u));if(e.shouldIgnoreUrl(u)){return s.call(this,i)}const{url:y,params:w}=e.parseUrl(u);let p;if(i){if(typeof i==="string"){try{p=JSON.parse(i)}catch{p=i}}else{p=i}}const T=n["X-Request-Client"]||n["x-request-client"];const a=n["Accept"]||n["accept"]||"";const _=a.includes("application/json")&&a.includes("text/plain")&&a.includes("*/*")&&!isAngularPage();const m=T||(_?"axios":"xhr");const v=(0,_store.snapshotNetworkCondition)(u);const N=v?.uploadBytesPerSecond?{...v,uploadCap:(0,_pacer.uploadSize)(i)}:v;const d=N?.profile==="offline"?null:(0,_engine.overrideForRequest)(u,L,n,typeof i==="string"?i:void 0);const H=d?(0,_types.markForOutcome)(d):void 0;e.emit({type:"request",timestamp:new Date,request:{id:g||"unknown",url:y,method:L,headers:n,data:p,params:w||void 0,client:m},override:H,condition:N});let B=false;const C=(E=false)=>{if(B)return;B=true;e.handleXHRResponse(this,g||"unknown",y,L,n,p,w,q||0,E,m,H,N);j()};const j=()=>{o.delete(this);this.removeEventListener("load",D);this.removeEventListener("error",P);this.removeEventListener("abort",z);this.removeEventListener("readystatechange",G)};o.set(this,j);const D=()=>{C(false)};const P=()=>{C(true)};const z=()=>{C(true)};const G=()=>{if(this.readyState===2){const E=this;if(E._buoyTtfb===void 0&&E._buoyStartTime){E._buoyTtfb=(0,_realNow.realNow)()-E._buoyStartTime}}if(this.readyState===4&&!B){C(false)}};this.addEventListener("load",D);this.addEventListener("error",P);this.addEventListener("abort",z);this.addEventListener("readystatechange",G);if(N){(0,_xhr.runConditionXhr)(this,u,N,d,()=>s.call(this,i),i);return}if(d){const E=(0,_applyToXhr.runOverride)(this,u,d,()=>s.call(this,i));if(E)return}return s.call(this,i)};f[BUOY_XHR_INTERCEPTOR_FLAG]=true;this.patchedXHROpen=h;this.patchedXHRSend=f;this.patchedXHRSetRequestHeader=b;XMLHttpRequest.prototype.open=this.patchedXHROpen;XMLHttpRequest.prototype.send=this.patchedXHRSend;XMLHttpRequest.prototype.setRequestHeader=this.patchedXHRSetRequestHeader}stopListening(){if(!this.isListening){return}this.fetchGeneration++;this.xhrGeneration++;if(this.patchedFetch&&globalThis.fetch===this.patchedFetch){globalThis.fetch=this.originalFetch}if(this.patchedXHROpen&&XMLHttpRequest.prototype.open===this.patchedXHROpen){XMLHttpRequest.prototype.open=this.originalXHROpen}if(this.patchedXHRSend&&XMLHttpRequest.prototype.send===this.patchedXHRSend){XMLHttpRequest.prototype.send=this.originalXHRSend}if(this.patchedXHRSetRequestHeader&&XMLHttpRequest.prototype.setRequestHeader===this.patchedXHRSetRequestHeader){XMLHttpRequest.prototype.setRequestHeader=this.originalXHRSetRequestHeader}this.patchedFetch=null;this.patchedXHROpen=null;this.patchedXHRSend=null;this.patchedXHRSetRequestHeader=null;this.isListening=false;if(__DEV__){}}adoptEarlyRequests(){const e=globalThis;const t=e[EARLY_NETWORK_KEY]??e.__BUOY_EARLY_NETWORK__;if(t?.version!==1)return;for(const s of t.adopt()){try{if(s.kind==="fetch")this.adoptEarlyFetch(s);else this.adoptEarlyXhr(s)}catch{}}}adoptEarlyFetch(e){const{input:t,init:s}=e;const l=typeof t==="object"&&"method"in t?t:void 0;const c=(0,_resolveRequestUrl.resolveRequestUrl)(typeof t==="string"?t:t instanceof URL?t.href:t.url);if(this.shouldIgnoreUrl(c))return;const o=(0,_requestId.nextRequestId)("fetch");const h=s?.method??l?.method??"GET";const{url:b,params:f}=this.parseUrl(c);const i=headersToRecord(s?.headers??l?.headers);let r=s?.body;if(typeof r==="string"){try{r=JSON.parse(r)}catch{}}const g=i["X-Request-Client"]||i["x-request-client"]||"fetch";const L=()=>({id:o,url:b,method:h,headers:i,data:r,params:f||void 0,client:g});this.emit({type:"request",timestamp:new Date(e.start),request:L()});if(e.requestCopy){void this.readStreamedBody(e.requestCopy).then(({body:u})=>{try{r=JSON.parse(u)}catch{r=u}this.emit({type:"request-body",timestamp:new Date,request:{id:o,url:b,method:h,data:r,client:g}})}).catch(()=>{})}void e.settled.then(async({response:u,clone:q,error:n,headersAt:y})=>{if(!u){this.emit({type:"error",timestamp:new Date,duration:y-e.start,request:L(),error:{message:n instanceof Error?n.message:"Network error",stack:n instanceof Error?n.stack:void 0}});return}const{body:w,size:p,json:T,truncated:a,unread:_}=q?await this.processResponseBody(q):{body:STREAMING_PLACEHOLDER,size:0,json:false,truncated:false,unread:true};const m=Math.max(0,(0,_realNow.realNow)()-e.start);const v=y-e.start;const N={};u.headers.forEach((d,H)=>{N[H.toLowerCase()]=d});this.emit({type:"response",timestamp:new Date,duration:m,timings:m>v?{ttfb:v,download:m-v}:void 0,request:L(),response:{status:u.status,statusText:u.statusText,headers:N,body:w,size:p,json:T,truncated:a||void 0,unread:_||void 0}})})}adoptEarlyXhr(e){const t=(0,_resolveRequestUrl.resolveRequestUrl)(e.url);if(this.shouldIgnoreUrl(t))return;const s=(0,_requestId.nextRequestId)("xhr");const l=e.method.toUpperCase();const{url:c,params:o}=this.parseUrl(t);let h=e.body;if(typeof h==="string"){try{h=JSON.parse(h)}catch{}}const b=e.headers["X-Request-Client"]||e.headers["x-request-client"]||"xhr";this.emit({type:"request",timestamp:new Date(e.start),request:{id:s,url:c,method:l,headers:e.headers,data:h,params:o||void 0,client:b}});const f=e.xhr;const i=()=>{const r=(f._buoyEarlyEnd??(0,_realNow.realNow)())-e.start;this.handleXHRResponse(f,s,c,l,e.headers,h,o,(0,_realNow.realNow)()-r,false,b)};if(f.readyState===4)i();else f.addEventListener("loadend",i,{once:true})}addListener(e){this.listeners.push(e);return()=>{const t=this.listeners.indexOf(e);if(t>-1){this.listeners.splice(t,1)}}}removeAllListeners(){this.listeners=[]}get isActive(){return this.isListening}get listenerCount(){return this.listeners.length}}let _networkListener=null;const getNetworkListener=()=>{if(!_networkListener){_networkListener=new NetworkListener}return _networkListener};const networkListener=exports.networkListener=getNetworkListener;const startNetworkListener=()=>getNetworkListener().startListening();exports.startNetworkListener=startNetworkListener;const stopNetworkListener=()=>_networkListener?.stopListening();exports.stopNetworkListener=stopNetworkListener;const addNetworkListener=R=>getNetworkListener().addListener(R);exports.addNetworkListener=addNetworkListener;const removeAllNetworkListeners=()=>_networkListener?.removeAllListeners();exports.removeAllNetworkListeners=removeAllNetworkListeners;const isNetworkListening=()=>_networkListener?.isActive??false;exports.isNetworkListening=isNetworkListening;const getNetworkListenerCount=()=>_networkListener?.listenerCount??0;exports.getNetworkListenerCount=getNetworkListenerCount;const isNetworkInterceptionLive=()=>_networkListener?.isInterceptionLive()??false;exports.isNetworkInterceptionLive=isNetworkInterceptionLive;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.startNetworkCapture=startNetworkCapture;var _networkEventStore=require("./networkEventStore");var _overrideRulesStore=require("../overrides/overrideRulesStore");var _NetworkFloatingTool=require("../conditions/NetworkFloatingTool");function startNetworkCapture(){const e=typeof navigator!=="undefined"&&navigator.product==="ReactNative";if(!e&&(typeof window==="undefined"||typeof document==="undefined"))return()=>{};void _overrideRulesStore.overrideRulesStore.ensureLoaded();const r=e?()=>{}:(0,_NetworkFloatingTool.registerLocalNetworkFloatingTool)();const o=_networkEventStore.networkEventStore.subscribeToEvents(()=>{});let t=false;return()=>{if(t)return;t=true;r();o()}}
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.startNetworkCapture=startNetworkCapture;var _networkEventStore=require("./networkEventStore");var _socketStore=require("../sockets/socketStore");var _overrideRulesStore=require("../overrides/overrideRulesStore");var _NetworkFloatingTool=require("../conditions/NetworkFloatingTool");function startNetworkCapture(){const e=typeof navigator!=="undefined"&&navigator.product==="ReactNative";if(!e&&(typeof window==="undefined"||typeof document==="undefined"))return()=>{};void _overrideRulesStore.overrideRulesStore.ensureLoaded();_socketStore.socketStore.install();const r=e?()=>{}:(0,_NetworkFloatingTool.registerLocalNetworkFloatingTool)();const o=_networkEventStore.networkEventStore.subscribeToEvents(()=>{});let t=false;return()=>{if(t)return;t=true;r();o()}}
|
package/lib/commonjs/preset.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkToolPreset=exports.createNetworkTool=void 0;var _NetworkConditionsIcon=require("./network/conditions/NetworkConditionsIcon");var _sharedUi=require("@buoy-gg/shared-ui");var _NetworkModal=require("./network/components/NetworkModal");var _overrideRulesStore=require("./network/overrides/overrideRulesStore");var _networkEventStore=require("./network/utils/networkEventStore");var _jsxRuntime=require("react/jsx-runtime");const isReactNativeRuntime=typeof navigator!=="undefined"&&navigator.product==="ReactNative";if(isReactNativeRuntime)void _overrideRulesStore.overrideRulesStore.ensureLoaded();if(isReactNativeRuntime&&typeof __DEV__!=="undefined"&&__DEV__){_networkEventStore.networkEventStore.startBootCapture()}const networkToolPreset=exports.networkToolPreset=(0,_sharedUi.defineToolPreset)({id:"network",name:"NET",description:"Network request logger",slot:"both",icon:({size:e})=>(0,_jsxRuntime.jsx)(_NetworkConditionsIcon.NetworkConditionsIcon,{size:e}),component:_NetworkModal.NetworkModal,props:{enableSharedModalDimensions:false}});const createNetworkTool=exports.createNetworkTool=(0,_sharedUi.createToolFactory)(networkToolPreset,e=>({enableSharedModalDimensions:e.enableSharedModalDimensions??false}));
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.networkToolPreset=exports.createNetworkTool=void 0;var _NetworkConditionsIcon=require("./network/conditions/NetworkConditionsIcon");var _sharedUi=require("@buoy-gg/shared-ui");var _NetworkModal=require("./network/components/NetworkModal");var _overrideRulesStore=require("./network/overrides/overrideRulesStore");var _networkEventStore=require("./network/utils/networkEventStore");var _socketStore=require("./network/sockets/socketStore");var _jsxRuntime=require("react/jsx-runtime");const isReactNativeRuntime=typeof navigator!=="undefined"&&navigator.product==="ReactNative";if(isReactNativeRuntime)void _overrideRulesStore.overrideRulesStore.ensureLoaded();if(isReactNativeRuntime&&typeof __DEV__!=="undefined"&&__DEV__){_networkEventStore.networkEventStore.startBootCapture();_socketStore.socketStore.install()}const networkToolPreset=exports.networkToolPreset=(0,_sharedUi.defineToolPreset)({id:"network",name:"NET",description:"Network request logger",slot:"both",icon:({size:e})=>(0,_jsxRuntime.jsx)(_NetworkConditionsIcon.NetworkConditionsIcon,{size:e}),component:_NetworkModal.NetworkModal,props:{enableSharedModalDimensions:false}});const createNetworkTool=exports.createNetworkTool=(0,_sharedUi.createToolFactory)(networkToolPreset,e=>({enableSharedModalDimensions:e.enableSharedModalDimensions??false}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import{getEffectiveNetworkConnection as i,setConnectionSupport as t,subscribeNetworkConditions as s}from"./network/conditions/store";import{patchConnectionState as a}from"./network/conditions/connectivity/patchNetwork";let o=false;export function installExpoNetworkConditions(){if(o||typeof __DEV__==="undefined"||!__DEV__)return;try{const e=require("expo-network/build/ExpoNetwork").default;const r={get getCurrentState(){return e.getNetworkStateAsync},set getCurrentState(n){e.getNetworkStateAsync=n},eventEmitter:e};a(r,i,s,{eventName:"onNetworkStateChanged",expo:true,receiver:e});o=true;t("expoNetwork",{supported:true})}catch(e){t("expoNetwork",{supported:false,reason:e instanceof Error?e.message:"Expo Network hook could not load."})}}installExpoNetworkConditions();
|
package/lib/module/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";export{networkToolPreset,createNetworkTool}from"./preset";export{startNetworkCapture}from"./network/utils/startNetworkCapture";export{NetworkModal,NetworkToolView}from"./network/components/NetworkModal";export{NetworkEventDetailView}from"./network/components/NetworkEventDetailView";export{NetworkEventItemCompact}from"./network/components/NetworkEventItemCompact";export{NetworkSavedScreen}from"./network/components/NetworkSavedScreen";export{NetworkSavedButton,NetworkDetailPinActions,NetworkHeaderBadgesView}from"./network/components/NetworkHeaderLive";export{useNetworkEvents}from"./network/hooks/useNetworkEvents";export{useNetworkEventList}from"./network/hooks/useNetworkEventList";export{useLiveNetworkEvent}from"./network/hooks/useLiveNetworkEvent";export{useNetworkBadgeCounts}from"./network/hooks/useNetworkBadgeCounts";export{useNetworkSaved}from"./network/hooks/useNetworkSaved";export{splitPinned}from"./network/utils/withPinnedFirst";export{networkSelectionStore,DEFAULT_SETTLE_MS}from"./network/utils/networkSelectionStore";export{TickProvider,useTickEveryMinute}from"./network/hooks/useTickEveryMinute";export{formatBytes,formatDuration,formatHttpStatus}from"./network/utils/formatting";export{overrideRulesStore}from"./network/overrides/overrideRulesStore";export{draftFromEvent}from"./network/overrides/presets";export{MAX_RULES as MAX_OVERRIDE_RULES,FREE_TIER_RULE_LIMIT as FREE_TIER_OVERRIDE_LIMIT,STATUS_MIN as OVERRIDE_STATUS_MIN,STATUS_MAX as OVERRIDE_STATUS_MAX}from"./network/overrides/types";export{useIgnoredPatterns,ignoredPatternsStore,urlMatchesIgnoredPattern,isUrlIgnored}from"@buoy-gg/shared-ui";export{networkSyncAdapter}from"./network/sync/networkSyncAdapter";export{NetworkBodyResolverProvider}from"./network/sync/networkBodyResolver";export{networkEventStore}from"./network/utils/networkEventStore";export{networkSavedStore,flagsForEventId,FREE_TIER_SAVED_LIMIT,MAX_PINNED,MAX_SAVED}from"./network/utils/networkSavedStore";export{generateCurl}from"./network/utils/generateCurl";export{networkListener,addNetworkListener,removeAllNetworkListeners}from"./network/utils/networkListener";export{NETWORK_CONDITIONS,getNetworkCondition,setNetworkCondition,subscribeNetworkConditions}from"./network/conditions/store";
|
|
1
|
+
"use strict";export{networkToolPreset,createNetworkTool}from"./preset";export{startNetworkCapture}from"./network/utils/startNetworkCapture";export{NetworkModal,NetworkToolView}from"./network/components/NetworkModal";export{NetworkEventDetailView}from"./network/components/NetworkEventDetailView";export{NetworkEventItemCompact}from"./network/components/NetworkEventItemCompact";export{NetworkSavedScreen}from"./network/components/NetworkSavedScreen";export{NetworkSavedButton,NetworkDetailPinActions,NetworkHeaderBadgesView}from"./network/components/NetworkHeaderLive";export{useNetworkEvents}from"./network/hooks/useNetworkEvents";export{useNetworkEventList}from"./network/hooks/useNetworkEventList";export{useLiveNetworkEvent}from"./network/hooks/useLiveNetworkEvent";export{useNetworkBadgeCounts}from"./network/hooks/useNetworkBadgeCounts";export{useNetworkSaved}from"./network/hooks/useNetworkSaved";export{splitPinned}from"./network/utils/withPinnedFirst";export{networkSelectionStore,DEFAULT_SETTLE_MS}from"./network/utils/networkSelectionStore";export{TickProvider,useTickEveryMinute}from"./network/hooks/useTickEveryMinute";export{formatBytes,formatDuration,formatHttpStatus}from"./network/utils/formatting";export{overrideRulesStore}from"./network/overrides/overrideRulesStore";export{draftFromEvent}from"./network/overrides/presets";export{MAX_RULES as MAX_OVERRIDE_RULES,FREE_TIER_RULE_LIMIT as FREE_TIER_OVERRIDE_LIMIT,STATUS_MIN as OVERRIDE_STATUS_MIN,STATUS_MAX as OVERRIDE_STATUS_MAX}from"./network/overrides/types";export{useIgnoredPatterns,ignoredPatternsStore,urlMatchesIgnoredPattern,isUrlIgnored}from"@buoy-gg/shared-ui";export{NetworkSocketsScreen}from"./network/components/sockets/NetworkSocketsScreen";export{useSocketsState}from"./network/hooks/useSocketsState";export{socketsSyncAdapter,querySockets}from"./network/sockets/socketsSyncAdapter";export{socketStore}from"./network/sockets/socketStore";export{onSocketMoment}from"./network/sockets/socketMoments";export{networkSyncAdapter}from"./network/sync/networkSyncAdapter";export{NetworkBodyResolverProvider}from"./network/sync/networkBodyResolver";export{networkEventStore}from"./network/utils/networkEventStore";export{networkSavedStore,flagsForEventId,FREE_TIER_SAVED_LIMIT,MAX_PINNED,MAX_SAVED}from"./network/utils/networkSavedStore";export{generateCurl}from"./network/utils/generateCurl";export{networkListener,addNetworkListener,removeAllNetworkListeners}from"./network/utils/networkListener";export{NETWORK_CONDITIONS,getNetworkCondition,setNetworkCondition,subscribeNetworkConditions,getNetworkConditions,setNetworkConditions,getNetworkConnection,getConditionsRevision,networkConditionsActive}from"./network/conditions/store";export{chooseConditionsSnapshot}from"./network/conditions/remoteState";
|
package/lib/module/index.web.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";export{networkListener,startNetworkListener,stopNetworkListener,addNetworkListener,removeAllNetworkListeners,isNetworkListening}from"./network/utils/networkListener";export{networkEventStore}from"./network/utils/networkEventStore";export{networkSavedStore,flagsForEventId}from"./network/utils/networkSavedStore";export{useNetworkEvents,FREE_TIER_REQUEST_LIMIT}from"./network/hooks/useNetworkEvents";export{useNetworkEventList}from"./network/hooks/useNetworkEventList";export{useLiveNetworkEvent}from"./network/hooks/useLiveNetworkEvent";export{useNetworkBadgeCounts}from"./network/hooks/useNetworkBadgeCounts";export{useHasNetworkSelection,useSelectedNetworkEventId,useNetworkBodyEventId,useNetworkCursor}from"./network/hooks/useNetworkSelection";export{networkSelectionStore,toSelectionIds}from"./network/utils/networkSelectionStore";export{NetworkListScreen}from"./network/components/NetworkListScreen.web";export{NetworkEventItemCompact}from"./network/components/NetworkEventItemCompact.web";export{NetworkHeaderBadges,NetworkClearButton,NetworkSavedButton,NetworkDetailPinActions,NetworkHeaderCopyButton}from"./network/components/NetworkHeaderLive.web";export{NetworkEventDetailView}from"./network/components/NetworkEventDetailView.web";export{NetworkDetailStepper}from"./network/components/NetworkDetailStepper.web";export{NetworkDetailScreen}from"./network/components/NetworkDetailScreen.web";export{NetworkFilterViewV3}from"./network/components/NetworkFilterViewV3.web";export{NetworkFilterScreen}from"./network/components/NetworkFilterScreen.web";export{NetworkSavedScreen}from"./network/components/NetworkSavedScreen.web";export{NetworkCopySettingsView,DEFAULT_COPY_SETTINGS}from"./network/components/NetworkCopySettingsView.web";export{NetworkCopyScreen}from"./network/components/NetworkCopyScreen.web";export{generateNetworkCopyText}from"./network/utils/generateNetworkCopyText";export{selectSavedEvents}from"./network/utils/selectSavedEvents";export{FREE_TIER_SAVED_LIMIT,MAX_SAVED}from"./network/utils/networkSavedStore";export{NetworkOverridesScreen}from"./network/components/NetworkOverridesScreen.web";export{NetworkOverrideEditor}from"./network/components/NetworkOverrideEditor.web";export{NetworkNumberPrompt}from"./network/components/NetworkNumberPrompt.web";export{NetworkOverridesButton}from"./network/components/NetworkOverridesButton.web";export{NetworkOverrideHeaderButton}from"./network/components/NetworkOverrideHeaderButton.web";export{useOverrideRules}from"./network/hooks/useOverrideRules";export{overrideRulesStore}from"./network/overrides/overrideRulesStore";export{draftFromEvent,patternForUrl}from"./network/overrides/presets";export{FREE_TIER_RULE_LIMIT,MAX_RULES,STATUS_MAX,STATUS_MIN}from"./network/overrides/types";export{ruleMatches}from"./network/overrides/matchRule";export{filterNetworkEvents,applyIgnoredPatterns}from"./network/utils/filterNetworkEvents";export{splitPinned}from"./network/utils/withPinnedFirst";export{extractOperationName}from"./network/utils/extractOperationName";export{generateCurl}from"./network/utils/generateCurl";export{NETWORK_CONDITIONS,getNetworkCondition,setNetworkCondition,subscribeNetworkConditions}from"./network/conditions/store";
|
|
1
|
+
"use strict";export{networkListener,startNetworkListener,stopNetworkListener,addNetworkListener,removeAllNetworkListeners,isNetworkListening}from"./network/utils/networkListener";export{networkEventStore}from"./network/utils/networkEventStore";export{networkSavedStore,flagsForEventId}from"./network/utils/networkSavedStore";export{socketStore}from"./network/sockets/socketStore";export{socketsSyncAdapter,querySockets}from"./network/sockets/socketsSyncAdapter";export{onSocketMoment}from"./network/sockets/socketMoments";export{useNetworkEvents,FREE_TIER_REQUEST_LIMIT}from"./network/hooks/useNetworkEvents";export{useNetworkEventList}from"./network/hooks/useNetworkEventList";export{useLiveNetworkEvent}from"./network/hooks/useLiveNetworkEvent";export{useNetworkBadgeCounts}from"./network/hooks/useNetworkBadgeCounts";export{useHasNetworkSelection,useSelectedNetworkEventId,useNetworkBodyEventId,useNetworkCursor}from"./network/hooks/useNetworkSelection";export{networkSelectionStore,toSelectionIds}from"./network/utils/networkSelectionStore";export{NetworkListScreen}from"./network/components/NetworkListScreen.web";export{NetworkEventItemCompact}from"./network/components/NetworkEventItemCompact.web";export{NetworkHeaderBadges,NetworkClearButton,NetworkSavedButton,NetworkDetailPinActions,NetworkHeaderCopyButton}from"./network/components/NetworkHeaderLive.web";export{NetworkEventDetailView}from"./network/components/NetworkEventDetailView.web";export{NetworkDetailStepper}from"./network/components/NetworkDetailStepper.web";export{NetworkDetailScreen}from"./network/components/NetworkDetailScreen.web";export{NetworkFilterViewV3}from"./network/components/NetworkFilterViewV3.web";export{NetworkFilterScreen}from"./network/components/NetworkFilterScreen.web";export{NetworkSavedScreen}from"./network/components/NetworkSavedScreen.web";export{NetworkCopySettingsView,DEFAULT_COPY_SETTINGS}from"./network/components/NetworkCopySettingsView.web";export{NetworkCopyScreen}from"./network/components/NetworkCopyScreen.web";export{generateNetworkCopyText}from"./network/utils/generateNetworkCopyText";export{selectSavedEvents}from"./network/utils/selectSavedEvents";export{FREE_TIER_SAVED_LIMIT,MAX_SAVED}from"./network/utils/networkSavedStore";export{NetworkOverridesScreen}from"./network/components/NetworkOverridesScreen.web";export{NetworkOverrideEditor}from"./network/components/NetworkOverrideEditor.web";export{NetworkNumberPrompt}from"./network/components/NetworkNumberPrompt.web";export{NetworkOverridesButton}from"./network/components/NetworkOverridesButton.web";export{NetworkOverrideHeaderButton}from"./network/components/NetworkOverrideHeaderButton.web";export{useOverrideRules}from"./network/hooks/useOverrideRules";export{overrideRulesStore}from"./network/overrides/overrideRulesStore";export{draftFromEvent,patternForUrl}from"./network/overrides/presets";export{FREE_TIER_RULE_LIMIT,MAX_RULES,STATUS_MAX,STATUS_MIN}from"./network/overrides/types";export{ruleMatches}from"./network/overrides/matchRule";export{filterNetworkEvents,applyIgnoredPatterns}from"./network/utils/filterNetworkEvents";export{splitPinned}from"./network/utils/withPinnedFirst";export{extractOperationName}from"./network/utils/extractOperationName";export{generateCurl}from"./network/utils/generateCurl";export{NETWORK_CONDITIONS,getNetworkCondition,setNetworkCondition,subscribeNetworkConditions,getNetworkConditions,setNetworkConditions,getNetworkConnection,getConditionsRevision,networkConditionsActive}from"./network/conditions/store";export{chooseConditionsSnapshot}from"./network/conditions/remoteState";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";import{wrapNetInfoApi as r}from"./network/conditions/connectivity/netInfoFacade";import{getEffectiveNetworkConnection as i,setConnectionSupport as n,subscribeNetworkConditions as a}from"./network/conditions/store";import{patchConnectionState as f}from"./network/conditions/connectivity/patchNetwork";let o=false;export function installNetInfoConditions(){if(o||typeof __DEV__==="undefined"||!__DEV__)return;let e;try{const t=require("@react-native-community/netinfo/src/internal/nativeInterface").default;e=f(t,i,a);r(require("@react-native-community/netinfo"));o=true;n("netInfo",{supported:true})}catch(t){e?.();n("netInfo",{supported:false,reason:t instanceof Error?t.message:"NetInfo hook could not load."})}}installNetInfoConditions();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";import{useState as
|
|
1
|
+
"use strict";import{useState as F,useEffect as U,useMemo as ee,memo as oe}from"react";import{View as l,Text as i,StyleSheet as te,ScrollView as re,TouchableOpacity as O}from"react-native";import{Clock as M,Upload as G,Download as J,AlertCircle as le,ChevronDown as _,ChevronUp as Q,Lock as ie,Unlock as ne,FileJson as E,Filter as ae,Globe as se,Link as ce,Copy as Y,FlaskConical as de,InlineCopyButton as K,macOSColors as N,night as t,useFeatureGate as ue,UpgradeModal as pe,monoFont as R}from"@buoy-gg/shared-ui";import{formatBytes as q,formatDuration as X,formatHttpStatus as ge}from"../utils/formatting";import{formatRelativeTime as he}from"@buoy-gg/shared-ui";import{DataViewer as H}from"@buoy-gg/shared-ui/dataViewer";import{formatGraphQLDisplay as fe}from"../utils/formatGraphQLVariables";import{useNetworkBodyResolver as ye}from"../sync/networkBodyResolver";import{jsx as e,jsxs as n,Fragment as W}from"react/jsx-runtime";const A=t.color.accent;const me=new Set;const be=()=>{};const Se=({timings:d,total:r})=>{const u=Math.max(1,r);const h=[{label:"Waiting (TTFB)",hint:"incl. queue, DNS, TLS",value:d.ttfb,color:N.semantic.warning},{label:"Content download",hint:void 0,value:d.download,color:N.semantic.success}];return e(l,{style:o.phaseList,children:h.map(s=>n(l,{style:o.phaseRow,children:[n(l,{style:o.phaseLabelGroup,children:[e(i,{style:o.phaseLabel,children:s.label}),s.hint?e(i,{style:o.phaseHint,children:s.hint}):null]}),e(l,{style:o.phaseTrack,children:e(l,{style:[o.phaseBar,{backgroundColor:s.color,width:`${Math.min(100,Math.max(1,s.value/u*100))}%`}]})}),e(i,{style:o.phaseValue,children:X(s.value)})]},s.label))})};const Z=()=>e(l,{style:o.bodyDeferred});const T=({title:d,icon:r,children:u,defaultOpen:h=false,count:s})=>{const[p,B]=F(h);return n(l,{style:o.collapsibleSection,children:[n(O,{style:o.collapsibleHeader,onPress:()=>B(!p),testID:`buoy-network-section-${d.toLowerCase().replace(/\s+/g,"-")}`,accessibilityRole:"button",accessibilityLabel:d,children:[n(l,{style:o.collapsibleTitle,children:[r,e(i,{style:o.collapsibleTitleText,children:d}),s!==void 0?e(i,{style:o.collapsibleCount,children:s}):null]}),p?e(Q,{size:16,color:t.color.textSecondary}):e(_,{size:16,color:t.color.textSecondary})]}),p?e(l,{style:o.collapsibleContent,children:u}):null]})};const xe=({url:d,requestData:r,operationName:u,graphqlVariables:h,requestClient:s,isPro:p=false,onUpgradePress:B})=>{const g=I=>{try{const y=new URL(I);const x=String(y.protocol||"");const C=String(y.host||"");const V=x==="https:";let m=String(y.pathname||"");if(s==="graphql"&&u){const z=fe(u,h);m=`${m} (${z})`}else if(u){m=`${m} (${u})`}const w={};const b=y.searchParams;if(b&&typeof b.forEach==="function"){b.forEach((z,D)=>{w[D]=z})}return{protocol:x.replace(":",""),host:C,pathname:m,params:Object.keys(w).length>0?w:null,isSecure:V}}catch{return{protocol:"",host:d,pathname:"",params:null,isSecure:false}}};const c=ee(()=>g(d),[d,s,u,h]);const[f,k]=F(false);return n(l,{style:o.urlBreakdown,children:[n(l,{style:o.urlRow,children:[c.isSecure?e(ie,{size:12,color:N.semantic.success}):e(ne,{size:12,color:N.semantic.warning}),e(i,{style:o.urlDomain,children:c.host}),n(i,{style:o.urlProtocol,children:["(",c.protocol.toUpperCase(),")"]}),p?e(K,{value:d,buttonStyle:o.copyButton}):e(O,{style:o.copyButton,onPress:B,activeOpacity:.7,children:e(Y,{size:14,color:t.color.textSecondary})})]}),e(l,{style:o.urlPathRow,children:n(i,{style:o.urlPath,numberOfLines:2,children:[c.pathname,c.params?n(i,{style:o.urlQueryString,children:["?",new URLSearchParams(c.params).toString()]}):null]})}),c.params?n(l,{style:o.queryParamsCollapsible,children:[n(O,{style:o.queryParamsToggle,onPress:()=>k(!f),activeOpacity:.7,children:[e(i,{style:o.queryParamsToggleText,children:"Query Parameters"}),e(i,{style:o.collapsibleCount,children:Object.keys(c.params).length}),f?e(Q,{size:14,color:t.color.textSecondary}):e(_,{size:14,color:t.color.textSecondary})]}),f?e(H,{title:"",data:c.params,showTypeFilter:true,rawMode:true,initialExpanded:true}):null]}):null]})};export const NetworkEventDetailView=oe(function d({event:r,ignoredPatterns:u=me,onTogglePattern:h=be,showBodies:s=true}){const p=r.status?ge(r.status):null;const B=!r.status&&!r.error;const{isPro:g}=ue();const[c,f]=F(false);U(()=>{if(c&&g){f(false)}},[c,g]);const k=ye();const I=r.requestData===void 0&&(r.requestBodyOmitted===true||(r.requestSize??0)>0);const y=r.responseData===void 0&&(r.responseBodyOmitted===true||(r.responseSize??0)>0);const x=r.headersOmitted===true;const[C,V]=F(null);const[m,w]=F(false);U(()=>{V(null);if(!k||!I&&!y&&!x){w(false);return}let a=false;w(true);k(r.id).then(S=>{if(!a)V(S)}).catch(()=>{}).finally(()=>{if(!a)w(false)});return()=>{a=true}},[r.id,k,I,y,x]);const b=r.requestData??C?.requestData??void 0;const z=r.responseData!==void 0?r.responseData:C?.responseData;const D=(x?C?.requestHeaders:void 0)??r.requestHeaders;const $=(x?C?.responseHeaders:void 0)??r.responseHeaders;const v=()=>{const a={method:r.method,url:r.url,status:r.status,statusText:r.statusText,timestamp:new Date(r.timestamp).toISOString(),duration:r.duration?`${r.duration}ms`:"N/A",requestHeaders:D,requestData:b,responseHeaders:$,responseData:z,requestSize:r.requestSize?q(r.requestSize):"N/A",responseSize:r.responseSize?q(r.responseSize):"N/A",error:r.error,client:r.requestClient};return`# Network Request Details
|
|
2
2
|
|
|
3
3
|
## Request
|
|
4
4
|
- **Method:** ${a.method}
|
|
@@ -32,4 +32,4 @@ ${JSON.stringify(a.responseHeaders,null,2)}
|
|
|
32
32
|
\`\`\`json
|
|
33
33
|
${JSON.stringify(a.responseData,null,2)}
|
|
34
34
|
\`\`\`
|
|
35
|
-
`};return n(W,{children:[n(re,{keyboardShouldPersistTaps:"handled",testID:"buoy-network-detail-scroll",style:o.container,children:[n(l,{style:o.requestDetailsSection,children:[n(l,{style:o.httpHeader,children:[e(l,{style:o.httpMethodBadge,children:e(i,{style:o.httpMethod,children:r.method})}),r.status?e(l,{style:[o.httpStatusBadge,{backgroundColor:`${p?.color}20`}],children:n(i,{style:[o.httpStatusText,{color:p?.color}],children:[p?.text," ",p?.meaning]})}):B?n(l,{style:o.pendingBadge,children:[e(M,{size:10,color:t.color.warning}),e(i,{style:o.pendingBadgeText,children:"Pending"})]}):null,r.condition&&n(i,{style:{color:"#FFCC66"},children:["Conditions: ",r.condition.profile," (+",r.condition.delayMs," ms)"]}),r.duration?n(l,{style:o.httpDuration,children:[e(M,{size:10,color:t.color.textTertiary}),e(i,{style:o.httpDurationText,children:X(r.duration)})]}):null,r.override?n(l,{style:o.overrideBadge,children:[e(de,{size:10,color:t.color.warning}),e(i,{style:o.overrideBadgeText,children:r.override.ruleName||"Overridden"})]}):null,g?e(K,{value:v,buttonStyle:o.copyFullButton}):e(O,{style:o.copyFullButton,onPress:()=>f(true),activeOpacity:.7,children:e(Y,{size:14,color:t.color.textSecondary})})]}),e(xe,{url:r.url,requestData:b,operationName:r.operationName,graphqlVariables:r.graphqlVariables,requestClient:r.requestClient,isPro:g,onUpgradePress:()=>f(true)}),r.error?n(l,{style:o.errorBox,children:[e(le,{size:12,color:t.color.danger}),e(i,{style:o.errorText,children:r.error})]}):null]}),n(l,{style:o.timingSection,children:[n(l,{style:o.timingRow,children:[e(M,{size:12,color:t.color.textSecondary}),e(i,{style:o.timingLabel,children:"Started:"}),e(i,{style:o.timingValue,children:he(r.timestamp)}),n(i,{style:o.timingExact,children:["(",new Date(r.timestamp).toLocaleTimeString(),")"]}),r.requestSize||r.responseSize?n(l,{style:o.sizeRow,children:[r.requestSize!==void 0?n(l,{style:o.sizeItem,children:[e(G,{size:10,color:t.color.info}),e(i,{style:o.sizeLabel,children:"Sent:"}),e(i,{style:o.sizeValue,children:q(r.requestSize)})]}):null,r.responseSize!==void 0?n(l,{style:o.sizeItem,children:[e(J,{size:10,color:A}),e(i,{style:o.sizeLabel,children:"Received:"}),e(i,{style:o.sizeValue,children:q(r.responseSize)})]}):null]}):null]}),r.timings?n(W,{children:[e(l,{style:o.phaseDivider}),e(Se,{timings:r.timings,total:r.duration??r.timings.ttfb+r.timings.download})]}):null]}),e(T,{title:"Request Headers",icon:e(G,{size:14,color:t.color.info}),defaultOpen:false,count:Object.keys(D).length,children:Object.keys(D).length>0?e(l,{style:o.dataViewerContainer,children:e(F,{title:"",data:D,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g})}):e(i,{style:o.emptyText,children:"No request headers"})}),e(T,{title:"Response Headers",icon:e(J,{size:14,color:A}),defaultOpen:false,count:Object.keys($).length,children:Object.keys($).length>0?e(l,{style:o.dataViewerContainer,children:e(F,{title:"",data:$,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g})}):e(i,{style:o.emptyText,children:"No response headers yet"})}),b!==void 0?e(T,{title:"Request Body",icon:e(E,{size:14,color:t.color.accent}),defaultOpen:false,children:e(l,{style:o.dataViewerContainer,children:s?e(F,{title:"",data:b,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g}):e(Z,{})})}):L?e(T,{title:"Request Body",icon:e(E,{size:14,color:t.color.accent}),defaultOpen:true,children:e(i,{style:o.emptyText,children:m?`Loading request body (${q(r.requestSize??0)})\u2026`:"Request body unavailable"})}):null,z!==void 0?e(T,{title:"Response Body",icon:e(E,{size:14,color:A}),defaultOpen:true,children:e(l,{style:o.dataViewerContainer,children:s?e(F,{title:"",data:z,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g}):e(Z,{})})}):y?e(T,{title:"Response Body",icon:e(E,{size:14,color:A}),defaultOpen:true,children:e(i,{style:o.emptyText,children:m?`Loading response body (${q(r.responseSize??0)})\u2026`:"Response body unavailable"})}):null,e(T,{title:"Filter Options",icon:e(ae,{size:14,color:t.color.warning}),defaultOpen:false,children:e(l,{style:o.filterOptionsContainer,children:(()=>{let a="";let S="";try{const j=new URL(r.url);a=j.hostname;S=j.pathname}catch{S=r.url}const I=u.has(a);const P=u.has(S);return n(W,{children:[n(O,{style:[o.filterOption,I&&o.filterOptionActive],onPress:()=>a&&h(a),children:[n(l,{style:o.filterOptionLeft,children:[e(se,{size:16,color:I?t.color.warning:t.color.textTertiary}),n(l,{style:o.filterOptionContent,children:[e(i,{style:o.filterOptionLabel,children:"Ignore Domain"}),e(i,{style:o.filterOptionValue,children:a||"N/A"})]})]}),e(l,{style:[o.filterToggle,I&&o.filterToggleActive],children:e(i,{style:[o.filterToggleText,I&&o.filterToggleTextActive],children:I?"IGNORED":"IGNORE"})})]}),n(O,{style:[o.filterOption,P&&o.filterOptionActive],onPress:()=>S&&h(S),children:[n(l,{style:o.filterOptionLeft,children:[e(ce,{size:16,color:P?t.color.warning:t.color.textTertiary}),n(l,{style:o.filterOptionContent,children:[e(i,{style:o.filterOptionLabel,children:"Ignore URL Pattern"}),e(i,{style:o.filterOptionValue,numberOfLines:1,children:S||"N/A"})]})]}),e(l,{style:[o.filterToggle,P&&o.filterToggleActive],children:e(i,{style:[o.filterToggleText,P&&o.filterToggleTextActive],children:P?"IGNORED":"IGNORE"})})]}),e(l,{style:o.filterInfoBox,children:e(i,{style:o.filterInfoText,children:"Ignored requests will be hidden from the network list. You can manage filters in the Filters tab."})})]})})()})})]}),e(pe,{visible:c,onClose:()=>f(false),featureName:"Copy Request Details",description:"Copy network request details to share or debug issues.",benefits:["Copy full request details including headers and body","Export to JSON, Markdown, or plain text","Share request data with teammates","Feed data to AI assistants for debugging"]})]})});const o=te.create({container:{flex:1,backgroundColor:"transparent"},requestDetailsSection:{marginHorizontal:12,marginTop:12,backgroundColor:t.color.surface,borderRadius:8,borderWidth:1,borderColor:t.color.border,padding:12},httpHeader:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12,flexWrap:"nowrap"},httpMethodBadge:{backgroundColor:t.color.infoSoft,paddingHorizontal:8,paddingVertical:4,borderRadius:4},httpMethod:{color:t.color.info,fontSize:11,fontWeight:"700",letterSpacing:.5},httpStatusBadge:{paddingHorizontal:8,paddingVertical:4,borderRadius:4},httpStatusText:{fontSize:11,fontWeight:"600"},pendingBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:t.color.warningSoft,paddingHorizontal:8,paddingVertical:4,borderRadius:4},pendingBadgeText:{color:t.color.warning,fontSize:11,fontWeight:"600"},httpDuration:{flexDirection:"row",alignItems:"center",gap:4},httpDurationText:{color:t.color.textSecondary,fontSize:11},overrideBadge:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:6,paddingVertical:3,borderRadius:4,backgroundColor:t.color.warningSoft},overrideBadgeText:{color:t.color.warning,fontSize:10,fontWeight:"700"},copyFullButton:{marginLeft:"auto",flexShrink:0,padding:4},urlBreakdown:{backgroundColor:t.color.bg,borderRadius:4,padding:8},urlRow:{flexDirection:"row",alignItems:"center",gap:6,marginBottom:4},urlDomain:{color:t.color.text,fontSize:12,fontWeight:"600",flex:1},urlProtocol:{color:t.color.textTertiary,fontSize:10},copyButton:{padding:4},urlPathRow:{paddingLeft:18},urlPath:{color:t.color.textSecondary,fontSize:11,fontFamily:R},urlQueryString:{color:t.color.info,fontSize:11,fontFamily:R},queryParamsCollapsible:{marginTop:8},queryParamsToggle:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:10,backgroundColor:t.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:t.color.border,marginBottom:8},queryParamsToggleText:{flexGrow:0,color:t.color.text,fontSize:12,fontWeight:"600",letterSpacing:.3},timingSection:{marginHorizontal:12,marginTop:8,backgroundColor:t.color.surface,borderRadius:8,borderWidth:1,borderColor:t.color.border,padding:12},timingRow:{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"},timingLabel:{color:t.color.textSecondary,fontSize:11},timingValue:{color:t.color.text,fontSize:11,fontWeight:"600"},timingExact:{color:t.color.textTertiary,fontSize:10,marginLeft:4},sizeRow:{flexDirection:"row",alignItems:"center",gap:16,marginLeft:"auto"},sizeItem:{flexDirection:"row",alignItems:"center",gap:4},sizeLabel:{color:t.color.textTertiary,fontSize:10},sizeValue:{color:t.color.info,fontSize:10,fontFamily:R,fontWeight:"600"},phaseDivider:{height:1,backgroundColor:t.color.border,marginTop:12,marginBottom:12},phaseList:{gap:8},phaseRow:{flexDirection:"row",alignItems:"center",gap:14},phaseLabelGroup:{width:150},phaseLabel:{fontSize:12,color:t.color.textSecondary},phaseHint:{fontSize:10,color:t.color.textTertiary},phaseTrack:{flex:1,height:7,borderRadius:4,backgroundColor:t.color.surfaceElevated,justifyContent:"center",overflow:"hidden"},phaseBar:{height:7,borderRadius:4},phaseValue:{width:72,textAlign:"right",fontSize:12,fontFamily:R,color:t.color.text},collapsibleSection:{marginHorizontal:12,marginTop:8,backgroundColor:t.color.surface,borderRadius:8,borderWidth:1,borderColor:t.color.border,overflow:"hidden"},collapsibleHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",padding:12,backgroundColor:t.color.surfaceElevated},collapsibleTitle:{flexDirection:"row",alignItems:"center",gap:8},collapsibleTitleText:{color:t.color.text,fontSize:13,fontWeight:"600"},collapsibleCount:{color:t.color.textTertiary,fontSize:11.5,fontFamily:R},collapsibleContent:{padding:12},dataViewerContainer:{marginTop:-12,marginHorizontal:-12,marginBottom:-12},bodyDeferred:{height:120},errorBox:{flexDirection:"row",alignItems:"center",gap:6,backgroundColor:t.color.dangerSoft,padding:8,borderRadius:4,marginTop:8},errorText:{color:t.color.danger,fontSize:11,flex:1},emptyText:{color:t.color.textTertiary,fontSize:12,fontStyle:"italic",textAlign:"center"},filterOptionsContainer:{gap:12},filterOption:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:t.color.surfaceElevated,borderRadius:8,padding:12,borderWidth:1,borderColor:t.color.border},filterOptionActive:{backgroundColor:t.color.warningSoft,borderColor:t.color.warning+"33"},filterOptionLeft:{flexDirection:"row",alignItems:"center",gap:12,flex:1},filterOptionContent:{flex:1},filterOptionLabel:{color:t.color.textSecondary,fontSize:11,marginBottom:2,textTransform:"uppercase",letterSpacing:.5},filterOptionValue:{color:t.color.text,fontSize:13,fontFamily:R},filterToggle:{paddingHorizontal:10,paddingVertical:6,borderRadius:4,backgroundColor:t.color.bg,borderWidth:1,borderColor:t.color.border},filterToggleActive:{backgroundColor:t.color.warningSoft,borderColor:t.color.warning+"4D"},filterToggleText:{fontSize:10,fontWeight:"600",color:t.color.textTertiary,letterSpacing:.5},filterToggleTextActive:{color:t.color.warning},filterInfoBox:{backgroundColor:t.color.infoSoft,borderRadius:6,padding:10,borderWidth:1,borderColor:t.color.info+"33"},filterInfoText:{color:t.color.textSecondary,fontSize:11,lineHeight:16}});
|
|
35
|
+
`};return n(W,{children:[n(re,{keyboardShouldPersistTaps:"handled",testID:"buoy-network-detail-scroll",style:o.container,children:[n(l,{style:o.requestDetailsSection,children:[n(l,{style:o.httpHeader,children:[e(l,{style:o.httpMethodBadge,children:e(i,{style:o.httpMethod,children:r.method})}),r.status?e(l,{style:[o.httpStatusBadge,{backgroundColor:`${p?.color}20`}],children:n(i,{style:[o.httpStatusText,{color:p?.color}],children:[p?.text," ",p?.meaning]})}):B?n(l,{style:o.pendingBadge,children:[e(M,{size:10,color:t.color.warning}),e(i,{style:o.pendingBadgeText,children:"Pending"})]}):null,r.condition&&n(i,{style:{color:"#FFCC66"},children:["Conditions: ",r.condition.profile," (+",r.condition.delayMs," ms)"]}),r.condition?.uploadCap?.note&&e(i,{testID:"buoy-network-upload-cap-detail",style:{color:"#FFCC66"},children:r.condition.uploadCap.note}),r.duration?n(l,{style:o.httpDuration,children:[e(M,{size:10,color:t.color.textTertiary}),e(i,{style:o.httpDurationText,children:X(r.duration)})]}):null,r.override?n(l,{style:o.overrideBadge,children:[e(de,{size:10,color:t.color.warning}),e(i,{style:o.overrideBadgeText,children:r.override.ruleName||"Overridden"})]}):null,g?e(K,{value:v,buttonStyle:o.copyFullButton}):e(O,{style:o.copyFullButton,onPress:()=>f(true),activeOpacity:.7,children:e(Y,{size:14,color:t.color.textSecondary})})]}),e(xe,{url:r.url,requestData:b,operationName:r.operationName,graphqlVariables:r.graphqlVariables,requestClient:r.requestClient,isPro:g,onUpgradePress:()=>f(true)}),r.error?n(l,{style:o.errorBox,children:[e(le,{size:12,color:t.color.danger}),e(i,{style:o.errorText,children:r.error})]}):null]}),n(l,{style:o.timingSection,children:[n(l,{style:o.timingRow,children:[e(M,{size:12,color:t.color.textSecondary}),e(i,{style:o.timingLabel,children:"Started:"}),e(i,{style:o.timingValue,children:he(r.timestamp)}),n(i,{style:o.timingExact,children:["(",new Date(r.timestamp).toLocaleTimeString(),")"]}),r.requestSize||r.responseSize?n(l,{style:o.sizeRow,children:[r.requestSize!==void 0?n(l,{style:o.sizeItem,children:[e(G,{size:10,color:t.color.info}),e(i,{style:o.sizeLabel,children:"Sent:"}),e(i,{style:o.sizeValue,children:q(r.requestSize)})]}):null,r.responseSize!==void 0?n(l,{style:o.sizeItem,children:[e(J,{size:10,color:A}),e(i,{style:o.sizeLabel,children:"Received:"}),e(i,{style:o.sizeValue,children:q(r.responseSize)})]}):null]}):null]}),r.timings?n(W,{children:[e(l,{style:o.phaseDivider}),e(Se,{timings:r.timings,total:r.duration??r.timings.ttfb+r.timings.download})]}):null]}),e(T,{title:"Request Headers",icon:e(G,{size:14,color:t.color.info}),defaultOpen:false,count:Object.keys(D).length,children:Object.keys(D).length>0?e(l,{style:o.dataViewerContainer,children:e(H,{title:"",data:D,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g})}):e(i,{style:o.emptyText,children:"No request headers"})}),e(T,{title:"Response Headers",icon:e(J,{size:14,color:A}),defaultOpen:false,count:Object.keys($).length,children:Object.keys($).length>0?e(l,{style:o.dataViewerContainer,children:e(H,{title:"",data:$,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g})}):e(i,{style:o.emptyText,children:"No response headers yet"})}),b!==void 0?e(T,{title:"Request Body",icon:e(E,{size:14,color:t.color.accent}),defaultOpen:false,children:e(l,{style:o.dataViewerContainer,children:s?e(H,{title:"",data:b,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g}):e(Z,{})})}):I?e(T,{title:"Request Body",icon:e(E,{size:14,color:t.color.accent}),defaultOpen:true,children:e(i,{style:o.emptyText,children:m?`Loading request body (${q(r.requestSize??0)})\u2026`:"Request body unavailable"})}):null,z!==void 0?e(T,{title:"Response Body",icon:e(E,{size:14,color:A}),defaultOpen:true,children:e(l,{style:o.dataViewerContainer,children:s?e(H,{title:"",data:z,showTypeFilter:true,rawMode:true,initialExpanded:true,disableCopy:!g}):e(Z,{})})}):y?e(T,{title:"Response Body",icon:e(E,{size:14,color:A}),defaultOpen:true,children:e(i,{style:o.emptyText,children:m?`Loading response body (${q(r.responseSize??0)})\u2026`:"Response body unavailable"})}):null,e(T,{title:"Filter Options",icon:e(ae,{size:14,color:t.color.warning}),defaultOpen:false,children:e(l,{style:o.filterOptionsContainer,children:(()=>{let a="";let S="";try{const j=new URL(r.url);a=j.hostname;S=j.pathname}catch{S=r.url}const L=u.has(a);const P=u.has(S);return n(W,{children:[n(O,{style:[o.filterOption,L&&o.filterOptionActive],onPress:()=>a&&h(a),children:[n(l,{style:o.filterOptionLeft,children:[e(se,{size:16,color:L?t.color.warning:t.color.textTertiary}),n(l,{style:o.filterOptionContent,children:[e(i,{style:o.filterOptionLabel,children:"Ignore Domain"}),e(i,{style:o.filterOptionValue,children:a||"N/A"})]})]}),e(l,{style:[o.filterToggle,L&&o.filterToggleActive],children:e(i,{style:[o.filterToggleText,L&&o.filterToggleTextActive],children:L?"IGNORED":"IGNORE"})})]}),n(O,{style:[o.filterOption,P&&o.filterOptionActive],onPress:()=>S&&h(S),children:[n(l,{style:o.filterOptionLeft,children:[e(ce,{size:16,color:P?t.color.warning:t.color.textTertiary}),n(l,{style:o.filterOptionContent,children:[e(i,{style:o.filterOptionLabel,children:"Ignore URL Pattern"}),e(i,{style:o.filterOptionValue,numberOfLines:1,children:S||"N/A"})]})]}),e(l,{style:[o.filterToggle,P&&o.filterToggleActive],children:e(i,{style:[o.filterToggleText,P&&o.filterToggleTextActive],children:P?"IGNORED":"IGNORE"})})]}),e(l,{style:o.filterInfoBox,children:e(i,{style:o.filterInfoText,children:"Ignored requests will be hidden from the network list. You can manage filters in the Filters tab."})})]})})()})})]}),e(pe,{visible:c,onClose:()=>f(false),featureName:"Copy Request Details",description:"Copy network request details to share or debug issues.",benefits:["Copy full request details including headers and body","Export to JSON, Markdown, or plain text","Share request data with teammates","Feed data to AI assistants for debugging"]})]})});const o=te.create({container:{flex:1,backgroundColor:"transparent"},requestDetailsSection:{marginHorizontal:12,marginTop:12,backgroundColor:t.color.surface,borderRadius:8,borderWidth:1,borderColor:t.color.border,padding:12},httpHeader:{flexDirection:"row",alignItems:"center",gap:8,marginBottom:12,flexWrap:"nowrap"},httpMethodBadge:{backgroundColor:t.color.infoSoft,paddingHorizontal:8,paddingVertical:4,borderRadius:4},httpMethod:{color:t.color.info,fontSize:11,fontWeight:"700",letterSpacing:.5},httpStatusBadge:{paddingHorizontal:8,paddingVertical:4,borderRadius:4},httpStatusText:{fontSize:11,fontWeight:"600"},pendingBadge:{flexDirection:"row",alignItems:"center",gap:4,backgroundColor:t.color.warningSoft,paddingHorizontal:8,paddingVertical:4,borderRadius:4},pendingBadgeText:{color:t.color.warning,fontSize:11,fontWeight:"600"},httpDuration:{flexDirection:"row",alignItems:"center",gap:4},httpDurationText:{color:t.color.textSecondary,fontSize:11},overrideBadge:{flexDirection:"row",alignItems:"center",gap:4,paddingHorizontal:6,paddingVertical:3,borderRadius:4,backgroundColor:t.color.warningSoft},overrideBadgeText:{color:t.color.warning,fontSize:10,fontWeight:"700"},copyFullButton:{marginLeft:"auto",flexShrink:0,padding:4},urlBreakdown:{backgroundColor:t.color.bg,borderRadius:4,padding:8},urlRow:{flexDirection:"row",alignItems:"center",gap:6,marginBottom:4},urlDomain:{color:t.color.text,fontSize:12,fontWeight:"600",flex:1},urlProtocol:{color:t.color.textTertiary,fontSize:10},copyButton:{padding:4},urlPathRow:{paddingLeft:18},urlPath:{color:t.color.textSecondary,fontSize:11,fontFamily:R},urlQueryString:{color:t.color.info,fontSize:11,fontFamily:R},queryParamsCollapsible:{marginTop:8},queryParamsToggle:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",paddingHorizontal:12,paddingVertical:10,backgroundColor:t.color.surfaceElevated,borderRadius:8,borderWidth:1,borderColor:t.color.border,marginBottom:8},queryParamsToggleText:{flexGrow:0,color:t.color.text,fontSize:12,fontWeight:"600",letterSpacing:.3},timingSection:{marginHorizontal:12,marginTop:8,backgroundColor:t.color.surface,borderRadius:8,borderWidth:1,borderColor:t.color.border,padding:12},timingRow:{flexDirection:"row",alignItems:"center",gap:6,flexWrap:"wrap"},timingLabel:{color:t.color.textSecondary,fontSize:11},timingValue:{color:t.color.text,fontSize:11,fontWeight:"600"},timingExact:{color:t.color.textTertiary,fontSize:10,marginLeft:4},sizeRow:{flexDirection:"row",alignItems:"center",gap:16,marginLeft:"auto"},sizeItem:{flexDirection:"row",alignItems:"center",gap:4},sizeLabel:{color:t.color.textTertiary,fontSize:10},sizeValue:{color:t.color.info,fontSize:10,fontFamily:R,fontWeight:"600"},phaseDivider:{height:1,backgroundColor:t.color.border,marginTop:12,marginBottom:12},phaseList:{gap:8},phaseRow:{flexDirection:"row",alignItems:"center",gap:14},phaseLabelGroup:{width:150},phaseLabel:{fontSize:12,color:t.color.textSecondary},phaseHint:{fontSize:10,color:t.color.textTertiary},phaseTrack:{flex:1,height:7,borderRadius:4,backgroundColor:t.color.surfaceElevated,justifyContent:"center",overflow:"hidden"},phaseBar:{height:7,borderRadius:4},phaseValue:{width:72,textAlign:"right",fontSize:12,fontFamily:R,color:t.color.text},collapsibleSection:{marginHorizontal:12,marginTop:8,backgroundColor:t.color.surface,borderRadius:8,borderWidth:1,borderColor:t.color.border,overflow:"hidden"},collapsibleHeader:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",padding:12,backgroundColor:t.color.surfaceElevated},collapsibleTitle:{flexDirection:"row",alignItems:"center",gap:8},collapsibleTitleText:{color:t.color.text,fontSize:13,fontWeight:"600"},collapsibleCount:{color:t.color.textTertiary,fontSize:11.5,fontFamily:R},collapsibleContent:{padding:12},dataViewerContainer:{marginTop:-12,marginHorizontal:-12,marginBottom:-12},bodyDeferred:{height:120},errorBox:{flexDirection:"row",alignItems:"center",gap:6,backgroundColor:t.color.dangerSoft,padding:8,borderRadius:4,marginTop:8},errorText:{color:t.color.danger,fontSize:11,flex:1},emptyText:{color:t.color.textTertiary,fontSize:12,fontStyle:"italic",textAlign:"center"},filterOptionsContainer:{gap:12},filterOption:{flexDirection:"row",alignItems:"center",justifyContent:"space-between",backgroundColor:t.color.surfaceElevated,borderRadius:8,padding:12,borderWidth:1,borderColor:t.color.border},filterOptionActive:{backgroundColor:t.color.warningSoft,borderColor:t.color.warning+"33"},filterOptionLeft:{flexDirection:"row",alignItems:"center",gap:12,flex:1},filterOptionContent:{flex:1},filterOptionLabel:{color:t.color.textSecondary,fontSize:11,marginBottom:2,textTransform:"uppercase",letterSpacing:.5},filterOptionValue:{color:t.color.text,fontSize:13,fontFamily:R},filterToggle:{paddingHorizontal:10,paddingVertical:6,borderRadius:4,backgroundColor:t.color.bg,borderWidth:1,borderColor:t.color.border},filterToggleActive:{backgroundColor:t.color.warningSoft,borderColor:t.color.warning+"4D"},filterToggleText:{fontSize:10,fontWeight:"600",color:t.color.textTertiary,letterSpacing:.5},filterToggleTextActive:{color:t.color.warning},filterInfoBox:{backgroundColor:t.color.infoSoft,borderRadius:6,padding:10,borderWidth:1,borderColor:t.color.info+"33"},filterInfoText:{color:t.color.textSecondary,fontSize:11,lineHeight:16}});
|