@libp2p/perf 5.1.16 → 5.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +3 -3
- package/package.json +5 -5
package/dist/index.min.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
(function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.Libp2PPerf = factory()}(typeof self !== 'undefined' ? self : this, function () {
|
|
2
|
-
"use strict";var Libp2PPerf=(()=>{var N=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var Y=(s,t)=>{for(var e in t)N(s,e,{get:t[e],enumerable:!0})},$=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of q(t))!X.call(s,r)&&r!==e&&N(s,r,{get:()=>t[r],enumerable:!(n=H(t,r))||n.enumerable});return s};var W=s=>$(N({},"__esModule",{value:!0}),s);var st={};Y(st,{perf:()=>rt});function I(){let s={};return s.promise=new Promise((t,e)=>{s.resolve=t,s.reject=e}),s}var x=class{buffer;mask;top;btm;next;constructor(t){if(!(t>0)||(t-1&t)!==0)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(t),this.mask=t-1,this.top=0,this.btm=0,this.next=null}push(t){return this.buffer[this.top]!==void 0?!1:(this.buffer[this.top]=t,this.top=this.top+1&this.mask,!0)}shift(){let t=this.buffer[this.btm];if(t!==void 0)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,t}isEmpty(){return this.buffer[this.btm]===void 0}},A=class{size;hwm;head;tail;constructor(t={}){this.hwm=t.splitLimit??16,this.head=new x(this.hwm),this.tail=this.head,this.size=0}calculateSize(t){return t?.byteLength!=null?t.byteLength:1}push(t){if(t?.value!=null&&(this.size+=this.calculateSize(t.value)),!this.head.push(t)){let e=this.head;this.head=e.next=new x(2*this.head.buffer.length),this.head.push(t)}}shift(){let t=this.tail.shift();if(t===void 0&&this.tail.next!=null){let e=this.tail.next;this.tail.next=null,this.tail=e,t=this.tail.shift()}return t?.value!=null&&(this.size-=this.calculateSize(t.value)),t}isEmpty(){return this.head.isEmpty()}};var B=class extends Error{type;code;constructor(t,e){super(t??"The operation was aborted"),this.type="aborted",this.code=e??"ABORT_ERR"}};function k(s={}){return K(e=>{let n=e.shift();if(n==null)return{done:!0};if(n.error!=null)throw n.error;return{done:n.done===!0,value:n.value}},s)}function K(s,t){t=t??{};let e=t.onEnd,n=new A,r,i,a,h=I(),f=async()=>{try{return n.isEmpty()?a?{done:!0}:await new Promise((u,w)=>{i=y=>{i=null,n.push(y);try{u(s(n))}catch(L){w(L)}return r}}):s(n)}finally{n.isEmpty()&&queueMicrotask(()=>{h.resolve(),h=I()})}},d=u=>i!=null?i(u):(n.push(u),r),b=u=>(n=new A,i!=null?i({error:u}):(n.push({error:u}),r)),o=u=>{if(a)return r;if(t?.objectMode!==!0&&u?.byteLength==null)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return d({done:!1,value:u})},c=u=>a?r:(a=!0,u!=null?b(u):d({done:!0})),l=()=>(n=new A,c(),{done:!0}),p=u=>(c(u),{done:!0});if(r={[Symbol.asyncIterator](){return this},next:f,return:l,throw:p,push:o,end:c,get readableLength(){return n.size},onEmpty:async u=>{let w=u?.signal;if(w?.throwIfAborted(),n.isEmpty())return;let y,L;w!=null&&(y=new Promise((E,v)=>{L=()=>{v(new B)},w.addEventListener("abort",L)}));try{await Promise.race([h.promise,y])}finally{L!=null&&w!=null&&w?.removeEventListener("abort",L)}}},e==null)return r;let m=r;return r={[Symbol.asyncIterator](){return this},next(){return m.next()},throw(u){return m.throw(u),e!=null&&(e(u),e=void 0),{done:!0}},return(){return m.return(),e!=null&&(e(),e=void 0),{done:!0}},push:o,end(u){return m.end(u),e!=null&&(e(u),e=void 0),r},get readableLength(){return m.readableLength},onEmpty:u=>m.onEmpty(u)},r}var M=class s extends Error{name="TimeoutError";constructor(t,e){super(t,e),Error.captureStackTrace?.(this,s)}},_=s=>s.reason??new DOMException("This operation was aborted.","AbortError");function V(s,t){let{milliseconds:e,fallback:n,message:r,customTimers:i={setTimeout,clearTimeout},signal:a}=t,h,f,b=new Promise((o,c)=>{if(typeof e!="number"||Math.sign(e)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${e}\``);if(a?.aborted){c(_(a)),s.then(o,c);return}if(a&&(f=()=>{c(_(a))},a.addEventListener("abort",f,{once:!0})),s.then(o,c),e===Number.POSITIVE_INFINITY)return;let l=new M;h=i.setTimeout.call(void 0,()=>{if(n){try{o(n())}catch(p){c(p)}return}typeof s.cancel=="function"&&s.cancel(),r===!1?o():r instanceof Error?c(r):(l.message=r??`Promise timed out after ${e} milliseconds`,c(l))},e)}).finally(()=>{b.clear(),f&&a&&a.removeEventListener("abort",f)});return b.clear=()=>{i.clearTimeout.call(void 0,h),h=void 0},b}var Q=s=>{let t=s.addEventListener||s.on||s.addListener,e=s.removeEventListener||s.off||s.removeListener;if(!t||!e)throw new TypeError("Emitter is not compatible");return{addListener:t.bind(s),removeListener:e.bind(s)}};function Z(s,t,e){let n,r=new Promise((i,a)=>{if(e={rejectionEvents:["error"],multiArgs:!1,rejectionMultiArgs:!1,resolveImmediately:!1,...e},!(e.count>=0&&(e.count===Number.POSITIVE_INFINITY||Number.isInteger(e.count))))throw new TypeError("The `count` option should be at least 0 or more");e.signal?.throwIfAborted();let h=[t].flat(),f=[],{addListener:d,removeListener:b}=Q(s),o=async(...l)=>{let p=e.multiArgs?l:l[0];if(e.filter)try{if(!await e.filter(p))return}catch(m){n(),a(m);return}f.push(p),e.count===f.length&&(n(),i(f))},c=(...l)=>{n(),a(e.rejectionMultiArgs?l:l[0])};n=()=>{for(let l of h)b(l,o);for(let l of e.rejectionEvents)h.includes(l)||b(l,c)};for(let l of h)d(l,o);for(let l of e.rejectionEvents)h.includes(l)||d(l,c);e.signal&&e.signal.addEventListener("abort",()=>{c(e.signal.reason)},{once:!0}),e.resolveImmediately&&i(f)});if(r.cancel=n,typeof e.timeout=="number"){let i=V(r,{milliseconds:e.timeout});return i.cancel=()=>{n(),i.clear()},i}return r}function U(s,t,e){typeof e=="function"&&(e={filter:e}),e={...e,count:1,resolveImmediately:!1};let n=Z(s,t,e),r=n.then(i=>i[0]);return r.cancel=n.cancel,r}function g(s=0){return new Uint8Array(s)}function S(s=0){return new Uint8Array(s)}function G(s){return s?.buffer instanceof ArrayBuffer}function C(s){if(G(s))return s;let t=s.slice();return new Uint8Array(t.buffer,0,t.byteLength)}function P(s,t){t==null&&(t=s.reduce((r,i)=>r+i.length,0));let e=S(t),n=0;for(let r of s)e.set(r,n),n+=r.length;return C(e)}function R(s,t){if(s===t)return!0;if(s.byteLength!==t.byteLength)return!1;for(let e=0;e<s.byteLength;e++)if(s[e]!==t[e])return!1;return!0}var z=Symbol.for("@achingbrain/uint8arraylist");function j(s,t){if(t==null||t<0)throw new RangeError("index is out of bounds");let e=0;for(let n of s){let r=e+n.byteLength;if(t<r)return{buf:n,index:t-e};e=r}throw new RangeError("index is out of bounds")}function O(s){return!!s?.[z]}var D=class s{bufs;length;[z]=!0;constructor(...t){this.bufs=[],this.length=0,t.length>0&&this.appendAll(t)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...t){this.appendAll(t)}appendAll(t){let e=0;for(let n of t)if(n instanceof Uint8Array)e+=n.byteLength,this.bufs.push(n);else if(O(n)){e+=n.byteLength;for(let r of n.bufs)this.bufs.push(r)}else throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}prepend(...t){this.prependAll(t)}prependAll(t){let e=0;for(let n of t.reverse())if(n instanceof Uint8Array)e+=n.byteLength,this.bufs.unshift(n);else if(O(n))e+=n.byteLength,this.bufs.unshift(...n.bufs);else throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}get(t){let e=j(this.bufs,t);return e.buf[e.index]}set(t,e){let n=j(this.bufs,t);n.buf[n.index]=e}write(t,e=0){if(t instanceof Uint8Array)for(let n=0;n<t.length;n++)this.set(e+n,t[n]);else if(O(t))for(let n=0;n<t.length;n++)this.set(e+n,t.get(n));else throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList")}consume(t){if(t=Math.trunc(t),!(Number.isNaN(t)||t<=0)){if(t===this.byteLength){this.bufs=[],this.length=0;return}for(;this.bufs.length>0;)if(t>=this.bufs[0].byteLength)t-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift();else{this.bufs[0]=this.bufs[0].subarray(t),this.length-=t;break}}}slice(t,e){let{bufs:n,length:r}=this._subList(t,e);return P(n,r)}subarray(t,e){let{bufs:n,length:r}=this._subList(t,e);return n.length===1?n[0]:P(n,r)}sublist(t,e){let{bufs:n,length:r}=this._subList(t,e),i=new s;return i.length=r,i.bufs=n,i}_subList(t,e){if(t=t??0,e=e??this.length,t<0&&(t=this.length+t),e<0&&(e=this.length+e),t<0||e>this.length)throw new RangeError("index is out of bounds");if(t===e)return{bufs:[],length:0};if(t===0&&e===this.length)return{bufs:[...this.bufs],length:this.length};let n=[],r=0;for(let i=0;i<this.bufs.length;i++){let a=this.bufs[i],h=r,f=h+a.byteLength;if(r=f,t>=f)continue;let d=t>=h&&t<f,b=e>h&&e<=f;if(d&&b){if(t===h&&e===f){n.push(a);break}let o=t-h;n.push(a.subarray(o,o+(e-t)));break}if(d){if(t===0){n.push(a);continue}n.push(a.subarray(t-h));continue}if(b){if(e===f){n.push(a);break}n.push(a.subarray(0,e-h));break}n.push(a)}return{bufs:n,length:e-t}}indexOf(t,e=0){if(!O(t)&&!(t instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');let n=t instanceof Uint8Array?t:t.subarray();if(e=Number(e??0),isNaN(e)&&(e=0),e<0&&(e=this.length+e),e<0&&(e=0),t.length===0)return e>this.length?this.length:e;let r=n.byteLength;if(r===0)throw new TypeError("search must be at least 1 byte long");let i=256,a=new Int32Array(i);for(let o=0;o<i;o++)a[o]=-1;for(let o=0;o<r;o++)a[n[o]]=o;let h=a,f=this.byteLength-n.byteLength,d=n.byteLength-1,b;for(let o=e;o<=f;o+=b){b=0;for(let c=d;c>=0;c--){let l=this.get(o+c);if(n[c]!==l){b=Math.max(1,c-h[l]);break}}if(b===0)return o}return-1}getInt8(t){let e=this.subarray(t,t+1);return new DataView(e.buffer,e.byteOffset,e.byteLength).getInt8(0)}setInt8(t,e){let n=S(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,e),this.write(n,t)}getInt16(t,e){let n=this.subarray(t,t+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,e)}setInt16(t,e,n){let r=g(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt16(0,e,n),this.write(r,t)}getInt32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,e)}setInt32(t,e,n){let r=g(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt32(0,e,n),this.write(r,t)}getBigInt64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,e)}setBigInt64(t,e,n){let r=g(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigInt64(0,e,n),this.write(r,t)}getUint8(t){let e=this.subarray(t,t+1);return new DataView(e.buffer,e.byteOffset,e.byteLength).getUint8(0)}setUint8(t,e){let n=S(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,e),this.write(n,t)}getUint16(t,e){let n=this.subarray(t,t+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,e)}setUint16(t,e,n){let r=g(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint16(0,e,n),this.write(r,t)}getUint32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,e)}setUint32(t,e,n){let r=g(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint32(0,e,n),this.write(r,t)}getBigUint64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,e)}setBigUint64(t,e,n){let r=g(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigUint64(0,e,n),this.write(r,t)}getFloat32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,e)}setFloat32(t,e,n){let r=g(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat32(0,e,n),this.write(r,t)}getFloat64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,e)}setFloat64(t,e,n){let r=g(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat64(0,e,n),this.write(r,t)}equals(t){if(t==null||!(t instanceof s)||t.bufs.length!==this.bufs.length)return!1;for(let e=0;e<this.bufs.length;e++)if(!R(this.bufs[e],t.bufs[e]))return!1;return!0}static fromUint8Arrays(t,e){let n=new s;return n.bufs=t,e==null&&(e=t.reduce((r,i)=>r+i.byteLength,0)),n.length=e,n}};var F="/perf/1.0.0";var T=class{log;protocol;components;started;buf;writeBlockSize;maxInboundStreams;maxOutboundStreams;runOnLimitedConnection;constructor(t,e={}){this.components=t,this.log=t.logger.forComponent("libp2p:perf"),this.started=!1,this.protocol=e.protocolName??F,this.writeBlockSize=e.writeBlockSize??65536,this.buf=new ArrayBuffer(this.writeBlockSize),this.maxInboundStreams=e.maxInboundStreams??1,this.maxOutboundStreams=e.maxOutboundStreams??1,this.runOnLimitedConnection=e.runOnLimitedConnection??!1,this.handleMessage=this.handleMessage.bind(this)}[Symbol.toStringTag]="@libp2p/perf";async start(){await this.components.registrar.handle(this.protocol,this.handleMessage,{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnLimitedConnection:this.runOnLimitedConnection}),this.started=!0}async stop(){await this.components.registrar.unhandle(this.protocol),this.started=!1}isStarted(){return this.started}async handleMessage(t){try{let e=this.writeBlockSize,n;for await(let i of t)if(n==null){let a=new D(i);n=Number(a.getBigUint64(0,!1))}if(n==null)throw new Error("bytesToSendBack was not set");let r=new Uint8Array(this.buf,0,this.buf.byteLength);for(;n>0;){let i=e;i>n&&(i=n),n=n-i;let a=r.subarray(0,i);t.send(a)||await U(t,"drain",{rejectionEvents:["close"]})}await t.close()}catch(e){t.abort(e)}}async*measurePerformance(t,e,n,r={}){let i=new Uint8Array(this.buf),a=this.writeBlockSize,h=Date.now(),f=Date.now(),d=await this.components.connectionManager.openConnection(t,{...r,force:r.reuseExistingConnection!==!0}),b=d.log.newScope("perf");b("opened connection after %d ms",Date.now()-f),f=Date.now();let o=await d.newStream(this.protocol,r);b("opened stream after %d ms",Date.now()-f),f=Date.now();let c=0,l=0,p=Date.now();new DataView(this.buf).setBigUint64(0,BigInt(n),!1),b("sending %i bytes to %p",e,d.remotePeer);try{let u=k({objectMode:!0});Promise.resolve().then(async()=>{for(o.send(i.subarray(0,8))||await U(o,"drain",{rejectionEvents:["close"],signal:r.signal});e>0;){let v=a;v>e&&(v=e),o.send(i.subarray(0,v))||await U(o,"drain",{rejectionEvents:["close"],signal:r.signal}),e-=v,Date.now()-f>1e3&&(u.push({type:"intermediary",timeSeconds:(Date.now()-f)/1e3,uploadBytes:c,downloadBytes:0}),f=Date.now(),c=0),c+=v,l+=v}u.end()}).catch(E=>{u.end(E)}),yield*u,b("upload complete after %d ms",Date.now()-p),await o.close(r);let w=0;f=Date.now();let y=0,L=Date.now();for await(let E of o)Date.now()-f>1e3&&(yield{type:"intermediary",timeSeconds:(Date.now()-f)/1e3,uploadBytes:0,downloadBytes:w},f=Date.now(),w=0),w+=E.byteLength,y+=E.byteLength;if(b("download complete after %d ms",Date.now()-L),y!==n)throw new Error(`Expected to receive ${n} bytes, but received ${y}`);yield{type:"final",timeSeconds:(Date.now()-h)/1e3,uploadBytes:l,downloadBytes:y},b("performed %s to %p",this.protocol,d.remotePeer)}catch(u){throw b("error sending %d/%d bytes to %p: %s",l,e,d.remotePeer,u),o.abort(u),u}}};function rt(s={}){return t=>new T(t,s)}return W(st);})();
|
|
2
|
+
"use strict";var Libp2PPerf=(()=>{var B=Object.defineProperty;var $=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var Q=(s,t)=>{for(var e in t)B(s,e,{get:t[e],enumerable:!0})},K=(s,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of W(t))!X.call(s,r)&&r!==e&&B(s,r,{get:()=>t[r],enumerable:!(n=$(t,r))||n.enumerable});return s};var Z=s=>K(B({},"__esModule",{value:!0}),s);var ht={};Q(ht,{perf:()=>ct});function x(){let s={};return s.promise=new Promise((t,e)=>{s.resolve=t,s.reject=e}),s}var U=class{buffer;mask;top;btm;next;constructor(t){if(!(t>0)||(t-1&t)!==0)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(t),this.mask=t-1,this.top=0,this.btm=0,this.next=null}push(t){return this.buffer[this.top]!==void 0?!1:(this.buffer[this.top]=t,this.top=this.top+1&this.mask,!0)}shift(){let t=this.buffer[this.btm];if(t!==void 0)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,t}isEmpty(){return this.buffer[this.btm]===void 0}},A=class{size;hwm;head;tail;constructor(t={}){this.hwm=t.splitLimit??16,this.head=new U(this.hwm),this.tail=this.head,this.size=0}calculateSize(t){return t?.byteLength!=null?t.byteLength:1}push(t){if(t?.value!=null&&(this.size+=this.calculateSize(t.value)),!this.head.push(t)){let e=this.head;this.head=e.next=new U(2*this.head.buffer.length),this.head.push(t)}}shift(){let t=this.tail.shift();if(t===void 0&&this.tail.next!=null){let e=this.tail.next;this.tail.next=null,this.tail=e,t=this.tail.shift()}return t?.value!=null&&(this.size-=this.calculateSize(t.value)),t}isEmpty(){return this.head.isEmpty()}};var M=class extends Error{type;code;constructor(t,e){super(t??"The operation was aborted"),this.type="aborted",this.code=e??"ABORT_ERR"}};function C(s={}){return Y(e=>{let n=e.shift();if(n==null)return{done:!0};if(n.error!=null)throw n.error;return{done:n.done===!0,value:n.value}},s)}function Y(s,t){t=t??{};let e=t.onEnd,n=new A,r,i,o,f=x(),l=async()=>{try{return n.isEmpty()?o?{done:!0}:await new Promise((a,m)=>{i=g=>{i=null,n.push(g);try{a(s(n))}catch(p){m(p)}return r}}):s(n)}finally{n.isEmpty()&&queueMicrotask(()=>{f.resolve(),f=x()})}},b=a=>i!=null?i(a):(n.push(a),r),h=a=>(n=new A,i!=null?i({error:a}):(n.push({error:a}),r)),u=a=>{if(o)return r;if(t?.objectMode!==!0&&a?.byteLength==null)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return b({done:!1,value:a})},c=a=>o?r:(o=!0,a!=null?h(a):b({done:!0})),w=()=>(n=new A,c(),{done:!0}),E=a=>(c(a),{done:!0});if(r={[Symbol.asyncIterator](){return this},next:l,return:w,throw:E,push:u,end:c,get readableLength(){return n.size},onEmpty:async a=>{let m=a?.signal;if(m?.throwIfAborted(),n.isEmpty())return;let g,p;m!=null&&(g=new Promise((d,y)=>{p=()=>{y(new M)},m.addEventListener("abort",p)}));try{await Promise.race([f.promise,g])}finally{p!=null&&m!=null&&m?.removeEventListener("abort",p)}}},e==null)return r;let L=r;return r={[Symbol.asyncIterator](){return this},next(){return L.next()},throw(a){return L.throw(a),e!=null&&(e(a),e=void 0),{done:!0}},return(){return L.return(),e!=null&&(e(),e=void 0),{done:!0}},push:u,end(a){return L.end(a),e!=null&&(e(a),e=void 0),r},get readableLength(){return L.readableLength},onEmpty:a=>L.onEmpty(a)},r}var N=class s extends Error{name="TimeoutError";constructor(t,e){super(t,e),Error.captureStackTrace?.(this,s)}},R=s=>s.reason??new DOMException("This operation was aborted.","AbortError");function V(s,t){let{milliseconds:e,fallback:n,message:r,customTimers:i={setTimeout,clearTimeout},signal:o}=t,f,l,h=new Promise((u,c)=>{if(typeof e!="number"||Math.sign(e)!==1)throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${e}\``);if(o?.aborted){c(R(o)),s.then(u,c);return}if(o&&(l=()=>{c(R(o))},o.addEventListener("abort",l,{once:!0})),s.then(u,c),e===Number.POSITIVE_INFINITY)return;let w=new N;f=i.setTimeout.call(void 0,()=>{if(n){try{u(n())}catch(E){c(E)}return}typeof s.cancel=="function"&&s.cancel(),r===!1?u():r instanceof Error?c(r):(w.message=r??`Promise timed out after ${e} milliseconds`,c(w))},e)}).finally(()=>{h.clear(),l&&o&&o.removeEventListener("abort",l)});return h.clear=()=>{i.clearTimeout.call(void 0,f),f=void 0},h}var _=s=>typeof s=="function"?{filter:s}:{...s},G=s=>s===1/0||Number.isSafeInteger(s)&&s>=0,J=[["addEventListener","removeEventListener"],["on","off"],["addListener","removeListener"]],tt=s=>{for(let[t,e]of J){let n=s?.[t],r=s?.[e];if(typeof n=="function"&&typeof r=="function")return{addListener:n.bind(s),removeListener:r.bind(s)}}throw new TypeError("Emitter is not compatible")},et=s=>{let t=new Map;for(let[e,n]of s)for(let r of Array.isArray(e)?e:[e])t.has(r)||t.set(r,n);return t},nt=({addListener:s,removeListener:t,handlers:e,signal:n,abortHandler:r,isDone:i})=>{n?.addEventListener("abort",r,{once:!0});for(let[o,f]of e)if(s(o,f),i()){t(o,f);return}},rt=({removeListener:s,handlers:t,signal:e,abortHandler:n})=>{for(let[r,i]of t)s(r,i);e?.removeEventListener("abort",n)},st=(s,t,e)=>{let n=Promise.resolve();return(r,i)=>{n=n.then(async()=>{if(t())return;let o;try{o=s?await s(r):!0}catch(f){t()||e(f);return}t()||i(o)})}};function it(s,t,e){let n=()=>{},r=!1,i,o=new Promise((f,l)=>{e=_(e);let{filter:b}=e;if(!G(e.count))throw new TypeError("The `count` option should be at least 0 or more");if(typeof e.timeout=="number"&&!(e.timeout>0))throw new TypeError(`Expected the \`timeout\` option to be a positive number, got \`${e.timeout}\``);e.signal?.throwIfAborted();let{addListener:h,removeListener:u}=tt(s);if(e.count===0){f([]);return}let c=[],w=d=>{n(),l(d)},E=st(b,()=>r,w),L=d=>{c.push(d),e.count===c.length&&(n(),f(c))},a=(...d)=>{if(r)return;let y=e.multiArgs?d:d[0];if(!b){L(y);return}E(y,P=>{P&&L(y)})},m=(...d)=>{w(e.rejectionMultiArgs?d:d[0])},g=()=>{w(e.signal.reason)},p={addListener:h,removeListener:u,handlers:et([[t,a],[e.rejectionEvents??["error"],m]]),signal:e.signal,abortHandler:g,isDone:()=>r};n=()=>{r=!0,clearTimeout(i),rt(p)},nt(p),!(r||!e.resolveImmediately)&&(Number.isFinite(e.timeout)&&(i=setTimeout(n,e.timeout)),f(c))});if(o.cancel=n,typeof e.timeout=="number"&&e.timeout>0&&!e.resolveImmediately){let f=V(o,{milliseconds:e.timeout});return f.cancel=()=>{n(),f.clear()},f}return o}function D(s,t,e){let n=it(s,t,{..._(e),count:1,resolveImmediately:!1}),r=n.then(i=>i[0]);return r.cancel=n.cancel,r}function v(s=0){return new Uint8Array(s)}function S(s=0){return new Uint8Array(s)}function ot(s){return s?.buffer instanceof ArrayBuffer}function z(s){if(ot(s))return s;let t=s.slice();return new Uint8Array(t.buffer,0,t.byteLength)}function k(s,t){t==null&&(t=s.reduce((r,i)=>r+i.length,0));let e=S(t),n=0;for(let r of s)e.set(r,n),n+=r.length;return z(e)}function F(s,t){if(s===t)return!0;if(s.byteLength!==t.byteLength)return!1;for(let e=0;e<s.byteLength;e++)if(s[e]!==t[e])return!1;return!0}var H=Symbol.for("@achingbrain/uint8arraylist");function j(s,t){if(t==null||t<0)throw new RangeError("index is out of bounds");let e=0;for(let n of s){let r=e+n.byteLength;if(t<r)return{buf:n,index:t-e};e=r}throw new RangeError("index is out of bounds")}function O(s){return!!s?.[H]}var T=class s{bufs;length;[H]=!0;constructor(...t){this.bufs=[],this.length=0,t.length>0&&this.appendAll(t)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...t){this.appendAll(t)}appendAll(t){let e=0;for(let n of t)if(n instanceof Uint8Array)e+=n.byteLength,this.bufs.push(n);else if(O(n)){e+=n.byteLength;for(let r of n.bufs)this.bufs.push(r)}else throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}prepend(...t){this.prependAll(t)}prependAll(t){let e=0;for(let n of t.reverse())if(n instanceof Uint8Array)e+=n.byteLength,this.bufs.unshift(n);else if(O(n))e+=n.byteLength,this.bufs.unshift(...n.bufs);else throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}get(t){let e=j(this.bufs,t);return e.buf[e.index]}set(t,e){let n=j(this.bufs,t);n.buf[n.index]=e}write(t,e=0){if(t instanceof Uint8Array)for(let n=0;n<t.length;n++)this.set(e+n,t[n]);else if(O(t))for(let n=0;n<t.length;n++)this.set(e+n,t.get(n));else throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList")}consume(t){if(t=Math.trunc(t),!(Number.isNaN(t)||t<=0)){if(t===this.byteLength){this.bufs=[],this.length=0;return}for(;this.bufs.length>0;)if(t>=this.bufs[0].byteLength)t-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift();else{this.bufs[0]=this.bufs[0].subarray(t),this.length-=t;break}}}slice(t,e){let{bufs:n,length:r}=this._subList(t,e);return k(n,r)}subarray(t,e){let{bufs:n,length:r}=this._subList(t,e);return n.length===1?n[0]:k(n,r)}sublist(t,e){let{bufs:n,length:r}=this._subList(t,e),i=new s;return i.length=r,i.bufs=n,i}_subList(t,e){if(t=t??0,e=e??this.length,t<0&&(t=this.length+t),e<0&&(e=this.length+e),t<0||e>this.length)throw new RangeError("index is out of bounds");if(t===e)return{bufs:[],length:0};if(t===0&&e===this.length)return{bufs:[...this.bufs],length:this.length};let n=[],r=0;for(let i=0;i<this.bufs.length;i++){let o=this.bufs[i],f=r,l=f+o.byteLength;if(r=l,t>=l)continue;let b=t>=f&&t<l,h=e>f&&e<=l;if(b&&h){if(t===f&&e===l){n.push(o);break}let u=t-f;n.push(o.subarray(u,u+(e-t)));break}if(b){if(t===0){n.push(o);continue}n.push(o.subarray(t-f));continue}if(h){if(e===l){n.push(o);break}n.push(o.subarray(0,e-f));break}n.push(o)}return{bufs:n,length:e-t}}indexOf(t,e=0){if(!O(t)&&!(t instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');let n=t instanceof Uint8Array?t:t.subarray();if(e=Number(e??0),isNaN(e)&&(e=0),e<0&&(e=this.length+e),e<0&&(e=0),t.length===0)return e>this.length?this.length:e;let r=n.byteLength;if(r===0)throw new TypeError("search must be at least 1 byte long");let i=256,o=new Int32Array(i);for(let u=0;u<i;u++)o[u]=-1;for(let u=0;u<r;u++)o[n[u]]=u;let f=o,l=this.byteLength-n.byteLength,b=n.byteLength-1,h;for(let u=e;u<=l;u+=h){h=0;for(let c=b;c>=0;c--){let w=this.get(u+c);if(n[c]!==w){h=Math.max(1,c-f[w]);break}}if(h===0)return u}return-1}getInt8(t){let e=this.subarray(t,t+1);return new DataView(e.buffer,e.byteOffset,e.byteLength).getInt8(0)}setInt8(t,e){let n=S(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,e),this.write(n,t)}getInt16(t,e){let n=this.subarray(t,t+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,e)}setInt16(t,e,n){let r=v(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt16(0,e,n),this.write(r,t)}getInt32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,e)}setInt32(t,e,n){let r=v(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt32(0,e,n),this.write(r,t)}getBigInt64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,e)}setBigInt64(t,e,n){let r=v(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigInt64(0,e,n),this.write(r,t)}getUint8(t){let e=this.subarray(t,t+1);return new DataView(e.buffer,e.byteOffset,e.byteLength).getUint8(0)}setUint8(t,e){let n=S(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,e),this.write(n,t)}getUint16(t,e){let n=this.subarray(t,t+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,e)}setUint16(t,e,n){let r=v(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint16(0,e,n),this.write(r,t)}getUint32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,e)}setUint32(t,e,n){let r=v(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint32(0,e,n),this.write(r,t)}getBigUint64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,e)}setBigUint64(t,e,n){let r=v(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigUint64(0,e,n),this.write(r,t)}getFloat32(t,e){let n=this.subarray(t,t+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,e)}setFloat32(t,e,n){let r=v(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat32(0,e,n),this.write(r,t)}getFloat64(t,e){let n=this.subarray(t,t+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,e)}setFloat64(t,e,n){let r=v(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat64(0,e,n),this.write(r,t)}equals(t){if(t==null||!(t instanceof s)||t.bufs.length!==this.bufs.length)return!1;for(let e=0;e<this.bufs.length;e++)if(!F(this.bufs[e],t.bufs[e]))return!1;return!0}static fromUint8Arrays(t,e){let n=new s;return n.bufs=t,e==null&&(e=t.reduce((r,i)=>r+i.byteLength,0)),n.length=e,n}};var q="/perf/1.0.0";var I=class{log;protocol;components;started;buf;writeBlockSize;maxInboundStreams;maxOutboundStreams;runOnLimitedConnection;constructor(t,e={}){this.components=t,this.log=t.logger.forComponent("libp2p:perf"),this.started=!1,this.protocol=e.protocolName??q,this.writeBlockSize=e.writeBlockSize??65536,this.buf=new ArrayBuffer(this.writeBlockSize),this.maxInboundStreams=e.maxInboundStreams??1,this.maxOutboundStreams=e.maxOutboundStreams??1,this.runOnLimitedConnection=e.runOnLimitedConnection??!1,this.handleMessage=this.handleMessage.bind(this)}[Symbol.toStringTag]="@libp2p/perf";async start(){await this.components.registrar.handle(this.protocol,this.handleMessage,{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnLimitedConnection:this.runOnLimitedConnection}),this.started=!0}async stop(){await this.components.registrar.unhandle(this.protocol),this.started=!1}isStarted(){return this.started}async handleMessage(t){try{let e=this.writeBlockSize,n;for await(let i of t)if(n==null){let o=new T(i);n=Number(o.getBigUint64(0,!1))}if(n==null)throw new Error("bytesToSendBack was not set");let r=new Uint8Array(this.buf,0,this.buf.byteLength);for(;n>0;){let i=e;i>n&&(i=n),n=n-i;let o=r.subarray(0,i);t.send(o)||await D(t,"drain",{rejectionEvents:["close"]})}await t.close()}catch(e){t.abort(e)}}async*measurePerformance(t,e,n,r={}){let i=new Uint8Array(this.buf),o=this.writeBlockSize,f=Date.now(),l=Date.now(),b=await this.components.connectionManager.openConnection(t,{...r,force:r.reuseExistingConnection!==!0}),h=b.log.newScope("perf");h("opened connection after %d ms",Date.now()-l),l=Date.now();let u=await b.newStream(this.protocol,r);h("opened stream after %d ms",Date.now()-l),l=Date.now();let c=0,w=0,E=Date.now();new DataView(this.buf).setBigUint64(0,BigInt(n),!1),h("sending %i bytes to %p",e,b.remotePeer);try{let a=C({objectMode:!0});Promise.resolve().then(async()=>{for(u.send(i.subarray(0,8))||await D(u,"drain",{rejectionEvents:["close"],signal:r.signal});e>0;){let y=o;y>e&&(y=e),u.send(i.subarray(0,y))||await D(u,"drain",{rejectionEvents:["close"],signal:r.signal}),e-=y,Date.now()-l>1e3&&(a.push({type:"intermediary",timeSeconds:(Date.now()-l)/1e3,uploadBytes:c,downloadBytes:0}),l=Date.now(),c=0),c+=y,w+=y}a.end()}).catch(d=>{a.end(d)}),yield*a,h("upload complete after %d ms",Date.now()-E),await u.close(r);let m=0;l=Date.now();let g=0,p=Date.now();for await(let d of u)Date.now()-l>1e3&&(yield{type:"intermediary",timeSeconds:(Date.now()-l)/1e3,uploadBytes:0,downloadBytes:m},l=Date.now(),m=0),m+=d.byteLength,g+=d.byteLength;if(h("download complete after %d ms",Date.now()-p),g!==n)throw new Error(`Expected to receive ${n} bytes, but received ${g}`);yield{type:"final",timeSeconds:(Date.now()-f)/1e3,uploadBytes:w,downloadBytes:g},h("performed %s to %p",this.protocol,b.remotePeer)}catch(a){throw h("error sending %d/%d bytes to %p: %s",w,e,b.remotePeer,a),u.abort(a),a}}};function ct(s={}){return t=>new I(t,s)}return Z(ht);})();
|
|
3
3
|
return Libp2PPerf}));
|
|
4
4
|
//# sourceMappingURL=index.min.js.map
|
package/dist/index.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts", "../../../node_modules/p-defer/index.js", "../../../node_modules/it-pushable/src/fifo.ts", "../../../node_modules/it-pushable/src/index.ts", "../../../node_modules/p-timeout/index.js", "../../../node_modules/p-event/index.js", "../../../node_modules/uint8arrays/src/alloc.ts", "../../../node_modules/uint8arrays/src/util/as-uint8array.ts", "../../../node_modules/uint8arrays/src/concat.ts", "../../../node_modules/uint8arrays/src/equals.ts", "../../../node_modules/uint8arraylist/src/index.ts", "../src/constants.ts", "../src/perf-service.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @packageDocumentation\n *\n * The {@link Perf} service implements the [perf protocol](https://github.com/libp2p/specs/blob/master/perf/perf.md), which can be used to measure transfer performance within and across libp2p implementations.\n *\n * @example\n *\n * ```typescript\n * import { noise } from '@libp2p/noise'\n * import { yamux } from '@libp2p/yamux'\n * import { tcp } from '@libp2p/tcp'\n * import { createLibp2p, type Libp2p } from 'libp2p'\n * import { plaintext } from '@libp2p/plaintext'\n * import { perf, type Perf } from '@libp2p/perf'\n *\n * const ONE_MEG = 1024 * 1024\n * const UPLOAD_BYTES = ONE_MEG * 1024\n * const DOWNLOAD_BYTES = ONE_MEG * 1024\n *\n * async function createNode (): Promise<Libp2p<{ perf: Perf }>> {\n * return createLibp2p({\n * addresses: {\n * listen: [\n * '/ip4/0.0.0.0/tcp/0'\n * ]\n * },\n * transports: [\n * tcp()\n * ],\n * connectionEncrypters: [\n * noise(), plaintext()\n * ],\n * streamMuxers: [\n * yamux()\n * ],\n * services: {\n * perf: perf()\n * }\n * })\n * }\n *\n * const libp2p1 = await createNode()\n * const libp2p2 = await createNode()\n *\n * for await (const output of libp2p1.services.perf.measurePerformance(libp2p2.getMultiaddrs()[0], UPLOAD_BYTES, DOWNLOAD_BYTES)) {\n * console.info(output)\n * }\n *\n * await libp2p1.stop()\n * await libp2p2.stop()\n * ```\n */\n\nimport { Perf as PerfClass } from './perf-service.ts'\nimport type { ComponentLogger, DialProtocolOptions } from '@libp2p/interface'\nimport type { ConnectionManager, Registrar } from '@libp2p/interface-internal'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport interface PerfOptions extends DialProtocolOptions {\n /**\n * By default measuring perf should include the time it takes to establish a\n * connection, so a new connection will be opened for every performance run.\n *\n * To override this and re-use an existing connection if one is present, pass\n * `true` here.\n *\n * @default false\n */\n reuseExistingConnection?: boolean\n}\n\nexport interface Perf {\n measurePerformance(multiaddr: Multiaddr, sendBytes: number, recvBytes: number, options?: PerfOptions): AsyncGenerator<PerfOutput>\n}\n\nexport interface PerfOutput {\n type: 'connection' | 'stream' | 'intermediary' | 'final'\n timeSeconds: number\n uploadBytes: number\n downloadBytes: number\n}\n\nexport interface PerfInit {\n protocolName?: string\n maxInboundStreams?: number\n maxOutboundStreams?: number\n runOnLimitedConnection?: boolean\n\n /**\n * Data sent/received will be sent in chunks of this size\n *\n * @default 65536\n */\n writeBlockSize?: number\n}\n\nexport interface PerfComponents {\n registrar: Registrar\n connectionManager: ConnectionManager\n logger: ComponentLogger\n}\n\nexport function perf (init: PerfInit = {}): (components: PerfComponents) => Perf {\n return (components) => new PerfClass(components, init)\n}\n", "export default function pDefer() {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n}\n", "// ported from https://www.npmjs.com/package/fast-fifo\n\nexport interface Next<T> {\n done?: boolean\n error?: Error\n value?: T\n}\n\nclass FixedFIFO<T> {\n public buffer: Array<Next<T> | undefined>\n private readonly mask: number\n private top: number\n private btm: number\n public next: FixedFIFO<T> | null\n\n constructor (hwm: number) {\n if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) {\n throw new Error('Max size for a FixedFIFO should be a power of two')\n }\n\n this.buffer = new Array(hwm)\n this.mask = hwm - 1\n this.top = 0\n this.btm = 0\n this.next = null\n }\n\n push (data: Next<T>): boolean {\n if (this.buffer[this.top] !== undefined) {\n return false\n }\n\n this.buffer[this.top] = data\n this.top = (this.top + 1) & this.mask\n\n return true\n }\n\n shift (): Next<T> | undefined {\n const last = this.buffer[this.btm]\n\n if (last === undefined) {\n return undefined\n }\n\n this.buffer[this.btm] = undefined\n this.btm = (this.btm + 1) & this.mask\n return last\n }\n\n isEmpty (): boolean {\n return this.buffer[this.btm] === undefined\n }\n}\n\nexport interface FIFOOptions {\n /**\n * When the queue reaches this size, it will be split into head/tail parts\n */\n splitLimit?: number\n}\n\nexport class FIFO<T> {\n public size: number\n private readonly hwm: number\n private head: FixedFIFO<T>\n private tail: FixedFIFO<T>\n\n constructor (options: FIFOOptions = {}) {\n this.hwm = options.splitLimit ?? 16\n this.head = new FixedFIFO<T>(this.hwm)\n this.tail = this.head\n this.size = 0\n }\n\n calculateSize (obj: any): number {\n if (obj?.byteLength != null) {\n return obj.byteLength\n }\n\n return 1\n }\n\n push (val: Next<T>): void {\n if (val?.value != null) {\n this.size += this.calculateSize(val.value)\n }\n\n if (!this.head.push(val)) {\n const prev = this.head\n this.head = prev.next = new FixedFIFO<T>(2 * this.head.buffer.length)\n this.head.push(val)\n }\n }\n\n shift (): Next<T> | undefined {\n let val = this.tail.shift()\n\n if (val === undefined && (this.tail.next != null)) {\n const next = this.tail.next\n this.tail.next = null\n this.tail = next\n val = this.tail.shift()\n }\n\n if (val?.value != null) {\n this.size -= this.calculateSize(val.value)\n }\n\n return val\n }\n\n isEmpty (): boolean {\n return this.head.isEmpty()\n }\n}\n", "/**\n * @packageDocumentation\n *\n * An iterable that you can push values into.\n *\n * @example\n *\n * ```js\n * import { pushable } from 'it-pushable'\n *\n * const source = pushable()\n *\n * setTimeout(() => source.push('hello'), 100)\n * setTimeout(() => source.push('world'), 200)\n * setTimeout(() => source.end(), 300)\n *\n * const start = Date.now()\n *\n * for await (const value of source) {\n * console.log(`got \"${value}\" after ${Date.now() - start}ms`)\n * }\n * console.log(`done after ${Date.now() - start}ms`)\n *\n * // Output:\n * // got \"hello\" after 105ms\n * // got \"world\" after 207ms\n * // done after 309ms\n * ```\n *\n * @example\n *\n * ```js\n * import { pushableV } from 'it-pushable'\n * import all from 'it-all'\n *\n * const source = pushableV()\n *\n * source.push(1)\n * source.push(2)\n * source.push(3)\n * source.end()\n *\n * console.info(await all(source))\n *\n * // Output:\n * // [ [1, 2, 3] ]\n * ```\n */\n\nimport deferred from 'p-defer'\nimport { FIFO } from './fifo.ts'\nimport type { Next } from './fifo.ts'\n\nexport class AbortError extends Error {\n type: string\n code: string\n\n constructor (message?: string, code?: string) {\n super(message ?? 'The operation was aborted')\n this.type = 'aborted'\n this.code = code ?? 'ABORT_ERR'\n }\n}\n\nexport interface AbortOptions {\n signal?: AbortSignal\n}\n\ninterface BasePushable<T> {\n /**\n * End the iterable after all values in the buffer (if any) have been yielded. If an\n * error is passed the buffer is cleared immediately and the next iteration will\n * throw the passed error\n */\n end(err?: Error): this\n\n /**\n * Push a value into the iterable. Values are yielded from the iterable in the order\n * they are pushed. Values not yet consumed from the iterable are buffered.\n */\n push(value: T): this\n\n /**\n * Returns a promise that resolves when the underlying queue becomes empty (e.g.\n * this.readableLength === 0).\n *\n * If an AbortSignal is passed as an option and that signal aborts, it only\n * causes the returned promise to reject - it does not end the pushable.\n */\n onEmpty(options?: AbortOptions): Promise<void>\n\n /**\n * This property contains the number of bytes (or objects) in the queue ready to be read.\n *\n * If `objectMode` is true, this is the number of objects in the queue, if false it's the\n * total number of bytes in the queue.\n */\n readableLength: number\n}\n\n/**\n * An iterable that you can push values into.\n */\nexport interface Pushable<T, R = void, N = unknown> extends AsyncGenerator<T, R, N>, BasePushable<T> {}\n\n/**\n * Similar to `pushable`, except it yields multiple buffered chunks at a time. All values yielded from the iterable will be arrays.\n */\nexport interface PushableV<T, R = void, N = unknown> extends AsyncGenerator<T[], R, N>, BasePushable<T> {}\n\nexport interface Options {\n /**\n * A boolean value that means non-`Uint8Array`s will be passed to `.push`, default: `false`\n */\n objectMode?: boolean\n\n /**\n * A function called after *all* values have been yielded from the iterator (including\n * buffered values). In the case when the iterator is ended with an error it will be\n * passed the error as a parameter.\n */\n onEnd?(err?: Error): void\n}\n\nexport interface DoneResult { done: true }\nexport interface ValueResult<T> { done: false, value: T }\nexport type NextResult<T> = ValueResult<T> | DoneResult\n\ninterface getNext<T, V = T> { (buffer: FIFO<T>): NextResult<V> }\n\nexport interface ObjectPushableOptions extends Options {\n objectMode: true\n}\n\nexport interface BytePushableOptions extends Options {\n objectMode?: false\n}\n\n/**\n * Create a new async iterable. The values yielded from calls to `.next()`\n * or when used in a `for await of`loop are \"pushed\" into the iterable.\n * Returns an async iterable object with additional methods.\n */\nexport function pushable<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): Pushable<T>\nexport function pushable<T> (options: ObjectPushableOptions): Pushable<T>\nexport function pushable<T> (options: Options = {}): Pushable<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T> => {\n const next: Next<T> | undefined = buffer.shift()\n\n if (next == null) {\n return { done: true }\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n return {\n done: next.done === true,\n // @ts-expect-error if done is false, value will be present\n value: next.value\n }\n }\n\n return _pushable<T, T, Pushable<T>>(getNext, options)\n}\n\nexport function pushableV<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): PushableV<T>\nexport function pushableV<T> (options: ObjectPushableOptions): PushableV<T>\nexport function pushableV<T> (options: Options = {}): PushableV<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T[]> => {\n let next: Next<T> | undefined\n const values: T[] = []\n\n while (!buffer.isEmpty()) {\n next = buffer.shift()\n\n if (next == null) {\n break\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n if (next.done === false) {\n // @ts-expect-error if done is false value should be pushed\n values.push(next.value)\n }\n }\n\n if (next == null) {\n return { done: true }\n }\n\n return {\n done: next.done === true,\n value: values\n }\n }\n\n return _pushable<T, T[], PushableV<T>>(getNext, options)\n}\n\nfunction _pushable<PushType, ValueType, ReturnType> (getNext: getNext<PushType, ValueType>, options?: Options): ReturnType {\n options = options ?? {}\n let onEnd = options.onEnd\n let buffer = new FIFO<PushType>()\n let pushable: any\n let onNext: ((next: Next<PushType>) => ReturnType) | null\n let ended: boolean\n let drain = deferred()\n\n const waitNext = async (): Promise<NextResult<ValueType>> => {\n try {\n if (!buffer.isEmpty()) {\n return getNext(buffer)\n }\n\n if (ended) {\n return { done: true }\n }\n\n return await new Promise<NextResult<ValueType>>((resolve, reject) => {\n onNext = (next: Next<PushType>) => {\n onNext = null\n buffer.push(next)\n\n try {\n resolve(getNext(buffer))\n } catch (err) {\n reject(err)\n }\n\n return pushable\n }\n })\n } finally {\n if (buffer.isEmpty()) {\n // settle promise in the microtask queue to give consumers a chance to\n // await after calling .push\n queueMicrotask(() => {\n drain.resolve()\n drain = deferred()\n })\n }\n }\n }\n\n const bufferNext = (next: Next<PushType>): ReturnType => {\n if (onNext != null) {\n return onNext(next)\n }\n\n buffer.push(next)\n return pushable\n }\n\n const bufferError = (err: Error): ReturnType => {\n buffer = new FIFO()\n\n if (onNext != null) {\n return onNext({ error: err })\n }\n\n buffer.push({ error: err })\n return pushable\n }\n\n const push = (value: PushType): ReturnType => {\n if (ended) {\n return pushable\n }\n\n // @ts-expect-error `byteLength` is not declared on PushType\n if (options?.objectMode !== true && value?.byteLength == null) {\n throw new Error('objectMode was not true but tried to push non-Uint8Array value')\n }\n\n return bufferNext({ done: false, value })\n }\n const end = (err?: Error): ReturnType => {\n if (ended) { return pushable }\n ended = true\n\n return (err != null) ? bufferError(err) : bufferNext({ done: true })\n }\n const _return = (): DoneResult => {\n buffer = new FIFO()\n end()\n\n return { done: true }\n }\n const _throw = (err: Error): DoneResult => {\n end(err)\n\n return { done: true }\n }\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next: waitNext,\n return: _return,\n throw: _throw,\n push,\n end,\n get readableLength (): number {\n return buffer.size\n },\n onEmpty: async (options?: AbortOptions) => {\n const signal = options?.signal\n signal?.throwIfAborted()\n\n if (buffer.isEmpty()) {\n return\n }\n\n let cancel: Promise<void> | undefined\n let listener: (() => void) | undefined\n\n if (signal != null) {\n cancel = new Promise((resolve, reject) => {\n listener = () => {\n reject(new AbortError())\n }\n\n signal.addEventListener('abort', listener)\n })\n }\n\n try {\n await Promise.race([\n drain.promise,\n cancel\n ])\n } finally {\n if (listener != null && signal != null) {\n signal?.removeEventListener('abort', listener)\n }\n }\n }\n }\n\n if (onEnd == null) {\n return pushable\n }\n\n const _pushable = pushable\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next () {\n return _pushable.next()\n },\n throw (err: Error) {\n _pushable.throw(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return { done: true }\n },\n return () {\n _pushable.return()\n\n if (onEnd != null) {\n onEnd()\n onEnd = undefined\n }\n\n return { done: true }\n },\n push,\n end (err: Error) {\n _pushable.end(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return pushable\n },\n get readableLength () {\n return _pushable.readableLength\n },\n onEmpty: (opts?: AbortOptions) => {\n return _pushable.onEmpty(opts)\n }\n }\n\n return pushable\n}\n", "export class TimeoutError extends Error {\n\tname = 'TimeoutError';\n\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tError.captureStackTrace?.(this, TimeoutError);\n\t}\n}\n\nconst getAbortedReason = signal => signal.reason ?? new DOMException('This operation was aborted.', 'AbortError');\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t\tsignal,\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\treject(getAbortedReason(signal));\n\t\t\t// The input still needs a rejection handler even though cancellation won.\n\t\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\t\tpromise.then(resolve, reject);\n\t\t\treturn;\n\t\t}\n\n\t\tif (signal) {\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\t// Use .then() instead of async IIFE to preserve stack traces\n\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\tpromise.then(resolve, reject);\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\t});\n\n\t// eslint-disable-next-line promise/prefer-await-to-then\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && signal) {\n\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n", "import pTimeout from 'p-timeout';\n\nconst normalizeEmitter = emitter => {\n\tconst addListener = emitter.addEventListener || emitter.on || emitter.addListener;\n\tconst removeListener = emitter.removeEventListener || emitter.off || emitter.removeListener;\n\n\tif (!addListener || !removeListener) {\n\t\tthrow new TypeError('Emitter is not compatible');\n\t}\n\n\treturn {\n\t\taddListener: addListener.bind(emitter),\n\t\tremoveListener: removeListener.bind(emitter),\n\t};\n};\n\nexport function pEventMultiple(emitter, event, options) {\n\tlet cancel;\n\tconst returnValue = new Promise((resolve, reject) => {\n\t\toptions = {\n\t\t\trejectionEvents: ['error'],\n\t\t\tmultiArgs: false,\n\t\t\trejectionMultiArgs: false,\n\t\t\tresolveImmediately: false,\n\t\t\t...options,\n\t\t};\n\n\t\tif (!(options.count >= 0 && (options.count === Number.POSITIVE_INFINITY || Number.isInteger(options.count)))) {\n\t\t\tthrow new TypeError('The `count` option should be at least 0 or more');\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\n\t\t// Allow multiple events\n\t\tconst events = [event].flat();\n\n\t\tconst items = [];\n\t\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\t\tconst onItem = async (...arguments_) => {\n\t\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\t\tif (options.filter) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} catch (error) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treject(error);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\titems.push(value);\n\n\t\t\tif (options.count === items.length) {\n\t\t\t\tcancel();\n\t\t\t\tresolve(items);\n\t\t\t}\n\t\t};\n\n\t\tconst rejectHandler = (...arguments_) => {\n\t\t\tcancel();\n\t\t\treject(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t\t};\n\n\t\tcancel = () => {\n\t\t\tfor (const event of events) {\n\t\t\t\tremoveListener(event, onItem);\n\t\t\t}\n\n\t\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t\t// Only remove rejection handler if we actually registered it\n\t\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tfor (const event of events) {\n\t\t\taddListener(event, onItem);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\t// Skip registering rejection handler if we're already listening to this event\n\t\t\t// as the main event takes priority (as documented)\n\t\t\tif (!events.includes(rejectionEvent)) {\n\t\t\t\taddListener(rejectionEvent, rejectHandler);\n\t\t\t}\n\t\t}\n\n\t\tif (options.signal) {\n\t\t\toptions.signal.addEventListener('abort', () => {\n\t\t\t\trejectHandler(options.signal.reason);\n\t\t\t}, {once: true});\n\t\t}\n\n\t\tif (options.resolveImmediately) {\n\t\t\tresolve(items);\n\t\t}\n\t});\n\n\treturnValue.cancel = cancel;\n\n\tif (typeof options.timeout === 'number') {\n\t\tconst timeout = pTimeout(returnValue, {milliseconds: options.timeout});\n\t\t// When cancelling, also clear the timeout timer\n\t\ttimeout.cancel = () => {\n\t\t\tcancel();\n\t\t\ttimeout.clear();\n\t\t};\n\n\t\treturn timeout;\n\t}\n\n\treturn returnValue;\n}\n\nexport function pEvent(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\toptions = {\n\t\t...options,\n\t\tcount: 1,\n\t\tresolveImmediately: false,\n\t};\n\n\tconst arrayPromise = pEventMultiple(emitter, event, options);\n\tconst promise = arrayPromise.then(array => array[0]); // eslint-disable-line promise/prefer-await-to-then\n\tpromise.cancel = arrayPromise.cancel;\n\n\treturn promise;\n}\n\nexport function pEventIterator(emitter, event, options) {\n\tif (typeof options === 'function') {\n\t\toptions = {filter: options};\n\t}\n\n\t// Allow multiple events\n\tconst events = [event].flat();\n\n\toptions = {\n\t\trejectionEvents: ['error'],\n\t\tresolutionEvents: [],\n\t\tlimit: Number.POSITIVE_INFINITY,\n\t\tmultiArgs: false,\n\t\trejectionMultiArgs: false,\n\t\t...options,\n\t};\n\n\tconst {limit} = options;\n\tconst isValidLimit = limit >= 0 && (limit === Number.POSITIVE_INFINITY || Number.isInteger(limit));\n\tif (!isValidLimit) {\n\t\tthrow new TypeError('The `limit` option should be a non-negative integer or Infinity');\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tif (limit === 0) {\n\t\t// Return an empty async iterator to avoid any further cost\n\t\treturn {\n\t\t\t[Symbol.asyncIterator]() {\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tasync next() {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t}\n\n\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\tlet isDone = false;\n\tlet error;\n\tlet hasPendingError = false;\n\tconst nextQueue = [];\n\tconst valueQueue = [];\n\tlet eventCount = 0;\n\tlet isLimitReached = false;\n\n\tconst valueHandler = (...arguments_) => {\n\t\teventCount++;\n\t\tisLimitReached = eventCount === limit;\n\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\n\t\t\tresolve({done: false, value});\n\n\t\t\tif (isLimitReached) {\n\t\t\t\tcancel();\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueQueue.push(value);\n\n\t\tif (isLimitReached) {\n\t\t\tcancel();\n\t\t}\n\t};\n\n\tconst cancel = () => {\n\t\tisDone = true;\n\n\t\tfor (const event of events) {\n\t\t\tremoveListener(event, valueHandler);\n\t\t}\n\n\t\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\t\tremoveListener(rejectionEvent, rejectHandler);\n\t\t}\n\n\t\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\t\tremoveListener(resolutionEvent, resolveHandler);\n\t\t}\n\n\t\twhile (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value: undefined});\n\t\t}\n\t};\n\n\tconst rejectIterator = reason => {\n\t\tif (isDone) {\n\t\t\treturn;\n\t\t}\n\n\t\terror = reason;\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {reject} = nextQueue.shift();\n\t\t\treject(error);\n\t\t} else {\n\t\t\thasPendingError = true;\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tconst rejectHandler = (...arguments_) => {\n\t\trejectIterator(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t};\n\n\tconst resolveHandler = async (...arguments_) => {\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tif (options.filter) {\n\t\t\ttry {\n\t\t\t\tif (!(await options.filter(value))) {\n\t\t\t\t\tcancel();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch (filterError) {\n\t\t\t\trejectIterator(filterError);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tconst {resolve} = nextQueue.shift();\n\t\t\tresolve({done: true, value});\n\t\t} else {\n\t\t\tvalueQueue.push(value);\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tfor (const event of events) {\n\t\taddListener(event, valueHandler);\n\t}\n\n\tfor (const rejectionEvent of options.rejectionEvents) {\n\t\taddListener(rejectionEvent, rejectHandler);\n\t}\n\n\tfor (const resolutionEvent of options.resolutionEvents) {\n\t\taddListener(resolutionEvent, resolveHandler);\n\t}\n\n\tif (options.signal) {\n\t\toptions.signal.addEventListener('abort', () => {\n\t\t\trejectHandler(options.signal.reason);\n\t\t}, {once: true});\n\t}\n\n\treturn {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t\tasync next() {\n\t\t\tif (valueQueue.length > 0) {\n\t\t\t\tconst value = valueQueue.shift();\n\t\t\t\treturn {\n\t\t\t\t\tdone: isDone && valueQueue.length === 0 && !isLimitReached,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (hasPendingError) {\n\t\t\t\thasPendingError = false;\n\t\t\t\tthrow error;\n\t\t\t}\n\n\t\t\tif (isDone) {\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue: undefined,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnextQueue.push({resolve, reject});\n\t\t\t});\n\t\t},\n\t\tasync return(value) {\n\t\t\tcancel();\n\t\t\treturn {\n\t\t\t\tdone: isDone,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t},\n\t};\n}\n\nexport {TimeoutError} from 'p-timeout';\n", "/**\n * Returns a `Uint8Array` of the requested size. Referenced memory will\n * be initialized to 0.\n */\nexport function alloc (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n\n/**\n * Where possible returns a Uint8Array of the requested size that references\n * uninitialized memory. Only use if you are certain you will immediately\n * overwrite every value in the returned `Uint8Array`.\n */\nexport function allocUnsafe (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n", "function isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * To guarantee Uint8Array semantics, convert nodejs Buffers\n * into vanilla Uint8Arrays\n */\nexport function asUint8Array (buf: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(buf)) {\n return buf\n }\n\n const b = buf.slice()\n\n return new Uint8Array(b.buffer, 0, b.byteLength)\n}\n", "import { allocUnsafe } from '#alloc'\nimport { asUint8Array } from '#util/as-uint8array'\n\n/**\n * Returns a new Uint8Array created by concatenating the passed Uint8Arrays\n */\nexport function concat (arrays: Uint8Array[], length?: number): Uint8Array<ArrayBuffer> {\n if (length == null) {\n length = arrays.reduce((acc, curr) => acc + curr.length, 0)\n }\n\n const output = allocUnsafe(length)\n let offset = 0\n\n for (const arr of arrays) {\n output.set(arr, offset)\n offset += arr.length\n }\n\n return asUint8Array(output)\n}\n", "/**\n * Returns true if the two passed Uint8Arrays have the same content\n */\nexport function equals (a: Uint8Array, b: Uint8Array): boolean {\n if (a === b) {\n return true\n }\n\n if (a.byteLength !== b.byteLength) {\n return false\n }\n\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n\n return true\n}\n", "/**\n * @packageDocumentation\n *\n * A class that lets you do operations over a list of Uint8Arrays without\n * copying them.\n *\n * ```js\n * import { Uint8ArrayList } from 'uint8arraylist'\n *\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray()\n * // -> Uint8Array([0, 1, 2, 3, 4, 5])\n *\n * list.consume(3)\n * list.subarray()\n * // -> Uint8Array([3, 4, 5])\n *\n * // you can also iterate over the list\n * for (const buf of list) {\n * // ..do something with `buf`\n * }\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ## Converting Uint8ArrayLists to Uint8Arrays\n *\n * There are two ways to turn a `Uint8ArrayList` into a `Uint8Array` - `.slice` and `.subarray` and one way to turn a `Uint8ArrayList` into a `Uint8ArrayList` with different contents - `.sublist`.\n *\n * ### slice\n *\n * Slice follows the same semantics as [Uint8Array.slice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice) in that it creates a new `Uint8Array` and copies bytes into it using an optional offset & length.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.slice(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ### subarray\n *\n * Subarray attempts to follow the same semantics as [Uint8Array.subarray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray) with one important different - this is a no-copy operation, unless the requested bytes span two internal buffers in which case it is a copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0]) - no-copy\n *\n * list.subarray(2, 5)\n * // -> Uint8Array([2, 3, 4]) - copy\n * ```\n *\n * ### sublist\n *\n * Sublist creates and returns a new `Uint8ArrayList` that shares the underlying buffers with the original so is always a no-copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.sublist(0, 1)\n * // -> Uint8ArrayList([0]) - no-copy\n *\n * list.sublist(2, 5)\n * // -> Uint8ArrayList([2], [3, 4]) - no-copy\n * ```\n *\n * ## Inspiration\n *\n * Borrows liberally from [bl](https://www.npmjs.com/package/bl) but only uses native JS types.\n */\nimport { allocUnsafe, alloc } from 'uint8arrays/alloc'\nimport { concat } from 'uint8arrays/concat'\nimport { equals } from 'uint8arrays/equals'\n\nconst symbol = Symbol.for('@achingbrain/uint8arraylist')\n\nexport type Appendable<T extends ArrayBufferLike = ArrayBuffer> = Uint8ArrayList<T> | Uint8Array<T>\n\nfunction findBufAndOffset (bufs: Uint8Array[], index: number): { buf: Uint8Array, index: number } {\n if (index == null || index < 0) {\n throw new RangeError('index is out of bounds')\n }\n\n let offset = 0\n\n for (const buf of bufs) {\n const bufEnd = offset + buf.byteLength\n\n if (index < bufEnd) {\n return {\n buf,\n index: index - offset\n }\n }\n\n offset = bufEnd\n }\n\n throw new RangeError('index is out of bounds')\n}\n\n/**\n * Check if object is a CID instance\n *\n * @example\n *\n * ```js\n * import { isUint8ArrayList, Uint8ArrayList } from 'uint8arraylist'\n *\n * isUint8ArrayList(true) // false\n * isUint8ArrayList([]) // false\n * isUint8ArrayList(new Uint8ArrayList()) // true\n * ```\n */\nexport function isUint8ArrayList (value: any): value is Uint8ArrayList {\n return Boolean(value?.[symbol])\n}\n\nexport class Uint8ArrayList <T extends ArrayBufferLike = ArrayBufferLike> implements Iterable<Uint8Array<T>> {\n private bufs: Uint8Array<T>[]\n public length: number\n public readonly [symbol] = true\n\n constructor (...data: Appendable<T>[]) {\n this.bufs = []\n this.length = 0\n\n if (data.length > 0) {\n this.appendAll(data)\n }\n }\n\n * [Symbol.iterator] (): Iterator<Uint8Array<T>> {\n yield * this.bufs\n }\n\n get byteLength (): number {\n return this.length\n }\n\n /**\n * Add one or more `bufs` to the end of this Uint8ArrayList\n */\n append (...bufs: Appendable<T>[]): void {\n this.appendAll(bufs)\n }\n\n /**\n * Add all `bufs` to the end of this Uint8ArrayList\n */\n appendAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.push(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n for (const chunk of buf.bufs) {\n this.bufs.push(chunk)\n }\n } else {\n throw new Error('Could not append value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Add one or more `bufs` to the start of this Uint8ArrayList\n */\n prepend (...bufs: Appendable<T>[]): void {\n this.prependAll(bufs)\n }\n\n /**\n * Add all `bufs` to the start of this Uint8ArrayList\n */\n prependAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs.reverse()) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.unshift(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n this.bufs.unshift(...buf.bufs)\n } else {\n throw new Error('Could not prepend value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Read the value at `index`\n */\n get (index: number): number {\n const res = findBufAndOffset(this.bufs, index)\n\n return res.buf[res.index]\n }\n\n /**\n * Set the value at `index` to `value`\n */\n set (index: number, value: number): void {\n const res = findBufAndOffset(this.bufs, index)\n\n res.buf[res.index] = value\n }\n\n /**\n * Copy bytes from `buf` to the index specified by `offset`\n */\n write (buf: Appendable<T | ArrayBuffer>, offset: number = 0): void {\n if (buf instanceof Uint8Array) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf[i])\n }\n } else if (isUint8ArrayList(buf)) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf.get(i))\n }\n } else {\n throw new Error('Could not write value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n /**\n * Remove bytes from the front of the pool\n */\n consume (bytes: number): void {\n // first, normalize the argument, in accordance with how Buffer does it\n bytes = Math.trunc(bytes)\n\n // do nothing if not a positive number\n if (Number.isNaN(bytes) || bytes <= 0) {\n return\n }\n\n // if consuming all bytes, skip iterating\n if (bytes === this.byteLength) {\n this.bufs = []\n this.length = 0\n return\n }\n\n while (this.bufs.length > 0) {\n if (bytes >= this.bufs[0].byteLength) {\n bytes -= this.bufs[0].byteLength\n this.length -= this.bufs[0].byteLength\n this.bufs.shift()\n } else {\n this.bufs[0] = this.bufs[0].subarray(bytes)\n this.length -= bytes\n break\n }\n }\n }\n\n /**\n * Extracts a section of an array and returns a new array.\n *\n * This is a copy operation as it is with Uint8Arrays and Arrays\n * - note this is different to the behaviour of Node Buffers.\n */\n slice (beginInclusive?: number, endExclusive?: number): Uint8Array<ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a section of the array from the given start and end element index.\n *\n * This is a no-copy operation where the data extracted data comes from a\n * single Uint8Array internally, otherwise it is a copy operation.\n */\n subarray (beginInclusive?: number, endExclusive?: number): Uint8Array<T | ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n if (bufs.length === 1) {\n return bufs[0]\n }\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a new Uint8ArrayList from the given start and end element index.\n *\n * This is a no-copy operation.\n */\n sublist (beginInclusive?: number, endExclusive?: number): Uint8ArrayList<T> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n const list = new Uint8ArrayList<T>()\n list.length = length\n // don't loop, just set the bufs\n list.bufs = bufs\n\n return list\n }\n\n private _subList (beginInclusive?: number, endExclusive?: number): { bufs: Uint8Array<T>[], length: number } {\n beginInclusive = beginInclusive ?? 0\n endExclusive = endExclusive ?? this.length\n\n if (beginInclusive < 0) {\n beginInclusive = this.length + beginInclusive\n }\n\n if (endExclusive < 0) {\n endExclusive = this.length + endExclusive\n }\n\n if (beginInclusive < 0 || endExclusive > this.length) {\n throw new RangeError('index is out of bounds')\n }\n\n if (beginInclusive === endExclusive) {\n return { bufs: [], length: 0 }\n }\n\n if (beginInclusive === 0 && endExclusive === this.length) {\n return { bufs: [...this.bufs], length: this.length }\n }\n\n const bufs: Uint8Array<T>[] = []\n let offset = 0\n\n for (let i = 0; i < this.bufs.length; i++) {\n const buf = this.bufs[i]\n const bufStart = offset\n const bufEnd = bufStart + buf.byteLength\n\n // for next loop\n offset = bufEnd\n\n if (beginInclusive >= bufEnd) {\n // start after this buf\n continue\n }\n\n const sliceStartInBuf = beginInclusive >= bufStart && beginInclusive < bufEnd\n const sliceEndsInBuf = endExclusive > bufStart && endExclusive <= bufEnd\n\n if (sliceStartInBuf && sliceEndsInBuf) {\n // slice is wholly contained within this buffer\n if (beginInclusive === bufStart && endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n const start = beginInclusive - bufStart\n bufs.push(buf.subarray(start, start + (endExclusive - beginInclusive)))\n break\n }\n\n if (sliceStartInBuf) {\n // slice starts in this buffer\n if (beginInclusive === 0) {\n // requested whole buffer\n bufs.push(buf)\n continue\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(beginInclusive - bufStart))\n continue\n }\n\n if (sliceEndsInBuf) {\n if (endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(0, endExclusive - bufStart))\n break\n }\n\n // slice started before this buffer and ends after it\n bufs.push(buf)\n }\n\n return { bufs, length: endExclusive - beginInclusive }\n }\n\n indexOf (search: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (!isUint8ArrayList(search) && !(search instanceof Uint8Array)) {\n throw new TypeError('The \"value\" argument must be a Uint8ArrayList or Uint8Array')\n }\n\n const needle = search instanceof Uint8Array ? search : search.subarray()\n\n offset = Number(offset ?? 0)\n\n if (isNaN(offset)) {\n offset = 0\n }\n\n if (offset < 0) {\n offset = this.length + offset\n }\n\n if (offset < 0) {\n offset = 0\n }\n\n if (search.length === 0) {\n return offset > this.length ? this.length : offset\n }\n\n // https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm\n const M: number = needle.byteLength\n\n if (M === 0) {\n throw new TypeError('search must be at least 1 byte long')\n }\n\n // radix\n const radix: number = 256\n const rightmostPositions: Int32Array = new Int32Array(radix)\n\n // position of the rightmost occurrence of the byte c in the pattern\n for (let c: number = 0; c < radix; c++) {\n // -1 for bytes not in pattern\n rightmostPositions[c] = -1\n }\n\n for (let j = 0; j < M; j++) {\n // rightmost position for bytes in pattern\n rightmostPositions[needle[j]] = j\n }\n\n // Return offset of first match, -1 if no match\n const right = rightmostPositions\n const lastIndex = this.byteLength - needle.byteLength\n const lastPatIndex = needle.byteLength - 1\n let skip: number\n\n for (let i = offset; i <= lastIndex; i += skip) {\n skip = 0\n\n for (let j = lastPatIndex; j >= 0; j--) {\n const char: number = this.get(i + j)\n\n if (needle[j] !== char) {\n skip = Math.max(1, j - right[char])\n break\n }\n }\n\n if (skip === 0) {\n return i\n }\n }\n\n return -1\n }\n\n getInt8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt8(0)\n }\n\n setInt8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getInt16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt16(0, littleEndian)\n }\n\n setInt16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getInt32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt32(0, littleEndian)\n }\n\n setInt32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigInt64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigInt64(0, littleEndian)\n }\n\n setBigInt64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigInt64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint8(0)\n }\n\n setUint8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getUint16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint16(0, littleEndian)\n }\n\n setUint16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint32(0, littleEndian)\n }\n\n setUint32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigUint64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigUint64(0, littleEndian)\n }\n\n setBigUint64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigUint64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat32(0, littleEndian)\n }\n\n setFloat32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat64 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat64(0, littleEndian)\n }\n\n setFloat64 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n equals (other: any): other is Uint8ArrayList {\n if (other == null) {\n return false\n }\n\n if (!(other instanceof Uint8ArrayList)) {\n return false\n }\n\n if (other.bufs.length !== this.bufs.length) {\n return false\n }\n\n for (let i = 0; i < this.bufs.length; i++) {\n if (!equals(this.bufs[i], other.bufs[i])) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Create a Uint8ArrayList from a pre-existing list of Uint8Arrays. Use this\n * method if you know the total size of all the Uint8Arrays ahead of time.\n */\n static fromUint8Arrays <T extends ArrayBufferLike> (bufs: Uint8Array<T>[], length?: number): Uint8ArrayList<T> {\n const list = new Uint8ArrayList<T>()\n list.bufs = bufs\n\n if (length == null) {\n length = bufs.reduce((acc, curr) => acc + curr.byteLength, 0)\n }\n\n list.length = length\n\n return list\n }\n}\n\n/*\nfunction indexOf (needle: Uint8Array, haystack: Uint8Array, offset = 0) {\n for (let i = offset; i < haystack.byteLength; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) {\n break\n }\n\n if (j === needle.byteLength -1) {\n return i\n }\n }\n\n if (haystack.byteLength - i < needle.byteLength) {\n break\n }\n }\n\n return -1\n}\n*/\n", "export const PROTOCOL_NAME = '/perf/1.0.0'\nexport const WRITE_BLOCK_SIZE = 64 << 10\nexport const MAX_INBOUND_STREAMS = 1\nexport const MAX_OUTBOUND_STREAMS = 1\nexport const RUN_ON_LIMITED_CONNECTION = false\n", "import { pushable } from 'it-pushable'\nimport { pEvent } from 'p-event'\nimport { Uint8ArrayList } from 'uint8arraylist'\nimport { MAX_INBOUND_STREAMS, MAX_OUTBOUND_STREAMS, PROTOCOL_NAME, RUN_ON_LIMITED_CONNECTION, WRITE_BLOCK_SIZE } from './constants.ts'\nimport type { PerfOptions, PerfOutput, PerfComponents, PerfInit, Perf as PerfInterface } from './index.ts'\nimport type { Logger, Startable, Stream } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport class Perf implements Startable, PerfInterface {\n private readonly log: Logger\n public readonly protocol: string\n private readonly components: PerfComponents\n private started: boolean\n private readonly buf: ArrayBuffer\n private readonly writeBlockSize: number\n private readonly maxInboundStreams: number\n private readonly maxOutboundStreams: number\n private readonly runOnLimitedConnection: boolean\n\n constructor (components: PerfComponents, init: PerfInit = {}) {\n this.components = components\n this.log = components.logger.forComponent('libp2p:perf')\n this.started = false\n this.protocol = init.protocolName ?? PROTOCOL_NAME\n this.writeBlockSize = init.writeBlockSize ?? WRITE_BLOCK_SIZE\n this.buf = new ArrayBuffer(this.writeBlockSize)\n this.maxInboundStreams = init.maxInboundStreams ?? MAX_INBOUND_STREAMS\n this.maxOutboundStreams = init.maxOutboundStreams ?? MAX_OUTBOUND_STREAMS\n this.runOnLimitedConnection = init.runOnLimitedConnection ?? RUN_ON_LIMITED_CONNECTION\n this.handleMessage = this.handleMessage.bind(this)\n }\n\n readonly [Symbol.toStringTag] = '@libp2p/perf'\n\n async start (): Promise<void> {\n await this.components.registrar.handle(this.protocol, this.handleMessage, {\n maxInboundStreams: this.maxInboundStreams,\n maxOutboundStreams: this.maxOutboundStreams,\n runOnLimitedConnection: this.runOnLimitedConnection\n })\n this.started = true\n }\n\n async stop (): Promise<void> {\n await this.components.registrar.unhandle(this.protocol)\n this.started = false\n }\n\n isStarted (): boolean {\n return this.started\n }\n\n async handleMessage (stream: Stream): Promise<void> {\n try {\n const writeBlockSize = this.writeBlockSize\n\n let bytesToSendBack: number | undefined\n\n for await (const buf of stream) {\n if (bytesToSendBack == null) {\n const list = new Uint8ArrayList(buf)\n // downcast 64 to 52 bits to avoid bigint arithmetic performance penalty\n bytesToSendBack = Number(list.getBigUint64(0, false))\n }\n\n // Ingest all the data and wait for the read side to close\n }\n\n if (bytesToSendBack == null) {\n throw new Error('bytesToSendBack was not set')\n }\n\n const uint8Buf = new Uint8Array(this.buf, 0, this.buf.byteLength)\n\n while (bytesToSendBack > 0) {\n let toSend: number = writeBlockSize\n if (toSend > bytesToSendBack) {\n toSend = bytesToSendBack\n }\n\n bytesToSendBack = bytesToSendBack - toSend\n const buf = uint8Buf.subarray(0, toSend)\n\n const sendMore = stream.send(buf)\n\n if (!sendMore) {\n await pEvent(stream, 'drain', {\n rejectionEvents: [\n 'close'\n ]\n })\n }\n }\n\n await stream.close()\n } catch (err: any) {\n stream.abort(err)\n }\n }\n\n async * measurePerformance (ma: Multiaddr, sendBytes: number, receiveBytes: number, options: PerfOptions = {}): AsyncGenerator<PerfOutput> {\n const uint8Buf = new Uint8Array(this.buf)\n const writeBlockSize = this.writeBlockSize\n\n const initialStartTime = Date.now()\n let lastReportedTime = Date.now()\n const connection = await this.components.connectionManager.openConnection(ma, {\n ...options,\n force: options.reuseExistingConnection !== true\n })\n\n const log = connection.log.newScope('perf')\n\n log('opened connection after %d ms', Date.now() - lastReportedTime)\n lastReportedTime = Date.now()\n\n const stream = await connection.newStream(this.protocol, options)\n\n log('opened stream after %d ms', Date.now() - lastReportedTime)\n lastReportedTime = Date.now()\n\n let lastAmountOfBytesSent = 0\n let totalBytesSent = 0\n const uploadStart = Date.now()\n\n // tell the remote how many bytes we will send. Up cast to 64 bit number\n // as if we send as ui32 we limit total transfer size to 4GB\n const view = new DataView(this.buf)\n view.setBigUint64(0, BigInt(receiveBytes), false)\n\n log('sending %i bytes to %p', sendBytes, connection.remotePeer)\n\n try {\n const output = pushable<PerfOutput>({\n objectMode: true\n })\n\n Promise.resolve().then(async () => {\n const sendMore = stream.send(uint8Buf.subarray(0, 8))\n\n if (!sendMore) {\n await pEvent(stream, 'drain', {\n rejectionEvents: [\n 'close'\n ],\n signal: options.signal\n })\n }\n\n while (sendBytes > 0) {\n let toSend: number = writeBlockSize\n\n if (toSend > sendBytes) {\n toSend = sendBytes\n }\n\n const sendMore = stream.send(uint8Buf.subarray(0, toSend))\n\n if (!sendMore) {\n await pEvent(stream, 'drain', {\n rejectionEvents: [\n 'close'\n ],\n signal: options.signal\n })\n }\n\n sendBytes -= toSend\n\n if (Date.now() - lastReportedTime > 1000) {\n output.push({\n type: 'intermediary',\n timeSeconds: (Date.now() - lastReportedTime) / 1000,\n uploadBytes: lastAmountOfBytesSent,\n downloadBytes: 0\n })\n\n // record last reported time after `console.log` because it can\n // affect benchmark timings\n lastReportedTime = Date.now()\n lastAmountOfBytesSent = 0\n }\n\n lastAmountOfBytesSent += toSend\n totalBytesSent += toSend\n }\n\n output.end()\n })\n .catch(err => {\n output.end(err)\n })\n\n yield * output\n\n log('upload complete after %d ms', Date.now() - uploadStart)\n\n await stream.close(options)\n\n // Read the received bytes\n let lastAmountOfBytesReceived = 0\n lastReportedTime = Date.now()\n let totalBytesReceived = 0\n const downloadStart = Date.now()\n\n for await (const buf of stream) {\n if (Date.now() - lastReportedTime > 1000) {\n yield {\n type: 'intermediary',\n timeSeconds: (Date.now() - lastReportedTime) / 1000,\n uploadBytes: 0,\n downloadBytes: lastAmountOfBytesReceived\n }\n\n // record last reported time after `console.log` because it can\n // affect benchmark timings\n lastReportedTime = Date.now()\n lastAmountOfBytesReceived = 0\n }\n\n lastAmountOfBytesReceived += buf.byteLength\n totalBytesReceived += buf.byteLength\n }\n\n log('download complete after %d ms', Date.now() - downloadStart)\n\n if (totalBytesReceived !== receiveBytes) {\n throw new Error(`Expected to receive ${receiveBytes} bytes, but received ${totalBytesReceived}`)\n }\n\n yield {\n type: 'final',\n timeSeconds: (Date.now() - initialStartTime) / 1000,\n uploadBytes: totalBytesSent,\n downloadBytes: totalBytesReceived\n }\n\n log('performed %s to %p', this.protocol, connection.remotePeer)\n } catch (err: any) {\n log('error sending %d/%d bytes to %p: %s', totalBytesSent, sendBytes, connection.remotePeer, err)\n stream.abort(err)\n throw err\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["index_exports", "__export", "perf", "pDefer", "deferred", "resolve", "reject", "FixedFIFO", "hwm", "data", "last", "FIFO", "options", "obj", "val", "prev", "next", "AbortError", "message", "code", "pushable", "options", "_pushable", "buffer", "next", "_pushable", "getNext", "options", "onEnd", "buffer", "FIFO", "pushable", "onNext", "ended", "drain", "pDefer", "waitNext", "resolve", "reject", "next", "err", "bufferNext", "bufferError", "push", "value", "end", "_return", "_throw", "signal", "cancel", "listener", "AbortError", "opts", "TimeoutError", "_TimeoutError", "message", "options", "getAbortedReason", "signal", "pTimeout", "promise", "milliseconds", "fallback", "customTimers", "timer", "abortHandler", "cancelablePromise", "resolve", "reject", "timeoutError", "error", "normalizeEmitter", "emitter", "addListener", "removeListener", "pEventMultiple", "event", "
|
|
4
|
+
"sourcesContent": ["/**\n * @packageDocumentation\n *\n * The {@link Perf} service implements the [perf protocol](https://github.com/libp2p/specs/blob/master/perf/perf.md), which can be used to measure transfer performance within and across libp2p implementations.\n *\n * @example\n *\n * ```typescript\n * import { noise } from '@libp2p/noise'\n * import { yamux } from '@libp2p/yamux'\n * import { tcp } from '@libp2p/tcp'\n * import { createLibp2p, type Libp2p } from 'libp2p'\n * import { plaintext } from '@libp2p/plaintext'\n * import { perf, type Perf } from '@libp2p/perf'\n *\n * const ONE_MEG = 1024 * 1024\n * const UPLOAD_BYTES = ONE_MEG * 1024\n * const DOWNLOAD_BYTES = ONE_MEG * 1024\n *\n * async function createNode (): Promise<Libp2p<{ perf: Perf }>> {\n * return createLibp2p({\n * addresses: {\n * listen: [\n * '/ip4/0.0.0.0/tcp/0'\n * ]\n * },\n * transports: [\n * tcp()\n * ],\n * connectionEncrypters: [\n * noise(), plaintext()\n * ],\n * streamMuxers: [\n * yamux()\n * ],\n * services: {\n * perf: perf()\n * }\n * })\n * }\n *\n * const libp2p1 = await createNode()\n * const libp2p2 = await createNode()\n *\n * for await (const output of libp2p1.services.perf.measurePerformance(libp2p2.getMultiaddrs()[0], UPLOAD_BYTES, DOWNLOAD_BYTES)) {\n * console.info(output)\n * }\n *\n * await libp2p1.stop()\n * await libp2p2.stop()\n * ```\n */\n\nimport { Perf as PerfClass } from './perf-service.ts'\nimport type { ComponentLogger, DialProtocolOptions } from '@libp2p/interface'\nimport type { ConnectionManager, Registrar } from '@libp2p/interface-internal'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport interface PerfOptions extends DialProtocolOptions {\n /**\n * By default measuring perf should include the time it takes to establish a\n * connection, so a new connection will be opened for every performance run.\n *\n * To override this and re-use an existing connection if one is present, pass\n * `true` here.\n *\n * @default false\n */\n reuseExistingConnection?: boolean\n}\n\nexport interface Perf {\n measurePerformance(multiaddr: Multiaddr, sendBytes: number, recvBytes: number, options?: PerfOptions): AsyncGenerator<PerfOutput>\n}\n\nexport interface PerfOutput {\n type: 'connection' | 'stream' | 'intermediary' | 'final'\n timeSeconds: number\n uploadBytes: number\n downloadBytes: number\n}\n\nexport interface PerfInit {\n protocolName?: string\n maxInboundStreams?: number\n maxOutboundStreams?: number\n runOnLimitedConnection?: boolean\n\n /**\n * Data sent/received will be sent in chunks of this size\n *\n * @default 65536\n */\n writeBlockSize?: number\n}\n\nexport interface PerfComponents {\n registrar: Registrar\n connectionManager: ConnectionManager\n logger: ComponentLogger\n}\n\nexport function perf (init: PerfInit = {}): (components: PerfComponents) => Perf {\n return (components) => new PerfClass(components, init)\n}\n", "export default function pDefer() {\n\tconst deferred = {};\n\n\tdeferred.promise = new Promise((resolve, reject) => {\n\t\tdeferred.resolve = resolve;\n\t\tdeferred.reject = reject;\n\t});\n\n\treturn deferred;\n}\n", "// ported from https://www.npmjs.com/package/fast-fifo\n\nexport interface Next<T> {\n done?: boolean\n error?: Error\n value?: T\n}\n\nclass FixedFIFO<T> {\n public buffer: Array<Next<T> | undefined>\n private readonly mask: number\n private top: number\n private btm: number\n public next: FixedFIFO<T> | null\n\n constructor (hwm: number) {\n if (!(hwm > 0) || ((hwm - 1) & hwm) !== 0) {\n throw new Error('Max size for a FixedFIFO should be a power of two')\n }\n\n this.buffer = new Array(hwm)\n this.mask = hwm - 1\n this.top = 0\n this.btm = 0\n this.next = null\n }\n\n push (data: Next<T>): boolean {\n if (this.buffer[this.top] !== undefined) {\n return false\n }\n\n this.buffer[this.top] = data\n this.top = (this.top + 1) & this.mask\n\n return true\n }\n\n shift (): Next<T> | undefined {\n const last = this.buffer[this.btm]\n\n if (last === undefined) {\n return undefined\n }\n\n this.buffer[this.btm] = undefined\n this.btm = (this.btm + 1) & this.mask\n return last\n }\n\n isEmpty (): boolean {\n return this.buffer[this.btm] === undefined\n }\n}\n\nexport interface FIFOOptions {\n /**\n * When the queue reaches this size, it will be split into head/tail parts\n */\n splitLimit?: number\n}\n\nexport class FIFO<T> {\n public size: number\n private readonly hwm: number\n private head: FixedFIFO<T>\n private tail: FixedFIFO<T>\n\n constructor (options: FIFOOptions = {}) {\n this.hwm = options.splitLimit ?? 16\n this.head = new FixedFIFO<T>(this.hwm)\n this.tail = this.head\n this.size = 0\n }\n\n calculateSize (obj: any): number {\n if (obj?.byteLength != null) {\n return obj.byteLength\n }\n\n return 1\n }\n\n push (val: Next<T>): void {\n if (val?.value != null) {\n this.size += this.calculateSize(val.value)\n }\n\n if (!this.head.push(val)) {\n const prev = this.head\n this.head = prev.next = new FixedFIFO<T>(2 * this.head.buffer.length)\n this.head.push(val)\n }\n }\n\n shift (): Next<T> | undefined {\n let val = this.tail.shift()\n\n if (val === undefined && (this.tail.next != null)) {\n const next = this.tail.next\n this.tail.next = null\n this.tail = next\n val = this.tail.shift()\n }\n\n if (val?.value != null) {\n this.size -= this.calculateSize(val.value)\n }\n\n return val\n }\n\n isEmpty (): boolean {\n return this.head.isEmpty()\n }\n}\n", "/**\n * @packageDocumentation\n *\n * An iterable that you can push values into.\n *\n * @example\n *\n * ```js\n * import { pushable } from 'it-pushable'\n *\n * const source = pushable()\n *\n * setTimeout(() => source.push('hello'), 100)\n * setTimeout(() => source.push('world'), 200)\n * setTimeout(() => source.end(), 300)\n *\n * const start = Date.now()\n *\n * for await (const value of source) {\n * console.log(`got \"${value}\" after ${Date.now() - start}ms`)\n * }\n * console.log(`done after ${Date.now() - start}ms`)\n *\n * // Output:\n * // got \"hello\" after 105ms\n * // got \"world\" after 207ms\n * // done after 309ms\n * ```\n *\n * @example\n *\n * ```js\n * import { pushableV } from 'it-pushable'\n * import all from 'it-all'\n *\n * const source = pushableV()\n *\n * source.push(1)\n * source.push(2)\n * source.push(3)\n * source.end()\n *\n * console.info(await all(source))\n *\n * // Output:\n * // [ [1, 2, 3] ]\n * ```\n */\n\nimport deferred from 'p-defer'\nimport { FIFO } from './fifo.ts'\nimport type { Next } from './fifo.ts'\n\nexport class AbortError extends Error {\n type: string\n code: string\n\n constructor (message?: string, code?: string) {\n super(message ?? 'The operation was aborted')\n this.type = 'aborted'\n this.code = code ?? 'ABORT_ERR'\n }\n}\n\nexport interface AbortOptions {\n signal?: AbortSignal\n}\n\ninterface BasePushable<T> {\n /**\n * End the iterable after all values in the buffer (if any) have been yielded. If an\n * error is passed the buffer is cleared immediately and the next iteration will\n * throw the passed error\n */\n end(err?: Error): this\n\n /**\n * Push a value into the iterable. Values are yielded from the iterable in the order\n * they are pushed. Values not yet consumed from the iterable are buffered.\n */\n push(value: T): this\n\n /**\n * Returns a promise that resolves when the underlying queue becomes empty (e.g.\n * this.readableLength === 0).\n *\n * If an AbortSignal is passed as an option and that signal aborts, it only\n * causes the returned promise to reject - it does not end the pushable.\n */\n onEmpty(options?: AbortOptions): Promise<void>\n\n /**\n * This property contains the number of bytes (or objects) in the queue ready to be read.\n *\n * If `objectMode` is true, this is the number of objects in the queue, if false it's the\n * total number of bytes in the queue.\n */\n readableLength: number\n}\n\n/**\n * An iterable that you can push values into.\n */\nexport interface Pushable<T, R = void, N = unknown> extends AsyncGenerator<T, R, N>, BasePushable<T> {}\n\n/**\n * Similar to `pushable`, except it yields multiple buffered chunks at a time. All values yielded from the iterable will be arrays.\n */\nexport interface PushableV<T, R = void, N = unknown> extends AsyncGenerator<T[], R, N>, BasePushable<T> {}\n\nexport interface Options {\n /**\n * A boolean value that means non-`Uint8Array`s will be passed to `.push`, default: `false`\n */\n objectMode?: boolean\n\n /**\n * A function called after *all* values have been yielded from the iterator (including\n * buffered values). In the case when the iterator is ended with an error it will be\n * passed the error as a parameter.\n */\n onEnd?(err?: Error): void\n}\n\nexport interface DoneResult { done: true }\nexport interface ValueResult<T> { done: false, value: T }\nexport type NextResult<T> = ValueResult<T> | DoneResult\n\ninterface getNext<T, V = T> { (buffer: FIFO<T>): NextResult<V> }\n\nexport interface ObjectPushableOptions extends Options {\n objectMode: true\n}\n\nexport interface BytePushableOptions extends Options {\n objectMode?: false\n}\n\n/**\n * Create a new async iterable. The values yielded from calls to `.next()`\n * or when used in a `for await of`loop are \"pushed\" into the iterable.\n * Returns an async iterable object with additional methods.\n */\nexport function pushable<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): Pushable<T>\nexport function pushable<T> (options: ObjectPushableOptions): Pushable<T>\nexport function pushable<T> (options: Options = {}): Pushable<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T> => {\n const next: Next<T> | undefined = buffer.shift()\n\n if (next == null) {\n return { done: true }\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n return {\n done: next.done === true,\n // @ts-expect-error if done is false, value will be present\n value: next.value\n }\n }\n\n return _pushable<T, T, Pushable<T>>(getNext, options)\n}\n\nexport function pushableV<T extends { byteLength: number } = Uint8Array> (options?: BytePushableOptions): PushableV<T>\nexport function pushableV<T> (options: ObjectPushableOptions): PushableV<T>\nexport function pushableV<T> (options: Options = {}): PushableV<T> {\n const getNext = (buffer: FIFO<T>): NextResult<T[]> => {\n let next: Next<T> | undefined\n const values: T[] = []\n\n while (!buffer.isEmpty()) {\n next = buffer.shift()\n\n if (next == null) {\n break\n }\n\n if (next.error != null) {\n throw next.error\n }\n\n if (next.done === false) {\n // @ts-expect-error if done is false value should be pushed\n values.push(next.value)\n }\n }\n\n if (next == null) {\n return { done: true }\n }\n\n return {\n done: next.done === true,\n value: values\n }\n }\n\n return _pushable<T, T[], PushableV<T>>(getNext, options)\n}\n\nfunction _pushable<PushType, ValueType, ReturnType> (getNext: getNext<PushType, ValueType>, options?: Options): ReturnType {\n options = options ?? {}\n let onEnd = options.onEnd\n let buffer = new FIFO<PushType>()\n let pushable: any\n let onNext: ((next: Next<PushType>) => ReturnType) | null\n let ended: boolean\n let drain = deferred()\n\n const waitNext = async (): Promise<NextResult<ValueType>> => {\n try {\n if (!buffer.isEmpty()) {\n return getNext(buffer)\n }\n\n if (ended) {\n return { done: true }\n }\n\n return await new Promise<NextResult<ValueType>>((resolve, reject) => {\n onNext = (next: Next<PushType>) => {\n onNext = null\n buffer.push(next)\n\n try {\n resolve(getNext(buffer))\n } catch (err) {\n reject(err)\n }\n\n return pushable\n }\n })\n } finally {\n if (buffer.isEmpty()) {\n // settle promise in the microtask queue to give consumers a chance to\n // await after calling .push\n queueMicrotask(() => {\n drain.resolve()\n drain = deferred()\n })\n }\n }\n }\n\n const bufferNext = (next: Next<PushType>): ReturnType => {\n if (onNext != null) {\n return onNext(next)\n }\n\n buffer.push(next)\n return pushable\n }\n\n const bufferError = (err: Error): ReturnType => {\n buffer = new FIFO()\n\n if (onNext != null) {\n return onNext({ error: err })\n }\n\n buffer.push({ error: err })\n return pushable\n }\n\n const push = (value: PushType): ReturnType => {\n if (ended) {\n return pushable\n }\n\n // @ts-expect-error `byteLength` is not declared on PushType\n if (options?.objectMode !== true && value?.byteLength == null) {\n throw new Error('objectMode was not true but tried to push non-Uint8Array value')\n }\n\n return bufferNext({ done: false, value })\n }\n const end = (err?: Error): ReturnType => {\n if (ended) { return pushable }\n ended = true\n\n return (err != null) ? bufferError(err) : bufferNext({ done: true })\n }\n const _return = (): DoneResult => {\n buffer = new FIFO()\n end()\n\n return { done: true }\n }\n const _throw = (err: Error): DoneResult => {\n end(err)\n\n return { done: true }\n }\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next: waitNext,\n return: _return,\n throw: _throw,\n push,\n end,\n get readableLength (): number {\n return buffer.size\n },\n onEmpty: async (options?: AbortOptions) => {\n const signal = options?.signal\n signal?.throwIfAborted()\n\n if (buffer.isEmpty()) {\n return\n }\n\n let cancel: Promise<void> | undefined\n let listener: (() => void) | undefined\n\n if (signal != null) {\n cancel = new Promise((resolve, reject) => {\n listener = () => {\n reject(new AbortError())\n }\n\n signal.addEventListener('abort', listener)\n })\n }\n\n try {\n await Promise.race([\n drain.promise,\n cancel\n ])\n } finally {\n if (listener != null && signal != null) {\n signal?.removeEventListener('abort', listener)\n }\n }\n }\n }\n\n if (onEnd == null) {\n return pushable\n }\n\n const _pushable = pushable\n\n pushable = {\n [Symbol.asyncIterator] () { return this },\n next () {\n return _pushable.next()\n },\n throw (err: Error) {\n _pushable.throw(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return { done: true }\n },\n return () {\n _pushable.return()\n\n if (onEnd != null) {\n onEnd()\n onEnd = undefined\n }\n\n return { done: true }\n },\n push,\n end (err: Error) {\n _pushable.end(err)\n\n if (onEnd != null) {\n onEnd(err)\n onEnd = undefined\n }\n\n return pushable\n },\n get readableLength () {\n return _pushable.readableLength\n },\n onEmpty: (opts?: AbortOptions) => {\n return _pushable.onEmpty(opts)\n }\n }\n\n return pushable\n}\n", "export class TimeoutError extends Error {\n\tname = 'TimeoutError';\n\n\tconstructor(message, options) {\n\t\tsuper(message, options);\n\t\tError.captureStackTrace?.(this, TimeoutError);\n\t}\n}\n\nconst getAbortedReason = signal => signal.reason ?? new DOMException('This operation was aborted.', 'AbortError');\n\nexport default function pTimeout(promise, options) {\n\tconst {\n\t\tmilliseconds,\n\t\tfallback,\n\t\tmessage,\n\t\tcustomTimers = {setTimeout, clearTimeout},\n\t\tsignal,\n\t} = options;\n\n\tlet timer;\n\tlet abortHandler;\n\n\tconst wrappedPromise = new Promise((resolve, reject) => {\n\t\tif (typeof milliseconds !== 'number' || Math.sign(milliseconds) !== 1) {\n\t\t\tthrow new TypeError(`Expected \\`milliseconds\\` to be a positive number, got \\`${milliseconds}\\``);\n\t\t}\n\n\t\tif (signal?.aborted) {\n\t\t\treject(getAbortedReason(signal));\n\t\t\t// The input still needs a rejection handler even though cancellation won.\n\t\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\t\tpromise.then(resolve, reject);\n\t\t\treturn;\n\t\t}\n\n\t\tif (signal) {\n\t\t\tabortHandler = () => {\n\t\t\t\treject(getAbortedReason(signal));\n\t\t\t};\n\n\t\t\tsignal.addEventListener('abort', abortHandler, {once: true});\n\t\t}\n\n\t\t// Use .then() instead of async IIFE to preserve stack traces\n\t\t// eslint-disable-next-line promise/prefer-await-to-then, promise/prefer-catch\n\t\tpromise.then(resolve, reject);\n\n\t\tif (milliseconds === Number.POSITIVE_INFINITY) {\n\t\t\treturn;\n\t\t}\n\n\t\t// We create the error outside of `setTimeout` to preserve the stack trace.\n\t\tconst timeoutError = new TimeoutError();\n\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\ttimer = customTimers.setTimeout.call(undefined, () => {\n\t\t\tif (fallback) {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(fallback());\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (typeof promise.cancel === 'function') {\n\t\t\t\tpromise.cancel();\n\t\t\t}\n\n\t\t\tif (message === false) {\n\t\t\t\tresolve();\n\t\t\t} else if (message instanceof Error) {\n\t\t\t\treject(message);\n\t\t\t} else {\n\t\t\t\ttimeoutError.message = message ?? `Promise timed out after ${milliseconds} milliseconds`;\n\t\t\t\treject(timeoutError);\n\t\t\t}\n\t\t}, milliseconds);\n\t});\n\n\t// eslint-disable-next-line promise/prefer-await-to-then\n\tconst cancelablePromise = wrappedPromise.finally(() => {\n\t\tcancelablePromise.clear();\n\t\tif (abortHandler && signal) {\n\t\t\tsignal.removeEventListener('abort', abortHandler);\n\t\t}\n\t});\n\n\tcancelablePromise.clear = () => {\n\t\t// `.call(undefined, ...)` is needed for custom timers to avoid context issues\n\t\tcustomTimers.clearTimeout.call(undefined, timer);\n\t\ttimer = undefined;\n\t};\n\n\treturn cancelablePromise;\n}\n", "import pTimeout from 'p-timeout';\n\n// A filter function can stand in for the options. The options are copied, so a later change to the caller's object cannot reach the call.\nconst normalizeOptions = options => typeof options === 'function' ? {filter: options} : {...options};\n\n// A `count` or `limit`: a whole number of zero or more, or `Infinity`.\nconst isCount = value => value === Infinity || (Number.isSafeInteger(value) && value >= 0);\n\n// The removal method has to come from the same family as the one used to add, otherwise the listener is never detached.\nconst listenerMethodPairs = [\n\t['addEventListener', 'removeEventListener'],\n\t['on', 'off'],\n\t['addListener', 'removeListener'],\n];\n\nconst normalizeEmitter = emitter => {\n\tfor (const [addMethod, removeMethod] of listenerMethodPairs) {\n\t\tconst addListener = emitter?.[addMethod];\n\t\tconst removeListener = emitter?.[removeMethod];\n\n\t\tif (typeof addListener === 'function' && typeof removeListener === 'function') {\n\t\t\treturn {\n\t\t\t\taddListener: addListener.bind(emitter),\n\t\t\t\tremoveListener: removeListener.bind(emitter),\n\t\t\t};\n\t\t}\n\t}\n\n\tthrow new TypeError('Emitter is not compatible');\n};\n\n// Which handler serves each event name. A single name is a list of one. A name claimed by an earlier family keeps that handler, so the main event takes priority over `rejectionEvents`, which in turn takes priority over `resolutionEvents`. Registration and removal both walk the returned map, so they always agree, a repeated name gets one listener, and a later edit to the caller's arrays cannot reach them.\nconst listenerHandlers = families => {\n\tconst handlers = new Map();\n\n\tfor (const [names, handler] of families) {\n\t\tfor (const name of Array.isArray(names) ? names : [names]) {\n\t\t\tif (!handlers.has(name)) {\n\t\t\t\thandlers.set(name, handler);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn handlers;\n};\n\n// Attaches the abort handler first, so an emitter that fires the abort itself while a listener is being attached still reaches the caller. An emitter that hands over buffered events the moment a listener is attached can end the call part way through, and anything attached after that would never be removed, so attaching stops once the call is done. The call can also end before the emitter stores the listener, since Node's `EventEmitter` emits `newListener` first, so the cleanup misses that listener and it is removed here.\nconst attachListeners = ({addListener, removeListener, handlers, signal, abortHandler, isDone}) => {\n\tsignal?.addEventListener('abort', abortHandler, {once: true});\n\n\tfor (const [eventName, listener] of handlers) {\n\t\taddListener(eventName, listener);\n\n\t\tif (isDone()) {\n\t\t\tremoveListener(eventName, listener);\n\t\t\treturn;\n\t\t}\n\t}\n};\n\n// `once: true` only detaches the abort handler when the signal fires, so a call that ended another way has to remove it.\nconst detachListeners = ({removeListener, handlers, signal, abortHandler}) => {\n\tfor (const [eventName, listener] of handlers) {\n\t\tremoveListener(eventName, listener);\n\t}\n\n\tsignal?.removeEventListener('abort', abortHandler);\n};\n\n// Filters run one after another, so that an asynchronous one cannot reorder the values or read a `limit` that belongs to a later event. A verdict or a failure that arrives once the call is done is dropped, since the outcome is already decided and a cancelled promise must never settle.\nconst createFilterQueue = (filter, isDone, onError) => {\n\tlet queue = Promise.resolve();\n\n\treturn (value, onVerdict) => {\n\t\tqueue = queue.then(async () => {\n\t\t\t// The call is over, so the filter could only produce a verdict that is discarded.\n\t\t\tif (isDone()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet isAccepted;\n\t\t\t// The filter's return value is a verdict rather than a rejection, so it is checked instead of caught.\n\t\t\ttry {\n\t\t\t\tisAccepted = filter ? await filter(value) : true;\n\t\t\t} catch (error) {\n\t\t\t\tif (!isDone()) {\n\t\t\t\t\tonError(error);\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!isDone()) {\n\t\t\t\tonVerdict(isAccepted);\n\t\t\t}\n\t\t});\n\t};\n};\n\nexport function pEventMultiple(emitter, event, options) {\n\t// The setup below can throw before `cancel` is assigned, and the returned promise documents a `.cancel()` method, so it starts out as a no-op.\n\tlet cancel = () => {};\n\t// Set by `cancel()`, which every path that stops listening runs, so an event still going through an asynchronous `filter` can tell that its result is no longer wanted.\n\tlet isDone = false;\n\tlet deadlineTimer;\n\tconst returnValue = new Promise((resolve, reject) => {\n\t\toptions = normalizeOptions(options);\n\n\t\t// Held in a local so the filter is called on its own, and `this` inside it is not the options object the library works from.\n\t\tconst {filter} = options;\n\n\t\tif (!isCount(options.count)) {\n\t\t\tthrow new TypeError('The `count` option should be at least 0 or more');\n\t\t}\n\n\t\t// Checked here, before anything is attached, because `p-timeout` throws for it before it subscribes to this promise, which would leave the listeners attached and this rejection unhandled.\n\t\tif (typeof options.timeout === 'number'\n\t\t\t&& !(options.timeout > 0)) {\n\t\t\tthrow new TypeError(`Expected the \\`timeout\\` option to be a positive number, got \\`${options.timeout}\\``);\n\t\t}\n\n\t\toptions.signal?.throwIfAborted();\n\n\t\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\t\t// A count of zero is already satisfied, so it must not wait for an event or leave a listener behind.\n\t\tif (options.count === 0) {\n\t\t\tresolve([]);\n\t\t\treturn;\n\t\t}\n\n\t\tconst items = [];\n\n\t\t// The reason is a single value, so it must not be wrapped the way a rejection event's arguments are.\n\t\tconst rejectWithReason = reason => {\n\t\t\tcancel();\n\t\t\treject(reason);\n\t\t};\n\n\t\tconst queueFilter = createFilterQueue(filter, () => isDone, rejectWithReason);\n\n\t\tconst acceptItem = value => {\n\t\t\titems.push(value);\n\n\t\t\tif (options.count !== items.length) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcancel();\n\t\t\tresolve(items);\n\t\t};\n\n\t\tconst onItem = (...arguments_) => {\n\t\t\t// The promise is already settled, so the array the caller holds must not keep growing. An emitter can still call a listener it removed during the same emit.\n\t\t\tif (isDone) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\t\tif (!filter) {\n\t\t\t\tacceptItem(value);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tqueueFilter(value, isAccepted => {\n\t\t\t\tif (isAccepted) {\n\t\t\t\t\tacceptItem(value);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst rejectHandler = (...arguments_) => {\n\t\t\trejectWithReason(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t\t};\n\n\t\tconst abortHandler = () => {\n\t\t\trejectWithReason(options.signal.reason);\n\t\t};\n\n\t\t// Allow multiple events. The main event takes priority over a rejection event, as documented. An explicit `undefined` reads as \"not set\" rather than overriding the default, so a forwarded partial options object does not end up listening for the literal name `\"undefined\"`.\n\t\tconst listening = {\n\t\t\taddListener,\n\t\t\tremoveListener,\n\t\t\thandlers: listenerHandlers([[event, onItem], [options.rejectionEvents ?? ['error'], rejectHandler]]),\n\t\t\tsignal: options.signal,\n\t\t\tabortHandler,\n\t\t\tisDone: () => isDone,\n\t\t};\n\n\t\tcancel = () => {\n\t\t\tisDone = true;\n\n\t\t\t// Stopping the listening on any path has to release the deadline too, or it would hold the event loop open for a timer that can no longer do anything.\n\t\t\tclearTimeout(deadlineTimer);\n\n\t\t\tdetachListeners(listening);\n\t\t};\n\n\t\tattachListeners(listening);\n\n\t\t// A call that settled above was already cleaned up by `cancel()`, abort handler included.\n\t\tif (isDone || !options.resolveImmediately) {\n\t\t\treturn;\n\t\t}\n\n\t\t// The promise is fulfilled right away, and `pTimeout` clears its timer as soon as the promise settles, so the deadline is tracked here instead. An infinite deadline has nothing to wait for, and `setTimeout` would clamp it to 1 millisecond.\n\t\tif (Number.isFinite(options.timeout)) {\n\t\t\tdeadlineTimer = setTimeout(cancel, options.timeout);\n\t\t}\n\n\t\tresolve(items);\n\t});\n\n\treturnValue.cancel = cancel;\n\n\t// An invalid `timeout` already rejected the promise above, so it must not reach `pTimeout`.\n\tif (typeof options.timeout === 'number' && options.timeout > 0 && !options.resolveImmediately) {\n\t\tconst timeout = pTimeout(returnValue, {milliseconds: options.timeout});\n\t\t// When cancelling, also clear the timeout timer\n\t\ttimeout.cancel = () => {\n\t\t\tcancel();\n\t\t\ttimeout.clear();\n\t\t};\n\n\t\treturn timeout;\n\t}\n\n\treturn returnValue;\n}\n\nexport function pEvent(emitter, event, options) {\n\tconst arrayPromise = pEventMultiple(emitter, event, {\n\t\t...normalizeOptions(options),\n\t\tcount: 1,\n\t\tresolveImmediately: false,\n\t});\n\tconst promise = arrayPromise.then(array => array[0]);\n\tpromise.cancel = arrayPromise.cancel;\n\n\treturn promise;\n}\n\nexport function pEventIterator(emitter, event, options) {\n\toptions = normalizeOptions(options);\n\n\t// Held in a local so the filter is called on its own, and `this` inside it is not the options object the library works from.\n\tconst {filter} = options;\n\n\t// An explicit `undefined` reads as \"not set\" rather than overriding the default.\n\tconst limit = options.limit ?? Infinity;\n\tif (!isCount(limit)) {\n\t\tthrow new TypeError('The `limit` option should be a non-negative integer or Infinity');\n\t}\n\n\toptions.signal?.throwIfAborted();\n\n\tconst {addListener, removeListener} = normalizeEmitter(emitter);\n\n\tlet isDone = false;\n\t// Set as soon as a resolution event arrives, so no further value can enter the iteration while the queued filters drain.\n\tlet isResolving = false;\n\t// Wrapped as `{reason}`, so a rejection whose reason is `undefined` still counts as one.\n\tlet pendingError;\n\t// The payload of the resolution event, held until a read reports the iteration as done. See `cancel()`.\n\tlet resolutionValue;\n\tconst nextQueue = [];\n\tconst valueQueue = [];\n\tlet eventCount = 0;\n\n\tconst cancel = finalValue => {\n\t\tisDone = true;\n\t\tdetachListeners(listening);\n\n\t\t// The first read that reports the iteration as done carries the payload of the resolution event, the same way a generator's first `{done: true}` result carries its return value. Published versions handed it over like this, and the async iterator protocol allows it, so `next()` callers can still read a final payload such as an exit code. Every read after that one gets `undefined`, as the protocol requires. Without a pending read, the payload waits in `resolutionValue` for the next one.\n\t\tresolutionValue = finalValue;\n\t\tfor (const {resolve} of nextQueue.splice(0)) {\n\t\t\tresolve({done: true, value: resolutionValue});\n\t\t\tresolutionValue = undefined;\n\t\t}\n\t};\n\n\tconst rejectIterator = reason => {\n\t\tif (isDone) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (nextQueue.length > 0) {\n\t\t\tnextQueue.shift().reject(reason);\n\t\t} else {\n\t\t\tpendingError = {reason};\n\t\t}\n\n\t\tcancel();\n\t};\n\n\tconst queueFilter = createFilterQueue(filter, () => isDone, rejectIterator);\n\n\tconst acceptValue = value => {\n\t\tif (nextQueue.length > 0) {\n\t\t\tnextQueue.shift().resolve({done: false, value});\n\t\t} else {\n\t\t\tvalueQueue.push(value);\n\t\t}\n\t};\n\n\tconst valueHandler = (...arguments_) => {\n\t\t// The iteration is over, so a value that is still arriving must not be added to the queue. A resolution event ends the iteration, so a value emitted after it does not belong to it, not even in the same burst before the queued filters have drained.\n\t\tif (isDone || isResolving) {\n\t\t\treturn;\n\t\t}\n\n\t\teventCount++;\n\t\tconst isLastEvent = eventCount === limit;\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\n\t\tconst onVerdict = isAccepted => {\n\t\t\tif (isAccepted) {\n\t\t\t\tacceptValue(value);\n\t\t\t}\n\n\t\t\t// A rejected value still counts towards the limit, so the iterator ends either way.\n\t\t\tif (isLastEvent) {\n\t\t\t\tcancel();\n\t\t\t}\n\t\t};\n\n\t\tif (filter) {\n\t\t\tqueueFilter(value, onVerdict);\n\t\t} else {\n\t\t\tonVerdict(true);\n\t\t}\n\t};\n\n\tconst rejectHandler = (...arguments_) => {\n\t\trejectIterator(options.rejectionMultiArgs ? arguments_ : arguments_[0]);\n\t};\n\n\tconst resolveHandler = (...arguments_) => {\n\t\tconst value = options.multiArgs ? arguments_ : arguments_[0];\n\t\tisResolving = true;\n\n\t\t// The event ends the iteration, so its payload is never yielded as a value. It queues behind the value filters, even without a filter, so that a value which was already received still gets in. The event ends the iteration either way: the verdict only decides whether its payload is handed over as the final value, which is how published versions behaved, and a failure in the filter rejects the iteration.\n\t\tqueueFilter(value, isAccepted => {\n\t\t\t// `cancel()` settles any pending read, and the first one gets the payload.\n\t\t\tcancel(isAccepted ? value : undefined);\n\t\t});\n\t};\n\n\t// The reason is a single value, so it must not be wrapped the way a rejection event's arguments are.\n\tconst abortHandler = () => {\n\t\trejectIterator(options.signal.reason);\n\t};\n\n\t// Allow multiple events. A name that is already handled as a value must not also reject or end the iteration, and a rejection wins over a resolution, so a name never ends up with two handlers. An explicit `undefined` reads as \"not set\" rather than overriding the default, so a forwarded partial options object does not end up listening for the literal name `\"undefined\"`.\n\tconst listening = {\n\t\taddListener,\n\t\tremoveListener,\n\t\thandlers: listenerHandlers([\n\t\t\t[event, valueHandler],\n\t\t\t[options.rejectionEvents ?? ['error'], rejectHandler],\n\t\t\t[options.resolutionEvents ?? [], resolveHandler],\n\t\t]),\n\t\tsignal: options.signal,\n\t\tabortHandler,\n\t\tisDone: () => isDone,\n\t};\n\n\tconst iterator = {\n\t\t[Symbol.asyncIterator]() {\n\t\t\treturn this;\n\t\t},\n\t\tasync next() {\n\t\t\tif (valueQueue.length > 0) {\n\t\t\t\t// A value that was already received is always handed over, so the iteration is never reported done while one is still buffered.\n\t\t\t\treturn {\n\t\t\t\t\tdone: false,\n\t\t\t\t\tvalue: valueQueue.shift(),\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (pendingError) {\n\t\t\t\tconst {reason} = pendingError;\n\t\t\t\tpendingError = undefined;\n\t\t\t\tthrow reason;\n\t\t\t}\n\n\t\t\tif (isDone) {\n\t\t\t\t// Handed over once, so only the first read after the buffered values gets the payload of the resolution event.\n\t\t\t\tconst value = resolutionValue;\n\t\t\t\tresolutionValue = undefined;\n\n\t\t\t\treturn {\n\t\t\t\t\tdone: true,\n\t\t\t\t\tvalue,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnextQueue.push({resolve, reject});\n\t\t\t});\n\t\t},\n\t\tasync return(value) {\n\t\t\t// Without a final value, `cancel()` also drops the payload of a resolution event that was not read yet.\n\t\t\tcancel();\n\n\t\t\t// The consumer ended the iteration, so nothing that is still buffered can come out of it.\n\t\t\tvalueQueue.length = 0;\n\t\t\tpendingError = undefined;\n\n\t\t\treturn {\n\t\t\t\tdone: true,\n\t\t\t\tvalue,\n\t\t\t};\n\t\t},\n\t};\n\n\t// Return an empty async iterator to avoid any further cost. A limit of zero is already reached, so nothing is attached, and `cancel()` has nothing to remove.\n\tif (limit === 0) {\n\t\tisDone = true;\n\t\tlistening.handlers.clear();\n\t\treturn iterator;\n\t}\n\n\tattachListeners(listening);\n\n\t// Ending above runs `cancel()`, which already took the abort handler off, so there is nothing left here.\n\treturn iterator;\n}\n\nexport {TimeoutError} from 'p-timeout';\n", "/**\n * Returns a `Uint8Array` of the requested size. Referenced memory will\n * be initialized to 0.\n */\nexport function alloc (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n\n/**\n * Where possible returns a Uint8Array of the requested size that references\n * uninitialized memory. Only use if you are certain you will immediately\n * overwrite every value in the returned `Uint8Array`.\n */\nexport function allocUnsafe (size: number = 0): Uint8Array<ArrayBuffer> {\n return new Uint8Array(size)\n}\n", "function isByteArrayWithArrayBuffer (b?: Uint8Array): b is Uint8Array<ArrayBuffer> {\n return b?.buffer instanceof ArrayBuffer\n}\n\n/**\n * To guarantee Uint8Array semantics, convert nodejs Buffers\n * into vanilla Uint8Arrays\n */\nexport function asUint8Array (buf: Uint8Array): Uint8Array<ArrayBuffer> {\n if (isByteArrayWithArrayBuffer(buf)) {\n return buf\n }\n\n const b = buf.slice()\n\n return new Uint8Array(b.buffer, 0, b.byteLength)\n}\n", "import { allocUnsafe } from '#alloc'\nimport { asUint8Array } from '#util/as-uint8array'\n\n/**\n * Returns a new Uint8Array created by concatenating the passed Uint8Arrays\n */\nexport function concat (arrays: Uint8Array[], length?: number): Uint8Array<ArrayBuffer> {\n if (length == null) {\n length = arrays.reduce((acc, curr) => acc + curr.length, 0)\n }\n\n const output = allocUnsafe(length)\n let offset = 0\n\n for (const arr of arrays) {\n output.set(arr, offset)\n offset += arr.length\n }\n\n return asUint8Array(output)\n}\n", "/**\n * Returns true if the two passed Uint8Arrays have the same content\n */\nexport function equals (a: Uint8Array, b: Uint8Array): boolean {\n if (a === b) {\n return true\n }\n\n if (a.byteLength !== b.byteLength) {\n return false\n }\n\n for (let i = 0; i < a.byteLength; i++) {\n if (a[i] !== b[i]) {\n return false\n }\n }\n\n return true\n}\n", "/**\n * @packageDocumentation\n *\n * A class that lets you do operations over a list of Uint8Arrays without\n * copying them.\n *\n * ```js\n * import { Uint8ArrayList } from 'uint8arraylist'\n *\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray()\n * // -> Uint8Array([0, 1, 2, 3, 4, 5])\n *\n * list.consume(3)\n * list.subarray()\n * // -> Uint8Array([3, 4, 5])\n *\n * // you can also iterate over the list\n * for (const buf of list) {\n * // ..do something with `buf`\n * }\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ## Converting Uint8ArrayLists to Uint8Arrays\n *\n * There are two ways to turn a `Uint8ArrayList` into a `Uint8Array` - `.slice` and `.subarray` and one way to turn a `Uint8ArrayList` into a `Uint8ArrayList` with different contents - `.sublist`.\n *\n * ### slice\n *\n * Slice follows the same semantics as [Uint8Array.slice](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/slice) in that it creates a new `Uint8Array` and copies bytes into it using an optional offset & length.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.slice(0, 1)\n * // -> Uint8Array([0])\n * ```\n *\n * ### subarray\n *\n * Subarray attempts to follow the same semantics as [Uint8Array.subarray](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/subarray) with one important different - this is a no-copy operation, unless the requested bytes span two internal buffers in which case it is a copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.subarray(0, 1)\n * // -> Uint8Array([0]) - no-copy\n *\n * list.subarray(2, 5)\n * // -> Uint8Array([2, 3, 4]) - copy\n * ```\n *\n * ### sublist\n *\n * Sublist creates and returns a new `Uint8ArrayList` that shares the underlying buffers with the original so is always a no-copy operation.\n *\n * ```js\n * const list = new Uint8ArrayList()\n * list.append(Uint8Array.from([0, 1, 2]))\n * list.append(Uint8Array.from([3, 4, 5]))\n *\n * list.sublist(0, 1)\n * // -> Uint8ArrayList([0]) - no-copy\n *\n * list.sublist(2, 5)\n * // -> Uint8ArrayList([2], [3, 4]) - no-copy\n * ```\n *\n * ## Inspiration\n *\n * Borrows liberally from [bl](https://www.npmjs.com/package/bl) but only uses native JS types.\n */\nimport { allocUnsafe, alloc } from 'uint8arrays/alloc'\nimport { concat } from 'uint8arrays/concat'\nimport { equals } from 'uint8arrays/equals'\n\nconst symbol = Symbol.for('@achingbrain/uint8arraylist')\n\nexport type Appendable<T extends ArrayBufferLike = ArrayBuffer> = Uint8ArrayList<T> | Uint8Array<T>\n\nfunction findBufAndOffset (bufs: Uint8Array[], index: number): { buf: Uint8Array, index: number } {\n if (index == null || index < 0) {\n throw new RangeError('index is out of bounds')\n }\n\n let offset = 0\n\n for (const buf of bufs) {\n const bufEnd = offset + buf.byteLength\n\n if (index < bufEnd) {\n return {\n buf,\n index: index - offset\n }\n }\n\n offset = bufEnd\n }\n\n throw new RangeError('index is out of bounds')\n}\n\n/**\n * Check if object is a CID instance\n *\n * @example\n *\n * ```js\n * import { isUint8ArrayList, Uint8ArrayList } from 'uint8arraylist'\n *\n * isUint8ArrayList(true) // false\n * isUint8ArrayList([]) // false\n * isUint8ArrayList(new Uint8ArrayList()) // true\n * ```\n */\nexport function isUint8ArrayList (value: any): value is Uint8ArrayList {\n return Boolean(value?.[symbol])\n}\n\nexport class Uint8ArrayList <T extends ArrayBufferLike = ArrayBufferLike> implements Iterable<Uint8Array<T>> {\n private bufs: Uint8Array<T>[]\n public length: number\n public readonly [symbol] = true\n\n constructor (...data: Appendable<T>[]) {\n this.bufs = []\n this.length = 0\n\n if (data.length > 0) {\n this.appendAll(data)\n }\n }\n\n * [Symbol.iterator] (): Iterator<Uint8Array<T>> {\n yield * this.bufs\n }\n\n get byteLength (): number {\n return this.length\n }\n\n /**\n * Add one or more `bufs` to the end of this Uint8ArrayList\n */\n append (...bufs: Appendable<T>[]): void {\n this.appendAll(bufs)\n }\n\n /**\n * Add all `bufs` to the end of this Uint8ArrayList\n */\n appendAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.push(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n for (const chunk of buf.bufs) {\n this.bufs.push(chunk)\n }\n } else {\n throw new Error('Could not append value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Add one or more `bufs` to the start of this Uint8ArrayList\n */\n prepend (...bufs: Appendable<T>[]): void {\n this.prependAll(bufs)\n }\n\n /**\n * Add all `bufs` to the start of this Uint8ArrayList\n */\n prependAll (bufs: Appendable<T>[]): void {\n let length = 0\n\n for (const buf of bufs.reverse()) {\n if (buf instanceof Uint8Array) {\n length += buf.byteLength\n this.bufs.unshift(buf)\n } else if (isUint8ArrayList(buf)) {\n length += buf.byteLength\n this.bufs.unshift(...buf.bufs)\n } else {\n throw new Error('Could not prepend value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n this.length += length\n }\n\n /**\n * Read the value at `index`\n */\n get (index: number): number {\n const res = findBufAndOffset(this.bufs, index)\n\n return res.buf[res.index]\n }\n\n /**\n * Set the value at `index` to `value`\n */\n set (index: number, value: number): void {\n const res = findBufAndOffset(this.bufs, index)\n\n res.buf[res.index] = value\n }\n\n /**\n * Copy bytes from `buf` to the index specified by `offset`\n */\n write (buf: Appendable<T | ArrayBuffer>, offset: number = 0): void {\n if (buf instanceof Uint8Array) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf[i])\n }\n } else if (isUint8ArrayList(buf)) {\n for (let i = 0; i < buf.length; i++) {\n this.set(offset + i, buf.get(i))\n }\n } else {\n throw new Error('Could not write value, must be an Uint8Array or a Uint8ArrayList')\n }\n }\n\n /**\n * Remove bytes from the front of the pool\n */\n consume (bytes: number): void {\n // first, normalize the argument, in accordance with how Buffer does it\n bytes = Math.trunc(bytes)\n\n // do nothing if not a positive number\n if (Number.isNaN(bytes) || bytes <= 0) {\n return\n }\n\n // if consuming all bytes, skip iterating\n if (bytes === this.byteLength) {\n this.bufs = []\n this.length = 0\n return\n }\n\n while (this.bufs.length > 0) {\n if (bytes >= this.bufs[0].byteLength) {\n bytes -= this.bufs[0].byteLength\n this.length -= this.bufs[0].byteLength\n this.bufs.shift()\n } else {\n this.bufs[0] = this.bufs[0].subarray(bytes)\n this.length -= bytes\n break\n }\n }\n }\n\n /**\n * Extracts a section of an array and returns a new array.\n *\n * This is a copy operation as it is with Uint8Arrays and Arrays\n * - note this is different to the behaviour of Node Buffers.\n */\n slice (beginInclusive?: number, endExclusive?: number): Uint8Array<ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a section of the array from the given start and end element index.\n *\n * This is a no-copy operation where the data extracted data comes from a\n * single Uint8Array internally, otherwise it is a copy operation.\n */\n subarray (beginInclusive?: number, endExclusive?: number): Uint8Array<T | ArrayBuffer> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n if (bufs.length === 1) {\n return bufs[0]\n }\n\n return concat(bufs, length)\n }\n\n /**\n * Returns a new Uint8ArrayList from the given start and end element index.\n *\n * This is a no-copy operation.\n */\n sublist (beginInclusive?: number, endExclusive?: number): Uint8ArrayList<T> {\n const { bufs, length } = this._subList(beginInclusive, endExclusive)\n\n const list = new Uint8ArrayList<T>()\n list.length = length\n // don't loop, just set the bufs\n list.bufs = bufs\n\n return list\n }\n\n private _subList (beginInclusive?: number, endExclusive?: number): { bufs: Uint8Array<T>[], length: number } {\n beginInclusive = beginInclusive ?? 0\n endExclusive = endExclusive ?? this.length\n\n if (beginInclusive < 0) {\n beginInclusive = this.length + beginInclusive\n }\n\n if (endExclusive < 0) {\n endExclusive = this.length + endExclusive\n }\n\n if (beginInclusive < 0 || endExclusive > this.length) {\n throw new RangeError('index is out of bounds')\n }\n\n if (beginInclusive === endExclusive) {\n return { bufs: [], length: 0 }\n }\n\n if (beginInclusive === 0 && endExclusive === this.length) {\n return { bufs: [...this.bufs], length: this.length }\n }\n\n const bufs: Uint8Array<T>[] = []\n let offset = 0\n\n for (let i = 0; i < this.bufs.length; i++) {\n const buf = this.bufs[i]\n const bufStart = offset\n const bufEnd = bufStart + buf.byteLength\n\n // for next loop\n offset = bufEnd\n\n if (beginInclusive >= bufEnd) {\n // start after this buf\n continue\n }\n\n const sliceStartInBuf = beginInclusive >= bufStart && beginInclusive < bufEnd\n const sliceEndsInBuf = endExclusive > bufStart && endExclusive <= bufEnd\n\n if (sliceStartInBuf && sliceEndsInBuf) {\n // slice is wholly contained within this buffer\n if (beginInclusive === bufStart && endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n const start = beginInclusive - bufStart\n bufs.push(buf.subarray(start, start + (endExclusive - beginInclusive)))\n break\n }\n\n if (sliceStartInBuf) {\n // slice starts in this buffer\n if (beginInclusive === 0) {\n // requested whole buffer\n bufs.push(buf)\n continue\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(beginInclusive - bufStart))\n continue\n }\n\n if (sliceEndsInBuf) {\n if (endExclusive === bufEnd) {\n // requested whole buffer\n bufs.push(buf)\n break\n }\n\n // requested part of buffer\n bufs.push(buf.subarray(0, endExclusive - bufStart))\n break\n }\n\n // slice started before this buffer and ends after it\n bufs.push(buf)\n }\n\n return { bufs, length: endExclusive - beginInclusive }\n }\n\n indexOf (search: Uint8ArrayList | Uint8Array, offset: number = 0): number {\n if (!isUint8ArrayList(search) && !(search instanceof Uint8Array)) {\n throw new TypeError('The \"value\" argument must be a Uint8ArrayList or Uint8Array')\n }\n\n const needle = search instanceof Uint8Array ? search : search.subarray()\n\n offset = Number(offset ?? 0)\n\n if (isNaN(offset)) {\n offset = 0\n }\n\n if (offset < 0) {\n offset = this.length + offset\n }\n\n if (offset < 0) {\n offset = 0\n }\n\n if (search.length === 0) {\n return offset > this.length ? this.length : offset\n }\n\n // https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string-search_algorithm\n const M: number = needle.byteLength\n\n if (M === 0) {\n throw new TypeError('search must be at least 1 byte long')\n }\n\n // radix\n const radix: number = 256\n const rightmostPositions: Int32Array = new Int32Array(radix)\n\n // position of the rightmost occurrence of the byte c in the pattern\n for (let c: number = 0; c < radix; c++) {\n // -1 for bytes not in pattern\n rightmostPositions[c] = -1\n }\n\n for (let j = 0; j < M; j++) {\n // rightmost position for bytes in pattern\n rightmostPositions[needle[j]] = j\n }\n\n // Return offset of first match, -1 if no match\n const right = rightmostPositions\n const lastIndex = this.byteLength - needle.byteLength\n const lastPatIndex = needle.byteLength - 1\n let skip: number\n\n for (let i = offset; i <= lastIndex; i += skip) {\n skip = 0\n\n for (let j = lastPatIndex; j >= 0; j--) {\n const char: number = this.get(i + j)\n\n if (needle[j] !== char) {\n skip = Math.max(1, j - right[char])\n break\n }\n }\n\n if (skip === 0) {\n return i\n }\n }\n\n return -1\n }\n\n getInt8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt8(0)\n }\n\n setInt8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getInt16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt16(0, littleEndian)\n }\n\n setInt16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getInt32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getInt32(0, littleEndian)\n }\n\n setInt32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setInt32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigInt64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigInt64(0, littleEndian)\n }\n\n setBigInt64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigInt64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint8 (byteOffset: number): number {\n const buf = this.subarray(byteOffset, byteOffset + 1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint8(0)\n }\n\n setUint8 (byteOffset: number, value: number): void {\n const buf = allocUnsafe(1)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint8(0, value)\n\n this.write(buf, byteOffset)\n }\n\n getUint16 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint16(0, littleEndian)\n }\n\n setUint16 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(2)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint16(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getUint32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getUint32(0, littleEndian)\n }\n\n setUint32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setUint32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getBigUint64 (byteOffset: number, littleEndian?: boolean): bigint {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getBigUint64(0, littleEndian)\n }\n\n setBigUint64 (byteOffset: number, value: bigint, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setBigUint64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat32 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat32(0, littleEndian)\n }\n\n setFloat32 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(4)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat32(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n getFloat64 (byteOffset: number, littleEndian?: boolean): number {\n const buf = this.subarray(byteOffset, byteOffset + 8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n\n return view.getFloat64(0, littleEndian)\n }\n\n setFloat64 (byteOffset: number, value: number, littleEndian?: boolean): void {\n const buf = alloc(8)\n const view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength)\n view.setFloat64(0, value, littleEndian)\n\n this.write(buf, byteOffset)\n }\n\n equals (other: any): other is Uint8ArrayList {\n if (other == null) {\n return false\n }\n\n if (!(other instanceof Uint8ArrayList)) {\n return false\n }\n\n if (other.bufs.length !== this.bufs.length) {\n return false\n }\n\n for (let i = 0; i < this.bufs.length; i++) {\n if (!equals(this.bufs[i], other.bufs[i])) {\n return false\n }\n }\n\n return true\n }\n\n /**\n * Create a Uint8ArrayList from a pre-existing list of Uint8Arrays. Use this\n * method if you know the total size of all the Uint8Arrays ahead of time.\n */\n static fromUint8Arrays <T extends ArrayBufferLike> (bufs: Uint8Array<T>[], length?: number): Uint8ArrayList<T> {\n const list = new Uint8ArrayList<T>()\n list.bufs = bufs\n\n if (length == null) {\n length = bufs.reduce((acc, curr) => acc + curr.byteLength, 0)\n }\n\n list.length = length\n\n return list\n }\n}\n\n/*\nfunction indexOf (needle: Uint8Array, haystack: Uint8Array, offset = 0) {\n for (let i = offset; i < haystack.byteLength; i++) {\n for (let j = 0; j < needle.length; j++) {\n if (haystack[i + j] !== needle[j]) {\n break\n }\n\n if (j === needle.byteLength -1) {\n return i\n }\n }\n\n if (haystack.byteLength - i < needle.byteLength) {\n break\n }\n }\n\n return -1\n}\n*/\n", "export const PROTOCOL_NAME = '/perf/1.0.0'\nexport const WRITE_BLOCK_SIZE = 64 << 10\nexport const MAX_INBOUND_STREAMS = 1\nexport const MAX_OUTBOUND_STREAMS = 1\nexport const RUN_ON_LIMITED_CONNECTION = false\n", "import { pushable } from 'it-pushable'\nimport { pEvent } from 'p-event'\nimport { Uint8ArrayList } from 'uint8arraylist'\nimport { MAX_INBOUND_STREAMS, MAX_OUTBOUND_STREAMS, PROTOCOL_NAME, RUN_ON_LIMITED_CONNECTION, WRITE_BLOCK_SIZE } from './constants.ts'\nimport type { PerfOptions, PerfOutput, PerfComponents, PerfInit, Perf as PerfInterface } from './index.ts'\nimport type { Logger, Startable, Stream } from '@libp2p/interface'\nimport type { Multiaddr } from '@multiformats/multiaddr'\n\nexport class Perf implements Startable, PerfInterface {\n private readonly log: Logger\n public readonly protocol: string\n private readonly components: PerfComponents\n private started: boolean\n private readonly buf: ArrayBuffer\n private readonly writeBlockSize: number\n private readonly maxInboundStreams: number\n private readonly maxOutboundStreams: number\n private readonly runOnLimitedConnection: boolean\n\n constructor (components: PerfComponents, init: PerfInit = {}) {\n this.components = components\n this.log = components.logger.forComponent('libp2p:perf')\n this.started = false\n this.protocol = init.protocolName ?? PROTOCOL_NAME\n this.writeBlockSize = init.writeBlockSize ?? WRITE_BLOCK_SIZE\n this.buf = new ArrayBuffer(this.writeBlockSize)\n this.maxInboundStreams = init.maxInboundStreams ?? MAX_INBOUND_STREAMS\n this.maxOutboundStreams = init.maxOutboundStreams ?? MAX_OUTBOUND_STREAMS\n this.runOnLimitedConnection = init.runOnLimitedConnection ?? RUN_ON_LIMITED_CONNECTION\n this.handleMessage = this.handleMessage.bind(this)\n }\n\n readonly [Symbol.toStringTag] = '@libp2p/perf'\n\n async start (): Promise<void> {\n await this.components.registrar.handle(this.protocol, this.handleMessage, {\n maxInboundStreams: this.maxInboundStreams,\n maxOutboundStreams: this.maxOutboundStreams,\n runOnLimitedConnection: this.runOnLimitedConnection\n })\n this.started = true\n }\n\n async stop (): Promise<void> {\n await this.components.registrar.unhandle(this.protocol)\n this.started = false\n }\n\n isStarted (): boolean {\n return this.started\n }\n\n async handleMessage (stream: Stream): Promise<void> {\n try {\n const writeBlockSize = this.writeBlockSize\n\n let bytesToSendBack: number | undefined\n\n for await (const buf of stream) {\n if (bytesToSendBack == null) {\n const list = new Uint8ArrayList(buf)\n // downcast 64 to 52 bits to avoid bigint arithmetic performance penalty\n bytesToSendBack = Number(list.getBigUint64(0, false))\n }\n\n // Ingest all the data and wait for the read side to close\n }\n\n if (bytesToSendBack == null) {\n throw new Error('bytesToSendBack was not set')\n }\n\n const uint8Buf = new Uint8Array(this.buf, 0, this.buf.byteLength)\n\n while (bytesToSendBack > 0) {\n let toSend: number = writeBlockSize\n if (toSend > bytesToSendBack) {\n toSend = bytesToSendBack\n }\n\n bytesToSendBack = bytesToSendBack - toSend\n const buf = uint8Buf.subarray(0, toSend)\n\n const sendMore = stream.send(buf)\n\n if (!sendMore) {\n await pEvent(stream, 'drain', {\n rejectionEvents: [\n 'close'\n ]\n })\n }\n }\n\n await stream.close()\n } catch (err: any) {\n stream.abort(err)\n }\n }\n\n async * measurePerformance (ma: Multiaddr, sendBytes: number, receiveBytes: number, options: PerfOptions = {}): AsyncGenerator<PerfOutput> {\n const uint8Buf = new Uint8Array(this.buf)\n const writeBlockSize = this.writeBlockSize\n\n const initialStartTime = Date.now()\n let lastReportedTime = Date.now()\n const connection = await this.components.connectionManager.openConnection(ma, {\n ...options,\n force: options.reuseExistingConnection !== true\n })\n\n const log = connection.log.newScope('perf')\n\n log('opened connection after %d ms', Date.now() - lastReportedTime)\n lastReportedTime = Date.now()\n\n const stream = await connection.newStream(this.protocol, options)\n\n log('opened stream after %d ms', Date.now() - lastReportedTime)\n lastReportedTime = Date.now()\n\n let lastAmountOfBytesSent = 0\n let totalBytesSent = 0\n const uploadStart = Date.now()\n\n // tell the remote how many bytes we will send. Up cast to 64 bit number\n // as if we send as ui32 we limit total transfer size to 4GB\n const view = new DataView(this.buf)\n view.setBigUint64(0, BigInt(receiveBytes), false)\n\n log('sending %i bytes to %p', sendBytes, connection.remotePeer)\n\n try {\n const output = pushable<PerfOutput>({\n objectMode: true\n })\n\n Promise.resolve().then(async () => {\n const sendMore = stream.send(uint8Buf.subarray(0, 8))\n\n if (!sendMore) {\n await pEvent(stream, 'drain', {\n rejectionEvents: [\n 'close'\n ],\n signal: options.signal\n })\n }\n\n while (sendBytes > 0) {\n let toSend: number = writeBlockSize\n\n if (toSend > sendBytes) {\n toSend = sendBytes\n }\n\n const sendMore = stream.send(uint8Buf.subarray(0, toSend))\n\n if (!sendMore) {\n await pEvent(stream, 'drain', {\n rejectionEvents: [\n 'close'\n ],\n signal: options.signal\n })\n }\n\n sendBytes -= toSend\n\n if (Date.now() - lastReportedTime > 1000) {\n output.push({\n type: 'intermediary',\n timeSeconds: (Date.now() - lastReportedTime) / 1000,\n uploadBytes: lastAmountOfBytesSent,\n downloadBytes: 0\n })\n\n // record last reported time after `console.log` because it can\n // affect benchmark timings\n lastReportedTime = Date.now()\n lastAmountOfBytesSent = 0\n }\n\n lastAmountOfBytesSent += toSend\n totalBytesSent += toSend\n }\n\n output.end()\n })\n .catch(err => {\n output.end(err)\n })\n\n yield * output\n\n log('upload complete after %d ms', Date.now() - uploadStart)\n\n await stream.close(options)\n\n // Read the received bytes\n let lastAmountOfBytesReceived = 0\n lastReportedTime = Date.now()\n let totalBytesReceived = 0\n const downloadStart = Date.now()\n\n for await (const buf of stream) {\n if (Date.now() - lastReportedTime > 1000) {\n yield {\n type: 'intermediary',\n timeSeconds: (Date.now() - lastReportedTime) / 1000,\n uploadBytes: 0,\n downloadBytes: lastAmountOfBytesReceived\n }\n\n // record last reported time after `console.log` because it can\n // affect benchmark timings\n lastReportedTime = Date.now()\n lastAmountOfBytesReceived = 0\n }\n\n lastAmountOfBytesReceived += buf.byteLength\n totalBytesReceived += buf.byteLength\n }\n\n log('download complete after %d ms', Date.now() - downloadStart)\n\n if (totalBytesReceived !== receiveBytes) {\n throw new Error(`Expected to receive ${receiveBytes} bytes, but received ${totalBytesReceived}`)\n }\n\n yield {\n type: 'final',\n timeSeconds: (Date.now() - initialStartTime) / 1000,\n uploadBytes: totalBytesSent,\n downloadBytes: totalBytesReceived\n }\n\n log('performed %s to %p', this.protocol, connection.remotePeer)\n } catch (err: any) {\n log('error sending %d/%d bytes to %p: %s', totalBytesSent, sendBytes, connection.remotePeer, err)\n stream.abort(err)\n throw err\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["index_exports", "__export", "perf", "pDefer", "deferred", "resolve", "reject", "FixedFIFO", "hwm", "data", "last", "FIFO", "options", "obj", "val", "prev", "next", "AbortError", "message", "code", "pushable", "options", "_pushable", "buffer", "next", "_pushable", "getNext", "options", "onEnd", "buffer", "FIFO", "pushable", "onNext", "ended", "drain", "pDefer", "waitNext", "resolve", "reject", "next", "err", "bufferNext", "bufferError", "push", "value", "end", "_return", "_throw", "signal", "cancel", "listener", "AbortError", "opts", "TimeoutError", "_TimeoutError", "message", "options", "getAbortedReason", "signal", "pTimeout", "promise", "milliseconds", "fallback", "customTimers", "timer", "abortHandler", "cancelablePromise", "resolve", "reject", "timeoutError", "error", "normalizeOptions", "options", "isCount", "value", "listenerMethodPairs", "normalizeEmitter", "emitter", "addMethod", "removeMethod", "addListener", "removeListener", "listenerHandlers", "families", "handlers", "names", "handler", "name", "attachListeners", "signal", "abortHandler", "isDone", "eventName", "listener", "detachListeners", "createFilterQueue", "filter", "onError", "queue", "onVerdict", "isAccepted", "error", "pEventMultiple", "event", "cancel", "deadlineTimer", "returnValue", "resolve", "reject", "items", "rejectWithReason", "reason", "queueFilter", "acceptItem", "onItem", "arguments_", "rejectHandler", "listening", "timeout", "pTimeout", "pEvent", "arrayPromise", "promise", "array", "alloc", "size", "allocUnsafe", "isByteArrayWithArrayBuffer", "b", "asUint8Array", "buf", "concat", "arrays", "length", "acc", "curr", "output", "allocUnsafe", "offset", "arr", "asUint8Array", "equals", "a", "b", "i", "symbol", "findBufAndOffset", "bufs", "index", "offset", "buf", "bufEnd", "isUint8ArrayList", "value", "Uint8ArrayList", "_Uint8ArrayList", "data", "length", "chunk", "res", "i", "bytes", "beginInclusive", "endExclusive", "concat", "list", "bufStart", "sliceStartInBuf", "sliceEndsInBuf", "start", "search", "needle", "M", "radix", "rightmostPositions", "c", "j", "right", "lastIndex", "lastPatIndex", "skip", "char", "byteOffset", "allocUnsafe", "littleEndian", "alloc", "other", "equals", "acc", "curr", "PROTOCOL_NAME", "Perf", "components", "init", "PROTOCOL_NAME", "stream", "writeBlockSize", "bytesToSendBack", "buf", "list", "Uint8ArrayList", "uint8Buf", "toSend", "pEvent", "err", "ma", "sendBytes", "receiveBytes", "options", "initialStartTime", "lastReportedTime", "connection", "log", "lastAmountOfBytesSent", "totalBytesSent", "uploadStart", "output", "pushable", "lastAmountOfBytesReceived", "totalBytesReceived", "downloadStart", "perf", "init", "components", "Perf"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/perf",
|
|
3
|
-
"version": "5.1.
|
|
3
|
+
"version": "5.1.17",
|
|
4
4
|
"description": "Implementation of Perf Protocol",
|
|
5
5
|
"author": "@maschad / @marcopolo",
|
|
6
6
|
"license": "Apache-2.0 OR MIT",
|
|
@@ -47,15 +47,15 @@
|
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
49
|
"@libp2p/interface": "^3.4.0",
|
|
50
|
-
"@libp2p/interface-internal": "^3.2.
|
|
50
|
+
"@libp2p/interface-internal": "^3.2.1",
|
|
51
51
|
"@multiformats/multiaddr": "^13.0.3",
|
|
52
52
|
"it-pushable": "^3.2.3",
|
|
53
|
-
"p-event": "^
|
|
53
|
+
"p-event": "^8.0.1",
|
|
54
54
|
"uint8arraylist": "^3.0.2"
|
|
55
55
|
},
|
|
56
56
|
"devDependencies": {
|
|
57
|
-
"@libp2p/logger": "^6.2.
|
|
58
|
-
"@libp2p/utils": "^7.4.
|
|
57
|
+
"@libp2p/logger": "^6.2.16",
|
|
58
|
+
"@libp2p/utils": "^7.4.4",
|
|
59
59
|
"aegir": "^48.1.1",
|
|
60
60
|
"it-last": "^3.0.9",
|
|
61
61
|
"sinon-ts": "^2.0.0"
|