UNPKG

packme-js

Version:

Blazing fast binary serialization via auto-generated classes from simple JSON manifest files.

2 lines (1 loc) 4.42 kB
class t{#t;#e={};constructor(t){this.#t=t}static dye(t){return"string"==typeof t?`${t}`:"number"==typeof t||"bigint"==typeof t||"boolean"==typeof t?`${t}`:t instanceof Uint8Array?`[${t}]`:t instanceof Array?`[${t.map((t=>this.dye(t))).join(", ")}]`:`${t}`}register(t){for(let e in t)this.#e[e]=t[e]}pack(t){try{return t.$pack(),t.$data}catch(t){return this.#t?.(`Packing message failed: ${t.message}`,t.stack),null}}unpack(t){try{if(t.length<4)return null;let e=new DataView(t.buffer),s=e.getUint32(0,!1),i=this.#e[s]();return i.$data=t,i.$view=e,i.$unpack(),i}catch(t){return this.#t?.(`Unpacking message failed: ${t.message}`,t.stack),null}}}let e=new TextEncoder,s=new TextDecoder;class i{static#s=0;#i=0;$data;$view;#n;$flags=[];$bools=[];#f=0;#o=0;get $transactionId(){return this.#n||-1}set $request(t){this.#n=t.#n}$ensure(t,e){if(void 0===e)throw new Error(`Missing required parameter: ${t}`);if(null==e)throw new Error(`Parameter cannot be null: ${t}`);return e}$estimate(){throw new Error("Method $estimate() is not implemented!")}$pack(){throw new Error("Method $pack() is not implemented!")}$unpack(){throw new Error("Method $unpack() is not implemented!")}$initPack(t){this.$data=new Uint8Array(this.$estimate()),this.$view=new DataView(this.$data.buffer),this.$packUint32(t),this.$packUint32(null!=this.#n?this.#n:this.#n=4294967295&++i.#s)}$initUnpack(){this.$unpackUint32(),this.#n=this.$unpackUint32()}$reset(){this.$data=null,this.$view=null,this.#i=0,this.$flags=[],this.$bools=[],this.#f=0}$setFlag(t){let e=Math.floor(this.#f/8);e>=this.$flags.length&&this.$flags.push(0),t&&(this.$flags[e]|=1<<this.#f%8),this.#f++}$getFlag(){let t=Math.floor(this.#f/8),e=1==(this.$flags[t]>>>this.#f%8&1);return this.#f++,e}$setBool(t){let e=Math.floor(this.#o/8);e>=this.$flags.length&&this.$flags.push(0),t&&(this.$flags[e]|=1<<this.#o%8),this.#o++}$getBool(){let t=Math.floor(this.#o/8),e=1==(this.$flags[t]>>>this.#o%8&1);return this.#o++,e}$stringBytes(t){return 4+e.encode(t).length}$packMessage(t){t.$data=this.$data,t.$view=this.$view,t.#i=this.#i,t.$pack(),this.#i=t.#i}$unpackMessage(t){return t.$data=this.$data,t.$view=this.$view,t.#i=this.#i,t.$unpack(),this.#i=t.#i,t}$packBinary(t,e){for(let s=0;s<e;s++)this.$view.setUint8(this.#i++,t[s]||0)}$packBool(t){this.$view.setUint8(this.#i,t?1:0),this.#i++}$packInt8(t){this.$view.setInt8(this.#i,t),this.#i++}$packInt16(t){this.$view.setInt16(this.#i,t,!1),this.#i+=2}$packInt32(t){this.$view.setInt32(this.#i,t,!1),this.#i+=4}$packInt64(t){this.$view.setBigInt64(this.#i,t,!1),this.#i+=8}$packUint8(t){this.$view.setUint8(this.#i,t),this.#i++}$packUint16(t){this.$view.setUint16(this.#i,t,!1),this.#i+=2}$packUint32(t){this.$view.setUint32(this.#i,t,!1),this.#i+=4}$packUint64(t){"number"==typeof t&&(t=BigInt(t)),this.$view.setBigUint64(this.#i,t,!1),this.#i+=8}$packFloat(t){this.$view.setFloat32(this.#i,t,!1),this.#i+=4}$packDouble(t){this.$view.setFloat64(this.#i,t,!1),this.#i+=8}$packDateTime(t){this.$view.setBigInt64(this.#i,BigInt(t.getTime()),!1),this.#i+=8}$packString(t){let s=e.encode(t);this.$view.setUint32(this.#i,s.length,!1),this.#i+=4;for(let t=0;t<s.length;t++)this.$view.setInt8(this.#i++,s[t])}$unpackBinary(t){let e=new Uint8Array(t);for(let s=0;s<t;s++)e[s]=this.$view.getUint8(this.#i++);return e}$unpackBool(){let t=this.$view.getUint8(this.#i);return this.#i++,1===t}$unpackInt8(){let t=this.$view.getInt8(this.#i);return this.#i++,t}$unpackInt16(){let t=this.$view.getInt16(this.#i,!1);return this.#i+=2,t}$unpackInt32(){let t=this.$view.getInt32(this.#i,!1);return this.#i+=4,t}$unpackInt64(){let t=this.$view.getBigInt64(this.#i,!1);return this.#i+=8,t}$unpackUint8(){let t=this.$view.getUint8(this.#i);return this.#i++,t}$unpackUint16(){let t=this.$view.getUint16(this.#i,!1);return this.#i+=2,t}$unpackUint32(){let t=this.$view.getUint32(this.#i,!1);return this.#i+=4,t}$unpackUint64(){let t=this.$view.getBigUint64(this.#i,!1);return this.#i+=8,t}$unpackFloat(){let t=this.$view.getFloat32(this.#i,!1);return this.#i+=4,t}$unpackDouble(){let t=this.$view.getFloat64(this.#i,!1);return this.#i+=8,t}$unpackDateTime(){let t=this.$view.getBigInt64(this.#i,!1);return this.#i+=8,new Date(Number(t))}$unpackString(){let t=this.$view.getUint32(this.#i,!1);this.#i+=4;let e=s.decode(this.$data.subarray(this.#i,this.#i+t));return this.#i+=t,e}}export{t as PackMe,i as PackMeMessage};