UNPKG

pw-js-world

Version:

An optional package for PW-JS-Api, aims to serve world purposes.

691 lines 40.5 kB
"use strict"; /** * CREDIT: Anatoly for making this Buffer Reader so I don't have to! * Source: https://github.com/Anatoly03/pixelwalker.js/blob/9bb3c7e39a45006086a2abae8c515599bd3db835/src/util/buffer-reader.ts * License: ISC */ Object.defineProperty(exports, "__esModule", { value: true }); exports.ComponentTypeHeader = void 0; /** * Data during the communication in the process is dynamic * typed. Every entry is followed by a byte identifying the * type, followed by data. The type header is noted by its' * 7-bit notation. */ var ComponentTypeHeader; (function (ComponentTypeHeader) { ComponentTypeHeader[ComponentTypeHeader["String"] = 0] = "String"; ComponentTypeHeader[ComponentTypeHeader["Byte"] = 1] = "Byte"; ComponentTypeHeader[ComponentTypeHeader["Int16"] = 2] = "Int16"; ComponentTypeHeader[ComponentTypeHeader["Int32"] = 3] = "Int32"; ComponentTypeHeader[ComponentTypeHeader["Int64"] = 4] = "Int64"; ComponentTypeHeader[ComponentTypeHeader["Float"] = 5] = "Float"; ComponentTypeHeader[ComponentTypeHeader["Double"] = 6] = "Double"; ComponentTypeHeader[ComponentTypeHeader["Boolean"] = 7] = "Boolean"; ComponentTypeHeader[ComponentTypeHeader["ByteArray"] = 8] = "ByteArray"; ComponentTypeHeader[ComponentTypeHeader["UInt32"] = 9] = "UInt32"; })(ComponentTypeHeader || (exports.ComponentTypeHeader = ComponentTypeHeader = {})); /** * A Buffer reader is a special buffer extension made to perform * game-specific tasks in the field of communication. * * @implements Buffer */ class BufferReader { /** * */ constructor(buffer) { this.offset = 0; this.buffer = buffer; } // // // Static Methods // // /** * */ static from(from) { if (from instanceof Buffer) return new BufferReader(from); return new BufferReader(Buffer.from(from)); } /** * */ static alloc(amount) { return BufferReader.from(Buffer.alloc(amount)); } // // // Message Component Types // // /** * @param {string} value * @returns {Buffer} */ static String(value = '') { const stringByteLen = Buffer.byteLength(value); const lengthByteCount = this.length7BitInt(stringByteLen); const buffer = BufferReader.alloc(1 + lengthByteCount + stringByteLen); buffer.writeUInt8(ComponentTypeHeader.String); buffer.write7BitInt(stringByteLen); buffer.write(value); return buffer.toBuffer(); } /** * @param {number} value * @returns {Buffer} */ static Byte(value = 0) { const buffer = BufferReader.alloc(2); buffer.writeUInt8(ComponentTypeHeader.Byte); buffer.writeUInt8(value); return buffer.toBuffer(); } /** * @param {number} value * @returns {Buffer} */ static Int16(value = 0) { const buffer = BufferReader.alloc(3); buffer.writeUInt8(ComponentTypeHeader.Int16); buffer.writeInt16BE(value); return buffer.toBuffer(); } /** * @param {number} value * @returns {Buffer} */ static Int32(value = 0) { const buffer = BufferReader.alloc(5); buffer.writeUInt8(ComponentTypeHeader.Int32); buffer.writeInt32BE(value); return buffer.toBuffer(); } /** * @param {bigint} value * @returns {Buffer} */ static Int64(value = BigInt(0).valueOf()) { const buffer = BufferReader.alloc(9); buffer.writeUInt8(ComponentTypeHeader.Int64); buffer.writeBigInt64BE(value); return buffer.toBuffer(); } /** * @param {number} value * @returns {Buffer} */ static Float(value = 0) { const buffer = BufferReader.alloc(5); buffer.writeUInt8(ComponentTypeHeader.Float); buffer.writeFloatBE(value); return buffer.toBuffer(); } /** * @param {number} value * @returns {Buffer} */ static Double(value = 0) { const buffer = BufferReader.alloc(9); buffer.writeUInt8(ComponentTypeHeader.Double); buffer.writeDoubleBE(value); return buffer.toBuffer(); } /** * @param {boolean} value * @returns {Buffer} */ static Boolean(value = false) { const buffer = BufferReader.alloc(2); buffer.writeUInt8(ComponentTypeHeader.Boolean); buffer.writeUInt8(value ? 1 : 0); return buffer.toBuffer(); } /** * @param {Uint8Array} buffer * @returns {Buffer} */ static ByteArray(buffer = Buffer.from([0])) { const bufferLength = Buffer.byteLength(buffer); const prefix = BufferReader.alloc(2); prefix.writeUInt8(ComponentTypeHeader.ByteArray); prefix.writeUInt8(bufferLength); return Buffer.concat([prefix.toBuffer(), buffer]); } /** * @param {number} value * @returns {Buffer} */ static UInt32(value = 0) { const buffer = BufferReader.alloc(5); buffer.writeUInt8(ComponentTypeHeader.UInt32); buffer.writeUInt32BE(value); return buffer.toBuffer(); } /** * @param {number} value * @returns {Buffer} */ static Magic(value) { if (value === undefined) throw new Error('Received undefined magic byte'); return Buffer.from([value]); } /** * @param {number} value * @returns {Buffer} */ static Bit7(value = 0) { const buffer = BufferReader.alloc(this.length7BitInt(value)); buffer.write7BitInt(value); return buffer.toBuffer(); } /** * @param tt * @param value */ static Dynamic(tt, value) { switch (tt) { case ComponentTypeHeader.String: return this.String(value); case ComponentTypeHeader.Byte: return this.Byte(value); case ComponentTypeHeader.Int16: return this.Int16(value); case ComponentTypeHeader.Int32: return this.Int32(value); case ComponentTypeHeader.Int64: return this.Int64(value); case ComponentTypeHeader.Float: return this.Float(value); case ComponentTypeHeader.Double: return this.Double(value); case ComponentTypeHeader.Boolean: return this.Boolean(value); case ComponentTypeHeader.ByteArray: return this.ByteArray(value); case ComponentTypeHeader.UInt32: return this.UInt32(value); } } // // // Overrides // // /** * */ get length() { return this.buffer.length - this.offset; } /** * */ subarray(start = this.offset, end = this.length) { return new BufferReader(this.buffer.subarray(start, this.offset + end)); } /** * */ write(value) { return (this.offset = this.buffer.write(value, this.offset)); } /** * */ writeBigInt64BE(value) { return (this.offset = this.buffer.writeBigInt64BE(value, this.offset)); } /** * */ writeBigInt64LE(value) { return (this.offset = this.buffer.writeBigInt64LE(value, this.offset)); } /** * */ writeUInt8(value) { return (this.offset = this.buffer.writeUInt8(value, this.offset)); } /** * */ writeUInt16LE(value) { return (this.offset = this.buffer.writeUInt16LE(value, this.offset)); } /** * */ writeUInt16BE(value) { return (this.offset = this.buffer.writeUInt16BE(value, this.offset)); } /** * */ writeUInt32LE(value) { return (this.offset = this.buffer.writeUInt32LE(value, this.offset)); } /** * */ writeUInt32BE(value) { return (this.offset = this.buffer.writeUInt32BE(value, this.offset)); } /** * */ writeInt8(value) { return (this.offset = this.buffer.writeInt8(value, this.offset)); } /** * */ writeInt16LE(value) { return (this.offset = this.buffer.writeInt16LE(value, this.offset)); } /** * */ writeInt16BE(value) { return (this.offset = this.buffer.writeInt16BE(value, this.offset)); } /** * */ writeInt32LE(value) { return (this.offset = this.buffer.writeInt32LE(value, this.offset)); } /** * */ writeInt32BE(value) { return (this.offset = this.buffer.writeInt32BE(value, this.offset)); } /** * */ writeFloatLE(value) { return (this.offset = this.buffer.writeFloatLE(value, this.offset)); } /** * */ writeFloatBE(value) { return (this.offset = this.buffer.writeFloatBE(value, this.offset)); } /** * */ writeDoubleLE(value) { return (this.offset = this.buffer.writeDoubleLE(value, this.offset)); } /** * */ writeDoubleBE(value) { return (this.offset = this.buffer.writeDoubleBE(value, this.offset)); } /** * */ readBigUInt64BE() { const tmp = this.buffer.readBigUInt64BE(this.offset); this.offset += 8; return tmp; } /** * */ readBigUInt64LE() { const tmp = this.buffer.readBigUInt64LE(this.offset); this.offset += 8; return tmp; } /** * */ readBigInt64BE() { const tmp = this.buffer.readBigInt64BE(this.offset); this.offset += 8; return tmp; } /** * */ readBigInt64LE() { const tmp = this.buffer.readBigInt64LE(this.offset); this.offset += 8; return tmp; } // public readUIntLE() { // const tmp = this.buffer.readUIntLE(this.offset); // this.offset += 1; // return tmp; // } // public readUIntBE() { // const tmp = this.buffer.readUIntBE(this.offset); // this.offset += 1; // return tmp; // } // public readIntLE() { // const tmp = this.buffer.readIntLE(this.offset); // this.offset += 1; // return tmp; // } // public readIntBE() { // const tmp = this.buffer.readIntBE(this.offset); // this.offset += 1; // return tmp; // } /** * */ expectUInt8(value) { const tmp = this.buffer.readUInt8(this.offset); this.offset += 1; if (tmp !== value) throw new Error(`Expected ${value} but got ${tmp}`); return tmp; } /** * */ readUInt8() { const tmp = this.buffer.readUInt8(this.offset); this.offset += 1; return tmp; } /** * */ readUInt16LE() { const tmp = this.buffer.readUInt16LE(this.offset); this.offset += 2; return tmp; } /** * */ readUInt16BE() { const tmp = this.buffer.readUInt16BE(this.offset); this.offset += 2; return tmp; } /** * */ readUInt32LE() { const tmp = this.buffer.readUInt32LE(this.offset); this.offset += 4; return tmp; } /** * */ readUInt32BE() { const tmp = this.buffer.readUInt32BE(this.offset); this.offset += 4; return tmp; } /** * */ readInt8() { const tmp = this.buffer.readInt8(this.offset); this.offset += 1; return tmp; } /** * */ readInt16LE() { const tmp = this.buffer.readInt16LE(this.offset); this.offset += 2; return tmp; } /** * */ readInt16BE() { const tmp = this.buffer.readInt16BE(this.offset); this.offset += 2; return tmp; } /** * */ readInt32LE() { const tmp = this.buffer.readInt32LE(this.offset); this.offset += 4; return tmp; } /** * */ readInt32BE() { const tmp = this.buffer.readInt32BE(this.offset); this.offset += 4; return tmp; } /** * */ readFloatLE() { const tmp = this.buffer.readFloatLE(this.offset); this.offset += 4; return tmp; } /** * */ readFloatBE() { const tmp = this.buffer.readFloatBE(this.offset); this.offset += 4; return tmp; } /** * */ readDoubleLE() { const tmp = this.buffer.readDoubleLE(this.offset); this.offset += 8; return tmp; } /** * */ readDoubleBE() { const tmp = this.buffer.readDoubleBE(this.offset); this.offset += 8; return tmp; } read(tt, little = true) { switch (tt) { case ComponentTypeHeader.String: return this.readDynamicBuffer().toString("ascii"); case ComponentTypeHeader.Byte: return this.readUInt8(); case ComponentTypeHeader.Int16: return little ? this.readInt16LE() : this.readInt16BE(); case ComponentTypeHeader.Int32: return little ? this.readInt32LE() : this.readInt32BE(); case ComponentTypeHeader.Int64: return little ? this.readBigInt64LE() : this.readBigInt64BE(); case ComponentTypeHeader.Float: return little ? this.readFloatLE() : this.readFloatBE(); case ComponentTypeHeader.Double: return little ? this.readDoubleLE() : this.readDoubleBE(); case ComponentTypeHeader.Boolean: return !!this.readUInt8(); case ComponentTypeHeader.ByteArray: return this.readDynamicBuffer(); case ComponentTypeHeader.UInt32: return little ? this.readUInt32LE() : this.readUInt32BE(); } } // // // Methods // // /** * */ toBuffer() { return this.buffer; } /** * https://stackoverflow.com/questions/8609289/convert-a-binary-nodejs-buffer-to-javascript-arraybuffer */ toArrayBuffer() { const arrayBuffer = new ArrayBuffer(this.length); const view = new Uint8Array(arrayBuffer); for (let i = 0; i < this.length; ++i) { view[i] = this.buffer[i]; } return arrayBuffer; } /** * */ at(idx) { return this.buffer[idx]; } /** * Advanced the buffer reader by pffset. */ advanceOffset(relativeOffset = 1) { this.offset += relativeOffset; return this; } /** * This function reads how many bytes a normal integer would take * as a 7-bit number * * 1(000 0001) 0(111 1110) */ static length7BitInt(value) { let size = 0; do (value >>= 7), size++; while (value > 0); return size; } /** * Reads in an integer in 7-bit notation. A 7-bit integer * encoding splits a number into a variable size of bits, * in which the first bit is set while bytes are following. * * @example * * ``` * 1111 0000 1010 1010 1000 0000 0000 0001 Reading In * ^--- ---- ^--- ---- ^--- ---- ^--- ---- * 111 0000 010 1010 000 0000 000 0001 Writing Out * ``` */ read7BitInt() { let value = 0, shift = 0, byte = 0xff; while (byte & 0x80) { byte = this.readUInt8(); value |= (byte & 0x7f) << shift; shift += 7; } return value; } /** * Write a normal integer value into buffer at offset. */ write7BitInt(value) { while (value >= 128) { this.writeUInt8((value & 127) | 128); value >>= 7; } this.writeUInt8(value); } /** * Reads a dynamic buffer which is prepended by its' length * in 7-bit encoding. */ readDynamicBuffer() { const length = this.read7BitInt(); const value = this.subarray(this.offset, length); this.offset += length; return value.toBuffer(); } /** * Append a buffer to the current buffer. Asserts the cursor * to be at the end of the current buffer. */ append(buffer) { if (this.offset !== this.length - 1) throw new Error("Cursor hasn't finished reading yet."); this.buffer = Buffer.concat([this.buffer, buffer]); return this; } /** * Keep Deserializing the buffer for typed data until * you reach the end of the buffer. Typed data consists * of a type indicator in 7-bit-encoding and data following * accordingly. */ deserialize() { const arr = []; while (this.length > 0) { const type = this.read7BitInt(); switch (type) { case ComponentTypeHeader.String: arr.push(this.readDynamicBuffer().toString("ascii")); break; case ComponentTypeHeader.Byte: arr.push(this.readUInt8()); break; case ComponentTypeHeader.Int16: // = Int16 (short) arr.push(this.readInt16BE()); break; case ComponentTypeHeader.Int32: // = Int32 arr.push(this.readInt32BE()); break; case ComponentTypeHeader.Int64: arr.push(this.readBigInt64BE()); break; case ComponentTypeHeader.Float: arr.push(this.readFloatBE()); break; case ComponentTypeHeader.Double: arr.push(this.readDoubleBE()); break; case ComponentTypeHeader.Boolean: arr.push(!!this.readUInt8()); // !! is truthy break; case ComponentTypeHeader.ByteArray: arr.push(this.readDynamicBuffer()); break; case ComponentTypeHeader.UInt32: arr.push(this.readUInt32BE()); break; default: throw new Error(`While serializing a buffer for data, an unexpected type 0x${type.toString(16)} was read. Expected one of 0-8`); } } return arr; } [Symbol.for("nodejs.util.inspect.custom")]() { let s = '<BufferReader'; let copy = BufferReader.from(this.buffer); copy.offset = this.offset; for (let i = 0; i < 20 && this.offset + i < this.length - 1; i++) { s += ' ' + copy.readUInt8().toString(16).padStart(2, '0'); } return s + '>'; } } exports.default = BufferReader; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnVmZmVyUmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL0J1ZmZlclJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7R0FJRzs7O0FBRUg7Ozs7O0dBS0c7QUFDSCxJQUFZLG1CQVdYO0FBWEQsV0FBWSxtQkFBbUI7SUFDM0IsaUVBQVUsQ0FBQTtJQUNWLDZEQUFRLENBQUE7SUFDUiwrREFBUyxDQUFBO0lBQ1QsK0RBQVMsQ0FBQTtJQUNULCtEQUFTLENBQUE7SUFDVCwrREFBUyxDQUFBO0lBQ1QsaUVBQVUsQ0FBQTtJQUNWLG1FQUFXLENBQUE7SUFDWCx1RUFBYSxDQUFBO0lBQ2IsaUVBQVUsQ0FBQTtBQUNkLENBQUMsRUFYVyxtQkFBbUIsbUNBQW5CLG1CQUFtQixRQVc5QjtBQUVEOzs7OztHQUtHO0FBQ0gsTUFBcUIsWUFBWTtJQUk3Qjs7T0FFRztJQUNILFlBQW9CLE1BQWM7UUFMMUIsV0FBTSxHQUFXLENBQUMsQ0FBQztRQU12QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUN6QixDQUFDO0lBRUQsRUFBRTtJQUNGLEVBQUU7SUFDRixpQkFBaUI7SUFDakIsRUFBRTtJQUNGLEVBQUU7SUFFRjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBeUI7UUFDeEMsSUFBSSxJQUFJLFlBQVksTUFBTTtZQUFFLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUQsT0FBTyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFjO1FBQzlCLE9BQU8sWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELEVBQUU7SUFDRixFQUFFO0lBQ0YsMEJB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