@vercel/kv2 0.0.1

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 (166) hide show
  1. package/README.md +87 -0
  2. package/SKILL.md +65 -0
  3. package/dist/blob-format.d.ts +35 -0
  4. package/dist/blob-format.d.ts.map +1 -0
  5. package/dist/blob-format.js +91 -0
  6. package/dist/blob-format.js.map +1 -0
  7. package/dist/blob-store.d.ts +11 -0
  8. package/dist/blob-store.d.ts.map +1 -0
  9. package/dist/blob-store.js +32 -0
  10. package/dist/blob-store.js.map +1 -0
  11. package/dist/cache.d.ts +33 -0
  12. package/dist/cache.d.ts.map +1 -0
  13. package/dist/cache.js +146 -0
  14. package/dist/cache.js.map +1 -0
  15. package/dist/cached-kv.d.ts +63 -0
  16. package/dist/cached-kv.d.ts.map +1 -0
  17. package/dist/cached-kv.js +891 -0
  18. package/dist/cached-kv.js.map +1 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +342 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/create-kv.d.ts +86 -0
  24. package/dist/create-kv.d.ts.map +1 -0
  25. package/dist/create-kv.js +125 -0
  26. package/dist/create-kv.js.map +1 -0
  27. package/dist/disk-cache.d.ts.map +1 -0
  28. package/dist/disk-cache.js.map +1 -0
  29. package/dist/index.d.ts +16 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +13 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/indexed-kv.d.ts +44 -0
  34. package/dist/indexed-kv.d.ts.map +1 -0
  35. package/dist/indexed-kv.js +373 -0
  36. package/dist/indexed-kv.js.map +1 -0
  37. package/dist/manifest-log.d.ts +57 -0
  38. package/dist/manifest-log.d.ts.map +1 -0
  39. package/dist/manifest-log.js +128 -0
  40. package/dist/manifest-log.js.map +1 -0
  41. package/dist/memory-cache.d.ts +22 -0
  42. package/dist/memory-cache.d.ts.map +1 -0
  43. package/dist/memory-cache.js +90 -0
  44. package/dist/memory-cache.js.map +1 -0
  45. package/dist/proxy-cache.d.ts +40 -0
  46. package/dist/proxy-cache.d.ts.map +1 -0
  47. package/dist/proxy-cache.js +124 -0
  48. package/dist/proxy-cache.js.map +1 -0
  49. package/dist/readme.test.d.ts +9 -0
  50. package/dist/readme.test.d.ts.map +1 -0
  51. package/dist/readme.test.js +285 -0
  52. package/dist/readme.test.js.map +1 -0
  53. package/dist/schema/define-schema.d.ts +35 -0
  54. package/dist/schema/define-schema.d.ts.map +1 -0
  55. package/dist/schema/define-schema.js +70 -0
  56. package/dist/schema/define-schema.js.map +1 -0
  57. package/dist/schema/index.d.ts +4 -0
  58. package/dist/schema/index.d.ts.map +1 -0
  59. package/dist/schema/index.js +5 -0
  60. package/dist/schema/index.js.map +1 -0
  61. package/dist/schema/key-builders.d.ts +40 -0
  62. package/dist/schema/key-builders.d.ts.map +1 -0
  63. package/dist/schema/key-builders.js +124 -0
  64. package/dist/schema/key-builders.js.map +1 -0
  65. package/dist/schema/schema-kv.d.ts +48 -0
  66. package/dist/schema/schema-kv.d.ts.map +1 -0
  67. package/dist/schema/schema-kv.js +96 -0
  68. package/dist/schema/schema-kv.js.map +1 -0
  69. package/dist/schema/tree.d.ts +14 -0
  70. package/dist/schema/tree.d.ts.map +1 -0
  71. package/dist/schema/tree.js +135 -0
  72. package/dist/schema/tree.js.map +1 -0
  73. package/dist/schema/types.d.ts +135 -0
  74. package/dist/schema/types.d.ts.map +1 -0
  75. package/dist/schema/types.js +2 -0
  76. package/dist/schema/types.js.map +1 -0
  77. package/dist/testing/core-tests.d.ts +30 -0
  78. package/dist/testing/core-tests.d.ts.map +1 -0
  79. package/dist/testing/core-tests.js +383 -0
  80. package/dist/testing/core-tests.js.map +1 -0
  81. package/dist/testing/create-kv-test-setup.d.ts +21 -0
  82. package/dist/testing/create-kv-test-setup.d.ts.map +1 -0
  83. package/dist/testing/create-kv-test-setup.js +25 -0
  84. package/dist/testing/create-kv-test-setup.js.map +1 -0
  85. package/dist/testing/debug-manifest.d.ts +2 -0
  86. package/dist/testing/debug-manifest.d.ts.map +1 -0
  87. package/dist/testing/debug-manifest.js +14 -0
  88. package/dist/testing/debug-manifest.js.map +1 -0
  89. package/dist/testing/fake-blob-store.d.ts +23 -0
  90. package/dist/testing/fake-blob-store.d.ts.map +1 -0
  91. package/dist/testing/fake-blob-store.js +158 -0
  92. package/dist/testing/fake-blob-store.js.map +1 -0
  93. package/dist/testing/fake-cache.d.ts +54 -0
  94. package/dist/testing/fake-cache.d.ts.map +1 -0
  95. package/dist/testing/fake-cache.js +137 -0
  96. package/dist/testing/fake-cache.js.map +1 -0
  97. package/dist/testing/index.d.ts +34 -0
  98. package/dist/testing/index.d.ts.map +1 -0
  99. package/dist/testing/index.js +101 -0
  100. package/dist/testing/index.js.map +1 -0
  101. package/dist/testing/manifest-test-setup.d.ts +22 -0
  102. package/dist/testing/manifest-test-setup.d.ts.map +1 -0
  103. package/dist/testing/manifest-test-setup.js +43 -0
  104. package/dist/testing/manifest-test-setup.js.map +1 -0
  105. package/dist/testing/perf-test.d.ts +13 -0
  106. package/dist/testing/perf-test.d.ts.map +1 -0
  107. package/dist/testing/perf-test.js +101 -0
  108. package/dist/testing/perf-test.js.map +1 -0
  109. package/dist/testing/run-tests.d.ts +2 -0
  110. package/dist/testing/run-tests.d.ts.map +1 -0
  111. package/dist/testing/run-tests.js +141 -0
  112. package/dist/testing/run-tests.js.map +1 -0
  113. package/dist/testing/setup.d.ts +2 -0
  114. package/dist/testing/setup.d.ts.map +1 -0
  115. package/dist/testing/setup.js +3 -0
  116. package/dist/testing/setup.js.map +1 -0
  117. package/dist/testing/test-index.d.ts +28 -0
  118. package/dist/testing/test-index.d.ts.map +1 -0
  119. package/dist/testing/test-index.js +35 -0
  120. package/dist/testing/test-index.js.map +1 -0
  121. package/dist/testing/test-setup.d.ts +32 -0
  122. package/dist/testing/test-setup.d.ts.map +1 -0
  123. package/dist/testing/test-setup.js +72 -0
  124. package/dist/testing/test-setup.js.map +1 -0
  125. package/dist/testing/upstream-kv-test-setup.d.ts +30 -0
  126. package/dist/testing/upstream-kv-test-setup.d.ts.map +1 -0
  127. package/dist/testing/upstream-kv-test-setup.js +66 -0
  128. package/dist/testing/upstream-kv-test-setup.js.map +1 -0
  129. package/dist/testing/vitest-compat.d.ts +92 -0
  130. package/dist/testing/vitest-compat.d.ts.map +1 -0
  131. package/dist/testing/vitest-compat.js +601 -0
  132. package/dist/testing/vitest-compat.js.map +1 -0
  133. package/dist/tracing.d.ts +71 -0
  134. package/dist/tracing.d.ts.map +1 -0
  135. package/dist/tracing.js +232 -0
  136. package/dist/tracing.js.map +1 -0
  137. package/dist/typed-kv.d.ts +120 -0
  138. package/dist/typed-kv.d.ts.map +1 -0
  139. package/dist/typed-kv.js +565 -0
  140. package/dist/typed-kv.js.map +1 -0
  141. package/dist/typed-upstream-kv.d.ts +17 -0
  142. package/dist/typed-upstream-kv.d.ts.map +1 -0
  143. package/dist/typed-upstream-kv.js +38 -0
  144. package/dist/typed-upstream-kv.js.map +1 -0
  145. package/dist/types.d.ts +199 -0
  146. package/dist/types.d.ts.map +1 -0
  147. package/dist/types.js +23 -0
  148. package/dist/types.js.map +1 -0
  149. package/dist/upstream-kv.d.ts +84 -0
  150. package/dist/upstream-kv.d.ts.map +1 -0
  151. package/dist/upstream-kv.js +375 -0
  152. package/dist/upstream-kv.js.map +1 -0
  153. package/docs/api-reference.md +222 -0
  154. package/docs/caching.md +60 -0
  155. package/docs/cli.md +123 -0
  156. package/docs/copy-on-write-branches.md +98 -0
  157. package/docs/getting-started.md +61 -0
  158. package/docs/indexes.md +122 -0
  159. package/docs/iterating-and-pagination.md +93 -0
  160. package/docs/metadata.md +82 -0
  161. package/docs/optimistic-locking.md +72 -0
  162. package/docs/schema-and-trees.md +222 -0
  163. package/docs/streaming.md +61 -0
  164. package/docs/testing-and-tracing.md +141 -0
  165. package/docs/typed-stores.md +68 -0
  166. package/package.json +63 -0
@@ -0,0 +1,565 @@
1
+ import { KVIndexConflictError } from "./types.js";
2
+ const VALUE_SUFFIX = ".value";
3
+ const INDEX_PREFIX = "__idx/";
4
+ function normalizeIndexKeys(raw) {
5
+ return Array.isArray(raw) ? raw : [raw];
6
+ }
7
+ function isIndexQuery(filter) {
8
+ return typeof filter === "object" && filter !== null;
9
+ }
10
+ function parseIndexQuery(filter) {
11
+ const entries = Object.entries(filter);
12
+ if (entries.length !== 1) {
13
+ throw new Error(`Index query must have exactly one key, got ${entries.length}`);
14
+ }
15
+ return entries[0];
16
+ }
17
+ const NOT_FOUND = {
18
+ exists: false,
19
+ metadata: undefined,
20
+ value: undefined,
21
+ stream: undefined,
22
+ };
23
+ /**
24
+ * A typed sub-store that wraps any KVLike (KV2 or UpstreamKV) with a prefix.
25
+ *
26
+ * TypedKV implements KVLike, so it can be nested via getStore() to create
27
+ * hierarchical key structures.
28
+ *
29
+ * Optionally supports secondary indexes: pass an `indexes` record to
30
+ * `getStore()` or the constructor to auto-maintain index entries on set/delete.
31
+ *
32
+ * @typeParam V - Value type
33
+ * @typeParam M - Metadata type (undefined = no metadata)
34
+ * @typeParam I - Union of index names (never = no indexes)
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const kv = createKV({ prefix: "app/" });
39
+ *
40
+ * // Sub-store with indexes
41
+ * const usersKV = kv.getStore<User>("users/", {
42
+ * byEmail: { key: (u) => u.email, unique: true },
43
+ * byRole: { key: (u) => u.role },
44
+ * });
45
+ *
46
+ * await usersKV.set("alice", { email: "a@b.com", role: "admin" });
47
+ * const user = await usersKV.get({ byEmail: "a@b.com" });
48
+ * for await (const key of usersKV.keys({ byRole: "admin" })) { ... }
49
+ * ```
50
+ */
51
+ export class TypedKV {
52
+ parent;
53
+ prefix;
54
+ indexes;
55
+ indexStores;
56
+ constructor(parent, prefix, indexes) {
57
+ if (prefix.endsWith(VALUE_SUFFIX)) {
58
+ throw new Error(`Store prefix cannot end with "${VALUE_SUFFIX}": ${prefix}`);
59
+ }
60
+ this.parent = parent;
61
+ this.prefix = prefix;
62
+ if (indexes && Object.keys(indexes).length > 0) {
63
+ this.indexes = indexes;
64
+ this.indexStores = {};
65
+ for (const name of Object.keys(indexes)) {
66
+ this.indexStores[name] = new TypedKV(parent, `${INDEX_PREFIX}${prefix}${name}/`);
67
+ }
68
+ }
69
+ }
70
+ prefixKey(key) {
71
+ return `${this.prefix}${key}`;
72
+ }
73
+ /**
74
+ * Get by primary key or by unique index.
75
+ *
76
+ * @example
77
+ * ```ts
78
+ * // By primary key
79
+ * const result = await store.get("page/123");
80
+ *
81
+ * // By unique index
82
+ * const result = await store.get({ bySlug: "hello-world" });
83
+ * ```
84
+ */
85
+ async get(keyOrFilter) {
86
+ if (isIndexQuery(keyOrFilter)) {
87
+ return this.getByIndex(keyOrFilter);
88
+ }
89
+ return this.parent.get(this.prefixKey(keyOrFilter));
90
+ }
91
+ async set(key, value, ...[metadata, options]) {
92
+ if (!this.indexes) {
93
+ return this.parent.set(this.prefixKey(key), value, metadata, options);
94
+ }
95
+ // --- Index-aware write path ---
96
+ const v = value;
97
+ // 1. Read old entry to determine old index keys
98
+ const oldResult = await this.parent.get(this.prefixKey(key));
99
+ const oldValue = oldResult.exists ? await oldResult.value : undefined;
100
+ // 2. Check unique constraints for new index keys that changed
101
+ for (const [name, def] of Object.entries(this.indexes)) {
102
+ if (!def.unique)
103
+ continue;
104
+ const newKeys = normalizeIndexKeys(def.key(v, key));
105
+ const oldKeys = oldValue
106
+ ? normalizeIndexKeys(def.key(oldValue, key))
107
+ : [];
108
+ const oldSet = new Set(oldKeys);
109
+ for (const newKey of newKeys) {
110
+ if (oldSet.has(newKey))
111
+ continue;
112
+ const existing = await this.indexStores[name].get(newKey);
113
+ if (existing.exists) {
114
+ const existingPK = await existing.value;
115
+ if (existingPK !== key) {
116
+ throw new KVIndexConflictError(name, newKey);
117
+ }
118
+ }
119
+ }
120
+ }
121
+ // 3. Write all index entries concurrently (throw on failure — before
122
+ // main entry is written, so a failed index write means clean state).
123
+ // If main write later fails, orphan indexes self-heal on read.
124
+ const indexOps = [];
125
+ for (const [name, def] of Object.entries(this.indexes)) {
126
+ const newKeys = normalizeIndexKeys(def.key(v, key));
127
+ const oldKeys = oldValue
128
+ ? normalizeIndexKeys(def.key(oldValue, key))
129
+ : [];
130
+ const newSet = new Set(newKeys);
131
+ const oldSet = new Set(oldKeys);
132
+ const indexStore = this.indexStores[name];
133
+ const isUnique = def.unique ?? false;
134
+ for (const oldKey of oldKeys) {
135
+ if (!newSet.has(oldKey)) {
136
+ if (isUnique) {
137
+ indexOps.push(indexStore.delete(oldKey));
138
+ }
139
+ else {
140
+ indexOps.push(indexStore.delete(`${oldKey}/${key}`));
141
+ }
142
+ }
143
+ }
144
+ for (const newKey of newKeys) {
145
+ if (!oldSet.has(newKey)) {
146
+ if (isUnique) {
147
+ indexOps.push(indexStore.set(newKey, key));
148
+ }
149
+ else {
150
+ indexOps.push(indexStore.set(`${newKey}/${key}`, key));
151
+ }
152
+ }
153
+ }
154
+ }
155
+ await Promise.all(indexOps);
156
+ // 4. Write main entry last
157
+ return this.parent.set(this.prefixKey(key), value, metadata, options);
158
+ }
159
+ async delete(key) {
160
+ if (!this.indexes) {
161
+ return this.parent.delete(this.prefixKey(key));
162
+ }
163
+ // --- Index-aware delete path ---
164
+ const result = await this.parent.get(this.prefixKey(key));
165
+ if (!result.exists)
166
+ return;
167
+ const value = await result.value;
168
+ await this.parent.delete(this.prefixKey(key));
169
+ // Delete all index entries concurrently (fire-and-forget — orphans self-heal on read)
170
+ const deleteOps = [];
171
+ for (const [name, def] of Object.entries(this.indexes)) {
172
+ const keys = normalizeIndexKeys(def.key(value, key));
173
+ const indexStore = this.indexStores[name];
174
+ const isUnique = def.unique ?? false;
175
+ for (const indexKey of keys) {
176
+ if (isUnique) {
177
+ deleteOps.push(indexStore.delete(indexKey).catch(() => { }));
178
+ }
179
+ else {
180
+ deleteOps.push(indexStore.delete(`${indexKey}/${key}`).catch(() => { }));
181
+ }
182
+ }
183
+ }
184
+ await Promise.all(deleteOps);
185
+ }
186
+ /**
187
+ * List keys by prefix or by index.
188
+ *
189
+ * @example
190
+ * ```ts
191
+ * // All keys
192
+ * for await (const key of store.keys()) { ... }
193
+ *
194
+ * // By prefix
195
+ * for await (const key of store.keys("page/")) { ... }
196
+ *
197
+ * // By index
198
+ * for await (const key of store.keys({ byStatus: "draft" })) { ... }
199
+ * ```
200
+ */
201
+ keys(filter) {
202
+ if (isIndexQuery(filter)) {
203
+ return this.keysByIndex(filter);
204
+ }
205
+ return this.keysByPrefix(filter);
206
+ }
207
+ /**
208
+ * List entries by prefix or by index.
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * // All entries
213
+ * for await (const [key, entry] of store.entries()) { ... }
214
+ *
215
+ * // By index
216
+ * const { entries } = await store.entries({ byStatus: "draft" }).page(20);
217
+ * ```
218
+ */
219
+ entries(filter) {
220
+ if (isIndexQuery(filter)) {
221
+ return this.entriesByIndex(filter);
222
+ }
223
+ return this.entriesByPrefix(filter);
224
+ }
225
+ async getMany(keys, concurrency) {
226
+ const prefixedKeys = keys.map((k) => this.prefixKey(k));
227
+ const results = await this.parent.getMany(prefixedKeys, concurrency);
228
+ const strippedResults = new Map();
229
+ for (const [key, entry] of results) {
230
+ if (key.startsWith(this.prefix)) {
231
+ strippedResults.set(key.slice(this.prefix.length), entry);
232
+ }
233
+ }
234
+ return strippedResults;
235
+ }
236
+ /**
237
+ * List only direct children (keys without "/" after the optional prefix).
238
+ */
239
+ async *keysShallow(prefix) {
240
+ const searchPrefix = prefix ?? "";
241
+ for await (const key of this.keys(searchPrefix)) {
242
+ const suffix = key.slice(searchPrefix.length);
243
+ if (!suffix.includes("/")) {
244
+ yield key;
245
+ }
246
+ }
247
+ }
248
+ /**
249
+ * Create a nested sub-store with an accumulated prefix.
250
+ * Pass `indexes` to enable secondary index maintenance.
251
+ */
252
+ getStore(subPrefix, indexes) {
253
+ return new TypedKV(this.parent, this.prefix + subPrefix, indexes);
254
+ }
255
+ /**
256
+ * Rebuild index entries by scanning all data. Idempotent.
257
+ * Use after adding a new index to an existing store.
258
+ *
259
+ * @param indexName - Specific index to rebuild, or omit for all indexes.
260
+ * @returns Number of entries indexed.
261
+ */
262
+ async reindex(indexName) {
263
+ if (!this.indexes) {
264
+ throw new Error("No indexes defined on this store");
265
+ }
266
+ const toReindex = indexName
267
+ ? { [indexName]: this.indexes[indexName] }
268
+ : this.indexes;
269
+ let count = 0;
270
+ for await (const [key, entry] of this.entriesByPrefix()) {
271
+ const value = (await entry.value);
272
+ const ops = [];
273
+ for (const [name, def] of Object.entries(toReindex)) {
274
+ if (!def)
275
+ continue;
276
+ const indexKeys = normalizeIndexKeys(def.key(value, key));
277
+ const indexStore = this.indexStores[name];
278
+ const isUnique = def.unique ?? false;
279
+ for (const indexKey of indexKeys) {
280
+ if (isUnique) {
281
+ ops.push(indexStore.set(indexKey, key));
282
+ }
283
+ else {
284
+ ops.push(indexStore.set(`${indexKey}/${key}`, key));
285
+ }
286
+ }
287
+ }
288
+ await Promise.all(ops);
289
+ count++;
290
+ }
291
+ return { indexed: count };
292
+ }
293
+ // =========================================================================
294
+ // Private: prefix-based scan (original keys/entries behavior)
295
+ // =========================================================================
296
+ keysByPrefix(prefix) {
297
+ const self = this;
298
+ const fullPrefix = this.prefixKey(prefix ?? "");
299
+ return {
300
+ async *[Symbol.asyncIterator]() {
301
+ for await (const key of self.parent.keys(fullPrefix)) {
302
+ if (key.startsWith(self.prefix)) {
303
+ yield key.slice(self.prefix.length);
304
+ }
305
+ }
306
+ },
307
+ async page(limit, cursor) {
308
+ const { keys, cursor: nextCursor } = await self.parent
309
+ .keys(fullPrefix)
310
+ .page(limit, cursor);
311
+ const strippedKeys = keys
312
+ .filter((key) => key.startsWith(self.prefix))
313
+ .map((key) => key.slice(self.prefix.length));
314
+ return { keys: strippedKeys, cursor: nextCursor };
315
+ },
316
+ };
317
+ }
318
+ entriesByPrefix(prefix) {
319
+ const self = this;
320
+ const fullPrefix = this.prefixKey(prefix ?? "");
321
+ return {
322
+ async *[Symbol.asyncIterator]() {
323
+ for await (const [key, entry] of self.parent.entries(fullPrefix)) {
324
+ if (key.startsWith(self.prefix)) {
325
+ yield [key.slice(self.prefix.length), entry];
326
+ }
327
+ }
328
+ },
329
+ async page(limit, cursor) {
330
+ const { entries, cursor: nextCursor } = await self.parent
331
+ .entries(fullPrefix)
332
+ .page(limit, cursor);
333
+ const strippedEntries = entries
334
+ .filter(([key]) => key.startsWith(self.prefix))
335
+ .map(([key, entry]) => [key.slice(self.prefix.length), entry]);
336
+ return { entries: strippedEntries, cursor: nextCursor };
337
+ },
338
+ };
339
+ }
340
+ // =========================================================================
341
+ // Private: index-based lookups
342
+ // =========================================================================
343
+ async getByIndex(filter) {
344
+ const [indexName, indexKey] = parseIndexQuery(filter);
345
+ const def = this.indexes?.[indexName];
346
+ if (!def) {
347
+ throw new Error(`Unknown index: "${indexName}"`);
348
+ }
349
+ if (!def.unique) {
350
+ throw new Error(`get() with index requires a unique index, "${indexName}" is non-unique. Use keys() or entries() instead.`);
351
+ }
352
+ const indexStore = this.indexStores[indexName];
353
+ const indexResult = await indexStore.get(indexKey);
354
+ if (!indexResult.exists) {
355
+ return NOT_FOUND;
356
+ }
357
+ const primaryKey = await indexResult.value;
358
+ const entry = await this.parent.get(this.prefixKey(primaryKey));
359
+ // Orphan type 1: main entry doesn't exist
360
+ if (!entry.exists) {
361
+ indexStore.delete(indexKey).catch(() => { });
362
+ return NOT_FOUND;
363
+ }
364
+ // Orphan type 2: index points to value with different index key
365
+ const value = await entry.value;
366
+ const currentKeys = normalizeIndexKeys(def.key(value, primaryKey));
367
+ if (!currentKeys.includes(indexKey)) {
368
+ indexStore.delete(indexKey).catch(() => { });
369
+ return NOT_FOUND;
370
+ }
371
+ return {
372
+ exists: true,
373
+ metadata: entry.metadata,
374
+ value: Promise.resolve(value),
375
+ stream: entry.stream,
376
+ version: entry.version,
377
+ update: entry.update,
378
+ };
379
+ }
380
+ keysByIndex(filter) {
381
+ const [indexName, indexKey] = parseIndexQuery(filter);
382
+ const def = this.indexes?.[indexName];
383
+ if (!def) {
384
+ throw new Error(`Unknown index: "${indexName}"`);
385
+ }
386
+ const indexStore = this.indexStores[indexName];
387
+ const self = this;
388
+ const isUnique = def.unique ?? false;
389
+ if (isUnique) {
390
+ return {
391
+ async *[Symbol.asyncIterator]() {
392
+ const result = await self.getByIndex(filter);
393
+ if (result.exists) {
394
+ const indexResult = await indexStore.get(indexKey);
395
+ if (indexResult.exists) {
396
+ yield await indexResult.value;
397
+ }
398
+ }
399
+ },
400
+ async page(limit, cursor) {
401
+ if (cursor)
402
+ return { keys: [] };
403
+ const result = await self.getByIndex(filter);
404
+ if (result.exists) {
405
+ const indexResult = await indexStore.get(indexKey);
406
+ if (indexResult.exists) {
407
+ return { keys: [await indexResult.value] };
408
+ }
409
+ }
410
+ return { keys: [] };
411
+ },
412
+ };
413
+ }
414
+ const scanPrefix = `${indexKey}/`;
415
+ return {
416
+ async *[Symbol.asyncIterator]() {
417
+ for await (const [, entry] of indexStore.entries(scanPrefix)) {
418
+ const primaryKey = await entry.value;
419
+ const mainEntry = await self.parent.get(self.prefixKey(primaryKey));
420
+ if (mainEntry.exists) {
421
+ const value = await mainEntry.value;
422
+ const currentKeys = normalizeIndexKeys(def.key(value, primaryKey));
423
+ if (currentKeys.includes(indexKey)) {
424
+ yield primaryKey;
425
+ }
426
+ else {
427
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
428
+ }
429
+ }
430
+ else {
431
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
432
+ }
433
+ }
434
+ },
435
+ async page(limit, cursor) {
436
+ const { entries, cursor: nextCursor } = await indexStore
437
+ .entries(scanPrefix)
438
+ .page(limit, cursor);
439
+ const keys = [];
440
+ for (const [, entry] of entries) {
441
+ const primaryKey = await entry.value;
442
+ const mainEntry = await self.parent.get(self.prefixKey(primaryKey));
443
+ if (mainEntry.exists) {
444
+ const value = await mainEntry.value;
445
+ const currentKeys = normalizeIndexKeys(def.key(value, primaryKey));
446
+ if (currentKeys.includes(indexKey)) {
447
+ keys.push(primaryKey);
448
+ }
449
+ else {
450
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
451
+ }
452
+ }
453
+ else {
454
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
455
+ }
456
+ }
457
+ return { keys, cursor: nextCursor };
458
+ },
459
+ };
460
+ }
461
+ entriesByIndex(filter) {
462
+ const [indexName, indexKey] = parseIndexQuery(filter);
463
+ const def = this.indexes?.[indexName];
464
+ if (!def) {
465
+ throw new Error(`Unknown index: "${indexName}"`);
466
+ }
467
+ const indexStore = this.indexStores[indexName];
468
+ const self = this;
469
+ const isUnique = def.unique ?? false;
470
+ if (isUnique) {
471
+ return {
472
+ async *[Symbol.asyncIterator]() {
473
+ const result = await self.getByIndex(filter);
474
+ if (result.exists) {
475
+ const indexResult = await indexStore.get(indexKey);
476
+ if (indexResult.exists) {
477
+ const pk = await indexResult.value;
478
+ yield [pk, result];
479
+ }
480
+ }
481
+ },
482
+ async page(limit, cursor) {
483
+ if (cursor)
484
+ return { entries: [] };
485
+ const result = await self.getByIndex(filter);
486
+ if (result.exists) {
487
+ const indexResult = await indexStore.get(indexKey);
488
+ if (indexResult.exists) {
489
+ const pk = await indexResult.value;
490
+ return { entries: [[pk, result]] };
491
+ }
492
+ }
493
+ return { entries: [] };
494
+ },
495
+ };
496
+ }
497
+ const scanPrefix = `${indexKey}/`;
498
+ return {
499
+ async *[Symbol.asyncIterator]() {
500
+ for await (const [, indexEntry] of indexStore.entries(scanPrefix)) {
501
+ const primaryKey = await indexEntry.value;
502
+ const mainEntry = await self.parent.get(self.prefixKey(primaryKey));
503
+ if (mainEntry.exists) {
504
+ const value = await mainEntry.value;
505
+ const currentKeys = normalizeIndexKeys(def.key(value, primaryKey));
506
+ if (currentKeys.includes(indexKey)) {
507
+ yield [
508
+ primaryKey,
509
+ {
510
+ exists: true,
511
+ metadata: mainEntry.metadata,
512
+ value: Promise.resolve(value),
513
+ stream: mainEntry.stream,
514
+ version: mainEntry.version,
515
+ update: mainEntry.update,
516
+ },
517
+ ];
518
+ }
519
+ else {
520
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
521
+ }
522
+ }
523
+ else {
524
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
525
+ }
526
+ }
527
+ },
528
+ async page(limit, cursor) {
529
+ const { entries: indexEntries, cursor: nextCursor } = await indexStore
530
+ .entries(scanPrefix)
531
+ .page(limit, cursor);
532
+ const entries = [];
533
+ for (const [, indexEntry] of indexEntries) {
534
+ const primaryKey = await indexEntry.value;
535
+ const mainEntry = await self.parent.get(self.prefixKey(primaryKey));
536
+ if (mainEntry.exists) {
537
+ const value = await mainEntry.value;
538
+ const currentKeys = normalizeIndexKeys(def.key(value, primaryKey));
539
+ if (currentKeys.includes(indexKey)) {
540
+ entries.push([
541
+ primaryKey,
542
+ {
543
+ exists: true,
544
+ metadata: mainEntry.metadata,
545
+ value: Promise.resolve(value),
546
+ stream: mainEntry.stream,
547
+ version: mainEntry.version,
548
+ update: mainEntry.update,
549
+ },
550
+ ]);
551
+ }
552
+ else {
553
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
554
+ }
555
+ }
556
+ else {
557
+ indexStore.delete(`${indexKey}/${primaryKey}`).catch(() => { });
558
+ }
559
+ }
560
+ return { entries, cursor: nextCursor };
561
+ },
562
+ };
563
+ }
564
+ }
565
+ //# sourceMappingURL=typed-kv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-kv.js","sourceRoot":"","sources":["../src/typed-kv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { UpstreamKV } from "./upstream-kv.js";
2
+ import type { KVGetResult } from "./types.js";
3
+ /**
4
+ * A typed sub-store that wraps UpstreamKV with a prefix.
5
+ * Provides CoW behavior (reads fall back to upstream).
6
+ */
7
+ export declare class TypedUpstreamKV<V, M = undefined> {
8
+ private parent;
9
+ private prefix;
10
+ constructor(parent: UpstreamKV<M>, prefix: string);
11
+ private prefixKey;
12
+ get(key: string): Promise<KVGetResult<V, M>>;
13
+ set(key: string, value: V | ReadableStream<Uint8Array>, ...[metadata]: undefined extends M ? [M?] : [M]): Promise<void>;
14
+ delete(key: string): Promise<void>;
15
+ keys(prefix?: string): AsyncIterable<string>;
16
+ }
17
+ //# sourceMappingURL=typed-upstream-kv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-upstream-kv.d.ts","sourceRoot":"","sources":["../src/typed-upstream-kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C;;;GAGG;AACH,qBAAa,eAAe,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS;IAC5C,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM;IAQjD,OAAO,CAAC,SAAS;IAIX,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAI5C,GAAG,CACR,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,EACrC,GAAG,CAAC,QAAQ,CAAC,EAAE,SAAS,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAC7C,OAAO,CAAC,IAAI,CAAC;IAIV,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC;CASnD"}
@@ -0,0 +1,38 @@
1
+ const VALUE_SUFFIX = ".value";
2
+ /**
3
+ * A typed sub-store that wraps UpstreamKV with a prefix.
4
+ * Provides CoW behavior (reads fall back to upstream).
5
+ */
6
+ export class TypedUpstreamKV {
7
+ parent;
8
+ prefix;
9
+ constructor(parent, prefix) {
10
+ if (prefix.endsWith(VALUE_SUFFIX)) {
11
+ throw new Error(`Store prefix cannot end with "${VALUE_SUFFIX}": ${prefix}`);
12
+ }
13
+ this.parent = parent;
14
+ this.prefix = prefix;
15
+ }
16
+ prefixKey(key) {
17
+ return `${this.prefix}${key}`;
18
+ }
19
+ async get(key) {
20
+ return this.parent.get(this.prefixKey(key));
21
+ }
22
+ async set(key, value, ...[metadata]) {
23
+ return this.parent.set(this.prefixKey(key), value, metadata);
24
+ }
25
+ async delete(key) {
26
+ return this.parent.delete(this.prefixKey(key));
27
+ }
28
+ async *keys(prefix) {
29
+ const fullPrefix = this.prefixKey(prefix ?? "");
30
+ for await (const key of this.parent.keys(fullPrefix)) {
31
+ // Strip our prefix from the returned key
32
+ if (key.startsWith(this.prefix)) {
33
+ yield key.slice(this.prefix.length);
34
+ }
35
+ }
36
+ }
37
+ }
38
+ //# sourceMappingURL=typed-upstream-kv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typed-upstream-kv.js","sourceRoot":"","sources":["../src/typed-upstream-kv.ts"],"names":[],"mappings":"AAGA,MAAM,YAAY,GAAG,QAAQ,CAAC;AAE9B;;;GAGG;AACH,MAAM,OAAO,eAAe;IACnB,MAAM,CAAgB;IACtB,MAAM,CAAS;IAEvB,YAAY,MAAqB,EAAE,MAAc;QAChD,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iCAAiC,YAAY,MAAM,MAAM,EAAE,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAEO,SAAS,CAAC,GAAW;QAC5B,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,GAAG,CACR,GAAW,EACX,KAAqC,EACrC,GAAG,CAAC,QAAQ,CAAmC;QAE/C,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,QAAa,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,CAAC,IAAI,CAAC,MAAe;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAChD,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YACtD,yCAAyC;YACzC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBACjC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;QACF,CAAC;IACF,CAAC;CACD"}