UNPKG

@jsprismarine/nbt

Version:
120 lines (115 loc) 15.5 kB
'use strict'; Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } }); const ByteOrder = require('./ByteOrder.cjs.cjs'); const types_ByteVal = require('./types/ByteVal.cjs.cjs'); const types_DoubleVal = require('./types/DoubleVal.cjs.cjs'); const types_FloatVal = require('./types/FloatVal.cjs.cjs'); const types_LongVal = require('./types/LongVal.cjs.cjs'); const types_NumberVal = require('./types/NumberVal.cjs.cjs'); const types_ShortVal = require('./types/ShortVal.cjs.cjs'); const types_StringVal = require('./types/StringVal.cjs.cjs'); class NBTStreamReader { 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 types_ByteVal.default(this.input.readByte()); } readStringValue() { const length = this.useVarint ? this.input.readUnsignedVarInt() : this.readShortValue().getValue(); this.expectInput(length, "Invalid NBT Data: Expected string bytes"); const data = this.input.read(length); return new types_StringVal.default(data.toString("utf8")); } readShortValue() { this.expectInput(2, "Invalid NBT Data: Expected short"); if (this.byteOrder === ByteOrder.ByteOrder.LITTLE_ENDIAN) { return new types_ShortVal.default(this.input.readShortLE()); } return new types_ShortVal.default(this.input.readShort()); } readIntValue() { if (this.useVarint) { return new types_NumberVal.default(this.input.readVarInt()); } this.expectInput(4, "Invalid NBT Data: Expected int"); if (this.byteOrder === ByteOrder.ByteOrder.LITTLE_ENDIAN) { return new types_NumberVal.default(this.input.readIntLE()); } return new types_NumberVal.default(this.input.readInt()); } readLongValue() { if (this.useVarint) { return new types_LongVal.default(this.input.readVarLong()); } this.expectInput(8, "Invalid NBT Data: Expected long"); if (this.byteOrder === ByteOrder.ByteOrder.LITTLE_ENDIAN) { return new types_LongVal.default(this.input.readLongLE()); } return new types_LongVal.default(this.input.readLong()); } readFloatValue() { this.expectInput(4, "Invalid NBT Data: Expected long"); if (this.byteOrder === ByteOrder.ByteOrder.LITTLE_ENDIAN) { return new types_FloatVal.default(this.input.readFloatLE()); } return new types_FloatVal.default(this.input.readFloat()); } readDoubleValue() { this.expectInput(8, "Invalid NBT Data: Expected double"); if (this.byteOrder === ByteOrder.ByteOrder.LITTLE_ENDIAN) { return new types_DoubleVal.default(this.input.readDoubleLE()); } return new types_DoubleVal.default(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; } } } } exports.default = NBTStreamReader; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUU3RyZWFtUmVhZGVyLmNqcy5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9OQlRTdHJlYW1SZWFkZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyBCeXRlT3JkZXIgfSBmcm9tICcuL0J5dGVPcmRlcic7XG5pbXBvcnQgQnl0ZVZhbCBmcm9tICcuL3R5cGVzL0J5dGVWYWwnO1xuaW1wb3J0IERvdWJsZVZhbCBmcm9tICcuL3R5cGVzL0RvdWJsZVZhbCc7XG5pbXBvcnQgRmxvYXRWYWwgZnJvbSAnLi90eXBlcy9GbG9hdFZhbCc7XG5pbXBvcnQgTG9uZ1ZhbCBmcm9tICcuL3R5cGVzL0xvbmdWYWwnO1xuaW1wb3J0IE51bWJlclZhbCBmcm9tICcuL3R5cGVzL051bWJlclZhbCc7XG5pbXBvcnQgU2hvcnRWYWwgZnJvbSAnLi90eXBlcy9TaG9ydFZhbCc7XG5pbXBvcnQgU3RyaW5nVmFsIGZyb20gJy4vdHlwZXMvU3RyaW5nVmFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTkJUU3RyZWFtUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgaW5wdXQ6IEJpbmFyeVN0cmVhbTtcbiAgICBwcm90ZWN0ZWQgYnl0ZU9yZGVyOiBCeXRlT3JkZXI7XG5cbiAgICBwcml2YXRlIHVzZVZhcmludCA9IGZhbHNlO1xuICAgIHByaXZhdGUgYWxsb2NhdGVMaW1pdCA9IC0xO1xuXG4gICAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGlucHV0OiBhbnksIGJ5dGVPcmRlcjogQnl0ZU9yZGVyKSB7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDtcbiAgICAgICAgdGhpcy5ieXRlT3JkZXIgPSBieXRlT3JkZXI7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVXNpbmdWYXJpbnQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0VXNlVmFyaW50KHVzZVZhcmludDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnVzZVZhcmludCA9IHVzZVZhcmludDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0QWxsb2NhdGVMaW1pdChhbGxvY2F0ZUxpbWl0OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5hbGxvY2F0ZUxpbWl0ID0gYWxsb2NhdGVMaW1pdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEJ5dGVWYWx1ZSgpOiBCeXRlVmFsIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgxLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgYnl0ZScpO1xuICAgICAgICByZXR1cm4gbmV3IEJ5dGVWYWwodGhpcy5pbnB1dC5yZWFkQnl0ZSgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZFN0cmluZ1ZhbHVlKCk6IFN0cmluZ1ZhbCB7XG4gICAgICAgIGNvbnN0IGxlbmd0aDogbnVtYmVyID0gdGhpcy51c2VWYXJpbnQgPyB0aGlzLmlucHV0LnJlYWRVbnNpZ25lZFZhckludCgpIDogdGhpcy5yZWFkU2hvcnRWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQobGVuZ3RoLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgc3RyaW5nIGJ5dGVzJyk7XG5cbiAgICAgICAgY29uc3QgZGF0YTogQnVmZmVyID0gdGhpcy5pbnB1dC5yZWFkKGxlbmd0aCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdWYWwoZGF0YS50b1N0cmluZygndXRmOCcpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZFNob3J0VmFsdWUoKTogU2hvcnRWYWwge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDIsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBzaG9ydCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgU2hvcnRWYWwodGhpcy5pbnB1dC5yZWFkU2hvcnRMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgU2hvcnRWYWwodGhpcy5pbnB1dC5yZWFkU2hvcnQoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRJbnRWYWx1ZSgpOiBOdW1iZXJWYWwge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyVmFsKHRoaXMuaW5wdXQucmVhZFZhckludCgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGludCcpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTnVtYmVyVmFsKHRoaXMuaW5wdXQucmVhZEludExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJWYWwodGhpcy5pbnB1dC5yZWFkSW50KCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkTG9uZ1ZhbHVlKCk6IExvbmdWYWwge1xuICAgICAgICBpZiAodGhpcy51c2VWYXJpbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ1ZhbCh0aGlzLmlucHV0LnJlYWRWYXJMb25nKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg4LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgbG9uZycpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTG9uZ1ZhbCh0aGlzLmlucHV0LnJlYWRMb25nTEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IExvbmdWYWwodGhpcy5pbnB1dC5yZWFkTG9uZygpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEZsb2F0VmFsdWUoKTogRmxvYXRWYWwge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDQsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBsb25nJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdFZhbCh0aGlzLmlucHV0LnJlYWRGbG9hdExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBGbG9hdFZhbCh0aGlzLmlucHV0LnJlYWRGbG9hdCgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZERvdWJsZVZhbHVlKCk6IERvdWJsZVZhbCB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGRvdWJsZScpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlVmFsKHRoaXMuaW5wdXQucmVhZERvdWJsZUxFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVWYWwodGhpcy5pbnB1dC5yZWFkRG91YmxlKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkQnl0ZUFycmF5VmFsdWUoKTogQnVmZmVyIHtcbiAgICAgICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gdGhpcy5yZWFkSW50VmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHNpemUsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBieXRlIGFycmF5IGRhdGEnKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXQucmVhZChzaXplKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEludEFycmF5VmFsdWUoKTogbnVtYmVyW10ge1xuICAgICAgICBjb25zdCBzaXplOiBudW1iZXIgPSB0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQodGhpcy5pc1VzaW5nVmFyaW50KCkgPyBzaXplIDogc2l6ZSAqIDQsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBpbnQgYXJyYXkgZGF0YScpO1xuICAgICAgICBjb25zdCByZXN1bHQ6IG51bWJlcltdID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZXhwZWN0SW5wdXQocmVtYWluaW5nOiBudW1iZXIsIG1lc3NhZ2U6IHN0cmluZywgYWx0ZXJBbGxvY2F0aW9uTGltaXQgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmIChhbHRlckFsbG9jYXRpb25MaW1pdCkge1xuICAgICAgICAgICAgdGhpcy5hbHRlckFsbG9jYXRpb25MaW1pdChyZW1haW5pbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy5pbnB1dC5yZWFkUmVtYWluaW5nKCkuYnl0ZUxlbmd0aDtcbiAgICAgICAgdGhpcy5pbnB1dC5za2lwKC1sZW5ndGgpO1xuICAgICAgICBpZiAobGVuZ3RoIDwgcmVtYWluaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWx0ZXJBbGxvY2F0aW9uTGltaXQocmVtYWluaW5nOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuYWxsb2NhdGVMaW1pdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmFsbG9jYXRlTGltaXQgLSByZW1haW5pbmcgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgYWxsb2NhdGUgbW9yZSBieXRlcyBkdWUgdG8gcmVhY2hpbmcgdGhlIHNldCBsaW1pdCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFsbG9jYXRlTGltaXQgLT0gcmVtYWluaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIkJ5dGVWYWwiLCJTdHJpbmdWYWwiLCJCeXRlT3JkZXIiLCJTaG9ydFZhbCIsIk51bWJlclZhbCIsIkxvbmdWYWwiLCJGbG9hdFZhbCIsIkRvdWJsZVZhbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQVVBLE1BQXFCLGVBQWdCLENBQUE7QUFBQSxFQUN2QixLQUFBO0FBQUEsRUFDQSxTQUFBO0FBQUEsRUFFRixTQUFZLEdBQUEsS0FBQTtBQUFBLEVBQ1osYUFBZ0IsR0FBQSxFQUFBO0FBQUEsRUFFZCxXQUFBLENBQVksT0FBWSxTQUFzQixFQUFBO0FBQ3BELElBQUEsSUFBQSxDQUFLLEtBQVEsR0FBQSxLQUFBO0FBQ2IsSUFBQSxJQUFBLENBQUssU0FBWSxHQUFBLFNBQUE7QUFBQTtBQUNyQixFQUVPLGFBQXlCLEdBQUE7QUFDNUIsSUFBQSxPQUFPLElBQUssQ0FBQSxTQUFBO0FBQUE7QUFDaEIsRUFFTyxhQUFhLFNBQTBCLEVBQUE7QUFDMUMsSUFBQSxJQUFBLENBQUssU0FBWSxHQUFBLFNBQUE7QUFBQTtBQUNyQixFQUVPLGlCQUFpQixhQUE2QixFQUFBO0FBQ2pELElBQUEsSUFBQSxDQUFLLGFBQWdCLEdBQUEsYUFBQTtBQUFBO0FBQ3pCLEVBRVUsYUFBeUIsR0FBQTtBQUMvQixJQUFLLElBQUEsQ0FBQSxXQUFBLENBQVksR0FBRyxpQ0FBaUMsQ0FBQTtBQUNyRCxJ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