helia 1.3.6 → 1.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +1 -1
- package/src/version.ts +1 -1
package/dist/index.min.js
CHANGED
|
@@ -81,7 +81,7 @@ a=candidate:1467250027 1 UDP 1467250027 ${t} ${n} typ host\r
|
|
|
81
81
|
a=ice-ufrag:`+e+`
|
|
82
82
|
`).replace(/\na=ice-pwd:[^\n]*\n/,`
|
|
83
83
|
a=ice-pwd:`+e+`
|
|
84
|
-
`),r}var WA=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),YA=r=>[...Array(r)].map(()=>WA.at(Math.floor(Math.random()*WA.length))).join("");var Pd=T("libp2p:webrtc:transport"),xG=1e4,_G=X("webrtc-direct").code,T5=X("certhash").code,kd=class{metrics;components;init;constructor(e,t={}){this.components=e,this.init=t,e.metrics!=null&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_dialer_events_total",{label:"event",help:"Total count of WebRTC dial events by type"})})}async dial(e,t){let n=await this._connect(e,t);return Pd(`dialing address - ${e.toString()}`),n}createListener(e){throw nI("WebRTCTransport.createListener")}filter(e){return e.filter(SG)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[Di]=!0;async _connect(e,t){let n=new AbortController,i=n.signal,s=e.getPeerId();if(s===null)throw dd("we need to have the remote's PeerId");let o=te(s),a=I5(Cd(e)),c=await RTCPeerConnection.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:A5(a.name)}),l=new RTCPeerConnection({certificates:[c]}),u=new Promise((D,L)=>{let W=l.createDataChannel("",{negotiated:!0,id:0}),ae=setTimeout(()=>{let le=`Data channel was never opened: state: ${W.readyState}`;Pd.error(le),this.metrics?.dialerEvents.increment({open_error:!0}),L(F8("data",le))},xG);W.onopen=le=>{clearTimeout(ae),D(W)},W.onerror=le=>{clearTimeout(ae);let Ke=`Error opening a data channel for handshaking: ${le.target?.toString()??"not specified"}`;Pd.error(Ke),this.metrics?.dialerEvents.increment({unknown_error:!0}),L(F8("data",Ke))}}),h="libp2p+webrtc+v1/"+YA(32),f=await l.createOffer(),d=GA(f,h);await l.setLocalDescription(d);let p=HA(e,h);await l.setRemoteDescription(p);let m=await u,g=this.components.peerId,y=this.generateNoisePrologue(l,a.code,e),w=kc({prologueBytes:y})(),E=Qc({channel:m,direction:"inbound",dataChannelOptions:this.init.dataChannel}),S={...E,sink:E.sink.bind(E),source:async function*(){for await(let D of E.source)for(let L of D)yield L}()},v=new ca({peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),x=oh?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(x,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":v.close().catch(D=>{Pd.error("error closing connection",D)}).finally(()=>{n.abort()});break;default:break}},{signal:i}),this.metrics?.dialerEvents.increment({peer_connection:!0});let R=new la({peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await w.secureInbound(g,S,o),t.upgrader.upgradeOutbound(v,{skipProtection:!0,skipEncryption:!0,muxerFactory:R})}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw sh("no local certificate");let i=$A(e);if(i==null)throw sh("no local fingerprint found");let s=i.trim().toLowerCase().replaceAll(":",""),o=V(s,"hex"),a=QA.encode(o,t),c=R5.decode(Cd(n)),l=V("libp2p-webrtc-noise:");return ge([l,a,c])}};function SG(r){let e=r.protoCodes();return e.includes(_G)&&e.includes(T5)&&r.getPeerId()!=null&&!e.includes(X("p2p-circuit").code)}function XA(r){return e=>new kd(e,r)}function jA(r){return e=>new bd(e,r)}function ZA(r){let e;try{e=X("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function JA(r){return r.some(([e,t])=>e===X("tls").code)}function wn(r,e,t){let n=eT[X(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${X(r).name}`);let i=n(e,t);return r===X("ip6").code?`[${i}]`:i}var eT={ip4:(r,e)=>r,ip6:(r,e)=>e.length===0?r:`[${r}]`,tcp:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`tcp://${wn(t[0],t[1]??"",e)}:${r}`},udp:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`udp://${wn(t[0],t[1]??"",e)}:${r}`},dnsaddr:(r,e)=>r,dns4:(r,e)=>r,dns6:(r,e)=>r,dns:(r,e)=>r,ipfs:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/ipfs/${r}`},p2p:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=JA(e),n=ZA(e);if(t&&n!==null)return`https://${n}`;let i=t?"https://":"http://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let o=wn(s[0],s[1]??"",e);return o=o.replace("tcp://",""),`${i}${o}`},tls:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return wn(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return wn(t[0],t[1]??"",e)},https:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");let n=wn(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=JA(e),n=ZA(e);if(t&&n!==null)return`wss://${n}`;let i=t?"wss://":"ws://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let o=wn(s[0],s[1]??"",e);return o=o.replace("tcp://",""),`${i}${o}`},wss:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");let n=wn(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`wss://${n}`},"p2p-websocket-star":(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p-websocket-star`},"p2p-webrtc-star":(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p-webrtc-star`},"p2p-webrtc-direct":(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function tT(r,e){let n=ee(r).stringTuples(),i=n.pop();if(i===void 0)throw new Error("Unexpected end of multiaddr");let s=X(i[0]),o=eT[s.name];if(o==null)throw new Error(`No interpreter found for ${s.name}`);let a=o(i[1]??"",n);return e?.assumeHttp!==!1&&i[0]===X("tcp").code&&(a=a.replace("tcp://","http://"),(i[1]==="443"||i[1]==="80")&&(i[1]==="443"&&(a=a.replace("http://","https://")),a=a.substring(0,a.lastIndexOf(":")))),a}var rT=WebSocket;var oT=q(iT(),1);function sT(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var aT=r=>{r.binaryType="arraybuffer";let e=async()=>{await new Promise((s,o)=>{if(n){s();return}if(i!=null){o(i);return}let a=u=>{r.removeEventListener("open",c),r.removeEventListener("error",l),u()},c=()=>{a(s)},l=u=>{a(()=>{o(u.error??new Error(`connect ECONNREFUSED ${r.url}`))})};r.addEventListener("open",c),r.addEventListener("error",l)})},t=async function*(){let s=new oT.EventIterator(({push:o,stop:a,fail:c})=>{let l=h=>{let f=null;typeof h.data=="string"&&(f=V(h.data)),sT(h.data)&&(f=new Uint8Array(h.data)),h.data instanceof Uint8Array&&(f=h.data),f!=null&&o(f)},u=h=>{c(h.error??new Error("Socket error"))};return r.addEventListener("message",l),r.addEventListener("error",u),r.addEventListener("close",a),()=>{r.removeEventListener("message",l),r.removeEventListener("error",u),r.removeEventListener("close",a)}},{highWaterMark:1/0});await e();for await(let o of s)yield sT(o)?new Uint8Array(o):o}(),n=r.readyState===1,i;return r.addEventListener("open",()=>{n=!0,i=null}),r.addEventListener("close",()=>{n=!1,i=null}),r.addEventListener("error",s=>{n||(i=s.error??new Error(`connect ECONNREFUSED ${r.url}`))}),Object.assign(t,{connected:e})};var cT=async r=>{if(r.readyState>=2)throw new Error("socket closed");r.readyState!==1&&await new Promise((e,t)=>{function n(){r.removeEventListener("open",i),r.removeEventListener("error",s)}function i(){n(),e()}function s(o){n(),t(o.error??new Error(`connect ECONNREFUSED ${r.url}`))}r.addEventListener("open",i),r.addEventListener("error",s)})};var lT=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let i of n){try{await cT(r)}catch(s){if(s.message==="socket closed")break;throw s}r.send(i)}e.closeOnEnd!=null&&r.readyState<=1&&await new Promise((i,s)=>{r.addEventListener("close",o=>{if(o.wasClean||o.code===1006)i();else{let a=Object.assign(new Error("ws error"),{event:o});s(a)}}),setTimeout(()=>{r.close()})})});var uT=(r,e)=>{e=e??{};let t=aT(r),n=e.remoteAddress,i=e.remotePort;if(r.url!=null)try{let o=new URL(r.url);n=o.hostname,i=parseInt(o.port,10)}catch{}if(n==null||i==null)throw new Error("Remote connection did not have address and/or port");return{sink:lT(r,e),source:t,connected:async()=>{await t.connected()},close:async()=>{(r.readyState===r.CONNECTING||r.readyState===r.OPEN)&&await new Promise(o=>{r.addEventListener("close",()=>{o()}),r.close()})},destroy:()=>{r.terminate!=null?r.terminate():r.close()},remoteAddress:n,remotePort:i,socket:r}};var wT=q(yT(),1),LG={http:"ws",https:"wss"},BG="ws",bT=(r,e)=>(0,wT.relative)(r,e,LG,BG);function ET(r,e){let t=typeof window>"u"?"":window.location;e=e??{};let n=bT(r,t.toString()),i=new rT(n,e.websocket);return uT(i,e)}var _T=q(xT(),1),N5=typeof window=="object"&&typeof document=="object"&&document.nodeType===9,Ld=(0,_T.default)(),Bd=N5&&!Ld,ST=Ld&&!N5,RT=Ld&&N5,IT=typeof globalThis.process<"u"&&typeof globalThis.process.release<"u"&&globalThis.process.release.name==="node"&&!Ld,Md=typeof importScripts=="function"&&typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,vye=typeof globalThis.process<"u"&&typeof globalThis.process.env<"u"&&globalThis.process.env["NODE"+(()=>"_")()+"ENV"]==="test",AT=typeof navigator<"u"&&navigator.product==="ReactNative";function CT(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return Lc.matches(t)||ra.matches(t)})}function PT(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return ra.matches(t)})}function kT(){throw new Error("WebSocket Servers can not be created in the browser!")}var O5=class extends Error{constructor(e){super(e),this.name="TimeoutError"}},L5=class extends Error{constructor(e){super(),this.name="AbortError",this.message=e}},NT=r=>globalThis.DOMException===void 0?new L5(r):new DOMException(r),OT=r=>{let e=r.reason===void 0?NT("This operation was aborted."):r.reason;return e instanceof Error?e:NT(e)};function B5(r,e){let{milliseconds:t,fallback:n,message:i,customTimers:s={setTimeout,clearTimeout}}=e,o,c=new Promise((l,u)=>{if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);if(e.signal){let{signal:f}=e;f.aborted&&u(OT(f)),f.addEventListener("abort",()=>{u(OT(f))})}if(t===Number.POSITIVE_INFINITY){r.then(l,u);return}let h=new O5;o=s.setTimeout.call(void 0,()=>{if(n){try{l(n())}catch(f){u(f)}return}typeof r.cancel=="function"&&r.cancel(),i===!1?l():i instanceof Error?u(i):(h.message=i??`Promise timed out after ${t} milliseconds`,u(h))},t),(async()=>{try{l(await r)}catch(f){u(f)}})()}).finally(()=>{c.clear()});return c.clear=()=>{s.clearTimeout.call(void 0,o),o=void 0},c}var LT=T("libp2p:websockets:socket");function BT(r,e,t){t=t??{};let n={async sink(i){t?.signal!=null&&(i=mt(i,t.signal));try{await r.sink(i)}catch(s){s.type!=="aborted"&<.error(s)}},source:t.signal!=null?mt(r.source,t.signal):r.source,remoteAddr:e,timeline:{open:Date.now()},async close(){let i=Date.now();try{await B5(r.close(),{milliseconds:2e3})}catch{let{host:o,port:a}=n.remoteAddr.toOptions();LT("timeout closing stream to %s:%s after %dms, destroying it manually",o,a,Date.now()-i),r.destroy()}finally{n.timeline.close=Date.now()}}};return r.socket.addEventListener("close",()=>{n.timeline.close==null&&(n.timeline.close=Date.now())},{once:!0}),n}var lo=T("libp2p:websockets"),M5=class{init;constructor(e){this.init=e}[Symbol.toStringTag]="@libp2p/websockets";[Di]=!0;async dial(e,t){lo("dialing %s",e),t=t??{};let n=await this._connect(e,t),i=BT(n,e);lo("new outbound connection %s",i.remoteAddr);let s=await t.upgrader.upgradeOutbound(i);return lo("outbound connection %s upgraded",i.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new jr;let n=e.toOptions();lo("dialing %s:%s",n.host,n.port);let i=xe(),s=l=>{lo.error("connection error:",l),i.reject(l)},o=ET(tT(e),this.init);if(o.socket.on!=null?o.socket.on("error",s):o.socket.onerror=s,t.signal==null)return await Promise.race([o.connected(),i.promise]),lo("connected %s",e),o;let a,c=new Promise((l,u)=>{if(a=()=>{u(new jr),o.close().catch(h=>{lo.error("error closing raw socket",h)})},t?.signal?.aborted===!0){a();return}t?.signal?.addEventListener("abort",a)});try{await Promise.race([c,i.promise,o.connected()])}finally{a!=null&&t?.signal?.removeEventListener("abort",a)}return lo("connected %s",e),o}createListener(e){return kT({...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):Bd||Md?PT(e):CT(e)}};function MT(r={}){return()=>new M5(r)}var Hr=T("libp2p:webtransport"),KG=Object.values(En).map(r=>r.decoder).reduce((r,e)=>r.or(e));function VG(r){return Mn.decode(KG.decode(r))}function UT(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}async function FT(r,e,t,n,i){let s=r.writable.getWriter(),o=r.readable.getReader();await s.ready;function a(){let f=n.findIndex(d=>d===h);f!==-1&&(n.splice(f,1),h.stat.timeline.close=Date.now(),i?.(h))}let c=!1,l=!1;(async function(){let f=await s.closed.catch(d=>d);if(f!=null){let d=f.message;d.includes("aborted by the remote server")||d.includes("STOP_SENDING")||Hr.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${f.message}`)}c=!0,c&&l&&a()})().catch(()=>{Hr.error("WebTransport failed to cleanup closed stream")}),async function(){let f=await o.closed.catch(d=>d);f!=null&&Hr.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${f.message}`),l=!0,c&&l&&a()}().catch(()=>{Hr.error("WebTransport failed to cleanup closed stream")});let u=!1,h={id:e,abort(f){c||(s.abort(),c=!0),h.closeRead(),l=!0,a()},close(){h.closeRead(),h.closeWrite(),a()},closeRead(){l||(o.cancel().catch(f=>{f.toString().includes("RESET_STREAM")===!0&&(c=!0)}),l=!0),c&&a()},closeWrite(){c||(c=!0,s.close().catch(f=>{f.toString().includes("RESET_STREAM")===!0&&(l=!0)})),l&&a()},reset(){h.close()},stat:{direction:t,timeline:{open:Date.now()}},metadata:{},source:async function*(){for(;;){let f=await o.read();if(f.done===!0){l=!0,c&&a();return}yield new he(f.value)}}(),sink:async function(f){if(u)throw new Error("sink already called on stream");u=!0;try{for await(let d of f)if(d instanceof Uint8Array)await s.write(d);else for(let p of d)await s.write(p)}finally{h.closeWrite()}}};return h}function qG(r){let e=r.stringTuples(),{url:t,certhashes:n,remotePeer:i}=e.reduce((s,[o,a])=>{switch(o){case X("ip6").code:case X("dns6").code:a?.includes(":")===!0&&(a=`[${a}]`);case X("ip4").code:case X("dns4").code:if(s.seenHost||s.seenPort)throw new Error("Invalid multiaddr, saw host and already saw the host or port");return{...s,url:`${s.url}${a??""}`,seenHost:!0};case X("quic").code:case X("quic-v1").code:case X("webtransport").code:if(!s.seenHost||!s.seenPort)throw new Error("Invalid multiaddr, Didn't see host and port, but saw quic/webtransport");return s;case X("udp").code:if(s.seenPort)throw new Error("Invalid multiaddr, saw port but already saw the port");return{...s,url:`${s.url}:${a??""}`,seenPort:!0};case X("certhash").code:if(!s.seenHost||!s.seenPort)throw new Error("Invalid multiaddr, saw the certhash before seeing the host and port");return{...s,certhashes:s.certhashes.concat([VG(a??"")])};case X("p2p").code:return{...s,remotePeer:te(a??"")};default:throw new Error(`unexpected component in multiaddr: ${o} ${X(o).name} ${a??""} `)}},{url:"https://",seenHost:!1,seenPort:!1,certhashes:[]});return{url:t,certhashes:n,remotePeer:i}}function zG(r,e){return e.filter(n=>!!r.find(i=>{if(n.length!==i.length)return!1;for(let s=0;s<n.length;s++)if(i[s]!==n[s])return!1;return!0})).length===e.length}var U5=class{components;config;constructor(e,t={}){this.components=e,this.config={maxInboundStreams:t.maxInboundStreams??1e3}}[Symbol.toStringTag]="@libp2p/webtransport";[Di]=!0;async dial(e,t){Hr("dialing %s",e);let n=this.components.peerId;if(n===void 0)throw new Error("Need a local peerid");t=t??{};let{url:i,certhashes:s,remotePeer:o}=qG(e);if(s.length===0)throw new Error("Expected multiaddr to contain certhashes");let a=new WebTransport(`${i}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(l=>({algorithm:"sha-256",value:l.digest}))});if(a.closed.catch(l=>{Hr.error("WebTransport transport closed due to:",l)}),await a.ready,o==null)throw new Error("Need a target peerid");if(!await this.authenticateWebTransport(a,n,o,s))throw new Error("Failed to authenticate webtransport");let c={close:async l=>{l!=null&&Hr("Closing webtransport with err:",l),a.close()},remoteAddr:e,timeline:{open:Date.now()},...UT()};a.closed.catch(l=>{Hr.error("WebTransport connection closed:",l),c.timeline.close=Date.now()});try{t?.signal?.throwIfAborted()}catch(l){throw a.close(),l}return t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(a),skipProtection:!0})}async authenticateWebTransport(e,t,n,i){let s=await e.createBidirectionalStream(),o=s.writable.getWriter(),a=s.readable.getReader();await o.ready;let c={source:async function*(){for(;;){let h=await a.read();if(h.value!=null&&(yield h.value),h.done===!0)break}}(),sink:async function(h){for await(let f of h)await o.write(f)}},l=kc()(),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch(h=>{Hr.error(`Failed to close authentication stream writer: ${h.message}`)}),a.cancel().catch(h=>{Hr.error(`Failed to close authentication stream reader: ${h.message}`)}),!zG(u?.webtransportCerthashes??[],i.map(h=>h.bytes)))throw new Error("Our certhashes are not a subset of the remote's reported certhashes");return!0}webtransportMuxer(e){let t=0,n=this.config;return{protocol:"webtransport",createStreamMuxer:i=>{typeof i=="function"&&(i={onIncomingStream:i});let s=[];(async function(){let a=e.incomingBidirectionalStreams.getReader();for(;;){let{done:c,value:l}=await a.read();if(c===!0)break;if(s.length>=n.maxInboundStreams)l.writable.close().catch(u=>{Hr.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)}),l.readable.cancel().catch(u=>{Hr.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)});else{let u=await FT(l,String(t++),"inbound",s,i?.onStreamEnd);s.push(u),i?.onIncomingStream?.(u)}}})().catch(()=>{Hr.error("WebTransport failed to receive incoming stream")});let o={protocol:"webtransport",streams:s,newStream:async a=>{let c=await e.createBidirectionalStream(),l=await FT(c,String(t++),i?.direction??"outbound",s,i?.onStreamEnd);return s.push(l),l},close:a=>{a!=null&&Hr("Closing webtransport muxer with err:",a),e.close()},...UT()};try{i?.signal?.throwIfAborted()}catch(a){throw e.close(),a}return o}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(t=>t.protoNames().includes("webtransport"))}};function KT(r={}){return e=>new U5(e,r)}var Mi;(function(r){let e;(function(i){i.EOL="EOL"})(e=r.ValidityType||(r.ValidityType={}));let t;(function(i){i[i.EOL=0]="EOL"})(t||(t={})),function(i){i.codec=()=>It(t)}(e=r.ValidityType||(r.ValidityType={}));let n;r.codec=()=>(n==null&&(n=se((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.value!=null&&(s.uint32(10),s.bytes(i.value)),i.signature!=null&&(s.uint32(18),s.bytes(i.signature)),i.validityType!=null&&(s.uint32(24),r.ValidityType.codec().encode(i.validityType,s)),i.validity!=null&&(s.uint32(34),s.bytes(i.validity)),i.sequence!=null&&(s.uint32(40),s.uint64(i.sequence)),i.ttl!=null&&(s.uint32(48),s.uint64(i.ttl)),i.pubKey!=null&&(s.uint32(58),s.bytes(i.pubKey)),i.signatureV2!=null&&(s.uint32(66),s.bytes(i.signatureV2)),i.data!=null&&(s.uint32(74),s.bytes(i.data)),o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.value=i.bytes();break;case 2:o.signature=i.bytes();break;case 3:o.validityType=r.ValidityType.codec().decode(i);break;case 4:o.validity=i.bytes();break;case 5:o.sequence=i.uint64();break;case 6:o.ttl=i.uint64();break;case 7:o.pubKey=i.bytes();break;case 8:o.signatureV2=i.bytes();break;case 9:o.data=i.bytes();break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ie(i,r.codec()),r.decode=i=>ne(i,r.codec())})(Mi||(Mi={}));var gh=q(go(),1);var VT="ERR_IPNS_EXPIRED_RECORD",Ud="ERR_UNRECOGNIZED_VALIDITY";var uo="ERR_SIGNATURE_VERIFICATION",qT="ERR_UNRECOGNIZED_FORMAT";var F5="ERR_UNDEFINED_PARAMETER",zT="ERR_INVALID_RECORD_DATA",$T="ERR_INVALID_EMBEDDED_KEY";var HT="ERR_RECORD_TOO_LARGE";var WT=T("ipns:utils"),$G=V("/ipns/");function yh(r){let e=new RegExp("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d+)Z"),t=String(r).trim().match(e);if(t==null)throw new Error("Invalid format");let n=parseInt(t[1],10),i=parseInt(t[2],10)-1,s=parseInt(t[3],10),o=parseInt(t[4],10),a=parseInt(t[5],10),c=parseInt(t[6],10),l=parseInt(t[7].slice(0,-6),10);return new Date(Date.UTC(n,i,s,o,a,c,l))}var YT=async(r,e)=>{if(e==null||r==null){let n=new Error("one or more of the provided parameters are not defined");throw WT.error(n),(0,gh.default)(n,F5)}let t;if(e.pubKey!=null){try{t=Kr(e.pubKey)}catch(i){throw WT.error(i),i}if(!(await wr(e.pubKey)).equals(r))throw(0,gh.default)(new Error("Embedded public key did not match PeerID"),$T)}else r.publicKey!=null&&(t=Kr(r.publicKey));if(t!=null)return t;throw(0,gh.default)(new Error("no public key is available"),F5)};var QT=r=>{let e=V("ipns-signature:");return ge([e,r])};var XT=r=>{let e=Mi.decode(r);return e.sequence!=null&&(e.sequence=BigInt(e.sequence)),e.ttl!=null&&(e.ttl=BigInt(e.ttl)),{value:e.value??new Uint8Array(0),signature:e.signature??new Uint8Array(0),validityType:e.validityType??Mi.ValidityType.EOL,validity:e.validity??new Uint8Array(0),sequence:e.sequence??0n,pubKey:e.pubKey,ttl:e.ttl??void 0,signatureV2:e.signatureV2,data:e.data}};var jT=r=>bt(r.slice($G.length));var ZT=r=>{let e=zn(r);if(e.ValidityType===0)e.ValidityType=Mi.ValidityType.EOL;else throw(0,gh.default)(new Error("Unknown validity type"),Ud);return Number.isInteger(e.Sequence)&&(e.Sequence=BigInt(e.Sequence)),Number.isInteger(e.TTL)&&(e.TTL=BigInt(e.TTL)),e};var JT=(r,e)=>{let t=e.map((n,i)=>({entry:Mi.decode(n),index:i}));return t.sort((n,i)=>{if(n.entry.signatureV2!=null&&i.entry.signatureV2==null)return-1;if(n.entry.signatureV2==null&&i.entry.signatureV2!=null)return 1;let s=n.entry.sequence??0n,o=i.entry.sequence??0n;if(s>o)return-1;if(s<o)return 1;let a=n.entry.validity??new Uint8Array(0),c=i.entry.validity??new Uint8Array(0),l=yh(M(a)),u=yh(M(c));return l.getTime()>u.getTime()?-1:l.getTime()<u.getTime()?1:0}),t[0].index};var bn=q(go(),1);var wh=T("ipns:validator"),HG=1024*10,GG=async(r,e)=>{let{value:t,validityType:n,validity:i}=e,s,o;if(e.signatureV2!=null&&e.data!=null)o=e.signatureV2,s=QT(e.data),WG(e);else throw(0,bn.default)(new Error("missing data or signatureV2"),uo);let a;try{a=await r.verify(s,o)}catch{a=!1}if(!a)throw wh.error("record signature verification failed"),(0,bn.default)(new Error("record signature verification failed"),uo);if(i!=null&&n===Mi.ValidityType.EOL){let c;try{c=yh(M(i))}catch{throw wh.error("unrecognized validity format (not an rfc3339 format)"),(0,bn.default)(new Error("unrecognized validity format (not an rfc3339 format)"),qT)}if(c.getTime()<Date.now())throw wh.error("record has expired"),(0,bn.default)(new Error("record has expired"),VT)}else if(n!=null)throw wh.error("unrecognized validity type"),(0,bn.default)(new Error("unrecognized validity type"),Ud);wh("ipns entry for %b is valid",t)},WG=r=>{if(r.data==null)throw(0,bn.default)(new Error("Record data is missing"),zT);let e=ZT(r.data);if(!de(e.Value,r.value))throw(0,bn.default)(new Error('Field "value" did not match between protobuf and CBOR'),uo);if(!de(e.Validity,r.validity))throw(0,bn.default)(new Error('Field "validity" did not match between protobuf and CBOR'),uo);if(e.ValidityType!==r.validityType)throw(0,bn.default)(new Error('Field "validityType" did not match between protobuf and CBOR'),uo);if(e.Sequence!==r.sequence)throw(0,bn.default)(new Error('Field "sequence" did not match between protobuf and CBOR'),uo);if(e.TTL!==r.ttl)throw(0,bn.default)(new Error('Field "ttl" did not match between protobuf and CBOR'),uo)},eD=async(r,e)=>{if(e.byteLength>HG)throw(0,bn.default)(new Error("record too large"),HT);let t=jT(r),n=XT(e),i=await YT(t,n);await GG(i,n)};var V5=q(en(),1);var tD="libp2p",rD="autonat",nD="1.0.0";var we;(function(r){let e;(function(l){l.DIAL="DIAL",l.DIAL_RESPONSE="DIAL_RESPONSE"})(e=r.MessageType||(r.MessageType={}));let t;(function(l){l[l.DIAL=0]="DIAL",l[l.DIAL_RESPONSE=1]="DIAL_RESPONSE"})(t||(t={})),function(l){l.codec=()=>It(t)}(e=r.MessageType||(r.MessageType={}));let n;(function(l){l.OK="OK",l.E_DIAL_ERROR="E_DIAL_ERROR",l.E_DIAL_REFUSED="E_DIAL_REFUSED",l.E_BAD_REQUEST="E_BAD_REQUEST",l.E_INTERNAL_ERROR="E_INTERNAL_ERROR"})(n=r.ResponseStatus||(r.ResponseStatus={}));let i;(function(l){l[l.OK=0]="OK",l[l.E_DIAL_ERROR=100]="E_DIAL_ERROR",l[l.E_DIAL_REFUSED=101]="E_DIAL_REFUSED",l[l.E_BAD_REQUEST=200]="E_BAD_REQUEST",l[l.E_INTERNAL_ERROR=300]="E_INTERNAL_ERROR"})(i||(i={})),function(l){l.codec=()=>It(i)}(n=r.ResponseStatus||(r.ResponseStatus={}));let s;(function(l){let u;l.codec=()=>(u==null&&(u=se((h,f,d={})=>{if(d.lengthDelimited!==!1&&f.fork(),h.id!=null&&(f.uint32(10),f.bytes(h.id)),h.addrs!=null)for(let p of h.addrs)f.uint32(18),f.bytes(p);d.lengthDelimited!==!1&&f.ldelim()},(h,f)=>{let d={addrs:[]},p=f==null?h.len:h.pos+f;for(;h.pos<p;){let m=h.uint32();switch(m>>>3){case 1:d.id=h.bytes();break;case 2:d.addrs.push(h.bytes());break;default:h.skipType(m&7);break}}return d})),u),l.encode=h=>ie(h,l.codec()),l.decode=h=>ne(h,l.codec())})(s=r.PeerInfo||(r.PeerInfo={}));let o;(function(l){let u;l.codec=()=>(u==null&&(u=se((h,f,d={})=>{d.lengthDelimited!==!1&&f.fork(),h.peer!=null&&(f.uint32(10),r.PeerInfo.codec().encode(h.peer,f)),d.lengthDelimited!==!1&&f.ldelim()},(h,f)=>{let d={},p=f==null?h.len:h.pos+f;for(;h.pos<p;){let m=h.uint32();switch(m>>>3){case 1:d.peer=r.PeerInfo.codec().decode(h,h.uint32());break;default:h.skipType(m&7);break}}return d})),u),l.encode=h=>ie(h,l.codec()),l.decode=h=>ne(h,l.codec())})(o=r.Dial||(r.Dial={}));let a;(function(l){let u;l.codec=()=>(u==null&&(u=se((h,f,d={})=>{d.lengthDelimited!==!1&&f.fork(),h.status!=null&&(f.uint32(8),r.ResponseStatus.codec().encode(h.status,f)),h.statusText!=null&&(f.uint32(18),f.string(h.statusText)),h.addr!=null&&(f.uint32(26),f.bytes(h.addr)),d.lengthDelimited!==!1&&f.ldelim()},(h,f)=>{let d={},p=f==null?h.len:h.pos+f;for(;h.pos<p;){let m=h.uint32();switch(m>>>3){case 1:d.status=r.ResponseStatus.codec().decode(h);break;case 2:d.statusText=h.string();break;case 3:d.addr=h.bytes();break;default:h.skipType(m&7);break}}return d})),u),l.encode=h=>ie(h,l.codec()),l.decode=h=>ne(h,l.codec())})(a=r.DialResponse||(r.DialResponse={}));let c;r.codec=()=>(c==null&&(c=se((l,u,h={})=>{h.lengthDelimited!==!1&&u.fork(),l.type!=null&&(u.uint32(8),r.MessageType.codec().encode(l.type,u)),l.dial!=null&&(u.uint32(18),r.Dial.codec().encode(l.dial,u)),l.dialResponse!=null&&(u.uint32(26),r.DialResponse.codec().encode(l.dialResponse,u)),h.lengthDelimited!==!1&&u.ldelim()},(l,u)=>{let h={},f=u==null?l.len:l.pos+u;for(;l.pos<f;){let d=l.uint32();switch(d>>>3){case 1:h.type=r.MessageType.codec().decode(l);break;case 2:h.dial=r.Dial.codec().decode(l,l.uint32());break;case 3:h.dialResponse=r.DialResponse.codec().decode(l,l.uint32());break;default:l.skipType(d&7);break}}return h})),c),r.encode=l=>ie(l,r.codec()),r.decode=l=>ne(l,r.codec())})(we||(we={}));var Ye=T("libp2p:autonat"),K5=4,q5=class{components;startupDelay;refreshInterval;protocol;timeout;maxInboundStreams;maxOutboundStreams;verifyAddressTimeout;started;constructor(e,t){this.components=e,this.started=!1,this.protocol=`/${t.protocolPrefix??tD}/${rD}/${nD}`,this.timeout=t.timeout??3e4,this.maxInboundStreams=t.maxInboundStreams??1,this.maxOutboundStreams=t.maxOutboundStreams??1,this.startupDelay=t.startupDelay??5e3,this.refreshInterval=t.refreshInterval??6e4,this._verifyExternalAddresses=this._verifyExternalAddresses.bind(this)}isStarted(){return this.started}async start(){this.started||(await this.components.registrar.handle(this.protocol,e=>{this.handleIncomingAutonatStream(e).catch(t=>{Ye.error("error handling incoming autonat stream",t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams}),this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.startupDelay),this.started=!0)}async stop(){await this.components.registrar.unhandle(this.protocol),clearTimeout(this.verifyAddressTimeout),this.started=!1}async handleIncomingAutonatStream(e){let t=it([AbortSignal.timeout(this.timeout)]);try{(0,V5.setMaxListeners)?.(1/0,t)}catch{}let n=this.components.addressManager.getAddresses().map(i=>i.toOptions().host);try{let i=gr(e.stream,t),s=this;await be(i,o=>At(o),async function*(o){let a=await ei(o);if(a==null){Ye("no message received"),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"No message was sent"}});return}let c;try{c=we.decode(a)}catch(m){Ye.error("could not decode message",m),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"Could not decode message"}});return}let l=c.dial;if(l==null){Ye.error("dial was missing from message"),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"No Dial message found in message"}});return}let u,h=l.peer;if(h==null||h.id==null){Ye.error("PeerId missing from message"),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"missing peer info"}});return}try{u=bt(h.id)}catch(m){Ye.error("invalid PeerId",m),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"bad peer id"}});return}if(Ye("incoming request from %p",u),!e.connection.remotePeer.equals(u)){Ye("target peer %p did not equal sending peer %p",u,e.connection.remotePeer),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"peer id mismatch"}});return}let f=h.addrs.map(m=>ee(m)).filter(m=>{let g=m.toOptions().host===e.connection.remoteAddr.toOptions().host;return Ye.trace("request to dial %s was sent from %s is same host %s",m,e.connection.remoteAddr,g),g}).filter(m=>{let g=m.toOptions().host,y=!(Dn(g)??!1);return Ye.trace("host %s was public %s",g,y),y}).filter(m=>{let g=m.toOptions().host,y=!n.includes(g);return Ye.trace("host %s was not our host %s",g,y),y}).filter(m=>{let g=!!s.components.transportManager.transportForMultiaddr(m);return Ye.trace("transport for %s is supported %s",m,g),g}).map(m=>(m.getPeerId()==null&&(m=m.encapsulate(`/p2p/${u.toString()}`)),m));if(f.length===0){Ye("no valid multiaddrs for %p in message",u),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_DIAL_REFUSED,statusText:"no dialable addresses"}});return}Ye("dial multiaddrs %s for peer %p",f.map(m=>m.toString()).join(", "),u);let d="",p=f[0];for await(let m of f){let g;p=m;try{if(g=await s.components.connectionManager.openConnection(m,{signal:t}),!g.remoteAddr.equals(m))throw Ye.error("tried to dial %s but dialed %s",m,g.remoteAddr),new Error("Unexpected remote address");Ye("Success %p",u),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.OK,addr:g.remoteAddr.decapsulateCode(X("p2p").code).bytes}});return}catch(y){Ye("could not dial %p",u,y),d=y.message}finally{g!=null&&await g.close()}}yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_DIAL_ERROR,statusText:d,addr:p.bytes}})},o=>gt(o),e.stream)}catch(i){Ye.error("error handling incoming autonat stream",i)}finally{t.clear()}}_verifyExternalAddresses(){this.verifyExternalAddresses().catch(e=>{Ye.error("error verifying external address",e)})}async verifyExternalAddresses(){if(clearTimeout(this.verifyAddressTimeout),!this.isStarted())return;let e=this.components.addressManager,t=e.getObservedAddrs().filter(s=>{let o=s.toOptions();return!(Dn(o.host)??!1)});if(t.length===0){Ye("no public addresses found, not requesting verification"),this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval);return}let n=AbortSignal.timeout(this.timeout);try{(0,V5.setMaxListeners)?.(1/0,n)}catch{}let i=this;try{Ye("verify multiaddrs %s",t.map(h=>h.toString()).join(", "));let s=we.encode({type:we.MessageType.DIAL,dial:{peer:{id:this.components.peerId.toBytes(),addrs:t.map(h=>h.bytes)}}}),a=(await f0()).toBytes(),c={},l=[],u=async h=>{try{Ye("asking %p to verify multiaddr",h.id);let f=await i.components.connectionManager.openConnection(h.id,{signal:n}),d=await f.newStream(this.protocol,{signal:n}),p=gr(d,n),m=await be([s],y=>gt(y),p,y=>At(y),async y=>ei(y));if(m==null){Ye("no response received from %p",f.remotePeer);return}let g=we.decode(m);if(g.type!==we.MessageType.DIAL_RESPONSE||g.dialResponse==null){Ye("invalid autonat response from %p",f.remotePeer);return}if(g.dialResponse.status===we.ResponseStatus.OK){let y=f.remoteAddr.toOptions(),w;if(y.family===4)w=y.host.split(".")[0];else if(y.family===6)w=y.host.split(":")[0];else{Ye('remote address "%s" was not IP4 or IP6?',y.host);return}if(l.includes(w)){Ye("already have response from network segment %d - %s",w,y.host);return}l.push(w)}return g.dialResponse}catch(f){Ye.error("error asking remote to verify multiaddr",f)}};for await(let h of ia(Un(this.components.peerRouting.getClosestPeers(a,{signal:n}),f=>async()=>u(f)),{concurrency:K5}))try{if(h==null)continue;let f=h.addr==null?t[0]:ee(h.addr);if(Ye("autonat response for %a is %s",f,h.status),h.status===we.ResponseStatus.E_BAD_REQUEST||h.status===we.ResponseStatus.E_DIAL_REFUSED||h.addr==null&&t.length>1)continue;if(!t.some(p=>p.equals(f))){Ye("peer reported %a as %s but it was not in our observed address list",f,h.status);continue}let d=f.toString();if(c[d]==null&&(c[d]={success:0,failure:0}),h.status===we.ResponseStatus.OK?c[d].success++:h.status===we.ResponseStatus.E_DIAL_ERROR&&c[d].failure++,c[d].success===K5){Ye("%a is externally dialable",f),e.confirmObservedAddr(f);return}if(c[d].failure===K5){Ye("%a is not externally dialable",f),e.removeObservedAddr(f);return}}catch(f){Ye.error("could not verify external address",f)}}finally{this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval)}}};function iD(r={}){return e=>new q5(e,r)}var iW=q(en(),1);var z5="/libp2p/relay";var sD="circuit-relay-relay";var oD=BigInt(131072),ho="/libp2p/circuit/relay/0.2.0/hop",Fd="/libp2p/circuit/relay/0.2.0/stop",JG=30*1e3,eW=30*1e3;var ps;(function(r){let e;(function(i){i.RESERVE="RESERVE",i.CONNECT="CONNECT",i.STATUS="STATUS"})(e=r.Type||(r.Type={}));let t;(function(i){i[i.RESERVE=0]="RESERVE",i[i.CONNECT=1]="CONNECT",i[i.STATUS=2]="STATUS"})(t||(t={})),function(i){i.codec=()=>It(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=se((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.type!=null&&(s.uint32(8),r.Type.codec().encode(i.type,s)),i.peer!=null&&(s.uint32(18),sl.codec().encode(i.peer,s)),i.reservation!=null&&(s.uint32(26),Kd.codec().encode(i.reservation,s)),i.limit!=null&&(s.uint32(34),ol.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(40),nr.codec().encode(i.status,s)),o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.type=r.Type.codec().decode(i);break;case 2:o.peer=sl.codec().decode(i,i.uint32());break;case 3:o.reservation=Kd.codec().decode(i,i.uint32());break;case 4:o.limit=ol.codec().decode(i,i.uint32());break;case 5:o.status=nr.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ie(i,r.codec()),r.decode=i=>ne(i,r.codec())})(ps||(ps={}));var ci;(function(r){let e;(function(i){i.CONNECT="CONNECT",i.STATUS="STATUS"})(e=r.Type||(r.Type={}));let t;(function(i){i[i.CONNECT=0]="CONNECT",i[i.STATUS=1]="STATUS"})(t||(t={})),function(i){i.codec=()=>It(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=se((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.type!=null&&(s.uint32(8),r.Type.codec().encode(i.type,s)),i.peer!=null&&(s.uint32(18),sl.codec().encode(i.peer,s)),i.limit!=null&&(s.uint32(26),ol.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(32),nr.codec().encode(i.status,s)),o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.type=r.Type.codec().decode(i);break;case 2:o.peer=sl.codec().decode(i,i.uint32());break;case 3:o.limit=ol.codec().decode(i,i.uint32());break;case 4:o.status=nr.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ie(i,r.codec()),r.decode=i=>ne(i,r.codec())})(ci||(ci={}));var sl;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{if(i.lengthDelimited!==!1&&n.fork(),t.id!=null&&t.id.byteLength>0&&(n.uint32(10),n.bytes(t.id)),t.addrs!=null)for(let s of t.addrs)n.uint32(18),n.bytes(s);i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={id:new Uint8Array(0),addrs:[]},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.id=t.bytes();break;case 2:i.addrs.push(t.bytes());break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(sl||(sl={}));var Kd;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{if(i.lengthDelimited!==!1&&n.fork(),t.expire!=null&&t.expire!==0n&&(n.uint32(8),n.uint64(t.expire)),t.addrs!=null)for(let s of t.addrs)n.uint32(18),n.bytes(s);t.voucher!=null&&(n.uint32(26),n.bytes(t.voucher)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={expire:0n,addrs:[]},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.expire=t.uint64();break;case 2:i.addrs.push(t.bytes());break;case 3:i.voucher=t.bytes();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(Kd||(Kd={}));var ol;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.duration!=null&&(n.uint32(8),n.uint32(t.duration)),t.data!=null&&(n.uint32(16),n.uint64(t.data)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.duration=t.uint32();break;case 2:i.data=t.uint64();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(ol||(ol={}));var nr;(function(r){r.UNUSED="UNUSED",r.OK="OK",r.RESERVATION_REFUSED="RESERVATION_REFUSED",r.RESOURCE_LIMIT_EXCEEDED="RESOURCE_LIMIT_EXCEEDED",r.PERMISSION_DENIED="PERMISSION_DENIED",r.CONNECTION_FAILED="CONNECTION_FAILED",r.NO_RESERVATION="NO_RESERVATION",r.MALFORMED_MESSAGE="MALFORMED_MESSAGE",r.UNEXPECTED_MESSAGE="UNEXPECTED_MESSAGE"})(nr||(nr={}));var $5;(function(r){r[r.UNUSED=0]="UNUSED",r[r.OK=100]="OK",r[r.RESERVATION_REFUSED=200]="RESERVATION_REFUSED",r[r.RESOURCE_LIMIT_EXCEEDED=201]="RESOURCE_LIMIT_EXCEEDED",r[r.PERMISSION_DENIED=202]="PERMISSION_DENIED",r[r.CONNECTION_FAILED=203]="CONNECTION_FAILED",r[r.NO_RESERVATION=204]="NO_RESERVATION",r[r.MALFORMED_MESSAGE=400]="MALFORMED_MESSAGE",r[r.UNEXPECTED_MESSAGE=401]="UNEXPECTED_MESSAGE"})($5||($5={}));(function(r){r.codec=()=>It($5)})(nr||(nr={}));var H5;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.relay!=null&&t.relay.byteLength>0&&(n.uint32(10),n.bytes(t.relay)),t.peer!=null&&t.peer.byteLength>0&&(n.uint32(18),n.bytes(t.peer)),t.expiration!=null&&t.expiration!==0n&&(n.uint32(24),n.uint64(t.expiration)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={relay:new Uint8Array(0),peer:new Uint8Array(0),expiration:0n},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.relay=t.bytes();break;case 2:i.peer=t.bytes();break;case 3:i.expiration=t.uint64();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(H5||(H5={}));var $7e=T("libp2p:circuit-relay:utils");async function G5(r){let e=new TextEncoder().encode(r),t=await je.digest(e);return ce.createV0(t)}function W5(r){let e=r*BigInt(1e3),t=new Date().getTime();return Number(e-BigInt(t))}var nW=q(hD(),1);var n9e=T("libp2p:circuit-relay:advert-service");var N9e=T("libp2p:circuit-relay:server");var sW=T("libp2p:stream:converter");function Y5(r,e={}){let{stream:t,remoteAddr:n}=r,{sink:i,source:s}=t,o=async function*(){for await(let l of s)l instanceof Uint8Array?yield l:yield*l}(),a={async sink(l){e.signal!=null&&(l=mt(l,e.signal));try{await i(l),await c()}catch(u){u.type!=="aborted"&&sW(u)}},source:e.signal!=null?mt(o,e.signal):o,remoteAddr:n,timeline:{open:Date.now(),close:void 0},async close(){await i(async function*(){yield new Uint8Array(0)}()),await c()}};async function c(){a.timeline.close==null&&(a.timeline.close=Date.now()),await Promise.resolve()}return a}var fo=T("libp2p:circuit-relay:discover-relays"),Vd=class extends Ue{peerId;peerStore;contentRouting;registrar;started;topologyId;constructor(e){super(),this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.contentRouting=e.contentRouting,this.registrar=e.registrar}isStarted(){return this.started}async start(){this.topologyId=await this.registrar.register(ho,Es({onConnect:e=>{this.safeDispatchEvent("relay:discover",{detail:e})}})),this.discover().catch(e=>{fo.error("error listening on relays",e)}),this.started=!0}stop(){this.topologyId!=null&&this.registrar.unregister(this.topologyId),this.started=!1}async discover(){fo("searching peer store for relays");let e=await this.peerStore.all({filters:[t=>t.protocols.includes(ho)],orders:[()=>Math.random()<.5?1:-1]});for(let t of e)fo("found relay peer %p in content peer store",t.id),this.safeDispatchEvent("relay:discover",{detail:t.id});fo("found %d relay peers in peer store",e.length);try{fo("searching content routing for relays");let t=await G5(z5),n=0;for await(let i of this.contentRouting.findProviders(t))if(i.multiaddrs.length>0&&!i.id.equals(this.peerId)){let s=i.id;n++,await this.peerStore.merge(s,{multiaddrs:i.multiaddrs}),fo("found relay peer %p in content routing",s),this.safeDispatchEvent("relay:discover",{detail:s})}fo("found %d relay peers in content routing",n)}catch(t){fo.error("failed when finding relays on the network",t)}}};var dD=T("libp2p:circuit-relay:transport:listener"),Q5=class extends Ue{connectionManager;relayStore;listeningAddrs;constructor(e){super(),this.connectionManager=e.connectionManager,this.relayStore=e.relayStore,this.listeningAddrs=new br,this.relayStore.addEventListener("relay:removed",t=>{this.#e(t.detail)})}async listen(e){dD("listen on %s",e);let t=e.getPeerId(),n;if(t!=null){let s=te(t),o=this.connectionManager.getConnectionsMap().get(s)??[];o.length>0&&(n=o[0])}if(n==null){let s=e.toString().split("/p2p-circuit").find(a=>a!==""),o=ee(s);n=await this.connectionManager.openConnection(o)}if(!this.relayStore.hasReservation(n.remotePeer)){await this.relayStore.addRelay(n.remotePeer,"configured");return}let i=this.relayStore.getReservation(n.remotePeer);if(i==null)throw new b("Did not have reservation after making reservation","ERR_NO_RESERVATION");if(this.listeningAddrs.has(n.remotePeer)){dD("already listening on relay %p",n.remotePeer);return}this.listeningAddrs.set(n.remotePeer,i.addrs.map(s=>ee(s).encapsulate("/p2p-circuit"))),this.safeDispatchEvent("listening",{})}getAddrs(){return[...this.listeningAddrs.values()].flat()}async close(){}#e(e){let t=this.listeningAddrs.has(e);this.listeningAddrs.delete(e),t&&this.safeDispatchEvent("close",{})}};function pD(r){return new Q5(r)}var Or=T("libp2p:circuit-relay:transport:reservation-store"),aW=60*1e3*10,cW=60*1e3*5,lW=30*1e3,qd=class extends Ue{peerId;connectionManager;transportManager;peerStore;events;reserveQueue;reservations;maxDiscoveredRelays;maxReservationQueueLength;started;constructor(e,t){super(),this.peerId=e.peerId,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.peerStore=e.peerStore,this.events=e.events,this.reservations=new br,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.started=!1,this.reserveQueue=new yc({concurrency:t?.reservationConcurrency??1}),this.events.addEventListener("peer:disconnect",n=>{this.#t(n.detail)})}isStarted(){return this.started}async start(){this.started=!0}async stop(){this.reservations.forEach(({timeout:e})=>{clearTimeout(e)}),this.reservations.clear(),this.started=!0}async addRelay(e,t){if(this.peerId.equals(e)){Or("not trying to use self as relay");return}if(this.reserveQueue.size>this.maxReservationQueueLength){Or("not adding relay as the queue is full");return}if(this.reserveQueue.hasJob(e)){Or("relay peer is already in the reservation queue");return}Or("add relay %p",e),await this.reserveQueue.add(async()=>{try{let n=this.reservations.get(e);if(n!=null){if(W5(n.reservation.expire)>aW){Or("already have reservation on relay peer %p and it expires in more than 10 minutes",e);return}clearTimeout(n.timeout),this.reservations.delete(e)}if(t==="discovered"&&[...this.reservations.values()].reduce((l,u)=>(u.type==="discovered"&&l++,l),0)>=this.maxDiscoveredRelays){Or("already have enough discovered relays");return}let i=await this.connectionManager.openConnection(e);if(i.remoteAddr.protoNames().includes("p2p-circuit")){Or("not creating reservation over relayed connection");return}let s=await this.#e(i);Or("created reservation on relay peer %p",e);let o=W5(s.expire),a=Math.min(Math.max(o-cW,lW),Math.pow(2,31)-1),c=setTimeout(()=>{this.addRelay(e,t).catch(l=>{Or.error("could not refresh reservation to relay %p",e,l)})},a);this.reservations.set(e,{timeout:c,reservation:s,type:t}),await this.peerStore.merge(e,{tags:{[sD]:{value:1,ttl:o}}}),await this.transportManager.listen([ee(`/p2p/${e.toString()}/p2p-circuit`)])}catch(n){Or.error("could not reserve slot on %p",e,n),this.reservations.delete(e)}},{peerId:e})}hasReservation(e){return this.reservations.has(e)}getReservation(e){return this.reservations.get(e)?.reservation}async#e(e){Or("requesting reservation from %s",e.remotePeer);let t=await e.newStream(ho),i=zr(t).pb(ps);i.write({type:ps.Type.RESERVE});let s;try{s=await i.read()}catch(a){throw Or.error("error parsing reserve message response from %p because",e.remotePeer,a),a}finally{t.close()}if(s.status===nr.OK&&s.reservation!=null)return s.reservation;let o=`reservation failed with status ${s.status??"undefined"}`;throw Or.error(o),new Error(o)}#t(e){let t=this.reservations.get(e);t!=null&&(Or("connection to relay %p closed, removing reservation from local store",e),clearTimeout(t.timeout),this.reservations.delete(e),this.safeDispatchEvent("relay:removed",{detail:e}),this.reservations.size<this.maxDiscoveredRelays&&(Or("not enough relays %d/%d",this.reservations.size,this.maxDiscoveredRelays),this.safeDispatchEvent("relay:not-enough-relays",{})))}};var Gr=T("libp2p:circuit-relay:transport"),uW=r=>{if(r.peer==null)return!1;try{r.peer.addrs.forEach(ee)}catch{return!1}return!0},mD={maxInboundStopStreams:300,maxOutboundStopStreams:300},X5=class{discovery;registrar;peerStore;connectionManager;peerId;upgrader;addressManager;connectionGater;reservationStore;maxInboundStopStreams;maxOutboundStopStreams;started;constructor(e,t){this.registrar=e.registrar,this.peerStore=e.peerStore,this.connectionManager=e.connectionManager,this.peerId=e.peerId,this.upgrader=e.upgrader,this.addressManager=e.addressManager,this.connectionGater=e.connectionGater,this.maxInboundStopStreams=t.maxInboundStopStreams??mD.maxInboundStopStreams,this.maxOutboundStopStreams=t.maxOutboundStopStreams??mD.maxOutboundStopStreams,t.discoverRelays!=null&&t.discoverRelays>0&&(this.discovery=new Vd(e),this.discovery.addEventListener("relay:discover",n=>{this.reservationStore.addRelay(n.detail,"discovered").catch(i=>{Gr.error("could not add discovered relay %p",n.detail,i)})})),this.reservationStore=new qd(e,t),this.reservationStore.addEventListener("relay:not-enough-relays",()=>{this.discovery?.discover().catch(n=>{Gr.error("could not discover relays",n)})}),this.started=!1}isStarted(){return this.started}async start(){await this.reservationStore.start(),await this.discovery?.start(),await this.registrar.handle(Fd,e=>{this.onStop(e).catch(t=>{Gr.error(t)})},{maxInboundStreams:this.maxInboundStopStreams,maxOutboundStreams:this.maxOutboundStopStreams}),this.started=!0}async stop(){this.discovery?.stop(),await this.reservationStore.stop(),await this.registrar.unhandle(Fd),this.started=!1}[Di]=!0;[Symbol.toStringTag]="libp2p/circuit-relay-v2";async dial(e,t={}){if(e.protoCodes().filter(p=>p===290).length!==1){let p="Invalid circuit relay address";throw Gr.error(p,e),new b(p,F.ERR_RELAYED_DIAL)}let n=e.toString().split("/p2p-circuit"),i=ee(n[0]),s=ee(n[n.length-1]),o=i.getPeerId(),a=s.getPeerId();if(o==null||a==null){let p=`Circuit relay dial to ${e.toString()} failed as address did not have peer ids`;throw Gr.error(p),new b(p,F.ERR_RELAYED_DIAL)}let c=te(o),l=te(a),u=!1,f=this.connectionManager.getConnections(c)[0];f==null&&(await this.peerStore.merge(c,{multiaddrs:[i]}),f=await this.connectionManager.openConnection(c,t),u=!0);let d;try{return d=await f.newStream([ho]),await this.connectV2({stream:d,connection:f,destinationPeer:l,destinationAddr:s,relayAddr:i,ma:e,disconnectOnFailure:u})}catch(p){throw Gr.error(`Circuit relay dial to destination ${l.toString()} via relay ${c.toString()} failed`,p),d?.abort(p),u&&await f.close(),p}}async connectV2({stream:e,connection:t,destinationPeer:n,destinationAddr:i,relayAddr:s,ma:o,disconnectOnFailure:a}){try{let c=zr(e),l=c.pb(ps);l.write({type:ps.Type.CONNECT,peer:{id:n.toBytes(),addrs:[ee(i).bytes]}});let u=await l.read();if(u.status!==nr.OK)throw new b(`failed to connect via relay with status ${u?.status?.toString()??"undefined"}`,F.ERR_HOP_REQUEST_FAILED);let h=Y5({stream:c.unwrap(),remoteAddr:o,localAddr:s.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`)});return Gr("new outbound connection %s",h.remoteAddr),await this.upgrader.upgradeOutbound(h)}catch(c){throw Gr.error(`Circuit relay dial to destination ${n.toString()} via relay ${t.remotePeer.toString()} failed`,c),a&&await t.close(),c}}createListener(e){return pD({connectionManager:this.connectionManager,relayStore:this.reservationStore})}filter(e){return e=Array.isArray(e)?e:[e],e.filter(t=>ii.matches(t))}async onStop({connection:e,stream:t}){let n=zr(t),i=await n.readPB(ci);if(Gr("received circuit v2 stop protocol request from %s",e.remotePeer),i?.type===void 0)return;let s=n.pb(ci);if(Gr("new circuit relay v2 stop stream from %s",e.remotePeer),i.type!==ci.Type.CONNECT){Gr.error("invalid stop connect request via peer %s",e.remotePeer),s.write({type:ci.Type.STATUS,status:nr.UNEXPECTED_MESSAGE});return}if(!uW(i)){Gr.error("invalid stop connect request via peer %s",e.remotePeer),s.write({type:ci.Type.STATUS,status:nr.MALFORMED_MESSAGE});return}let o=bt(i.peer.id);if(await this.connectionGater.denyInboundRelayedConnection?.(e.remotePeer,o)===!0){s.write({type:ci.Type.STATUS,status:nr.PERMISSION_DENIED});return}s.write({type:ci.Type.STATUS,status:nr.OK});let a=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${o.toString()}`),c=this.addressManager.getAddresses()[0],l=Y5({stream:n.unwrap(),remoteAddr:a,localAddr:c});Gr("new inbound connection %s",l.remoteAddr),await this.upgrader.upgradeInbound(l),Gr("%s connection %s upgraded","inbound",l.remoteAddr)}};function j5(r={}){return e=>new X5(e,r)}var gD="0.45.9";var Z5=`js-libp2p/${gD}`;var yD="0.1.0",wD="id",bD="id/push",ED="1.0.0",vD="1.0.0";var zd=q(en(),1);var po;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{if(i.lengthDelimited!==!1&&n.fork(),t.protocolVersion!=null&&(n.uint32(42),n.string(t.protocolVersion)),t.agentVersion!=null&&(n.uint32(50),n.string(t.agentVersion)),t.publicKey!=null&&(n.uint32(10),n.bytes(t.publicKey)),t.listenAddrs!=null)for(let s of t.listenAddrs)n.uint32(18),n.bytes(s);if(t.observedAddr!=null&&(n.uint32(34),n.bytes(t.observedAddr)),t.protocols!=null)for(let s of t.protocols)n.uint32(26),n.string(s);t.signedPeerRecord!=null&&(n.uint32(66),n.bytes(t.signedPeerRecord)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={listenAddrs:[],protocols:[]},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 5:i.protocolVersion=t.string();break;case 6:i.agentVersion=t.string();break;case 1:i.publicKey=t.bytes();break;case 2:i.listenAddrs.push(t.bytes());break;case 4:i.observedAddr=t.bytes();break;case 3:i.protocols.push(t.string());break;case 8:i.signedPeerRecord=t.bytes();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(po||(po={}));var Lr=T("libp2p:identify"),xD=1024*8,li={protocolPrefix:"ipfs",agentVersion:Z5,timeout:6e4,maxInboundStreams:1,maxOutboundStreams:1,maxPushIncomingStreams:1,maxPushOutgoingStreams:1,maxObservedAddresses:10,maxIdentifyMessageSize:8192},$d=class{identifyProtocolStr;identifyPushProtocolStr;host;started;timeout;peerId;peerStore;registrar;connectionManager;addressManager;maxInboundStreams;maxOutboundStreams;maxPushIncomingStreams;maxPushOutgoingStreams;maxIdentifyMessageSize;maxObservedAddresses;events;constructor(e,t){this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.connectionManager=e.connectionManager,this.events=e.events,this.identifyProtocolStr=`/${t.protocolPrefix??li.protocolPrefix}/${wD}/${ED}`,this.identifyPushProtocolStr=`/${t.protocolPrefix??li.protocolPrefix}/${bD}/${vD}`,this.timeout=t.timeout??li.timeout,this.maxInboundStreams=t.maxInboundStreams??li.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??li.maxOutboundStreams,this.maxPushIncomingStreams=t.maxPushIncomingStreams??li.maxPushIncomingStreams,this.maxPushOutgoingStreams=t.maxPushOutgoingStreams??li.maxPushOutgoingStreams,this.maxIdentifyMessageSize=t.maxIdentifyMessageSize??li.maxIdentifyMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??li.maxObservedAddresses,this.host={protocolVersion:`${t.protocolPrefix??li.protocolPrefix}/${yD}`,agentVersion:t.agentVersion??li.agentVersion},e.events.addEventListener("connection:open",n=>{let i=n.detail;this.identify(i).catch(s=>{Lr.error("error during identify trigged by connection:open",s)})}),e.events.addEventListener("self:peer:update",n=>{this.push().catch(i=>{Lr.error(i)})}),this.host.agentVersion===Z5&&(IT||ST?this.host.agentVersion+=` UserAgent=${globalThis.process.version}`:(Bd||Md||RT||AT)&&(this.host.agentVersion+=` UserAgent=${globalThis.navigator.userAgent}`))}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:V(this.host.agentVersion),ProtocolVersion:V(this.host.protocolVersion)}}),await this.registrar.handle(this.identifyProtocolStr,e=>{this._handleIdentify(e).catch(t=>{Lr.error(t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams}),await this.registrar.handle(this.identifyPushProtocolStr,e=>{this._handlePush(e).catch(t=>{Lr.error(t)})},{maxInboundStreams:this.maxPushIncomingStreams,maxOutboundStreams:this.maxPushOutgoingStreams}),this.started=!0)}async stop(){await this.registrar.unhandle(this.identifyProtocolStr),await this.registrar.unhandle(this.identifyPushProtocolStr),this.started=!1}async pushToConnections(e){let t=this.addressManager.getAddresses().map(u=>u.decapsulateCode(X("p2p").code)),n=new vr({peerId:this.peerId,multiaddrs:t}),i=await Dr.seal(n,this.peerId),s=this.registrar.getProtocols(),o=await this.peerStore.get(this.peerId),a=M(o.metadata.get("AgentVersion")??V(this.host.agentVersion)),c=M(o.metadata.get("ProtocolVersion")??V(this.host.protocolVersion)),l=e.map(async u=>{let h,f=AbortSignal.timeout(this.timeout);try{(0,zd.setMaxListeners)?.(1/0,f)}catch{}try{h=await u.newStream([this.identifyPushProtocolStr],{signal:f}),await gr(h,f).sink(be([po.encode({listenAddrs:t.map(p=>p.bytes),signedPeerRecord:i.marshal(),protocols:s,agentVersion:a,protocolVersion:c})],p=>gt(p)))}catch(d){Lr.error("could not push identify update to peer",d)}finally{h?.close()}});await Promise.all(l)}async push(){if(!this.isStarted())return;let e=[];await Promise.all(this.connectionManager.getConnections().map(async t=>{try{if(!(await this.peerStore.get(t.remotePeer)).protocols.includes(this.identifyPushProtocolStr))return;e.push(t)}catch(n){if(n.code!==F.ERR_NOT_FOUND)throw n}})),await this.pushToConnections(e)}async _identify(e,t={}){let n,i=it([AbortSignal.timeout(this.timeout),t?.signal]);try{(0,zd.setMaxListeners)?.(1/0,i)}catch{}try{n=await e.newStream([this.identifyProtocolStr],{signal:i});let s=gr(n,i),o=await be([],s,a=>At(a,{maxDataLength:this.maxIdentifyMessageSize??xD}),async a=>ei(a));if(o==null)throw new b("No data could be retrieved",F.ERR_CONNECTION_ENDED);try{return po.decode(o)}catch(a){throw new b(String(a),F.ERR_INVALID_MESSAGE)}}finally{n?.close(),i.clear()}}async identify(e,t={}){let n=await this._identify(e,t),{publicKey:i,protocols:s,observedAddr:o}=n;if(i==null)throw new b("public key was missing from identify message",F.ERR_MISSING_PUBLIC_KEY);let a=await wr(i);if(!e.remotePeer.equals(a))throw new b("identified peer does not match the expected peer",F.ERR_INVALID_PEER);if(this.peerId.equals(a))throw new b("identified peer is our own peer id?",F.ERR_INVALID_PEER);let c=hW(o);Lr("identify completed for peer %p and protocols %o",a,s),Lr("our observed address is %s",c),c!=null&&this.addressManager.getObservedAddrs().length<(this.maxObservedAddresses??1/0)&&(Lr("storing our observed address %s",c?.toString()),this.addressManager.addObservedAddr(c));let l=await this.#e(e.remotePeer,n),u={peerId:a,protocolVersion:n.protocolVersion,agentVersion:n.agentVersion,publicKey:n.publicKey,listenAddrs:n.listenAddrs.map(h=>ee(h)),observedAddr:n.observedAddr==null?void 0:ee(n.observedAddr),protocols:n.protocols,signedPeerRecord:l};this.events.safeDispatchEvent("peer:identify",{detail:u})}async _handleIdentify(e){let{connection:t,stream:n}=e,i=AbortSignal.timeout(this.timeout);try{(0,zd.setMaxListeners)?.(1/0,i)}catch{}try{let s=this.peerId.publicKey??new Uint8Array(0),o=await this.peerStore.get(this.peerId),a=this.addressManager.getAddresses().map(f=>f.decapsulateCode(X("p2p").code)),c=o.peerRecordEnvelope;if(a.length>0&&c==null){let f=new vr({peerId:this.peerId,multiaddrs:a});c=(await Dr.seal(f,this.peerId)).marshal().subarray()}let l=po.encode({protocolVersion:this.host.protocolVersion,agentVersion:this.host.agentVersion,publicKey:s,listenAddrs:a.map(f=>f.bytes),signedPeerRecord:c,observedAddr:t.remoteAddr.bytes,protocols:o.protocols}),u=gr(n,i),h=be([l],f=>gt(f));await u.sink(h)}catch(s){Lr.error("could not respond to identify request",s)}finally{n.close()}}async _handlePush(e){let{connection:t,stream:n}=e;try{if(this.peerId.equals(t.remotePeer))throw new Error("received push from ourselves?");let i=gr(n,AbortSignal.timeout(this.timeout)),o=await zr(i,{maxDataLength:this.maxIdentifyMessageSize??xD}).readPB(po);await this.#e(t.remotePeer,o)}catch(i){Lr.error("received invalid message",i);return}finally{n.close()}Lr("handled push from %p",t.remotePeer)}async#e(e,t){if(Lr("received identify from %p",e),t==null)throw new Error("Message was null or undefined");let n={addresses:t.listenAddrs.map(s=>({isCertified:!1,multiaddr:ee(s)})),protocols:t.protocols,metadata:new Map,peerRecordEnvelope:t.signedPeerRecord},i;if(t.signedPeerRecord!=null){Lr("received signedPeerRecord in push from %p",e);let s=t.signedPeerRecord,o=await Dr.openAndCertify(s,vr.DOMAIN),a=vr.createFromProtobuf(o.payload);if(!a.peerId.equals(o.peerId))throw new Error("signing key does not match PeerId in the PeerRecord");if(!e.equals(a.peerId))throw new Error("signing key does not match remote PeerId");let c;try{c=await this.peerStore.get(a.peerId)}catch(l){if(l.code!=="ERR_NOT_FOUND")throw l}if(c!=null&&(n.metadata=c.metadata,c.peerRecordEnvelope!=null)){let l=await Dr.createFromProtobuf(c.peerRecordEnvelope),u=vr.createFromProtobuf(l.payload);u.seqNumber>=a.seqNumber&&(Lr("sequence number was lower or equal to existing sequence number - stored: %d received: %d",u.seqNumber,a.seqNumber),a=u,s=c.peerRecordEnvelope)}n.peerRecordEnvelope=s,n.addresses=a.multiaddrs.map(l=>({isCertified:!0,multiaddr:l})),i={seq:a.seqNumber,addresses:a.multiaddrs}}else Lr("%p did not send a signed peer record",e);return t.agentVersion!=null&&n.metadata.set("AgentVersion",V(t.agentVersion)),t.protocolVersion!=null&&n.metadata.set("ProtocolVersion",V(t.protocolVersion)),await this.peerStore.patch(e,n),i}};function hW(r){if(r!=null&&r.length>0)try{return ee(r)}catch{}}function _D(r={}){return e=>new $d(e,r)}var SD={list:["/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN","/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa","/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb","/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt","/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"]};function RD(){return{addresses:{listen:["/webrtc"]},transports:[jA(),XA(),KT(),MT(),j5({discoverRelays:1})],connectionEncryption:[kc()],streamMuxers:[PS(),rI()],peerDiscovery:[zS(SD)],contentRouters:[XS("https://cid.contact")],services:{identify:_D(),autoNAT:iD(),pubsub:T_(),dht:HR({clientMode:!0,validators:{ipns:eD},selectors:{ipns:JT}})}}}async function ID(r,e){let t=RD();return e=e??{},xx({datastore:r,...t,...e,start:!1})}var J5="1.3.6",Hd="helia";var fW=T("helia");async function dW(r={}){let e=r.datastore??new wo,t=r.blockstore??new fl,n;pW(r.libp2p)?n=r.libp2p:n=await ID(e,r.libp2p);let i=new Af({...r,datastore:e,blockstore:t,libp2p:n});return r.start!==!1&&await i.start(),i.libp2p.isStarted()?await AD(i):i.libp2p.addEventListener("start",()=>{AD(i).catch(s=>{fW.error("could not add Helia to agent version",s)})}),i}function pW(r){return r==null?!1:["dial","dialProtocol","hangUp","handle","unhandle","getMultiaddrs","getProtocols"].every(t=>typeof r[t]=="function")}async function AD(r){let t=(await r.libp2p.peerStore.get(r.libp2p.peerId)).metadata.get("AgentVersion");if(t==null)return;let n=new TextDecoder().decode(t);n.match(/js-libp2p\/\d+\.\d+\.\d+\sUserAgent=/)!=null&&(n.includes(Hd)?n=`${Hd}/${J5} ${n.split(" ").slice(1).join(" ")}`:n=`${Hd}/${J5} ${n}`,await r.libp2p.peerStore.merge(r.libp2p.peerId,{metadata:{AgentVersion:new TextEncoder().encode(n)}}))}return Eh(mW);})();
|
|
84
|
+
`),r}var WA=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),YA=r=>[...Array(r)].map(()=>WA.at(Math.floor(Math.random()*WA.length))).join("");var Pd=T("libp2p:webrtc:transport"),xG=1e4,_G=X("webrtc-direct").code,T5=X("certhash").code,kd=class{metrics;components;init;constructor(e,t={}){this.components=e,this.init=t,e.metrics!=null&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_dialer_events_total",{label:"event",help:"Total count of WebRTC dial events by type"})})}async dial(e,t){let n=await this._connect(e,t);return Pd(`dialing address - ${e.toString()}`),n}createListener(e){throw nI("WebRTCTransport.createListener")}filter(e){return e.filter(SG)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[Di]=!0;async _connect(e,t){let n=new AbortController,i=n.signal,s=e.getPeerId();if(s===null)throw dd("we need to have the remote's PeerId");let o=te(s),a=I5(Cd(e)),c=await RTCPeerConnection.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:A5(a.name)}),l=new RTCPeerConnection({certificates:[c]}),u=new Promise((D,L)=>{let W=l.createDataChannel("",{negotiated:!0,id:0}),ae=setTimeout(()=>{let le=`Data channel was never opened: state: ${W.readyState}`;Pd.error(le),this.metrics?.dialerEvents.increment({open_error:!0}),L(F8("data",le))},xG);W.onopen=le=>{clearTimeout(ae),D(W)},W.onerror=le=>{clearTimeout(ae);let Ke=`Error opening a data channel for handshaking: ${le.target?.toString()??"not specified"}`;Pd.error(Ke),this.metrics?.dialerEvents.increment({unknown_error:!0}),L(F8("data",Ke))}}),h="libp2p+webrtc+v1/"+YA(32),f=await l.createOffer(),d=GA(f,h);await l.setLocalDescription(d);let p=HA(e,h);await l.setRemoteDescription(p);let m=await u,g=this.components.peerId,y=this.generateNoisePrologue(l,a.code,e),w=kc({prologueBytes:y})(),E=Qc({channel:m,direction:"inbound",dataChannelOptions:this.init.dataChannel}),S={...E,sink:E.sink.bind(E),source:async function*(){for await(let D of E.source)for(let L of D)yield L}()},v=new ca({peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),x=oh?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(x,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":v.close().catch(D=>{Pd.error("error closing connection",D)}).finally(()=>{n.abort()});break;default:break}},{signal:i}),this.metrics?.dialerEvents.increment({peer_connection:!0});let R=new la({peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await w.secureInbound(g,S,o),t.upgrader.upgradeOutbound(v,{skipProtection:!0,skipEncryption:!0,muxerFactory:R})}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw sh("no local certificate");let i=$A(e);if(i==null)throw sh("no local fingerprint found");let s=i.trim().toLowerCase().replaceAll(":",""),o=V(s,"hex"),a=QA.encode(o,t),c=R5.decode(Cd(n)),l=V("libp2p-webrtc-noise:");return ge([l,a,c])}};function SG(r){let e=r.protoCodes();return e.includes(_G)&&e.includes(T5)&&r.getPeerId()!=null&&!e.includes(X("p2p-circuit").code)}function XA(r){return e=>new kd(e,r)}function jA(r){return e=>new bd(e,r)}function ZA(r){let e;try{e=X("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function JA(r){return r.some(([e,t])=>e===X("tls").code)}function wn(r,e,t){let n=eT[X(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${X(r).name}`);let i=n(e,t);return r===X("ip6").code?`[${i}]`:i}var eT={ip4:(r,e)=>r,ip6:(r,e)=>e.length===0?r:`[${r}]`,tcp:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`tcp://${wn(t[0],t[1]??"",e)}:${r}`},udp:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`udp://${wn(t[0],t[1]??"",e)}:${r}`},dnsaddr:(r,e)=>r,dns4:(r,e)=>r,dns6:(r,e)=>r,dns:(r,e)=>r,ipfs:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/ipfs/${r}`},p2p:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=JA(e),n=ZA(e);if(t&&n!==null)return`https://${n}`;let i=t?"https://":"http://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let o=wn(s[0],s[1]??"",e);return o=o.replace("tcp://",""),`${i}${o}`},tls:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return wn(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return wn(t[0],t[1]??"",e)},https:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");let n=wn(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=JA(e),n=ZA(e);if(t&&n!==null)return`wss://${n}`;let i=t?"wss://":"ws://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let o=wn(s[0],s[1]??"",e);return o=o.replace("tcp://",""),`${i}${o}`},wss:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");let n=wn(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`wss://${n}`},"p2p-websocket-star":(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p-websocket-star`},"p2p-webrtc-star":(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p-webrtc-star`},"p2p-webrtc-direct":(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return`${wn(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function tT(r,e){let n=ee(r).stringTuples(),i=n.pop();if(i===void 0)throw new Error("Unexpected end of multiaddr");let s=X(i[0]),o=eT[s.name];if(o==null)throw new Error(`No interpreter found for ${s.name}`);let a=o(i[1]??"",n);return e?.assumeHttp!==!1&&i[0]===X("tcp").code&&(a=a.replace("tcp://","http://"),(i[1]==="443"||i[1]==="80")&&(i[1]==="443"&&(a=a.replace("http://","https://")),a=a.substring(0,a.lastIndexOf(":")))),a}var rT=WebSocket;var oT=q(iT(),1);function sT(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var aT=r=>{r.binaryType="arraybuffer";let e=async()=>{await new Promise((s,o)=>{if(n){s();return}if(i!=null){o(i);return}let a=u=>{r.removeEventListener("open",c),r.removeEventListener("error",l),u()},c=()=>{a(s)},l=u=>{a(()=>{o(u.error??new Error(`connect ECONNREFUSED ${r.url}`))})};r.addEventListener("open",c),r.addEventListener("error",l)})},t=async function*(){let s=new oT.EventIterator(({push:o,stop:a,fail:c})=>{let l=h=>{let f=null;typeof h.data=="string"&&(f=V(h.data)),sT(h.data)&&(f=new Uint8Array(h.data)),h.data instanceof Uint8Array&&(f=h.data),f!=null&&o(f)},u=h=>{c(h.error??new Error("Socket error"))};return r.addEventListener("message",l),r.addEventListener("error",u),r.addEventListener("close",a),()=>{r.removeEventListener("message",l),r.removeEventListener("error",u),r.removeEventListener("close",a)}},{highWaterMark:1/0});await e();for await(let o of s)yield sT(o)?new Uint8Array(o):o}(),n=r.readyState===1,i;return r.addEventListener("open",()=>{n=!0,i=null}),r.addEventListener("close",()=>{n=!1,i=null}),r.addEventListener("error",s=>{n||(i=s.error??new Error(`connect ECONNREFUSED ${r.url}`))}),Object.assign(t,{connected:e})};var cT=async r=>{if(r.readyState>=2)throw new Error("socket closed");r.readyState!==1&&await new Promise((e,t)=>{function n(){r.removeEventListener("open",i),r.removeEventListener("error",s)}function i(){n(),e()}function s(o){n(),t(o.error??new Error(`connect ECONNREFUSED ${r.url}`))}r.addEventListener("open",i),r.addEventListener("error",s)})};var lT=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let i of n){try{await cT(r)}catch(s){if(s.message==="socket closed")break;throw s}r.send(i)}e.closeOnEnd!=null&&r.readyState<=1&&await new Promise((i,s)=>{r.addEventListener("close",o=>{if(o.wasClean||o.code===1006)i();else{let a=Object.assign(new Error("ws error"),{event:o});s(a)}}),setTimeout(()=>{r.close()})})});var uT=(r,e)=>{e=e??{};let t=aT(r),n=e.remoteAddress,i=e.remotePort;if(r.url!=null)try{let o=new URL(r.url);n=o.hostname,i=parseInt(o.port,10)}catch{}if(n==null||i==null)throw new Error("Remote connection did not have address and/or port");return{sink:lT(r,e),source:t,connected:async()=>{await t.connected()},close:async()=>{(r.readyState===r.CONNECTING||r.readyState===r.OPEN)&&await new Promise(o=>{r.addEventListener("close",()=>{o()}),r.close()})},destroy:()=>{r.terminate!=null?r.terminate():r.close()},remoteAddress:n,remotePort:i,socket:r}};var wT=q(yT(),1),LG={http:"ws",https:"wss"},BG="ws",bT=(r,e)=>(0,wT.relative)(r,e,LG,BG);function ET(r,e){let t=typeof window>"u"?"":window.location;e=e??{};let n=bT(r,t.toString()),i=new rT(n,e.websocket);return uT(i,e)}var _T=q(xT(),1),N5=typeof window=="object"&&typeof document=="object"&&document.nodeType===9,Ld=(0,_T.default)(),Bd=N5&&!Ld,ST=Ld&&!N5,RT=Ld&&N5,IT=typeof globalThis.process<"u"&&typeof globalThis.process.release<"u"&&globalThis.process.release.name==="node"&&!Ld,Md=typeof importScripts=="function"&&typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,vye=typeof globalThis.process<"u"&&typeof globalThis.process.env<"u"&&globalThis.process.env["NODE"+(()=>"_")()+"ENV"]==="test",AT=typeof navigator<"u"&&navigator.product==="ReactNative";function CT(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return Lc.matches(t)||ra.matches(t)})}function PT(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return ra.matches(t)})}function kT(){throw new Error("WebSocket Servers can not be created in the browser!")}var O5=class extends Error{constructor(e){super(e),this.name="TimeoutError"}},L5=class extends Error{constructor(e){super(),this.name="AbortError",this.message=e}},NT=r=>globalThis.DOMException===void 0?new L5(r):new DOMException(r),OT=r=>{let e=r.reason===void 0?NT("This operation was aborted."):r.reason;return e instanceof Error?e:NT(e)};function B5(r,e){let{milliseconds:t,fallback:n,message:i,customTimers:s={setTimeout,clearTimeout}}=e,o,c=new Promise((l,u)=>{if(typeof t!="number"||Math.sign(t)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${t}\``);if(e.signal){let{signal:f}=e;f.aborted&&u(OT(f)),f.addEventListener("abort",()=>{u(OT(f))})}if(t===Number.POSITIVE_INFINITY){r.then(l,u);return}let h=new O5;o=s.setTimeout.call(void 0,()=>{if(n){try{l(n())}catch(f){u(f)}return}typeof r.cancel=="function"&&r.cancel(),i===!1?l():i instanceof Error?u(i):(h.message=i??`Promise timed out after ${t} milliseconds`,u(h))},t),(async()=>{try{l(await r)}catch(f){u(f)}})()}).finally(()=>{c.clear()});return c.clear=()=>{s.clearTimeout.call(void 0,o),o=void 0},c}var LT=T("libp2p:websockets:socket");function BT(r,e,t){t=t??{};let n={async sink(i){t?.signal!=null&&(i=mt(i,t.signal));try{await r.sink(i)}catch(s){s.type!=="aborted"&<.error(s)}},source:t.signal!=null?mt(r.source,t.signal):r.source,remoteAddr:e,timeline:{open:Date.now()},async close(){let i=Date.now();try{await B5(r.close(),{milliseconds:2e3})}catch{let{host:o,port:a}=n.remoteAddr.toOptions();LT("timeout closing stream to %s:%s after %dms, destroying it manually",o,a,Date.now()-i),r.destroy()}finally{n.timeline.close=Date.now()}}};return r.socket.addEventListener("close",()=>{n.timeline.close==null&&(n.timeline.close=Date.now())},{once:!0}),n}var lo=T("libp2p:websockets"),M5=class{init;constructor(e){this.init=e}[Symbol.toStringTag]="@libp2p/websockets";[Di]=!0;async dial(e,t){lo("dialing %s",e),t=t??{};let n=await this._connect(e,t),i=BT(n,e);lo("new outbound connection %s",i.remoteAddr);let s=await t.upgrader.upgradeOutbound(i);return lo("outbound connection %s upgraded",i.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new jr;let n=e.toOptions();lo("dialing %s:%s",n.host,n.port);let i=xe(),s=l=>{lo.error("connection error:",l),i.reject(l)},o=ET(tT(e),this.init);if(o.socket.on!=null?o.socket.on("error",s):o.socket.onerror=s,t.signal==null)return await Promise.race([o.connected(),i.promise]),lo("connected %s",e),o;let a,c=new Promise((l,u)=>{if(a=()=>{u(new jr),o.close().catch(h=>{lo.error("error closing raw socket",h)})},t?.signal?.aborted===!0){a();return}t?.signal?.addEventListener("abort",a)});try{await Promise.race([c,i.promise,o.connected()])}finally{a!=null&&t?.signal?.removeEventListener("abort",a)}return lo("connected %s",e),o}createListener(e){return kT({...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):Bd||Md?PT(e):CT(e)}};function MT(r={}){return()=>new M5(r)}var Hr=T("libp2p:webtransport"),KG=Object.values(En).map(r=>r.decoder).reduce((r,e)=>r.or(e));function VG(r){return Mn.decode(KG.decode(r))}function UT(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}async function FT(r,e,t,n,i){let s=r.writable.getWriter(),o=r.readable.getReader();await s.ready;function a(){let f=n.findIndex(d=>d===h);f!==-1&&(n.splice(f,1),h.stat.timeline.close=Date.now(),i?.(h))}let c=!1,l=!1;(async function(){let f=await s.closed.catch(d=>d);if(f!=null){let d=f.message;d.includes("aborted by the remote server")||d.includes("STOP_SENDING")||Hr.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${f.message}`)}c=!0,c&&l&&a()})().catch(()=>{Hr.error("WebTransport failed to cleanup closed stream")}),async function(){let f=await o.closed.catch(d=>d);f!=null&&Hr.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${f.message}`),l=!0,c&&l&&a()}().catch(()=>{Hr.error("WebTransport failed to cleanup closed stream")});let u=!1,h={id:e,abort(f){c||(s.abort(),c=!0),h.closeRead(),l=!0,a()},close(){h.closeRead(),h.closeWrite(),a()},closeRead(){l||(o.cancel().catch(f=>{f.toString().includes("RESET_STREAM")===!0&&(c=!0)}),l=!0),c&&a()},closeWrite(){c||(c=!0,s.close().catch(f=>{f.toString().includes("RESET_STREAM")===!0&&(l=!0)})),l&&a()},reset(){h.close()},stat:{direction:t,timeline:{open:Date.now()}},metadata:{},source:async function*(){for(;;){let f=await o.read();if(f.done===!0){l=!0,c&&a();return}yield new he(f.value)}}(),sink:async function(f){if(u)throw new Error("sink already called on stream");u=!0;try{for await(let d of f)if(d instanceof Uint8Array)await s.write(d);else for(let p of d)await s.write(p)}finally{h.closeWrite()}}};return h}function qG(r){let e=r.stringTuples(),{url:t,certhashes:n,remotePeer:i}=e.reduce((s,[o,a])=>{switch(o){case X("ip6").code:case X("dns6").code:a?.includes(":")===!0&&(a=`[${a}]`);case X("ip4").code:case X("dns4").code:if(s.seenHost||s.seenPort)throw new Error("Invalid multiaddr, saw host and already saw the host or port");return{...s,url:`${s.url}${a??""}`,seenHost:!0};case X("quic").code:case X("quic-v1").code:case X("webtransport").code:if(!s.seenHost||!s.seenPort)throw new Error("Invalid multiaddr, Didn't see host and port, but saw quic/webtransport");return s;case X("udp").code:if(s.seenPort)throw new Error("Invalid multiaddr, saw port but already saw the port");return{...s,url:`${s.url}:${a??""}`,seenPort:!0};case X("certhash").code:if(!s.seenHost||!s.seenPort)throw new Error("Invalid multiaddr, saw the certhash before seeing the host and port");return{...s,certhashes:s.certhashes.concat([VG(a??"")])};case X("p2p").code:return{...s,remotePeer:te(a??"")};default:throw new Error(`unexpected component in multiaddr: ${o} ${X(o).name} ${a??""} `)}},{url:"https://",seenHost:!1,seenPort:!1,certhashes:[]});return{url:t,certhashes:n,remotePeer:i}}function zG(r,e){return e.filter(n=>!!r.find(i=>{if(n.length!==i.length)return!1;for(let s=0;s<n.length;s++)if(i[s]!==n[s])return!1;return!0})).length===e.length}var U5=class{components;config;constructor(e,t={}){this.components=e,this.config={maxInboundStreams:t.maxInboundStreams??1e3}}[Symbol.toStringTag]="@libp2p/webtransport";[Di]=!0;async dial(e,t){Hr("dialing %s",e);let n=this.components.peerId;if(n===void 0)throw new Error("Need a local peerid");t=t??{};let{url:i,certhashes:s,remotePeer:o}=qG(e);if(s.length===0)throw new Error("Expected multiaddr to contain certhashes");let a=new WebTransport(`${i}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(l=>({algorithm:"sha-256",value:l.digest}))});if(a.closed.catch(l=>{Hr.error("WebTransport transport closed due to:",l)}),await a.ready,o==null)throw new Error("Need a target peerid");if(!await this.authenticateWebTransport(a,n,o,s))throw new Error("Failed to authenticate webtransport");let c={close:async l=>{l!=null&&Hr("Closing webtransport with err:",l),a.close()},remoteAddr:e,timeline:{open:Date.now()},...UT()};a.closed.catch(l=>{Hr.error("WebTransport connection closed:",l),c.timeline.close=Date.now()});try{t?.signal?.throwIfAborted()}catch(l){throw a.close(),l}return t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(a),skipProtection:!0})}async authenticateWebTransport(e,t,n,i){let s=await e.createBidirectionalStream(),o=s.writable.getWriter(),a=s.readable.getReader();await o.ready;let c={source:async function*(){for(;;){let h=await a.read();if(h.value!=null&&(yield h.value),h.done===!0)break}}(),sink:async function(h){for await(let f of h)await o.write(f)}},l=kc()(),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch(h=>{Hr.error(`Failed to close authentication stream writer: ${h.message}`)}),a.cancel().catch(h=>{Hr.error(`Failed to close authentication stream reader: ${h.message}`)}),!zG(u?.webtransportCerthashes??[],i.map(h=>h.bytes)))throw new Error("Our certhashes are not a subset of the remote's reported certhashes");return!0}webtransportMuxer(e){let t=0,n=this.config;return{protocol:"webtransport",createStreamMuxer:i=>{typeof i=="function"&&(i={onIncomingStream:i});let s=[];(async function(){let a=e.incomingBidirectionalStreams.getReader();for(;;){let{done:c,value:l}=await a.read();if(c===!0)break;if(s.length>=n.maxInboundStreams)l.writable.close().catch(u=>{Hr.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)}),l.readable.cancel().catch(u=>{Hr.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)});else{let u=await FT(l,String(t++),"inbound",s,i?.onStreamEnd);s.push(u),i?.onIncomingStream?.(u)}}})().catch(()=>{Hr.error("WebTransport failed to receive incoming stream")});let o={protocol:"webtransport",streams:s,newStream:async a=>{let c=await e.createBidirectionalStream(),l=await FT(c,String(t++),i?.direction??"outbound",s,i?.onStreamEnd);return s.push(l),l},close:a=>{a!=null&&Hr("Closing webtransport muxer with err:",a),e.close()},...UT()};try{i?.signal?.throwIfAborted()}catch(a){throw e.close(),a}return o}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(t=>t.protoNames().includes("webtransport"))}};function KT(r={}){return e=>new U5(e,r)}var Mi;(function(r){let e;(function(i){i.EOL="EOL"})(e=r.ValidityType||(r.ValidityType={}));let t;(function(i){i[i.EOL=0]="EOL"})(t||(t={})),function(i){i.codec=()=>It(t)}(e=r.ValidityType||(r.ValidityType={}));let n;r.codec=()=>(n==null&&(n=se((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.value!=null&&(s.uint32(10),s.bytes(i.value)),i.signature!=null&&(s.uint32(18),s.bytes(i.signature)),i.validityType!=null&&(s.uint32(24),r.ValidityType.codec().encode(i.validityType,s)),i.validity!=null&&(s.uint32(34),s.bytes(i.validity)),i.sequence!=null&&(s.uint32(40),s.uint64(i.sequence)),i.ttl!=null&&(s.uint32(48),s.uint64(i.ttl)),i.pubKey!=null&&(s.uint32(58),s.bytes(i.pubKey)),i.signatureV2!=null&&(s.uint32(66),s.bytes(i.signatureV2)),i.data!=null&&(s.uint32(74),s.bytes(i.data)),o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.value=i.bytes();break;case 2:o.signature=i.bytes();break;case 3:o.validityType=r.ValidityType.codec().decode(i);break;case 4:o.validity=i.bytes();break;case 5:o.sequence=i.uint64();break;case 6:o.ttl=i.uint64();break;case 7:o.pubKey=i.bytes();break;case 8:o.signatureV2=i.bytes();break;case 9:o.data=i.bytes();break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ie(i,r.codec()),r.decode=i=>ne(i,r.codec())})(Mi||(Mi={}));var gh=q(go(),1);var VT="ERR_IPNS_EXPIRED_RECORD",Ud="ERR_UNRECOGNIZED_VALIDITY";var uo="ERR_SIGNATURE_VERIFICATION",qT="ERR_UNRECOGNIZED_FORMAT";var F5="ERR_UNDEFINED_PARAMETER",zT="ERR_INVALID_RECORD_DATA",$T="ERR_INVALID_EMBEDDED_KEY";var HT="ERR_RECORD_TOO_LARGE";var WT=T("ipns:utils"),$G=V("/ipns/");function yh(r){let e=new RegExp("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d+)Z"),t=String(r).trim().match(e);if(t==null)throw new Error("Invalid format");let n=parseInt(t[1],10),i=parseInt(t[2],10)-1,s=parseInt(t[3],10),o=parseInt(t[4],10),a=parseInt(t[5],10),c=parseInt(t[6],10),l=parseInt(t[7].slice(0,-6),10);return new Date(Date.UTC(n,i,s,o,a,c,l))}var YT=async(r,e)=>{if(e==null||r==null){let n=new Error("one or more of the provided parameters are not defined");throw WT.error(n),(0,gh.default)(n,F5)}let t;if(e.pubKey!=null){try{t=Kr(e.pubKey)}catch(i){throw WT.error(i),i}if(!(await wr(e.pubKey)).equals(r))throw(0,gh.default)(new Error("Embedded public key did not match PeerID"),$T)}else r.publicKey!=null&&(t=Kr(r.publicKey));if(t!=null)return t;throw(0,gh.default)(new Error("no public key is available"),F5)};var QT=r=>{let e=V("ipns-signature:");return ge([e,r])};var XT=r=>{let e=Mi.decode(r);return e.sequence!=null&&(e.sequence=BigInt(e.sequence)),e.ttl!=null&&(e.ttl=BigInt(e.ttl)),{value:e.value??new Uint8Array(0),signature:e.signature??new Uint8Array(0),validityType:e.validityType??Mi.ValidityType.EOL,validity:e.validity??new Uint8Array(0),sequence:e.sequence??0n,pubKey:e.pubKey,ttl:e.ttl??void 0,signatureV2:e.signatureV2,data:e.data}};var jT=r=>bt(r.slice($G.length));var ZT=r=>{let e=zn(r);if(e.ValidityType===0)e.ValidityType=Mi.ValidityType.EOL;else throw(0,gh.default)(new Error("Unknown validity type"),Ud);return Number.isInteger(e.Sequence)&&(e.Sequence=BigInt(e.Sequence)),Number.isInteger(e.TTL)&&(e.TTL=BigInt(e.TTL)),e};var JT=(r,e)=>{let t=e.map((n,i)=>({entry:Mi.decode(n),index:i}));return t.sort((n,i)=>{if(n.entry.signatureV2!=null&&i.entry.signatureV2==null)return-1;if(n.entry.signatureV2==null&&i.entry.signatureV2!=null)return 1;let s=n.entry.sequence??0n,o=i.entry.sequence??0n;if(s>o)return-1;if(s<o)return 1;let a=n.entry.validity??new Uint8Array(0),c=i.entry.validity??new Uint8Array(0),l=yh(M(a)),u=yh(M(c));return l.getTime()>u.getTime()?-1:l.getTime()<u.getTime()?1:0}),t[0].index};var bn=q(go(),1);var wh=T("ipns:validator"),HG=1024*10,GG=async(r,e)=>{let{value:t,validityType:n,validity:i}=e,s,o;if(e.signatureV2!=null&&e.data!=null)o=e.signatureV2,s=QT(e.data),WG(e);else throw(0,bn.default)(new Error("missing data or signatureV2"),uo);let a;try{a=await r.verify(s,o)}catch{a=!1}if(!a)throw wh.error("record signature verification failed"),(0,bn.default)(new Error("record signature verification failed"),uo);if(i!=null&&n===Mi.ValidityType.EOL){let c;try{c=yh(M(i))}catch{throw wh.error("unrecognized validity format (not an rfc3339 format)"),(0,bn.default)(new Error("unrecognized validity format (not an rfc3339 format)"),qT)}if(c.getTime()<Date.now())throw wh.error("record has expired"),(0,bn.default)(new Error("record has expired"),VT)}else if(n!=null)throw wh.error("unrecognized validity type"),(0,bn.default)(new Error("unrecognized validity type"),Ud);wh("ipns entry for %b is valid",t)},WG=r=>{if(r.data==null)throw(0,bn.default)(new Error("Record data is missing"),zT);let e=ZT(r.data);if(!de(e.Value,r.value))throw(0,bn.default)(new Error('Field "value" did not match between protobuf and CBOR'),uo);if(!de(e.Validity,r.validity))throw(0,bn.default)(new Error('Field "validity" did not match between protobuf and CBOR'),uo);if(e.ValidityType!==r.validityType)throw(0,bn.default)(new Error('Field "validityType" did not match between protobuf and CBOR'),uo);if(e.Sequence!==r.sequence)throw(0,bn.default)(new Error('Field "sequence" did not match between protobuf and CBOR'),uo);if(e.TTL!==r.ttl)throw(0,bn.default)(new Error('Field "ttl" did not match between protobuf and CBOR'),uo)},eD=async(r,e)=>{if(e.byteLength>HG)throw(0,bn.default)(new Error("record too large"),HT);let t=jT(r),n=XT(e),i=await YT(t,n);await GG(i,n)};var V5=q(en(),1);var tD="libp2p",rD="autonat",nD="1.0.0";var we;(function(r){let e;(function(l){l.DIAL="DIAL",l.DIAL_RESPONSE="DIAL_RESPONSE"})(e=r.MessageType||(r.MessageType={}));let t;(function(l){l[l.DIAL=0]="DIAL",l[l.DIAL_RESPONSE=1]="DIAL_RESPONSE"})(t||(t={})),function(l){l.codec=()=>It(t)}(e=r.MessageType||(r.MessageType={}));let n;(function(l){l.OK="OK",l.E_DIAL_ERROR="E_DIAL_ERROR",l.E_DIAL_REFUSED="E_DIAL_REFUSED",l.E_BAD_REQUEST="E_BAD_REQUEST",l.E_INTERNAL_ERROR="E_INTERNAL_ERROR"})(n=r.ResponseStatus||(r.ResponseStatus={}));let i;(function(l){l[l.OK=0]="OK",l[l.E_DIAL_ERROR=100]="E_DIAL_ERROR",l[l.E_DIAL_REFUSED=101]="E_DIAL_REFUSED",l[l.E_BAD_REQUEST=200]="E_BAD_REQUEST",l[l.E_INTERNAL_ERROR=300]="E_INTERNAL_ERROR"})(i||(i={})),function(l){l.codec=()=>It(i)}(n=r.ResponseStatus||(r.ResponseStatus={}));let s;(function(l){let u;l.codec=()=>(u==null&&(u=se((h,f,d={})=>{if(d.lengthDelimited!==!1&&f.fork(),h.id!=null&&(f.uint32(10),f.bytes(h.id)),h.addrs!=null)for(let p of h.addrs)f.uint32(18),f.bytes(p);d.lengthDelimited!==!1&&f.ldelim()},(h,f)=>{let d={addrs:[]},p=f==null?h.len:h.pos+f;for(;h.pos<p;){let m=h.uint32();switch(m>>>3){case 1:d.id=h.bytes();break;case 2:d.addrs.push(h.bytes());break;default:h.skipType(m&7);break}}return d})),u),l.encode=h=>ie(h,l.codec()),l.decode=h=>ne(h,l.codec())})(s=r.PeerInfo||(r.PeerInfo={}));let o;(function(l){let u;l.codec=()=>(u==null&&(u=se((h,f,d={})=>{d.lengthDelimited!==!1&&f.fork(),h.peer!=null&&(f.uint32(10),r.PeerInfo.codec().encode(h.peer,f)),d.lengthDelimited!==!1&&f.ldelim()},(h,f)=>{let d={},p=f==null?h.len:h.pos+f;for(;h.pos<p;){let m=h.uint32();switch(m>>>3){case 1:d.peer=r.PeerInfo.codec().decode(h,h.uint32());break;default:h.skipType(m&7);break}}return d})),u),l.encode=h=>ie(h,l.codec()),l.decode=h=>ne(h,l.codec())})(o=r.Dial||(r.Dial={}));let a;(function(l){let u;l.codec=()=>(u==null&&(u=se((h,f,d={})=>{d.lengthDelimited!==!1&&f.fork(),h.status!=null&&(f.uint32(8),r.ResponseStatus.codec().encode(h.status,f)),h.statusText!=null&&(f.uint32(18),f.string(h.statusText)),h.addr!=null&&(f.uint32(26),f.bytes(h.addr)),d.lengthDelimited!==!1&&f.ldelim()},(h,f)=>{let d={},p=f==null?h.len:h.pos+f;for(;h.pos<p;){let m=h.uint32();switch(m>>>3){case 1:d.status=r.ResponseStatus.codec().decode(h);break;case 2:d.statusText=h.string();break;case 3:d.addr=h.bytes();break;default:h.skipType(m&7);break}}return d})),u),l.encode=h=>ie(h,l.codec()),l.decode=h=>ne(h,l.codec())})(a=r.DialResponse||(r.DialResponse={}));let c;r.codec=()=>(c==null&&(c=se((l,u,h={})=>{h.lengthDelimited!==!1&&u.fork(),l.type!=null&&(u.uint32(8),r.MessageType.codec().encode(l.type,u)),l.dial!=null&&(u.uint32(18),r.Dial.codec().encode(l.dial,u)),l.dialResponse!=null&&(u.uint32(26),r.DialResponse.codec().encode(l.dialResponse,u)),h.lengthDelimited!==!1&&u.ldelim()},(l,u)=>{let h={},f=u==null?l.len:l.pos+u;for(;l.pos<f;){let d=l.uint32();switch(d>>>3){case 1:h.type=r.MessageType.codec().decode(l);break;case 2:h.dial=r.Dial.codec().decode(l,l.uint32());break;case 3:h.dialResponse=r.DialResponse.codec().decode(l,l.uint32());break;default:l.skipType(d&7);break}}return h})),c),r.encode=l=>ie(l,r.codec()),r.decode=l=>ne(l,r.codec())})(we||(we={}));var Ye=T("libp2p:autonat"),K5=4,q5=class{components;startupDelay;refreshInterval;protocol;timeout;maxInboundStreams;maxOutboundStreams;verifyAddressTimeout;started;constructor(e,t){this.components=e,this.started=!1,this.protocol=`/${t.protocolPrefix??tD}/${rD}/${nD}`,this.timeout=t.timeout??3e4,this.maxInboundStreams=t.maxInboundStreams??1,this.maxOutboundStreams=t.maxOutboundStreams??1,this.startupDelay=t.startupDelay??5e3,this.refreshInterval=t.refreshInterval??6e4,this._verifyExternalAddresses=this._verifyExternalAddresses.bind(this)}isStarted(){return this.started}async start(){this.started||(await this.components.registrar.handle(this.protocol,e=>{this.handleIncomingAutonatStream(e).catch(t=>{Ye.error("error handling incoming autonat stream",t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams}),this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.startupDelay),this.started=!0)}async stop(){await this.components.registrar.unhandle(this.protocol),clearTimeout(this.verifyAddressTimeout),this.started=!1}async handleIncomingAutonatStream(e){let t=it([AbortSignal.timeout(this.timeout)]);try{(0,V5.setMaxListeners)?.(1/0,t)}catch{}let n=this.components.addressManager.getAddresses().map(i=>i.toOptions().host);try{let i=gr(e.stream,t),s=this;await be(i,o=>At(o),async function*(o){let a=await ei(o);if(a==null){Ye("no message received"),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"No message was sent"}});return}let c;try{c=we.decode(a)}catch(m){Ye.error("could not decode message",m),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"Could not decode message"}});return}let l=c.dial;if(l==null){Ye.error("dial was missing from message"),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"No Dial message found in message"}});return}let u,h=l.peer;if(h==null||h.id==null){Ye.error("PeerId missing from message"),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"missing peer info"}});return}try{u=bt(h.id)}catch(m){Ye.error("invalid PeerId",m),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"bad peer id"}});return}if(Ye("incoming request from %p",u),!e.connection.remotePeer.equals(u)){Ye("target peer %p did not equal sending peer %p",u,e.connection.remotePeer),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_BAD_REQUEST,statusText:"peer id mismatch"}});return}let f=h.addrs.map(m=>ee(m)).filter(m=>{let g=m.toOptions().host===e.connection.remoteAddr.toOptions().host;return Ye.trace("request to dial %s was sent from %s is same host %s",m,e.connection.remoteAddr,g),g}).filter(m=>{let g=m.toOptions().host,y=!(Dn(g)??!1);return Ye.trace("host %s was public %s",g,y),y}).filter(m=>{let g=m.toOptions().host,y=!n.includes(g);return Ye.trace("host %s was not our host %s",g,y),y}).filter(m=>{let g=!!s.components.transportManager.transportForMultiaddr(m);return Ye.trace("transport for %s is supported %s",m,g),g}).map(m=>(m.getPeerId()==null&&(m=m.encapsulate(`/p2p/${u.toString()}`)),m));if(f.length===0){Ye("no valid multiaddrs for %p in message",u),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_DIAL_REFUSED,statusText:"no dialable addresses"}});return}Ye("dial multiaddrs %s for peer %p",f.map(m=>m.toString()).join(", "),u);let d="",p=f[0];for await(let m of f){let g;p=m;try{if(g=await s.components.connectionManager.openConnection(m,{signal:t}),!g.remoteAddr.equals(m))throw Ye.error("tried to dial %s but dialed %s",m,g.remoteAddr),new Error("Unexpected remote address");Ye("Success %p",u),yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.OK,addr:g.remoteAddr.decapsulateCode(X("p2p").code).bytes}});return}catch(y){Ye("could not dial %p",u,y),d=y.message}finally{g!=null&&await g.close()}}yield we.encode({type:we.MessageType.DIAL_RESPONSE,dialResponse:{status:we.ResponseStatus.E_DIAL_ERROR,statusText:d,addr:p.bytes}})},o=>gt(o),e.stream)}catch(i){Ye.error("error handling incoming autonat stream",i)}finally{t.clear()}}_verifyExternalAddresses(){this.verifyExternalAddresses().catch(e=>{Ye.error("error verifying external address",e)})}async verifyExternalAddresses(){if(clearTimeout(this.verifyAddressTimeout),!this.isStarted())return;let e=this.components.addressManager,t=e.getObservedAddrs().filter(s=>{let o=s.toOptions();return!(Dn(o.host)??!1)});if(t.length===0){Ye("no public addresses found, not requesting verification"),this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval);return}let n=AbortSignal.timeout(this.timeout);try{(0,V5.setMaxListeners)?.(1/0,n)}catch{}let i=this;try{Ye("verify multiaddrs %s",t.map(h=>h.toString()).join(", "));let s=we.encode({type:we.MessageType.DIAL,dial:{peer:{id:this.components.peerId.toBytes(),addrs:t.map(h=>h.bytes)}}}),a=(await f0()).toBytes(),c={},l=[],u=async h=>{try{Ye("asking %p to verify multiaddr",h.id);let f=await i.components.connectionManager.openConnection(h.id,{signal:n}),d=await f.newStream(this.protocol,{signal:n}),p=gr(d,n),m=await be([s],y=>gt(y),p,y=>At(y),async y=>ei(y));if(m==null){Ye("no response received from %p",f.remotePeer);return}let g=we.decode(m);if(g.type!==we.MessageType.DIAL_RESPONSE||g.dialResponse==null){Ye("invalid autonat response from %p",f.remotePeer);return}if(g.dialResponse.status===we.ResponseStatus.OK){let y=f.remoteAddr.toOptions(),w;if(y.family===4)w=y.host.split(".")[0];else if(y.family===6)w=y.host.split(":")[0];else{Ye('remote address "%s" was not IP4 or IP6?',y.host);return}if(l.includes(w)){Ye("already have response from network segment %d - %s",w,y.host);return}l.push(w)}return g.dialResponse}catch(f){Ye.error("error asking remote to verify multiaddr",f)}};for await(let h of ia(Un(this.components.peerRouting.getClosestPeers(a,{signal:n}),f=>async()=>u(f)),{concurrency:K5}))try{if(h==null)continue;let f=h.addr==null?t[0]:ee(h.addr);if(Ye("autonat response for %a is %s",f,h.status),h.status===we.ResponseStatus.E_BAD_REQUEST||h.status===we.ResponseStatus.E_DIAL_REFUSED||h.addr==null&&t.length>1)continue;if(!t.some(p=>p.equals(f))){Ye("peer reported %a as %s but it was not in our observed address list",f,h.status);continue}let d=f.toString();if(c[d]==null&&(c[d]={success:0,failure:0}),h.status===we.ResponseStatus.OK?c[d].success++:h.status===we.ResponseStatus.E_DIAL_ERROR&&c[d].failure++,c[d].success===K5){Ye("%a is externally dialable",f),e.confirmObservedAddr(f);return}if(c[d].failure===K5){Ye("%a is not externally dialable",f),e.removeObservedAddr(f);return}}catch(f){Ye.error("could not verify external address",f)}}finally{this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval)}}};function iD(r={}){return e=>new q5(e,r)}var iW=q(en(),1);var z5="/libp2p/relay";var sD="circuit-relay-relay";var oD=BigInt(131072),ho="/libp2p/circuit/relay/0.2.0/hop",Fd="/libp2p/circuit/relay/0.2.0/stop",JG=30*1e3,eW=30*1e3;var ps;(function(r){let e;(function(i){i.RESERVE="RESERVE",i.CONNECT="CONNECT",i.STATUS="STATUS"})(e=r.Type||(r.Type={}));let t;(function(i){i[i.RESERVE=0]="RESERVE",i[i.CONNECT=1]="CONNECT",i[i.STATUS=2]="STATUS"})(t||(t={})),function(i){i.codec=()=>It(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=se((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.type!=null&&(s.uint32(8),r.Type.codec().encode(i.type,s)),i.peer!=null&&(s.uint32(18),sl.codec().encode(i.peer,s)),i.reservation!=null&&(s.uint32(26),Kd.codec().encode(i.reservation,s)),i.limit!=null&&(s.uint32(34),ol.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(40),nr.codec().encode(i.status,s)),o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.type=r.Type.codec().decode(i);break;case 2:o.peer=sl.codec().decode(i,i.uint32());break;case 3:o.reservation=Kd.codec().decode(i,i.uint32());break;case 4:o.limit=ol.codec().decode(i,i.uint32());break;case 5:o.status=nr.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ie(i,r.codec()),r.decode=i=>ne(i,r.codec())})(ps||(ps={}));var ci;(function(r){let e;(function(i){i.CONNECT="CONNECT",i.STATUS="STATUS"})(e=r.Type||(r.Type={}));let t;(function(i){i[i.CONNECT=0]="CONNECT",i[i.STATUS=1]="STATUS"})(t||(t={})),function(i){i.codec=()=>It(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=se((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.type!=null&&(s.uint32(8),r.Type.codec().encode(i.type,s)),i.peer!=null&&(s.uint32(18),sl.codec().encode(i.peer,s)),i.limit!=null&&(s.uint32(26),ol.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(32),nr.codec().encode(i.status,s)),o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.type=r.Type.codec().decode(i);break;case 2:o.peer=sl.codec().decode(i,i.uint32());break;case 3:o.limit=ol.codec().decode(i,i.uint32());break;case 4:o.status=nr.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ie(i,r.codec()),r.decode=i=>ne(i,r.codec())})(ci||(ci={}));var sl;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{if(i.lengthDelimited!==!1&&n.fork(),t.id!=null&&t.id.byteLength>0&&(n.uint32(10),n.bytes(t.id)),t.addrs!=null)for(let s of t.addrs)n.uint32(18),n.bytes(s);i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={id:new Uint8Array(0),addrs:[]},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.id=t.bytes();break;case 2:i.addrs.push(t.bytes());break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(sl||(sl={}));var Kd;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{if(i.lengthDelimited!==!1&&n.fork(),t.expire!=null&&t.expire!==0n&&(n.uint32(8),n.uint64(t.expire)),t.addrs!=null)for(let s of t.addrs)n.uint32(18),n.bytes(s);t.voucher!=null&&(n.uint32(26),n.bytes(t.voucher)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={expire:0n,addrs:[]},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.expire=t.uint64();break;case 2:i.addrs.push(t.bytes());break;case 3:i.voucher=t.bytes();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(Kd||(Kd={}));var ol;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.duration!=null&&(n.uint32(8),n.uint32(t.duration)),t.data!=null&&(n.uint32(16),n.uint64(t.data)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.duration=t.uint32();break;case 2:i.data=t.uint64();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(ol||(ol={}));var nr;(function(r){r.UNUSED="UNUSED",r.OK="OK",r.RESERVATION_REFUSED="RESERVATION_REFUSED",r.RESOURCE_LIMIT_EXCEEDED="RESOURCE_LIMIT_EXCEEDED",r.PERMISSION_DENIED="PERMISSION_DENIED",r.CONNECTION_FAILED="CONNECTION_FAILED",r.NO_RESERVATION="NO_RESERVATION",r.MALFORMED_MESSAGE="MALFORMED_MESSAGE",r.UNEXPECTED_MESSAGE="UNEXPECTED_MESSAGE"})(nr||(nr={}));var $5;(function(r){r[r.UNUSED=0]="UNUSED",r[r.OK=100]="OK",r[r.RESERVATION_REFUSED=200]="RESERVATION_REFUSED",r[r.RESOURCE_LIMIT_EXCEEDED=201]="RESOURCE_LIMIT_EXCEEDED",r[r.PERMISSION_DENIED=202]="PERMISSION_DENIED",r[r.CONNECTION_FAILED=203]="CONNECTION_FAILED",r[r.NO_RESERVATION=204]="NO_RESERVATION",r[r.MALFORMED_MESSAGE=400]="MALFORMED_MESSAGE",r[r.UNEXPECTED_MESSAGE=401]="UNEXPECTED_MESSAGE"})($5||($5={}));(function(r){r.codec=()=>It($5)})(nr||(nr={}));var H5;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.relay!=null&&t.relay.byteLength>0&&(n.uint32(10),n.bytes(t.relay)),t.peer!=null&&t.peer.byteLength>0&&(n.uint32(18),n.bytes(t.peer)),t.expiration!=null&&t.expiration!==0n&&(n.uint32(24),n.uint64(t.expiration)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={relay:new Uint8Array(0),peer:new Uint8Array(0),expiration:0n},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.relay=t.bytes();break;case 2:i.peer=t.bytes();break;case 3:i.expiration=t.uint64();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(H5||(H5={}));var $7e=T("libp2p:circuit-relay:utils");async function G5(r){let e=new TextEncoder().encode(r),t=await je.digest(e);return ce.createV0(t)}function W5(r){let e=r*BigInt(1e3),t=new Date().getTime();return Number(e-BigInt(t))}var nW=q(hD(),1);var n9e=T("libp2p:circuit-relay:advert-service");var N9e=T("libp2p:circuit-relay:server");var sW=T("libp2p:stream:converter");function Y5(r,e={}){let{stream:t,remoteAddr:n}=r,{sink:i,source:s}=t,o=async function*(){for await(let l of s)l instanceof Uint8Array?yield l:yield*l}(),a={async sink(l){e.signal!=null&&(l=mt(l,e.signal));try{await i(l),await c()}catch(u){u.type!=="aborted"&&sW(u)}},source:e.signal!=null?mt(o,e.signal):o,remoteAddr:n,timeline:{open:Date.now(),close:void 0},async close(){await i(async function*(){yield new Uint8Array(0)}()),await c()}};async function c(){a.timeline.close==null&&(a.timeline.close=Date.now()),await Promise.resolve()}return a}var fo=T("libp2p:circuit-relay:discover-relays"),Vd=class extends Ue{peerId;peerStore;contentRouting;registrar;started;topologyId;constructor(e){super(),this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.contentRouting=e.contentRouting,this.registrar=e.registrar}isStarted(){return this.started}async start(){this.topologyId=await this.registrar.register(ho,Es({onConnect:e=>{this.safeDispatchEvent("relay:discover",{detail:e})}})),this.discover().catch(e=>{fo.error("error listening on relays",e)}),this.started=!0}stop(){this.topologyId!=null&&this.registrar.unregister(this.topologyId),this.started=!1}async discover(){fo("searching peer store for relays");let e=await this.peerStore.all({filters:[t=>t.protocols.includes(ho)],orders:[()=>Math.random()<.5?1:-1]});for(let t of e)fo("found relay peer %p in content peer store",t.id),this.safeDispatchEvent("relay:discover",{detail:t.id});fo("found %d relay peers in peer store",e.length);try{fo("searching content routing for relays");let t=await G5(z5),n=0;for await(let i of this.contentRouting.findProviders(t))if(i.multiaddrs.length>0&&!i.id.equals(this.peerId)){let s=i.id;n++,await this.peerStore.merge(s,{multiaddrs:i.multiaddrs}),fo("found relay peer %p in content routing",s),this.safeDispatchEvent("relay:discover",{detail:s})}fo("found %d relay peers in content routing",n)}catch(t){fo.error("failed when finding relays on the network",t)}}};var dD=T("libp2p:circuit-relay:transport:listener"),Q5=class extends Ue{connectionManager;relayStore;listeningAddrs;constructor(e){super(),this.connectionManager=e.connectionManager,this.relayStore=e.relayStore,this.listeningAddrs=new br,this.relayStore.addEventListener("relay:removed",t=>{this.#e(t.detail)})}async listen(e){dD("listen on %s",e);let t=e.getPeerId(),n;if(t!=null){let s=te(t),o=this.connectionManager.getConnectionsMap().get(s)??[];o.length>0&&(n=o[0])}if(n==null){let s=e.toString().split("/p2p-circuit").find(a=>a!==""),o=ee(s);n=await this.connectionManager.openConnection(o)}if(!this.relayStore.hasReservation(n.remotePeer)){await this.relayStore.addRelay(n.remotePeer,"configured");return}let i=this.relayStore.getReservation(n.remotePeer);if(i==null)throw new b("Did not have reservation after making reservation","ERR_NO_RESERVATION");if(this.listeningAddrs.has(n.remotePeer)){dD("already listening on relay %p",n.remotePeer);return}this.listeningAddrs.set(n.remotePeer,i.addrs.map(s=>ee(s).encapsulate("/p2p-circuit"))),this.safeDispatchEvent("listening",{})}getAddrs(){return[...this.listeningAddrs.values()].flat()}async close(){}#e(e){let t=this.listeningAddrs.has(e);this.listeningAddrs.delete(e),t&&this.safeDispatchEvent("close",{})}};function pD(r){return new Q5(r)}var Or=T("libp2p:circuit-relay:transport:reservation-store"),aW=60*1e3*10,cW=60*1e3*5,lW=30*1e3,qd=class extends Ue{peerId;connectionManager;transportManager;peerStore;events;reserveQueue;reservations;maxDiscoveredRelays;maxReservationQueueLength;started;constructor(e,t){super(),this.peerId=e.peerId,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.peerStore=e.peerStore,this.events=e.events,this.reservations=new br,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.started=!1,this.reserveQueue=new yc({concurrency:t?.reservationConcurrency??1}),this.events.addEventListener("peer:disconnect",n=>{this.#t(n.detail)})}isStarted(){return this.started}async start(){this.started=!0}async stop(){this.reservations.forEach(({timeout:e})=>{clearTimeout(e)}),this.reservations.clear(),this.started=!0}async addRelay(e,t){if(this.peerId.equals(e)){Or("not trying to use self as relay");return}if(this.reserveQueue.size>this.maxReservationQueueLength){Or("not adding relay as the queue is full");return}if(this.reserveQueue.hasJob(e)){Or("relay peer is already in the reservation queue");return}Or("add relay %p",e),await this.reserveQueue.add(async()=>{try{let n=this.reservations.get(e);if(n!=null){if(W5(n.reservation.expire)>aW){Or("already have reservation on relay peer %p and it expires in more than 10 minutes",e);return}clearTimeout(n.timeout),this.reservations.delete(e)}if(t==="discovered"&&[...this.reservations.values()].reduce((l,u)=>(u.type==="discovered"&&l++,l),0)>=this.maxDiscoveredRelays){Or("already have enough discovered relays");return}let i=await this.connectionManager.openConnection(e);if(i.remoteAddr.protoNames().includes("p2p-circuit")){Or("not creating reservation over relayed connection");return}let s=await this.#e(i);Or("created reservation on relay peer %p",e);let o=W5(s.expire),a=Math.min(Math.max(o-cW,lW),Math.pow(2,31)-1),c=setTimeout(()=>{this.addRelay(e,t).catch(l=>{Or.error("could not refresh reservation to relay %p",e,l)})},a);this.reservations.set(e,{timeout:c,reservation:s,type:t}),await this.peerStore.merge(e,{tags:{[sD]:{value:1,ttl:o}}}),await this.transportManager.listen([ee(`/p2p/${e.toString()}/p2p-circuit`)])}catch(n){Or.error("could not reserve slot on %p",e,n),this.reservations.delete(e)}},{peerId:e})}hasReservation(e){return this.reservations.has(e)}getReservation(e){return this.reservations.get(e)?.reservation}async#e(e){Or("requesting reservation from %s",e.remotePeer);let t=await e.newStream(ho),i=zr(t).pb(ps);i.write({type:ps.Type.RESERVE});let s;try{s=await i.read()}catch(a){throw Or.error("error parsing reserve message response from %p because",e.remotePeer,a),a}finally{t.close()}if(s.status===nr.OK&&s.reservation!=null)return s.reservation;let o=`reservation failed with status ${s.status??"undefined"}`;throw Or.error(o),new Error(o)}#t(e){let t=this.reservations.get(e);t!=null&&(Or("connection to relay %p closed, removing reservation from local store",e),clearTimeout(t.timeout),this.reservations.delete(e),this.safeDispatchEvent("relay:removed",{detail:e}),this.reservations.size<this.maxDiscoveredRelays&&(Or("not enough relays %d/%d",this.reservations.size,this.maxDiscoveredRelays),this.safeDispatchEvent("relay:not-enough-relays",{})))}};var Gr=T("libp2p:circuit-relay:transport"),uW=r=>{if(r.peer==null)return!1;try{r.peer.addrs.forEach(ee)}catch{return!1}return!0},mD={maxInboundStopStreams:300,maxOutboundStopStreams:300},X5=class{discovery;registrar;peerStore;connectionManager;peerId;upgrader;addressManager;connectionGater;reservationStore;maxInboundStopStreams;maxOutboundStopStreams;started;constructor(e,t){this.registrar=e.registrar,this.peerStore=e.peerStore,this.connectionManager=e.connectionManager,this.peerId=e.peerId,this.upgrader=e.upgrader,this.addressManager=e.addressManager,this.connectionGater=e.connectionGater,this.maxInboundStopStreams=t.maxInboundStopStreams??mD.maxInboundStopStreams,this.maxOutboundStopStreams=t.maxOutboundStopStreams??mD.maxOutboundStopStreams,t.discoverRelays!=null&&t.discoverRelays>0&&(this.discovery=new Vd(e),this.discovery.addEventListener("relay:discover",n=>{this.reservationStore.addRelay(n.detail,"discovered").catch(i=>{Gr.error("could not add discovered relay %p",n.detail,i)})})),this.reservationStore=new qd(e,t),this.reservationStore.addEventListener("relay:not-enough-relays",()=>{this.discovery?.discover().catch(n=>{Gr.error("could not discover relays",n)})}),this.started=!1}isStarted(){return this.started}async start(){await this.reservationStore.start(),await this.discovery?.start(),await this.registrar.handle(Fd,e=>{this.onStop(e).catch(t=>{Gr.error(t)})},{maxInboundStreams:this.maxInboundStopStreams,maxOutboundStreams:this.maxOutboundStopStreams}),this.started=!0}async stop(){this.discovery?.stop(),await this.reservationStore.stop(),await this.registrar.unhandle(Fd),this.started=!1}[Di]=!0;[Symbol.toStringTag]="libp2p/circuit-relay-v2";async dial(e,t={}){if(e.protoCodes().filter(p=>p===290).length!==1){let p="Invalid circuit relay address";throw Gr.error(p,e),new b(p,F.ERR_RELAYED_DIAL)}let n=e.toString().split("/p2p-circuit"),i=ee(n[0]),s=ee(n[n.length-1]),o=i.getPeerId(),a=s.getPeerId();if(o==null||a==null){let p=`Circuit relay dial to ${e.toString()} failed as address did not have peer ids`;throw Gr.error(p),new b(p,F.ERR_RELAYED_DIAL)}let c=te(o),l=te(a),u=!1,f=this.connectionManager.getConnections(c)[0];f==null&&(await this.peerStore.merge(c,{multiaddrs:[i]}),f=await this.connectionManager.openConnection(c,t),u=!0);let d;try{return d=await f.newStream([ho]),await this.connectV2({stream:d,connection:f,destinationPeer:l,destinationAddr:s,relayAddr:i,ma:e,disconnectOnFailure:u})}catch(p){throw Gr.error(`Circuit relay dial to destination ${l.toString()} via relay ${c.toString()} failed`,p),d?.abort(p),u&&await f.close(),p}}async connectV2({stream:e,connection:t,destinationPeer:n,destinationAddr:i,relayAddr:s,ma:o,disconnectOnFailure:a}){try{let c=zr(e),l=c.pb(ps);l.write({type:ps.Type.CONNECT,peer:{id:n.toBytes(),addrs:[ee(i).bytes]}});let u=await l.read();if(u.status!==nr.OK)throw new b(`failed to connect via relay with status ${u?.status?.toString()??"undefined"}`,F.ERR_HOP_REQUEST_FAILED);let h=Y5({stream:c.unwrap(),remoteAddr:o,localAddr:s.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`)});return Gr("new outbound connection %s",h.remoteAddr),await this.upgrader.upgradeOutbound(h)}catch(c){throw Gr.error(`Circuit relay dial to destination ${n.toString()} via relay ${t.remotePeer.toString()} failed`,c),a&&await t.close(),c}}createListener(e){return pD({connectionManager:this.connectionManager,relayStore:this.reservationStore})}filter(e){return e=Array.isArray(e)?e:[e],e.filter(t=>ii.matches(t))}async onStop({connection:e,stream:t}){let n=zr(t),i=await n.readPB(ci);if(Gr("received circuit v2 stop protocol request from %s",e.remotePeer),i?.type===void 0)return;let s=n.pb(ci);if(Gr("new circuit relay v2 stop stream from %s",e.remotePeer),i.type!==ci.Type.CONNECT){Gr.error("invalid stop connect request via peer %s",e.remotePeer),s.write({type:ci.Type.STATUS,status:nr.UNEXPECTED_MESSAGE});return}if(!uW(i)){Gr.error("invalid stop connect request via peer %s",e.remotePeer),s.write({type:ci.Type.STATUS,status:nr.MALFORMED_MESSAGE});return}let o=bt(i.peer.id);if(await this.connectionGater.denyInboundRelayedConnection?.(e.remotePeer,o)===!0){s.write({type:ci.Type.STATUS,status:nr.PERMISSION_DENIED});return}s.write({type:ci.Type.STATUS,status:nr.OK});let a=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${o.toString()}`),c=this.addressManager.getAddresses()[0],l=Y5({stream:n.unwrap(),remoteAddr:a,localAddr:c});Gr("new inbound connection %s",l.remoteAddr),await this.upgrader.upgradeInbound(l),Gr("%s connection %s upgraded","inbound",l.remoteAddr)}};function j5(r={}){return e=>new X5(e,r)}var gD="0.45.9";var Z5=`js-libp2p/${gD}`;var yD="0.1.0",wD="id",bD="id/push",ED="1.0.0",vD="1.0.0";var zd=q(en(),1);var po;(function(r){let e;r.codec=()=>(e==null&&(e=se((t,n,i={})=>{if(i.lengthDelimited!==!1&&n.fork(),t.protocolVersion!=null&&(n.uint32(42),n.string(t.protocolVersion)),t.agentVersion!=null&&(n.uint32(50),n.string(t.agentVersion)),t.publicKey!=null&&(n.uint32(10),n.bytes(t.publicKey)),t.listenAddrs!=null)for(let s of t.listenAddrs)n.uint32(18),n.bytes(s);if(t.observedAddr!=null&&(n.uint32(34),n.bytes(t.observedAddr)),t.protocols!=null)for(let s of t.protocols)n.uint32(26),n.string(s);t.signedPeerRecord!=null&&(n.uint32(66),n.bytes(t.signedPeerRecord)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={listenAddrs:[],protocols:[]},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 5:i.protocolVersion=t.string();break;case 6:i.agentVersion=t.string();break;case 1:i.publicKey=t.bytes();break;case 2:i.listenAddrs.push(t.bytes());break;case 4:i.observedAddr=t.bytes();break;case 3:i.protocols.push(t.string());break;case 8:i.signedPeerRecord=t.bytes();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ie(t,r.codec()),r.decode=t=>ne(t,r.codec())})(po||(po={}));var Lr=T("libp2p:identify"),xD=1024*8,li={protocolPrefix:"ipfs",agentVersion:Z5,timeout:6e4,maxInboundStreams:1,maxOutboundStreams:1,maxPushIncomingStreams:1,maxPushOutgoingStreams:1,maxObservedAddresses:10,maxIdentifyMessageSize:8192},$d=class{identifyProtocolStr;identifyPushProtocolStr;host;started;timeout;peerId;peerStore;registrar;connectionManager;addressManager;maxInboundStreams;maxOutboundStreams;maxPushIncomingStreams;maxPushOutgoingStreams;maxIdentifyMessageSize;maxObservedAddresses;events;constructor(e,t){this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.connectionManager=e.connectionManager,this.events=e.events,this.identifyProtocolStr=`/${t.protocolPrefix??li.protocolPrefix}/${wD}/${ED}`,this.identifyPushProtocolStr=`/${t.protocolPrefix??li.protocolPrefix}/${bD}/${vD}`,this.timeout=t.timeout??li.timeout,this.maxInboundStreams=t.maxInboundStreams??li.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??li.maxOutboundStreams,this.maxPushIncomingStreams=t.maxPushIncomingStreams??li.maxPushIncomingStreams,this.maxPushOutgoingStreams=t.maxPushOutgoingStreams??li.maxPushOutgoingStreams,this.maxIdentifyMessageSize=t.maxIdentifyMessageSize??li.maxIdentifyMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??li.maxObservedAddresses,this.host={protocolVersion:`${t.protocolPrefix??li.protocolPrefix}/${yD}`,agentVersion:t.agentVersion??li.agentVersion},e.events.addEventListener("connection:open",n=>{let i=n.detail;this.identify(i).catch(s=>{Lr.error("error during identify trigged by connection:open",s)})}),e.events.addEventListener("self:peer:update",n=>{this.push().catch(i=>{Lr.error(i)})}),this.host.agentVersion===Z5&&(IT||ST?this.host.agentVersion+=` UserAgent=${globalThis.process.version}`:(Bd||Md||RT||AT)&&(this.host.agentVersion+=` UserAgent=${globalThis.navigator.userAgent}`))}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:V(this.host.agentVersion),ProtocolVersion:V(this.host.protocolVersion)}}),await this.registrar.handle(this.identifyProtocolStr,e=>{this._handleIdentify(e).catch(t=>{Lr.error(t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams}),await this.registrar.handle(this.identifyPushProtocolStr,e=>{this._handlePush(e).catch(t=>{Lr.error(t)})},{maxInboundStreams:this.maxPushIncomingStreams,maxOutboundStreams:this.maxPushOutgoingStreams}),this.started=!0)}async stop(){await this.registrar.unhandle(this.identifyProtocolStr),await this.registrar.unhandle(this.identifyPushProtocolStr),this.started=!1}async pushToConnections(e){let t=this.addressManager.getAddresses().map(u=>u.decapsulateCode(X("p2p").code)),n=new vr({peerId:this.peerId,multiaddrs:t}),i=await Dr.seal(n,this.peerId),s=this.registrar.getProtocols(),o=await this.peerStore.get(this.peerId),a=M(o.metadata.get("AgentVersion")??V(this.host.agentVersion)),c=M(o.metadata.get("ProtocolVersion")??V(this.host.protocolVersion)),l=e.map(async u=>{let h,f=AbortSignal.timeout(this.timeout);try{(0,zd.setMaxListeners)?.(1/0,f)}catch{}try{h=await u.newStream([this.identifyPushProtocolStr],{signal:f}),await gr(h,f).sink(be([po.encode({listenAddrs:t.map(p=>p.bytes),signedPeerRecord:i.marshal(),protocols:s,agentVersion:a,protocolVersion:c})],p=>gt(p)))}catch(d){Lr.error("could not push identify update to peer",d)}finally{h?.close()}});await Promise.all(l)}async push(){if(!this.isStarted())return;let e=[];await Promise.all(this.connectionManager.getConnections().map(async t=>{try{if(!(await this.peerStore.get(t.remotePeer)).protocols.includes(this.identifyPushProtocolStr))return;e.push(t)}catch(n){if(n.code!==F.ERR_NOT_FOUND)throw n}})),await this.pushToConnections(e)}async _identify(e,t={}){let n,i=it([AbortSignal.timeout(this.timeout),t?.signal]);try{(0,zd.setMaxListeners)?.(1/0,i)}catch{}try{n=await e.newStream([this.identifyProtocolStr],{signal:i});let s=gr(n,i),o=await be([],s,a=>At(a,{maxDataLength:this.maxIdentifyMessageSize??xD}),async a=>ei(a));if(o==null)throw new b("No data could be retrieved",F.ERR_CONNECTION_ENDED);try{return po.decode(o)}catch(a){throw new b(String(a),F.ERR_INVALID_MESSAGE)}}finally{n?.close(),i.clear()}}async identify(e,t={}){let n=await this._identify(e,t),{publicKey:i,protocols:s,observedAddr:o}=n;if(i==null)throw new b("public key was missing from identify message",F.ERR_MISSING_PUBLIC_KEY);let a=await wr(i);if(!e.remotePeer.equals(a))throw new b("identified peer does not match the expected peer",F.ERR_INVALID_PEER);if(this.peerId.equals(a))throw new b("identified peer is our own peer id?",F.ERR_INVALID_PEER);let c=hW(o);Lr("identify completed for peer %p and protocols %o",a,s),Lr("our observed address is %s",c),c!=null&&this.addressManager.getObservedAddrs().length<(this.maxObservedAddresses??1/0)&&(Lr("storing our observed address %s",c?.toString()),this.addressManager.addObservedAddr(c));let l=await this.#e(e.remotePeer,n),u={peerId:a,protocolVersion:n.protocolVersion,agentVersion:n.agentVersion,publicKey:n.publicKey,listenAddrs:n.listenAddrs.map(h=>ee(h)),observedAddr:n.observedAddr==null?void 0:ee(n.observedAddr),protocols:n.protocols,signedPeerRecord:l};this.events.safeDispatchEvent("peer:identify",{detail:u})}async _handleIdentify(e){let{connection:t,stream:n}=e,i=AbortSignal.timeout(this.timeout);try{(0,zd.setMaxListeners)?.(1/0,i)}catch{}try{let s=this.peerId.publicKey??new Uint8Array(0),o=await this.peerStore.get(this.peerId),a=this.addressManager.getAddresses().map(f=>f.decapsulateCode(X("p2p").code)),c=o.peerRecordEnvelope;if(a.length>0&&c==null){let f=new vr({peerId:this.peerId,multiaddrs:a});c=(await Dr.seal(f,this.peerId)).marshal().subarray()}let l=po.encode({protocolVersion:this.host.protocolVersion,agentVersion:this.host.agentVersion,publicKey:s,listenAddrs:a.map(f=>f.bytes),signedPeerRecord:c,observedAddr:t.remoteAddr.bytes,protocols:o.protocols}),u=gr(n,i),h=be([l],f=>gt(f));await u.sink(h)}catch(s){Lr.error("could not respond to identify request",s)}finally{n.close()}}async _handlePush(e){let{connection:t,stream:n}=e;try{if(this.peerId.equals(t.remotePeer))throw new Error("received push from ourselves?");let i=gr(n,AbortSignal.timeout(this.timeout)),o=await zr(i,{maxDataLength:this.maxIdentifyMessageSize??xD}).readPB(po);await this.#e(t.remotePeer,o)}catch(i){Lr.error("received invalid message",i);return}finally{n.close()}Lr("handled push from %p",t.remotePeer)}async#e(e,t){if(Lr("received identify from %p",e),t==null)throw new Error("Message was null or undefined");let n={addresses:t.listenAddrs.map(s=>({isCertified:!1,multiaddr:ee(s)})),protocols:t.protocols,metadata:new Map,peerRecordEnvelope:t.signedPeerRecord},i;if(t.signedPeerRecord!=null){Lr("received signedPeerRecord in push from %p",e);let s=t.signedPeerRecord,o=await Dr.openAndCertify(s,vr.DOMAIN),a=vr.createFromProtobuf(o.payload);if(!a.peerId.equals(o.peerId))throw new Error("signing key does not match PeerId in the PeerRecord");if(!e.equals(a.peerId))throw new Error("signing key does not match remote PeerId");let c;try{c=await this.peerStore.get(a.peerId)}catch(l){if(l.code!=="ERR_NOT_FOUND")throw l}if(c!=null&&(n.metadata=c.metadata,c.peerRecordEnvelope!=null)){let l=await Dr.createFromProtobuf(c.peerRecordEnvelope),u=vr.createFromProtobuf(l.payload);u.seqNumber>=a.seqNumber&&(Lr("sequence number was lower or equal to existing sequence number - stored: %d received: %d",u.seqNumber,a.seqNumber),a=u,s=c.peerRecordEnvelope)}n.peerRecordEnvelope=s,n.addresses=a.multiaddrs.map(l=>({isCertified:!0,multiaddr:l})),i={seq:a.seqNumber,addresses:a.multiaddrs}}else Lr("%p did not send a signed peer record",e);return t.agentVersion!=null&&n.metadata.set("AgentVersion",V(t.agentVersion)),t.protocolVersion!=null&&n.metadata.set("ProtocolVersion",V(t.protocolVersion)),await this.peerStore.patch(e,n),i}};function hW(r){if(r!=null&&r.length>0)try{return ee(r)}catch{}}function _D(r={}){return e=>new $d(e,r)}var SD={list:["/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN","/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa","/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb","/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt","/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"]};function RD(){return{addresses:{listen:["/webrtc"]},transports:[jA(),XA(),KT(),MT(),j5({discoverRelays:1})],connectionEncryption:[kc()],streamMuxers:[PS(),rI()],peerDiscovery:[zS(SD)],contentRouters:[XS("https://cid.contact")],services:{identify:_D(),autoNAT:iD(),pubsub:T_(),dht:HR({clientMode:!0,validators:{ipns:eD},selectors:{ipns:JT}})}}}async function ID(r,e){let t=RD();return e=e??{},xx({datastore:r,...t,...e,start:!1})}var J5="1.3.7",Hd="helia";var fW=T("helia");async function dW(r={}){let e=r.datastore??new wo,t=r.blockstore??new fl,n;pW(r.libp2p)?n=r.libp2p:n=await ID(e,r.libp2p);let i=new Af({...r,datastore:e,blockstore:t,libp2p:n});return r.start!==!1&&await i.start(),i.libp2p.isStarted()?await AD(i):i.libp2p.addEventListener("start",()=>{AD(i).catch(s=>{fW.error("could not add Helia to agent version",s)})}),i}function pW(r){return r==null?!1:["dial","dialProtocol","hangUp","handle","unhandle","getMultiaddrs","getProtocols"].every(t=>typeof r[t]=="function")}async function AD(r){let t=(await r.libp2p.peerStore.get(r.libp2p.peerId)).metadata.get("AgentVersion");if(t==null)return;let n=new TextDecoder().decode(t);n.match(/js-libp2p\/\d+\.\d+\.\d+\sUserAgent=/)!=null&&(n.includes(Hd)?n=`${Hd}/${J5} ${n.split(" ").slice(1).join(" ")}`:n=`${Hd}/${J5} ${n}`,await r.libp2p.peerStore.merge(r.libp2p.peerId,{metadata:{AgentVersion:new TextEncoder().encode(n)}}))}return Eh(mW);})();
|
|
85
85
|
/*! Bundled license information:
|
|
86
86
|
|
|
87
87
|
@noble/ed25519/lib/esm/index.js:
|
package/dist/src/version.d.ts
CHANGED
package/dist/src/version.js
CHANGED
package/package.json
CHANGED
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '1.3.
|
|
1
|
+
export const version = '1.3.7'
|
|
2
2
|
export const name = 'helia'
|