@jsprismarine/nbt
Version:
Minecraft: Bedrock Edition NBT parser/writer
95 lines (94 loc) • 13.5 kB
JavaScript
"use strict";
Object.defineProperties(exports, {
__esModule: { value: true },
[Symbol.toStringTag]: { value: "Module" }
});
const require_ByteOrder = require("./ByteOrder.cjs.cjs");
const require_types_ByteVal = require("./types/ByteVal.cjs.cjs");
const require_types_DoubleVal = require("./types/DoubleVal.cjs.cjs");
const require_types_FloatVal = require("./types/FloatVal.cjs.cjs");
const require_types_LongVal = require("./types/LongVal.cjs.cjs");
const require_types_NumberVal = require("./types/NumberVal.cjs.cjs");
const require_types_ShortVal = require("./types/ShortVal.cjs.cjs");
const require_types_StringVal = require("./types/StringVal.cjs.cjs");
//#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 require_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");
return new require_types_StringVal.default(this.input.read(length).toString("utf8"));
}
readShortValue() {
this.expectInput(2, "Invalid NBT Data: Expected short");
if (this.byteOrder === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) return new require_types_ShortVal.default(this.input.readShortLE());
return new require_types_ShortVal.default(this.input.readShort());
}
readIntValue() {
if (this.useVarint) return new require_types_NumberVal.default(this.input.readVarInt());
this.expectInput(4, "Invalid NBT Data: Expected int");
if (this.byteOrder === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) return new require_types_NumberVal.default(this.input.readIntLE());
return new require_types_NumberVal.default(this.input.readInt());
}
readLongValue() {
if (this.useVarint) return new require_types_LongVal.default(this.input.readVarLong());
this.expectInput(8, "Invalid NBT Data: Expected long");
if (this.byteOrder === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) return new require_types_LongVal.default(this.input.readLongLE());
return new require_types_LongVal.default(this.input.readLong());
}
readFloatValue() {
this.expectInput(4, "Invalid NBT Data: Expected long");
if (this.byteOrder === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) return new require_types_FloatVal.default(this.input.readFloatLE());
return new require_types_FloatVal.default(this.input.readFloat());
}
readDoubleValue() {
this.expectInput(8, "Invalid NBT Data: Expected double");
if (this.byteOrder === require_ByteOrder.ByteOrder.LITTLE_ENDIAN) return new require_types_DoubleVal.default(this.input.readDoubleLE());
return new require_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;
}
};
//#endregion
exports.default = NBTStreamReader;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTkJUU3RyZWFtUmVhZGVyLmNqcy5janMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vc3JjL05CVFN0cmVhbVJlYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBCaW5hcnlTdHJlYW0gZnJvbSAnQGpzcHJpc21hcmluZS9qc2JpbmFyeXV0aWxzJztcbmltcG9ydCB7IEJ5dGVPcmRlciB9IGZyb20gJy4vQnl0ZU9yZGVyJztcbmltcG9ydCBCeXRlVmFsIGZyb20gJy4vdHlwZXMvQnl0ZVZhbCc7XG5pbXBvcnQgRG91YmxlVmFsIGZyb20gJy4vdHlwZXMvRG91YmxlVmFsJztcbmltcG9ydCBGbG9hdFZhbCBmcm9tICcuL3R5cGVzL0Zsb2F0VmFsJztcbmltcG9ydCBMb25nVmFsIGZyb20gJy4vdHlwZXMvTG9uZ1ZhbCc7XG5pbXBvcnQgTnVtYmVyVmFsIGZyb20gJy4vdHlwZXMvTnVtYmVyVmFsJztcbmltcG9ydCBTaG9ydFZhbCBmcm9tICcuL3R5cGVzL1Nob3J0VmFsJztcbmltcG9ydCBTdHJpbmdWYWwgZnJvbSAnLi90eXBlcy9TdHJpbmdWYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOQlRTdHJlYW1SZWFkZXIge1xuICAgIHByb3RlY3RlZCBpbnB1dDogQmluYXJ5U3RyZWFtO1xuICAgIHByb3RlY3RlZCBieXRlT3JkZXI6IEJ5dGVPcmRlcjtcblxuICAgIHByaXZhdGUgdXNlVmFyaW50ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBhbGxvY2F0ZUxpbWl0ID0gLTE7XG5cbiAgICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoaW5wdXQ6IGFueSwgYnl0ZU9yZGVyOiBCeXRlT3JkZXIpIHtcbiAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0O1xuICAgICAgICB0aGlzLmJ5dGVPcmRlciA9IGJ5dGVPcmRlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNVc2luZ1ZhcmludCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXNlVmFyaW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRVc2VWYXJpbnQodXNlVmFyaW50OiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMudXNlVmFyaW50ID0gdXNlVmFyaW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRBbGxvY2F0ZUxpbWl0KGFsbG9jYXRlTGltaXQ6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmFsbG9jYXRlTGltaXQgPSBhbGxvY2F0ZUxpbWl0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkQnl0ZVZhbHVlKCk6IEJ5dGVWYWwge1xuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDEsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBieXRlJyk7XG4gICAgICAgIHJldHVybiBuZXcgQnl0ZVZhbCh0aGlzLmlucHV0LnJlYWRCeXRlKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkU3RyaW5nVmFsdWUoKTogU3RyaW5nVmFsIHtcbiAgICAgICAgY29uc3QgbGVuZ3RoOiBudW1iZXIgPSB0aGlzLnVzZVZhcmludCA/IHRoaXMuaW5wdXQucmVhZFVuc2lnbmVkVmFySW50KCkgOiB0aGlzLnJlYWRTaG9ydFZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dChsZW5ndGgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBzdHJpbmcgYnl0ZXMnKTtcblxuICAgICAgICBjb25zdCBkYXRhOiBCdWZmZXIgPSB0aGlzLmlucHV0LnJlYWQobGVuZ3RoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFN0cmluZ1ZhbChkYXRhLnRvU3RyaW5nKCd1dGY4JykpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkU2hvcnRWYWx1ZSgpOiBTaG9ydFZhbCB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoMiwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIHNob3J0Jyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydFZhbCh0aGlzLmlucHV0LnJlYWRTaG9ydExFKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTaG9ydFZhbCh0aGlzLmlucHV0LnJlYWRTaG9ydCgpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgcmVhZEludFZhbHVlKCk6IE51bWJlclZhbCB7XG4gICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJWYWwodGhpcy5pbnB1dC5yZWFkVmFySW50KCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg0LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgaW50Jyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBOdW1iZXJWYWwodGhpcy5pbnB1dC5yZWFkSW50TEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE51bWJlclZhbCh0aGlzLmlucHV0LnJlYWRJbnQoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRMb25nVmFsdWUoKTogTG9uZ1ZhbCB7XG4gICAgICAgIGlmICh0aGlzLnVzZVZhcmludCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nVmFsKHRoaXMuaW5wdXQucmVhZFZhckxvbmcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmV4cGVjdElucHV0KDgsICdJbnZhbGlkIE5CVCBEYXRhOiBFeHBlY3RlZCBsb25nJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBMb25nVmFsKHRoaXMuaW5wdXQucmVhZExvbmdMRSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTG9uZ1ZhbCh0aGlzLmlucHV0LnJlYWRMb25nKCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkRmxvYXRWYWx1ZSgpOiBGbG9hdFZhbCB7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoNCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGxvbmcnKTtcblxuICAgICAgICBpZiAodGhpcy5ieXRlT3JkZXIgPT09IEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEZsb2F0VmFsKHRoaXMuaW5wdXQucmVhZEZsb2F0TEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IEZsb2F0VmFsKHRoaXMuaW5wdXQucmVhZEZsb2F0KCkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkRG91YmxlVmFsdWUoKTogRG91YmxlVmFsIHtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCg4LCAnSW52YWxpZCBOQlQgRGF0YTogRXhwZWN0ZWQgZG91YmxlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuYnl0ZU9yZGVyID09PSBCeXRlT3JkZXIuTElUVExFX0VORElBTikge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVWYWwodGhpcy5pbnB1dC5yZWFkRG91YmxlTEUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IERvdWJsZVZhbCh0aGlzLmlucHV0LnJlYWREb3VibGUoKSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHJlYWRCeXRlQXJyYXlWYWx1ZSgpOiBCdWZmZXIge1xuICAgICAgICBjb25zdCBzaXplOiBudW1iZXIgPSB0aGlzLnJlYWRJbnRWYWx1ZSgpLmdldFZhbHVlKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0SW5wdXQoc2l6ZSwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGJ5dGUgYXJyYXkgZGF0YScpO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnB1dC5yZWFkKHNpemUpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCByZWFkSW50QXJyYXlWYWx1ZSgpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IHNpemU6IG51bWJlciA9IHRoaXMucmVhZEludFZhbHVlKCkuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5leHBlY3RJbnB1dCh0aGlzLmlzVXNpbmdWYXJpbnQoKSA/IHNpemUgOiBzaXplICogNCwgJ0ludmFsaWQgTkJUIERhdGE6IEV4cGVjdGVkIGludCBhcnJheSBkYXRhJyk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucmVhZEludFZhbHVlKCkuZ2V0VmFsdWUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBleHBlY3RJbnB1dChyZW1haW5pbmc6IG51bWJlciwgbWVzc2FnZTogc3RyaW5nLCBhbHRlckFsbG9jYXRpb25MaW1pdCA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKGFsdGVyQWxsb2NhdGlvbkxpbWl0KSB7XG4gICAgICAgICAgICB0aGlzLmFsdGVyQWxsb2NhdGlvbkxpbWl0KHJlbWFpbmluZyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmlucHV0LnJlYWRSZW1haW5pbmcoKS5ieXRlTGVuZ3RoO1xuICAgICAgICB0aGlzLmlucHV0LnNraXAoLWxlbmd0aCk7XG4gICAgICAgIGlmIChsZW5ndGggPCByZW1haW5pbmcpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhbHRlckFsbG9jYXRpb25MaW1pdChyZW1haW5pbmc6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hbGxvY2F0ZUxpbWl0ICE9PSAtMSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuYWxsb2NhdGVMaW1pdCAtIHJlbWFpbmluZyA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBhbGxvY2F0ZSBtb3JlIGJ5dGVzIGR1ZSB0byByZWFjaGluZyB0aGUgc2V0IGxpbWl0Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuYWxsb2NhdGVMaW1pdCAtPSByZW1haW5pbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBVUEsSUFBcUIsa0JBQXJCLE1BQXFDO0NBQ2pDO0NBQ0E7Q0FFQSxZQUFvQjtDQUNwQixnQkFBd0I7Q0FFeEIsWUFBc0IsT0FBWSxXQUFzQjtFQUNwRCxLQUFLLFFBQVE7RUFDYixLQUFLLFlBQVk7Q0FDckI7Q0FFQSxnQkFBZ0M7RUFDNUIsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsYUFBb0IsV0FBMEI7RUFDMUMsS0FBSyxZQUFZO0NBQ3JCO0NBRUEsaUJBQXdCLGVBQTZCO0VBQ2pELEtBQUssZ0JBQWdCO0NBQ3pCO0NBRUEsZ0JBQW1DO0VBQy9CLEtBQUssWUFBWSxHQUFHLGlDQUFpQztFQUNyRCxPQUFPLElBQUksc0JBQUEsUUFBUSxLQUFLLE1BQU0sU0FBUyxDQUFDO0NBQzVDO0NBRUEsa0JBQXVDO0VBQ25DLE1BQU0sU0FBaUIsS0FBSyxZQUFZLEtBQUssTUFBTSxtQkFBbUIsSUFBSSxLQUFLLGVBQWUsRUFBRSxTQUFTO0VBQ3pHLEtBQUssWUFBWSxRQUFRLHlDQUF5QztFQUlsRSxPQUFPLElBQUksd0JBQUEsUUFGVSxLQUFLLE1BQU0sS0FBSyxNQUVoQixFQUFLLFNBQVMsTUFBTSxDQUFDO0NBQzlDO0NBRUEsaUJBQXFDO0VBQ2pDLEtBQUssWUFBWSxHQUFHLGtDQUFrQztFQUV0RCxJQUFJLEtBQUssY0FBYyxrQkFBQSxV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