helia 3.0.0-3f4c6bf → 3.0.0-a0692f9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,13 +11,13 @@
11
11
 
12
12
  > An implementation of IPFS in JavaScript
13
13
 
14
- # About
14
+ ## About
15
15
 
16
16
  Exports a `createHelia` function that returns an object that implements the Helia API.
17
17
 
18
18
  Pass it to other modules like @helia/unixfs to make files available on the distributed web.
19
19
 
20
- ## Example
20
+ ### Example
21
21
 
22
22
  ```typescript
23
23
  import { createHelia } from 'helia'
package/dist/index.min.js CHANGED
@@ -79,7 +79,7 @@ a=candidate:1467250027 1 UDP 1467250027 ${t} ${n} typ host\r
79
79
  a=ice-ufrag:`+e+`
80
80
  `).replace(/\na=ice-pwd:[^\n]*\n/,`
81
81
  a=ice-pwd:`+e+`
82
- `),r}var Lk=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),Bk=r=>[...Array(r)].map(()=>Lk.at(Math.floor(Math.random()*Lk.length))).join("");var zee=1e4,YCe=pe("webrtc-direct").code,Ok=pe("certhash").code,V1=class{log;metrics;components;init;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:webrtc-direct"),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 this.log("dialing address: %a",e),n}createListener(e){throw YC("WebRTCTransport.createListener")}filter(e){return e.filter(DT.exactMatch)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[pi]=!0;async _connect(e,t){let n=new AbortController,i=n.signal,s=e.getPeerId();if(s===null)throw x1("we need to have the remote's PeerId");let o=Se(s),a=v5(K1(e)),c=await Al.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:_5(a.name)}),l=new Al({certificates:[c]});try{let u=new Promise((S,T)=>{let L=l.createDataChannel("",{negotiated:!0,id:0}),O=setTimeout(()=>{let F=`Data channel was never opened: state: ${L.readyState}`;this.log.error(F),this.metrics?.dialerEvents.increment({open_error:!0}),T(V6("data",F))},zee);L.onopen=F=>{clearTimeout(O),S(L)},L.onerror=F=>{clearTimeout(O);let ee=`Error opening a data channel for handshaking: ${F.target?.toString()??"not specified"}`;this.log.error(ee),this.metrics?.dialerEvents.increment({unknown_error:!0}),T(V6("data",ee))}}),h="libp2p+webrtc+v1/"+Bk(32),f=await l.createOffer(),p=Nk(f,h);await l.setLocalDescription(p);let d=kk(e,h);await l.setRemoteDescription(d);let m=await u,g=this.components.peerId,y=this.generateNoisePrologue(l,a.code,e),b=qc({prologueBytes:y})(this.components),w=Il({channel:m,direction:"inbound",logger:this.components.logger,...this.init.dataChannel??{}}),_={...w,sink:w.sink.bind(w),source:async function*(){for await(let S of w.source)for(let T of S)yield T}()},x=new _a(this.components,{peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),v=tf?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(v,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":x.close().catch(S=>{this.log.error("error closing connection",S)}).finally(()=>{n.abort()});break;default:break}},{signal:i}),this.metrics?.dialerEvents.increment({peer_connection:!0});let R=new Sa(this.components,{peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await b.secureInbound(g,_,o),await t.upgrader.upgradeOutbound(x,{skipProtection:!0,skipEncryption:!0,muxerFactory:R})}catch(u){throw l.close(),u}}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw ef("no local certificate");let i=Pk(e,{log:this.log});if(i==null)throw ef("no local fingerprint found");let s=i.trim().toLowerCase().replaceAll(":",""),o=W(s,"hex"),a=Mk.encode(o,t),c=x5.decode(K1(n)),l=W("libp2p-webrtc-noise:");return Ue([l,a,c])}};function Uk(r){return e=>new V1(e,r)}function Fk(r){return e=>new T1(e,r)}function Kk(r){let e;try{e=pe("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function Vk(r){return r.some(([e,t])=>e===pe("tls").code)}function an(r,e,t){let n=qk[pe(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${pe(r).name}`);let i=n(e,t);return r===pe("ip6").code?`[${i}]`:i}var qk={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://${an(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://${an(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`${an(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`${an(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=Vk(e),n=Kk(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=an(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 an(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return an(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=an(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=Vk(e),n=Kk(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=an(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=an(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`${an(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`${an(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`${an(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function zk(r,e){let n=se(r).stringTuples(),i=n.pop();if(i===void 0)throw new Error("Unexpected end of multiaddr");let s=pe(i[0]),o=qk[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]===pe("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 $k=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 Hk=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let i of n){try{await $k(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 Qk=te(Wk(),1);function Yk(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var Xk=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 Qk.EventIterator(({push:o,stop:a,fail:c})=>{let l=h=>{let f=null;typeof h.data=="string"&&(f=W(h.data)),Yk(h.data)&&(f=new Uint8Array(h.data)),h.data instanceof Uint8Array&&(f=h.data),f!=null&&o(f)},u=h=>{c(h.error??new Error("Socket error"))};return r.addEventListener("message",l),r.addEventListener("error",u),r.addEventListener("close",a),()=>{r.removeEventListener("message",l),r.removeEventListener("error",u),r.removeEventListener("close",a)}},{highWaterMark:1/0});await e();for await(let o of s)yield Yk(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 jk=(r,e)=>{e=e??{};let t=Xk(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:Hk(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 Zk=WebSocket;var Hee={"http:":"ws:","https:":"wss:"},Jk="ws:",eN=(r,e)=>{if(r.startsWith("//")&&(r=`${e?.protocol??Jk}${r}`),r.startsWith("/")&&e!=null){let n=e.protocol??Jk,i=e.host,s=e.port!=null&&i?.endsWith(`:${e.port}`)!==!0?`:${e.port}`:"";r=`${n}//${i}${s}${r}`}let t=new URL(r);for(let[n,i]of Object.entries(Hee))t.protocol===n&&(t.protocol=i);return t};function tN(r,e){let t=typeof window>"u"?void 0:window.location;e=e??{};let n=eN(r,t),i=new Zk(n.toString(),e.websocket);return jk(i,e)}function iN(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return dl.matches(t)||ga.matches(t)})}function sN(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return ga.matches(t)})}function oN(){throw new Error("WebSocket Servers can not be created in the browser!")}function aN(r,e,t){let n=t.logger.forComponent("libp2p:websockets:maconn"),i={log:n,async sink(s){try{await r.sink(async function*(){for await(let o of s)o instanceof Uint8Array?yield o:yield o.subarray()}())}catch(o){o.type!=="aborted"&&n.error(o)}},source:r.source,remoteAddr:e,timeline:{open:Date.now()},async close(s={}){let o=Date.now();if(s.signal==null){let c=AbortSignal.timeout(500);s={...s,signal:c}}let a=()=>{let{host:c,port:l}=i.remoteAddr.toOptions();n("timeout closing stream to %s:%s after %dms, destroying it manually",c,l,Date.now()-o),this.abort(new E("Socket close timeout","ERR_SOCKET_CLOSE_TIMEOUT"))};s.signal?.addEventListener("abort",a);try{await r.close()}catch(c){n.error("error closing WebSocket gracefully",c),this.abort(c)}finally{s.signal?.removeEventListener("abort",a),i.timeline.close=Date.now()}},abort(s){let{host:o,port:a}=i.remoteAddr.toOptions();n("timeout closing stream to %s:%s due to error",o,a,s),r.destroy(),i.timeline.close=Date.now()}};return r.socket.addEventListener("close",()=>{i.timeline.close==null&&(i.timeline.close=Date.now())},{once:!0}),i}var I5=class{log;init;logger;constructor(e,t){this.log=e.logger.forComponent("libp2p:websockets"),this.logger=e.logger,this.init=t}[Symbol.toStringTag]="@libp2p/websockets";[pi]=!0;async dial(e,t){this.log("dialing %s",e),t=t??{};let n=await this._connect(e,t),i=aN(n,e,{logger:this.logger});this.log("new outbound connection %s",i.remoteAddr);let s=await t.upgrader.upgradeOutbound(i);return this.log("outbound connection %s upgraded",i.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new Ln;let n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);let i=ge(),s=tN(zk(e),this.init);if(s.socket.addEventListener("error",()=>{let c=new E(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");this.log.error("connection error:",c),i.reject(c)}),t.signal==null)return await Promise.race([s.connected(),i.promise]),this.log("connected %s",e),s;let o,a=new Promise((c,l)=>{if(o=()=>{l(new Ln),s.close().catch(u=>{this.log.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 this.log("connected %s",e),s}createListener(e){return oN({logger:this.logger},{...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):Up||Fp?sN(e):iN(e)}};function cN(r={}){return e=>new I5(e,r)}async function A5(r,e,t,n,i,s){let o=s.forComponent(`libp2p:webtransport:stream:${t}:${e}`),a=r.writable.getWriter(),c=r.readable.getReader();await a.ready;function l(){let d=n.findIndex(m=>m===p);d!==-1&&(n.splice(d,1),p.timeline.close=Date.now(),i?.(p))}let u=!1,h=!1;(async function(){let d=await a.closed.catch(m=>m);if(d!=null){let m=d.message;m.includes("aborted by the remote server")||m.includes("STOP_SENDING")||o.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${d.message}`)}u=!0,u&&h&&l()})().catch(()=>{o.error("WebTransport failed to cleanup closed stream")}),async function(){let d=await c.closed.catch(m=>m);d!=null&&o.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${d.message}`),h=!0,u&&h&&l()}().catch(()=>{o.error("WebTransport failed to cleanup closed stream")});let f=!1,p={id:e,status:"open",writeStatus:"ready",readStatus:"ready",abort(d){u||(a.abort(d).catch(m=>{o.error("could not abort stream",m)}),u=!0),h=!0,this.status="aborted",this.writeStatus="closed",this.readStatus="closed",this.timeline.reset=this.timeline.close=this.timeline.closeRead=this.timeline.closeWrite=Date.now(),l()},async close(d){this.status="closing",await Promise.all([p.closeRead(d),p.closeWrite(d)]),l(),this.status="closed",this.timeline.close=Date.now()},async closeRead(d){if(!h){this.readStatus="closing";try{await c.cancel()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(u=!0)}this.timeline.closeRead=Date.now(),this.readStatus="closed",h=!0}u&&l()},async closeWrite(d){if(!u){u=!0,this.writeStatus="closing";try{await a.close()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(h=!0)}this.timeline.closeWrite=Date.now(),this.writeStatus="closed"}h&&l()},direction:t,timeline:{open:Date.now()},metadata:{},source:async function*(){for(;;){let d=await c.read();if(d.done){h=!0,u&&l();return}yield new ve(d.value)}}(),sink:async function(d){if(f)throw new Error("sink already called on stream");f=!0;try{this.writeStatus="writing";for await(let m of d)if(m instanceof Uint8Array)await a.write(m);else for(let g of m)await a.write(g);this.writeStatus="done"}finally{this.timeline.closeWrite=Date.now(),this.writeStatus="closed",await p.closeWrite()}},log:o};return p}function T5(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}function lN(r,e){return e.filter(n=>!!r.find(i=>me(n,i))).length===e.length}var Yee=Object.values(ln).map(r=>r.decoder).reduce((r,e)=>r.or(e));function Qee(r){return Cn.decode(Yee.decode(r))}function uN(r){if(!Op.matches(r))throw new E("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");let e=r.stringTuples(),t=e.filter(([o,a])=>o===pe("certhash").code).map(([o,a])=>Qee(a??"")),n=e.filter(([o,a])=>o===pe("p2p").code).map(([o,a])=>Se(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 D5=class{log;components;config;metrics;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:webtransport"),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";[pi]=!0;async dial(e,t){t?.signal?.throwIfAborted(),this.log("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}=uN(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,h=!1,f=!1;try{this.metrics?.dialerEvents.increment({pending:!0});let p=new WebTransport(`${i}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(d=>({algorithm:"sha-256",value:d.digest}))});if(l=d=>{if(!u)try{this.metrics?.dialerEvents.increment({[d]:!0}),p.close()}catch(m){this.log.error("error closing wt session",m)}finally{c!=null&&(c.timeline.close=Date.now()),u=!0}},a=()=>{l(h?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",a,{once:!0}),await Promise.race([p.closed,p.ready]),h=!0,this.metrics?.dialerEvents.increment({ready:!0}),p.closed.catch(d=>{this.log.error("error on remote wt session close",d)}).finally(()=>{l("remote_close")}),!await this.authenticateWebTransport(p,n,o,s))throw new Error("Failed to authenticate webtransport");return this.metrics?.dialerEvents.increment({open:!0}),c={close:async()=>{this.log("Closing webtransport"),l("close")},abort:d=>{this.log("aborting webtransport due to passed err",d),l("abort")},remoteAddr:e,timeline:{open:Date.now()},log:this.components.logger.forComponent("libp2p:webtransport:maconn"),...T5()},f=!0,await t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(p),skipProtection:!0})}catch(p){throw this.log.error("caught wt session err",p),l(f?"upgrade_error":h?"noise_error":"ready_error"),p}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 h=await a.read();if(h.value!=null&&(yield h.value),h.done)break}}(),sink:async function(h){for await(let f of h)f instanceof Uint8Array?await o.write(f):await o.write(f.subarray())}},l=qc()(this.components),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch(h=>{this.log.error(`Failed to close authentication stream writer: ${h.message}`)}),a.cancel().catch(h=>{this.log.error(`Failed to close authentication stream reader: ${h.message}`)}),!lN(u?.webtransportCerthashes??[],i.map(h=>h.bytes)))throw new Error("Our certhashes are not a subset of the remote's reported certhashes");return!0}webtransportMuxer(e){let t=0,n=this.config,i=this;return{protocol:"webtransport",createStreamMuxer:s=>{typeof s=="function"&&(s={onIncomingStream:s});let o=[];return async function(){let c=e.incomingBidirectionalStreams.getReader();for(;;){let{done:l,value:u}=await c.read();if(l)break;if(o.length>=n.maxInboundStreams)u.writable.close().catch(h=>{i.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${h.message}`)}),u.readable.cancel().catch(h=>{i.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${h.message}`)});else{let h=await A5(u,String(t++),"inbound",o,s?.onStreamEnd,i.components.logger);o.push(h),s?.onIncomingStream?.(h)}}}().catch(()=>{this.log.error("WebTransport failed to receive incoming stream")}),{protocol:"webtransport",streams:o,newStream:async c=>{let l=await e.createBidirectionalStream(),u=await A5(l,String(t++),s?.direction??"outbound",o,s?.onStreamEnd,i.components.logger);return o.push(u),u},close:async c=>{this.log("Closing webtransport muxer"),await Promise.all(o.map(async l=>l.close(c)))},abort:c=>{this.log("Aborting webtransport muxer with err:",c);for(let l of o)l.abort(c)},...T5()}}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(Op.exactMatch)}};function hN(r={}){return e=>new D5(e,r)}var Vr=te(Ui(),1);var wN=te(Z0(),1);var fN="ERR_IPNS_EXPIRED_RECORD",$1="ERR_UNRECOGNIZED_VALIDITY";var Ss="ERR_SIGNATURE_VERIFICATION",dN="ERR_UNRECOGNIZED_FORMAT";var C5="ERR_UNDEFINED_PARAMETER",pN="ERR_INVALID_RECORD_DATA",mN="ERR_INVALID_VALUE",gN="ERR_INVALID_EMBEDDED_KEY";var yN="ERR_RECORD_TOO_LARGE";var Rs;(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=()=>Ze(t)}(e=r.ValidityType||(r.ValidityType={}));let n;r.codec=()=>(n==null&&(n=le((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=>ce(i,r.codec()),r.decode=i=>ae(i,r.codec())})(Rs||(Rs={}));var P5=Pn("ipns:utils"),Xee=W("/ipns/"),jee=114;function Zee(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 EN=async(r,e)=>{if(e==null||r==null){let n=new Error("one or more of the provided parameters are not defined");throw P5.error(n),(0,Vr.default)(n,C5)}let t;if(e.pubKey!=null){try{t=Lr(e.pubKey)}catch(i){throw P5.error(i),i}if(!(await ir(e.pubKey)).equals(r))throw(0,Vr.default)(new Error("Embedded public key did not match PeerID"),gN)}else r.publicKey!=null&&(t=Lr(r.publicKey));if(t!=null)return t;throw(0,Vr.default)(new Error("no public key is available"),C5)};var xN=r=>{let e=W("ipns-signature:");return Ue([e,r])};function hf(r){let e=Rs.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,Vr.default)(new Error("missing data or signatureV2"),Ss);let t=_N(e.data),n=Jee(t.Value),i;try{i=wN.default.fromDate(Zee(G(t.Validity)))}catch{throw P5.error("unrecognized validity format (not an rfc3339 format)"),(0,Vr.default)(new Error("unrecognized validity format (not an rfc3339 format)"),dN)}if(e.value!=null&&e.signatureV1!=null)return ete(e),{value:n,validityType:Rs.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:Rs.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 vN=r=>nt(r.slice(Xee.length));var _N=r=>{let e=Pr(r);if(e.ValidityType===0)e.ValidityType=Rs.ValidityType.EOL;else throw(0,Vr.default)(new Error("Unknown validity type"),$1);return Number.isInteger(e.Sequence)&&(e.Sequence=BigInt(e.Sequence)),Number.isInteger(e.TTL)&&(e.TTL=BigInt(e.TTL)),e},Jee=r=>{if(r!=null){if(Ga(r))return`/ipns/${r.toCID().toString(Ts)}`;if(r instanceof Uint8Array){let n=G(r);n.startsWith("/")&&(r=n)}let e=r.toString().trim();if(e.startsWith("/")&&e.length>1)return e;let t=Pe.asCID(r);if(t!=null)return t.code===jee?`/ipns/${t.toString(Ts)}`:`/ipfs/${t.toV1().toString()}`;try{return r instanceof Uint8Array?`/ipfs/${Pe.decode(r).toV1().toString()}`:`/ipfs/${Pe.parse(e).toV1().toString()}`}catch{}}throw(0,Vr.default)(new Error("Value must be a valid content path starting with /"),mN)},ete=r=>{if(r.data==null)throw(0,Vr.default)(new Error("Record data is missing"),pN);let e=_N(r.data);if(!me(e.Value,r.value??new Uint8Array(0)))throw(0,Vr.default)(new Error('Field "value" did not match between protobuf and CBOR'),Ss);if(!me(e.Validity,r.validity??new Uint8Array(0)))throw(0,Vr.default)(new Error('Field "validity" did not match between protobuf and CBOR'),Ss);if(e.ValidityType!==r.validityType)throw(0,Vr.default)(new Error('Field "validityType" did not match between protobuf and CBOR'),Ss);if(e.Sequence!==r.sequence)throw(0,Vr.default)(new Error('Field "sequence" did not match between protobuf and CBOR'),Ss);if(e.TTL!==r.ttl)throw(0,Vr.default)(new Error('Field "ttl" did not match between protobuf and CBOR'),Ss)};function SN(r,e){let t=e.map((n,i)=>({record:hf(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 ff=te(Ui(),1);var H1=Pn("ipns:validator"),tte=1024*10,rte=async(r,e)=>{let t=hf(e),n;try{let i=xN(t.data);n=await r.verify(i,t.signatureV2)}catch{n=!1}if(!n)throw H1.error("record signature verification failed"),(0,ff.default)(new Error("record signature verification failed"),Ss);if(t.validityType===Rs.ValidityType.EOL){if(t.validity.toDate().getTime()<Date.now())throw H1.error("record has expired"),(0,ff.default)(new Error("record has expired"),fN)}else if(t.validityType!=null)throw H1.error("unrecognized validity type"),(0,ff.default)(new Error("unrecognized validity type"),$1);H1("ipns record for %b is valid",t.value)};async function RN(r,e){if(e.byteLength>tte)throw(0,ff.default)(new Error("record too large"),yN);let t=vN(r),n=hf(e),i=await EN(t,n);await rte(i,e)}var G1="1.1.1",W1="libp2p";var AN="3.0.0-3f4c6bf",TN="helia";var DN={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 Y1(r={}){return{peerId:r.peerId,addresses:{listen:["/webrtc"]},transports:[z8({discoverRelays:1}),Fk(),Uk(),hN(),cN()],connectionEncryption:[qc()],streamMuxers:[VR(),zC()],peerDiscovery:[oT(DN)],services:{autoNAT:YA(),dcutr:OT(),delegatedRouting:()=>LA("https://delegated-ipfs.dev"),dht:ED({clientMode:!0,validators:{ipns:RN},selectors:{ipns:SN}}),identify:WT({agentVersion:`${TN}/${AN} ${W1}/${G1} UserAgent=${globalThis.navigator.userAgent}`}),keychain:m1(r.keychain),ping:WC(),pubsub:WS()}}}var lr={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var Ml;(function(r){let e;(function(i){let s;i.codec=()=>(s==null&&(s=le((o,a,c={})=>{c.lengthDelimited!==!1&&a.fork(),o.key!=null&&o.key!==""&&(a.uint32(10),a.string(o.key)),o.value!=null&&o.value.byteLength>0&&(a.uint32(18),a.bytes(o.value)),c.lengthDelimited!==!1&&a.ldelim()},(o,a)=>{let c={key:"",value:new Uint8Array(0)},l=a==null?o.len:o.pos+a;for(;o.pos<l;){let u=o.uint32();switch(u>>>3){case 1:c.key=o.string();break;case 2:c.value=o.bytes();break;default:o.skipType(u&7);break}}return c})),s),i.encode=o=>ce(o,i.codec()),i.decode=o=>ae(o,i.codec())})(e=r.Peer$metadataEntry||(r.Peer$metadataEntry={}));let t;(function(i){let s;i.codec=()=>(s==null&&(s=le((o,a,c={})=>{c.lengthDelimited!==!1&&a.fork(),o.key!=null&&o.key!==""&&(a.uint32(10),a.string(o.key)),o.value!=null&&(a.uint32(18),X1.codec().encode(o.value,a)),c.lengthDelimited!==!1&&a.ldelim()},(o,a)=>{let c={key:""},l=a==null?o.len:o.pos+a;for(;o.pos<l;){let u=o.uint32();switch(u>>>3){case 1:c.key=o.string();break;case 2:c.value=X1.codec().decode(o,o.uint32());break;default:o.skipType(u&7);break}}return c})),s),i.encode=o=>ce(o,i.codec()),i.decode=o=>ae(o,i.codec())})(t=r.Peer$tagsEntry||(r.Peer$tagsEntry={}));let n;r.codec=()=>(n==null&&(n=le((i,s,o={})=>{if(o.lengthDelimited!==!1&&s.fork(),i.addresses!=null)for(let a of i.addresses)s.uint32(10),Q1.codec().encode(a,s);if(i.protocols!=null)for(let a of i.protocols)s.uint32(18),s.string(a);if(i.publicKey!=null&&(s.uint32(34),s.bytes(i.publicKey)),i.peerRecordEnvelope!=null&&(s.uint32(42),s.bytes(i.peerRecordEnvelope)),i.metadata!=null&&i.metadata.size!==0)for(let[a,c]of i.metadata.entries())s.uint32(50),r.Peer$metadataEntry.codec().encode({key:a,value:c},s);if(i.tags!=null&&i.tags.size!==0)for(let[a,c]of i.tags.entries())s.uint32(58),r.Peer$tagsEntry.codec().encode({key:a,value:c},s);o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={addresses:[],protocols:[],metadata:new Map,tags:new Map},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.addresses.push(Q1.codec().decode(i,i.uint32()));break;case 2:o.protocols.push(i.string());break;case 4:o.publicKey=i.bytes();break;case 5:o.peerRecordEnvelope=i.bytes();break;case 6:{let l=r.Peer$metadataEntry.codec().decode(i,i.uint32());o.metadata.set(l.key,l.value);break}case 7:{let l=r.Peer$tagsEntry.codec().decode(i,i.uint32());o.tags.set(l.key,l.value);break}default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ce(i,r.codec()),r.decode=i=>ae(i,r.codec())})(Ml||(Ml={}));var Q1;(function(r){let e;r.codec=()=>(e==null&&(e=le((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.multiaddr!=null&&t.multiaddr.byteLength>0&&(n.uint32(10),n.bytes(t.multiaddr)),t.isCertified!=null&&(n.uint32(16),n.bool(t.isCertified)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={multiaddr:new Uint8Array(0)},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.multiaddr=t.bytes();break;case 2:i.isCertified=t.bool();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ce(t,r.codec()),r.decode=t=>ae(t,r.codec())})(Q1||(Q1={}));var X1;(function(r){let e;r.codec=()=>(e==null&&(e=le((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.value!=null&&t.value!==0&&(n.uint32(8),n.uint32(t.value)),t.expiry!=null&&(n.uint32(16),n.uint64(t.expiry)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={value:0},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.value=t.uint32();break;case 2:i.expiry=t.uint64();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ce(t,r.codec()),r.decode=t=>ae(t,r.codec())})(X1||(X1={}));function Ul(r,e){let t=Ml.decode(e);t.publicKey!=null&&r.publicKey==null&&(r=mE({...r,publicKey:r.publicKey}));let n=new Map,i=BigInt(Date.now());for(let[s,o]of t.tags.entries())o.expiry!=null&&o.expiry<i||n.set(s,o);return{...t,id:r,addresses:t.addresses.map(({multiaddr:s,isCertified:o})=>({multiaddr:se(s),isCertified:o??!1})),metadata:t.metadata,peerRecordEnvelope:t.peerRecordEnvelope??void 0,tags:n}}var k5="/peers/";function Fl(r){if(!Ga(r)||r.type==null)throw new E("Invalid PeerId",lr.ERR_INVALID_PARAMETERS);let e=r.toCID().toString();return new Xe(`${k5}${e}`)}async function CN(r,e,t){let n=new Map;for(let i of t){if(i==null)continue;if(i.multiaddr instanceof Uint8Array&&(i.multiaddr=se(i.multiaddr)),!ao(i.multiaddr))throw new E("Multiaddr was invalid",lr.ERR_INVALID_PARAMETERS);if(!await e(r,i.multiaddr))continue;let s=i.isCertified??!1,o=i.multiaddr.toString(),a=n.get(o);a!=null?i.isCertified=a.isCertified||s:n.set(o,{multiaddr:i.multiaddr,isCertified:s})}return[...n.values()].sort((i,s)=>i.multiaddr.toString().localeCompare(s.multiaddr.toString())).map(({isCertified:i,multiaddr:s})=>({isCertified:i,multiaddr:s.bytes}))}async function Z1(r,e,t,n){if(e==null)throw new E("Invalid PeerData",lr.ERR_INVALID_PARAMETERS);if(e.publicKey!=null&&r.publicKey!=null&&!me(e.publicKey,r.publicKey))throw new E("publicKey bytes do not match peer id publicKey bytes",lr.ERR_INVALID_PARAMETERS);let i=n.existingPeer;if(i!=null&&!r.equals(i.id))throw new E("peer id did not match existing peer id",lr.ERR_INVALID_PARAMETERS);let s=i?.addresses??[],o=new Set(i?.protocols??[]),a=i?.metadata??new Map,c=i?.tags??new Map,l=i?.peerRecordEnvelope;if(t==="patch"){if((e.multiaddrs!=null||e.addresses!=null)&&(s=[],e.multiaddrs!=null&&s.push(...e.multiaddrs.map(h=>({isCertified:!1,multiaddr:h}))),e.addresses!=null&&s.push(...e.addresses)),e.protocols!=null&&(o=new Set(e.protocols)),e.metadata!=null){let h=e.metadata instanceof Map?[...e.metadata.entries()]:Object.entries(e.metadata);a=j1(h,{validate:PN})}if(e.tags!=null){let h=e.tags instanceof Map?[...e.tags.entries()]:Object.entries(e.tags);c=j1(h,{validate:kN,map:NN})}e.peerRecordEnvelope!=null&&(l=e.peerRecordEnvelope)}if(t==="merge"){if(e.multiaddrs!=null&&s.push(...e.multiaddrs.map(h=>({isCertified:!1,multiaddr:h}))),e.addresses!=null&&s.push(...e.addresses),e.protocols!=null&&(o=new Set([...o,...e.protocols])),e.metadata!=null){let h=e.metadata instanceof Map?[...e.metadata.entries()]:Object.entries(e.metadata);for(let[f,p]of h)p==null?a.delete(f):a.set(f,p);a=j1([...a.entries()],{validate:PN})}if(e.tags!=null){let h=e.tags instanceof Map?[...e.tags.entries()]:Object.entries(e.tags),f=new Map(c);for(let[p,d]of h)d==null?f.delete(p):f.set(p,d);c=j1([...f.entries()],{validate:kN,map:NN})}e.peerRecordEnvelope!=null&&(l=e.peerRecordEnvelope)}let u={addresses:await CN(r,n.addressFilter??(async()=>!0),s),protocols:[...o.values()].sort((h,f)=>h.localeCompare(f)),metadata:a,tags:c,publicKey:i?.id.publicKey??e.publicKey??r.publicKey,peerRecordEnvelope:l};return r.type!=="RSA"&&delete u.publicKey,u}function j1(r,e){let t=new Map;for(let[n,i]of r)i!=null&&e.validate(n,i);for(let[n,i]of r.sort(([s],[o])=>s.localeCompare(o)))i!=null&&t.set(n,e.map?.(n,i)??i);return t}function PN(r,e){if(typeof r!="string")throw new E("Metadata key must be a string",lr.ERR_INVALID_PARAMETERS);if(!(e instanceof Uint8Array))throw new E("Metadata value must be a Uint8Array",lr.ERR_INVALID_PARAMETERS)}function kN(r,e){if(typeof r!="string")throw new E("Tag name must be a string",lr.ERR_INVALID_PARAMETERS);if(e.value!=null){if(parseInt(`${e.value}`,10)!==e.value)throw new E("Tag value must be an integer",lr.ERR_INVALID_PARAMETERS);if(e.value<0||e.value>100)throw new E("Tag value must be between 0-100",lr.ERR_INVALID_PARAMETERS)}if(e.ttl!=null){if(parseInt(`${e.ttl}`,10)!==e.ttl)throw new E("Tag ttl must be an integer",lr.ERR_INVALID_PARAMETERS);if(e.ttl<0)throw new E("Tag ttl must be between greater than 0",lr.ERR_INVALID_PARAMETERS)}}function NN(r,e){let t;return e.expiry!=null&&(t=e.expiry),e.ttl!=null&&(t=BigInt(Date.now()+Number(e.ttl))),{value:e.value??0,expiry:t}}function J1(r,e,t){let n=r.toString().split("/")[2],i=Ft.decode(n),s=nt(i),o=t.get(s);if(o!=null)return o;let a=Ul(s,e);return t.set(s,a),a}function nte(r,e){return r==null?{}:{prefix:k5,filters:(r.filters??[]).map(t=>({key:n,value:i})=>t(J1(n,i,e))),orders:(r.orders??[]).map(t=>(n,i)=>t(J1(n.key,n.value,e),J1(i.key,i.value,e)))}}var e2=class{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=_u({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(Fl(e))}async delete(e){if(this.peerId.equals(e))throw new E("Cannot delete self peer",lr.ERR_INVALID_PARAMETERS);await this.datastore.delete(Fl(e))}async load(e){let t=await this.datastore.get(Fl(e));return Ul(e,t)}async save(e,t){let{existingBuf:n,existingPeer:i}=await this.#e(e),s=await Z1(e,t,"patch",{addressFilter:this.addressFilter});return this.#t(e,s,n,i)}async patch(e,t){let{existingBuf:n,existingPeer:i}=await this.#e(e),s=await Z1(e,t,"patch",{addressFilter:this.addressFilter,existingPeer:i});return this.#t(e,s,n,i)}async merge(e,t){let{existingBuf:n,existingPeer:i}=await this.#e(e),s=await Z1(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:i});return this.#t(e,s,n,i)}async*all(e){let t=new $t;for await(let{key:n,value:i}of this.datastore.query(nte(e??{},t))){let s=J1(n,i,t);s.id.equals(this.peerId)||(yield s)}}async#e(e){try{let t=await this.datastore.get(Fl(e)),n=Ul(e,t);return{existingBuf:t,existingPeer:n}}catch(t){if(t.code!=="ERR_NOT_FOUND")throw t}return{}}async#t(e,t,n,i){let s=Ml.encode(t);return n!=null&&me(s,n)?{peer:Ul(e,s),previous:i,updated:!1}:(await this.datastore.put(Fl(e),s),{peer:Ul(e,s),previous:i,updated:!0})}};var t2=class{store;events;peerId;log;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-store"),this.events=e.events,this.peerId=e.peerId,this.store=new e2(e,t)}async forEach(e,t){this.log.trace("forEach await read lock");let n=await this.store.lock.readLock();this.log.trace("forEach got read lock");try{for await(let i of this.store.all(t))e(i)}finally{this.log.trace("forEach release read lock"),n()}}async all(e){this.log.trace("all await read lock");let t=await this.store.lock.readLock();this.log.trace("all got read lock");try{return await Ql(this.store.all(e))}finally{this.log.trace("all release read lock"),t()}}async delete(e){this.log.trace("delete await write lock");let t=await this.store.lock.writeLock();this.log.trace("delete got write lock");try{await this.store.delete(e)}finally{this.log.trace("delete release write lock"),t()}}async has(e){this.log.trace("has await read lock");let t=await this.store.lock.readLock();this.log.trace("has got read lock");try{return await this.store.has(e)}finally{this.log.trace("has release read lock"),t()}}async get(e){this.log.trace("get await read lock");let t=await this.store.lock.readLock();this.log.trace("get got read lock");try{return await this.store.load(e)}finally{this.log.trace("get release read lock"),t()}}async save(e,t){this.log.trace("save await write lock");let n=await this.store.lock.writeLock();this.log.trace("save got write lock");try{let i=await this.store.save(e,t);return this.#e(e,i),i.peer}finally{this.log.trace("save release write lock"),n()}}async patch(e,t){this.log.trace("patch await write lock");let n=await this.store.lock.writeLock();this.log.trace("patch got write lock");try{let i=await this.store.patch(e,t);return this.#e(e,i),i.peer}finally{this.log.trace("patch release write lock"),n()}}async merge(e,t){this.log.trace("merge await write lock");let n=await this.store.lock.writeLock();this.log.trace("merge got write lock");try{let i=await this.store.merge(e,t);return this.#e(e,i),i.peer}finally{this.log.trace("merge release write lock"),n()}}async consumePeerRecord(e,t){let n=await Sn.openAndCertify(e,nn.DOMAIN);if(t?.equals(n.peerId)===!1)return this.log("envelope peer id was not the expected peer id - expected: %p received: %p",t,n.peerId),!1;let i=nn.createFromProtobuf(n.payload),s;try{s=await this.get(n.peerId)}catch(o){if(o.code!=="ERR_NOT_FOUND")throw o}if(s?.peerRecordEnvelope!=null){let o=await Sn.createFromProtobuf(s.peerRecordEnvelope),a=nn.createFromProtobuf(o.payload);if(a.seqNumber>=i.seqNumber)return this.log("sequence number was lower or equal to existing sequence number - stored: %d received: %d",a.seqNumber,i.seqNumber),!1}return await this.patch(i.peerId,{peerRecordEnvelope:e,addresses:i.multiaddrs.map(o=>({isCertified:!0,multiaddr:o}))}),!0}#e(e,t){t.updated&&(this.peerId.equals(e)?this.events.safeDispatchEvent("self:peer:update",{detail:t}):this.events.safeDispatchEvent("peer:update",{detail:t}))}};function ON(r,e){let t;return function(){let n=function(){t=void 0,r()};clearTimeout(t),t=setTimeout(n,e)}}var ite=r=>r;function N5(r,e){let t=r.getPeerId();return t!=null&&Se(t).equals(e)&&(r=r.decapsulate(se(`/p2p/${e.toString()}`))),r}var r2=class{log;components;listen;announce;observed;announceFilter;constructor(e,t={}){let{listen:n=[],announce:i=[]}=t;this.components=e,this.log=e.logger.forComponent("libp2p:address-manager"),this.listen=n.map(s=>s.toString()),this.announce=new Set(i.map(s=>s.toString())),this.observed=new Map,this.announceFilter=t.announceFilter??ite,this._updatePeerStoreAddresses=ON(this._updatePeerStoreAddresses.bind(this),1e3),e.events.addEventListener("transport:listening",()=>{this._updatePeerStoreAddresses()}),e.events.addEventListener("transport:close",()=>{this._updatePeerStoreAddresses()})}_updatePeerStoreAddresses(){let e=this.getAnnounceAddrs().concat(this.components.transportManager.getAddrs()).concat([...this.observed.entries()].filter(([t,n])=>n.confident).map(([t])=>se(t))).map(t=>t.getPeerId()===this.components.peerId.toString()?t.decapsulate(`/p2p/${this.components.peerId.toString()}`):t);this.components.peerStore.patch(this.components.peerId,{multiaddrs:e}).catch(t=>{this.log.error("error updating addresses",t)})}getListenAddrs(){return Array.from(this.listen).map(e=>se(e))}getAnnounceAddrs(){return Array.from(this.announce).map(e=>se(e))}getObservedAddrs(){return Array.from(this.observed).map(([e])=>se(e))}addObservedAddr(e){e=N5(e,this.components.peerId);let t=e.toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){e=N5(e,this.components.peerId);let t=e.toString(),i=(this.observed.get(t)??{confident:!1}).confident;this.observed.set(t,{confident:!0}),i||this._updatePeerStoreAddresses()}removeObservedAddr(e){e=N5(e,this.components.peerId);let t=e.toString();this.observed.delete(t)}getAddresses(){let e=this.getAnnounceAddrs().map(n=>n.toString());e.length===0&&(e=this.components.transportManager.getAddrs().map(n=>n.toString())),e=e.concat(Array.from(this.observed).filter(([n,i])=>i.confident).map(([n])=>n));let t=new Set(e);return this.announceFilter(Array.from(t).map(n=>se(n))).map(n=>n.protos().pop()?.path===!0||n.getPeerId()===this.components.peerId.toString()?n:n.encapsulate(`/p2p/${this.components.peerId.toString()}`))}};var O5=class{components={};_started=!1;constructor(e={}){this.components={};for(let[t,n]of Object.entries(e))this.components[t]=n;this.components.logger==null&&(this.components.logger=Ua())}isStarted(){return this._started}async _invokeStartableMethod(e){await Promise.all(Object.values(this.components).filter(t=>Df(t)).map(async t=>{await t[e]?.()}))}async beforeStart(){await this._invokeStartableMethod("beforeStart")}async start(){await this._invokeStartableMethod("start"),this._started=!0}async afterStart(){await this._invokeStartableMethod("afterStart")}async beforeStop(){await this._invokeStartableMethod("beforeStop")}async stop(){await this._invokeStartableMethod("stop"),this._started=!1}async afterStop(){await this._invokeStartableMethod("afterStop")}},ste=["metrics","connectionProtector"],ote=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];function LN(r={}){let e=new O5(r);return new Proxy(e,{get(n,i,s){if(typeof i=="string"&&!ote.includes(i)){let o=e.components[i];if(o==null&&!ste.includes(i))throw new E(`${i} not set`,"ERR_SERVICE_MISSING");return o}return Reflect.get(n,i,s)},set(n,i,s){return typeof i=="string"?e.components[i]=s:Reflect.set(n,i,s),!0}})}function BN(r={}){return{denyDialPeer:async()=>!1,denyDialMultiaddr:async e=>{let t=e.stringTuples();return t[0][0]===4||t[0][0]===41?!!_n(`${t[0][1]}`):!1},denyInboundConnection:async()=>!1,denyOutboundConnection:async()=>!1,denyInboundEncryptedConnection:async()=>!1,denyOutboundEncryptedConnection:async()=>!1,denyInboundUpgradedConnection:async()=>!1,denyOutboundUpgradedConnection:async()=>!1,filterMultiaddrForPeer:async()=>!0,...r}}function L5(r){try{let{address:e}=r.nodeAddress();return!!_n(e)}catch{return!0}}function ate(r,e){let t=L5(r.multiaddr),n=L5(e.multiaddr);return t&&!n?1:!t&&n?-1:0}function cte(r,e){return r.isCertified&&!e.isCertified?-1:!r.isCertified&&e.isCertified?1:0}function lte(r,e){let t=zh.exactMatch(r.multiaddr),n=zh.exactMatch(e.multiaddr);return t&&!n?1:!t&&n?-1:0}function Kl(r,e){let t=ate(r,e);if(t!==0)return t;let n=lte(r,e);return n!==0?n:cte(r,e)}var M5=te(xf(),1),U5=te(FN(),1);function n2(r,e,t){return`${r}?name=${e}&type=${t}`}async function KN(r,e){return await(await fetch(r,{headers:new Headers({accept:"application/dns-json"}),signal:e})).json()}function Aa(r,e){return`${e}_${r}`}var B5=Object.assign((0,M5.default)("dns-over-http-resolver"),{error:(0,M5.default)("dns-over-http-resolver:error")}),F5=class{_cache;_TXTcache;_servers;_request;_abortControllers;constructor(e={}){this._cache=new U5.default({max:e?.maxCache??100}),this._TXTcache=new U5.default({max:e?.maxCache??100}),this._servers=["https://cloudflare-dns.com/dns-query","https://dns.google/resolve"],this._request=e.request??KN,this._abortControllers=[]}cancel(){this._abortControllers.forEach(e=>{e.abort()})}getServers(){return this._servers}_getShuffledServers(){let e=[...this._servers];for(let t=e.length-1;t>0;t--){let n=Math.floor(Math.random()*t),i=e[t];e[t]=e[n],e[n]=i}return e}setServers(e){this._servers=e}async resolve(e,t="A"){switch(t){case"A":return this.resolve4(e);case"AAAA":return this.resolve6(e);case"TXT":return this.resolveTxt(e);default:throw new Error(`${t} is not supported`)}}async resolve4(e){let t="A",n=this._cache.get(Aa(e,t));if(n!=null)return n;let i=!1;for(let s of this._getShuffledServers()){let o=new AbortController;this._abortControllers.push(o);try{let a=await this._request(n2(s,e,t),o.signal),c=a.Answer.map(u=>u.data),l=Math.min(...a.Answer.map(u=>u.TTL));return this._cache.set(Aa(e,t),c,{ttl:l}),c}catch{o.signal.aborted&&(i=!0),B5.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==o)}}throw i?Object.assign(new Error("queryA ECANCELLED"),{code:"ECANCELLED"}):new Error(`Could not resolve ${e} record ${t}`)}async resolve6(e){let t="AAAA",n=this._cache.get(Aa(e,t));if(n!=null)return n;let i=!1;for(let s of this._getShuffledServers()){let o=new AbortController;this._abortControllers.push(o);try{let a=await this._request(n2(s,e,t),o.signal),c=a.Answer.map(u=>u.data),l=Math.min(...a.Answer.map(u=>u.TTL));return this._cache.set(Aa(e,t),c,{ttl:l}),c}catch{o.signal.aborted&&(i=!0),B5.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==o)}}throw i?Object.assign(new Error("queryAaaa ECANCELLED"),{code:"ECANCELLED"}):new Error(`Could not resolve ${e} record ${t}`)}async resolveTxt(e){let t="TXT",n=this._TXTcache.get(Aa(e,t));if(n!=null)return n;let i=!1;for(let s of this._getShuffledServers()){let o=new AbortController;this._abortControllers.push(o);try{let a=await this._request(n2(s,e,t),o.signal),c=a.Answer.map(u=>[u.data.replace(/['"]+/g,"")]),l=Math.min(...a.Answer.map(u=>u.TTL));return this._TXTcache.set(Aa(e,t),c,{ttl:l}),c}catch{o.signal.aborted&&(i=!0),B5.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==o)}}throw i?Object.assign(new Error("queryTxt ECANCELLED"),{code:"ECANCELLED"}):new Error(`Could not resolve ${e} record ${t}`)}clearCache(){this._cache.clear(),this._TXTcache.clear()}},VN=F5;var qN=VN;var{code:pte}=pe("dnsaddr");async function Vl(r,e={}){let t=new qN;e.signal!=null&&e.signal.addEventListener("abort",()=>{t.cancel()});let n=r.getPeerId(),[,i]=r.stringTuples().find(([a])=>a===pte)??[];if(i==null)throw new Error("No hostname found in multiaddr");let o=(await t.resolveTxt(`_dnsaddr.${i}`)).flat().map(a=>a.split("=")[1]).filter(Boolean);return n!=null&&(o=o.filter(a=>a.includes(n))),o}var Is;(function(r){r.NOT_STARTED_YET="The libp2p node is not started yet",r.ERR_PROTECTOR_REQUIRED="Private network is enforced, but no protector was provided",r.NOT_FOUND="Not found"})(Is||(Is={}));var ne;(function(r){r.ERR_PROTECTOR_REQUIRED="ERR_PROTECTOR_REQUIRED",r.ERR_PEER_DIAL_INTERCEPTED="ERR_PEER_DIAL_INTERCEPTED",r.ERR_CONNECTION_INTERCEPTED="ERR_CONNECTION_INTERCEPTED",r.ERR_INVALID_PROTOCOLS_FOR_STREAM="ERR_INVALID_PROTOCOLS_FOR_STREAM",r.ERR_CONNECTION_ENDED="ERR_CONNECTION_ENDED",r.ERR_CONNECTION_FAILED="ERR_CONNECTION_FAILED",r.ERR_NODE_NOT_STARTED="ERR_NODE_NOT_STARTED",r.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",r.ERR_TOO_MANY_ADDRESSES="ERR_TOO_MANY_ADDRESSES",r.ERR_NO_VALID_ADDRESSES="ERR_NO_VALID_ADDRESSES",r.ERR_RELAYED_DIAL="ERR_RELAYED_DIAL",r.ERR_DIALED_SELF="ERR_DIALED_SELF",r.ERR_DISCOVERED_SELF="ERR_DISCOVERED_SELF",r.ERR_DUPLICATE_TRANSPORT="ERR_DUPLICATE_TRANSPORT",r.ERR_ENCRYPTION_FAILED="ERR_ENCRYPTION_FAILED",r.ERR_HOP_REQUEST_FAILED="ERR_HOP_REQUEST_FAILED",r.ERR_INVALID_KEY="ERR_INVALID_KEY",r.ERR_INVALID_MESSAGE="ERR_INVALID_MESSAGE",r.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",r.ERR_INVALID_PEER="ERR_INVALID_PEER",r.ERR_MUXER_UNAVAILABLE="ERR_MUXER_UNAVAILABLE",r.ERR_NOT_FOUND="ERR_NOT_FOUND",r.ERR_TRANSPORT_UNAVAILABLE="ERR_TRANSPORT_UNAVAILABLE",r.ERR_TRANSPORT_DIAL_FAILED="ERR_TRANSPORT_DIAL_FAILED",r.ERR_UNSUPPORTED_PROTOCOL="ERR_UNSUPPORTED_PROTOCOL",r.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED="ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED",r.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",r.ERR_SIGNATURE_NOT_VALID="ERR_SIGNATURE_NOT_VALID",r.ERR_FIND_SELF="ERR_FIND_SELF",r.ERR_NO_ROUTERS_AVAILABLE="ERR_NO_ROUTERS_AVAILABLE",r.ERR_CONNECTION_NOT_MULTIPLEXED="ERR_CONNECTION_NOT_MULTIPLEXED",r.ERR_NO_DIAL_TOKENS="ERR_NO_DIAL_TOKENS",r.ERR_INVALID_CMS="ERR_INVALID_CMS",r.ERR_MISSING_KEYS="ERR_MISSING_KEYS",r.ERR_NO_KEY="ERR_NO_KEY",r.ERR_INVALID_KEY_NAME="ERR_INVALID_KEY_NAME",r.ERR_INVALID_KEY_TYPE="ERR_INVALID_KEY_TYPE",r.ERR_KEY_ALREADY_EXISTS="ERR_KEY_ALREADY_EXISTS",r.ERR_INVALID_KEY_SIZE="ERR_INVALID_KEY_SIZE",r.ERR_KEY_NOT_FOUND="ERR_KEY_NOT_FOUND",r.ERR_OLD_KEY_NAME_INVALID="ERR_OLD_KEY_NAME_INVALID",r.ERR_NEW_KEY_NAME_INVALID="ERR_NEW_KEY_NAME_INVALID",r.ERR_PASSWORD_REQUIRED="ERR_PASSWORD_REQUIRED",r.ERR_PEM_REQUIRED="ERR_PEM_REQUIRED",r.ERR_CANNOT_READ_KEY="ERR_CANNOT_READ_KEY",r.ERR_MISSING_PRIVATE_KEY="ERR_MISSING_PRIVATE_KEY",r.ERR_MISSING_PUBLIC_KEY="ERR_MISSING_PUBLIC_KEY",r.ERR_INVALID_OLD_PASS_TYPE="ERR_INVALID_OLD_PASS_TYPE",r.ERR_INVALID_NEW_PASS_TYPE="ERR_INVALID_NEW_PASS_TYPE",r.ERR_INVALID_PASS_LENGTH="ERR_INVALID_PASS_LENGTH",r.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",r.ERR_WRONG_PING_ACK="ERR_WRONG_PING_ACK",r.ERR_INVALID_RECORD="ERR_INVALID_RECORD",r.ERR_ALREADY_SUCCEEDED="ERR_ALREADY_SUCCEEDED",r.ERR_NO_HANDLER_FOR_PROTOCOL="ERR_NO_HANDLER_FOR_PROTOCOL",r.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS",r.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",r.ERR_CONNECTION_DENIED="ERR_CONNECTION_DENIED",r.ERR_TRANSFER_LIMIT_EXCEEDED="ERR_TRANSFER_LIMIT_EXCEEDED"})(ne||(ne={}));var mte={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:r=>r},connectionManager:{resolvers:{dnsaddr:Vl},addressSorter:Kl},transportManager:{faultTolerance:Ps.FATAL_ALL}};function zN(r){let e=vl(mte,r);if(e.connectionProtector===null&&globalThis.process?.env?.LIBP2P_FORCE_PNET!=null)throw new E(Is.ERR_PROTECTOR_REQUIRED,ne.ERR_PROTECTOR_REQUIRED);return e}var GN=te(A6(),1);function i2(r){if(Ga(r))return{peerId:r,multiaddrs:[]};Array.isArray(r)||(r=[r]);let e;if(r.length>0){let t=r[0].getPeerId();e=t==null?void 0:Se(t),r.forEach(n=>{if(!ao(n))throw new E("Invalid Multiaddr",ne.ERR_INVALID_MULTIADDR);let i=n.getPeerId();if(i==null){if(e!=null)throw new E("Multiaddrs must all have the same peer id or have no peer id",ne.ERR_INVALID_PARAMETERS)}else{let s=Se(i);if(e==null||!e.equals(s))throw new E("Multiaddrs must all have the same peer id or have no peer id",ne.ERR_INVALID_PARAMETERS)}})}return{peerId:e,multiaddrs:r}}var s2="last-dial-failure";var o2=5,a2=100,c2=50,$N=1e3*60*7;var Ta={minConnections:o2,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:$N,autoDialDiscoveredPeersDebounce:10},l2=class{connectionManager;peerStore;queue;minConnections;autoDialPriority;autoDialIntervalMs;autoDialMaxQueueLength;autoDialPeerRetryThresholdMs;autoDialDiscoveredPeersDebounce;autoDialInterval;started;running;log;constructor(e,t){this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.minConnections=t.minConnections??Ta.minConnections,this.autoDialPriority=t.autoDialPriority??Ta.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??Ta.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??Ta.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??Ta.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??Ta.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new go({concurrency:t.autoDialConcurrency??Ta.autoDialConcurrency,metricName:"libp2p_autodial_queue",metrics:e.metrics}),this.queue.addEventListener("error",i=>{this.log.error("error during auto-dial",i.detail)}),e.events.addEventListener("connection:close",()=>{this.autoDial().catch(i=>{this.log.error(i)})});let n;e.events.addEventListener("peer:discovery",()=>{clearTimeout(n),n=setTimeout(()=>{this.autoDial().catch(i=>{this.log.error(i)})},this.autoDialDiscoveredPeersDebounce)})}isStarted(){return this.started}start(){this.started=!0}afterStart(){this.autoDial().catch(e=>{this.log.error("error while autodialing",e)})}stop(){this.queue.clear(),clearTimeout(this.autoDialInterval),this.started=!1,this.running=!1}async autoDial(){if(!this.started||this.running)return;let e=this.connectionManager.getConnectionsMap(),t=e.size;if(t>=this.minConnections){this.minConnections>0&&this.log.trace("have enough connections %d/%d",t,this.minConnections);return}if(this.queue.size>this.autoDialMaxQueueLength){this.log("not enough connections %d/%d but auto dial queue is full",t,this.minConnections),this.sheduleNextAutodial();return}this.running=!0,this.log("not enough connections %d/%d - will dial peers to increase the number of connections",t,this.minConnections);let n=new Ht(this.connectionManager.getDialQueue().map(l=>l.peerId).filter(Boolean)),i=await this.peerStore.all({filters:[l=>l.addresses.length===0?(this.log.trace("not autodialing %p because they have no addresses",l.id),!1):e.has(l.id)?(this.log.trace("not autodialing %p because they are already connected",l.id),!1):n.has(l.id)?(this.log.trace("not autodialing %p because they are already being dialed",l.id),!1):this.queue.has(l.id)?(this.log.trace("not autodialing %p because they are already being autodialed",l.id),!1):!0]}),s=i.sort(()=>Math.random()>.5?1:-1),o=new $t;for(let l of s)o.has(l.id)||o.set(l.id,[...l.tags.values()].reduce((u,h)=>u+h.value,0));let c=s.sort((l,u)=>{let h=o.get(l.id)??0,f=o.get(u.id)??0;return h>f?-1:h<f?1:0}).filter(l=>{let u=l.metadata.get(s2);if(u==null)return!0;let h=parseInt(G(u));return isNaN(h)?!0:Date.now()-h>this.autoDialPeerRetryThresholdMs});this.log("selected %d/%d peers to dial",c.length,i.length);for(let l of c)this.queue.add(async()=>{let u=this.connectionManager.getConnectionsMap().size;if(u>=this.minConnections){this.log("got enough connections now %d/%d",u,this.minConnections),this.queue.clear();return}this.log("connecting to a peerStore stored peer %p",l.id),await this.connectionManager.openConnection(l.id,{priority:this.autoDialPriority})},{peerId:l.id}).catch(u=>{this.log.error("could not connect to peerStore stored peer",u)});this.running=!1,this.sheduleNextAutodial()}sheduleNextAutodial(){this.started&&(this.autoDialInterval=setTimeout(()=>{this.autoDial().catch(e=>{this.log.error("error while autodialing",e)})},this.autoDialIntervalMs))}};var HN={maxConnections:a2,allow:[]},u2=class{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??HN.maxConnections,this.allow=t.allow??HN.allow,this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager:connection-pruner"),e.events.addEventListener("connection:open",()=>{this.maybePruneConnections().catch(n=>{this.log.error(n)})})}async maybePruneConnections(){let e=this.connectionManager.getConnections(),t=e.length,n=Math.max(t-this.maxConnections,0);if(this.log("checking max connections limit %d/%d",t,this.maxConnections),t<=this.maxConnections)return;this.log("max connections limit exceeded %d/%d, pruning %d connection(s)",t,this.maxConnections,n);let i=new $t;for(let a of e){let c=a.remotePeer;if(!i.has(c)){i.set(c,0);try{let l=await this.peerStore.get(c);i.set(c,[...l.tags.values()].reduce((u,h)=>u+h.value,0))}catch(l){l.code!=="ERR_NOT_FOUND"&&this.log.error("error loading peer tags",l)}}}let s=e.sort((a,c)=>{let l=i.get(a.remotePeer)??0,u=i.get(c.remotePeer)??0;if(l>u)return 1;if(l<u)return-1;let h=a.timeline.open,f=c.timeline.open;return h<f?1:h>f?-1:0}),o=[];for(let a of s)if(this.log("too many connections open - closing a connection to %p",a.remotePeer),this.allow.some(l=>a.remoteAddr.toString().startsWith(l.toString()))||o.push(a),o.length===n)break;await Promise.all(o.map(async a=>{try{await a.close()}catch(c){this.log.error(c)}})),this.events.safeDispatchEvent("connection:prune",{detail:o})}};async function z5(r,e){if(!r.protoNames().includes("dnsaddr"))return[r];let n=await bte(r,e),o=(await Promise.all(n.map(async a=>z5(a,e)))).flat().reduce((a,c)=>(a.find(l=>l.equals(c))==null&&a.push(c),a),[]);return e.log("resolved %s to",r,o.map(a=>a.toString())),o}async function bte(r,e){try{return r=se(r.toString()),await r.resolve(e)}catch(t){return e.log.error(`multiaddr ${r.toString()} could not be resolved`,t),[]}}var h2={addressSorter:Kl,maxParallelDials:c2,maxPeerAddrsToDial:25,dialTimeout:3e4,resolvers:{dnsaddr:Vl}},f2=class{queue;components;addressSorter;maxPeerAddrsToDial;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??h2.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??h2.maxPeerAddrsToDial,this.dialTimeout=t.dialTimeout??h2.dialTimeout,this.connections=t.connections??new $t,this.log=e.logger.forComponent("libp2p:connection-manager:dial-queue"),this.components=e,this.shutDownController=new AbortController,qe(1/0,this.shutDownController.signal);for(let[n,i]of Object.entries(t.resolvers??{}))z0.set(n,i);this.queue=new Gi({concurrency:t.maxParallelDials??h2.maxParallelDials,metricName:"libp2p_dial_queue",metrics:e.metrics}),this.queue.addEventListener("error",n=>{this.log.error("error in dial queue",n.detail)})}start(){this.shutDownController=new AbortController}stop(){this.shutDownController.abort(),this.queue.abort()}async dial(e,t={}){let{peerId:n,multiaddrs:i}=i2(e),s=Array.from(this.connections.values()).flat().find(a=>t.force===!0?!1:a.remotePeer.equals(n)?!0:i.find(c=>c.equals(a.remoteAddr)));if(s!=null)return this.log("already connected to %a",s.remoteAddr),s;let o=this.queue.queue.find(a=>{if(n?.equals(a.options.peerId)===!0)return!0;let c=a.options.multiaddrs;if(c==null)return!1;for(let l of i)if(c.has(l.toString()))return!0;return!1});if(o!=null){this.log("joining existing dial target for %p",n);for(let a of i)o.options.multiaddrs.add(a.toString());return o.join(t)}return this.log("creating dial target for %p",n,i.map(a=>a.toString())),this.queue.add(async a=>{let c=this.createDialAbortController(a?.signal),l;try{l=await this.calculateMultiaddrs(n,a?.multiaddrs,{...a,signal:c}),l.map(({multiaddr:u})=>u.toString()).forEach(u=>{a?.multiaddrs.add(u)})}catch(u){throw c.clear(),u}try{let u=0,h=[];for(let f of l){if(u===this.maxPeerAddrsToDial)throw this.log("dialed maxPeerAddrsToDial (%d) addresses for %p, not trying any others",u,n),new E("Peer had more than maxPeerAddrsToDial",ne.ERR_TOO_MANY_ADDRESSES);u++;try{let p=await this.components.transportManager.dial(f.multiaddr,{...a,signal:c});return this.log("dial to %a succeeded",f.multiaddr),p}catch(p){if(this.log.error("dial failed to %a",f.multiaddr,p),n!=null)try{await this.components.peerStore.patch(n,{metadata:{[s2]:W(Date.now().toString())}})}catch(d){this.log.error("could not update last dial failure key for %p",n,d)}if(c.aborted)throw new E(p.message,$i);h.push(p)}}throw h.length===1?h[0]:new Tf(h,"All multiaddr dials failed",ne.ERR_TRANSPORT_DIAL_FAILED)}finally{c.clear()}},{peerId:n,priority:t.priority,multiaddrs:new Set(i.map(a=>a.toString())),signal:t.signal})}createDialAbortController(e){let t=Wt([AbortSignal.timeout(this.dialTimeout),this.shutDownController.signal,e]);return qe(1/0,t),t}async calculateMultiaddrs(e,t=new Set,n={}){let i=[...t].map(h=>({multiaddr:se(h),isCertified:!1}));if(e!=null){if(this.components.peerId.equals(e))throw new E("Tried to dial self",ne.ERR_DIALED_SELF);if(await this.components.connectionGater.denyDialPeer?.(e)===!0)throw new E("The dial request is blocked by gater.allowDialPeer",ne.ERR_PEER_DIAL_INTERCEPTED);if(i.length===0){this.log("loading multiaddrs for %p",e);try{let h=await this.components.peerStore.get(e);i.push(...h.addresses),this.log("loaded multiaddrs for %p",e,i.map(({multiaddr:f})=>f.toString()))}catch(h){if(h.code!==ne.ERR_NOT_FOUND)throw h}}if(i.length===0){this.log("looking up multiaddrs for %p in the peer routing",e);try{let h=await this.components.peerRouting.findPeer(e);this.log("found multiaddrs for %p in the peer routing",e,i.map(({multiaddr:f})=>f.toString())),i.push(...h.multiaddrs.map(f=>({multiaddr:f,isCertified:!1})))}catch(h){h.code!==ne.ERR_NO_ROUTERS_AVAILABLE&&this.log.error("looking up multiaddrs for %p in the peer routing failed",e,h)}}}let s=(await Promise.all(i.map(async h=>{let f=await z5(h.multiaddr,{...n,log:this.log});return f.length===1&&f[0].equals(h.multiaddr)?h:f.map(p=>({multiaddr:p,isCertified:!1}))}))).flat();if(e!=null){let h=`/p2p/${e.toString()}`;s=s.map(f=>f.multiaddr.protos().pop()?.path===!0?f:f.multiaddr.getPeerId()==null?{multiaddr:f.multiaddr.encapsulate(h),isCertified:f.isCertified}:f)}let o=s.filter(h=>{if(this.components.transportManager.transportForMultiaddr(h.multiaddr)==null)return!1;let f=h.multiaddr.getPeerId();return e!=null&&f!=null?e.equals(f):!0}),a=new Map;for(let h of o){let f=h.multiaddr.toString(),p=a.get(f);if(p!=null){p.isCertified=p.isCertified||h.isCertified||!1;continue}a.set(f,h)}let c=[...a.values()];if(c.length===0)throw new E("The dial request has no valid addresses",ne.ERR_NO_VALID_ADDRESSES);let l=[];for(let h of c)this.components.connectionGater.denyDialMultiaddr!=null&&await this.components.connectionGater.denyDialMultiaddr(h.multiaddr)||l.push(h);let u=l.sort(this.addressSorter);if(u.length===0)throw new E("The connection gater denied all addresses in the dial request",ne.ERR_NO_VALID_ADDRESSES);return this.log.trace("addresses for %p before filtering",e??"unknown peer",s.map(({multiaddr:h})=>h.toString())),this.log.trace("addresses for %p after filtering",e??"unknown peer",u.map(({multiaddr:h})=>h.toString())),u}};var xte=50,Da={minConnections:o2,maxConnections:a2,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100},d2=class{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Da.maxConnections;let n=t.minConnections??Da.minConnections;if(this.maxConnections<n)throw new E("Connection Manager maxConnections must be greater than minConnections",ne.ERR_INVALID_PARAMETERS);this.connections=new $t,this.started=!1,this.peerStore=e.peerStore,this.metrics=e.metrics,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager"),this.onConnect=this.onConnect.bind(this),this.onDisconnect=this.onDisconnect.bind(this),this.events.addEventListener("connection:open",this.onConnect),this.events.addEventListener("connection:close",this.onDisconnect),this.allow=(t.allow??[]).map(i=>se(i)),this.deny=(t.deny??[]).map(i=>se(i)),this.incomingPendingConnections=0,this.maxIncomingPendingConnections=t.maxIncomingPendingConnections??Da.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new GN.RateLimiterMemory({points:t.inboundConnectionThreshold??Da.inboundConnectionThreshold,duration:1}),this.autoDial=new l2({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??Da.autoDialConcurrency,autoDialPriority:t.autoDialPriority??Da.autoDialPriority,maxQueueLength:t.autoDialMaxQueueLength??Da.autoDialMaxQueueLength}),this.connectionPruner=new u2({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new f2(e,{addressSorter:t.addressSorter??Kl,maxParallelDials:t.maxParallelDials??c2,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??3e4,resolvers:t.resolvers??{dnsaddr:Vl},connections:this.connections})}isStarted(){return this.started}async start(){this.metrics?.registerMetricGroup("libp2p_connection_manager_connections",{calculate:()=>{let e={inbound:0,outbound:0};for(let t of this.connections.values())for(let n of t)n.direction==="inbound"?e.inbound++:e.outbound++;return e}}),this.metrics?.registerMetricGroup("libp2p_protocol_streams_total",{label:"protocol",calculate:()=>{let e={};for(let t of this.connections.values())for(let n of t)for(let i of n.streams){let s=`${i.direction} ${i.protocol??"unnegotiated"}`;e[s]=(e[s]??0)+1}return e}}),this.metrics?.registerMetricGroup("libp2p_connection_manager_protocol_streams_per_connection_90th_percentile",{label:"protocol",calculate:()=>{let e={};for(let n of this.connections.values())for(let i of n){let s={};for(let o of i.streams){let a=`${o.direction} ${o.protocol??"unnegotiated"}`;s[a]=(s[a]??0)+1}for(let[o,a]of Object.entries(s))e[o]=e[o]??[],e[o].push(a)}let t={};for(let[n,i]of Object.entries(e)){i=i.sort((o,a)=>o-a);let s=Math.floor(i.length*.9);t[n]=i[s]}return t}}),this.dialQueue.start(),this.autoDial.start(),this.started=!0,this.log("started")}async afterStart(){Promise.resolve().then(async()=>{let e=await this.peerStore.all({filters:[t=>t.tags.has(rb)]});await Promise.all(e.map(async t=>{await this.openConnection(t.id).catch(n=>{this.log.error(n)})}))}).catch(e=>{this.log.error(e)}),this.autoDial.afterStart()}async stop(){this.dialQueue.stop(),this.autoDial.stop();let e=[];for(let t of this.connections.values())for(let n of t)e.push((async()=>{try{await n.close()}catch(i){this.log.error(i)}})());this.log("closing %d connections",e.length),await Promise.all(e),this.connections.clear(),this.log("stopped")}onConnect(e){this._onConnect(e).catch(t=>{this.log.error(t)})}async _onConnect(e){let{detail:t}=e;if(!this.started){await t.close();return}let n=t.remotePeer,i=this.connections.get(n),s=!1;i!=null?i.push(t):(s=!0,this.connections.set(n,[t])),n.publicKey!=null&&n.type==="RSA"&&await this.peerStore.patch(n,{publicKey:n.publicKey}),s&&this.events.safeDispatchEvent("peer:connect",{detail:t.remotePeer})}onDisconnect(e){let{detail:t}=e;if(!this.started)return;let n=t.remotePeer,i=this.connections.get(n);i!=null&&i.length>1?(i=i.filter(s=>s.id!==t.id),this.connections.set(n,i)):i!=null&&(this.connections.delete(n),this.events.safeDispatchEvent("peer:disconnect",{detail:t.remotePeer}))}getConnections(e){if(e!=null)return this.connections.get(e)??[];let t=[];for(let n of this.connections.values())t=t.concat(n);return t}getConnectionsMap(){return this.connections}async openConnection(e,t={}){if(!this.isStarted())throw new E("Not started",ne.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();let{peerId:n}=i2(e);if(n!=null&&t.force!==!0){this.log("dial %p",n);let a=this.getConnections(n).find(c=>!c.transient);if(a!=null)return this.log("had an existing non-transient connection to %p",n),a}let i=await this.dialQueue.dial(e,{...t,priority:t.priority??xte}),s=this.connections.get(i.remotePeer);s==null&&(s=[],this.connections.set(i.remotePeer,s));let o=!1;for(let a of s)a.id===i.id&&(o=!0);return o||s.push(i),i}async closeConnections(e,t={}){let n=this.connections.get(e)??[];await Promise.all(n.map(async i=>{try{await i.close(t)}catch(s){i.abort(s)}}))}async acceptIncomingConnection(e){if(this.deny.some(i=>e.remoteAddr.toString().startsWith(i.toString())))return this.log("connection from %a refused - connection remote address was in deny list",e.remoteAddr),!1;if(this.allow.some(i=>e.remoteAddr.toString().startsWith(i.toString())))return this.incomingPendingConnections++,!0;if(this.incomingPendingConnections===this.maxIncomingPendingConnections)return this.log("connection from %a refused - incomingPendingConnections exceeded by host",e.remoteAddr),!1;if(e.remoteAddr.isThinWaistAddress()){let i=e.remoteAddr.nodeAddress().address;try{await this.inboundConnectionRateLimiter.consume(i,1)}catch{return this.log("connection from %a refused - inboundConnectionThreshold exceeded by host %s",e.remoteAddr,i),!1}}return this.getConnections().length<this.maxConnections?(this.incomingPendingConnections++,!0):(this.log("connection from %a refused - maxConnections exceeded",e.remoteAddr),!1)}afterUpgradeInbound(){this.incomingPendingConnections--}getDialQueue(){let e={queued:"queued",running:"active",errored:"error",complete:"success"};return this.dialQueue.queue.queue.map(t=>({id:t.id,status:e[t.status],peerId:t.options.peerId,multiaddrs:[...t.options.multiaddrs].map(n=>se(n))}))}};var p2=class{routers;started;components;constructor(e,t){this.routers=t.routers??[],this.started=!1,this.components=e}isStarted(){return this.started}async start(){this.started=!0}async stop(){this.started=!1}async*findProviders(e,t={}){if(this.routers.length===0)throw new E("No content routers available",ne.ERR_NO_ROUTERS_AVAILABLE);let n=this,i=new Ht;for await(let s of Nn(...n.routers.map(o=>o.findProviders(e,t))))s!=null&&(s.multiaddrs.length>0&&await this.components.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),!i.has(s.id)&&(i.add(s.id),yield s))}async provide(e,t={}){if(this.routers.length===0)throw new E("No content routers available",ne.ERR_NO_ROUTERS_AVAILABLE);await Promise.all(this.routers.map(async n=>{await n.provide(e,t)}))}async put(e,t,n){if(!this.isStarted())throw new E(Is.NOT_STARTED_YET,ne.ERR_NODE_NOT_STARTED);await Promise.all(this.routers.map(async i=>{await i.put(e,t,n)}))}async get(e,t){if(!this.isStarted())throw new E(Is.NOT_STARTED_YET,ne.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map(async n=>n.get(e,t)))}};var m2=class{log;peerId;peerStore;routers;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-routing"),this.peerId=e.peerId,this.peerStore=e.peerStore,this.routers=t.routers??[]}async findPeer(e,t){if(this.routers.length===0)throw new E("No peer routers available",ne.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new E("Should not try to find self",ne.ERR_FIND_SELF);let n=this,i=Nn(...this.routers.map(s=>async function*(){try{yield await s.findPeer(e,t)}catch(o){n.log.error(o)}}()));for await(let s of i)if(s!=null)return s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),s;throw new E(Is.NOT_FOUND,ne.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(this.routers.length===0)throw new E("No peer routers available",ne.ERR_NO_ROUTERS_AVAILABLE);let n=this,i=new Ht;for await(let s of ys(async function*(){let o=Nn(...n.routers.map(a=>a.getClosestPeers(e,t)));for await(let a of o)yield async()=>{if(a.multiaddrs.length===0)try{a=await n.findPeer(a.id,{...t,useCache:!1})}catch(c){n.log.error("could not find peer multiaddrs",c);return}return a}}()))s!=null&&(s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),!i.has(s.id)&&(i.add(s.id),yield s))}};var G5=32,W5=64,g2=class{log;topologies;handlers;components;constructor(e){this.log=e.logger.forComponent("libp2p:registrar"),this.topologies=new Map,this.handlers=new Map,this.components=e,this._onDisconnect=this._onDisconnect.bind(this),this._onPeerUpdate=this._onPeerUpdate.bind(this),this._onPeerIdentify=this._onPeerIdentify.bind(this),this.components.events.addEventListener("peer:disconnect",this._onDisconnect),this.components.events.addEventListener("peer:update",this._onPeerUpdate),this.components.events.addEventListener("peer:identify",this._onPeerIdentify)}getProtocols(){return Array.from(new Set([...this.handlers.keys()])).sort()}getHandler(e){let t=this.handlers.get(e);if(t==null)throw new E(`No handler registered for protocol ${e}`,ne.ERR_NO_HANDLER_FOR_PROTOCOL);return t}getTopologies(e){let t=this.topologies.get(e);return t==null?[]:[...t.values()]}async handle(e,t,n){if(this.handlers.has(e))throw new E(`Handler already registered for protocol ${e}`,ne.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);let i=vl.bind({ignoreUndefined:!0})({maxInboundStreams:G5,maxOutboundStreams:W5},n);this.handlers.set(e,{handler:t,options:i}),await this.components.peerStore.merge(this.components.peerId,{protocols:[e]})}async unhandle(e){(Array.isArray(e)?e:[e]).forEach(n=>{this.handlers.delete(n)}),await this.components.peerStore.patch(this.components.peerId,{protocols:this.getProtocols()})}async register(e,t){if(t==null)throw new E("invalid topology",ne.ERR_INVALID_PARAMETERS);let n=`${(Math.random()*1e9).toString(36)}${Date.now()}`,i=this.topologies.get(e);return i==null&&(i=new Map,this.topologies.set(e,i)),i.set(n,t),n}unregister(e){for(let[t,n]of this.topologies.entries())n.has(e)&&(n.delete(e),n.size===0&&this.topologies.delete(t))}_onDisconnect(e){let t=e.detail;this.components.peerStore.get(t).then(n=>{for(let i of n.protocols){let s=this.topologies.get(i);if(s!=null)for(let o of s.values())o.onDisconnect?.(t)}}).catch(n=>{n.code!==ne.ERR_NOT_FOUND&&this.log.error("could not inform topologies of disconnecting peer %p",t,n)})}_onPeerUpdate(e){let{peer:t,previous:n}=e.detail,i=(n?.protocols??[]).filter(s=>!t.protocols.includes(s));for(let s of i){let o=this.topologies.get(s);if(o!=null)for(let a of o.values())a.onDisconnect?.(t.id)}}_onPeerIdentify(e){let t=e.detail.protocols,n=e.detail.connection,i=e.detail.peerId;for(let s of t){let o=this.topologies.get(s);if(o!=null)for(let a of o.values())n.transient&&a.notifyOnTransient!==!0||a.onConnect?.(i,n)}}};var y2=class{log;components;transports;listeners;faultTolerance;started;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:transports"),this.components=e,this.started=!1,this.transports=new Map,this.listeners=di({name:"libp2p_transport_manager_listeners",metrics:this.components.metrics}),this.faultTolerance=t.faultTolerance??Ps.FATAL_ALL}add(e){let t=e[Symbol.toStringTag];if(t==null)throw new E("Transport must have a valid tag",ne.ERR_INVALID_KEY);if(this.transports.has(t))throw new E(`There is already a transport with the tag ${t}`,ne.ERR_DUPLICATE_TRANSPORT);this.log("adding transport %s",t),this.transports.set(t,e),this.listeners.has(t)||this.listeners.set(t,[])}isStarted(){return this.started}start(){this.started=!0}async afterStart(){let e=this.components.addressManager.getListenAddrs();await this.listen(e)}async stop(){let e=[];for(let[t,n]of this.listeners)for(this.log("closing listeners for %s",t);n.length>0;){let i=n.pop();i!=null&&e.push(i.close())}await Promise.all(e),this.log("all listeners closed");for(let t of this.listeners.keys())this.listeners.set(t,[]);this.started=!1}async dial(e,t){let n=this.transportForMultiaddr(e);if(n==null)throw new E(`No transport available for address ${String(e)}`,ne.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(i){throw i.code==null&&(i.code=ne.ERR_TRANSPORT_DIAL_FAILED),i}}getAddrs(){let e=[];for(let t of this.listeners.values())for(let n of t)e=[...e,...n.getAddrs()];return e}getTransports(){return Array.of(...this.transports.values())}getListeners(){return Array.of(...this.listeners.values()).flat()}transportForMultiaddr(e){for(let t of this.transports.values())if(t.filter([e]).length>0)return t}async listen(e){if(!this.isStarted())throw new E("Not started",ne.ERR_NODE_NOT_STARTED);if(e==null||e.length===0){this.log("no addresses were provided for listening, this node is dial only");return}let t=[];for(let[n,i]of this.transports.entries()){let s=i.filter(e),o=[];for(let l of s){this.log("creating listener for %s on %a",n,l);let u=i.createListener({upgrader:this.components.upgrader}),h=this.listeners.get(n)??[];h==null&&(h=[],this.listeners.set(n,h)),h.push(u),u.addEventListener("listening",()=>{this.components.events.safeDispatchEvent("transport:listening",{detail:u})}),u.addEventListener("close",()=>{let f=h.findIndex(p=>p===u);h.splice(f,1),this.components.events.safeDispatchEvent("transport:close",{detail:u})}),o.push(u.listen(l))}if(o.length===0){t.push(n);continue}if((await Promise.allSettled(o)).find(l=>l.status==="fulfilled")==null&&this.faultTolerance!==Ps.NO_FATAL)throw new E(`Transport (${n}) could not listen on any available address`,ne.ERR_NO_VALID_ADDRESSES)}if(t.length===this.transports.size){let n=`no valid addresses were provided for transports [${t.join(", ")}]`;if(this.faultTolerance===Ps.FATAL_ALL)throw new E(n,ne.ERR_NO_VALID_ADDRESSES);this.log(`libp2p in dial mode only: ${n}`)}}async remove(e){let t=this.listeners.get(e)??[];this.log.trace("removing transport %s",e);let n=[];for(this.log.trace("closing listeners for %s",e);t.length>0;){let i=t.pop();i!=null&&n.push(i.close())}await Promise.all(n),this.transports.delete(e),this.listeners.delete(e)}async removeAll(){let e=[];for(let t of this.transports.keys())e.push(this.remove(t));await Promise.all(e)}};var ur="/multistream/1.0.0";var vte=W(`
82
+ `),r}var Lk=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),Bk=r=>[...Array(r)].map(()=>Lk.at(Math.floor(Math.random()*Lk.length))).join("");var zee=1e4,YCe=pe("webrtc-direct").code,Ok=pe("certhash").code,V1=class{log;metrics;components;init;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:webrtc-direct"),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 this.log("dialing address: %a",e),n}createListener(e){throw YC("WebRTCTransport.createListener")}filter(e){return e.filter(DT.exactMatch)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[pi]=!0;async _connect(e,t){let n=new AbortController,i=n.signal,s=e.getPeerId();if(s===null)throw x1("we need to have the remote's PeerId");let o=Se(s),a=v5(K1(e)),c=await Al.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:_5(a.name)}),l=new Al({certificates:[c]});try{let u=new Promise((S,T)=>{let L=l.createDataChannel("",{negotiated:!0,id:0}),O=setTimeout(()=>{let F=`Data channel was never opened: state: ${L.readyState}`;this.log.error(F),this.metrics?.dialerEvents.increment({open_error:!0}),T(V6("data",F))},zee);L.onopen=F=>{clearTimeout(O),S(L)},L.onerror=F=>{clearTimeout(O);let ee=`Error opening a data channel for handshaking: ${F.target?.toString()??"not specified"}`;this.log.error(ee),this.metrics?.dialerEvents.increment({unknown_error:!0}),T(V6("data",ee))}}),h="libp2p+webrtc+v1/"+Bk(32),f=await l.createOffer(),p=Nk(f,h);await l.setLocalDescription(p);let d=kk(e,h);await l.setRemoteDescription(d);let m=await u,g=this.components.peerId,y=this.generateNoisePrologue(l,a.code,e),b=qc({prologueBytes:y})(this.components),w=Il({channel:m,direction:"inbound",logger:this.components.logger,...this.init.dataChannel??{}}),_={...w,sink:w.sink.bind(w),source:async function*(){for await(let S of w.source)for(let T of S)yield T}()},x=new _a(this.components,{peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),v=tf?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(v,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":x.close().catch(S=>{this.log.error("error closing connection",S)}).finally(()=>{n.abort()});break;default:break}},{signal:i}),this.metrics?.dialerEvents.increment({peer_connection:!0});let R=new Sa(this.components,{peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await b.secureInbound(g,_,o),await t.upgrader.upgradeOutbound(x,{skipProtection:!0,skipEncryption:!0,muxerFactory:R})}catch(u){throw l.close(),u}}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw ef("no local certificate");let i=Pk(e,{log:this.log});if(i==null)throw ef("no local fingerprint found");let s=i.trim().toLowerCase().replaceAll(":",""),o=W(s,"hex"),a=Mk.encode(o,t),c=x5.decode(K1(n)),l=W("libp2p-webrtc-noise:");return Ue([l,a,c])}};function Uk(r){return e=>new V1(e,r)}function Fk(r){return e=>new T1(e,r)}function Kk(r){let e;try{e=pe("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function Vk(r){return r.some(([e,t])=>e===pe("tls").code)}function an(r,e,t){let n=qk[pe(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${pe(r).name}`);let i=n(e,t);return r===pe("ip6").code?`[${i}]`:i}var qk={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://${an(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://${an(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`${an(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`${an(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=Vk(e),n=Kk(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=an(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 an(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return an(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=an(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=Vk(e),n=Kk(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=an(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=an(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`${an(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`${an(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`${an(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function zk(r,e){let n=se(r).stringTuples(),i=n.pop();if(i===void 0)throw new Error("Unexpected end of multiaddr");let s=pe(i[0]),o=qk[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]===pe("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 $k=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 Hk=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let i of n){try{await $k(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 Qk=te(Wk(),1);function Yk(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var Xk=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 Qk.EventIterator(({push:o,stop:a,fail:c})=>{let l=h=>{let f=null;typeof h.data=="string"&&(f=W(h.data)),Yk(h.data)&&(f=new Uint8Array(h.data)),h.data instanceof Uint8Array&&(f=h.data),f!=null&&o(f)},u=h=>{c(h.error??new Error("Socket error"))};return r.addEventListener("message",l),r.addEventListener("error",u),r.addEventListener("close",a),()=>{r.removeEventListener("message",l),r.removeEventListener("error",u),r.removeEventListener("close",a)}},{highWaterMark:1/0});await e();for await(let o of s)yield Yk(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 jk=(r,e)=>{e=e??{};let t=Xk(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:Hk(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 Zk=WebSocket;var Hee={"http:":"ws:","https:":"wss:"},Jk="ws:",eN=(r,e)=>{if(r.startsWith("//")&&(r=`${e?.protocol??Jk}${r}`),r.startsWith("/")&&e!=null){let n=e.protocol??Jk,i=e.host,s=e.port!=null&&i?.endsWith(`:${e.port}`)!==!0?`:${e.port}`:"";r=`${n}//${i}${s}${r}`}let t=new URL(r);for(let[n,i]of Object.entries(Hee))t.protocol===n&&(t.protocol=i);return t};function tN(r,e){let t=typeof window>"u"?void 0:window.location;e=e??{};let n=eN(r,t),i=new Zk(n.toString(),e.websocket);return jk(i,e)}function iN(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return dl.matches(t)||ga.matches(t)})}function sN(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return ga.matches(t)})}function oN(){throw new Error("WebSocket Servers can not be created in the browser!")}function aN(r,e,t){let n=t.logger.forComponent("libp2p:websockets:maconn"),i={log:n,async sink(s){try{await r.sink(async function*(){for await(let o of s)o instanceof Uint8Array?yield o:yield o.subarray()}())}catch(o){o.type!=="aborted"&&n.error(o)}},source:r.source,remoteAddr:e,timeline:{open:Date.now()},async close(s={}){let o=Date.now();if(s.signal==null){let c=AbortSignal.timeout(500);s={...s,signal:c}}let a=()=>{let{host:c,port:l}=i.remoteAddr.toOptions();n("timeout closing stream to %s:%s after %dms, destroying it manually",c,l,Date.now()-o),this.abort(new E("Socket close timeout","ERR_SOCKET_CLOSE_TIMEOUT"))};s.signal?.addEventListener("abort",a);try{await r.close()}catch(c){n.error("error closing WebSocket gracefully",c),this.abort(c)}finally{s.signal?.removeEventListener("abort",a),i.timeline.close=Date.now()}},abort(s){let{host:o,port:a}=i.remoteAddr.toOptions();n("timeout closing stream to %s:%s due to error",o,a,s),r.destroy(),i.timeline.close=Date.now()}};return r.socket.addEventListener("close",()=>{i.timeline.close==null&&(i.timeline.close=Date.now())},{once:!0}),i}var I5=class{log;init;logger;constructor(e,t){this.log=e.logger.forComponent("libp2p:websockets"),this.logger=e.logger,this.init=t}[Symbol.toStringTag]="@libp2p/websockets";[pi]=!0;async dial(e,t){this.log("dialing %s",e),t=t??{};let n=await this._connect(e,t),i=aN(n,e,{logger:this.logger});this.log("new outbound connection %s",i.remoteAddr);let s=await t.upgrader.upgradeOutbound(i);return this.log("outbound connection %s upgraded",i.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new Ln;let n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);let i=ge(),s=tN(zk(e),this.init);if(s.socket.addEventListener("error",()=>{let c=new E(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");this.log.error("connection error:",c),i.reject(c)}),t.signal==null)return await Promise.race([s.connected(),i.promise]),this.log("connected %s",e),s;let o,a=new Promise((c,l)=>{if(o=()=>{l(new Ln),s.close().catch(u=>{this.log.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 this.log("connected %s",e),s}createListener(e){return oN({logger:this.logger},{...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):Up||Fp?sN(e):iN(e)}};function cN(r={}){return e=>new I5(e,r)}async function A5(r,e,t,n,i,s){let o=s.forComponent(`libp2p:webtransport:stream:${t}:${e}`),a=r.writable.getWriter(),c=r.readable.getReader();await a.ready;function l(){let d=n.findIndex(m=>m===p);d!==-1&&(n.splice(d,1),p.timeline.close=Date.now(),i?.(p))}let u=!1,h=!1;(async function(){let d=await a.closed.catch(m=>m);if(d!=null){let m=d.message;m.includes("aborted by the remote server")||m.includes("STOP_SENDING")||o.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${d.message}`)}u=!0,u&&h&&l()})().catch(()=>{o.error("WebTransport failed to cleanup closed stream")}),async function(){let d=await c.closed.catch(m=>m);d!=null&&o.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${d.message}`),h=!0,u&&h&&l()}().catch(()=>{o.error("WebTransport failed to cleanup closed stream")});let f=!1,p={id:e,status:"open",writeStatus:"ready",readStatus:"ready",abort(d){u||(a.abort(d).catch(m=>{o.error("could not abort stream",m)}),u=!0),h=!0,this.status="aborted",this.writeStatus="closed",this.readStatus="closed",this.timeline.reset=this.timeline.close=this.timeline.closeRead=this.timeline.closeWrite=Date.now(),l()},async close(d){this.status="closing",await Promise.all([p.closeRead(d),p.closeWrite(d)]),l(),this.status="closed",this.timeline.close=Date.now()},async closeRead(d){if(!h){this.readStatus="closing";try{await c.cancel()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(u=!0)}this.timeline.closeRead=Date.now(),this.readStatus="closed",h=!0}u&&l()},async closeWrite(d){if(!u){u=!0,this.writeStatus="closing";try{await a.close()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(h=!0)}this.timeline.closeWrite=Date.now(),this.writeStatus="closed"}h&&l()},direction:t,timeline:{open:Date.now()},metadata:{},source:async function*(){for(;;){let d=await c.read();if(d.done){h=!0,u&&l();return}yield new ve(d.value)}}(),sink:async function(d){if(f)throw new Error("sink already called on stream");f=!0;try{this.writeStatus="writing";for await(let m of d)if(m instanceof Uint8Array)await a.write(m);else for(let g of m)await a.write(g);this.writeStatus="done"}finally{this.timeline.closeWrite=Date.now(),this.writeStatus="closed",await p.closeWrite()}},log:o};return p}function T5(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}function lN(r,e){return e.filter(n=>!!r.find(i=>me(n,i))).length===e.length}var Yee=Object.values(ln).map(r=>r.decoder).reduce((r,e)=>r.or(e));function Qee(r){return Cn.decode(Yee.decode(r))}function uN(r){if(!Op.matches(r))throw new E("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");let e=r.stringTuples(),t=e.filter(([o,a])=>o===pe("certhash").code).map(([o,a])=>Qee(a??"")),n=e.filter(([o,a])=>o===pe("p2p").code).map(([o,a])=>Se(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 D5=class{log;components;config;metrics;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:webtransport"),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";[pi]=!0;async dial(e,t){t?.signal?.throwIfAborted(),this.log("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}=uN(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,h=!1,f=!1;try{this.metrics?.dialerEvents.increment({pending:!0});let p=new WebTransport(`${i}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(d=>({algorithm:"sha-256",value:d.digest}))});if(l=d=>{if(!u)try{this.metrics?.dialerEvents.increment({[d]:!0}),p.close()}catch(m){this.log.error("error closing wt session",m)}finally{c!=null&&(c.timeline.close=Date.now()),u=!0}},a=()=>{l(h?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",a,{once:!0}),await Promise.race([p.closed,p.ready]),h=!0,this.metrics?.dialerEvents.increment({ready:!0}),p.closed.catch(d=>{this.log.error("error on remote wt session close",d)}).finally(()=>{l("remote_close")}),!await this.authenticateWebTransport(p,n,o,s))throw new Error("Failed to authenticate webtransport");return this.metrics?.dialerEvents.increment({open:!0}),c={close:async()=>{this.log("Closing webtransport"),l("close")},abort:d=>{this.log("aborting webtransport due to passed err",d),l("abort")},remoteAddr:e,timeline:{open:Date.now()},log:this.components.logger.forComponent("libp2p:webtransport:maconn"),...T5()},f=!0,await t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(p),skipProtection:!0})}catch(p){throw this.log.error("caught wt session err",p),l(f?"upgrade_error":h?"noise_error":"ready_error"),p}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 h=await a.read();if(h.value!=null&&(yield h.value),h.done)break}}(),sink:async function(h){for await(let f of h)f instanceof Uint8Array?await o.write(f):await o.write(f.subarray())}},l=qc()(this.components),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch(h=>{this.log.error(`Failed to close authentication stream writer: ${h.message}`)}),a.cancel().catch(h=>{this.log.error(`Failed to close authentication stream reader: ${h.message}`)}),!lN(u?.webtransportCerthashes??[],i.map(h=>h.bytes)))throw new Error("Our certhashes are not a subset of the remote's reported certhashes");return!0}webtransportMuxer(e){let t=0,n=this.config,i=this;return{protocol:"webtransport",createStreamMuxer:s=>{typeof s=="function"&&(s={onIncomingStream:s});let o=[];return async function(){let c=e.incomingBidirectionalStreams.getReader();for(;;){let{done:l,value:u}=await c.read();if(l)break;if(o.length>=n.maxInboundStreams)u.writable.close().catch(h=>{i.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${h.message}`)}),u.readable.cancel().catch(h=>{i.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${h.message}`)});else{let h=await A5(u,String(t++),"inbound",o,s?.onStreamEnd,i.components.logger);o.push(h),s?.onIncomingStream?.(h)}}}().catch(()=>{this.log.error("WebTransport failed to receive incoming stream")}),{protocol:"webtransport",streams:o,newStream:async c=>{let l=await e.createBidirectionalStream(),u=await A5(l,String(t++),s?.direction??"outbound",o,s?.onStreamEnd,i.components.logger);return o.push(u),u},close:async c=>{this.log("Closing webtransport muxer"),await Promise.all(o.map(async l=>l.close(c)))},abort:c=>{this.log("Aborting webtransport muxer with err:",c);for(let l of o)l.abort(c)},...T5()}}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(Op.exactMatch)}};function hN(r={}){return e=>new D5(e,r)}var Vr=te(Ui(),1);var wN=te(Z0(),1);var fN="ERR_IPNS_EXPIRED_RECORD",$1="ERR_UNRECOGNIZED_VALIDITY";var Ss="ERR_SIGNATURE_VERIFICATION",dN="ERR_UNRECOGNIZED_FORMAT";var C5="ERR_UNDEFINED_PARAMETER",pN="ERR_INVALID_RECORD_DATA",mN="ERR_INVALID_VALUE",gN="ERR_INVALID_EMBEDDED_KEY";var yN="ERR_RECORD_TOO_LARGE";var Rs;(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=()=>Ze(t)}(e=r.ValidityType||(r.ValidityType={}));let n;r.codec=()=>(n==null&&(n=le((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=>ce(i,r.codec()),r.decode=i=>ae(i,r.codec())})(Rs||(Rs={}));var P5=Pn("ipns:utils"),Xee=W("/ipns/"),jee=114;function Zee(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 EN=async(r,e)=>{if(e==null||r==null){let n=new Error("one or more of the provided parameters are not defined");throw P5.error(n),(0,Vr.default)(n,C5)}let t;if(e.pubKey!=null){try{t=Lr(e.pubKey)}catch(i){throw P5.error(i),i}if(!(await ir(e.pubKey)).equals(r))throw(0,Vr.default)(new Error("Embedded public key did not match PeerID"),gN)}else r.publicKey!=null&&(t=Lr(r.publicKey));if(t!=null)return t;throw(0,Vr.default)(new Error("no public key is available"),C5)};var xN=r=>{let e=W("ipns-signature:");return Ue([e,r])};function hf(r){let e=Rs.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,Vr.default)(new Error("missing data or signatureV2"),Ss);let t=_N(e.data),n=Jee(t.Value),i;try{i=wN.default.fromDate(Zee(G(t.Validity)))}catch{throw P5.error("unrecognized validity format (not an rfc3339 format)"),(0,Vr.default)(new Error("unrecognized validity format (not an rfc3339 format)"),dN)}if(e.value!=null&&e.signatureV1!=null)return ete(e),{value:n,validityType:Rs.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:Rs.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 vN=r=>nt(r.slice(Xee.length));var _N=r=>{let e=Pr(r);if(e.ValidityType===0)e.ValidityType=Rs.ValidityType.EOL;else throw(0,Vr.default)(new Error("Unknown validity type"),$1);return Number.isInteger(e.Sequence)&&(e.Sequence=BigInt(e.Sequence)),Number.isInteger(e.TTL)&&(e.TTL=BigInt(e.TTL)),e},Jee=r=>{if(r!=null){if(Ga(r))return`/ipns/${r.toCID().toString(Ts)}`;if(r instanceof Uint8Array){let n=G(r);n.startsWith("/")&&(r=n)}let e=r.toString().trim();if(e.startsWith("/")&&e.length>1)return e;let t=Pe.asCID(r);if(t!=null)return t.code===jee?`/ipns/${t.toString(Ts)}`:`/ipfs/${t.toV1().toString()}`;try{return r instanceof Uint8Array?`/ipfs/${Pe.decode(r).toV1().toString()}`:`/ipfs/${Pe.parse(e).toV1().toString()}`}catch{}}throw(0,Vr.default)(new Error("Value must be a valid content path starting with /"),mN)},ete=r=>{if(r.data==null)throw(0,Vr.default)(new Error("Record data is missing"),pN);let e=_N(r.data);if(!me(e.Value,r.value??new Uint8Array(0)))throw(0,Vr.default)(new Error('Field "value" did not match between protobuf and CBOR'),Ss);if(!me(e.Validity,r.validity??new Uint8Array(0)))throw(0,Vr.default)(new Error('Field "validity" did not match between protobuf and CBOR'),Ss);if(e.ValidityType!==r.validityType)throw(0,Vr.default)(new Error('Field "validityType" did not match between protobuf and CBOR'),Ss);if(e.Sequence!==r.sequence)throw(0,Vr.default)(new Error('Field "sequence" did not match between protobuf and CBOR'),Ss);if(e.TTL!==r.ttl)throw(0,Vr.default)(new Error('Field "ttl" did not match between protobuf and CBOR'),Ss)};function SN(r,e){let t=e.map((n,i)=>({record:hf(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 ff=te(Ui(),1);var H1=Pn("ipns:validator"),tte=1024*10,rte=async(r,e)=>{let t=hf(e),n;try{let i=xN(t.data);n=await r.verify(i,t.signatureV2)}catch{n=!1}if(!n)throw H1.error("record signature verification failed"),(0,ff.default)(new Error("record signature verification failed"),Ss);if(t.validityType===Rs.ValidityType.EOL){if(t.validity.toDate().getTime()<Date.now())throw H1.error("record has expired"),(0,ff.default)(new Error("record has expired"),fN)}else if(t.validityType!=null)throw H1.error("unrecognized validity type"),(0,ff.default)(new Error("unrecognized validity type"),$1);H1("ipns record for %b is valid",t.value)};async function RN(r,e){if(e.byteLength>tte)throw(0,ff.default)(new Error("record too large"),yN);let t=vN(r),n=hf(e),i=await EN(t,n);await rte(i,e)}var G1="1.1.1",W1="libp2p";var AN="3.0.0-a0692f9",TN="helia";var DN={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 Y1(r={}){return{peerId:r.peerId,addresses:{listen:["/webrtc"]},transports:[z8({discoverRelays:1}),Fk(),Uk(),hN(),cN()],connectionEncryption:[qc()],streamMuxers:[VR(),zC()],peerDiscovery:[oT(DN)],services:{autoNAT:YA(),dcutr:OT(),delegatedRouting:()=>LA("https://delegated-ipfs.dev"),dht:ED({clientMode:!0,validators:{ipns:RN},selectors:{ipns:SN}}),identify:WT({agentVersion:`${TN}/${AN} ${W1}/${G1} UserAgent=${globalThis.navigator.userAgent}`}),keychain:m1(r.keychain),ping:WC(),pubsub:WS()}}}var lr={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var Ml;(function(r){let e;(function(i){let s;i.codec=()=>(s==null&&(s=le((o,a,c={})=>{c.lengthDelimited!==!1&&a.fork(),o.key!=null&&o.key!==""&&(a.uint32(10),a.string(o.key)),o.value!=null&&o.value.byteLength>0&&(a.uint32(18),a.bytes(o.value)),c.lengthDelimited!==!1&&a.ldelim()},(o,a)=>{let c={key:"",value:new Uint8Array(0)},l=a==null?o.len:o.pos+a;for(;o.pos<l;){let u=o.uint32();switch(u>>>3){case 1:c.key=o.string();break;case 2:c.value=o.bytes();break;default:o.skipType(u&7);break}}return c})),s),i.encode=o=>ce(o,i.codec()),i.decode=o=>ae(o,i.codec())})(e=r.Peer$metadataEntry||(r.Peer$metadataEntry={}));let t;(function(i){let s;i.codec=()=>(s==null&&(s=le((o,a,c={})=>{c.lengthDelimited!==!1&&a.fork(),o.key!=null&&o.key!==""&&(a.uint32(10),a.string(o.key)),o.value!=null&&(a.uint32(18),X1.codec().encode(o.value,a)),c.lengthDelimited!==!1&&a.ldelim()},(o,a)=>{let c={key:""},l=a==null?o.len:o.pos+a;for(;o.pos<l;){let u=o.uint32();switch(u>>>3){case 1:c.key=o.string();break;case 2:c.value=X1.codec().decode(o,o.uint32());break;default:o.skipType(u&7);break}}return c})),s),i.encode=o=>ce(o,i.codec()),i.decode=o=>ae(o,i.codec())})(t=r.Peer$tagsEntry||(r.Peer$tagsEntry={}));let n;r.codec=()=>(n==null&&(n=le((i,s,o={})=>{if(o.lengthDelimited!==!1&&s.fork(),i.addresses!=null)for(let a of i.addresses)s.uint32(10),Q1.codec().encode(a,s);if(i.protocols!=null)for(let a of i.protocols)s.uint32(18),s.string(a);if(i.publicKey!=null&&(s.uint32(34),s.bytes(i.publicKey)),i.peerRecordEnvelope!=null&&(s.uint32(42),s.bytes(i.peerRecordEnvelope)),i.metadata!=null&&i.metadata.size!==0)for(let[a,c]of i.metadata.entries())s.uint32(50),r.Peer$metadataEntry.codec().encode({key:a,value:c},s);if(i.tags!=null&&i.tags.size!==0)for(let[a,c]of i.tags.entries())s.uint32(58),r.Peer$tagsEntry.codec().encode({key:a,value:c},s);o.lengthDelimited!==!1&&s.ldelim()},(i,s)=>{let o={addresses:[],protocols:[],metadata:new Map,tags:new Map},a=s==null?i.len:i.pos+s;for(;i.pos<a;){let c=i.uint32();switch(c>>>3){case 1:o.addresses.push(Q1.codec().decode(i,i.uint32()));break;case 2:o.protocols.push(i.string());break;case 4:o.publicKey=i.bytes();break;case 5:o.peerRecordEnvelope=i.bytes();break;case 6:{let l=r.Peer$metadataEntry.codec().decode(i,i.uint32());o.metadata.set(l.key,l.value);break}case 7:{let l=r.Peer$tagsEntry.codec().decode(i,i.uint32());o.tags.set(l.key,l.value);break}default:i.skipType(c&7);break}}return o})),n),r.encode=i=>ce(i,r.codec()),r.decode=i=>ae(i,r.codec())})(Ml||(Ml={}));var Q1;(function(r){let e;r.codec=()=>(e==null&&(e=le((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.multiaddr!=null&&t.multiaddr.byteLength>0&&(n.uint32(10),n.bytes(t.multiaddr)),t.isCertified!=null&&(n.uint32(16),n.bool(t.isCertified)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={multiaddr:new Uint8Array(0)},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.multiaddr=t.bytes();break;case 2:i.isCertified=t.bool();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ce(t,r.codec()),r.decode=t=>ae(t,r.codec())})(Q1||(Q1={}));var X1;(function(r){let e;r.codec=()=>(e==null&&(e=le((t,n,i={})=>{i.lengthDelimited!==!1&&n.fork(),t.value!=null&&t.value!==0&&(n.uint32(8),n.uint32(t.value)),t.expiry!=null&&(n.uint32(16),n.uint64(t.expiry)),i.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let i={value:0},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let o=t.uint32();switch(o>>>3){case 1:i.value=t.uint32();break;case 2:i.expiry=t.uint64();break;default:t.skipType(o&7);break}}return i})),e),r.encode=t=>ce(t,r.codec()),r.decode=t=>ae(t,r.codec())})(X1||(X1={}));function Ul(r,e){let t=Ml.decode(e);t.publicKey!=null&&r.publicKey==null&&(r=mE({...r,publicKey:r.publicKey}));let n=new Map,i=BigInt(Date.now());for(let[s,o]of t.tags.entries())o.expiry!=null&&o.expiry<i||n.set(s,o);return{...t,id:r,addresses:t.addresses.map(({multiaddr:s,isCertified:o})=>({multiaddr:se(s),isCertified:o??!1})),metadata:t.metadata,peerRecordEnvelope:t.peerRecordEnvelope??void 0,tags:n}}var k5="/peers/";function Fl(r){if(!Ga(r)||r.type==null)throw new E("Invalid PeerId",lr.ERR_INVALID_PARAMETERS);let e=r.toCID().toString();return new Xe(`${k5}${e}`)}async function CN(r,e,t){let n=new Map;for(let i of t){if(i==null)continue;if(i.multiaddr instanceof Uint8Array&&(i.multiaddr=se(i.multiaddr)),!ao(i.multiaddr))throw new E("Multiaddr was invalid",lr.ERR_INVALID_PARAMETERS);if(!await e(r,i.multiaddr))continue;let s=i.isCertified??!1,o=i.multiaddr.toString(),a=n.get(o);a!=null?i.isCertified=a.isCertified||s:n.set(o,{multiaddr:i.multiaddr,isCertified:s})}return[...n.values()].sort((i,s)=>i.multiaddr.toString().localeCompare(s.multiaddr.toString())).map(({isCertified:i,multiaddr:s})=>({isCertified:i,multiaddr:s.bytes}))}async function Z1(r,e,t,n){if(e==null)throw new E("Invalid PeerData",lr.ERR_INVALID_PARAMETERS);if(e.publicKey!=null&&r.publicKey!=null&&!me(e.publicKey,r.publicKey))throw new E("publicKey bytes do not match peer id publicKey bytes",lr.ERR_INVALID_PARAMETERS);let i=n.existingPeer;if(i!=null&&!r.equals(i.id))throw new E("peer id did not match existing peer id",lr.ERR_INVALID_PARAMETERS);let s=i?.addresses??[],o=new Set(i?.protocols??[]),a=i?.metadata??new Map,c=i?.tags??new Map,l=i?.peerRecordEnvelope;if(t==="patch"){if((e.multiaddrs!=null||e.addresses!=null)&&(s=[],e.multiaddrs!=null&&s.push(...e.multiaddrs.map(h=>({isCertified:!1,multiaddr:h}))),e.addresses!=null&&s.push(...e.addresses)),e.protocols!=null&&(o=new Set(e.protocols)),e.metadata!=null){let h=e.metadata instanceof Map?[...e.metadata.entries()]:Object.entries(e.metadata);a=j1(h,{validate:PN})}if(e.tags!=null){let h=e.tags instanceof Map?[...e.tags.entries()]:Object.entries(e.tags);c=j1(h,{validate:kN,map:NN})}e.peerRecordEnvelope!=null&&(l=e.peerRecordEnvelope)}if(t==="merge"){if(e.multiaddrs!=null&&s.push(...e.multiaddrs.map(h=>({isCertified:!1,multiaddr:h}))),e.addresses!=null&&s.push(...e.addresses),e.protocols!=null&&(o=new Set([...o,...e.protocols])),e.metadata!=null){let h=e.metadata instanceof Map?[...e.metadata.entries()]:Object.entries(e.metadata);for(let[f,p]of h)p==null?a.delete(f):a.set(f,p);a=j1([...a.entries()],{validate:PN})}if(e.tags!=null){let h=e.tags instanceof Map?[...e.tags.entries()]:Object.entries(e.tags),f=new Map(c);for(let[p,d]of h)d==null?f.delete(p):f.set(p,d);c=j1([...f.entries()],{validate:kN,map:NN})}e.peerRecordEnvelope!=null&&(l=e.peerRecordEnvelope)}let u={addresses:await CN(r,n.addressFilter??(async()=>!0),s),protocols:[...o.values()].sort((h,f)=>h.localeCompare(f)),metadata:a,tags:c,publicKey:i?.id.publicKey??e.publicKey??r.publicKey,peerRecordEnvelope:l};return r.type!=="RSA"&&delete u.publicKey,u}function j1(r,e){let t=new Map;for(let[n,i]of r)i!=null&&e.validate(n,i);for(let[n,i]of r.sort(([s],[o])=>s.localeCompare(o)))i!=null&&t.set(n,e.map?.(n,i)??i);return t}function PN(r,e){if(typeof r!="string")throw new E("Metadata key must be a string",lr.ERR_INVALID_PARAMETERS);if(!(e instanceof Uint8Array))throw new E("Metadata value must be a Uint8Array",lr.ERR_INVALID_PARAMETERS)}function kN(r,e){if(typeof r!="string")throw new E("Tag name must be a string",lr.ERR_INVALID_PARAMETERS);if(e.value!=null){if(parseInt(`${e.value}`,10)!==e.value)throw new E("Tag value must be an integer",lr.ERR_INVALID_PARAMETERS);if(e.value<0||e.value>100)throw new E("Tag value must be between 0-100",lr.ERR_INVALID_PARAMETERS)}if(e.ttl!=null){if(parseInt(`${e.ttl}`,10)!==e.ttl)throw new E("Tag ttl must be an integer",lr.ERR_INVALID_PARAMETERS);if(e.ttl<0)throw new E("Tag ttl must be between greater than 0",lr.ERR_INVALID_PARAMETERS)}}function NN(r,e){let t;return e.expiry!=null&&(t=e.expiry),e.ttl!=null&&(t=BigInt(Date.now()+Number(e.ttl))),{value:e.value??0,expiry:t}}function J1(r,e,t){let n=r.toString().split("/")[2],i=Ft.decode(n),s=nt(i),o=t.get(s);if(o!=null)return o;let a=Ul(s,e);return t.set(s,a),a}function nte(r,e){return r==null?{}:{prefix:k5,filters:(r.filters??[]).map(t=>({key:n,value:i})=>t(J1(n,i,e))),orders:(r.orders??[]).map(t=>(n,i)=>t(J1(n.key,n.value,e),J1(i.key,i.value,e)))}}var e2=class{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=_u({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(Fl(e))}async delete(e){if(this.peerId.equals(e))throw new E("Cannot delete self peer",lr.ERR_INVALID_PARAMETERS);await this.datastore.delete(Fl(e))}async load(e){let t=await this.datastore.get(Fl(e));return Ul(e,t)}async save(e,t){let{existingBuf:n,existingPeer:i}=await this.#e(e),s=await Z1(e,t,"patch",{addressFilter:this.addressFilter});return this.#t(e,s,n,i)}async patch(e,t){let{existingBuf:n,existingPeer:i}=await this.#e(e),s=await Z1(e,t,"patch",{addressFilter:this.addressFilter,existingPeer:i});return this.#t(e,s,n,i)}async merge(e,t){let{existingBuf:n,existingPeer:i}=await this.#e(e),s=await Z1(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:i});return this.#t(e,s,n,i)}async*all(e){let t=new $t;for await(let{key:n,value:i}of this.datastore.query(nte(e??{},t))){let s=J1(n,i,t);s.id.equals(this.peerId)||(yield s)}}async#e(e){try{let t=await this.datastore.get(Fl(e)),n=Ul(e,t);return{existingBuf:t,existingPeer:n}}catch(t){if(t.code!=="ERR_NOT_FOUND")throw t}return{}}async#t(e,t,n,i){let s=Ml.encode(t);return n!=null&&me(s,n)?{peer:Ul(e,s),previous:i,updated:!1}:(await this.datastore.put(Fl(e),s),{peer:Ul(e,s),previous:i,updated:!0})}};var t2=class{store;events;peerId;log;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-store"),this.events=e.events,this.peerId=e.peerId,this.store=new e2(e,t)}async forEach(e,t){this.log.trace("forEach await read lock");let n=await this.store.lock.readLock();this.log.trace("forEach got read lock");try{for await(let i of this.store.all(t))e(i)}finally{this.log.trace("forEach release read lock"),n()}}async all(e){this.log.trace("all await read lock");let t=await this.store.lock.readLock();this.log.trace("all got read lock");try{return await Ql(this.store.all(e))}finally{this.log.trace("all release read lock"),t()}}async delete(e){this.log.trace("delete await write lock");let t=await this.store.lock.writeLock();this.log.trace("delete got write lock");try{await this.store.delete(e)}finally{this.log.trace("delete release write lock"),t()}}async has(e){this.log.trace("has await read lock");let t=await this.store.lock.readLock();this.log.trace("has got read lock");try{return await this.store.has(e)}finally{this.log.trace("has release read lock"),t()}}async get(e){this.log.trace("get await read lock");let t=await this.store.lock.readLock();this.log.trace("get got read lock");try{return await this.store.load(e)}finally{this.log.trace("get release read lock"),t()}}async save(e,t){this.log.trace("save await write lock");let n=await this.store.lock.writeLock();this.log.trace("save got write lock");try{let i=await this.store.save(e,t);return this.#e(e,i),i.peer}finally{this.log.trace("save release write lock"),n()}}async patch(e,t){this.log.trace("patch await write lock");let n=await this.store.lock.writeLock();this.log.trace("patch got write lock");try{let i=await this.store.patch(e,t);return this.#e(e,i),i.peer}finally{this.log.trace("patch release write lock"),n()}}async merge(e,t){this.log.trace("merge await write lock");let n=await this.store.lock.writeLock();this.log.trace("merge got write lock");try{let i=await this.store.merge(e,t);return this.#e(e,i),i.peer}finally{this.log.trace("merge release write lock"),n()}}async consumePeerRecord(e,t){let n=await Sn.openAndCertify(e,nn.DOMAIN);if(t?.equals(n.peerId)===!1)return this.log("envelope peer id was not the expected peer id - expected: %p received: %p",t,n.peerId),!1;let i=nn.createFromProtobuf(n.payload),s;try{s=await this.get(n.peerId)}catch(o){if(o.code!=="ERR_NOT_FOUND")throw o}if(s?.peerRecordEnvelope!=null){let o=await Sn.createFromProtobuf(s.peerRecordEnvelope),a=nn.createFromProtobuf(o.payload);if(a.seqNumber>=i.seqNumber)return this.log("sequence number was lower or equal to existing sequence number - stored: %d received: %d",a.seqNumber,i.seqNumber),!1}return await this.patch(i.peerId,{peerRecordEnvelope:e,addresses:i.multiaddrs.map(o=>({isCertified:!0,multiaddr:o}))}),!0}#e(e,t){t.updated&&(this.peerId.equals(e)?this.events.safeDispatchEvent("self:peer:update",{detail:t}):this.events.safeDispatchEvent("peer:update",{detail:t}))}};function ON(r,e){let t;return function(){let n=function(){t=void 0,r()};clearTimeout(t),t=setTimeout(n,e)}}var ite=r=>r;function N5(r,e){let t=r.getPeerId();return t!=null&&Se(t).equals(e)&&(r=r.decapsulate(se(`/p2p/${e.toString()}`))),r}var r2=class{log;components;listen;announce;observed;announceFilter;constructor(e,t={}){let{listen:n=[],announce:i=[]}=t;this.components=e,this.log=e.logger.forComponent("libp2p:address-manager"),this.listen=n.map(s=>s.toString()),this.announce=new Set(i.map(s=>s.toString())),this.observed=new Map,this.announceFilter=t.announceFilter??ite,this._updatePeerStoreAddresses=ON(this._updatePeerStoreAddresses.bind(this),1e3),e.events.addEventListener("transport:listening",()=>{this._updatePeerStoreAddresses()}),e.events.addEventListener("transport:close",()=>{this._updatePeerStoreAddresses()})}_updatePeerStoreAddresses(){let e=this.getAnnounceAddrs().concat(this.components.transportManager.getAddrs()).concat([...this.observed.entries()].filter(([t,n])=>n.confident).map(([t])=>se(t))).map(t=>t.getPeerId()===this.components.peerId.toString()?t.decapsulate(`/p2p/${this.components.peerId.toString()}`):t);this.components.peerStore.patch(this.components.peerId,{multiaddrs:e}).catch(t=>{this.log.error("error updating addresses",t)})}getListenAddrs(){return Array.from(this.listen).map(e=>se(e))}getAnnounceAddrs(){return Array.from(this.announce).map(e=>se(e))}getObservedAddrs(){return Array.from(this.observed).map(([e])=>se(e))}addObservedAddr(e){e=N5(e,this.components.peerId);let t=e.toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){e=N5(e,this.components.peerId);let t=e.toString(),i=(this.observed.get(t)??{confident:!1}).confident;this.observed.set(t,{confident:!0}),i||this._updatePeerStoreAddresses()}removeObservedAddr(e){e=N5(e,this.components.peerId);let t=e.toString();this.observed.delete(t)}getAddresses(){let e=this.getAnnounceAddrs().map(n=>n.toString());e.length===0&&(e=this.components.transportManager.getAddrs().map(n=>n.toString())),e=e.concat(Array.from(this.observed).filter(([n,i])=>i.confident).map(([n])=>n));let t=new Set(e);return this.announceFilter(Array.from(t).map(n=>se(n))).map(n=>n.protos().pop()?.path===!0||n.getPeerId()===this.components.peerId.toString()?n:n.encapsulate(`/p2p/${this.components.peerId.toString()}`))}};var O5=class{components={};_started=!1;constructor(e={}){this.components={};for(let[t,n]of Object.entries(e))this.components[t]=n;this.components.logger==null&&(this.components.logger=Ua())}isStarted(){return this._started}async _invokeStartableMethod(e){await Promise.all(Object.values(this.components).filter(t=>Df(t)).map(async t=>{await t[e]?.()}))}async beforeStart(){await this._invokeStartableMethod("beforeStart")}async start(){await this._invokeStartableMethod("start"),this._started=!0}async afterStart(){await this._invokeStartableMethod("afterStart")}async beforeStop(){await this._invokeStartableMethod("beforeStop")}async stop(){await this._invokeStartableMethod("stop"),this._started=!1}async afterStop(){await this._invokeStartableMethod("afterStop")}},ste=["metrics","connectionProtector"],ote=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];function LN(r={}){let e=new O5(r);return new Proxy(e,{get(n,i,s){if(typeof i=="string"&&!ote.includes(i)){let o=e.components[i];if(o==null&&!ste.includes(i))throw new E(`${i} not set`,"ERR_SERVICE_MISSING");return o}return Reflect.get(n,i,s)},set(n,i,s){return typeof i=="string"?e.components[i]=s:Reflect.set(n,i,s),!0}})}function BN(r={}){return{denyDialPeer:async()=>!1,denyDialMultiaddr:async e=>{let t=e.stringTuples();return t[0][0]===4||t[0][0]===41?!!_n(`${t[0][1]}`):!1},denyInboundConnection:async()=>!1,denyOutboundConnection:async()=>!1,denyInboundEncryptedConnection:async()=>!1,denyOutboundEncryptedConnection:async()=>!1,denyInboundUpgradedConnection:async()=>!1,denyOutboundUpgradedConnection:async()=>!1,filterMultiaddrForPeer:async()=>!0,...r}}function L5(r){try{let{address:e}=r.nodeAddress();return!!_n(e)}catch{return!0}}function ate(r,e){let t=L5(r.multiaddr),n=L5(e.multiaddr);return t&&!n?1:!t&&n?-1:0}function cte(r,e){return r.isCertified&&!e.isCertified?-1:!r.isCertified&&e.isCertified?1:0}function lte(r,e){let t=zh.exactMatch(r.multiaddr),n=zh.exactMatch(e.multiaddr);return t&&!n?1:!t&&n?-1:0}function Kl(r,e){let t=ate(r,e);if(t!==0)return t;let n=lte(r,e);return n!==0?n:cte(r,e)}var M5=te(xf(),1),U5=te(FN(),1);function n2(r,e,t){return`${r}?name=${e}&type=${t}`}async function KN(r,e){return await(await fetch(r,{headers:new Headers({accept:"application/dns-json"}),signal:e})).json()}function Aa(r,e){return`${e}_${r}`}var B5=Object.assign((0,M5.default)("dns-over-http-resolver"),{error:(0,M5.default)("dns-over-http-resolver:error")}),F5=class{_cache;_TXTcache;_servers;_request;_abortControllers;constructor(e={}){this._cache=new U5.default({max:e?.maxCache??100}),this._TXTcache=new U5.default({max:e?.maxCache??100}),this._servers=["https://cloudflare-dns.com/dns-query","https://dns.google/resolve"],this._request=e.request??KN,this._abortControllers=[]}cancel(){this._abortControllers.forEach(e=>{e.abort()})}getServers(){return this._servers}_getShuffledServers(){let e=[...this._servers];for(let t=e.length-1;t>0;t--){let n=Math.floor(Math.random()*t),i=e[t];e[t]=e[n],e[n]=i}return e}setServers(e){this._servers=e}async resolve(e,t="A"){switch(t){case"A":return this.resolve4(e);case"AAAA":return this.resolve6(e);case"TXT":return this.resolveTxt(e);default:throw new Error(`${t} is not supported`)}}async resolve4(e){let t="A",n=this._cache.get(Aa(e,t));if(n!=null)return n;let i=!1;for(let s of this._getShuffledServers()){let o=new AbortController;this._abortControllers.push(o);try{let a=await this._request(n2(s,e,t),o.signal),c=a.Answer.map(u=>u.data),l=Math.min(...a.Answer.map(u=>u.TTL));return this._cache.set(Aa(e,t),c,{ttl:l}),c}catch{o.signal.aborted&&(i=!0),B5.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==o)}}throw i?Object.assign(new Error("queryA ECANCELLED"),{code:"ECANCELLED"}):new Error(`Could not resolve ${e} record ${t}`)}async resolve6(e){let t="AAAA",n=this._cache.get(Aa(e,t));if(n!=null)return n;let i=!1;for(let s of this._getShuffledServers()){let o=new AbortController;this._abortControllers.push(o);try{let a=await this._request(n2(s,e,t),o.signal),c=a.Answer.map(u=>u.data),l=Math.min(...a.Answer.map(u=>u.TTL));return this._cache.set(Aa(e,t),c,{ttl:l}),c}catch{o.signal.aborted&&(i=!0),B5.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==o)}}throw i?Object.assign(new Error("queryAaaa ECANCELLED"),{code:"ECANCELLED"}):new Error(`Could not resolve ${e} record ${t}`)}async resolveTxt(e){let t="TXT",n=this._TXTcache.get(Aa(e,t));if(n!=null)return n;let i=!1;for(let s of this._getShuffledServers()){let o=new AbortController;this._abortControllers.push(o);try{let a=await this._request(n2(s,e,t),o.signal),c=a.Answer.map(u=>[u.data.replace(/['"]+/g,"")]),l=Math.min(...a.Answer.map(u=>u.TTL));return this._TXTcache.set(Aa(e,t),c,{ttl:l}),c}catch{o.signal.aborted&&(i=!0),B5.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==o)}}throw i?Object.assign(new Error("queryTxt ECANCELLED"),{code:"ECANCELLED"}):new Error(`Could not resolve ${e} record ${t}`)}clearCache(){this._cache.clear(),this._TXTcache.clear()}},VN=F5;var qN=VN;var{code:pte}=pe("dnsaddr");async function Vl(r,e={}){let t=new qN;e.signal!=null&&e.signal.addEventListener("abort",()=>{t.cancel()});let n=r.getPeerId(),[,i]=r.stringTuples().find(([a])=>a===pte)??[];if(i==null)throw new Error("No hostname found in multiaddr");let o=(await t.resolveTxt(`_dnsaddr.${i}`)).flat().map(a=>a.split("=")[1]).filter(Boolean);return n!=null&&(o=o.filter(a=>a.includes(n))),o}var Is;(function(r){r.NOT_STARTED_YET="The libp2p node is not started yet",r.ERR_PROTECTOR_REQUIRED="Private network is enforced, but no protector was provided",r.NOT_FOUND="Not found"})(Is||(Is={}));var ne;(function(r){r.ERR_PROTECTOR_REQUIRED="ERR_PROTECTOR_REQUIRED",r.ERR_PEER_DIAL_INTERCEPTED="ERR_PEER_DIAL_INTERCEPTED",r.ERR_CONNECTION_INTERCEPTED="ERR_CONNECTION_INTERCEPTED",r.ERR_INVALID_PROTOCOLS_FOR_STREAM="ERR_INVALID_PROTOCOLS_FOR_STREAM",r.ERR_CONNECTION_ENDED="ERR_CONNECTION_ENDED",r.ERR_CONNECTION_FAILED="ERR_CONNECTION_FAILED",r.ERR_NODE_NOT_STARTED="ERR_NODE_NOT_STARTED",r.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",r.ERR_TOO_MANY_ADDRESSES="ERR_TOO_MANY_ADDRESSES",r.ERR_NO_VALID_ADDRESSES="ERR_NO_VALID_ADDRESSES",r.ERR_RELAYED_DIAL="ERR_RELAYED_DIAL",r.ERR_DIALED_SELF="ERR_DIALED_SELF",r.ERR_DISCOVERED_SELF="ERR_DISCOVERED_SELF",r.ERR_DUPLICATE_TRANSPORT="ERR_DUPLICATE_TRANSPORT",r.ERR_ENCRYPTION_FAILED="ERR_ENCRYPTION_FAILED",r.ERR_HOP_REQUEST_FAILED="ERR_HOP_REQUEST_FAILED",r.ERR_INVALID_KEY="ERR_INVALID_KEY",r.ERR_INVALID_MESSAGE="ERR_INVALID_MESSAGE",r.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",r.ERR_INVALID_PEER="ERR_INVALID_PEER",r.ERR_MUXER_UNAVAILABLE="ERR_MUXER_UNAVAILABLE",r.ERR_NOT_FOUND="ERR_NOT_FOUND",r.ERR_TRANSPORT_UNAVAILABLE="ERR_TRANSPORT_UNAVAILABLE",r.ERR_TRANSPORT_DIAL_FAILED="ERR_TRANSPORT_DIAL_FAILED",r.ERR_UNSUPPORTED_PROTOCOL="ERR_UNSUPPORTED_PROTOCOL",r.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED="ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED",r.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",r.ERR_SIGNATURE_NOT_VALID="ERR_SIGNATURE_NOT_VALID",r.ERR_FIND_SELF="ERR_FIND_SELF",r.ERR_NO_ROUTERS_AVAILABLE="ERR_NO_ROUTERS_AVAILABLE",r.ERR_CONNECTION_NOT_MULTIPLEXED="ERR_CONNECTION_NOT_MULTIPLEXED",r.ERR_NO_DIAL_TOKENS="ERR_NO_DIAL_TOKENS",r.ERR_INVALID_CMS="ERR_INVALID_CMS",r.ERR_MISSING_KEYS="ERR_MISSING_KEYS",r.ERR_NO_KEY="ERR_NO_KEY",r.ERR_INVALID_KEY_NAME="ERR_INVALID_KEY_NAME",r.ERR_INVALID_KEY_TYPE="ERR_INVALID_KEY_TYPE",r.ERR_KEY_ALREADY_EXISTS="ERR_KEY_ALREADY_EXISTS",r.ERR_INVALID_KEY_SIZE="ERR_INVALID_KEY_SIZE",r.ERR_KEY_NOT_FOUND="ERR_KEY_NOT_FOUND",r.ERR_OLD_KEY_NAME_INVALID="ERR_OLD_KEY_NAME_INVALID",r.ERR_NEW_KEY_NAME_INVALID="ERR_NEW_KEY_NAME_INVALID",r.ERR_PASSWORD_REQUIRED="ERR_PASSWORD_REQUIRED",r.ERR_PEM_REQUIRED="ERR_PEM_REQUIRED",r.ERR_CANNOT_READ_KEY="ERR_CANNOT_READ_KEY",r.ERR_MISSING_PRIVATE_KEY="ERR_MISSING_PRIVATE_KEY",r.ERR_MISSING_PUBLIC_KEY="ERR_MISSING_PUBLIC_KEY",r.ERR_INVALID_OLD_PASS_TYPE="ERR_INVALID_OLD_PASS_TYPE",r.ERR_INVALID_NEW_PASS_TYPE="ERR_INVALID_NEW_PASS_TYPE",r.ERR_INVALID_PASS_LENGTH="ERR_INVALID_PASS_LENGTH",r.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",r.ERR_WRONG_PING_ACK="ERR_WRONG_PING_ACK",r.ERR_INVALID_RECORD="ERR_INVALID_RECORD",r.ERR_ALREADY_SUCCEEDED="ERR_ALREADY_SUCCEEDED",r.ERR_NO_HANDLER_FOR_PROTOCOL="ERR_NO_HANDLER_FOR_PROTOCOL",r.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS",r.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",r.ERR_CONNECTION_DENIED="ERR_CONNECTION_DENIED",r.ERR_TRANSFER_LIMIT_EXCEEDED="ERR_TRANSFER_LIMIT_EXCEEDED"})(ne||(ne={}));var mte={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:r=>r},connectionManager:{resolvers:{dnsaddr:Vl},addressSorter:Kl},transportManager:{faultTolerance:Ps.FATAL_ALL}};function zN(r){let e=vl(mte,r);if(e.connectionProtector===null&&globalThis.process?.env?.LIBP2P_FORCE_PNET!=null)throw new E(Is.ERR_PROTECTOR_REQUIRED,ne.ERR_PROTECTOR_REQUIRED);return e}var GN=te(A6(),1);function i2(r){if(Ga(r))return{peerId:r,multiaddrs:[]};Array.isArray(r)||(r=[r]);let e;if(r.length>0){let t=r[0].getPeerId();e=t==null?void 0:Se(t),r.forEach(n=>{if(!ao(n))throw new E("Invalid Multiaddr",ne.ERR_INVALID_MULTIADDR);let i=n.getPeerId();if(i==null){if(e!=null)throw new E("Multiaddrs must all have the same peer id or have no peer id",ne.ERR_INVALID_PARAMETERS)}else{let s=Se(i);if(e==null||!e.equals(s))throw new E("Multiaddrs must all have the same peer id or have no peer id",ne.ERR_INVALID_PARAMETERS)}})}return{peerId:e,multiaddrs:r}}var s2="last-dial-failure";var o2=5,a2=100,c2=50,$N=1e3*60*7;var Ta={minConnections:o2,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:$N,autoDialDiscoveredPeersDebounce:10},l2=class{connectionManager;peerStore;queue;minConnections;autoDialPriority;autoDialIntervalMs;autoDialMaxQueueLength;autoDialPeerRetryThresholdMs;autoDialDiscoveredPeersDebounce;autoDialInterval;started;running;log;constructor(e,t){this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.minConnections=t.minConnections??Ta.minConnections,this.autoDialPriority=t.autoDialPriority??Ta.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??Ta.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??Ta.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??Ta.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??Ta.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new go({concurrency:t.autoDialConcurrency??Ta.autoDialConcurrency,metricName:"libp2p_autodial_queue",metrics:e.metrics}),this.queue.addEventListener("error",i=>{this.log.error("error during auto-dial",i.detail)}),e.events.addEventListener("connection:close",()=>{this.autoDial().catch(i=>{this.log.error(i)})});let n;e.events.addEventListener("peer:discovery",()=>{clearTimeout(n),n=setTimeout(()=>{this.autoDial().catch(i=>{this.log.error(i)})},this.autoDialDiscoveredPeersDebounce)})}isStarted(){return this.started}start(){this.started=!0}afterStart(){this.autoDial().catch(e=>{this.log.error("error while autodialing",e)})}stop(){this.queue.clear(),clearTimeout(this.autoDialInterval),this.started=!1,this.running=!1}async autoDial(){if(!this.started||this.running)return;let e=this.connectionManager.getConnectionsMap(),t=e.size;if(t>=this.minConnections){this.minConnections>0&&this.log.trace("have enough connections %d/%d",t,this.minConnections);return}if(this.queue.size>this.autoDialMaxQueueLength){this.log("not enough connections %d/%d but auto dial queue is full",t,this.minConnections),this.sheduleNextAutodial();return}this.running=!0,this.log("not enough connections %d/%d - will dial peers to increase the number of connections",t,this.minConnections);let n=new Ht(this.connectionManager.getDialQueue().map(l=>l.peerId).filter(Boolean)),i=await this.peerStore.all({filters:[l=>l.addresses.length===0?(this.log.trace("not autodialing %p because they have no addresses",l.id),!1):e.has(l.id)?(this.log.trace("not autodialing %p because they are already connected",l.id),!1):n.has(l.id)?(this.log.trace("not autodialing %p because they are already being dialed",l.id),!1):this.queue.has(l.id)?(this.log.trace("not autodialing %p because they are already being autodialed",l.id),!1):!0]}),s=i.sort(()=>Math.random()>.5?1:-1),o=new $t;for(let l of s)o.has(l.id)||o.set(l.id,[...l.tags.values()].reduce((u,h)=>u+h.value,0));let c=s.sort((l,u)=>{let h=o.get(l.id)??0,f=o.get(u.id)??0;return h>f?-1:h<f?1:0}).filter(l=>{let u=l.metadata.get(s2);if(u==null)return!0;let h=parseInt(G(u));return isNaN(h)?!0:Date.now()-h>this.autoDialPeerRetryThresholdMs});this.log("selected %d/%d peers to dial",c.length,i.length);for(let l of c)this.queue.add(async()=>{let u=this.connectionManager.getConnectionsMap().size;if(u>=this.minConnections){this.log("got enough connections now %d/%d",u,this.minConnections),this.queue.clear();return}this.log("connecting to a peerStore stored peer %p",l.id),await this.connectionManager.openConnection(l.id,{priority:this.autoDialPriority})},{peerId:l.id}).catch(u=>{this.log.error("could not connect to peerStore stored peer",u)});this.running=!1,this.sheduleNextAutodial()}sheduleNextAutodial(){this.started&&(this.autoDialInterval=setTimeout(()=>{this.autoDial().catch(e=>{this.log.error("error while autodialing",e)})},this.autoDialIntervalMs))}};var HN={maxConnections:a2,allow:[]},u2=class{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??HN.maxConnections,this.allow=t.allow??HN.allow,this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager:connection-pruner"),e.events.addEventListener("connection:open",()=>{this.maybePruneConnections().catch(n=>{this.log.error(n)})})}async maybePruneConnections(){let e=this.connectionManager.getConnections(),t=e.length,n=Math.max(t-this.maxConnections,0);if(this.log("checking max connections limit %d/%d",t,this.maxConnections),t<=this.maxConnections)return;this.log("max connections limit exceeded %d/%d, pruning %d connection(s)",t,this.maxConnections,n);let i=new $t;for(let a of e){let c=a.remotePeer;if(!i.has(c)){i.set(c,0);try{let l=await this.peerStore.get(c);i.set(c,[...l.tags.values()].reduce((u,h)=>u+h.value,0))}catch(l){l.code!=="ERR_NOT_FOUND"&&this.log.error("error loading peer tags",l)}}}let s=e.sort((a,c)=>{let l=i.get(a.remotePeer)??0,u=i.get(c.remotePeer)??0;if(l>u)return 1;if(l<u)return-1;let h=a.timeline.open,f=c.timeline.open;return h<f?1:h>f?-1:0}),o=[];for(let a of s)if(this.log("too many connections open - closing a connection to %p",a.remotePeer),this.allow.some(l=>a.remoteAddr.toString().startsWith(l.toString()))||o.push(a),o.length===n)break;await Promise.all(o.map(async a=>{try{await a.close()}catch(c){this.log.error(c)}})),this.events.safeDispatchEvent("connection:prune",{detail:o})}};async function z5(r,e){if(!r.protoNames().includes("dnsaddr"))return[r];let n=await bte(r,e),o=(await Promise.all(n.map(async a=>z5(a,e)))).flat().reduce((a,c)=>(a.find(l=>l.equals(c))==null&&a.push(c),a),[]);return e.log("resolved %s to",r,o.map(a=>a.toString())),o}async function bte(r,e){try{return r=se(r.toString()),await r.resolve(e)}catch(t){return e.log.error(`multiaddr ${r.toString()} could not be resolved`,t),[]}}var h2={addressSorter:Kl,maxParallelDials:c2,maxPeerAddrsToDial:25,dialTimeout:3e4,resolvers:{dnsaddr:Vl}},f2=class{queue;components;addressSorter;maxPeerAddrsToDial;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??h2.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??h2.maxPeerAddrsToDial,this.dialTimeout=t.dialTimeout??h2.dialTimeout,this.connections=t.connections??new $t,this.log=e.logger.forComponent("libp2p:connection-manager:dial-queue"),this.components=e,this.shutDownController=new AbortController,qe(1/0,this.shutDownController.signal);for(let[n,i]of Object.entries(t.resolvers??{}))z0.set(n,i);this.queue=new Gi({concurrency:t.maxParallelDials??h2.maxParallelDials,metricName:"libp2p_dial_queue",metrics:e.metrics}),this.queue.addEventListener("error",n=>{this.log.error("error in dial queue",n.detail)})}start(){this.shutDownController=new AbortController}stop(){this.shutDownController.abort(),this.queue.abort()}async dial(e,t={}){let{peerId:n,multiaddrs:i}=i2(e),s=Array.from(this.connections.values()).flat().find(a=>t.force===!0?!1:a.remotePeer.equals(n)?!0:i.find(c=>c.equals(a.remoteAddr)));if(s!=null)return this.log("already connected to %a",s.remoteAddr),s;let o=this.queue.queue.find(a=>{if(n?.equals(a.options.peerId)===!0)return!0;let c=a.options.multiaddrs;if(c==null)return!1;for(let l of i)if(c.has(l.toString()))return!0;return!1});if(o!=null){this.log("joining existing dial target for %p",n);for(let a of i)o.options.multiaddrs.add(a.toString());return o.join(t)}return this.log("creating dial target for %p",n,i.map(a=>a.toString())),this.queue.add(async a=>{let c=this.createDialAbortController(a?.signal),l;try{l=await this.calculateMultiaddrs(n,a?.multiaddrs,{...a,signal:c}),l.map(({multiaddr:u})=>u.toString()).forEach(u=>{a?.multiaddrs.add(u)})}catch(u){throw c.clear(),u}try{let u=0,h=[];for(let f of l){if(u===this.maxPeerAddrsToDial)throw this.log("dialed maxPeerAddrsToDial (%d) addresses for %p, not trying any others",u,n),new E("Peer had more than maxPeerAddrsToDial",ne.ERR_TOO_MANY_ADDRESSES);u++;try{let p=await this.components.transportManager.dial(f.multiaddr,{...a,signal:c});return this.log("dial to %a succeeded",f.multiaddr),p}catch(p){if(this.log.error("dial failed to %a",f.multiaddr,p),n!=null)try{await this.components.peerStore.patch(n,{metadata:{[s2]:W(Date.now().toString())}})}catch(d){this.log.error("could not update last dial failure key for %p",n,d)}if(c.aborted)throw new E(p.message,$i);h.push(p)}}throw h.length===1?h[0]:new Tf(h,"All multiaddr dials failed",ne.ERR_TRANSPORT_DIAL_FAILED)}finally{c.clear()}},{peerId:n,priority:t.priority,multiaddrs:new Set(i.map(a=>a.toString())),signal:t.signal})}createDialAbortController(e){let t=Wt([AbortSignal.timeout(this.dialTimeout),this.shutDownController.signal,e]);return qe(1/0,t),t}async calculateMultiaddrs(e,t=new Set,n={}){let i=[...t].map(h=>({multiaddr:se(h),isCertified:!1}));if(e!=null){if(this.components.peerId.equals(e))throw new E("Tried to dial self",ne.ERR_DIALED_SELF);if(await this.components.connectionGater.denyDialPeer?.(e)===!0)throw new E("The dial request is blocked by gater.allowDialPeer",ne.ERR_PEER_DIAL_INTERCEPTED);if(i.length===0){this.log("loading multiaddrs for %p",e);try{let h=await this.components.peerStore.get(e);i.push(...h.addresses),this.log("loaded multiaddrs for %p",e,i.map(({multiaddr:f})=>f.toString()))}catch(h){if(h.code!==ne.ERR_NOT_FOUND)throw h}}if(i.length===0){this.log("looking up multiaddrs for %p in the peer routing",e);try{let h=await this.components.peerRouting.findPeer(e);this.log("found multiaddrs for %p in the peer routing",e,i.map(({multiaddr:f})=>f.toString())),i.push(...h.multiaddrs.map(f=>({multiaddr:f,isCertified:!1})))}catch(h){h.code!==ne.ERR_NO_ROUTERS_AVAILABLE&&this.log.error("looking up multiaddrs for %p in the peer routing failed",e,h)}}}let s=(await Promise.all(i.map(async h=>{let f=await z5(h.multiaddr,{...n,log:this.log});return f.length===1&&f[0].equals(h.multiaddr)?h:f.map(p=>({multiaddr:p,isCertified:!1}))}))).flat();if(e!=null){let h=`/p2p/${e.toString()}`;s=s.map(f=>f.multiaddr.protos().pop()?.path===!0?f:f.multiaddr.getPeerId()==null?{multiaddr:f.multiaddr.encapsulate(h),isCertified:f.isCertified}:f)}let o=s.filter(h=>{if(this.components.transportManager.transportForMultiaddr(h.multiaddr)==null)return!1;let f=h.multiaddr.getPeerId();return e!=null&&f!=null?e.equals(f):!0}),a=new Map;for(let h of o){let f=h.multiaddr.toString(),p=a.get(f);if(p!=null){p.isCertified=p.isCertified||h.isCertified||!1;continue}a.set(f,h)}let c=[...a.values()];if(c.length===0)throw new E("The dial request has no valid addresses",ne.ERR_NO_VALID_ADDRESSES);let l=[];for(let h of c)this.components.connectionGater.denyDialMultiaddr!=null&&await this.components.connectionGater.denyDialMultiaddr(h.multiaddr)||l.push(h);let u=l.sort(this.addressSorter);if(u.length===0)throw new E("The connection gater denied all addresses in the dial request",ne.ERR_NO_VALID_ADDRESSES);return this.log.trace("addresses for %p before filtering",e??"unknown peer",s.map(({multiaddr:h})=>h.toString())),this.log.trace("addresses for %p after filtering",e??"unknown peer",u.map(({multiaddr:h})=>h.toString())),u}};var xte=50,Da={minConnections:o2,maxConnections:a2,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100},d2=class{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Da.maxConnections;let n=t.minConnections??Da.minConnections;if(this.maxConnections<n)throw new E("Connection Manager maxConnections must be greater than minConnections",ne.ERR_INVALID_PARAMETERS);this.connections=new $t,this.started=!1,this.peerStore=e.peerStore,this.metrics=e.metrics,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager"),this.onConnect=this.onConnect.bind(this),this.onDisconnect=this.onDisconnect.bind(this),this.events.addEventListener("connection:open",this.onConnect),this.events.addEventListener("connection:close",this.onDisconnect),this.allow=(t.allow??[]).map(i=>se(i)),this.deny=(t.deny??[]).map(i=>se(i)),this.incomingPendingConnections=0,this.maxIncomingPendingConnections=t.maxIncomingPendingConnections??Da.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new GN.RateLimiterMemory({points:t.inboundConnectionThreshold??Da.inboundConnectionThreshold,duration:1}),this.autoDial=new l2({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??Da.autoDialConcurrency,autoDialPriority:t.autoDialPriority??Da.autoDialPriority,maxQueueLength:t.autoDialMaxQueueLength??Da.autoDialMaxQueueLength}),this.connectionPruner=new u2({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new f2(e,{addressSorter:t.addressSorter??Kl,maxParallelDials:t.maxParallelDials??c2,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??3e4,resolvers:t.resolvers??{dnsaddr:Vl},connections:this.connections})}isStarted(){return this.started}async start(){this.metrics?.registerMetricGroup("libp2p_connection_manager_connections",{calculate:()=>{let e={inbound:0,outbound:0};for(let t of this.connections.values())for(let n of t)n.direction==="inbound"?e.inbound++:e.outbound++;return e}}),this.metrics?.registerMetricGroup("libp2p_protocol_streams_total",{label:"protocol",calculate:()=>{let e={};for(let t of this.connections.values())for(let n of t)for(let i of n.streams){let s=`${i.direction} ${i.protocol??"unnegotiated"}`;e[s]=(e[s]??0)+1}return e}}),this.metrics?.registerMetricGroup("libp2p_connection_manager_protocol_streams_per_connection_90th_percentile",{label:"protocol",calculate:()=>{let e={};for(let n of this.connections.values())for(let i of n){let s={};for(let o of i.streams){let a=`${o.direction} ${o.protocol??"unnegotiated"}`;s[a]=(s[a]??0)+1}for(let[o,a]of Object.entries(s))e[o]=e[o]??[],e[o].push(a)}let t={};for(let[n,i]of Object.entries(e)){i=i.sort((o,a)=>o-a);let s=Math.floor(i.length*.9);t[n]=i[s]}return t}}),this.dialQueue.start(),this.autoDial.start(),this.started=!0,this.log("started")}async afterStart(){Promise.resolve().then(async()=>{let e=await this.peerStore.all({filters:[t=>t.tags.has(rb)]});await Promise.all(e.map(async t=>{await this.openConnection(t.id).catch(n=>{this.log.error(n)})}))}).catch(e=>{this.log.error(e)}),this.autoDial.afterStart()}async stop(){this.dialQueue.stop(),this.autoDial.stop();let e=[];for(let t of this.connections.values())for(let n of t)e.push((async()=>{try{await n.close()}catch(i){this.log.error(i)}})());this.log("closing %d connections",e.length),await Promise.all(e),this.connections.clear(),this.log("stopped")}onConnect(e){this._onConnect(e).catch(t=>{this.log.error(t)})}async _onConnect(e){let{detail:t}=e;if(!this.started){await t.close();return}let n=t.remotePeer,i=this.connections.get(n),s=!1;i!=null?i.push(t):(s=!0,this.connections.set(n,[t])),n.publicKey!=null&&n.type==="RSA"&&await this.peerStore.patch(n,{publicKey:n.publicKey}),s&&this.events.safeDispatchEvent("peer:connect",{detail:t.remotePeer})}onDisconnect(e){let{detail:t}=e;if(!this.started)return;let n=t.remotePeer,i=this.connections.get(n);i!=null&&i.length>1?(i=i.filter(s=>s.id!==t.id),this.connections.set(n,i)):i!=null&&(this.connections.delete(n),this.events.safeDispatchEvent("peer:disconnect",{detail:t.remotePeer}))}getConnections(e){if(e!=null)return this.connections.get(e)??[];let t=[];for(let n of this.connections.values())t=t.concat(n);return t}getConnectionsMap(){return this.connections}async openConnection(e,t={}){if(!this.isStarted())throw new E("Not started",ne.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();let{peerId:n}=i2(e);if(n!=null&&t.force!==!0){this.log("dial %p",n);let a=this.getConnections(n).find(c=>!c.transient);if(a!=null)return this.log("had an existing non-transient connection to %p",n),a}let i=await this.dialQueue.dial(e,{...t,priority:t.priority??xte}),s=this.connections.get(i.remotePeer);s==null&&(s=[],this.connections.set(i.remotePeer,s));let o=!1;for(let a of s)a.id===i.id&&(o=!0);return o||s.push(i),i}async closeConnections(e,t={}){let n=this.connections.get(e)??[];await Promise.all(n.map(async i=>{try{await i.close(t)}catch(s){i.abort(s)}}))}async acceptIncomingConnection(e){if(this.deny.some(i=>e.remoteAddr.toString().startsWith(i.toString())))return this.log("connection from %a refused - connection remote address was in deny list",e.remoteAddr),!1;if(this.allow.some(i=>e.remoteAddr.toString().startsWith(i.toString())))return this.incomingPendingConnections++,!0;if(this.incomingPendingConnections===this.maxIncomingPendingConnections)return this.log("connection from %a refused - incomingPendingConnections exceeded by host",e.remoteAddr),!1;if(e.remoteAddr.isThinWaistAddress()){let i=e.remoteAddr.nodeAddress().address;try{await this.inboundConnectionRateLimiter.consume(i,1)}catch{return this.log("connection from %a refused - inboundConnectionThreshold exceeded by host %s",e.remoteAddr,i),!1}}return this.getConnections().length<this.maxConnections?(this.incomingPendingConnections++,!0):(this.log("connection from %a refused - maxConnections exceeded",e.remoteAddr),!1)}afterUpgradeInbound(){this.incomingPendingConnections--}getDialQueue(){let e={queued:"queued",running:"active",errored:"error",complete:"success"};return this.dialQueue.queue.queue.map(t=>({id:t.id,status:e[t.status],peerId:t.options.peerId,multiaddrs:[...t.options.multiaddrs].map(n=>se(n))}))}};var p2=class{routers;started;components;constructor(e,t){this.routers=t.routers??[],this.started=!1,this.components=e}isStarted(){return this.started}async start(){this.started=!0}async stop(){this.started=!1}async*findProviders(e,t={}){if(this.routers.length===0)throw new E("No content routers available",ne.ERR_NO_ROUTERS_AVAILABLE);let n=this,i=new Ht;for await(let s of Nn(...n.routers.map(o=>o.findProviders(e,t))))s!=null&&(s.multiaddrs.length>0&&await this.components.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),!i.has(s.id)&&(i.add(s.id),yield s))}async provide(e,t={}){if(this.routers.length===0)throw new E("No content routers available",ne.ERR_NO_ROUTERS_AVAILABLE);await Promise.all(this.routers.map(async n=>{await n.provide(e,t)}))}async put(e,t,n){if(!this.isStarted())throw new E(Is.NOT_STARTED_YET,ne.ERR_NODE_NOT_STARTED);await Promise.all(this.routers.map(async i=>{await i.put(e,t,n)}))}async get(e,t){if(!this.isStarted())throw new E(Is.NOT_STARTED_YET,ne.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map(async n=>n.get(e,t)))}};var m2=class{log;peerId;peerStore;routers;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-routing"),this.peerId=e.peerId,this.peerStore=e.peerStore,this.routers=t.routers??[]}async findPeer(e,t){if(this.routers.length===0)throw new E("No peer routers available",ne.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new E("Should not try to find self",ne.ERR_FIND_SELF);let n=this,i=Nn(...this.routers.map(s=>async function*(){try{yield await s.findPeer(e,t)}catch(o){n.log.error(o)}}()));for await(let s of i)if(s!=null)return s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),s;throw new E(Is.NOT_FOUND,ne.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(this.routers.length===0)throw new E("No peer routers available",ne.ERR_NO_ROUTERS_AVAILABLE);let n=this,i=new Ht;for await(let s of ys(async function*(){let o=Nn(...n.routers.map(a=>a.getClosestPeers(e,t)));for await(let a of o)yield async()=>{if(a.multiaddrs.length===0)try{a=await n.findPeer(a.id,{...t,useCache:!1})}catch(c){n.log.error("could not find peer multiaddrs",c);return}return a}}()))s!=null&&(s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),!i.has(s.id)&&(i.add(s.id),yield s))}};var G5=32,W5=64,g2=class{log;topologies;handlers;components;constructor(e){this.log=e.logger.forComponent("libp2p:registrar"),this.topologies=new Map,this.handlers=new Map,this.components=e,this._onDisconnect=this._onDisconnect.bind(this),this._onPeerUpdate=this._onPeerUpdate.bind(this),this._onPeerIdentify=this._onPeerIdentify.bind(this),this.components.events.addEventListener("peer:disconnect",this._onDisconnect),this.components.events.addEventListener("peer:update",this._onPeerUpdate),this.components.events.addEventListener("peer:identify",this._onPeerIdentify)}getProtocols(){return Array.from(new Set([...this.handlers.keys()])).sort()}getHandler(e){let t=this.handlers.get(e);if(t==null)throw new E(`No handler registered for protocol ${e}`,ne.ERR_NO_HANDLER_FOR_PROTOCOL);return t}getTopologies(e){let t=this.topologies.get(e);return t==null?[]:[...t.values()]}async handle(e,t,n){if(this.handlers.has(e))throw new E(`Handler already registered for protocol ${e}`,ne.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);let i=vl.bind({ignoreUndefined:!0})({maxInboundStreams:G5,maxOutboundStreams:W5},n);this.handlers.set(e,{handler:t,options:i}),await this.components.peerStore.merge(this.components.peerId,{protocols:[e]})}async unhandle(e){(Array.isArray(e)?e:[e]).forEach(n=>{this.handlers.delete(n)}),await this.components.peerStore.patch(this.components.peerId,{protocols:this.getProtocols()})}async register(e,t){if(t==null)throw new E("invalid topology",ne.ERR_INVALID_PARAMETERS);let n=`${(Math.random()*1e9).toString(36)}${Date.now()}`,i=this.topologies.get(e);return i==null&&(i=new Map,this.topologies.set(e,i)),i.set(n,t),n}unregister(e){for(let[t,n]of this.topologies.entries())n.has(e)&&(n.delete(e),n.size===0&&this.topologies.delete(t))}_onDisconnect(e){let t=e.detail;this.components.peerStore.get(t).then(n=>{for(let i of n.protocols){let s=this.topologies.get(i);if(s!=null)for(let o of s.values())o.onDisconnect?.(t)}}).catch(n=>{n.code!==ne.ERR_NOT_FOUND&&this.log.error("could not inform topologies of disconnecting peer %p",t,n)})}_onPeerUpdate(e){let{peer:t,previous:n}=e.detail,i=(n?.protocols??[]).filter(s=>!t.protocols.includes(s));for(let s of i){let o=this.topologies.get(s);if(o!=null)for(let a of o.values())a.onDisconnect?.(t.id)}}_onPeerIdentify(e){let t=e.detail.protocols,n=e.detail.connection,i=e.detail.peerId;for(let s of t){let o=this.topologies.get(s);if(o!=null)for(let a of o.values())n.transient&&a.notifyOnTransient!==!0||a.onConnect?.(i,n)}}};var y2=class{log;components;transports;listeners;faultTolerance;started;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:transports"),this.components=e,this.started=!1,this.transports=new Map,this.listeners=di({name:"libp2p_transport_manager_listeners",metrics:this.components.metrics}),this.faultTolerance=t.faultTolerance??Ps.FATAL_ALL}add(e){let t=e[Symbol.toStringTag];if(t==null)throw new E("Transport must have a valid tag",ne.ERR_INVALID_KEY);if(this.transports.has(t))throw new E(`There is already a transport with the tag ${t}`,ne.ERR_DUPLICATE_TRANSPORT);this.log("adding transport %s",t),this.transports.set(t,e),this.listeners.has(t)||this.listeners.set(t,[])}isStarted(){return this.started}start(){this.started=!0}async afterStart(){let e=this.components.addressManager.getListenAddrs();await this.listen(e)}async stop(){let e=[];for(let[t,n]of this.listeners)for(this.log("closing listeners for %s",t);n.length>0;){let i=n.pop();i!=null&&e.push(i.close())}await Promise.all(e),this.log("all listeners closed");for(let t of this.listeners.keys())this.listeners.set(t,[]);this.started=!1}async dial(e,t){let n=this.transportForMultiaddr(e);if(n==null)throw new E(`No transport available for address ${String(e)}`,ne.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(i){throw i.code==null&&(i.code=ne.ERR_TRANSPORT_DIAL_FAILED),i}}getAddrs(){let e=[];for(let t of this.listeners.values())for(let n of t)e=[...e,...n.getAddrs()];return e}getTransports(){return Array.of(...this.transports.values())}getListeners(){return Array.of(...this.listeners.values()).flat()}transportForMultiaddr(e){for(let t of this.transports.values())if(t.filter([e]).length>0)return t}async listen(e){if(!this.isStarted())throw new E("Not started",ne.ERR_NODE_NOT_STARTED);if(e==null||e.length===0){this.log("no addresses were provided for listening, this node is dial only");return}let t=[];for(let[n,i]of this.transports.entries()){let s=i.filter(e),o=[];for(let l of s){this.log("creating listener for %s on %a",n,l);let u=i.createListener({upgrader:this.components.upgrader}),h=this.listeners.get(n)??[];h==null&&(h=[],this.listeners.set(n,h)),h.push(u),u.addEventListener("listening",()=>{this.components.events.safeDispatchEvent("transport:listening",{detail:u})}),u.addEventListener("close",()=>{let f=h.findIndex(p=>p===u);h.splice(f,1),this.components.events.safeDispatchEvent("transport:close",{detail:u})}),o.push(u.listen(l))}if(o.length===0){t.push(n);continue}if((await Promise.allSettled(o)).find(l=>l.status==="fulfilled")==null&&this.faultTolerance!==Ps.NO_FATAL)throw new E(`Transport (${n}) could not listen on any available address`,ne.ERR_NO_VALID_ADDRESSES)}if(t.length===this.transports.size){let n=`no valid addresses were provided for transports [${t.join(", ")}]`;if(this.faultTolerance===Ps.FATAL_ALL)throw new E(n,ne.ERR_NO_VALID_ADDRESSES);this.log(`libp2p in dial mode only: ${n}`)}}async remove(e){let t=this.listeners.get(e)??[];this.log.trace("removing transport %s",e);let n=[];for(this.log.trace("closing listeners for %s",e);t.length>0;){let i=t.pop();i!=null&&n.push(i.close())}await Promise.all(n),this.transports.delete(e),this.listeners.delete(e)}async removeAll(){let e=[];for(let t of this.transports.keys())e.push(this.remove(t));await Promise.all(e)}};var ur="/multistream/1.0.0";var vte=W(`
83
83
  `);async function Ca(r,e,t){await r.write(e,t)}async function WN(r,e,t){await r.writeV(e,t)}async function _te(r,e){let t=await r.read(e);if(t.byteLength===0||t.get(t.byteLength-1)!==vte[0])throw e.log.error("Invalid mss message - missing newline",t),new E("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return t.sublist(0,-1)}async function _o(r,e){let t=await _te(r,e);return G(t.subarray())}async function df(r,e,t){if(e=Array.isArray(e)?[...e]:[e],e.length===1&&t.negotiateFully===!1)return Ste(r,e[0],t);let n=Ai(r,{...t,maxDataLength:1024}),i=e.shift();if(i==null)throw new Error("At least one protocol must be specified");t.log.trace('select: write ["%s", "%s"]',ur,i);let s=W(`${ur}
84
84
  `),o=W(`${i}
85
85
  `);await WN(n,[s,o],t),t.log.trace("select: reading multistream-select header");let a=await _o(n,t);if(t.log.trace('select: read "%s"',a),a===ur&&(t.log.trace("select: reading protocol response"),a=await _o(n,t),t.log.trace('select: read "%s"',a)),a===i)return{stream:n.unwrap(),protocol:i};for(let c of e){t.log.trace('select: write "%s"',c),await Ca(n,W(`${c}
@@ -1,3 +1,3 @@
1
- export declare const version = "3.0.0-3f4c6bf";
1
+ export declare const version = "3.0.0-a0692f9";
2
2
  export declare const name = "helia";
3
3
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
- export const version = '3.0.0-3f4c6bf';
1
+ export const version = '3.0.0-a0692f9';
2
2
  export const name = 'helia';
3
3
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "helia",
3
- "version": "3.0.0-3f4c6bf",
3
+ "version": "3.0.0-a0692f9",
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/main/packages/helia#readme",
@@ -57,9 +57,9 @@
57
57
  "@chainsafe/libp2p-gossipsub": "^11.0.0",
58
58
  "@chainsafe/libp2p-noise": "^14.0.0",
59
59
  "@chainsafe/libp2p-yamux": "^6.0.1",
60
- "@helia/block-brokers": "0.0.0-3f4c6bf",
60
+ "@helia/block-brokers": "0.0.0-a0692f9",
61
61
  "@helia/delegated-routing-v1-http-api-client": "^1.1.0",
62
- "@helia/interface": "3.0.0-3f4c6bf",
62
+ "@helia/interface": "3.0.0-a0692f9",
63
63
  "@ipld/dag-cbor": "^9.0.0",
64
64
  "@ipld/dag-json": "^10.0.1",
65
65
  "@ipld/dag-pb": "^4.0.3",
@@ -99,7 +99,7 @@
99
99
  "@multiformats/mafmt": "^12.1.5",
100
100
  "@multiformats/multiaddr": "^12.1.7",
101
101
  "@types/sinon": "^17.0.2",
102
- "aegir": "^42.1.0",
102
+ "aegir": "^42.0.1",
103
103
  "delay": "^6.0.0",
104
104
  "it-all": "^3.0.4"
105
105
  },
package/src/version.ts CHANGED
@@ -1,2 +1,2 @@
1
- export const version = '3.0.0-3f4c6bf'
1
+ export const version = '3.0.0-a0692f9'
2
2
  export const name = 'helia'