@sapphire/snowflake 3.5.4-next.1e73db92 → 3.5.4-next.1e7d2dec

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/README.md CHANGED
@@ -7,7 +7,6 @@
7
7
  **Deconstruct and generate snowflake IDs using BigInts.**
8
8
 
9
9
  [![GitHub](https://img.shields.io/github/license/sapphiredev/utilities)](https://github.com/sapphiredev/utilities/blob/main/LICENSE.md)
10
- [![codecov](https://codecov.io/gh/sapphiredev/utilities/branch/main/graph/badge.svg?token=OEGIV6RFDO)](https://codecov.io/gh/sapphiredev/utilities)
11
10
  [![npm bundle size](https://img.shields.io/bundlephobia/min/@sapphire/snowflake?logo=webpack&style=flat-square)](https://bundlephobia.com/result?p=@sapphire/snowflake)
12
11
  [![npm](https://img.shields.io/npm/v/@sapphire/snowflake?color=crimson&logo=npm&style=flat-square)](https://www.npmjs.com/package/@sapphire/snowflake)
13
12
 
@@ -8,13 +8,15 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
8
8
  // src/lib/Snowflake.ts
9
9
  var IncrementSymbol = Symbol("@sapphire/snowflake.increment");
10
10
  var EpochSymbol = Symbol("@sapphire/snowflake.epoch");
11
+ var EpochNumberSymbol = Symbol("@sapphire/snowflake.epoch.number");
11
12
  var ProcessIdSymbol = Symbol("@sapphire/snowflake.processId");
12
13
  var WorkerIdSymbol = Symbol("@sapphire/snowflake.workerId");
13
14
  var MaximumWorkerId = 0b11111n;
14
15
  var MaximumProcessId = 0b11111n;
15
16
  var MaximumIncrement = 0b111111111111n;
16
- var _a, _b, _c, _d;
17
- _d = EpochSymbol, _c = IncrementSymbol, _b = ProcessIdSymbol, _a = WorkerIdSymbol;
17
+ var TimestampFieldDivisor = 2 ** 22;
18
+ var _a, _b, _c, _d, _e;
19
+ _e = EpochSymbol, _d = EpochNumberSymbol, _c = IncrementSymbol, _b = ProcessIdSymbol, _a = WorkerIdSymbol;
18
20
  var _Snowflake = class _Snowflake {
19
21
  /**
20
22
  * @param epoch the epoch to use
@@ -29,6 +31,11 @@ var _Snowflake = class _Snowflake {
29
31
  * Internal reference of the epoch passed in the constructor
30
32
  * @internal
31
33
  */
34
+ __publicField(this, _e);
35
+ /**
36
+ * Internal reference of the epoch passed in the constructor as a number
37
+ * @internal
38
+ */
32
39
  __publicField(this, _d);
33
40
  /**
34
41
  * Internal incrementor for generating snowflakes
@@ -46,13 +53,20 @@ var _Snowflake = class _Snowflake {
46
53
  */
47
54
  __publicField(this, _a, 0n);
48
55
  this[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);
56
+ this[EpochNumberSymbol] = Number(this[EpochSymbol]);
49
57
  }
50
58
  /**
51
- * The epoch for this snowflake
59
+ * The epoch for this snowflake, as a bigint
52
60
  */
53
61
  get epoch() {
54
62
  return this[EpochSymbol];
55
63
  }
64
+ /**
65
+ * The epoch for this snowflake, as a number
66
+ */
67
+ get epochNumber() {
68
+ return this[EpochNumberSymbol];
69
+ }
56
70
  /**
57
71
  * Gets the configured process ID
58
72
  */
@@ -136,7 +150,7 @@ var _Snowflake = class _Snowflake {
136
150
  * @returns The UNIX timestamp that is stored in `id`.
137
151
  */
138
152
  timestampFrom(id) {
139
- return Number((BigInt(id) >> 22n) + this[EpochSymbol]);
153
+ return Math.floor(Number(id) / TimestampFieldDivisor) + this[EpochNumberSymbol];
140
154
  }
141
155
  /**
142
156
  * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/Snowflake.ts","../../src/lib/DiscordSnowflake.ts","../../src/lib/TwitterSnowflake.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["const IncrementSymbol = Symbol('@sapphire/snowflake.increment');\nconst EpochSymbol = Symbol('@sapphire/snowflake.epoch');\nconst ProcessIdSymbol = Symbol('@sapphire/snowflake.processId');\nconst WorkerIdSymbol = Symbol('@sapphire/snowflake.workerId');\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport const MaximumWorkerId = 0b11111n;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport const MaximumProcessId = 0b11111n;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport const MaximumIncrement = 0b111111111111n;\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 */\nexport class Snowflake {\n\t/**\n\t * Alias for {@link deconstruct}\n\t */\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tpublic decode = this.deconstruct;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor\n\t * @internal\n\t */\n\tprivate readonly [EpochSymbol]: bigint;\n\n\t/**\n\t * Internal incrementor for generating snowflakes\n\t * @internal\n\t */\n\tprivate [IncrementSymbol] = 0n;\n\n\t/**\n\t * The process ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [ProcessIdSymbol] = 1n;\n\n\t/**\n\t * The worker ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [WorkerIdSymbol] = 0n;\n\n\t/**\n\t * @param epoch the epoch to use\n\t */\n\tpublic constructor(epoch: number | bigint | Date) {\n\t\tthis[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);\n\t}\n\n\t/**\n\t * The epoch for this snowflake\n\t */\n\tpublic get epoch(): bigint {\n\t\treturn this[EpochSymbol];\n\t}\n\n\t/**\n\t * Gets the configured process ID\n\t */\n\tpublic get processId(): bigint {\n\t\treturn this[ProcessIdSymbol];\n\t}\n\n\t/**\n\t * Sets the process ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set processId(value: number | bigint) {\n\t\tthis[ProcessIdSymbol] = BigInt(value) & MaximumProcessId;\n\t}\n\n\t/**\n\t * Gets the configured worker ID\n\t */\n\tpublic get workerId(): bigint {\n\t\treturn this[WorkerIdSymbol];\n\t}\n\n\t/**\n\t * Sets the worker ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set workerId(value: number | bigint) {\n\t\tthis[WorkerIdSymbol] = BigInt(value) & MaximumWorkerId;\n\t}\n\n\t/**\n\t * Generates a snowflake given an epoch and optionally a timestamp\n\t * @param options options to pass into the generator, see {@link SnowflakeGenerateOptions}\n\t *\n\t * **note** when `increment` is not provided it defaults to the private `increment` of the instance\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).generate();\n\t * ```\n\t * @returns A unique snowflake\n\t */\n\tpublic generate({\n\t\tincrement,\n\t\ttimestamp = Date.now(),\n\t\tworkerId = this[WorkerIdSymbol],\n\t\tprocessId = this[ProcessIdSymbol]\n\t}: SnowflakeGenerateOptions = {}) {\n\t\tif (timestamp instanceof Date) timestamp = BigInt(timestamp.getTime());\n\t\telse if (typeof timestamp === 'number') timestamp = BigInt(timestamp);\n\t\telse if (typeof timestamp !== 'bigint') {\n\t\t\tthrow new TypeError(`\"timestamp\" argument must be a number, bigint, or Date (received ${typeof timestamp})`);\n\t\t}\n\n\t\tif (typeof increment !== 'bigint') {\n\t\t\tincrement = this[IncrementSymbol];\n\t\t\tthis[IncrementSymbol] = (increment + 1n) & MaximumIncrement;\n\t\t}\n\n\t\t// timestamp, workerId, processId, increment\n\t\treturn (\n\t\t\t((timestamp - this[EpochSymbol]) << 22n) |\n\t\t\t((workerId & MaximumWorkerId) << 17n) |\n\t\t\t((processId & MaximumProcessId) << 12n) |\n\t\t\t(increment & MaximumIncrement)\n\t\t);\n\t}\n\n\t/**\n\t * Deconstructs a snowflake given a snowflake ID\n\t * @param id the snowflake to deconstruct\n\t * @returns a deconstructed snowflake\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n\t * ```\n\t */\n\tpublic deconstruct(id: string | bigint): DeconstructedSnowflake {\n\t\tconst bigIntId = BigInt(id);\n\t\tconst epoch = this[EpochSymbol];\n\t\treturn {\n\t\t\tid: bigIntId,\n\t\t\ttimestamp: (bigIntId >> 22n) + epoch,\n\t\t\tworkerId: (bigIntId >> 17n) & MaximumWorkerId,\n\t\t\tprocessId: (bigIntId >> 12n) & MaximumProcessId,\n\t\t\tincrement: bigIntId & MaximumIncrement,\n\t\t\tepoch\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves the timestamp field's value from a snowflake.\n\t * @param id The snowflake to get the timestamp value from.\n\t * @returns The UNIX timestamp that is stored in `id`.\n\t */\n\tpublic timestampFrom(id: string | bigint): number {\n\t\treturn Number((BigInt(id) >> 22n) + this[EpochSymbol]);\n\t}\n\n\t/**\n\t * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n\t * snowflake in sort order.\n\t * @param a The first snowflake to compare.\n\t * @param b The second snowflake to compare.\n\t * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n\t * @example Sort snowflakes in ascending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => Snowflake.compare(a, b)));\n\t * // → ['254360814063058944', '737141877803057244', '1056191128120082432'];\n\t * ```\n\t * @example Sort snowflakes in descending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => -Snowflake.compare(a, b)));\n\t * // → ['1056191128120082432', '737141877803057244', '254360814063058944'];\n\t * ```\n\t */\n\tpublic static compare(a: string | bigint, b: string | bigint): -1 | 0 | 1 {\n\t\tconst typeA = typeof a;\n\t\treturn typeA === typeof b\n\t\t\t? typeA === 'string'\n\t\t\t\t? cmpString(a as string, b as string)\n\t\t\t\t: cmpBigInt(a as bigint, b as bigint)\n\t\t\t: cmpBigInt(BigInt(a), BigInt(b));\n\t}\n}\n\n/** @internal */\nfunction cmpBigInt(a: bigint, b: bigint) {\n\treturn a === b ? 0 : a < b ? -1 : 1;\n}\n\n/** @internal */\nfunction cmpString(a: string, b: string) {\n\treturn a === b ? 0 : a.length < b.length ? -1 : a.length > b.length ? 1 : a < b ? -1 : 1;\n}\n\n/**\n * Options for Snowflake#generate\n */\nexport interface SnowflakeGenerateOptions {\n\t/**\n\t * Timestamp or date of the snowflake to generate\n\t * @default Date.now()\n\t */\n\ttimestamp?: number | bigint | Date;\n\n\t/**\n\t * The increment to use\n\t * @default 0n\n\t * @remark keep in mind that this bigint is auto-incremented between generate calls\n\t */\n\tincrement?: bigint;\n\n\t/**\n\t * The worker ID to use, will be truncated to 5 bits (0-31)\n\t * @default 0n\n\t */\n\tworkerId?: bigint;\n\n\t/**\n\t * The process ID to use, will be truncated to 5 bits (0-31)\n\t * @default 1n\n\t */\n\tprocessId?: bigint;\n}\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n\t/**\n\t * The id in BigInt form\n\t */\n\tid: bigint;\n\n\t/**\n\t * The timestamp stored in the snowflake\n\t */\n\ttimestamp: bigint;\n\n\t/**\n\t * The worker id stored in the snowflake\n\t */\n\tworkerId: bigint;\n\n\t/**\n\t * The process id stored in the snowflake\n\t */\n\tprocessId: bigint;\n\n\t/**\n\t * The increment stored in the snowflake\n\t */\n\tincrement: bigint;\n\n\t/**\n\t * The epoch to use in the snowflake\n\t */\n\tepoch: bigint;\n}\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Discord's snowflake epoch\n *\n * Which is 2015-01-01 at 00:00:00.000 UTC+0, {@linkplain https://discord.com/developers/docs/reference#snowflakes}\n */\nexport const DiscordSnowflake = new Snowflake(1420070400000n);\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Twitter's snowflake epoch\n *\n * Which is 2010-11-04 at 01:42:54.657 UTC+0, found in the archived snowflake repository {@linkplain https://github.com/twitter-archive/snowflake/blob/b3f6a3c6ca8e1b6847baa6ff42bf72201e2c2231/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L25}\n */\nexport const TwitterSnowflake = new Snowflake(1288834974657n);\n"]}
1
+ {"version":3,"sources":["../../src/lib/Snowflake.ts","../../src/lib/DiscordSnowflake.ts","../../src/lib/TwitterSnowflake.ts"],"names":[],"mappings":";;;;;;;;AAAA,IAAM,eAAA,GAAkB,OAAO,+BAA+B,CAAA,CAAA;AAC9D,IAAM,WAAA,GAAc,OAAO,2BAA2B,CAAA,CAAA;AACtD,IAAM,iBAAA,GAAoB,OAAO,kCAAkC,CAAA,CAAA;AACnE,IAAM,eAAA,GAAkB,OAAO,+BAA+B,CAAA,CAAA;AAC9D,IAAM,cAAA,GAAiB,OAAO,8BAA8B,CAAA,CAAA;AAKrD,IAAM,eAAkB,GAAA,SAAA;AAKxB,IAAM,gBAAmB,GAAA,SAAA;AAKzB,IAAM,gBAAmB,GAAA,gBAAA;AAEhC,IAAM,wBAAwB,CAAK,IAAA,EAAA,CAAA;AArBnC,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA+CmB,EAMA,GAAA,WAAA,EAAA,EAAA,GAAA,iBAAA,EAMT,sBAMA,EAMA,GAAA,eAAA,EAAA,EAAA,GAAA,cAAA,CAAA;AAnCH,IAAM,UAAA,GAAN,MAAM,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,EAwCf,YAAY,KAA+B,EAAA;AAnClD;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAO,UAAS,IAAK,CAAA,WAAA,CAAA,CAAA;AAMrB;AAAA;AAAA;AAAA;AAAA,IAAkB,aAAA,CAAA,IAAA,EAAA,EAAA,CAAA,CAAA;AAMlB;AAAA;AAAA;AAAA;AAAA,IAAkB,aAAA,CAAA,IAAA,EAAA,EAAA,CAAA,CAAA;AAMlB;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAmB,EAAA,EAAA,CAAA,CAAA;AAM5B;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAmB,EAAA,EAAA,CAAA,CAAA;AAM5B;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAkB,EAAA,EAAA,CAAA,CAAA;AAM1B,IAAK,IAAA,CAAA,WAAW,IAAI,MAAO,CAAA,KAAA,YAAiB,OAAO,KAAM,CAAA,OAAA,KAAY,KAAK,CAAA,CAAA;AAC1E,IAAA,IAAA,CAAK,iBAAiB,CAAA,GAAI,MAAO,CAAA,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA;AAAA,GACnD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,KAAgB,GAAA;AAC1B,IAAA,OAAO,KAAK,WAAW,CAAA,CAAA;AAAA,GACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,WAAsB,GAAA;AAChC,IAAA,OAAO,KAAK,iBAAiB,CAAA,CAAA;AAAA,GAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,SAAoB,GAAA;AAC9B,IAAA,OAAO,KAAK,eAAe,CAAA,CAAA;AAAA,GAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,UAAU,KAAwB,EAAA;AAC5C,IAAA,IAAA,CAAK,eAAe,CAAA,GAAI,MAAO,CAAA,KAAK,CAAI,GAAA,gBAAA,CAAA;AAAA,GACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,QAAmB,GAAA;AAC7B,IAAA,OAAO,KAAK,cAAc,CAAA,CAAA;AAAA,GAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,SAAS,KAAwB,EAAA;AAC3C,IAAA,IAAA,CAAK,cAAc,CAAA,GAAI,MAAO,CAAA,KAAK,CAAI,GAAA,eAAA,CAAA;AAAA,GACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcO,QAAS,CAAA;AAAA,IACf,SAAA;AAAA,IACA,SAAA,GAAY,KAAK,GAAI,EAAA;AAAA,IACrB,QAAA,GAAW,KAAK,cAAc,CAAA;AAAA,IAC9B,SAAA,GAAY,KAAK,eAAe,CAAA;AAAA,GACjC,GAA8B,EAAI,EAAA;AACjC,IAAA,IAAI,qBAAqB,IAAM,EAAA,SAAA,GAAY,MAAO,CAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAAA,SAAA,IAC5D,OAAO,SAAA,KAAc,QAAU,EAAA,SAAA,GAAY,OAAO,SAAS,CAAA,CAAA;AAAA,SAC3D,IAAA,OAAO,cAAc,QAAU,EAAA;AACvC,MAAA,MAAM,IAAI,SAAA,CAAU,CAAoE,iEAAA,EAAA,OAAO,SAAS,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,KAC5G;AAEA,IAAI,IAAA,OAAO,cAAc,QAAU,EAAA;AAClC,MAAA,SAAA,GAAY,KAAK,eAAe,CAAA,CAAA;AAChC,MAAK,IAAA,CAAA,eAAe,CAAK,GAAA,SAAA,GAAY,EAAM,GAAA,gBAAA,CAAA;AAAA,KAC5C;AAGA,IACG,OAAA,SAAA,GAAY,IAAK,CAAA,WAAW,CAAM,IAAA,GAAA,GAAA,CAClC,QAAW,GAAA,eAAA,KAAoB,GAC/B,GAAA,CAAA,SAAA,GAAY,gBAAqB,KAAA,GAAA,GAClC,SAAY,GAAA,gBAAA,CAAA;AAAA,GAEf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,YAAY,EAA6C,EAAA;AAC/D,IAAM,MAAA,QAAA,GAAW,OAAO,EAAE,CAAA,CAAA;AAC1B,IAAM,MAAA,KAAA,GAAQ,KAAK,WAAW,CAAA,CAAA;AAC9B,IAAO,OAAA;AAAA,MACN,EAAI,EAAA,QAAA;AAAA,MACJ,SAAA,EAAA,CAAY,YAAY,GAAO,IAAA,KAAA;AAAA,MAC/B,QAAA,EAAW,YAAY,GAAO,GAAA,eAAA;AAAA,MAC9B,SAAA,EAAY,YAAY,GAAO,GAAA,gBAAA;AAAA,MAC/B,WAAW,QAAW,GAAA,gBAAA;AAAA,MACtB,KAAA;AAAA,KACD,CAAA;AAAA,GACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,cAAc,EAA6B,EAAA;AACjD,IAAO,OAAA,IAAA,CAAK,MAAM,MAAO,CAAA,EAAE,IAAI,qBAAqB,CAAA,GAAI,KAAK,iBAAiB,CAAA,CAAA;AAAA,GAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,OAAc,OAAQ,CAAA,CAAA,EAAoB,CAAgC,EAAA;AACzE,IAAA,MAAM,QAAQ,OAAO,CAAA,CAAA;AACrB,IAAA,OAAO,UAAU,OAAO,CAAA,GACrB,UAAU,QACT,GAAA,SAAA,CAAU,GAAa,CAAW,CAAA,GAClC,UAAU,CAAa,EAAA,CAAW,IACnC,SAAU,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,GAClC;AACD,CAAA,CAAA;AA1LuB,MAAA,CAAA,UAAA,EAAA,WAAA,CAAA,CAAA;AAAhB,IAAM,SAAN,GAAA,WAAA;AA6LP,SAAS,SAAA,CAAU,GAAW,CAAW,EAAA;AACxC,EAAA,OAAO,CAAM,KAAA,CAAA,GAAI,CAAI,GAAA,CAAA,GAAI,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA;AACnC,CAAA;AAFS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA,CAAA;AAKT,SAAS,SAAA,CAAU,GAAW,CAAW,EAAA;AACxC,EAAA,OAAO,CAAM,KAAA,CAAA,GAAI,CAAI,GAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAA,GAAS,CAAK,CAAA,GAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAA,GAAS,CAAI,GAAA,CAAA,GAAI,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA;AACxF,CAAA;AAFS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA,CAAA;;;AC/NI,IAAA,gBAAA,GAAmB,IAAI,SAAA,CAAU,cAAc,EAAA;;;ACA/C,IAAA,gBAAA,GAAmB,IAAI,SAAA,CAAU,cAAc","file":"index.cjs","sourcesContent":["const IncrementSymbol = Symbol('@sapphire/snowflake.increment');\nconst EpochSymbol = Symbol('@sapphire/snowflake.epoch');\nconst EpochNumberSymbol = Symbol('@sapphire/snowflake.epoch.number');\nconst ProcessIdSymbol = Symbol('@sapphire/snowflake.processId');\nconst WorkerIdSymbol = Symbol('@sapphire/snowflake.workerId');\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport const MaximumWorkerId = 0b11111n;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport const MaximumProcessId = 0b11111n;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport const MaximumIncrement = 0b111111111111n;\n\nconst TimestampFieldDivisor = 2 ** 22;\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 */\nexport class Snowflake {\n\t/**\n\t * Alias for {@link deconstruct}\n\t */\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tpublic decode = this.deconstruct;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor\n\t * @internal\n\t */\n\tprivate readonly [EpochSymbol]: bigint;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor as a number\n\t * @internal\n\t */\n\tprivate readonly [EpochNumberSymbol]: number;\n\n\t/**\n\t * Internal incrementor for generating snowflakes\n\t * @internal\n\t */\n\tprivate [IncrementSymbol] = 0n;\n\n\t/**\n\t * The process ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [ProcessIdSymbol] = 1n;\n\n\t/**\n\t * The worker ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [WorkerIdSymbol] = 0n;\n\n\t/**\n\t * @param epoch the epoch to use\n\t */\n\tpublic constructor(epoch: number | bigint | Date) {\n\t\tthis[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);\n\t\tthis[EpochNumberSymbol] = Number(this[EpochSymbol]);\n\t}\n\n\t/**\n\t * The epoch for this snowflake, as a bigint\n\t */\n\tpublic get epoch(): bigint {\n\t\treturn this[EpochSymbol];\n\t}\n\n\t/**\n\t * The epoch for this snowflake, as a number\n\t */\n\tpublic get epochNumber(): number {\n\t\treturn this[EpochNumberSymbol];\n\t}\n\n\t/**\n\t * Gets the configured process ID\n\t */\n\tpublic get processId(): bigint {\n\t\treturn this[ProcessIdSymbol];\n\t}\n\n\t/**\n\t * Sets the process ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set processId(value: number | bigint) {\n\t\tthis[ProcessIdSymbol] = BigInt(value) & MaximumProcessId;\n\t}\n\n\t/**\n\t * Gets the configured worker ID\n\t */\n\tpublic get workerId(): bigint {\n\t\treturn this[WorkerIdSymbol];\n\t}\n\n\t/**\n\t * Sets the worker ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set workerId(value: number | bigint) {\n\t\tthis[WorkerIdSymbol] = BigInt(value) & MaximumWorkerId;\n\t}\n\n\t/**\n\t * Generates a snowflake given an epoch and optionally a timestamp\n\t * @param options options to pass into the generator, see {@link SnowflakeGenerateOptions}\n\t *\n\t * **note** when `increment` is not provided it defaults to the private `increment` of the instance\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).generate();\n\t * ```\n\t * @returns A unique snowflake\n\t */\n\tpublic generate({\n\t\tincrement,\n\t\ttimestamp = Date.now(),\n\t\tworkerId = this[WorkerIdSymbol],\n\t\tprocessId = this[ProcessIdSymbol]\n\t}: SnowflakeGenerateOptions = {}) {\n\t\tif (timestamp instanceof Date) timestamp = BigInt(timestamp.getTime());\n\t\telse if (typeof timestamp === 'number') timestamp = BigInt(timestamp);\n\t\telse if (typeof timestamp !== 'bigint') {\n\t\t\tthrow new TypeError(`\"timestamp\" argument must be a number, bigint, or Date (received ${typeof timestamp})`);\n\t\t}\n\n\t\tif (typeof increment !== 'bigint') {\n\t\t\tincrement = this[IncrementSymbol];\n\t\t\tthis[IncrementSymbol] = (increment + 1n) & MaximumIncrement;\n\t\t}\n\n\t\t// timestamp, workerId, processId, increment\n\t\treturn (\n\t\t\t((timestamp - this[EpochSymbol]) << 22n) |\n\t\t\t((workerId & MaximumWorkerId) << 17n) |\n\t\t\t((processId & MaximumProcessId) << 12n) |\n\t\t\t(increment & MaximumIncrement)\n\t\t);\n\t}\n\n\t/**\n\t * Deconstructs a snowflake given a snowflake ID\n\t * @param id the snowflake to deconstruct\n\t * @returns a deconstructed snowflake\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n\t * ```\n\t */\n\tpublic deconstruct(id: string | bigint): DeconstructedSnowflake {\n\t\tconst bigIntId = BigInt(id);\n\t\tconst epoch = this[EpochSymbol];\n\t\treturn {\n\t\t\tid: bigIntId,\n\t\t\ttimestamp: (bigIntId >> 22n) + epoch,\n\t\t\tworkerId: (bigIntId >> 17n) & MaximumWorkerId,\n\t\t\tprocessId: (bigIntId >> 12n) & MaximumProcessId,\n\t\t\tincrement: bigIntId & MaximumIncrement,\n\t\t\tepoch\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves the timestamp field's value from a snowflake.\n\t * @param id The snowflake to get the timestamp value from.\n\t * @returns The UNIX timestamp that is stored in `id`.\n\t */\n\tpublic timestampFrom(id: string | bigint): number {\n\t\treturn Math.floor(Number(id) / TimestampFieldDivisor) + this[EpochNumberSymbol];\n\t}\n\n\t/**\n\t * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n\t * snowflake in sort order.\n\t * @param a The first snowflake to compare.\n\t * @param b The second snowflake to compare.\n\t * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n\t * @example Sort snowflakes in ascending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => Snowflake.compare(a, b)));\n\t * // → ['254360814063058944', '737141877803057244', '1056191128120082432'];\n\t * ```\n\t * @example Sort snowflakes in descending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => -Snowflake.compare(a, b)));\n\t * // → ['1056191128120082432', '737141877803057244', '254360814063058944'];\n\t * ```\n\t */\n\tpublic static compare(a: string | bigint, b: string | bigint): -1 | 0 | 1 {\n\t\tconst typeA = typeof a;\n\t\treturn typeA === typeof b\n\t\t\t? typeA === 'string'\n\t\t\t\t? cmpString(a as string, b as string)\n\t\t\t\t: cmpBigInt(a as bigint, b as bigint)\n\t\t\t: cmpBigInt(BigInt(a), BigInt(b));\n\t}\n}\n\n/** @internal */\nfunction cmpBigInt(a: bigint, b: bigint) {\n\treturn a === b ? 0 : a < b ? -1 : 1;\n}\n\n/** @internal */\nfunction cmpString(a: string, b: string) {\n\treturn a === b ? 0 : a.length < b.length ? -1 : a.length > b.length ? 1 : a < b ? -1 : 1;\n}\n\n/**\n * Options for Snowflake#generate\n */\nexport interface SnowflakeGenerateOptions {\n\t/**\n\t * Timestamp or date of the snowflake to generate\n\t * @default Date.now()\n\t */\n\ttimestamp?: number | bigint | Date;\n\n\t/**\n\t * The increment to use\n\t * @default 0n\n\t * @remark keep in mind that this bigint is auto-incremented between generate calls\n\t */\n\tincrement?: bigint;\n\n\t/**\n\t * The worker ID to use, will be truncated to 5 bits (0-31)\n\t * @default 0n\n\t */\n\tworkerId?: bigint;\n\n\t/**\n\t * The process ID to use, will be truncated to 5 bits (0-31)\n\t * @default 1n\n\t */\n\tprocessId?: bigint;\n}\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n\t/**\n\t * The id in BigInt form\n\t */\n\tid: bigint;\n\n\t/**\n\t * The timestamp stored in the snowflake\n\t */\n\ttimestamp: bigint;\n\n\t/**\n\t * The worker id stored in the snowflake\n\t */\n\tworkerId: bigint;\n\n\t/**\n\t * The process id stored in the snowflake\n\t */\n\tprocessId: bigint;\n\n\t/**\n\t * The increment stored in the snowflake\n\t */\n\tincrement: bigint;\n\n\t/**\n\t * The epoch to use in the snowflake\n\t */\n\tepoch: bigint;\n}\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Discord's snowflake epoch\n *\n * Which is 2015-01-01 at 00:00:00.000 UTC+0, {@linkplain https://discord.com/developers/docs/reference#snowflakes}\n */\nexport const DiscordSnowflake = new Snowflake(1420070400000n);\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Twitter's snowflake epoch\n *\n * Which is 2010-11-04 at 01:42:54.657 UTC+0, found in the archived snowflake repository {@linkplain https://github.com/twitter-archive/snowflake/blob/b3f6a3c6ca8e1b6847baa6ff42bf72201e2c2231/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L25}\n */\nexport const TwitterSnowflake = new Snowflake(1288834974657n);\n"]}
@@ -1,5 +1,6 @@
1
1
  declare const IncrementSymbol: unique symbol;
2
2
  declare const EpochSymbol: unique symbol;
3
+ declare const EpochNumberSymbol: unique symbol;
3
4
  declare const ProcessIdSymbol: unique symbol;
4
5
  declare const WorkerIdSymbol: unique symbol;
5
6
  /**
@@ -37,6 +38,11 @@ declare class Snowflake {
37
38
  * @internal
38
39
  */
39
40
  private readonly [EpochSymbol];
41
+ /**
42
+ * Internal reference of the epoch passed in the constructor as a number
43
+ * @internal
44
+ */
45
+ private readonly [EpochNumberSymbol];
40
46
  /**
41
47
  * Internal incrementor for generating snowflakes
42
48
  * @internal
@@ -57,9 +63,13 @@ declare class Snowflake {
57
63
  */
58
64
  constructor(epoch: number | bigint | Date);
59
65
  /**
60
- * The epoch for this snowflake
66
+ * The epoch for this snowflake, as a bigint
61
67
  */
62
68
  get epoch(): bigint;
69
+ /**
70
+ * The epoch for this snowflake, as a number
71
+ */
72
+ get epochNumber(): number;
63
73
  /**
64
74
  * Gets the configured process ID
65
75
  */
@@ -1,5 +1,6 @@
1
1
  declare const IncrementSymbol: unique symbol;
2
2
  declare const EpochSymbol: unique symbol;
3
+ declare const EpochNumberSymbol: unique symbol;
3
4
  declare const ProcessIdSymbol: unique symbol;
4
5
  declare const WorkerIdSymbol: unique symbol;
5
6
  /**
@@ -37,6 +38,11 @@ declare class Snowflake {
37
38
  * @internal
38
39
  */
39
40
  private readonly [EpochSymbol];
41
+ /**
42
+ * Internal reference of the epoch passed in the constructor as a number
43
+ * @internal
44
+ */
45
+ private readonly [EpochNumberSymbol];
40
46
  /**
41
47
  * Internal incrementor for generating snowflakes
42
48
  * @internal
@@ -57,9 +63,13 @@ declare class Snowflake {
57
63
  */
58
64
  constructor(epoch: number | bigint | Date);
59
65
  /**
60
- * The epoch for this snowflake
66
+ * The epoch for this snowflake, as a bigint
61
67
  */
62
68
  get epoch(): bigint;
69
+ /**
70
+ * The epoch for this snowflake, as a number
71
+ */
72
+ get epochNumber(): number;
63
73
  /**
64
74
  * Gets the configured process ID
65
75
  */
@@ -6,13 +6,15 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
6
6
  // src/lib/Snowflake.ts
7
7
  var IncrementSymbol = Symbol("@sapphire/snowflake.increment");
8
8
  var EpochSymbol = Symbol("@sapphire/snowflake.epoch");
9
+ var EpochNumberSymbol = Symbol("@sapphire/snowflake.epoch.number");
9
10
  var ProcessIdSymbol = Symbol("@sapphire/snowflake.processId");
10
11
  var WorkerIdSymbol = Symbol("@sapphire/snowflake.workerId");
11
12
  var MaximumWorkerId = 0b11111n;
12
13
  var MaximumProcessId = 0b11111n;
13
14
  var MaximumIncrement = 0b111111111111n;
14
- var _a, _b, _c, _d;
15
- _d = EpochSymbol, _c = IncrementSymbol, _b = ProcessIdSymbol, _a = WorkerIdSymbol;
15
+ var TimestampFieldDivisor = 2 ** 22;
16
+ var _a, _b, _c, _d, _e;
17
+ _e = EpochSymbol, _d = EpochNumberSymbol, _c = IncrementSymbol, _b = ProcessIdSymbol, _a = WorkerIdSymbol;
16
18
  var _Snowflake = class _Snowflake {
17
19
  /**
18
20
  * @param epoch the epoch to use
@@ -27,6 +29,11 @@ var _Snowflake = class _Snowflake {
27
29
  * Internal reference of the epoch passed in the constructor
28
30
  * @internal
29
31
  */
32
+ __publicField(this, _e);
33
+ /**
34
+ * Internal reference of the epoch passed in the constructor as a number
35
+ * @internal
36
+ */
30
37
  __publicField(this, _d);
31
38
  /**
32
39
  * Internal incrementor for generating snowflakes
@@ -44,13 +51,20 @@ var _Snowflake = class _Snowflake {
44
51
  */
45
52
  __publicField(this, _a, 0n);
46
53
  this[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);
54
+ this[EpochNumberSymbol] = Number(this[EpochSymbol]);
47
55
  }
48
56
  /**
49
- * The epoch for this snowflake
57
+ * The epoch for this snowflake, as a bigint
50
58
  */
51
59
  get epoch() {
52
60
  return this[EpochSymbol];
53
61
  }
62
+ /**
63
+ * The epoch for this snowflake, as a number
64
+ */
65
+ get epochNumber() {
66
+ return this[EpochNumberSymbol];
67
+ }
54
68
  /**
55
69
  * Gets the configured process ID
56
70
  */
@@ -134,7 +148,7 @@ var _Snowflake = class _Snowflake {
134
148
  * @returns The UNIX timestamp that is stored in `id`.
135
149
  */
136
150
  timestampFrom(id) {
137
- return Number((BigInt(id) >> 22n) + this[EpochSymbol]);
151
+ return Math.floor(Number(id) / TimestampFieldDivisor) + this[EpochNumberSymbol];
138
152
  }
139
153
  /**
140
154
  * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/Snowflake.ts","../../src/lib/DiscordSnowflake.ts","../../src/lib/TwitterSnowflake.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["const IncrementSymbol = Symbol('@sapphire/snowflake.increment');\nconst EpochSymbol = Symbol('@sapphire/snowflake.epoch');\nconst ProcessIdSymbol = Symbol('@sapphire/snowflake.processId');\nconst WorkerIdSymbol = Symbol('@sapphire/snowflake.workerId');\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport const MaximumWorkerId = 0b11111n;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport const MaximumProcessId = 0b11111n;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport const MaximumIncrement = 0b111111111111n;\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 */\nexport class Snowflake {\n\t/**\n\t * Alias for {@link deconstruct}\n\t */\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tpublic decode = this.deconstruct;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor\n\t * @internal\n\t */\n\tprivate readonly [EpochSymbol]: bigint;\n\n\t/**\n\t * Internal incrementor for generating snowflakes\n\t * @internal\n\t */\n\tprivate [IncrementSymbol] = 0n;\n\n\t/**\n\t * The process ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [ProcessIdSymbol] = 1n;\n\n\t/**\n\t * The worker ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [WorkerIdSymbol] = 0n;\n\n\t/**\n\t * @param epoch the epoch to use\n\t */\n\tpublic constructor(epoch: number | bigint | Date) {\n\t\tthis[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);\n\t}\n\n\t/**\n\t * The epoch for this snowflake\n\t */\n\tpublic get epoch(): bigint {\n\t\treturn this[EpochSymbol];\n\t}\n\n\t/**\n\t * Gets the configured process ID\n\t */\n\tpublic get processId(): bigint {\n\t\treturn this[ProcessIdSymbol];\n\t}\n\n\t/**\n\t * Sets the process ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set processId(value: number | bigint) {\n\t\tthis[ProcessIdSymbol] = BigInt(value) & MaximumProcessId;\n\t}\n\n\t/**\n\t * Gets the configured worker ID\n\t */\n\tpublic get workerId(): bigint {\n\t\treturn this[WorkerIdSymbol];\n\t}\n\n\t/**\n\t * Sets the worker ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set workerId(value: number | bigint) {\n\t\tthis[WorkerIdSymbol] = BigInt(value) & MaximumWorkerId;\n\t}\n\n\t/**\n\t * Generates a snowflake given an epoch and optionally a timestamp\n\t * @param options options to pass into the generator, see {@link SnowflakeGenerateOptions}\n\t *\n\t * **note** when `increment` is not provided it defaults to the private `increment` of the instance\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).generate();\n\t * ```\n\t * @returns A unique snowflake\n\t */\n\tpublic generate({\n\t\tincrement,\n\t\ttimestamp = Date.now(),\n\t\tworkerId = this[WorkerIdSymbol],\n\t\tprocessId = this[ProcessIdSymbol]\n\t}: SnowflakeGenerateOptions = {}) {\n\t\tif (timestamp instanceof Date) timestamp = BigInt(timestamp.getTime());\n\t\telse if (typeof timestamp === 'number') timestamp = BigInt(timestamp);\n\t\telse if (typeof timestamp !== 'bigint') {\n\t\t\tthrow new TypeError(`\"timestamp\" argument must be a number, bigint, or Date (received ${typeof timestamp})`);\n\t\t}\n\n\t\tif (typeof increment !== 'bigint') {\n\t\t\tincrement = this[IncrementSymbol];\n\t\t\tthis[IncrementSymbol] = (increment + 1n) & MaximumIncrement;\n\t\t}\n\n\t\t// timestamp, workerId, processId, increment\n\t\treturn (\n\t\t\t((timestamp - this[EpochSymbol]) << 22n) |\n\t\t\t((workerId & MaximumWorkerId) << 17n) |\n\t\t\t((processId & MaximumProcessId) << 12n) |\n\t\t\t(increment & MaximumIncrement)\n\t\t);\n\t}\n\n\t/**\n\t * Deconstructs a snowflake given a snowflake ID\n\t * @param id the snowflake to deconstruct\n\t * @returns a deconstructed snowflake\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n\t * ```\n\t */\n\tpublic deconstruct(id: string | bigint): DeconstructedSnowflake {\n\t\tconst bigIntId = BigInt(id);\n\t\tconst epoch = this[EpochSymbol];\n\t\treturn {\n\t\t\tid: bigIntId,\n\t\t\ttimestamp: (bigIntId >> 22n) + epoch,\n\t\t\tworkerId: (bigIntId >> 17n) & MaximumWorkerId,\n\t\t\tprocessId: (bigIntId >> 12n) & MaximumProcessId,\n\t\t\tincrement: bigIntId & MaximumIncrement,\n\t\t\tepoch\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves the timestamp field's value from a snowflake.\n\t * @param id The snowflake to get the timestamp value from.\n\t * @returns The UNIX timestamp that is stored in `id`.\n\t */\n\tpublic timestampFrom(id: string | bigint): number {\n\t\treturn Number((BigInt(id) >> 22n) + this[EpochSymbol]);\n\t}\n\n\t/**\n\t * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n\t * snowflake in sort order.\n\t * @param a The first snowflake to compare.\n\t * @param b The second snowflake to compare.\n\t * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n\t * @example Sort snowflakes in ascending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => Snowflake.compare(a, b)));\n\t * // → ['254360814063058944', '737141877803057244', '1056191128120082432'];\n\t * ```\n\t * @example Sort snowflakes in descending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => -Snowflake.compare(a, b)));\n\t * // → ['1056191128120082432', '737141877803057244', '254360814063058944'];\n\t * ```\n\t */\n\tpublic static compare(a: string | bigint, b: string | bigint): -1 | 0 | 1 {\n\t\tconst typeA = typeof a;\n\t\treturn typeA === typeof b\n\t\t\t? typeA === 'string'\n\t\t\t\t? cmpString(a as string, b as string)\n\t\t\t\t: cmpBigInt(a as bigint, b as bigint)\n\t\t\t: cmpBigInt(BigInt(a), BigInt(b));\n\t}\n}\n\n/** @internal */\nfunction cmpBigInt(a: bigint, b: bigint) {\n\treturn a === b ? 0 : a < b ? -1 : 1;\n}\n\n/** @internal */\nfunction cmpString(a: string, b: string) {\n\treturn a === b ? 0 : a.length < b.length ? -1 : a.length > b.length ? 1 : a < b ? -1 : 1;\n}\n\n/**\n * Options for Snowflake#generate\n */\nexport interface SnowflakeGenerateOptions {\n\t/**\n\t * Timestamp or date of the snowflake to generate\n\t * @default Date.now()\n\t */\n\ttimestamp?: number | bigint | Date;\n\n\t/**\n\t * The increment to use\n\t * @default 0n\n\t * @remark keep in mind that this bigint is auto-incremented between generate calls\n\t */\n\tincrement?: bigint;\n\n\t/**\n\t * The worker ID to use, will be truncated to 5 bits (0-31)\n\t * @default 0n\n\t */\n\tworkerId?: bigint;\n\n\t/**\n\t * The process ID to use, will be truncated to 5 bits (0-31)\n\t * @default 1n\n\t */\n\tprocessId?: bigint;\n}\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n\t/**\n\t * The id in BigInt form\n\t */\n\tid: bigint;\n\n\t/**\n\t * The timestamp stored in the snowflake\n\t */\n\ttimestamp: bigint;\n\n\t/**\n\t * The worker id stored in the snowflake\n\t */\n\tworkerId: bigint;\n\n\t/**\n\t * The process id stored in the snowflake\n\t */\n\tprocessId: bigint;\n\n\t/**\n\t * The increment stored in the snowflake\n\t */\n\tincrement: bigint;\n\n\t/**\n\t * The epoch to use in the snowflake\n\t */\n\tepoch: bigint;\n}\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Discord's snowflake epoch\n *\n * Which is 2015-01-01 at 00:00:00.000 UTC+0, {@linkplain https://discord.com/developers/docs/reference#snowflakes}\n */\nexport const DiscordSnowflake = new Snowflake(1420070400000n);\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Twitter's snowflake epoch\n *\n * Which is 2010-11-04 at 01:42:54.657 UTC+0, found in the archived snowflake repository {@linkplain https://github.com/twitter-archive/snowflake/blob/b3f6a3c6ca8e1b6847baa6ff42bf72201e2c2231/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L25}\n */\nexport const TwitterSnowflake = new Snowflake(1288834974657n);\n"]}
1
+ {"version":3,"sources":["../../src/lib/Snowflake.ts","../../src/lib/DiscordSnowflake.ts","../../src/lib/TwitterSnowflake.ts"],"names":[],"mappings":";;;;;;AAAA,IAAM,eAAA,GAAkB,OAAO,+BAA+B,CAAA,CAAA;AAC9D,IAAM,WAAA,GAAc,OAAO,2BAA2B,CAAA,CAAA;AACtD,IAAM,iBAAA,GAAoB,OAAO,kCAAkC,CAAA,CAAA;AACnE,IAAM,eAAA,GAAkB,OAAO,+BAA+B,CAAA,CAAA;AAC9D,IAAM,cAAA,GAAiB,OAAO,8BAA8B,CAAA,CAAA;AAKrD,IAAM,eAAkB,GAAA,SAAA;AAKxB,IAAM,gBAAmB,GAAA,SAAA;AAKzB,IAAM,gBAAmB,GAAA,gBAAA;AAEhC,IAAM,wBAAwB,CAAK,IAAA,EAAA,CAAA;AArBnC,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AA+CmB,EAMA,GAAA,WAAA,EAAA,EAAA,GAAA,iBAAA,EAMT,sBAMA,EAMA,GAAA,eAAA,EAAA,EAAA,GAAA,cAAA,CAAA;AAnCH,IAAM,UAAA,GAAN,MAAM,UAAU,CAAA;AAAA;AAAA;AAAA;AAAA,EAwCf,YAAY,KAA+B,EAAA;AAnClD;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAO,UAAS,IAAK,CAAA,WAAA,CAAA,CAAA;AAMrB;AAAA;AAAA;AAAA;AAAA,IAAkB,aAAA,CAAA,IAAA,EAAA,EAAA,CAAA,CAAA;AAMlB;AAAA;AAAA;AAAA;AAAA,IAAkB,aAAA,CAAA,IAAA,EAAA,EAAA,CAAA,CAAA;AAMlB;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAmB,EAAA,EAAA,CAAA,CAAA;AAM5B;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAmB,EAAA,EAAA,CAAA,CAAA;AAM5B;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAkB,EAAA,EAAA,CAAA,CAAA;AAM1B,IAAK,IAAA,CAAA,WAAW,IAAI,MAAO,CAAA,KAAA,YAAiB,OAAO,KAAM,CAAA,OAAA,KAAY,KAAK,CAAA,CAAA;AAC1E,IAAA,IAAA,CAAK,iBAAiB,CAAA,GAAI,MAAO,CAAA,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA;AAAA,GACnD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,KAAgB,GAAA;AAC1B,IAAA,OAAO,KAAK,WAAW,CAAA,CAAA;AAAA,GACxB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,WAAsB,GAAA;AAChC,IAAA,OAAO,KAAK,iBAAiB,CAAA,CAAA;AAAA,GAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,SAAoB,GAAA;AAC9B,IAAA,OAAO,KAAK,eAAe,CAAA,CAAA;AAAA,GAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,UAAU,KAAwB,EAAA;AAC5C,IAAA,IAAA,CAAK,eAAe,CAAA,GAAI,MAAO,CAAA,KAAK,CAAI,GAAA,gBAAA,CAAA;AAAA,GACzC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAW,QAAmB,GAAA;AAC7B,IAAA,OAAO,KAAK,cAAc,CAAA,CAAA;AAAA,GAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAW,SAAS,KAAwB,EAAA;AAC3C,IAAA,IAAA,CAAK,cAAc,CAAA,GAAI,MAAO,CAAA,KAAK,CAAI,GAAA,eAAA,CAAA;AAAA,GACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcO,QAAS,CAAA;AAAA,IACf,SAAA;AAAA,IACA,SAAA,GAAY,KAAK,GAAI,EAAA;AAAA,IACrB,QAAA,GAAW,KAAK,cAAc,CAAA;AAAA,IAC9B,SAAA,GAAY,KAAK,eAAe,CAAA;AAAA,GACjC,GAA8B,EAAI,EAAA;AACjC,IAAA,IAAI,qBAAqB,IAAM,EAAA,SAAA,GAAY,MAAO,CAAA,SAAA,CAAU,SAAS,CAAA,CAAA;AAAA,SAAA,IAC5D,OAAO,SAAA,KAAc,QAAU,EAAA,SAAA,GAAY,OAAO,SAAS,CAAA,CAAA;AAAA,SAC3D,IAAA,OAAO,cAAc,QAAU,EAAA;AACvC,MAAA,MAAM,IAAI,SAAA,CAAU,CAAoE,iEAAA,EAAA,OAAO,SAAS,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,KAC5G;AAEA,IAAI,IAAA,OAAO,cAAc,QAAU,EAAA;AAClC,MAAA,SAAA,GAAY,KAAK,eAAe,CAAA,CAAA;AAChC,MAAK,IAAA,CAAA,eAAe,CAAK,GAAA,SAAA,GAAY,EAAM,GAAA,gBAAA,CAAA;AAAA,KAC5C;AAGA,IACG,OAAA,SAAA,GAAY,IAAK,CAAA,WAAW,CAAM,IAAA,GAAA,GAAA,CAClC,QAAW,GAAA,eAAA,KAAoB,GAC/B,GAAA,CAAA,SAAA,GAAY,gBAAqB,KAAA,GAAA,GAClC,SAAY,GAAA,gBAAA,CAAA;AAAA,GAEf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYO,YAAY,EAA6C,EAAA;AAC/D,IAAM,MAAA,QAAA,GAAW,OAAO,EAAE,CAAA,CAAA;AAC1B,IAAM,MAAA,KAAA,GAAQ,KAAK,WAAW,CAAA,CAAA;AAC9B,IAAO,OAAA;AAAA,MACN,EAAI,EAAA,QAAA;AAAA,MACJ,SAAA,EAAA,CAAY,YAAY,GAAO,IAAA,KAAA;AAAA,MAC/B,QAAA,EAAW,YAAY,GAAO,GAAA,eAAA;AAAA,MAC9B,SAAA,EAAY,YAAY,GAAO,GAAA,gBAAA;AAAA,MAC/B,WAAW,QAAW,GAAA,gBAAA;AAAA,MACtB,KAAA;AAAA,KACD,CAAA;AAAA,GACD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,cAAc,EAA6B,EAAA;AACjD,IAAO,OAAA,IAAA,CAAK,MAAM,MAAO,CAAA,EAAE,IAAI,qBAAqB,CAAA,GAAI,KAAK,iBAAiB,CAAA,CAAA;AAAA,GAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBA,OAAc,OAAQ,CAAA,CAAA,EAAoB,CAAgC,EAAA;AACzE,IAAA,MAAM,QAAQ,OAAO,CAAA,CAAA;AACrB,IAAA,OAAO,UAAU,OAAO,CAAA,GACrB,UAAU,QACT,GAAA,SAAA,CAAU,GAAa,CAAW,CAAA,GAClC,UAAU,CAAa,EAAA,CAAW,IACnC,SAAU,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;AAAA,GAClC;AACD,CAAA,CAAA;AA1LuB,MAAA,CAAA,UAAA,EAAA,WAAA,CAAA,CAAA;AAAhB,IAAM,SAAN,GAAA,WAAA;AA6LP,SAAS,SAAA,CAAU,GAAW,CAAW,EAAA;AACxC,EAAA,OAAO,CAAM,KAAA,CAAA,GAAI,CAAI,GAAA,CAAA,GAAI,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA;AACnC,CAAA;AAFS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA,CAAA;AAKT,SAAS,SAAA,CAAU,GAAW,CAAW,EAAA;AACxC,EAAA,OAAO,CAAM,KAAA,CAAA,GAAI,CAAI,GAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAA,GAAS,CAAK,CAAA,GAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAA,GAAS,CAAI,GAAA,CAAA,GAAI,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA;AACxF,CAAA;AAFS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA,CAAA;;;AC/NI,IAAA,gBAAA,GAAmB,IAAI,SAAA,CAAU,cAAc,EAAA;;;ACA/C,IAAA,gBAAA,GAAmB,IAAI,SAAA,CAAU,cAAc","file":"index.mjs","sourcesContent":["const IncrementSymbol = Symbol('@sapphire/snowflake.increment');\nconst EpochSymbol = Symbol('@sapphire/snowflake.epoch');\nconst EpochNumberSymbol = Symbol('@sapphire/snowflake.epoch.number');\nconst ProcessIdSymbol = Symbol('@sapphire/snowflake.processId');\nconst WorkerIdSymbol = Symbol('@sapphire/snowflake.workerId');\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport const MaximumWorkerId = 0b11111n;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport const MaximumProcessId = 0b11111n;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport const MaximumIncrement = 0b111111111111n;\n\nconst TimestampFieldDivisor = 2 ** 22;\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 */\nexport class Snowflake {\n\t/**\n\t * Alias for {@link deconstruct}\n\t */\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tpublic decode = this.deconstruct;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor\n\t * @internal\n\t */\n\tprivate readonly [EpochSymbol]: bigint;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor as a number\n\t * @internal\n\t */\n\tprivate readonly [EpochNumberSymbol]: number;\n\n\t/**\n\t * Internal incrementor for generating snowflakes\n\t * @internal\n\t */\n\tprivate [IncrementSymbol] = 0n;\n\n\t/**\n\t * The process ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [ProcessIdSymbol] = 1n;\n\n\t/**\n\t * The worker ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [WorkerIdSymbol] = 0n;\n\n\t/**\n\t * @param epoch the epoch to use\n\t */\n\tpublic constructor(epoch: number | bigint | Date) {\n\t\tthis[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);\n\t\tthis[EpochNumberSymbol] = Number(this[EpochSymbol]);\n\t}\n\n\t/**\n\t * The epoch for this snowflake, as a bigint\n\t */\n\tpublic get epoch(): bigint {\n\t\treturn this[EpochSymbol];\n\t}\n\n\t/**\n\t * The epoch for this snowflake, as a number\n\t */\n\tpublic get epochNumber(): number {\n\t\treturn this[EpochNumberSymbol];\n\t}\n\n\t/**\n\t * Gets the configured process ID\n\t */\n\tpublic get processId(): bigint {\n\t\treturn this[ProcessIdSymbol];\n\t}\n\n\t/**\n\t * Sets the process ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set processId(value: number | bigint) {\n\t\tthis[ProcessIdSymbol] = BigInt(value) & MaximumProcessId;\n\t}\n\n\t/**\n\t * Gets the configured worker ID\n\t */\n\tpublic get workerId(): bigint {\n\t\treturn this[WorkerIdSymbol];\n\t}\n\n\t/**\n\t * Sets the worker ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set workerId(value: number | bigint) {\n\t\tthis[WorkerIdSymbol] = BigInt(value) & MaximumWorkerId;\n\t}\n\n\t/**\n\t * Generates a snowflake given an epoch and optionally a timestamp\n\t * @param options options to pass into the generator, see {@link SnowflakeGenerateOptions}\n\t *\n\t * **note** when `increment` is not provided it defaults to the private `increment` of the instance\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).generate();\n\t * ```\n\t * @returns A unique snowflake\n\t */\n\tpublic generate({\n\t\tincrement,\n\t\ttimestamp = Date.now(),\n\t\tworkerId = this[WorkerIdSymbol],\n\t\tprocessId = this[ProcessIdSymbol]\n\t}: SnowflakeGenerateOptions = {}) {\n\t\tif (timestamp instanceof Date) timestamp = BigInt(timestamp.getTime());\n\t\telse if (typeof timestamp === 'number') timestamp = BigInt(timestamp);\n\t\telse if (typeof timestamp !== 'bigint') {\n\t\t\tthrow new TypeError(`\"timestamp\" argument must be a number, bigint, or Date (received ${typeof timestamp})`);\n\t\t}\n\n\t\tif (typeof increment !== 'bigint') {\n\t\t\tincrement = this[IncrementSymbol];\n\t\t\tthis[IncrementSymbol] = (increment + 1n) & MaximumIncrement;\n\t\t}\n\n\t\t// timestamp, workerId, processId, increment\n\t\treturn (\n\t\t\t((timestamp - this[EpochSymbol]) << 22n) |\n\t\t\t((workerId & MaximumWorkerId) << 17n) |\n\t\t\t((processId & MaximumProcessId) << 12n) |\n\t\t\t(increment & MaximumIncrement)\n\t\t);\n\t}\n\n\t/**\n\t * Deconstructs a snowflake given a snowflake ID\n\t * @param id the snowflake to deconstruct\n\t * @returns a deconstructed snowflake\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n\t * ```\n\t */\n\tpublic deconstruct(id: string | bigint): DeconstructedSnowflake {\n\t\tconst bigIntId = BigInt(id);\n\t\tconst epoch = this[EpochSymbol];\n\t\treturn {\n\t\t\tid: bigIntId,\n\t\t\ttimestamp: (bigIntId >> 22n) + epoch,\n\t\t\tworkerId: (bigIntId >> 17n) & MaximumWorkerId,\n\t\t\tprocessId: (bigIntId >> 12n) & MaximumProcessId,\n\t\t\tincrement: bigIntId & MaximumIncrement,\n\t\t\tepoch\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves the timestamp field's value from a snowflake.\n\t * @param id The snowflake to get the timestamp value from.\n\t * @returns The UNIX timestamp that is stored in `id`.\n\t */\n\tpublic timestampFrom(id: string | bigint): number {\n\t\treturn Math.floor(Number(id) / TimestampFieldDivisor) + this[EpochNumberSymbol];\n\t}\n\n\t/**\n\t * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n\t * snowflake in sort order.\n\t * @param a The first snowflake to compare.\n\t * @param b The second snowflake to compare.\n\t * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n\t * @example Sort snowflakes in ascending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => Snowflake.compare(a, b)));\n\t * // → ['254360814063058944', '737141877803057244', '1056191128120082432'];\n\t * ```\n\t * @example Sort snowflakes in descending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => -Snowflake.compare(a, b)));\n\t * // → ['1056191128120082432', '737141877803057244', '254360814063058944'];\n\t * ```\n\t */\n\tpublic static compare(a: string | bigint, b: string | bigint): -1 | 0 | 1 {\n\t\tconst typeA = typeof a;\n\t\treturn typeA === typeof b\n\t\t\t? typeA === 'string'\n\t\t\t\t? cmpString(a as string, b as string)\n\t\t\t\t: cmpBigInt(a as bigint, b as bigint)\n\t\t\t: cmpBigInt(BigInt(a), BigInt(b));\n\t}\n}\n\n/** @internal */\nfunction cmpBigInt(a: bigint, b: bigint) {\n\treturn a === b ? 0 : a < b ? -1 : 1;\n}\n\n/** @internal */\nfunction cmpString(a: string, b: string) {\n\treturn a === b ? 0 : a.length < b.length ? -1 : a.length > b.length ? 1 : a < b ? -1 : 1;\n}\n\n/**\n * Options for Snowflake#generate\n */\nexport interface SnowflakeGenerateOptions {\n\t/**\n\t * Timestamp or date of the snowflake to generate\n\t * @default Date.now()\n\t */\n\ttimestamp?: number | bigint | Date;\n\n\t/**\n\t * The increment to use\n\t * @default 0n\n\t * @remark keep in mind that this bigint is auto-incremented between generate calls\n\t */\n\tincrement?: bigint;\n\n\t/**\n\t * The worker ID to use, will be truncated to 5 bits (0-31)\n\t * @default 0n\n\t */\n\tworkerId?: bigint;\n\n\t/**\n\t * The process ID to use, will be truncated to 5 bits (0-31)\n\t * @default 1n\n\t */\n\tprocessId?: bigint;\n}\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n\t/**\n\t * The id in BigInt form\n\t */\n\tid: bigint;\n\n\t/**\n\t * The timestamp stored in the snowflake\n\t */\n\ttimestamp: bigint;\n\n\t/**\n\t * The worker id stored in the snowflake\n\t */\n\tworkerId: bigint;\n\n\t/**\n\t * The process id stored in the snowflake\n\t */\n\tprocessId: bigint;\n\n\t/**\n\t * The increment stored in the snowflake\n\t */\n\tincrement: bigint;\n\n\t/**\n\t * The epoch to use in the snowflake\n\t */\n\tepoch: bigint;\n}\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Discord's snowflake epoch\n *\n * Which is 2015-01-01 at 00:00:00.000 UTC+0, {@linkplain https://discord.com/developers/docs/reference#snowflakes}\n */\nexport const DiscordSnowflake = new Snowflake(1420070400000n);\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Twitter's snowflake epoch\n *\n * Which is 2010-11-04 at 01:42:54.657 UTC+0, found in the archived snowflake repository {@linkplain https://github.com/twitter-archive/snowflake/blob/b3f6a3c6ca8e1b6847baa6ff42bf72201e2c2231/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L25}\n */\nexport const TwitterSnowflake = new Snowflake(1288834974657n);\n"]}
@@ -9,13 +9,15 @@ var SapphireSnowflake = (function (exports) {
9
9
  // src/lib/Snowflake.ts
10
10
  var IncrementSymbol = Symbol("@sapphire/snowflake.increment");
11
11
  var EpochSymbol = Symbol("@sapphire/snowflake.epoch");
12
+ var EpochNumberSymbol = Symbol("@sapphire/snowflake.epoch.number");
12
13
  var ProcessIdSymbol = Symbol("@sapphire/snowflake.processId");
13
14
  var WorkerIdSymbol = Symbol("@sapphire/snowflake.workerId");
14
15
  var MaximumWorkerId = 0b11111n;
15
16
  var MaximumProcessId = 0b11111n;
16
17
  var MaximumIncrement = 0b111111111111n;
17
- var _a, _b, _c, _d;
18
- _d = EpochSymbol, _c = IncrementSymbol, _b = ProcessIdSymbol, _a = WorkerIdSymbol;
18
+ var TimestampFieldDivisor = 2 ** 22;
19
+ var _a, _b, _c, _d, _e;
20
+ _e = EpochSymbol, _d = EpochNumberSymbol, _c = IncrementSymbol, _b = ProcessIdSymbol, _a = WorkerIdSymbol;
19
21
  var _Snowflake = class _Snowflake {
20
22
  /**
21
23
  * @param epoch the epoch to use
@@ -30,6 +32,11 @@ var SapphireSnowflake = (function (exports) {
30
32
  * Internal reference of the epoch passed in the constructor
31
33
  * @internal
32
34
  */
35
+ __publicField(this, _e);
36
+ /**
37
+ * Internal reference of the epoch passed in the constructor as a number
38
+ * @internal
39
+ */
33
40
  __publicField(this, _d);
34
41
  /**
35
42
  * Internal incrementor for generating snowflakes
@@ -47,13 +54,20 @@ var SapphireSnowflake = (function (exports) {
47
54
  */
48
55
  __publicField(this, _a, 0n);
49
56
  this[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);
57
+ this[EpochNumberSymbol] = Number(this[EpochSymbol]);
50
58
  }
51
59
  /**
52
- * The epoch for this snowflake
60
+ * The epoch for this snowflake, as a bigint
53
61
  */
54
62
  get epoch() {
55
63
  return this[EpochSymbol];
56
64
  }
65
+ /**
66
+ * The epoch for this snowflake, as a number
67
+ */
68
+ get epochNumber() {
69
+ return this[EpochNumberSymbol];
70
+ }
57
71
  /**
58
72
  * Gets the configured process ID
59
73
  */
@@ -137,7 +151,7 @@ var SapphireSnowflake = (function (exports) {
137
151
  * @returns The UNIX timestamp that is stored in `id`.
138
152
  */
139
153
  timestampFrom(id) {
140
- return Number((BigInt(id) >> 22n) + this[EpochSymbol]);
154
+ return Math.floor(Number(id) / TimestampFieldDivisor) + this[EpochNumberSymbol];
141
155
  }
142
156
  /**
143
157
  * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/Snowflake.ts","../../src/lib/DiscordSnowflake.ts","../../src/lib/TwitterSnowflake.ts"],"names":[],"mappings":"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","file":"index.global.js","sourcesContent":["const IncrementSymbol = Symbol('@sapphire/snowflake.increment');\nconst EpochSymbol = Symbol('@sapphire/snowflake.epoch');\nconst ProcessIdSymbol = Symbol('@sapphire/snowflake.processId');\nconst WorkerIdSymbol = Symbol('@sapphire/snowflake.workerId');\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport const MaximumWorkerId = 0b11111n;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport const MaximumProcessId = 0b11111n;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport const MaximumIncrement = 0b111111111111n;\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 */\nexport class Snowflake {\n\t/**\n\t * Alias for {@link deconstruct}\n\t */\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tpublic decode = this.deconstruct;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor\n\t * @internal\n\t */\n\tprivate readonly [EpochSymbol]: bigint;\n\n\t/**\n\t * Internal incrementor for generating snowflakes\n\t * @internal\n\t */\n\tprivate [IncrementSymbol] = 0n;\n\n\t/**\n\t * The process ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [ProcessIdSymbol] = 1n;\n\n\t/**\n\t * The worker ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [WorkerIdSymbol] = 0n;\n\n\t/**\n\t * @param epoch the epoch to use\n\t */\n\tpublic constructor(epoch: number | bigint | Date) {\n\t\tthis[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);\n\t}\n\n\t/**\n\t * The epoch for this snowflake\n\t */\n\tpublic get epoch(): bigint {\n\t\treturn this[EpochSymbol];\n\t}\n\n\t/**\n\t * Gets the configured process ID\n\t */\n\tpublic get processId(): bigint {\n\t\treturn this[ProcessIdSymbol];\n\t}\n\n\t/**\n\t * Sets the process ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set processId(value: number | bigint) {\n\t\tthis[ProcessIdSymbol] = BigInt(value) & MaximumProcessId;\n\t}\n\n\t/**\n\t * Gets the configured worker ID\n\t */\n\tpublic get workerId(): bigint {\n\t\treturn this[WorkerIdSymbol];\n\t}\n\n\t/**\n\t * Sets the worker ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set workerId(value: number | bigint) {\n\t\tthis[WorkerIdSymbol] = BigInt(value) & MaximumWorkerId;\n\t}\n\n\t/**\n\t * Generates a snowflake given an epoch and optionally a timestamp\n\t * @param options options to pass into the generator, see {@link SnowflakeGenerateOptions}\n\t *\n\t * **note** when `increment` is not provided it defaults to the private `increment` of the instance\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).generate();\n\t * ```\n\t * @returns A unique snowflake\n\t */\n\tpublic generate({\n\t\tincrement,\n\t\ttimestamp = Date.now(),\n\t\tworkerId = this[WorkerIdSymbol],\n\t\tprocessId = this[ProcessIdSymbol]\n\t}: SnowflakeGenerateOptions = {}) {\n\t\tif (timestamp instanceof Date) timestamp = BigInt(timestamp.getTime());\n\t\telse if (typeof timestamp === 'number') timestamp = BigInt(timestamp);\n\t\telse if (typeof timestamp !== 'bigint') {\n\t\t\tthrow new TypeError(`\"timestamp\" argument must be a number, bigint, or Date (received ${typeof timestamp})`);\n\t\t}\n\n\t\tif (typeof increment !== 'bigint') {\n\t\t\tincrement = this[IncrementSymbol];\n\t\t\tthis[IncrementSymbol] = (increment + 1n) & MaximumIncrement;\n\t\t}\n\n\t\t// timestamp, workerId, processId, increment\n\t\treturn (\n\t\t\t((timestamp - this[EpochSymbol]) << 22n) |\n\t\t\t((workerId & MaximumWorkerId) << 17n) |\n\t\t\t((processId & MaximumProcessId) << 12n) |\n\t\t\t(increment & MaximumIncrement)\n\t\t);\n\t}\n\n\t/**\n\t * Deconstructs a snowflake given a snowflake ID\n\t * @param id the snowflake to deconstruct\n\t * @returns a deconstructed snowflake\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n\t * ```\n\t */\n\tpublic deconstruct(id: string | bigint): DeconstructedSnowflake {\n\t\tconst bigIntId = BigInt(id);\n\t\tconst epoch = this[EpochSymbol];\n\t\treturn {\n\t\t\tid: bigIntId,\n\t\t\ttimestamp: (bigIntId >> 22n) + epoch,\n\t\t\tworkerId: (bigIntId >> 17n) & MaximumWorkerId,\n\t\t\tprocessId: (bigIntId >> 12n) & MaximumProcessId,\n\t\t\tincrement: bigIntId & MaximumIncrement,\n\t\t\tepoch\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves the timestamp field's value from a snowflake.\n\t * @param id The snowflake to get the timestamp value from.\n\t * @returns The UNIX timestamp that is stored in `id`.\n\t */\n\tpublic timestampFrom(id: string | bigint): number {\n\t\treturn Number((BigInt(id) >> 22n) + this[EpochSymbol]);\n\t}\n\n\t/**\n\t * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n\t * snowflake in sort order.\n\t * @param a The first snowflake to compare.\n\t * @param b The second snowflake to compare.\n\t * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n\t * @example Sort snowflakes in ascending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => Snowflake.compare(a, b)));\n\t * // → ['254360814063058944', '737141877803057244', '1056191128120082432'];\n\t * ```\n\t * @example Sort snowflakes in descending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => -Snowflake.compare(a, b)));\n\t * // → ['1056191128120082432', '737141877803057244', '254360814063058944'];\n\t * ```\n\t */\n\tpublic static compare(a: string | bigint, b: string | bigint): -1 | 0 | 1 {\n\t\tconst typeA = typeof a;\n\t\treturn typeA === typeof b\n\t\t\t? typeA === 'string'\n\t\t\t\t? cmpString(a as string, b as string)\n\t\t\t\t: cmpBigInt(a as bigint, b as bigint)\n\t\t\t: cmpBigInt(BigInt(a), BigInt(b));\n\t}\n}\n\n/** @internal */\nfunction cmpBigInt(a: bigint, b: bigint) {\n\treturn a === b ? 0 : a < b ? -1 : 1;\n}\n\n/** @internal */\nfunction cmpString(a: string, b: string) {\n\treturn a === b ? 0 : a.length < b.length ? -1 : a.length > b.length ? 1 : a < b ? -1 : 1;\n}\n\n/**\n * Options for Snowflake#generate\n */\nexport interface SnowflakeGenerateOptions {\n\t/**\n\t * Timestamp or date of the snowflake to generate\n\t * @default Date.now()\n\t */\n\ttimestamp?: number | bigint | Date;\n\n\t/**\n\t * The increment to use\n\t * @default 0n\n\t * @remark keep in mind that this bigint is auto-incremented between generate calls\n\t */\n\tincrement?: bigint;\n\n\t/**\n\t * The worker ID to use, will be truncated to 5 bits (0-31)\n\t * @default 0n\n\t */\n\tworkerId?: bigint;\n\n\t/**\n\t * The process ID to use, will be truncated to 5 bits (0-31)\n\t * @default 1n\n\t */\n\tprocessId?: bigint;\n}\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n\t/**\n\t * The id in BigInt form\n\t */\n\tid: bigint;\n\n\t/**\n\t * The timestamp stored in the snowflake\n\t */\n\ttimestamp: bigint;\n\n\t/**\n\t * The worker id stored in the snowflake\n\t */\n\tworkerId: bigint;\n\n\t/**\n\t * The process id stored in the snowflake\n\t */\n\tprocessId: bigint;\n\n\t/**\n\t * The increment stored in the snowflake\n\t */\n\tincrement: bigint;\n\n\t/**\n\t * The epoch to use in the snowflake\n\t */\n\tepoch: bigint;\n}\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Discord's snowflake epoch\n *\n * Which is 2015-01-01 at 00:00:00.000 UTC+0, {@linkplain https://discord.com/developers/docs/reference#snowflakes}\n */\nexport const DiscordSnowflake = new Snowflake(1420070400000n);\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Twitter's snowflake epoch\n *\n * Which is 2010-11-04 at 01:42:54.657 UTC+0, found in the archived snowflake repository {@linkplain https://github.com/twitter-archive/snowflake/blob/b3f6a3c6ca8e1b6847baa6ff42bf72201e2c2231/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L25}\n */\nexport const TwitterSnowflake = new Snowflake(1288834974657n);\n"]}
1
+ {"version":3,"sources":["../../src/lib/Snowflake.ts","../../src/lib/DiscordSnowflake.ts","../../src/lib/TwitterSnowflake.ts"],"names":[],"mappings":";;;;;;;;;EAAA,IAAM,eAAA,GAAkB,OAAO,+BAA+B,CAAA,CAAA;EAC9D,IAAM,WAAA,GAAc,OAAO,2BAA2B,CAAA,CAAA;EACtD,IAAM,iBAAA,GAAoB,OAAO,kCAAkC,CAAA,CAAA;EACnE,IAAM,eAAA,GAAkB,OAAO,+BAA+B,CAAA,CAAA;EAC9D,IAAM,cAAA,GAAiB,OAAO,8BAA8B,CAAA,CAAA;AAKrD,MAAM,eAAkB,GAAA,SAAA;AAKxB,MAAM,gBAAmB,GAAA,SAAA;AAKzB,MAAM,gBAAmB,GAAA,gBAAA;EAEhC,IAAM,wBAAwB,CAAK,IAAA,EAAA,CAAA;EArBnC,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;EA+CmB,EAMA,GAAA,WAAA,EAAA,EAAA,GAAA,iBAAA,EAMT,sBAMA,EAMA,GAAA,eAAA,EAAA,EAAA,GAAA,cAAA,CAAA;EAnCH,IAAM,UAAA,GAAN,MAAM,UAAU,CAAA;EAAA;EAAA;EAAA;EAAA,EAwCf,YAAY,KAA+B,EAAA;EAnClD;EAAA;EAAA;EAAA;EAAA,IAAA,aAAA,CAAA,IAAA,EAAO,UAAS,IAAK,CAAA,WAAA,CAAA,CAAA;EAMrB;EAAA;EAAA;EAAA;EAAA,IAAkB,aAAA,CAAA,IAAA,EAAA,EAAA,CAAA,CAAA;EAMlB;EAAA;EAAA;EAAA;EAAA,IAAkB,aAAA,CAAA,IAAA,EAAA,EAAA,CAAA,CAAA;EAMlB;EAAA;EAAA;EAAA;EAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAmB,EAAA,EAAA,CAAA,CAAA;EAM5B;EAAA;EAAA;EAAA;EAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAmB,EAAA,EAAA,CAAA,CAAA;EAM5B;EAAA;EAAA;EAAA;EAAA,IAAA,aAAA,CAAA,IAAA,EAAS,EAAkB,EAAA,EAAA,CAAA,CAAA;EAM1B,IAAK,IAAA,CAAA,WAAW,IAAI,MAAO,CAAA,KAAA,YAAiB,OAAO,KAAM,CAAA,OAAA,KAAY,KAAK,CAAA,CAAA;EAC1E,IAAA,IAAA,CAAK,iBAAiB,CAAA,GAAI,MAAO,CAAA,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA;EAAA,GACnD;EAAA;EAAA;EAAA;EAAA,EAKA,IAAW,KAAgB,GAAA;EAC1B,IAAA,OAAO,KAAK,WAAW,CAAA,CAAA;EAAA,GACxB;EAAA;EAAA;EAAA;EAAA,EAKA,IAAW,WAAsB,GAAA;EAChC,IAAA,OAAO,KAAK,iBAAiB,CAAA,CAAA;EAAA,GAC9B;EAAA;EAAA;EAAA;EAAA,EAKA,IAAW,SAAoB,GAAA;EAC9B,IAAA,OAAO,KAAK,eAAe,CAAA,CAAA;EAAA,GAC5B;EAAA;EAAA;EAAA;EAAA;EAAA,EAMA,IAAW,UAAU,KAAwB,EAAA;EAC5C,IAAA,IAAA,CAAK,eAAe,CAAA,GAAI,MAAO,CAAA,KAAK,CAAI,GAAA,gBAAA,CAAA;EAAA,GACzC;EAAA;EAAA;EAAA;EAAA,EAKA,IAAW,QAAmB,GAAA;EAC7B,IAAA,OAAO,KAAK,cAAc,CAAA,CAAA;EAAA,GAC3B;EAAA;EAAA;EAAA;EAAA;EAAA,EAMA,IAAW,SAAS,KAAwB,EAAA;EAC3C,IAAA,IAAA,CAAK,cAAc,CAAA,GAAI,MAAO,CAAA,KAAK,CAAI,GAAA,eAAA,CAAA;EAAA,GACxC;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,EAcO,QAAS,CAAA;EAAA,IACf,SAAA;EAAA,IACA,SAAA,GAAY,KAAK,GAAI,EAAA;EAAA,IACrB,QAAA,GAAW,KAAK,cAAc,CAAA;EAAA,IAC9B,SAAA,GAAY,KAAK,eAAe,CAAA;EAAA,GACjC,GAA8B,EAAI,EAAA;EACjC,IAAA,IAAI,qBAAqB,IAAM,EAAA,SAAA,GAAY,MAAO,CAAA,SAAA,CAAU,SAAS,CAAA,CAAA;EAAA,SAAA,IAC5D,OAAO,SAAA,KAAc,QAAU,EAAA,SAAA,GAAY,OAAO,SAAS,CAAA,CAAA;EAAA,SAC3D,IAAA,OAAO,cAAc,QAAU,EAAA;EACvC,MAAA,MAAM,IAAI,SAAA,CAAU,CAAoE,iEAAA,EAAA,OAAO,SAAS,CAAG,CAAA,CAAA,CAAA,CAAA;EAAA,KAC5G;EAEA,IAAI,IAAA,OAAO,cAAc,QAAU,EAAA;EAClC,MAAA,SAAA,GAAY,KAAK,eAAe,CAAA,CAAA;EAChC,MAAK,IAAA,CAAA,eAAe,CAAK,GAAA,SAAA,GAAY,EAAM,GAAA,gBAAA,CAAA;EAAA,KAC5C;EAGA,IACG,OAAA,SAAA,GAAY,IAAK,CAAA,WAAW,CAAM,IAAA,GAAA,GAAA,CAClC,QAAW,GAAA,eAAA,KAAoB,GAC/B,GAAA,CAAA,SAAA,GAAY,gBAAqB,KAAA,GAAA,GAClC,SAAY,GAAA,gBAAA,CAAA;EAAA,GAEf;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,EAYO,YAAY,EAA6C,EAAA;EAC/D,IAAM,MAAA,QAAA,GAAW,OAAO,EAAE,CAAA,CAAA;EAC1B,IAAM,MAAA,KAAA,GAAQ,KAAK,WAAW,CAAA,CAAA;EAC9B,IAAO,OAAA;EAAA,MACN,EAAI,EAAA,QAAA;EAAA,MACJ,SAAA,EAAA,CAAY,YAAY,GAAO,IAAA,KAAA;EAAA,MAC/B,QAAA,EAAW,YAAY,GAAO,GAAA,eAAA;EAAA,MAC9B,SAAA,EAAY,YAAY,GAAO,GAAA,gBAAA;EAAA,MAC/B,WAAW,QAAW,GAAA,gBAAA;EAAA,MACtB,KAAA;EAAA,KACD,CAAA;EAAA,GACD;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,EAOO,cAAc,EAA6B,EAAA;EACjD,IAAO,OAAA,IAAA,CAAK,MAAM,MAAO,CAAA,EAAE,IAAI,qBAAqB,CAAA,GAAI,KAAK,iBAAiB,CAAA,CAAA;EAAA,GAC/E;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,EAqBA,OAAc,OAAQ,CAAA,CAAA,EAAoB,CAAgC,EAAA;EACzE,IAAA,MAAM,QAAQ,OAAO,CAAA,CAAA;EACrB,IAAA,OAAO,UAAU,OAAO,CAAA,GACrB,UAAU,QACT,GAAA,SAAA,CAAU,GAAa,CAAW,CAAA,GAClC,UAAU,CAAa,EAAA,CAAW,IACnC,SAAU,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,MAAA,CAAO,CAAC,CAAC,CAAA,CAAA;EAAA,GAClC;EACD,CAAA,CAAA;EA1LuB,MAAA,CAAA,UAAA,EAAA,WAAA,CAAA,CAAA;AAAhB,MAAM,SAAN,GAAA,WAAA;EA6LP,SAAS,SAAA,CAAU,GAAW,CAAW,EAAA;EACxC,EAAA,OAAO,CAAM,KAAA,CAAA,GAAI,CAAI,GAAA,CAAA,GAAI,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA;EACnC,CAAA;EAFS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA,CAAA;EAKT,SAAS,SAAA,CAAU,GAAW,CAAW,EAAA;EACxC,EAAA,OAAO,CAAM,KAAA,CAAA,GAAI,CAAI,GAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAA,GAAS,CAAK,CAAA,GAAA,CAAA,CAAE,SAAS,CAAE,CAAA,MAAA,GAAS,CAAI,GAAA,CAAA,GAAI,IAAI,CAAK,CAAA,GAAA,CAAA,CAAA;EACxF,CAAA;EAFS,MAAA,CAAA,SAAA,EAAA,WAAA,CAAA,CAAA;;;AC/NI,MAAA,gBAAA,GAAmB,IAAI,SAAA,CAAU,cAAc,EAAA;;;ACA/C,MAAA,gBAAA,GAAmB,IAAI,SAAA,CAAU,cAAc","file":"index.global.js","sourcesContent":["const IncrementSymbol = Symbol('@sapphire/snowflake.increment');\nconst EpochSymbol = Symbol('@sapphire/snowflake.epoch');\nconst EpochNumberSymbol = Symbol('@sapphire/snowflake.epoch.number');\nconst ProcessIdSymbol = Symbol('@sapphire/snowflake.processId');\nconst WorkerIdSymbol = Symbol('@sapphire/snowflake.workerId');\n\n/**\n * The maximum value the `workerId` field accepts in snowflakes.\n */\nexport const MaximumWorkerId = 0b11111n;\n\n/**\n * The maximum value the `processId` field accepts in snowflakes.\n */\nexport const MaximumProcessId = 0b11111n;\n\n/**\n * The maximum value the `increment` field accepts in snowflakes.\n */\nexport const MaximumIncrement = 0b111111111111n;\n\nconst TimestampFieldDivisor = 2 ** 22;\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 */\nexport class Snowflake {\n\t/**\n\t * Alias for {@link deconstruct}\n\t */\n\t// eslint-disable-next-line @typescript-eslint/unbound-method\n\tpublic decode = this.deconstruct;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor\n\t * @internal\n\t */\n\tprivate readonly [EpochSymbol]: bigint;\n\n\t/**\n\t * Internal reference of the epoch passed in the constructor as a number\n\t * @internal\n\t */\n\tprivate readonly [EpochNumberSymbol]: number;\n\n\t/**\n\t * Internal incrementor for generating snowflakes\n\t * @internal\n\t */\n\tprivate [IncrementSymbol] = 0n;\n\n\t/**\n\t * The process ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [ProcessIdSymbol] = 1n;\n\n\t/**\n\t * The worker ID that will be used by default in the generate method\n\t * @internal\n\t */\n\tprivate [WorkerIdSymbol] = 0n;\n\n\t/**\n\t * @param epoch the epoch to use\n\t */\n\tpublic constructor(epoch: number | bigint | Date) {\n\t\tthis[EpochSymbol] = BigInt(epoch instanceof Date ? epoch.getTime() : epoch);\n\t\tthis[EpochNumberSymbol] = Number(this[EpochSymbol]);\n\t}\n\n\t/**\n\t * The epoch for this snowflake, as a bigint\n\t */\n\tpublic get epoch(): bigint {\n\t\treturn this[EpochSymbol];\n\t}\n\n\t/**\n\t * The epoch for this snowflake, as a number\n\t */\n\tpublic get epochNumber(): number {\n\t\treturn this[EpochNumberSymbol];\n\t}\n\n\t/**\n\t * Gets the configured process ID\n\t */\n\tpublic get processId(): bigint {\n\t\treturn this[ProcessIdSymbol];\n\t}\n\n\t/**\n\t * Sets the process ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set processId(value: number | bigint) {\n\t\tthis[ProcessIdSymbol] = BigInt(value) & MaximumProcessId;\n\t}\n\n\t/**\n\t * Gets the configured worker ID\n\t */\n\tpublic get workerId(): bigint {\n\t\treturn this[WorkerIdSymbol];\n\t}\n\n\t/**\n\t * Sets the worker ID that will be used by default for the {@link generate} method\n\t * @param value The new value, will be coerced to BigInt and masked with `0b11111n`\n\t */\n\tpublic set workerId(value: number | bigint) {\n\t\tthis[WorkerIdSymbol] = BigInt(value) & MaximumWorkerId;\n\t}\n\n\t/**\n\t * Generates a snowflake given an epoch and optionally a timestamp\n\t * @param options options to pass into the generator, see {@link SnowflakeGenerateOptions}\n\t *\n\t * **note** when `increment` is not provided it defaults to the private `increment` of the instance\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).generate();\n\t * ```\n\t * @returns A unique snowflake\n\t */\n\tpublic generate({\n\t\tincrement,\n\t\ttimestamp = Date.now(),\n\t\tworkerId = this[WorkerIdSymbol],\n\t\tprocessId = this[ProcessIdSymbol]\n\t}: SnowflakeGenerateOptions = {}) {\n\t\tif (timestamp instanceof Date) timestamp = BigInt(timestamp.getTime());\n\t\telse if (typeof timestamp === 'number') timestamp = BigInt(timestamp);\n\t\telse if (typeof timestamp !== 'bigint') {\n\t\t\tthrow new TypeError(`\"timestamp\" argument must be a number, bigint, or Date (received ${typeof timestamp})`);\n\t\t}\n\n\t\tif (typeof increment !== 'bigint') {\n\t\t\tincrement = this[IncrementSymbol];\n\t\t\tthis[IncrementSymbol] = (increment + 1n) & MaximumIncrement;\n\t\t}\n\n\t\t// timestamp, workerId, processId, increment\n\t\treturn (\n\t\t\t((timestamp - this[EpochSymbol]) << 22n) |\n\t\t\t((workerId & MaximumWorkerId) << 17n) |\n\t\t\t((processId & MaximumProcessId) << 12n) |\n\t\t\t(increment & MaximumIncrement)\n\t\t);\n\t}\n\n\t/**\n\t * Deconstructs a snowflake given a snowflake ID\n\t * @param id the snowflake to deconstruct\n\t * @returns a deconstructed snowflake\n\t * @example\n\t * ```typescript\n\t * const epoch = new Date('2000-01-01T00:00:00.000Z');\n\t * const snowflake = new Snowflake(epoch).deconstruct('3971046231244935168');\n\t * ```\n\t */\n\tpublic deconstruct(id: string | bigint): DeconstructedSnowflake {\n\t\tconst bigIntId = BigInt(id);\n\t\tconst epoch = this[EpochSymbol];\n\t\treturn {\n\t\t\tid: bigIntId,\n\t\t\ttimestamp: (bigIntId >> 22n) + epoch,\n\t\t\tworkerId: (bigIntId >> 17n) & MaximumWorkerId,\n\t\t\tprocessId: (bigIntId >> 12n) & MaximumProcessId,\n\t\t\tincrement: bigIntId & MaximumIncrement,\n\t\t\tepoch\n\t\t};\n\t}\n\n\t/**\n\t * Retrieves the timestamp field's value from a snowflake.\n\t * @param id The snowflake to get the timestamp value from.\n\t * @returns The UNIX timestamp that is stored in `id`.\n\t */\n\tpublic timestampFrom(id: string | bigint): number {\n\t\treturn Math.floor(Number(id) / TimestampFieldDivisor) + this[EpochNumberSymbol];\n\t}\n\n\t/**\n\t * Returns a number indicating whether a reference snowflake comes before, or after, or is same as the given\n\t * snowflake in sort order.\n\t * @param a The first snowflake to compare.\n\t * @param b The second snowflake to compare.\n\t * @returns `-1` if `a` is older than `b`, `0` if `a` and `b` are equals, `1` if `a` is newer than `b`.\n\t * @example Sort snowflakes in ascending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => Snowflake.compare(a, b)));\n\t * // → ['254360814063058944', '737141877803057244', '1056191128120082432'];\n\t * ```\n\t * @example Sort snowflakes in descending order\n\t * ```typescript\n\t * const ids = ['737141877803057244', '1056191128120082432', '254360814063058944'];\n\t * console.log(ids.sort((a, b) => -Snowflake.compare(a, b)));\n\t * // → ['1056191128120082432', '737141877803057244', '254360814063058944'];\n\t * ```\n\t */\n\tpublic static compare(a: string | bigint, b: string | bigint): -1 | 0 | 1 {\n\t\tconst typeA = typeof a;\n\t\treturn typeA === typeof b\n\t\t\t? typeA === 'string'\n\t\t\t\t? cmpString(a as string, b as string)\n\t\t\t\t: cmpBigInt(a as bigint, b as bigint)\n\t\t\t: cmpBigInt(BigInt(a), BigInt(b));\n\t}\n}\n\n/** @internal */\nfunction cmpBigInt(a: bigint, b: bigint) {\n\treturn a === b ? 0 : a < b ? -1 : 1;\n}\n\n/** @internal */\nfunction cmpString(a: string, b: string) {\n\treturn a === b ? 0 : a.length < b.length ? -1 : a.length > b.length ? 1 : a < b ? -1 : 1;\n}\n\n/**\n * Options for Snowflake#generate\n */\nexport interface SnowflakeGenerateOptions {\n\t/**\n\t * Timestamp or date of the snowflake to generate\n\t * @default Date.now()\n\t */\n\ttimestamp?: number | bigint | Date;\n\n\t/**\n\t * The increment to use\n\t * @default 0n\n\t * @remark keep in mind that this bigint is auto-incremented between generate calls\n\t */\n\tincrement?: bigint;\n\n\t/**\n\t * The worker ID to use, will be truncated to 5 bits (0-31)\n\t * @default 0n\n\t */\n\tworkerId?: bigint;\n\n\t/**\n\t * The process ID to use, will be truncated to 5 bits (0-31)\n\t * @default 1n\n\t */\n\tprocessId?: bigint;\n}\n\n/**\n * Object returned by Snowflake#deconstruct\n */\nexport interface DeconstructedSnowflake {\n\t/**\n\t * The id in BigInt form\n\t */\n\tid: bigint;\n\n\t/**\n\t * The timestamp stored in the snowflake\n\t */\n\ttimestamp: bigint;\n\n\t/**\n\t * The worker id stored in the snowflake\n\t */\n\tworkerId: bigint;\n\n\t/**\n\t * The process id stored in the snowflake\n\t */\n\tprocessId: bigint;\n\n\t/**\n\t * The increment stored in the snowflake\n\t */\n\tincrement: bigint;\n\n\t/**\n\t * The epoch to use in the snowflake\n\t */\n\tepoch: bigint;\n}\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Discord's snowflake epoch\n *\n * Which is 2015-01-01 at 00:00:00.000 UTC+0, {@linkplain https://discord.com/developers/docs/reference#snowflakes}\n */\nexport const DiscordSnowflake = new Snowflake(1420070400000n);\n","import { Snowflake } from './Snowflake';\n\n/**\n * A class for parsing snowflake ids using Twitter's snowflake epoch\n *\n * Which is 2010-11-04 at 01:42:54.657 UTC+0, found in the archived snowflake repository {@linkplain https://github.com/twitter-archive/snowflake/blob/b3f6a3c6ca8e1b6847baa6ff42bf72201e2c2231/src/main/scala/com/twitter/service/snowflake/IdWorker.scala#L25}\n */\nexport const TwitterSnowflake = new Snowflake(1288834974657n);\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapphire/snowflake",
3
- "version": "3.5.4-next.1e73db92",
3
+ "version": "3.5.4-next.1e7d2dec",
4
4
  "description": "Deconstructs and generates snowflake IDs using BigInts",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -31,7 +31,7 @@
31
31
  "prepack": "yarn build",
32
32
  "bump": "cliff-jumper",
33
33
  "check-update": "cliff-jumper --dry-run",
34
- "gen-index": "tsx ../../scripts/gen-index.cts -w snowflake"
34
+ "gen-index": "tsx ../../scripts/gen-index.cts snowflake --write"
35
35
  },
36
36
  "repository": {
37
37
  "type": "git",
@@ -62,13 +62,13 @@
62
62
  "access": "public"
63
63
  },
64
64
  "devDependencies": {
65
- "@favware/cliff-jumper": "^4.0.2",
66
- "@vitest/coverage-v8": "^2.0.3",
67
- "tsup": "^8.2.1",
68
- "tsx": "^4.16.2",
65
+ "@favware/cliff-jumper": "^4.1.0",
66
+ "@vitest/coverage-v8": "^2.1.2",
67
+ "tsup": "^8.3.0",
68
+ "tsx": "^4.19.1",
69
69
  "typedoc": "^0.25.13",
70
70
  "typedoc-json-parser": "^10.0.0",
71
71
  "typescript": "~5.4.5",
72
- "vitest": "^2.0.3"
72
+ "vitest": "^2.1.2"
73
73
  }
74
74
  }