UNPKG

beson

Version:

Yet an another binary representation of json format

79 lines (61 loc) 1.64 kB
/** * Author: JCloudYu * Create: 2019/09/18 **/ import {DeserializeBuffer} from "src/deserialize.esm.js"; import {MergeArrayBuffers} from "src/helper.esm.js"; const _PRIVATES = new WeakMap(); //@export=deserializer const EMPTY_BUFFER = new Uint8Array(new ArrayBuffer(0)); class Deserializer { constructor() { _PRIVATES.set(this, { buffer:EMPTY_BUFFER }); this.throw_if_error = false; } read() { const that = _PRIVATES.get(this); const result = DeserializeBuffer(that.buffer); if ( result === undefined ) { if ( this.throw_if_error ) { throw new TypeError( "Data stored in Deserializer is not encoded in valid beson format" ); } return undefined; } else if ( result === false ) { return undefined; } else { const {anchor, value} = result; that.buffer = that.buffer.slice(anchor); return value; } } append(input_buffer) { if ( ArrayBuffer.isView(input_buffer) ) { input_buffer = input_buffer.buffer; } if ( !(input_buffer instanceof ArrayBuffer) ) { throw new TypeError( "Given buffer is not an ArrayBuffer!" ); } const that = _PRIVATES.get(this); that.buffer = new Uint8Array(MergeArrayBuffers(that.buffer.buffer, input_buffer)); return this; } get size() { return _PRIVATES.get(this).buffer.length; } get buffer() { return _PRIVATES.get(this).buffer.slice(0).buffer; } static init(input_buffer=null) { const deserializer = new Deserializer(); if ( input_buffer === null ) { input_buffer = EMPTY_BUFFER } deserializer.append(input_buffer); return deserializer; } } //@endexport export {Deserializer};