s3db.js 18.0.11-next.1534f717 → 18.0.11-next.e8e71b5b

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.
Files changed (190) hide show
  1. package/dist/clients/recker-http-handler.js +56 -8
  2. package/dist/clients/recker-http-handler.js.map +1 -1
  3. package/dist/concerns/high-performance-inserter.js +6 -34
  4. package/dist/concerns/high-performance-inserter.js.map +1 -1
  5. package/dist/concerns/id/alphabets.js +150 -0
  6. package/dist/concerns/id/alphabets.js.map +1 -0
  7. package/dist/concerns/id/entropy.js +243 -0
  8. package/dist/concerns/id/entropy.js.map +1 -0
  9. package/dist/concerns/id/generators/nanoid.js +74 -0
  10. package/dist/concerns/id/generators/nanoid.js.map +1 -0
  11. package/dist/concerns/id/generators/sid.js +73 -0
  12. package/dist/concerns/id/generators/sid.js.map +1 -0
  13. package/dist/concerns/id/generators/ulid.js +208 -0
  14. package/dist/concerns/id/generators/ulid.js.map +1 -0
  15. package/dist/concerns/id/generators/uuid-v7.js +150 -0
  16. package/dist/concerns/id/generators/uuid-v7.js.map +1 -0
  17. package/dist/concerns/id/index.js +74 -0
  18. package/dist/concerns/id/index.js.map +1 -0
  19. package/dist/concerns/plugin-storage.js +114 -0
  20. package/dist/concerns/plugin-storage.js.map +1 -1
  21. package/dist/concerns/s3-errors.js +72 -0
  22. package/dist/concerns/s3-errors.js.map +1 -0
  23. package/dist/concerns/s3-key.js +54 -0
  24. package/dist/concerns/s3-key.js.map +1 -0
  25. package/dist/concerns/safe-merge.js +47 -0
  26. package/dist/concerns/safe-merge.js.map +1 -0
  27. package/dist/core/resource-config-validator.js +12 -2
  28. package/dist/core/resource-config-validator.js.map +1 -1
  29. package/dist/core/resource-partitions.class.js +12 -1
  30. package/dist/core/resource-partitions.class.js.map +1 -1
  31. package/dist/core/resource-persistence.class.js +41 -12
  32. package/dist/core/resource-persistence.class.js.map +1 -1
  33. package/dist/core/resource-query.class.js +21 -47
  34. package/dist/core/resource-query.class.js.map +1 -1
  35. package/dist/database/database-connection.class.js +3 -6
  36. package/dist/database/database-connection.class.js.map +1 -1
  37. package/dist/database/database-plugins.class.js +7 -13
  38. package/dist/database/database-plugins.class.js.map +1 -1
  39. package/dist/plugins/concerns/s3-mutex.class.js +155 -0
  40. package/dist/plugins/concerns/s3-mutex.class.js.map +1 -0
  41. package/dist/plugins/eventual-consistency/consolidation.js +4 -7
  42. package/dist/plugins/eventual-consistency/consolidation.js.map +1 -1
  43. package/dist/plugins/eventual-consistency/garbage-collection.js +3 -6
  44. package/dist/plugins/eventual-consistency/garbage-collection.js.map +1 -1
  45. package/dist/plugins/queue-consumer.plugin.js +10 -16
  46. package/dist/plugins/queue-consumer.plugin.js.map +1 -1
  47. package/dist/plugins/recon/managers/scheduler-manager.js +3 -5
  48. package/dist/plugins/recon/managers/scheduler-manager.js.map +1 -1
  49. package/dist/plugins/recon/stages/recker-asn-stage.js +279 -0
  50. package/dist/plugins/recon/stages/recker-asn-stage.js.map +1 -0
  51. package/dist/plugins/recon/stages/recker-dns-stage.js +227 -0
  52. package/dist/plugins/recon/stages/recker-dns-stage.js.map +1 -0
  53. package/dist/plugins/recon/stages/recker-scrape-stage.js +369 -0
  54. package/dist/plugins/recon/stages/recker-scrape-stage.js.map +1 -0
  55. package/dist/plugins/replicator.plugin.js +13 -31
  56. package/dist/plugins/replicator.plugin.js.map +1 -1
  57. package/dist/plugins/replicators/base-replicator.class.js +10 -23
  58. package/dist/plugins/replicators/base-replicator.class.js.map +1 -1
  59. package/dist/plugins/spider/recker-link-discoverer.js +544 -0
  60. package/dist/plugins/spider/recker-link-discoverer.js.map +1 -0
  61. package/dist/plugins/spider/recker-llms-validator.js +334 -0
  62. package/dist/plugins/spider/recker-llms-validator.js.map +1 -0
  63. package/dist/plugins/spider/recker-robots-validator.js +336 -0
  64. package/dist/plugins/spider/recker-robots-validator.js.map +1 -0
  65. package/dist/plugins/spider/recker-security-adapter.js +325 -0
  66. package/dist/plugins/spider/recker-security-adapter.js.map +1 -0
  67. package/dist/plugins/spider/recker-seo-adapter.js +399 -0
  68. package/dist/plugins/spider/recker-seo-adapter.js.map +1 -0
  69. package/dist/plugins/spider/recker-sitemap-validator.js +406 -0
  70. package/dist/plugins/spider/recker-sitemap-validator.js.map +1 -0
  71. package/dist/resource.class.js +2 -0
  72. package/dist/resource.class.js.map +1 -1
  73. package/dist/s3db.cjs +444 -219
  74. package/dist/s3db.cjs.map +1 -1
  75. package/dist/s3db.es.js +445 -220
  76. package/dist/s3db.es.js.map +1 -1
  77. package/dist/stream/resource-reader.class.js +5 -7
  78. package/dist/stream/resource-reader.class.js.map +1 -1
  79. package/dist/stream/resource-writer.class.js +5 -7
  80. package/dist/stream/resource-writer.class.js.map +1 -1
  81. package/dist/tasks/tasks-pool.class.js +31 -0
  82. package/dist/tasks/tasks-pool.class.js.map +1 -1
  83. package/dist/types/clients/recker-http-handler.d.ts +1 -0
  84. package/dist/types/clients/recker-http-handler.d.ts.map +1 -1
  85. package/dist/types/clients/types.d.ts +14 -0
  86. package/dist/types/clients/types.d.ts.map +1 -1
  87. package/dist/types/concerns/high-performance-inserter.d.ts.map +1 -1
  88. package/dist/types/concerns/id/alphabets.d.ts +125 -0
  89. package/dist/types/concerns/id/alphabets.d.ts.map +1 -0
  90. package/dist/types/concerns/id/entropy.d.ts +84 -0
  91. package/dist/types/concerns/id/entropy.d.ts.map +1 -0
  92. package/dist/types/concerns/id/generators/nanoid.d.ts +46 -0
  93. package/dist/types/concerns/id/generators/nanoid.d.ts.map +1 -0
  94. package/dist/types/concerns/id/generators/sid.d.ts +45 -0
  95. package/dist/types/concerns/id/generators/sid.d.ts.map +1 -0
  96. package/dist/types/concerns/id/generators/ulid.d.ts +71 -0
  97. package/dist/types/concerns/id/generators/ulid.d.ts.map +1 -0
  98. package/dist/types/concerns/id/generators/uuid-v7.d.ts +60 -0
  99. package/dist/types/concerns/id/generators/uuid-v7.d.ts.map +1 -0
  100. package/dist/types/concerns/id/index.d.ts +51 -0
  101. package/dist/types/concerns/id/index.d.ts.map +1 -0
  102. package/dist/types/concerns/plugin-storage.d.ts +25 -0
  103. package/dist/types/concerns/plugin-storage.d.ts.map +1 -1
  104. package/dist/types/concerns/s3-errors.d.ts +20 -0
  105. package/dist/types/concerns/s3-errors.d.ts.map +1 -0
  106. package/dist/types/concerns/s3-key.d.ts +30 -0
  107. package/dist/types/concerns/s3-key.d.ts.map +1 -0
  108. package/dist/types/concerns/safe-merge.d.ts +22 -0
  109. package/dist/types/concerns/safe-merge.d.ts.map +1 -0
  110. package/dist/types/core/resource-config-validator.d.ts.map +1 -1
  111. package/dist/types/core/resource-partitions.class.d.ts.map +1 -1
  112. package/dist/types/core/resource-persistence.class.d.ts.map +1 -1
  113. package/dist/types/core/resource-query.class.d.ts.map +1 -1
  114. package/dist/types/database/database-connection.class.d.ts.map +1 -1
  115. package/dist/types/database/database-plugins.class.d.ts.map +1 -1
  116. package/dist/types/plugins/concerns/s3-mutex.class.d.ts +30 -0
  117. package/dist/types/plugins/concerns/s3-mutex.class.d.ts.map +1 -0
  118. package/dist/types/plugins/eventual-consistency/consolidation.d.ts.map +1 -1
  119. package/dist/types/plugins/eventual-consistency/garbage-collection.d.ts.map +1 -1
  120. package/dist/types/plugins/queue-consumer.plugin.d.ts.map +1 -1
  121. package/dist/types/plugins/recon/managers/scheduler-manager.d.ts.map +1 -1
  122. package/dist/types/plugins/recon/stages/recker-asn-stage.d.ts +90 -0
  123. package/dist/types/plugins/recon/stages/recker-asn-stage.d.ts.map +1 -0
  124. package/dist/types/plugins/recon/stages/recker-dns-stage.d.ts +125 -0
  125. package/dist/types/plugins/recon/stages/recker-dns-stage.d.ts.map +1 -0
  126. package/dist/types/plugins/recon/stages/recker-scrape-stage.d.ts +96 -0
  127. package/dist/types/plugins/recon/stages/recker-scrape-stage.d.ts.map +1 -0
  128. package/dist/types/plugins/replicator.plugin.d.ts.map +1 -1
  129. package/dist/types/plugins/replicators/base-replicator.class.d.ts.map +1 -1
  130. package/dist/types/plugins/spider/recker-link-discoverer.d.ts +54 -0
  131. package/dist/types/plugins/spider/recker-link-discoverer.d.ts.map +1 -0
  132. package/dist/types/plugins/spider/recker-llms-validator.d.ts +105 -0
  133. package/dist/types/plugins/spider/recker-llms-validator.d.ts.map +1 -0
  134. package/dist/types/plugins/spider/recker-robots-validator.d.ts +92 -0
  135. package/dist/types/plugins/spider/recker-robots-validator.d.ts.map +1 -0
  136. package/dist/types/plugins/spider/recker-security-adapter.d.ts +83 -0
  137. package/dist/types/plugins/spider/recker-security-adapter.d.ts.map +1 -0
  138. package/dist/types/plugins/spider/recker-seo-adapter.d.ts +187 -0
  139. package/dist/types/plugins/spider/recker-seo-adapter.d.ts.map +1 -0
  140. package/dist/types/plugins/spider/recker-sitemap-validator.d.ts +121 -0
  141. package/dist/types/plugins/spider/recker-sitemap-validator.d.ts.map +1 -0
  142. package/dist/types/resource.class.d.ts.map +1 -1
  143. package/dist/types/stream/resource-reader.class.d.ts.map +1 -1
  144. package/dist/types/stream/resource-writer.class.d.ts.map +1 -1
  145. package/dist/types/tasks/tasks-pool.class.d.ts +23 -0
  146. package/dist/types/tasks/tasks-pool.class.d.ts.map +1 -1
  147. package/mcp/prompts/index.ts +275 -0
  148. package/mcp/resources/index.ts +322 -0
  149. package/mcp/tools/plugins.ts +1137 -0
  150. package/mcp/tools/streams.ts +340 -0
  151. package/package.json +20 -22
  152. package/src/clients/recker-http-handler.ts +74 -8
  153. package/src/clients/types.ts +14 -0
  154. package/src/concerns/high-performance-inserter.ts +18 -57
  155. package/src/concerns/id/alphabets.ts +175 -0
  156. package/src/concerns/id/entropy.ts +286 -0
  157. package/src/concerns/id/generators/sid.ts +90 -0
  158. package/src/concerns/id/generators/ulid.ts +249 -0
  159. package/src/concerns/id/generators/uuid-v7.ts +179 -0
  160. package/src/concerns/id/index.ts +167 -0
  161. package/src/concerns/plugin-storage.ts +144 -0
  162. package/src/concerns/s3-errors.ts +97 -0
  163. package/src/concerns/s3-key.ts +62 -0
  164. package/src/concerns/safe-merge.ts +60 -0
  165. package/src/core/resource-config-validator.ts +9 -2
  166. package/src/core/resource-partitions.class.ts +14 -1
  167. package/src/core/resource-persistence.class.ts +47 -13
  168. package/src/core/resource-query.class.ts +21 -46
  169. package/src/database/database-connection.class.ts +7 -6
  170. package/src/database/database-plugins.class.ts +15 -13
  171. package/src/plugins/concerns/s3-mutex.class.ts +228 -0
  172. package/src/plugins/eventual-consistency/consolidation.ts +8 -7
  173. package/src/plugins/eventual-consistency/garbage-collection.ts +7 -6
  174. package/src/plugins/queue-consumer.plugin.ts +21 -19
  175. package/src/plugins/recon/managers/scheduler-manager.ts +7 -5
  176. package/src/plugins/recon/stages/recker-asn-stage.ts +385 -0
  177. package/src/plugins/recon/stages/recker-dns-stage.ts +360 -0
  178. package/src/plugins/recon/stages/recker-scrape-stage.ts +509 -0
  179. package/src/plugins/replicator.plugin.ts +41 -35
  180. package/src/plugins/replicators/base-replicator.class.ts +17 -23
  181. package/src/plugins/spider/recker-link-discoverer.ts +645 -0
  182. package/src/plugins/spider/recker-llms-validator.ts +500 -0
  183. package/src/plugins/spider/recker-robots-validator.ts +473 -0
  184. package/src/plugins/spider/recker-security-adapter.ts +489 -0
  185. package/src/plugins/spider/recker-seo-adapter.ts +605 -0
  186. package/src/plugins/spider/recker-sitemap-validator.ts +621 -0
  187. package/src/resource.class.ts +2 -0
  188. package/src/stream/resource-reader.class.ts +10 -8
  189. package/src/stream/resource-writer.class.ts +10 -8
  190. package/src/tasks/tasks-pool.class.ts +46 -0
@@ -0,0 +1,243 @@
1
+ import { randomFillSync } from 'node:crypto';
2
+ const DEFAULT_POOL_SIZE = 2048;
3
+ const MIN_POOL_SIZE = 256;
4
+ let pool;
5
+ let poolOffset = 0;
6
+ /**
7
+ * Initialize or resize the entropy pool.
8
+ * Uses a pre-allocated buffer to reduce GC pressure and improve performance.
9
+ */
10
+ export function initPool(size = DEFAULT_POOL_SIZE) {
11
+ const actualSize = Math.max(size, MIN_POOL_SIZE);
12
+ pool = new Uint8Array(actualSize);
13
+ randomFillSync(pool);
14
+ poolOffset = 0;
15
+ }
16
+ /**
17
+ * Get cryptographically secure random bytes from the pool.
18
+ * Automatically refills the pool when exhausted.
19
+ */
20
+ export function getRandomBytes(count) {
21
+ if (!pool) {
22
+ initPool();
23
+ }
24
+ if (count > pool.length) {
25
+ const bytes = new Uint8Array(count);
26
+ randomFillSync(bytes);
27
+ return bytes;
28
+ }
29
+ if (poolOffset + count > pool.length) {
30
+ randomFillSync(pool);
31
+ poolOffset = 0;
32
+ }
33
+ const bytes = pool.slice(poolOffset, poolOffset + count);
34
+ poolOffset += count;
35
+ return bytes;
36
+ }
37
+ /**
38
+ * Fill a pre-allocated buffer with random bytes.
39
+ * More efficient than getRandomBytes when you already have a buffer.
40
+ */
41
+ export function fillRandomBytes(buffer) {
42
+ if (!pool) {
43
+ initPool();
44
+ }
45
+ const needed = buffer.length;
46
+ if (poolOffset + needed <= pool.length) {
47
+ buffer.set(pool.subarray(poolOffset, poolOffset + needed));
48
+ poolOffset += needed;
49
+ }
50
+ else {
51
+ const remaining = pool.length - poolOffset;
52
+ if (remaining > 0) {
53
+ buffer.set(pool.subarray(poolOffset, pool.length), 0);
54
+ }
55
+ randomFillSync(pool);
56
+ poolOffset = 0;
57
+ buffer.set(pool.subarray(0, needed - remaining), remaining);
58
+ poolOffset = needed - remaining;
59
+ }
60
+ return buffer;
61
+ }
62
+ /**
63
+ * Generate a random index into an alphabet using rejection sampling.
64
+ * This eliminates modulo bias for non-power-of-2 alphabet sizes.
65
+ *
66
+ * For an alphabet of size N, we find the largest multiple of N that fits
67
+ * in 256 (or 65536 for larger alphabets). Any random value >= that threshold
68
+ * is rejected and we try again.
69
+ *
70
+ * Example: For alphabet size 62:
71
+ * - threshold = 256 - (256 % 62) = 256 - 8 = 248
72
+ * - We accept bytes 0-247 (maps evenly to 0-61, 4 times each)
73
+ * - We reject bytes 248-255 (would cause bias)
74
+ * - Rejection rate: 8/256 = 3.125%
75
+ */
76
+ export function randomIndexUnbiased(alphabetSize) {
77
+ if (alphabetSize <= 0 || alphabetSize > 65536) {
78
+ throw new Error(`Invalid alphabet size: ${alphabetSize}. Must be 1-65536.`);
79
+ }
80
+ if (alphabetSize === 1) {
81
+ return 0;
82
+ }
83
+ if (alphabetSize <= 256) {
84
+ const threshold = 256 - (256 % alphabetSize);
85
+ let byte;
86
+ do {
87
+ const bytes = getRandomBytes(1);
88
+ byte = bytes[0];
89
+ } while (byte >= threshold);
90
+ return byte % alphabetSize;
91
+ }
92
+ const threshold = 65536 - (65536 % alphabetSize);
93
+ let value;
94
+ do {
95
+ const bytes = getRandomBytes(2);
96
+ value = (bytes[0] << 8) | bytes[1];
97
+ } while (value >= threshold);
98
+ return value % alphabetSize;
99
+ }
100
+ /**
101
+ * Generate multiple unbiased random indices efficiently.
102
+ * Pre-calculates rejection threshold and batches random byte generation.
103
+ */
104
+ export function randomIndicesUnbiased(alphabetSize, count) {
105
+ if (alphabetSize <= 0 || alphabetSize > 65536) {
106
+ throw new Error(`Invalid alphabet size: ${alphabetSize}. Must be 1-65536.`);
107
+ }
108
+ const result = new Uint16Array(count);
109
+ if (alphabetSize === 1) {
110
+ return result;
111
+ }
112
+ if (alphabetSize <= 256) {
113
+ const threshold = 256 - (256 % alphabetSize);
114
+ const estimatedBytes = Math.ceil(count * (256 / threshold) * 1.1);
115
+ let bytes = getRandomBytes(Math.max(estimatedBytes, count * 2));
116
+ let byteIndex = 0;
117
+ let resultIndex = 0;
118
+ while (resultIndex < count) {
119
+ if (byteIndex >= bytes.length) {
120
+ const extraBytes = getRandomBytes(Math.max(16, (count - resultIndex) * 2));
121
+ const newBytes = new Uint8Array(bytes.length + extraBytes.length);
122
+ newBytes.set(bytes);
123
+ newBytes.set(extraBytes, bytes.length);
124
+ bytes = newBytes;
125
+ byteIndex = 0;
126
+ }
127
+ const byte = bytes[byteIndex++];
128
+ if (byte < threshold) {
129
+ result[resultIndex++] = byte % alphabetSize;
130
+ }
131
+ }
132
+ return result;
133
+ }
134
+ const threshold = 65536 - (65536 % alphabetSize);
135
+ const estimatedBytes = Math.ceil(count * 2 * (65536 / threshold) * 1.1);
136
+ let bytes = getRandomBytes(Math.max(estimatedBytes, count * 4));
137
+ let byteIndex = 0;
138
+ let resultIndex = 0;
139
+ while (resultIndex < count) {
140
+ if (byteIndex + 1 >= bytes.length) {
141
+ const extraBytes = getRandomBytes(Math.max(32, (count - resultIndex) * 4));
142
+ const newBytes = new Uint8Array(bytes.length + extraBytes.length);
143
+ newBytes.set(bytes);
144
+ newBytes.set(extraBytes, bytes.length);
145
+ bytes = newBytes;
146
+ }
147
+ const value = (bytes[byteIndex] << 8) | bytes[byteIndex + 1];
148
+ byteIndex += 2;
149
+ if (value < threshold) {
150
+ result[resultIndex++] = value % alphabetSize;
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ /**
156
+ * Generate a string from an alphabet using unbiased random selection.
157
+ * This is the core function for generating IDs.
158
+ */
159
+ export function randomString(alphabet, length) {
160
+ const alphabetSize = alphabet.length;
161
+ const indices = randomIndicesUnbiased(alphabetSize, length);
162
+ let result = '';
163
+ for (let i = 0; i < length; i++) {
164
+ result += alphabet[indices[i]];
165
+ }
166
+ return result;
167
+ }
168
+ /**
169
+ * Generate a random 48-bit integer for timestamp-based IDs.
170
+ * Uses 6 bytes of entropy.
171
+ */
172
+ export function random48() {
173
+ const bytes = getRandomBytes(6);
174
+ return ((BigInt(bytes[0]) << 40n) |
175
+ (BigInt(bytes[1]) << 32n) |
176
+ (BigInt(bytes[2]) << 24n) |
177
+ (BigInt(bytes[3]) << 16n) |
178
+ (BigInt(bytes[4]) << 8n) |
179
+ BigInt(bytes[5]));
180
+ }
181
+ /**
182
+ * Generate a random 62-bit integer (fits in signed 64-bit).
183
+ * Uses 8 bytes of entropy with top 2 bits masked.
184
+ */
185
+ export function random62() {
186
+ const bytes = getRandomBytes(8);
187
+ return ((BigInt(bytes[0] & 0x3f) << 56n) |
188
+ (BigInt(bytes[1]) << 48n) |
189
+ (BigInt(bytes[2]) << 40n) |
190
+ (BigInt(bytes[3]) << 32n) |
191
+ (BigInt(bytes[4]) << 24n) |
192
+ (BigInt(bytes[5]) << 16n) |
193
+ (BigInt(bytes[6]) << 8n) |
194
+ BigInt(bytes[7]));
195
+ }
196
+ /**
197
+ * Generate a random 80-bit integer for ULID random component.
198
+ * Uses 10 bytes of entropy.
199
+ */
200
+ export function random80() {
201
+ const bytes = getRandomBytes(10);
202
+ let result = 0n;
203
+ for (let i = 0; i < 10; i++) {
204
+ result = (result << 8n) | BigInt(bytes[i]);
205
+ }
206
+ return result;
207
+ }
208
+ /**
209
+ * Calculate the entropy bits for a given alphabet size and ID length.
210
+ */
211
+ export function calculateEntropyBits(alphabetSize, length) {
212
+ return Math.log2(alphabetSize) * length;
213
+ }
214
+ /**
215
+ * Calculate the collision probability for a given number of IDs.
216
+ * Uses birthday paradox approximation: p ≈ n² / (2 * 2^bits)
217
+ */
218
+ export function calculateCollisionProbability(entropyBits, idCount) {
219
+ const totalCombinations = Math.pow(2, entropyBits);
220
+ return (idCount * idCount) / (2 * totalCombinations);
221
+ }
222
+ /**
223
+ * Reset the entropy pool (useful for testing).
224
+ */
225
+ export function resetPool() {
226
+ pool = undefined;
227
+ poolOffset = 0;
228
+ }
229
+ export default {
230
+ initPool,
231
+ getRandomBytes,
232
+ fillRandomBytes,
233
+ randomIndexUnbiased,
234
+ randomIndicesUnbiased,
235
+ randomString,
236
+ random48,
237
+ random62,
238
+ random80,
239
+ calculateEntropyBits,
240
+ calculateCollisionProbability,
241
+ resetPool
242
+ };
243
+ //# sourceMappingURL=entropy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entropy.js","sourceRoot":"","sources":["../../../src/concerns/id/entropy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { randomString, calculateEntropyBits } from '../entropy.js';
2
+ import { URL_SAFE, getAlphabet, validateAlphabet } from '../alphabets.js';
3
+ const DEFAULT_SIZE = 21;
4
+ /**
5
+ * Generate a nanoid-compatible ID.
6
+ * Default: 21 characters using URL-safe alphabet (126 bits of entropy).
7
+ *
8
+ * Unlike original nanoid which uses `bytes[i] & 63` (modulo bias for non-64 alphabets),
9
+ * this implementation uses rejection sampling for true uniform distribution.
10
+ */
11
+ export function nanoid(size = DEFAULT_SIZE) {
12
+ return randomString(URL_SAFE, size);
13
+ }
14
+ /**
15
+ * Create a custom nanoid generator with specified alphabet.
16
+ * Returns a function that generates IDs with that alphabet.
17
+ */
18
+ export function customAlphabet(alphabet, defaultSize = DEFAULT_SIZE) {
19
+ const error = validateAlphabet(alphabet);
20
+ if (error) {
21
+ throw new Error(`Invalid alphabet: ${error}`);
22
+ }
23
+ return (size = defaultSize) => {
24
+ return randomString(alphabet, size);
25
+ };
26
+ }
27
+ /**
28
+ * Create a custom nanoid generator with alphabet name.
29
+ * Supports: URL_SAFE, ALPHANUMERIC, BASE58, HEX_LOWER, etc.
30
+ */
31
+ export function customAlphabetByName(name, defaultSize = DEFAULT_SIZE) {
32
+ const alphabet = getAlphabet(name);
33
+ return customAlphabet(alphabet, defaultSize);
34
+ }
35
+ /**
36
+ * Generate a nanoid with options object.
37
+ */
38
+ export function nanoidWithOptions(options = {}) {
39
+ const { alphabet = URL_SAFE, size = DEFAULT_SIZE } = options;
40
+ const resolvedAlphabet = getAlphabet(alphabet);
41
+ const error = validateAlphabet(resolvedAlphabet);
42
+ if (error) {
43
+ throw new Error(`Invalid alphabet: ${error}`);
44
+ }
45
+ return randomString(resolvedAlphabet, size);
46
+ }
47
+ /**
48
+ * Calculate entropy bits for a nanoid configuration.
49
+ */
50
+ export function nanoidEntropyBits(alphabet = URL_SAFE, size = DEFAULT_SIZE) {
51
+ const resolvedAlphabet = getAlphabet(alphabet);
52
+ return calculateEntropyBits(resolvedAlphabet.length, size);
53
+ }
54
+ /**
55
+ * Async version for compatibility with original nanoid/async.
56
+ * Note: Our implementation is already synchronous and fast,
57
+ * this is just for API compatibility.
58
+ */
59
+ export async function nanoidAsync(size = DEFAULT_SIZE) {
60
+ return nanoid(size);
61
+ }
62
+ /**
63
+ * Async version with custom alphabet.
64
+ */
65
+ export function customAlphabetAsync(alphabet, defaultSize = DEFAULT_SIZE) {
66
+ const syncFn = customAlphabet(alphabet, defaultSize);
67
+ return async (size) => syncFn(size);
68
+ }
69
+ /**
70
+ * URL-safe ID shorthand (backward compatibility).
71
+ */
72
+ export const urlAlphabet = URL_SAFE;
73
+ export default nanoid;
74
+ //# sourceMappingURL=nanoid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nanoid.js","sourceRoot":"","sources":["../../../../src/concerns/id/generators/nanoid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,YAAY,GAAG,EAAE,CAAC;AAOxB;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,OAAe,YAAY;IAChD,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,cAAsB,YAAY;IACjF,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,OAAe,WAAW,EAAU,EAAE;QAC5C,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,cAAsB,YAAY;IACnF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAyB,EAAE;IAC3D,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,WAAmB,QAAQ,EAAE,OAAe,YAAY;IACxF,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,YAAY;IAC3D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,cAAsB,YAAY;IACtF,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrD,OAAO,KAAK,EAAE,IAAa,EAAmB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAEpC,eAAe,MAAM,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { randomString, calculateEntropyBits } from '../entropy.js';
2
+ import { URL_SAFE, getAlphabet, validateAlphabet } from '../alphabets.js';
3
+ const DEFAULT_SIZE = 21;
4
+ /**
5
+ * Generate a short unique ID (s3db id).
6
+ * Default: 21 characters using URL-safe alphabet (126 bits of entropy).
7
+ *
8
+ * Uses rejection sampling for true uniform distribution (zero modulo bias).
9
+ */
10
+ export function sid(size = DEFAULT_SIZE) {
11
+ return randomString(URL_SAFE, size);
12
+ }
13
+ /**
14
+ * Create a custom sid generator with specified alphabet.
15
+ * Returns a function that generates IDs with that alphabet.
16
+ */
17
+ export function customAlphabet(alphabet, defaultSize = DEFAULT_SIZE) {
18
+ const error = validateAlphabet(alphabet);
19
+ if (error) {
20
+ throw new Error(`Invalid alphabet: ${error}`);
21
+ }
22
+ return (size = defaultSize) => {
23
+ return randomString(alphabet, size);
24
+ };
25
+ }
26
+ /**
27
+ * Create a custom sid generator with alphabet name.
28
+ * Supports: URL_SAFE, ALPHANUMERIC, BASE58, HEX_LOWER, etc.
29
+ */
30
+ export function customAlphabetByName(name, defaultSize = DEFAULT_SIZE) {
31
+ const alphabet = getAlphabet(name);
32
+ return customAlphabet(alphabet, defaultSize);
33
+ }
34
+ /**
35
+ * Generate a sid with options object.
36
+ */
37
+ export function sidWithOptions(options = {}) {
38
+ const { alphabet = URL_SAFE, size = DEFAULT_SIZE } = options;
39
+ const resolvedAlphabet = getAlphabet(alphabet);
40
+ const error = validateAlphabet(resolvedAlphabet);
41
+ if (error) {
42
+ throw new Error(`Invalid alphabet: ${error}`);
43
+ }
44
+ return randomString(resolvedAlphabet, size);
45
+ }
46
+ /**
47
+ * Calculate entropy bits for a sid configuration.
48
+ */
49
+ export function sidEntropyBits(alphabet = URL_SAFE, size = DEFAULT_SIZE) {
50
+ const resolvedAlphabet = getAlphabet(alphabet);
51
+ return calculateEntropyBits(resolvedAlphabet.length, size);
52
+ }
53
+ /**
54
+ * Async version for compatibility.
55
+ * Note: Our implementation is already synchronous and fast,
56
+ * this is just for API compatibility.
57
+ */
58
+ export async function sidAsync(size = DEFAULT_SIZE) {
59
+ return sid(size);
60
+ }
61
+ /**
62
+ * Async version with custom alphabet.
63
+ */
64
+ export function customAlphabetAsync(alphabet, defaultSize = DEFAULT_SIZE) {
65
+ const syncFn = customAlphabet(alphabet, defaultSize);
66
+ return async (size) => syncFn(size);
67
+ }
68
+ /**
69
+ * URL-safe alphabet constant.
70
+ */
71
+ export const urlAlphabet = URL_SAFE;
72
+ export default sid;
73
+ //# sourceMappingURL=sid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sid.js","sourceRoot":"","sources":["../../../../src/concerns/id/generators/sid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,YAAY,GAAG,EAAE,CAAC;AAOxB;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,OAAe,YAAY;IAC7C,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,cAAsB,YAAY;IACjF,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,OAAe,WAAW,EAAU,EAAE;QAC5C,OAAO,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,cAAsB,YAAY;IACnF,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACnC,OAAO,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAsB,EAAE;IACrD,MAAM,EAAE,QAAQ,GAAG,QAAQ,EAAE,IAAI,GAAG,YAAY,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAE/C,MAAM,KAAK,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;IACjD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,KAAK,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,YAAY,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,QAAQ,EAAE,OAAe,YAAY;IACrF,MAAM,gBAAgB,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,OAAO,oBAAoB,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAe,YAAY;IACxD,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,cAAsB,YAAY;IACtF,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACrD,OAAO,KAAK,EAAE,IAAa,EAAmB,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAEpC,eAAe,GAAG,CAAC"}
@@ -0,0 +1,208 @@
1
+ import { random80 } from '../entropy.js';
2
+ import { CROCKFORD_BASE32 } from '../alphabets.js';
3
+ const ENCODING = CROCKFORD_BASE32;
4
+ const ENCODING_LEN = ENCODING.length;
5
+ const TIME_LEN = 10;
6
+ const RANDOM_LEN = 16;
7
+ const ULID_LEN = TIME_LEN + RANDOM_LEN;
8
+ const TIME_MAX = Math.pow(2, 48) - 1;
9
+ let lastTime = 0;
10
+ let lastRandom = 0n;
11
+ /**
12
+ * Generate a ULID (Universally Unique Lexicographically Sortable Identifier).
13
+ *
14
+ * Structure (128 bits total):
15
+ * - 48 bits: Unix timestamp in milliseconds (encoded as 10 Crockford Base32 chars)
16
+ * - 80 bits: Random (encoded as 16 Crockford Base32 chars)
17
+ *
18
+ * Format: TTTTTTTTTTRRRRRRRRRRRRRRRRR (26 characters)
19
+ *
20
+ * Features:
21
+ * - Lexicographically sortable by timestamp
22
+ * - Case insensitive
23
+ * - No special characters (URL safe)
24
+ * - 1.21e+24 unique ULIDs per millisecond
25
+ *
26
+ * Monotonic: If called multiple times within the same millisecond,
27
+ * the random component is incremented to ensure sortability.
28
+ */
29
+ export function ulid(timestamp) {
30
+ const now = timestamp ?? Date.now();
31
+ if (now > TIME_MAX) {
32
+ throw new Error('ULID timestamp overflow: timestamp exceeds 48 bits');
33
+ }
34
+ let randomPart;
35
+ if (now === lastTime) {
36
+ lastRandom += 1n;
37
+ if (lastRandom > 0xffffffffffffffffffffn) {
38
+ throw new Error('ULID random overflow: too many ULIDs in same millisecond');
39
+ }
40
+ randomPart = lastRandom;
41
+ }
42
+ else {
43
+ randomPart = random80();
44
+ lastTime = now;
45
+ lastRandom = randomPart;
46
+ }
47
+ return encodeTime(now) + encodeRandom(randomPart);
48
+ }
49
+ /**
50
+ * Generate a non-monotonic ULID.
51
+ * Does not increment random part for same-millisecond calls.
52
+ * Use when strict sortability within millisecond is not required.
53
+ */
54
+ export function ulidNonMonotonic(timestamp) {
55
+ const now = timestamp ?? Date.now();
56
+ if (now > TIME_MAX) {
57
+ throw new Error('ULID timestamp overflow: timestamp exceeds 48 bits');
58
+ }
59
+ return encodeTime(now) + encodeRandom(random80());
60
+ }
61
+ /**
62
+ * Encode timestamp to Crockford Base32 (10 characters).
63
+ */
64
+ function encodeTime(timestamp) {
65
+ let time = timestamp;
66
+ let str = '';
67
+ for (let i = TIME_LEN - 1; i >= 0; i--) {
68
+ const mod = time % ENCODING_LEN;
69
+ str = ENCODING[mod] + str;
70
+ time = Math.floor(time / ENCODING_LEN);
71
+ }
72
+ return str;
73
+ }
74
+ /**
75
+ * Encode random 80-bit value to Crockford Base32 (16 characters).
76
+ */
77
+ function encodeRandom(random) {
78
+ let str = '';
79
+ for (let i = RANDOM_LEN - 1; i >= 0; i--) {
80
+ const mod = Number(random % BigInt(ENCODING_LEN));
81
+ str = ENCODING[mod] + str;
82
+ random = random / BigInt(ENCODING_LEN);
83
+ }
84
+ return str;
85
+ }
86
+ /**
87
+ * Decode a ULID timestamp to milliseconds.
88
+ */
89
+ export function decodeTime(id) {
90
+ if (id.length !== ULID_LEN) {
91
+ throw new Error(`Invalid ULID length: expected ${ULID_LEN}, got ${id.length}`);
92
+ }
93
+ const timeStr = id.slice(0, TIME_LEN).toUpperCase();
94
+ let time = 0;
95
+ for (let i = 0; i < TIME_LEN; i++) {
96
+ const char = timeStr[i];
97
+ const index = ENCODING.indexOf(char);
98
+ if (index === -1) {
99
+ throw new Error(`Invalid ULID character: ${char}`);
100
+ }
101
+ time = time * ENCODING_LEN + index;
102
+ }
103
+ return time;
104
+ }
105
+ /**
106
+ * Decode a ULID to Date object.
107
+ */
108
+ export function decodeDate(id) {
109
+ return new Date(decodeTime(id));
110
+ }
111
+ /**
112
+ * Validate if a string is a valid ULID.
113
+ */
114
+ export function isValidUlid(id) {
115
+ if (id.length !== ULID_LEN) {
116
+ return false;
117
+ }
118
+ const upper = id.toUpperCase();
119
+ for (const char of upper) {
120
+ if (!ENCODING.includes(char)) {
121
+ return false;
122
+ }
123
+ }
124
+ return true;
125
+ }
126
+ /**
127
+ * Convert ULID to UUID format.
128
+ * Returns a UUID string representation of the ULID bytes.
129
+ */
130
+ export function ulidToUuid(id) {
131
+ const bytes = ulidToBytes(id);
132
+ const hex = Array.from(bytes)
133
+ .map(b => b.toString(16).padStart(2, '0'))
134
+ .join('');
135
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
136
+ }
137
+ /**
138
+ * Convert ULID to byte array.
139
+ */
140
+ export function ulidToBytes(id) {
141
+ if (id.length !== ULID_LEN) {
142
+ throw new Error(`Invalid ULID length: expected ${ULID_LEN}, got ${id.length}`);
143
+ }
144
+ const upper = id.toUpperCase();
145
+ const bytes = new Uint8Array(16);
146
+ let value = 0n;
147
+ for (let i = 0; i < ULID_LEN; i++) {
148
+ const char = upper[i];
149
+ const index = ENCODING.indexOf(char);
150
+ if (index === -1) {
151
+ throw new Error(`Invalid ULID character: ${char}`);
152
+ }
153
+ value = value * BigInt(ENCODING_LEN) + BigInt(index);
154
+ }
155
+ for (let i = 15; i >= 0; i--) {
156
+ bytes[i] = Number(value & 0xffn);
157
+ value = value >> 8n;
158
+ }
159
+ return bytes;
160
+ }
161
+ /**
162
+ * Convert byte array to ULID.
163
+ */
164
+ export function bytesToUlid(bytes) {
165
+ if (bytes.length !== 16) {
166
+ throw new Error(`Invalid byte array length: expected 16, got ${bytes.length}`);
167
+ }
168
+ let value = 0n;
169
+ for (let i = 0; i < 16; i++) {
170
+ value = (value << 8n) | BigInt(bytes[i]);
171
+ }
172
+ let result = '';
173
+ for (let i = 0; i < ULID_LEN; i++) {
174
+ result = ENCODING[Number(value % BigInt(ENCODING_LEN))] + result;
175
+ value = value / BigInt(ENCODING_LEN);
176
+ }
177
+ return result;
178
+ }
179
+ /**
180
+ * Compare two ULIDs for sorting.
181
+ * Returns negative if a < b, positive if a > b, 0 if equal.
182
+ */
183
+ export function compareUlid(a, b) {
184
+ return a.toUpperCase().localeCompare(b.toUpperCase());
185
+ }
186
+ /**
187
+ * Generate minimum ULID for a given timestamp.
188
+ * Useful for range queries: "all ULIDs after timestamp X"
189
+ */
190
+ export function minUlidForTime(timestamp) {
191
+ return encodeTime(timestamp) + '0'.repeat(RANDOM_LEN);
192
+ }
193
+ /**
194
+ * Generate maximum ULID for a given timestamp.
195
+ * Useful for range queries: "all ULIDs before timestamp X"
196
+ */
197
+ export function maxUlidForTime(timestamp) {
198
+ return encodeTime(timestamp) + 'Z'.repeat(RANDOM_LEN);
199
+ }
200
+ /**
201
+ * Reset monotonic state (useful for testing).
202
+ */
203
+ export function resetMonotonic() {
204
+ lastTime = 0;
205
+ lastRandom = 0n;
206
+ }
207
+ export default ulid;
208
+ //# sourceMappingURL=ulid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ulid.js","sourceRoot":"","sources":["../../../../src/concerns/id/generators/ulid.ts"],"names":[],"mappings":"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"}