UNPKG

@jsprismarine/nbt

Version:
90 lines (89 loc) 12.7 kB
import { ByteOrder } from "./ByteOrder.es.js"; import ByteValue from "./types/ByteVal.es.js"; import DoubleValue from "./types/DoubleVal.es.js"; import FloatValue from "./types/FloatVal.es.js"; import LongValue from "./types/LongVal.es.js"; import NumberValue from "./types/NumberVal.es.js"; import ShortValue from "./types/ShortVal.es.js"; import StringValue from "./types/StringVal.es.js"; //#region src/NBTStreamReader.ts var NBTStreamReader = class { input; byteOrder; useVarint = false; allocateLimit = -1; constructor(input, byteOrder) { this.input = input; this.byteOrder = byteOrder; } isUsingVarint() { return this.useVarint; } setUseVarint(useVarint) { this.useVarint = useVarint; } setAllocateLimit(allocateLimit) { this.allocateLimit = allocateLimit; } readByteValue() { this.expectInput(1, "Invalid NBT Data: Expected byte"); return new ByteValue(this.input.readByte()); } readStringValue() { const length = this.useVarint ? this.input.readUnsignedVarInt() : this.readShortValue().getValue(); this.expectInput(length, "Invalid NBT Data: Expected string bytes"); return new StringValue(this.input.read(length).toString("utf8")); } readShortValue() { this.expectInput(2, "Invalid NBT Data: Expected short"); if (this.byteOrder === ByteOrder.LITTLE_ENDIAN) return new ShortValue(this.input.readShortLE()); return new ShortValue(this.input.readShort()); } readIntValue() { if (this.useVarint) return new NumberValue(this.input.readVarInt()); this.expectInput(4, "Invalid NBT Data: Expected int"); if (this.byteOrder === ByteOrder.LITTLE_ENDIAN) return new NumberValue(this.input.readIntLE()); return new NumberValue(this.input.readInt()); } readLongValue() { if (this.useVarint) return new LongValue(this.input.readVarLong()); this.expectInput(8, "Invalid NBT Data: Expected long"); if (this.byteOrder === ByteOrder.LITTLE_ENDIAN) return new LongValue(this.input.readLongLE()); return new LongValue(this.input.readLong()); } readFloatValue() { this.expectInput(4, "Invalid NBT Data: Expected long"); if (this.byteOrder === ByteOrder.LITTLE_ENDIAN) return new FloatValue(this.input.readFloatLE()); return new FloatValue(this.input.readFloat()); } readDoubleValue() { this.expectInput(8, "Invalid NBT Data: Expected double"); if (this.byteOrder === ByteOrder.LITTLE_ENDIAN) return new DoubleValue(this.input.readDoubleLE()); return new DoubleValue(this.input.readDouble()); } readByteArrayValue() { const size = this.readIntValue().getValue(); this.expectInput(size, "Invalid NBT Data: Expected byte array data"); return this.input.read(size); } readIntArrayValue() { const size = this.readIntValue().getValue(); this.expectInput(this.isUsingVarint() ? size : size * 4, "Invalid NBT Data: Expected int array data"); const result = []; for (let i = 0; i < size; i++) result.push(this.readIntValue().getValue()); return result; } expectInput(remaining, message, alterAllocationLimit = true) { if (alterAllocationLimit) this.alterAllocationLimit(remaining); const length = this.input.readRemaining().byteLength; this.input.skip(-length); if (length < remaining) throw new Error(message); } alterAllocationLimit(remaining) { if (this.allocateLimit !== -1) if (this.allocateLimit - remaining < 0) throw new Error("Could not allocate more bytes due to reaching the set limit"); else this.allocateLimit -= remaining; } }; //#endregion export { NBTStreamReader as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUU3RyZWFtUmVhZGVyLmVzLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uL3NyYy9OQlRTdHJlYW1SZWFkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgQnl0ZVZhbCBmcm9tICcuL3R5cGVzL0J5dGVWYWwnO1xuaW1wb3J0IERvdWJsZVZhbCBmcm9tICcuL3R5cGVzL0RvdWJsZVZhbCc7XG5pbXBvcnQgRmxvYXRWYWwgZnJvbSAnLi90eXBlcy9GbG9hdFZhbCc7XG5pbXBvcnQgTG9uZ1ZhbCBmcm9tICcuL3R5cGVzL0xvbmdWYWwnO1xuaW1wb3J0IE51bWJlclZhbCBmcm9tICcuL3R5cGVzL051bWJlclZhbCc7XG5pbXBvcnQgU2hvcnRWYWwgZnJvbSAnLi90eXBlcy9TaG9ydFZhbCc7XG5pbXBvcnQgU3RyaW5nVmFsIGZyb20gJy4vdHlwZXMvU3RyaW5nVmFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkJUU3RyZWFtUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgaW5wdXQ6IEJpbmFyeVN0cmVhbTtcbiAgICBwcm90ZWN0ZWQgYnl0ZU9yZGVyOiBCeXRlT3JkZXI7XG5cbiAgICBwcml2YXRlIHVzZVZhcmludCA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWxsb2NhdGVMaW1pdCA9IC0xO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGlucHV0OiBhbnksIGJ5dGVPcmRlcjogQnl0ZU9yZGVyKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5ieXRlT3JkZXIgPSBieXRlT3JkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVXNpbmdWYXJpbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXNlVmFyaW50KHVzZVZhcmludDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnVzZVZhcmludCA9IHVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWxsb2NhdGVMaW1pdChhbGxvY2F0ZUxpbWl0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZUxpbWl0ID0gYWxsb2NhdGVMaW1pdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEJ5dGVWYWx1ZSgpOiBCeXRlVmFsIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgYnl0ZScpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVWYWwodGhpcy5pbnB1dC5yZWFkQnl0ZSgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZFN0cmluZ1ZhbHVlKCk6IFN0cmluZ1ZhbCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdGhpcy51c2VWYXJpbnQgPyB0aGlzLmlucHV0LnJlYWRVbnNpZ25lZFZhckludCgpIDogdGhpcy5yZWFkU2hvcnRWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQobGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgc3RyaW5nIGJ5dGVzJyk7XG5cbiAgICAgICAgY29uc3QgZGF0YTogQnVmZmVyID0gdGhpcy5pbnB1dC5yZWFkKGxlbmd0aCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdWYWwoZGF0YS50b1N0cmluZygndXRmOCcpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZFNob3J0VmFsdWUoKTogU2hvcnRWYWwge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDIsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBzaG9ydCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnRWYWwodGhpcy5pbnB1dC5yZWFkU2hvcnRMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU2hvcnRWYWwodGhpcy5pbnB1dC5yZWFkU2hvcnQoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRJbnRWYWx1ZSgpOiBOdW1iZXJWYWwge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyVmFsKHRoaXMuaW5wdXQucmVhZFZhckludCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGludCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyVmFsKHRoaXMuaW5wdXQucmVhZEludExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJWYWwodGhpcy5pbnB1dC5yZWFkSW50KCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkTG9uZ1ZhbHVlKCk6IExvbmdWYWwge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ1ZhbCh0aGlzLmlucHV0LnJlYWRWYXJMb25nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg4LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgbG9uZycpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ1ZhbCh0aGlzLmlucHV0LnJlYWRMb25nTEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IExvbmdWYWwodGhpcy5pbnB1dC5yZWFkTG9uZygpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEZsb2F0VmFsdWUoKTogRmxvYXRWYWwge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDQsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBsb25nJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdFZhbCh0aGlzLmlucHV0LnJlYWRGbG9hdExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdFZhbCh0aGlzLmlucHV0LnJlYWRGbG9hdCgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZERvdWJsZVZhbHVlKCk6IERvdWJsZVZhbCB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGRvdWJsZScpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlVmFsKHRoaXMuaW5wdXQucmVhZERvdWJsZUxFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVWYWwodGhpcy5pbnB1dC5yZWFkRG91YmxlKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkQnl0ZUFycmF5VmFsdWUoKTogQnVmZmVyIHtcbiAgICAgICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gdGhpcy5yZWFkSW50VmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHNpemUsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBieXRlIGFycmF5IGRhdGEnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQucmVhZChzaXplKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEludEFycmF5VmFsdWUoKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBzaXplOiBudW1iZXIgPSB0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyBzaXplIDogc2l6ZSAqIDQsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBpbnQgYXJyYXkgZGF0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQ6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZXhwZWN0SW5wdXQocmVtYWluaW5nOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZywgYWx0ZXJBbGxvY2F0aW9uTGltaXQgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmIChhbHRlckFsbG9jYXRpb25MaW1pdCkge1xuICAgICAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChyZW1haW5pbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5pbnB1dC5yZWFkUmVtYWluaW5nKCkuYnl0ZUxlbmd0aDtcbiAgICAgICAgdGhpcy5pbnB1dC5za2lwKC1sZW5ndGgpO1xuICAgICAgICBpZiAobGVuZ3RoIDwgcmVtYWluaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWx0ZXJBbGxvY2F0aW9uTGltaXQocmVtYWluaW5nOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb2NhdGVMaW1pdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFsbG9jYXRlTGltaXQgLSByZW1haW5pbmcgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgYWxsb2NhdGUgbW9yZSBieXRlcyBkdWUgdG8gcmVhY2hpbmcgdGhlIHNldCBsaW1pdCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG9jYXRlTGltaXQgLT0gcmVtYWluaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFVQSxJQUFxQixrQkFBckIsTUFBcUM7Q0FDakM7Q0FDQTtDQUVBLFlBQW9CO0NBQ3BCLGdCQUF3QjtDQUV4QixZQUFzQixPQUFZLFdBQXNCO0VBQ3BELEtBQUssUUFBUTtFQUNiLEtBQUssWUFBWTtDQUNyQjtDQUVBLGdCQUFnQztFQUM1QixPQUFPLEtBQUs7Q0FDaEI7Q0FFQSxhQUFvQixXQUEwQjtFQUMxQyxLQUFLLFlBQVk7Q0FDckI7Q0FFQSxpQkFBd0IsZUFBNkI7RUFDakQsS0FBSyxnQkFBZ0I7Q0FDekI7Q0FFQSxnQkFBbUM7RUFDL0IsS0FBSyxZQUFZLEdBQUcsaUNBQWlDO0VBQ3JELE9BQU8sSUFBSSxVQUFRLEtBQUssTUFBTSxTQUFTLENBQUM7Q0FDNUM7Q0FFQSxrQkFBdUM7RUFDbkMsTUFBTSxTQUFpQixLQUFLLFlBQVksS0FBSyxNQUFNLG1CQUFtQixJQUFJLEtBQUssZUFBZSxFQUFFLFNBQVM7RUFDekcsS0FBSyxZQUFZLFFBQVEseUNBQXlDO0VBSWxFLE9BQU8sSUFBSSxZQUZVLEtBQUssTUFBTSxLQUFLLE1BRWhCLEVBQUssU0FBUyxNQUFNLENBQUM7Q0FDOUM7Q0FFQSxpQkFBcUM7RUFDakMsS0FBSyxZQUFZLEdBQUcsa0NBQWtDO0VBRXRELElBQUksS0FBSyxjQUFjLFVBQVUsZUFDN0IsT0FBTyxJQUFJLFdBQVMsS0FBSyxNQUFNLFlBQVksQ0FBQztFQUdoRCxPQUFPLElBQUksV0FBUyxLQUFLLE1BQU0sVUFBVSxDQUFDO0NBQzlDO0NBRUEsZUFBb0M7RUFDaEMsSUFBSSxLQUFLLFdBQ0wsT0FBTyxJQUFJLFlBQVUsS0FBSyxNQUFNLFdBQVcsQ0FBQztFQUdoRCxLQUFLLFlBQVksR0FBRyxnQ0FBZ0M7RUFFcEQsSUFBSSxLQUFLLGNBQWMsVUFBVSxlQUM3QixPQUFPLElBQUksWUFBVSxLQUFLLE1BQU0sVUFBVSxDQUFDO0VBRy9DLE9BQU8sSUFBSSxZQUFVLEtBQUssTUFBTSxRQUFRLENBQUM7Q0FDN0M7Q0FFQSxnQkFBbUM7RUFDL0IsSUFBSSxLQUFLLFdBQ0wsT0FBTyxJQUFJLFVBQVEsS0FBSyxNQUFNLFlBQVksQ0FBQztFQUcvQyxLQUFLLFlBQVksR0FBRyxpQ0FBaUM7RUFFckQsSUFBSSxLQUFLLGNBQWMsVUFBVSxlQUM3QixPQUFPLElBQUksVUFBUSxLQUFLLE1BQU0sV0FBVyxDQUFDO0VBRzlDLE9BQU8sSUFBSSxVQUFRLEtBQUssTUFBTSxTQUFTLENBQUM7Q0FDNUM7Q0FFQSxpQkFBcUM7RUFDakMsS0FBSyxZQUFZLEdBQUcsaUNBQWlDO0VBRXJELElBQUksS0FBSyxjQUFjLFVBQVUsZUFDN0IsT0FBTyxJQUFJLFdBQVMsS0FBSyxNQUFNLFlBQVksQ0FBQztFQUdoRCxPQUFPLElBQUksV0FBUyxLQUFLLE1BQU0sVUFBVSxDQUFDO0NBQzlDO0NBRUEsa0JBQXVDO0VBQ25DLEtBQUssWUFBWSxHQUFHLG1DQUFtQztFQUV2RCxJQUFJLEtBQUssY0FBYyxVQUFVLGVBQzdCLE9BQU8sSUFBSSxZQUFVLEtBQUssTUFBTSxhQUFhLENBQUM7RUFHbEQsT0FBTyxJQUFJLFlBQVUsS0FBSyxNQUFNLFdBQVcsQ0FBQztDQUNoRDtDQUVBLHFCQUF1QztFQUNuQyxNQUFNLE9BQWUsS0FBSyxhQUFhLEVBQUUsU0FBUztFQUNsRCxLQUFLLFlBQVksTUFBTSw0Q0FBNEM7RUFDbkUsT0FBTyxLQUFLLE1BQU0sS0FBSyxJQUFJO0NBQy9CO0NBRUEsb0JBQXdDO0VBQ3BDLE1BQU0sT0FBZSxLQUFLLGFBQWEsRUFBRSxTQUFTO0VBQ2xELEtBQUssWUFBWSxLQUFLLGNBQWMsSUFBSSxPQUFPLE9BQU8sR0FBRywyQ0FBMkM7RUFDcEcsTUFBTSxTQUFtQixDQUFDO0VBQzFCLEtBQUssSUFBSSxJQUFJLEdBQUcsSUFBSSxNQUFNLEtBQ3RCLE9BQU8sS0FBSyxLQUFLLGFBQWEsRUFBRSxTQUFTLENBQUM7RUFHOUMsT0FBTztDQUNYO0NBRUEsWUFBc0IsV0FBbUIsU0FBaUIsdUJBQXVCLE1BQVk7RUFDekYsSUFBSSxzQkFDQSxLQUFLLHFCQUFxQixTQUFTO0VBR3ZDLE1BQU0sU0FBUyxLQUFLLE1BQU0sY0FBYyxFQUFFO0VBQzFDLEtBQUssTUFBTSxLQUFLLENBQUMsTUFBTTtFQUN2QixJQUFJLFNBQVMsV0FDVCxNQUFNLElBQUksTUFBTSxPQUFPO0NBRS9CO0NBRUEscUJBQTRCLFdBQXlCO0VBQ2pELElBQUksS0FBSyxrQkFBa0IsSUFDdkIsSUFBSSxLQUFLLGdCQUFnQixZQUFZLEdBQ2pDLE1BQU0sSUFBSSxNQUFNLDZEQUE2RDtPQUU3RSxLQUFLLGlCQUFpQjtDQUdsQztBQUNKIn0=