@jsprismarine/prismarine
Version:
Dedicated Minecraft Bedrock Edition server written in TypeScript
87 lines (84 loc) • 10.9 kB
JavaScript
import BinaryStream from '@jsprismarine/jsbinaryutils';
import { randomUUID } from 'node:crypto';
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, 8 + 4));
parts.push(hex.slice(12, 12 + 4));
parts.push(hex.slice(16, 16 + 4));
parts.push(hex.slice(20, 20 + 12));
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();
const part2 = stream.readIntLE();
return new UUID(part0, part1, part2, part3);
}
}
export { UUID as default };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVVVJRC5lcy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL1VVSUQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEJpbmFyeVN0cmVhbSBmcm9tICdAanNwcmlzbWFyaW5lL2pzYmluYXJ5dXRpbHMnO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVVVJRCB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwYXJ0czogbnVtYmVyW10gPSBbXTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHZlcnNpb246IG51bWJlcjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJ0MSA9IDAsIHBhcnQyID0gMCwgcGFydDMgPSAwLCBwYXJ0NCA9IDAsIHZlcnNpb24gPSA0KSB7XG4gICAgICAgIHRoaXMucGFydHMgPSBbcGFydDEsIHBhcnQyLCBwYXJ0MywgcGFydDRdO1xuICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uIHx8ICh0aGlzLnBhcnRzWzFdISAmIDB4ZjAwMCkgPj4gMTI7XG4gICAgfVxuXG4gICAgcHVibGljIGVxdWFscyh1dWlkOiBVVUlEKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnBhcnRzLmxlbmd0aCA9PT0gdXVpZC5wYXJ0cy5sZW5ndGggJiYgdGhpcy5wYXJ0cy5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gdXVpZC5wYXJ0c1tpbmRleF0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBVVUlEIGZyb20gYSBzdHJpbmcgaGV4IHJlcHJlc2VudGF0aW9uXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tU3RyaW5nKHV1aWQ6IHN0cmluZywgdmVyc2lvbiA9IDQpOiBVVUlEIHtcbiAgICAgICAgaWYgKCF1dWlkKSB0aHJvdyBuZXcgRXJyb3IoJ3V1aWQgaXMgbnVsbCBvciB1bmRlZmluZWQnKTtcblxuICAgICAgICByZXR1cm4gVVVJRC5mcm9tQmluYXJ5KEJ1ZmZlci5mcm9tKHV1aWQudHJpbSgpLnJlcGxhY2VBbGwoJy0nLCAnJyksICdoZXgnKSwgdmVyc2lvbik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBVVUlEIGZyb20gYSBiaW5hcnkgcmVwcmVzZW50YXRpb25cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZyb21CaW5hcnkodXVpZDogQnVmZmVyLCB2ZXJzaW9uOiBudW1iZXIpOiBVVUlEIHtcbiAgICAgICAgaWYgKHV1aWQuYnl0ZUxlbmd0aCAhPT0gMTYpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVVVJRCBtdXN0IGhhdmUgMTYgYnl0ZXMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0cmVhbSA9IG5ldyBCaW5hcnlTdHJlYW0odXVpZCk7XG4gICAgICAgIHJldHVybiBuZXcgVVVJRChzdHJlYW0ucmVhZEludCgpLCBzdHJlYW0ucmVhZEludCgpLCBzdHJlYW0ucmVhZEludCgpLCBzdHJlYW0ucmVhZEludCgpLCB2ZXJzaW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByYW5kb20gVVVJRHY0IChzdHJpbmcpXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyByYW5kb21TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHJhbmRvbVVVSUQoe1xuICAgICAgICAgICAgZGlzYWJsZUVudHJvcHlDYWNoZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSByYW5kb20gVVVJRHY0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBmcm9tUmFuZG9tKCk6IFVVSUQge1xuICAgICAgICBjb25zdCBzdHJpbmdVVUlEID0gVVVJRC5yYW5kb21TdHJpbmcoKTtcbiAgICAgICAgcmV0dXJuIFVVSUQuZnJvbVN0cmluZyhzdHJpbmdVVUlELCA0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9CaW5hcnkoKTogQnVmZmVyIHtcbiAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IEJpbmFyeVN0cmVhbSgpO1xuICAgICAgICBzdHJlYW0ud3JpdGVJbnQodGhpcy5wYXJ0c1swXSEpO1xuICAgICAgICBzdHJlYW0ud3JpdGVJbnQodGhpcy5wYXJ0c1sxXSEpO1xuICAgICAgICBzdHJlYW0ud3JpdGVJbnQodGhpcy5wYXJ0c1syXSEpO1xuICAgICAgICBzdHJlYW0ud3JpdGVJbnQodGhpcy5wYXJ0c1szXSEpO1xuICAgICAgICByZXR1cm4gc3RyZWFtLmdldEJ1ZmZlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBoZXggPSB0aGlzLnRvQmluYXJ5KCkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICAgIC8vIFh4eHh4eHh4LXh4eHgtTXh4eC1OeHh4LXh4eHh4eHh4eHh4eCA4LTQtNC00LTEyXG4gICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgIHBhcnRzLnB1c2goaGV4LnNsaWNlKDAsIDgpKTtcbiAgICAgICAgcGFydHMucHVzaChoZXguc2xpY2UoOCwgOCArIDQpKTtcbiAgICAgICAgcGFydHMucHVzaChoZXguc2xpY2UoMTIsIDEyICsgNCkpO1xuICAgICAgICBwYXJ0cy5wdXNoKGhleC5zbGljZSgxNiwgMTYgKyA0KSk7XG4gICAgICAgIHBhcnRzLnB1c2goaGV4LnNsaWNlKDIwLCAyMCArIDEyKSk7XG4gICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCctJyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFZlcnNpb24oKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmVyc2lvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGFydHMoKTogbnVtYmVyW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJ0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgbmV0d29ya1NlcmlhbGl6ZShzdHJlYW06IGFueSk6IHZvaWQge1xuICAgICAgICBzdHJlYW0ud3JpdGVJbnRMRSh0aGlzLnBhcnRzWzFdKTtcbiAgICAgICAgc3RyZWFtLndyaXRlSW50TEUodGhpcy5wYXJ0c1swXSk7XG4gICAgICAgIHN0cmVhbS53cml0ZUludExFKHRoaXMucGFydHNbM10pO1xuICAgICAgICBzdHJlYW0ud3JpdGVJbnRMRSh0aGlzLnBhcnRzWzJdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5ldHdvcmtEZXNlcmlhbGl6ZShzdHJlYW06IGFueSk6IFVVSUQge1xuICAgICAgICBjb25zdCBwYXJ0MSA9IHN0cmVhbS5yZWFkSW50TEUoKTtcbiAgICAgICAgY29uc3QgcGFydDAgPSBzdHJlYW0ucmVhZEludExFKCk7XG4gICAgICAgIGNvbnN0IHBhcnQzID0gc3RyZWFtLnJlYWRJbnRMRSgpO1xuICAgICAgICBjb25zdCBwYXJ0MiA9IHN0cmVhbS5yZWFkSW50TEUoKTtcbiAgICAgICAgcmV0dXJuIG5ldyBVVUlEKHBhcnQwLCBwYXJ0MSwgcGFydDIsIHBhcnQzKTtcbiAgICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0EsTUFBcUIsSUFBSyxDQUFBO0FBQUEsRUFDTCxRQUFrQixFQUFDO0FBQUEsRUFDbkIsT0FBQTtBQUFBLEVBRVYsV0FBQSxDQUFZLEtBQVEsR0FBQSxDQUFBLEVBQUcsS0FBUSxHQUFBLENBQUEsRUFBRyxRQUFRLENBQUcsRUFBQSxLQUFBLEdBQVEsQ0FBRyxFQUFBLE9BQUEsR0FBVSxDQUFHLEVBQUE7QUFDeEUsSUFBQSxJQUFBLENBQUssS0FBUSxHQUFBLENBQUMsS0FBTyxFQUFBLEtBQUEsRUFBTyxPQUFPLEtBQUssQ0FBQTtBQUN4QyxJQUFBLElBQUEsQ0FBSyxVQUFVLE9BQVksSUFBQSxDQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsQ0FBQyxJQUFLLEtBQVcsS0FBQSxFQUFBO0FBQUE7QUFDM0QsRUFFTyxPQUFPLElBQXFCLEVBQUE7QUFDL0IsSUFBQSxPQUNJLEtBQUssS0FBTSxDQUFBLE1BQUEsS0FBVyxJQUFLLENBQUEsS0FBQSxDQUFNLFVBQVUsSUFBSyxDQUFBLEtBQUEsQ0FBTSxLQUFNLENBQUEsQ0FBQyxPQUFPLEtBQVUsS0FBQSxLQUFBLEtBQVUsSUFBSyxDQUFBLEtBQUEsQ0FBTSxLQUFLLENBQUMsQ0FBQTtBQUFBO0FBRWpIO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYyxVQUFBLENBQVcsSUFBYyxFQUFBLE9BQUEsR0FBVSxDQUFTLEVBQUE7QUFDdEQsSUFBQSxJQUFJLENBQUMsSUFBQSxFQUFZLE1BQUEsSUFBSSxNQUFNLDJCQUEyQixDQUFBO0FBRXRELElBQUEsT0FBTyxJQUFLLENBQUEsVUFBQSxDQUFXLE1BQU8sQ0FBQSxJQUFBLENBQUssSUFBSyxDQUFBLElBQUEsRUFBTyxDQUFBLFVBQUEsQ0FBVyxHQUFLLEVBQUEsRUFBRSxDQUFHLEVBQUEsS0FBSyxHQUFHLE9BQU8sQ0FBQTtBQUFBO0FBQ3ZGO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYyxVQUFXLENBQUEsSUFBQSxFQUFjLE9BQXVCLEVBQUE7QUFDMUQsSUFBSSxJQUFBLElBQUEsQ0FBSyxlQUFlLEVBQUksRUFBQTtBQUN4QixNQUFNLE1BQUEsSUFBSSxNQUFNLHlCQUF5QixDQUFBO0FBQUE7QUFHN0MsSUFBTSxNQUFBLE1BQUEsR0FBUyxJQUFJLFlBQUEsQ0FBYSxJQUFJLENBQUE7QUFDcEMsSUFBQSxPQUFPLElBQUksSUFBQSxDQUFLLE1BQU8sQ0FBQSxPQUFBLElBQVcsTUFBTyxDQUFBLE9BQUEsRUFBVyxFQUFBLE1BQUEsQ0FBTyxPQUFRLEVBQUEsRUFBRyxNQUFPLENBQUEsT0FBQSxJQUFXLE9BQU8sQ0FBQTtBQUFBO0FBQ25HO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBYyxZQUF1QixHQUFBO0FBQ2pDLElBQUEsT0FBTyxVQUFXLENBQUE7QUFBQSxNQUNkLG1CQUFxQixFQUFBO0FBQUEsS0FDeEIsQ0FBQTtBQUFBO0FBQ0w7QUFBQTtBQUFBO0FBQUEsRUFLQSxPQUFjLFVBQW1CLEdBQUE7QUFDN0IsSUFBTSxNQUFBLFVBQUEsR0FBYSxLQUFLLFlBQWEsRUFBQTtBQUNyQyxJQUFPLE9BQUEsSUFBQSxDQUFLLFVBQVcsQ0FBQSxVQUFBLEVBQVksQ0FBQyxDQUFBO0FBQUE7QUFDeEMsRUFFTyxRQUFtQixHQUFBO0FBQ3RCLElBQU0sTUFBQSxNQUFBLEdBQVMsSUFBSSxZQUFhLEVBQUE7QUFDaEMsSUFBQSxNQUFBLENBQU8sUUFBUyxDQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsQ0FBQyxDQUFFLENBQUE7QUFDOUIsSUFBQSxNQUFBLENBQU8sUUFBUyxDQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsQ0FBQyxDQUFFLENBQUE7QUFDOUIsSUFBQSxNQUFBLENBQU8sUUFBUyxDQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsQ0FBQyxDQUFFLENBQUE7QUFDOUIsSUFBQSxNQUFBLENBQU8sUUFBUyxDQUFBLElBQUEsQ0FBSyxLQUFNLENBQUEsQ0FBQyxDQUFFLENBQUE7QUFDOUIsSUFBQSxPQUFPLE9BQU8sU0FBVSxFQUFBO0FBQUE7QUFDNUIsRUFFTyxRQUFtQixHQUFBO0FBQ3RCLElBQUEsTUFBTSxHQUFNLEdBQUEsSUFBQSxDQUFLLFFBQVMsRUFBQSxDQUFFLFNBQVMsS0FBSyxDQUFBO0FBRzFDLElBQUEsTUFBTSxRQUFRLEVBQUM7QUFDZixJQUFBLEtBQUEsQ0FBTSxJQUFLLENBQUEsR0FBQSxDQUFJLEtBQU0sQ0FBQSxDQUFBLEVBQUcsQ0FBQyxDQUFDLENBQUE7QUFDMUIsSUFBQSxLQUFBLENBQU0sS0FBSyxHQUFJLENBQUEsS0FBQSxDQUFNLENBQUcsRUFBQSxDQUFBLEdBQUksQ0FBQyxDQUFDLENBQUE7QUFDOUIsSUFBQSxLQUFBLENBQU0sS0FBSyxHQUFJLENBQUEsS0FBQSxDQUFNLEVBQUksRUFBQSxFQUFBLEdBQUssQ0FBQyxDQUFDLENBQUE7QUFDaEMsSUFBQSxLQUFBLENBQU0sS0FBSyxHQUFJLENBQUEsS0FBQSxDQUFNLEVBQUksRUFBQSxFQUFBLEdBQUssQ0FBQyxDQUFDLENBQUE7QUFDaEMsSUFBQSxLQUFBLENBQU0sS0FBSyxHQUFJLENBQUEsS0FBQSxDQUFNLEVBQUksRUFBQSxFQUFBLEdBQUssRUFBRSxDQUFDLENBQUE7QUFDakMsSUFBTyxPQUFBLEtBQUEsQ0FBTSxLQUFLLEdBQUcsQ0FBQTtBQUFBO0FBQ3pCLEVBRU8sVUFBcUIsR0FBQTtBQUN4QixJQUFBLE9BQU8sSUFBSyxDQUFBLE9BQUE7QUFBQTtBQUNoQixFQUVPLFFBQXFCLEdBQUE7QUFDeEIsSUFBQSxPQUFPLElBQUssQ0FBQSxLQUFBO0FBQUE7QUFDaEIsRUFFTyxpQkFBaUIsTUFBbUIsRUFBQTtBQUN2QyxJQUFBLE1BQUEsQ0FBTyxVQUFXLENBQUEsSUFBQSxDQUFLLEtBQU0sQ0FBQSxDQUFDLENBQUMsQ0FBQTtBQUMvQixJQUFBLE1BQUEsQ0FBTyxVQUFXLENBQUEsSUFBQSxDQUFLLEtBQU0sQ0FBQSxDQUFDLENBQUMsQ0FBQTtBQUMvQixJQUFBLE1BQUEsQ0FBTyxVQUFXLENBQUEsSUFBQSxDQUFLLEtBQU0sQ0FBQSxDQUFDLENBQUMsQ0FBQTtBQUMvQixJQUFBLE1BQUEsQ0FBTyxVQUFXLENBQUEsSUFBQSxDQUFLLEtBQU0sQ0FBQSxDQUFDLENBQUMsQ0FBQTtBQUFBO0FBQ25DLEVBRUEsT0FBYyxtQkFBbUIsTUFBbUIsRUFBQTtBQUNoRCxJQUFNLE1BQUEsS0FBQSxHQUFRLE9BQU8sU0FBVSxFQUFBO0FBQy9CLElBQU0sTUFBQSxLQUFBLEdBQVEsT0FBTyxTQUFVLEVBQUE7QUFDL0IsSUFBTSxNQUFBLEtBQUEsR0FBUSxPQUFPLFNBQVUsRUFBQTtBQUMvQixJQUFNLE1BQUEsS0FBQSxHQUFRLE9BQU8sU0FBVSxFQUFBO0FBQy9CLElBQUEsT0FBTyxJQUFJLElBQUEsQ0FBSyxLQUFPLEVBQUEsS0FBQSxFQUFPLE9BQU8sS0FBSyxDQUFBO0FBQUE7QUFFbEQ7Ozs7In0=