UNPKG

@jsprismarine/prismarine

Version:

Dedicated Minecraft Bedrock Edition server written in TypeScript

87 lines (86 loc) 9.01 kB
import BinaryStream from "@jsprismarine/jsbinaryutils"; import { randomUUID } from "node:crypto"; //#region src/utils/UUID.ts var UUID = class UUID { parts = []; version; constructor(part1 = 0, part2 = 0, part3 = 0, part4 = 0, version = 4) { this.parts = [ part1, part2, part3, part4 ]; this.version = version || (this.parts[1] & 61440) >> 12; } equals(uuid) { return this.parts.length === uuid.parts.length && this.parts.every((value, index) => value === uuid.parts[index]); } /** * Creates an UUID from a string hex representation */ static fromString(uuid, version = 4) { if (!uuid) throw new Error("uuid is null or undefined"); return UUID.fromBinary(Buffer.from(uuid.trim().replaceAll("-", ""), "hex"), version); } /** * Creates an UUID from a binary representation */ static fromBinary(uuid, version) { if (uuid.byteLength !== 16) throw new Error("UUID must have 16 bytes"); const stream = new BinaryStream(uuid); return new UUID(stream.readInt(), stream.readInt(), stream.readInt(), stream.readInt(), version); } /** * Generates a random UUIDv4 (string) */ static randomString() { return randomUUID({ disableEntropyCache: true }); } /** * Generates a random UUIDv4 */ static fromRandom() { const stringUUID = UUID.randomString(); return UUID.fromString(stringUUID, 4); } toBinary() { const stream = new BinaryStream(); stream.writeInt(this.parts[0]); stream.writeInt(this.parts[1]); stream.writeInt(this.parts[2]); stream.writeInt(this.parts[3]); return stream.getBuffer(); } toString() { const hex = this.toBinary().toString("hex"); const parts = []; parts.push(hex.slice(0, 8)); parts.push(hex.slice(8, 12)); parts.push(hex.slice(12, 16)); parts.push(hex.slice(16, 20)); parts.push(hex.slice(20, 32)); return parts.join("-"); } getVersion() { return this.version; } getParts() { return this.parts; } networkSerialize(stream) { stream.writeIntLE(this.parts[1]); stream.writeIntLE(this.parts[0]); stream.writeIntLE(this.parts[3]); stream.writeIntLE(this.parts[2]); } static networkDeserialize(stream) { const part1 = stream.readIntLE(); const part0 = stream.readIntLE(); const part3 = stream.readIntLE(); return new UUID(part0, part1, stream.readIntLE(), part3); } }; //#endregion export { UUID as default }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVVJRC5lcy5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvVVVJRC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQmluYXJ5U3RyZWFtIGZyb20gJ0Bqc3ByaXNtYXJpbmUvanNiaW5hcnl1dGlscyc7XG5pbXBvcnQgeyByYW5kb21VVUlEIH0gZnJvbSAnbm9kZTpjcnlwdG8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBVVUlEIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBhcnRzOiBudW1iZXJbXSA9IFtdO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdmVyc2lvbjogbnVtYmVyO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHBhcnQxID0gMCwgcGFydDIgPSAwLCBwYXJ0MyA9IDAsIHBhcnQ0ID0gMCwgdmVyc2lvbiA9IDQpIHtcbiAgICAgICAgdGhpcy5wYXJ0cyA9IFtwYXJ0MSwgcGFydDIsIHBhcnQzLCBwYXJ0NF07XG4gICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb24gfHwgKHRoaXMucGFydHNbMV0hICYgMHhmMDAwKSA+PiAxMjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXF1YWxzKHV1aWQ6IFVVSUQpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMucGFydHMubGVuZ3RoID09PSB1dWlkLnBhcnRzLmxlbmd0aCAmJiB0aGlzLnBhcnRzLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IHZhbHVlID09PSB1dWlkLnBhcnRzW2luZGV4XSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIFVVSUQgZnJvbSBhIHN0cmluZyBoZXggcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21TdHJpbmcodXVpZDogc3RyaW5nLCB2ZXJzaW9uID0gNCk6IFVVSUQge1xuICAgICAgICBpZiAoIXV1aWQpIHRocm93IG5ldyBFcnJvcigndXVpZCBpcyBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXG4gICAgICAgIHJldHVybiBVVUlELmZyb21CaW5hcnkoQnVmZmVyLmZyb20odXVpZC50cmltKCkucmVwbGFjZUFsbCgnLScsICcnKSwgJ2hleCcpLCB2ZXJzaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIFVVSUQgZnJvbSBhIGJpbmFyeSByZXByZXNlbnRhdGlvblxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZnJvbUJpbmFyeSh1dWlkOiBCdWZmZXIsIHZlcnNpb246IG51bWJlcik6IFVVSUQge1xuICAgICAgICBpZiAodXVpZC5ieXRlTGVuZ3RoICE9PSAxNikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVVUlEIG11c3QgaGF2ZSAxNiBieXRlcycpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSh1dWlkKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVVUlEKHN0cmVhbS5yZWFkSW50KCksIHN0cmVhbS5yZWFkSW50KCksIHN0cmVhbS5yZWFkSW50KCksIHN0cmVhbS5yZWFkSW50KCksIHZlcnNpb24pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHJhbmRvbSBVVUlEdjQgKHN0cmluZylcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJhbmRvbVN0cmluZygpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcmFuZG9tVVVJRCh7XG4gICAgICAgICAgICBkaXNhYmxlRW50cm9weUNhY2hlOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyBhIHJhbmRvbSBVVUlEdjRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21SYW5kb20oKTogVVVJRCB7XG4gICAgICAgIGNvbnN0IHN0cmluZ1VVSUQgPSBVVUlELnJhbmRvbVN0cmluZygpO1xuICAgICAgICByZXR1cm4gVVVJRC5mcm9tU3RyaW5nKHN0cmluZ1VVSUQsIDQpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b0JpbmFyeSgpOiBCdWZmZXIge1xuICAgICAgICBjb25zdCBzdHJlYW0gPSBuZXcgQmluYXJ5U3RyZWFtKCk7XG4gICAgICAgIHN0cmVhbS53cml0ZUludCh0aGlzLnBhcnRzWzBdISk7XG4gICAgICAgIHN0cmVhbS53cml0ZUludCh0aGlzLnBhcnRzWzFdISk7XG4gICAgICAgIHN0cmVhbS53cml0ZUludCh0aGlzLnBhcnRzWzJdISk7XG4gICAgICAgIHN0cmVhbS53cml0ZUludCh0aGlzLnBhcnRzWzNdISk7XG4gICAgICAgIHJldHVybiBzdHJlYW0uZ2V0QnVmZmVyKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IGhleCA9IHRoaXMudG9CaW5hcnkoKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgICAgLy8gWHh4eHh4eHgteHh4eC1NeHh4LU54eHgteHh4eHh4eHh4eHh4IDgtNC00LTQtMTJcbiAgICAgICAgY29uc3QgcGFydHMgPSBbXTtcbiAgICAgICAgcGFydHMucHVzaChoZXguc2xpY2UoMCwgOCkpO1xuICAgICAgICBwYXJ0cy5wdXNoKGhleC5zbGljZSg4LCA4ICsgNCkpO1xuICAgICAgICBwYXJ0cy5wdXNoKGhleC5zbGljZSgxMiwgMTIgKyA0KSk7XG4gICAgICAgIHBhcnRzLnB1c2goaGV4LnNsaWNlKDE2LCAxNiArIDQpKTtcbiAgICAgICAgcGFydHMucHVzaChoZXguc2xpY2UoMjAsIDIwICsgMTIpKTtcbiAgICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy0nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VmVyc2lvbigpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy52ZXJzaW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQYXJ0cygpOiBudW1iZXJbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZXR3b3JrU2VyaWFsaXplKHN0cmVhbTogYW55KTogdm9pZCB7XG4gICAgICAgIHN0cmVhbS53cml0ZUludExFKHRoaXMucGFydHNbMV0pO1xuICAgICAgICBzdHJlYW0ud3JpdGVJbnRMRSh0aGlzLnBhcnRzWzBdKTtcbiAgICAgICAgc3RyZWFtLndyaXRlSW50TEUodGhpcy5wYXJ0c1szXSk7XG4gICAgICAgIHN0cmVhbS53cml0ZUludExFKHRoaXMucGFydHNbMl0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbmV0d29ya0Rlc2VyaWFsaXplKHN0cmVhbTogYW55KTogVVVJRCB7XG4gICAgICAgIGNvbnN0IHBhcnQxID0gc3RyZWFtLnJlYWRJbnRMRSgpO1xuICAgICAgICBjb25zdCBwYXJ0MCA9IHN0cmVhbS5yZWFkSW50TEUoKTtcbiAgICAgICAgY29uc3QgcGFydDMgPSBzdHJlYW0ucmVhZEludExFKCk7XG4gICAgICAgIGNvbnN0IHBhcnQyID0gc3RyZWFtLnJlYWRJbnRMRSgpO1xuICAgICAgICByZXR1cm4gbmV3IFVVSUQocGFydDAsIHBhcnQxLCBwYXJ0MiwgcGFydDMpO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsSUFBcUIsT0FBckIsTUFBcUIsS0FBSztDQUN0QixRQUFtQyxDQUFDO0NBQ3BDO0NBRUEsWUFBbUIsUUFBUSxHQUFHLFFBQVEsR0FBRyxRQUFRLEdBQUcsUUFBUSxHQUFHLFVBQVUsR0FBRztFQUN4RSxLQUFLLFFBQVE7R0FBQztHQUFPO0dBQU87R0FBTztFQUFLO0VBQ3hDLEtBQUssVUFBVSxZQUFZLEtBQUssTUFBTSxLQUFNLFVBQVc7Q0FDM0Q7Q0FFQSxPQUFjLE1BQXFCO0VBQy9CLE9BQ0ksS0FBSyxNQUFNLFdBQVcsS0FBSyxNQUFNLFVBQVUsS0FBSyxNQUFNLE9BQU8sT0FBTyxVQUFVLFVBQVUsS0FBSyxNQUFNLE1BQU07Q0FFakg7Ozs7Q0FLQSxPQUFjLFdBQVcsTUFBYyxVQUFVLEdBQVM7RUFDdEQsSUFBSSxDQUFDLE1BQU0sTUFBTSxJQUFJLE1BQU0sMkJBQTJCO0VBRXRELE9BQU8sS0FBSyxXQUFXLE9BQU8sS0FBSyxLQUFLLEtBQUssRUFBRSxXQUFXLEtBQUssRUFBRSxHQUFHLEtBQUssR0FBRyxPQUFPO0NBQ3ZGOzs7O0NBS0EsT0FBYyxXQUFXLE1BQWMsU0FBdUI7RUFDMUQsSUFBSSxLQUFLLGVBQWUsSUFDcEIsTUFBTSxJQUFJLE1BQU0seUJBQXlCO0VBRzdDLE1BQU0sU0FBUyxJQUFJLGFBQWEsSUFBSTtFQUNwQyxPQUFPLElBQUksS0FBSyxPQUFPLFFBQVEsR0FBRyxPQUFPLFFBQVEsR0FBRyxPQUFPLFFBQVEsR0FBRyxPQUFPLFFBQVEsR0FBRyxPQUFPO0NBQ25HOzs7O0NBS0EsT0FBYyxlQUF1QjtFQUNqQyxPQUFPLFdBQVcsRUFDZCxxQkFBcUIsS0FDekIsQ0FBQztDQUNMOzs7O0NBS0EsT0FBYyxhQUFtQjtFQUM3QixNQUFNLGFBQWEsS0FBSyxhQUFhO0VBQ3JDLE9BQU8sS0FBSyxXQUFXLFlBQVksQ0FBQztDQUN4QztDQUVBLFdBQTBCO0VBQ3RCLE1BQU0sU0FBUyxJQUFJLGFBQWE7RUFDaEMsT0FBTyxTQUFTLEtBQUssTUFBTSxFQUFHO0VBQzlCLE9BQU8sU0FBUyxLQUFLLE1BQU0sRUFBRztFQUM5QixPQUFPLFNBQVMsS0FBSyxNQUFNLEVBQUc7RUFDOUIsT0FBTyxTQUFTLEtBQUssTUFBTSxFQUFHO0VBQzlCLE9BQU8sT0FBTyxVQUFVO0NBQzVCO0NBRUEsV0FBMEI7RUFDdEIsTUFBTSxNQUFNLEtBQUssU0FBUyxFQUFFLFNBQVMsS0FBSztFQUcxQyxNQUFNLFFBQVEsQ0FBQztFQUNmLE1BQU0sS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7RUFDMUIsTUFBTSxLQUFLLElBQUksTUFBTSxHQUFHLEVBQUssQ0FBQztFQUM5QixNQUFNLEtBQUssSUFBSSxNQUFNLElBQUksRUFBTSxDQUFDO0VBQ2hDLE1BQU0sS0FBSyxJQUFJLE1BQU0sSUFBSSxFQUFNLENBQUM7RUFDaEMsTUFBTSxLQUFLLElBQUksTUFBTSxJQUFJLEVBQU8sQ0FBQztFQUNqQyxPQUFPLE1BQU0sS0FBSyxHQUFHO0NBQ3pCO0NBRUEsYUFBNEI7RUFDeEIsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsV0FBNEI7RUFDeEIsT0FBTyxLQUFLO0NBQ2hCO0NBRUEsaUJBQXdCLFFBQW1CO0VBQ3ZDLE9BQU8sV0FBVyxLQUFLLE1BQU0sRUFBRTtFQUMvQixPQUFPLFdBQVcsS0FBSyxNQUFNLEVBQUU7RUFDL0IsT0FBTyxXQUFXLEtBQUssTUFBTSxFQUFFO0VBQy9CLE9BQU8sV0FBVyxLQUFLLE1BQU0sRUFBRTtDQUNuQztDQUVBLE9BQWMsbUJBQW1CLFFBQW1CO0VBQ2hELE1BQU0sUUFBUSxPQUFPLFVBQVU7RUFDL0IsTUFBTSxRQUFRLE9BQU8sVUFBVTtFQUMvQixNQUFNLFFBQVEsT0FBTyxVQUFVO0VBRS9CLE9BQU8sSUFBSSxLQUFLLE9BQU8sT0FEVCxPQUFPLFVBQ1MsR0FBTyxLQUFLO0NBQzlDO0FBQ0oifQ==