@libp2p/multistream-select 4.0.6-adea7bbbf → 4.0.6-d8f5bc211

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  [![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
2
2
  [![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io)
3
3
  [![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p)
4
- [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p/main.yml?branch=master\&style=flat-square)](https://github.com/libp2p/js-libp2p/actions/workflows/main.yml?query=branch%3Amaster)
4
+ [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p/main.yml?branch=main\&style=flat-square)](https://github.com/libp2p/js-libp2p/actions/workflows/main.yml?query=branch%3Amain)
5
5
 
6
6
  > JavaScript implementation of multistream-select
7
7
 
package/dist/index.min.js CHANGED
@@ -1,14 +1,16 @@
1
1
  (function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.Libp2PMultistreamSelect = factory()}(typeof self !== 'undefined' ? self : this, function () {
2
- "use strict";var Libp2PMultistreamSelect=(()=>{var It=Object.create;var oe=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Mt=Object.getPrototypeOf,Bt=Object.prototype.hasOwnProperty;var Pt=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),y=(r,e)=>{for(var t in e)oe(r,t,{get:e[t],enumerable:!0})},Je=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Ft(e))!Bt.call(r,o)&&o!==t&&oe(r,o,{get:()=>e[o],enumerable:!(n=_t(e,o))||n.enumerable});return r};var Vt=(r,e,t)=>(t=r!=null?It(Mt(r)):{},Je(e||!r||!r.__esModule?oe(t,"default",{value:r,enumerable:!0}):t,r)),zt=r=>Je(oe({},"__esModule",{value:!0}),r);var ot=Pt((Vn,nt)=>{"use strict";function rt(r,e){for(let t in e)Object.defineProperty(r,t,{value:e[t],enumerable:!0,configurable:!0});return r}function Jt(r,e,t){if(!r||typeof r=="string")throw new TypeError("Please pass an Error to err-code");t||(t={}),typeof e=="object"&&(t=e,e=""),e&&(t.code=e);try{return rt(r,t)}catch{t.message=r.message,t.stack=r.stack;let o=function(){};return o.prototype=Object.create(Object.getPrototypeOf(r)),rt(new o,t)}}nt.exports=Jt});var fn={};y(fn,{PROTOCOL_ID:()=>x,handle:()=>Ct,lazySelect:()=>Nt,select:()=>Ot});var x="/multistream/1.0.0";var B=class extends Error{code;props;constructor(e,t,n){super(e),this.code=t,this.name=n?.name??"CodeError",this.props=n??{}}};function P(r){return globalThis.Buffer!=null?new Uint8Array(r.buffer,r.byteOffset,r.byteLength):r}function N(r=0){return globalThis.Buffer?.alloc!=null?P(globalThis.Buffer.alloc(r)):new Uint8Array(r)}function S(r=0){return globalThis.Buffer?.allocUnsafe!=null?P(globalThis.Buffer.allocUnsafe(r)):new Uint8Array(r)}function me(r,e){e==null&&(e=r.reduce((o,s)=>o+s.length,0));let t=S(e),n=0;for(let o of r)t.set(o,n),n+=o.length;return P(t)}function We(r,e){if(r===e)return!0;if(r.byteLength!==e.byteLength)return!1;for(let t=0;t<r.byteLength;t++)if(r[t]!==e[t])return!1;return!0}var Ke=Symbol.for("@achingbrain/uint8arraylist");function Ye(r,e){if(e==null||e<0)throw new RangeError("index is out of bounds");let t=0;for(let n of r){let o=t+n.byteLength;if(e<o)return{buf:n,index:e-t};t=o}throw new RangeError("index is out of bounds")}function se(r){return!!r?.[Ke]}var b=class r{constructor(...e){Object.defineProperty(this,Ke,{value:!0}),this.bufs=[],this.length=0,e.length>0&&this.appendAll(e)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...e){this.appendAll(e)}appendAll(e){let t=0;for(let n of e)if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.push(n);else if(se(n))t+=n.byteLength,this.bufs.push(...n.bufs);else throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");this.length+=t}prepend(...e){this.prependAll(e)}prependAll(e){let t=0;for(let n of e.reverse())if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.unshift(n);else if(se(n))t+=n.byteLength,this.bufs.unshift(...n.bufs);else throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");this.length+=t}get(e){let t=Ye(this.bufs,e);return t.buf[t.index]}set(e,t){let n=Ye(this.bufs,e);n.buf[n.index]=t}write(e,t=0){if(e instanceof Uint8Array)for(let n=0;n<e.length;n++)this.set(t+n,e[n]);else if(se(e))for(let n=0;n<e.length;n++)this.set(t+n,e.get(n));else throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList")}consume(e){if(e=Math.trunc(e),!(Number.isNaN(e)||e<=0)){if(e===this.byteLength){this.bufs=[],this.length=0;return}for(;this.bufs.length>0;)if(e>=this.bufs[0].byteLength)e-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift();else{this.bufs[0]=this.bufs[0].subarray(e),this.length-=e;break}}}slice(e,t){let{bufs:n,length:o}=this._subList(e,t);return me(n,o)}subarray(e,t){let{bufs:n,length:o}=this._subList(e,t);return n.length===1?n[0]:me(n,o)}sublist(e,t){let{bufs:n,length:o}=this._subList(e,t),s=new r;return s.length=o,s.bufs=n,s}_subList(e,t){if(e=e??0,t=t??this.length,e<0&&(e=this.length+e),t<0&&(t=this.length+t),e<0||t>this.length)throw new RangeError("index is out of bounds");if(e===t)return{bufs:[],length:0};if(e===0&&t===this.length)return{bufs:[...this.bufs],length:this.length};let n=[],o=0;for(let s=0;s<this.bufs.length;s++){let i=this.bufs[s],a=o,c=a+i.byteLength;if(o=c,e>=c)continue;let h=e>=a&&e<c,l=t>a&&t<=c;if(h&&l){if(e===a&&t===c){n.push(i);break}let u=e-a;n.push(i.subarray(u,u+(t-e)));break}if(h){if(e===0){n.push(i);continue}n.push(i.subarray(e-a));continue}if(l){if(t===c){n.push(i);break}n.push(i.subarray(0,t-a));break}n.push(i)}return{bufs:n,length:t-e}}indexOf(e,t=0){if(!se(e)&&!(e instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');let n=e instanceof Uint8Array?e:e.subarray();if(t=Number(t??0),isNaN(t)&&(t=0),t<0&&(t=this.length+t),t<0&&(t=0),e.length===0)return t>this.length?this.length:t;let o=n.byteLength;if(o===0)throw new TypeError("search must be at least 1 byte long");let s=256,i=new Int32Array(s);for(let u=0;u<s;u++)i[u]=-1;for(let u=0;u<o;u++)i[n[u]]=u;let a=i,c=this.byteLength-n.byteLength,h=n.byteLength-1,l;for(let u=t;u<=c;u+=l){l=0;for(let v=h;v>=0;v--){let re=this.get(u+v);if(n[v]!==re){l=Math.max(1,v-a[re]);break}}if(l===0)return u}return-1}getInt8(e){let t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt8(0)}setInt8(e,t){let n=S(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,t),this.write(n,e)}getInt16(e,t){let n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,t)}setInt16(e,t,n){let o=N(2);new DataView(o.buffer,o.byteOffset,o.byteLength).setInt16(0,t,n),this.write(o,e)}getInt32(e,t){let n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,t)}setInt32(e,t,n){let o=N(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setInt32(0,t,n),this.write(o,e)}getBigInt64(e,t){let n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,t)}setBigInt64(e,t,n){let o=N(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setBigInt64(0,t,n),this.write(o,e)}getUint8(e){let t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getUint8(0)}setUint8(e,t){let n=S(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,t),this.write(n,e)}getUint16(e,t){let n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,t)}setUint16(e,t,n){let o=N(2);new DataView(o.buffer,o.byteOffset,o.byteLength).setUint16(0,t,n),this.write(o,e)}getUint32(e,t){let n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,t)}setUint32(e,t,n){let o=N(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setUint32(0,t,n),this.write(o,e)}getBigUint64(e,t){let n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,t)}setBigUint64(e,t,n){let o=N(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setBigUint64(0,t,n),this.write(o,e)}getFloat32(e,t){let n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,t)}setFloat32(e,t,n){let o=N(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setFloat32(0,t,n),this.write(o,e)}getFloat64(e,t){let n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,t)}setFloat64(e,t,n){let o=N(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setFloat64(0,t,n),this.write(o,e)}equals(e){if(e==null||!(e instanceof r)||e.bufs.length!==this.bufs.length)return!1;for(let t=0;t<this.bufs.length;t++)if(!We(this.bufs[t],e.bufs[t]))return!1;return!0}static fromUint8Arrays(e,t){let n=new r;return n.bufs=e,t==null&&(t=e.reduce((o,s)=>o+s.byteLength,0)),n.length=t,n}};function j(){let r={};return r.promise=new Promise((e,t)=>{r.resolve=e,r.reject=t}),r}var ie=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}};async function Qe(r,e,t){if(e==null)return r;if(e.aborted)return Promise.reject(new ie(t?.errorMessage,t?.errorCode));let n,o=new ie(t?.errorMessage,t?.errorCode);try{return await Promise.race([r,new Promise((s,i)=>{n=()=>{i(o)},e.addEventListener("abort",n)})])}finally{n!=null&&e.removeEventListener("abort",n)}}var be=class{needNext;haveNext;ended;nextResult;constructor(){this.ended=!1,this.needNext=j(),this.needNext.resolve(),this.haveNext=j()}[Symbol.asyncIterator](){return this}async next(){if(this.nextResult==null&&await this.haveNext.promise,this.nextResult==null)throw new Error("Have next but next was undefined");let e=this.nextResult;return this.nextResult=void 0,this.needNext.resolve(),this.needNext=j(),e}async throw(e){return this.ended=!0,e!=null&&this.haveNext.reject(e),{done:!0,value:void 0}}async return(){let e={done:!0,value:void 0};return await this._push(void 0),e}async push(e,t){await this._push(e,t)}async end(e,t){e!=null?await this.throw(e):await this._push(void 0,t)}async _push(e,t){if(e!=null&&this.ended)throw new Error("Cannot push value onto an ended pushable");this.nextResult!=null&&await this.needNext.promise,e!=null?this.nextResult={done:!1,value:e}:(this.ended=!0,this.nextResult={done:!0,value:void 0}),this.haveNext.resolve(),this.haveNext=j(),await Qe(this.needNext.promise,t?.signal,t)}};function Ze(){return new be}var ae=class extends Error{code;constructor(e,t){super(e),this.code=t}},ge=class extends ae{type;constructor(e){super(e,"ABORT_ERR"),this.type="aborted"}};function et(r){let e=Ze();r.sink(e).catch(async s=>{await e.end(s)}),r.sink=async s=>{for await(let i of s)await e.push(i);await e.end()};let t=r.source;r.source[Symbol.iterator]!=null?t=r.source[Symbol.iterator]():r.source[Symbol.asyncIterator]!=null&&(t=r.source[Symbol.asyncIterator]());let n=new b;return{read:async(s,i)=>{i?.signal?.throwIfAborted();let a,c=new Promise((h,l)=>{a=()=>{l(new ge("Read aborted"))},i?.signal?.addEventListener("abort",a)});try{if(s==null){let{done:l,value:u}=await Promise.race([t.next(),c]);return l===!0?new b:u}for(;n.byteLength<s;){let{value:l,done:u}=await Promise.race([t.next(),c]);if(u===!0)throw new ae("unexpected end of input","ERR_UNEXPECTED_EOF");n.append(l)}let h=n.sublist(0,s);return n.consume(s),h}finally{a!=null&&i?.signal?.removeEventListener("abort",a)}},write:async(s,i)=>{i?.signal?.throwIfAborted(),s instanceof Uint8Array?await e.push(s,i):await e.push(s.subarray(),i)},unwrap:()=>{let s=r.source;return r.source=async function*(){yield*n,yield*s}(),r}}}var kt=Math.pow(2,7),Gt=Math.pow(2,14),$t=Math.pow(2,21),ye=Math.pow(2,28),xe=Math.pow(2,35),Ee=Math.pow(2,42),Le=Math.pow(2,49),f=128,w=127;function V(r){if(r<kt)return 1;if(r<Gt)return 2;if(r<$t)return 3;if(r<ye)return 4;if(r<xe)return 5;if(r<Ee)return 6;if(r<Le)return 7;if(Number.MAX_SAFE_INTEGER!=null&&r>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return 8}function jt(r,e,t=0){switch(V(r)){case 8:e[t++]=r&255|f,r/=128;case 7:e[t++]=r&255|f,r/=128;case 6:e[t++]=r&255|f,r/=128;case 5:e[t++]=r&255|f,r/=128;case 4:e[t++]=r&255|f,r>>>=7;case 3:e[t++]=r&255|f,r>>>=7;case 2:e[t++]=r&255|f,r>>>=7;case 1:{e[t++]=r&255,r>>>=7;break}default:throw new Error("unreachable")}return e}function Ht(r,e,t=0){switch(V(r)){case 8:e.set(t++,r&255|f),r/=128;case 7:e.set(t++,r&255|f),r/=128;case 6:e.set(t++,r&255|f),r/=128;case 5:e.set(t++,r&255|f),r/=128;case 4:e.set(t++,r&255|f),r>>>=7;case 3:e.set(t++,r&255|f),r>>>=7;case 2:e.set(t++,r&255|f),r>>>=7;case 1:{e.set(t++,r&255),r>>>=7;break}default:throw new Error("unreachable")}return e}function Xt(r,e){let t=r[e],n=0;if(n+=t&w,t<f||(t=r[e+1],n+=(t&w)<<7,t<f)||(t=r[e+2],n+=(t&w)<<14,t<f)||(t=r[e+3],n+=(t&w)<<21,t<f)||(t=r[e+4],n+=(t&w)*ye,t<f)||(t=r[e+5],n+=(t&w)*xe,t<f)||(t=r[e+6],n+=(t&w)*Ee,t<f)||(t=r[e+7],n+=(t&w)*Le,t<f))return n;throw new RangeError("Could not decode varint")}function qt(r,e){let t=r.get(e),n=0;if(n+=t&w,t<f||(t=r.get(e+1),n+=(t&w)<<7,t<f)||(t=r.get(e+2),n+=(t&w)<<14,t<f)||(t=r.get(e+3),n+=(t&w)<<21,t<f)||(t=r.get(e+4),n+=(t&w)*ye,t<f)||(t=r.get(e+5),n+=(t&w)*xe,t<f)||(t=r.get(e+6),n+=(t&w)*Ee,t<f)||(t=r.get(e+7),n+=(t&w)*Le,t<f))return n;throw new RangeError("Could not decode varint")}function tt(r,e,t=0){return e==null&&(e=S(V(r))),e instanceof Uint8Array?jt(r,e,t):Ht(r,e,t)}function ce(r,e=0){return r instanceof Uint8Array?Xt(r,e):qt(r,e)}function fe(r){return r[Symbol.asyncIterator]!=null}var he=r=>{let e=V(r),t=S(e);return tt(r,t),he.bytes=e,t};he.bytes=0;function z(r,e){e=e??{};let t=e.lengthEncoder??he;function*n(o){let s=t(o.byteLength);s instanceof Uint8Array?yield s:yield*s,o instanceof Uint8Array?yield o:yield*o}return fe(r)?async function*(){for await(let o of r)yield*n(o)}():function*(){for(let o of r)yield*n(o)}()}z.single=(r,e)=>{e=e??{};let t=e.lengthEncoder??he;return new b(t(r.byteLength),r)};var H=Vt(ot(),1);var Wt=8,Yt=1024*1024*4,k;(function(r){r[r.LENGTH=0]="LENGTH",r[r.DATA=1]="DATA"})(k||(k={}));var ve=r=>{let e=ce(r);return ve.bytes=V(e),e};ve.bytes=0;function Se(r,e){let t=new b,n=k.LENGTH,o=-1,s=e?.lengthDecoder??ve,i=e?.maxLengthLength??Wt,a=e?.maxDataLength??Yt;function*c(){for(;t.byteLength>0;){if(n===k.LENGTH)try{if(o=s(t),o<0)throw(0,H.default)(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(o>a)throw(0,H.default)(new Error("message length too long"),"ERR_MSG_DATA_TOO_LONG");let h=s.bytes;t.consume(h),e?.onLength!=null&&e.onLength(o),n=k.DATA}catch(h){if(h instanceof RangeError){if(t.byteLength>i)throw(0,H.default)(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw h}if(n===k.DATA){if(t.byteLength<o)break;let h=t.sublist(0,o);t.consume(o),e?.onData!=null&&e.onData(h),yield h,n=k.LENGTH}}}return fe(r)?async function*(){for await(let h of r)t.append(h),yield*c();if(t.byteLength>0)throw(0,H.default)(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}():function*(){for(let h of r)t.append(h),yield*c();if(t.byteLength>0)throw(0,H.default)(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}()}Se.fromReader=(r,e)=>{let t=1,n=async function*(){for(;;)try{let{done:s,value:i}=await r.next(t);if(s===!0)return;i!=null&&(yield i)}catch(s){if(s.code==="ERR_UNDER_READ")return{done:!0,value:null};throw s}finally{t=1}}();return Se(n,{...e??{},onLength:s=>{t=s}})};var ue=class extends Error{code;constructor(e,t){super(e),this.code=t}},st=r=>ce(r);st.bytes=0;function K(r,e){let t=et(r);return{read:async o=>{let s=-1,i=new b,a=e?.lengthDecoder??st;for(;;){i.append(await t.read(1,o));try{s=a(i)}catch(c){if(c instanceof RangeError)continue;throw c}if(s>-1)break;if(e?.maxLengthLength!=null&&i.byteLength>e.maxLengthLength)throw new ue("message length length too long","ERR_MSG_LENGTH_TOO_LONG")}if(e?.maxDataLength!=null&&s>e.maxDataLength)throw new ue("message length too long","ERR_MSG_DATA_TOO_LONG");return t.read(s,o)},write:async(o,s)=>{await t.write(z.single(o,e),s)},writeV:async(o,s)=>{let i=new b(...o.map(a=>z.single(a,e)));await t.write(i,s)},unwrap:()=>t.unwrap()}}var Oe={};y(Oe,{base10:()=>nr});function Qt(r,e){if(r.length>=255)throw new TypeError("Alphabet too long");for(var t=new Uint8Array(256),n=0;n<t.length;n++)t[n]=255;for(var o=0;o<r.length;o++){var s=r.charAt(o),i=s.charCodeAt(0);if(t[i]!==255)throw new TypeError(s+" is ambiguous");t[i]=o}var a=r.length,c=r.charAt(0),h=Math.log(a)/Math.log(256),l=Math.log(256)/Math.log(a);function u(d){if(d instanceof Uint8Array||(ArrayBuffer.isView(d)?d=new Uint8Array(d.buffer,d.byteOffset,d.byteLength):Array.isArray(d)&&(d=Uint8Array.from(d))),!(d instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(d.length===0)return"";for(var m=0,M=0,L=0,U=d.length;L!==U&&d[L]===0;)L++,m++;for(var R=(U-L)*l+1>>>0,E=new Uint8Array(R);L!==U;){for(var D=d[L],I=0,A=R-1;(D!==0||I<M)&&A!==-1;A--,I++)D+=256*E[A]>>>0,E[A]=D%a>>>0,D=D/a>>>0;if(D!==0)throw new Error("Non-zero carry");M=I,L++}for(var O=R-M;O!==R&&E[O]===0;)O++;for(var ne=c.repeat(m);O<R;++O)ne+=r.charAt(E[O]);return ne}function v(d){if(typeof d!="string")throw new TypeError("Expected String");if(d.length===0)return new Uint8Array;var m=0;if(d[m]!==" "){for(var M=0,L=0;d[m]===c;)M++,m++;for(var U=(d.length-m)*h+1>>>0,R=new Uint8Array(U);d[m];){var E=t[d.charCodeAt(m)];if(E===255)return;for(var D=0,I=U-1;(E!==0||D<L)&&I!==-1;I--,D++)E+=a*R[I]>>>0,R[I]=E%256>>>0,E=E/256>>>0;if(E!==0)throw new Error("Non-zero carry");L=D,m++}if(d[m]!==" "){for(var A=U-L;A!==U&&R[A]===0;)A++;for(var O=new Uint8Array(M+(U-A)),ne=M;A!==U;)O[ne++]=R[A++];return O}}}function re(d){var m=v(d);if(m)return m;throw new Error(`Non-${e} character`)}return{encode:u,decodeUnsafe:v,decode:re}}var Zt=Qt,er=Zt,it=er;var Wn=new Uint8Array(0);var at=(r,e)=>{if(r===e)return!0;if(r.byteLength!==e.byteLength)return!1;for(let t=0;t<r.byteLength;t++)if(r[t]!==e[t])return!1;return!0},C=r=>{if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return r;if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return new Uint8Array(r.buffer,r.byteOffset,r.byteLength);throw new Error("Unknown type, must be binary type")};var ct=r=>new TextEncoder().encode(r),ft=r=>new TextDecoder().decode(r);var Ue=class{constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}},Re=class{constructor(e,t,n){if(this.name=e,this.prefix=t,t.codePointAt(0)===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if(typeof e=="string"){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}else throw Error("Can only multibase decode strings")}or(e){return ut(this,e)}},De=class{constructor(e){this.decoders=e}or(e){return ut(this,e)}decode(e){let t=e[0],n=this.decoders[t];if(n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}},ut=(r,e)=>new De({...r.decoders||{[r.prefix]:r},...e.decoders||{[e.prefix]:e}}),Te=class{constructor(e,t,n,o){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=o,this.encoder=new Ue(e,t,n),this.decoder=new Re(e,t,o)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}},X=({name:r,prefix:e,encode:t,decode:n})=>new Te(r,e,t,n),_=({prefix:r,name:e,alphabet:t})=>{let{encode:n,decode:o}=it(t,e);return X({prefix:r,name:e,encode:n,decode:s=>C(o(s))})},tr=(r,e,t,n)=>{let o={};for(let l=0;l<e.length;++l)o[e[l]]=l;let s=r.length;for(;r[s-1]==="=";)--s;let i=new Uint8Array(s*t/8|0),a=0,c=0,h=0;for(let l=0;l<s;++l){let u=o[r[l]];if(u===void 0)throw new SyntaxError(`Non-${n} character`);c=c<<t|u,a+=t,a>=8&&(a-=8,i[h++]=255&c>>a)}if(a>=t||255&c<<8-a)throw new SyntaxError("Unexpected end of data");return i},rr=(r,e,t)=>{let n=e[e.length-1]==="=",o=(1<<t)-1,s="",i=0,a=0;for(let c=0;c<r.length;++c)for(a=a<<8|r[c],i+=8;i>t;)i-=t,s+=e[o&a>>i];if(i&&(s+=e[o&a<<t-i]),n)for(;s.length*t&7;)s+="=";return s},p=({name:r,prefix:e,bitsPerChar:t,alphabet:n})=>X({prefix:e,name:r,encode(o){return rr(o,n,t)},decode(o){return tr(o,n,t,r)}});var nr=_({prefix:"9",name:"base10",alphabet:"0123456789"});var Ne={};y(Ne,{base16:()=>or,base16upper:()=>sr});var or=p({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),sr=p({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var Ce={};y(Ce,{base2:()=>ir});var ir=p({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var Ie={};y(Ie,{base256emoji:()=>ur});var lt=Array.from("\u{1F680}\u{1FA90}\u2604\u{1F6F0}\u{1F30C}\u{1F311}\u{1F312}\u{1F313}\u{1F314}\u{1F315}\u{1F316}\u{1F317}\u{1F318}\u{1F30D}\u{1F30F}\u{1F30E}\u{1F409}\u2600\u{1F4BB}\u{1F5A5}\u{1F4BE}\u{1F4BF}\u{1F602}\u2764\u{1F60D}\u{1F923}\u{1F60A}\u{1F64F}\u{1F495}\u{1F62D}\u{1F618}\u{1F44D}\u{1F605}\u{1F44F}\u{1F601}\u{1F525}\u{1F970}\u{1F494}\u{1F496}\u{1F499}\u{1F622}\u{1F914}\u{1F606}\u{1F644}\u{1F4AA}\u{1F609}\u263A\u{1F44C}\u{1F917}\u{1F49C}\u{1F614}\u{1F60E}\u{1F607}\u{1F339}\u{1F926}\u{1F389}\u{1F49E}\u270C\u2728\u{1F937}\u{1F631}\u{1F60C}\u{1F338}\u{1F64C}\u{1F60B}\u{1F497}\u{1F49A}\u{1F60F}\u{1F49B}\u{1F642}\u{1F493}\u{1F929}\u{1F604}\u{1F600}\u{1F5A4}\u{1F603}\u{1F4AF}\u{1F648}\u{1F447}\u{1F3B6}\u{1F612}\u{1F92D}\u2763\u{1F61C}\u{1F48B}\u{1F440}\u{1F62A}\u{1F611}\u{1F4A5}\u{1F64B}\u{1F61E}\u{1F629}\u{1F621}\u{1F92A}\u{1F44A}\u{1F973}\u{1F625}\u{1F924}\u{1F449}\u{1F483}\u{1F633}\u270B\u{1F61A}\u{1F61D}\u{1F634}\u{1F31F}\u{1F62C}\u{1F643}\u{1F340}\u{1F337}\u{1F63B}\u{1F613}\u2B50\u2705\u{1F97A}\u{1F308}\u{1F608}\u{1F918}\u{1F4A6}\u2714\u{1F623}\u{1F3C3}\u{1F490}\u2639\u{1F38A}\u{1F498}\u{1F620}\u261D\u{1F615}\u{1F33A}\u{1F382}\u{1F33B}\u{1F610}\u{1F595}\u{1F49D}\u{1F64A}\u{1F639}\u{1F5E3}\u{1F4AB}\u{1F480}\u{1F451}\u{1F3B5}\u{1F91E}\u{1F61B}\u{1F534}\u{1F624}\u{1F33C}\u{1F62B}\u26BD\u{1F919}\u2615\u{1F3C6}\u{1F92B}\u{1F448}\u{1F62E}\u{1F646}\u{1F37B}\u{1F343}\u{1F436}\u{1F481}\u{1F632}\u{1F33F}\u{1F9E1}\u{1F381}\u26A1\u{1F31E}\u{1F388}\u274C\u270A\u{1F44B}\u{1F630}\u{1F928}\u{1F636}\u{1F91D}\u{1F6B6}\u{1F4B0}\u{1F353}\u{1F4A2}\u{1F91F}\u{1F641}\u{1F6A8}\u{1F4A8}\u{1F92C}\u2708\u{1F380}\u{1F37A}\u{1F913}\u{1F619}\u{1F49F}\u{1F331}\u{1F616}\u{1F476}\u{1F974}\u25B6\u27A1\u2753\u{1F48E}\u{1F4B8}\u2B07\u{1F628}\u{1F31A}\u{1F98B}\u{1F637}\u{1F57A}\u26A0\u{1F645}\u{1F61F}\u{1F635}\u{1F44E}\u{1F932}\u{1F920}\u{1F927}\u{1F4CC}\u{1F535}\u{1F485}\u{1F9D0}\u{1F43E}\u{1F352}\u{1F617}\u{1F911}\u{1F30A}\u{1F92F}\u{1F437}\u260E\u{1F4A7}\u{1F62F}\u{1F486}\u{1F446}\u{1F3A4}\u{1F647}\u{1F351}\u2744\u{1F334}\u{1F4A3}\u{1F438}\u{1F48C}\u{1F4CD}\u{1F940}\u{1F922}\u{1F445}\u{1F4A1}\u{1F4A9}\u{1F450}\u{1F4F8}\u{1F47B}\u{1F910}\u{1F92E}\u{1F3BC}\u{1F975}\u{1F6A9}\u{1F34E}\u{1F34A}\u{1F47C}\u{1F48D}\u{1F4E3}\u{1F942}"),ar=lt.reduce((r,e,t)=>(r[t]=e,r),[]),cr=lt.reduce((r,e,t)=>(r[e.codePointAt(0)]=t,r),[]);function fr(r){return r.reduce((e,t)=>(e+=ar[t],e),"")}function hr(r){let e=[];for(let t of r){let n=cr[t.codePointAt(0)];if(n===void 0)throw new Error(`Non-base256emoji character: ${t}`);e.push(n)}return new Uint8Array(e)}var ur=X({prefix:"\u{1F680}",name:"base256emoji",encode:fr,decode:hr});var _e={};y(_e,{base32:()=>q,base32hex:()=>wr,base32hexpad:()=>br,base32hexpadupper:()=>gr,base32hexupper:()=>mr,base32pad:()=>dr,base32padupper:()=>pr,base32upper:()=>lr,base32z:()=>yr});var q=p({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),lr=p({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),dr=p({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),pr=p({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),wr=p({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),mr=p({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),br=p({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),gr=p({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),yr=p({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Fe={};y(Fe,{base36:()=>xr,base36upper:()=>Er});var xr=_({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),Er=_({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var Me={};y(Me,{base58btc:()=>T,base58flickr:()=>Lr});var T=_({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Lr=_({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Be={};y(Be,{base64:()=>Ar,base64pad:()=>Sr,base64url:()=>vr,base64urlpad:()=>Ur});var Ar=p({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Sr=p({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),vr=p({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Ur=p({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var Pe={};y(Pe,{base8:()=>Rr});var Rr=p({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var Ve={};y(Ve,{identity:()=>Dr});var Dr=X({prefix:"\0",name:"identity",encode:r=>ft(r),decode:r=>ct(r)});var ho=new TextEncoder,uo=new TextDecoder;var ke={};y(ke,{identity:()=>Kr});var Nr=wt,dt=128,Cr=127,Ir=~Cr,_r=Math.pow(2,31);function wt(r,e,t){e=e||[],t=t||0;for(var n=t;r>=_r;)e[t++]=r&255|dt,r/=128;for(;r&Ir;)e[t++]=r&255|dt,r>>>=7;return e[t]=r|0,wt.bytes=t-n+1,e}var Fr=ze,Mr=128,pt=127;function ze(r,n){var t=0,n=n||0,o=0,s=n,i,a=r.length;do{if(s>=a)throw ze.bytes=0,new RangeError("Could not decode varint");i=r[s++],t+=o<28?(i&pt)<<o:(i&pt)*Math.pow(2,o),o+=7}while(i>=Mr);return ze.bytes=s-n,t}var Br=Math.pow(2,7),Pr=Math.pow(2,14),Vr=Math.pow(2,21),zr=Math.pow(2,28),kr=Math.pow(2,35),Gr=Math.pow(2,42),$r=Math.pow(2,49),jr=Math.pow(2,56),Hr=Math.pow(2,63),Xr=function(r){return r<Br?1:r<Pr?2:r<Vr?3:r<zr?4:r<kr?5:r<Gr?6:r<$r?7:r<jr?8:r<Hr?9:10},qr={encode:Nr,decode:Fr,encodingLength:Xr},Jr=qr,Q=Jr;var Z=(r,e=0)=>[Q.decode(r,e),Q.decode.bytes],J=(r,e,t=0)=>(Q.encode(r,e,t),e),W=r=>Q.encodingLength(r);var G=(r,e)=>{let t=e.byteLength,n=W(r),o=n+W(t),s=new Uint8Array(o+t);return J(r,s,0),J(t,s,n),s.set(e,o),new Y(r,t,e,s)},mt=r=>{let e=C(r),[t,n]=Z(e),[o,s]=Z(e.subarray(n)),i=e.subarray(n+s);if(i.byteLength!==o)throw new Error("Incorrect length");return new Y(t,o,i,e)},bt=(r,e)=>{if(r===e)return!0;{let t=e;return r.code===t.code&&r.size===t.size&&t.bytes instanceof Uint8Array&&at(r.bytes,t.bytes)}},Y=class{constructor(e,t,n,o){this.code=e,this.size=t,this.digest=n,this.bytes=o}};var gt=0,Wr="identity",yt=C,Yr=r=>G(gt,yt(r)),Kr={code:gt,name:Wr,encode:yt,digest:Yr};var je={};y(je,{sha256:()=>Qr,sha512:()=>Zr});var $e=({name:r,code:e,encode:t})=>new Ge(r,e,t),Ge=class{constructor(e,t,n){this.name=e,this.code=t,this.encode=n}digest(e){if(e instanceof Uint8Array){let t=this.encode(e);return t instanceof Uint8Array?G(this.code,t):t.then(n=>G(this.code,n))}else throw Error("Unknown type, must be binary type")}};var Et=r=>async e=>new Uint8Array(await crypto.subtle.digest(r,e)),Qr=$e({name:"sha2-256",code:18,encode:Et("SHA-256")}),Zr=$e({name:"sha2-512",code:19,encode:Et("SHA-512")});var Lt=(r,e)=>{let{bytes:t,version:n}=r;switch(n){case 0:return tn(t,He(r),e||T.encoder);default:return rn(t,He(r),e||q.encoder)}};var At=new WeakMap,He=r=>{let e=At.get(r);if(e==null){let t=new Map;return At.set(r,t),t}return e},de=class r{constructor(e,t,n,o){this.code=t,this.version=e,this.multihash=n,this.bytes=o,this["/"]=o}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{let{code:e,multihash:t}=this;if(e!==te)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==nn)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return r.createV0(t)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{let{code:e,digest:t}=this.multihash,n=G(e,t);return r.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(e){return r.equals(this,e)}static equals(e,t){let n=t;return n&&e.code===n.code&&e.version===n.version&&bt(e.multihash,n.multihash)}toString(e){return Lt(this,e)}toJSON(){return{"/":Lt(this)}}link(){return this}get[Symbol.toStringTag](){return"CID"}[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(e){if(e==null)return null;let t=e;if(t instanceof r)return t;if(t["/"]!=null&&t["/"]===t.bytes||t.asCID===t){let{version:n,code:o,multihash:s,bytes:i}=t;return new r(n,o,s,i||St(n,o,s.bytes))}else if(t[on]===!0){let{version:n,multihash:o,code:s}=t,i=mt(o);return r.create(n,s,i)}else return null}static create(e,t,n){if(typeof t!="number")throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(e){case 0:{if(t!==te)throw new Error(`Version 0 CID must use dag-pb (code: ${te}) block encoding`);return new r(e,t,n,n.bytes)}case 1:{let o=St(e,t,n.bytes);return new r(e,t,n,o)}default:throw new Error("Invalid version")}}static createV0(e){return r.create(0,te,e)}static createV1(e,t){return r.create(1,e,t)}static decode(e){let[t,n]=r.decodeFirst(e);if(n.length)throw new Error("Incorrect length");return t}static decodeFirst(e){let t=r.inspectBytes(e),n=t.size-t.multihashSize,o=C(e.subarray(n,n+t.multihashSize));if(o.byteLength!==t.multihashSize)throw new Error("Incorrect length");let s=o.subarray(t.multihashSize-t.digestSize),i=new Y(t.multihashCode,t.digestSize,s,o);return[t.version===0?r.createV0(i):r.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0,n=()=>{let[u,v]=Z(e.subarray(t));return t+=v,u},o=n(),s=te;if(o===18?(o=0,t=0):s=n(),o!==0&&o!==1)throw new RangeError(`Invalid CID version ${o}`);let i=t,a=n(),c=n(),h=t+c,l=h-i;return{version:o,codec:s,multihashCode:a,digestSize:c,multihashSize:l,size:h}}static parse(e,t){let[n,o]=en(e,t),s=r.decode(o);if(s.version===0&&e[0]!=="Q")throw Error("Version 0 CID string must not include multibase prefix");return He(s).set(n,e),s}},en=(r,e)=>{switch(r[0]){case"Q":{let t=e||T;return[T.prefix,t.decode(`${T.prefix}${r}`)]}case T.prefix:{let t=e||T;return[T.prefix,t.decode(r)]}case q.prefix:{let t=e||q;return[q.prefix,t.decode(r)]}default:{if(e==null)throw Error("To parse non base32 or base58btc encoded CID multibase decoder must be provided");return[r[0],e.decode(r)]}}},tn=(r,e,t)=>{let{prefix:n}=t;if(n!==T.prefix)throw Error(`Cannot string encode V0 in ${t.name} encoding`);let o=e.get(n);if(o==null){let s=t.encode(r).slice(1);return e.set(n,s),s}else return o},rn=(r,e,t)=>{let{prefix:n}=t,o=e.get(n);if(o==null){let s=t.encode(r);return e.set(n,s),s}else return o},te=112,nn=18,St=(r,e,t)=>{let n=W(r),o=n+W(e),s=new Uint8Array(o+t.byteLength);return J(r,s,0),J(e,s,n),s.set(t,o),s},on=Symbol.for("@ipld/js-cid/CID");var Xe={...Ve,...Ce,...Pe,...Oe,...Ne,..._e,...Fe,...Me,...Be,...Ie},Do={...je,...ke};function Ut(r,e,t,n){return{name:r,prefix:e,encoder:{name:r,prefix:e,encode:t},decoder:{decode:n}}}var vt=Ut("utf8","u",r=>"u"+new TextDecoder("utf8").decode(r),r=>new TextEncoder().encode(r.substring(1))),qe=Ut("ascii","a",r=>{let e="a";for(let t=0;t<r.length;t++)e+=String.fromCharCode(r[t]);return e},r=>{r=r.substring(1);let e=S(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}),sn={utf8:vt,"utf-8":vt,hex:Xe.base16,latin1:qe,ascii:qe,binary:qe,...Xe},pe=sn;function g(r,e="utf8"){let t=pe[e];if(t==null)throw new Error(`Unsupported encoding "${e}"`);return(e==="utf8"||e==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?P(globalThis.Buffer.from(r,"utf-8")):t.decoder.decode(`${t.prefix}${r}`)}function Rt(r,e="utf8"){let t=pe[e];if(t==null)throw new Error(`Unsupported encoding "${e}"`);return(e==="utf8"||e==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?globalThis.Buffer.from(r.buffer,r.byteOffset,r.byteLength).toString("utf8"):t.encoder.encode(r).substring(1)}var an=g(`
3
- `);async function $(r,e,t){await r.write(e,t)}async function Dt(r,e,t){await r.writeV(e,t)}async function cn(r,e){let t=await r.read(e);if(t.byteLength===0||t.get(t.byteLength-1)!==an[0])throw e?.log.error("Invalid mss message - missing newline",t),new B("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return t.sublist(0,-1)}async function F(r,e){let t=await cn(r,e);return Rt(t.subarray())}async function Ot(r,e,t){e=Array.isArray(e)?[...e]:[e];let n=K(r,{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"]',x,o);let s=g(`${x}
4
- `),i=g(`${o}
5
- `);await Dt(n,[s,i],t),t?.log.trace("select: reading multistream-select header");let a=await F(n,t);if(t?.log.trace('select: read "%s"',a),a===x&&(t?.log.trace("select: reading protocol response"),a=await F(n,t),t?.log.trace('select: read "%s"',a)),a===o)return{stream:n.unwrap(),protocol:o};for(let c of e){t?.log.trace('select: write "%s"',c),await $(n,g(`${c}
6
- `),t),t?.log.trace("select: reading protocol response");let h=await F(n,t);if(t?.log.trace('select: read "%s" for "%s"',h,c),h===c)return{stream:n.unwrap(),protocol:c}}throw new B("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}function Nt(r,e,t){let n=r.sink.bind(r),o=r.source,s=K({sink:n,source:o},{maxDataLength:1024});return r.sink=async i=>{t?.log.trace('lazy: write ["%s", "%s"]',x,e),await s.writeV([g(`${x}
7
- `),g(`${e}
8
- `)]),t?.log.trace('lazy: writing rest of "%s" stream',e),await s.unwrap().sink(i)},r.source=async function*(){t?.log.trace("lazy: reading multistream select header");let i=await F(s,t);if(t?.log.trace('lazy: read multistream select header "%s"',i),i===x&&(i=await F(s,t)),t?.log.trace('lazy: read protocol "%s", expecting "%s"',i,e),i!==e)throw new B("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL");t?.log.trace('lazy: reading rest of "%s" stream',e),yield*s.unwrap().source}(),{stream:r,protocol:e}}async function Ct(r,e,t){e=Array.isArray(e)?e:[e];let n=K(r,{maxDataLength:1024});for(;;){t.log.trace("handle - available protocols %s",e);let o=await F(n,t);if(t.log.trace('read "%s"',o),o===x){t.log.trace('respond with "%s" for "%s"',x,o),await $(n,g(`${x}
9
- `),t);continue}if(e.includes(o))return t.log.trace('respond with "%s" for "%s"',o,o),await $(n,g(`${o}
10
- `),t),{stream:n.unwrap(),protocol:o};if(o==="ls"){let s=new b(...e.map(i=>z.single(g(`${i}
11
- `))),g(`
12
- `));await $(n,s,t),t.log.trace('respond with "%s" for %s',e,o);continue}t.log('respond with "na" for "%s"',o),await $(n,g(`na
13
- `),t)}}return zt(fn);})();
2
+ "use strict";var Libp2PMultistreamSelect=(()=>{var It=Object.create;var oe=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Ft=Object.getOwnPropertyNames;var Mt=Object.getPrototypeOf,Bt=Object.prototype.hasOwnProperty;var Pt=(r,t)=>()=>(t||r((t={exports:{}}).exports,t),t.exports),L=(r,t)=>{for(var e in t)oe(r,e,{get:t[e],enumerable:!0})},We=(r,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ft(t))!Bt.call(r,o)&&o!==e&&oe(r,o,{get:()=>t[o],enumerable:!(n=_t(t,o))||n.enumerable});return r};var Vt=(r,t,e)=>(e=r!=null?It(Mt(r)):{},We(t||!r||!r.__esModule?oe(e,"default",{value:r,enumerable:!0}):e,r)),zt=r=>We(oe({},"__esModule",{value:!0}),r);var ot=Pt((Vn,nt)=>{"use strict";function rt(r,t){for(let e in t)Object.defineProperty(r,e,{value:t[e],enumerable:!0,configurable:!0});return r}function Jt(r,t,e){if(!r||typeof r=="string")throw new TypeError("Please pass an Error to err-code");e||(e={}),typeof t=="object"&&(e=t,t=""),t&&(e.code=t);try{return rt(r,e)}catch{e.message=r.message,e.stack=r.stack;let o=function(){};return o.prototype=Object.create(Object.getPrototypeOf(r)),rt(new o,e)}}nt.exports=Jt});var fn={};L(fn,{PROTOCOL_ID:()=>w,handle:()=>Ct,lazySelect:()=>Nt,select:()=>Ot});var w="/multistream/1.0.0";var P=class extends Error{code;props;constructor(t,e,n){super(t),this.code=e,this.name=n?.name??"CodeError",this.props=n??{}}};function V(r){return globalThis.Buffer!=null?new Uint8Array(r.buffer,r.byteOffset,r.byteLength):r}function N(r=0){return globalThis.Buffer?.alloc!=null?V(globalThis.Buffer.alloc(r)):new Uint8Array(r)}function v(r=0){return globalThis.Buffer?.allocUnsafe!=null?V(globalThis.Buffer.allocUnsafe(r)):new Uint8Array(r)}function be(r,t){t==null&&(t=r.reduce((o,s)=>o+s.length,0));let e=v(t),n=0;for(let o of r)e.set(o,n),n+=o.length;return V(e)}function Ye(r,t){if(r===t)return!0;if(r.byteLength!==t.byteLength)return!1;for(let e=0;e<r.byteLength;e++)if(r[e]!==t[e])return!1;return!0}var Qe=Symbol.for("@achingbrain/uint8arraylist");function Ke(r,t){if(t==null||t<0)throw new RangeError("index is out of bounds");let e=0;for(let n of r){let o=e+n.byteLength;if(t<o)return{buf:n,index:t-e};e=o}throw new RangeError("index is out of bounds")}function se(r){return!!r?.[Qe]}var p=class r{constructor(...t){Object.defineProperty(this,Qe,{value:!0}),this.bufs=[],this.length=0,t.length>0&&this.appendAll(t)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...t){this.appendAll(t)}appendAll(t){let e=0;for(let n of t)if(n instanceof Uint8Array)e+=n.byteLength,this.bufs.push(n);else if(se(n))e+=n.byteLength,this.bufs.push(...n.bufs);else throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}prepend(...t){this.prependAll(t)}prependAll(t){let e=0;for(let n of t.reverse())if(n instanceof Uint8Array)e+=n.byteLength,this.bufs.unshift(n);else if(se(n))e+=n.byteLength,this.bufs.unshift(...n.bufs);else throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}get(t){let e=Ke(this.bufs,t);return e.buf[e.index]}set(t,e){let n=Ke(this.bufs,t);n.buf[n.index]=e}write(t,e=0){if(t instanceof Uint8Array)for(let n=0;n<t.length;n++)this.set(e+n,t[n]);else if(se(t))for(let n=0;n<t.length;n++)this.set(e+n,t.get(n));else throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList")}consume(t){if(t=Math.trunc(t),!(Number.isNaN(t)||t<=0)){if(t===this.byteLength){this.bufs=[],this.length=0;return}for(;this.bufs.length>0;)if(t>=this.bufs[0].byteLength)t-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift();else{this.bufs[0]=this.bufs[0].subarray(t),this.length-=t;break}}}slice(t,e){let{bufs:n,length:o}=this._subList(t,e);return be(n,o)}subarray(t,e){let{bufs:n,length:o}=this._subList(t,e);return n.length===1?n[0]:be(n,o)}sublist(t,e){let{bufs:n,length:o}=this._subList(t,e),s=new r;return s.length=o,s.bufs=n,s}_subList(t,e){if(t=t??0,e=e??this.length,t<0&&(t=this.length+t),e<0&&(e=this.length+e),t<0||e>this.length)throw new RangeError("index is out of bounds");if(t===e)return{bufs:[],length:0};if(t===0&&e===this.length)return{bufs:[...this.bufs],length:this.length};let n=[],o=0;for(let s=0;s<this.bufs.length;s++){let i=this.bufs[s],a=o,c=a+i.byteLength;if(o=c,t>=c)continue;let f=t>=a&&t<c,l=e>a&&e<=c;if(f&&l){if(t===a&&e===c){n.push(i);break}let u=t-a;n.push(i.subarray(u,u+(e-t)));break}if(f){if(t===0){n.push(i);continue}n.push(i.subarray(t-a));continue}if(l){if(e===c){n.push(i);break}n.push(i.subarray(0,e-a));break}n.push(i)}return{bufs:n,length:e-t}}indexOf(t,e=0){if(!se(t)&&!(t instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');let n=t instanceof Uint8Array?t:t.subarray();if(e=Number(e??0),isNaN(e)&&(e=0),e<0&&(e=this.length+e),e<0&&(e=0),t.length===0)return e>this.length?this.length:e;let o=n.byteLength;if(o===0)throw new TypeError("search must be at least 1 byte long");let s=256,i=new Int32Array(s);for(let u=0;u<s;u++)i[u]=-1;for(let u=0;u<o;u++)i[n[u]]=u;let a=i,c=this.byteLength-n.byteLength,f=n.byteLength-1,l;for(let u=e;u<=c;u+=l){l=0;for(let y=f;y>=0;y--){let re=this.get(u+y);if(n[y]!==re){l=Math.max(1,y-a[re]);break}}if(l===0)return u}return-1}getInt8(t){let e=this.subarray(t,t+1);return new DataView(e.buffer,e.byteOffset,e.byteLength).getInt8(0)}setInt8(t,e){let n=v(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,e),this.write(n,t)}getInt16(t,e){let n=this.subarray(t,t+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,e)}setInt16(t,e,n){let o=N(2);new DataView(o.buffer,o.byteOffset,o.byteLength).setInt16(0,e,n),this.write(o,t)}getInt32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,e)}setInt32(t,e,n){let o=N(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setInt32(0,e,n),this.write(o,t)}getBigInt64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,e)}setBigInt64(t,e,n){let o=N(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setBigInt64(0,e,n),this.write(o,t)}getUint8(t){let e=this.subarray(t,t+1);return new DataView(e.buffer,e.byteOffset,e.byteLength).getUint8(0)}setUint8(t,e){let n=v(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,e),this.write(n,t)}getUint16(t,e){let n=this.subarray(t,t+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,e)}setUint16(t,e,n){let o=N(2);new DataView(o.buffer,o.byteOffset,o.byteLength).setUint16(0,e,n),this.write(o,t)}getUint32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,e)}setUint32(t,e,n){let o=N(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setUint32(0,e,n),this.write(o,t)}getBigUint64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,e)}setBigUint64(t,e,n){let o=N(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setBigUint64(0,e,n),this.write(o,t)}getFloat32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,e)}setFloat32(t,e,n){let o=N(4);new DataView(o.buffer,o.byteOffset,o.byteLength).setFloat32(0,e,n),this.write(o,t)}getFloat64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,e)}setFloat64(t,e,n){let o=N(8);new DataView(o.buffer,o.byteOffset,o.byteLength).setFloat64(0,e,n),this.write(o,t)}equals(t){if(t==null||!(t instanceof r)||t.bufs.length!==this.bufs.length)return!1;for(let e=0;e<this.bufs.length;e++)if(!Ye(this.bufs[e],t.bufs[e]))return!1;return!0}static fromUint8Arrays(t,e){let n=new r;return n.bufs=t,e==null&&(e=t.reduce((o,s)=>o+s.byteLength,0)),n.length=e,n}};function j(){let r={};return r.promise=new Promise((t,e)=>{r.resolve=t,r.reject=e}),r}var ie=class extends Error{type;code;constructor(t,e){super(t??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=e??"ABORT_ERR"}};async function Ze(r,t,e){if(t==null)return r;if(t.aborted)return Promise.reject(new ie(e?.errorMessage,e?.errorCode));let n,o=new ie(e?.errorMessage,e?.errorCode);try{return await Promise.race([r,new Promise((s,i)=>{n=()=>{i(o)},t.addEventListener("abort",n)})])}finally{n!=null&&t.removeEventListener("abort",n)}}var ye=class{needNext;haveNext;ended;nextResult;constructor(){this.ended=!1,this.needNext=j(),this.needNext.resolve(),this.haveNext=j()}[Symbol.asyncIterator](){return this}async next(){if(this.nextResult==null&&await this.haveNext.promise,this.nextResult==null)throw new Error("Have next but next was undefined");let t=this.nextResult;return this.nextResult=void 0,this.needNext.resolve(),this.needNext=j(),t}async throw(t){return this.ended=!0,t!=null&&this.haveNext.reject(t),{done:!0,value:void 0}}async return(){let t={done:!0,value:void 0};return await this._push(void 0),t}async push(t,e){await this._push(t,e)}async end(t,e){t!=null?await this.throw(t):await this._push(void 0,e)}async _push(t,e){if(t!=null&&this.ended)throw new Error("Cannot push value onto an ended pushable");this.nextResult!=null&&await this.needNext.promise,t!=null?this.nextResult={done:!1,value:t}:(this.ended=!0,this.nextResult={done:!0,value:void 0}),this.haveNext.resolve(),this.haveNext=j(),await Ze(this.needNext.promise,e?.signal,e)}};function et(){return new ye}var ae=class extends Error{code;constructor(t,e){super(t),this.code=e}},xe=class extends ae{type;constructor(t){super(t,"ABORT_ERR"),this.type="aborted"}};function tt(r,t){let e=et();r.sink(e).catch(async i=>{await e.end(i)}),r.sink=async i=>{for await(let a of i)await e.push(a);await e.end()};let n=r.source;r.source[Symbol.iterator]!=null?n=r.source[Symbol.iterator]():r.source[Symbol.asyncIterator]!=null&&(n=r.source[Symbol.asyncIterator]());let o=new p;return{read:async(i,a)=>{a?.signal?.throwIfAborted();let c,f=new Promise((l,u)=>{c=()=>{u(new xe("Read aborted"))},a?.signal?.addEventListener("abort",c)});try{if(i==null){let{done:u,value:y}=await Promise.race([n.next(),f]);return u===!0?new p:y}for(;o.byteLength<i;){let{value:u,done:y}=await Promise.race([n.next(),f]);if(y===!0)throw new ae("unexpected end of input","ERR_UNEXPECTED_EOF");o.append(u)}let l=o.sublist(0,i);return o.consume(i),l}finally{c!=null&&a?.signal?.removeEventListener("abort",c)}},write:async(i,a)=>{a?.signal?.throwIfAborted(),i instanceof Uint8Array?await e.push(i,a):await e.push(i.subarray(),a)},unwrap:()=>{if(o.byteLength>0){let i=r.source;r.source=async function*(){t?.yieldBytes===!1?yield o:yield*o,yield*i}()}return r}}}var kt=Math.pow(2,7),Gt=Math.pow(2,14),$t=Math.pow(2,21),Le=Math.pow(2,28),Ee=Math.pow(2,35),Ae=Math.pow(2,42),Se=Math.pow(2,49),h=128,g=127;function C(r){if(r<kt)return 1;if(r<Gt)return 2;if(r<$t)return 3;if(r<Le)return 4;if(r<Ee)return 5;if(r<Ae)return 6;if(r<Se)return 7;if(Number.MAX_SAFE_INTEGER!=null&&r>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return 8}function jt(r,t,e=0){switch(C(r)){case 8:t[e++]=r&255|h,r/=128;case 7:t[e++]=r&255|h,r/=128;case 6:t[e++]=r&255|h,r/=128;case 5:t[e++]=r&255|h,r/=128;case 4:t[e++]=r&255|h,r>>>=7;case 3:t[e++]=r&255|h,r>>>=7;case 2:t[e++]=r&255|h,r>>>=7;case 1:{t[e++]=r&255,r>>>=7;break}default:throw new Error("unreachable")}return t}function Ht(r,t,e=0){switch(C(r)){case 8:t.set(e++,r&255|h),r/=128;case 7:t.set(e++,r&255|h),r/=128;case 6:t.set(e++,r&255|h),r/=128;case 5:t.set(e++,r&255|h),r/=128;case 4:t.set(e++,r&255|h),r>>>=7;case 3:t.set(e++,r&255|h),r>>>=7;case 2:t.set(e++,r&255|h),r>>>=7;case 1:{t.set(e++,r&255),r>>>=7;break}default:throw new Error("unreachable")}return t}function Xt(r,t){let e=r[t],n=0;if(n+=e&g,e<h||(e=r[t+1],n+=(e&g)<<7,e<h)||(e=r[t+2],n+=(e&g)<<14,e<h)||(e=r[t+3],n+=(e&g)<<21,e<h)||(e=r[t+4],n+=(e&g)*Le,e<h)||(e=r[t+5],n+=(e&g)*Ee,e<h)||(e=r[t+6],n+=(e&g)*Ae,e<h)||(e=r[t+7],n+=(e&g)*Se,e<h))return n;throw new RangeError("Could not decode varint")}function qt(r,t){let e=r.get(t),n=0;if(n+=e&g,e<h||(e=r.get(t+1),n+=(e&g)<<7,e<h)||(e=r.get(t+2),n+=(e&g)<<14,e<h)||(e=r.get(t+3),n+=(e&g)<<21,e<h)||(e=r.get(t+4),n+=(e&g)*Le,e<h)||(e=r.get(t+5),n+=(e&g)*Ee,e<h)||(e=r.get(t+6),n+=(e&g)*Ae,e<h)||(e=r.get(t+7),n+=(e&g)*Se,e<h))return n;throw new RangeError("Could not decode varint")}function ce(r,t,e=0){return t==null&&(t=v(C(r))),t instanceof Uint8Array?jt(r,t,e):Ht(r,t,e)}function fe(r,t=0){return r instanceof Uint8Array?Xt(r,t):qt(r,t)}function ue(r){return r[Symbol.asyncIterator]!=null}var le=r=>{let t=C(r),e=v(t);return ce(r,e),le.bytes=t,e};le.bytes=0;function z(r,t){t=t??{};let e=t.lengthEncoder??le;function*n(o){let s=e(o.byteLength);s instanceof Uint8Array?yield s:yield*s,o instanceof Uint8Array?yield o:yield*o}return ue(r)?async function*(){for await(let o of r)yield*n(o)}():function*(){for(let o of r)yield*n(o)}()}z.single=(r,t)=>{t=t??{};let e=t.lengthEncoder??le;return new p(e(r.byteLength),r)};var H=Vt(ot(),1);var Wt=8,Yt=1024*1024*4,k;(function(r){r[r.LENGTH=0]="LENGTH",r[r.DATA=1]="DATA"})(k||(k={}));var Ue=r=>{let t=fe(r);return Ue.bytes=C(t),t};Ue.bytes=0;function ve(r,t){let e=new p,n=k.LENGTH,o=-1,s=t?.lengthDecoder??Ue,i=t?.maxLengthLength??Wt,a=t?.maxDataLength??Yt;function*c(){for(;e.byteLength>0;){if(n===k.LENGTH)try{if(o=s(e),o<0)throw(0,H.default)(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(o>a)throw(0,H.default)(new Error("message length too long"),"ERR_MSG_DATA_TOO_LONG");let f=s.bytes;e.consume(f),t?.onLength!=null&&t.onLength(o),n=k.DATA}catch(f){if(f instanceof RangeError){if(e.byteLength>i)throw(0,H.default)(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw f}if(n===k.DATA){if(e.byteLength<o)break;let f=e.sublist(0,o);e.consume(o),t?.onData!=null&&t.onData(f),yield f,n=k.LENGTH}}}return ue(r)?async function*(){for await(let f of r)e.append(f),yield*c();if(e.byteLength>0)throw(0,H.default)(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}():function*(){for(let f of r)e.append(f),yield*c();if(e.byteLength>0)throw(0,H.default)(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}()}ve.fromReader=(r,t)=>{let e=1,n=async function*(){for(;;)try{let{done:s,value:i}=await r.next(e);if(s===!0)return;i!=null&&(yield i)}catch(s){if(s.code==="ERR_UNDER_READ")return{done:!0,value:null};throw s}finally{e=1}}();return ve(n,{...t??{},onLength:s=>{e=s}})};var de=class extends Error{code;constructor(t,e){super(t),this.code=e}},st=r=>fe(r);st.bytes=0;function K(r,t={}){let e=tt(r);return t.maxDataLength!=null&&t.maxLengthLength==null&&(t.maxLengthLength=C(t.maxDataLength)),{read:async o=>{let s=-1,i=new p,a=t?.lengthDecoder??st;for(;;){i.append(await e.read(1,o));try{s=a(i)}catch(c){if(c instanceof RangeError)continue;throw c}if(t?.maxLengthLength!=null&&i.byteLength>t.maxLengthLength)throw new de("message length length too long","ERR_MSG_LENGTH_TOO_LONG");if(s>-1)break}if(t?.maxDataLength!=null&&s>t.maxDataLength)throw new de("message length too long","ERR_MSG_DATA_TOO_LONG");return e.read(s,o)},write:async(o,s)=>{await e.write(z.single(o,t),s)},writeV:async(o,s)=>{let i=new p(...o.map(a=>z.single(a,t)));await e.write(i,s)},unwrap:()=>e.unwrap()}}var Ne={};L(Ne,{base10:()=>nr});function Qt(r,t){if(r.length>=255)throw new TypeError("Alphabet too long");for(var e=new Uint8Array(256),n=0;n<e.length;n++)e[n]=255;for(var o=0;o<r.length;o++){var s=r.charAt(o),i=s.charCodeAt(0);if(e[i]!==255)throw new TypeError(s+" is ambiguous");e[i]=o}var a=r.length,c=r.charAt(0),f=Math.log(a)/Math.log(256),l=Math.log(256)/Math.log(a);function u(d){if(d instanceof Uint8Array||(ArrayBuffer.isView(d)?d=new Uint8Array(d.buffer,d.byteOffset,d.byteLength):Array.isArray(d)&&(d=Uint8Array.from(d))),!(d instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(d.length===0)return"";for(var x=0,B=0,A=0,U=d.length;A!==U&&d[A]===0;)A++,x++;for(var R=(U-A)*l+1>>>0,E=new Uint8Array(R);A!==U;){for(var D=d[A],_=0,S=R-1;(D!==0||_<B)&&S!==-1;S--,_++)D+=256*E[S]>>>0,E[S]=D%a>>>0,D=D/a>>>0;if(D!==0)throw new Error("Non-zero carry");B=_,A++}for(var O=R-B;O!==R&&E[O]===0;)O++;for(var ne=c.repeat(x);O<R;++O)ne+=r.charAt(E[O]);return ne}function y(d){if(typeof d!="string")throw new TypeError("Expected String");if(d.length===0)return new Uint8Array;var x=0;if(d[x]!==" "){for(var B=0,A=0;d[x]===c;)B++,x++;for(var U=(d.length-x)*f+1>>>0,R=new Uint8Array(U);d[x];){var E=e[d.charCodeAt(x)];if(E===255)return;for(var D=0,_=U-1;(E!==0||D<A)&&_!==-1;_--,D++)E+=a*R[_]>>>0,R[_]=E%256>>>0,E=E/256>>>0;if(E!==0)throw new Error("Non-zero carry");A=D,x++}if(d[x]!==" "){for(var S=U-A;S!==U&&R[S]===0;)S++;for(var O=new Uint8Array(B+(U-S)),ne=B;S!==U;)O[ne++]=R[S++];return O}}}function re(d){var x=y(d);if(x)return x;throw new Error(`Non-${t} character`)}return{encode:u,decodeUnsafe:y,decode:re}}var Zt=Qt,er=Zt,it=er;var Wn=new Uint8Array(0);var at=(r,t)=>{if(r===t)return!0;if(r.byteLength!==t.byteLength)return!1;for(let e=0;e<r.byteLength;e++)if(r[e]!==t[e])return!1;return!0},I=r=>{if(r instanceof Uint8Array&&r.constructor.name==="Uint8Array")return r;if(r instanceof ArrayBuffer)return new Uint8Array(r);if(ArrayBuffer.isView(r))return new Uint8Array(r.buffer,r.byteOffset,r.byteLength);throw new Error("Unknown type, must be binary type")};var ct=r=>new TextEncoder().encode(r),ft=r=>new TextDecoder().decode(r);var Re=class{constructor(t,e,n){this.name=t,this.prefix=e,this.baseEncode=n}encode(t){if(t instanceof Uint8Array)return`${this.prefix}${this.baseEncode(t)}`;throw Error("Unknown type, must be binary type")}},De=class{constructor(t,e,n){if(this.name=t,this.prefix=e,e.codePointAt(0)===void 0)throw new Error("Invalid prefix character");this.prefixCodePoint=e.codePointAt(0),this.baseDecode=n}decode(t){if(typeof t=="string"){if(t.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(t)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(t.slice(this.prefix.length))}else throw Error("Can only multibase decode strings")}or(t){return ut(this,t)}},Te=class{constructor(t){this.decoders=t}or(t){return ut(this,t)}decode(t){let e=t[0],n=this.decoders[e];if(n)return n.decode(t);throw RangeError(`Unable to decode multibase string ${JSON.stringify(t)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}},ut=(r,t)=>new Te({...r.decoders||{[r.prefix]:r},...t.decoders||{[t.prefix]:t}}),Oe=class{constructor(t,e,n,o){this.name=t,this.prefix=e,this.baseEncode=n,this.baseDecode=o,this.encoder=new Re(t,e,n),this.decoder=new De(t,e,o)}encode(t){return this.encoder.encode(t)}decode(t){return this.decoder.decode(t)}},X=({name:r,prefix:t,encode:e,decode:n})=>new Oe(r,t,e,n),F=({prefix:r,name:t,alphabet:e})=>{let{encode:n,decode:o}=it(e,t);return X({prefix:r,name:t,encode:n,decode:s=>I(o(s))})},tr=(r,t,e,n)=>{let o={};for(let l=0;l<t.length;++l)o[t[l]]=l;let s=r.length;for(;r[s-1]==="=";)--s;let i=new Uint8Array(s*e/8|0),a=0,c=0,f=0;for(let l=0;l<s;++l){let u=o[r[l]];if(u===void 0)throw new SyntaxError(`Non-${n} character`);c=c<<e|u,a+=e,a>=8&&(a-=8,i[f++]=255&c>>a)}if(a>=e||255&c<<8-a)throw new SyntaxError("Unexpected end of data");return i},rr=(r,t,e)=>{let n=t[t.length-1]==="=",o=(1<<e)-1,s="",i=0,a=0;for(let c=0;c<r.length;++c)for(a=a<<8|r[c],i+=8;i>e;)i-=e,s+=t[o&a>>i];if(i&&(s+=t[o&a<<e-i]),n)for(;s.length*e&7;)s+="=";return s},m=({name:r,prefix:t,bitsPerChar:e,alphabet:n})=>X({prefix:t,name:r,encode(o){return rr(o,n,e)},decode(o){return tr(o,n,e,r)}});var nr=F({prefix:"9",name:"base10",alphabet:"0123456789"});var Ce={};L(Ce,{base16:()=>or,base16upper:()=>sr});var or=m({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),sr=m({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var Ie={};L(Ie,{base2:()=>ir});var ir=m({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var _e={};L(_e,{base256emoji:()=>ur});var lt=Array.from("\u{1F680}\u{1FA90}\u2604\u{1F6F0}\u{1F30C}\u{1F311}\u{1F312}\u{1F313}\u{1F314}\u{1F315}\u{1F316}\u{1F317}\u{1F318}\u{1F30D}\u{1F30F}\u{1F30E}\u{1F409}\u2600\u{1F4BB}\u{1F5A5}\u{1F4BE}\u{1F4BF}\u{1F602}\u2764\u{1F60D}\u{1F923}\u{1F60A}\u{1F64F}\u{1F495}\u{1F62D}\u{1F618}\u{1F44D}\u{1F605}\u{1F44F}\u{1F601}\u{1F525}\u{1F970}\u{1F494}\u{1F496}\u{1F499}\u{1F622}\u{1F914}\u{1F606}\u{1F644}\u{1F4AA}\u{1F609}\u263A\u{1F44C}\u{1F917}\u{1F49C}\u{1F614}\u{1F60E}\u{1F607}\u{1F339}\u{1F926}\u{1F389}\u{1F49E}\u270C\u2728\u{1F937}\u{1F631}\u{1F60C}\u{1F338}\u{1F64C}\u{1F60B}\u{1F497}\u{1F49A}\u{1F60F}\u{1F49B}\u{1F642}\u{1F493}\u{1F929}\u{1F604}\u{1F600}\u{1F5A4}\u{1F603}\u{1F4AF}\u{1F648}\u{1F447}\u{1F3B6}\u{1F612}\u{1F92D}\u2763\u{1F61C}\u{1F48B}\u{1F440}\u{1F62A}\u{1F611}\u{1F4A5}\u{1F64B}\u{1F61E}\u{1F629}\u{1F621}\u{1F92A}\u{1F44A}\u{1F973}\u{1F625}\u{1F924}\u{1F449}\u{1F483}\u{1F633}\u270B\u{1F61A}\u{1F61D}\u{1F634}\u{1F31F}\u{1F62C}\u{1F643}\u{1F340}\u{1F337}\u{1F63B}\u{1F613}\u2B50\u2705\u{1F97A}\u{1F308}\u{1F608}\u{1F918}\u{1F4A6}\u2714\u{1F623}\u{1F3C3}\u{1F490}\u2639\u{1F38A}\u{1F498}\u{1F620}\u261D\u{1F615}\u{1F33A}\u{1F382}\u{1F33B}\u{1F610}\u{1F595}\u{1F49D}\u{1F64A}\u{1F639}\u{1F5E3}\u{1F4AB}\u{1F480}\u{1F451}\u{1F3B5}\u{1F91E}\u{1F61B}\u{1F534}\u{1F624}\u{1F33C}\u{1F62B}\u26BD\u{1F919}\u2615\u{1F3C6}\u{1F92B}\u{1F448}\u{1F62E}\u{1F646}\u{1F37B}\u{1F343}\u{1F436}\u{1F481}\u{1F632}\u{1F33F}\u{1F9E1}\u{1F381}\u26A1\u{1F31E}\u{1F388}\u274C\u270A\u{1F44B}\u{1F630}\u{1F928}\u{1F636}\u{1F91D}\u{1F6B6}\u{1F4B0}\u{1F353}\u{1F4A2}\u{1F91F}\u{1F641}\u{1F6A8}\u{1F4A8}\u{1F92C}\u2708\u{1F380}\u{1F37A}\u{1F913}\u{1F619}\u{1F49F}\u{1F331}\u{1F616}\u{1F476}\u{1F974}\u25B6\u27A1\u2753\u{1F48E}\u{1F4B8}\u2B07\u{1F628}\u{1F31A}\u{1F98B}\u{1F637}\u{1F57A}\u26A0\u{1F645}\u{1F61F}\u{1F635}\u{1F44E}\u{1F932}\u{1F920}\u{1F927}\u{1F4CC}\u{1F535}\u{1F485}\u{1F9D0}\u{1F43E}\u{1F352}\u{1F617}\u{1F911}\u{1F30A}\u{1F92F}\u{1F437}\u260E\u{1F4A7}\u{1F62F}\u{1F486}\u{1F446}\u{1F3A4}\u{1F647}\u{1F351}\u2744\u{1F334}\u{1F4A3}\u{1F438}\u{1F48C}\u{1F4CD}\u{1F940}\u{1F922}\u{1F445}\u{1F4A1}\u{1F4A9}\u{1F450}\u{1F4F8}\u{1F47B}\u{1F910}\u{1F92E}\u{1F3BC}\u{1F975}\u{1F6A9}\u{1F34E}\u{1F34A}\u{1F47C}\u{1F48D}\u{1F4E3}\u{1F942}"),ar=lt.reduce((r,t,e)=>(r[e]=t,r),[]),cr=lt.reduce((r,t,e)=>(r[t.codePointAt(0)]=e,r),[]);function fr(r){return r.reduce((t,e)=>(t+=ar[e],t),"")}function hr(r){let t=[];for(let e of r){let n=cr[e.codePointAt(0)];if(n===void 0)throw new Error(`Non-base256emoji character: ${e}`);t.push(n)}return new Uint8Array(t)}var ur=X({prefix:"\u{1F680}",name:"base256emoji",encode:fr,decode:hr});var Fe={};L(Fe,{base32:()=>q,base32hex:()=>wr,base32hexpad:()=>gr,base32hexpadupper:()=>br,base32hexupper:()=>pr,base32pad:()=>dr,base32padupper:()=>mr,base32upper:()=>lr,base32z:()=>yr});var q=m({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),lr=m({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),dr=m({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),mr=m({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),wr=m({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),pr=m({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),gr=m({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),br=m({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),yr=m({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Me={};L(Me,{base36:()=>xr,base36upper:()=>Lr});var xr=F({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),Lr=F({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var Be={};L(Be,{base58btc:()=>T,base58flickr:()=>Er});var T=F({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Er=F({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Pe={};L(Pe,{base64:()=>Ar,base64pad:()=>Sr,base64url:()=>vr,base64urlpad:()=>Ur});var Ar=m({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Sr=m({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),vr=m({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Ur=m({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var Ve={};L(Ve,{base8:()=>Rr});var Rr=m({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var ze={};L(ze,{identity:()=>Dr});var Dr=X({prefix:"\0",name:"identity",encode:r=>ft(r),decode:r=>ct(r)});var ho=new TextEncoder,uo=new TextDecoder;var Ge={};L(Ge,{identity:()=>Kr});var Nr=wt,dt=128,Cr=127,Ir=~Cr,_r=Math.pow(2,31);function wt(r,t,e){t=t||[],e=e||0;for(var n=e;r>=_r;)t[e++]=r&255|dt,r/=128;for(;r&Ir;)t[e++]=r&255|dt,r>>>=7;return t[e]=r|0,wt.bytes=e-n+1,t}var Fr=ke,Mr=128,mt=127;function ke(r,n){var e=0,n=n||0,o=0,s=n,i,a=r.length;do{if(s>=a)throw ke.bytes=0,new RangeError("Could not decode varint");i=r[s++],e+=o<28?(i&mt)<<o:(i&mt)*Math.pow(2,o),o+=7}while(i>=Mr);return ke.bytes=s-n,e}var Br=Math.pow(2,7),Pr=Math.pow(2,14),Vr=Math.pow(2,21),zr=Math.pow(2,28),kr=Math.pow(2,35),Gr=Math.pow(2,42),$r=Math.pow(2,49),jr=Math.pow(2,56),Hr=Math.pow(2,63),Xr=function(r){return r<Br?1:r<Pr?2:r<Vr?3:r<zr?4:r<kr?5:r<Gr?6:r<$r?7:r<jr?8:r<Hr?9:10},qr={encode:Nr,decode:Fr,encodingLength:Xr},Jr=qr,Q=Jr;var Z=(r,t=0)=>[Q.decode(r,t),Q.decode.bytes],J=(r,t,e=0)=>(Q.encode(r,t,e),t),W=r=>Q.encodingLength(r);var G=(r,t)=>{let e=t.byteLength,n=W(r),o=n+W(e),s=new Uint8Array(o+e);return J(r,s,0),J(e,s,n),s.set(t,o),new Y(r,e,t,s)},pt=r=>{let t=I(r),[e,n]=Z(t),[o,s]=Z(t.subarray(n)),i=t.subarray(n+s);if(i.byteLength!==o)throw new Error("Incorrect length");return new Y(e,o,i,t)},gt=(r,t)=>{if(r===t)return!0;{let e=t;return r.code===e.code&&r.size===e.size&&e.bytes instanceof Uint8Array&&at(r.bytes,e.bytes)}},Y=class{constructor(t,e,n,o){this.code=t,this.size=e,this.digest=n,this.bytes=o}};var bt=0,Wr="identity",yt=I,Yr=r=>G(bt,yt(r)),Kr={code:bt,name:Wr,encode:yt,digest:Yr};var He={};L(He,{sha256:()=>Qr,sha512:()=>Zr});var je=({name:r,code:t,encode:e})=>new $e(r,t,e),$e=class{constructor(t,e,n){this.name=t,this.code=e,this.encode=n}digest(t){if(t instanceof Uint8Array){let e=this.encode(t);return e instanceof Uint8Array?G(this.code,e):e.then(n=>G(this.code,n))}else throw Error("Unknown type, must be binary type")}};var Lt=r=>async t=>new Uint8Array(await crypto.subtle.digest(r,t)),Qr=je({name:"sha2-256",code:18,encode:Lt("SHA-256")}),Zr=je({name:"sha2-512",code:19,encode:Lt("SHA-512")});var Et=(r,t)=>{let{bytes:e,version:n}=r;switch(n){case 0:return tn(e,Xe(r),t||T.encoder);default:return rn(e,Xe(r),t||q.encoder)}};var At=new WeakMap,Xe=r=>{let t=At.get(r);if(t==null){let e=new Map;return At.set(r,e),e}return t},we=class r{constructor(t,e,n,o){this.code=e,this.version=t,this.multihash=n,this.bytes=o,this["/"]=o}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{let{code:t,multihash:e}=this;if(t!==te)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(e.code!==nn)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return r.createV0(e)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{let{code:t,digest:e}=this.multihash,n=G(t,e);return r.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(t){return r.equals(this,t)}static equals(t,e){let n=e;return n&&t.code===n.code&&t.version===n.version&&gt(t.multihash,n.multihash)}toString(t){return Et(this,t)}toJSON(){return{"/":Et(this)}}link(){return this}get[Symbol.toStringTag](){return"CID"}[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(t){if(t==null)return null;let e=t;if(e instanceof r)return e;if(e["/"]!=null&&e["/"]===e.bytes||e.asCID===e){let{version:n,code:o,multihash:s,bytes:i}=e;return new r(n,o,s,i||St(n,o,s.bytes))}else if(e[on]===!0){let{version:n,multihash:o,code:s}=e,i=pt(o);return r.create(n,s,i)}else return null}static create(t,e,n){if(typeof e!="number")throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(t){case 0:{if(e!==te)throw new Error(`Version 0 CID must use dag-pb (code: ${te}) block encoding`);return new r(t,e,n,n.bytes)}case 1:{let o=St(t,e,n.bytes);return new r(t,e,n,o)}default:throw new Error("Invalid version")}}static createV0(t){return r.create(0,te,t)}static createV1(t,e){return r.create(1,t,e)}static decode(t){let[e,n]=r.decodeFirst(t);if(n.length)throw new Error("Incorrect length");return e}static decodeFirst(t){let e=r.inspectBytes(t),n=e.size-e.multihashSize,o=I(t.subarray(n,n+e.multihashSize));if(o.byteLength!==e.multihashSize)throw new Error("Incorrect length");let s=o.subarray(e.multihashSize-e.digestSize),i=new Y(e.multihashCode,e.digestSize,s,o);return[e.version===0?r.createV0(i):r.createV1(e.codec,i),t.subarray(e.size)]}static inspectBytes(t){let e=0,n=()=>{let[u,y]=Z(t.subarray(e));return e+=y,u},o=n(),s=te;if(o===18?(o=0,e=0):s=n(),o!==0&&o!==1)throw new RangeError(`Invalid CID version ${o}`);let i=e,a=n(),c=n(),f=e+c,l=f-i;return{version:o,codec:s,multihashCode:a,digestSize:c,multihashSize:l,size:f}}static parse(t,e){let[n,o]=en(t,e),s=r.decode(o);if(s.version===0&&t[0]!=="Q")throw Error("Version 0 CID string must not include multibase prefix");return Xe(s).set(n,t),s}},en=(r,t)=>{switch(r[0]){case"Q":{let e=t||T;return[T.prefix,e.decode(`${T.prefix}${r}`)]}case T.prefix:{let e=t||T;return[T.prefix,e.decode(r)]}case q.prefix:{let e=t||q;return[q.prefix,e.decode(r)]}default:{if(t==null)throw Error("To parse non base32 or base58btc encoded CID multibase decoder must be provided");return[r[0],t.decode(r)]}}},tn=(r,t,e)=>{let{prefix:n}=e;if(n!==T.prefix)throw Error(`Cannot string encode V0 in ${e.name} encoding`);let o=t.get(n);if(o==null){let s=e.encode(r).slice(1);return t.set(n,s),s}else return o},rn=(r,t,e)=>{let{prefix:n}=e,o=t.get(n);if(o==null){let s=e.encode(r);return t.set(n,s),s}else return o},te=112,nn=18,St=(r,t,e)=>{let n=W(r),o=n+W(t),s=new Uint8Array(o+e.byteLength);return J(r,s,0),J(t,s,n),s.set(e,o),s},on=Symbol.for("@ipld/js-cid/CID");var qe={...ze,...Ie,...Ve,...Ne,...Ce,...Fe,...Me,...Be,...Pe,..._e},Do={...He,...Ge};function Ut(r,t,e,n){return{name:r,prefix:t,encoder:{name:r,prefix:t,encode:e},decoder:{decode:n}}}var vt=Ut("utf8","u",r=>"u"+new TextDecoder("utf8").decode(r),r=>new TextEncoder().encode(r.substring(1))),Je=Ut("ascii","a",r=>{let t="a";for(let e=0;e<r.length;e++)t+=String.fromCharCode(r[e]);return t},r=>{r=r.substring(1);let t=v(r.length);for(let e=0;e<r.length;e++)t[e]=r.charCodeAt(e);return t}),sn={utf8:vt,"utf-8":vt,hex:qe.base16,latin1:Je,ascii:Je,binary:Je,...qe},pe=sn;function b(r,t="utf8"){let e=pe[t];if(e==null)throw new Error(`Unsupported encoding "${t}"`);return(t==="utf8"||t==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?V(globalThis.Buffer.from(r,"utf-8")):e.decoder.decode(`${e.prefix}${r}`)}function Rt(r,t="utf8"){let e=pe[t];if(e==null)throw new Error(`Unsupported encoding "${t}"`);return(t==="utf8"||t==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?globalThis.Buffer.from(r.buffer,r.byteOffset,r.byteLength).toString("utf8"):e.encoder.encode(r).substring(1)}var an=b(`
3
+ `);async function $(r,t,e){await r.write(t,e)}async function Dt(r,t,e){await r.writeV(t,e)}async function cn(r,t){let e=await r.read(t);if(e.byteLength===0||e.get(e.byteLength-1)!==an[0])throw t?.log.error("Invalid mss message - missing newline",e),new P("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return e.sublist(0,-1)}async function M(r,t){let e=await cn(r,t);return Rt(e.subarray())}async function Ot(r,t,e){t=Array.isArray(t)?[...t]:[t];let n=K(r,{...e,maxDataLength:1024}),o=t.shift();if(o==null)throw new Error("At least one protocol must be specified");e?.log.trace('select: write ["%s", "%s"]',w,o);let s=b(`${w}
4
+ `),i=b(`${o}
5
+ `);await Dt(n,[s,i],e),e?.log.trace("select: reading multistream-select header");let a=await M(n,e);if(e?.log.trace('select: read "%s"',a),a===w&&(e?.log.trace("select: reading protocol response"),a=await M(n,e),e?.log.trace('select: read "%s"',a)),a===o)return{stream:n.unwrap(),protocol:o};for(let c of t){e?.log.trace('select: write "%s"',c),await $(n,b(`${c}
6
+ `),e),e?.log.trace("select: reading protocol response");let f=await M(n,e);if(e?.log.trace('select: read "%s" for "%s"',f,c),f===c)return{stream:n.unwrap(),protocol:c}}throw new P("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}function Nt(r,t,e){let n=r.sink.bind(r),o=r.source,s=!1,i=K({sink:n,source:o},{...e,maxDataLength:1024});return r.sink=async a=>{let{sink:c}=i.unwrap();await c(async function*(){for await(let f of a)if(s)yield f;else{s=!0,e?.log.trace('lazy: write ["%s", "%s", data] in sink',w,t);let l=`${t}
7
+ `;yield new p(Uint8Array.from([19]),b(`${w}
8
+ `),ce(l.length),b(l),f).subarray(),e?.log.trace('lazy: wrote ["%s", "%s", data] in sink',w,t)}}())},r.source=async function*(){s||(s=!0,e?.log.trace('lazy: write ["%s", "%s", data] in source',w,t),await i.writeV([b(`${w}
9
+ `),b(`${t}
10
+ `)]),e?.log.trace('lazy: wrote ["%s", "%s", data] in source',w,t)),e?.log.trace("lazy: reading multistream select header");let a=await M(i,e);if(e?.log.trace('lazy: read multistream select header "%s"',a),a===w&&(a=await M(i,e)),e?.log.trace('lazy: read protocol "%s", expecting "%s"',a,t),a!==t)throw new P("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL");e?.log.trace('lazy: reading rest of "%s" stream',t),yield*i.unwrap().source}(),{stream:r,protocol:t}}async function Ct(r,t,e){t=Array.isArray(t)?t:[t],e.log.trace("handle: available protocols %s",t);let n=K(r,{...e,maxDataLength:1024,maxLengthLength:2});for(;;){e?.log.trace("handle: reading incoming string");let o=await M(n,e);if(e.log.trace('handle: read "%s"',o),o===w){e.log.trace('handle: respond with "%s" for "%s"',w,o),await $(n,b(`${w}
11
+ `),e),e.log.trace('handle: responded with "%s" for "%s"',w,o);continue}if(t.includes(o))return e.log.trace('handle: respond with "%s" for "%s"',o,o),await $(n,b(`${o}
12
+ `),e),e.log.trace('handle: responded with "%s" for "%s"',o,o),{stream:n.unwrap(),protocol:o};if(o==="ls"){let s=new p(...t.map(i=>z.single(b(`${i}
13
+ `))),b(`
14
+ `));e.log.trace('handle: respond with "%s" for %s',t,o),await $(n,s,e),e.log.trace('handle: responded with "%s" for %s',t,o);continue}e.log('handle: respond with "na" for "%s"',o),await $(n,b(`na
15
+ `),e),e.log('handle: responded with "na" for "%s"',o)}}return zt(fn);})();
14
16
  return Libp2PMultistreamSelect}));
@@ -1 +1 @@
1
- {"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,MAAM,CAAE,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAuClL"}
1
+ {"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,MAAM,CAAE,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CA+ClL"}
@@ -52,32 +52,39 @@ import * as multistream from './multistream.js';
52
52
  */
53
53
  export async function handle(stream, protocols, options) {
54
54
  protocols = Array.isArray(protocols) ? protocols : [protocols];
55
+ options.log.trace('handle: available protocols %s', protocols);
55
56
  const lp = lpStream(stream, {
56
- maxDataLength: MAX_PROTOCOL_LENGTH
57
+ ...options,
58
+ maxDataLength: MAX_PROTOCOL_LENGTH,
59
+ maxLengthLength: 2 // 2 bytes is enough to length-prefix MAX_PROTOCOL_LENGTH
57
60
  });
58
61
  while (true) {
59
- options.log.trace('handle - available protocols %s', protocols);
62
+ options?.log.trace('handle: reading incoming string');
60
63
  const protocol = await multistream.readString(lp, options);
61
- options.log.trace('read "%s"', protocol);
64
+ options.log.trace('handle: read "%s"', protocol);
62
65
  if (protocol === PROTOCOL_ID) {
63
- options.log.trace('respond with "%s" for "%s"', PROTOCOL_ID, protocol);
66
+ options.log.trace('handle: respond with "%s" for "%s"', PROTOCOL_ID, protocol);
64
67
  await multistream.write(lp, uint8ArrayFromString(`${PROTOCOL_ID}\n`), options);
68
+ options.log.trace('handle: responded with "%s" for "%s"', PROTOCOL_ID, protocol);
65
69
  continue;
66
70
  }
67
71
  if (protocols.includes(protocol)) {
68
- options.log.trace('respond with "%s" for "%s"', protocol, protocol);
72
+ options.log.trace('handle: respond with "%s" for "%s"', protocol, protocol);
69
73
  await multistream.write(lp, uint8ArrayFromString(`${protocol}\n`), options);
74
+ options.log.trace('handle: responded with "%s" for "%s"', protocol, protocol);
70
75
  return { stream: lp.unwrap(), protocol };
71
76
  }
72
77
  if (protocol === 'ls') {
73
78
  // <varint-msg-len><varint-proto-name-len><proto-name>\n<varint-proto-name-len><proto-name>\n\n
74
79
  const protos = new Uint8ArrayList(...protocols.map(p => encode.single(uint8ArrayFromString(`${p}\n`))), uint8ArrayFromString('\n'));
80
+ options.log.trace('handle: respond with "%s" for %s', protocols, protocol);
75
81
  await multistream.write(lp, protos, options);
76
- options.log.trace('respond with "%s" for %s', protocols, protocol);
82
+ options.log.trace('handle: responded with "%s" for %s', protocols, protocol);
77
83
  continue;
78
84
  }
79
- options.log('respond with "na" for "%s"', protocol);
85
+ options.log('handle: respond with "na" for "%s"', protocol);
80
86
  await multistream.write(lp, uint8ArrayFromString('na\n'), options);
87
+ options.log('handle: responded with "na" for "%s"', protocol);
81
88
  }
82
89
  }
83
90
  //# sourceMappingURL=handle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handle.js","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjE,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAI/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAyC,MAAc,EAAE,SAA4B,EAAE,OAA8B;IAC/I,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC9D,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE;QAC1B,aAAa,EAAE,mBAAmB;KACnC,CAAC,CAAA;IAEF,OAAO,IAAI,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,SAAS,CAAC,CAAA;QAC/D,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;QAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAExC,IAAI,QAAQ,KAAK,WAAW,EAAE;YAC5B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;YACtE,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,oBAAoB,CAAC,GAAG,WAAW,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;YAC9E,SAAQ;SACT;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACnE,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,oBAAoB,CAAC,GAAG,QAAQ,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;YAE3E,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,CAAA;SACzC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,+FAA+F;YAC/F,MAAM,MAAM,GAAG,IAAI,cAAc,CAC/B,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EACpE,oBAAoB,CAAC,IAAI,CAAC,CAC3B,CAAA;YAED,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YAClE,SAAQ;SACT;QAED,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;QACnD,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,EAAE,oBAAoB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;KACnE;AACH,CAAC"}
1
+ {"version":3,"file":"handle.js","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"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"}
@@ -21,12 +21,13 @@
21
21
  */
22
22
  import { PROTOCOL_ID } from './constants.js';
23
23
  import type { AbortOptions, LoggerOptions } from '@libp2p/interface';
24
+ import type { LengthPrefixedStreamOpts } from 'it-length-prefixed-stream';
24
25
  export { PROTOCOL_ID };
25
26
  export interface ProtocolStream<Stream> {
26
27
  stream: Stream;
27
28
  protocol: string;
28
29
  }
29
- export interface MultistreamSelectInit extends AbortOptions, LoggerOptions {
30
+ export interface MultistreamSelectInit extends AbortOptions, LoggerOptions, Partial<LengthPrefixedStreamOpts> {
30
31
  }
31
32
  export { select, lazySelect } from './select.js';
32
33
  export { handle } from './handle.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAEpE,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,WAAW,cAAc,CAAC,MAAM;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,aAAa;CAEzE;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,WAAW,cAAc,CAAC,MAAM;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,aAAa,EAAE,OAAO,CAAC,wBAAwB,CAAC;CAE5G;AAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAG5C,OAAO,EAAE,WAAW,EAAE,CAAA;AAWtB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAI5C,OAAO,EAAE,WAAW,EAAE,CAAA;AAWtB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,MAAM,CAAE,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CA8ClL;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAE,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAAC,MAAM,CAAC,CA+C3J"}
1
+ {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,MAAM,CAAE,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CA+ClL;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAE,MAAM,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,cAAc,CAAC,MAAM,CAAC,CA4E3J"}
@@ -1,5 +1,7 @@
1
1
  import { CodeError } from '@libp2p/interface/errors';
2
2
  import { lpStream } from 'it-length-prefixed-stream';
3
+ import * as varint from 'uint8-varint';
4
+ import { Uint8ArrayList } from 'uint8arraylist';
3
5
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
6
  import { MAX_PROTOCOL_LENGTH } from './constants.js';
5
7
  import * as multistream from './multistream.js';
@@ -50,6 +52,7 @@ import { PROTOCOL_ID } from './index.js';
50
52
  export async function select(stream, protocols, options) {
51
53
  protocols = Array.isArray(protocols) ? [...protocols] : [protocols];
52
54
  const lp = lpStream(stream, {
55
+ ...options,
53
56
  maxDataLength: MAX_PROTOCOL_LENGTH
54
57
  });
55
58
  const protocol = protocols.shift();
@@ -97,22 +100,45 @@ export async function select(stream, protocols, options) {
97
100
  export function lazySelect(stream, protocol, options) {
98
101
  const originalSink = stream.sink.bind(stream);
99
102
  const originalSource = stream.source;
103
+ let selected = false;
100
104
  const lp = lpStream({
101
105
  sink: originalSink,
102
106
  source: originalSource
103
107
  }, {
108
+ ...options,
104
109
  maxDataLength: MAX_PROTOCOL_LENGTH
105
110
  });
106
111
  stream.sink = async (source) => {
107
- options?.log.trace('lazy: write ["%s", "%s"]', PROTOCOL_ID, protocol);
108
- await lp.writeV([
109
- uint8ArrayFromString(`${PROTOCOL_ID}\n`),
110
- uint8ArrayFromString(`${protocol}\n`)
111
- ]);
112
- options?.log.trace('lazy: writing rest of "%s" stream', protocol);
113
- await lp.unwrap().sink(source);
112
+ const { sink } = lp.unwrap();
113
+ await sink(async function* () {
114
+ for await (const buf of source) {
115
+ // if writing before selecting, send selection with first data chunk
116
+ if (!selected) {
117
+ selected = true;
118
+ options?.log.trace('lazy: write ["%s", "%s", data] in sink', PROTOCOL_ID, protocol);
119
+ const protocolString = `${protocol}\n`;
120
+ // send protocols in first chunk of data written to transport
121
+ yield new Uint8ArrayList(Uint8Array.from([19]), // length of PROTOCOL_ID plus newline
122
+ uint8ArrayFromString(`${PROTOCOL_ID}\n`), varint.encode(protocolString.length), uint8ArrayFromString(protocolString), buf).subarray();
123
+ options?.log.trace('lazy: wrote ["%s", "%s", data] in sink', PROTOCOL_ID, protocol);
124
+ }
125
+ else {
126
+ yield buf;
127
+ }
128
+ }
129
+ }());
114
130
  };
115
131
  stream.source = (async function* () {
132
+ // if reading before selecting, send selection before first data chunk
133
+ if (!selected) {
134
+ selected = true;
135
+ options?.log.trace('lazy: write ["%s", "%s", data] in source', PROTOCOL_ID, protocol);
136
+ await lp.writeV([
137
+ uint8ArrayFromString(`${PROTOCOL_ID}\n`),
138
+ uint8ArrayFromString(`${protocol}\n`)
139
+ ]);
140
+ options?.log.trace('lazy: wrote ["%s", "%s", data] in source', PROTOCOL_ID, protocol);
141
+ }
116
142
  options?.log.trace('lazy: reading multistream select header');
117
143
  let response = await multistream.readString(lp, options);
118
144
  options?.log.trace('lazy: read multistream select header "%s"', response);
@@ -1 +1 @@
1
- {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@libp2p/multistream-select",
3
- "version": "4.0.6-adea7bbbf",
3
+ "version": "4.0.6-d8f5bc211",
4
4
  "description": "JavaScript implementation of multistream-select",
5
5
  "license": "Apache-2.0 OR MIT",
6
- "homepage": "https://github.com/libp2p/js-libp2p/tree/master/packages/multistream-select#readme",
6
+ "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/multistream-select#readme",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/libp2p/js-libp2p.git"
@@ -53,16 +53,17 @@
53
53
  "test:electron-main": "aegir test -t electron-main"
54
54
  },
55
55
  "dependencies": {
56
- "@libp2p/interface": "0.1.6-adea7bbbf",
56
+ "@libp2p/interface": "0.1.6-d8f5bc211",
57
57
  "it-length-prefixed": "^9.0.3",
58
58
  "it-length-prefixed-stream": "^1.1.1",
59
59
  "it-pipe": "^3.0.1",
60
60
  "it-stream-types": "^2.0.1",
61
+ "uint8-varint": "^2.0.2",
61
62
  "uint8arraylist": "^2.4.3",
62
63
  "uint8arrays": "^4.0.6"
63
64
  },
64
65
  "devDependencies": {
65
- "@libp2p/logger": "3.1.0-adea7bbbf",
66
+ "@libp2p/logger": "3.1.0-d8f5bc211",
66
67
  "aegir": "^41.0.2",
67
68
  "iso-random-stream": "^2.0.2",
68
69
  "it-all": "^3.0.3",
package/src/handle.ts CHANGED
@@ -55,24 +55,30 @@ import type { Duplex } from 'it-stream-types'
55
55
  */
56
56
  export async function handle <Stream extends Duplex<any, any, any>> (stream: Stream, protocols: string | string[], options: MultistreamSelectInit): Promise<ProtocolStream<Stream>> {
57
57
  protocols = Array.isArray(protocols) ? protocols : [protocols]
58
+ options.log.trace('handle: available protocols %s', protocols)
59
+
58
60
  const lp = lpStream(stream, {
59
- maxDataLength: MAX_PROTOCOL_LENGTH
61
+ ...options,
62
+ maxDataLength: MAX_PROTOCOL_LENGTH,
63
+ maxLengthLength: 2 // 2 bytes is enough to length-prefix MAX_PROTOCOL_LENGTH
60
64
  })
61
65
 
62
66
  while (true) {
63
- options.log.trace('handle - available protocols %s', protocols)
67
+ options?.log.trace('handle: reading incoming string')
64
68
  const protocol = await multistream.readString(lp, options)
65
- options.log.trace('read "%s"', protocol)
69
+ options.log.trace('handle: read "%s"', protocol)
66
70
 
67
71
  if (protocol === PROTOCOL_ID) {
68
- options.log.trace('respond with "%s" for "%s"', PROTOCOL_ID, protocol)
72
+ options.log.trace('handle: respond with "%s" for "%s"', PROTOCOL_ID, protocol)
69
73
  await multistream.write(lp, uint8ArrayFromString(`${PROTOCOL_ID}\n`), options)
74
+ options.log.trace('handle: responded with "%s" for "%s"', PROTOCOL_ID, protocol)
70
75
  continue
71
76
  }
72
77
 
73
78
  if (protocols.includes(protocol)) {
74
- options.log.trace('respond with "%s" for "%s"', protocol, protocol)
79
+ options.log.trace('handle: respond with "%s" for "%s"', protocol, protocol)
75
80
  await multistream.write(lp, uint8ArrayFromString(`${protocol}\n`), options)
81
+ options.log.trace('handle: responded with "%s" for "%s"', protocol, protocol)
76
82
 
77
83
  return { stream: lp.unwrap(), protocol }
78
84
  }
@@ -84,12 +90,14 @@ export async function handle <Stream extends Duplex<any, any, any>> (stream: Str
84
90
  uint8ArrayFromString('\n')
85
91
  )
86
92
 
93
+ options.log.trace('handle: respond with "%s" for %s', protocols, protocol)
87
94
  await multistream.write(lp, protos, options)
88
- options.log.trace('respond with "%s" for %s', protocols, protocol)
95
+ options.log.trace('handle: responded with "%s" for %s', protocols, protocol)
89
96
  continue
90
97
  }
91
98
 
92
- options.log('respond with "na" for "%s"', protocol)
99
+ options.log('handle: respond with "na" for "%s"', protocol)
93
100
  await multistream.write(lp, uint8ArrayFromString('na\n'), options)
101
+ options.log('handle: responded with "na" for "%s"', protocol)
94
102
  }
95
103
  }
package/src/index.ts CHANGED
@@ -22,6 +22,7 @@
22
22
 
23
23
  import { PROTOCOL_ID } from './constants.js'
24
24
  import type { AbortOptions, LoggerOptions } from '@libp2p/interface'
25
+ import type { LengthPrefixedStreamOpts } from 'it-length-prefixed-stream'
25
26
 
26
27
  export { PROTOCOL_ID }
27
28
 
@@ -30,7 +31,7 @@ export interface ProtocolStream<Stream> {
30
31
  protocol: string
31
32
  }
32
33
 
33
- export interface MultistreamSelectInit extends AbortOptions, LoggerOptions {
34
+ export interface MultistreamSelectInit extends AbortOptions, LoggerOptions, Partial<LengthPrefixedStreamOpts> {
34
35
 
35
36
  }
36
37
 
package/src/select.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import { CodeError } from '@libp2p/interface/errors'
2
2
  import { lpStream } from 'it-length-prefixed-stream'
3
+ import * as varint from 'uint8-varint'
4
+ import { Uint8ArrayList } from 'uint8arraylist'
3
5
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
4
6
  import { MAX_PROTOCOL_LENGTH } from './constants.js'
5
7
  import * as multistream from './multistream.js'
@@ -53,6 +55,7 @@ import type { Duplex } from 'it-stream-types'
53
55
  export async function select <Stream extends Duplex<any, any, any>> (stream: Stream, protocols: string | string[], options: MultistreamSelectInit): Promise<ProtocolStream<Stream>> {
54
56
  protocols = Array.isArray(protocols) ? [...protocols] : [protocols]
55
57
  const lp = lpStream(stream, {
58
+ ...options,
56
59
  maxDataLength: MAX_PROTOCOL_LENGTH
57
60
  })
58
61
  const protocol = protocols.shift()
@@ -109,29 +112,58 @@ export async function select <Stream extends Duplex<any, any, any>> (stream: Str
109
112
  export function lazySelect <Stream extends Duplex<any, any, any>> (stream: Stream, protocol: string, options: MultistreamSelectInit): ProtocolStream<Stream> {
110
113
  const originalSink = stream.sink.bind(stream)
111
114
  const originalSource = stream.source
115
+ let selected = false
112
116
 
113
117
  const lp = lpStream({
114
118
  sink: originalSink,
115
119
  source: originalSource
116
120
  }, {
121
+ ...options,
117
122
  maxDataLength: MAX_PROTOCOL_LENGTH
118
123
  })
119
124
 
120
125
  stream.sink = async source => {
121
- options?.log.trace('lazy: write ["%s", "%s"]', PROTOCOL_ID, protocol)
122
-
123
- await lp.writeV([
124
- uint8ArrayFromString(`${PROTOCOL_ID}\n`),
125
- uint8ArrayFromString(`${protocol}\n`)
126
- ])
127
-
128
- options?.log.trace('lazy: writing rest of "%s" stream', protocol)
129
- await lp.unwrap().sink(source)
126
+ const { sink } = lp.unwrap()
127
+
128
+ await sink(async function * () {
129
+ for await (const buf of source) {
130
+ // if writing before selecting, send selection with first data chunk
131
+ if (!selected) {
132
+ selected = true
133
+ options?.log.trace('lazy: write ["%s", "%s", data] in sink', PROTOCOL_ID, protocol)
134
+
135
+ const protocolString = `${protocol}\n`
136
+
137
+ // send protocols in first chunk of data written to transport
138
+ yield new Uint8ArrayList(
139
+ Uint8Array.from([19]), // length of PROTOCOL_ID plus newline
140
+ uint8ArrayFromString(`${PROTOCOL_ID}\n`),
141
+ varint.encode(protocolString.length),
142
+ uint8ArrayFromString(protocolString),
143
+ buf
144
+ ).subarray()
145
+
146
+ options?.log.trace('lazy: wrote ["%s", "%s", data] in sink', PROTOCOL_ID, protocol)
147
+ } else {
148
+ yield buf
149
+ }
150
+ }
151
+ }())
130
152
  }
131
153
 
132
154
  stream.source = (async function * () {
133
- options?.log.trace('lazy: reading multistream select header')
155
+ // if reading before selecting, send selection before first data chunk
156
+ if (!selected) {
157
+ selected = true
158
+ options?.log.trace('lazy: write ["%s", "%s", data] in source', PROTOCOL_ID, protocol)
159
+ await lp.writeV([
160
+ uint8ArrayFromString(`${PROTOCOL_ID}\n`),
161
+ uint8ArrayFromString(`${protocol}\n`)
162
+ ])
163
+ options?.log.trace('lazy: wrote ["%s", "%s", data] in source', PROTOCOL_ID, protocol)
164
+ }
134
165
 
166
+ options?.log.trace('lazy: reading multistream select header')
135
167
  let response = await multistream.readString(lp, options)
136
168
  options?.log.trace('lazy: read multistream select header "%s"', response)
137
169