pw-js-world
Version:
An optional package for PW-JS-Api, aims to serve world purposes.
691 lines • 40.5 kB
JavaScript
"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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