UNPKG

snowflakify

Version:

The most complete Snowflake ID generator in TypeScript

69 lines 2.34 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const worker_threads_1 = require("worker_threads"); const cluster_1 = __importDefault(require("cluster")); const FragmentBase_js_1 = __importDefault(require("../FragmentBase.js")); /** * WorkerFragment class for worker IDs. * @public */ class WorkerFragment extends FragmentBase_js_1.default { /** * @param bits - The number of bits for the fragment. * @param value - A persistent ID value to use for the fragment. * * Defaults to the current worker ID if omitted. * * @throws `[VALUE_INVALID_TYPE]` If value is not a number. * @throws `[VALUE_INVALID_RANGE]` If value is not within 0 and 2 ** bits - 1 */ constructor(bits, value) { super(bits); if (value) { if (typeof value !== 'number') throw new TypeError('[VALUE_INVALID_TYPE]: WorkerFragment value must be a number.'); if (value < 0 || value > this.maxValue) throw new RangeError('[VALUE_INVALID_RANGE]: WorkerFragment value must be within 0 and 2 ** bits - 1'); this.value = BigInt(value); } else { this.value = this.getWorkerId(); } } getValue() { return this.value; } destructure(snowflake) { const bits = BigInt(snowflake) & this.bitMask; return { identifier: this.identifier, value: Number(bits >> this.bitShift), }; } updateId() { this.value = this.getWorkerId(); } /** * Returns the worker's ID. * * @remarks * The value is masked by the maxValue to fit in the fragment's bits. * * @returns The worker's ID. * @internal */ getWorkerId() { if (!worker_threads_1.isMainThread) // is worker thread return BigInt(worker_threads_1.threadId ?? 0) & this.maxValue; if (!cluster_1.default.isPrimary) // is cluster worker return BigInt(cluster_1.default.worker?.id ?? 0) & this.maxValue; return BigInt(0); } } exports.default = WorkerFragment; //# sourceMappingURL=WorkerFragment.js.map