snowflakify
Version:
The most complete Snowflake ID generator in TypeScript
69 lines • 2.34 kB
JavaScript
;
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