@fkn/lib 0.4.2 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.cjs +5 -5
- package/index.d.ts +30 -7
- package/index.js +170 -147
- package/package.json +1 -1
package/index.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./locator-jHaMLjtv.cjs`);let t=require(`osra`),n=require(`stream`),r=require(`events`),i=require(`ip-address`),a=require(`buffer`);var o=`FKN_WEB_EXTENSION_MAIN_WORLD_CONTENT_SCRIPT_ENABLED_EVENT_KEY`,s=`fknExtension`,c=(0,t.createTypedEventTarget)();typeof document<`u`&&document.addEventListener(o,e=>{c.dispatchEvent(new CustomEvent(`statuschange`,{detail:{enabled:e.detail.enabled}}))});var l=()=>typeof document>`u`?!1:document.documentElement.dataset[s]===`true`,u=null,d=e=>{u=e},ee=150,f=(e=1e3)=>new Promise((t,n)=>{if(l())return t();let r,i=e=>{clearTimeout(r),s.disconnect(),document.removeEventListener(`readystatechange`,c),e()},a=()=>i(async()=>{if(u&&(await u().catch(()=>{}),l()))return t();n(Error(`The FKN WebExtension is not installed, enabled or not exposed on this page.`))}),o=()=>{clearTimeout(r),r=setTimeout(()=>l()?i(t):a(),ee)},s=new MutationObserver(()=>{l()&&i(t)}),c=()=>{document.readyState===`complete`&&!l()&&o()};if(r=setTimeout(a,e),s.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-fkn-extension`]}),document.addEventListener(`readystatechange`,c),document.readyState===`complete`)return o();l()&&i(t)}),te,p=new Proxy({},{get:(n,r)=>async(...n)=>{await f(),te??=(0,t.expose)({},{transport:window,revivableModules:e.l});let i=(await te)[r];return i(...n)}}),m={scope:`network.fetch`,category:`network`,severity:0,title:`Fetch data from other sites`,description:`Lets the app download public data from other websites directly, past the usual cross-origin limits.`},ne={scope:`network.fetchCredentialed`,category:`network`,severity:3,unsafe:!0,title:`Fetch from other sites, signed in as you`,description:`Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see.`},re=[`fkn.app`,`fkn.dev`],h=e=>{let t;try{t=new URL(e)}catch{return!1}if(t.protocol===`chrome-extension:`||t.protocol===`moz-extension:`)return!0;let n=t.hostname;return re.some(e=>n===e||n.endsWith(`.${e}`))},g=e=>{if(h(e))throw Error(`fetch: refusing to target the extension's own pages or FKN platform domains`)},ie=[`origin`,`referer`],ae=e=>{if(!e?.headers)return;let t=new Headers(e.headers),n=ie.map(e=>{let n=t.get(e);return n===null?void 0:[e,n]}).filter(e=>e!==void 0);return n.length?n:void 0},_=async(e,t)=>{let n=new Request(e,t);g(n.url);let r=n.body?await n.arrayBuffer():null;return p.proxyFetch({url:n.url,method:n.method,headers:[...n.headers],body:r,credentials:t?.credentials===`include`?`include`:`omit`,redirect:n.redirect,unsafeHeaders:ae(t),reason:t?.reason,signal:t?.signal??void 0})},v={scope:`network.readCookie`,category:`network`,severity:3,unsafe:!0,title:`Read a site’s cookie`,description:`Lets the app read a named cookie from another site, which can include the login token only that site should see.`},y={get:e=>p.getCookie(e)},oe={scope:`network.modifyRequestHeaders`,category:`network`,severity:2,unsafe:!0,title:`Rewrite request headers to other sites`,description:`Lets the app set or remove headers (like Origin and Referer) on this page’s own requests to the listed sites.`},se=e=>p.setRequestHeaderRule(e),ce=e=>p.removeRequestHeaderRule({ruleId:e});(()=>{let t={},n=[...e.t.selectorModules,...e.i.selectorModules];for(let e of n)e.render&&!(e.type in t)&&(t[e.type]=e.render);return t})();var b=`FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY`,x=e=>{if(!e||e===`about:blank`)return!1;let t;try{t=new URL(e,location.href)}catch{return!1}if(t.protocol===`chrome-extension:`||t.protocol===`moz-extension:`)return!0;if(t.protocol===`about:`)return!1;let n=t.hostname;return n===`fkn.app`||n.endsWith(`.fkn.app`)},S=e=>{if(x(e))throw Error(`attachFrame: refusing to target the extension's own pages or fkn.app`)},le={scope:`embed.iframe`,category:`embed`,severity:0,title:`Load another website inside this app`,description:`Lets the app embed external pages directly inside its own view.`},ue={scope:`embed.open`,category:`embed`,severity:0,title:`Open a website inside this app`,description:`Lets the app navigate to another site without leaving its window.`},de=async({iframe:t,domains:n=[]})=>{let r=crypto.randomUUID();if(S(t.src),await f(),!t.isConnected)throw Error(`attachFrame: the iframe must be connected to the document before attaching`);t.dispatchEvent(new CustomEvent(b,{detail:r}));let{executeLocator:i,ensureLocatorPermission:a,goto:o}=await p.attachFrame({marker:r,domains:n}),s=e.r(i,a),c=(e,t={})=>(S(e),o({url:e,...t})),l=()=>t.src;return{...s,goto:c,url:l}},fe={request:e=>p.requestPermissions(e.map(e=>({key:e.key,scope:e.scope??``,reason:e.reason})))},pe=32,me=typeof CSS<`u`&&CSS.supports(`clip-path`,`path('M0 0H1V1H0Z')`),he=e=>{let t=e.style;t.setProperty(`display`,`block`,`important`),t.setProperty(`position`,`fixed`,`important`),t.setProperty(`top`,`0`,`important`),t.setProperty(`left`,`0`,`important`),t.setProperty(`width`,`100%`,`important`),t.setProperty(`height`,`100%`,`important`),t.setProperty(`border`,`none`,`important`),t.setProperty(`clip-path`,`inset(100%)`,`important`),t.setProperty(`background`,`transparent`),t.setProperty(`color-scheme`,`normal`),t.setProperty(`z-index`,`2147483647`),e.setAttribute(`title`,`FKN`)},ge=({x:e,y:t,width:n,height:r})=>`M${e} ${t}h${n}v${r}h${-n}Z`,_e=(e,{modal:t,rects:n})=>{if(!me){let r=t||n.length>0;e.style.setProperty(`pointer-events`,r?`auto`:`none`,`important`),e.style.setProperty(`visibility`,r?`visible`:`hidden`,`important`);return}let r=t?`none`:n.length===0?`inset(100%)`:`path('${n.map(ge).join(``)}')`,i=r===`none`||CSS.supports(`clip-path`,r)?r:`inset(100%)`;e.style.setProperty(`clip-path`,i,`important`)},ve=e=>{if(typeof e!=`object`||!e)return null;let{x:t,y:n,width:r,height:i}=e;if(![t,n,r,i].every(e=>typeof e==`number`&&Number.isFinite(e)))return null;let a=window.innerWidth,o=window.innerHeight,s=Math.max(0,Math.min(Math.round(t),a)),c=Math.max(0,Math.min(Math.round(n),o)),l=Math.max(s,Math.min(Math.round(t+r),a)),u=Math.max(c,Math.min(Math.round(n+i),o));return{x:s,y:c,width:l-s,height:u-c}},ye=e=>{if(typeof e!=`object`||!e)return null;let t=e,n=(Array.isArray(t.rects)?t.rects.slice(0,pe):[]).map(ve).filter(e=>e!==null&&e.width>0&&e.height>0);return{modal:t.modal===!0,rects:n}},C=null,be=()=>C!==null,xe=e=>{he(e),_e(e,{modal:!1,rects:[]}),C=e},Se=e=>{if(!C)return;let t=ye(e);t&&_e(C,t)},Ce=`https://fkn.app`,w=typeof globalThis<`u`&&globalThis.document?globalThis.document:void 0,we=w?.querySelector(`iframe[src="${Ce}/api"]`)??null,T=w?.createElement(`iframe`)??null;!we&&T&&w&&(T.src=`${Ce}/api`,w.body.appendChild(T));var E=we??T,D=E?.contentWindow??null;E&&w&&xe(E);var O=(()=>{if(typeof window<`u`)return D?{receive:window,emit:D}:void 0;if(typeof self<`u`)return{receive:self,emit:self}})(),Te=O!==void 0,k=O?(0,t.expose)({},{key:`fkn-api`,transport:O}):new Promise(()=>{});k.then(e=>{be()&&e.overlay.setHost(Se)},()=>{});var Ee=[`fkn.app`,`fkn.dev`],A=e=>{let t=typeof e==`string`?e:e instanceof URL?e.href:e.url,n;try{n=new URL(t)}catch{return}let r=n.hostname;if(Ee.some(e=>r===e||r.endsWith(`.${e}`)))throw Error(`fetch refuses FKN platform domains (${r})`)},j=(e,t)=>(A(e),k.then(n=>n.cloud.fetch(e,t))),De=async()=>{let e=await k.then(e=>e.cloud.quota());return{premium:e.premium,overQuota:e.overQuota,throttled:e.overQuota&&!e.premium,usedBytes:e.usedBytes,limitBytes:e.limitBytes,remainingBytes:e.remaining,bytesPerSecond:e.bytesPerSecond,bitsPerSecond:e.bytesPerSecond*8}},Oe=e.g({lookup:()=>ke}),ke=(e,t)=>k.then(n=>n.cloud.dns.lookup(e,t)),Ae=new TextEncoder;new TextDecoder;var M=e=>i.Address4.isValid(e),N=e=>i.Address6.isValid(e),je=e=>M(e)?4:N(e)?6:0,Me=(...e)=>{if(typeof e[0]==`string`)throw Error(`FKN WebVPN does not support IPC connections`);let t=typeof e.at(-1)==`function`?e.at(-1):void 0;return e[0]&&typeof e[0]==`object`?{...e[0],callback:t}:{port:e[0]??0,host:typeof e[1]==`string`?e[1]:void 0,callback:t}},Ne=(...e)=>{let t=typeof e.at(-1)==`function`?e.at(-1):void 0,n=e[0]??0,r=typeof e[1]==`string`?e[1]:void 0;return typeof e[0]==`object`?{...e[0],address:e[0].address??r,port:e[0].port??n,callback:t}:{address:r,port:n,callback:t}},Pe=(...e)=>{let t=typeof e.at(-1)==`function`?e.at(-1):void 0,n=e[0];if(typeof e[2]==`number`)return{message:n,offset:e[1],length:e[2],port:typeof e[3]==`number`?e[3]:0,address:typeof e[4]==`string`?e[4]:void 0,callback:t};{let r=typeof e[1]==`number`?e[1]:0,i=typeof e[2]==`string`?e[2]:void 0;return{message:n,offset:0,length:n.length,port:r,address:i,callback:t}}};new TextEncoder,new TextDecoder;var Fe=e.g({Server:()=>F,Socket:()=>P,_default:()=>Re,connect:()=>I,createConnection:()=>Ie,createServer:()=>Le,default:()=>Re,isIP:()=>je,isIPv4:()=>M,isIPv6:()=>N}),P=class extends n.Stream.Duplex{_localAddress;_remoteAddress;_webVPNTcpSocketPromise;constructor(e){if(e?.fd!==void 0)throw Error(`FKN WebVPN does not support file descriptors`);super(e),e?.connection&&this.__webvpn_tcp_socket_init__(e.connection)}__webvpn_tcp_socket_init__(e){if(this._webVPNTcpSocketPromise=e.then(e=>{let t=e.dataReadableStream.getReader(),n=e.dataWritableStream.getWriter();return this._localAddress={address:e.localAddress,family:e.localFamily,port:e.localPort},this._remoteAddress={address:e.remoteAddress,family:e.remoteFamily,port:e.remotePort},{...e,reader:t,writer:n}}).catch(e=>{this.emit(`error`,e)}),!this._webVPNTcpSocketPromise)throw Error(`Socket not connected`);return this._webVPNTcpSocketPromise.then(e=>{e&&this.emit(`connect`)}),this._webVPNTcpSocketPromise}_read(e){if(!this._webVPNTcpSocketPromise)throw Error(`Socket not connected`);this._webVPNTcpSocketPromise.then(e=>{if(!e){this.push(null);return}e.reader.read().then(({value:e,done:t})=>{if(t){this.push(null);return}this._restartTimeoutTimer(),this.push(e)}).catch(e=>{this.destroy(e)})})}_write(e,t,n){if(!this._webVPNTcpSocketPromise){n(Error(`Socket not connected`));return}this._webVPNTcpSocketPromise.then(async t=>{if(!t)throw Error(`Socket not connected`);await t.writer.ready,await t.writer.write(e),this._restartTimeoutTimer(),n()}).catch(n)}connect(...e){let t=Me(...e),n=this.__webvpn_tcp_socket_init__(k.then(e=>e.cloud.webvpn.tcpSocket({remoteAddress:t.host??`localhost`,remotePort:t.port})));return t.callback&&n.then(e=>{e&&t.callback.call(this)}),this}_end(...e){return this._webVPNTcpSocketPromise?(e.length!==0&&this.write(e[0],e[1],e[2]),this._webVPNTcpSocketPromise.then(async e=>{e&&await e.end()}),this):this}_destroy(e){return this._timeoutTimer&&clearTimeout(this._timeoutTimer),this._webVPNTcpSocketPromise&&this._webVPNTcpSocketPromise.then(async e=>{e&&await e.destroy()}),this}destroySoon(){this._webVPNTcpSocketPromise&&this._webVPNTcpSocketPromise.then(async e=>{e&&await e.destroySoon()})}resetAndDestroy(){return this._webVPNTcpSocketPromise&&this._webVPNTcpSocketPromise.then(async e=>{e&&await e.resetAndDestroy()}),this}_timeoutMs;_timeoutTimer;_restartTimeoutTimer(){this._timeoutTimer&&clearTimeout(this._timeoutTimer),this._timeoutMs&&(this._timeoutTimer=setTimeout(()=>this.emit(`timeout`),this._timeoutMs))}setTimeout(e,t){return t&&this.on(`timeout`,t),this._timeoutMs=e,this._restartTimeoutTimer(),this}setNoDelay(e){let t=e??!0;return this._setTcpOption({type:0,value:t}),this}setKeepAlive(e,t){let n=e??!1,r=t!==void 0&&t>0?Math.max(1,Math.round(t/1e3)):0;return this._setTcpOption({type:2,enabled:n,initialDelaySeconds:r}),this}setSendBufferSize(e){return this._setTcpOption({type:3,value:e}),this}setRecvBufferSize(e){return this._setTcpOption({type:4,value:e}),this}_typeOfService;getTypeOfService(){return this._typeOfService??0}setTypeOfService(e){return this._typeOfService=e,this}_setTcpOption(e){if(!this._webVPNTcpSocketPromise){this.emit(`error`,Error(`Cannot set socket option before connect`));return}this._webVPNTcpSocketPromise.then(async t=>{if(t)try{await t.setOption(e)}catch(e){this.emit(`error`,e)}})}write(e,t,...n){return super.write(e,t,...n)}address(){return this._localAddress??{}}unref(){return this}ref(){return this}autoSelectFamilyAttemptedAddresses;bufferSize;bytesRead;bytesWritten;connecting;pending;get localAddress(){if(!this._localAddress)throw Error(`Socket is not connected`);return this._localAddress.address}get localPort(){if(!this._localAddress)throw Error(`Socket is not connected`);return this._localAddress.port}get localFamily(){if(!this._localAddress)throw Error(`Socket is not connected`);return this._localAddress.family}readyState;get remoteAddress(){if(!this._remoteAddress)throw Error(`Socket is not connected`);return this._remoteAddress.address}get remotePort(){if(!this._remoteAddress)throw Error(`Socket is not connected`);return this._remoteAddress.port}get remoteFamily(){if(!this._remoteAddress)throw Error(`Socket is not connected`);return this._remoteAddress.family}timeout},F=class extends r.EventEmitter{_localAddress;_webVPNTcpSocketListenerPromise;constructor(e,t){super(e),t&&this.on(`connection`,t),e?.connection&&this.__webvpn_tcp_socket_listener_init__(e.connection)}__webvpn_tcp_socket_listener_init__(e){return this._webVPNTcpSocketListenerPromise=e.then(e=>(this._localAddress={address:e.localAddress,family:e.localFamily,port:e.localPort},e)).catch(e=>{this.emit(`error`,e)}),this._webVPNTcpSocketListenerPromise.then(e=>{e&&this.emit(`listening`)}),this._webVPNTcpSocketListenerPromise}listen(...e){let t=Me(...e),n=e=>{let t=new P({connection:Promise.resolve(e)});this.emit(`connection`,t)},r=e=>k.then(r=>r.cloud.webvpn.tcpSocketListener({localAddress:e,localPort:t.port,onConnection:n})),i=t.host?r(t.host):r(`::`).catch(()=>r(`0.0.0.0`)),a=this.__webvpn_tcp_socket_listener_init__(i);return t.callback&&a.then(e=>{e&&t.callback.call(this)}),this}close(e){return this._webVPNTcpSocketListenerPromise&&this._webVPNTcpSocketListenerPromise.then(async t=>{if(t)try{await t.close(),this._localAddress=void 0,this.emit(`close`),e&&e()}catch(t){this._localAddress=void 0,this.emit(`close`),e&&e(t)}}),this}address(){return this._localAddress??null}getConnections(e){throw Error(`Method not implemented.`)}ref(){return this}unref(){return this}maxConnections;connections;listening;async[Symbol.asyncDispose](){}},I=(e,t)=>new P().connect(e,t),Ie=(e,t)=>new P().connect(e,t),Le=(e,t)=>{typeof e==`function`&&(t=e,e=void 0);let n=new F(e);return t&&n.on(`connection`,t),n},Re={Socket:P,Server:F,connect:I,createConnection:Ie,createServer:Le,isIP:je,isIPv4:M,isIPv6:N},ze=e.g({Socket:()=>Be,createSocket:()=>Ue}),Be=class extends r.EventEmitter{_type;_localAddress;_remoteAddress;_webVPNUdpSocketPromise;_dataPort;_socketId;_sendQueue=[];_sendQueueBytes=0;_sendFlushScheduled=!1;_peerTailCache=new Map;constructor(e){if(super(e),!e)throw Error(`Missing options`);this._type=e.type}_lastRecvBufferSize=0;_lastSendBufferSize=0;_lastTtl=64;_lastMulticastTtl=1;_lastMulticastLoopback=!0;_setUdpOption(e){if(!this._webVPNUdpSocketPromise){this.emit(`error`,Error(`Cannot set socket option before bind`));return}this._webVPNUdpSocketPromise.then(async t=>{if(t)try{await t.setOption(e)}catch(e){this.emit(`error`,e)}})}_onDataPortBatch(e){let t=new DataView(e),n=0;for(;n+4<=e.byteLength;){let r=t.getUint32(n);n+=4;let i=n+r;if(i>e.byteLength)break;let o=n+4,s=t.getUint8(o);o+=1;let c,l,u;if(s===2){if(!this._remoteAddress){n=i;continue}c=this._remoteAddress.address,l=this._remoteAddress.family,u=this._remoteAddress.port}else{let n=new Uint8Array(e,o,s===0?4:16);if(s===0)l=`IPv4`,c=`${n[0]}.${n[1]}.${n[2]}.${n[3]}`;else{l=`IPv6`;let e=[];for(let t=0;t<16;t+=2)e.push(((n[t]<<8|n[t+1])>>>0).toString(16));c=e.join(`:`)}o+=n.byteLength,u=t.getUint16(o),o+=2}let d=t.getUint32(o);o+=4,this.emit(`message`,a.Buffer.from(e.slice(o,o+d)),{address:c,family:l,port:u,size:d}),n=i}}_peerTail(e,t){if(e===void 0||t===void 0)return Ve;let n=`${e}|${t}`,r=this._peerTailCache.get(n);if(r)return r;let a=i.Address4.isValid(e)?L(e):R(e),o=new Uint8Array(1+a.byteLength+2);return o[0]=a.byteLength===4?0:1,o.set(a,1),new DataView(o.buffer).setUint16(1+a.byteLength,t),this._peerTailCache.set(n,o),o}_portSend(e,t,n){let r=this._peerTail(t,n),i=new Uint8Array(8+r.byteLength+4+e.byteLength),a=new DataView(i.buffer);a.setUint32(0,i.byteLength-4),a.setUint32(4,this._socketId),i.set(r,8),a.setUint32(8+r.byteLength,e.byteLength),i.set(e,12+r.byteLength),this._sendQueue.push(i),this._sendQueueBytes+=i.byteLength,!this._sendFlushScheduled&&(this._sendFlushScheduled=!0,queueMicrotask(()=>{this._sendFlushScheduled=!1;let e=this._sendQueue,t=this._sendQueueBytes;if(this._sendQueue=[],this._sendQueueBytes=0,!e.length||!this._dataPort)return;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.byteLength;this._dataPort.postMessage(n.buffer,[n.buffer])}))}addMembership(e,t){if(i.Address4.isValid(e)){let n=L(e),r=t&&i.Address4.isValid(t)?L(t):new Uint8Array([0,0,0,0]);this._setUdpOption({type:5,group:n,interface:r})}else if(i.Address6.isValid(e)){let t=R(e);this._setUdpOption({type:7,group:t,ifIndex:0})}else this.emit(`error`,Error(`Invalid multicast address: ${e}`))}address(){if(!this._localAddress)throw Error(`EBADF`);return this._localAddress}bind(...e){let t=Ne(...e),n=this._type===`udp6`?`::`:`0.0.0.0`;return this._webVPNUdpSocketPromise=k.then(e=>e.cloud.webvpn.udpSocket({type:this._type,address:t.address??n,port:t.port,dataPort:!0})).then(e=>{if(e.dataPort)this._socketId=e.socketId,this._dataPort=e.dataPort,this._dataPort.onmessage=e=>this._onDataPortBatch(e.data);else{let t=e.dataReadableStream.getReader(),n=async()=>{let{value:e,done:r}=await t.read();r||(this.emit(`message`,a.Buffer.from(e.data),{address:e.address,family:e.family,port:e.port,size:e.size}),n())};n()}return this._localAddress={address:e.localAddress,family:e.localFamily,port:e.localPort},e}).catch(e=>{this.emit(`error`,e)}),this._webVPNUdpSocketPromise.then(e=>{e&&this.emit(`listening`)}),t.callback&&this._webVPNUdpSocketPromise.then(e=>{e&&t.callback.call(this)}),this}close(e){if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);return this._webVPNUdpSocketPromise.then(async t=>{if(!t)throw Error(`Socket not bound`);this._dataPort?.close(),this._dataPort=void 0,await t.close(),e&&e(),this.emit(`close`)}),this}connect(...e){if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);this._webVPNUdpSocketPromise.then(async t=>{if(!t)throw Error(`Socket not bound`);let n=e[0],r=this._type===`udp6`?`::1`:`127.0.0.1`,i=typeof e[1]==`string`?e[1]:r,a=typeof e.at(-1)==`function`?e.at(-1):void 0;await t.connect({remotePort:n,remoteAddress:i}),this._remoteAddress={address:i,family:this._type===`udp6`?`IPv6`:`IPv4`,port:n},a&&a()})}disconnect(){if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);this._webVPNUdpSocketPromise.then(async e=>{if(!e)throw Error(`Socket not bound`);await e.connect({remotePort:0,remoteAddress:this._type===`udp4`?`0.0.0.0`:`::`})})}dropMembership(e,t){if(i.Address4.isValid(e)){let n=L(e),r=t&&i.Address4.isValid(t)?L(t):new Uint8Array([0,0,0,0]);this._setUdpOption({type:6,group:n,interface:r})}else if(i.Address6.isValid(e)){let t=R(e);this._setUdpOption({type:8,group:t,ifIndex:0})}else this.emit(`error`,Error(`Invalid multicast address: ${e}`))}getRecvBufferSize(){return this._lastRecvBufferSize}getSendBufferSize(){return this._lastSendBufferSize}getSendQueueSize(){return 0}getSendQueueCount(){return 0}ref(){return this}remoteAddress(){if(!this._remoteAddress)throw Error(`ERR_SOCKET_DGRAM_NOT_CONNECTED`);return{address:this._remoteAddress.address,family:this._remoteAddress.family,port:this._remoteAddress.port}}send(...e){this._webVPNUdpSocketPromise||this.bind();let t=Pe(...e),n=this._type===`udp6`?`::1`:`127.0.0.1`;if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);this._webVPNUdpSocketPromise.then(e=>{if(!e)throw Error(`Socket not bound`);let r=He(t.message),a=t.callback,o=t.address??n,s=this._remoteAddress!==void 0&&t.address===void 0;if(this._dataPort&&(s||i.Address4.isValid(o)||i.Address6.isValid(o))){this._portSend(r,s?void 0:o,s?void 0:t.port),a?.call(this,null,r.byteLength);return}e.send({...t,address:o,message:r.byteOffset===0&&r.byteLength===r.buffer.byteLength?r.buffer:r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength)}).then(()=>a?.call(this,null,r.byteLength),e=>a?a.call(this,e,0):this.emit(`error`,e))})}setBroadcast(e){this._setUdpOption({type:0,value:e})}setMulticastInterface(e){}setMulticastLoopback(e){return this._setUdpOption({type:3,value:e}),this._setUdpOption({type:4,value:e}),this._lastMulticastLoopback=e,e}setMulticastTTL(e){return this._setUdpOption({type:2,value:e}),this._lastMulticastTtl=e,e}setRecvBufferSize(e){this._setUdpOption({type:10,value:e}),this._lastRecvBufferSize=e}setSendBufferSize(e){this._setUdpOption({type:9,value:e}),this._lastSendBufferSize=e}setTTL(e){return this._setUdpOption({type:1,value:e}),this._lastTtl=e,e}unref(){return this}addSourceSpecificMembership(e,t,n){}dropSourceSpecificMembership(e,t,n){}async[Symbol.asyncDispose](){await new Promise(e=>{this.close(e)})}},Ve=new Uint8Array([2]),He=e=>{if(typeof e==`string`)return Ae.encode(e);if(e instanceof Uint8Array)return e;if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);if(Array.isArray(e)){let t=e.map(He),n=new Uint8Array(t.reduce((e,t)=>e+t.byteLength,0)),r=0;for(let e of t)n.set(e,r),r+=e.byteLength;return n}return new Uint8Array(e)},L=e=>{let t=e.split(`.`).map(e=>parseInt(e,10));if(t.length!==4||t.some(e=>Number.isNaN(e)||e<0||e>255))throw Error(`Invalid IPv4 address: ${e}`);return new Uint8Array(t)},R=e=>{let t=new i.Address6(e).getBitsBase16(0,128).match(/.{2}/g);if(!t||t.length!==16)throw Error(`Invalid IPv6 address: ${e}`);return new Uint8Array(t.map(e=>parseInt(e,16)))},Ue=(e,t)=>{let n=new Be(typeof e==`string`?{type:e}:e);return t&&n.on(`message`,t),n},We=e.g({Agent:()=>Y,ClientRequest:()=>q,HTTPParser:()=>U,IncomingMessage:()=>W,METHODS:()=>Ke,STATUS_CODES:()=>z,Server:()=>J,ServerResponse:()=>K,_default:()=>rt,createServer:()=>nt,default:()=>rt,get:()=>tt,globalAgent:()=>et,request:()=>X}),Ge=new TextDecoder(`latin1`),Ke=`ACL.BIND.CHECKOUT.CONNECT.COPY.DELETE.GET.HEAD.LINK.LOCK.M-SEARCH.MERGE.MKACTIVITY.MKCALENDAR.MKCOL.MOVE.NOTIFY.OPTIONS.PATCH.POST.PROPFIND.PROPPATCH.PURGE.PUT.REBIND.REPORT.SEARCH.SOURCE.SUBSCRIBE.TRACE.UNBIND.UNLINK.UNLOCK.UNSUBSCRIBE`.split(`.`),z={100:`Continue`,101:`Switching Protocols`,102:`Processing`,103:`Early Hints`,200:`OK`,201:`Created`,202:`Accepted`,203:`Non-Authoritative Information`,204:`No Content`,205:`Reset Content`,206:`Partial Content`,207:`Multi-Status`,208:`Already Reported`,226:`IM Used`,300:`Multiple Choices`,301:`Moved Permanently`,302:`Found`,303:`See Other`,304:`Not Modified`,305:`Use Proxy`,307:`Temporary Redirect`,308:`Permanent Redirect`,400:`Bad Request`,401:`Unauthorized`,402:`Payment Required`,403:`Forbidden`,404:`Not Found`,405:`Method Not Allowed`,406:`Not Acceptable`,407:`Proxy Authentication Required`,408:`Request Timeout`,409:`Conflict`,410:`Gone`,411:`Length Required`,412:`Precondition Failed`,413:`Payload Too Large`,414:`URI Too Long`,415:`Unsupported Media Type`,416:`Range Not Satisfiable`,417:`Expectation Failed`,418:`I'm a Teapot`,421:`Misdirected Request`,422:`Unprocessable Entity`,423:`Locked`,424:`Failed Dependency`,425:`Too Early`,426:`Upgrade Required`,428:`Precondition Required`,429:`Too Many Requests`,431:`Request Header Fields Too Large`,451:`Unavailable For Legal Reasons`,500:`Internal Server Error`,501:`Not Implemented`,502:`Bad Gateway`,503:`Service Unavailable`,504:`Gateway Timeout`,505:`HTTP Version Not Supported`,506:`Variant Also Negotiates`,507:`Insufficient Storage`,508:`Loop Detected`,509:`Bandwidth Limit Exceeded`,510:`Not Extended`,511:`Network Authentication Required`},qe=new Set([`content-type`,`content-length`,`user-agent`,`referer`,`host`,`authorization`,`proxy-authorization`,`if-modified-since`,`if-unmodified-since`,`from`,`location`,`max-forwards`,`retry-after`,`etag`,`last-modified`,`server`,`age`,`expires`]),B=13,V=10,Je=/^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/,H=(e,t)=>(e.code=t,e),Ye=(e,t)=>{if(e.length===0)return t;if(t.length===0)return e;let n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n},Xe=(e,t)=>{for(let n=t;n+1<e.length;n++)if(e[n]===B&&e[n+1]===V)return n;return-1},Ze=e=>{for(let t=0;t+3<e.length;t++)if(e[t]===B&&e[t+1]===V&&e[t+2]===B&&e[t+3]===V)return t;return-1},U=class{buf=new Uint8Array;state=`HEAD`;framing=`none`;bodyRemaining=0;chunkState=`size`;skipBody=!1;constructor(e,t){this.mode=e,this.handlers=t}execute(e){this.buf=Ye(this.buf,e);let t=!0;for(;t;)if(t=!1,this.state===`HEAD`){let e=Ze(this.buf);if(e===-1)return;let n=this.buf.subarray(0,e);this.buf=this.buf.subarray(e+4);let r=this.parseHead(n);this.handlers.onHeaders(r),this.setupBody(r),this.framing===`none`?(this.handlers.onComplete(),this.reset(),t=this.buf.length>0):(this.state=`BODY`,t=!0)}else this.consumeBody()&&(this.handlers.onComplete(),this.reset(),t=this.buf.length>0)}finish(){this.state===`BODY`&&this.framing===`eof`&&(this.handlers.onComplete(),this.reset())}reset(){this.state=`HEAD`,this.framing=`none`,this.bodyRemaining=0,this.chunkState=`size`,this.skipBody=!1}parseHead(e){let t=Ge.decode(e).split(`\r
|
|
2
|
-
`),n=t.shift()??``,r=[];for(let e of t)(e.startsWith(` `)||e.startsWith(` `))&&r.length>0?r[r.length-1]+=` `+e.trim():r.push(e);let i=[],a={};for(let e of r){if(!e)continue;let t=e.indexOf(`:`);if(t===-1)continue;let n=e.slice(0,t).trim(),r=e.slice(t+1).trim();i.push(n,r),this.addHeader(a,n,r)}let o={httpVersionMajor:1,httpVersionMinor:1,httpVersion:`1.1`,headers:a,rawHeaders:i};if(this.mode===`request`){let[e,t,r]=n.split(` `);o.method=(e??`GET`).toUpperCase(),o.url=t??`/`,this.applyVersion(o,r)}else{let e=n.indexOf(` `),t=n.slice(0,e),r=n.slice(e+1),i=r.indexOf(` `),a=i===-1?r:r.slice(0,i);o.statusCode=parseInt(a,10)||0,o.statusMessage=i===-1?``:r.slice(i+1),this.applyVersion(o,t)}return o}applyVersion(e,t){let n=/HTTP\/(\d)\.(\d)/i.exec(t??``);n&&(e.httpVersionMajor=parseInt(n[1],10),e.httpVersionMinor=parseInt(n[2],10),e.httpVersion=`${e.httpVersionMajor}.${e.httpVersionMinor}`)}addHeader(e,t,n){let r=t.toLowerCase();if(r===`set-cookie`){let t=e[`set-cookie`];Array.isArray(t)?t.push(n):e[`set-cookie`]=[n];return}let i=e[r];i===void 0?e[r]=n:
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./locator-jHaMLjtv.cjs`);let t=require(`osra`),n=require(`stream`),r=require(`events`),i=require(`ip-address`),a=require(`buffer`);var o=`FKN_WEB_EXTENSION_MAIN_WORLD_CONTENT_SCRIPT_ENABLED_EVENT_KEY`,s=`fknExtension`,c=(0,t.createTypedEventTarget)();typeof document<`u`&&document.addEventListener(o,e=>{c.dispatchEvent(new CustomEvent(`statuschange`,{detail:{enabled:e.detail.enabled}}))});var l=()=>typeof document>`u`?!1:document.documentElement.dataset[s]===`true`,u=null,d=e=>{u=e},ee=150,f=(e=1e3)=>new Promise((t,n)=>{if(l())return t();let r,i=e=>{clearTimeout(r),s.disconnect(),document.removeEventListener(`readystatechange`,c),e()},a=()=>i(async()=>{if(u&&(await u().catch(()=>{}),l()))return t();n(Error(`The FKN WebExtension is not installed, enabled or not exposed on this page.`))}),o=()=>{clearTimeout(r),r=setTimeout(()=>l()?i(t):a(),ee)},s=new MutationObserver(()=>{l()&&i(t)}),c=()=>{document.readyState===`complete`&&!l()&&o()};if(r=setTimeout(a,e),s.observe(document.documentElement,{attributes:!0,attributeFilter:[`data-fkn-extension`]}),document.addEventListener(`readystatechange`,c),document.readyState===`complete`)return o();l()&&i(t)}),p,m=new Proxy({},{get:(n,r)=>async(...n)=>{await f(),p??=(0,t.expose)({},{transport:window,revivableModules:e.l});let i=(await p)[r];return i(...n)}}),te={scope:`network.fetch`,category:`network`,severity:0,title:`Fetch data from other sites`,description:`Lets the app download public data from other websites directly, past the usual cross-origin limits.`},ne={scope:`network.fetchCredentialed`,category:`network`,severity:3,unsafe:!0,title:`Fetch from other sites, signed in as you`,description:`Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see.`},re={scope:`network.fetchLocal`,category:`network`,severity:3,unsafe:!0,title:`Access devices on your local network`,description:`Lets the app reach devices and services on your home or work network, which websites normally cannot touch.`},ie=e=>{let t=e.match(/^(\d+)\.(\d+)\.\d+\.\d+$/);if(!t)return!1;let[n,r]=[Number(t[1]),Number(t[2])];return n===10||n===127||n===0||n===169&&r===254||n===172&&r>=16&&r<=31||n===192&&r===168},ae=e=>{let t;try{t=new URL(e)}catch{return!1}let n=t.hostname.replace(/^\[|\]$/g,``).toLowerCase().replace(/\.$/,``);return n===`localhost`||n.endsWith(`.localhost`)||n.endsWith(`.local`)||n.endsWith(`.internal`)||n.endsWith(`.home.arpa`)?!0:n.includes(`:`)?n===`::`||n===`::1`||n.startsWith(`fc`)||n.startsWith(`fd`)||/^fe[89ab]/.test(n)||n.startsWith(`::ffff:`):ie(n)},oe=[`fkn.app`,`fkn.dev`],h=e=>{let t;try{t=new URL(e)}catch{return!1}if(t.protocol===`chrome-extension:`||t.protocol===`moz-extension:`)return!0;let n=t.hostname;return oe.some(e=>n===e||n.endsWith(`.${e}`))},g=e=>{if(h(e))throw Error(`fetch: refusing to target the extension's own pages or FKN platform domains`)},se=[`origin`,`referer`],ce=e=>{if(!e?.headers)return;let t=new Headers(e.headers),n=se.map(e=>{let n=t.get(e);return n===null?void 0:[e,n]}).filter(e=>e!==void 0);return n.length?n:void 0},_=async(e,t)=>{let n=new Request(e,t);g(n.url);let r=n.body?await n.arrayBuffer():null;return m.proxyFetch({url:n.url,method:n.method,headers:[...n.headers],body:r,credentials:t?.credentials===`include`?`include`:`omit`,redirect:n.redirect,unsafeHeaders:ce(t),reason:t?.reason,signal:t?.signal??void 0})},le={scope:`network.readCookie`,category:`network`,severity:3,unsafe:!0,title:`Read a site’s cookie`,description:`Lets the app read a named cookie from another site, which can include the login token only that site should see.`},ue={get:e=>m.getCookie(e)},de={scope:`network.modifyRequestHeaders`,category:`network`,severity:2,unsafe:!0,title:`Rewrite request headers to other sites`,description:`Lets the app set or remove headers (like Origin and Referer) on this page’s own requests to the listed sites.`},fe=e=>m.setRequestHeaderRule(e),pe=e=>m.removeRequestHeaderRule({ruleId:e});(()=>{let t={},n=[...e.t.selectorModules,...e.i.selectorModules];for(let e of n)e.render&&!(e.type in t)&&(t[e.type]=e.render);return t})();var v=`FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY`,y=e=>{if(!e||e===`about:blank`)return!1;let t;try{t=new URL(e,location.href)}catch{return!1}if(t.protocol===`chrome-extension:`||t.protocol===`moz-extension:`)return!0;if(t.protocol===`about:`)return!1;let n=t.hostname;return n===`fkn.app`||n.endsWith(`.fkn.app`)},b=e=>{if(y(e))throw Error(`attachFrame: refusing to target the extension's own pages or fkn.app`)},me={scope:`embed.iframe`,category:`embed`,severity:0,title:`Load another website inside this app`,description:`Lets the app embed external pages directly inside its own view.`},he={scope:`embed.open`,category:`embed`,severity:0,title:`Open a website inside this app`,description:`Lets the app navigate to another site without leaving its window.`},ge=async({iframe:t,domains:n=[]})=>{let r=crypto.randomUUID();if(b(t.src),await f(),!t.isConnected)throw Error(`attachFrame: the iframe must be connected to the document before attaching`);t.dispatchEvent(new CustomEvent(v,{detail:r}));let{executeLocator:i,ensureLocatorPermission:a,goto:o}=await m.attachFrame({marker:r,domains:n}),s=e.r(i,a),c=(e,t={})=>(b(e),o({url:e,...t})),l=()=>t.src;return{...s,goto:c,url:l}},_e={request:e=>m.requestPermissions(e.map(e=>({key:e.key,scope:e.scope??``,reason:e.reason})))},ve=32,ye=typeof CSS<`u`&&CSS.supports(`clip-path`,`path('M0 0H1V1H0Z')`),be=e=>{let t=e.style;t.setProperty(`display`,`block`,`important`),t.setProperty(`position`,`fixed`,`important`),t.setProperty(`top`,`0`,`important`),t.setProperty(`left`,`0`,`important`),t.setProperty(`width`,`100%`,`important`),t.setProperty(`height`,`100%`,`important`),t.setProperty(`border`,`none`,`important`),t.setProperty(`clip-path`,`inset(100%)`,`important`),t.setProperty(`background`,`transparent`),t.setProperty(`color-scheme`,`normal`),t.setProperty(`z-index`,`2147483647`),e.setAttribute(`title`,`FKN`)},xe=({x:e,y:t,width:n,height:r})=>`M${e} ${t}h${n}v${r}h${-n}Z`,Se=(e,{modal:t,rects:n})=>{if(!ye){let r=t||n.length>0;e.style.setProperty(`pointer-events`,r?`auto`:`none`,`important`),e.style.setProperty(`visibility`,r?`visible`:`hidden`,`important`);return}let r=t?`none`:n.length===0?`inset(100%)`:`path('${n.map(xe).join(``)}')`,i=r===`none`||CSS.supports(`clip-path`,r)?r:`inset(100%)`;e.style.setProperty(`clip-path`,i,`important`)},Ce=e=>{if(typeof e!=`object`||!e)return null;let{x:t,y:n,width:r,height:i}=e;if(![t,n,r,i].every(e=>typeof e==`number`&&Number.isFinite(e)))return null;let a=window.innerWidth,o=window.innerHeight,s=Math.max(0,Math.min(Math.round(t),a)),c=Math.max(0,Math.min(Math.round(n),o)),l=Math.max(s,Math.min(Math.round(t+r),a)),u=Math.max(c,Math.min(Math.round(n+i),o));return{x:s,y:c,width:l-s,height:u-c}},we=e=>{if(typeof e!=`object`||!e)return null;let t=e,n=(Array.isArray(t.rects)?t.rects.slice(0,ve):[]).map(Ce).filter(e=>e!==null&&e.width>0&&e.height>0);return{modal:t.modal===!0,rects:n}},x=null,Te=()=>x!==null,Ee=e=>{be(e),Se(e,{modal:!1,rects:[]}),x=e},De=e=>{if(!x)return;let t=we(e);t&&Se(x,t)},S=`https://fkn.app`,C=typeof globalThis<`u`&&globalThis.document?globalThis.document:void 0,Oe=C?.querySelector(`iframe[src="${S}/api"]`)??null,w=C?.createElement(`iframe`)??null;!Oe&&w&&C&&(w.src=`${S}/api`,C.body.appendChild(w));var T=Oe??w,E=T?.contentWindow??null;T&&C&&Ee(T);var D=(()=>{if(typeof window<`u`)return E?{receive:window,emit:E}:void 0;if(typeof self<`u`)return{receive:self,emit:self}})(),ke=D!==void 0,O=D?(0,t.expose)({},{key:`fkn-api`,transport:D}):new Promise(()=>{});O.then(e=>{Te()&&e.overlay.setHost(De)},()=>{});var Ae=[`fkn.app`,`fkn.dev`],k=e=>{let t=typeof e==`string`?e:e instanceof URL?e.href:e.url,n;try{n=new URL(t)}catch{return}let r=n.hostname;if(Ae.some(e=>r===e||r.endsWith(`.${e}`)))throw Error(`fetch refuses FKN platform domains (${r})`)},A=(e,t)=>(k(e),O.then(n=>n.cloud.fetch(e,t))),je=async()=>{let e=await O.then(e=>e.cloud.quota());return{premium:e.premium,overQuota:e.overQuota,throttled:e.overQuota&&!e.premium,usedBytes:e.usedBytes,limitBytes:e.limitBytes,remainingBytes:e.remaining,bytesPerSecond:e.bytesPerSecond,bitsPerSecond:e.bytesPerSecond*8}},Me=e.g({lookup:()=>Ne}),Ne=(e,t)=>O.then(n=>n.cloud.dns.lookup(e,t)),Pe=new TextEncoder;new TextDecoder;var j=e=>i.Address4.isValid(e),M=e=>i.Address6.isValid(e),Fe=e=>j(e)?4:M(e)?6:0,Ie=(...e)=>{if(typeof e[0]==`string`)throw Error(`FKN WebVPN does not support IPC connections`);let t=typeof e.at(-1)==`function`?e.at(-1):void 0;return e[0]&&typeof e[0]==`object`?{...e[0],callback:t}:{port:e[0]??0,host:typeof e[1]==`string`?e[1]:void 0,callback:t}},Le=(...e)=>{let t=typeof e.at(-1)==`function`?e.at(-1):void 0,n=e[0]??0,r=typeof e[1]==`string`?e[1]:void 0;return typeof e[0]==`object`?{...e[0],address:e[0].address??r,port:e[0].port??n,callback:t}:{address:r,port:n,callback:t}},Re=(...e)=>{let t=typeof e.at(-1)==`function`?e.at(-1):void 0,n=e[0];if(typeof e[2]==`number`)return{message:n,offset:e[1],length:e[2],port:typeof e[3]==`number`?e[3]:0,address:typeof e[4]==`string`?e[4]:void 0,callback:t};{let r=typeof e[1]==`number`?e[1]:0,i=typeof e[2]==`string`?e[2]:void 0;return{message:n,offset:0,length:n.length,port:r,address:i,callback:t}}};new TextEncoder,new TextDecoder;var N=e.g({Server:()=>F,Socket:()=>P,_default:()=>He,connect:()=>ze,createConnection:()=>Be,createServer:()=>Ve,default:()=>He,isIP:()=>Fe,isIPv4:()=>j,isIPv6:()=>M}),P=class extends n.Stream.Duplex{_localAddress;_remoteAddress;_webVPNTcpSocketPromise;constructor(e){if(e?.fd!==void 0)throw Error(`FKN WebVPN does not support file descriptors`);super(e),e?.connection&&this.__webvpn_tcp_socket_init__(e.connection)}__webvpn_tcp_socket_init__(e){if(this._webVPNTcpSocketPromise=e.then(e=>{let t=e.dataReadableStream.getReader(),n=e.dataWritableStream.getWriter();return this._localAddress={address:e.localAddress,family:e.localFamily,port:e.localPort},this._remoteAddress={address:e.remoteAddress,family:e.remoteFamily,port:e.remotePort},{...e,reader:t,writer:n}}).catch(e=>{this.emit(`error`,e)}),!this._webVPNTcpSocketPromise)throw Error(`Socket not connected`);return this._webVPNTcpSocketPromise.then(e=>{e&&this.emit(`connect`)}),this._webVPNTcpSocketPromise}_read(e){if(!this._webVPNTcpSocketPromise)throw Error(`Socket not connected`);this._webVPNTcpSocketPromise.then(e=>{if(!e){this.push(null);return}e.reader.read().then(({value:e,done:t})=>{if(t){this.push(null);return}this._restartTimeoutTimer(),this.push(e)}).catch(e=>{this.destroy(e)})})}_write(e,t,n){if(!this._webVPNTcpSocketPromise){n(Error(`Socket not connected`));return}this._webVPNTcpSocketPromise.then(async t=>{if(!t)throw Error(`Socket not connected`);await t.writer.ready,await t.writer.write(e),this._restartTimeoutTimer(),n()}).catch(n)}connect(...e){let t=Ie(...e),n=this.__webvpn_tcp_socket_init__(O.then(e=>e.cloud.webvpn.tcpSocket({remoteAddress:t.host??`localhost`,remotePort:t.port})));return t.callback&&n.then(e=>{e&&t.callback.call(this)}),this}_end(...e){return this._webVPNTcpSocketPromise?(e.length!==0&&this.write(e[0],e[1],e[2]),this._webVPNTcpSocketPromise.then(async e=>{e&&await e.end()}),this):this}_destroy(e){return this._timeoutTimer&&clearTimeout(this._timeoutTimer),this._webVPNTcpSocketPromise&&this._webVPNTcpSocketPromise.then(async e=>{e&&await e.destroy()}),this}destroySoon(){this._webVPNTcpSocketPromise&&this._webVPNTcpSocketPromise.then(async e=>{e&&await e.destroySoon()})}resetAndDestroy(){return this._webVPNTcpSocketPromise&&this._webVPNTcpSocketPromise.then(async e=>{e&&await e.resetAndDestroy()}),this}_timeoutMs;_timeoutTimer;_restartTimeoutTimer(){this._timeoutTimer&&clearTimeout(this._timeoutTimer),this._timeoutMs&&(this._timeoutTimer=setTimeout(()=>this.emit(`timeout`),this._timeoutMs))}setTimeout(e,t){return t&&this.on(`timeout`,t),this._timeoutMs=e,this._restartTimeoutTimer(),this}setNoDelay(e){let t=e??!0;return this._setTcpOption({type:0,value:t}),this}setKeepAlive(e,t){let n=e??!1,r=t!==void 0&&t>0?Math.max(1,Math.round(t/1e3)):0;return this._setTcpOption({type:2,enabled:n,initialDelaySeconds:r}),this}setSendBufferSize(e){return this._setTcpOption({type:3,value:e}),this}setRecvBufferSize(e){return this._setTcpOption({type:4,value:e}),this}_typeOfService;getTypeOfService(){return this._typeOfService??0}setTypeOfService(e){return this._typeOfService=e,this}_setTcpOption(e){if(!this._webVPNTcpSocketPromise){this.emit(`error`,Error(`Cannot set socket option before connect`));return}this._webVPNTcpSocketPromise.then(async t=>{if(t)try{await t.setOption(e)}catch(e){this.emit(`error`,e)}})}write(e,t,...n){return super.write(e,t,...n)}address(){return this._localAddress??{}}unref(){return this}ref(){return this}autoSelectFamilyAttemptedAddresses;bufferSize;bytesRead;bytesWritten;connecting;pending;get localAddress(){if(!this._localAddress)throw Error(`Socket is not connected`);return this._localAddress.address}get localPort(){if(!this._localAddress)throw Error(`Socket is not connected`);return this._localAddress.port}get localFamily(){if(!this._localAddress)throw Error(`Socket is not connected`);return this._localAddress.family}readyState;get remoteAddress(){if(!this._remoteAddress)throw Error(`Socket is not connected`);return this._remoteAddress.address}get remotePort(){if(!this._remoteAddress)throw Error(`Socket is not connected`);return this._remoteAddress.port}get remoteFamily(){if(!this._remoteAddress)throw Error(`Socket is not connected`);return this._remoteAddress.family}timeout},F=class extends r.EventEmitter{_localAddress;_webVPNTcpSocketListenerPromise;constructor(e,t){super(e),t&&this.on(`connection`,t),e?.connection&&this.__webvpn_tcp_socket_listener_init__(e.connection)}__webvpn_tcp_socket_listener_init__(e){return this._webVPNTcpSocketListenerPromise=e.then(e=>(this._localAddress={address:e.localAddress,family:e.localFamily,port:e.localPort},e)).catch(e=>{this.emit(`error`,e)}),this._webVPNTcpSocketListenerPromise.then(e=>{e&&this.emit(`listening`)}),this._webVPNTcpSocketListenerPromise}listen(...e){let t=Ie(...e),n=e=>{let t=new P({connection:Promise.resolve(e)});this.emit(`connection`,t)},r=e=>O.then(r=>r.cloud.webvpn.tcpSocketListener({localAddress:e,localPort:t.port,onConnection:n})),i=t.host?r(t.host):r(`::`).catch(()=>r(`0.0.0.0`)),a=this.__webvpn_tcp_socket_listener_init__(i);return t.callback&&a.then(e=>{e&&t.callback.call(this)}),this}close(e){return this._webVPNTcpSocketListenerPromise&&this._webVPNTcpSocketListenerPromise.then(async t=>{if(t)try{await t.close(),this._localAddress=void 0,this.emit(`close`),e&&e()}catch(t){this._localAddress=void 0,this.emit(`close`),e&&e(t)}}),this}address(){return this._localAddress??null}getConnections(e){throw Error(`Method not implemented.`)}ref(){return this}unref(){return this}maxConnections;connections;listening;async[Symbol.asyncDispose](){}},ze=(e,t)=>new P().connect(e,t),Be=(e,t)=>new P().connect(e,t),Ve=(e,t)=>{typeof e==`function`&&(t=e,e=void 0);let n=new F(e);return t&&n.on(`connection`,t),n},He={Socket:P,Server:F,connect:ze,createConnection:Be,createServer:Ve,isIP:Fe,isIPv4:j,isIPv6:M},Ue=e.g({Socket:()=>We,createSocket:()=>qe}),We=class extends r.EventEmitter{_type;_localAddress;_remoteAddress;_webVPNUdpSocketPromise;_dataPort;_socketId;_sendQueue=[];_sendQueueBytes=0;_sendFlushScheduled=!1;_peerTailCache=new Map;constructor(e){if(super(e),!e)throw Error(`Missing options`);this._type=e.type}_lastRecvBufferSize=0;_lastSendBufferSize=0;_lastTtl=64;_lastMulticastTtl=1;_lastMulticastLoopback=!0;_setUdpOption(e){if(!this._webVPNUdpSocketPromise){this.emit(`error`,Error(`Cannot set socket option before bind`));return}this._webVPNUdpSocketPromise.then(async t=>{if(t)try{await t.setOption(e)}catch(e){this.emit(`error`,e)}})}_onDataPortBatch(e){let t=new DataView(e),n=0;for(;n+4<=e.byteLength;){let r=t.getUint32(n);n+=4;let i=n+r;if(i>e.byteLength)break;let o=n+4,s=t.getUint8(o);o+=1;let c,l,u;if(s===2){if(!this._remoteAddress){n=i;continue}c=this._remoteAddress.address,l=this._remoteAddress.family,u=this._remoteAddress.port}else{let n=new Uint8Array(e,o,s===0?4:16);if(s===0)l=`IPv4`,c=`${n[0]}.${n[1]}.${n[2]}.${n[3]}`;else{l=`IPv6`;let e=[];for(let t=0;t<16;t+=2)e.push(((n[t]<<8|n[t+1])>>>0).toString(16));c=e.join(`:`)}o+=n.byteLength,u=t.getUint16(o),o+=2}let d=t.getUint32(o);o+=4,this.emit(`message`,a.Buffer.from(e.slice(o,o+d)),{address:c,family:l,port:u,size:d}),n=i}}_peerTail(e,t){if(e===void 0||t===void 0)return Ge;let n=`${e}|${t}`,r=this._peerTailCache.get(n);if(r)return r;let a=i.Address4.isValid(e)?I(e):L(e),o=new Uint8Array(1+a.byteLength+2);return o[0]=a.byteLength===4?0:1,o.set(a,1),new DataView(o.buffer).setUint16(1+a.byteLength,t),this._peerTailCache.set(n,o),o}_portSend(e,t,n){let r=this._peerTail(t,n),i=new Uint8Array(8+r.byteLength+4+e.byteLength),a=new DataView(i.buffer);a.setUint32(0,i.byteLength-4),a.setUint32(4,this._socketId),i.set(r,8),a.setUint32(8+r.byteLength,e.byteLength),i.set(e,12+r.byteLength),this._sendQueue.push(i),this._sendQueueBytes+=i.byteLength,!this._sendFlushScheduled&&(this._sendFlushScheduled=!0,queueMicrotask(()=>{this._sendFlushScheduled=!1;let e=this._sendQueue,t=this._sendQueueBytes;if(this._sendQueue=[],this._sendQueueBytes=0,!e.length||!this._dataPort)return;let n=new Uint8Array(t),r=0;for(let t of e)n.set(t,r),r+=t.byteLength;this._dataPort.postMessage(n.buffer,[n.buffer])}))}addMembership(e,t){if(i.Address4.isValid(e)){let n=I(e),r=t&&i.Address4.isValid(t)?I(t):new Uint8Array([0,0,0,0]);this._setUdpOption({type:5,group:n,interface:r})}else if(i.Address6.isValid(e)){let t=L(e);this._setUdpOption({type:7,group:t,ifIndex:0})}else this.emit(`error`,Error(`Invalid multicast address: ${e}`))}address(){if(!this._localAddress)throw Error(`EBADF`);return this._localAddress}bind(...e){let t=Le(...e),n=this._type===`udp6`?`::`:`0.0.0.0`;return this._webVPNUdpSocketPromise=O.then(e=>e.cloud.webvpn.udpSocket({type:this._type,address:t.address??n,port:t.port,dataPort:!0})).then(e=>{if(e.dataPort)this._socketId=e.socketId,this._dataPort=e.dataPort,this._dataPort.onmessage=e=>this._onDataPortBatch(e.data);else{let t=e.dataReadableStream.getReader(),n=async()=>{let{value:e,done:r}=await t.read();r||(this.emit(`message`,a.Buffer.from(e.data),{address:e.address,family:e.family,port:e.port,size:e.size}),n())};n()}return this._localAddress={address:e.localAddress,family:e.localFamily,port:e.localPort},e}).catch(e=>{this.emit(`error`,e)}),this._webVPNUdpSocketPromise.then(e=>{e&&this.emit(`listening`)}),t.callback&&this._webVPNUdpSocketPromise.then(e=>{e&&t.callback.call(this)}),this}close(e){if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);return this._webVPNUdpSocketPromise.then(async t=>{if(!t)throw Error(`Socket not bound`);this._dataPort?.close(),this._dataPort=void 0,await t.close(),e&&e(),this.emit(`close`)}),this}connect(...e){if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);this._webVPNUdpSocketPromise.then(async t=>{if(!t)throw Error(`Socket not bound`);let n=e[0],r=this._type===`udp6`?`::1`:`127.0.0.1`,i=typeof e[1]==`string`?e[1]:r,a=typeof e.at(-1)==`function`?e.at(-1):void 0;await t.connect({remotePort:n,remoteAddress:i}),this._remoteAddress={address:i,family:this._type===`udp6`?`IPv6`:`IPv4`,port:n},a&&a()})}disconnect(){if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);this._webVPNUdpSocketPromise.then(async e=>{if(!e)throw Error(`Socket not bound`);await e.connect({remotePort:0,remoteAddress:this._type===`udp4`?`0.0.0.0`:`::`})})}dropMembership(e,t){if(i.Address4.isValid(e)){let n=I(e),r=t&&i.Address4.isValid(t)?I(t):new Uint8Array([0,0,0,0]);this._setUdpOption({type:6,group:n,interface:r})}else if(i.Address6.isValid(e)){let t=L(e);this._setUdpOption({type:8,group:t,ifIndex:0})}else this.emit(`error`,Error(`Invalid multicast address: ${e}`))}getRecvBufferSize(){return this._lastRecvBufferSize}getSendBufferSize(){return this._lastSendBufferSize}getSendQueueSize(){return 0}getSendQueueCount(){return 0}ref(){return this}remoteAddress(){if(!this._remoteAddress)throw Error(`ERR_SOCKET_DGRAM_NOT_CONNECTED`);return{address:this._remoteAddress.address,family:this._remoteAddress.family,port:this._remoteAddress.port}}send(...e){this._webVPNUdpSocketPromise||this.bind();let t=Re(...e),n=this._type===`udp6`?`::1`:`127.0.0.1`;if(!this._webVPNUdpSocketPromise)throw Error(`Socket not bound`);this._webVPNUdpSocketPromise.then(e=>{if(!e)throw Error(`Socket not bound`);let r=Ke(t.message),a=t.callback,o=t.address??n,s=this._remoteAddress!==void 0&&t.address===void 0;if(this._dataPort&&(s||i.Address4.isValid(o)||i.Address6.isValid(o))){this._portSend(r,s?void 0:o,s?void 0:t.port),a?.call(this,null,r.byteLength);return}e.send({...t,address:o,message:r.byteOffset===0&&r.byteLength===r.buffer.byteLength?r.buffer:r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength)}).then(()=>a?.call(this,null,r.byteLength),e=>a?a.call(this,e,0):this.emit(`error`,e))})}setBroadcast(e){this._setUdpOption({type:0,value:e})}setMulticastInterface(e){}setMulticastLoopback(e){return this._setUdpOption({type:3,value:e}),this._setUdpOption({type:4,value:e}),this._lastMulticastLoopback=e,e}setMulticastTTL(e){return this._setUdpOption({type:2,value:e}),this._lastMulticastTtl=e,e}setRecvBufferSize(e){this._setUdpOption({type:10,value:e}),this._lastRecvBufferSize=e}setSendBufferSize(e){this._setUdpOption({type:9,value:e}),this._lastSendBufferSize=e}setTTL(e){return this._setUdpOption({type:1,value:e}),this._lastTtl=e,e}unref(){return this}addSourceSpecificMembership(e,t,n){}dropSourceSpecificMembership(e,t,n){}async[Symbol.asyncDispose](){await new Promise(e=>{this.close(e)})}},Ge=new Uint8Array([2]),Ke=e=>{if(typeof e==`string`)return Pe.encode(e);if(e instanceof Uint8Array)return e;if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);if(Array.isArray(e)){let t=e.map(Ke),n=new Uint8Array(t.reduce((e,t)=>e+t.byteLength,0)),r=0;for(let e of t)n.set(e,r),r+=e.byteLength;return n}return new Uint8Array(e)},I=e=>{let t=e.split(`.`).map(e=>parseInt(e,10));if(t.length!==4||t.some(e=>Number.isNaN(e)||e<0||e>255))throw Error(`Invalid IPv4 address: ${e}`);return new Uint8Array(t)},L=e=>{let t=new i.Address6(e).getBitsBase16(0,128).match(/.{2}/g);if(!t||t.length!==16)throw Error(`Invalid IPv6 address: ${e}`);return new Uint8Array(t.map(e=>parseInt(e,16)))},qe=(e,t)=>{let n=new We(typeof e==`string`?{type:e}:e);return t&&n.on(`message`,t),n},Je=e.g({Agent:()=>J,ClientRequest:()=>K,HTTPParser:()=>H,IncomingMessage:()=>U,METHODS:()=>Xe,STATUS_CODES:()=>R,Server:()=>q,ServerResponse:()=>G,_default:()=>st,createServer:()=>ot,default:()=>st,get:()=>at,globalAgent:()=>it,request:()=>Y}),Ye=new TextDecoder(`latin1`),Xe=`ACL.BIND.CHECKOUT.CONNECT.COPY.DELETE.GET.HEAD.LINK.LOCK.M-SEARCH.MERGE.MKACTIVITY.MKCALENDAR.MKCOL.MOVE.NOTIFY.OPTIONS.PATCH.POST.PROPFIND.PROPPATCH.PURGE.PUT.REBIND.REPORT.SEARCH.SOURCE.SUBSCRIBE.TRACE.UNBIND.UNLINK.UNLOCK.UNSUBSCRIBE`.split(`.`),R={100:`Continue`,101:`Switching Protocols`,102:`Processing`,103:`Early Hints`,200:`OK`,201:`Created`,202:`Accepted`,203:`Non-Authoritative Information`,204:`No Content`,205:`Reset Content`,206:`Partial Content`,207:`Multi-Status`,208:`Already Reported`,226:`IM Used`,300:`Multiple Choices`,301:`Moved Permanently`,302:`Found`,303:`See Other`,304:`Not Modified`,305:`Use Proxy`,307:`Temporary Redirect`,308:`Permanent Redirect`,400:`Bad Request`,401:`Unauthorized`,402:`Payment Required`,403:`Forbidden`,404:`Not Found`,405:`Method Not Allowed`,406:`Not Acceptable`,407:`Proxy Authentication Required`,408:`Request Timeout`,409:`Conflict`,410:`Gone`,411:`Length Required`,412:`Precondition Failed`,413:`Payload Too Large`,414:`URI Too Long`,415:`Unsupported Media Type`,416:`Range Not Satisfiable`,417:`Expectation Failed`,418:`I'm a Teapot`,421:`Misdirected Request`,422:`Unprocessable Entity`,423:`Locked`,424:`Failed Dependency`,425:`Too Early`,426:`Upgrade Required`,428:`Precondition Required`,429:`Too Many Requests`,431:`Request Header Fields Too Large`,451:`Unavailable For Legal Reasons`,500:`Internal Server Error`,501:`Not Implemented`,502:`Bad Gateway`,503:`Service Unavailable`,504:`Gateway Timeout`,505:`HTTP Version Not Supported`,506:`Variant Also Negotiates`,507:`Insufficient Storage`,508:`Loop Detected`,509:`Bandwidth Limit Exceeded`,510:`Not Extended`,511:`Network Authentication Required`},Ze=new Set([`content-type`,`content-length`,`user-agent`,`referer`,`host`,`authorization`,`proxy-authorization`,`if-modified-since`,`if-unmodified-since`,`from`,`location`,`max-forwards`,`retry-after`,`etag`,`last-modified`,`server`,`age`,`expires`]),z=13,B=10,Qe=/^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/,V=(e,t)=>(e.code=t,e),$e=(e,t)=>{if(e.length===0)return t;if(t.length===0)return e;let n=new Uint8Array(e.length+t.length);return n.set(e,0),n.set(t,e.length),n},et=(e,t)=>{for(let n=t;n+1<e.length;n++)if(e[n]===z&&e[n+1]===B)return n;return-1},tt=e=>{for(let t=0;t+3<e.length;t++)if(e[t]===z&&e[t+1]===B&&e[t+2]===z&&e[t+3]===B)return t;return-1},H=class{buf=new Uint8Array;state=`HEAD`;framing=`none`;bodyRemaining=0;chunkState=`size`;skipBody=!1;constructor(e,t){this.mode=e,this.handlers=t}execute(e){this.buf=$e(this.buf,e);let t=!0;for(;t;)if(t=!1,this.state===`HEAD`){let e=tt(this.buf);if(e===-1)return;let n=this.buf.subarray(0,e);this.buf=this.buf.subarray(e+4);let r=this.parseHead(n);this.handlers.onHeaders(r),this.setupBody(r),this.framing===`none`?(this.handlers.onComplete(),this.reset(),t=this.buf.length>0):(this.state=`BODY`,t=!0)}else this.consumeBody()&&(this.handlers.onComplete(),this.reset(),t=this.buf.length>0)}finish(){this.state===`BODY`&&this.framing===`eof`&&(this.handlers.onComplete(),this.reset())}reset(){this.state=`HEAD`,this.framing=`none`,this.bodyRemaining=0,this.chunkState=`size`,this.skipBody=!1}parseHead(e){let t=Ye.decode(e).split(`\r
|
|
2
|
+
`),n=t.shift()??``,r=[];for(let e of t)(e.startsWith(` `)||e.startsWith(` `))&&r.length>0?r[r.length-1]+=` `+e.trim():r.push(e);let i=[],a={};for(let e of r){if(!e)continue;let t=e.indexOf(`:`);if(t===-1)continue;let n=e.slice(0,t).trim(),r=e.slice(t+1).trim();i.push(n,r),this.addHeader(a,n,r)}let o={httpVersionMajor:1,httpVersionMinor:1,httpVersion:`1.1`,headers:a,rawHeaders:i};if(this.mode===`request`){let[e,t,r]=n.split(` `);o.method=(e??`GET`).toUpperCase(),o.url=t??`/`,this.applyVersion(o,r)}else{let e=n.indexOf(` `),t=n.slice(0,e),r=n.slice(e+1),i=r.indexOf(` `),a=i===-1?r:r.slice(0,i);o.statusCode=parseInt(a,10)||0,o.statusMessage=i===-1?``:r.slice(i+1),this.applyVersion(o,t)}return o}applyVersion(e,t){let n=/HTTP\/(\d)\.(\d)/i.exec(t??``);n&&(e.httpVersionMajor=parseInt(n[1],10),e.httpVersionMinor=parseInt(n[2],10),e.httpVersion=`${e.httpVersionMajor}.${e.httpVersionMinor}`)}addHeader(e,t,n){let r=t.toLowerCase();if(r===`set-cookie`){let t=e[`set-cookie`];Array.isArray(t)?t.push(n):e[`set-cookie`]=[n];return}let i=e[r];i===void 0?e[r]=n:Ze.has(r)||(e[r]=`${i}, ${n}`)}setupBody(e){if(this.skipBody){this.framing=`none`;return}let t=e.headers[`transfer-encoding`];if(typeof t==`string`&&t.toLowerCase().includes(`chunked`)){this.framing=`chunked`,this.chunkState=`size`;return}let n=e.headers[`content-length`];if(typeof n==`string`&&n!==``){let e=parseInt(n,10);e>0?(this.framing=`length`,this.bodyRemaining=e):this.framing=`none`;return}if(this.mode===`response`){let t=e.statusCode??0;t>=100&&t<200||t===204||t===304?this.framing=`none`:this.framing=`eof`}else this.framing=`none`}consumeBody(){if(this.framing===`length`){if(this.buf.length===0)return!1;let e=Math.min(this.bodyRemaining,this.buf.length);return this.handlers.onBody(this.buf.subarray(0,e)),this.buf=this.buf.subarray(e),this.bodyRemaining-=e,this.bodyRemaining===0}return this.framing===`eof`?(this.buf.length>0&&(this.handlers.onBody(this.buf),this.buf=new Uint8Array),!1):this.framing===`chunked`?this.consumeChunked():!0}consumeChunked(){for(;;)if(this.chunkState===`size`){let e=et(this.buf,0);if(e===-1)return!1;let t=Ye.decode(this.buf.subarray(0,e)),n=parseInt(t.split(`;`)[0].trim(),16);if(this.buf=this.buf.subarray(e+2),Number.isNaN(n))return!0;n===0?this.chunkState=`trailer`:(this.bodyRemaining=n,this.chunkState=`data`)}else if(this.chunkState===`data`){if(this.buf.length===0)return!1;let e=Math.min(this.bodyRemaining,this.buf.length);this.handlers.onBody(this.buf.subarray(0,e)),this.buf=this.buf.subarray(e),this.bodyRemaining-=e,this.bodyRemaining===0&&(this.chunkState=`dataCRLF`)}else if(this.chunkState===`dataCRLF`){if(this.buf.length<2)return!1;this.buf=this.buf.subarray(2),this.chunkState=`size`}else{let e=et(this.buf,0);if(e===-1)return!1;let t=e===0;if(this.buf=this.buf.subarray(e+2),t)return!0}}},nt=(e,t)=>a.Buffer.isBuffer(e)?e:typeof e==`string`?a.Buffer.from(e,t??`utf8`):e instanceof Uint8Array?a.Buffer.from(e):e instanceof ArrayBuffer?a.Buffer.from(new Uint8Array(e)):a.Buffer.from(String(e)),U=class extends n.Stream.Readable{httpVersion=`1.1`;httpVersionMajor=1;httpVersionMinor=1;headers={};rawHeaders=[];trailers={};rawTrailers=[];method;url;statusCode;statusMessage;complete=!1;socket;constructor(e){super(),this.socket=e}get connection(){return this.socket}_applyHead(e){this.httpVersion=e.httpVersion,this.httpVersionMajor=e.httpVersionMajor,this.httpVersionMinor=e.httpVersionMinor,this.headers=e.headers,this.rawHeaders=e.rawHeaders,this.method=e.method,this.url=e.url,this.statusCode=e.statusCode,this.statusMessage=e.statusMessage}_read(){}setTimeout(e,t){return this.socket.setTimeout(e,t),this}},W=class extends n.Stream.Writable{_headerStore=new Map;headersSent=!1;chunkedEncoding=!1;finished=!1;_bodyWritten=!1;setHeader(e,t){if(this.headersSent)throw V(Error(`Cannot set headers after they are sent to the client`),`ERR_HTTP_HEADERS_SENT`);if(typeof e!=`string`||!Qe.test(e))throw V(TypeError(`Header name must be a valid HTTP token [${JSON.stringify(String(e))}]`),`ERR_INVALID_HTTP_TOKEN`);if(t===void 0)throw V(TypeError(`Invalid value "undefined" for header "${e}"`),`ERR_HTTP_INVALID_HEADER_VALUE`);return this._headerStore.set(e.toLowerCase(),[e,Array.isArray(t)?[...t]:t]),this}getHeader(e){return this._headerStore.get(e.toLowerCase())?.[1]}getHeaderNames(){return[...this._headerStore.values()].map(([e])=>e)}getHeaders(){let e={};for(let[t,n]of this._headerStore.values())e[t]=n;return e}hasHeader(e){return this._headerStore.has(e.toLowerCase())}removeHeader(e){if(this.headersSent)throw Error(`Cannot remove headers after they are sent to the client`);this._headerStore.delete(e.toLowerCase())}_storeHeader(e){let t=this.hasHeader(`content-length`),n=this.getHeader(`transfer-encoding`);typeof n==`string`&&n.toLowerCase().includes(`chunked`)?this.chunkedEncoding=!0:!t&&this._shouldSendBody()&&(this.chunkedEncoding=!0,this.setHeader(`Transfer-Encoding`,`chunked`));let r=e+`\r
|
|
3
3
|
`;for(let[e,t]of this._headerStore.values())if(Array.isArray(t))for(let n of t)r+=`${e}: ${n}\r\n`;else r+=`${e}: ${t}\r\n`;return r+=`\r
|
|
4
|
-
`,r}_writeToSocket(e,t){if(!this.socket){t(Error(`Socket is not available`));return}this.socket.write(e,t)}write(e,t,n){return this._bodyWritten=!0,super.write(e,t,n)}_write(e,t,n){let r=
|
|
4
|
+
`,r}_writeToSocket(e,t){if(!this.socket){t(Error(`Socket is not available`));return}this.socket.write(e,t)}write(e,t,n){return this._bodyWritten=!0,super.write(e,t,n)}_write(e,t,n){let r=nt(e),i=[];if(this.headersSent||=(this._implicitHeader(),i.push(a.Buffer.from(this._headBlock,`latin1`)),!0),this.chunkedEncoding?r.length>0&&(i.push(a.Buffer.from(`${r.length.toString(16)}\r\n`,`latin1`)),i.push(r),i.push(a.Buffer.from(`\r
|
|
5
5
|
`,`latin1`))):i.push(r),i.length===0){n();return}this._writeToSocket(a.Buffer.concat(i),n)}_final(e){let t=[];if(this.headersSent||=(!this.chunkedEncoding&&!this.hasHeader(`content-length`)&&this.setHeader(`Content-Length`,0),this._implicitHeader(),t.push(a.Buffer.from(this._headBlock,`latin1`)),!0),this.chunkedEncoding&&t.push(a.Buffer.from(`0\r
|
|
6
6
|
\r
|
|
7
|
-
`,`latin1`)),this.finished=!0,t.length===0){e();return}this._writeToSocket(a.Buffer.concat(t),e)}end(e,t,n){if(e!=null&&typeof e!=`function`&&!this._bodyWritten&&!this.headersSent&&!this.chunkedEncoding&&!this.hasHeader(`content-length`)){let n=typeof t==`string`?t:void 0;this.setHeader(`Content-Length`,
|
|
7
|
+
`,`latin1`)),this.finished=!0,t.length===0){e();return}this._writeToSocket(a.Buffer.concat(t),e)}end(e,t,n){if(e!=null&&typeof e!=`function`&&!this._bodyWritten&&!this.headersSent&&!this.chunkedEncoding&&!this.hasHeader(`content-length`)){let n=typeof t==`string`?t:void 0;this.setHeader(`Content-Length`,nt(e,n).length)}return super.end(e,t,n)}_headBlock},G=class extends W{statusCode=200;statusMessage;_writeHeadCalled=!1;sendDate=!0;req;socket;_keepAlive=!0;constructor(e){super(),this.req=e,this.socket=e.socket}_shouldSendBody(){if(this.req.method===`HEAD`)return!1;let e=this.statusCode;return!(e>=100&&e<200||e===204||e===304)}writeHead(e,t,n){if(this._writeHeadCalled||this.headersSent)throw V(Error(`Cannot render headers after they are sent to the client`),`ERR_HTTP_HEADERS_SENT`);this._writeHeadCalled=!0,this.statusCode=e;let r=n;if(typeof t==`string`?this.statusMessage=t:t!=null&&(r=t),Array.isArray(r)){let e=Array.isArray(r[0])?r:Array.from({length:Math.floor(r.length/2)},(e,t)=>[r[t*2],r[t*2+1]]);for(let[t,n]of e)n!==void 0&&this._appendHeader(t,n)}else if(r)for(let[e,t]of Object.entries(r))t!==void 0&&this.setHeader(e,t);return this}_appendHeader(e,t){let n=this.getHeader(e);if(n===void 0)this.setHeader(e,t);else{let r=[...Array.isArray(n)?n:[n],...Array.isArray(t)?t:[t]].map(String);this.setHeader(e,r)}}_implicitHeader(){let e=this.statusMessage??R[this.statusCode]??`unknown`;this.sendDate&&!this.hasHeader(`date`)&&this.setHeader(`Date`,new Date().toUTCString()),this.hasHeader(`connection`)||this.setHeader(`Connection`,this._keepAlive?`keep-alive`:`close`),this._headBlock=this._storeHeader(`HTTP/1.1 ${this.statusCode} ${e}`)}writeContinue(){this._writeToSocket(a.Buffer.from(`HTTP/1.1 100 Continue\r
|
|
8
8
|
\r
|
|
9
|
-
`,`latin1`),()=>{})}setTimeout(e,t){return this.socket?.setTimeout(e,t),this}}
|
|
9
|
+
`,`latin1`),()=>{})}setTimeout(e,t){return this.socket?.setTimeout(e,t),this}},rt=(...e)=>{let t={},n={},r,i=[...e],a=i.shift();if(typeof a==`string`||a instanceof URL){let e=typeof a==`string`?new URL(a):a;t={protocol:e.protocol,hostname:e.hostname,host:e.hostname,port:e.port,path:`${e.pathname}${e.search}`,auth:e.username?`${e.username}:${e.password}`:void 0};let o=i.shift();typeof o==`function`?r=o:o&&typeof o==`object`&&(n=o,r=i.shift())}else a&&typeof a==`object`&&(n=a,r=i.shift());return{options:{...t,...n},callback:r}},K=class extends W{method;path;host;protocol;socket;get connection(){return this.socket}res=null;aborted=!1;_aborted=!1;constructor(e,t){super(),this.method=(e.method??`GET`).toUpperCase(),this.path=e.path??`/`,this.protocol=e.protocol??`http:`;let n=e.hostname??e.host??`localhost`;this.host=n;let r=Number(e.port??(this.protocol===`https:`?443:80));if(t&&this.once(`response`,t),e.headers)for(let[t,n]of Object.entries(e.headers))n!==void 0&&this.setHeader(t,n);if(!this.hasHeader(`host`)){let e=this.protocol===`https:`&&r===443||this.protocol!==`https:`&&r===80;this.setHeader(`Host`,e?n:`${n}:${r}`)}e.auth&&!this.hasHeader(`authorization`)&&this.setHeader(`Authorization`,`Basic ${a.Buffer.from(e.auth).toString(`base64`)}`),this.socket=new P,this.emit(`socket`,this.socket),this.socket.on(`error`,e=>{this._aborted||this.emit(`error`,e)}),this._attachResponseParser(),this.socket.connect({host:n,port:r},()=>{this.emit(`connect`)})}_shouldSendBody(){return this.method!==`GET`&&this.method!==`HEAD`&&this.method!==`DELETE`}_implicitHeader(){this._headBlock=this._storeHeader(`${this.method} ${this.path} HTTP/1.1`)}_attachResponseParser(){let e=new U(this.socket),t=new H(`response`,{onHeaders:n=>{e._applyHead(n),this.method===`HEAD`&&(t.skipBody=!0),this.res=e,this.emit(`response`,e)},onBody:t=>{e.push(a.Buffer.from(t))},onComplete:()=>{e.complete=!0,e.push(null)}});this.socket.on(`data`,e=>{this._aborted||t.execute(e)}),this.socket.on(`end`,()=>{t.finish()}),this.socket.on(`close`,()=>{this.emit(`close`)})}abort(){this._aborted||(this._aborted=!0,this.aborted=!0,this.emit(`abort`),this.socket.destroy())}destroy(e){return this._aborted?this:(this._aborted=!0,this.socket.destroy(e),super.destroy(e),this)}end(e,t,n){return this._aborted?this:super.end(e,t,n)}_writeToSocket(e,t){if(this._aborted){t();return}super._writeToSocket(e,t)}setTimeout(e,t){return this.socket.setTimeout(e,t),this}setNoDelay(e){this.socket.setNoDelay(e)}setSocketKeepAlive(e,t){this.socket.setKeepAlive(e,t)}},q=new Proxy(class extends F{constructor(e,t){let n={},r=t;typeof e==`function`?r=e:e&&(n=e),super(n),r&&this.on(`request`,r),this.on(`connection`,e=>this._handleConnection(e))}_handleConnection(e){let t=null,n=new H(`request`,{onHeaders:r=>{t=new U(e),t._applyHead(r),r.method===`HEAD`&&(n.skipBody=!0);let i=new G(t),a=String(r.headers.connection??``).toLowerCase();i._keepAlive=r.httpVersionMinor>=1?a!==`close`:a===`keep-alive`,i.on(`finish`,()=>{i._keepAlive||e.end()}),this.emit(`request`,t,i)},onBody:e=>{t?.push(a.Buffer.from(e))},onComplete:()=>{t&&(t.complete=!0,t.push(null)),t=null}});e.on(`data`,e=>n.execute(e)),e.on(`end`,()=>{n.finish(),t&&t.push(null)}),e.on(`error`,t=>this.emit(`clientError`,t,e))}},{apply:(e,t,n)=>new e(...n)}),J=class{maxSockets;maxFreeSockets;keepAlive;options;constructor(e={}){this.options=e,this.keepAlive=!!e.keepAlive,this.maxSockets=e.maxSockets??1/0,this.maxFreeSockets=e.maxFreeSockets??256}getName(e={}){return`${e.host??`localhost`}:${e.port??``}:${e.localAddress??``}`}destroy(){}},it=new J,Y=(...e)=>{let{options:t,callback:n}=rt(...e);return new K(t,n)},at=(...e)=>{let t=Y(...e);return t.end(),t},ot=(e,t)=>new q(e,t),st={METHODS:Xe,STATUS_CODES:R,Agent:J,globalAgent:it,Server:q,ServerResponse:G,IncomingMessage:U,ClientRequest:K,OutgoingMessage:W,createServer:ot,request:Y,get:at},ct=e.g({available:()=>lt,dgram:()=>Ue,dns:()=>Me,fetch:()=>A,http:()=>Je,net:()=>N,quota:()=>je}),lt=()=>ke,X=async e=>{if(typeof window>`u`)return!1;if(l())return!0;let t=await O,n=null,r=new Promise(e=>{n=()=>{l()&&e(!0)},c.addEventListener(`statuschange`,n)}),i=t.installPrompt.show(e).then(()=>!1),a=await Promise.race([r,i]);return n&&c.removeEventListener(`statuschange`,n),await t.installPrompt.hide().catch(()=>{}),a},Z=null;d(()=>(Z||=X().then(()=>void 0).finally(()=>{Z=null}),Z));var ut=e.g({available:()=>dt,dgram:()=>ht,dns:()=>pt,fetch:()=>ft,fs:()=>gt,net:()=>mt}),dt=()=>!1,Q=e=>(...t)=>{throw Error(`The FKN desktop app is not connected, desktop.${e} is unavailable`)},ft=Q(`fetch`),pt={lookup:Q(`dns.lookup`)},mt={connect:Q(`net.connect`),createConnection:Q(`net.createConnection`),createServer:Q(`net.createServer`)},ht={createSocket:Q(`dgram.createSocket`)},gt={isLocalDirectorySupported:()=>!1,pickLocalDirectory:Q(`fs.pickLocalDirectory`),queryDirectoryPermission:Q(`fs.queryDirectoryPermission`),ensureDirectoryPermission:Q(`fs.ensureDirectoryPermission`)},_t=()=>typeof document<`u`&&l(),vt=async(e,t)=>{if(k(e),t?.credentials===`include`){if(typeof document>`u`)throw Error(`fetch with credentials needs the FKN extension, which only exists in window realms`);return _(e,t)}return _t()?_(e,{...t,credentials:`omit`}):dt()?ft(e,t):A(e,t)},yt=e.g({ATTACH_FRAME_EVENT_KEY:()=>v,assertAttachableFrameUrl:()=>b,assertFetchableUrl:()=>g,attachFrame:()=>ge,attachFramePermission:()=>me,available:()=>_t,box:()=>e.u,cookies:()=>ue,createVideoElementHandle:()=>e.d,events:()=>c,extension:()=>c,fetch:()=>_,fetchCredentialedPermission:()=>ne,fetchLocalPermission:()=>re,fetchPermission:()=>te,gotoPermission:()=>he,handleRevivableModules:()=>e.l,isBlockedFetchUrl:()=>h,isBlockedFrameUrl:()=>y,isExtensionExposed:()=>l,isLocalNetworkUrl:()=>ae,isType:()=>e.f,modifyRequestHeadersPermission:()=>de,permissions:()=>_e,promptInstall:()=>X,readCookiePermission:()=>le,removeRequestHeaderRule:()=>pe,revive:()=>e.p,setMissingExtensionHandler:()=>d,setRequestHeaderRule:()=>fe,type:()=>e.m,waitForExtensionExposure:()=>f}),bt=e.g({ensureDirectoryPermission:()=>Ct,isLocalDirectorySupported:()=>xt,pickLocalDirectory:()=>St,queryDirectoryPermission:()=>$}),xt=()=>typeof window<`u`&&`showDirectoryPicker`in window,St=async(e={})=>{if(!xt())return;let t=window.showDirectoryPicker;return t({mode:`readwrite`,...e}).catch(e=>{if(e?.name!==`AbortError`)throw e})},$=async(e,t=`readwrite`)=>{let{queryPermission:n}=e;return await n?.call(e,{mode:t})??`granted`},Ct=async(e,t=`readwrite`)=>{if(await $(e,t)===`granted`)return!0;let{requestPermission:n}=e;return await n?.call(e,{mode:t})===`granted`},wt=`https://fkn.app`,Tt=(e,n)=>{if(typeof window>`u`)throw Error(`FKN @fkn/lib: relayWorker must be called from the main thread`);if(!T?.contentWindow)throw Error(`FKN @fkn/lib: relayWorker called before the FKN iframe was injected`);(0,t.relay)({receive:window,emit:T.contentWindow},e,{key:`fkn-api`,originA:n?.originA??wt,originB:n?.originB??`*`,unregisterSignal:n?.unregisterSignal})},Et=async()=>typeof window>`u`?!1:(await O).connect.prompt(location.origin).catch(()=>!1);exports.ATTACH_FRAME_EVENT_KEY=v,exports.assertAttachableFrameUrl=b,exports.assertFetchableUrl=g,exports.attachFrame=ge,exports.attachFramePermission=me,exports.box=e.u,Object.defineProperty(exports,`cloud`,{enumerable:!0,get:function(){return ct}}),exports.connect=Et,exports.cookies=ue,exports.createVideoElementHandle=e.d,Object.defineProperty(exports,`desktop`,{enumerable:!0,get:function(){return ut}}),Object.defineProperty(exports,`dgram`,{enumerable:!0,get:function(){return Ue}}),Object.defineProperty(exports,`dns`,{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,`extension`,{enumerable:!0,get:function(){return yt}}),exports.fetch=vt,exports.fetchCredentialedPermission=ne,exports.fetchLocalPermission=re,exports.fetchPermission=te,Object.defineProperty(exports,`fs`,{enumerable:!0,get:function(){return bt}}),exports.gotoPermission=he,exports.handleRevivableModules=e.l,Object.defineProperty(exports,`http`,{enumerable:!0,get:function(){return Je}}),exports.isBlockedFetchUrl=h,exports.isBlockedFrameUrl=y,exports.isExtensionExposed=l,exports.isLocalNetworkUrl=ae,exports.isType=e.f,exports.modifyRequestHeadersPermission=de,Object.defineProperty(exports,`net`,{enumerable:!0,get:function(){return N}}),exports.permissions=_e,exports.promptInstall=X,exports.readCookiePermission=le,exports.relayWorker=Tt,exports.removeRequestHeaderRule=pe,exports.revive=e.p,exports.setMissingExtensionHandler=d,exports.setRequestHeaderRule=fe,exports.type=e.m,exports.waitForExtensionExposure=f;
|
package/index.d.ts
CHANGED
|
@@ -49,6 +49,15 @@ declare const fetchCredentialedPermission: {
|
|
|
49
49
|
readonly title: "Fetch from other sites, signed in as you";
|
|
50
50
|
readonly description: "Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see.";
|
|
51
51
|
};
|
|
52
|
+
declare const fetchLocalPermission: {
|
|
53
|
+
readonly scope: "network.fetchLocal";
|
|
54
|
+
readonly category: "network";
|
|
55
|
+
readonly severity: 3;
|
|
56
|
+
readonly unsafe: true;
|
|
57
|
+
readonly title: "Access devices on your local network";
|
|
58
|
+
readonly description: "Lets the app reach devices and services on your home or work network, which websites normally cannot touch.";
|
|
59
|
+
};
|
|
60
|
+
declare const isLocalNetworkUrl: (raw: string) => boolean;
|
|
52
61
|
type ProxyFetchRequest = {
|
|
53
62
|
url: string;
|
|
54
63
|
method: string;
|
|
@@ -672,6 +681,13 @@ declare const PERMISSIONS: readonly [{
|
|
|
672
681
|
readonly unsafe: true;
|
|
673
682
|
readonly title: "Fetch from other sites, signed in as you";
|
|
674
683
|
readonly description: "Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see.";
|
|
684
|
+
}, {
|
|
685
|
+
readonly scope: "network.fetchLocal";
|
|
686
|
+
readonly category: "network";
|
|
687
|
+
readonly severity: 3;
|
|
688
|
+
readonly unsafe: true;
|
|
689
|
+
readonly title: "Access devices on your local network";
|
|
690
|
+
readonly description: "Lets the app reach devices and services on your home or work network, which websites normally cannot touch.";
|
|
675
691
|
}, {
|
|
676
692
|
readonly scope: "network.readCookie";
|
|
677
693
|
readonly category: "network";
|
|
@@ -1052,6 +1068,7 @@ declare const makeWebVPNWebTransport: () => Promise<{
|
|
|
1052
1068
|
getMetadataReadableStreamForLocalPort: (port: number) => ReadableStream<ServerMetadataPacket>;
|
|
1053
1069
|
getMetadataWritableStream: () => WritableStream<Uint8Array<ArrayBufferLike>>;
|
|
1054
1070
|
getDatagramWritableStream: () => WritableStream<Uint8Array<ArrayBufferLike>>;
|
|
1071
|
+
presentRateToken: () => Promise<void>;
|
|
1055
1072
|
}>;
|
|
1056
1073
|
type WebVPNWebTransport = Awaited<ReturnType<typeof makeWebVPNWebTransport>>;
|
|
1057
1074
|
|
|
@@ -1096,7 +1113,7 @@ type Quota = {
|
|
|
1096
1113
|
|
|
1097
1114
|
declare const resolvers: {
|
|
1098
1115
|
readonly cloud: {
|
|
1099
|
-
readonly fetch: (input: string |
|
|
1116
|
+
readonly fetch: (input: string | Request | URL, init?: (RequestInit | undefined) & {
|
|
1100
1117
|
render?: boolean;
|
|
1101
1118
|
}) => Promise<Response>;
|
|
1102
1119
|
readonly quota: () => Promise<Quota>;
|
|
@@ -1182,7 +1199,10 @@ declare const resolvers: {
|
|
|
1182
1199
|
readonly show: (reason?: string) => Promise<void>;
|
|
1183
1200
|
readonly hide: () => void;
|
|
1184
1201
|
};
|
|
1185
|
-
readonly
|
|
1202
|
+
readonly connect: {
|
|
1203
|
+
readonly prompt: (consumerOrigin: string) => Promise<boolean>;
|
|
1204
|
+
};
|
|
1205
|
+
readonly proxyFetch: (input: string | Request | URL, init?: (RequestInit | undefined) & {
|
|
1186
1206
|
render?: boolean;
|
|
1187
1207
|
}) => Promise<Response>;
|
|
1188
1208
|
readonly webVpnTcpSocket: ({ remoteAddress: _remoteAddress, remotePort }: {
|
|
@@ -1429,7 +1449,7 @@ declare class Server$1 extends EventEmitter implements Server$2 {
|
|
|
1429
1449
|
listening: boolean;
|
|
1430
1450
|
[Symbol.asyncDispose](): Promise<void>;
|
|
1431
1451
|
}
|
|
1432
|
-
declare const connect: (options: SocketConnectOpts, connectionListener?: () => void) => Socket$1;
|
|
1452
|
+
declare const connect$1: (options: SocketConnectOpts, connectionListener?: () => void) => Socket$1;
|
|
1433
1453
|
declare const createConnection: (options: SocketConnectOpts, connectionListener?: () => void) => Socket$1;
|
|
1434
1454
|
declare const createServer$1: (options?: ServerOpts | ((socket: Socket$1) => void), connectionListener?: (socket: Socket$1) => void) => Server$1;
|
|
1435
1455
|
|
|
@@ -1444,7 +1464,6 @@ declare const _default$1: {
|
|
|
1444
1464
|
isIPv6: (input: string) => boolean;
|
|
1445
1465
|
};
|
|
1446
1466
|
|
|
1447
|
-
declare const net$1_connect: typeof connect;
|
|
1448
1467
|
declare const net$1_createConnection: typeof createConnection;
|
|
1449
1468
|
declare const net$1_isIP: typeof isIP;
|
|
1450
1469
|
declare const net$1_isIPv4: typeof isIPv4;
|
|
@@ -1454,7 +1473,7 @@ declare namespace net$1 {
|
|
|
1454
1473
|
Server$1 as Server,
|
|
1455
1474
|
Socket$1 as Socket,
|
|
1456
1475
|
_default$1 as _default,
|
|
1457
|
-
|
|
1476
|
+
connect$1 as connect,
|
|
1458
1477
|
net$1_createConnection as createConnection,
|
|
1459
1478
|
createServer$1 as createServer,
|
|
1460
1479
|
_default$1 as default,
|
|
@@ -1794,12 +1813,14 @@ declare const extension_box: typeof box;
|
|
|
1794
1813
|
declare const extension_cookies: typeof cookies;
|
|
1795
1814
|
declare const extension_createVideoElementHandle: typeof createVideoElementHandle;
|
|
1796
1815
|
declare const extension_fetchCredentialedPermission: typeof fetchCredentialedPermission;
|
|
1816
|
+
declare const extension_fetchLocalPermission: typeof fetchLocalPermission;
|
|
1797
1817
|
declare const extension_fetchPermission: typeof fetchPermission;
|
|
1798
1818
|
declare const extension_gotoPermission: typeof gotoPermission;
|
|
1799
1819
|
declare const extension_handleRevivableModules: typeof handleRevivableModules;
|
|
1800
1820
|
declare const extension_isBlockedFetchUrl: typeof isBlockedFetchUrl;
|
|
1801
1821
|
declare const extension_isBlockedFrameUrl: typeof isBlockedFrameUrl;
|
|
1802
1822
|
declare const extension_isExtensionExposed: typeof isExtensionExposed;
|
|
1823
|
+
declare const extension_isLocalNetworkUrl: typeof isLocalNetworkUrl;
|
|
1803
1824
|
declare const extension_isType: typeof isType;
|
|
1804
1825
|
declare const extension_modifyRequestHeadersPermission: typeof modifyRequestHeadersPermission;
|
|
1805
1826
|
declare const extension_permissions: typeof permissions;
|
|
@@ -1812,7 +1833,7 @@ declare const extension_setRequestHeaderRule: typeof setRequestHeaderRule;
|
|
|
1812
1833
|
declare const extension_type: typeof type;
|
|
1813
1834
|
declare const extension_waitForExtensionExposure: typeof waitForExtensionExposure;
|
|
1814
1835
|
declare namespace extension {
|
|
1815
|
-
export { extension_ATTACH_FRAME_EVENT_KEY as ATTACH_FRAME_EVENT_KEY, extension_assertAttachableFrameUrl as assertAttachableFrameUrl, extension_assertFetchableUrl as assertFetchableUrl, extension_attachFrame as attachFrame, extension_attachFramePermission as attachFramePermission, isExtensionAvailable as available, extension_box as box, extension_cookies as cookies, extension_createVideoElementHandle as createVideoElementHandle, extension$1 as events, extension$1 as extension, fetch$2 as fetch, extension_fetchCredentialedPermission as fetchCredentialedPermission, extension_fetchPermission as fetchPermission, extension_gotoPermission as gotoPermission, extension_handleRevivableModules as handleRevivableModules, extension_isBlockedFetchUrl as isBlockedFetchUrl, extension_isBlockedFrameUrl as isBlockedFrameUrl, extension_isExtensionExposed as isExtensionExposed, extension_isType as isType, extension_modifyRequestHeadersPermission as modifyRequestHeadersPermission, extension_permissions as permissions, extension_promptInstall as promptInstall, extension_readCookiePermission as readCookiePermission, extension_removeRequestHeaderRule as removeRequestHeaderRule, extension_revive as revive, extension_setMissingExtensionHandler as setMissingExtensionHandler, extension_setRequestHeaderRule as setRequestHeaderRule, extension_type as type, extension_waitForExtensionExposure as waitForExtensionExposure };
|
|
1836
|
+
export { extension_ATTACH_FRAME_EVENT_KEY as ATTACH_FRAME_EVENT_KEY, extension_assertAttachableFrameUrl as assertAttachableFrameUrl, extension_assertFetchableUrl as assertFetchableUrl, extension_attachFrame as attachFrame, extension_attachFramePermission as attachFramePermission, isExtensionAvailable as available, extension_box as box, extension_cookies as cookies, extension_createVideoElementHandle as createVideoElementHandle, extension$1 as events, extension$1 as extension, fetch$2 as fetch, extension_fetchCredentialedPermission as fetchCredentialedPermission, extension_fetchLocalPermission as fetchLocalPermission, extension_fetchPermission as fetchPermission, extension_gotoPermission as gotoPermission, extension_handleRevivableModules as handleRevivableModules, extension_isBlockedFetchUrl as isBlockedFetchUrl, extension_isBlockedFrameUrl as isBlockedFrameUrl, extension_isExtensionExposed as isExtensionExposed, extension_isLocalNetworkUrl as isLocalNetworkUrl, extension_isType as isType, extension_modifyRequestHeadersPermission as modifyRequestHeadersPermission, extension_permissions as permissions, extension_promptInstall as promptInstall, extension_readCookiePermission as readCookiePermission, extension_removeRequestHeaderRule as removeRequestHeaderRule, extension_revive as revive, extension_setMissingExtensionHandler as setMissingExtensionHandler, extension_setRequestHeaderRule as setRequestHeaderRule, extension_type as type, extension_waitForExtensionExposure as waitForExtensionExposure };
|
|
1816
1837
|
export type { extension_AttachFrameOptions as AttachFrameOptions, extension_BoxedVideoElement as BoxedVideoElement, extension_CookieDetails as CookieDetails, extension_FetchInit as FetchInit, extension_Frame as Frame, extension_GotoOptions as GotoOptions, extension_HeaderOperation as HeaderOperation, extension_PermissionGrant as PermissionGrant, extension_PermissionRequest as PermissionRequest, extension_ProxyFetchRequest as ProxyFetchRequest, extension_RemoteVideoElement as RemoteVideoElement, extension_RequestHeaderRule as RequestHeaderRule, extension_SiteCookie as SiteCookie, extension_VideoElementState as VideoElementState };
|
|
1817
1838
|
}
|
|
1818
1839
|
|
|
@@ -1880,5 +1901,7 @@ declare const relayWorker: (worker: Worker, options?: {
|
|
|
1880
1901
|
originB?: string;
|
|
1881
1902
|
}) => void;
|
|
1882
1903
|
|
|
1883
|
-
|
|
1904
|
+
declare const connect: () => Promise<boolean>;
|
|
1905
|
+
|
|
1906
|
+
export { ATTACH_FRAME_EVENT_KEY, assertAttachableFrameUrl, assertFetchableUrl, attachFrame, attachFramePermission, box, cloud, connect, cookies, createVideoElementHandle, desktop, dgram$1 as dgram, dns$1 as dns, extension, fetch$1 as fetch, fetchCredentialedPermission, fetchLocalPermission, fetchPermission, fs, gotoPermission, handleRevivableModules, http, isBlockedFetchUrl, isBlockedFrameUrl, isExtensionExposed, isLocalNetworkUrl, isType, modifyRequestHeadersPermission, net$1 as net, permissions, promptInstall, readCookiePermission, relayWorker, removeRequestHeaderRule, revive, setMissingExtensionHandler, setRequestHeaderRule, type, waitForExtensionExposure };
|
|
1884
1907
|
export type { AttachFrameOptions, BoxedVideoElement, CookieDetails, FetchInit, Frame, GotoOptions, HeaderOperation, PermissionGrant, PermissionRequest, ProxyFetchRequest, RemoteVideoElement, RequestHeaderRule, SiteCookie, VideoElementState };
|
package/index.js
CHANGED
|
@@ -50,7 +50,28 @@ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie]
|
|
|
50
50
|
unsafe: !0,
|
|
51
51
|
title: "Fetch from other sites, signed in as you",
|
|
52
52
|
description: "Lets the app fetch other sites using your logged-in session cookies, so it can read data only you should see."
|
|
53
|
-
}, le =
|
|
53
|
+
}, le = {
|
|
54
|
+
scope: "network.fetchLocal",
|
|
55
|
+
category: "network",
|
|
56
|
+
severity: 3,
|
|
57
|
+
unsafe: !0,
|
|
58
|
+
title: "Access devices on your local network",
|
|
59
|
+
description: "Lets the app reach devices and services on your home or work network, which websites normally cannot touch."
|
|
60
|
+
}, ue = (e) => {
|
|
61
|
+
let t = e.match(/^(\d+)\.(\d+)\.\d+\.\d+$/);
|
|
62
|
+
if (!t) return !1;
|
|
63
|
+
let [n, r] = [Number(t[1]), Number(t[2])];
|
|
64
|
+
return n === 10 || n === 127 || n === 0 || n === 169 && r === 254 || n === 172 && r >= 16 && r <= 31 || n === 192 && r === 168;
|
|
65
|
+
}, de = (e) => {
|
|
66
|
+
let t;
|
|
67
|
+
try {
|
|
68
|
+
t = new URL(e);
|
|
69
|
+
} catch {
|
|
70
|
+
return !1;
|
|
71
|
+
}
|
|
72
|
+
let n = t.hostname.replace(/^\[|\]$/g, "").toLowerCase().replace(/\.$/, "");
|
|
73
|
+
return n === "localhost" || n.endsWith(".localhost") || n.endsWith(".local") || n.endsWith(".internal") || n.endsWith(".home.arpa") ? !0 : n.includes(":") ? n === "::" || n === "::1" || n.startsWith("fc") || n.startsWith("fd") || /^fe[89ab]/.test(n) || n.startsWith("::ffff:") : ue(n);
|
|
74
|
+
}, fe = ["fkn.app", "fkn.dev"], x = (e) => {
|
|
54
75
|
let t;
|
|
55
76
|
try {
|
|
56
77
|
t = new URL(e);
|
|
@@ -59,12 +80,12 @@ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie]
|
|
|
59
80
|
}
|
|
60
81
|
if (t.protocol === "chrome-extension:" || t.protocol === "moz-extension:") return !0;
|
|
61
82
|
let n = t.hostname;
|
|
62
|
-
return
|
|
83
|
+
return fe.some((e) => n === e || n.endsWith(`.${e}`));
|
|
63
84
|
}, S = (e) => {
|
|
64
85
|
if (x(e)) throw Error("fetch: refusing to target the extension's own pages or FKN platform domains");
|
|
65
|
-
},
|
|
86
|
+
}, pe = ["origin", "referer"], me = (e) => {
|
|
66
87
|
if (!e?.headers) return;
|
|
67
|
-
let t = new Headers(e.headers), n =
|
|
88
|
+
let t = new Headers(e.headers), n = pe.map((e) => {
|
|
68
89
|
let n = t.get(e);
|
|
69
90
|
return n === null ? void 0 : [e, n];
|
|
70
91
|
}).filter((e) => e !== void 0);
|
|
@@ -80,25 +101,25 @@ var g = () => typeof document > "u" ? !1 : document.documentElement.dataset[ie]
|
|
|
80
101
|
body: r,
|
|
81
102
|
credentials: t?.credentials === "include" ? "include" : "omit",
|
|
82
103
|
redirect: n.redirect,
|
|
83
|
-
unsafeHeaders:
|
|
104
|
+
unsafeHeaders: me(t),
|
|
84
105
|
reason: t?.reason,
|
|
85
106
|
signal: t?.signal ?? void 0
|
|
86
107
|
});
|
|
87
|
-
},
|
|
108
|
+
}, he = {
|
|
88
109
|
scope: "network.readCookie",
|
|
89
110
|
category: "network",
|
|
90
111
|
severity: 3,
|
|
91
112
|
unsafe: !0,
|
|
92
113
|
title: "Read a site’s cookie",
|
|
93
114
|
description: "Lets the app read a named cookie from another site, which can include the login token only that site should see."
|
|
94
|
-
},
|
|
115
|
+
}, ge = { get: (e) => b.getCookie(e) }, _e = {
|
|
95
116
|
scope: "network.modifyRequestHeaders",
|
|
96
117
|
category: "network",
|
|
97
118
|
severity: 2,
|
|
98
119
|
unsafe: !0,
|
|
99
120
|
title: "Rewrite request headers to other sites",
|
|
100
121
|
description: "Lets the app set or remove headers (like Origin and Referer) on this page’s own requests to the listed sites."
|
|
101
|
-
},
|
|
122
|
+
}, ve = (e) => b.setRequestHeaderRule(e), ye = (e) => b.removeRequestHeaderRule({ ruleId: e });
|
|
102
123
|
(() => {
|
|
103
124
|
let e = {}, t = [...c.selectorModules, ...r.selectorModules];
|
|
104
125
|
for (let n of t) n.render && !(n.type in e) && (e[n.type] = n.render);
|
|
@@ -120,19 +141,19 @@ var w = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", T = (e) => {
|
|
|
120
141
|
return n === "fkn.app" || n.endsWith(".fkn.app");
|
|
121
142
|
}, E = (e) => {
|
|
122
143
|
if (T(e)) throw Error("attachFrame: refusing to target the extension's own pages or fkn.app");
|
|
123
|
-
},
|
|
144
|
+
}, be = {
|
|
124
145
|
scope: "embed.iframe",
|
|
125
146
|
category: "embed",
|
|
126
147
|
severity: 0,
|
|
127
148
|
title: "Load another website inside this app",
|
|
128
149
|
description: "Lets the app embed external pages directly inside its own view."
|
|
129
|
-
},
|
|
150
|
+
}, xe = {
|
|
130
151
|
scope: "embed.open",
|
|
131
152
|
category: "embed",
|
|
132
153
|
severity: 0,
|
|
133
154
|
title: "Open a website inside this app",
|
|
134
155
|
description: "Lets the app navigate to another site without leaving its window."
|
|
135
|
-
},
|
|
156
|
+
}, Se = async ({ iframe: e, domains: t = [] }) => {
|
|
136
157
|
let n = crypto.randomUUID();
|
|
137
158
|
if (E(e.src), await y(), !e.isConnected) throw Error("attachFrame: the iframe must be connected to the document before attaching");
|
|
138
159
|
e.dispatchEvent(new CustomEvent(w, { detail: n }));
|
|
@@ -148,22 +169,22 @@ var w = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", T = (e) => {
|
|
|
148
169
|
goto: c,
|
|
149
170
|
url: l
|
|
150
171
|
};
|
|
151
|
-
},
|
|
172
|
+
}, Ce = { request: (e) => b.requestPermissions(e.map((e) => ({
|
|
152
173
|
key: e.key,
|
|
153
174
|
scope: e.scope ?? "",
|
|
154
175
|
reason: e.reason
|
|
155
|
-
}))) },
|
|
176
|
+
}))) }, we = 32, Te = typeof CSS < "u" && CSS.supports("clip-path", "path('M0 0H1V1H0Z')"), Ee = (e) => {
|
|
156
177
|
let t = e.style;
|
|
157
178
|
t.setProperty("display", "block", "important"), t.setProperty("position", "fixed", "important"), t.setProperty("top", "0", "important"), t.setProperty("left", "0", "important"), t.setProperty("width", "100%", "important"), t.setProperty("height", "100%", "important"), t.setProperty("border", "none", "important"), t.setProperty("clip-path", "inset(100%)", "important"), t.setProperty("background", "transparent"), t.setProperty("color-scheme", "normal"), t.setProperty("z-index", "2147483647"), e.setAttribute("title", "FKN");
|
|
158
|
-
},
|
|
159
|
-
if (!
|
|
179
|
+
}, De = ({ x: e, y: t, width: n, height: r }) => `M${e} ${t}h${n}v${r}h${-n}Z`, Oe = (e, { modal: t, rects: n }) => {
|
|
180
|
+
if (!Te) {
|
|
160
181
|
let r = t || n.length > 0;
|
|
161
182
|
e.style.setProperty("pointer-events", r ? "auto" : "none", "important"), e.style.setProperty("visibility", r ? "visible" : "hidden", "important");
|
|
162
183
|
return;
|
|
163
184
|
}
|
|
164
|
-
let r = t ? "none" : n.length === 0 ? "inset(100%)" : `path('${n.map(
|
|
185
|
+
let r = t ? "none" : n.length === 0 ? "inset(100%)" : `path('${n.map(De).join("")}')`, i = r === "none" || CSS.supports("clip-path", r) ? r : "inset(100%)";
|
|
165
186
|
e.style.setProperty("clip-path", i, "important");
|
|
166
|
-
},
|
|
187
|
+
}, ke = (e) => {
|
|
167
188
|
if (typeof e != "object" || !e) return null;
|
|
168
189
|
let { x: t, y: n, width: r, height: i } = e;
|
|
169
190
|
if (![
|
|
@@ -179,45 +200,45 @@ var w = "FKN_WEB_EXTENSION_ATTACH_FRAME_EVENT_KEY", T = (e) => {
|
|
|
179
200
|
width: l - s,
|
|
180
201
|
height: u - c
|
|
181
202
|
};
|
|
182
|
-
},
|
|
203
|
+
}, Ae = (e) => {
|
|
183
204
|
if (typeof e != "object" || !e) return null;
|
|
184
|
-
let t = e, n = (Array.isArray(t.rects) ? t.rects.slice(0,
|
|
205
|
+
let t = e, n = (Array.isArray(t.rects) ? t.rects.slice(0, we) : []).map(ke).filter((e) => e !== null && e.width > 0 && e.height > 0);
|
|
185
206
|
return {
|
|
186
207
|
modal: t.modal === !0,
|
|
187
208
|
rects: n
|
|
188
209
|
};
|
|
189
|
-
}, D = null,
|
|
190
|
-
|
|
210
|
+
}, D = null, je = () => D !== null, Me = (e) => {
|
|
211
|
+
Ee(e), Oe(e, {
|
|
191
212
|
modal: !1,
|
|
192
213
|
rects: []
|
|
193
214
|
}), D = e;
|
|
194
|
-
},
|
|
215
|
+
}, Ne = (e) => {
|
|
195
216
|
if (!D) return;
|
|
196
|
-
let t =
|
|
197
|
-
t &&
|
|
198
|
-
},
|
|
199
|
-
!
|
|
200
|
-
var A =
|
|
201
|
-
A && O &&
|
|
217
|
+
let t = Ae(e);
|
|
218
|
+
t && Oe(D, t);
|
|
219
|
+
}, Pe = "https://fkn.app", O = typeof globalThis < "u" && globalThis.document ? globalThis.document : void 0, Fe = O?.querySelector(`iframe[src="${Pe}/api"]`) ?? null, k = O?.createElement("iframe") ?? null;
|
|
220
|
+
!Fe && k && O && (k.src = `${Pe}/api`, O.body.appendChild(k));
|
|
221
|
+
var A = Fe ?? k, Ie = A?.contentWindow ?? null;
|
|
222
|
+
A && O && Me(A);
|
|
202
223
|
var j = (() => {
|
|
203
|
-
if (typeof window < "u") return
|
|
224
|
+
if (typeof window < "u") return Ie ? {
|
|
204
225
|
receive: window,
|
|
205
|
-
emit:
|
|
226
|
+
emit: Ie
|
|
206
227
|
} : void 0;
|
|
207
228
|
if (typeof self < "u") return {
|
|
208
229
|
receive: self,
|
|
209
230
|
emit: self
|
|
210
231
|
};
|
|
211
|
-
})(),
|
|
232
|
+
})(), Le = j !== void 0, M = j ? ee({}, {
|
|
212
233
|
key: "fkn-api",
|
|
213
234
|
transport: j
|
|
214
235
|
}) : new Promise(() => {});
|
|
215
236
|
M.then((e) => {
|
|
216
|
-
|
|
237
|
+
je() && e.overlay.setHost(Ne);
|
|
217
238
|
}, () => {});
|
|
218
239
|
//#endregion
|
|
219
240
|
//#region src/lib/fkn-target.ts
|
|
220
|
-
var
|
|
241
|
+
var Re = ["fkn.app", "fkn.dev"], ze = (e) => {
|
|
221
242
|
let t = typeof e == "string" ? e : e instanceof URL ? e.href : e.url, n;
|
|
222
243
|
try {
|
|
223
244
|
n = new URL(t);
|
|
@@ -225,8 +246,8 @@ var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
|
|
|
225
246
|
return;
|
|
226
247
|
}
|
|
227
248
|
let r = n.hostname;
|
|
228
|
-
if (
|
|
229
|
-
},
|
|
249
|
+
if (Re.some((e) => r === e || r.endsWith(`.${e}`))) throw Error(`fetch refuses FKN platform domains (${r})`);
|
|
250
|
+
}, Be = (e, t) => (ze(e), M.then((n) => n.cloud.fetch(e, t))), Ve = async () => {
|
|
230
251
|
let e = await M.then((e) => e.cloud.quota());
|
|
231
252
|
return {
|
|
232
253
|
premium: e.premium,
|
|
@@ -238,9 +259,9 @@ var Fe = ["fkn.app", "fkn.dev"], Ie = (e) => {
|
|
|
238
259
|
bytesPerSecond: e.bytesPerSecond,
|
|
239
260
|
bitsPerSecond: e.bytesPerSecond * 8
|
|
240
261
|
};
|
|
241
|
-
},
|
|
262
|
+
}, He = /* @__PURE__ */ n({ lookup: () => Ue }), Ue = (e, t) => M.then((n) => n.cloud.dns.lookup(e, t)), We = new TextEncoder();
|
|
242
263
|
new TextDecoder();
|
|
243
|
-
var N = (e) => f.isValid(e), P = (e) => p.isValid(e),
|
|
264
|
+
var N = (e) => f.isValid(e), P = (e) => p.isValid(e), Ge = (e) => N(e) ? 4 : P(e) ? 6 : 0, Ke = (...e) => {
|
|
244
265
|
if (typeof e[0] == "string") throw Error("FKN WebVPN does not support IPC connections");
|
|
245
266
|
let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0;
|
|
246
267
|
return e[0] && typeof e[0] == "object" ? {
|
|
@@ -251,7 +272,7 @@ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), He = (e) => N(e) ? 4 : P(e
|
|
|
251
272
|
host: typeof e[1] == "string" ? e[1] : void 0,
|
|
252
273
|
callback: t
|
|
253
274
|
};
|
|
254
|
-
},
|
|
275
|
+
}, qe = (...e) => {
|
|
255
276
|
let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0, n = e[0] ?? 0, r = typeof e[1] == "string" ? e[1] : void 0;
|
|
256
277
|
return typeof e[0] == "object" ? {
|
|
257
278
|
...e[0],
|
|
@@ -263,7 +284,7 @@ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), He = (e) => N(e) ? 4 : P(e
|
|
|
263
284
|
port: n,
|
|
264
285
|
callback: t
|
|
265
286
|
};
|
|
266
|
-
},
|
|
287
|
+
}, Je = (...e) => {
|
|
267
288
|
let t = typeof e.at(-1) == "function" ? e.at(-1) : void 0, n = e[0];
|
|
268
289
|
if (typeof e[2] == "number") return {
|
|
269
290
|
message: n,
|
|
@@ -288,15 +309,15 @@ var N = (e) => f.isValid(e), P = (e) => p.isValid(e), He = (e) => N(e) ? 4 : P(e
|
|
|
288
309
|
new TextEncoder(), new TextDecoder();
|
|
289
310
|
//#endregion
|
|
290
311
|
//#region src/lib/webvpn/net.ts
|
|
291
|
-
var
|
|
312
|
+
var Ye = /* @__PURE__ */ n({
|
|
292
313
|
Server: () => I,
|
|
293
314
|
Socket: () => F,
|
|
294
|
-
_default: () =>
|
|
295
|
-
connect: () =>
|
|
296
|
-
createConnection: () =>
|
|
297
|
-
createServer: () =>
|
|
298
|
-
default: () =>
|
|
299
|
-
isIP: () =>
|
|
315
|
+
_default: () => $e,
|
|
316
|
+
connect: () => Xe,
|
|
317
|
+
createConnection: () => Ze,
|
|
318
|
+
createServer: () => Qe,
|
|
319
|
+
default: () => $e,
|
|
320
|
+
isIP: () => Ge,
|
|
300
321
|
isIPv4: () => N,
|
|
301
322
|
isIPv6: () => P
|
|
302
323
|
}), F = class extends d.Duplex {
|
|
@@ -359,7 +380,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
359
380
|
}).catch(n);
|
|
360
381
|
}
|
|
361
382
|
connect(...e) {
|
|
362
|
-
let t =
|
|
383
|
+
let t = Ke(...e), n = this.__webvpn_tcp_socket_init__(M.then((e) => e.cloud.webvpn.tcpSocket({
|
|
363
384
|
remoteAddress: t.host ?? "localhost",
|
|
364
385
|
remotePort: t.port
|
|
365
386
|
})));
|
|
@@ -504,7 +525,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
504
525
|
}), this._webVPNTcpSocketListenerPromise;
|
|
505
526
|
}
|
|
506
527
|
listen(...e) {
|
|
507
|
-
let t =
|
|
528
|
+
let t = Ke(...e), n = (e) => {
|
|
508
529
|
let t = new F({ connection: Promise.resolve(e) });
|
|
509
530
|
this.emit("connection", t);
|
|
510
531
|
}, r = (e) => M.then((r) => r.cloud.webvpn.tcpSocketListener({
|
|
@@ -541,23 +562,23 @@ var Ke = /* @__PURE__ */ n({
|
|
|
541
562
|
connections;
|
|
542
563
|
listening;
|
|
543
564
|
async [Symbol.asyncDispose]() {}
|
|
544
|
-
},
|
|
565
|
+
}, Xe = (e, t) => new F().connect(e, t), Ze = (e, t) => new F().connect(e, t), Qe = (e, t) => {
|
|
545
566
|
typeof e == "function" && (t = e, e = void 0);
|
|
546
567
|
let n = new I(e);
|
|
547
568
|
return t && n.on("connection", t), n;
|
|
548
|
-
},
|
|
569
|
+
}, $e = {
|
|
549
570
|
Socket: F,
|
|
550
571
|
Server: I,
|
|
551
|
-
connect:
|
|
552
|
-
createConnection:
|
|
553
|
-
createServer:
|
|
554
|
-
isIP:
|
|
572
|
+
connect: Xe,
|
|
573
|
+
createConnection: Ze,
|
|
574
|
+
createServer: Qe,
|
|
575
|
+
isIP: Ge,
|
|
555
576
|
isIPv4: N,
|
|
556
577
|
isIPv6: P
|
|
557
|
-
},
|
|
558
|
-
Socket: () =>
|
|
559
|
-
createSocket: () =>
|
|
560
|
-
}),
|
|
578
|
+
}, et = /* @__PURE__ */ n({
|
|
579
|
+
Socket: () => tt,
|
|
580
|
+
createSocket: () => it
|
|
581
|
+
}), tt = class extends ne {
|
|
561
582
|
_type;
|
|
562
583
|
_localAddress;
|
|
563
584
|
_remoteAddress;
|
|
@@ -627,7 +648,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
627
648
|
}
|
|
628
649
|
}
|
|
629
650
|
_peerTail(e, t) {
|
|
630
|
-
if (e === void 0 || t === void 0) return
|
|
651
|
+
if (e === void 0 || t === void 0) return nt;
|
|
631
652
|
let n = `${e}|${t}`, r = this._peerTailCache.get(n);
|
|
632
653
|
if (r) return r;
|
|
633
654
|
let i = f.isValid(e) ? L(e) : R(e), a = new Uint8Array(1 + i.byteLength + 2);
|
|
@@ -671,7 +692,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
671
692
|
return this._localAddress;
|
|
672
693
|
}
|
|
673
694
|
bind(...e) {
|
|
674
|
-
let t =
|
|
695
|
+
let t = qe(...e), n = this._type === "udp6" ? "::" : "0.0.0.0";
|
|
675
696
|
return this._webVPNUdpSocketPromise = M.then((e) => e.cloud.webvpn.udpSocket({
|
|
676
697
|
type: this._type,
|
|
677
698
|
address: t.address ?? n,
|
|
@@ -783,11 +804,11 @@ var Ke = /* @__PURE__ */ n({
|
|
|
783
804
|
}
|
|
784
805
|
send(...e) {
|
|
785
806
|
this._webVPNUdpSocketPromise || this.bind();
|
|
786
|
-
let t =
|
|
807
|
+
let t = Je(...e), n = this._type === "udp6" ? "::1" : "127.0.0.1";
|
|
787
808
|
if (!this._webVPNUdpSocketPromise) throw Error("Socket not bound");
|
|
788
809
|
this._webVPNUdpSocketPromise.then((e) => {
|
|
789
810
|
if (!e) throw Error("Socket not bound");
|
|
790
|
-
let r =
|
|
811
|
+
let r = rt(t.message), i = t.callback, a = t.address ?? n, o = this._remoteAddress !== void 0 && t.address === void 0;
|
|
791
812
|
if (this._dataPort && (o || f.isValid(a) || p.isValid(a))) {
|
|
792
813
|
this._portSend(r, o ? void 0 : a, o ? void 0 : t.port), i?.call(this, null, r.byteLength);
|
|
793
814
|
return;
|
|
@@ -849,12 +870,12 @@ var Ke = /* @__PURE__ */ n({
|
|
|
849
870
|
this.close(e);
|
|
850
871
|
});
|
|
851
872
|
}
|
|
852
|
-
},
|
|
853
|
-
if (typeof e == "string") return
|
|
873
|
+
}, nt = new Uint8Array([2]), rt = (e) => {
|
|
874
|
+
if (typeof e == "string") return We.encode(e);
|
|
854
875
|
if (e instanceof Uint8Array) return e;
|
|
855
876
|
if (ArrayBuffer.isView(e)) return new Uint8Array(e.buffer, e.byteOffset, e.byteLength);
|
|
856
877
|
if (Array.isArray(e)) {
|
|
857
|
-
let t = e.map(
|
|
878
|
+
let t = e.map(rt), n = new Uint8Array(t.reduce((e, t) => e + t.byteLength, 0)), r = 0;
|
|
858
879
|
for (let e of t) n.set(e, r), r += e.byteLength;
|
|
859
880
|
return n;
|
|
860
881
|
}
|
|
@@ -867,25 +888,25 @@ var Ke = /* @__PURE__ */ n({
|
|
|
867
888
|
let t = new p(e).getBitsBase16(0, 128).match(/.{2}/g);
|
|
868
889
|
if (!t || t.length !== 16) throw Error(`Invalid IPv6 address: ${e}`);
|
|
869
890
|
return new Uint8Array(t.map((e) => parseInt(e, 16)));
|
|
870
|
-
},
|
|
871
|
-
let n = new
|
|
891
|
+
}, it = (e, t) => {
|
|
892
|
+
let n = new tt(typeof e == "string" ? { type: e } : e);
|
|
872
893
|
return t && n.on("message", t), n;
|
|
873
|
-
},
|
|
894
|
+
}, at = /* @__PURE__ */ n({
|
|
874
895
|
Agent: () => Y,
|
|
875
896
|
ClientRequest: () => q,
|
|
876
897
|
HTTPParser: () => U,
|
|
877
898
|
IncomingMessage: () => W,
|
|
878
|
-
METHODS: () =>
|
|
899
|
+
METHODS: () => st,
|
|
879
900
|
STATUS_CODES: () => z,
|
|
880
901
|
Server: () => J,
|
|
881
902
|
ServerResponse: () => K,
|
|
882
|
-
_default: () =>
|
|
883
|
-
createServer: () =>
|
|
884
|
-
default: () =>
|
|
885
|
-
get: () =>
|
|
886
|
-
globalAgent: () =>
|
|
903
|
+
_default: () => vt,
|
|
904
|
+
createServer: () => _t,
|
|
905
|
+
default: () => vt,
|
|
906
|
+
get: () => gt,
|
|
907
|
+
globalAgent: () => ht,
|
|
887
908
|
request: () => X
|
|
888
|
-
}),
|
|
909
|
+
}), ot = new TextDecoder("latin1"), st = /* @__PURE__ */ "ACL.BIND.CHECKOUT.CONNECT.COPY.DELETE.GET.HEAD.LINK.LOCK.M-SEARCH.MERGE.MKACTIVITY.MKCALENDAR.MKCOL.MOVE.NOTIFY.OPTIONS.PATCH.POST.PROPFIND.PROPPATCH.PURGE.PUT.REBIND.REPORT.SEARCH.SOURCE.SUBSCRIBE.TRACE.UNBIND.UNLINK.UNLOCK.UNSUBSCRIBE".split("."), z = {
|
|
889
910
|
100: "Continue",
|
|
890
911
|
101: "Switching Protocols",
|
|
891
912
|
102: "Processing",
|
|
@@ -949,7 +970,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
949
970
|
509: "Bandwidth Limit Exceeded",
|
|
950
971
|
510: "Not Extended",
|
|
951
972
|
511: "Network Authentication Required"
|
|
952
|
-
},
|
|
973
|
+
}, ct = new Set([
|
|
953
974
|
"content-type",
|
|
954
975
|
"content-length",
|
|
955
976
|
"user-agent",
|
|
@@ -968,15 +989,15 @@ var Ke = /* @__PURE__ */ n({
|
|
|
968
989
|
"server",
|
|
969
990
|
"age",
|
|
970
991
|
"expires"
|
|
971
|
-
]), B = 13, V = 10,
|
|
992
|
+
]), B = 13, V = 10, lt = /^[\^_`a-zA-Z\-0-9!#$%&'*+.|~]+$/, H = (e, t) => (e.code = t, e), ut = (e, t) => {
|
|
972
993
|
if (e.length === 0) return t;
|
|
973
994
|
if (t.length === 0) return e;
|
|
974
995
|
let n = new Uint8Array(e.length + t.length);
|
|
975
996
|
return n.set(e, 0), n.set(t, e.length), n;
|
|
976
|
-
},
|
|
997
|
+
}, dt = (e, t) => {
|
|
977
998
|
for (let n = t; n + 1 < e.length; n++) if (e[n] === B && e[n + 1] === V) return n;
|
|
978
999
|
return -1;
|
|
979
|
-
},
|
|
1000
|
+
}, ft = (e) => {
|
|
980
1001
|
for (let t = 0; t + 3 < e.length; t++) if (e[t] === B && e[t + 1] === V && e[t + 2] === B && e[t + 3] === V) return t;
|
|
981
1002
|
return -1;
|
|
982
1003
|
}, U = class {
|
|
@@ -990,10 +1011,10 @@ var Ke = /* @__PURE__ */ n({
|
|
|
990
1011
|
this.mode = e, this.handlers = t;
|
|
991
1012
|
}
|
|
992
1013
|
execute(e) {
|
|
993
|
-
this.buf =
|
|
1014
|
+
this.buf = ut(this.buf, e);
|
|
994
1015
|
let t = !0;
|
|
995
1016
|
for (; t;) if (t = !1, this.state === "HEAD") {
|
|
996
|
-
let e =
|
|
1017
|
+
let e = ft(this.buf);
|
|
997
1018
|
if (e === -1) return;
|
|
998
1019
|
let n = this.buf.subarray(0, e);
|
|
999
1020
|
this.buf = this.buf.subarray(e + 4);
|
|
@@ -1008,7 +1029,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1008
1029
|
this.state = "HEAD", this.framing = "none", this.bodyRemaining = 0, this.chunkState = "size", this.skipBody = !1;
|
|
1009
1030
|
}
|
|
1010
1031
|
parseHead(e) {
|
|
1011
|
-
let t =
|
|
1032
|
+
let t = ot.decode(e).split("\r\n"), n = t.shift() ?? "", r = [];
|
|
1012
1033
|
for (let e of t) (e.startsWith(" ") || e.startsWith(" ")) && r.length > 0 ? r[r.length - 1] += " " + e.trim() : r.push(e);
|
|
1013
1034
|
let i = [], a = {};
|
|
1014
1035
|
for (let e of r) {
|
|
@@ -1046,7 +1067,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1046
1067
|
return;
|
|
1047
1068
|
}
|
|
1048
1069
|
let i = e[r];
|
|
1049
|
-
i === void 0 ? e[r] = n :
|
|
1070
|
+
i === void 0 ? e[r] = n : ct.has(r) || (e[r] = `${i}, ${n}`);
|
|
1050
1071
|
}
|
|
1051
1072
|
setupBody(e) {
|
|
1052
1073
|
if (this.skipBody) {
|
|
@@ -1079,9 +1100,9 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1079
1100
|
}
|
|
1080
1101
|
consumeChunked() {
|
|
1081
1102
|
for (;;) if (this.chunkState === "size") {
|
|
1082
|
-
let e =
|
|
1103
|
+
let e = dt(this.buf, 0);
|
|
1083
1104
|
if (e === -1) return !1;
|
|
1084
|
-
let t =
|
|
1105
|
+
let t = ot.decode(this.buf.subarray(0, e)), n = parseInt(t.split(";")[0].trim(), 16);
|
|
1085
1106
|
if (this.buf = this.buf.subarray(e + 2), Number.isNaN(n)) return !0;
|
|
1086
1107
|
n === 0 ? this.chunkState = "trailer" : (this.bodyRemaining = n, this.chunkState = "data");
|
|
1087
1108
|
} else if (this.chunkState === "data") {
|
|
@@ -1092,13 +1113,13 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1092
1113
|
if (this.buf.length < 2) return !1;
|
|
1093
1114
|
this.buf = this.buf.subarray(2), this.chunkState = "size";
|
|
1094
1115
|
} else {
|
|
1095
|
-
let e =
|
|
1116
|
+
let e = dt(this.buf, 0);
|
|
1096
1117
|
if (e === -1) return !1;
|
|
1097
1118
|
let t = e === 0;
|
|
1098
1119
|
if (this.buf = this.buf.subarray(e + 2), t) return !0;
|
|
1099
1120
|
}
|
|
1100
1121
|
}
|
|
1101
|
-
},
|
|
1122
|
+
}, pt = (e, t) => m.isBuffer(e) ? e : typeof e == "string" ? m.from(e, t ?? "utf8") : e instanceof Uint8Array ? m.from(e) : e instanceof ArrayBuffer ? m.from(new Uint8Array(e)) : m.from(String(e)), W = class extends d.Readable {
|
|
1102
1123
|
httpVersion = "1.1";
|
|
1103
1124
|
httpVersionMajor = 1;
|
|
1104
1125
|
httpVersionMinor = 1;
|
|
@@ -1133,7 +1154,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1133
1154
|
_bodyWritten = !1;
|
|
1134
1155
|
setHeader(e, t) {
|
|
1135
1156
|
if (this.headersSent) throw H(/* @__PURE__ */ Error("Cannot set headers after they are sent to the client"), "ERR_HTTP_HEADERS_SENT");
|
|
1136
|
-
if (typeof e != "string" || !
|
|
1157
|
+
if (typeof e != "string" || !lt.test(e)) throw H(/* @__PURE__ */ TypeError(`Header name must be a valid HTTP token [${JSON.stringify(String(e))}]`), "ERR_INVALID_HTTP_TOKEN");
|
|
1137
1158
|
if (t === void 0) throw H(/* @__PURE__ */ TypeError(`Invalid value "undefined" for header "${e}"`), "ERR_HTTP_INVALID_HEADER_VALUE");
|
|
1138
1159
|
return this._headerStore.set(e.toLowerCase(), [e, Array.isArray(t) ? [...t] : t]), this;
|
|
1139
1160
|
}
|
|
@@ -1174,7 +1195,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1174
1195
|
return this._bodyWritten = !0, super.write(e, t, n);
|
|
1175
1196
|
}
|
|
1176
1197
|
_write(e, t, n) {
|
|
1177
|
-
let r =
|
|
1198
|
+
let r = pt(e), i = [];
|
|
1178
1199
|
if (this.headersSent ||= (this._implicitHeader(), i.push(m.from(this._headBlock, "latin1")), !0), this.chunkedEncoding ? r.length > 0 && (i.push(m.from(`${r.length.toString(16)}\r\n`, "latin1")), i.push(r), i.push(m.from("\r\n", "latin1"))) : i.push(r), i.length === 0) {
|
|
1179
1200
|
n();
|
|
1180
1201
|
return;
|
|
@@ -1192,7 +1213,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1192
1213
|
end(e, t, n) {
|
|
1193
1214
|
if (e != null && typeof e != "function" && !this._bodyWritten && !this.headersSent && !this.chunkedEncoding && !this.hasHeader("content-length")) {
|
|
1194
1215
|
let n = typeof t == "string" ? t : void 0;
|
|
1195
|
-
this.setHeader("Content-Length",
|
|
1216
|
+
this.setHeader("Content-Length", pt(e, n).length);
|
|
1196
1217
|
}
|
|
1197
1218
|
return super.end(e, t, n);
|
|
1198
1219
|
}
|
|
@@ -1241,7 +1262,7 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1241
1262
|
setTimeout(e, t) {
|
|
1242
1263
|
return this.socket?.setTimeout(e, t), this;
|
|
1243
1264
|
}
|
|
1244
|
-
},
|
|
1265
|
+
}, mt = (...e) => {
|
|
1245
1266
|
let t = {}, n = {}, r, i = [...e], a = i.shift();
|
|
1246
1267
|
if (typeof a == "string" || a instanceof URL) {
|
|
1247
1268
|
let e = typeof a == "string" ? new URL(a) : a;
|
|
@@ -1382,34 +1403,34 @@ var Ke = /* @__PURE__ */ n({
|
|
|
1382
1403
|
return `${e.host ?? "localhost"}:${e.port ?? ""}:${e.localAddress ?? ""}`;
|
|
1383
1404
|
}
|
|
1384
1405
|
destroy() {}
|
|
1385
|
-
},
|
|
1386
|
-
let { options: t, callback: n } =
|
|
1406
|
+
}, ht = new Y(), X = (...e) => {
|
|
1407
|
+
let { options: t, callback: n } = mt(...e);
|
|
1387
1408
|
return new q(t, n);
|
|
1388
|
-
},
|
|
1409
|
+
}, gt = (...e) => {
|
|
1389
1410
|
let t = X(...e);
|
|
1390
1411
|
return t.end(), t;
|
|
1391
|
-
},
|
|
1392
|
-
METHODS:
|
|
1412
|
+
}, _t = (e, t) => new J(e, t), vt = {
|
|
1413
|
+
METHODS: st,
|
|
1393
1414
|
STATUS_CODES: z,
|
|
1394
1415
|
Agent: Y,
|
|
1395
|
-
globalAgent:
|
|
1416
|
+
globalAgent: ht,
|
|
1396
1417
|
Server: J,
|
|
1397
1418
|
ServerResponse: K,
|
|
1398
1419
|
IncomingMessage: W,
|
|
1399
1420
|
ClientRequest: q,
|
|
1400
1421
|
OutgoingMessage: G,
|
|
1401
|
-
createServer:
|
|
1422
|
+
createServer: _t,
|
|
1402
1423
|
request: X,
|
|
1403
|
-
get:
|
|
1404
|
-
},
|
|
1405
|
-
available: () =>
|
|
1406
|
-
dgram: () =>
|
|
1407
|
-
dns: () =>
|
|
1408
|
-
fetch: () =>
|
|
1409
|
-
http: () =>
|
|
1410
|
-
net: () =>
|
|
1411
|
-
quota: () =>
|
|
1412
|
-
}),
|
|
1424
|
+
get: gt
|
|
1425
|
+
}, yt = /* @__PURE__ */ n({
|
|
1426
|
+
available: () => bt,
|
|
1427
|
+
dgram: () => et,
|
|
1428
|
+
dns: () => He,
|
|
1429
|
+
fetch: () => Be,
|
|
1430
|
+
http: () => at,
|
|
1431
|
+
net: () => Ye,
|
|
1432
|
+
quota: () => Ve
|
|
1433
|
+
}), bt = () => Le, Z = async (e) => {
|
|
1413
1434
|
if (typeof window > "u") return !1;
|
|
1414
1435
|
if (g()) return !0;
|
|
1415
1436
|
let t = await M, n = null, r = new Promise((e) => {
|
|
@@ -1424,71 +1445,73 @@ v(() => (Q ||= Z().then(() => void 0).finally(() => {
|
|
|
1424
1445
|
}), Q));
|
|
1425
1446
|
//#endregion
|
|
1426
1447
|
//#region src/lib/desktop.ts
|
|
1427
|
-
var
|
|
1428
|
-
available: () =>
|
|
1429
|
-
dgram: () =>
|
|
1430
|
-
dns: () =>
|
|
1431
|
-
fetch: () =>
|
|
1432
|
-
fs: () =>
|
|
1433
|
-
net: () =>
|
|
1434
|
-
}),
|
|
1448
|
+
var xt = /* @__PURE__ */ n({
|
|
1449
|
+
available: () => St,
|
|
1450
|
+
dgram: () => Et,
|
|
1451
|
+
dns: () => wt,
|
|
1452
|
+
fetch: () => Ct,
|
|
1453
|
+
fs: () => Dt,
|
|
1454
|
+
net: () => Tt
|
|
1455
|
+
}), St = () => !1, $ = (e) => (...t) => {
|
|
1435
1456
|
throw Error(`The FKN desktop app is not connected, desktop.${e} is unavailable`);
|
|
1436
|
-
},
|
|
1457
|
+
}, Ct = $("fetch"), wt = { lookup: $("dns.lookup") }, Tt = {
|
|
1437
1458
|
connect: $("net.connect"),
|
|
1438
1459
|
createConnection: $("net.createConnection"),
|
|
1439
1460
|
createServer: $("net.createServer")
|
|
1440
|
-
},
|
|
1461
|
+
}, Et = { createSocket: $("dgram.createSocket") }, Dt = {
|
|
1441
1462
|
isLocalDirectorySupported: () => !1,
|
|
1442
1463
|
pickLocalDirectory: $("fs.pickLocalDirectory"),
|
|
1443
1464
|
queryDirectoryPermission: $("fs.queryDirectoryPermission"),
|
|
1444
1465
|
ensureDirectoryPermission: $("fs.ensureDirectoryPermission")
|
|
1445
|
-
},
|
|
1446
|
-
if (
|
|
1466
|
+
}, Ot = () => typeof document < "u" && g(), kt = async (e, t) => {
|
|
1467
|
+
if (ze(e), t?.credentials === "include") {
|
|
1447
1468
|
if (typeof document > "u") throw Error("fetch with credentials needs the FKN extension, which only exists in window realms");
|
|
1448
1469
|
return C(e, t);
|
|
1449
1470
|
}
|
|
1450
|
-
return
|
|
1471
|
+
return Ot() ? C(e, {
|
|
1451
1472
|
...t,
|
|
1452
1473
|
credentials: "omit"
|
|
1453
|
-
}) :
|
|
1454
|
-
},
|
|
1474
|
+
}) : St() ? Ct(e, t) : Be(e, t);
|
|
1475
|
+
}, At = /* @__PURE__ */ n({
|
|
1455
1476
|
ATTACH_FRAME_EVENT_KEY: () => w,
|
|
1456
1477
|
assertAttachableFrameUrl: () => E,
|
|
1457
1478
|
assertFetchableUrl: () => S,
|
|
1458
|
-
attachFrame: () =>
|
|
1459
|
-
attachFramePermission: () =>
|
|
1460
|
-
available: () =>
|
|
1479
|
+
attachFrame: () => Se,
|
|
1480
|
+
attachFramePermission: () => be,
|
|
1481
|
+
available: () => Ot,
|
|
1461
1482
|
box: () => l,
|
|
1462
|
-
cookies: () =>
|
|
1483
|
+
cookies: () => ge,
|
|
1463
1484
|
createVideoElementHandle: () => e,
|
|
1464
1485
|
events: () => h,
|
|
1465
1486
|
extension: () => h,
|
|
1466
1487
|
fetch: () => C,
|
|
1467
1488
|
fetchCredentialedPermission: () => ce,
|
|
1489
|
+
fetchLocalPermission: () => le,
|
|
1468
1490
|
fetchPermission: () => se,
|
|
1469
|
-
gotoPermission: () =>
|
|
1491
|
+
gotoPermission: () => xe,
|
|
1470
1492
|
handleRevivableModules: () => i,
|
|
1471
1493
|
isBlockedFetchUrl: () => x,
|
|
1472
1494
|
isBlockedFrameUrl: () => T,
|
|
1473
1495
|
isExtensionExposed: () => g,
|
|
1496
|
+
isLocalNetworkUrl: () => de,
|
|
1474
1497
|
isType: () => t,
|
|
1475
|
-
modifyRequestHeadersPermission: () =>
|
|
1476
|
-
permissions: () =>
|
|
1498
|
+
modifyRequestHeadersPermission: () => _e,
|
|
1499
|
+
permissions: () => Ce,
|
|
1477
1500
|
promptInstall: () => Z,
|
|
1478
|
-
readCookiePermission: () =>
|
|
1479
|
-
removeRequestHeaderRule: () =>
|
|
1501
|
+
readCookiePermission: () => he,
|
|
1502
|
+
removeRequestHeaderRule: () => ye,
|
|
1480
1503
|
revive: () => o,
|
|
1481
1504
|
setMissingExtensionHandler: () => v,
|
|
1482
|
-
setRequestHeaderRule: () =>
|
|
1505
|
+
setRequestHeaderRule: () => ve,
|
|
1483
1506
|
type: () => a,
|
|
1484
1507
|
waitForExtensionExposure: () => y
|
|
1485
|
-
}),
|
|
1486
|
-
ensureDirectoryPermission: () =>
|
|
1487
|
-
isLocalDirectorySupported: () =>
|
|
1488
|
-
pickLocalDirectory: () =>
|
|
1489
|
-
queryDirectoryPermission: () =>
|
|
1490
|
-
}),
|
|
1491
|
-
if (!
|
|
1508
|
+
}), jt = /* @__PURE__ */ n({
|
|
1509
|
+
ensureDirectoryPermission: () => Ft,
|
|
1510
|
+
isLocalDirectorySupported: () => Mt,
|
|
1511
|
+
pickLocalDirectory: () => Nt,
|
|
1512
|
+
queryDirectoryPermission: () => Pt
|
|
1513
|
+
}), Mt = () => typeof window < "u" && "showDirectoryPicker" in window, Nt = async (e = {}) => {
|
|
1514
|
+
if (!Mt()) return;
|
|
1492
1515
|
let t = window.showDirectoryPicker;
|
|
1493
1516
|
return t({
|
|
1494
1517
|
mode: "readwrite",
|
|
@@ -1496,14 +1519,14 @@ var vt = /* @__PURE__ */ n({
|
|
|
1496
1519
|
}).catch((e) => {
|
|
1497
1520
|
if (e?.name !== "AbortError") throw e;
|
|
1498
1521
|
});
|
|
1499
|
-
},
|
|
1522
|
+
}, Pt = async (e, t = "readwrite") => {
|
|
1500
1523
|
let { queryPermission: n } = e;
|
|
1501
1524
|
return await n?.call(e, { mode: t }) ?? "granted";
|
|
1502
|
-
},
|
|
1503
|
-
if (await
|
|
1525
|
+
}, Ft = async (e, t = "readwrite") => {
|
|
1526
|
+
if (await Pt(e, t) === "granted") return !0;
|
|
1504
1527
|
let { requestPermission: n } = e;
|
|
1505
1528
|
return await n?.call(e, { mode: t }) === "granted";
|
|
1506
|
-
},
|
|
1529
|
+
}, It = "https://fkn.app", Lt = (e, t) => {
|
|
1507
1530
|
if (typeof window > "u") throw Error("FKN @fkn/lib: relayWorker must be called from the main thread");
|
|
1508
1531
|
if (!A?.contentWindow) throw Error("FKN @fkn/lib: relayWorker called before the FKN iframe was injected");
|
|
1509
1532
|
te({
|
|
@@ -1511,10 +1534,10 @@ var vt = /* @__PURE__ */ n({
|
|
|
1511
1534
|
emit: A.contentWindow
|
|
1512
1535
|
}, e, {
|
|
1513
1536
|
key: "fkn-api",
|
|
1514
|
-
originA: t?.originA ??
|
|
1537
|
+
originA: t?.originA ?? It,
|
|
1515
1538
|
originB: t?.originB ?? "*",
|
|
1516
1539
|
unregisterSignal: t?.unregisterSignal
|
|
1517
1540
|
});
|
|
1518
|
-
};
|
|
1541
|
+
}, Rt = async () => typeof window > "u" ? !1 : (await M).connect.prompt(location.origin).catch(() => !1);
|
|
1519
1542
|
//#endregion
|
|
1520
|
-
export { w as ATTACH_FRAME_EVENT_KEY, E as assertAttachableFrameUrl, S as assertFetchableUrl,
|
|
1543
|
+
export { w as ATTACH_FRAME_EVENT_KEY, E as assertAttachableFrameUrl, S as assertFetchableUrl, Se as attachFrame, be as attachFramePermission, l as box, yt as cloud, Rt as connect, ge as cookies, e as createVideoElementHandle, xt as desktop, et as dgram, He as dns, At as extension, kt as fetch, ce as fetchCredentialedPermission, le as fetchLocalPermission, se as fetchPermission, jt as fs, xe as gotoPermission, i as handleRevivableModules, at as http, x as isBlockedFetchUrl, T as isBlockedFrameUrl, g as isExtensionExposed, de as isLocalNetworkUrl, t as isType, _e as modifyRequestHeadersPermission, Ye as net, Ce as permissions, Z as promptInstall, he as readCookiePermission, Lt as relayWorker, ye as removeRequestHeaderRule, o as revive, v as setMissingExtensionHandler, ve as setRequestHeaderRule, a as type, y as waitForExtensionExposure };
|