@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.
Files changed (133) hide show
  1. package/README.md +76 -2
  2. package/lib/commonjs/expo-network.js +1 -0
  3. package/lib/commonjs/index.js +1 -1
  4. package/lib/commonjs/index.web.js +1 -1
  5. package/lib/commonjs/netinfo.js +1 -0
  6. package/lib/commonjs/network/components/NetworkEventDetailView.js +2 -2
  7. package/lib/commonjs/network/components/NetworkEventDetailView.web.js +2 -2
  8. package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -2
  9. package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +1 -1
  10. package/lib/commonjs/network/components/NetworkModal.js +1 -1
  11. package/lib/commonjs/network/components/sockets/NetworkSocketsButton.js +1 -0
  12. package/lib/commonjs/network/components/sockets/NetworkSocketsScreen.js +1 -0
  13. package/lib/commonjs/network/components/sockets/SocketFrameView.js +1 -0
  14. package/lib/commonjs/network/components/sockets/SocketListView.js +1 -0
  15. package/lib/commonjs/network/components/sockets/SocketRows.js +1 -0
  16. package/lib/commonjs/network/components/sockets/SocketTricksView.js +1 -0
  17. package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -1
  18. package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -1
  19. package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -1
  20. package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -1
  21. package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -1
  22. package/lib/commonjs/network/conditions/connectivity/netInfoFacade.js +1 -0
  23. package/lib/commonjs/network/conditions/connectivity/patchNetwork.js +1 -0
  24. package/lib/commonjs/network/conditions/pacer.js +1 -0
  25. package/lib/commonjs/network/conditions/profiles.js +1 -0
  26. package/lib/commonjs/network/conditions/remoteState.js +1 -0
  27. package/lib/commonjs/network/conditions/store.js +1 -1
  28. package/lib/commonjs/network/conditions/wait.js +1 -1
  29. package/lib/commonjs/network/conditions/xhr.js +1 -1
  30. package/lib/commonjs/network/hooks/useSocketsState.js +1 -0
  31. package/lib/commonjs/network/overrides/engine.js +1 -1
  32. package/lib/commonjs/network/overrides/matchRule.js +1 -1
  33. package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -1
  34. package/lib/commonjs/network/sockets/findProblems.js +1 -0
  35. package/lib/commonjs/network/sockets/foldFrames.js +1 -0
  36. package/lib/commonjs/network/sockets/format.js +1 -0
  37. package/lib/commonjs/network/sockets/readMessage.js +1 -0
  38. package/lib/commonjs/network/sockets/socketMoments.js +1 -0
  39. package/lib/commonjs/network/sockets/socketStore.js +1 -0
  40. package/lib/commonjs/network/sockets/socketsSyncAdapter.js +1 -0
  41. package/lib/commonjs/network/sockets/types.js +1 -0
  42. package/lib/commonjs/network/sockets/webSocketPatch.js +1 -0
  43. package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -1
  44. package/lib/commonjs/network/utils/generateNetworkCopyText.js +1 -0
  45. package/lib/commonjs/network/utils/networkEventStore.js +1 -1
  46. package/lib/commonjs/network/utils/networkListener.js +4 -4
  47. package/lib/commonjs/network/utils/startNetworkCapture.js +1 -1
  48. package/lib/commonjs/preset.js +1 -1
  49. package/lib/module/expo-network.js +1 -0
  50. package/lib/module/index.js +1 -1
  51. package/lib/module/index.web.js +1 -1
  52. package/lib/module/netinfo.js +1 -0
  53. package/lib/module/network/components/NetworkEventDetailView.js +2 -2
  54. package/lib/module/network/components/NetworkEventDetailView.web.js +2 -2
  55. package/lib/module/network/components/NetworkEventItemCompact.js +2 -2
  56. package/lib/module/network/components/NetworkEventItemCompact.web.js +1 -1
  57. package/lib/module/network/components/NetworkModal.js +1 -1
  58. package/lib/module/network/components/sockets/NetworkSocketsButton.js +1 -0
  59. package/lib/module/network/components/sockets/NetworkSocketsScreen.js +1 -0
  60. package/lib/module/network/components/sockets/SocketFrameView.js +1 -0
  61. package/lib/module/network/components/sockets/SocketListView.js +1 -0
  62. package/lib/module/network/components/sockets/SocketRows.js +1 -0
  63. package/lib/module/network/components/sockets/SocketTricksView.js +1 -0
  64. package/lib/module/network/conditions/NetworkConditionsControl.js +1 -1
  65. package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -1
  66. package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -1
  67. package/lib/module/network/conditions/NetworkFloatingTool.js +1 -1
  68. package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -1
  69. package/lib/module/network/conditions/connectivity/netInfoFacade.js +1 -0
  70. package/lib/module/network/conditions/connectivity/patchNetwork.js +1 -0
  71. package/lib/module/network/conditions/pacer.js +1 -0
  72. package/lib/module/network/conditions/profiles.js +1 -0
  73. package/lib/module/network/conditions/remoteState.js +1 -0
  74. package/lib/module/network/conditions/store.js +1 -1
  75. package/lib/module/network/conditions/wait.js +1 -1
  76. package/lib/module/network/conditions/xhr.js +1 -1
  77. package/lib/module/network/hooks/useSocketsState.js +1 -0
  78. package/lib/module/network/overrides/engine.js +1 -1
  79. package/lib/module/network/overrides/matchRule.js +1 -1
  80. package/lib/module/network/overrides/overrideRulesStore.js +1 -1
  81. package/lib/module/network/sockets/findProblems.js +1 -0
  82. package/lib/module/network/sockets/foldFrames.js +1 -0
  83. package/lib/module/network/sockets/format.js +1 -0
  84. package/lib/module/network/sockets/readMessage.js +1 -0
  85. package/lib/module/network/sockets/socketMoments.js +1 -0
  86. package/lib/module/network/sockets/socketStore.js +1 -0
  87. package/lib/module/network/sockets/socketsSyncAdapter.js +1 -0
  88. package/lib/module/network/sockets/types.js +1 -0
  89. package/lib/module/network/sockets/webSocketPatch.js +1 -0
  90. package/lib/module/network/sync/networkSyncAdapter.js +1 -1
  91. package/lib/module/network/utils/generateNetworkCopyText.js +23 -22
  92. package/lib/module/network/utils/networkEventStore.js +1 -1
  93. package/lib/module/network/utils/networkListener.js +4 -4
  94. package/lib/module/network/utils/startNetworkCapture.js +1 -1
  95. package/lib/module/preset.js +1 -1
  96. package/lib/typescript/expo-network.d.ts +2 -0
  97. package/lib/typescript/index.d.ts +14 -2
  98. package/lib/typescript/index.web.d.ts +7 -2
  99. package/lib/typescript/netinfo.d.ts +3 -0
  100. package/lib/typescript/network/components/sockets/NetworkSocketsButton.d.ts +17 -0
  101. package/lib/typescript/network/components/sockets/NetworkSocketsScreen.d.ts +19 -0
  102. package/lib/typescript/network/components/sockets/SocketFrameView.d.ts +9 -0
  103. package/lib/typescript/network/components/sockets/SocketListView.d.ts +9 -0
  104. package/lib/typescript/network/components/sockets/SocketRows.d.ts +19 -0
  105. package/lib/typescript/network/components/sockets/SocketTricksView.d.ts +23 -0
  106. package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts +5 -2
  107. package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts +4 -3
  108. package/lib/typescript/network/conditions/connectivity/netInfoFacade.d.ts +3 -0
  109. package/lib/typescript/network/conditions/connectivity/patchNetwork.d.ts +24 -0
  110. package/lib/typescript/network/conditions/pacer.d.ts +16 -0
  111. package/lib/typescript/network/conditions/profiles.d.ts +57 -0
  112. package/lib/typescript/network/conditions/remoteState.d.ts +4 -0
  113. package/lib/typescript/network/conditions/store.d.ts +45 -19
  114. package/lib/typescript/network/conditions/xhr.d.ts +1 -1
  115. package/lib/typescript/network/hooks/useSocketsState.d.ts +3 -0
  116. package/lib/typescript/network/overrides/engine.d.ts +14 -0
  117. package/lib/typescript/network/overrides/matchRule.d.ts +3 -0
  118. package/lib/typescript/network/overrides/overrideRulesStore.d.ts +22 -0
  119. package/lib/typescript/network/overrides/types.d.ts +33 -0
  120. package/lib/typescript/network/sockets/findProblems.d.ts +31 -0
  121. package/lib/typescript/network/sockets/foldFrames.d.ts +50 -0
  122. package/lib/typescript/network/sockets/format.d.ts +19 -0
  123. package/lib/typescript/network/sockets/readMessage.d.ts +41 -0
  124. package/lib/typescript/network/sockets/socketMoments.d.ts +24 -0
  125. package/lib/typescript/network/sockets/socketStore.d.ts +94 -0
  126. package/lib/typescript/network/sockets/socketsSyncAdapter.d.ts +66 -0
  127. package/lib/typescript/network/sockets/types.d.ts +139 -0
  128. package/lib/typescript/network/sockets/webSocketPatch.d.ts +57 -0
  129. package/lib/typescript/network/sync/networkSyncAdapter.d.ts +29 -12
  130. package/lib/typescript/network/types/index.d.ts +6 -0
  131. package/lib/typescript/network/utils/networkListener.d.ts +10 -0
  132. package/lib/web/index.mjs +60 -59
  133. 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(g){const e=globalThis.__buoyHeaderInjectors;if(!e||e.length===0)return void 0;let t;for(const r of e){try{const c=r(g);if(c)t={...t,...c}}catch{}}return t}function devServerOrigin(){if(devOrigin!==void 0)return devOrigin;devOrigin=null;try{if(typeof __DEV__!=="undefined"&&!__DEV__)return devOrigin;const g=require("react-native");const e=g?.NativeModules?.SourceCode;const t=e?.getConstants?.().scriptURL??e?.scriptURL;if(typeof t==="string"&&/^https?:\/\//.test(t)){const r=new URL(t);devOrigin=`${r.protocol}//${r.host}`}}catch{devOrigin=null}return devOrigin}let insideFetchHandoff=false;function headersToRecord(g){const e={};if(!g)return e;if(typeof Headers!=="undefined"&&g instanceof Headers)g.forEach((t,r)=>{e[r]=t});else if(Array.isArray(g))for(const[t,r]of g)e[t]=r;else Object.assign(e,g);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 g=globalThis.document;angularPageSeen=!!g?.querySelector?.("[ng-version]");return angularPageSeen}function isStreamedContentType(g){if(!g)return false;const e=g.toLowerCase();return STREAMED_CONTENT_TYPES.some(t=>e.includes(t))}const INTERNAL_HOSTS_KEY="__BUOY_INTERNAL_HOSTS__";function isInternalBuoyHost(g){const e=globalThis[INTERNAL_HOSTS_KEY];if(!(e instanceof Set)||e.size===0)return false;let t;try{t=new URL(g).host.toLowerCase()}catch{return false}for(const r of e){if(typeof r==="string"&&r&&t===r.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 r=t.hostname==="localhost"||t.hostname==="127.0.0.1"||t.hostname==="10.0.2.2";if(r&&["8081","8802"].includes(t.port))return true;const c=devServerOrigin();if(c&&`${t.protocol}//${t.host}`===c)return true}catch{return false}return isInternalBuoyHost(e)}emit(e){this.listeners.forEach(t=>{try{t(e)}catch(r){}})}parseUrl(e){let t=null;const r=e.indexOf("?");if(r>-1){t={};e.substring(r+1).split("&").forEach(c=>{const[a,n]=c.split("=");if(a&&n!==void 0){t[a]=decodeURIComponent(n.replace(/\+/g," "))}})}return{url:r>-1?e.substring(0,r):e,params:t}}async readStreamedBody(e,t=256*1024){const r=e.body;if(!r||typeof r.getReader!=="function"){const f=await e.text();return f.length>t?{body:`${f.slice(0,t)}
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 c=r.getReader();const a=new TextDecoder;let n="";let l=0;let m=false;try{for(;;){const{done:f,value:i}=await c.read();if(f)break;l+=i?.byteLength??0;if(!m){n+=a.decode(i,{stream:true});if(l>=t){n=`${n.slice(0,t)}
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]`;m=true;break}}}if(!m)n+=a.decode()}finally{try{void Promise.resolve(c.cancel()).catch(()=>{})}catch{}try{c.releaseLock()}catch{}}return{body:n,size:l}}async processResponseBody(e,t=1024*1024){try{const r=e.headers.get("content-length");if(r){const n=parseInt(r,10);if(!isNaN(n)&&n>t){return{body:`[Response too large: ${this.formatBytes(n)}]`,size:n,truncated:true}}}const c=await e.text();const a=c.length;if(a>t){const n=c.substring(0,t);const l=a-t;return{body:`${n}
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()}}
@@ -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();
@@ -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";
@@ -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 H,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 F}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]=H(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=L=>{try{const y=new URL(L);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]=H(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(F,{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]=H(false);U(()=>{if(c&&g){f(false)}},[c,g]);const k=ye();const L=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]=H(null);const[m,w]=H(false);U(()=>{V(null);if(!k||!L&&!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,L,y,x]);const b=r.requestData??C?.requestData??void 0;const z=r.responseData??C?.responseData??void 0;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
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}});