mjdapi
Version:
Midjourney client using Discord.
83 lines (82 loc) • 2.9 kB
JavaScript
let prevTimestamp = 0;
let prevIncrement = 0;
export class SnowflakeObj {
/**
* build a snowflake:
* if no arg passed return a new unique snowflake timestampted now.
* if an negative number is passed, return snowflake timestampted passed value ms ago.
* if an positive number is passed, return snowflake timestampted with the given value.
* if a string is passed, the strind will be read as a snowflake string.
* @param snowflake
*/
constructor(snowflake) {
Object.defineProperty(this, "timestamp", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "workerId", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "processId", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "increment", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
if (!snowflake) {
this.timestamp = Date.now();
this.workerId = 0;
this.processId = 0;
if (prevTimestamp !== this.timestamp) {
prevTimestamp = this.timestamp;
prevIncrement = 0;
}
else {
prevIncrement++;
}
this.increment = prevIncrement;
}
else if (typeof snowflake === "number") {
if (snowflake < 0) {
snowflake = Date.now() + snowflake;
}
this.timestamp = snowflake;
this.workerId = 0;
this.processId = 0;
this.increment = 0;
}
else {
const snowflakeInt = BigInt(snowflake);
this.timestamp = Number((snowflakeInt >> 22n) + 1420070400000n);
this.workerId = Number((snowflakeInt & 0x3e0000n) >> 17n);
this.processId = Number((snowflakeInt & 0x1f000n) >> 12n);
this.increment = Number(snowflakeInt & 0xfffn);
}
}
get date() {
return new Date(this.timestamp);
}
encode() {
const timestampPart = BigInt(this.timestamp - 1420070400000) << 22n;
const workerIdPart = BigInt(this.workerId) << 17n;
const processIdPart = BigInt(this.processId) << 12n;
const incrementPart = BigInt(this.increment);
const snowflakeInt = timestampPart | workerIdPart | processIdPart |
incrementPart;
return snowflakeInt.toString();
}
toString() {
return `date:${this.date.toISOString()} worker:${this.workerId} process:${this.processId} increment:${this.increment}`;
}
}