@andrew_l/snowflake 0.3.1 → 0.3.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -47,7 +47,7 @@ class Snowflake {
47
47
  this._epoch = toolkit.timestampMs(toolkit.isBigInt(epoch) ? Number(epoch) : epoch);
48
48
  this.workerId = workerId;
49
49
  this.processId = processId;
50
- this._increment = Number(increment) & MAX_INCREMENT;
50
+ this.increment = increment;
51
51
  }
52
52
  this._buffer = new Uint8Array(8);
53
53
  }
@@ -84,7 +84,80 @@ class Snowflake {
84
84
  this._workerId = Number(value) & MAX_WORKER_ID;
85
85
  }
86
86
  /**
87
- * Generates a Snowflake ID as a `Uint8Array` buffer.
87
+ * Get incrementor for generating snowflakes
88
+ */
89
+ get increment() {
90
+ return this._increment;
91
+ }
92
+ /**
93
+ * Sets the incrementor for generating snowflakes that will be used by default for the {@link generate} method
94
+ * @param value The new value
95
+ */
96
+ set increment(value) {
97
+ this._increment = Number(value) & MAX_INCREMENT;
98
+ }
99
+ _createSavePoint() {
100
+ var increment = this._increment;
101
+ var workerId = this._workerId;
102
+ var processId = this._processId;
103
+ return () => {
104
+ this._increment = increment;
105
+ this._workerId = workerId;
106
+ this._processId = processId;
107
+ };
108
+ }
109
+ /**
110
+ * Sets most lowest values for generating snowflakes that will be used by default for the {@link generate} method
111
+ */
112
+ setLowest() {
113
+ this._increment = 0;
114
+ this._workerId = 0;
115
+ this._processId = 0;
116
+ }
117
+ /**
118
+ * Sets most highest values for generating snowflakes that will be used by default for the {@link generate} method
119
+ */
120
+ setHighest() {
121
+ this._increment = MAX_INCREMENT;
122
+ this._workerId = MAX_WORKER_ID;
123
+ this._processId = MAX_PROCESS_ID;
124
+ }
125
+ /**
126
+ * Execute a function in context of most lowest values for generating snowflakes
127
+ * @example
128
+ * ```typescript
129
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
130
+ * const snowflake = new Snowflake();
131
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the lowest possible id for that epoch
132
+ * ```
133
+ */
134
+ withLowest(fn) {
135
+ toolkit.assert.fn(fn, "withLowest expected a function as first argument");
136
+ var reset = this._createSavePoint();
137
+ this.setLowest();
138
+ var result = fn(this);
139
+ reset();
140
+ return result;
141
+ }
142
+ /**
143
+ * Execute a function in context of most highest values for generating snowflakes
144
+ * @example
145
+ * ```typescript
146
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
147
+ * const snowflake = new Snowflake();
148
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the highest possible id for that epoch
149
+ * ```
150
+ */
151
+ withHighest(fn) {
152
+ toolkit.assert.fn(fn, "withHighest expected a function as first argument");
153
+ var reset = this._createSavePoint();
154
+ this.setHighest();
155
+ var result = fn(this);
156
+ reset();
157
+ return result;
158
+ }
159
+ /**
160
+ * Generates a Snowflake ID as bigint.
88
161
  */
89
162
  generate(timestamp = Date.now()) {
90
163
  if (timestamp instanceof Date) timestamp = timestamp.getTime();
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/Snowflake.ts"],"sourcesContent":["/**\n * Based on: https://github.com/sapphiredev/utilities/blob/main/packages/snowflake/src/lib/Snowflake.ts\n */\nimport {\n bigIntBytes,\n bigIntFromBytes,\n isBigInt,\n isDate,\n isNumber,\n isString,\n timestampMs,\n} from '@andrew_l/toolkit';\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n /**\n * The id as a number\n */\n id: bigint;\n\n /**\n * The timestamp stored in the snowflake\n */\n timestamp: number;\n\n /**\n * The worker id stored in the snowflake\n */\n workerId: number;\n\n /**\n * The process id stored in the snowflake\n */\n processId: number;\n\n /**\n * The increment stored in the snowflake\n */\n increment: number;\n\n /**\n * The epoch to use in the snowflake\n */\n epoch: number;\n}\n\n/**\n * Options for Snowflake\n */\nexport interface SnowflakeOptions {\n /**\n * Timestamp or date of the snowflake to generate\n */\n epoch: number | bigint | Date;\n\n /**\n * The increment to use\n * @default 0\n * @remark keep in mind that this number is auto-incremented between generate calls\n */\n increment?: number | bigint;\n\n /**\n * The worker ID to use, will be truncated to 5 bits (0-31)\n * @default 0\n */\n workerId?: number | bigint;\n\n /**\n * The process ID to use, will be truncated to 5 bits (0-31)\n * @default 1\n */\n processId?: number | bigint;\n}\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport var MAX_WORKER_ID = 0x1f;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport var MAX_PROCESS_ID = 0x1f;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport var MAX_INCREMENT = 0xfff;\n\n/**\n * A class for generating and deconstructing Twitter snowflakes.\n *\n * A {@link https://developer.twitter.com/en/docs/twitter-ids Twitter snowflake}\n * is a 64-bit unsigned integer with 4 fields that have a fixed epoch value.\n *\n * If we have a snowflake `266241948824764416` we can represent it as binary:\n * ```\n * 64 22 17 12 0\n * 000000111011000111100001101001000101000000 00001 00000 000000000000\n * number of ms since epoch worker pid increment\n * ```\n *\n * @group Main\n */\nexport class Snowflake {\n /**\n * Alias for {@link deconstruct}\n */\n public decode = this.deconstruct;\n\n /**\n * Internal reference of the epoch passed in the constructor\n * @internal\n */\n private readonly _epoch: number;\n\n /**\n * Internal incrementor for generating snowflakes\n * @internal\n */\n private _increment = 0;\n\n /**\n * The process ID that will be used by default in the generate method\n * @internal\n */\n private _processId = 1;\n\n /**\n * The worker ID that will be used by default in the generate method\n * @internal\n */\n private _workerId = 0;\n\n /**\n * @internal\n */\n private _buffer: Uint8Array;\n\n /**\n * @param epoch the epoch to use\n */\n public constructor(opts: SnowflakeOptions | Date | number | bigint) {\n if (isDate(opts) || isNumber(opts)) {\n this._epoch = timestampMs(opts);\n } else if (isBigInt(opts)) {\n this._epoch = timestampMs(Number(opts));\n } else {\n const { increment = 0, processId = 1, workerId = 0, epoch } = opts;\n this._epoch = timestampMs(isBigInt(epoch) ? Number(epoch) : epoch);\n this.workerId = workerId;\n this.processId = processId;\n this._increment = Number(increment) & MAX_INCREMENT;\n }\n\n this._buffer = new Uint8Array(8);\n }\n\n /**\n * The epoch for this snowflake, as a number\n */\n public get epoch(): number {\n return this._epoch;\n }\n\n /**\n * Gets the configured process ID\n */\n public get processId(): number {\n return this._processId;\n }\n\n /**\n * Sets the process ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set processId(value: number | bigint) {\n this._processId = Number(value) & MAX_PROCESS_ID;\n }\n\n /**\n * Gets the configured worker ID\n */\n public get workerId(): number {\n return this._workerId;\n }\n\n /**\n * Sets the worker ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set workerId(value: number | bigint) {\n this._workerId = Number(value) & MAX_WORKER_ID;\n }\n\n /**\n * Generates a Snowflake ID as a `Uint8Array` buffer.\n */\n public generate(timestamp: Date | number = Date.now()): bigint {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n return (\n (BigInt(timestamp - this._epoch) << 22n) |\n (BigInt(this._workerId & MAX_WORKER_ID) << 17n) |\n (BigInt(this._processId & MAX_PROCESS_ID) << 12n) |\n BigInt(increment & MAX_INCREMENT)\n );\n }\n\n /**\n * Generates a Snowflake ID as a `Uint8Array` buffer.\n *\n * ⚠️ Returns a reference to the **same** internal `Uint8Array` instance.\n * Its contents may be overwritten on the next ID generation call.\n *\n * This method is intended for high-performance scenarios where you\n * immediately transform the buffer (e.g., to base62) before calling again.\n * Avoid storing or mutating the returned buffer directly.\n */\n public generateBufferUnsafe(timestamp: Date | number = Date.now()) {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n // Calculate the timestamp delta\n var timestampDelta = timestamp - this._epoch;\n\n // Split into 32-bit parts for bitwise operations\n var timestampHigh = Math.floor(timestampDelta / 0xffffffff);\n var timestampLow = timestampDelta >>> 0;\n\n var high32 = ((timestampHigh << 22) | (timestampLow >>> 10)) >>> 0;\n var low32 =\n ((timestampLow << 22) |\n (this._workerId << 17) |\n (this._processId << 12) |\n (increment & MAX_INCREMENT)) >>>\n 0;\n\n var buffer = this._buffer;\n\n buffer[0] = high32 >>> 24;\n buffer[1] = high32 >>> 16;\n buffer[2] = high32 >>> 8;\n buffer[3] = high32;\n buffer[4] = low32 >>> 24;\n buffer[5] = low32 >>> 16;\n buffer[6] = low32 >>> 8;\n buffer[7] = low32;\n\n return buffer;\n }\n\n /**\n * Generates a snowflake given an epoch and optionally a timestamp\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake({ epoch }).generate();\n * ```\n * @returns A unique snowflake as Uint8Array\n */\n public generateBuffer(timestamp: Date | number = Date.now()) {\n this.generateBufferUnsafe(timestamp);\n return new Uint8Array(this._buffer);\n }\n\n /**\n * Deconstructs a snowflake given a snowflake ID\n * @param id the snowflake to deconstruct\n * @returns a deconstructed snowflake\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n * ```\n */\n public deconstruct(id: string | bigint | Uint8Array): DeconstructedSnowflake {\n var high32: number, low32: number;\n\n if (id instanceof Uint8Array) {\n // Convert from Uint8Array\n high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n } else if (isBigInt(id)) {\n return this.deconstruct(bigIntBytes(id));\n } else {\n // Convert from string\n return this.deconstruct(bigIntBytes(BigInt(id)));\n }\n\n return {\n id: BigInt(high32) * 0x100000000n + BigInt(low32),\n timestamp: high32 * 0x400 + (low32 >>> 22) + this._epoch,\n workerId: (low32 >>> 17) & MAX_WORKER_ID,\n processId: (low32 >>> 12) & MAX_PROCESS_ID,\n increment: low32 & MAX_INCREMENT,\n epoch: this._epoch,\n };\n }\n\n /**\n * Retrieves the timestamp field's value from a snowflake.\n * @param id The snowflake to get the timestamp value from.\n * @returns The UNIX timestamp that is stored in `id`.\n */\n public timestampFrom(id: string | bigint | Uint8Array): number {\n if (isString(id) || isBigInt(id)) {\n return this.timestampFrom(Snowflake.bufferFrom(id));\n }\n\n var high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n var low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n\n return high32 * 0x400 + (low32 >>> 22) + this._epoch;\n }\n\n /**\n * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n * snowflake in sort order.\n * @param a The first snowflake to compare.\n * @param b The second snowflake to compare.\n * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n */\n public static compare(\n a: string | bigint | Uint8Array,\n b: string | bigint | Uint8Array,\n ): -1 | 0 | 1 {\n if (isString(a)) {\n a = BigInt(a);\n } else if (a instanceof Uint8Array) {\n a = bigIntFromBytes(a);\n }\n\n if (isString(b)) {\n b = BigInt(b);\n } else if (b instanceof Uint8Array) {\n b = bigIntFromBytes(b);\n }\n\n return a === b ? 0 : a < b ? -1 : 1;\n }\n\n /**\n * Parse value as Uint8Array buffer\n */\n public static bufferFrom(value: bigint | string): Uint8Array {\n if (isString(value)) value = BigInt(value);\n\n var buf = bigIntBytes(value);\n var bufSize = buf.byteLength;\n\n // Add padding\n if (buf.byteLength < 8) {\n var buf2 = new Uint8Array(8);\n buf2.set(buf, 8 - bufSize);\n buf = buf2;\n }\n\n return buf;\n }\n}\n"],"names":["isDate","isNumber","timestampMs","isBigInt","bigIntBytes","isString","bigIntFromBytes"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/Snowflake.ts"],"sourcesContent":["/**\n * Based on: https://github.com/sapphiredev/utilities/blob/main/packages/snowflake/src/lib/Snowflake.ts\n */\nimport {\n type AnyFunction,\n assert,\n bigIntBytes,\n bigIntFromBytes,\n isBigInt,\n isDate,\n isNumber,\n isString,\n timestampMs,\n} from '@andrew_l/toolkit';\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n /**\n * The id as a number\n */\n id: bigint;\n\n /**\n * The timestamp stored in the snowflake\n */\n timestamp: number;\n\n /**\n * The worker id stored in the snowflake\n */\n workerId: number;\n\n /**\n * The process id stored in the snowflake\n */\n processId: number;\n\n /**\n * The increment stored in the snowflake\n */\n increment: number;\n\n /**\n * The epoch to use in the snowflake\n */\n epoch: number;\n}\n\n/**\n * Options for Snowflake\n */\nexport interface SnowflakeOptions {\n /**\n * Timestamp or date of the snowflake to generate\n */\n epoch: number | bigint | Date;\n\n /**\n * The increment to use\n * @default 0\n * @remark keep in mind that this number is auto-incremented between generate calls\n */\n increment?: number | bigint;\n\n /**\n * The worker ID to use, will be truncated to 5 bits (0-31)\n * @default 0\n */\n workerId?: number | bigint;\n\n /**\n * The process ID to use, will be truncated to 5 bits (0-31)\n * @default 1\n */\n processId?: number | bigint;\n}\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport var MAX_WORKER_ID = 0x1f;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport var MAX_PROCESS_ID = 0x1f;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport var MAX_INCREMENT = 0xfff;\n\n/**\n * A class for generating and deconstructing Twitter snowflakes.\n *\n * A {@link https://developer.twitter.com/en/docs/twitter-ids Twitter snowflake}\n * is a 64-bit unsigned integer with 4 fields that have a fixed epoch value.\n *\n * If we have a snowflake `266241948824764416` we can represent it as binary:\n * ```\n * 64 22 17 12 0\n * 000000111011000111100001101001000101000000 00001 00000 000000000000\n * number of ms since epoch worker pid increment\n * ```\n *\n * @group Main\n */\nexport class Snowflake {\n /**\n * Alias for {@link deconstruct}\n */\n public decode = this.deconstruct;\n\n /**\n * Internal reference of the epoch passed in the constructor\n * @internal\n */\n private readonly _epoch: number;\n\n /**\n * Internal incrementor for generating snowflakes\n * @internal\n */\n private _increment = 0;\n\n /**\n * The process ID that will be used by default in the generate method\n * @internal\n */\n private _processId = 1;\n\n /**\n * The worker ID that will be used by default in the generate method\n * @internal\n */\n private _workerId = 0;\n\n /**\n * @internal\n */\n private _buffer: Uint8Array;\n\n /**\n * @param epoch the epoch to use\n */\n public constructor(opts: SnowflakeOptions | Date | number | bigint) {\n if (isDate(opts) || isNumber(opts)) {\n this._epoch = timestampMs(opts);\n } else if (isBigInt(opts)) {\n this._epoch = timestampMs(Number(opts));\n } else {\n const { increment = 0, processId = 1, workerId = 0, epoch } = opts;\n this._epoch = timestampMs(isBigInt(epoch) ? Number(epoch) : epoch);\n this.workerId = workerId;\n this.processId = processId;\n this.increment = increment;\n }\n\n this._buffer = new Uint8Array(8);\n }\n\n /**\n * The epoch for this snowflake, as a number\n */\n public get epoch(): number {\n return this._epoch;\n }\n\n /**\n * Gets the configured process ID\n */\n public get processId(): number {\n return this._processId;\n }\n\n /**\n * Sets the process ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set processId(value: number | bigint) {\n this._processId = Number(value) & MAX_PROCESS_ID;\n }\n\n /**\n * Gets the configured worker ID\n */\n public get workerId(): number {\n return this._workerId;\n }\n\n /**\n * Sets the worker ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set workerId(value: number | bigint) {\n this._workerId = Number(value) & MAX_WORKER_ID;\n }\n\n /**\n * Get incrementor for generating snowflakes\n */\n public get increment(): number {\n return this._increment;\n }\n\n /**\n * Sets the incrementor for generating snowflakes that will be used by default for the {@link generate} method\n * @param value The new value\n */\n public set increment(value: number | bigint) {\n this._increment = Number(value) & MAX_INCREMENT;\n }\n\n private _createSavePoint(): AnyFunction {\n var increment = this._increment;\n var workerId = this._workerId;\n var processId = this._processId;\n\n return () => {\n this._increment = increment;\n this._workerId = workerId;\n this._processId = processId;\n };\n }\n\n /**\n * Sets most lowest values for generating snowflakes that will be used by default for the {@link generate} method\n */\n setLowest(): void {\n this._increment = 0;\n this._workerId = 0;\n this._processId = 0;\n }\n\n /**\n * Sets most highest values for generating snowflakes that will be used by default for the {@link generate} method\n */\n setHighest(): void {\n this._increment = MAX_INCREMENT;\n this._workerId = MAX_WORKER_ID;\n this._processId = MAX_PROCESS_ID;\n }\n\n /**\n * Execute a function in context of most lowest values for generating snowflakes\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake();\n * const id = snowflake.withLowest((v) => v.generate(epoch)); // the lowest possible id for that epoch\n * ```\n */\n withLowest<Result = undefined>(fn: (instance: Snowflake) => Result): Result {\n assert.fn(fn, 'withLowest expected a function as first argument');\n\n var reset = this._createSavePoint();\n this.setLowest();\n\n var result = fn(this);\n reset();\n\n return result;\n }\n\n /**\n * Execute a function in context of most highest values for generating snowflakes\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake();\n * const id = snowflake.withLowest((v) => v.generate(epoch)); // the highest possible id for that epoch\n * ```\n */\n withHighest<Result = undefined>(fn: (instance: Snowflake) => Result): Result {\n assert.fn(fn, 'withHighest expected a function as first argument');\n\n var reset = this._createSavePoint();\n\n this.setHighest();\n\n var result = fn(this);\n reset();\n\n return result;\n }\n\n /**\n * Generates a Snowflake ID as bigint.\n */\n public generate(timestamp: Date | number = Date.now()): bigint {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n return (\n (BigInt(timestamp - this._epoch) << 22n) |\n (BigInt(this._workerId & MAX_WORKER_ID) << 17n) |\n (BigInt(this._processId & MAX_PROCESS_ID) << 12n) |\n BigInt(increment & MAX_INCREMENT)\n );\n }\n\n /**\n * Generates a Snowflake ID as a `Uint8Array` buffer.\n *\n * ⚠️ Returns a reference to the **same** internal `Uint8Array` instance.\n * Its contents may be overwritten on the next ID generation call.\n *\n * This method is intended for high-performance scenarios where you\n * immediately transform the buffer (e.g., to base62) before calling again.\n * Avoid storing or mutating the returned buffer directly.\n */\n public generateBufferUnsafe(\n timestamp: Date | number = Date.now(),\n ): Uint8Array {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n // Calculate the timestamp delta\n var timestampDelta = timestamp - this._epoch;\n\n // Split into 32-bit parts for bitwise operations\n var timestampHigh = Math.floor(timestampDelta / 0xffffffff);\n var timestampLow = timestampDelta >>> 0;\n\n var high32 = ((timestampHigh << 22) | (timestampLow >>> 10)) >>> 0;\n var low32 =\n ((timestampLow << 22) |\n (this._workerId << 17) |\n (this._processId << 12) |\n (increment & MAX_INCREMENT)) >>>\n 0;\n\n var buffer = this._buffer;\n\n buffer[0] = high32 >>> 24;\n buffer[1] = high32 >>> 16;\n buffer[2] = high32 >>> 8;\n buffer[3] = high32;\n buffer[4] = low32 >>> 24;\n buffer[5] = low32 >>> 16;\n buffer[6] = low32 >>> 8;\n buffer[7] = low32;\n\n return buffer;\n }\n\n /**\n * Generates a snowflake given an epoch and optionally a timestamp\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake({ epoch }).generate();\n * ```\n * @returns A unique snowflake as Uint8Array\n */\n public generateBuffer(timestamp: Date | number = Date.now()): Uint8Array {\n this.generateBufferUnsafe(timestamp);\n return new Uint8Array(this._buffer);\n }\n\n /**\n * Deconstructs a snowflake given a snowflake ID\n * @param id the snowflake to deconstruct\n * @returns a deconstructed snowflake\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n * ```\n */\n public deconstruct(id: string | bigint | Uint8Array): DeconstructedSnowflake {\n var high32: number, low32: number;\n\n if (id instanceof Uint8Array) {\n // Convert from Uint8Array\n high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n } else if (isBigInt(id)) {\n return this.deconstruct(bigIntBytes(id));\n } else {\n // Convert from string\n return this.deconstruct(bigIntBytes(BigInt(id)));\n }\n\n return {\n id: BigInt(high32) * 0x100000000n + BigInt(low32),\n timestamp: high32 * 0x400 + (low32 >>> 22) + this._epoch,\n workerId: (low32 >>> 17) & MAX_WORKER_ID,\n processId: (low32 >>> 12) & MAX_PROCESS_ID,\n increment: low32 & MAX_INCREMENT,\n epoch: this._epoch,\n };\n }\n\n /**\n * Retrieves the timestamp field's value from a snowflake.\n * @param id The snowflake to get the timestamp value from.\n * @returns The UNIX timestamp that is stored in `id`.\n */\n public timestampFrom(id: string | bigint | Uint8Array): number {\n if (isString(id) || isBigInt(id)) {\n return this.timestampFrom(Snowflake.bufferFrom(id));\n }\n\n var high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n var low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n\n return high32 * 0x400 + (low32 >>> 22) + this._epoch;\n }\n\n /**\n * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n * snowflake in sort order.\n * @param a The first snowflake to compare.\n * @param b The second snowflake to compare.\n * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n */\n public static compare(\n a: string | bigint | Uint8Array,\n b: string | bigint | Uint8Array,\n ): -1 | 0 | 1 {\n if (isString(a)) {\n a = BigInt(a);\n } else if (a instanceof Uint8Array) {\n a = bigIntFromBytes(a);\n }\n\n if (isString(b)) {\n b = BigInt(b);\n } else if (b instanceof Uint8Array) {\n b = bigIntFromBytes(b);\n }\n\n return a === b ? 0 : a < b ? -1 : 1;\n }\n\n /**\n * Parse value as Uint8Array buffer\n */\n public static bufferFrom(value: bigint | string): Uint8Array {\n if (isString(value)) value = BigInt(value);\n\n var buf = bigIntBytes(value);\n var bufSize = buf.byteLength;\n\n // Add padding\n if (buf.byteLength < 8) {\n var buf2 = new Uint8Array(8);\n buf2.set(buf, 8 - bufSize);\n buf = buf2;\n }\n\n return buf;\n }\n}\n"],"names":["isDate","isNumber","timestampMs","isBigInt","assert","bigIntBytes","isString","bigIntFromBytes"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -73,8 +73,8 @@ declare var MAX_INCREMENT: number;
73
73
  * If we have a snowflake `266241948824764416` we can represent it as binary:
74
74
  * ```
75
75
  * 64 22 17 12 0
76
- * 000000111011000111100001101001000101000000 00001 00000 000000000000
77
- * number of ms since epoch worker pid increment
76
+ * 000000111011000111100001101001000101000000 00001 00000 000000000000
77
+ * number of ms since epoch worker pid increment
78
78
  * ```
79
79
  *
80
80
  * @group Main
@@ -135,7 +135,45 @@ declare class Snowflake {
135
135
  */
136
136
  set workerId(value: number | bigint);
137
137
  /**
138
- * Generates a Snowflake ID as a `Uint8Array` buffer.
138
+ * Get incrementor for generating snowflakes
139
+ */
140
+ get increment(): number;
141
+ /**
142
+ * Sets the incrementor for generating snowflakes that will be used by default for the {@link generate} method
143
+ * @param value The new value
144
+ */
145
+ set increment(value: number | bigint);
146
+ private _createSavePoint;
147
+ /**
148
+ * Sets most lowest values for generating snowflakes that will be used by default for the {@link generate} method
149
+ */
150
+ setLowest(): void;
151
+ /**
152
+ * Sets most highest values for generating snowflakes that will be used by default for the {@link generate} method
153
+ */
154
+ setHighest(): void;
155
+ /**
156
+ * Execute a function in context of most lowest values for generating snowflakes
157
+ * @example
158
+ * ```typescript
159
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
160
+ * const snowflake = new Snowflake();
161
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the lowest possible id for that epoch
162
+ * ```
163
+ */
164
+ withLowest<Result = undefined>(fn: (instance: Snowflake) => Result): Result;
165
+ /**
166
+ * Execute a function in context of most highest values for generating snowflakes
167
+ * @example
168
+ * ```typescript
169
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
170
+ * const snowflake = new Snowflake();
171
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the highest possible id for that epoch
172
+ * ```
173
+ */
174
+ withHighest<Result = undefined>(fn: (instance: Snowflake) => Result): Result;
175
+ /**
176
+ * Generates a Snowflake ID as bigint.
139
177
  */
140
178
  generate(timestamp?: Date | number): bigint;
141
179
  /**
@@ -148,7 +186,7 @@ declare class Snowflake {
148
186
  * immediately transform the buffer (e.g., to base62) before calling again.
149
187
  * Avoid storing or mutating the returned buffer directly.
150
188
  */
151
- generateBufferUnsafe(timestamp?: Date | number): Uint8Array<ArrayBufferLike>;
189
+ generateBufferUnsafe(timestamp?: Date | number): Uint8Array;
152
190
  /**
153
191
  * Generates a snowflake given an epoch and optionally a timestamp
154
192
  * @example
@@ -158,7 +196,7 @@ declare class Snowflake {
158
196
  * ```
159
197
  * @returns A unique snowflake as Uint8Array
160
198
  */
161
- generateBuffer(timestamp?: Date | number): Uint8Array<ArrayBuffer>;
199
+ generateBuffer(timestamp?: Date | number): Uint8Array;
162
200
  /**
163
201
  * Deconstructs a snowflake given a snowflake ID
164
202
  * @param id the snowflake to deconstruct
package/dist/index.d.mts CHANGED
@@ -73,8 +73,8 @@ declare var MAX_INCREMENT: number;
73
73
  * If we have a snowflake `266241948824764416` we can represent it as binary:
74
74
  * ```
75
75
  * 64 22 17 12 0
76
- * 000000111011000111100001101001000101000000 00001 00000 000000000000
77
- * number of ms since epoch worker pid increment
76
+ * 000000111011000111100001101001000101000000 00001 00000 000000000000
77
+ * number of ms since epoch worker pid increment
78
78
  * ```
79
79
  *
80
80
  * @group Main
@@ -135,7 +135,45 @@ declare class Snowflake {
135
135
  */
136
136
  set workerId(value: number | bigint);
137
137
  /**
138
- * Generates a Snowflake ID as a `Uint8Array` buffer.
138
+ * Get incrementor for generating snowflakes
139
+ */
140
+ get increment(): number;
141
+ /**
142
+ * Sets the incrementor for generating snowflakes that will be used by default for the {@link generate} method
143
+ * @param value The new value
144
+ */
145
+ set increment(value: number | bigint);
146
+ private _createSavePoint;
147
+ /**
148
+ * Sets most lowest values for generating snowflakes that will be used by default for the {@link generate} method
149
+ */
150
+ setLowest(): void;
151
+ /**
152
+ * Sets most highest values for generating snowflakes that will be used by default for the {@link generate} method
153
+ */
154
+ setHighest(): void;
155
+ /**
156
+ * Execute a function in context of most lowest values for generating snowflakes
157
+ * @example
158
+ * ```typescript
159
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
160
+ * const snowflake = new Snowflake();
161
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the lowest possible id for that epoch
162
+ * ```
163
+ */
164
+ withLowest<Result = undefined>(fn: (instance: Snowflake) => Result): Result;
165
+ /**
166
+ * Execute a function in context of most highest values for generating snowflakes
167
+ * @example
168
+ * ```typescript
169
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
170
+ * const snowflake = new Snowflake();
171
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the highest possible id for that epoch
172
+ * ```
173
+ */
174
+ withHighest<Result = undefined>(fn: (instance: Snowflake) => Result): Result;
175
+ /**
176
+ * Generates a Snowflake ID as bigint.
139
177
  */
140
178
  generate(timestamp?: Date | number): bigint;
141
179
  /**
@@ -148,7 +186,7 @@ declare class Snowflake {
148
186
  * immediately transform the buffer (e.g., to base62) before calling again.
149
187
  * Avoid storing or mutating the returned buffer directly.
150
188
  */
151
- generateBufferUnsafe(timestamp?: Date | number): Uint8Array<ArrayBufferLike>;
189
+ generateBufferUnsafe(timestamp?: Date | number): Uint8Array;
152
190
  /**
153
191
  * Generates a snowflake given an epoch and optionally a timestamp
154
192
  * @example
@@ -158,7 +196,7 @@ declare class Snowflake {
158
196
  * ```
159
197
  * @returns A unique snowflake as Uint8Array
160
198
  */
161
- generateBuffer(timestamp?: Date | number): Uint8Array<ArrayBuffer>;
199
+ generateBuffer(timestamp?: Date | number): Uint8Array;
162
200
  /**
163
201
  * Deconstructs a snowflake given a snowflake ID
164
202
  * @param id the snowflake to deconstruct
package/dist/index.d.ts CHANGED
@@ -73,8 +73,8 @@ declare var MAX_INCREMENT: number;
73
73
  * If we have a snowflake `266241948824764416` we can represent it as binary:
74
74
  * ```
75
75
  * 64 22 17 12 0
76
- * 000000111011000111100001101001000101000000 00001 00000 000000000000
77
- * number of ms since epoch worker pid increment
76
+ * 000000111011000111100001101001000101000000 00001 00000 000000000000
77
+ * number of ms since epoch worker pid increment
78
78
  * ```
79
79
  *
80
80
  * @group Main
@@ -135,7 +135,45 @@ declare class Snowflake {
135
135
  */
136
136
  set workerId(value: number | bigint);
137
137
  /**
138
- * Generates a Snowflake ID as a `Uint8Array` buffer.
138
+ * Get incrementor for generating snowflakes
139
+ */
140
+ get increment(): number;
141
+ /**
142
+ * Sets the incrementor for generating snowflakes that will be used by default for the {@link generate} method
143
+ * @param value The new value
144
+ */
145
+ set increment(value: number | bigint);
146
+ private _createSavePoint;
147
+ /**
148
+ * Sets most lowest values for generating snowflakes that will be used by default for the {@link generate} method
149
+ */
150
+ setLowest(): void;
151
+ /**
152
+ * Sets most highest values for generating snowflakes that will be used by default for the {@link generate} method
153
+ */
154
+ setHighest(): void;
155
+ /**
156
+ * Execute a function in context of most lowest values for generating snowflakes
157
+ * @example
158
+ * ```typescript
159
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
160
+ * const snowflake = new Snowflake();
161
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the lowest possible id for that epoch
162
+ * ```
163
+ */
164
+ withLowest<Result = undefined>(fn: (instance: Snowflake) => Result): Result;
165
+ /**
166
+ * Execute a function in context of most highest values for generating snowflakes
167
+ * @example
168
+ * ```typescript
169
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
170
+ * const snowflake = new Snowflake();
171
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the highest possible id for that epoch
172
+ * ```
173
+ */
174
+ withHighest<Result = undefined>(fn: (instance: Snowflake) => Result): Result;
175
+ /**
176
+ * Generates a Snowflake ID as bigint.
139
177
  */
140
178
  generate(timestamp?: Date | number): bigint;
141
179
  /**
@@ -148,7 +186,7 @@ declare class Snowflake {
148
186
  * immediately transform the buffer (e.g., to base62) before calling again.
149
187
  * Avoid storing or mutating the returned buffer directly.
150
188
  */
151
- generateBufferUnsafe(timestamp?: Date | number): Uint8Array<ArrayBufferLike>;
189
+ generateBufferUnsafe(timestamp?: Date | number): Uint8Array;
152
190
  /**
153
191
  * Generates a snowflake given an epoch and optionally a timestamp
154
192
  * @example
@@ -158,7 +196,7 @@ declare class Snowflake {
158
196
  * ```
159
197
  * @returns A unique snowflake as Uint8Array
160
198
  */
161
- generateBuffer(timestamp?: Date | number): Uint8Array<ArrayBuffer>;
199
+ generateBuffer(timestamp?: Date | number): Uint8Array;
162
200
  /**
163
201
  * Deconstructs a snowflake given a snowflake ID
164
202
  * @param id the snowflake to deconstruct
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { isDate, isNumber, timestampMs, isBigInt, bigIntBytes, isString, bigIntFromBytes } from '@andrew_l/toolkit';
1
+ import { isDate, isNumber, timestampMs, isBigInt, assert, bigIntBytes, isString, bigIntFromBytes } from '@andrew_l/toolkit';
2
2
 
3
3
  var MAX_WORKER_ID = 31;
4
4
  var MAX_PROCESS_ID = 31;
@@ -45,7 +45,7 @@ class Snowflake {
45
45
  this._epoch = timestampMs(isBigInt(epoch) ? Number(epoch) : epoch);
46
46
  this.workerId = workerId;
47
47
  this.processId = processId;
48
- this._increment = Number(increment) & MAX_INCREMENT;
48
+ this.increment = increment;
49
49
  }
50
50
  this._buffer = new Uint8Array(8);
51
51
  }
@@ -82,7 +82,80 @@ class Snowflake {
82
82
  this._workerId = Number(value) & MAX_WORKER_ID;
83
83
  }
84
84
  /**
85
- * Generates a Snowflake ID as a `Uint8Array` buffer.
85
+ * Get incrementor for generating snowflakes
86
+ */
87
+ get increment() {
88
+ return this._increment;
89
+ }
90
+ /**
91
+ * Sets the incrementor for generating snowflakes that will be used by default for the {@link generate} method
92
+ * @param value The new value
93
+ */
94
+ set increment(value) {
95
+ this._increment = Number(value) & MAX_INCREMENT;
96
+ }
97
+ _createSavePoint() {
98
+ var increment = this._increment;
99
+ var workerId = this._workerId;
100
+ var processId = this._processId;
101
+ return () => {
102
+ this._increment = increment;
103
+ this._workerId = workerId;
104
+ this._processId = processId;
105
+ };
106
+ }
107
+ /**
108
+ * Sets most lowest values for generating snowflakes that will be used by default for the {@link generate} method
109
+ */
110
+ setLowest() {
111
+ this._increment = 0;
112
+ this._workerId = 0;
113
+ this._processId = 0;
114
+ }
115
+ /**
116
+ * Sets most highest values for generating snowflakes that will be used by default for the {@link generate} method
117
+ */
118
+ setHighest() {
119
+ this._increment = MAX_INCREMENT;
120
+ this._workerId = MAX_WORKER_ID;
121
+ this._processId = MAX_PROCESS_ID;
122
+ }
123
+ /**
124
+ * Execute a function in context of most lowest values for generating snowflakes
125
+ * @example
126
+ * ```typescript
127
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
128
+ * const snowflake = new Snowflake();
129
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the lowest possible id for that epoch
130
+ * ```
131
+ */
132
+ withLowest(fn) {
133
+ assert.fn(fn, "withLowest expected a function as first argument");
134
+ var reset = this._createSavePoint();
135
+ this.setLowest();
136
+ var result = fn(this);
137
+ reset();
138
+ return result;
139
+ }
140
+ /**
141
+ * Execute a function in context of most highest values for generating snowflakes
142
+ * @example
143
+ * ```typescript
144
+ * const epoch = new Date('2000-01-01T00:00:00.000Z');
145
+ * const snowflake = new Snowflake();
146
+ * const id = snowflake.withLowest((v) => v.generate(epoch)); // the highest possible id for that epoch
147
+ * ```
148
+ */
149
+ withHighest(fn) {
150
+ assert.fn(fn, "withHighest expected a function as first argument");
151
+ var reset = this._createSavePoint();
152
+ this.setHighest();
153
+ var result = fn(this);
154
+ reset();
155
+ return result;
156
+ }
157
+ /**
158
+ * Generates a Snowflake ID as bigint.
86
159
  */
87
160
  generate(timestamp = Date.now()) {
88
161
  if (timestamp instanceof Date) timestamp = timestamp.getTime();
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/Snowflake.ts"],"sourcesContent":["/**\n * Based on: https://github.com/sapphiredev/utilities/blob/main/packages/snowflake/src/lib/Snowflake.ts\n */\nimport {\n bigIntBytes,\n bigIntFromBytes,\n isBigInt,\n isDate,\n isNumber,\n isString,\n timestampMs,\n} from '@andrew_l/toolkit';\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n /**\n * The id as a number\n */\n id: bigint;\n\n /**\n * The timestamp stored in the snowflake\n */\n timestamp: number;\n\n /**\n * The worker id stored in the snowflake\n */\n workerId: number;\n\n /**\n * The process id stored in the snowflake\n */\n processId: number;\n\n /**\n * The increment stored in the snowflake\n */\n increment: number;\n\n /**\n * The epoch to use in the snowflake\n */\n epoch: number;\n}\n\n/**\n * Options for Snowflake\n */\nexport interface SnowflakeOptions {\n /**\n * Timestamp or date of the snowflake to generate\n */\n epoch: number | bigint | Date;\n\n /**\n * The increment to use\n * @default 0\n * @remark keep in mind that this number is auto-incremented between generate calls\n */\n increment?: number | bigint;\n\n /**\n * The worker ID to use, will be truncated to 5 bits (0-31)\n * @default 0\n */\n workerId?: number | bigint;\n\n /**\n * The process ID to use, will be truncated to 5 bits (0-31)\n * @default 1\n */\n processId?: number | bigint;\n}\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport var MAX_WORKER_ID = 0x1f;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport var MAX_PROCESS_ID = 0x1f;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport var MAX_INCREMENT = 0xfff;\n\n/**\n * A class for generating and deconstructing Twitter snowflakes.\n *\n * A {@link https://developer.twitter.com/en/docs/twitter-ids Twitter snowflake}\n * is a 64-bit unsigned integer with 4 fields that have a fixed epoch value.\n *\n * If we have a snowflake `266241948824764416` we can represent it as binary:\n * ```\n * 64 22 17 12 0\n * 000000111011000111100001101001000101000000 00001 00000 000000000000\n * number of ms since epoch worker pid increment\n * ```\n *\n * @group Main\n */\nexport class Snowflake {\n /**\n * Alias for {@link deconstruct}\n */\n public decode = this.deconstruct;\n\n /**\n * Internal reference of the epoch passed in the constructor\n * @internal\n */\n private readonly _epoch: number;\n\n /**\n * Internal incrementor for generating snowflakes\n * @internal\n */\n private _increment = 0;\n\n /**\n * The process ID that will be used by default in the generate method\n * @internal\n */\n private _processId = 1;\n\n /**\n * The worker ID that will be used by default in the generate method\n * @internal\n */\n private _workerId = 0;\n\n /**\n * @internal\n */\n private _buffer: Uint8Array;\n\n /**\n * @param epoch the epoch to use\n */\n public constructor(opts: SnowflakeOptions | Date | number | bigint) {\n if (isDate(opts) || isNumber(opts)) {\n this._epoch = timestampMs(opts);\n } else if (isBigInt(opts)) {\n this._epoch = timestampMs(Number(opts));\n } else {\n const { increment = 0, processId = 1, workerId = 0, epoch } = opts;\n this._epoch = timestampMs(isBigInt(epoch) ? Number(epoch) : epoch);\n this.workerId = workerId;\n this.processId = processId;\n this._increment = Number(increment) & MAX_INCREMENT;\n }\n\n this._buffer = new Uint8Array(8);\n }\n\n /**\n * The epoch for this snowflake, as a number\n */\n public get epoch(): number {\n return this._epoch;\n }\n\n /**\n * Gets the configured process ID\n */\n public get processId(): number {\n return this._processId;\n }\n\n /**\n * Sets the process ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set processId(value: number | bigint) {\n this._processId = Number(value) & MAX_PROCESS_ID;\n }\n\n /**\n * Gets the configured worker ID\n */\n public get workerId(): number {\n return this._workerId;\n }\n\n /**\n * Sets the worker ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set workerId(value: number | bigint) {\n this._workerId = Number(value) & MAX_WORKER_ID;\n }\n\n /**\n * Generates a Snowflake ID as a `Uint8Array` buffer.\n */\n public generate(timestamp: Date | number = Date.now()): bigint {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n return (\n (BigInt(timestamp - this._epoch) << 22n) |\n (BigInt(this._workerId & MAX_WORKER_ID) << 17n) |\n (BigInt(this._processId & MAX_PROCESS_ID) << 12n) |\n BigInt(increment & MAX_INCREMENT)\n );\n }\n\n /**\n * Generates a Snowflake ID as a `Uint8Array` buffer.\n *\n * ⚠️ Returns a reference to the **same** internal `Uint8Array` instance.\n * Its contents may be overwritten on the next ID generation call.\n *\n * This method is intended for high-performance scenarios where you\n * immediately transform the buffer (e.g., to base62) before calling again.\n * Avoid storing or mutating the returned buffer directly.\n */\n public generateBufferUnsafe(timestamp: Date | number = Date.now()) {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n // Calculate the timestamp delta\n var timestampDelta = timestamp - this._epoch;\n\n // Split into 32-bit parts for bitwise operations\n var timestampHigh = Math.floor(timestampDelta / 0xffffffff);\n var timestampLow = timestampDelta >>> 0;\n\n var high32 = ((timestampHigh << 22) | (timestampLow >>> 10)) >>> 0;\n var low32 =\n ((timestampLow << 22) |\n (this._workerId << 17) |\n (this._processId << 12) |\n (increment & MAX_INCREMENT)) >>>\n 0;\n\n var buffer = this._buffer;\n\n buffer[0] = high32 >>> 24;\n buffer[1] = high32 >>> 16;\n buffer[2] = high32 >>> 8;\n buffer[3] = high32;\n buffer[4] = low32 >>> 24;\n buffer[5] = low32 >>> 16;\n buffer[6] = low32 >>> 8;\n buffer[7] = low32;\n\n return buffer;\n }\n\n /**\n * Generates a snowflake given an epoch and optionally a timestamp\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake({ epoch }).generate();\n * ```\n * @returns A unique snowflake as Uint8Array\n */\n public generateBuffer(timestamp: Date | number = Date.now()) {\n this.generateBufferUnsafe(timestamp);\n return new Uint8Array(this._buffer);\n }\n\n /**\n * Deconstructs a snowflake given a snowflake ID\n * @param id the snowflake to deconstruct\n * @returns a deconstructed snowflake\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n * ```\n */\n public deconstruct(id: string | bigint | Uint8Array): DeconstructedSnowflake {\n var high32: number, low32: number;\n\n if (id instanceof Uint8Array) {\n // Convert from Uint8Array\n high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n } else if (isBigInt(id)) {\n return this.deconstruct(bigIntBytes(id));\n } else {\n // Convert from string\n return this.deconstruct(bigIntBytes(BigInt(id)));\n }\n\n return {\n id: BigInt(high32) * 0x100000000n + BigInt(low32),\n timestamp: high32 * 0x400 + (low32 >>> 22) + this._epoch,\n workerId: (low32 >>> 17) & MAX_WORKER_ID,\n processId: (low32 >>> 12) & MAX_PROCESS_ID,\n increment: low32 & MAX_INCREMENT,\n epoch: this._epoch,\n };\n }\n\n /**\n * Retrieves the timestamp field's value from a snowflake.\n * @param id The snowflake to get the timestamp value from.\n * @returns The UNIX timestamp that is stored in `id`.\n */\n public timestampFrom(id: string | bigint | Uint8Array): number {\n if (isString(id) || isBigInt(id)) {\n return this.timestampFrom(Snowflake.bufferFrom(id));\n }\n\n var high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n var low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n\n return high32 * 0x400 + (low32 >>> 22) + this._epoch;\n }\n\n /**\n * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n * snowflake in sort order.\n * @param a The first snowflake to compare.\n * @param b The second snowflake to compare.\n * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n */\n public static compare(\n a: string | bigint | Uint8Array,\n b: string | bigint | Uint8Array,\n ): -1 | 0 | 1 {\n if (isString(a)) {\n a = BigInt(a);\n } else if (a instanceof Uint8Array) {\n a = bigIntFromBytes(a);\n }\n\n if (isString(b)) {\n b = BigInt(b);\n } else if (b instanceof Uint8Array) {\n b = bigIntFromBytes(b);\n }\n\n return a === b ? 0 : a < b ? -1 : 1;\n }\n\n /**\n * Parse value as Uint8Array buffer\n */\n public static bufferFrom(value: bigint | string): Uint8Array {\n if (isString(value)) value = BigInt(value);\n\n var buf = bigIntBytes(value);\n var bufSize = buf.byteLength;\n\n // Add padding\n if (buf.byteLength < 8) {\n var buf2 = new Uint8Array(8);\n buf2.set(buf, 8 - bufSize);\n buf = buf2;\n }\n\n return buf;\n }\n}\n"],"names":[],"mappings":";;AAgFO,IAAI,aAAA,GAAgB;AAKpB,IAAI,cAAA,GAAiB;AAKrB,IAAI,aAAA,GAAgB;AAiBpB,MAAM,SAAA,CAAU;AAAA;AAAA;AAAA;AAAA,EAId,SAAS,IAAA,CAAK,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMJ,MAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMT,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,UAAA,GAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMb,SAAA,GAAY,CAAA;AAAA;AAAA;AAAA;AAAA,EAKZ,OAAA;AAAA;AAAA;AAAA;AAAA,EAKD,YAAY,IAAA,EAAiD;AAClE,IAAA,IAAI,MAAA,CAAO,IAAI,CAAA,IAAK,QAAA,CAAS,IAAI,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,MAAA,GAAS,YAAY,IAAI,CAAA;AAAA,IAChC,CAAA,MAAA,IAAW,QAAA,CAAS,IAAI,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,MAAA,GAAS,WAAA,CAAY,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,MAAM,EAAE,YAAY,CAAA,EAAG,SAAA,GAAY,GAAG,QAAA,GAAW,CAAA,EAAG,OAAM,GAAI,IAAA;AAC9D,MAAA,IAAA,CAAK,MAAA,GAAS,YAAY,QAAA,CAAS,KAAK,IAAI,MAAA,CAAO,KAAK,IAAI,KAAK,CAAA;AACjE,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,MAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,SAAS,CAAA,GAAI,aAAA;AAAA,IACxC;AAEA,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,UAAA,CAAW,CAAC,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,KAAA,GAAgB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,SAAA,GAAoB;AAC7B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,UAAU,KAAA,EAAwB;AAC3C,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA,CAAO,KAAK,CAAA,GAAI,cAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,QAAA,GAAmB;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,SAAS,KAAA,EAAwB;AAC1C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,KAAK,CAAA,GAAI,aAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKO,QAAA,CAAS,SAAA,GAA2B,IAAA,CAAK,GAAA,EAAI,EAAW;AAC7D,IAAA,IAAI,SAAA,YAAqB,IAAA,EAAM,SAAA,GAAY,SAAA,CAAU,OAAA,EAAQ;AAC7D,IAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wDAAA,EAA2D,OAAO,SAAS,CAAA,CAAA;AAAA,OAC7E;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,IAAA,CAAK,UAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAc,IAAA,CAAK,UAAA,GAAa,CAAA,GAAK,aAAA;AAE1C,IAAA,OACG,MAAA,CAAO,YAAY,IAAA,CAAK,MAAM,KAAK,GAAA,GACnC,MAAA,CAAO,KAAK,SAAA,GAAY,aAAa,KAAK,GAAA,GAC1C,MAAA,CAAO,KAAK,UAAA,GAAa,cAAc,KAAK,GAAA,GAC7C,MAAA,CAAO,YAAY,aAAa,CAAA;AAAA,EAEpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,oBAAA,CAAqB,SAAA,GAA2B,IAAA,CAAK,GAAA,EAAI,EAAG;AACjE,IAAA,IAAI,SAAA,YAAqB,IAAA,EAAM,SAAA,GAAY,SAAA,CAAU,OAAA,EAAQ;AAC7D,IAAA,IAAI,CAAC,QAAA,CAAS,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,wDAAA,EAA2D,OAAO,SAAS,CAAA,CAAA;AAAA,OAC7E;AAAA,IACF;AAEA,IAAA,IAAI,YAAY,IAAA,CAAK,UAAA;AACrB,IAAA,IAAA,CAAK,UAAA,GAAc,IAAA,CAAK,UAAA,GAAa,CAAA,GAAK,aAAA;AAG1C,IAAA,IAAI,cAAA,GAAiB,YAAY,IAAA,CAAK,MAAA;AAGtC,IAAA,IAAI,aAAA,GAAgB,IAAA,CAAK,KAAA,CAAM,cAAA,GAAiB,UAAU,CAAA;AAC1D,IAAA,IAAI,eAAe,cAAA,KAAmB,CAAA;AAEtC,IAAA,IAAI,MAAA,GAAA,CAAW,aAAA,IAAiB,EAAA,GAAO,YAAA,KAAiB,EAAA,MAAS,CAAA;AACjE,IAAA,IAAI,KAAA,GAAA,CACA,YAAA,IAAgB,EAAA,GACf,IAAA,CAAK,SAAA,IAAa,KAClB,IAAA,CAAK,UAAA,IAAc,EAAA,GACnB,SAAA,GAAY,aAAA,MACf,CAAA;AAEF,IAAA,IAAI,SAAS,IAAA,CAAK,OAAA;AAElB,IAAA,MAAA,CAAO,CAAC,IAAI,MAAA,KAAW,EAAA;AACvB,IAAA,MAAA,CAAO,CAAC,IAAI,MAAA,KAAW,EAAA;AACvB,IAAA,MAAA,CAAO,CAAC,IAAI,MAAA,KAAW,CAAA;AACvB,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA;AACZ,IAAA,MAAA,CAAO,CAAC,IAAI,KAAA,KAAU,EAAA;AACtB,IAAA,MAAA,CAAO,CAAC,IAAI,KAAA,KAAU,EAAA;AACtB,IAAA,MAAA,CAAO,CAAC,IAAI,KAAA,KAAU,CAAA;AACtB,IAAA,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA;AAEZ,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWO,cAAA,CAAe,SAAA,GAA2B,IAAA,CAAK,GAAA,EAAI,EAAG;AAC3D,IAAA,IAAA,CAAK,qBAAqB,SAAS,CAAA;AACnC,IAAA,OAAO,IAAI,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,YAAY,EAAA,EAA0D;AAC3E,IAAA,IAAI,MAAA,EAAgB,KAAA;AAEpB,IAAA,IAAI,cAAc,UAAA,EAAY;AAE5B,MAAA,MAAA,GAAA,CAAW,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,GAAO,GAAG,CAAC,CAAA,IAAK,EAAA,GAAO,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA,MAAO,CAAA;AACpE,MAAA,KAAA,GAAA,CAAU,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,GAAO,GAAG,CAAC,CAAA,IAAK,EAAA,GAAO,EAAA,CAAG,CAAC,CAAA,IAAK,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA,MAAO,CAAA;AAAA,IACrE,CAAA,MAAA,IAAW,QAAA,CAAS,EAAE,CAAA,EAAG;AACvB,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,EAAE,CAAC,CAAA;AAAA,IACzC,CAAA,MAAO;AAEL,MAAA,OAAO,KAAK,WAAA,CAAY,WAAA,CAAY,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO;AAAA,MACL,IAAI,MAAA,CAAO,MAAM,CAAA,GAAI,YAAA,GAAe,OAAO,KAAK,CAAA;AAAA,MAChD,SAAA,EAAW,MAAA,GAAS,IAAA,IAAS,KAAA,KAAU,MAAM,IAAA,CAAK,MAAA;AAAA,MAClD,QAAA,EAAW,UAAU,EAAA,GAAM,aAAA;AAAA,MAC3B,SAAA,EAAY,UAAU,EAAA,GAAM,cAAA;AAAA,MAC5B,WAAW,KAAA,GAAQ,aAAA;AAAA,MACnB,OAAO,IAAA,CAAK;AAAA,KACd;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,cAAc,EAAA,EAA0C;AAC7D,IAAA,IAAI,QAAA,CAAS,EAAE,CAAA,IAAK,QAAA,CAAS,EAAE,CAAA,EAAG;AAChC,MAAA,OAAO,IAAA,CAAK,aAAA,CAAc,SAAA,CAAU,UAAA,CAAW,EAAE,CAAC,CAAA;AAAA,IACpD;AAEA,IAAA,IAAI,MAAA,GAAA,CAAW,EAAA,CAAG,CAAC,CAAA,IAAK,KAAO,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,GAAO,GAAG,CAAC,CAAA,IAAK,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA,MAAO,CAAA;AACxE,IAAA,IAAI,KAAA,GAAA,CAAU,EAAA,CAAG,CAAC,CAAA,IAAK,KAAO,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA,GAAO,GAAG,CAAC,CAAA,IAAK,CAAA,GAAK,EAAA,CAAG,CAAC,CAAA,MAAO,CAAA;AAEvE,IAAA,OAAO,MAAA,GAAS,IAAA,IAAS,KAAA,KAAU,EAAA,CAAA,GAAM,IAAA,CAAK,MAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAc,OAAA,CACZ,CAAA,EACA,CAAA,EACY;AACZ,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG;AACf,MAAA,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,IACd,CAAA,MAAA,IAAW,aAAa,UAAA,EAAY;AAClC,MAAA,CAAA,GAAI,gBAAgB,CAAC,CAAA;AAAA,IACvB;AAEA,IAAA,IAAI,QAAA,CAAS,CAAC,CAAA,EAAG;AACf,MAAA,CAAA,GAAI,OAAO,CAAC,CAAA;AAAA,IACd,CAAA,MAAA,IAAW,aAAa,UAAA,EAAY;AAClC,MAAA,CAAA,GAAI,gBAAgB,CAAC,CAAA;AAAA,IACvB;AAEA,IAAA,OAAO,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,IAAI,EAAA,GAAK,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,WAAW,KAAA,EAAoC;AAC3D,IAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG,KAAA,GAAQ,OAAO,KAAK,CAAA;AAEzC,IAAA,IAAI,GAAA,GAAM,YAAY,KAAK,CAAA;AAC3B,IAAA,IAAI,UAAU,GAAA,CAAI,UAAA;AAGlB,IAAA,IAAI,GAAA,CAAI,aAAa,CAAA,EAAG;AACtB,MAAA,IAAI,IAAA,GAAO,IAAI,UAAA,CAAW,CAAC,CAAA;AAC3B,MAAA,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,OAAO,CAAA;AACzB,MAAA,GAAA,GAAM,IAAA;AAAA,IACR;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/Snowflake.ts"],"sourcesContent":["/**\n * Based on: https://github.com/sapphiredev/utilities/blob/main/packages/snowflake/src/lib/Snowflake.ts\n */\nimport {\n type AnyFunction,\n assert,\n bigIntBytes,\n bigIntFromBytes,\n isBigInt,\n isDate,\n isNumber,\n isString,\n timestampMs,\n} from '@andrew_l/toolkit';\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n /**\n * The id as a number\n */\n id: bigint;\n\n /**\n * The timestamp stored in the snowflake\n */\n timestamp: number;\n\n /**\n * The worker id stored in the snowflake\n */\n workerId: number;\n\n /**\n * The process id stored in the snowflake\n */\n processId: number;\n\n /**\n * The increment stored in the snowflake\n */\n increment: number;\n\n /**\n * The epoch to use in the snowflake\n */\n epoch: number;\n}\n\n/**\n * Options for Snowflake\n */\nexport interface SnowflakeOptions {\n /**\n * Timestamp or date of the snowflake to generate\n */\n epoch: number | bigint | Date;\n\n /**\n * The increment to use\n * @default 0\n * @remark keep in mind that this number is auto-incremented between generate calls\n */\n increment?: number | bigint;\n\n /**\n * The worker ID to use, will be truncated to 5 bits (0-31)\n * @default 0\n */\n workerId?: number | bigint;\n\n /**\n * The process ID to use, will be truncated to 5 bits (0-31)\n * @default 1\n */\n processId?: number | bigint;\n}\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport var MAX_WORKER_ID = 0x1f;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport var MAX_PROCESS_ID = 0x1f;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport var MAX_INCREMENT = 0xfff;\n\n/**\n * A class for generating and deconstructing Twitter snowflakes.\n *\n * A {@link https://developer.twitter.com/en/docs/twitter-ids Twitter snowflake}\n * is a 64-bit unsigned integer with 4 fields that have a fixed epoch value.\n *\n * If we have a snowflake `266241948824764416` we can represent it as binary:\n * ```\n * 64 22 17 12 0\n * 000000111011000111100001101001000101000000 00001 00000 000000000000\n * number of ms since epoch worker pid increment\n * ```\n *\n * @group Main\n */\nexport class Snowflake {\n /**\n * Alias for {@link deconstruct}\n */\n public decode = this.deconstruct;\n\n /**\n * Internal reference of the epoch passed in the constructor\n * @internal\n */\n private readonly _epoch: number;\n\n /**\n * Internal incrementor for generating snowflakes\n * @internal\n */\n private _increment = 0;\n\n /**\n * The process ID that will be used by default in the generate method\n * @internal\n */\n private _processId = 1;\n\n /**\n * The worker ID that will be used by default in the generate method\n * @internal\n */\n private _workerId = 0;\n\n /**\n * @internal\n */\n private _buffer: Uint8Array;\n\n /**\n * @param epoch the epoch to use\n */\n public constructor(opts: SnowflakeOptions | Date | number | bigint) {\n if (isDate(opts) || isNumber(opts)) {\n this._epoch = timestampMs(opts);\n } else if (isBigInt(opts)) {\n this._epoch = timestampMs(Number(opts));\n } else {\n const { increment = 0, processId = 1, workerId = 0, epoch } = opts;\n this._epoch = timestampMs(isBigInt(epoch) ? Number(epoch) : epoch);\n this.workerId = workerId;\n this.processId = processId;\n this.increment = increment;\n }\n\n this._buffer = new Uint8Array(8);\n }\n\n /**\n * The epoch for this snowflake, as a number\n */\n public get epoch(): number {\n return this._epoch;\n }\n\n /**\n * Gets the configured process ID\n */\n public get processId(): number {\n return this._processId;\n }\n\n /**\n * Sets the process ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set processId(value: number | bigint) {\n this._processId = Number(value) & MAX_PROCESS_ID;\n }\n\n /**\n * Gets the configured worker ID\n */\n public get workerId(): number {\n return this._workerId;\n }\n\n /**\n * Sets the worker ID that will be used by default for the {@link generate} method\n * @param value The new value, will be masked with `0b11111`\n */\n public set workerId(value: number | bigint) {\n this._workerId = Number(value) & MAX_WORKER_ID;\n }\n\n /**\n * Get incrementor for generating snowflakes\n */\n public get increment(): number {\n return this._increment;\n }\n\n /**\n * Sets the incrementor for generating snowflakes that will be used by default for the {@link generate} method\n * @param value The new value\n */\n public set increment(value: number | bigint) {\n this._increment = Number(value) & MAX_INCREMENT;\n }\n\n private _createSavePoint(): AnyFunction {\n var increment = this._increment;\n var workerId = this._workerId;\n var processId = this._processId;\n\n return () => {\n this._increment = increment;\n this._workerId = workerId;\n this._processId = processId;\n };\n }\n\n /**\n * Sets most lowest values for generating snowflakes that will be used by default for the {@link generate} method\n */\n setLowest(): void {\n this._increment = 0;\n this._workerId = 0;\n this._processId = 0;\n }\n\n /**\n * Sets most highest values for generating snowflakes that will be used by default for the {@link generate} method\n */\n setHighest(): void {\n this._increment = MAX_INCREMENT;\n this._workerId = MAX_WORKER_ID;\n this._processId = MAX_PROCESS_ID;\n }\n\n /**\n * Execute a function in context of most lowest values for generating snowflakes\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake();\n * const id = snowflake.withLowest((v) => v.generate(epoch)); // the lowest possible id for that epoch\n * ```\n */\n withLowest<Result = undefined>(fn: (instance: Snowflake) => Result): Result {\n assert.fn(fn, 'withLowest expected a function as first argument');\n\n var reset = this._createSavePoint();\n this.setLowest();\n\n var result = fn(this);\n reset();\n\n return result;\n }\n\n /**\n * Execute a function in context of most highest values for generating snowflakes\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake();\n * const id = snowflake.withLowest((v) => v.generate(epoch)); // the highest possible id for that epoch\n * ```\n */\n withHighest<Result = undefined>(fn: (instance: Snowflake) => Result): Result {\n assert.fn(fn, 'withHighest expected a function as first argument');\n\n var reset = this._createSavePoint();\n\n this.setHighest();\n\n var result = fn(this);\n reset();\n\n return result;\n }\n\n /**\n * Generates a Snowflake ID as bigint.\n */\n public generate(timestamp: Date | number = Date.now()): bigint {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n return (\n (BigInt(timestamp - this._epoch) << 22n) |\n (BigInt(this._workerId & MAX_WORKER_ID) << 17n) |\n (BigInt(this._processId & MAX_PROCESS_ID) << 12n) |\n BigInt(increment & MAX_INCREMENT)\n );\n }\n\n /**\n * Generates a Snowflake ID as a `Uint8Array` buffer.\n *\n * ⚠️ Returns a reference to the **same** internal `Uint8Array` instance.\n * Its contents may be overwritten on the next ID generation call.\n *\n * This method is intended for high-performance scenarios where you\n * immediately transform the buffer (e.g., to base62) before calling again.\n * Avoid storing or mutating the returned buffer directly.\n */\n public generateBufferUnsafe(\n timestamp: Date | number = Date.now(),\n ): Uint8Array {\n if (timestamp instanceof Date) timestamp = timestamp.getTime();\n if (!isNumber(timestamp)) {\n throw new Error(\n `\"timestamp\" argument must be a number or Date (received ${typeof timestamp})`,\n );\n }\n\n var increment = this._increment;\n this._increment = (this._increment + 1) & MAX_INCREMENT;\n\n // Calculate the timestamp delta\n var timestampDelta = timestamp - this._epoch;\n\n // Split into 32-bit parts for bitwise operations\n var timestampHigh = Math.floor(timestampDelta / 0xffffffff);\n var timestampLow = timestampDelta >>> 0;\n\n var high32 = ((timestampHigh << 22) | (timestampLow >>> 10)) >>> 0;\n var low32 =\n ((timestampLow << 22) |\n (this._workerId << 17) |\n (this._processId << 12) |\n (increment & MAX_INCREMENT)) >>>\n 0;\n\n var buffer = this._buffer;\n\n buffer[0] = high32 >>> 24;\n buffer[1] = high32 >>> 16;\n buffer[2] = high32 >>> 8;\n buffer[3] = high32;\n buffer[4] = low32 >>> 24;\n buffer[5] = low32 >>> 16;\n buffer[6] = low32 >>> 8;\n buffer[7] = low32;\n\n return buffer;\n }\n\n /**\n * Generates a snowflake given an epoch and optionally a timestamp\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake({ epoch }).generate();\n * ```\n * @returns A unique snowflake as Uint8Array\n */\n public generateBuffer(timestamp: Date | number = Date.now()): Uint8Array {\n this.generateBufferUnsafe(timestamp);\n return new Uint8Array(this._buffer);\n }\n\n /**\n * Deconstructs a snowflake given a snowflake ID\n * @param id the snowflake to deconstruct\n * @returns a deconstructed snowflake\n * @example\n * ```typescript\n * const epoch = new Date('2000-01-01T00:00:00.000Z');\n * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n * ```\n */\n public deconstruct(id: string | bigint | Uint8Array): DeconstructedSnowflake {\n var high32: number, low32: number;\n\n if (id instanceof Uint8Array) {\n // Convert from Uint8Array\n high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n } else if (isBigInt(id)) {\n return this.deconstruct(bigIntBytes(id));\n } else {\n // Convert from string\n return this.deconstruct(bigIntBytes(BigInt(id)));\n }\n\n return {\n id: BigInt(high32) * 0x100000000n + BigInt(low32),\n timestamp: high32 * 0x400 + (low32 >>> 22) + this._epoch,\n workerId: (low32 >>> 17) & MAX_WORKER_ID,\n processId: (low32 >>> 12) & MAX_PROCESS_ID,\n increment: low32 & MAX_INCREMENT,\n epoch: this._epoch,\n };\n }\n\n /**\n * Retrieves the timestamp field's value from a snowflake.\n * @param id The snowflake to get the timestamp value from.\n * @returns The UNIX timestamp that is stored in `id`.\n */\n public timestampFrom(id: string | bigint | Uint8Array): number {\n if (isString(id) || isBigInt(id)) {\n return this.timestampFrom(Snowflake.bufferFrom(id));\n }\n\n var high32 = ((id[0] << 24) | (id[1] << 16) | (id[2] << 8) | id[3]) >>> 0;\n var low32 = ((id[4] << 24) | (id[5] << 16) | (id[6] << 8) | id[7]) >>> 0;\n\n return high32 * 0x400 + (low32 >>> 22) + this._epoch;\n }\n\n /**\n * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n * snowflake in sort order.\n * @param a The first snowflake to compare.\n * @param b The second snowflake to compare.\n * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n */\n public static compare(\n a: string | bigint | Uint8Array,\n b: string | bigint | Uint8Array,\n ): -1 | 0 | 1 {\n if (isString(a)) {\n a = BigInt(a);\n } else if (a instanceof Uint8Array) {\n a = bigIntFromBytes(a);\n }\n\n if (isString(b)) {\n b = BigInt(b);\n } else if (b instanceof Uint8Array) {\n b = bigIntFromBytes(b);\n }\n\n return a === b ? 0 : a < b ? -1 : 1;\n }\n\n /**\n * Parse value as Uint8Array buffer\n */\n public static bufferFrom(value: bigint | string): Uint8Array {\n if (isString(value)) value = BigInt(value);\n\n var buf = bigIntBytes(value);\n var bufSize = buf.byteLength;\n\n // Add padding\n if (buf.byteLength < 8) {\n var buf2 = new Uint8Array(8);\n buf2.set(buf, 8 - bufSize);\n buf = buf2;\n }\n\n return buf;\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andrew_l/snowflake",
3
- "version": "0.3.1",
3
+ "version": "0.3.21",
4
4
  "description": "Another implementation of snowflake id generator.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -28,7 +28,7 @@
28
28
  "dist"
29
29
  ],
30
30
  "dependencies": {
31
- "@andrew_l/toolkit": "0.3.1"
31
+ "@andrew_l/toolkit": "0.3.21"
32
32
  },
33
33
  "devDependencies": {
34
34
  "@sapphire/snowflake": "^3.5.5",