@libp2p/multistream-select 4.0.6-9ad8f8686 → 4.0.6-adea7bbbf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.min.js CHANGED
@@ -1,4 +1,14 @@
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 Bt=Object.create;var ae=Object.defineProperty;var Vt=Object.getOwnPropertyDescriptor;var zt=Object.getOwnPropertyNames;var Gt=Object.getPrototypeOf,Ht=Object.prototype.hasOwnProperty;var $t=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),S=(r,e)=>{for(var t in e)ae(r,t,{get:e[t],enumerable:!0})},Ke=(r,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of zt(e))!Ht.call(r,o)&&o!==t&&ae(r,o,{get:()=>e[o],enumerable:!(n=Vt(e,o))||n.enumerable});return r};var jt=(r,e,t)=>(t=r!=null?Bt(Gt(r)):{},Ke(e||!r||!r.__esModule?ae(t,"default",{value:r,enumerable:!0}):t,r)),qt=r=>Ke(ae({},"__esModule",{value:!0}),r);var Rt=$t((Qo,Dt)=>{"use strict";function vt(r,e){for(let t in e)Object.defineProperty(r,t,{value:e[t],enumerable:!0,configurable:!0});return r}function pn(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 vt(r,t)}catch{t.message=r.message,t.stack=r.stack;let o=function(){};return o.prototype=Object.create(Object.getPrototypeOf(r)),vt(new o,t)}}Dt.exports=pn});var An={};S(An,{PROTOCOL_ID:()=>D,handle:()=>kt,lazySelect:()=>Pt,select:()=>Mt});var D="/multistream/1.0.0";var M=class extends Error{code;props;constructor(e,t,n){super(e),this.code=t,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 T(r=0){return globalThis.Buffer?.allocUnsafe!=null?V(globalThis.Buffer.allocUnsafe(r)):new Uint8Array(r)}function ge(r,e){e==null&&(e=r.reduce((o,s)=>o+s.length,0));let t=T(e),n=0;for(let o of r)t.set(o,n),n+=o.length;return V(t)}function Qe(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 We=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 ce(r){return!!r?.[We]}var x=class r{constructor(...e){Object.defineProperty(this,We,{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(ce(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(ce(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(ce(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 ge(n,o)}subarray(e,t){let{bufs:n,length:o}=this._subList(e,t);return n.length===1?n[0]:ge(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,f=a+i.byteLength;if(o=f,e>=f)continue;let u=e>=a&&e<f,h=t>a&&t<=f;if(u&&h){if(e===a&&t===f){n.push(i);break}let c=e-a;n.push(i.subarray(c,c+(t-e)));break}if(u){if(e===0){n.push(i);continue}n.push(i.subarray(e-a));continue}if(h){if(t===f){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(!ce(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 c=0;c<s;c++)i[c]=-1;for(let c=0;c<o;c++)i[n[c]]=c;let a=i,f=this.byteLength-n.byteLength,u=n.byteLength-1,h;for(let c=t;c<=f;c+=h){h=0;for(let m=u;m>=0;m--){let F=this.get(c+m);if(n[m]!==F){h=Math.max(1,m-a[F]);break}}if(h===0)return c}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=T(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=T(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(!Qe(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 fe(r){let e=async function*(){let t=yield,n=new x;for await(let o of r){if(t==null){n.append(o),t=yield n,n=new x;continue}for(n.append(o);n.length>=t;){let s=n.sublist(0,t);if(n.consume(t),t=yield s,t==null){n.length>0&&(t=yield n,n=new x);break}}}if(t!=null)throw Object.assign(new Error(`stream ended before ${t} bytes became available`),{code:"ERR_UNDER_READ",buffer:n})}();return e.next(),e}function q(){let r={};return r.promise=new Promise((e,t)=>{r.resolve=e,r.reject=t}),r}var ue=class{buffer;mask;top;btm;next;constructor(e){if(!(e>0)||e-1&e)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(e),this.mask=e-1,this.top=0,this.btm=0,this.next=null}push(e){return this.buffer[this.top]!==void 0?!1:(this.buffer[this.top]=e,this.top=this.top+1&this.mask,!0)}shift(){let e=this.buffer[this.btm];if(e!==void 0)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,e}isEmpty(){return this.buffer[this.btm]===void 0}},X=class{size;hwm;head;tail;constructor(e={}){this.hwm=e.splitLimit??16,this.head=new ue(this.hwm),this.tail=this.head,this.size=0}calculateSize(e){return e?.byteLength!=null?e.byteLength:1}push(e){if(e?.value!=null&&(this.size+=this.calculateSize(e.value)),!this.head.push(e)){let t=this.head;this.head=t.next=new ue(2*this.head.buffer.length),this.head.push(e)}}shift(){let e=this.tail.shift();if(e===void 0&&this.tail.next!=null){let t=this.tail.next;this.tail.next=null,this.tail=t,e=this.tail.shift()}return e?.value!=null&&(this.size-=this.calculateSize(e.value)),e}isEmpty(){return this.head.isEmpty()}};var xe=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.code=t??"ABORT_ERR"}};function P(r={}){return Xt(t=>{let n=t.shift();if(n==null)return{done:!0};if(n.error!=null)throw n.error;return{done:n.done===!0,value:n.value}},r)}function Xt(r,e){e=e??{};let t=e.onEnd,n=new X,o,s,i,a=q(),f=async()=>{try{return n.isEmpty()?i?{done:!0}:await new Promise((l,y)=>{s=A=>{s=null,n.push(A);try{l(r(n))}catch(g){y(g)}return o}}):r(n)}finally{n.isEmpty()&&queueMicrotask(()=>{a.resolve(),a=q()})}},u=l=>s!=null?s(l):(n.push(l),o),h=l=>(n=new X,s!=null?s({error:l}):(n.push({error:l}),o)),c=l=>{if(i)return o;if(e?.objectMode!==!0&&l?.byteLength==null)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return u({done:!1,value:l})},m=l=>i?o:(i=!0,l!=null?h(l):u({done:!0})),F=()=>(n=new X,m(),{done:!0}),p=l=>(m(l),{done:!0});if(o={[Symbol.asyncIterator](){return this},next:f,return:F,throw:p,push:c,end:m,get readableLength(){return n.size},onEmpty:async l=>{let y=l?.signal;if(y?.throwIfAborted(),n.isEmpty())return;let A,g;y!=null&&(A=new Promise((L,v)=>{g=()=>{v(new xe)},y.addEventListener("abort",g)}));try{await Promise.race([a.promise,A])}finally{g!=null&&y!=null&&y?.removeEventListener("abort",g)}}},t==null)return o;let w=o;return o={[Symbol.asyncIterator](){return this},next(){return w.next()},throw(l){return w.throw(l),t!=null&&(t(l),t=void 0),{done:!0}},return(){return w.return(),t!=null&&(t(),t=void 0),{done:!0}},push:c,end(l){return w.end(l),t!=null&&(t(l),t=void 0),o},get readableLength(){return w.readableLength}},o}function he(r){let e=P(),t=fe(r.source),n=q(),o,s=r.sink(async function*(){yield*e,yield*await n.promise}());return s.catch(a=>{o=a}),{reader:t,writer:e,stream:{sink:async a=>{if(o!=null){await Promise.reject(o);return}n.resolve(a),await s},source:t},rest:()=>e.end(),write:e.push,read:async()=>{let a=await t.next();if(a.value!=null)return a.value}}}function Jt(r){return r[Symbol.asyncIterator]!=null}function Kt(...r){let e=[];for(let t of r)Jt(t)||e.push(t);return e.length===r.length?function*(){for(let t of e)yield*t}():async function*(){let t=P({objectMode:!0});Promise.resolve().then(async()=>{try{await Promise.all(r.map(async n=>{for await(let o of n)t.push(o)})),t.end()}catch(n){t.end(n)}}),yield*t}()}var le=Kt;var Ue={};S(Ue,{base10:()=>tr});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,f=r.charAt(0),u=Math.log(a)/Math.log(256),h=Math.log(256)/Math.log(a);function c(p){if(p instanceof Uint8Array||(ArrayBuffer.isView(p)?p=new Uint8Array(p.buffer,p.byteOffset,p.byteLength):Array.isArray(p)&&(p=Uint8Array.from(p))),!(p instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(p.length===0)return"";for(var w=0,l=0,y=0,A=p.length;y!==A&&p[y]===0;)y++,w++;for(var g=(A-y)*h+1>>>0,L=new Uint8Array(g);y!==A;){for(var v=p[y],_=0,R=g-1;(v!==0||_<l)&&R!==-1;R--,_++)v+=256*L[R]>>>0,L[R]=v%a>>>0,v=v/a>>>0;if(v!==0)throw new Error("Non-zero carry");l=_,y++}for(var I=g-l;I!==g&&L[I]===0;)I++;for(var ie=f.repeat(w);I<g;++I)ie+=r.charAt(L[I]);return ie}function m(p){if(typeof p!="string")throw new TypeError("Expected String");if(p.length===0)return new Uint8Array;var w=0;if(p[w]!==" "){for(var l=0,y=0;p[w]===f;)l++,w++;for(var A=(p.length-w)*u+1>>>0,g=new Uint8Array(A);p[w];){var L=t[p.charCodeAt(w)];if(L===255)return;for(var v=0,_=A-1;(L!==0||v<y)&&_!==-1;_--,v++)L+=a*g[_]>>>0,g[_]=L%256>>>0,L=L/256>>>0;if(L!==0)throw new Error("Non-zero carry");y=v,w++}if(p[w]!==" "){for(var R=A-y;R!==A&&g[R]===0;)R++;for(var I=new Uint8Array(l+(A-R)),ie=l;R!==A;)I[ie++]=g[R++];return I}}}function F(p){var w=m(p);if(w)return w;throw new Error(`Non-${e} character`)}return{encode:c,decodeUnsafe:m,decode:F}}var Yt=Qt,Wt=Yt,Ze=Wt;var Yn=new Uint8Array(0);var et=(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 tt=r=>new TextEncoder().encode(r),rt=r=>new TextDecoder().decode(r);var Ee=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")}},Ae=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 ot(this,e)}},Le=class{constructor(e){this.decoders=e}or(e){return ot(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`)}},ot=(r,e)=>new Le({...r.decoders||{[r.prefix]:r},...e.decoders||{[e.prefix]:e}}),Se=class{constructor(e,t,n,o){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=o,this.encoder=new Ee(e,t,n),this.decoder=new Ae(e,t,o)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}},J=({name:r,prefix:e,encode:t,decode:n})=>new Se(r,e,t,n),k=({prefix:r,name:e,alphabet:t})=>{let{encode:n,decode:o}=Ze(t,e);return J({prefix:r,name:e,encode:n,decode:s=>C(o(s))})},Zt=(r,e,t,n)=>{let o={};for(let h=0;h<e.length;++h)o[e[h]]=h;let s=r.length;for(;r[s-1]==="=";)--s;let i=new Uint8Array(s*t/8|0),a=0,f=0,u=0;for(let h=0;h<s;++h){let c=o[r[h]];if(c===void 0)throw new SyntaxError(`Non-${n} character`);f=f<<t|c,a+=t,a>=8&&(a-=8,i[u++]=255&f>>a)}if(a>=t||255&f<<8-a)throw new SyntaxError("Unexpected end of data");return i},er=(r,e,t)=>{let n=e[e.length-1]==="=",o=(1<<t)-1,s="",i=0,a=0;for(let f=0;f<r.length;++f)for(a=a<<8|r[f],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},b=({name:r,prefix:e,bitsPerChar:t,alphabet:n})=>J({prefix:e,name:r,encode(o){return er(o,n,t)},decode(o){return Zt(o,n,t,r)}});var tr=k({prefix:"9",name:"base10",alphabet:"0123456789"});var ve={};S(ve,{base16:()=>rr,base16upper:()=>nr});var rr=b({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),nr=b({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var De={};S(De,{base2:()=>or});var or=b({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var Re={};S(Re,{base256emoji:()=>fr});var st=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}"),sr=st.reduce((r,e,t)=>(r[t]=e,r),[]),ir=st.reduce((r,e,t)=>(r[e.codePointAt(0)]=t,r),[]);function ar(r){return r.reduce((e,t)=>(e+=sr[t],e),"")}function cr(r){let e=[];for(let t of r){let n=ir[t.codePointAt(0)];if(n===void 0)throw new Error(`Non-base256emoji character: ${t}`);e.push(n)}return new Uint8Array(e)}var fr=J({prefix:"\u{1F680}",name:"base256emoji",encode:ar,decode:cr});var Te={};S(Te,{base32:()=>K,base32hex:()=>dr,base32hexpad:()=>br,base32hexpadupper:()=>mr,base32hexupper:()=>pr,base32pad:()=>hr,base32padupper:()=>lr,base32upper:()=>ur,base32z:()=>wr});var K=b({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),ur=b({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),hr=b({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),lr=b({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),dr=b({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),pr=b({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),br=b({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),mr=b({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),wr=b({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Oe={};S(Oe,{base36:()=>yr,base36upper:()=>gr});var yr=k({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),gr=k({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var Ie={};S(Ie,{base58btc:()=>O,base58flickr:()=>xr});var O=k({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),xr=k({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Ne={};S(Ne,{base64:()=>Er,base64pad:()=>Ar,base64url:()=>Lr,base64urlpad:()=>Sr});var Er=b({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Ar=b({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Lr=b({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Sr=b({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var Ce={};S(Ce,{base8:()=>Ur});var Ur=b({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var Fe={};S(Fe,{identity:()=>vr});var vr=J({prefix:"\0",name:"identity",encode:r=>rt(r),decode:r=>tt(r)});var lo=new TextEncoder,po=new TextDecoder;var Me={};S(Me,{identity:()=>Kr});var Tr=ct,it=128,Or=127,Ir=~Or,Nr=Math.pow(2,31);function ct(r,e,t){e=e||[],t=t||0;for(var n=t;r>=Nr;)e[t++]=r&255|it,r/=128;for(;r&Ir;)e[t++]=r&255|it,r>>>=7;return e[t]=r|0,ct.bytes=t-n+1,e}var Cr=_e,Fr=128,at=127;function _e(r,n){var t=0,n=n||0,o=0,s=n,i,a=r.length;do{if(s>=a)throw _e.bytes=0,new RangeError("Could not decode varint");i=r[s++],t+=o<28?(i&at)<<o:(i&at)*Math.pow(2,o),o+=7}while(i>=Fr);return _e.bytes=s-n,t}var _r=Math.pow(2,7),Mr=Math.pow(2,14),Pr=Math.pow(2,21),kr=Math.pow(2,28),Br=Math.pow(2,35),Vr=Math.pow(2,42),zr=Math.pow(2,49),Gr=Math.pow(2,56),Hr=Math.pow(2,63),$r=function(r){return r<_r?1:r<Mr?2:r<Pr?3:r<kr?4:r<Br?5:r<Vr?6:r<zr?7:r<Gr?8:r<Hr?9:10},jr={encode:Tr,decode:Cr,encodingLength:$r},qr=jr,ee=qr;var te=(r,e=0)=>[ee.decode(r,e),ee.decode.bytes],Q=(r,e,t=0)=>(ee.encode(r,e,t),e),Y=r=>ee.encodingLength(r);var z=(r,e)=>{let t=e.byteLength,n=Y(r),o=n+Y(t),s=new Uint8Array(o+t);return Q(r,s,0),Q(t,s,n),s.set(e,o),new W(r,t,e,s)},ft=r=>{let e=C(r),[t,n]=te(e),[o,s]=te(e.subarray(n)),i=e.subarray(n+s);if(i.byteLength!==o)throw new Error("Incorrect length");return new W(t,o,i,e)},ut=(r,e)=>{if(r===e)return!0;{let t=e;return r.code===t.code&&r.size===t.size&&t.bytes instanceof Uint8Array&&et(r.bytes,t.bytes)}},W=class{constructor(e,t,n,o){this.code=e,this.size=t,this.digest=n,this.bytes=o}};var ht=0,Xr="identity",lt=C,Jr=r=>z(ht,lt(r)),Kr={code:ht,name:Xr,encode:lt,digest:Jr};var Be={};S(Be,{sha256:()=>Qr,sha512:()=>Yr});var ke=({name:r,code:e,encode:t})=>new Pe(r,e,t),Pe=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?z(this.code,t):t.then(n=>z(this.code,n))}else throw Error("Unknown type, must be binary type")}};var pt=r=>async e=>new Uint8Array(await crypto.subtle.digest(r,e)),Qr=ke({name:"sha2-256",code:18,encode:pt("SHA-256")}),Yr=ke({name:"sha2-512",code:19,encode:pt("SHA-512")});var bt=(r,e)=>{let{bytes:t,version:n}=r;switch(n){case 0:return Zr(t,Ve(r),e||O.encoder);default:return en(t,Ve(r),e||K.encoder)}};var mt=new WeakMap,Ve=r=>{let e=mt.get(r);if(e==null){let t=new Map;return mt.set(r,t),t}return e},pe=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!==ne)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==tn)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=z(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&&ut(e.multihash,n.multihash)}toString(e){return bt(this,e)}toJSON(){return{"/":bt(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||wt(n,o,s.bytes))}else if(t[rn]===!0){let{version:n,multihash:o,code:s}=t,i=ft(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!==ne)throw new Error(`Version 0 CID must use dag-pb (code: ${ne}) block encoding`);return new r(e,t,n,n.bytes)}case 1:{let o=wt(e,t,n.bytes);return new r(e,t,n,o)}default:throw new Error("Invalid version")}}static createV0(e){return r.create(0,ne,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 W(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[c,m]=te(e.subarray(t));return t+=m,c},o=n(),s=ne;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(),f=n(),u=t+f,h=u-i;return{version:o,codec:s,multihashCode:a,digestSize:f,multihashSize:h,size:u}}static parse(e,t){let[n,o]=Wr(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 Ve(s).set(n,e),s}},Wr=(r,e)=>{switch(r[0]){case"Q":{let t=e||O;return[O.prefix,t.decode(`${O.prefix}${r}`)]}case O.prefix:{let t=e||O;return[O.prefix,t.decode(r)]}case K.prefix:{let t=e||K;return[K.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)]}}},Zr=(r,e,t)=>{let{prefix:n}=t;if(n!==O.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},en=(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},ne=112,tn=18,wt=(r,e,t)=>{let n=Y(r),o=n+Y(e),s=new Uint8Array(o+t.byteLength);return Q(r,s,0),Q(e,s,n),s.set(t,o),s},rn=Symbol.for("@ipld/js-cid/CID");var ze={...Fe,...De,...Ce,...Ue,...ve,...Te,...Oe,...Ie,...Ne,...Re},Oo={...Be,...Me};function gt(r,e,t,n){return{name:r,prefix:e,encoder:{name:r,prefix:e,encode:t},decoder:{decode:n}}}var yt=gt("utf8","u",r=>"u"+new TextDecoder("utf8").decode(r),r=>new TextEncoder().encode(r.substring(1))),Ge=gt("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=T(r.length);for(let t=0;t<r.length;t++)e[t]=r.charCodeAt(t);return e}),nn={utf8:yt,"utf-8":yt,hex:ze.base16,latin1:Ge,ascii:Ge,binary:Ge,...ze},be=nn;function U(r,e="utf8"){let t=be[e];if(t==null)throw new Error(`Unsupported encoding "${e}"`);return(e==="utf8"||e==="utf-8")&&globalThis.Buffer!=null&&globalThis.Buffer.from!=null?V(globalThis.Buffer.from(r,"utf-8")):t.decoder.decode(`${t.prefix}${r}`)}var oe=class extends Error{constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.code=t??"ABORT_ERR"}};function xt(r){if(r!=null){if(typeof r[Symbol.iterator]=="function")return r[Symbol.iterator]();if(typeof r[Symbol.asyncIterator]=="function")return r[Symbol.asyncIterator]();if(typeof r.next=="function")return r}throw new Error("argument is not an iterator or iterable")}function Et(r,e,t){let n=t??{},o=xt(r);async function*s(){let i,a=()=>{i?.()};for(e.addEventListener("abort",a);;){let f;try{if(e.aborted){let{abortMessage:h,abortCode:c}=n;throw new oe(h,c)}let u=new Promise((h,c)=>{i=()=>{let{abortMessage:m,abortCode:F}=n;c(new oe(m,F))}});f=await Promise.race([u,o.next()]),i=null}catch(u){e.removeEventListener("abort",a);let h=u.type==="aborted"&&e.aborted;if(h&&n.onAbort!=null&&n.onAbort(r),typeof o.return=="function")try{let c=o.return();c instanceof Promise&&c.catch(m=>{n.onReturnError!=null&&n.onReturnError(m)})}catch(c){n.onReturnError!=null&&n.onReturnError(c)}if(h&&n.returnOnAbort===!0)return;throw u}if(f.done===!0)break;yield f.value}e.removeEventListener("abort",a)}return s()}function on(r){return r[Symbol.asyncIterator]!=null}function sn(r){if(on(r))return(async()=>{for await(let e of r)return e})();for(let e of r)return e}var At=sn;var an=Math.pow(2,7),cn=Math.pow(2,14),fn=Math.pow(2,21),He=Math.pow(2,28),$e=Math.pow(2,35),je=Math.pow(2,42),qe=Math.pow(2,49),d=128,E=127;function G(r){if(r<an)return 1;if(r<cn)return 2;if(r<fn)return 3;if(r<He)return 4;if(r<$e)return 5;if(r<je)return 6;if(r<qe)return 7;if(Number.MAX_SAFE_INTEGER!=null&&r>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return 8}function un(r,e,t=0){switch(G(r)){case 8:e[t++]=r&255|d,r/=128;case 7:e[t++]=r&255|d,r/=128;case 6:e[t++]=r&255|d,r/=128;case 5:e[t++]=r&255|d,r/=128;case 4:e[t++]=r&255|d,r>>>=7;case 3:e[t++]=r&255|d,r>>>=7;case 2:e[t++]=r&255|d,r>>>=7;case 1:{e[t++]=r&255,r>>>=7;break}default:throw new Error("unreachable")}return e}function hn(r,e,t=0){switch(G(r)){case 8:e.set(t++,r&255|d),r/=128;case 7:e.set(t++,r&255|d),r/=128;case 6:e.set(t++,r&255|d),r/=128;case 5:e.set(t++,r&255|d),r/=128;case 4:e.set(t++,r&255|d),r>>>=7;case 3:e.set(t++,r&255|d),r>>>=7;case 2:e.set(t++,r&255|d),r>>>=7;case 1:{e.set(t++,r&255),r>>>=7;break}default:throw new Error("unreachable")}return e}function ln(r,e){let t=r[e],n=0;if(n+=t&E,t<d||(t=r[e+1],n+=(t&E)<<7,t<d)||(t=r[e+2],n+=(t&E)<<14,t<d)||(t=r[e+3],n+=(t&E)<<21,t<d)||(t=r[e+4],n+=(t&E)*He,t<d)||(t=r[e+5],n+=(t&E)*$e,t<d)||(t=r[e+6],n+=(t&E)*je,t<d)||(t=r[e+7],n+=(t&E)*qe,t<d))return n;throw new RangeError("Could not decode varint")}function dn(r,e){let t=r.get(e),n=0;if(n+=t&E,t<d||(t=r.get(e+1),n+=(t&E)<<7,t<d)||(t=r.get(e+2),n+=(t&E)<<14,t<d)||(t=r.get(e+3),n+=(t&E)<<21,t<d)||(t=r.get(e+4),n+=(t&E)*He,t<d)||(t=r.get(e+5),n+=(t&E)*$e,t<d)||(t=r.get(e+6),n+=(t&E)*je,t<d)||(t=r.get(e+7),n+=(t&E)*qe,t<d))return n;throw new RangeError("Could not decode varint")}function Lt(r,e,t=0){return e==null&&(e=T(G(r))),e instanceof Uint8Array?un(r,e,t):hn(r,e,t)}function St(r,e=0){return r instanceof Uint8Array?ln(r,e):dn(r,e)}function me(r){return r[Symbol.asyncIterator]!=null}var we=r=>{let e=G(r),t=T(e);return Lt(r,t),we.bytes=e,t};we.bytes=0;function ye(r,e){e=e??{};let t=e.lengthEncoder??we;function*n(o){let s=t(o.byteLength);s instanceof Uint8Array?yield s:yield*s,o instanceof Uint8Array?yield o:yield*o}return me(r)?async function*(){for await(let o of r)yield*n(o)}():function*(){for(let o of r)yield*n(o)}()}ye.single=(r,e)=>{e=e??{};let t=e.lengthEncoder??we;return new x(t(r.byteLength),r)};var Z=jt(Rt(),1);var bn=8,mn=1024*1024*4,H;(function(r){r[r.LENGTH=0]="LENGTH",r[r.DATA=1]="DATA"})(H||(H={}));var Xe=r=>{let e=St(r);return Xe.bytes=G(e),e};Xe.bytes=0;function se(r,e){let t=new x,n=H.LENGTH,o=-1,s=e?.lengthDecoder??Xe,i=e?.maxLengthLength??bn,a=e?.maxDataLength??mn;function*f(){for(;t.byteLength>0;){if(n===H.LENGTH)try{if(o=s(t),o<0)throw(0,Z.default)(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(o>a)throw(0,Z.default)(new Error("message length too long"),"ERR_MSG_DATA_TOO_LONG");let u=s.bytes;t.consume(u),e?.onLength!=null&&e.onLength(o),n=H.DATA}catch(u){if(u instanceof RangeError){if(t.byteLength>i)throw(0,Z.default)(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw u}if(n===H.DATA){if(t.byteLength<o)break;let u=t.sublist(0,o);t.consume(o),e?.onData!=null&&e.onData(u),yield u,n=H.LENGTH}}}return me(r)?async function*(){for await(let u of r)t.append(u),yield*f();if(t.byteLength>0)throw(0,Z.default)(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}():function*(){for(let u of r)t.append(u),yield*f();if(t.byteLength>0)throw(0,Z.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}})};function Tt(r,...e){if(r==null)throw new Error("Empty pipeline");if(Je(r)){let n=r;r=()=>n.source}else if(It(r)||Ot(r)){let n=r;r=()=>n}let t=[r,...e];if(t.length>1&&Je(t[t.length-1])&&(t[t.length-1]=t[t.length-1].sink),t.length>2)for(let n=1;n<t.length-1;n++)Je(t[n])&&(t[n]=gn(t[n]));return yn(...t)}var yn=(...r)=>{let e;for(;r.length>0;)e=r.shift()(e);return e},Ot=r=>r?.[Symbol.asyncIterator]!=null,It=r=>r?.[Symbol.iterator]!=null,Je=r=>r==null?!1:r.sink!=null&&r.source!=null,gn=r=>e=>{let t=r.sink(e);if(t?.then!=null){let n=P({objectMode:!0});t.then(()=>{n.end()},i=>{n.end(i)});let o,s=r.source;if(Ot(s))o=async function*(){yield*s,n.end()};else if(It(s))o=function*(){yield*s,n.end()};else throw new Error("Unknown duplex source type - must be Iterable or AsyncIterable");return le(n,o())}return r.source};function Nt(r,e="utf8"){let t=be[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 Ct=U(`
3
- `);function $(r){let e=new x(r,Ct);return ye.single(e)}function j(r,e,t){let n=$(e);t?.writeBytes===!0?r.push(n.subarray()):r.push(n)}function Ft(r,e,t){let n=new x;for(let o of e)n.append($(o));t?.writeBytes===!0?r.push(n.subarray()):r.push(n)}async function En(r,e){let t=1,n={[Symbol.asyncIterator]:()=>n,next:async()=>r.next(t)},o=n;e?.signal!=null&&(o=Et(n,e.signal));let s=a=>{t=a},i=await Tt(o,a=>se(a,{onLength:s,maxDataLength:1024}),async a=>At(a));if(i==null||i.length===0)throw new M("no buffer returned","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");if(i.get(i.byteLength-1)!==Ct[0])throw e?.log.error("Invalid mss message - missing newline - %s",i.subarray()),new M("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return i.sublist(0,-1)}async function B(r,e){let t=await En(r,e);return Nt(t.subarray())}async function Mt(r,e,t){e=Array.isArray(e)?[...e]:[e];let{reader:n,writer:o,rest:s,stream:i}=he(r),a=e.shift();if(a==null)throw new Error("At least one protocol must be specified");t?.log.trace('select: write ["%s", "%s"]',D,a);let f=U(D),u=U(a);Ft(o,[f,u],t);let h=await B(n,t);if(t?.log.trace('select: read "%s"',h),h===D&&(h=await B(n,t),t?.log.trace('select: read "%s"',h)),h===a)return s(),{stream:i,protocol:a};for(let c of e){t?.log.trace('select: write "%s"',c),j(o,U(c),t);let m=await B(n,t);if(t?.log.trace('select: read "%s" for "%s"',m,c),m===c)return s(),{stream:i,protocol:c}}throw s(),new M("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}function Pt(r,e){let t=P(),n=!1;return{stream:{sink:async o=>{await r.sink(async function*(){let s=!0;for await(let i of le(o,t))if(s){s=!1,n=!0,t.end();let a=U(D),f=U(e),u=new x($(a),$(f));i.length>0&&u.append(i),yield*u}else yield i}())},source:async function*(){n||t.push(new Uint8Array);let o=fe(r.source),s=await B(o);if(s===D&&(s=await B(o)),s!==e)throw new M("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL");for await(let i of o)yield*i}()},protocol:e}}async function kt(r,e,t){e=Array.isArray(e)?e:[e];let{writer:n,reader:o,rest:s,stream:i}=he(r);for(;;){let a=await B(o,t);if(t?.log.trace('read "%s"',a),a===D){t?.log.trace('respond with "%s" for "%s"',D,a),j(n,U(D),t);continue}if(e.includes(a))return j(n,U(a),t),t?.log.trace('respond with "%s" for "%s"',a,a),s(),{stream:i,protocol:a};if(a==="ls"){j(n,new x(...e.map(f=>$(U(f)))),t),t?.log.trace('respond with "%s" for %s',e,a);continue}j(n,U("na"),t),t?.log('respond with "na" for "%s"',a)}}return qt(An);})();
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);})();
4
14
  return Libp2PMultistreamSelect}));
@@ -1,6 +1,5 @@
1
- import { Uint8ArrayList } from 'uint8arraylist';
2
- import type { ByteArrayInit, ByteListInit, ProtocolStream } from './index.js';
3
- import type { Duplex, Source } from 'it-stream-types';
1
+ import type { MultistreamSelectInit, ProtocolStream } from './index.js';
2
+ import type { Duplex } from 'it-stream-types';
4
3
  /**
5
4
  * Handle multistream protocol selections for the given list of protocols.
6
5
  *
@@ -47,6 +46,5 @@ import type { Duplex, Source } from 'it-stream-types';
47
46
  * })
48
47
  * ```
49
48
  */
50
- export declare function handle(stream: Duplex<Source<Uint8Array>, Source<Uint8Array>>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>;
51
- export declare function handle(stream: Duplex<Source<Uint8ArrayList | Uint8Array>, Source<Uint8ArrayList | Uint8Array>>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>;
49
+ export declare function handle<Stream extends Duplex<any, any, any>>(stream: Stream, protocols: string | string[], options: MultistreamSelectInit): Promise<ProtocolStream<Stream>>;
52
50
  //# sourceMappingURL=handle.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAyB,cAAc,EAAE,MAAM,YAAY,CAAA;AACpG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;AAChL,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAA"}
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,34 +1,83 @@
1
- import { handshake } from 'it-handshake';
1
+ import { encode } from 'it-length-prefixed';
2
+ import { lpStream } from 'it-length-prefixed-stream';
2
3
  import { Uint8ArrayList } from 'uint8arraylist';
3
4
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
- import { PROTOCOL_ID } from './constants.js';
5
+ import { MAX_PROTOCOL_LENGTH, PROTOCOL_ID } from './constants.js';
5
6
  import * as multistream from './multistream.js';
7
+ /**
8
+ * Handle multistream protocol selections for the given list of protocols.
9
+ *
10
+ * Note that after a protocol is handled `listener` can no longer be used.
11
+ *
12
+ * @param stream - A duplex iterable stream to listen on
13
+ * @param protocols - A list of protocols (or single protocol) that this listener is able to speak.
14
+ * @param options - an options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
15
+ * @returns A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`
16
+ * @example
17
+ *
18
+ * ```js
19
+ * import { pipe } from 'it-pipe'
20
+ * import * as mss from '@libp2p/multistream-select'
21
+ * import { Mplex } from '@libp2p/mplex'
22
+ *
23
+ * const muxer = new Mplex({
24
+ * async onStream (muxedStream) {
25
+ * // mss.handle(handledProtocols)
26
+ * // Returns selected stream and protocol
27
+ * const { stream, protocol } = await mss.handle(muxedStream, [
28
+ * '/ipfs-dht/1.0.0',
29
+ * '/ipfs-bitswap/1.0.0'
30
+ * ])
31
+ *
32
+ * // Typically here we'd call the handler function that was registered in
33
+ * // libp2p for the given protocol:
34
+ * // e.g. handlers[protocol].handler(stream)
35
+ * //
36
+ * // If protocol was /ipfs-dht/1.0.0 it might do something like this:
37
+ * // try {
38
+ * // await pipe(
39
+ * // dhtStream,
40
+ * // source => (async function * () {
41
+ * // for await (const chunk of source)
42
+ * // // Incoming DHT data -> process and yield to respond
43
+ * // })(),
44
+ * // dhtStream
45
+ * // )
46
+ * // } catch (err) {
47
+ * // // Error in stream
48
+ * // }
49
+ * }
50
+ * })
51
+ * ```
52
+ */
6
53
  export async function handle(stream, protocols, options) {
7
54
  protocols = Array.isArray(protocols) ? protocols : [protocols];
8
- const { writer, reader, rest, stream: shakeStream } = handshake(stream);
55
+ const lp = lpStream(stream, {
56
+ maxDataLength: MAX_PROTOCOL_LENGTH
57
+ });
9
58
  while (true) {
10
- const protocol = await multistream.readString(reader, options);
11
- options?.log.trace('read "%s"', protocol);
59
+ options.log.trace('handle - available protocols %s', protocols);
60
+ const protocol = await multistream.readString(lp, options);
61
+ options.log.trace('read "%s"', protocol);
12
62
  if (protocol === PROTOCOL_ID) {
13
- options?.log.trace('respond with "%s" for "%s"', PROTOCOL_ID, protocol);
14
- multistream.write(writer, uint8ArrayFromString(PROTOCOL_ID), options);
63
+ options.log.trace('respond with "%s" for "%s"', PROTOCOL_ID, protocol);
64
+ await multistream.write(lp, uint8ArrayFromString(`${PROTOCOL_ID}\n`), options);
15
65
  continue;
16
66
  }
17
67
  if (protocols.includes(protocol)) {
18
- multistream.write(writer, uint8ArrayFromString(protocol), options);
19
- options?.log.trace('respond with "%s" for "%s"', protocol, protocol);
20
- rest();
21
- return { stream: shakeStream, protocol };
68
+ options.log.trace('respond with "%s" for "%s"', protocol, protocol);
69
+ await multistream.write(lp, uint8ArrayFromString(`${protocol}\n`), options);
70
+ return { stream: lp.unwrap(), protocol };
22
71
  }
23
72
  if (protocol === 'ls') {
24
73
  // <varint-msg-len><varint-proto-name-len><proto-name>\n<varint-proto-name-len><proto-name>\n\n
25
- multistream.write(writer, new Uint8ArrayList(...protocols.map(p => multistream.encode(uint8ArrayFromString(p)))), options);
26
- // multistream.writeAll(writer, protocols.map(p => uint8ArrayFromString(p)))
27
- options?.log.trace('respond with "%s" for %s', protocols, protocol);
74
+ const protos = new Uint8ArrayList(...protocols.map(p => encode.single(uint8ArrayFromString(`${p}\n`))), uint8ArrayFromString('\n'));
75
+ await multistream.write(lp, protos, options);
76
+ options.log.trace('respond with "%s" for %s', protocols, protocol);
28
77
  continue;
29
78
  }
30
- multistream.write(writer, uint8ArrayFromString('na'), options);
31
- options?.log('respond with "na" for "%s"', protocol);
79
+ options.log('respond with "na" for "%s"', protocol);
80
+ await multistream.write(lp, uint8ArrayFromString('na\n'), options);
32
81
  }
33
82
  }
34
83
  //# sourceMappingURL=handle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handle.js","sourceRoot":"","sources":["../../src/handle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAC5C,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAoD/C,MAAM,CAAC,KAAK,UAAU,MAAM,CAAE,MAAW,EAAE,SAA4B,EAAE,OAA+B;IACtG,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;IAC9D,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;IAEvE,OAAO,IAAI,EAAE;QACX,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC9D,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAA;QAEzC,IAAI,QAAQ,KAAK,WAAW,EAAE;YAC5B,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAA;YACvE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAA;YACrE,SAAQ;SACT;QAED,IAAI,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAChC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;YAClE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,4BAA4B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;YACpE,IAAI,EAAE,CAAA;YACN,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;SACzC;QAED,IAAI,QAAQ,KAAK,IAAI,EAAE;YACrB,+FAA+F;YAC/F,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,cAAc,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;YAC1H,4EAA4E;YAC5E,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,0BAA0B,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAA;YACnE,SAAQ;SACT;QAED,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAA;QAC9D,OAAO,EAAE,GAAG,CAAC,4BAA4B,EAAE,QAAQ,CAAC,CAAA;KACrD;AACH,CAAC"}
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"}
@@ -21,20 +21,12 @@
21
21
  */
22
22
  import { PROTOCOL_ID } from './constants.js';
23
23
  import type { AbortOptions, LoggerOptions } from '@libp2p/interface';
24
- import type { Duplex, Source } from 'it-stream-types';
25
24
  export { PROTOCOL_ID };
26
- export interface ProtocolStream<TSource, TSink = TSource, RSink = Promise<void>> {
27
- stream: Duplex<AsyncGenerator<TSource>, Source<TSink>, RSink>;
25
+ export interface ProtocolStream<Stream> {
26
+ stream: Stream;
28
27
  protocol: string;
29
28
  }
30
- export interface ByteArrayInit extends AbortOptions, LoggerOptions {
31
- writeBytes: true;
32
- }
33
- export interface ByteListInit extends AbortOptions, LoggerOptions {
34
- writeBytes?: false;
35
- }
36
29
  export interface MultistreamSelectInit extends AbortOptions, LoggerOptions {
37
- writeBytes?: boolean;
38
30
  }
39
31
  export { select, lazySelect } from './select.js';
40
32
  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;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,CAAA;AAEtB,MAAM,WAAW,cAAc,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7E,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAA;IAC7D,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,aAAc,SAAQ,YAAY,EAAE,aAAa;IAChE,UAAU,EAAE,IAAI,CAAA;CACjB;AAED,MAAM,WAAW,YAAa,SAAQ,YAAY,EAAE,aAAa;IAC/D,UAAU,CAAC,EAAE,KAAK,CAAA;CACnB;AAED,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,aAAa;IACxE,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;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;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 +1 @@
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;AAmBtB,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;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,17 +1,22 @@
1
- import { Uint8ArrayList } from 'uint8arraylist';
1
+ import { type Uint8ArrayList } from 'uint8arraylist';
2
2
  import type { MultistreamSelectInit } from '.';
3
3
  import type { AbortOptions, LoggerOptions } from '@libp2p/interface';
4
- import type { Pushable } from 'it-pushable';
5
- import type { Reader } from 'it-reader';
6
- export declare function encode(buffer: Uint8Array | Uint8ArrayList): Uint8ArrayList;
4
+ import type { LengthPrefixedStream } from 'it-length-prefixed-stream';
5
+ import type { Duplex, Source } from 'it-stream-types';
7
6
  /**
8
7
  * `write` encodes and writes a single buffer
9
8
  */
10
- export declare function write(writer: Pushable<any>, buffer: Uint8Array | Uint8ArrayList, options?: MultistreamSelectInit): void;
9
+ export declare function write(writer: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array>, Source<Uint8Array>>>, buffer: Uint8Array | Uint8ArrayList, options?: MultistreamSelectInit): Promise<void>;
11
10
  /**
12
11
  * `writeAll` behaves like `write`, except it encodes an array of items as a single write
13
12
  */
14
- export declare function writeAll(writer: Pushable<any>, buffers: Uint8Array[], options?: MultistreamSelectInit): void;
15
- export declare function read(reader: Reader, options?: AbortOptions & LoggerOptions): Promise<Uint8ArrayList>;
16
- export declare function readString(reader: Reader, options?: AbortOptions & LoggerOptions): Promise<string>;
13
+ export declare function writeAll(writer: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array>, Source<Uint8Array>>>, buffers: Uint8Array[], options?: MultistreamSelectInit): Promise<void>;
14
+ /**
15
+ * Read a length-prefixed buffer from the passed stream, stripping the final newline character
16
+ */
17
+ export declare function read(reader: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>, Source<Uint8Array>>>, options?: AbortOptions & LoggerOptions): Promise<Uint8ArrayList>;
18
+ /**
19
+ * Read a length-prefixed string from the passed stream, stripping the final newline character
20
+ */
21
+ export declare function readString(reader: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>, Source<Uint8Array>>>, options?: AbortOptions & LoggerOptions): Promise<string>;
17
22
  //# sourceMappingURL=multistream.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"multistream.d.ts","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,GAAG,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAKvC,wBAAgB,MAAM,CAAE,MAAM,EAAE,UAAU,GAAG,cAAc,GAAG,cAAc,CAI3E;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,cAAc,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAQxH;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAE,MAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAY7G;AAED,wBAAsB,IAAI,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CAoC3G;AAED,wBAAsB,UAAU,CAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAIzG"}
1
+ {"version":3,"file":"multistream.d.ts","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAGpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,GAAG,CAAA;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAA;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAIrD;;GAEG;AACH,wBAAsB,KAAK,CAAE,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,cAAc,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEtM;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAE,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE3L;AAED;;GAEG;AACH,wBAAsB,IAAI,CAAE,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CASlM;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAE,MAAM,EAAE,oBAAoB,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,GAAG,cAAc,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhM"}
@@ -1,70 +1,34 @@
1
1
  import { CodeError } from '@libp2p/interface/errors';
2
- import { abortableSource } from 'abortable-iterator';
3
- import first from 'it-first';
4
- import * as lp from 'it-length-prefixed';
5
- import { pipe } from 'it-pipe';
6
- import { Uint8ArrayList } from 'uint8arraylist';
2
+ import {} from 'uint8arraylist';
7
3
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
8
4
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
9
- import { MAX_PROTOCOL_LENGTH } from './constants.js';
10
5
  const NewLine = uint8ArrayFromString('\n');
11
- export function encode(buffer) {
12
- const list = new Uint8ArrayList(buffer, NewLine);
13
- return lp.encode.single(list);
14
- }
15
6
  /**
16
7
  * `write` encodes and writes a single buffer
17
8
  */
18
- export function write(writer, buffer, options) {
19
- const encoded = encode(buffer);
20
- if (options?.writeBytes === true) {
21
- writer.push(encoded.subarray());
22
- }
23
- else {
24
- writer.push(encoded);
25
- }
9
+ export async function write(writer, buffer, options) {
10
+ await writer.write(buffer, options);
26
11
  }
27
12
  /**
28
13
  * `writeAll` behaves like `write`, except it encodes an array of items as a single write
29
14
  */
30
- export function writeAll(writer, buffers, options) {
31
- const list = new Uint8ArrayList();
32
- for (const buf of buffers) {
33
- list.append(encode(buf));
34
- }
35
- if (options?.writeBytes === true) {
36
- writer.push(list.subarray());
37
- }
38
- else {
39
- writer.push(list);
40
- }
15
+ export async function writeAll(writer, buffers, options) {
16
+ await writer.writeV(buffers, options);
41
17
  }
18
+ /**
19
+ * Read a length-prefixed buffer from the passed stream, stripping the final newline character
20
+ */
42
21
  export async function read(reader, options) {
43
- let byteLength = 1; // Read single byte chunks until the length is known
44
- const varByteSource = {
45
- [Symbol.asyncIterator]: () => varByteSource,
46
- next: async () => reader.next(byteLength)
47
- };
48
- let input = varByteSource;
49
- // If we have been passed an abort signal, wrap the input source in an abortable
50
- // iterator that will throw if the operation is aborted
51
- if (options?.signal != null) {
52
- input = abortableSource(varByteSource, options.signal);
53
- }
54
- // Once the length has been parsed, read chunk for that length
55
- const onLength = (l) => {
56
- byteLength = l;
57
- };
58
- const buf = await pipe(input, (source) => lp.decode(source, { onLength, maxDataLength: MAX_PROTOCOL_LENGTH }), async (source) => first(source));
59
- if (buf == null || buf.length === 0) {
60
- throw new CodeError('no buffer returned', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE');
61
- }
62
- if (buf.get(buf.byteLength - 1) !== NewLine[0]) {
63
- options?.log.error('Invalid mss message - missing newline - %s', buf.subarray());
22
+ const buf = await reader.read(options);
23
+ if (buf.byteLength === 0 || buf.get(buf.byteLength - 1) !== NewLine[0]) {
24
+ options?.log.error('Invalid mss message - missing newline', buf);
64
25
  throw new CodeError('missing newline', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE');
65
26
  }
66
27
  return buf.sublist(0, -1); // Remove newline
67
28
  }
29
+ /**
30
+ * Read a length-prefixed string from the passed stream, stripping the final newline character
31
+ */
68
32
  export async function readString(reader, options) {
69
33
  const buf = await read(reader, options);
70
34
  return uint8ArrayToString(buf.subarray());
@@ -1 +1 @@
1
- {"version":3,"file":"multistream.js","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"multistream.js","sourceRoot":"","sources":["../../src/multistream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AACpD,OAAO,EAAuB,MAAM,gBAAgB,CAAA;AACpD,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAMtE,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAA;AAE1C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAE,MAAoF,EAAE,MAAmC,EAAE,OAA+B;IACrL,MAAM,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAE,MAAoF,EAAE,OAAqB,EAAE,OAA+B;IAC1K,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAE,MAAqG,EAAE,OAAsC;IACvK,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEtC,IAAI,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE;QACtE,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAA;QAChE,MAAM,IAAI,SAAS,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAA;KACjF;IAED,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,iBAAiB;AAC7C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAE,MAAqG,EAAE,OAAsC;IAC7K,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAEvC,OAAO,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAA;AAC3C,CAAC"}
@@ -1,6 +1,5 @@
1
- import { Uint8ArrayList } from 'uint8arraylist';
2
- import type { ByteArrayInit, ByteListInit, ProtocolStream } from './index.js';
3
- import type { Duplex, Source } from 'it-stream-types';
1
+ import type { MultistreamSelectInit, ProtocolStream } from './index.js';
2
+ import type { Duplex } from 'it-stream-types';
4
3
  /**
5
4
  * Negotiate a protocol to use from a list of protocols.
6
5
  *
@@ -44,8 +43,7 @@ import type { Duplex, Source } from 'it-stream-types';
44
43
  * // }
45
44
  * ```
46
45
  */
47
- export declare function select(stream: Duplex<AsyncGenerator<Uint8Array>, Source<Uint8Array>>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>;
48
- export declare function select(stream: Duplex<AsyncGenerator<Uint8ArrayList | Uint8Array>, Source<Uint8ArrayList | Uint8Array>>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>;
46
+ export declare function select<Stream extends Duplex<any, any, any>>(stream: Stream, protocols: string | string[], options: MultistreamSelectInit): Promise<ProtocolStream<Stream>>;
49
47
  /**
50
48
  * Lazily negotiates a protocol.
51
49
  *
@@ -54,6 +52,5 @@ export declare function select(stream: Duplex<AsyncGenerator<Uint8ArrayList | Ui
54
52
  *
55
53
  * Use when it is known that the receiver supports the desired protocol.
56
54
  */
57
- export declare function lazySelect(stream: Duplex<Source<Uint8Array>, Source<Uint8Array>>, protocol: string): ProtocolStream<Uint8Array>;
58
- export declare function lazySelect(stream: Duplex<Source<Uint8ArrayList | Uint8Array>, Source<Uint8ArrayList | Uint8Array>>, protocol: string): ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>;
55
+ export declare function lazySelect<Stream extends Duplex<any, any, any>>(stream: Stream, protocol: string, options: MultistreamSelectInit): ProtocolStream<Stream>;
59
56
  //# sourceMappingURL=select.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/select.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAyB,cAAc,EAAE,MAAM,YAAY,CAAA;AACpG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAA;AACxL,wBAAsB,MAAM,CAAE,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAC,CAAA;AAgD3P;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,UAAU,CAAC,CAAA;AACjI,wBAAgB,UAAU,CAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,cAAc,EAAE,cAAc,GAAG,UAAU,CAAC,CAAA"}
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,93 +1,133 @@
1
1
  import { CodeError } from '@libp2p/interface/errors';
2
- import { handshake } from 'it-handshake';
3
- import merge from 'it-merge';
4
- import { pushable } from 'it-pushable';
5
- import { reader } from 'it-reader';
6
- import { Uint8ArrayList } from 'uint8arraylist';
2
+ import { lpStream } from 'it-length-prefixed-stream';
7
3
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
4
+ import { MAX_PROTOCOL_LENGTH } from './constants.js';
8
5
  import * as multistream from './multistream.js';
9
6
  import { PROTOCOL_ID } from './index.js';
7
+ /**
8
+ * Negotiate a protocol to use from a list of protocols.
9
+ *
10
+ * @param stream - A duplex iterable stream to dial on
11
+ * @param protocols - A list of protocols (or single protocol) to negotiate with. Protocols are attempted in order until a match is made.
12
+ * @param options - An options object containing an AbortSignal and an optional boolean `writeBytes` - if this is true, `Uint8Array`s will be written into `duplex`, otherwise `Uint8ArrayList`s will
13
+ * @returns A stream for the selected protocol and the protocol that was selected from the list of protocols provided to `select`.
14
+ * @example
15
+ *
16
+ * ```js
17
+ * import { pipe } from 'it-pipe'
18
+ * import * as mss from '@libp2p/multistream-select'
19
+ * import { Mplex } from '@libp2p/mplex'
20
+ *
21
+ * const muxer = new Mplex()
22
+ * const muxedStream = muxer.newStream()
23
+ *
24
+ * // mss.select(protocol(s))
25
+ * // Select from one of the passed protocols (in priority order)
26
+ * // Returns selected stream and protocol
27
+ * const { stream: dhtStream, protocol } = await mss.select(muxedStream, [
28
+ * // This might just be different versions of DHT, but could be different impls
29
+ * '/ipfs-dht/2.0.0', // Most of the time this will probably just be one item.
30
+ * '/ipfs-dht/1.0.0'
31
+ * ])
32
+ *
33
+ * // Typically this stream will be passed back to the caller of libp2p.dialProtocol
34
+ * //
35
+ * // ...it might then do something like this:
36
+ * // try {
37
+ * // await pipe(
38
+ * // [uint8ArrayFromString('Some DHT data')]
39
+ * // dhtStream,
40
+ * // async source => {
41
+ * // for await (const chunk of source)
42
+ * // // DHT response data
43
+ * // }
44
+ * // )
45
+ * // } catch (err) {
46
+ * // // Error in stream
47
+ * // }
48
+ * ```
49
+ */
10
50
  export async function select(stream, protocols, options) {
11
51
  protocols = Array.isArray(protocols) ? [...protocols] : [protocols];
12
- const { reader, writer, rest, stream: shakeStream } = handshake(stream);
52
+ const lp = lpStream(stream, {
53
+ maxDataLength: MAX_PROTOCOL_LENGTH
54
+ });
13
55
  const protocol = protocols.shift();
14
56
  if (protocol == null) {
15
57
  throw new Error('At least one protocol must be specified');
16
58
  }
17
59
  options?.log.trace('select: write ["%s", "%s"]', PROTOCOL_ID, protocol);
18
- const p1 = uint8ArrayFromString(PROTOCOL_ID);
19
- const p2 = uint8ArrayFromString(protocol);
20
- multistream.writeAll(writer, [p1, p2], options);
21
- let response = await multistream.readString(reader, options);
60
+ const p1 = uint8ArrayFromString(`${PROTOCOL_ID}\n`);
61
+ const p2 = uint8ArrayFromString(`${protocol}\n`);
62
+ await multistream.writeAll(lp, [p1, p2], options);
63
+ options?.log.trace('select: reading multistream-select header');
64
+ let response = await multistream.readString(lp, options);
22
65
  options?.log.trace('select: read "%s"', response);
23
66
  // Read the protocol response if we got the protocolId in return
24
67
  if (response === PROTOCOL_ID) {
25
- response = await multistream.readString(reader, options);
68
+ options?.log.trace('select: reading protocol response');
69
+ response = await multistream.readString(lp, options);
26
70
  options?.log.trace('select: read "%s"', response);
27
71
  }
28
72
  // We're done
29
73
  if (response === protocol) {
30
- rest();
31
- return { stream: shakeStream, protocol };
74
+ return { stream: lp.unwrap(), protocol };
32
75
  }
33
76
  // We haven't gotten a valid ack, try the other protocols
34
77
  for (const protocol of protocols) {
35
78
  options?.log.trace('select: write "%s"', protocol);
36
- multistream.write(writer, uint8ArrayFromString(protocol), options);
37
- const response = await multistream.readString(reader, options);
79
+ await multistream.write(lp, uint8ArrayFromString(`${protocol}\n`), options);
80
+ options?.log.trace('select: reading protocol response');
81
+ const response = await multistream.readString(lp, options);
38
82
  options?.log.trace('select: read "%s" for "%s"', response, protocol);
39
83
  if (response === protocol) {
40
- rest(); // End our writer so others can start writing to stream
41
- return { stream: shakeStream, protocol };
84
+ return { stream: lp.unwrap(), protocol };
42
85
  }
43
86
  }
44
- rest();
45
87
  throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL');
46
88
  }
47
- export function lazySelect(stream, protocol) {
48
- // This is a signal to write the multistream headers if the consumer tries to
49
- // read from the source
50
- const negotiateTrigger = pushable();
51
- let negotiated = false;
89
+ /**
90
+ * Lazily negotiates a protocol.
91
+ *
92
+ * It *does not* block writes waiting for the other end to respond. Instead, it
93
+ * simply assumes the negotiation went successfully and starts writing data.
94
+ *
95
+ * Use when it is known that the receiver supports the desired protocol.
96
+ */
97
+ export function lazySelect(stream, protocol, options) {
98
+ const originalSink = stream.sink.bind(stream);
99
+ const originalSource = stream.source;
100
+ const lp = lpStream({
101
+ sink: originalSink,
102
+ source: originalSource
103
+ }, {
104
+ maxDataLength: MAX_PROTOCOL_LENGTH
105
+ });
106
+ 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);
114
+ };
115
+ stream.source = (async function* () {
116
+ options?.log.trace('lazy: reading multistream select header');
117
+ let response = await multistream.readString(lp, options);
118
+ options?.log.trace('lazy: read multistream select header "%s"', response);
119
+ if (response === PROTOCOL_ID) {
120
+ response = await multistream.readString(lp, options);
121
+ }
122
+ options?.log.trace('lazy: read protocol "%s", expecting "%s"', response, protocol);
123
+ if (response !== protocol) {
124
+ throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL');
125
+ }
126
+ options?.log.trace('lazy: reading rest of "%s" stream', protocol);
127
+ yield* lp.unwrap().source;
128
+ })();
52
129
  return {
53
- stream: {
54
- sink: async (source) => {
55
- await stream.sink((async function* () {
56
- let first = true;
57
- for await (const chunk of merge(source, negotiateTrigger)) {
58
- if (first) {
59
- first = false;
60
- negotiated = true;
61
- negotiateTrigger.end();
62
- const p1 = uint8ArrayFromString(PROTOCOL_ID);
63
- const p2 = uint8ArrayFromString(protocol);
64
- const list = new Uint8ArrayList(multistream.encode(p1), multistream.encode(p2));
65
- if (chunk.length > 0)
66
- list.append(chunk);
67
- yield* list;
68
- }
69
- else {
70
- yield chunk;
71
- }
72
- }
73
- })());
74
- },
75
- source: (async function* () {
76
- if (!negotiated)
77
- negotiateTrigger.push(new Uint8Array());
78
- const byteReader = reader(stream.source);
79
- let response = await multistream.readString(byteReader);
80
- if (response === PROTOCOL_ID) {
81
- response = await multistream.readString(byteReader);
82
- }
83
- if (response !== protocol) {
84
- throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL');
85
- }
86
- for await (const chunk of byteReader) {
87
- yield* chunk;
88
- }
89
- })()
90
- },
130
+ stream,
91
131
  protocol
92
132
  };
93
133
  }
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/multistream-select",
3
- "version": "4.0.6-9ad8f8686",
3
+ "version": "4.0.6-adea7bbbf",
4
4
  "description": "JavaScript implementation of multistream-select",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/master/packages/multistream-select#readme",
@@ -53,26 +53,20 @@
53
53
  "test:electron-main": "aegir test -t electron-main"
54
54
  },
55
55
  "dependencies": {
56
- "@libp2p/interface": "0.1.6-9ad8f8686",
57
- "abortable-iterator": "^5.0.1",
58
- "it-first": "^3.0.3",
59
- "it-handshake": "^4.1.3",
56
+ "@libp2p/interface": "0.1.6-adea7bbbf",
60
57
  "it-length-prefixed": "^9.0.3",
61
- "it-merge": "^3.0.0",
58
+ "it-length-prefixed-stream": "^1.1.1",
62
59
  "it-pipe": "^3.0.1",
63
- "it-pushable": "^3.2.1",
64
- "it-reader": "^6.0.1",
65
60
  "it-stream-types": "^2.0.1",
66
- "uint8-varint": "^2.0.0",
67
61
  "uint8arraylist": "^2.4.3",
68
62
  "uint8arrays": "^4.0.6"
69
63
  },
70
64
  "devDependencies": {
71
- "@libp2p/logger": "3.1.0-9ad8f8686",
65
+ "@libp2p/logger": "3.1.0-adea7bbbf",
72
66
  "aegir": "^41.0.2",
73
67
  "iso-random-stream": "^2.0.2",
74
68
  "it-all": "^3.0.3",
75
- "it-map": "^3.0.3",
69
+ "it-drain": "^3.0.5",
76
70
  "it-pair": "^2.0.6",
77
71
  "p-timeout": "^6.0.0"
78
72
  }
package/src/handle.ts CHANGED
@@ -1,10 +1,11 @@
1
- import { handshake } from 'it-handshake'
1
+ import { encode } from 'it-length-prefixed'
2
+ import { lpStream } from 'it-length-prefixed-stream'
2
3
  import { Uint8ArrayList } from 'uint8arraylist'
3
4
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
4
- import { PROTOCOL_ID } from './constants.js'
5
+ import { MAX_PROTOCOL_LENGTH, PROTOCOL_ID } from './constants.js'
5
6
  import * as multistream from './multistream.js'
6
- import type { ByteArrayInit, ByteListInit, MultistreamSelectInit, ProtocolStream } from './index.js'
7
- import type { Duplex, Source } from 'it-stream-types'
7
+ import type { MultistreamSelectInit, ProtocolStream } from './index.js'
8
+ import type { Duplex } from 'it-stream-types'
8
9
 
9
10
  /**
10
11
  * Handle multistream protocol selections for the given list of protocols.
@@ -52,38 +53,43 @@ import type { Duplex, Source } from 'it-stream-types'
52
53
  * })
53
54
  * ```
54
55
  */
55
- export async function handle (stream: Duplex<Source<Uint8Array>, Source<Uint8Array>>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>
56
- export async function handle (stream: Duplex<Source<Uint8ArrayList | Uint8Array>, Source<Uint8ArrayList | Uint8Array>>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>
57
- export async function handle (stream: any, protocols: string | string[], options?: MultistreamSelectInit): Promise<ProtocolStream<any>> {
56
+ export async function handle <Stream extends Duplex<any, any, any>> (stream: Stream, protocols: string | string[], options: MultistreamSelectInit): Promise<ProtocolStream<Stream>> {
58
57
  protocols = Array.isArray(protocols) ? protocols : [protocols]
59
- const { writer, reader, rest, stream: shakeStream } = handshake(stream)
58
+ const lp = lpStream(stream, {
59
+ maxDataLength: MAX_PROTOCOL_LENGTH
60
+ })
60
61
 
61
62
  while (true) {
62
- const protocol = await multistream.readString(reader, options)
63
- options?.log.trace('read "%s"', protocol)
63
+ options.log.trace('handle - available protocols %s', protocols)
64
+ const protocol = await multistream.readString(lp, options)
65
+ options.log.trace('read "%s"', protocol)
64
66
 
65
67
  if (protocol === PROTOCOL_ID) {
66
- options?.log.trace('respond with "%s" for "%s"', PROTOCOL_ID, protocol)
67
- multistream.write(writer, uint8ArrayFromString(PROTOCOL_ID), options)
68
+ options.log.trace('respond with "%s" for "%s"', PROTOCOL_ID, protocol)
69
+ await multistream.write(lp, uint8ArrayFromString(`${PROTOCOL_ID}\n`), options)
68
70
  continue
69
71
  }
70
72
 
71
73
  if (protocols.includes(protocol)) {
72
- multistream.write(writer, uint8ArrayFromString(protocol), options)
73
- options?.log.trace('respond with "%s" for "%s"', protocol, protocol)
74
- rest()
75
- return { stream: shakeStream, protocol }
74
+ options.log.trace('respond with "%s" for "%s"', protocol, protocol)
75
+ await multistream.write(lp, uint8ArrayFromString(`${protocol}\n`), options)
76
+
77
+ return { stream: lp.unwrap(), protocol }
76
78
  }
77
79
 
78
80
  if (protocol === 'ls') {
79
81
  // <varint-msg-len><varint-proto-name-len><proto-name>\n<varint-proto-name-len><proto-name>\n\n
80
- multistream.write(writer, new Uint8ArrayList(...protocols.map(p => multistream.encode(uint8ArrayFromString(p)))), options)
81
- // multistream.writeAll(writer, protocols.map(p => uint8ArrayFromString(p)))
82
- options?.log.trace('respond with "%s" for %s', protocols, protocol)
82
+ const protos = new Uint8ArrayList(
83
+ ...protocols.map(p => encode.single(uint8ArrayFromString(`${p}\n`))),
84
+ uint8ArrayFromString('\n')
85
+ )
86
+
87
+ await multistream.write(lp, protos, options)
88
+ options.log.trace('respond with "%s" for %s', protocols, protocol)
83
89
  continue
84
90
  }
85
91
 
86
- multistream.write(writer, uint8ArrayFromString('na'), options)
87
- options?.log('respond with "na" for "%s"', protocol)
92
+ options.log('respond with "na" for "%s"', protocol)
93
+ await multistream.write(lp, uint8ArrayFromString('na\n'), options)
88
94
  }
89
95
  }
package/src/index.ts CHANGED
@@ -22,25 +22,16 @@
22
22
 
23
23
  import { PROTOCOL_ID } from './constants.js'
24
24
  import type { AbortOptions, LoggerOptions } from '@libp2p/interface'
25
- import type { Duplex, Source } from 'it-stream-types'
26
25
 
27
26
  export { PROTOCOL_ID }
28
27
 
29
- export interface ProtocolStream<TSource, TSink = TSource, RSink = Promise<void>> {
30
- stream: Duplex<AsyncGenerator<TSource>, Source<TSink>, RSink>
28
+ export interface ProtocolStream<Stream> {
29
+ stream: Stream
31
30
  protocol: string
32
31
  }
33
32
 
34
- export interface ByteArrayInit extends AbortOptions, LoggerOptions {
35
- writeBytes: true
36
- }
37
-
38
- export interface ByteListInit extends AbortOptions, LoggerOptions {
39
- writeBytes?: false
40
- }
41
-
42
33
  export interface MultistreamSelectInit extends AbortOptions, LoggerOptions {
43
- writeBytes?: boolean
34
+
44
35
  }
45
36
 
46
37
  export { select, lazySelect } from './select.js'
@@ -1,95 +1,46 @@
1
1
  import { CodeError } from '@libp2p/interface/errors'
2
- import { abortableSource } from 'abortable-iterator'
3
- import first from 'it-first'
4
- import * as lp from 'it-length-prefixed'
5
- import { pipe } from 'it-pipe'
6
- import { Uint8ArrayList } from 'uint8arraylist'
2
+ import { type Uint8ArrayList } from 'uint8arraylist'
7
3
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
8
4
  import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
9
- import { MAX_PROTOCOL_LENGTH } from './constants.js'
10
5
  import type { MultistreamSelectInit } from '.'
11
6
  import type { AbortOptions, LoggerOptions } from '@libp2p/interface'
12
- import type { Pushable } from 'it-pushable'
13
- import type { Reader } from 'it-reader'
14
- import type { Source } from 'it-stream-types'
7
+ import type { LengthPrefixedStream } from 'it-length-prefixed-stream'
8
+ import type { Duplex, Source } from 'it-stream-types'
15
9
 
16
10
  const NewLine = uint8ArrayFromString('\n')
17
11
 
18
- export function encode (buffer: Uint8Array | Uint8ArrayList): Uint8ArrayList {
19
- const list = new Uint8ArrayList(buffer, NewLine)
20
-
21
- return lp.encode.single(list)
22
- }
23
-
24
12
  /**
25
13
  * `write` encodes and writes a single buffer
26
14
  */
27
- export function write (writer: Pushable<any>, buffer: Uint8Array | Uint8ArrayList, options?: MultistreamSelectInit): void {
28
- const encoded = encode(buffer)
29
-
30
- if (options?.writeBytes === true) {
31
- writer.push(encoded.subarray())
32
- } else {
33
- writer.push(encoded)
34
- }
15
+ export async function write (writer: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array>, Source<Uint8Array>>>, buffer: Uint8Array | Uint8ArrayList, options?: MultistreamSelectInit): Promise<void> {
16
+ await writer.write(buffer, options)
35
17
  }
36
18
 
37
19
  /**
38
20
  * `writeAll` behaves like `write`, except it encodes an array of items as a single write
39
21
  */
40
- export function writeAll (writer: Pushable<any>, buffers: Uint8Array[], options?: MultistreamSelectInit): void {
41
- const list = new Uint8ArrayList()
42
-
43
- for (const buf of buffers) {
44
- list.append(encode(buf))
45
- }
46
-
47
- if (options?.writeBytes === true) {
48
- writer.push(list.subarray())
49
- } else {
50
- writer.push(list)
51
- }
22
+ export async function writeAll (writer: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array>, Source<Uint8Array>>>, buffers: Uint8Array[], options?: MultistreamSelectInit): Promise<void> {
23
+ await writer.writeV(buffers, options)
52
24
  }
53
25
 
54
- export async function read (reader: Reader, options?: AbortOptions & LoggerOptions): Promise<Uint8ArrayList> {
55
- let byteLength = 1 // Read single byte chunks until the length is known
56
- const varByteSource = { // No return impl - we want the reader to remain readable
57
- [Symbol.asyncIterator]: () => varByteSource,
58
- next: async () => reader.next(byteLength)
59
- }
60
-
61
- let input: Source<Uint8ArrayList> = varByteSource
62
-
63
- // If we have been passed an abort signal, wrap the input source in an abortable
64
- // iterator that will throw if the operation is aborted
65
- if (options?.signal != null) {
66
- input = abortableSource(varByteSource, options.signal)
67
- }
68
-
69
- // Once the length has been parsed, read chunk for that length
70
- const onLength = (l: number): void => {
71
- byteLength = l
72
- }
73
-
74
- const buf = await pipe(
75
- input,
76
- (source) => lp.decode(source, { onLength, maxDataLength: MAX_PROTOCOL_LENGTH }),
77
- async (source) => first(source)
78
- )
79
-
80
- if (buf == null || buf.length === 0) {
81
- throw new CodeError('no buffer returned', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE')
82
- }
26
+ /**
27
+ * Read a length-prefixed buffer from the passed stream, stripping the final newline character
28
+ */
29
+ export async function read (reader: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>, Source<Uint8Array>>>, options?: AbortOptions & LoggerOptions): Promise<Uint8ArrayList> {
30
+ const buf = await reader.read(options)
83
31
 
84
- if (buf.get(buf.byteLength - 1) !== NewLine[0]) {
85
- options?.log.error('Invalid mss message - missing newline - %s', buf.subarray())
32
+ if (buf.byteLength === 0 || buf.get(buf.byteLength - 1) !== NewLine[0]) {
33
+ options?.log.error('Invalid mss message - missing newline', buf)
86
34
  throw new CodeError('missing newline', 'ERR_INVALID_MULTISTREAM_SELECT_MESSAGE')
87
35
  }
88
36
 
89
37
  return buf.sublist(0, -1) // Remove newline
90
38
  }
91
39
 
92
- export async function readString (reader: Reader, options?: AbortOptions & LoggerOptions): Promise<string> {
40
+ /**
41
+ * Read a length-prefixed string from the passed stream, stripping the final newline character
42
+ */
43
+ export async function readString (reader: LengthPrefixedStream<Duplex<AsyncGenerator<Uint8Array | Uint8ArrayList>, Source<Uint8Array>>>, options?: AbortOptions & LoggerOptions): Promise<string> {
93
44
  const buf = await read(reader, options)
94
45
 
95
46
  return uint8ArrayToString(buf.subarray())
package/src/select.ts CHANGED
@@ -1,14 +1,11 @@
1
1
  import { CodeError } from '@libp2p/interface/errors'
2
- import { handshake } from 'it-handshake'
3
- import merge from 'it-merge'
4
- import { pushable } from 'it-pushable'
5
- import { reader } from 'it-reader'
6
- import { Uint8ArrayList } from 'uint8arraylist'
2
+ import { lpStream } from 'it-length-prefixed-stream'
7
3
  import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
4
+ import { MAX_PROTOCOL_LENGTH } from './constants.js'
8
5
  import * as multistream from './multistream.js'
9
6
  import { PROTOCOL_ID } from './index.js'
10
- import type { ByteArrayInit, ByteListInit, MultistreamSelectInit, ProtocolStream } from './index.js'
11
- import type { Duplex, Source } from 'it-stream-types'
7
+ import type { MultistreamSelectInit, ProtocolStream } from './index.js'
8
+ import type { Duplex } from 'it-stream-types'
12
9
 
13
10
  /**
14
11
  * Negotiate a protocol to use from a list of protocols.
@@ -53,12 +50,11 @@ import type { Duplex, Source } from 'it-stream-types'
53
50
  * // }
54
51
  * ```
55
52
  */
56
- export async function select (stream: Duplex<AsyncGenerator<Uint8Array>, Source<Uint8Array>>, protocols: string | string[], options: ByteArrayInit): Promise<ProtocolStream<Uint8Array>>
57
- export async function select (stream: Duplex<AsyncGenerator<Uint8ArrayList | Uint8Array>, Source<Uint8ArrayList | Uint8Array>>, protocols: string | string[], options?: ByteListInit): Promise<ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>>
58
- export async function select (stream: any, protocols: string | string[], options?: MultistreamSelectInit): Promise<ProtocolStream<any>> {
53
+ export async function select <Stream extends Duplex<any, any, any>> (stream: Stream, protocols: string | string[], options: MultistreamSelectInit): Promise<ProtocolStream<Stream>> {
59
54
  protocols = Array.isArray(protocols) ? [...protocols] : [protocols]
60
- const { reader, writer, rest, stream: shakeStream } = handshake(stream)
61
-
55
+ const lp = lpStream(stream, {
56
+ maxDataLength: MAX_PROTOCOL_LENGTH
57
+ })
62
58
  const protocol = protocols.shift()
63
59
 
64
60
  if (protocol == null) {
@@ -66,39 +62,39 @@ export async function select (stream: any, protocols: string | string[], options
66
62
  }
67
63
 
68
64
  options?.log.trace('select: write ["%s", "%s"]', PROTOCOL_ID, protocol)
69
- const p1 = uint8ArrayFromString(PROTOCOL_ID)
70
- const p2 = uint8ArrayFromString(protocol)
71
- multistream.writeAll(writer, [p1, p2], options)
65
+ const p1 = uint8ArrayFromString(`${PROTOCOL_ID}\n`)
66
+ const p2 = uint8ArrayFromString(`${protocol}\n`)
67
+ await multistream.writeAll(lp, [p1, p2], options)
72
68
 
73
- let response = await multistream.readString(reader, options)
69
+ options?.log.trace('select: reading multistream-select header')
70
+ let response = await multistream.readString(lp, options)
74
71
  options?.log.trace('select: read "%s"', response)
75
72
 
76
73
  // Read the protocol response if we got the protocolId in return
77
74
  if (response === PROTOCOL_ID) {
78
- response = await multistream.readString(reader, options)
75
+ options?.log.trace('select: reading protocol response')
76
+ response = await multistream.readString(lp, options)
79
77
  options?.log.trace('select: read "%s"', response)
80
78
  }
81
79
 
82
80
  // We're done
83
81
  if (response === protocol) {
84
- rest()
85
- return { stream: shakeStream, protocol }
82
+ return { stream: lp.unwrap(), protocol }
86
83
  }
87
84
 
88
85
  // We haven't gotten a valid ack, try the other protocols
89
86
  for (const protocol of protocols) {
90
87
  options?.log.trace('select: write "%s"', protocol)
91
- multistream.write(writer, uint8ArrayFromString(protocol), options)
92
- const response = await multistream.readString(reader, options)
88
+ await multistream.write(lp, uint8ArrayFromString(`${protocol}\n`), options)
89
+ options?.log.trace('select: reading protocol response')
90
+ const response = await multistream.readString(lp, options)
93
91
  options?.log.trace('select: read "%s" for "%s"', response, protocol)
94
92
 
95
93
  if (response === protocol) {
96
- rest() // End our writer so others can start writing to stream
97
- return { stream: shakeStream, protocol }
94
+ return { stream: lp.unwrap(), protocol }
98
95
  }
99
96
  }
100
97
 
101
- rest()
102
98
  throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL')
103
99
  }
104
100
 
@@ -110,49 +106,51 @@ export async function select (stream: any, protocols: string | string[], options
110
106
  *
111
107
  * Use when it is known that the receiver supports the desired protocol.
112
108
  */
113
- export function lazySelect (stream: Duplex<Source<Uint8Array>, Source<Uint8Array>>, protocol: string): ProtocolStream<Uint8Array>
114
- export function lazySelect (stream: Duplex<Source<Uint8ArrayList | Uint8Array>, Source<Uint8ArrayList | Uint8Array>>, protocol: string): ProtocolStream<Uint8ArrayList, Uint8ArrayList | Uint8Array>
115
- export function lazySelect (stream: Duplex<any>, protocol: string): ProtocolStream<any> {
116
- // This is a signal to write the multistream headers if the consumer tries to
117
- // read from the source
118
- const negotiateTrigger = pushable()
119
- let negotiated = false
109
+ export function lazySelect <Stream extends Duplex<any, any, any>> (stream: Stream, protocol: string, options: MultistreamSelectInit): ProtocolStream<Stream> {
110
+ const originalSink = stream.sink.bind(stream)
111
+ const originalSource = stream.source
112
+
113
+ const lp = lpStream({
114
+ sink: originalSink,
115
+ source: originalSource
116
+ }, {
117
+ maxDataLength: MAX_PROTOCOL_LENGTH
118
+ })
119
+
120
+ 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)
130
+ }
131
+
132
+ stream.source = (async function * () {
133
+ options?.log.trace('lazy: reading multistream select header')
134
+
135
+ let response = await multistream.readString(lp, options)
136
+ options?.log.trace('lazy: read multistream select header "%s"', response)
137
+
138
+ if (response === PROTOCOL_ID) {
139
+ response = await multistream.readString(lp, options)
140
+ }
141
+
142
+ options?.log.trace('lazy: read protocol "%s", expecting "%s"', response, protocol)
143
+
144
+ if (response !== protocol) {
145
+ throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL')
146
+ }
147
+
148
+ options?.log.trace('lazy: reading rest of "%s" stream', protocol)
149
+ yield * lp.unwrap().source
150
+ })()
151
+
120
152
  return {
121
- stream: {
122
- sink: async source => {
123
- await stream.sink((async function * () {
124
- let first = true
125
- for await (const chunk of merge(source, negotiateTrigger)) {
126
- if (first) {
127
- first = false
128
- negotiated = true
129
- negotiateTrigger.end()
130
- const p1 = uint8ArrayFromString(PROTOCOL_ID)
131
- const p2 = uint8ArrayFromString(protocol)
132
- const list = new Uint8ArrayList(multistream.encode(p1), multistream.encode(p2))
133
- if (chunk.length > 0) list.append(chunk)
134
- yield * list
135
- } else {
136
- yield chunk
137
- }
138
- }
139
- })())
140
- },
141
- source: (async function * () {
142
- if (!negotiated) negotiateTrigger.push(new Uint8Array())
143
- const byteReader = reader(stream.source)
144
- let response = await multistream.readString(byteReader)
145
- if (response === PROTOCOL_ID) {
146
- response = await multistream.readString(byteReader)
147
- }
148
- if (response !== protocol) {
149
- throw new CodeError('protocol selection failed', 'ERR_UNSUPPORTED_PROTOCOL')
150
- }
151
- for await (const chunk of byteReader) {
152
- yield * chunk
153
- }
154
- })()
155
- },
153
+ stream,
156
154
  protocol
157
155
  }
158
156
  }