UNPKG

@jsprismarine/nbt

Version:
116 lines (113 loc) 15 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'; 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 ByteValue(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 StringValue(data.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; } } } } export { NBTStreamReader as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUU3RyZWFtUmVhZGVyLmVzLmpzIiwic291cmNlcyI6WyIuLi9zcmMvTkJUU3RyZWFtUmVhZGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgQnl0ZU9yZGVyIH0gZnJvbSAnLi9CeXRlT3JkZXInO1xuaW1wb3J0IEJ5dGVWYWwgZnJvbSAnLi90eXBlcy9CeXRlVmFsJztcbmltcG9ydCBEb3VibGVWYWwgZnJvbSAnLi90eXBlcy9Eb3VibGVWYWwnO1xuaW1wb3J0IEZsb2F0VmFsIGZyb20gJy4vdHlwZXMvRmxvYXRWYWwnO1xuaW1wb3J0IExvbmdWYWwgZnJvbSAnLi90eXBlcy9Mb25nVmFsJztcbmltcG9ydCBOdW1iZXJWYWwgZnJvbSAnLi90eXBlcy9OdW1iZXJWYWwnO1xuaW1wb3J0IFNob3J0VmFsIGZyb20gJy4vdHlwZXMvU2hvcnRWYWwnO1xuaW1wb3J0IFN0cmluZ1ZhbCBmcm9tICcuL3R5cGVzL1N0cmluZ1ZhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5CVFN0cmVhbVJlYWRlciB7XG4gICAgcHJvdGVjdGVkIGlucHV0OiBCaW5hcnlTdHJlYW07XG4gICAgcHJvdGVjdGVkIGJ5dGVPcmRlcjogQnl0ZU9yZGVyO1xuXG4gICAgcHJpdmF0ZSB1c2VWYXJpbnQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGFsbG9jYXRlTGltaXQgPSAtMTtcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihpbnB1dDogYW55LCBieXRlT3JkZXI6IEJ5dGVPcmRlcikge1xuICAgICAgICB0aGlzLmlucHV0ID0gaW5wdXQ7XG4gICAgICAgIHRoaXMuYnl0ZU9yZGVyID0gYnl0ZU9yZGVyO1xuICAgIH1cblxuICAgIHB1YmxpYyBpc1VzaW5nVmFyaW50KCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy51c2VWYXJpbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFVzZVZhcmludCh1c2VWYXJpbnQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy51c2VWYXJpbnQgPSB1c2VWYXJpbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEFsbG9jYXRlTGltaXQoYWxsb2NhdGVMaW1pdDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWxsb2NhdGVMaW1pdCA9IGFsbG9jYXRlTGltaXQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRCeXRlVmFsdWUoKTogQnl0ZVZhbCB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGJ5dGUnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBCeXRlVmFsKHRoaXMuaW5wdXQucmVhZEJ5dGUoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRTdHJpbmdWYWx1ZSgpOiBTdHJpbmdWYWwge1xuICAgICAgICBjb25zdCBsZW5ndGg6IG51bWJlciA9IHRoaXMudXNlVmFyaW50ID8gdGhpcy5pbnB1dC5yZWFkVW5zaWduZWRWYXJJbnQoKSA6IHRoaXMucmVhZFNob3J0VmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KGxlbmd0aCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHN0cmluZyBieXRlcycpO1xuXG4gICAgICAgIGNvbnN0IGRhdGE6IEJ1ZmZlciA9IHRoaXMuaW5wdXQucmVhZChsZW5ndGgpO1xuXG4gICAgICAgIHJldHVybiBuZXcgU3RyaW5nVmFsKGRhdGEudG9TdHJpbmcoJ3V0ZjgnKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRTaG9ydFZhbHVlKCk6IFNob3J0VmFsIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCgyLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgc2hvcnQnKTtcblxuICAgICAgICBpZiAodGhpcy5ieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNob3J0VmFsKHRoaXMuaW5wdXQucmVhZFNob3J0TEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFNob3J0VmFsKHRoaXMuaW5wdXQucmVhZFNob3J0KCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkSW50VmFsdWUoKTogTnVtYmVyVmFsIHtcbiAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlclZhbCh0aGlzLmlucHV0LnJlYWRWYXJJbnQoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDQsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBpbnQnKTtcblxuICAgICAgICBpZiAodGhpcy5ieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IE51bWJlclZhbCh0aGlzLmlucHV0LnJlYWRJbnRMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTnVtYmVyVmFsKHRoaXMuaW5wdXQucmVhZEludCgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZExvbmdWYWx1ZSgpOiBMb25nVmFsIHtcbiAgICAgICAgaWYgKHRoaXMudXNlVmFyaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExvbmdWYWwodGhpcy5pbnB1dC5yZWFkVmFyTG9uZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoOCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGxvbmcnKTtcblxuICAgICAgICBpZiAodGhpcy5ieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExvbmdWYWwodGhpcy5pbnB1dC5yZWFkTG9uZ0xFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMb25nVmFsKHRoaXMuaW5wdXQucmVhZExvbmcoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRGbG9hdFZhbHVlKCk6IEZsb2F0VmFsIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgbG9uZycpO1xuXG4gICAgICAgIGlmICh0aGlzLmJ5dGVPcmRlciA9PT0gQnl0ZU9yZGVyLkxJVFRMRV9FTkRJQU4pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRmxvYXRWYWwodGhpcy5pbnB1dC5yZWFkRmxvYXRMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRmxvYXRWYWwodGhpcy5pbnB1dC5yZWFkRmxvYXQoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWREb3VibGVWYWx1ZSgpOiBEb3VibGVWYWwge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBkb3VibGUnKTtcblxuICAgICAgICBpZiAodGhpcy5ieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERvdWJsZVZhbCh0aGlzLmlucHV0LnJlYWREb3VibGVMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgRG91YmxlVmFsKHRoaXMuaW5wdXQucmVhZERvdWJsZSgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEJ5dGVBcnJheVZhbHVlKCk6IEJ1ZmZlciB7XG4gICAgICAgIGNvbnN0IHNpemU6IG51bWJlciA9IHRoaXMucmVhZEludFZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dChzaXplLCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgYnl0ZSBhcnJheSBkYXRhJyk7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0LnJlYWQoc2l6ZSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRJbnRBcnJheVZhbHVlKCk6IG51bWJlcltdIHtcbiAgICAgICAgY29uc3Qgc2l6ZTogbnVtYmVyID0gdGhpcy5yZWFkSW50VmFsdWUoKS5nZXRWYWx1ZSgpO1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KHRoaXMuaXNVc2luZ1ZhcmludCgpID8gc2l6ZSA6IHNpemUgKiA0LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgaW50IGFycmF5IGRhdGEnKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBudW1iZXJbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2godGhpcy5yZWFkSW50VmFsdWUoKS5nZXRWYWx1ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGV4cGVjdElucHV0KHJlbWFpbmluZzogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcsIGFsdGVyQWxsb2NhdGlvbkxpbWl0ID0gdHJ1ZSk6IHZvaWQge1xuICAgICAgICBpZiAoYWx0ZXJBbGxvY2F0aW9uTGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMuYWx0ZXJBbGxvY2F0aW9uTGltaXQocmVtYWluaW5nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuaW5wdXQucmVhZFJlbWFpbmluZygpLmJ5dGVMZW5ndGg7XG4gICAgICAgIHRoaXMuaW5wdXQuc2tpcCgtbGVuZ3RoKTtcbiAgICAgICAgaWYgKGxlbmd0aCA8IHJlbWFpbmluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFsdGVyQWxsb2NhdGlvbkxpbWl0KHJlbWFpbmluZzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmFsbG9jYXRlTGltaXQgIT09IC0xKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGxvY2F0ZUxpbWl0IC0gcmVtYWluaW5nIDwgMCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGFsbG9jYXRlIG1vcmUgYnl0ZXMgZHVlIHRvIHJlYWNoaW5nIHRoZSBzZXQgbGltaXQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZUxpbWl0IC09IHJlbWFpbmluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdLCJuYW1lcyI6WyJCeXRlVmFsIiwiU3RyaW5nVmFsIiwiU2hvcnRWYWwiLCJOdW1iZXJWYWwiLCJMb25nVmFsIiwiRmxvYXRWYWwiLCJEb3VibGVWYWwiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVVBLE1BQXFCLGVBQWdCLENBQUE7QUFBQSxFQUN2QixLQUFBO0FBQUEsRUFDQSxTQUFBO0FBQUEsRUFFRixTQUFZLEdBQUEsS0FBQTtBQUFBLEVBQ1osYUFBZ0IsR0FBQSxFQUFBO0FBQUEsRUFFZCxXQUFBLENBQVksT0FBWSxTQUFzQixFQUFBO0FBQ3BELElBQUEsSUFBQSxDQUFLLEtBQVEsR0FBQSxLQUFBO0FBQ2IsSUFBQSxJQUFBLENBQUssU0FBWSxHQUFBLFNBQUE7QUFBQTtBQUNyQixFQUVPLGFBQXlCLEdBQUE7QUFDNUIsSUFBQSxPQUFPLElBQUssQ0FBQSxTQUFBO0FBQUE7QUFDaEIsRUFFTyxhQUFhLFNBQTBCLEVBQUE7QUFDMUMsSUFBQSxJQUFBLENBQUssU0FBWSxHQUFBLFNBQUE7QUFBQTtBQUNyQixFQUVPLGlCQUFpQixhQUE2QixFQUFBO0FBQ2pELElBQUEsSUFBQSxDQUFLLGFBQWdCLEdBQUEsYUFBQTtBQUFBO0FBQ3pCLEVBRVUsYUFBeUIsR0FBQTtBQUMvQixJQUFLLElBQUEsQ0FBQSxXQUFBLENBQVksR0FBRyxpQ0FBaUMsQ0FBQTtBQUNyRCxJQUFBLE9BQU8sSUFBSUEsU0FB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