it-byte-stream
Version:
Read and write arbitrary bytes over a duplex stream
4 lines (3 loc) • 9.55 kB
JavaScript
(function (root, factory) {(typeof module === 'object' && module.exports) ? module.exports = factory() : root.ItByteStream = factory()}(typeof self !== 'undefined' ? self : this, function () {
"use strict";var ItByteStream=(()=>{var U=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var E=(s,t)=>{for(var e in t)U(s,e,{get:t[e],enumerable:!0})},F=(s,t,e,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of O(t))!S.call(s,n)&&n!==e&&U(s,n,{get:()=>t[n],enumerable:!(r=B(t,n))||r.enumerable});return s};var I=s=>F(U({},"__esModule",{value:!0}),s);var P={};E(P,{byteStream:()=>k});function w(){let s={};return s.promise=new Promise((t,e)=>{s.resolve=t,s.reject=e}),s}var d=class extends Error{type;code;constructor(t,e,r){super(t??"The operation was aborted"),this.type="aborted",this.name=r??"AbortError",this.code=e??"ABORT_ERR"}};async function y(s,t,e){if(t==null)return s;if(t.aborted)return s.catch(()=>{}),Promise.reject(new d(e?.errorMessage,e?.errorCode,e?.errorName));let r,n=new d(e?.errorMessage,e?.errorCode,e?.errorName);try{return await Promise.race([s,new Promise((a,i)=>{r=()=>{i(n)},t.addEventListener("abort",r)})])}finally{r!=null&&t.removeEventListener("abort",r)}}var v=class{readNext;haveNext;ended;nextResult;error;constructor(){this.ended=!1,this.readNext=w(),this.haveNext=w()}[Symbol.asyncIterator](){return this}async next(){if(this.nextResult==null&&await this.haveNext.promise,this.nextResult==null)throw new Error("HaveNext promise resolved but nextResult was undefined");let t=this.nextResult;return this.nextResult=void 0,this.readNext.resolve(),this.readNext=w(),t}async throw(t){return this.ended=!0,this.error=t,t!=null&&(this.haveNext.promise.catch(()=>{}),this.haveNext.reject(t)),{done:!0,value:void 0}}async return(){let t={done:!0,value:void 0};return this.ended=!0,this.nextResult=t,this.haveNext.resolve(),t}async push(t,e){await this._push(t,e)}async end(t,e){t!=null?await this.throw(t):await this._push(void 0,e)}async _push(t,e){if(t!=null&&this.ended)throw this.error??new Error("Cannot push value onto an ended pushable");for(;this.nextResult!=null;)await this.readNext.promise;t!=null?this.nextResult={done:!1,value:t}:(this.ended=!0,this.nextResult={done:!0,value:void 0}),this.haveNext.resolve(),this.haveNext=w(),await y(this.readNext.promise,e?.signal,e)}};function N(){return new v}function h(s=0){return new Uint8Array(s)}function g(s=0){return new Uint8Array(s)}function x(s,t){t==null&&(t=s.reduce((n,a)=>n+a.length,0));let e=g(t),r=0;for(let n of s)e.set(n,r),r+=n.length;return e}function D(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 R=Symbol.for("@achingbrain/uint8arraylist");function V(s,t){if(t==null||t<0)throw new RangeError("index is out of bounds");let e=0;for(let r of s){let n=e+r.byteLength;if(t<n)return{buf:r,index:t-e};e=n}throw new RangeError("index is out of bounds")}function m(s){return!!s?.[R]}var p=class s{bufs;length;[R]=!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 r of t)if(r instanceof Uint8Array)e+=r.byteLength,this.bufs.push(r);else if(m(r))e+=r.byteLength,this.bufs.push(...r.bufs);else throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}prepend(...t){this.prependAll(t)}prependAll(t){let e=0;for(let r of t.reverse())if(r instanceof Uint8Array)e+=r.byteLength,this.bufs.unshift(r);else if(m(r))e+=r.byteLength,this.bufs.unshift(...r.bufs);else throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");this.length+=e}get(t){let e=V(this.bufs,t);return e.buf[e.index]}set(t,e){let r=V(this.bufs,t);r.buf[r.index]=e}write(t,e=0){if(t instanceof Uint8Array)for(let r=0;r<t.length;r++)this.set(e+r,t[r]);else if(m(t))for(let r=0;r<t.length;r++)this.set(e+r,t.get(r));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:r,length:n}=this._subList(t,e);return x(r,n)}subarray(t,e){let{bufs:r,length:n}=this._subList(t,e);return r.length===1?r[0]:x(r,n)}sublist(t,e){let{bufs:r,length:n}=this._subList(t,e),a=new s;return a.length=n,a.bufs=[...r],a}_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 r=[],n=0;for(let a=0;a<this.bufs.length;a++){let i=this.bufs[a],o=n,f=o+i.byteLength;if(n=f,t>=f)continue;let l=t>=o&&t<f,b=e>o&&e<=f;if(l&&b){if(t===o&&e===f){r.push(i);break}let u=t-o;r.push(i.subarray(u,u+(e-t)));break}if(l){if(t===0){r.push(i);continue}r.push(i.subarray(t-o));continue}if(b){if(e===f){r.push(i);break}r.push(i.subarray(0,e-o));break}r.push(i)}return{bufs:r,length:e-t}}indexOf(t,e=0){if(!m(t)&&!(t instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');let r=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 n=r.byteLength;if(n===0)throw new TypeError("search must be at least 1 byte long");let a=256,i=new Int32Array(a);for(let u=0;u<a;u++)i[u]=-1;for(let u=0;u<n;u++)i[r[u]]=u;let o=i,f=this.byteLength-r.byteLength,l=r.byteLength-1,b;for(let u=e;u<=f;u+=b){b=0;for(let c=l;c>=0;c--){let A=this.get(u+c);if(r[c]!==A){b=Math.max(1,c-o[A]);break}}if(b===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 r=g(1);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt8(0,e),this.write(r,t)}getInt16(t,e){let r=this.subarray(t,t+2);return new DataView(r.buffer,r.byteOffset,r.byteLength).getInt16(0,e)}setInt16(t,e,r){let n=h(2);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt16(0,e,r),this.write(n,t)}getInt32(t,e){let r=this.subarray(t,t+4);return new DataView(r.buffer,r.byteOffset,r.byteLength).getInt32(0,e)}setInt32(t,e,r){let n=h(4);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt32(0,e,r),this.write(n,t)}getBigInt64(t,e){let r=this.subarray(t,t+8);return new DataView(r.buffer,r.byteOffset,r.byteLength).getBigInt64(0,e)}setBigInt64(t,e,r){let n=h(8);new DataView(n.buffer,n.byteOffset,n.byteLength).setBigInt64(0,e,r),this.write(n,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 r=g(1);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint8(0,e),this.write(r,t)}getUint16(t,e){let r=this.subarray(t,t+2);return new DataView(r.buffer,r.byteOffset,r.byteLength).getUint16(0,e)}setUint16(t,e,r){let n=h(2);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint16(0,e,r),this.write(n,t)}getUint32(t,e){let r=this.subarray(t,t+4);return new DataView(r.buffer,r.byteOffset,r.byteLength).getUint32(0,e)}setUint32(t,e,r){let n=h(4);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint32(0,e,r),this.write(n,t)}getBigUint64(t,e){let r=this.subarray(t,t+8);return new DataView(r.buffer,r.byteOffset,r.byteLength).getBigUint64(0,e)}setBigUint64(t,e,r){let n=h(8);new DataView(n.buffer,n.byteOffset,n.byteLength).setBigUint64(0,e,r),this.write(n,t)}getFloat32(t,e){let r=this.subarray(t,t+4);return new DataView(r.buffer,r.byteOffset,r.byteLength).getFloat32(0,e)}setFloat32(t,e,r){let n=h(4);new DataView(n.buffer,n.byteOffset,n.byteLength).setFloat32(0,e,r),this.write(n,t)}getFloat64(t,e){let r=this.subarray(t,t+8);return new DataView(r.buffer,r.byteOffset,r.byteLength).getFloat64(0,e)}setFloat64(t,e,r){let n=h(8);new DataView(n.buffer,n.byteOffset,n.byteLength).setFloat64(0,e,r),this.write(n,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(!D(this.bufs[e],t.bufs[e]))return!1;return!0}static fromUint8Arrays(t,e){let r=new s;return r.bufs=t,e==null&&(e=t.reduce((n,a)=>n+a.byteLength,0)),r.length=e,r}};var L=class extends Error{name="UnexpectedEOFError";code="ERR_UNEXPECTED_EOF"};function k(s,t){let e=N();s.sink(e).catch(async i=>{await e.end(i)}),s.sink=async i=>{for await(let o of i)await e.push(o);await e.end()};let r=s.source;s.source[Symbol.iterator]!=null?r=s.source[Symbol.iterator]():s.source[Symbol.asyncIterator]!=null&&(r=s.source[Symbol.asyncIterator]());let n=new p;return{read:async i=>{if(i?.signal?.throwIfAborted(),i?.bytes==null){let{done:f,value:l}=await y(r.next(),i?.signal);return f===!0?null:l}for(;n.byteLength<i.bytes;){let{value:f,done:l}=await y(r.next(),i?.signal);if(l===!0)throw new L("unexpected end of input");n.append(f)}let o=n.sublist(0,i.bytes);return n.consume(i.bytes),o},write:async(i,o)=>{o?.signal?.throwIfAborted(),i instanceof Uint8Array?await e.push(i,o):await e.push(i.subarray(),o)},unwrap:()=>{if(n.byteLength>0){let i=s.source;s.source=async function*(){t?.yieldBytes===!1?yield n:yield*n,yield*i}()}return s}}}return I(P);})();
return ItByteStream}));