@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
116 lines (113 loc) • 15 kB
JavaScript
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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