helia 4.0.0-44f4e88 → 4.0.0-e554493
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/package.json +5 -5
- package/src/version.ts +1 -1
package/dist/index.min.js
CHANGED
|
@@ -43,7 +43,7 @@ a=candidate:1467250027 1 UDP 1467250027 ${t} ${n} typ host\r
|
|
|
43
43
|
a=ice-ufrag:`+e+`
|
|
44
44
|
`).replace(/\na=ice-pwd:[^\n]*\n/,`
|
|
45
45
|
a=ice-pwd:`+e+`
|
|
46
|
-
`),r}var DR=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),PR=r=>[...Array(r)].map(()=>DR.at(Math.floor(Math.random()*DR.length))).join("");var WF=1e4,o4e=fe("webrtc-direct").code,TR=fe("certhash").code,gp=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 H_("WebRTCTransport.createListener")}filter(e){return e.filter(xx.exactMatch)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[Sn]=!0;async _connect(e,t){let n=new AbortController,o=n.signal,s=e.getPeerId();if(s===null)throw Qh("we need to have the remote's PeerId");let i=Ae(s),a=z4(yp(e)),c=await Ec.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:j4(a.name)}),l=new Ec({certificates:[c]});try{let f=new Promise((A,C)=>{let U=l.createDataChannel("",{negotiated:!0,id:0}),L=setTimeout(()=>{let F=`Data channel was never opened: state: ${U.readyState}`;this.log.error(F),this.metrics?.dialerEvents.increment({open_error:!0}),C(h4("data",F))},WF);U.onopen=F=>{clearTimeout(L),A(U)},U.onerror=F=>{clearTimeout(L);let re=`Error opening a data channel for handshaking: ${F.target?.toString()??"not specified"}`;this.log.error(re),this.metrics?.dialerEvents.increment({unknown_error:!0}),C(h4("data",re))}}),u="libp2p+webrtc+v1/"+PR(32),d=await l.createOffer(),y=kR(d,u);await l.setLocalDescription(y);let p=IR(e,u);await l.setRemoteDescription(p);let m=await f,g=this.components.peerId,b=this.generateNoisePrologue(l,a.code,e),E=$a({prologueBytes:b})(this.components),w=wc({channel:m,direction:"inbound",logger:this.components.logger,...this.init.dataChannel??{}}),_={...w,sink:w.sink.bind(w),source:async function*(){for await(let A of w.source)for(let C of A)yield C}()},I=new qi(this.components,{peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),k=Du?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(k,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":I.close().catch(A=>{this.log.error("error closing connection",A)}).finally(()=>{n.abort()});break;default:break}},{signal:o}),this.metrics?.dialerEvents.increment({peer_connection:!0});let D=new Hi(this.components,{peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await E.secureInbound(g,_,i),await t.upgrader.upgradeOutbound(I,{skipProtection:!0,skipEncryption:!0,muxerFactory:D})}catch(f){throw l.close(),f}}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw Tu("no local certificate");let o=AR(e,{log:this.log});if(o==null)throw Tu("no local fingerprint found");let s=o.trim().toLowerCase().replaceAll(":",""),i=x(s,"hex"),a=CR.encode(i,t),c=W4.decode(yp(n)),l=x("libp2p-webrtc-noise:");return le([l,a,c])}};function NR(r){return e=>new gp(e,r)}function BR(r){return e=>new op(e,r)}function LR(r){let e;try{e=fe("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function OR(r){return r.some(([e,t])=>e===fe("tls").code)}function Ir(r,e,t){let n=KR[fe(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${fe(r).name}`);let o=n(e,t);return r===fe("ip6").code?`[${o}]`:o}var KR={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://${Ir(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://${Ir(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`${Ir(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`${Ir(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=OR(e),n=LR(e);if(t&&n!==null)return`https://${n}`;let o=t?"https://":"http://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let i=Ir(s[0],s[1]??"",e);return i=i.replace("tcp://",""),`${o}${i}`},tls:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return Ir(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return Ir(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=Ir(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=OR(e),n=LR(e);if(t&&n!==null)return`wss://${n}`;let o=t?"wss://":"ws://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let i=Ir(s[0],s[1]??"",e);return i=i.replace("tcp://",""),`${o}${i}`},wss:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");let n=Ir(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`${Ir(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`${Ir(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`${Ir(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function MR(r,e){let n=se(r).stringTuples(),o=n.pop();if(o===void 0)throw new Error("Unexpected end of multiaddr");let s=fe(o[0]),i=KR[s.name];if(i==null)throw new Error(`No interpreter found for ${s.name}`);let a=i(o[1]??"",n);return e?.assumeHttp!==!1&&o[0]===fe("tcp").code&&(a=a.replace("tcp://","http://"),(o[1]==="443"||o[1]==="80")&&(o[1]==="443"&&(a=a.replace("http://","https://")),a=a.substring(0,a.lastIndexOf(":")))),a}var UR=async r=>{if(r.readyState>=2)throw new Error("socket closed");r.readyState!==1&&await new Promise((e,t)=>{function n(){r.removeEventListener("open",o),r.removeEventListener("error",s)}function o(){n(),e()}function s(i){n(),t(i.error??new Error(`connect ECONNREFUSED ${r.url}`))}r.addEventListener("open",o),r.addEventListener("error",s)})};var FR=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let o of n){try{await UR(r)}catch(s){if(s.message==="socket closed")break;throw s}if(r.readyState===r.CLOSING||r.readyState===r.CLOSED)break;r.send(o)}e.closeOnEnd!=null&&r.readyState<=1&&await new Promise((o,s)=>{r.addEventListener("close",i=>{if(i.wasClean||i.code===1006)o();else{let a=Object.assign(new Error("ws error"),{event:i});s(a)}}),setTimeout(()=>{r.close()})})});var $R=Ue(qR(),1);function HR(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var GR=r=>{r.binaryType="arraybuffer";let e=async()=>{await new Promise((s,i)=>{if(n){s();return}if(o!=null){i(o);return}let a=f=>{r.removeEventListener("open",c),r.removeEventListener("error",l),f()},c=()=>{a(s)},l=f=>{a(()=>{i(f.error??new Error(`connect ECONNREFUSED ${r.url}`))})};r.addEventListener("open",c),r.addEventListener("error",l)})},t=async function*(){let s=new $R.EventIterator(({push:i,stop:a,fail:c})=>{let l=u=>{let d=null;typeof u.data=="string"&&(d=x(u.data)),HR(u.data)&&(d=new Uint8Array(u.data)),u.data instanceof Uint8Array&&(d=u.data),d!=null&&i(d)},f=u=>{c(u.error??new Error("Socket error"))};return r.addEventListener("message",l),r.addEventListener("error",f),r.addEventListener("close",a),()=>{r.removeEventListener("message",l),r.removeEventListener("error",f),r.removeEventListener("close",a)}},{highWaterMark:1/0});await e();for await(let i of s)yield HR(i)?new Uint8Array(i):i}(),n=r.readyState===1,o;return r.addEventListener("open",()=>{n=!0,o=null}),r.addEventListener("close",()=>{n=!1,o=null}),r.addEventListener("error",s=>{n||(o=s.error??new Error(`connect ECONNREFUSED ${r.url}`))}),Object.assign(t,{connected:e})};var YR=(r,e)=>{e=e??{};let t=GR(r),n=e.remoteAddress,o=e.remotePort;if(r.url!=null)try{let i=new URL(r.url);n=i.hostname,o=parseInt(i.port,10)}catch{}if(n==null||o==null)throw new Error("Remote connection did not have address and/or port");return{sink:FR(r,e),source:t,connected:async()=>{await t.connected()},close:async()=>{(r.readyState===r.CONNECTING||r.readyState===r.OPEN)&&await new Promise(i=>{r.addEventListener("close",()=>{i()}),r.close()})},destroy:()=>{r.terminate!=null?r.terminate():r.close()},remoteAddress:n,remotePort:o,socket:r}};var WR=WebSocket;var jF={"http:":"ws:","https:":"wss:"},zR="ws:",jR=(r,e)=>{if(r.startsWith("//")&&(r=`${e?.protocol??zR}${r}`),r.startsWith("/")&&e!=null){let n=e.protocol??zR,o=e.host,s=e.port!=null&&o?.endsWith(`:${e.port}`)!==!0?`:${e.port}`:"";r=`${n}//${o}${s}${r}`}let t=new URL(r);for(let[n,o]of Object.entries(jF))t.protocol===n&&(t.protocol=o);return t};function XR(r,e){let t=typeof window>"u"?void 0:window.location;e=e??{};let n=jR(r,t),o=new WR(n.toString(),e.websocket);return YR(o,e)}function QR(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return Qa.matches(t)||Ii.matches(t)})}function JR(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return Ii.matches(t)})}function ZR(){throw new Error("WebSocket Servers can not be created in the browser!")}function eA(r,e,t){let n=t.logger.forComponent("libp2p:websockets:maconn"),o={log:n,async sink(s){try{await r.sink(async function*(){for await(let i of s)i instanceof Uint8Array?yield i:yield i.subarray()}())}catch(i){i.type!=="aborted"&&n.error(i)}},source:r.source,remoteAddr:e,timeline:{open:Date.now()},async close(s={}){let i=Date.now();if(s.signal==null){let c=AbortSignal.timeout(500);s={...s,signal:c}}let a=()=>{let{host:c,port:l}=o.remoteAddr.toOptions();n("timeout closing stream to %s:%s after %dms, destroying it manually",c,l,Date.now()-i),this.abort(new h("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),o.timeline.close=Date.now()}},abort(s){let{host:i,port:a}=o.remoteAddr.toOptions();n("timeout closing stream to %s:%s due to error",i,a,s),r.destroy(),o.timeline.close=Date.now()}};return r.socket.addEventListener("close",()=>{o.timeline.close==null&&(o.timeline.close=Date.now())},{once:!0}),o}var J4=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";[Sn]=!0;async dial(e,t){this.log("dialing %s",e),t=t??{};let n=await this._connect(e,t),o=eA(n,e,{logger:this.logger});this.log("new outbound connection %s",o.remoteAddr);let s=await t.upgrader.upgradeOutbound(o);return this.log("outbound connection %s upgraded",o.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new en;let n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);let o=he(),s=XR(MR(e),this.init);if(s.socket.addEventListener("error",()=>{let c=new h(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");this.log.error("connection error:",c),o.reject(c)}),t.signal==null)return await Promise.race([s.connected(),o.promise]),this.log("connected %s",e),s;let i,a=new Promise((c,l)=>{if(i=()=>{l(new en),s.close().catch(f=>{this.log.error("error closing raw socket",f)})},t?.signal?.aborted===!0){i();return}t?.signal?.addEventListener("abort",i)});try{await Promise.race([a,o.promise,s.connected()])}finally{i!=null&&t?.signal?.removeEventListener("abort",i)}return this.log("connected %s",e),s}createListener(e){return ZR({logger:this.logger},{...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):ch||lh?JR(e):QR(e)}};function tA(r={}){return e=>new J4(e,r)}async function Z4(r,e,t,n,o,s){let i=s.forComponent(`libp2p:webtransport:stream:${t}:${e}`),a=r.writable.getWriter(),c=r.readable.getReader();await a.ready;function l(){let p=n.findIndex(m=>m===y);p!==-1&&(n.splice(p,1),y.timeline.close=Date.now(),o?.(y))}let f=!1,u=!1;(async function(){let p=await a.closed.catch(m=>m);if(p!=null){let m=p.message;m.includes("aborted by the remote server")||m.includes("STOP_SENDING")||i.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${p.message}`)}f=!0,f&&u&&l()})().catch(()=>{i.error("WebTransport failed to cleanup closed stream")}),async function(){let p=await c.closed.catch(m=>m);p!=null&&i.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${p.message}`),u=!0,f&&u&&l()}().catch(()=>{i.error("WebTransport failed to cleanup closed stream")});let d=!1,y={id:e,status:"open",writeStatus:"ready",readStatus:"ready",abort(p){f||(a.abort(p).catch(m=>{i.error("could not abort stream",m)}),f=!0),u=!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(p){this.status="closing",await Promise.all([y.closeRead(p),y.closeWrite(p)]),l(),this.status="closed",this.timeline.close=Date.now()},async closeRead(p){if(!u){this.readStatus="closing";try{await c.cancel()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(f=!0)}this.timeline.closeRead=Date.now(),this.readStatus="closed",u=!0}f&&l()},async closeWrite(p){if(!f){f=!0,this.writeStatus="closing";try{await a.close()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(u=!0)}this.timeline.closeWrite=Date.now(),this.writeStatus="closed"}u&&l()},direction:t,timeline:{open:Date.now()},metadata:{},source:async function*(){for(;;){let p=await c.read();if(p.done){u=!0,f&&l();return}yield new be(p.value)}}(),sink:async function(p){if(d)throw new Error("sink already called on stream");d=!0;try{this.writeStatus="writing";for await(let m of p)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 y.closeWrite()}},log:i};return y}function e8(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}function rA(r,e){return e.filter(n=>!!r.find(o=>O(n,o))).length===e.length}var ZF=Object.values(Dr).map(r=>r.decoder).reduce((r,e)=>r.or(e));function eV(r){return kr.decode(ZF.decode(r))}function nA(r){if(!oh.matches(r))throw new h("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");let e=r.stringTuples(),t=e.filter(([i,a])=>i===fe("certhash").code).map(([i,a])=>eV(a??"")),n=e.filter(([i,a])=>i===fe("p2p").code).map(([i,a])=>Ae(a??""))[0],o=r.toOptions(),s=o.host;return o.family===6&&s?.includes(":")&&(s=`[${s}]`),{url:`https://${s}:${o.port}`,certhashes:t,remotePeer:n}}var t8=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";[Sn]=!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:o,certhashes:s,remotePeer:i}=nA(e);if(i==null)throw new Error("Need a target peerid");if(s.length===0)throw new Error("Expected multiaddr to contain certhashes");let a,c,l=()=>{},f=!1,u=!1,d=!1;try{this.metrics?.dialerEvents.increment({pending:!0});let y=new WebTransport(`${o}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(p=>({algorithm:"sha-256",value:p.digest}))});if(l=p=>{if(!f)try{this.metrics?.dialerEvents.increment({[p]:!0}),y.close()}catch(m){this.log.error("error closing wt session",m)}finally{c!=null&&(c.timeline.close=Date.now()),f=!0}},a=()=>{l(u?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",a,{once:!0}),await Promise.race([y.closed,y.ready]),u=!0,this.metrics?.dialerEvents.increment({ready:!0}),y.closed.catch(p=>{this.log.error("error on remote wt session close",p)}).finally(()=>{l("remote_close")}),!await this.authenticateWebTransport(y,n,i,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:p=>{this.log("aborting webtransport due to passed err",p),l("abort")},remoteAddr:e,timeline:{open:Date.now()},log:this.components.logger.forComponent("libp2p:webtransport:maconn"),...e8()},d=!0,await t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(y),skipProtection:!0})}catch(y){throw this.log.error("caught wt session err",y),l(d?"upgrade_error":u?"noise_error":"ready_error"),y}finally{a!=null&&t.signal?.removeEventListener("abort",a)}}async authenticateWebTransport(e,t,n,o){let s=await e.createBidirectionalStream(),i=s.writable.getWriter(),a=s.readable.getReader();await i.ready;let c={source:async function*(){for(;;){let u=await a.read();if(u.value!=null&&(yield u.value),u.done)break}}(),sink:async function(u){for await(let d of u)d instanceof Uint8Array?await i.write(d):await i.write(d.subarray())}},l=$a()(this.components),{remoteExtensions:f}=await l.secureOutbound(t,c,n);if(i.close().catch(u=>{this.log.error(`Failed to close authentication stream writer: ${u.message}`)}),a.cancel().catch(u=>{this.log.error(`Failed to close authentication stream reader: ${u.message}`)}),!rA(f?.webtransportCerthashes??[],o.map(u=>u.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,o=this;return{protocol:"webtransport",createStreamMuxer:s=>{typeof s=="function"&&(s={onIncomingStream:s});let i=[];return async function(){let c=e.incomingBidirectionalStreams.getReader();for(;;){let{done:l,value:f}=await c.read();if(l)break;if(i.length>=n.maxInboundStreams)f.writable.close().catch(u=>{o.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)}),f.readable.cancel().catch(u=>{o.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)});else{let u=await Z4(f,String(t++),"inbound",i,s?.onStreamEnd,o.components.logger);i.push(u),s?.onIncomingStream?.(u)}}}().catch(()=>{this.log.error("WebTransport failed to receive incoming stream")}),{protocol:"webtransport",streams:i,newStream:async c=>{let l=await e.createBidirectionalStream(),f=await Z4(l,String(t++),s?.direction??"outbound",i,s?.onStreamEnd,o.components.logger);return i.push(f),f},close:async c=>{this.log("Closing webtransport muxer"),await Promise.all(i.map(async l=>l.close(c)))},abort:c=>{this.log("Aborting webtransport muxer with err:",c);for(let l of i)l.abort(c)},...e8()}}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(oh.exactMatch)}};function oA(r={}){return e=>new t8(e,r)}var r8=Ue(Kf(),1);function sA(r,e){let t=e.map((n,o)=>({record:Pn(n),index:o}));return t.sort((n,o)=>{let s=n.record.sequence,i=o.record.sequence;if(s>i)return-1;if(s<i)return 1;if(n.record.validityType===ur.ValidityType.EOL&&o.record.validityType===ur.ValidityType.EOL){let a=r8.default.fromString(n.record.validity).toDate(),c=r8.default.fromString(o.record.validity).toDate();if(a.getTime()>c.getTime())return-1;if(a.getTime()<c.getTime())return 1}return 0}),t[0].index}var Ep="1.2.1",xp="libp2p";var aA="4.0.0-44f4e88",cA="helia";var lA={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 vp(r={}){return{peerId:r.peerId,addresses:{listen:["/webrtc"]},transports:[ty({discoverRelays:1}),BR(),NR(),oA(),tA()],connectionEncryption:[$a()],streamMuxers:[$w(),M_()],peerDiscovery:[DE(lA)],services:{autoNAT:bE(),dcutr:Ax(),delegatedRouting:()=>cb("https://delegated-ipfs.dev"),dht:Hv({clientMode:!0,validators:{ipns:Zf},selectors:{ipns:sA}}),identify:Ux({agentVersion:`${cA}/${aA} ${xp}/${Ep} UserAgent=${globalThis.navigator.userAgent}`}),keychain:Yh(r.keychain),ping:q_()}}}var s8={};oe(s8,{Ed25519PrivateKey:()=>Yi,Ed25519PublicKey:()=>Uu,generateKeyPair:()=>sV,generateKeyPairFromSeed:()=>yA,unmarshalEd25519PrivateKey:()=>nV,unmarshalEd25519PublicKey:()=>oV});function Qr(r){return r==null?!1:typeof r.then=="function"&&typeof r.catch=="function"&&typeof r.finally=="function"}var Dc=32,Go=64,_p=32;function uA(){let r=we.utils.randomPrivateKey(),e=we.getPublicKey(r);return{privateKey:pA(r,e),publicKey:e}}function fA(r){if(r.length!==_p)throw new TypeError('"seed" must be 32 bytes in length.');if(!(r instanceof Uint8Array))throw new TypeError('"seed" must be a node.js Buffer, or Uint8Array.');let e=r,t=we.getPublicKey(e);return{privateKey:pA(e,t),publicKey:t}}function dA(r,e){let t=r.subarray(0,_p);return we.sign(e instanceof Uint8Array?e:e.subarray(),t)}function hA(r,e,t){return we.verify(e,t instanceof Uint8Array?t:t.subarray(),r)}function pA(r,e){let t=new Uint8Array(Go);for(let n=0;n<_p;n++)t[n]=r[n],t[_p+n]=e[n];return t}var or={get(r=globalThis){let e=r.crypto;if(e==null||e.subtle==null)throw Object.assign(new Error("Missing Web Crypto API. The most likely cause of this error is that this page is being accessed from an insecure context (i.e. not HTTPS). For more information and possible resolutions see https://github.com/libp2p/js-libp2p/blob/main/packages/crypto/README.md#web-crypto-api"),{code:"ERR_MISSING_WEB_CRYPTO"});return e}};var n8={alg:"A128GCM",ext:!0,k:"scm9jmO_4BJAgdwWGVulLg",key_ops:["encrypt","decrypt"],kty:"oct"};function mA(r){let e=r?.algorithm??"AES-GCM",t=r?.keyLength??16,n=r?.nonceLength??12,o=r?.digest??"SHA-256",s=r?.saltLength??16,i=r?.iterations??32767,a=or.get();t*=8;async function c(u,d){let y=a.getRandomValues(new Uint8Array(s)),p=a.getRandomValues(new Uint8Array(n)),m={name:e,iv:p};typeof d=="string"&&(d=x(d));let g;if(d.length===0){g=await a.subtle.importKey("jwk",n8,{name:"AES-GCM"},!0,["encrypt"]);try{let E={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},w=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);g=await a.subtle.deriveKey(E,w,{name:e,length:t},!0,["encrypt"])}catch{g=await a.subtle.importKey("jwk",n8,{name:"AES-GCM"},!0,["encrypt"])}}else{let E={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},w=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);g=await a.subtle.deriveKey(E,w,{name:e,length:t},!0,["encrypt"])}let b=await a.subtle.encrypt(m,g,u);return le([y,m.iv,new Uint8Array(b)])}async function l(u,d){let y=u.subarray(0,s),p=u.subarray(s,s+n),m=u.subarray(s+n),g={name:e,iv:p};typeof d=="string"&&(d=x(d));let b;if(d.length===0)try{let w={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},_=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);b=await a.subtle.deriveKey(w,_,{name:e,length:t},!0,["decrypt"])}catch{b=await a.subtle.importKey("jwk",n8,{name:"AES-GCM"},!0,["decrypt"])}else{let w={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},_=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);b=await a.subtle.deriveKey(w,_,{name:e,length:t},!0,["decrypt"])}let E=await a.subtle.decrypt(g,b,m);return new Uint8Array(E)}return{encrypt:c,decrypt:l}}async function Pc(r,e){let n=await mA().encrypt(r,e);return Ge.encode(n)}var rt;(function(r){r.RSA="RSA",r.Ed25519="Ed25519",r.Secp256k1="Secp256k1"})(rt||(rt={}));var o8;(function(r){r[r.RSA=0]="RSA",r[r.Ed25519=1]="Ed25519",r[r.Secp256k1=2]="Secp256k1"})(o8||(o8={}));(function(r){r.codec=()=>Re(o8)})(rt||(rt={}));var to;(function(r){let e;r.codec=()=>(e==null&&(e=J((t,n,o={})=>{o.lengthDelimited!==!1&&n.fork(),t.Type!=null&&(n.uint32(8),rt.codec().encode(t.Type,n)),t.Data!=null&&(n.uint32(18),n.bytes(t.Data)),o.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let o={},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let i=t.uint32();switch(i>>>3){case 1:o.Type=rt.codec().decode(t);break;case 2:o.Data=t.bytes();break;default:t.skipType(i&7);break}}return o})),e),r.encode=t=>Q(t,r.codec()),r.decode=t=>X(t,r.codec())})(to||(to={}));var ro;(function(r){let e;r.codec=()=>(e==null&&(e=J((t,n,o={})=>{o.lengthDelimited!==!1&&n.fork(),t.Type!=null&&(n.uint32(8),rt.codec().encode(t.Type,n)),t.Data!=null&&(n.uint32(18),n.bytes(t.Data)),o.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let o={},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let i=t.uint32();switch(i>>>3){case 1:o.Type=rt.codec().decode(t);break;case 2:o.Data=t.bytes();break;default:t.skipType(i&7);break}}return o})),e),r.encode=t=>Q(t,r.codec()),r.decode=t=>X(t,r.codec())})(ro||(ro={}));var Uu=class{_key;constructor(e){this._key=Cc(e,Dc)}verify(e,t){return hA(this._key,t,e)}marshal(){return this._key}get bytes(){return to.encode({Type:rt.Ed25519,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}hash(){let e=K.digest(this.bytes);return Qr(e)?e.then(({bytes:t})=>t):e.bytes}},Yi=class{_key;_publicKey;constructor(e,t){this._key=Cc(e,Go),this._publicKey=Cc(t,Dc)}sign(e){return dA(this._key,e)}get public(){return new Uu(this._publicKey)}marshal(){return this._key}get bytes(){return ro.encode({Type:rt.Ed25519,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}async hash(){let e=K.digest(this.bytes),t;return Qr(e)?{bytes:t}=await e:t=e.bytes,t}async id(){let e=Xe.digest(this.public.bytes);return ie.encode(e.bytes).substring(1)}async export(e,t="libp2p-key"){if(t==="libp2p-key")return Pc(this.bytes,e);throw new h(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}};function nV(r){if(r.length>Go){r=Cc(r,Go+Dc);let n=r.subarray(0,Go),o=r.subarray(Go,r.length);return new Yi(n,o)}r=Cc(r,Go);let e=r.subarray(0,Go),t=r.subarray(Dc);return new Yi(e,t)}function oV(r){return r=Cc(r,Dc),new Uu(r)}async function sV(){let{privateKey:r,publicKey:e}=uA();return new Yi(r,e)}async function yA(r){let{privateKey:e,publicKey:t}=fA(r);return new Yi(e,t)}function Cc(r,e){if(r=Uint8Array.from(r??[]),r.length!==e)throw new h(`Key must be a Uint8Array of length ${e}, got ${r.length}`,"ERR_INVALID_KEY_TYPE");return r}var u8={};oe(u8,{MAX_RSA_KEY_SIZE:()=>qu,RsaPrivateKey:()=>Nc,RsaPublicKey:()=>Vu,fromJwk:()=>gV,generateKeyPair:()=>bV,unmarshalRsaPrivateKey:()=>c8,unmarshalRsaPublicKey:()=>yV});function Wi(r){if(isNaN(r)||r<=0)throw new h("random bytes length must be a Number bigger than 0","ERR_INVALID_LENGTH");return dt(r)}var qs={};oe(qs,{exportToPem:()=>fV,importFromPem:()=>dV,jwkToPkcs1:()=>aV,jwkToPkix:()=>lV,pkcs1ToJwk:()=>iV,pkixToJwk:()=>cV});function iV(r){let{result:e}=Ee(r),t=e.valueBlock.value;return{n:v(no(t[1].toBigInt()),"base64url"),e:v(no(t[2].toBigInt()),"base64url"),d:v(no(t[3].toBigInt()),"base64url"),p:v(no(t[4].toBigInt()),"base64url"),q:v(no(t[5].toBigInt()),"base64url"),dp:v(no(t[6].toBigInt()),"base64url"),dq:v(no(t[7].toBigInt()),"base64url"),qi:v(no(t[8].toBigInt()),"base64url"),kty:"RSA",alg:"RS256"}}function aV(r){if(r.n==null||r.e==null||r.d==null||r.p==null||r.q==null||r.dp==null||r.dq==null||r.qi==null)throw new h("JWK was missing components","ERR_INVALID_PARAMETERS");let t=new M({value:[new B({value:0}),B.fromBigInt(oo(x(r.n,"base64url"))),B.fromBigInt(oo(x(r.e,"base64url"))),B.fromBigInt(oo(x(r.d,"base64url"))),B.fromBigInt(oo(x(r.p,"base64url"))),B.fromBigInt(oo(x(r.q,"base64url"))),B.fromBigInt(oo(x(r.dp,"base64url"))),B.fromBigInt(oo(x(r.dq,"base64url"))),B.fromBigInt(oo(x(r.qi,"base64url")))]}).toBER();return new Uint8Array(t,0,t.byteLength)}function cV(r){let{result:e}=Ee(r),t=e.valueBlock.value[1].valueBlock.value[0].valueBlock.value;return{kty:"RSA",n:v(no(t[0].toBigInt()),"base64url"),e:v(no(t[1].toBigInt()),"base64url")}}function lV(r){if(r.n==null||r.e==null)throw new h("JWK was missing components","ERR_INVALID_PARAMETERS");let t=new M({value:[new M({value:[new ae({value:"1.2.840.113549.1.1.1"}),new Ne]}),new kt({valueHex:new M({value:[B.fromBigInt(oo(x(r.n,"base64url"))),B.fromBigInt(oo(x(r.e,"base64url")))]}).toBER()})]}).toBER();return new Uint8Array(t,0,t.byteLength)}function no(r){let e=r.toString(16);e.length%2>0&&(e=`0${e}`);let t=e.length/2,n=new Uint8Array(t),o=0,s=0;for(;o<t;)n[o]=parseInt(e.slice(s,s+2),16),o+=1,s+=2;return n}function oo(r){let e=[];return r.forEach(function(t){let n=t.toString(16);n.length%2>0&&(n=`0${n}`),e.push(n)}),BigInt("0x"+e.join(""))}var uV=16,i8=32,a8=1e4;async function fV(r,e){let t=or.get(),o=new M({value:[new B({value:0}),new M({value:[new ae({value:"1.2.840.113549.1.1.1"}),new Ne]}),new Se({valueHex:r.marshal()})]}).toBER(),s=new Uint8Array(o,0,o.byteLength),i=Wi(uV),a=await pt(Ye,e,i,{c:a8,dkLen:i8}),c=Wi(16),l=await t.subtle.importKey("raw",a,"AES-CBC",!1,["encrypt"]),f=await t.subtle.encrypt({name:"AES-CBC",iv:c},l,s),u=new M({value:[new Se({valueHex:i}),new B({value:a8}),new B({value:i8}),new M({value:[new ae({value:"1.2.840.113549.2.11"}),new Ne]})]}),d=new M({value:[new ae({value:"1.2.840.113549.1.5.13"}),new M({value:[new M({value:[new ae({value:"1.2.840.113549.1.5.12"}),u]}),new M({value:[new ae({value:"2.16.840.1.101.3.4.1.42"}),new Se({valueHex:c})]})]})]}),p=new M({value:[d,new Se({valueHex:f})]}).toBER(),m=new Uint8Array(p,0,p.byteLength);return["-----BEGIN ENCRYPTED PRIVATE KEY-----",...v(m,"base64pad").split(/(.{64})/).filter(Boolean),"-----END ENCRYPTED PRIVATE KEY-----"].join(`
|
|
46
|
+
`),r}var DR=Array.from("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"),PR=r=>[...Array(r)].map(()=>DR.at(Math.floor(Math.random()*DR.length))).join("");var WF=1e4,o4e=fe("webrtc-direct").code,TR=fe("certhash").code,gp=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 H_("WebRTCTransport.createListener")}filter(e){return e.filter(xx.exactMatch)}[Symbol.toStringTag]="@libp2p/webrtc-direct";[Sn]=!0;async _connect(e,t){let n=new AbortController,o=n.signal,s=e.getPeerId();if(s===null)throw Qh("we need to have the remote's PeerId");let i=Ae(s),a=z4(yp(e)),c=await Ec.generateCertificate({name:"ECDSA",namedCurve:"P-256",hash:j4(a.name)}),l=new Ec({certificates:[c]});try{let f=new Promise((A,C)=>{let U=l.createDataChannel("",{negotiated:!0,id:0}),L=setTimeout(()=>{let F=`Data channel was never opened: state: ${U.readyState}`;this.log.error(F),this.metrics?.dialerEvents.increment({open_error:!0}),C(h4("data",F))},WF);U.onopen=F=>{clearTimeout(L),A(U)},U.onerror=F=>{clearTimeout(L);let re=`Error opening a data channel for handshaking: ${F.target?.toString()??"not specified"}`;this.log.error(re),this.metrics?.dialerEvents.increment({unknown_error:!0}),C(h4("data",re))}}),u="libp2p+webrtc+v1/"+PR(32),d=await l.createOffer(),y=kR(d,u);await l.setLocalDescription(y);let p=IR(e,u);await l.setRemoteDescription(p);let m=await f,g=this.components.peerId,b=this.generateNoisePrologue(l,a.code,e),E=$a({prologueBytes:b})(this.components),w=wc({channel:m,direction:"inbound",logger:this.components.logger,...this.init.dataChannel??{}}),_={...w,sink:w.sink.bind(w),source:async function*(){for await(let A of w.source)for(let C of A)yield C}()},I=new qi(this.components,{peerConnection:l,remoteAddr:e,timeline:{open:Date.now()},metrics:this.metrics?.dialerEvents}),k=Du?"iceconnectionstatechange":"connectionstatechange";l.addEventListener(k,()=>{switch(l.connectionState){case"failed":case"disconnected":case"closed":I.close().catch(A=>{this.log.error("error closing connection",A)}).finally(()=>{n.abort()});break;default:break}},{signal:o}),this.metrics?.dialerEvents.increment({peer_connection:!0});let D=new Hi(this.components,{peerConnection:l,metrics:this.metrics?.dialerEvents,dataChannelOptions:this.init.dataChannel});return await E.secureInbound(g,_,i),await t.upgrader.upgradeOutbound(I,{skipProtection:!0,skipEncryption:!0,muxerFactory:D})}catch(f){throw l.close(),f}}generateNoisePrologue(e,t,n){if(e.getConfiguration().certificates?.length===0)throw Tu("no local certificate");let o=AR(e,{log:this.log});if(o==null)throw Tu("no local fingerprint found");let s=o.trim().toLowerCase().replaceAll(":",""),i=x(s,"hex"),a=CR.encode(i,t),c=W4.decode(yp(n)),l=x("libp2p-webrtc-noise:");return le([l,a,c])}};function NR(r){return e=>new gp(e,r)}function BR(r){return e=>new op(e,r)}function LR(r){let e;try{e=fe("sni").code}catch{return null}for(let[t,n]of r)if(t===e&&n!==void 0)return n;return null}function OR(r){return r.some(([e,t])=>e===fe("tls").code)}function Ir(r,e,t){let n=KR[fe(r).name];if(n===void 0)throw new Error(`Can't interpret protocol ${fe(r).name}`);let o=n(e,t);return r===fe("ip6").code?`[${o}]`:o}var KR={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://${Ir(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://${Ir(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`${Ir(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`${Ir(t[0],t[1]??"",e)}/p2p/${r}`},http:(r,e)=>{let t=OR(e),n=LR(e);if(t&&n!==null)return`https://${n}`;let o=t?"https://":"http://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let i=Ir(s[0],s[1]??"",e);return i=i.replace("tcp://",""),`${o}${i}`},tls:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return Ir(t[0],t[1]??"",e)},sni:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");return Ir(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=Ir(t[0],t[1]??"",e);return n=n.replace("tcp://",""),`https://${n}`},ws:(r,e)=>{let t=OR(e),n=LR(e);if(t&&n!==null)return`wss://${n}`;let o=t?"wss://":"ws://",s=e.pop();if(s===void 0)throw new Error("Unexpected end of multiaddr");let i=Ir(s[0],s[1]??"",e);return i=i.replace("tcp://",""),`${o}${i}`},wss:(r,e)=>{let t=e.pop();if(t===void 0)throw new Error("Unexpected end of multiaddr");let n=Ir(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`${Ir(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`${Ir(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`${Ir(t[0],t[1]??"",e)}/p2p-webrtc-direct`}};function MR(r,e){let n=se(r).stringTuples(),o=n.pop();if(o===void 0)throw new Error("Unexpected end of multiaddr");let s=fe(o[0]),i=KR[s.name];if(i==null)throw new Error(`No interpreter found for ${s.name}`);let a=i(o[1]??"",n);return e?.assumeHttp!==!1&&o[0]===fe("tcp").code&&(a=a.replace("tcp://","http://"),(o[1]==="443"||o[1]==="80")&&(o[1]==="443"&&(a=a.replace("http://","https://")),a=a.substring(0,a.lastIndexOf(":")))),a}var UR=async r=>{if(r.readyState>=2)throw new Error("socket closed");r.readyState!==1&&await new Promise((e,t)=>{function n(){r.removeEventListener("open",o),r.removeEventListener("error",s)}function o(){n(),e()}function s(i){n(),t(i.error??new Error(`connect ECONNREFUSED ${r.url}`))}r.addEventListener("open",o),r.addEventListener("error",s)})};var FR=(r,e)=>(e=e??{},e.closeOnEnd=e.closeOnEnd!==!1,async n=>{for await(let o of n){try{await UR(r)}catch(s){if(s.message==="socket closed")break;throw s}if(r.readyState===r.CLOSING||r.readyState===r.CLOSED)break;r.send(o)}e.closeOnEnd!=null&&r.readyState<=1&&await new Promise((o,s)=>{r.addEventListener("close",i=>{if(i.wasClean||i.code===1006)o();else{let a=Object.assign(new Error("ws error"),{event:i});s(a)}}),setTimeout(()=>{r.close()})})});var $R=Ue(qR(),1);function HR(r){return r instanceof ArrayBuffer||r?.constructor?.name==="ArrayBuffer"&&typeof r?.byteLength=="number"}var GR=r=>{r.binaryType="arraybuffer";let e=async()=>{await new Promise((s,i)=>{if(n){s();return}if(o!=null){i(o);return}let a=f=>{r.removeEventListener("open",c),r.removeEventListener("error",l),f()},c=()=>{a(s)},l=f=>{a(()=>{i(f.error??new Error(`connect ECONNREFUSED ${r.url}`))})};r.addEventListener("open",c),r.addEventListener("error",l)})},t=async function*(){let s=new $R.EventIterator(({push:i,stop:a,fail:c})=>{let l=u=>{let d=null;typeof u.data=="string"&&(d=x(u.data)),HR(u.data)&&(d=new Uint8Array(u.data)),u.data instanceof Uint8Array&&(d=u.data),d!=null&&i(d)},f=u=>{c(u.error??new Error("Socket error"))};return r.addEventListener("message",l),r.addEventListener("error",f),r.addEventListener("close",a),()=>{r.removeEventListener("message",l),r.removeEventListener("error",f),r.removeEventListener("close",a)}},{highWaterMark:1/0});await e();for await(let i of s)yield HR(i)?new Uint8Array(i):i}(),n=r.readyState===1,o;return r.addEventListener("open",()=>{n=!0,o=null}),r.addEventListener("close",()=>{n=!1,o=null}),r.addEventListener("error",s=>{n||(o=s.error??new Error(`connect ECONNREFUSED ${r.url}`))}),Object.assign(t,{connected:e})};var YR=(r,e)=>{e=e??{};let t=GR(r),n=e.remoteAddress,o=e.remotePort;if(r.url!=null)try{let i=new URL(r.url);n=i.hostname,o=parseInt(i.port,10)}catch{}if(n==null||o==null)throw new Error("Remote connection did not have address and/or port");return{sink:FR(r,e),source:t,connected:async()=>{await t.connected()},close:async()=>{(r.readyState===r.CONNECTING||r.readyState===r.OPEN)&&await new Promise(i=>{r.addEventListener("close",()=>{i()}),r.close()})},destroy:()=>{r.terminate!=null?r.terminate():r.close()},remoteAddress:n,remotePort:o,socket:r}};var WR=WebSocket;var jF={"http:":"ws:","https:":"wss:"},zR="ws:",jR=(r,e)=>{if(r.startsWith("//")&&(r=`${e?.protocol??zR}${r}`),r.startsWith("/")&&e!=null){let n=e.protocol??zR,o=e.host,s=e.port!=null&&o?.endsWith(`:${e.port}`)!==!0?`:${e.port}`:"";r=`${n}//${o}${s}${r}`}let t=new URL(r);for(let[n,o]of Object.entries(jF))t.protocol===n&&(t.protocol=o);return t};function XR(r,e){let t=typeof window>"u"?void 0:window.location;e=e??{};let n=jR(r,t),o=new WR(n.toString(),e.websocket);return YR(o,e)}function QR(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return Qa.matches(t)||Ii.matches(t)})}function JR(r){return r.filter(e=>{if(e.protoCodes().includes(290))return!1;let t=e.decapsulateCode(421);return Ii.matches(t)})}function ZR(){throw new Error("WebSocket Servers can not be created in the browser!")}function eA(r,e,t){let n=t.logger.forComponent("libp2p:websockets:maconn"),o={log:n,async sink(s){try{await r.sink(async function*(){for await(let i of s)i instanceof Uint8Array?yield i:yield i.subarray()}())}catch(i){i.type!=="aborted"&&n.error(i)}},source:r.source,remoteAddr:e,timeline:{open:Date.now()},async close(s={}){let i=Date.now();if(s.signal==null){let c=AbortSignal.timeout(500);s={...s,signal:c}}let a=()=>{let{host:c,port:l}=o.remoteAddr.toOptions();n("timeout closing stream to %s:%s after %dms, destroying it manually",c,l,Date.now()-i),this.abort(new h("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),o.timeline.close=Date.now()}},abort(s){let{host:i,port:a}=o.remoteAddr.toOptions();n("timeout closing stream to %s:%s due to error",i,a,s),r.destroy(),o.timeline.close=Date.now()}};return r.socket.addEventListener("close",()=>{o.timeline.close==null&&(o.timeline.close=Date.now())},{once:!0}),o}var J4=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";[Sn]=!0;async dial(e,t){this.log("dialing %s",e),t=t??{};let n=await this._connect(e,t),o=eA(n,e,{logger:this.logger});this.log("new outbound connection %s",o.remoteAddr);let s=await t.upgrader.upgradeOutbound(o);return this.log("outbound connection %s upgraded",o.remoteAddr),s}async _connect(e,t){if(t?.signal?.aborted===!0)throw new en;let n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);let o=he(),s=XR(MR(e),this.init);if(s.socket.addEventListener("error",()=>{let c=new h(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");this.log.error("connection error:",c),o.reject(c)}),t.signal==null)return await Promise.race([s.connected(),o.promise]),this.log("connected %s",e),s;let i,a=new Promise((c,l)=>{if(i=()=>{l(new en),s.close().catch(f=>{this.log.error("error closing raw socket",f)})},t?.signal?.aborted===!0){i();return}t?.signal?.addEventListener("abort",i)});try{await Promise.race([a,o.promise,s.connected()])}finally{i!=null&&t?.signal?.removeEventListener("abort",i)}return this.log("connected %s",e),s}createListener(e){return ZR({logger:this.logger},{...this.init,...e})}filter(e){return e=Array.isArray(e)?e:[e],this.init?.filter!=null?this.init?.filter(e):ch||lh?JR(e):QR(e)}};function tA(r={}){return e=>new J4(e,r)}async function Z4(r,e,t,n,o,s){let i=s.forComponent(`libp2p:webtransport:stream:${t}:${e}`),a=r.writable.getWriter(),c=r.readable.getReader();await a.ready;function l(){let p=n.findIndex(m=>m===y);p!==-1&&(n.splice(p,1),y.timeline.close=Date.now(),o?.(y))}let f=!1,u=!1;(async function(){let p=await a.closed.catch(m=>m);if(p!=null){let m=p.message;m.includes("aborted by the remote server")||m.includes("STOP_SENDING")||i.error(`WebTransport writer closed unexpectedly: streamId=${e} err=${p.message}`)}f=!0,f&&u&&l()})().catch(()=>{i.error("WebTransport failed to cleanup closed stream")}),async function(){let p=await c.closed.catch(m=>m);p!=null&&i.error(`WebTransport reader closed unexpectedly: streamId=${e} err=${p.message}`),u=!0,f&&u&&l()}().catch(()=>{i.error("WebTransport failed to cleanup closed stream")});let d=!1,y={id:e,status:"open",writeStatus:"ready",readStatus:"ready",abort(p){f||(a.abort(p).catch(m=>{i.error("could not abort stream",m)}),f=!0),u=!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(p){this.status="closing",await Promise.all([y.closeRead(p),y.closeWrite(p)]),l(),this.status="closed",this.timeline.close=Date.now()},async closeRead(p){if(!u){this.readStatus="closing";try{await c.cancel()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(f=!0)}this.timeline.closeRead=Date.now(),this.readStatus="closed",u=!0}f&&l()},async closeWrite(p){if(!f){f=!0,this.writeStatus="closing";try{await a.close()}catch(m){m.toString().includes("RESET_STREAM")===!0&&(u=!0)}this.timeline.closeWrite=Date.now(),this.writeStatus="closed"}u&&l()},direction:t,timeline:{open:Date.now()},metadata:{},source:async function*(){for(;;){let p=await c.read();if(p.done){u=!0,f&&l();return}yield new be(p.value)}}(),sink:async function(p){if(d)throw new Error("sink already called on stream");d=!0;try{this.writeStatus="writing";for await(let m of p)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 y.closeWrite()}},log:i};return y}function e8(){return{source:{[Symbol.asyncIterator](){return{async next(){return new Promise(()=>{})}}}},sink:async r=>new Promise(()=>{})}}function rA(r,e){return e.filter(n=>!!r.find(o=>O(n,o))).length===e.length}var ZF=Object.values(Dr).map(r=>r.decoder).reduce((r,e)=>r.or(e));function eV(r){return kr.decode(ZF.decode(r))}function nA(r){if(!oh.matches(r))throw new h("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");let e=r.stringTuples(),t=e.filter(([i,a])=>i===fe("certhash").code).map(([i,a])=>eV(a??"")),n=e.filter(([i,a])=>i===fe("p2p").code).map(([i,a])=>Ae(a??""))[0],o=r.toOptions(),s=o.host;return o.family===6&&s?.includes(":")&&(s=`[${s}]`),{url:`https://${s}:${o.port}`,certhashes:t,remotePeer:n}}var t8=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";[Sn]=!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:o,certhashes:s,remotePeer:i}=nA(e);if(i==null)throw new Error("Need a target peerid");if(s.length===0)throw new Error("Expected multiaddr to contain certhashes");let a,c,l=()=>{},f=!1,u=!1,d=!1;try{this.metrics?.dialerEvents.increment({pending:!0});let y=new WebTransport(`${o}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map(p=>({algorithm:"sha-256",value:p.digest}))});if(l=p=>{if(!f)try{this.metrics?.dialerEvents.increment({[p]:!0}),y.close()}catch(m){this.log.error("error closing wt session",m)}finally{c!=null&&(c.timeline.close=Date.now()),f=!0}},a=()=>{l(u?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",a,{once:!0}),await Promise.race([y.closed,y.ready]),u=!0,this.metrics?.dialerEvents.increment({ready:!0}),y.closed.catch(p=>{this.log.error("error on remote wt session close",p)}).finally(()=>{l("remote_close")}),!await this.authenticateWebTransport(y,n,i,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:p=>{this.log("aborting webtransport due to passed err",p),l("abort")},remoteAddr:e,timeline:{open:Date.now()},log:this.components.logger.forComponent("libp2p:webtransport:maconn"),...e8()},d=!0,await t.upgrader.upgradeOutbound(c,{skipEncryption:!0,muxerFactory:this.webtransportMuxer(y),skipProtection:!0})}catch(y){throw this.log.error("caught wt session err",y),l(d?"upgrade_error":u?"noise_error":"ready_error"),y}finally{a!=null&&t.signal?.removeEventListener("abort",a)}}async authenticateWebTransport(e,t,n,o){let s=await e.createBidirectionalStream(),i=s.writable.getWriter(),a=s.readable.getReader();await i.ready;let c={source:async function*(){for(;;){let u=await a.read();if(u.value!=null&&(yield u.value),u.done)break}}(),sink:async function(u){for await(let d of u)d instanceof Uint8Array?await i.write(d):await i.write(d.subarray())}},l=$a()(this.components),{remoteExtensions:f}=await l.secureOutbound(t,c,n);if(i.close().catch(u=>{this.log.error(`Failed to close authentication stream writer: ${u.message}`)}),a.cancel().catch(u=>{this.log.error(`Failed to close authentication stream reader: ${u.message}`)}),!rA(f?.webtransportCerthashes??[],o.map(u=>u.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,o=this;return{protocol:"webtransport",createStreamMuxer:s=>{typeof s=="function"&&(s={onIncomingStream:s});let i=[];return async function(){let c=e.incomingBidirectionalStreams.getReader();for(;;){let{done:l,value:f}=await c.read();if(l)break;if(i.length>=n.maxInboundStreams)f.writable.close().catch(u=>{o.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)}),f.readable.cancel().catch(u=>{o.log.error(`Failed to close inbound stream that crossed our maxInboundStream limit: ${u.message}`)});else{let u=await Z4(f,String(t++),"inbound",i,s?.onStreamEnd,o.components.logger);i.push(u),s?.onIncomingStream?.(u)}}}().catch(()=>{this.log.error("WebTransport failed to receive incoming stream")}),{protocol:"webtransport",streams:i,newStream:async c=>{let l=await e.createBidirectionalStream(),f=await Z4(l,String(t++),s?.direction??"outbound",i,s?.onStreamEnd,o.components.logger);return i.push(f),f},close:async c=>{this.log("Closing webtransport muxer"),await Promise.all(i.map(async l=>l.close(c)))},abort:c=>{this.log("Aborting webtransport muxer with err:",c);for(let l of i)l.abort(c)},...e8()}}}}createListener(e){throw new Error("Webtransport servers are not supported in Node or the browser")}filter(e){return e.filter(oh.exactMatch)}};function oA(r={}){return e=>new t8(e,r)}var r8=Ue(Kf(),1);function sA(r,e){let t=e.map((n,o)=>({record:Pn(n),index:o}));return t.sort((n,o)=>{let s=n.record.sequence,i=o.record.sequence;if(s>i)return-1;if(s<i)return 1;if(n.record.validityType===ur.ValidityType.EOL&&o.record.validityType===ur.ValidityType.EOL){let a=r8.default.fromString(n.record.validity).toDate(),c=r8.default.fromString(o.record.validity).toDate();if(a.getTime()>c.getTime())return-1;if(a.getTime()<c.getTime())return 1}return 0}),t[0].index}var Ep="1.2.1",xp="libp2p";var aA="4.0.0-e554493",cA="helia";var lA={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 vp(r={}){return{peerId:r.peerId,addresses:{listen:["/webrtc"]},transports:[ty({discoverRelays:1}),BR(),NR(),oA(),tA()],connectionEncryption:[$a()],streamMuxers:[$w(),M_()],peerDiscovery:[DE(lA)],services:{autoNAT:bE(),dcutr:Ax(),delegatedRouting:()=>cb("https://delegated-ipfs.dev"),dht:Hv({clientMode:!0,validators:{ipns:Zf},selectors:{ipns:sA}}),identify:Ux({agentVersion:`${cA}/${aA} ${xp}/${Ep} UserAgent=${globalThis.navigator.userAgent}`}),keychain:Yh(r.keychain),ping:q_()}}}var s8={};oe(s8,{Ed25519PrivateKey:()=>Yi,Ed25519PublicKey:()=>Uu,generateKeyPair:()=>sV,generateKeyPairFromSeed:()=>yA,unmarshalEd25519PrivateKey:()=>nV,unmarshalEd25519PublicKey:()=>oV});function Qr(r){return r==null?!1:typeof r.then=="function"&&typeof r.catch=="function"&&typeof r.finally=="function"}var Dc=32,Go=64,_p=32;function uA(){let r=we.utils.randomPrivateKey(),e=we.getPublicKey(r);return{privateKey:pA(r,e),publicKey:e}}function fA(r){if(r.length!==_p)throw new TypeError('"seed" must be 32 bytes in length.');if(!(r instanceof Uint8Array))throw new TypeError('"seed" must be a node.js Buffer, or Uint8Array.');let e=r,t=we.getPublicKey(e);return{privateKey:pA(e,t),publicKey:t}}function dA(r,e){let t=r.subarray(0,_p);return we.sign(e instanceof Uint8Array?e:e.subarray(),t)}function hA(r,e,t){return we.verify(e,t instanceof Uint8Array?t:t.subarray(),r)}function pA(r,e){let t=new Uint8Array(Go);for(let n=0;n<_p;n++)t[n]=r[n],t[_p+n]=e[n];return t}var or={get(r=globalThis){let e=r.crypto;if(e==null||e.subtle==null)throw Object.assign(new Error("Missing Web Crypto API. The most likely cause of this error is that this page is being accessed from an insecure context (i.e. not HTTPS). For more information and possible resolutions see https://github.com/libp2p/js-libp2p/blob/main/packages/crypto/README.md#web-crypto-api"),{code:"ERR_MISSING_WEB_CRYPTO"});return e}};var n8={alg:"A128GCM",ext:!0,k:"scm9jmO_4BJAgdwWGVulLg",key_ops:["encrypt","decrypt"],kty:"oct"};function mA(r){let e=r?.algorithm??"AES-GCM",t=r?.keyLength??16,n=r?.nonceLength??12,o=r?.digest??"SHA-256",s=r?.saltLength??16,i=r?.iterations??32767,a=or.get();t*=8;async function c(u,d){let y=a.getRandomValues(new Uint8Array(s)),p=a.getRandomValues(new Uint8Array(n)),m={name:e,iv:p};typeof d=="string"&&(d=x(d));let g;if(d.length===0){g=await a.subtle.importKey("jwk",n8,{name:"AES-GCM"},!0,["encrypt"]);try{let E={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},w=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);g=await a.subtle.deriveKey(E,w,{name:e,length:t},!0,["encrypt"])}catch{g=await a.subtle.importKey("jwk",n8,{name:"AES-GCM"},!0,["encrypt"])}}else{let E={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},w=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);g=await a.subtle.deriveKey(E,w,{name:e,length:t},!0,["encrypt"])}let b=await a.subtle.encrypt(m,g,u);return le([y,m.iv,new Uint8Array(b)])}async function l(u,d){let y=u.subarray(0,s),p=u.subarray(s,s+n),m=u.subarray(s+n),g={name:e,iv:p};typeof d=="string"&&(d=x(d));let b;if(d.length===0)try{let w={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},_=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);b=await a.subtle.deriveKey(w,_,{name:e,length:t},!0,["decrypt"])}catch{b=await a.subtle.importKey("jwk",n8,{name:"AES-GCM"},!0,["decrypt"])}else{let w={name:"PBKDF2",salt:y,iterations:i,hash:{name:o}},_=await a.subtle.importKey("raw",d,{name:"PBKDF2"},!1,["deriveKey"]);b=await a.subtle.deriveKey(w,_,{name:e,length:t},!0,["decrypt"])}let E=await a.subtle.decrypt(g,b,m);return new Uint8Array(E)}return{encrypt:c,decrypt:l}}async function Pc(r,e){let n=await mA().encrypt(r,e);return Ge.encode(n)}var rt;(function(r){r.RSA="RSA",r.Ed25519="Ed25519",r.Secp256k1="Secp256k1"})(rt||(rt={}));var o8;(function(r){r[r.RSA=0]="RSA",r[r.Ed25519=1]="Ed25519",r[r.Secp256k1=2]="Secp256k1"})(o8||(o8={}));(function(r){r.codec=()=>Re(o8)})(rt||(rt={}));var to;(function(r){let e;r.codec=()=>(e==null&&(e=J((t,n,o={})=>{o.lengthDelimited!==!1&&n.fork(),t.Type!=null&&(n.uint32(8),rt.codec().encode(t.Type,n)),t.Data!=null&&(n.uint32(18),n.bytes(t.Data)),o.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let o={},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let i=t.uint32();switch(i>>>3){case 1:o.Type=rt.codec().decode(t);break;case 2:o.Data=t.bytes();break;default:t.skipType(i&7);break}}return o})),e),r.encode=t=>Q(t,r.codec()),r.decode=t=>X(t,r.codec())})(to||(to={}));var ro;(function(r){let e;r.codec=()=>(e==null&&(e=J((t,n,o={})=>{o.lengthDelimited!==!1&&n.fork(),t.Type!=null&&(n.uint32(8),rt.codec().encode(t.Type,n)),t.Data!=null&&(n.uint32(18),n.bytes(t.Data)),o.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let o={},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let i=t.uint32();switch(i>>>3){case 1:o.Type=rt.codec().decode(t);break;case 2:o.Data=t.bytes();break;default:t.skipType(i&7);break}}return o})),e),r.encode=t=>Q(t,r.codec()),r.decode=t=>X(t,r.codec())})(ro||(ro={}));var Uu=class{_key;constructor(e){this._key=Cc(e,Dc)}verify(e,t){return hA(this._key,t,e)}marshal(){return this._key}get bytes(){return to.encode({Type:rt.Ed25519,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}hash(){let e=K.digest(this.bytes);return Qr(e)?e.then(({bytes:t})=>t):e.bytes}},Yi=class{_key;_publicKey;constructor(e,t){this._key=Cc(e,Go),this._publicKey=Cc(t,Dc)}sign(e){return dA(this._key,e)}get public(){return new Uu(this._publicKey)}marshal(){return this._key}get bytes(){return ro.encode({Type:rt.Ed25519,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}async hash(){let e=K.digest(this.bytes),t;return Qr(e)?{bytes:t}=await e:t=e.bytes,t}async id(){let e=Xe.digest(this.public.bytes);return ie.encode(e.bytes).substring(1)}async export(e,t="libp2p-key"){if(t==="libp2p-key")return Pc(this.bytes,e);throw new h(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}};function nV(r){if(r.length>Go){r=Cc(r,Go+Dc);let n=r.subarray(0,Go),o=r.subarray(Go,r.length);return new Yi(n,o)}r=Cc(r,Go);let e=r.subarray(0,Go),t=r.subarray(Dc);return new Yi(e,t)}function oV(r){return r=Cc(r,Dc),new Uu(r)}async function sV(){let{privateKey:r,publicKey:e}=uA();return new Yi(r,e)}async function yA(r){let{privateKey:e,publicKey:t}=fA(r);return new Yi(e,t)}function Cc(r,e){if(r=Uint8Array.from(r??[]),r.length!==e)throw new h(`Key must be a Uint8Array of length ${e}, got ${r.length}`,"ERR_INVALID_KEY_TYPE");return r}var u8={};oe(u8,{MAX_RSA_KEY_SIZE:()=>qu,RsaPrivateKey:()=>Nc,RsaPublicKey:()=>Vu,fromJwk:()=>gV,generateKeyPair:()=>bV,unmarshalRsaPrivateKey:()=>c8,unmarshalRsaPublicKey:()=>yV});function Wi(r){if(isNaN(r)||r<=0)throw new h("random bytes length must be a Number bigger than 0","ERR_INVALID_LENGTH");return dt(r)}var qs={};oe(qs,{exportToPem:()=>fV,importFromPem:()=>dV,jwkToPkcs1:()=>aV,jwkToPkix:()=>lV,pkcs1ToJwk:()=>iV,pkixToJwk:()=>cV});function iV(r){let{result:e}=Ee(r),t=e.valueBlock.value;return{n:v(no(t[1].toBigInt()),"base64url"),e:v(no(t[2].toBigInt()),"base64url"),d:v(no(t[3].toBigInt()),"base64url"),p:v(no(t[4].toBigInt()),"base64url"),q:v(no(t[5].toBigInt()),"base64url"),dp:v(no(t[6].toBigInt()),"base64url"),dq:v(no(t[7].toBigInt()),"base64url"),qi:v(no(t[8].toBigInt()),"base64url"),kty:"RSA",alg:"RS256"}}function aV(r){if(r.n==null||r.e==null||r.d==null||r.p==null||r.q==null||r.dp==null||r.dq==null||r.qi==null)throw new h("JWK was missing components","ERR_INVALID_PARAMETERS");let t=new M({value:[new B({value:0}),B.fromBigInt(oo(x(r.n,"base64url"))),B.fromBigInt(oo(x(r.e,"base64url"))),B.fromBigInt(oo(x(r.d,"base64url"))),B.fromBigInt(oo(x(r.p,"base64url"))),B.fromBigInt(oo(x(r.q,"base64url"))),B.fromBigInt(oo(x(r.dp,"base64url"))),B.fromBigInt(oo(x(r.dq,"base64url"))),B.fromBigInt(oo(x(r.qi,"base64url")))]}).toBER();return new Uint8Array(t,0,t.byteLength)}function cV(r){let{result:e}=Ee(r),t=e.valueBlock.value[1].valueBlock.value[0].valueBlock.value;return{kty:"RSA",n:v(no(t[0].toBigInt()),"base64url"),e:v(no(t[1].toBigInt()),"base64url")}}function lV(r){if(r.n==null||r.e==null)throw new h("JWK was missing components","ERR_INVALID_PARAMETERS");let t=new M({value:[new M({value:[new ae({value:"1.2.840.113549.1.1.1"}),new Ne]}),new kt({valueHex:new M({value:[B.fromBigInt(oo(x(r.n,"base64url"))),B.fromBigInt(oo(x(r.e,"base64url")))]}).toBER()})]}).toBER();return new Uint8Array(t,0,t.byteLength)}function no(r){let e=r.toString(16);e.length%2>0&&(e=`0${e}`);let t=e.length/2,n=new Uint8Array(t),o=0,s=0;for(;o<t;)n[o]=parseInt(e.slice(s,s+2),16),o+=1,s+=2;return n}function oo(r){let e=[];return r.forEach(function(t){let n=t.toString(16);n.length%2>0&&(n=`0${n}`),e.push(n)}),BigInt("0x"+e.join(""))}var uV=16,i8=32,a8=1e4;async function fV(r,e){let t=or.get(),o=new M({value:[new B({value:0}),new M({value:[new ae({value:"1.2.840.113549.1.1.1"}),new Ne]}),new Se({valueHex:r.marshal()})]}).toBER(),s=new Uint8Array(o,0,o.byteLength),i=Wi(uV),a=await pt(Ye,e,i,{c:a8,dkLen:i8}),c=Wi(16),l=await t.subtle.importKey("raw",a,"AES-CBC",!1,["encrypt"]),f=await t.subtle.encrypt({name:"AES-CBC",iv:c},l,s),u=new M({value:[new Se({valueHex:i}),new B({value:a8}),new B({value:i8}),new M({value:[new ae({value:"1.2.840.113549.2.11"}),new Ne]})]}),d=new M({value:[new ae({value:"1.2.840.113549.1.5.13"}),new M({value:[new M({value:[new ae({value:"1.2.840.113549.1.5.12"}),u]}),new M({value:[new ae({value:"2.16.840.1.101.3.4.1.42"}),new Se({valueHex:c})]})]})]}),p=new M({value:[d,new Se({valueHex:f})]}).toBER(),m=new Uint8Array(p,0,p.byteLength);return["-----BEGIN ENCRYPTED PRIVATE KEY-----",...v(m,"base64pad").split(/(.{64})/).filter(Boolean),"-----END ENCRYPTED PRIVATE KEY-----"].join(`
|
|
47
47
|
`)}async function dV(r,e){let t=or.get(),n;if(r.includes("-----BEGIN ENCRYPTED PRIVATE KEY-----")){let o=x(r.replace("-----BEGIN ENCRYPTED PRIVATE KEY-----","").replace("-----END ENCRYPTED PRIVATE KEY-----","").replace(/\n/g,"").trim(),"base64pad"),{result:s}=Ee(o),{iv:i,salt:a,iterations:c,keySize:l,cipherText:f}=hV(s),u=await pt(Ye,e,a,{c,dkLen:l}),d=await t.subtle.importKey("raw",u,"AES-CBC",!1,["decrypt"]),y=Fu(await t.subtle.decrypt({name:"AES-CBC",iv:i},d,f)),{result:p}=Ee(y);n=gA(p)}else if(r.includes("-----BEGIN PRIVATE KEY-----")){let o=x(r.replace("-----BEGIN PRIVATE KEY-----","").replace("-----END PRIVATE KEY-----","").replace(/\n/g,"").trim(),"base64pad"),{result:s}=Ee(o);n=gA(s)}else throw new h("Could not parse private key from PEM data","ERR_INVALID_PARAMETERS");return c8(n)}function hV(r){let e=r.valueBlock.value[0];if(e.valueBlock.value[0].toString()!=="OBJECT IDENTIFIER : 1.2.840.113549.1.5.13")throw new h("Only pkcs5PBES2 encrypted private keys are supported","ERR_INVALID_PARAMS");let n=e.valueBlock.value[1].valueBlock.value[0];if(n.valueBlock.value[0].toString()!=="OBJECT IDENTIFIER : 1.2.840.113549.1.5.12")throw new h("Only pkcs5PBKDF2 key derivation functions are supported","ERR_INVALID_PARAMS");let s=n.valueBlock.value[1],i=Fu(s.valueBlock.value[0].getValue()),a=a8,c=i8;if(s.valueBlock.value.length===3)a=Number(s.valueBlock.value[1].toBigInt()),c=Number(s.valueBlock.value[2].toBigInt());else if(s.valueBlock.value.length===2)throw new h("Could not derive key size and iterations from PEM file - please use @libp2p/rsa to re-import your key","ERR_INVALID_PARAMS");let l=e.valueBlock.value[1].valueBlock.value[1],f=l.valueBlock.value[0].toString();if(f!=="OBJECT IDENTIFIER : 1.2.840.113549.3.7"){if(f!=="OBJECT IDENTIFIER : 1.3.14.3.2.7"){if(f!=="OBJECT IDENTIFIER : 2.16.840.1.101.3.4.1.2"){if(f!=="OBJECT IDENTIFIER : 2.16.840.1.101.3.4.1.22"){if(f!=="OBJECT IDENTIFIER : 2.16.840.1.101.3.4.1.42")throw new h("Only AES-CBC encryption schemes are supported","ERR_INVALID_PARAMS")}}}}let u=Fu(l.valueBlock.value[1].getValue());return{cipherText:Fu(r.valueBlock.value[1].getValue()),salt:i,iterations:a,keySize:c,iv:u}}function gA(r){return Fu(r.valueBlock.value[2].getValue())}function Fu(r){return new Uint8Array(r,0,r.byteLength)}async function bA(r){let e=await or.get().subtle.generateKey({name:"RSASSA-PKCS1-v1_5",modulusLength:r,publicExponent:new Uint8Array([1,0,1]),hash:{name:"SHA-256"}},!0,["sign","verify"]),t=await xA(e);return{privateKey:t[0],publicKey:t[1]}}async function l8(r){let t=[await or.get().subtle.importKey("jwk",r,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["sign"]),await pV(r)],n=await xA({privateKey:t[0],publicKey:t[1]});return{privateKey:n[0],publicKey:n[1]}}async function wA(r,e){let t=await or.get().subtle.importKey("jwk",r,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["sign"]),n=await or.get().subtle.sign({name:"RSASSA-PKCS1-v1_5"},t,e instanceof Uint8Array?e:e.subarray());return new Uint8Array(n,0,n.byteLength)}async function EA(r,e,t){let n=await or.get().subtle.importKey("jwk",r,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["verify"]);return or.get().subtle.verify({name:"RSASSA-PKCS1-v1_5"},n,e,t instanceof Uint8Array?t:t.subarray())}async function xA(r){if(r.privateKey==null||r.publicKey==null)throw new h("Private and public key are required","ERR_INVALID_PARAMETERS");return Promise.all([or.get().subtle.exportKey("jwk",r.privateKey),or.get().subtle.exportKey("jwk",r.publicKey)])}async function pV(r){return or.get().subtle.importKey("jwk",{kty:r.kty,n:r.n,e:r.e},{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["verify"])}function Rp(r){if(r.kty!=="RSA")throw new h("invalid key type","ERR_INVALID_KEY_TYPE");if(r.n==null)throw new h("invalid key modulus","ERR_INVALID_KEY_MODULUS");return x(r.n,"base64url").length*8}var qu=8192,Vu=class{_key;constructor(e){this._key=e}verify(e,t){return EA(this._key,t,e)}marshal(){return qs.jwkToPkix(this._key)}get bytes(){return to.encode({Type:rt.RSA,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}hash(){let e=K.digest(this.bytes);return Qr(e)?e.then(({bytes:t})=>t):e.bytes}},Nc=class{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t}genSecret(){return Wi(16)}sign(e){return wA(this._key,e)}get public(){if(this._publicKey==null)throw new h("public key not provided","ERR_PUBKEY_NOT_PROVIDED");return new Vu(this._publicKey)}marshal(){return qs.jwkToPkcs1(this._key)}get bytes(){return ro.encode({Type:rt.RSA,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}hash(){let e=K.digest(this.bytes);return Qr(e)?e.then(({bytes:t})=>t):e.bytes}async id(){let e=await this.public.hash();return v(e,"base58btc")}async export(e,t="pkcs-8"){if(t==="pkcs-8")return qs.exportToPem(this,e);if(t==="libp2p-key")return Pc(this.bytes,e);throw new h(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}};async function c8(r){let e=qs.pkcs1ToJwk(r);if(Rp(e)>qu)throw new h("key size is too large","ERR_KEY_SIZE_TOO_LARGE");let t=await l8(e);return new Nc(t.privateKey,t.publicKey)}function yV(r){let e=qs.pkixToJwk(r);if(Rp(e)>qu)throw new h("key size is too large","ERR_KEY_SIZE_TOO_LARGE");return new Vu(e)}async function gV(r){if(Rp(r)>qu)throw new h("key size is too large","ERR_KEY_SIZE_TOO_LARGE");let e=await l8(r);return new Nc(e.privateKey,e.publicKey)}async function bV(r){if(r>qu)throw new h("key size is too large","ERR_KEY_SIZE_TOO_LARGE");let e=await bA(r);return new Nc(e.privateKey,e.publicKey)}var d8={};oe(d8,{Secp256k1PrivateKey:()=>$u,Secp256k1PublicKey:()=>Hu,generateKeyPair:()=>vV,unmarshalSecp256k1PrivateKey:()=>EV,unmarshalSecp256k1PublicKey:()=>xV});function vA(){return W.utils.randomPrivateKey()}function _A(r,e){let t=K.digest(e instanceof Uint8Array?e:e.subarray());if(Qr(t))return t.then(({digest:n})=>W.sign(n,r).toDERRawBytes()).catch(n=>{throw new h(String(n),"ERR_INVALID_INPUT")});try{return W.sign(t.digest,r).toDERRawBytes()}catch(n){throw new h(String(n),"ERR_INVALID_INPUT")}}function SA(r,e,t){let n=K.digest(t instanceof Uint8Array?t:t.subarray());if(Qr(n))return n.then(({digest:o})=>W.verify(e,o,r)).catch(o=>{throw new h(String(o),"ERR_INVALID_INPUT")});try{return W.verify(e,n.digest,r)}catch(o){throw new h(String(o),"ERR_INVALID_INPUT")}}function RA(r){return W.ProjectivePoint.fromHex(r).toRawBytes(!0)}function AA(r){try{W.getPublicKey(r,!0)}catch(e){throw new h(String(e),"ERR_INVALID_PRIVATE_KEY")}}function f8(r){try{W.ProjectivePoint.fromHex(r)}catch(e){throw new h(String(e),"ERR_INVALID_PUBLIC_KEY")}}function IA(r){try{return W.getPublicKey(r,!0)}catch(e){throw new h(String(e),"ERR_INVALID_PRIVATE_KEY")}}var Hu=class{_key;constructor(e){f8(e),this._key=e}verify(e,t){return SA(this._key,t,e)}marshal(){return RA(this._key)}get bytes(){return to.encode({Type:rt.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}async hash(){let e=K.digest(this.bytes),t;return Qr(e)?{bytes:t}=await e:t=e.bytes,t}},$u=class{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t??IA(e),AA(this._key),f8(this._publicKey)}sign(e){return _A(this._key,e)}get public(){return new Hu(this._publicKey)}marshal(){return this._key}get bytes(){return ro.encode({Type:rt.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return O(this.bytes,e.bytes)}hash(){let e=K.digest(this.bytes);return Qr(e)?e.then(({bytes:t})=>t):e.bytes}async id(){let e=await this.public.hash();return v(e,"base58btc")}async export(e,t="libp2p-key"){if(t==="libp2p-key")return Pc(this.bytes,e);throw new h(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}};function EV(r){return new $u(r)}function xV(r){return new Hu(r)}async function vV(){let r=vA();return new $u(r)}var zi={rsa:u8,ed25519:s8,secp256k1:d8};function kA(r){let e=Object.keys(zi).join(" / ");return new h(`invalid or unsupported key type ${r}. Must be ${e}`,"ERR_UNSUPPORTED_KEY_TYPE")}function TA(r){let e=to.decode(r),t=e.Data??new Uint8Array;switch(e.Type){case rt.RSA:return zi.rsa.unmarshalRsaPublicKey(t);case rt.Ed25519:return zi.ed25519.unmarshalEd25519PublicKey(t);case rt.Secp256k1:return zi.secp256k1.unmarshalSecp256k1PublicKey(t);default:throw kA(e.Type??"unknown")}}async function DA(r){let e=ro.decode(r),t=e.Data??new Uint8Array;switch(e.Type){case rt.RSA:return zi.rsa.unmarshalRsaPrivateKey(t);case rt.Ed25519:return zi.ed25519.unmarshalEd25519PrivateKey(t);case rt.Secp256k1:return zi.secp256k1.unmarshalSecp256k1PrivateKey(t);default:throw kA(e.Type??"RSA")}}var Vt={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var Bc;(function(r){let e;(function(o){let s;o.codec=()=>(s==null&&(s=J((i,a,c={})=>{c.lengthDelimited!==!1&&a.fork(),i.key!=null&&i.key!==""&&(a.uint32(10),a.string(i.key)),i.value!=null&&i.value.byteLength>0&&(a.uint32(18),a.bytes(i.value)),c.lengthDelimited!==!1&&a.ldelim()},(i,a)=>{let c={key:"",value:new Uint8Array(0)},l=a==null?i.len:i.pos+a;for(;i.pos<l;){let f=i.uint32();switch(f>>>3){case 1:c.key=i.string();break;case 2:c.value=i.bytes();break;default:i.skipType(f&7);break}}return c})),s),o.encode=i=>Q(i,o.codec()),o.decode=i=>X(i,o.codec())})(e=r.Peer$metadataEntry||(r.Peer$metadataEntry={}));let t;(function(o){let s;o.codec=()=>(s==null&&(s=J((i,a,c={})=>{c.lengthDelimited!==!1&&a.fork(),i.key!=null&&i.key!==""&&(a.uint32(10),a.string(i.key)),i.value!=null&&(a.uint32(18),Ip.codec().encode(i.value,a)),c.lengthDelimited!==!1&&a.ldelim()},(i,a)=>{let c={key:""},l=a==null?i.len:i.pos+a;for(;i.pos<l;){let f=i.uint32();switch(f>>>3){case 1:c.key=i.string();break;case 2:c.value=Ip.codec().decode(i,i.uint32());break;default:i.skipType(f&7);break}}return c})),s),o.encode=i=>Q(i,o.codec()),o.decode=i=>X(i,o.codec())})(t=r.Peer$tagsEntry||(r.Peer$tagsEntry={}));let n;r.codec=()=>(n==null&&(n=J((o,s,i={})=>{if(i.lengthDelimited!==!1&&s.fork(),o.addresses!=null)for(let a of o.addresses)s.uint32(10),Ap.codec().encode(a,s);if(o.protocols!=null)for(let a of o.protocols)s.uint32(18),s.string(a);if(o.publicKey!=null&&(s.uint32(34),s.bytes(o.publicKey)),o.peerRecordEnvelope!=null&&(s.uint32(42),s.bytes(o.peerRecordEnvelope)),o.metadata!=null&&o.metadata.size!==0)for(let[a,c]of o.metadata.entries())s.uint32(50),r.Peer$metadataEntry.codec().encode({key:a,value:c},s);if(o.tags!=null&&o.tags.size!==0)for(let[a,c]of o.tags.entries())s.uint32(58),r.Peer$tagsEntry.codec().encode({key:a,value:c},s);i.lengthDelimited!==!1&&s.ldelim()},(o,s)=>{let i={addresses:[],protocols:[],metadata:new Map,tags:new Map},a=s==null?o.len:o.pos+s;for(;o.pos<a;){let c=o.uint32();switch(c>>>3){case 1:i.addresses.push(Ap.codec().decode(o,o.uint32()));break;case 2:i.protocols.push(o.string());break;case 4:i.publicKey=o.bytes();break;case 5:i.peerRecordEnvelope=o.bytes();break;case 6:{let l=r.Peer$metadataEntry.codec().decode(o,o.uint32());i.metadata.set(l.key,l.value);break}case 7:{let l=r.Peer$tagsEntry.codec().decode(o,o.uint32());i.tags.set(l.key,l.value);break}default:o.skipType(c&7);break}}return i})),n),r.encode=o=>Q(o,r.codec()),r.decode=o=>X(o,r.codec())})(Bc||(Bc={}));var Ap;(function(r){let e;r.codec=()=>(e==null&&(e=J((t,n,o={})=>{o.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)),o.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let o={multiaddr:new Uint8Array(0)},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let i=t.uint32();switch(i>>>3){case 1:o.multiaddr=t.bytes();break;case 2:o.isCertified=t.bool();break;default:t.skipType(i&7);break}}return o})),e),r.encode=t=>Q(t,r.codec()),r.decode=t=>X(t,r.codec())})(Ap||(Ap={}));var Ip;(function(r){let e;r.codec=()=>(e==null&&(e=J((t,n,o={})=>{o.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)),o.lengthDelimited!==!1&&n.ldelim()},(t,n)=>{let o={value:0},s=n==null?t.len:t.pos+n;for(;t.pos<s;){let i=t.uint32();switch(i>>>3){case 1:o.value=t.uint32();break;case 2:o.expiry=t.uint64();break;default:t.skipType(i&7);break}}return o})),e),r.encode=t=>Q(t,r.codec()),r.decode=t=>X(t,r.codec())})(Ip||(Ip={}));function Lc(r,e){let t=Bc.decode(e);t.publicKey!=null&&r.publicKey==null&&(r=V6({...r,publicKey:r.publicKey}));let n=new Map,o=BigInt(Date.now());for(let[s,i]of t.tags.entries())i.expiry!=null&&i.expiry<o||n.set(s,i);return{...t,id:r,addresses:t.addresses.map(({multiaddr:s,isCertified:i})=>({multiaddr:se(s),isCertified:i??!1})),metadata:t.metadata,peerRecordEnvelope:t.peerRecordEnvelope??void 0,tags:n}}var h8="/peers/";function Oc(r){if(!na(r)||r.type==null)throw new h("Invalid PeerId",Vt.ERR_INVALID_PARAMETERS);let e=r.toCID().toString();return new qe(`${h8}${e}`)}async function PA(r,e,t){let n=new Map;for(let o of t){if(o==null)continue;if(o.multiaddr instanceof Uint8Array&&(o.multiaddr=se(o.multiaddr)),!ns(o.multiaddr))throw new h("Multiaddr was invalid",Vt.ERR_INVALID_PARAMETERS);if(!await e(r,o.multiaddr))continue;let s=o.isCertified??!1,i=o.multiaddr.toString(),a=n.get(i);a!=null?o.isCertified=a.isCertified||s:n.set(i,{multiaddr:o.multiaddr,isCertified:s})}return[...n.values()].sort((o,s)=>o.multiaddr.toString().localeCompare(s.multiaddr.toString())).map(({isCertified:o,multiaddr:s})=>({isCertified:o,multiaddr:s.bytes}))}async function Tp(r,e,t,n){if(e==null)throw new h("Invalid PeerData",Vt.ERR_INVALID_PARAMETERS);if(e.publicKey!=null&&r.publicKey!=null&&!O(e.publicKey,r.publicKey))throw new h("publicKey bytes do not match peer id publicKey bytes",Vt.ERR_INVALID_PARAMETERS);let o=n.existingPeer;if(o!=null&&!r.equals(o.id))throw new h("peer id did not match existing peer id",Vt.ERR_INVALID_PARAMETERS);let s=o?.addresses??[],i=new Set(o?.protocols??[]),a=o?.metadata??new Map,c=o?.tags??new Map,l=o?.peerRecordEnvelope;if(t==="patch"){if((e.multiaddrs!=null||e.addresses!=null)&&(s=[],e.multiaddrs!=null&&s.push(...e.multiaddrs.map(u=>({isCertified:!1,multiaddr:u}))),e.addresses!=null&&s.push(...e.addresses)),e.protocols!=null&&(i=new Set(e.protocols)),e.metadata!=null){let u=e.metadata instanceof Map?[...e.metadata.entries()]:Object.entries(e.metadata);a=kp(u,{validate:CA})}if(e.tags!=null){let u=e.tags instanceof Map?[...e.tags.entries()]:Object.entries(e.tags);c=kp(u,{validate:NA,map:BA})}e.peerRecordEnvelope!=null&&(l=e.peerRecordEnvelope)}if(t==="merge"){if(e.multiaddrs!=null&&s.push(...e.multiaddrs.map(u=>({isCertified:!1,multiaddr:u}))),e.addresses!=null&&s.push(...e.addresses),e.protocols!=null&&(i=new Set([...i,...e.protocols])),e.metadata!=null){let u=e.metadata instanceof Map?[...e.metadata.entries()]:Object.entries(e.metadata);for(let[d,y]of u)y==null?a.delete(d):a.set(d,y);a=kp([...a.entries()],{validate:CA})}if(e.tags!=null){let u=e.tags instanceof Map?[...e.tags.entries()]:Object.entries(e.tags),d=new Map(c);for(let[y,p]of u)p==null?d.delete(y):d.set(y,p);c=kp([...d.entries()],{validate:NA,map:BA})}e.peerRecordEnvelope!=null&&(l=e.peerRecordEnvelope)}let f={addresses:await PA(r,n.addressFilter??(async()=>!0),s),protocols:[...i.values()].sort((u,d)=>u.localeCompare(d)),metadata:a,tags:c,publicKey:o?.id.publicKey??e.publicKey??r.publicKey,peerRecordEnvelope:l};return r.type!=="RSA"&&delete f.publicKey,f}function kp(r,e){let t=new Map;for(let[n,o]of r)o!=null&&e.validate(n,o);for(let[n,o]of r.sort(([s],[i])=>s.localeCompare(i)))o!=null&&t.set(n,e.map?.(n,o)??o);return t}function CA(r,e){if(typeof r!="string")throw new h("Metadata key must be a string",Vt.ERR_INVALID_PARAMETERS);if(!(e instanceof Uint8Array))throw new h("Metadata value must be a Uint8Array",Vt.ERR_INVALID_PARAMETERS)}function NA(r,e){if(typeof r!="string")throw new h("Tag name must be a string",Vt.ERR_INVALID_PARAMETERS);if(e.value!=null){if(parseInt(`${e.value}`,10)!==e.value)throw new h("Tag value must be an integer",Vt.ERR_INVALID_PARAMETERS);if(e.value<0||e.value>100)throw new h("Tag value must be between 0-100",Vt.ERR_INVALID_PARAMETERS)}if(e.ttl!=null){if(parseInt(`${e.ttl}`,10)!==e.ttl)throw new h("Tag ttl must be an integer",Vt.ERR_INVALID_PARAMETERS);if(e.ttl<0)throw new h("Tag ttl must be between greater than 0",Vt.ERR_INVALID_PARAMETERS)}}function BA(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 Dp(r,e,t){let n=r.toString().split("/")[2],o=vt.decode(n),s=at(o),i=t.get(s);if(i!=null)return i;let a=Lc(s,e);return t.set(s,a),a}function _V(r,e){return r==null?{}:{prefix:h8,filters:(r.filters??[]).map(t=>({key:n,value:o})=>t(Dp(n,o,e))),orders:(r.orders??[]).map(t=>(n,o)=>t(Dp(n.key,n.value,e),Dp(o.key,o.value,e)))}}var Pp=class{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=Cl({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(Oc(e))}async delete(e){if(this.peerId.equals(e))throw new h("Cannot delete self peer",Vt.ERR_INVALID_PARAMETERS);await this.datastore.delete(Oc(e))}async load(e){let t=await this.datastore.get(Oc(e));return Lc(e,t)}async save(e,t){let{existingBuf:n,existingPeer:o}=await this.#e(e),s=await Tp(e,t,"patch",{addressFilter:this.addressFilter});return this.#t(e,s,n,o)}async patch(e,t){let{existingBuf:n,existingPeer:o}=await this.#e(e),s=await Tp(e,t,"patch",{addressFilter:this.addressFilter,existingPeer:o});return this.#t(e,s,n,o)}async merge(e,t){let{existingBuf:n,existingPeer:o}=await this.#e(e),s=await Tp(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:o});return this.#t(e,s,n,o)}async*all(e){let t=new Lt;for await(let{key:n,value:o}of this.datastore.query(_V(e??{},t))){let s=Dp(n,o,t);s.id.equals(this.peerId)||(yield s)}}async#e(e){try{let t=await this.datastore.get(Oc(e)),n=Lc(e,t);return{existingBuf:t,existingPeer:n}}catch(t){if(t.code!=="ERR_NOT_FOUND")throw t}return{}}async#t(e,t,n,o){let s=Bc.encode(t);return n!=null&&O(s,n)?{peer:Lc(e,s),previous:o,updated:!1}:(await this.datastore.put(Oc(e),s),{peer:Lc(e,s),previous:o,updated:!0})}};var Cp=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 Pp(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 o of this.store.all(t))e(o)}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 Pl(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 o=await this.store.save(e,t);return this.#e(e,o),o.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 o=await this.store.patch(e,t);return this.#e(e,o),o.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 o=await this.store.merge(e,t);return this.#e(e,o),o.peer}finally{this.log.trace("merge release write lock"),n()}}async consumePeerRecord(e,t){let n=await mn.openAndCertify(e,Sr.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 o=Sr.createFromProtobuf(n.payload),s;try{s=await this.get(n.peerId)}catch(i){if(i.code!=="ERR_NOT_FOUND")throw i}if(s?.peerRecordEnvelope!=null){let i=await mn.createFromProtobuf(s.peerRecordEnvelope),a=Sr.createFromProtobuf(i.payload);if(a.seqNumber>=o.seqNumber)return this.log("sequence number was lower or equal to existing sequence number - stored: %d received: %d",a.seqNumber,o.seqNumber),!1}return await this.patch(o.peerId,{peerRecordEnvelope:e,addresses:o.multiaddrs.map(i=>({isCertified:!0,multiaddr:i}))}),!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 LA(r,e){let t;return function(){let n=function(){t=void 0,r()};clearTimeout(t),t=setTimeout(n,e)}}var SV=r=>r;function p8(r,e){let t=r.getPeerId();return t!=null&&Ae(t).equals(e)&&(r=r.decapsulate(se(`/p2p/${e.toString()}`))),r}var Np=class{log;components;listen;announce;observed;announceFilter;constructor(e,t={}){let{listen:n=[],announce:o=[]}=t;this.components=e,this.log=e.logger.forComponent("libp2p:address-manager"),this.listen=n.map(s=>s.toString()),this.announce=new Set(o.map(s=>s.toString())),this.observed=new Map,this.announceFilter=t.announceFilter??SV,this._updatePeerStoreAddresses=LA(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=p8(e,this.components.peerId);let t=e.toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){e=p8(e,this.components.peerId);let t=e.toString(),o=(this.observed.get(t)??{confident:!1}).confident;this.observed.set(t,{confident:!0}),o||this._updatePeerStoreAddresses()}removeObservedAddr(e){e=p8(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,o])=>o.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 m8=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=Qo())}isStarted(){return this._started}async _invokeStartableMethod(e){await Promise.all(Object.values(this.components).filter(t=>Qu(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")}},RV=["metrics","connectionProtector"],AV=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];function OA(r={}){let e=new m8(r);return new Proxy(e,{get(n,o,s){if(typeof o=="string"&&!AV.includes(o)){let i=e.components[o];if(i==null&&!RV.includes(o))throw new h(`${o} not set`,"ERR_SERVICE_MISSING");return i}return Reflect.get(n,o,s)},set(n,o,s){return typeof o=="string"?e.components[o]=s:Reflect.set(n,o,s),!0}})}function KA(r={}){return{denyDialPeer:async()=>!1,denyDialMultiaddr:async e=>{let t=e.stringTuples();return t[0][0]===4||t[0][0]===41?!!$r(`${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 y8(r){try{let{address:e}=r.nodeAddress();return!!$r(e)}catch{return!0}}function IV(r,e){let t=y8(r.multiaddr),n=y8(e.multiaddr);return t&&!n?1:!t&&n?-1:0}function kV(r,e){return r.isCertified&&!e.isCertified?-1:!r.isCertified&&e.isCertified?1:0}function TV(r,e){let t=cu.exactMatch(r.multiaddr),n=cu.exactMatch(e.multiaddr);return t&&!n?1:!t&&n?-1:0}function Kc(r,e){let t=IV(r,e);if(t!==0)return t;let n=TV(r,e);return n!==0?n:kV(r,e)}var b8=Ue(m2(),1),w8=Ue(FA(),1);function Bp(r,e,t){return`${r}?name=${e}&type=${t}`}async function VA(r,e){return await(await fetch(r,{headers:new Headers({accept:"application/dns-json"}),signal:e})).json()}function ji(r,e){return`${e}_${r}`}var g8=Object.assign((0,b8.default)("dns-over-http-resolver"),{error:(0,b8.default)("dns-over-http-resolver:error")}),E8=class{_cache;_TXTcache;_servers;_request;_abortControllers;constructor(e={}){this._cache=new w8.default({max:e?.maxCache??100}),this._TXTcache=new w8.default({max:e?.maxCache??100}),this._servers=["https://cloudflare-dns.com/dns-query","https://dns.google/resolve"],this._request=e.request??VA,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),o=e[t];e[t]=e[n],e[n]=o}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(ji(e,t));if(n!=null)return n;let o=!1;for(let s of this._getShuffledServers()){let i=new AbortController;this._abortControllers.push(i);try{let a=await this._request(Bp(s,e,t),i.signal),c=a.Answer.map(f=>f.data),l=Math.min(...a.Answer.map(f=>f.TTL));return this._cache.set(ji(e,t),c,{ttl:l}),c}catch{i.signal.aborted&&(o=!0),g8.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==i)}}throw o?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(ji(e,t));if(n!=null)return n;let o=!1;for(let s of this._getShuffledServers()){let i=new AbortController;this._abortControllers.push(i);try{let a=await this._request(Bp(s,e,t),i.signal),c=a.Answer.map(f=>f.data),l=Math.min(...a.Answer.map(f=>f.TTL));return this._cache.set(ji(e,t),c,{ttl:l}),c}catch{i.signal.aborted&&(o=!0),g8.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==i)}}throw o?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(ji(e,t));if(n!=null)return n;let o=!1;for(let s of this._getShuffledServers()){let i=new AbortController;this._abortControllers.push(i);try{let a=await this._request(Bp(s,e,t),i.signal),c=a.Answer.map(f=>[f.data.replace(/['"]+/g,"")]),l=Math.min(...a.Answer.map(f=>f.TTL));return this._TXTcache.set(ji(e,t),c,{ttl:l}),c}catch{i.signal.aborted&&(o=!0),g8.error(`${s} could not resolve ${e} record ${t}`)}finally{this._abortControllers=this._abortControllers.filter(a=>a!==i)}}throw o?Object.assign(new Error("queryTxt ECANCELLED"),{code:"ECANCELLED"}):new Error(`Could not resolve ${e} record ${t}`)}clearCache(){this._cache.clear(),this._TXTcache.clear()}},qA=E8;var HA=qA;var{code:BV}=fe("dnsaddr");async function Mc(r,e={}){let t=new HA;e.signal!=null&&e.signal.addEventListener("abort",()=>{t.cancel()});let n=r.getPeerId(),[,o]=r.stringTuples().find(([a])=>a===BV)??[];if(o==null)throw new Error("No hostname found in multiaddr");let i=(await t.resolveTxt(`_dnsaddr.${o}`)).flat().map(a=>a.split("=")[1]).filter(Boolean);return n!=null&&(i=i.filter(a=>a.includes(n))),i}var Yo;(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"})(Yo||(Yo={}));var ee;(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"})(ee||(ee={}));var LV={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:r=>r},connectionManager:{resolvers:{dnsaddr:Mc},addressSorter:Kc},transportManager:{faultTolerance:zo.FATAL_ALL}};async function $A(r){let e=gc(LV,r);if(e.connectionProtector===null&&globalThis.process?.env?.LIBP2P_FORCE_PNET!=null)throw new h(Yo.ERR_PROTECTOR_REQUIRED,ee.ERR_PROTECTOR_REQUIRED);if(!(await It(e.privateKey.public.bytes,e.privateKey.bytes)).equals(e.peerId))throw new h("Private key doesn't match peer id",ee.ERR_INVALID_KEY);return e}function Lp(r){if(na(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:Ae(t),r.forEach(n=>{if(!ns(n))throw new h("Invalid Multiaddr",ee.ERR_INVALID_MULTIADDR);let o=n.getPeerId();if(o==null){if(e!=null)throw new h("Multiaddrs must all have the same peer id or have no peer id",ee.ERR_INVALID_PARAMETERS)}else{let s=Ae(o);if(e==null||!e.equals(s))throw new h("Multiaddrs must all have the same peer id or have no peer id",ee.ERR_INVALID_PARAMETERS)}})}return{peerId:e,multiaddrs:r}}var Op="last-dial-failure";var Kp=5,Mp=100,Up=50,GA=1e3*60*7;var Xi={minConnections:Kp,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:GA,autoDialDiscoveredPeersDebounce:10},Fp=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??Xi.minConnections,this.autoDialPriority=t.autoDialPriority??Xi.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??Xi.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??Xi.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??Xi.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??Xi.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new Cs({concurrency:t.autoDialConcurrency??Xi.autoDialConcurrency,metricName:"libp2p_autodial_queue",metrics:e.metrics}),this.queue.addEventListener("error",o=>{this.log.error("error during auto-dial",o.detail)}),e.events.addEventListener("connection:close",()=>{this.autoDial().catch(o=>{this.log.error(o)})});let n;e.events.addEventListener("peer:discovery",()=>{clearTimeout(n),n=setTimeout(()=>{this.autoDial().catch(o=>{this.log.error(o)})},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 mt(this.connectionManager.getDialQueue().map(l=>l.peerId).filter(Boolean)),o=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=o.sort(()=>Math.random()>.5?1:-1),i=new Lt;for(let l of s)i.has(l.id)||i.set(l.id,[...l.tags.values()].reduce((f,u)=>f+u.value,0));let c=s.sort((l,f)=>{let u=i.get(l.id)??0,d=i.get(f.id)??0;return u>d?-1:u<d?1:0}).filter(l=>{let f=l.metadata.get(Op);if(f==null)return!0;let u=parseInt(v(f));return isNaN(u)?!0:Date.now()-u>this.autoDialPeerRetryThresholdMs});this.log("selected %d/%d peers to dial",c.length,o.length);for(let l of c)this.queue.add(async()=>{let f=this.connectionManager.getConnectionsMap().size;if(f>=this.minConnections){this.log("got enough connections now %d/%d",f,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(f=>{this.log.error("could not connect to peerStore stored peer",f)});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 YA={maxConnections:Mp,allow:[]},Vp=class{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??YA.maxConnections,this.allow=t.allow??YA.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 o=new Lt;for(let a of e){let c=a.remotePeer;if(!o.has(c)){o.set(c,0);try{let l=await this.peerStore.get(c);o.set(c,[...l.tags.values()].reduce((f,u)=>f+u.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=o.get(a.remotePeer)??0,f=o.get(c.remotePeer)??0;if(l>f)return 1;if(l<f)return-1;let u=a.timeline.open,d=c.timeline.open;return u<d?1:u>d?-1:0}),i=[];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()))||i.push(a),i.length===n)break;await Promise.all(i.map(async a=>{try{await a.close()}catch(c){this.log.error(c)}})),this.events.safeDispatchEvent("connection:prune",{detail:i})}};async function S8(r,e){if(!r.protoNames().includes("dnsaddr"))return[r];let n=await MV(r,e),i=(await Promise.all(n.map(async a=>S8(a,e)))).flat().reduce((a,c)=>(a.find(l=>l.equals(c))==null&&a.push(c),a),[]);return e.log("resolved %s to",r,i.map(a=>a.toString())),i}async function MV(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 qp={addressSorter:Kc,maxParallelDials:Up,maxPeerAddrsToDial:25,dialTimeout:3e4,resolvers:{dnsaddr:Mc}},Hp=class{queue;components;addressSorter;maxPeerAddrsToDial;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??qp.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??qp.maxPeerAddrsToDial,this.dialTimeout=t.dialTimeout??qp.dialTimeout,this.connections=t.connections??new Lt,this.log=e.logger.forComponent("libp2p:connection-manager:dial-queue"),this.components=e,this.shutDownController=new AbortController,Ce(1/0,this.shutDownController.signal);for(let[n,o]of Object.entries(t.resolvers??{}))D1.set(n,o);this.queue=new To({concurrency:t.maxParallelDials??qp.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:o}=Lp(e),s=Array.from(this.connections.values()).flat().find(a=>t.force===!0?!1:a.remotePeer.equals(n)?!0:o.find(c=>c.equals(a.remoteAddr)));if(s!=null)return this.log("already connected to %a",s.remoteAddr),s;let i=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 o)if(c.has(l.toString()))return!0;return!1});if(i!=null){this.log("joining existing dial target for %p",n);for(let a of o)i.options.multiaddrs.add(a.toString());return i.join(t)}return this.log("creating dial target for %p",n,o.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:f})=>f.toString()).forEach(f=>{a?.multiaddrs.add(f)})}catch(f){throw c.clear(),f}try{let f=0,u=[];for(let d of l){if(f===this.maxPeerAddrsToDial)throw this.log("dialed maxPeerAddrsToDial (%d) addresses for %p, not trying any others",f,n),new h("Peer had more than maxPeerAddrsToDial",ee.ERR_TOO_MANY_ADDRESSES);f++;try{let y=await this.components.transportManager.dial(d.multiaddr,{...a,signal:c});return this.log("dial to %a succeeded",d.multiaddr),y}catch(y){if(this.log.error("dial failed to %a",d.multiaddr,y),n!=null)try{await this.components.peerStore.patch(n,{metadata:{[Op]:x(Date.now().toString())}})}catch(p){this.log.error("could not update last dial failure key for %p",n,p)}if(c.aborted)throw new h(y.message,ao);u.push(y)}}throw u.length===1?u[0]:new Xu(u,"All multiaddr dials failed",ee.ERR_TRANSPORT_DIAL_FAILED)}finally{c.clear()}},{peerId:n,priority:t.priority,multiaddrs:new Set(o.map(a=>a.toString())),signal:t.signal})}createDialAbortController(e){let t=Rt([AbortSignal.timeout(this.dialTimeout),this.shutDownController.signal,e]);return Ce(1/0,t),t}async calculateMultiaddrs(e,t=new Set,n={}){let o=[...t].map(u=>({multiaddr:se(u),isCertified:!1}));if(e!=null){if(this.components.peerId.equals(e))throw new h("Tried to dial self",ee.ERR_DIALED_SELF);if(await this.components.connectionGater.denyDialPeer?.(e)===!0)throw new h("The dial request is blocked by gater.allowDialPeer",ee.ERR_PEER_DIAL_INTERCEPTED);if(o.length===0){this.log("loading multiaddrs for %p",e);try{let u=await this.components.peerStore.get(e);o.push(...u.addresses),this.log("loaded multiaddrs for %p",e,o.map(({multiaddr:d})=>d.toString()))}catch(u){if(u.code!==ee.ERR_NOT_FOUND)throw u}}if(o.length===0){this.log("looking up multiaddrs for %p in the peer routing",e);try{let u=await this.components.peerRouting.findPeer(e);this.log("found multiaddrs for %p in the peer routing",e,o.map(({multiaddr:d})=>d.toString())),o.push(...u.multiaddrs.map(d=>({multiaddr:d,isCertified:!1})))}catch(u){u.code!==ee.ERR_NO_ROUTERS_AVAILABLE&&this.log.error("looking up multiaddrs for %p in the peer routing failed",e,u)}}}let s=(await Promise.all(o.map(async u=>{let d=await S8(u.multiaddr,{...n,log:this.log});return d.length===1&&d[0].equals(u.multiaddr)?u:d.map(y=>({multiaddr:y,isCertified:!1}))}))).flat();if(e!=null){let u=`/p2p/${e.toString()}`;s=s.map(d=>d.multiaddr.protos().pop()?.path===!0?d:d.multiaddr.getPeerId()==null?{multiaddr:d.multiaddr.encapsulate(u),isCertified:d.isCertified}:d)}let i=s.filter(u=>{if(this.components.transportManager.transportForMultiaddr(u.multiaddr)==null)return!1;let d=u.multiaddr.getPeerId();return e!=null&&d!=null?e.equals(d):!0}),a=new Map;for(let u of i){let d=u.multiaddr.toString(),y=a.get(d);if(y!=null){y.isCertified=y.isCertified||u.isCertified||!1;continue}a.set(d,u)}let c=[...a.values()];if(c.length===0)throw new h("The dial request has no valid addresses",ee.ERR_NO_VALID_ADDRESSES);let l=[];for(let u of c)this.components.connectionGater.denyDialMultiaddr!=null&&await this.components.connectionGater.denyDialMultiaddr(u.multiaddr)||l.push(u);let f=l.sort(this.addressSorter);if(f.length===0)throw new h("The connection gater denied all addresses in the dial request",ee.ERR_NO_VALID_ADDRESSES);return this.log.trace("addresses for %p before filtering",e??"unknown peer",s.map(({multiaddr:u})=>u.toString())),this.log.trace("addresses for %p after filtering",e??"unknown peer",f.map(({multiaddr:u})=>u.toString())),f}};var VV=50,Qi={minConnections:Kp,maxConnections:Mp,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100},$p=class{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Qi.maxConnections;let n=t.minConnections??Qi.minConnections;if(this.maxConnections<n)throw new h("Connection Manager maxConnections must be greater than minConnections",ee.ERR_INVALID_PARAMETERS);this.connections=new Lt,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(o=>se(o)),this.deny=(t.deny??[]).map(o=>se(o)),this.incomingPendingConnections=0,this.maxIncomingPendingConnections=t.maxIncomingPendingConnections??Qi.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new bc({points:t.inboundConnectionThreshold??Qi.inboundConnectionThreshold,duration:1}),this.autoDial=new Fp({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??Qi.autoDialConcurrency,autoDialPriority:t.autoDialPriority??Qi.autoDialPriority,maxQueueLength:t.autoDialMaxQueueLength??Qi.autoDialMaxQueueLength}),this.connectionPruner=new Vp({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new Hp(e,{addressSorter:t.addressSorter??Kc,maxParallelDials:t.maxParallelDials??Up,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??3e4,resolvers:t.resolvers??{dnsaddr:Mc},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 o of n.streams){let s=`${o.direction} ${o.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 o of n){let s={};for(let i of o.streams){let a=`${i.direction} ${i.protocol??"unnegotiated"}`;s[a]=(s[a]??0)+1}for(let[i,a]of Object.entries(s))e[i]=e[i]??[],e[i].push(a)}let t={};for(let[n,o]of Object.entries(e)){o=o.sort((i,a)=>i-a);let s=Math.floor(o.length*.9);t[n]=o[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(r5)]});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(o){this.log.error(o)}})());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,o=this.connections.get(n),s=!1;o!=null?o.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,o=this.connections.get(n);o!=null&&o.length>1?(o=o.filter(s=>s.id!==t.id),this.connections.set(n,o)):o!=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 h("Not started",ee.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();let{peerId:n}=Lp(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 o=await this.dialQueue.dial(e,{...t,priority:t.priority??VV}),s=this.connections.get(o.remotePeer);s==null&&(s=[],this.connections.set(o.remotePeer,s));let i=!1;for(let a of s)a.id===o.id&&(i=!0);return i||s.push(o),o}async closeConnections(e,t={}){let n=this.connections.get(e)??[];await Promise.all(n.map(async o=>{try{await o.close(t)}catch(s){o.abort(s)}}))}async acceptIncomingConnection(e){if(this.deny.some(o=>e.remoteAddr.toString().startsWith(o.toString())))return this.log("connection from %a refused - connection remote address was in deny list",e.remoteAddr),!1;if(this.allow.some(o=>e.remoteAddr.toString().startsWith(o.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 o=e.remoteAddr.nodeAddress().address;try{await this.inboundConnectionRateLimiter.consume(o,1)}catch{return this.log("connection from %a refused - inboundConnectionThreshold exceeded by host %s",e.remoteAddr,o),!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 Gp=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 h("No content routers available",ee.ERR_NO_ROUTERS_AVAILABLE);let n=this,o=new mt;for await(let s of Xt(...n.routers.map(i=>i.findProviders(e,t))))s!=null&&(s.multiaddrs.length>0&&await this.components.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),!o.has(s.id)&&(o.add(s.id),yield s))}async provide(e,t={}){if(this.routers.length===0)throw new h("No content routers available",ee.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 h(Yo.NOT_STARTED_YET,ee.ERR_NODE_NOT_STARTED);await Promise.all(this.routers.map(async o=>{await o.put(e,t,n)}))}async get(e,t){if(!this.isStarted())throw new h(Yo.NOT_STARTED_YET,ee.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map(async n=>n.get(e,t)))}};var Yp=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 h("No peer routers available",ee.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new h("Should not try to find self",ee.ERR_FIND_SELF);let n=this,o=Xt(...this.routers.map(s=>async function*(){try{yield await s.findPeer(e,t)}catch(i){n.log.error(i)}}()));for await(let s of o)if(s!=null)return s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),s;throw new h(Yo.NOT_FOUND,ee.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(this.routers.length===0)throw new h("No peer routers available",ee.ERR_NO_ROUTERS_AVAILABLE);let n=this,o=new mt;for await(let s of Bo(async function*(){let i=Xt(...n.routers.map(a=>a.getClosestPeers(e,t)));for await(let a of i)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}),!o.has(s.id)&&(o.add(s.id),yield s))}};var I8=32,k8=64,Wp=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 h(`No handler registered for protocol ${e}`,ee.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 h(`Handler already registered for protocol ${e}`,ee.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);let o=gc.bind({ignoreUndefined:!0})({maxInboundStreams:I8,maxOutboundStreams:k8},n);this.handlers.set(e,{handler:t,options:o}),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 h("invalid topology",ee.ERR_INVALID_PARAMETERS);let n=`${(Math.random()*1e9).toString(36)}${Date.now()}`,o=this.topologies.get(e);return o==null&&(o=new Map,this.topologies.set(e,o)),o.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 o of n.protocols){let s=this.topologies.get(o);if(s!=null)for(let i of s.values())i.onDisconnect?.(t)}}).catch(n=>{n.code!==ee.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,o=(n?.protocols??[]).filter(s=>!t.protocols.includes(s));for(let s of o){let i=this.topologies.get(s);if(i!=null)for(let a of i.values())a.onDisconnect?.(t.id)}}_onPeerIdentify(e){let t=e.detail.protocols,n=e.detail.connection,o=e.detail.peerId;for(let s of t){let i=this.topologies.get(s);if(i!=null)for(let a of i.values())n.transient&&a.notifyOnTransient!==!0||a.onConnect?.(o,n)}}};var zp=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=xn({name:"libp2p_transport_manager_listeners",metrics:this.components.metrics}),this.faultTolerance=t.faultTolerance??zo.FATAL_ALL}add(e){let t=e[Symbol.toStringTag];if(t==null)throw new h("Transport must have a valid tag",ee.ERR_INVALID_KEY);if(this.transports.has(t))throw new h(`There is already a transport with the tag ${t}`,ee.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 o=n.pop();o!=null&&e.push(o.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 h(`No transport available for address ${String(e)}`,ee.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(o){throw o.code==null&&(o.code=ee.ERR_TRANSPORT_DIAL_FAILED),o}}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 h("Not started",ee.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,o]of this.transports.entries()){let s=o.filter(e),i=[];for(let l of s){this.log("creating listener for %s on %a",n,l);let f=o.createListener({upgrader:this.components.upgrader}),u=this.listeners.get(n)??[];u==null&&(u=[],this.listeners.set(n,u)),u.push(f),f.addEventListener("listening",()=>{this.components.events.safeDispatchEvent("transport:listening",{detail:f})}),f.addEventListener("close",()=>{let d=u.findIndex(y=>y===f);u.splice(d,1),this.components.events.safeDispatchEvent("transport:close",{detail:f})}),i.push(f.listen(l))}if(i.length===0){t.push(n);continue}if((await Promise.allSettled(i)).find(l=>l.status==="fulfilled")==null&&this.faultTolerance!==zo.NO_FATAL)throw new h(`Transport (${n}) could not listen on any available address`,ee.ERR_NO_VALID_ADDRESSES)}if(t.length===this.transports.size){let n=`no valid addresses were provided for transports [${t.join(", ")}]`;if(this.faultTolerance===zo.FATAL_ALL)throw new h(n,ee.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 o=t.pop();o!=null&&n.push(o.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 qt="/multistream/1.0.0";var qV=x(`
|
|
48
48
|
`);async function Ji(r,e,t){await r.write(e,t)}async function WA(r,e,t){await r.writeV(e,t)}async function HV(r,e){let t=await r.read(e);if(t.byteLength===0||t.get(t.byteLength-1)!==qV[0])throw e.log.error("Invalid mss message - missing newline",t),new h("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return t.sublist(0,-1)}async function $s(r,e){let t=await HV(r,e);return v(t.subarray())}async function Gu(r,e,t){if(e=Array.isArray(e)?[...e]:[e],e.length===1&&t.negotiateFully===!1)return $V(r,e[0],t);let n=On(r,{...t,maxDataLength:1024}),o=e.shift();if(o==null)throw new Error("At least one protocol must be specified");t.log.trace('select: write ["%s", "%s"]',qt,o);let s=x(`${qt}
|
|
49
49
|
`),i=x(`${o}
|
package/dist/src/version.d.ts
CHANGED
package/dist/src/version.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "helia",
|
|
3
|
-
"version": "4.0.0-
|
|
3
|
+
"version": "4.0.0-e554493",
|
|
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",
|
|
@@ -56,11 +56,11 @@
|
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"@chainsafe/libp2p-noise": "^15.0.0",
|
|
58
58
|
"@chainsafe/libp2p-yamux": "^6.0.1",
|
|
59
|
-
"@helia/block-brokers": "2.0.0-
|
|
59
|
+
"@helia/block-brokers": "2.0.0-e554493",
|
|
60
60
|
"@helia/delegated-routing-v1-http-api-client": "^3.0.0",
|
|
61
|
-
"@helia/interface": "4.0.0-
|
|
62
|
-
"@helia/routers": "1.0.0-
|
|
63
|
-
"@helia/utils": "0.0.1-
|
|
61
|
+
"@helia/interface": "4.0.0-e554493",
|
|
62
|
+
"@helia/routers": "1.0.0-e554493",
|
|
63
|
+
"@helia/utils": "0.0.1-e554493",
|
|
64
64
|
"@libp2p/autonat": "^1.0.1",
|
|
65
65
|
"@libp2p/bootstrap": "^10.0.2",
|
|
66
66
|
"@libp2p/circuit-relay-v2": "^1.0.2",
|
package/src/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = '4.0.0-
|
|
1
|
+
export const version = '4.0.0-e554493'
|
|
2
2
|
export const name = 'helia'
|