helia 2.0.3-c674ba2 → 2.0.3-dbbee17
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 +3 -3
- package/src/version.ts +1 -1
package/dist/index.min.js
CHANGED
|
@@ -82,7 +82,7 @@ a=candidate:1467250027 1 UDP 1467250027 ${t} ${n} typ host\r
|
|
|
82
82
|
a=ice-ufrag:`+e+`
|
|
83
83
|
`).replace(/\na=ice-pwd:[^\n]*\n/,`
|
|
84
84
|
a=ice-pwd:`+e+`
|
|
85
|
-
`),r}var AI=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),TI=r=>[...Array(r)].map(()=>AI.at(Math.floor(Math.random()*AI.length))).join("");var Qd=D("libp2p:webrtc:transport"),t$=1e4,a5e=ge("webrtc-direct").code,II=ge("certhash").code,Xd=class{metrics;components;init;constructor(e,t={}){this.components=e,this.init=t,e.metrics!=null&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webrtc-direct_dialer_events_total",{label:"event",help:"Total count of WebRTC-direct dial events by type"})})}async dial(e,t){let n=await this._connect(e,t);return Qd("dialing address: %a",e),n}createListener(e){throw FS("WebRTCTransport.createListener")}filter(e){return e.filter(Ww.exactMatch)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[gi]=!0;async _connect(e,t){let n=new AbortController,i=n.signal,s=e.getPeerId();if(s===null)throw Ad("we need to have the remote's PeerId");let o=ce(s),a=Ag(Yd(e)),c=await Sc.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:Tg(a.name)}),l=new Sc({certificates:[c]});try{let u=new Promise((_,k)=>{let B=l.createDataChannel("",{negotiated:!0,id:0}),L=setTimeout(()=>{let K=`Data channel was never opened: state: ${B.readyState}`;Qd.error(K),this.metrics?.dialerEvents.increment({open_error:!0}),k(V4("data",K))},t$);B.onopen=K=>{clearTimeout(L),_(B)},B.onerror=K=>{clearTimeout(L);let te=`Error opening a data channel for handshaking: ${K.target?.toString()??"not specified"}`;Qd.error(te),this.metrics?.dialerEvents.increment({unknown_error:!0}),k(V4("data",te))}}),f="libp2p+webrtc+v1/"+TI(32),h=await l.createOffer(),d=RI(h,f);await l.setLocalDescription(d);let p=SI(e,f);await l.setRemoteDescription(p);let m=await u,g=this.components.peerId,y=this.generateNoisePrologue(l,a.code,e),w=dc({prologueBytes:y})(),E=_c({channel:m,direction:"inbound",...this.init.dataChannel??{}}),R={...E,sink:E.sink.bind(E),source:async function*(){for await(let _ of E.source)for(let k of _)yield k}()},x=new Yo({peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),v=vu?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(v,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":x.close().catch(_=>{Qd.error("error closing connection",_)}).finally(()=>{n.abort()});break;default:break}},{signal:i}),this.metrics?.dialerEvents.increment({peer_connection:!0});let I=new Qo({peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await w.secureInbound(g,R,o),await t.upgrader.upgradeOutbound(x,{skipProtection:!0,skipEncryption:!0,muxerFactory:I})}catch(u){throw l.close(),u}}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw xu("no local certificate");let i=_I(e);if(i==null)throw xu("no local fingerprint found");let s=i.trim().toLowerCase().replaceAll(":",""),o=Q(s,"hex"),a=DI.encode(o,t),c=Ig.decode(Yd(n)),l=Q("libp2p-webrtc-noise:");return Re([l,a,c])}};function CI(r){return e=>new Xd(e,r)}function PI(r){return e=>new Bd(e,r)}function kI(r){let e;try{e=ge("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function NI(r){return r.some(([e,t])=>e===ge("tls").code)}function on(r,e,t){let n=OI[ge(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${ge(r).name}`);let i=n(e,t);return r===ge("ip6").code?`[${i}]`:i}var OI={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://${on(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://${on(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`${on(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`${on(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=NI(e),n=kI(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=on(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 on(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return on(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=on(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=NI(e),n=kI(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=on(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=on(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`${on(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`${on(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`${on(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function LI(r,e){let n=oe(r).stringTuples(),i=n.pop();if(i===void 0)throw new Error("Unexpected end of multiaddr");let s=ge(i[0]),o=OI[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]===ge("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 BI=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 MI=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let i of n){try{await BI(r)}catch(s){if(s.message==="socket closed")break;throw s}if(r.readyState===r.CLOSING||r.readyState===r.CLOSED)break;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 VI=se(FI(),1);function KI(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var qI=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 VI.EventIterator(({push:o,stop:a,fail:c})=>{let l=f=>{let h=null;typeof f.data=="string"&&(h=Q(f.data)),KI(f.data)&&(h=new Uint8Array(f.data)),f.data instanceof Uint8Array&&(h=f.data),h!=null&&o(h)},u=f=>{c(f.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 KI(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 zI=(r,e)=>{e=e??{};let t=qI(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:MI(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 $I=WebSocket;var ZI=se(jI(),1),h$={http:"ws",https:"wss"},d$="ws",JI=(r,e)=>(0,ZI.relative)(r,e,h$,d$);function eA(r,e){let t=typeof window>"u"?"":window.location;e=e??{};let n=JI(r,t.toString()),i=new $I(n,e.websocket);return zI(i,e)}var nA=se(rA(),1),Ng=typeof window=="object"&&typeof document=="object"&&document.nodeType===9,Jd=(0,nA.default)(),e1=Ng&&!Jd,iA=Jd&&!Ng,sA=Jd&&Ng,oA=typeof globalThis.process<"u"&&typeof globalThis.process.release<"u"&&globalThis.process.release.name==="node"&&!Jd,t1=typeof importScripts=="function"&&typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,O5e=typeof globalThis.process<"u"&&typeof globalThis.process.env<"u"&&globalThis.process.env["NODE"+(()=>"_")()+"ENV"]==="test",aA=typeof navigator<"u"&&navigator.product==="ReactNative";function uA(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return yc.matches(t)||$o.matches(t)})}function fA(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return $o.matches(t)})}function hA(){throw new Error("WebSocket Servers can not be created in the browser!")}var r1=D("libp2p:websockets:socket");function dA(r,e,t){t=t??{};let n={async sink(i){t?.signal!=null&&(i=Qt(i,t.signal));try{await r.sink(i)}catch(s){s.type!=="aborted"&&r1.error(s)}},source:t.signal!=null?Qt(r.source,t.signal):r.source,remoteAddr:e,timeline:{open:Date.now()},async close(i={}){let s=Date.now();i.signal=i.signal??AbortSignal.timeout(500);let o=()=>{let{host:a,port:c}=n.remoteAddr.toOptions();r1("timeout closing stream to %s:%s after %dms, destroying it manually",a,c,Date.now()-s),this.abort(new b("Socket close timeout","ERR_SOCKET_CLOSE_TIMEOUT"))};i.signal.addEventListener("abort",o);try{await r.close()}catch(a){r1.error("error closing WebSocket gracefully",a),this.abort(a)}finally{i.signal.removeEventListener("abort",o),n.timeline.close=Date.now()}},abort(i){let{host:s,port:o}=n.remoteAddr.toOptions();r1("timeout closing stream to %s:%s due to error",s,o,i),r.destroy(),n.timeline.close=Date.now()}};return r.socket.addEventListener("close",()=>{n.timeline.close==null&&(n.timeline.close=Date.now())},{once:!0}),n}var Gs=D("libp2p:websockets"),Og=class{init;constructor(e){this.init=e}[Symbol.toStringTag]="@libp2p/websockets";[gi]=!0;async dial(e,t){Gs("dialing %s",e),t=t??{};let n=await this._connect(e,t),i=dA(n,e);Gs("new outbound connection %s",i.remoteAddr);let s=await t.upgrader.upgradeOutbound(i);return Gs("outbound connection %s upgraded",i.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new Pn;let n=e.toOptions();Gs("dialing %s:%s",n.host,n.port);let i=xe(),s=eA(LI(e),this.init);if(s.socket.addEventListener("error",()=>{let c=new b(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");Gs.error("connection error:",c),i.reject(c)}),t.signal==null)return await Promise.race([s.connected(),i.promise]),Gs("connected %s",e),s;let o,a=new Promise((c,l)=>{if(o=()=>{l(new Pn),s.close().catch(u=>{Gs.error("error closing raw socket",u)})},t?.signal?.aborted===!0){o();return}t?.signal?.addEventListener("abort",o)});try{await Promise.race([a,i.promise,s.connected()])}finally{o!=null&&t?.signal?.removeEventListener("abort",o)}return Gs("connected %s",e),s}createListener(e){return hA({...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):e1||t1?fA(e):uA(e)}};function pA(r={}){return()=>new Og(r)}var ku=D("libp2p:webtransport:stream");async function Lg(r,e,t,n,i){let s=r.writable.getWriter(),o=r.readable.getReader();await s.ready;function a(){let h=n.findIndex(d=>d===f);h!==-1&&(n.splice(h,1),f.timeline.close=Date.now(),i?.(f))}let c=!1,l=!1;(async function(){let h=await s.closed.catch(d=>d);if(h!=null){let d=h.message;d.includes("aborted by the remote server")||d.includes("STOP_SENDING")||ku.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${h.message}`)}c=!0,c&&l&&a()})().catch(()=>{ku.error("WebTransport failed to cleanup closed stream")}),async function(){let h=await o.closed.catch(d=>d);h!=null&&ku.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${h.message}`),l=!0,c&&l&&a()}().catch(()=>{ku.error("WebTransport failed to cleanup closed stream")});let u=!1,f={id:e,status:"open",writeStatus:"ready",readStatus:"ready",abort(h){c||(s.abort(h).catch(d=>{ku.error("could not abort stream",d)}),c=!0),l=!0,this.status="aborted",this.writeStatus="closed",this.readStatus="closed",this.timeline.reset=this.timeline.close=this.timeline.closeRead=this.timeline.closeWrite=Date.now(),a()},async close(h){this.status="closing",await Promise.all([f.closeRead(h),f.closeWrite(h)]),a(),this.status="closed",this.timeline.close=Date.now()},async closeRead(h){if(!l){this.readStatus="closing";try{await o.cancel()}catch(d){d.toString().includes("RESET_STREAM")===!0&&(c=!0)}this.timeline.closeRead=Date.now(),this.readStatus="closed",l=!0}c&&a()},async closeWrite(h){if(!c){c=!0,this.writeStatus="closing";try{await s.close()}catch(d){d.toString().includes("RESET_STREAM")===!0&&(l=!0)}this.timeline.closeWrite=Date.now(),this.writeStatus="closed"}l&&a()},direction:t,timeline:{open:Date.now()},metadata:{},source:async function*(){for(;;){let h=await o.read();if(h.done){l=!0,c&&a();return}yield new ve(h.value)}}(),sink:async function(h){if(u)throw new Error("sink already called on stream");u=!0;try{this.writeStatus="writing";for await(let d of h)if(d instanceof Uint8Array)await s.write(d);else for(let p of d)await s.write(p);this.writeStatus="done"}finally{this.timeline.closeWrite=Date.now(),this.writeStatus="closed",await f.closeWrite()}}};return f}function Bg(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}function mA(r,e){return e.filter(n=>!!r.find(i=>pe(n,i))).length===e.length}var y$=Object.values(ln).map(r=>r.decoder).reduce((r,e)=>r.or(e));function b$(r){return Dn.decode(y$.decode(r))}function gA(r){if(!Jf.matches(r))throw new b("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");let e=r.stringTuples(),t=e.filter(([o,a])=>o===ge("certhash").code).map(([o,a])=>b$(a??"")),n=e.filter(([o,a])=>o===ge("p2p").code).map(([o,a])=>ce(a??""))[0],i=r.toOptions(),s=i.host;return i.family===6&&s?.includes(":")&&(s=`[${s}]`),{url:`https://${s}:${i.port}`,certhashes:t,remotePeer:n}}var an=D("libp2p:webtransport"),Mg=class{components;config;metrics;constructor(e,t={}){this.components=e,this.config={maxInboundStreams:t.maxInboundStreams??1e3},e.metrics!=null&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webtransport_dialer_events_total",{label:"event",help:"Total count of WebTransport dialer events by type"})})}[Symbol.toStringTag]="@libp2p/webtransport";[gi]=!0;async dial(e,t){t?.signal?.throwIfAborted(),an("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}=gA(e);if(o==null)throw new Error("Need a target peerid");if(s.length===0)throw new Error("Expected multiaddr to contain certhashes");let a,c,l=()=>{},u=!1,f=!1,h=!1;try{this.metrics?.dialerEvents.increment({pending:!0});let d=new WebTransport(`${i}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(p=>({algorithm:"sha-256",value:p.digest}))});if(l=p=>{if(!u)try{this.metrics?.dialerEvents.increment({[p]:!0}),d.close()}catch(m){an.error("error closing wt session",m)}finally{c!=null&&(c.timeline.close=Date.now()),u=!0}},a=()=>{l(f?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",a,{once:!0}),await Promise.race([d.closed,d.ready]),f=!0,this.metrics?.dialerEvents.increment({ready:!0}),d.closed.catch(p=>{an.error("error on remote wt session close",p)}).finally(()=>{l("remote_close")}),!await this.authenticateWebTransport(d,n,o,s))throw new Error("Failed to authenticate webtransport");return this.metrics?.dialerEvents.increment({open:!0}),c={close:async()=>{an("Closing webtransport"),l("close")},abort:p=>{an("aborting webtransport due to passed err",p),l("abort")},remoteAddr:e,timeline:{open:Date.now()},...Bg()},h=!0,await t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(d),skipProtection:!0})}catch(d){throw an.error("caught wt session err",d),l(h?"upgrade_error":f?"noise_error":"ready_error"),d}finally{a!=null&&t.signal?.removeEventListener("abort",a)}}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 f=await a.read();if(f.value!=null&&(yield f.value),f.done)break}}(),sink:async function(f){for await(let h of f)await o.write(h)}},l=dc()(),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch(f=>{an.error(`Failed to close authentication stream writer: ${f.message}`)}),a.cancel().catch(f=>{an.error(`Failed to close authentication stream reader: ${f.message}`)}),!mA(u?.webtransportCerthashes??[],i.map(f=>f.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=[];return async function(){let a=e.incomingBidirectionalStreams.getReader();for(;;){let{done:c,value:l}=await a.read();if(c)break;if(s.length>=n.maxInboundStreams)l.writable.close().catch(u=>{an.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)}),l.readable.cancel().catch(u=>{an.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)});else{let u=await Lg(l,String(t++),"inbound",s,i?.onStreamEnd);s.push(u),i?.onIncomingStream?.(u)}}}().catch(()=>{an.error("WebTransport failed to receive incoming stream")}),{protocol:"webtransport",streams:s,newStream:async a=>{let c=await e.createBidirectionalStream(),l=await Lg(c,String(t++),i?.direction??"outbound",s,i?.onStreamEnd);return s.push(l),l},close:async a=>{an("Closing webtransport muxer"),await Promise.all(s.map(async c=>c.close(a)))},abort:a=>{an("Aborting webtransport muxer with err:",a);for(let c of s)c.abort(a)},...Bg()}}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(Jf.exactMatch)}};function yA(r={}){return e=>new Mg(e,r)}var Kr=se(ia(),1);var IA=se(bA(),1);var wA="ERR_IPNS_EXPIRED_RECORD",n1="ERR_UNRECOGNIZED_VALIDITY";var Ji="ERR_SIGNATURE_VERIFICATION",EA="ERR_UNRECOGNIZED_FORMAT";var Fg="ERR_UNDEFINED_PARAMETER",xA="ERR_INVALID_RECORD_DATA",vA="ERR_INVALID_VALUE",_A="ERR_INVALID_EMBEDDED_KEY";var SA="ERR_RECORD_TOO_LARGE";var es;(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=()=>ut(t)}(e=r.ValidityType||(r.ValidityType={}));let n;r.codec=()=>(n==null&&(n=fe((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.value!=null&&(s.uint32(10),s.bytes(i.value)),i.signatureV1!=null&&(s.uint32(18),s.bytes(i.signatureV1)),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.signatureV1=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=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(es||(es={}));var Kg=D("ipns:utils"),w$=Q("/ipns/"),E$=114;function x$(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].padEnd(6,"0").slice(0,3),10);return new Date(Date.UTC(n,i,s,o,a,c,l))}var AA=async(r,e)=>{if(e==null||r==null){let n=new Error("one or more of the provided parameters are not defined");throw Kg.error(n),(0,Kr.default)(n,Fg)}let t;if(e.pubKey!=null){try{t=Lr(e.pubKey)}catch(i){throw Kg.error(i),i}if(!(await hr(e.pubKey)).equals(r))throw(0,Kr.default)(new Error("Embedded public key did not match PeerID"),_A)}else r.publicKey!=null&&(t=Lr(r.publicKey));if(t!=null)return t;throw(0,Kr.default)(new Error("no public key is available"),Fg)};var TA=r=>{let e=Q("ipns-signature:");return Re([e,r])};function Nu(r){let e=es.decode(r);if(e.sequence!=null&&(e.sequence=BigInt(e.sequence)),e.ttl!=null&&(e.ttl=BigInt(e.ttl)),e.signatureV2==null||e.data==null)throw(0,Kr.default)(new Error("missing data or signatureV2"),Ji);let t=CA(e.data),n=v$(t.Value),i;try{i=IA.default.fromDate(x$(H(t.Validity)))}catch{throw Kg.error("unrecognized validity format (not an rfc3339 format)"),(0,Kr.default)(new Error("unrecognized validity format (not an rfc3339 format)"),EA)}if(e.value!=null&&e.signatureV1!=null)return _$(e),{value:n,validityType:es.ValidityType.EOL,validity:i,sequence:t.Sequence,ttl:t.TTL,pubKey:e.pubKey,signatureV1:e.signatureV1,signatureV2:e.signatureV2,data:e.data};if(e.signatureV2!=null)return{value:n,validityType:es.ValidityType.EOL,validity:i,sequence:t.Sequence,ttl:t.TTL,pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data};throw new Error("invalid record: does not include signatureV1 or signatureV2")}var DA=r=>dt(r.slice(w$.length));var CA=r=>{let e=dn(r);if(e.ValidityType===0)e.ValidityType=es.ValidityType.EOL;else throw(0,Kr.default)(new Error("Unknown validity type"),n1);return Number.isInteger(e.Sequence)&&(e.Sequence=BigInt(e.Sequence)),Number.isInteger(e.TTL)&&(e.TTL=BigInt(e.TTL)),e},v$=r=>{if(r!=null){if(Fa(r))return`/ipns/${r.toCID().toString(ns)}`;if(r instanceof Uint8Array){let n=H(r);n.startsWith("/")&&(r=n)}let e=r.toString().trim();if(e.startsWith("/")&&e.length>1)return e;let t=ye.asCID(r);if(t!=null)return t.code===E$?`/ipns/${t.toString(ns)}`:`/ipfs/${t.toV1().toString()}`;try{return r instanceof Uint8Array?`/ipfs/${ye.decode(r).toV1().toString()}`:`/ipfs/${ye.parse(e).toV1().toString()}`}catch{}}throw(0,Kr.default)(new Error("Value must be a valid content path starting with /"),vA)},_$=r=>{if(r.data==null)throw(0,Kr.default)(new Error("Record data is missing"),xA);let e=CA(r.data);if(!pe(e.Value,r.value??new Uint8Array(0)))throw(0,Kr.default)(new Error('Field "value" did not match between protobuf and CBOR'),Ji);if(!pe(e.Validity,r.validity??new Uint8Array(0)))throw(0,Kr.default)(new Error('Field "validity" did not match between protobuf and CBOR'),Ji);if(e.ValidityType!==r.validityType)throw(0,Kr.default)(new Error('Field "validityType" did not match between protobuf and CBOR'),Ji);if(e.Sequence!==r.sequence)throw(0,Kr.default)(new Error('Field "sequence" did not match between protobuf and CBOR'),Ji);if(e.TTL!==r.ttl)throw(0,Kr.default)(new Error('Field "ttl" did not match between protobuf and CBOR'),Ji)};function PA(r,e){let t=e.map((n,i)=>({record:Nu(n),index:i}));return t.sort((n,i)=>{let s=n.record.sequence,o=i.record.sequence;if(s>o)return-1;if(s<o)return 1;let a=n.record.validity.toDate(),c=i.record.validity.toDate();return a.getTime()>c.getTime()?-1:a.getTime()<c.getTime()?1:0}),t[0].index}var Ou=se(ia(),1);var i1=D("ipns:validator"),S$=1024*10,R$=async(r,e)=>{let t=Nu(e),n;try{let i=TA(t.data);n=await r.verify(i,t.signatureV2)}catch{n=!1}if(!n)throw i1.error("record signature verification failed"),(0,Ou.default)(new Error("record signature verification failed"),Ji);if(t.validityType===es.ValidityType.EOL){if(t.validity.toDate().getTime()<Date.now())throw i1.error("record has expired"),(0,Ou.default)(new Error("record has expired"),wA)}else if(t.validityType!=null)throw i1.error("unrecognized validity type"),(0,Ou.default)(new Error("unrecognized validity type"),n1);i1("ipns record for %b is valid",t.value)};async function kA(r,e){if(e.byteLength>S$)throw(0,Ou.default)(new Error("record too large"),SA);let t=DA(r),n=Nu(e),i=await AA(t,n);await R$(i,e)}var qg=se(kr(),1);var NA="libp2p",OA="autonat",LA="1.0.0";var De;(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=()=>ut(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=()=>ut(i)}(n=r.ResponseStatus||(r.ResponseStatus={}));let s;(function(l){let u;l.codec=()=>(u==null&&(u=fe((f,h,d={})=>{if(d.lengthDelimited!==!1&&h.fork(),f.id!=null&&(h.uint32(10),h.bytes(f.id)),f.addrs!=null)for(let p of f.addrs)h.uint32(18),h.bytes(p);d.lengthDelimited!==!1&&h.ldelim()},(f,h)=>{let d={addrs:[]},p=h==null?f.len:f.pos+h;for(;f.pos<p;){let m=f.uint32();switch(m>>>3){case 1:d.id=f.bytes();break;case 2:d.addrs.push(f.bytes());break;default:f.skipType(m&7);break}}return d})),u),l.encode=f=>ue(f,l.codec()),l.decode=f=>le(f,l.codec())})(s=r.PeerInfo||(r.PeerInfo={}));let o;(function(l){let u;l.codec=()=>(u==null&&(u=fe((f,h,d={})=>{d.lengthDelimited!==!1&&h.fork(),f.peer!=null&&(h.uint32(10),r.PeerInfo.codec().encode(f.peer,h)),d.lengthDelimited!==!1&&h.ldelim()},(f,h)=>{let d={},p=h==null?f.len:f.pos+h;for(;f.pos<p;){let m=f.uint32();switch(m>>>3){case 1:d.peer=r.PeerInfo.codec().decode(f,f.uint32());break;default:f.skipType(m&7);break}}return d})),u),l.encode=f=>ue(f,l.codec()),l.decode=f=>le(f,l.codec())})(o=r.Dial||(r.Dial={}));let a;(function(l){let u;l.codec=()=>(u==null&&(u=fe((f,h,d={})=>{d.lengthDelimited!==!1&&h.fork(),f.status!=null&&(h.uint32(8),r.ResponseStatus.codec().encode(f.status,h)),f.statusText!=null&&(h.uint32(18),h.string(f.statusText)),f.addr!=null&&(h.uint32(26),h.bytes(f.addr)),d.lengthDelimited!==!1&&h.ldelim()},(f,h)=>{let d={},p=h==null?f.len:f.pos+h;for(;f.pos<p;){let m=f.uint32();switch(m>>>3){case 1:d.status=r.ResponseStatus.codec().decode(f);break;case 2:d.statusText=f.string();break;case 3:d.addr=f.bytes();break;default:f.skipType(m&7);break}}return d})),u),l.encode=f=>ue(f,l.codec()),l.decode=f=>le(f,l.codec())})(a=r.DialResponse||(r.DialResponse={}));let c;r.codec=()=>(c==null&&(c=fe((l,u,f={})=>{f.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)),f.lengthDelimited!==!1&&u.ldelim()},(l,u)=>{let f={},h=u==null?l.len:l.pos+u;for(;l.pos<h;){let d=l.uint32();switch(d>>>3){case 1:f.type=r.MessageType.codec().decode(l);break;case 2:f.dial=r.Dial.codec().decode(l,l.uint32());break;case 3:f.dialResponse=r.DialResponse.codec().decode(l,l.uint32());break;default:l.skipType(d&7);break}}return f})),c),r.encode=l=>ue(l,r.codec()),r.decode=l=>le(l,r.codec())})(De||(De={}));var qe=D("libp2p:autonat"),Vg=4,zg=class{components;startupDelay;refreshInterval;protocol;timeout;maxInboundStreams;maxOutboundStreams;verifyAddressTimeout;started;constructor(e,t){this.components=e,this.started=!1,this.protocol=`/${t.protocolPrefix??NA}/${OA}/${LA}`,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=>{qe.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=AbortSignal.timeout(this.timeout),n=()=>{e.stream.abort(new b("handleIncomingAutonatStream timeout",$.ERR_TIMEOUT))};t.addEventListener("abort",n,{once:!0});try{(0,qg.setMaxListeners)?.(1/0,t)}catch{}let i=this.components.addressManager.getAddresses().map(s=>s.toOptions().host);try{let s=this;await Te(e.stream,o=>Et(o),async function*(o){let a=await Gn(o);if(a==null){qe("no message received"),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"No message was sent"}});return}let c;try{c=De.decode(a)}catch(m){qe.error("could not decode message",m),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"Could not decode message"}});return}let l=c.dial;if(l==null){qe.error("dial was missing from message"),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"No Dial message found in message"}});return}let u,f=l.peer;if(f==null||f.id==null){qe.error("PeerId missing from message"),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"missing peer info"}});return}try{u=dt(f.id)}catch(m){qe.error("invalid PeerId",m),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"bad peer id"}});return}if(qe("incoming request from %p",u),!e.connection.remotePeer.equals(u)){qe("target peer %p did not equal sending peer %p",u,e.connection.remotePeer),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"peer id mismatch"}});return}let h=f.addrs.map(m=>oe(m)).filter(m=>{let g=m.toOptions().host===e.connection.remoteAddr.toOptions().host;return qe.trace("request to dial %a was sent from %a is same host %s",m,e.connection.remoteAddr,g),g}).filter(m=>{let g=m.toOptions().host,y=!(Br(g)??!1);return qe.trace("host %s was public %s",g,y),y}).filter(m=>{let g=m.toOptions().host,y=!i.includes(g);return qe.trace("host %s was not our host %s",g,y),y}).filter(m=>{let g=!!s.components.transportManager.transportForMultiaddr(m);return qe.trace("transport for %a is supported %s",m,g),g}).map(m=>(m.getPeerId()==null&&(m=m.encapsulate(`/p2p/${u.toString()}`)),m));if(h.length===0){qe("no valid multiaddrs for %p in message",u),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_DIAL_REFUSED,statusText:"no dialable addresses"}});return}qe("dial multiaddrs %s for peer %p",h.map(m=>m.toString()).join(", "),u);let d="",p=h[0];for await(let m of h){let g;p=m;try{if(g=await s.components.connectionManager.openConnection(m,{signal:t}),!g.remoteAddr.equals(m))throw qe.error("tried to dial %a but dialed %a",m,g.remoteAddr),new Error("Unexpected remote address");qe("Success %p",u),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.OK,addr:g.remoteAddr.decapsulateCode(ge("p2p").code).bytes}});return}catch(y){qe("could not dial %p",u,y),d=y.message}finally{g!=null&&await g.close()}}yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_DIAL_ERROR,statusText:d,addr:p.bytes}})},o=>_t(o),e.stream)}catch(s){qe.error("error handling incoming autonat stream",s)}finally{t.removeEventListener("abort",n)}}_verifyExternalAddresses(){this.verifyExternalAddresses().catch(e=>{qe.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!(Br(o.host)??!1)});if(t.length===0){qe("no public addresses found, not requesting verification"),this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval);return}let n=AbortSignal.timeout(this.timeout);try{(0,qg.setMaxListeners)?.(1/0,n)}catch{}let i=this;try{qe("verify multiaddrs %s",t.map(f=>f.toString()).join(", "));let s=De.encode({type:De.MessageType.DIAL,dial:{peer:{id:this.components.peerId.toBytes(),addrs:t.map(f=>f.bytes)}}}),a=(await kf()).toBytes(),c={},l=[],u=async f=>{let h=()=>{};try{qe("asking %p to verify multiaddr",f.id);let d=await i.components.connectionManager.openConnection(f.id,{signal:n}),p=await d.newStream(this.protocol,{signal:n});h=()=>{p.abort(new b("verifyAddress timeout",$.ERR_TIMEOUT))},n.addEventListener("abort",h,{once:!0});let m=await Te([s],y=>_t(y),p,y=>Et(y),async y=>Gn(y));if(m==null){qe("no response received from %p",d.remotePeer);return}let g=De.decode(m);if(g.type!==De.MessageType.DIAL_RESPONSE||g.dialResponse==null){qe("invalid autonat response from %p",d.remotePeer);return}if(g.dialResponse.status===De.ResponseStatus.OK){let y=d.remoteAddr.toOptions(),w;if(y.family===4)w=y.host.split(".")[0];else if(y.family===6)w=y.host.split(":")[0];else{qe('remote address "%s" was not IP4 or IP6?',y.host);return}if(l.includes(w)){qe("already have response from network segment %d - %s",w,y.host);return}l.push(w)}return g.dialResponse}catch(d){qe.error("error asking remote to verify multiaddr",d)}finally{n.removeEventListener("abort",h)}};for await(let f of Wo(Cn(this.components.peerRouting.getClosestPeers(a,{signal:n}),h=>async()=>u(h)),{concurrency:Vg}))try{if(f==null)continue;let h=f.addr==null?t[0]:oe(f.addr);if(qe("autonat response for %a is %s",h,f.status),f.status===De.ResponseStatus.E_BAD_REQUEST||f.status===De.ResponseStatus.E_DIAL_REFUSED||f.addr==null&&t.length>1)continue;if(!t.some(p=>p.equals(h))){qe("peer reported %a as %s but it was not in our observed address list",h,f.status);continue}let d=h.toString();if(c[d]==null&&(c[d]={success:0,failure:0}),f.status===De.ResponseStatus.OK?c[d].success++:f.status===De.ResponseStatus.E_DIAL_ERROR&&c[d].failure++,c[d].success===Vg){qe("%a is externally dialable",h),e.confirmObservedAddr(h);return}if(c[d].failure===Vg){qe("%a is not externally dialable",h),e.removeObservedAddr(h);return}}catch(h){qe.error("could not verify external address",h)}}finally{this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval)}}};function BA(r={}){return e=>new zg(e,r)}var B$=se(kr(),1);var $g="/libp2p/relay";var MA="circuit-relay-relay";var P$=BigInt(131072),Ys="/libp2p/circuit/relay/0.2.0/hop",s1="/libp2p/circuit/relay/0.2.0/stop",k$=30*1e3,N$=30*1e3;var ts;(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=()=>ut(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=fe((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),Oc.codec().encode(i.peer,s)),i.reservation!=null&&(s.uint32(26),o1.codec().encode(i.reservation,s)),i.limit!=null&&(s.uint32(34),Lc.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(40),Ft.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=Oc.codec().decode(i,i.uint32());break;case 3:o.reservation=o1.codec().decode(i,i.uint32());break;case 4:o.limit=Lc.codec().decode(i,i.uint32());break;case 5:o.status=Ft.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(ts||(ts={}));var ti;(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=()=>ut(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=fe((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),Oc.codec().encode(i.peer,s)),i.limit!=null&&(s.uint32(26),Lc.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(32),Ft.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=Oc.codec().decode(i,i.uint32());break;case 3:o.limit=Lc.codec().decode(i,i.uint32());break;case 4:o.status=Ft.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(ti||(ti={}));var Oc;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Oc||(Oc={}));var o1;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(o1||(o1={}));var Lc;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Lc||(Lc={}));var Ft;(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"})(Ft||(Ft={}));var Hg;(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"})(Hg||(Hg={}));(function(r){r.codec=()=>ut(Hg)})(Ft||(Ft={}));var Wg;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Wg||(Wg={}));var w7e=D("libp2p:circuit-relay:utils");async function Gg(r){let e=new TextEncoder().encode(r),t=await Oe.digest(e);return ye.createV0(t)}function Yg(r){let e=r*BigInt(1e3),t=new Date().getTime();return Number(e-BigInt(t))}var L$=se(qA(),1);var L7e=D("libp2p:circuit-relay:advert-service");var h9e=D("libp2p:circuit-relay:server");var M$=D("libp2p:stream:converter");function Qg(r){let{stream:e,remoteAddr:t}=r,{sink:n,source:i}=e,s=async function*(){for await(let c of i)c instanceof Uint8Array?yield c:yield*c}(),o={async sink(c){try{await n(c),a()}catch(l){l.type!=="aborted"&&M$(l)}},source:s,remoteAddr:t,timeline:{open:Date.now(),close:void 0},async close(c){a(),await e.close(c)},abort(c){a(),e.abort(c)}};function a(){o.timeline.close==null&&(o.timeline.close=Date.now())}return o}var Qs=D("libp2p:circuit-relay:discover-relays"),a1=class extends Fe{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(Ys,{onConnect:e=>{this.safeDispatchEvent("relay:discover",{detail:e})}}),this.discover().catch(e=>{Qs.error("error listening on relays",e)}),this.started=!0}stop(){this.topologyId!=null&&this.registrar.unregister(this.topologyId),this.started=!1}async discover(){Qs("searching peer store for relays");let e=await this.peerStore.all({filters:[t=>t.protocols.includes(Ys)],orders:[()=>Math.random()<.5?1:-1]});for(let t of e)Qs("found relay peer %p in content peer store",t.id),this.safeDispatchEvent("relay:discover",{detail:t.id});Qs("found %d relay peers in peer store",e.length);try{Qs("searching content routing for relays");let t=await Gg($g),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}),Qs("found relay peer %p in content routing",s),this.safeDispatchEvent("relay:discover",{detail:s})}Qs("found %d relay peers in content routing",n)}catch(t){Qs.error("failed when finding relays on the network",t)}}};var c1=D("libp2p:circuit-relay:transport:listener"),Xg=class extends Fe{connectionManager;relayStore;listeningAddrs;constructor(e){super(),this.connectionManager=e.connectionManager,this.relayStore=e.relayStore,this.listeningAddrs=new dr,this.relayStore.addEventListener("relay:removed",this._onRemoveRelayPeer)}_onRemoveRelayPeer=e=>{this.#e(e.detail)};async listen(e){c1("listen on %a",e);let t=e.getPeerId(),n;if(t!=null){let s=ce(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=oe(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)){c1("already listening on relay %p",n.remotePeer);return}this.listeningAddrs.set(n.remotePeer,i.addrs.map(s=>oe(s).encapsulate("/p2p-circuit"))),this.safeDispatchEvent("listening",{})}getAddrs(){return[...this.listeningAddrs.values()].flat()}async close(){}#e(e){let t=this.listeningAddrs.has(e);c1("relay peer removed %p - had reservation",e,t),this.listeningAddrs.delete(e),t&&(c1.trace("removing relay event listener for peer %p",e),this.relayStore.removeEventListener("relay:removed",this._onRemoveRelayPeer),this.safeDispatchEvent("close",{}))}};function $A(r){return new Xg(r)}var Tr=D("libp2p:circuit-relay:transport:reservation-store"),F$=60*1e3*10,K$=60*1e3*5,V$=30*1e3,l1=class extends Fe{peerId;connectionManager;transportManager;peerStore;events;reserveQueue;reservations;maxDiscoveredRelays;maxReservationQueueLength;reservationCompletionTimeout;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 dr,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.reservationCompletionTimeout=t?.reservationCompletionTimeout??1e4,this.started=!1,this.reserveQueue=new ec({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.reserveQueue.clear(),this.reservations.forEach(({timeout:e})=>{clearTimeout(e)}),this.reservations.clear(),this.started=!1}async addRelay(e,t){if(this.peerId.equals(e)){Tr("not trying to use self as relay");return}if(this.reserveQueue.size>this.maxReservationQueueLength){Tr("not adding relay as the queue is full");return}if(this.reserveQueue.hasJob(e)){Tr("relay peer is already in the reservation queue");return}Tr("add relay %p",e),await this.reserveQueue.add(async()=>{try{let n=this.reservations.get(e);if(n!=null){if(Yg(n.reservation.expire)>F$){Tr("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((u,f)=>(f.type==="discovered"&&u++,u),0)>=this.maxDiscoveredRelays){Tr("already have enough discovered relays");return}let i=AbortSignal.timeout(this.reservationCompletionTimeout),s=await this.connectionManager.openConnection(e,{signal:i});if(s.remoteAddr.protoNames().includes("p2p-circuit")){Tr("not creating reservation over relayed connection");return}let o=await this.#e(s,{signal:i});Tr("created reservation on relay peer %p",e);let a=Yg(o.expire),c=Math.min(Math.max(a-K$,V$),Math.pow(2,31)-1),l=setTimeout(()=>{this.addRelay(e,t).catch(u=>{Tr.error("could not refresh reservation to relay %p",e,u)})},c);this.reservations.set(e,{timeout:l,reservation:o,type:t}),await this.peerStore.merge(e,{tags:{[MA]:{value:1,ttl:a}}}),await this.transportManager.listen([oe(`/p2p/${e.toString()}/p2p-circuit`)])}catch(n){Tr.error("could not reserve slot on %p",e,n);let i=this.reservations.get(e);i!=null&&clearTimeout(i.timeout),this.reservations.delete(e)}},{peerId:e})}hasReservation(e){return this.reservations.has(e)}getReservation(e){return this.reservations.get(e)?.reservation}async#e(e,t){t.signal?.throwIfAborted(),Tr("requesting reservation from %p",e.remotePeer);let n=await e.newStream(Ys,t),s=Jt(n).pb(ts);await s.write({type:ts.Type.RESERVE},t);let o;try{o=await s.read(t)}catch(c){throw Tr.error("error parsing reserve message response from %p because",e.remotePeer,c),c}finally{await n.close()}if(o.status===Ft.OK&&o.reservation!=null)return o.reservation;let a=`reservation failed with status ${o.status??"undefined"}`;throw Tr.error(a),new Error(a)}#t(e){let t=this.reservations.get(e);t!=null&&(Tr("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&&(Tr("not enough relays %d/%d",this.reservations.size,this.maxDiscoveredRelays),this.safeDispatchEvent("relay:not-enough-relays",{})))}};var gr=D("libp2p:circuit-relay:transport"),q$=r=>{if(r.peer==null)return!1;try{r.peer.addrs.forEach(oe)}catch{return!1}return!0},jg={maxInboundStopStreams:Ps,maxOutboundStopStreams:Ps,stopTimeout:3e4},Zg=class{discovery;registrar;peerStore;connectionManager;peerId;upgrader;addressManager;connectionGater;reservationStore;maxInboundStopStreams;maxOutboundStopStreams;stopTimeout;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??jg.maxInboundStopStreams,this.maxOutboundStopStreams=t.maxOutboundStopStreams??jg.maxOutboundStopStreams,this.stopTimeout=t.stopTimeout??jg.stopTimeout,t.discoverRelays!=null&&t.discoverRelays>0&&(this.discovery=new a1(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 l1(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(s1,e=>{this.onStop(e).catch(t=>{gr.error("error while handling STOP protocol",t),e.stream.abort(t)})},{maxInboundStreams:this.maxInboundStopStreams,maxOutboundStreams:this.maxOutboundStopStreams,runOnTransientConnection:!0}),this.started=!0}async stop(){this.discovery?.stop(),await this.reservationStore.stop(),await this.registrar.unhandle(s1),this.started=!1}[gi]=!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,$.ERR_RELAYED_DIAL)}let n=e.toString().split("/p2p-circuit"),i=oe(n[0]),s=oe(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,$.ERR_RELAYED_DIAL)}let c=ce(o),l=ce(a),u=!1,h=this.connectionManager.getConnections(c)[0];h==null&&(await this.peerStore.merge(c,{multiaddrs:[i]}),h=await this.connectionManager.openConnection(c,t),u=!0);let d;try{return d=await h.newStream([Ys]),await this.connectV2({stream:d,connection:h,destinationPeer:l,destinationAddr:s,relayAddr:i,ma:e,disconnectOnFailure:u})}catch(p){throw gr.error("circuit relay dial to destination %p via relay %p failed",l,c,p),d?.abort(p),u&&await h.close(),p}}async connectV2({stream:e,connection:t,destinationPeer:n,destinationAddr:i,relayAddr:s,ma:o,disconnectOnFailure:a}){try{let c=Jt(e),l=c.pb(ts);await l.write({type:ts.Type.CONNECT,peer:{id:n.toBytes(),addrs:[oe(i).bytes]}});let u=await l.read();if(u.status!==Ft.OK)throw new b(`failed to connect via relay with status ${u?.status?.toString()??"undefined"}`,$.ERR_HOP_REQUEST_FAILED);let f=Qg({stream:c.unwrap(),remoteAddr:o,localAddr:s.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`)});return gr("new outbound transient connection %a",f.remoteAddr),await this.upgrader.upgradeOutbound(f,{transient:!0})}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 $A({connectionManager:this.connectionManager,relayStore:this.reservationStore})}filter(e){return e=Array.isArray(e)?e:[e],e.filter(t=>Zn.matches(t))}async onStop({connection:e,stream:t}){let n=AbortSignal.timeout(this.stopTimeout),i=Jt(t).pb(ti),s=await i.read({signal:n});if(gr("new circuit relay v2 stop stream from %p with type %s",e.remotePeer,s.type),s?.type===void 0){gr.error("type was missing from circuit v2 stop protocol request from %s",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.MALFORMED_MESSAGE},{signal:n}),await t.close();return}if(s.type!==ti.Type.CONNECT){gr.error("invalid stop connect request via peer %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.UNEXPECTED_MESSAGE},{signal:n}),await t.close();return}if(!q$(s)){gr.error("invalid stop connect request via peer %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.MALFORMED_MESSAGE},{signal:n}),await t.close();return}let o=dt(s.peer.id);if(await this.connectionGater.denyInboundRelayedConnection?.(e.remotePeer,o)===!0){gr.error("connection gater denied inbound relayed connection from %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.PERMISSION_DENIED},{signal:n}),await t.close();return}gr.trace("sending success response to %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.OK},{signal:n});let a=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${o.toString()}`),c=this.addressManager.getAddresses()[0],l=Qg({stream:i.unwrap().unwrap(),remoteAddr:a,localAddr:c});gr("new inbound transient connection %a",l.remoteAddr),await this.upgrader.upgradeInbound(l,{transient:!0}),gr("%s connection %a upgraded","inbound",l.remoteAddr)}};function Jg(r={}){return e=>new Zg(e,r)}var HA=()=>{let r=new Error("Delay aborted");return r.name="AbortError",r},z$=new WeakMap;function $$({clearTimeout:r,setTimeout:e}={}){return(t,{value:n,signal:i}={})=>{if(i?.aborted)return Promise.reject(HA());let s,o,a,c=r??clearTimeout,l=()=>{c(s),a(HA())},u=()=>{i&&i.removeEventListener("abort",l)},f=new Promise((h,d)=>{o=()=>{u(),h(n)},a=d,s=(e??setTimeout)(o,t)});return i&&i.addEventListener("abort",l,{once:!0}),z$.set(f,()=>{c(s),s=null,o()}),f}}var H$=$$(),WA=H$;var ri;(function(r){let e;(function(i){i.UNUSED="UNUSED",i.CONNECT="CONNECT",i.SYNC="SYNC"})(e=r.Type||(r.Type={}));let t;(function(i){i[i.UNUSED=0]="UNUSED",i[i.CONNECT=100]="CONNECT",i[i.SYNC=300]="SYNC"})(t||(t={})),function(i){i.codec=()=>ut(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=fe((i,s,o={})=>{if(o.lengthDelimited!==!1&&s.fork(),i.type!=null&&(s.uint32(8),r.Type.codec().encode(i.type,s)),i.observedAddresses!=null)for(let a of i.observedAddresses)s.uint32(18),s.bytes(a);o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={observedAddresses:[]},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.observedAddresses.push(i.bytes());break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(ri||(ri={}));var pt=D("libp2p:dcutr"),GA=1024*4,YA=100,u1={timeout:5e3,retries:3,maxInboundStreams:1,maxOutboundStreams:1},f1=class{started;timeout;retries;maxInboundStreams;maxOutboundStreams;peerStore;registrar;connectionManager;addressManager;transportManager;topologyId;constructor(e,t){this.started=!1,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.timeout=t.timeout??u1.timeout,this.retries=t.retries??u1.retries,this.maxInboundStreams=t.maxInboundStreams??u1.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??u1.maxOutboundStreams}isStarted(){return this.started}async start(){this.started||(this.topologyId=await this.registrar.register(Lu,{onConnect:(e,t)=>{t.transient&&t.direction==="inbound"&&this.upgradeInbound(t).catch(n=>{pt.error("error during outgoing DCUtR attempt",n)})}}),await this.registrar.handle(Lu,e=>{this.handleIncomingUpgrade(e.stream,e.connection).catch(t=>{pt.error("error during incoming DCUtR attempt",t),e.stream.abort(t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:!0}),this.started=!0)}async stop(){await this.registrar.unhandle(Lu),this.topologyId!=null&&this.registrar.unregister(this.topologyId),this.started=!1}async upgradeInbound(e){if(await this.attemptUnilateralConnectionUpgrade(e))return;let t;for(let n=0;n<this.retries;n++){let i={signal:AbortSignal.timeout(this.timeout)};try{t=await e.newStream([Lu],{signal:i.signal,runOnTransientConnection:!0});let s=Jt(t,{maxDataLength:GA}).pb(ri);pt("B sending connect to %p",e.remotePeer);let o=Date.now();await s.write({type:ri.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map(f=>f.bytes)},i),pt("B receiving connect from %p",e.remotePeer);let a=await s.read(i);if(a.type!==ri.Type.CONNECT)throw pt("A sent wrong message type"),new b("DCUtR message type was incorrect",$.ERR_INVALID_MESSAGE);let c=this.getDialableMultiaddrs(a.observedAddresses);if(c.length===0)throw pt("A did not have any dialable multiaddrs"),new b("DCUtR connect message had no multiaddrs",$.ERR_INVALID_MESSAGE);let l=Date.now()-o;pt("A sending sync, rtt %dms",l),await s.write({type:ri.Type.SYNC,observedAddresses:[]},i),pt("A waiting for half RTT"),await WA(l/2),pt("B dialing",c);let u=await this.connectionManager.openConnection(c,{signal:i.signal,priority:YA});pt("DCUtR to %p succeeded to address %a, closing relayed connection",e.remotePeer,u.remoteAddr),await e.close(i);break}catch(s){if(pt.error("error while attempting DCUtR on attempt %d of %d",n+1,this.retries,s),t?.abort(s),n===this.retries)throw s}finally{t!=null&&await t.close(i)}}}async attemptUnilateralConnectionUpgrade(e){let n=(await this.peerStore.get(e.remotePeer)).addresses.map(i=>{let s=i.multiaddr;return s.getPeerId()==null?s.encapsulate(`/p2p/${e.remotePeer}`):s}).filter(i=>this.isPublicAndDialable(i));if(n.length>0){let i=AbortSignal.timeout(this.timeout);try{pt("attempting unilateral connection upgrade to %a",n);let s=await this.connectionManager.openConnection(n,{signal:i,force:!0});if(s.transient)throw new Error("Could not open a new, non-transient, connection");return pt("unilateral connection upgrade to %p succeeded via %a, closing relayed connection",e.remotePeer,s.remoteAddr),await e.close({signal:i}),!0}catch(s){pt.error("unilateral connection upgrade to %p on addresses %a failed",e.remotePeer,n,s)}}else pt("peer %p has no public addresses, not attempting unilateral connection upgrade",e.remotePeer);return!1}async handleIncomingUpgrade(e,t){let n={signal:AbortSignal.timeout(this.timeout)};try{let i=Jt(e,{maxDataLength:GA}).pb(ri);pt("A receiving connect");let s=await i.read(n);if(s.type!==ri.Type.CONNECT)throw pt("B sent wrong message type"),new b("DCUtR message type was incorrect",$.ERR_INVALID_MESSAGE);if(s.observedAddresses.length===0)throw pt("B sent no multiaddrs"),new b("DCUtR connect message had no multiaddrs",$.ERR_INVALID_MESSAGE);let o=this.getDialableMultiaddrs(s.observedAddresses);if(o.length===0)throw pt("B had no dialable multiaddrs"),new b("DCUtR connect message had no dialable multiaddrs",$.ERR_INVALID_MESSAGE);if(pt("A sending connect"),await i.write({type:ri.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map(l=>l.bytes)}),pt("A receiving sync"),(await i.read(n)).type!==ri.Type.SYNC)throw new b("DCUtR message type was incorrect",$.ERR_INVALID_MESSAGE);pt("A dialing",o);let c=await this.connectionManager.openConnection(o,{signal:n.signal,priority:YA,force:!0});pt("DCUtR to %p succeeded via %a, closing relayed connection",t.remotePeer,c.remoteAddr),await t.close(n)}catch(i){pt.error("incoming DCUtR from %p failed",t.remotePeer,i),e.abort(i)}finally{await e.close(n)}}getDialableMultiaddrs(e){let t=[];for(let n of e)if(!(n==null||n.length===0))try{let i=oe(n);if(!this.isPublicAndDialable(i))continue;t.push(i)}catch{}return t}isPublicAndDialable(e){if(Wl.matches(e))return!1;if(Uw.matches(e))return!0;if(!qw.matches(e)||this.transportManager.transportForMultiaddr(e)==null)return!1;let n=e.toOptions();return Br(n.host)===!1}};var Lu="/libp2p/dcutr";function QA(r={}){return e=>new f1(e,r)}var XA="0.46.16";var e8=`js-libp2p/${XA}`;var jA="0.1.0",ZA="id",JA="id/push",eT="1.0.0",tT="1.0.0";var r8=se(kr(),1);var Xs;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Xs||(Xs={}));var yr=D("libp2p:identify"),t8=1024*8,cn={protocolPrefix:"ipfs",agentVersion:e8,timeout:6e4,maxInboundStreams:1,maxOutboundStreams:1,maxPushIncomingStreams:1,maxPushOutgoingStreams:1,maxObservedAddresses:10,maxIdentifyMessageSize:8192,runOnConnectionOpen:!0,runOnTransientConnection:!0},h1=class{identifyProtocolStr;identifyPushProtocolStr;host;started;timeout;peerId;peerStore;registrar;connectionManager;addressManager;maxInboundStreams;maxOutboundStreams;maxPushIncomingStreams;maxPushOutgoingStreams;maxIdentifyMessageSize;maxObservedAddresses;events;runOnTransientConnection;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??cn.protocolPrefix}/${ZA}/${eT}`,this.identifyPushProtocolStr=`/${t.protocolPrefix??cn.protocolPrefix}/${JA}/${tT}`,this.timeout=t.timeout??cn.timeout,this.maxInboundStreams=t.maxInboundStreams??cn.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??cn.maxOutboundStreams,this.maxPushIncomingStreams=t.maxPushIncomingStreams??cn.maxPushIncomingStreams,this.maxPushOutgoingStreams=t.maxPushOutgoingStreams??cn.maxPushOutgoingStreams,this.maxIdentifyMessageSize=t.maxIdentifyMessageSize??cn.maxIdentifyMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??cn.maxObservedAddresses,this.runOnTransientConnection=t.runOnTransientConnection??cn.runOnTransientConnection,this.host={protocolVersion:`${t.protocolPrefix??cn.protocolPrefix}/${jA}`,agentVersion:t.agentVersion??cn.agentVersion},(t.runOnConnectionOpen??cn.runOnConnectionOpen)&&e.events.addEventListener("connection:open",n=>{let i=n.detail;this.identify(i).catch(s=>{yr.error("error during identify trigged by connection:open",s)})}),e.events.addEventListener("self:peer:update",n=>{this.push().catch(i=>{yr.error(i)})}),this.host.agentVersion===e8&&(oA||iA?this.host.agentVersion+=` UserAgent=${globalThis.process.version}`:(e1||t1||sA||aA)&&(this.host.agentVersion+=` UserAgent=${globalThis.navigator.userAgent}`))}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:Q(this.host.agentVersion),ProtocolVersion:Q(this.host.protocolVersion)}}),await this.registrar.handle(this.identifyProtocolStr,e=>{this._handleIdentify(e).catch(t=>{yr.error(t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),await this.registrar.handle(this.identifyPushProtocolStr,e=>{this._handlePush(e).catch(t=>{yr.error(t)})},{maxInboundStreams:this.maxPushIncomingStreams,maxOutboundStreams:this.maxPushOutgoingStreams,runOnTransientConnection:this.runOnTransientConnection}),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(ge("p2p").code)),n=new Zr({peerId:this.peerId,multiaddrs:t}),i=await wn.seal(n,this.peerId),s=this.registrar.getProtocols(),o=await this.peerStore.get(this.peerId),a=H(o.metadata.get("AgentVersion")??Q(this.host.agentVersion)),c=H(o.metadata.get("ProtocolVersion")??Q(this.host.protocolVersion)),l=e.map(async u=>{let f,h=AbortSignal.timeout(this.timeout);try{(0,r8.setMaxListeners)?.(1/0,h)}catch{}try{f=await u.newStream([this.identifyPushProtocolStr],{signal:h,runOnTransientConnection:this.runOnTransientConnection}),await Jt(f,{maxDataLength:this.maxIdentifyMessageSize??t8}).pb(Xs).write({listenAddrs:t.map(p=>p.bytes),signedPeerRecord:i.marshal(),protocols:s,agentVersion:a,protocolVersion:c},{signal:h}),await f.close({signal:h})}catch(d){yr.error("could not push identify update to peer",d),f?.abort(d)}});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!==$.ERR_NOT_FOUND)throw n}})),await this.pushToConnections(e)}async _identify(e,t={}){let n;t.signal=t.signal??AbortSignal.timeout(this.timeout);try{n=await e.newStream([this.identifyProtocolStr],{...t,runOnTransientConnection:this.runOnTransientConnection});let s=await Jt(n,{maxDataLength:this.maxIdentifyMessageSize??t8}).pb(Xs).read(t);return await n.close(t),s}catch(i){throw yr.error("error while reading identify message",i),n?.abort(i),i}}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",$.ERR_MISSING_PUBLIC_KEY);let a=await hr(i);if(!e.remotePeer.equals(a))throw new b("identified peer does not match the expected peer",$.ERR_INVALID_PEER);if(this.peerId.equals(a))throw new b("identified peer is our own peer id?",$.ERR_INVALID_PEER);let c=W$(o);yr("identify completed for peer %p and protocols %o",a,s),yr("our observed address is %a",c),c!=null&&this.addressManager.getObservedAddrs().length<(this.maxObservedAddresses??1/0)&&(yr("storing our observed address %a",c),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(f=>oe(f)),observedAddr:n.observedAddr==null?void 0:oe(n.observedAddr),protocols:n.protocols,signedPeerRecord:l};return this.events.safeDispatchEvent("peer:identify",{detail:u}),u}async _handleIdentify(e){let{connection:t,stream:n}=e,i=AbortSignal.timeout(this.timeout);try{(0,r8.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(u=>u.decapsulateCode(ge("p2p").code)),c=o.peerRecordEnvelope;if(a.length>0&&c==null){let u=new Zr({peerId:this.peerId,multiaddrs:a});c=(await wn.seal(u,this.peerId)).marshal().subarray()}await Jt(n).pb(Xs).write({protocolVersion:this.host.protocolVersion,agentVersion:this.host.agentVersion,publicKey:s,listenAddrs:a.map(u=>u.bytes),signedPeerRecord:c,observedAddr:t.remoteAddr.bytes,protocols:o.protocols},{signal:i}),await n.close({signal:i})}catch(s){yr.error("could not respond to identify request",s),n.abort(s)}}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={signal:AbortSignal.timeout(this.timeout)},o=await Jt(n,{maxDataLength:this.maxIdentifyMessageSize??t8}).pb(Xs).read(i);await n.close(i),await this.#e(t.remotePeer,o)}catch(i){yr.error("received invalid message",i),n.abort(i);return}yr("handled push from %p",t.remotePeer)}async#e(e,t){if(yr("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:oe(s)})),protocols:t.protocols,metadata:new Map,peerRecordEnvelope:t.signedPeerRecord},i;if(t.signedPeerRecord!=null){yr("received signedPeerRecord in push from %p",e);let s=t.signedPeerRecord,o=await wn.openAndCertify(s,Zr.DOMAIN),a=Zr.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 wn.createFromProtobuf(c.peerRecordEnvelope),u=Zr.createFromProtobuf(l.payload);u.seqNumber>=a.seqNumber&&(yr("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 yr("%p did not send a signed peer record",e);return t.agentVersion!=null&&n.metadata.set("AgentVersion",Q(t.agentVersion)),t.protocolVersion!=null&&n.metadata.set("ProtocolVersion",Q(t.protocolVersion)),await this.peerStore.patch(e,n),i}};function W$(r){if(r!=null&&r.length>0)try{return oe(r)}catch{}}function rT(r={}){return e=>new h1(e,r)}var nT="1.0.0",iT="ping",sT="ipfs";var Bc=D("libp2p:ping"),n8=class{protocol;components;started;timeout;maxInboundStreams;maxOutboundStreams;runOnTransientConnection;constructor(e,t){this.components=e,this.started=!1,this.protocol=`/${t.protocolPrefix??sT}/${iT}/${nT}`,this.timeout=t.timeout??1e4,this.maxInboundStreams=t.maxInboundStreams??2,this.maxOutboundStreams=t.maxOutboundStreams??1,this.runOnTransientConnection=t.runOnTransientConnection??!0}async start(){await this.components.registrar.handle(this.protocol,this.handleMessage,{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),this.started=!0}async stop(){await this.components.registrar.unhandle(this.protocol),this.started=!1}isStarted(){return this.started}handleMessage(e){Bc("incoming ping from %p",e.connection.remotePeer);let{stream:t}=e,n=Date.now();Te(t,t).catch(i=>{Bc.error("incoming ping from %p failed with error",e.connection.remotePeer,i)}).finally(()=>{let i=Date.now()-n;Bc("incoming ping from %p complete in %dms",e.connection.remotePeer,i)})}async ping(e,t={}){Bc("pinging %p",e);let n=Date.now(),i=Or(32),s=await this.components.connectionManager.openConnection(e,t),o,a=()=>{};t.signal=t.signal??AbortSignal.timeout(this.timeout);try{o=await s.newStream(this.protocol,{...t,runOnTransientConnection:this.runOnTransientConnection}),a=()=>{o?.abort(new b("ping timeout",$.ERR_TIMEOUT))},t.signal.addEventListener("abort",a,{once:!0});let c=await Te([i],o,async u=>Gn(u)),l=Date.now()-n;if(c==null)throw new b(`Did not receive a ping ack after ${l}ms`,$.ERR_WRONG_PING_ACK);if(!pe(i,c.subarray()))throw new b(`Received wrong ping ack after ${l}ms`,$.ERR_WRONG_PING_ACK);return Bc("ping %p complete in %dms",s.remotePeer,l),l}catch(c){throw Bc.error("error while pinging %p",s.remotePeer,c),o?.abort(c),c}finally{t.signal.removeEventListener("abort",a),o!=null&&await o.close()}}};function oT(r={}){return e=>new n8(e,r)}var aT={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 cT(){return{addresses:{listen:["/webrtc"]},transports:[Jg({discoverRelays:1}),PI(),CI(),yA(),pA()],connectionEncryption:[dc()],streamMuxers:[C_(),US()],peerDiscovery:[q_(aT)],contentRouters:[Q_("https://cid.contact")],services:{identify:rT(),autoNAT:BA(),pubsub:Fv(),dcutr:QA(),dht:AS({clientMode:!0,validators:{ipns:kA},selectors:{ipns:PA}}),ping:oT()}}}async function lT(r,e){let t=cT();return e=e??{},dx({datastore:r,...t,...e,start:!1})}var uT="2.0.3-c674ba2",fT="helia";var j$=D("helia");async function Z$(r={}){let e=r.datastore??new to,t=r.blockstore??new qc,n;J$(r.libp2p)?n=r.libp2p:n=await lT(e,r.libp2p);let i=new q0({...r,datastore:e,blockstore:t,libp2p:n});return r.start!==!1&&await i.start(),eH(i),i}function J$(r){return r==null?!1:["dial","dialProtocol","hangUp","handle","unhandle","getMultiaddrs","getProtocols"].every(t=>typeof r[t]=="function")}function eH(r){try{if(r.libp2p.services.identify.host.agentVersion.match(/js-libp2p\/\d+\.\d+\.\d+\sUserAgent=/)==null)return;r.libp2p.services.identify.host.agentVersion=`${fT}/${uT} ${r.libp2p.services.identify.host.agentVersion}`}catch(e){j$.error("could not add Helia to agent version",e)}}return Mu(tH);})();
|
|
85
|
+
`),r}var AI=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),TI=r=>[...Array(r)].map(()=>AI.at(Math.floor(Math.random()*AI.length))).join("");var Qd=D("libp2p:webrtc:transport"),t$=1e4,a5e=ge("webrtc-direct").code,II=ge("certhash").code,Xd=class{metrics;components;init;constructor(e,t={}){this.components=e,this.init=t,e.metrics!=null&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webrtc-direct_dialer_events_total",{label:"event",help:"Total count of WebRTC-direct dial events by type"})})}async dial(e,t){let n=await this._connect(e,t);return Qd("dialing address: %a",e),n}createListener(e){throw FS("WebRTCTransport.createListener")}filter(e){return e.filter(Ww.exactMatch)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[gi]=!0;async _connect(e,t){let n=new AbortController,i=n.signal,s=e.getPeerId();if(s===null)throw Ad("we need to have the remote's PeerId");let o=ce(s),a=Ag(Yd(e)),c=await Sc.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:Tg(a.name)}),l=new Sc({certificates:[c]});try{let u=new Promise((_,k)=>{let B=l.createDataChannel("",{negotiated:!0,id:0}),L=setTimeout(()=>{let K=`Data channel was never opened: state: ${B.readyState}`;Qd.error(K),this.metrics?.dialerEvents.increment({open_error:!0}),k(V4("data",K))},t$);B.onopen=K=>{clearTimeout(L),_(B)},B.onerror=K=>{clearTimeout(L);let te=`Error opening a data channel for handshaking: ${K.target?.toString()??"not specified"}`;Qd.error(te),this.metrics?.dialerEvents.increment({unknown_error:!0}),k(V4("data",te))}}),f="libp2p+webrtc+v1/"+TI(32),h=await l.createOffer(),d=RI(h,f);await l.setLocalDescription(d);let p=SI(e,f);await l.setRemoteDescription(p);let m=await u,g=this.components.peerId,y=this.generateNoisePrologue(l,a.code,e),w=dc({prologueBytes:y})(),E=_c({channel:m,direction:"inbound",...this.init.dataChannel??{}}),R={...E,sink:E.sink.bind(E),source:async function*(){for await(let _ of E.source)for(let k of _)yield k}()},x=new Yo({peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),v=vu?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(v,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":x.close().catch(_=>{Qd.error("error closing connection",_)}).finally(()=>{n.abort()});break;default:break}},{signal:i}),this.metrics?.dialerEvents.increment({peer_connection:!0});let I=new Qo({peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await w.secureInbound(g,R,o),await t.upgrader.upgradeOutbound(x,{skipProtection:!0,skipEncryption:!0,muxerFactory:I})}catch(u){throw l.close(),u}}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw xu("no local certificate");let i=_I(e);if(i==null)throw xu("no local fingerprint found");let s=i.trim().toLowerCase().replaceAll(":",""),o=Q(s,"hex"),a=DI.encode(o,t),c=Ig.decode(Yd(n)),l=Q("libp2p-webrtc-noise:");return Re([l,a,c])}};function CI(r){return e=>new Xd(e,r)}function PI(r){return e=>new Bd(e,r)}function kI(r){let e;try{e=ge("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function NI(r){return r.some(([e,t])=>e===ge("tls").code)}function on(r,e,t){let n=OI[ge(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${ge(r).name}`);let i=n(e,t);return r===ge("ip6").code?`[${i}]`:i}var OI={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://${on(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://${on(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`${on(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`${on(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=NI(e),n=kI(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=on(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 on(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return on(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=on(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=NI(e),n=kI(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=on(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=on(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`${on(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`${on(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`${on(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function LI(r,e){let n=oe(r).stringTuples(),i=n.pop();if(i===void 0)throw new Error("Unexpected end of multiaddr");let s=ge(i[0]),o=OI[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]===ge("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 BI=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 MI=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let i of n){try{await BI(r)}catch(s){if(s.message==="socket closed")break;throw s}if(r.readyState===r.CLOSING||r.readyState===r.CLOSED)break;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 VI=se(FI(),1);function KI(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var qI=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 VI.EventIterator(({push:o,stop:a,fail:c})=>{let l=f=>{let h=null;typeof f.data=="string"&&(h=Q(f.data)),KI(f.data)&&(h=new Uint8Array(f.data)),f.data instanceof Uint8Array&&(h=f.data),h!=null&&o(h)},u=f=>{c(f.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 KI(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 zI=(r,e)=>{e=e??{};let t=qI(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:MI(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 $I=WebSocket;var ZI=se(jI(),1),h$={http:"ws",https:"wss"},d$="ws",JI=(r,e)=>(0,ZI.relative)(r,e,h$,d$);function eA(r,e){let t=typeof window>"u"?"":window.location;e=e??{};let n=JI(r,t.toString()),i=new $I(n,e.websocket);return zI(i,e)}var nA=se(rA(),1),Ng=typeof window=="object"&&typeof document=="object"&&document.nodeType===9,Jd=(0,nA.default)(),e1=Ng&&!Jd,iA=Jd&&!Ng,sA=Jd&&Ng,oA=typeof globalThis.process<"u"&&typeof globalThis.process.release<"u"&&globalThis.process.release.name==="node"&&!Jd,t1=typeof importScripts=="function"&&typeof self<"u"&&typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,O5e=typeof globalThis.process<"u"&&typeof globalThis.process.env<"u"&&globalThis.process.env["NODE"+(()=>"_")()+"ENV"]==="test",aA=typeof navigator<"u"&&navigator.product==="ReactNative";function uA(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return yc.matches(t)||$o.matches(t)})}function fA(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return $o.matches(t)})}function hA(){throw new Error("WebSocket Servers can not be created in the browser!")}var r1=D("libp2p:websockets:socket");function dA(r,e,t){t=t??{};let n={async sink(i){t?.signal!=null&&(i=Qt(i,t.signal));try{await r.sink(i)}catch(s){s.type!=="aborted"&&r1.error(s)}},source:t.signal!=null?Qt(r.source,t.signal):r.source,remoteAddr:e,timeline:{open:Date.now()},async close(i={}){let s=Date.now();i.signal=i.signal??AbortSignal.timeout(500);let o=()=>{let{host:a,port:c}=n.remoteAddr.toOptions();r1("timeout closing stream to %s:%s after %dms, destroying it manually",a,c,Date.now()-s),this.abort(new b("Socket close timeout","ERR_SOCKET_CLOSE_TIMEOUT"))};i.signal.addEventListener("abort",o);try{await r.close()}catch(a){r1.error("error closing WebSocket gracefully",a),this.abort(a)}finally{i.signal.removeEventListener("abort",o),n.timeline.close=Date.now()}},abort(i){let{host:s,port:o}=n.remoteAddr.toOptions();r1("timeout closing stream to %s:%s due to error",s,o,i),r.destroy(),n.timeline.close=Date.now()}};return r.socket.addEventListener("close",()=>{n.timeline.close==null&&(n.timeline.close=Date.now())},{once:!0}),n}var Gs=D("libp2p:websockets"),Og=class{init;constructor(e){this.init=e}[Symbol.toStringTag]="@libp2p/websockets";[gi]=!0;async dial(e,t){Gs("dialing %s",e),t=t??{};let n=await this._connect(e,t),i=dA(n,e);Gs("new outbound connection %s",i.remoteAddr);let s=await t.upgrader.upgradeOutbound(i);return Gs("outbound connection %s upgraded",i.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new Pn;let n=e.toOptions();Gs("dialing %s:%s",n.host,n.port);let i=xe(),s=eA(LI(e),this.init);if(s.socket.addEventListener("error",()=>{let c=new b(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");Gs.error("connection error:",c),i.reject(c)}),t.signal==null)return await Promise.race([s.connected(),i.promise]),Gs("connected %s",e),s;let o,a=new Promise((c,l)=>{if(o=()=>{l(new Pn),s.close().catch(u=>{Gs.error("error closing raw socket",u)})},t?.signal?.aborted===!0){o();return}t?.signal?.addEventListener("abort",o)});try{await Promise.race([a,i.promise,s.connected()])}finally{o!=null&&t?.signal?.removeEventListener("abort",o)}return Gs("connected %s",e),s}createListener(e){return hA({...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):e1||t1?fA(e):uA(e)}};function pA(r={}){return()=>new Og(r)}var ku=D("libp2p:webtransport:stream");async function Lg(r,e,t,n,i){let s=r.writable.getWriter(),o=r.readable.getReader();await s.ready;function a(){let h=n.findIndex(d=>d===f);h!==-1&&(n.splice(h,1),f.timeline.close=Date.now(),i?.(f))}let c=!1,l=!1;(async function(){let h=await s.closed.catch(d=>d);if(h!=null){let d=h.message;d.includes("aborted by the remote server")||d.includes("STOP_SENDING")||ku.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${h.message}`)}c=!0,c&&l&&a()})().catch(()=>{ku.error("WebTransport failed to cleanup closed stream")}),async function(){let h=await o.closed.catch(d=>d);h!=null&&ku.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${h.message}`),l=!0,c&&l&&a()}().catch(()=>{ku.error("WebTransport failed to cleanup closed stream")});let u=!1,f={id:e,status:"open",writeStatus:"ready",readStatus:"ready",abort(h){c||(s.abort(h).catch(d=>{ku.error("could not abort stream",d)}),c=!0),l=!0,this.status="aborted",this.writeStatus="closed",this.readStatus="closed",this.timeline.reset=this.timeline.close=this.timeline.closeRead=this.timeline.closeWrite=Date.now(),a()},async close(h){this.status="closing",await Promise.all([f.closeRead(h),f.closeWrite(h)]),a(),this.status="closed",this.timeline.close=Date.now()},async closeRead(h){if(!l){this.readStatus="closing";try{await o.cancel()}catch(d){d.toString().includes("RESET_STREAM")===!0&&(c=!0)}this.timeline.closeRead=Date.now(),this.readStatus="closed",l=!0}c&&a()},async closeWrite(h){if(!c){c=!0,this.writeStatus="closing";try{await s.close()}catch(d){d.toString().includes("RESET_STREAM")===!0&&(l=!0)}this.timeline.closeWrite=Date.now(),this.writeStatus="closed"}l&&a()},direction:t,timeline:{open:Date.now()},metadata:{},source:async function*(){for(;;){let h=await o.read();if(h.done){l=!0,c&&a();return}yield new ve(h.value)}}(),sink:async function(h){if(u)throw new Error("sink already called on stream");u=!0;try{this.writeStatus="writing";for await(let d of h)if(d instanceof Uint8Array)await s.write(d);else for(let p of d)await s.write(p);this.writeStatus="done"}finally{this.timeline.closeWrite=Date.now(),this.writeStatus="closed",await f.closeWrite()}}};return f}function Bg(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}function mA(r,e){return e.filter(n=>!!r.find(i=>pe(n,i))).length===e.length}var y$=Object.values(ln).map(r=>r.decoder).reduce((r,e)=>r.or(e));function b$(r){return Dn.decode(y$.decode(r))}function gA(r){if(!Jf.matches(r))throw new b("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");let e=r.stringTuples(),t=e.filter(([o,a])=>o===ge("certhash").code).map(([o,a])=>b$(a??"")),n=e.filter(([o,a])=>o===ge("p2p").code).map(([o,a])=>ce(a??""))[0],i=r.toOptions(),s=i.host;return i.family===6&&s?.includes(":")&&(s=`[${s}]`),{url:`https://${s}:${i.port}`,certhashes:t,remotePeer:n}}var an=D("libp2p:webtransport"),Mg=class{components;config;metrics;constructor(e,t={}){this.components=e,this.config={maxInboundStreams:t.maxInboundStreams??1e3},e.metrics!=null&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webtransport_dialer_events_total",{label:"event",help:"Total count of WebTransport dialer events by type"})})}[Symbol.toStringTag]="@libp2p/webtransport";[gi]=!0;async dial(e,t){t?.signal?.throwIfAborted(),an("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}=gA(e);if(o==null)throw new Error("Need a target peerid");if(s.length===0)throw new Error("Expected multiaddr to contain certhashes");let a,c,l=()=>{},u=!1,f=!1,h=!1;try{this.metrics?.dialerEvents.increment({pending:!0});let d=new WebTransport(`${i}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(p=>({algorithm:"sha-256",value:p.digest}))});if(l=p=>{if(!u)try{this.metrics?.dialerEvents.increment({[p]:!0}),d.close()}catch(m){an.error("error closing wt session",m)}finally{c!=null&&(c.timeline.close=Date.now()),u=!0}},a=()=>{l(f?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",a,{once:!0}),await Promise.race([d.closed,d.ready]),f=!0,this.metrics?.dialerEvents.increment({ready:!0}),d.closed.catch(p=>{an.error("error on remote wt session close",p)}).finally(()=>{l("remote_close")}),!await this.authenticateWebTransport(d,n,o,s))throw new Error("Failed to authenticate webtransport");return this.metrics?.dialerEvents.increment({open:!0}),c={close:async()=>{an("Closing webtransport"),l("close")},abort:p=>{an("aborting webtransport due to passed err",p),l("abort")},remoteAddr:e,timeline:{open:Date.now()},...Bg()},h=!0,await t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(d),skipProtection:!0})}catch(d){throw an.error("caught wt session err",d),l(h?"upgrade_error":f?"noise_error":"ready_error"),d}finally{a!=null&&t.signal?.removeEventListener("abort",a)}}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 f=await a.read();if(f.value!=null&&(yield f.value),f.done)break}}(),sink:async function(f){for await(let h of f)await o.write(h)}},l=dc()(),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch(f=>{an.error(`Failed to close authentication stream writer: ${f.message}`)}),a.cancel().catch(f=>{an.error(`Failed to close authentication stream reader: ${f.message}`)}),!mA(u?.webtransportCerthashes??[],i.map(f=>f.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=[];return async function(){let a=e.incomingBidirectionalStreams.getReader();for(;;){let{done:c,value:l}=await a.read();if(c)break;if(s.length>=n.maxInboundStreams)l.writable.close().catch(u=>{an.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)}),l.readable.cancel().catch(u=>{an.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)});else{let u=await Lg(l,String(t++),"inbound",s,i?.onStreamEnd);s.push(u),i?.onIncomingStream?.(u)}}}().catch(()=>{an.error("WebTransport failed to receive incoming stream")}),{protocol:"webtransport",streams:s,newStream:async a=>{let c=await e.createBidirectionalStream(),l=await Lg(c,String(t++),i?.direction??"outbound",s,i?.onStreamEnd);return s.push(l),l},close:async a=>{an("Closing webtransport muxer"),await Promise.all(s.map(async c=>c.close(a)))},abort:a=>{an("Aborting webtransport muxer with err:",a);for(let c of s)c.abort(a)},...Bg()}}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(Jf.exactMatch)}};function yA(r={}){return e=>new Mg(e,r)}var Kr=se(ia(),1);var IA=se(bA(),1);var wA="ERR_IPNS_EXPIRED_RECORD",n1="ERR_UNRECOGNIZED_VALIDITY";var Ji="ERR_SIGNATURE_VERIFICATION",EA="ERR_UNRECOGNIZED_FORMAT";var Fg="ERR_UNDEFINED_PARAMETER",xA="ERR_INVALID_RECORD_DATA",vA="ERR_INVALID_VALUE",_A="ERR_INVALID_EMBEDDED_KEY";var SA="ERR_RECORD_TOO_LARGE";var es;(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=()=>ut(t)}(e=r.ValidityType||(r.ValidityType={}));let n;r.codec=()=>(n==null&&(n=fe((i,s,o={})=>{o.lengthDelimited!==!1&&s.fork(),i.value!=null&&(s.uint32(10),s.bytes(i.value)),i.signatureV1!=null&&(s.uint32(18),s.bytes(i.signatureV1)),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.signatureV1=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=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(es||(es={}));var Kg=D("ipns:utils"),w$=Q("/ipns/"),E$=114;function x$(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].padEnd(6,"0").slice(0,3),10);return new Date(Date.UTC(n,i,s,o,a,c,l))}var AA=async(r,e)=>{if(e==null||r==null){let n=new Error("one or more of the provided parameters are not defined");throw Kg.error(n),(0,Kr.default)(n,Fg)}let t;if(e.pubKey!=null){try{t=Lr(e.pubKey)}catch(i){throw Kg.error(i),i}if(!(await hr(e.pubKey)).equals(r))throw(0,Kr.default)(new Error("Embedded public key did not match PeerID"),_A)}else r.publicKey!=null&&(t=Lr(r.publicKey));if(t!=null)return t;throw(0,Kr.default)(new Error("no public key is available"),Fg)};var TA=r=>{let e=Q("ipns-signature:");return Re([e,r])};function Nu(r){let e=es.decode(r);if(e.sequence!=null&&(e.sequence=BigInt(e.sequence)),e.ttl!=null&&(e.ttl=BigInt(e.ttl)),e.signatureV2==null||e.data==null)throw(0,Kr.default)(new Error("missing data or signatureV2"),Ji);let t=CA(e.data),n=v$(t.Value),i;try{i=IA.default.fromDate(x$(H(t.Validity)))}catch{throw Kg.error("unrecognized validity format (not an rfc3339 format)"),(0,Kr.default)(new Error("unrecognized validity format (not an rfc3339 format)"),EA)}if(e.value!=null&&e.signatureV1!=null)return _$(e),{value:n,validityType:es.ValidityType.EOL,validity:i,sequence:t.Sequence,ttl:t.TTL,pubKey:e.pubKey,signatureV1:e.signatureV1,signatureV2:e.signatureV2,data:e.data};if(e.signatureV2!=null)return{value:n,validityType:es.ValidityType.EOL,validity:i,sequence:t.Sequence,ttl:t.TTL,pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data};throw new Error("invalid record: does not include signatureV1 or signatureV2")}var DA=r=>dt(r.slice(w$.length));var CA=r=>{let e=dn(r);if(e.ValidityType===0)e.ValidityType=es.ValidityType.EOL;else throw(0,Kr.default)(new Error("Unknown validity type"),n1);return Number.isInteger(e.Sequence)&&(e.Sequence=BigInt(e.Sequence)),Number.isInteger(e.TTL)&&(e.TTL=BigInt(e.TTL)),e},v$=r=>{if(r!=null){if(Fa(r))return`/ipns/${r.toCID().toString(ns)}`;if(r instanceof Uint8Array){let n=H(r);n.startsWith("/")&&(r=n)}let e=r.toString().trim();if(e.startsWith("/")&&e.length>1)return e;let t=ye.asCID(r);if(t!=null)return t.code===E$?`/ipns/${t.toString(ns)}`:`/ipfs/${t.toV1().toString()}`;try{return r instanceof Uint8Array?`/ipfs/${ye.decode(r).toV1().toString()}`:`/ipfs/${ye.parse(e).toV1().toString()}`}catch{}}throw(0,Kr.default)(new Error("Value must be a valid content path starting with /"),vA)},_$=r=>{if(r.data==null)throw(0,Kr.default)(new Error("Record data is missing"),xA);let e=CA(r.data);if(!pe(e.Value,r.value??new Uint8Array(0)))throw(0,Kr.default)(new Error('Field "value" did not match between protobuf and CBOR'),Ji);if(!pe(e.Validity,r.validity??new Uint8Array(0)))throw(0,Kr.default)(new Error('Field "validity" did not match between protobuf and CBOR'),Ji);if(e.ValidityType!==r.validityType)throw(0,Kr.default)(new Error('Field "validityType" did not match between protobuf and CBOR'),Ji);if(e.Sequence!==r.sequence)throw(0,Kr.default)(new Error('Field "sequence" did not match between protobuf and CBOR'),Ji);if(e.TTL!==r.ttl)throw(0,Kr.default)(new Error('Field "ttl" did not match between protobuf and CBOR'),Ji)};function PA(r,e){let t=e.map((n,i)=>({record:Nu(n),index:i}));return t.sort((n,i)=>{let s=n.record.sequence,o=i.record.sequence;if(s>o)return-1;if(s<o)return 1;let a=n.record.validity.toDate(),c=i.record.validity.toDate();return a.getTime()>c.getTime()?-1:a.getTime()<c.getTime()?1:0}),t[0].index}var Ou=se(ia(),1);var i1=D("ipns:validator"),S$=1024*10,R$=async(r,e)=>{let t=Nu(e),n;try{let i=TA(t.data);n=await r.verify(i,t.signatureV2)}catch{n=!1}if(!n)throw i1.error("record signature verification failed"),(0,Ou.default)(new Error("record signature verification failed"),Ji);if(t.validityType===es.ValidityType.EOL){if(t.validity.toDate().getTime()<Date.now())throw i1.error("record has expired"),(0,Ou.default)(new Error("record has expired"),wA)}else if(t.validityType!=null)throw i1.error("unrecognized validity type"),(0,Ou.default)(new Error("unrecognized validity type"),n1);i1("ipns record for %b is valid",t.value)};async function kA(r,e){if(e.byteLength>S$)throw(0,Ou.default)(new Error("record too large"),SA);let t=DA(r),n=Nu(e),i=await AA(t,n);await R$(i,e)}var qg=se(kr(),1);var NA="libp2p",OA="autonat",LA="1.0.0";var De;(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=()=>ut(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=()=>ut(i)}(n=r.ResponseStatus||(r.ResponseStatus={}));let s;(function(l){let u;l.codec=()=>(u==null&&(u=fe((f,h,d={})=>{if(d.lengthDelimited!==!1&&h.fork(),f.id!=null&&(h.uint32(10),h.bytes(f.id)),f.addrs!=null)for(let p of f.addrs)h.uint32(18),h.bytes(p);d.lengthDelimited!==!1&&h.ldelim()},(f,h)=>{let d={addrs:[]},p=h==null?f.len:f.pos+h;for(;f.pos<p;){let m=f.uint32();switch(m>>>3){case 1:d.id=f.bytes();break;case 2:d.addrs.push(f.bytes());break;default:f.skipType(m&7);break}}return d})),u),l.encode=f=>ue(f,l.codec()),l.decode=f=>le(f,l.codec())})(s=r.PeerInfo||(r.PeerInfo={}));let o;(function(l){let u;l.codec=()=>(u==null&&(u=fe((f,h,d={})=>{d.lengthDelimited!==!1&&h.fork(),f.peer!=null&&(h.uint32(10),r.PeerInfo.codec().encode(f.peer,h)),d.lengthDelimited!==!1&&h.ldelim()},(f,h)=>{let d={},p=h==null?f.len:f.pos+h;for(;f.pos<p;){let m=f.uint32();switch(m>>>3){case 1:d.peer=r.PeerInfo.codec().decode(f,f.uint32());break;default:f.skipType(m&7);break}}return d})),u),l.encode=f=>ue(f,l.codec()),l.decode=f=>le(f,l.codec())})(o=r.Dial||(r.Dial={}));let a;(function(l){let u;l.codec=()=>(u==null&&(u=fe((f,h,d={})=>{d.lengthDelimited!==!1&&h.fork(),f.status!=null&&(h.uint32(8),r.ResponseStatus.codec().encode(f.status,h)),f.statusText!=null&&(h.uint32(18),h.string(f.statusText)),f.addr!=null&&(h.uint32(26),h.bytes(f.addr)),d.lengthDelimited!==!1&&h.ldelim()},(f,h)=>{let d={},p=h==null?f.len:f.pos+h;for(;f.pos<p;){let m=f.uint32();switch(m>>>3){case 1:d.status=r.ResponseStatus.codec().decode(f);break;case 2:d.statusText=f.string();break;case 3:d.addr=f.bytes();break;default:f.skipType(m&7);break}}return d})),u),l.encode=f=>ue(f,l.codec()),l.decode=f=>le(f,l.codec())})(a=r.DialResponse||(r.DialResponse={}));let c;r.codec=()=>(c==null&&(c=fe((l,u,f={})=>{f.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)),f.lengthDelimited!==!1&&u.ldelim()},(l,u)=>{let f={},h=u==null?l.len:l.pos+u;for(;l.pos<h;){let d=l.uint32();switch(d>>>3){case 1:f.type=r.MessageType.codec().decode(l);break;case 2:f.dial=r.Dial.codec().decode(l,l.uint32());break;case 3:f.dialResponse=r.DialResponse.codec().decode(l,l.uint32());break;default:l.skipType(d&7);break}}return f})),c),r.encode=l=>ue(l,r.codec()),r.decode=l=>le(l,r.codec())})(De||(De={}));var qe=D("libp2p:autonat"),Vg=4,zg=class{components;startupDelay;refreshInterval;protocol;timeout;maxInboundStreams;maxOutboundStreams;verifyAddressTimeout;started;constructor(e,t){this.components=e,this.started=!1,this.protocol=`/${t.protocolPrefix??NA}/${OA}/${LA}`,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=>{qe.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=AbortSignal.timeout(this.timeout),n=()=>{e.stream.abort(new b("handleIncomingAutonatStream timeout",$.ERR_TIMEOUT))};t.addEventListener("abort",n,{once:!0});try{(0,qg.setMaxListeners)?.(1/0,t)}catch{}let i=this.components.addressManager.getAddresses().map(s=>s.toOptions().host);try{let s=this;await Te(e.stream,o=>Et(o),async function*(o){let a=await Gn(o);if(a==null){qe("no message received"),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"No message was sent"}});return}let c;try{c=De.decode(a)}catch(m){qe.error("could not decode message",m),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"Could not decode message"}});return}let l=c.dial;if(l==null){qe.error("dial was missing from message"),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"No Dial message found in message"}});return}let u,f=l.peer;if(f==null||f.id==null){qe.error("PeerId missing from message"),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"missing peer info"}});return}try{u=dt(f.id)}catch(m){qe.error("invalid PeerId",m),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"bad peer id"}});return}if(qe("incoming request from %p",u),!e.connection.remotePeer.equals(u)){qe("target peer %p did not equal sending peer %p",u,e.connection.remotePeer),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_BAD_REQUEST,statusText:"peer id mismatch"}});return}let h=f.addrs.map(m=>oe(m)).filter(m=>{let g=m.toOptions().host===e.connection.remoteAddr.toOptions().host;return qe.trace("request to dial %a was sent from %a is same host %s",m,e.connection.remoteAddr,g),g}).filter(m=>{let g=m.toOptions().host,y=!(Br(g)??!1);return qe.trace("host %s was public %s",g,y),y}).filter(m=>{let g=m.toOptions().host,y=!i.includes(g);return qe.trace("host %s was not our host %s",g,y),y}).filter(m=>{let g=!!s.components.transportManager.transportForMultiaddr(m);return qe.trace("transport for %a is supported %s",m,g),g}).map(m=>(m.getPeerId()==null&&(m=m.encapsulate(`/p2p/${u.toString()}`)),m));if(h.length===0){qe("no valid multiaddrs for %p in message",u),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_DIAL_REFUSED,statusText:"no dialable addresses"}});return}qe("dial multiaddrs %s for peer %p",h.map(m=>m.toString()).join(", "),u);let d="",p=h[0];for await(let m of h){let g;p=m;try{if(g=await s.components.connectionManager.openConnection(m,{signal:t}),!g.remoteAddr.equals(m))throw qe.error("tried to dial %a but dialed %a",m,g.remoteAddr),new Error("Unexpected remote address");qe("Success %p",u),yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.OK,addr:g.remoteAddr.decapsulateCode(ge("p2p").code).bytes}});return}catch(y){qe("could not dial %p",u,y),d=y.message}finally{g!=null&&await g.close()}}yield De.encode({type:De.MessageType.DIAL_RESPONSE,dialResponse:{status:De.ResponseStatus.E_DIAL_ERROR,statusText:d,addr:p.bytes}})},o=>_t(o),e.stream)}catch(s){qe.error("error handling incoming autonat stream",s)}finally{t.removeEventListener("abort",n)}}_verifyExternalAddresses(){this.verifyExternalAddresses().catch(e=>{qe.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!(Br(o.host)??!1)});if(t.length===0){qe("no public addresses found, not requesting verification"),this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval);return}let n=AbortSignal.timeout(this.timeout);try{(0,qg.setMaxListeners)?.(1/0,n)}catch{}let i=this;try{qe("verify multiaddrs %s",t.map(f=>f.toString()).join(", "));let s=De.encode({type:De.MessageType.DIAL,dial:{peer:{id:this.components.peerId.toBytes(),addrs:t.map(f=>f.bytes)}}}),a=(await kf()).toBytes(),c={},l=[],u=async f=>{let h=()=>{};try{qe("asking %p to verify multiaddr",f.id);let d=await i.components.connectionManager.openConnection(f.id,{signal:n}),p=await d.newStream(this.protocol,{signal:n});h=()=>{p.abort(new b("verifyAddress timeout",$.ERR_TIMEOUT))},n.addEventListener("abort",h,{once:!0});let m=await Te([s],y=>_t(y),p,y=>Et(y),async y=>Gn(y));if(m==null){qe("no response received from %p",d.remotePeer);return}let g=De.decode(m);if(g.type!==De.MessageType.DIAL_RESPONSE||g.dialResponse==null){qe("invalid autonat response from %p",d.remotePeer);return}if(g.dialResponse.status===De.ResponseStatus.OK){let y=d.remoteAddr.toOptions(),w;if(y.family===4)w=y.host.split(".")[0];else if(y.family===6)w=y.host.split(":")[0];else{qe('remote address "%s" was not IP4 or IP6?',y.host);return}if(l.includes(w)){qe("already have response from network segment %d - %s",w,y.host);return}l.push(w)}return g.dialResponse}catch(d){qe.error("error asking remote to verify multiaddr",d)}finally{n.removeEventListener("abort",h)}};for await(let f of Wo(Cn(this.components.peerRouting.getClosestPeers(a,{signal:n}),h=>async()=>u(h)),{concurrency:Vg}))try{if(f==null)continue;let h=f.addr==null?t[0]:oe(f.addr);if(qe("autonat response for %a is %s",h,f.status),f.status===De.ResponseStatus.E_BAD_REQUEST||f.status===De.ResponseStatus.E_DIAL_REFUSED||f.addr==null&&t.length>1)continue;if(!t.some(p=>p.equals(h))){qe("peer reported %a as %s but it was not in our observed address list",h,f.status);continue}let d=h.toString();if(c[d]==null&&(c[d]={success:0,failure:0}),f.status===De.ResponseStatus.OK?c[d].success++:f.status===De.ResponseStatus.E_DIAL_ERROR&&c[d].failure++,c[d].success===Vg){qe("%a is externally dialable",h),e.confirmObservedAddr(h);return}if(c[d].failure===Vg){qe("%a is not externally dialable",h),e.removeObservedAddr(h);return}}catch(h){qe.error("could not verify external address",h)}}finally{this.verifyAddressTimeout=setTimeout(this._verifyExternalAddresses,this.refreshInterval)}}};function BA(r={}){return e=>new zg(e,r)}var B$=se(kr(),1);var $g="/libp2p/relay";var MA="circuit-relay-relay";var P$=BigInt(131072),Ys="/libp2p/circuit/relay/0.2.0/hop",s1="/libp2p/circuit/relay/0.2.0/stop",k$=30*1e3,N$=30*1e3;var ts;(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=()=>ut(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=fe((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),Oc.codec().encode(i.peer,s)),i.reservation!=null&&(s.uint32(26),o1.codec().encode(i.reservation,s)),i.limit!=null&&(s.uint32(34),Lc.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(40),Ft.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=Oc.codec().decode(i,i.uint32());break;case 3:o.reservation=o1.codec().decode(i,i.uint32());break;case 4:o.limit=Lc.codec().decode(i,i.uint32());break;case 5:o.status=Ft.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(ts||(ts={}));var ti;(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=()=>ut(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=fe((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),Oc.codec().encode(i.peer,s)),i.limit!=null&&(s.uint32(26),Lc.codec().encode(i.limit,s)),i.status!=null&&(s.uint32(32),Ft.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=Oc.codec().decode(i,i.uint32());break;case 3:o.limit=Lc.codec().decode(i,i.uint32());break;case 4:o.status=Ft.codec().decode(i);break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(ti||(ti={}));var Oc;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Oc||(Oc={}));var o1;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(o1||(o1={}));var Lc;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Lc||(Lc={}));var Ft;(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"})(Ft||(Ft={}));var Hg;(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"})(Hg||(Hg={}));(function(r){r.codec=()=>ut(Hg)})(Ft||(Ft={}));var Wg;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Wg||(Wg={}));var w7e=D("libp2p:circuit-relay:utils");async function Gg(r){let e=new TextEncoder().encode(r),t=await Oe.digest(e);return ye.createV0(t)}function Yg(r){let e=r*BigInt(1e3),t=new Date().getTime();return Number(e-BigInt(t))}var L$=se(qA(),1);var L7e=D("libp2p:circuit-relay:advert-service");var h9e=D("libp2p:circuit-relay:server");var M$=D("libp2p:stream:converter");function Qg(r){let{stream:e,remoteAddr:t}=r,{sink:n,source:i}=e,s=async function*(){for await(let c of i)c instanceof Uint8Array?yield c:yield*c}(),o={async sink(c){try{await n(c),a()}catch(l){l.type!=="aborted"&&M$(l)}},source:s,remoteAddr:t,timeline:{open:Date.now(),close:void 0},async close(c){a(),await e.close(c)},abort(c){a(),e.abort(c)}};function a(){o.timeline.close==null&&(o.timeline.close=Date.now())}return o}var Qs=D("libp2p:circuit-relay:discover-relays"),a1=class extends Fe{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(Ys,{onConnect:e=>{this.safeDispatchEvent("relay:discover",{detail:e})}}),this.discover().catch(e=>{Qs.error("error listening on relays",e)}),this.started=!0}stop(){this.topologyId!=null&&this.registrar.unregister(this.topologyId),this.started=!1}async discover(){Qs("searching peer store for relays");let e=await this.peerStore.all({filters:[t=>t.protocols.includes(Ys)],orders:[()=>Math.random()<.5?1:-1]});for(let t of e)Qs("found relay peer %p in content peer store",t.id),this.safeDispatchEvent("relay:discover",{detail:t.id});Qs("found %d relay peers in peer store",e.length);try{Qs("searching content routing for relays");let t=await Gg($g),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}),Qs("found relay peer %p in content routing",s),this.safeDispatchEvent("relay:discover",{detail:s})}Qs("found %d relay peers in content routing",n)}catch(t){Qs.error("failed when finding relays on the network",t)}}};var c1=D("libp2p:circuit-relay:transport:listener"),Xg=class extends Fe{connectionManager;relayStore;listeningAddrs;constructor(e){super(),this.connectionManager=e.connectionManager,this.relayStore=e.relayStore,this.listeningAddrs=new dr,this.relayStore.addEventListener("relay:removed",this._onRemoveRelayPeer)}_onRemoveRelayPeer=e=>{this.#e(e.detail)};async listen(e){c1("listen on %a",e);let t=e.getPeerId(),n;if(t!=null){let s=ce(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=oe(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)){c1("already listening on relay %p",n.remotePeer);return}this.listeningAddrs.set(n.remotePeer,i.addrs.map(s=>oe(s).encapsulate("/p2p-circuit"))),this.safeDispatchEvent("listening",{})}getAddrs(){return[...this.listeningAddrs.values()].flat()}async close(){}#e(e){let t=this.listeningAddrs.has(e);c1("relay peer removed %p - had reservation",e,t),this.listeningAddrs.delete(e),t&&(c1.trace("removing relay event listener for peer %p",e),this.relayStore.removeEventListener("relay:removed",this._onRemoveRelayPeer),this.safeDispatchEvent("close",{}))}};function $A(r){return new Xg(r)}var Tr=D("libp2p:circuit-relay:transport:reservation-store"),F$=60*1e3*10,K$=60*1e3*5,V$=30*1e3,l1=class extends Fe{peerId;connectionManager;transportManager;peerStore;events;reserveQueue;reservations;maxDiscoveredRelays;maxReservationQueueLength;reservationCompletionTimeout;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 dr,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.reservationCompletionTimeout=t?.reservationCompletionTimeout??1e4,this.started=!1,this.reserveQueue=new ec({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.reserveQueue.clear(),this.reservations.forEach(({timeout:e})=>{clearTimeout(e)}),this.reservations.clear(),this.started=!1}async addRelay(e,t){if(this.peerId.equals(e)){Tr("not trying to use self as relay");return}if(this.reserveQueue.size>this.maxReservationQueueLength){Tr("not adding relay as the queue is full");return}if(this.reserveQueue.hasJob(e)){Tr("relay peer is already in the reservation queue");return}Tr("add relay %p",e),await this.reserveQueue.add(async()=>{try{let n=this.reservations.get(e);if(n!=null){if(Yg(n.reservation.expire)>F$){Tr("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((u,f)=>(f.type==="discovered"&&u++,u),0)>=this.maxDiscoveredRelays){Tr("already have enough discovered relays");return}let i=AbortSignal.timeout(this.reservationCompletionTimeout),s=await this.connectionManager.openConnection(e,{signal:i});if(s.remoteAddr.protoNames().includes("p2p-circuit")){Tr("not creating reservation over relayed connection");return}let o=await this.#e(s,{signal:i});Tr("created reservation on relay peer %p",e);let a=Yg(o.expire),c=Math.min(Math.max(a-K$,V$),Math.pow(2,31)-1),l=setTimeout(()=>{this.addRelay(e,t).catch(u=>{Tr.error("could not refresh reservation to relay %p",e,u)})},c);this.reservations.set(e,{timeout:l,reservation:o,type:t}),await this.peerStore.merge(e,{tags:{[MA]:{value:1,ttl:a}}}),await this.transportManager.listen([oe(`/p2p/${e.toString()}/p2p-circuit`)])}catch(n){Tr.error("could not reserve slot on %p",e,n);let i=this.reservations.get(e);i!=null&&clearTimeout(i.timeout),this.reservations.delete(e)}},{peerId:e})}hasReservation(e){return this.reservations.has(e)}getReservation(e){return this.reservations.get(e)?.reservation}async#e(e,t){t.signal?.throwIfAborted(),Tr("requesting reservation from %p",e.remotePeer);let n=await e.newStream(Ys,t),s=Jt(n).pb(ts);await s.write({type:ts.Type.RESERVE},t);let o;try{o=await s.read(t)}catch(c){throw Tr.error("error parsing reserve message response from %p because",e.remotePeer,c),c}finally{await n.close()}if(o.status===Ft.OK&&o.reservation!=null)return o.reservation;let a=`reservation failed with status ${o.status??"undefined"}`;throw Tr.error(a),new Error(a)}#t(e){let t=this.reservations.get(e);t!=null&&(Tr("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&&(Tr("not enough relays %d/%d",this.reservations.size,this.maxDiscoveredRelays),this.safeDispatchEvent("relay:not-enough-relays",{})))}};var gr=D("libp2p:circuit-relay:transport"),q$=r=>{if(r.peer==null)return!1;try{r.peer.addrs.forEach(oe)}catch{return!1}return!0},jg={maxInboundStopStreams:Ps,maxOutboundStopStreams:Ps,stopTimeout:3e4},Zg=class{discovery;registrar;peerStore;connectionManager;peerId;upgrader;addressManager;connectionGater;reservationStore;maxInboundStopStreams;maxOutboundStopStreams;stopTimeout;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??jg.maxInboundStopStreams,this.maxOutboundStopStreams=t.maxOutboundStopStreams??jg.maxOutboundStopStreams,this.stopTimeout=t.stopTimeout??jg.stopTimeout,t.discoverRelays!=null&&t.discoverRelays>0&&(this.discovery=new a1(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 l1(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(s1,e=>{this.onStop(e).catch(t=>{gr.error("error while handling STOP protocol",t),e.stream.abort(t)})},{maxInboundStreams:this.maxInboundStopStreams,maxOutboundStreams:this.maxOutboundStopStreams,runOnTransientConnection:!0}),this.started=!0}async stop(){this.discovery?.stop(),await this.reservationStore.stop(),await this.registrar.unhandle(s1),this.started=!1}[gi]=!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,$.ERR_RELAYED_DIAL)}let n=e.toString().split("/p2p-circuit"),i=oe(n[0]),s=oe(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,$.ERR_RELAYED_DIAL)}let c=ce(o),l=ce(a),u=!1,h=this.connectionManager.getConnections(c)[0];h==null&&(await this.peerStore.merge(c,{multiaddrs:[i]}),h=await this.connectionManager.openConnection(c,t),u=!0);let d;try{return d=await h.newStream([Ys]),await this.connectV2({stream:d,connection:h,destinationPeer:l,destinationAddr:s,relayAddr:i,ma:e,disconnectOnFailure:u})}catch(p){throw gr.error("circuit relay dial to destination %p via relay %p failed",l,c,p),d?.abort(p),u&&await h.close(),p}}async connectV2({stream:e,connection:t,destinationPeer:n,destinationAddr:i,relayAddr:s,ma:o,disconnectOnFailure:a}){try{let c=Jt(e),l=c.pb(ts);await l.write({type:ts.Type.CONNECT,peer:{id:n.toBytes(),addrs:[oe(i).bytes]}});let u=await l.read();if(u.status!==Ft.OK)throw new b(`failed to connect via relay with status ${u?.status?.toString()??"undefined"}`,$.ERR_HOP_REQUEST_FAILED);let f=Qg({stream:c.unwrap(),remoteAddr:o,localAddr:s.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`)});return gr("new outbound transient connection %a",f.remoteAddr),await this.upgrader.upgradeOutbound(f,{transient:!0})}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 $A({connectionManager:this.connectionManager,relayStore:this.reservationStore})}filter(e){return e=Array.isArray(e)?e:[e],e.filter(t=>Zn.matches(t))}async onStop({connection:e,stream:t}){let n=AbortSignal.timeout(this.stopTimeout),i=Jt(t).pb(ti),s=await i.read({signal:n});if(gr("new circuit relay v2 stop stream from %p with type %s",e.remotePeer,s.type),s?.type===void 0){gr.error("type was missing from circuit v2 stop protocol request from %s",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.MALFORMED_MESSAGE},{signal:n}),await t.close();return}if(s.type!==ti.Type.CONNECT){gr.error("invalid stop connect request via peer %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.UNEXPECTED_MESSAGE},{signal:n}),await t.close();return}if(!q$(s)){gr.error("invalid stop connect request via peer %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.MALFORMED_MESSAGE},{signal:n}),await t.close();return}let o=dt(s.peer.id);if(await this.connectionGater.denyInboundRelayedConnection?.(e.remotePeer,o)===!0){gr.error("connection gater denied inbound relayed connection from %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.PERMISSION_DENIED},{signal:n}),await t.close();return}gr.trace("sending success response to %p",e.remotePeer),await i.write({type:ti.Type.STATUS,status:Ft.OK},{signal:n});let a=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${o.toString()}`),c=this.addressManager.getAddresses()[0],l=Qg({stream:i.unwrap().unwrap(),remoteAddr:a,localAddr:c});gr("new inbound transient connection %a",l.remoteAddr),await this.upgrader.upgradeInbound(l,{transient:!0}),gr("%s connection %a upgraded","inbound",l.remoteAddr)}};function Jg(r={}){return e=>new Zg(e,r)}var HA=()=>{let r=new Error("Delay aborted");return r.name="AbortError",r},z$=new WeakMap;function $$({clearTimeout:r,setTimeout:e}={}){return(t,{value:n,signal:i}={})=>{if(i?.aborted)return Promise.reject(HA());let s,o,a,c=r??clearTimeout,l=()=>{c(s),a(HA())},u=()=>{i&&i.removeEventListener("abort",l)},f=new Promise((h,d)=>{o=()=>{u(),h(n)},a=d,s=(e??setTimeout)(o,t)});return i&&i.addEventListener("abort",l,{once:!0}),z$.set(f,()=>{c(s),s=null,o()}),f}}var H$=$$(),WA=H$;var ri;(function(r){let e;(function(i){i.UNUSED="UNUSED",i.CONNECT="CONNECT",i.SYNC="SYNC"})(e=r.Type||(r.Type={}));let t;(function(i){i[i.UNUSED=0]="UNUSED",i[i.CONNECT=100]="CONNECT",i[i.SYNC=300]="SYNC"})(t||(t={})),function(i){i.codec=()=>ut(t)}(e=r.Type||(r.Type={}));let n;r.codec=()=>(n==null&&(n=fe((i,s,o={})=>{if(o.lengthDelimited!==!1&&s.fork(),i.type!=null&&(s.uint32(8),r.Type.codec().encode(i.type,s)),i.observedAddresses!=null)for(let a of i.observedAddresses)s.uint32(18),s.bytes(a);o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={observedAddresses:[]},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.observedAddresses.push(i.bytes());break;default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ue(i,r.codec()),r.decode=i=>le(i,r.codec())})(ri||(ri={}));var pt=D("libp2p:dcutr"),GA=1024*4,YA=100,u1={timeout:5e3,retries:3,maxInboundStreams:1,maxOutboundStreams:1},f1=class{started;timeout;retries;maxInboundStreams;maxOutboundStreams;peerStore;registrar;connectionManager;addressManager;transportManager;topologyId;constructor(e,t){this.started=!1,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.timeout=t.timeout??u1.timeout,this.retries=t.retries??u1.retries,this.maxInboundStreams=t.maxInboundStreams??u1.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??u1.maxOutboundStreams}isStarted(){return this.started}async start(){this.started||(this.topologyId=await this.registrar.register(Lu,{onConnect:(e,t)=>{t.transient&&t.direction==="inbound"&&this.upgradeInbound(t).catch(n=>{pt.error("error during outgoing DCUtR attempt",n)})}}),await this.registrar.handle(Lu,e=>{this.handleIncomingUpgrade(e.stream,e.connection).catch(t=>{pt.error("error during incoming DCUtR attempt",t),e.stream.abort(t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:!0}),this.started=!0)}async stop(){await this.registrar.unhandle(Lu),this.topologyId!=null&&this.registrar.unregister(this.topologyId),this.started=!1}async upgradeInbound(e){if(await this.attemptUnilateralConnectionUpgrade(e))return;let t;for(let n=0;n<this.retries;n++){let i={signal:AbortSignal.timeout(this.timeout)};try{t=await e.newStream([Lu],{signal:i.signal,runOnTransientConnection:!0});let s=Jt(t,{maxDataLength:GA}).pb(ri);pt("B sending connect to %p",e.remotePeer);let o=Date.now();await s.write({type:ri.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map(f=>f.bytes)},i),pt("B receiving connect from %p",e.remotePeer);let a=await s.read(i);if(a.type!==ri.Type.CONNECT)throw pt("A sent wrong message type"),new b("DCUtR message type was incorrect",$.ERR_INVALID_MESSAGE);let c=this.getDialableMultiaddrs(a.observedAddresses);if(c.length===0)throw pt("A did not have any dialable multiaddrs"),new b("DCUtR connect message had no multiaddrs",$.ERR_INVALID_MESSAGE);let l=Date.now()-o;pt("A sending sync, rtt %dms",l),await s.write({type:ri.Type.SYNC,observedAddresses:[]},i),pt("A waiting for half RTT"),await WA(l/2),pt("B dialing",c);let u=await this.connectionManager.openConnection(c,{signal:i.signal,priority:YA});pt("DCUtR to %p succeeded to address %a, closing relayed connection",e.remotePeer,u.remoteAddr),await e.close(i);break}catch(s){if(pt.error("error while attempting DCUtR on attempt %d of %d",n+1,this.retries,s),t?.abort(s),n===this.retries)throw s}finally{t!=null&&await t.close(i)}}}async attemptUnilateralConnectionUpgrade(e){let n=(await this.peerStore.get(e.remotePeer)).addresses.map(i=>{let s=i.multiaddr;return s.getPeerId()==null?s.encapsulate(`/p2p/${e.remotePeer}`):s}).filter(i=>this.isPublicAndDialable(i));if(n.length>0){let i=AbortSignal.timeout(this.timeout);try{pt("attempting unilateral connection upgrade to %a",n);let s=await this.connectionManager.openConnection(n,{signal:i,force:!0});if(s.transient)throw new Error("Could not open a new, non-transient, connection");return pt("unilateral connection upgrade to %p succeeded via %a, closing relayed connection",e.remotePeer,s.remoteAddr),await e.close({signal:i}),!0}catch(s){pt.error("unilateral connection upgrade to %p on addresses %a failed",e.remotePeer,n,s)}}else pt("peer %p has no public addresses, not attempting unilateral connection upgrade",e.remotePeer);return!1}async handleIncomingUpgrade(e,t){let n={signal:AbortSignal.timeout(this.timeout)};try{let i=Jt(e,{maxDataLength:GA}).pb(ri);pt("A receiving connect");let s=await i.read(n);if(s.type!==ri.Type.CONNECT)throw pt("B sent wrong message type"),new b("DCUtR message type was incorrect",$.ERR_INVALID_MESSAGE);if(s.observedAddresses.length===0)throw pt("B sent no multiaddrs"),new b("DCUtR connect message had no multiaddrs",$.ERR_INVALID_MESSAGE);let o=this.getDialableMultiaddrs(s.observedAddresses);if(o.length===0)throw pt("B had no dialable multiaddrs"),new b("DCUtR connect message had no dialable multiaddrs",$.ERR_INVALID_MESSAGE);if(pt("A sending connect"),await i.write({type:ri.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map(l=>l.bytes)}),pt("A receiving sync"),(await i.read(n)).type!==ri.Type.SYNC)throw new b("DCUtR message type was incorrect",$.ERR_INVALID_MESSAGE);pt("A dialing",o);let c=await this.connectionManager.openConnection(o,{signal:n.signal,priority:YA,force:!0});pt("DCUtR to %p succeeded via %a, closing relayed connection",t.remotePeer,c.remoteAddr),await t.close(n)}catch(i){pt.error("incoming DCUtR from %p failed",t.remotePeer,i),e.abort(i)}finally{await e.close(n)}}getDialableMultiaddrs(e){let t=[];for(let n of e)if(!(n==null||n.length===0))try{let i=oe(n);if(!this.isPublicAndDialable(i))continue;t.push(i)}catch{}return t}isPublicAndDialable(e){if(Wl.matches(e))return!1;if(Uw.matches(e))return!0;if(!qw.matches(e)||this.transportManager.transportForMultiaddr(e)==null)return!1;let n=e.toOptions();return Br(n.host)===!1}};var Lu="/libp2p/dcutr";function QA(r={}){return e=>new f1(e,r)}var XA="0.46.16";var e8=`js-libp2p/${XA}`;var jA="0.1.0",ZA="id",JA="id/push",eT="1.0.0",tT="1.0.0";var r8=se(kr(),1);var Xs;(function(r){let e;r.codec=()=>(e==null&&(e=fe((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=>ue(t,r.codec()),r.decode=t=>le(t,r.codec())})(Xs||(Xs={}));var yr=D("libp2p:identify"),t8=1024*8,cn={protocolPrefix:"ipfs",agentVersion:e8,timeout:6e4,maxInboundStreams:1,maxOutboundStreams:1,maxPushIncomingStreams:1,maxPushOutgoingStreams:1,maxObservedAddresses:10,maxIdentifyMessageSize:8192,runOnConnectionOpen:!0,runOnTransientConnection:!0},h1=class{identifyProtocolStr;identifyPushProtocolStr;host;started;timeout;peerId;peerStore;registrar;connectionManager;addressManager;maxInboundStreams;maxOutboundStreams;maxPushIncomingStreams;maxPushOutgoingStreams;maxIdentifyMessageSize;maxObservedAddresses;events;runOnTransientConnection;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??cn.protocolPrefix}/${ZA}/${eT}`,this.identifyPushProtocolStr=`/${t.protocolPrefix??cn.protocolPrefix}/${JA}/${tT}`,this.timeout=t.timeout??cn.timeout,this.maxInboundStreams=t.maxInboundStreams??cn.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??cn.maxOutboundStreams,this.maxPushIncomingStreams=t.maxPushIncomingStreams??cn.maxPushIncomingStreams,this.maxPushOutgoingStreams=t.maxPushOutgoingStreams??cn.maxPushOutgoingStreams,this.maxIdentifyMessageSize=t.maxIdentifyMessageSize??cn.maxIdentifyMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??cn.maxObservedAddresses,this.runOnTransientConnection=t.runOnTransientConnection??cn.runOnTransientConnection,this.host={protocolVersion:`${t.protocolPrefix??cn.protocolPrefix}/${jA}`,agentVersion:t.agentVersion??cn.agentVersion},(t.runOnConnectionOpen??cn.runOnConnectionOpen)&&e.events.addEventListener("connection:open",n=>{let i=n.detail;this.identify(i).catch(s=>{yr.error("error during identify trigged by connection:open",s)})}),e.events.addEventListener("self:peer:update",n=>{this.push().catch(i=>{yr.error(i)})}),this.host.agentVersion===e8&&(oA||iA?this.host.agentVersion+=` UserAgent=${globalThis.process.version}`:(e1||t1||sA||aA)&&(this.host.agentVersion+=` UserAgent=${globalThis.navigator.userAgent}`))}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:Q(this.host.agentVersion),ProtocolVersion:Q(this.host.protocolVersion)}}),await this.registrar.handle(this.identifyProtocolStr,e=>{this._handleIdentify(e).catch(t=>{yr.error(t)})},{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),await this.registrar.handle(this.identifyPushProtocolStr,e=>{this._handlePush(e).catch(t=>{yr.error(t)})},{maxInboundStreams:this.maxPushIncomingStreams,maxOutboundStreams:this.maxPushOutgoingStreams,runOnTransientConnection:this.runOnTransientConnection}),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(ge("p2p").code)),n=new Zr({peerId:this.peerId,multiaddrs:t}),i=await wn.seal(n,this.peerId),s=this.registrar.getProtocols(),o=await this.peerStore.get(this.peerId),a=H(o.metadata.get("AgentVersion")??Q(this.host.agentVersion)),c=H(o.metadata.get("ProtocolVersion")??Q(this.host.protocolVersion)),l=e.map(async u=>{let f,h=AbortSignal.timeout(this.timeout);try{(0,r8.setMaxListeners)?.(1/0,h)}catch{}try{f=await u.newStream([this.identifyPushProtocolStr],{signal:h,runOnTransientConnection:this.runOnTransientConnection}),await Jt(f,{maxDataLength:this.maxIdentifyMessageSize??t8}).pb(Xs).write({listenAddrs:t.map(p=>p.bytes),signedPeerRecord:i.marshal(),protocols:s,agentVersion:a,protocolVersion:c},{signal:h}),await f.close({signal:h})}catch(d){yr.error("could not push identify update to peer",d),f?.abort(d)}});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!==$.ERR_NOT_FOUND)throw n}})),await this.pushToConnections(e)}async _identify(e,t={}){let n;t.signal=t.signal??AbortSignal.timeout(this.timeout);try{n=await e.newStream([this.identifyProtocolStr],{...t,runOnTransientConnection:this.runOnTransientConnection});let s=await Jt(n,{maxDataLength:this.maxIdentifyMessageSize??t8}).pb(Xs).read(t);return await n.close(t),s}catch(i){throw yr.error("error while reading identify message",i),n?.abort(i),i}}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",$.ERR_MISSING_PUBLIC_KEY);let a=await hr(i);if(!e.remotePeer.equals(a))throw new b("identified peer does not match the expected peer",$.ERR_INVALID_PEER);if(this.peerId.equals(a))throw new b("identified peer is our own peer id?",$.ERR_INVALID_PEER);let c=W$(o);yr("identify completed for peer %p and protocols %o",a,s),yr("our observed address is %a",c),c!=null&&this.addressManager.getObservedAddrs().length<(this.maxObservedAddresses??1/0)&&(yr("storing our observed address %a",c),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(f=>oe(f)),observedAddr:n.observedAddr==null?void 0:oe(n.observedAddr),protocols:n.protocols,signedPeerRecord:l};return this.events.safeDispatchEvent("peer:identify",{detail:u}),u}async _handleIdentify(e){let{connection:t,stream:n}=e,i=AbortSignal.timeout(this.timeout);try{(0,r8.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(u=>u.decapsulateCode(ge("p2p").code)),c=o.peerRecordEnvelope;if(a.length>0&&c==null){let u=new Zr({peerId:this.peerId,multiaddrs:a});c=(await wn.seal(u,this.peerId)).marshal().subarray()}await Jt(n).pb(Xs).write({protocolVersion:this.host.protocolVersion,agentVersion:this.host.agentVersion,publicKey:s,listenAddrs:a.map(u=>u.bytes),signedPeerRecord:c,observedAddr:t.remoteAddr.bytes,protocols:o.protocols},{signal:i}),await n.close({signal:i})}catch(s){yr.error("could not respond to identify request",s),n.abort(s)}}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={signal:AbortSignal.timeout(this.timeout)},o=await Jt(n,{maxDataLength:this.maxIdentifyMessageSize??t8}).pb(Xs).read(i);await n.close(i),await this.#e(t.remotePeer,o)}catch(i){yr.error("received invalid message",i),n.abort(i);return}yr("handled push from %p",t.remotePeer)}async#e(e,t){if(yr("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:oe(s)})),protocols:t.protocols,metadata:new Map,peerRecordEnvelope:t.signedPeerRecord},i;if(t.signedPeerRecord!=null){yr("received signedPeerRecord in push from %p",e);let s=t.signedPeerRecord,o=await wn.openAndCertify(s,Zr.DOMAIN),a=Zr.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 wn.createFromProtobuf(c.peerRecordEnvelope),u=Zr.createFromProtobuf(l.payload);u.seqNumber>=a.seqNumber&&(yr("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 yr("%p did not send a signed peer record",e);return t.agentVersion!=null&&n.metadata.set("AgentVersion",Q(t.agentVersion)),t.protocolVersion!=null&&n.metadata.set("ProtocolVersion",Q(t.protocolVersion)),await this.peerStore.patch(e,n),i}};function W$(r){if(r!=null&&r.length>0)try{return oe(r)}catch{}}function rT(r={}){return e=>new h1(e,r)}var nT="1.0.0",iT="ping",sT="ipfs";var Bc=D("libp2p:ping"),n8=class{protocol;components;started;timeout;maxInboundStreams;maxOutboundStreams;runOnTransientConnection;constructor(e,t){this.components=e,this.started=!1,this.protocol=`/${t.protocolPrefix??sT}/${iT}/${nT}`,this.timeout=t.timeout??1e4,this.maxInboundStreams=t.maxInboundStreams??2,this.maxOutboundStreams=t.maxOutboundStreams??1,this.runOnTransientConnection=t.runOnTransientConnection??!0}async start(){await this.components.registrar.handle(this.protocol,this.handleMessage,{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),this.started=!0}async stop(){await this.components.registrar.unhandle(this.protocol),this.started=!1}isStarted(){return this.started}handleMessage(e){Bc("incoming ping from %p",e.connection.remotePeer);let{stream:t}=e,n=Date.now();Te(t,t).catch(i=>{Bc.error("incoming ping from %p failed with error",e.connection.remotePeer,i)}).finally(()=>{let i=Date.now()-n;Bc("incoming ping from %p complete in %dms",e.connection.remotePeer,i)})}async ping(e,t={}){Bc("pinging %p",e);let n=Date.now(),i=Or(32),s=await this.components.connectionManager.openConnection(e,t),o,a=()=>{};t.signal=t.signal??AbortSignal.timeout(this.timeout);try{o=await s.newStream(this.protocol,{...t,runOnTransientConnection:this.runOnTransientConnection}),a=()=>{o?.abort(new b("ping timeout",$.ERR_TIMEOUT))},t.signal.addEventListener("abort",a,{once:!0});let c=await Te([i],o,async u=>Gn(u)),l=Date.now()-n;if(c==null)throw new b(`Did not receive a ping ack after ${l}ms`,$.ERR_WRONG_PING_ACK);if(!pe(i,c.subarray()))throw new b(`Received wrong ping ack after ${l}ms`,$.ERR_WRONG_PING_ACK);return Bc("ping %p complete in %dms",s.remotePeer,l),l}catch(c){throw Bc.error("error while pinging %p",s.remotePeer,c),o?.abort(c),c}finally{t.signal.removeEventListener("abort",a),o!=null&&await o.close()}}};function oT(r={}){return e=>new n8(e,r)}var aT={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 cT(){return{addresses:{listen:["/webrtc"]},transports:[Jg({discoverRelays:1}),PI(),CI(),yA(),pA()],connectionEncryption:[dc()],streamMuxers:[C_(),US()],peerDiscovery:[q_(aT)],contentRouters:[Q_("https://cid.contact")],services:{identify:rT(),autoNAT:BA(),pubsub:Fv(),dcutr:QA(),dht:AS({clientMode:!0,validators:{ipns:kA},selectors:{ipns:PA}}),ping:oT()}}}async function lT(r,e){let t=cT();return e=e??{},dx({datastore:r,...t,...e,start:!1})}var uT="2.0.3-dbbee17",fT="helia";var j$=D("helia");async function Z$(r={}){let e=r.datastore??new to,t=r.blockstore??new qc,n;J$(r.libp2p)?n=r.libp2p:n=await lT(e,r.libp2p);let i=new q0({...r,datastore:e,blockstore:t,libp2p:n});return r.start!==!1&&await i.start(),eH(i),i}function J$(r){return r==null?!1:["dial","dialProtocol","hangUp","handle","unhandle","getMultiaddrs","getProtocols"].every(t=>typeof r[t]=="function")}function eH(r){try{if(r.libp2p.services.identify.host.agentVersion.match(/js-libp2p\/\d+\.\d+\.\d+\sUserAgent=/)==null)return;r.libp2p.services.identify.host.agentVersion=`${fT}/${uT} ${r.libp2p.services.identify.host.agentVersion}`}catch(e){j$.error("could not add Helia to agent version",e)}}return Mu(tH);})();
|
|
86
86
|
/*! Bundled license information:
|
|
87
87
|
|
|
88
88
|
@noble/hashes/esm/utils.js:
|
package/dist/src/version.d.ts
CHANGED
package/dist/src/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "helia",
|
|
3
|
-
"version": "2.0.3-
|
|
3
|
+
"version": "2.0.3-dbbee17",
|
|
4
4
|
"description": "An implementation of IPFS in JavaScript",
|
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
|
6
6
|
"homepage": "https://github.com/ipfs/helia/tree/master/packages/helia#readme",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
"@chainsafe/libp2p-gossipsub": "^10.0.0",
|
|
78
78
|
"@chainsafe/libp2p-noise": "^13.0.0",
|
|
79
79
|
"@chainsafe/libp2p-yamux": "^5.0.0",
|
|
80
|
-
"@helia/interface": "2.0.0-
|
|
80
|
+
"@helia/interface": "2.0.0-dbbee17",
|
|
81
81
|
"@ipld/dag-cbor": "^9.0.0",
|
|
82
82
|
"@ipld/dag-json": "^10.0.1",
|
|
83
83
|
"@ipld/dag-pb": "^4.0.3",
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
"aegir": "^41.0.0",
|
|
121
121
|
"delay": "^6.0.0",
|
|
122
122
|
"sinon": "^17.0.0",
|
|
123
|
-
"sinon-ts": "^
|
|
123
|
+
"sinon-ts": "^2.0.0"
|
|
124
124
|
},
|
|
125
125
|
"browser": {
|
|
126
126
|
"./dist/src/utils/libp2p-defaults.js": "./dist/src/utils/libp2p-defaults.browser.js"
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '2.0.3-
|
|
1
|
+
export const version = '2.0.3-dbbee17'
|
|
2
2
|
export const name = 'helia'
|