@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.
- package/README.md +87 -0
- package/SKILL.md +65 -0
- package/dist/blob-format.d.ts +35 -0
- package/dist/blob-format.d.ts.map +1 -0
- package/dist/blob-format.js +91 -0
- package/dist/blob-format.js.map +1 -0
- package/dist/blob-store.d.ts +11 -0
- package/dist/blob-store.d.ts.map +1 -0
- package/dist/blob-store.js +32 -0
- package/dist/blob-store.js.map +1 -0
- package/dist/cache.d.ts +33 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +146 -0
- package/dist/cache.js.map +1 -0
- package/dist/cached-kv.d.ts +63 -0
- package/dist/cached-kv.d.ts.map +1 -0
- package/dist/cached-kv.js +891 -0
- package/dist/cached-kv.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +342 -0
- package/dist/cli.js.map +1 -0
- package/dist/create-kv.d.ts +86 -0
- package/dist/create-kv.d.ts.map +1 -0
- package/dist/create-kv.js +125 -0
- package/dist/create-kv.js.map +1 -0
- package/dist/disk-cache.d.ts.map +1 -0
- package/dist/disk-cache.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/indexed-kv.d.ts +44 -0
- package/dist/indexed-kv.d.ts.map +1 -0
- package/dist/indexed-kv.js +373 -0
- package/dist/indexed-kv.js.map +1 -0
- package/dist/manifest-log.d.ts +57 -0
- package/dist/manifest-log.d.ts.map +1 -0
- package/dist/manifest-log.js +128 -0
- package/dist/manifest-log.js.map +1 -0
- package/dist/memory-cache.d.ts +22 -0
- package/dist/memory-cache.d.ts.map +1 -0
- package/dist/memory-cache.js +90 -0
- package/dist/memory-cache.js.map +1 -0
- package/dist/proxy-cache.d.ts +40 -0
- package/dist/proxy-cache.d.ts.map +1 -0
- package/dist/proxy-cache.js +124 -0
- package/dist/proxy-cache.js.map +1 -0
- package/dist/readme.test.d.ts +9 -0
- package/dist/readme.test.d.ts.map +1 -0
- package/dist/readme.test.js +285 -0
- package/dist/readme.test.js.map +1 -0
- package/dist/schema/define-schema.d.ts +35 -0
- package/dist/schema/define-schema.d.ts.map +1 -0
- package/dist/schema/define-schema.js +70 -0
- package/dist/schema/define-schema.js.map +1 -0
- package/dist/schema/index.d.ts +4 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/key-builders.d.ts +40 -0
- package/dist/schema/key-builders.d.ts.map +1 -0
- package/dist/schema/key-builders.js +124 -0
- package/dist/schema/key-builders.js.map +1 -0
- package/dist/schema/schema-kv.d.ts +48 -0
- package/dist/schema/schema-kv.d.ts.map +1 -0
- package/dist/schema/schema-kv.js +96 -0
- package/dist/schema/schema-kv.js.map +1 -0
- package/dist/schema/tree.d.ts +14 -0
- package/dist/schema/tree.d.ts.map +1 -0
- package/dist/schema/tree.js +135 -0
- package/dist/schema/tree.js.map +1 -0
- package/dist/schema/types.d.ts +135 -0
- package/dist/schema/types.d.ts.map +1 -0
- package/dist/schema/types.js +2 -0
- package/dist/schema/types.js.map +1 -0
- package/dist/testing/core-tests.d.ts +30 -0
- package/dist/testing/core-tests.d.ts.map +1 -0
- package/dist/testing/core-tests.js +383 -0
- package/dist/testing/core-tests.js.map +1 -0
- package/dist/testing/create-kv-test-setup.d.ts +21 -0
- package/dist/testing/create-kv-test-setup.d.ts.map +1 -0
- package/dist/testing/create-kv-test-setup.js +25 -0
- package/dist/testing/create-kv-test-setup.js.map +1 -0
- package/dist/testing/debug-manifest.d.ts +2 -0
- package/dist/testing/debug-manifest.d.ts.map +1 -0
- package/dist/testing/debug-manifest.js +14 -0
- package/dist/testing/debug-manifest.js.map +1 -0
- package/dist/testing/fake-blob-store.d.ts +23 -0
- package/dist/testing/fake-blob-store.d.ts.map +1 -0
- package/dist/testing/fake-blob-store.js +158 -0
- package/dist/testing/fake-blob-store.js.map +1 -0
- package/dist/testing/fake-cache.d.ts +54 -0
- package/dist/testing/fake-cache.d.ts.map +1 -0
- package/dist/testing/fake-cache.js +137 -0
- package/dist/testing/fake-cache.js.map +1 -0
- package/dist/testing/index.d.ts +34 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +101 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/manifest-test-setup.d.ts +22 -0
- package/dist/testing/manifest-test-setup.d.ts.map +1 -0
- package/dist/testing/manifest-test-setup.js +43 -0
- package/dist/testing/manifest-test-setup.js.map +1 -0
- package/dist/testing/perf-test.d.ts +13 -0
- package/dist/testing/perf-test.d.ts.map +1 -0
- package/dist/testing/perf-test.js +101 -0
- package/dist/testing/perf-test.js.map +1 -0
- package/dist/testing/run-tests.d.ts +2 -0
- package/dist/testing/run-tests.d.ts.map +1 -0
- package/dist/testing/run-tests.js +141 -0
- package/dist/testing/run-tests.js.map +1 -0
- package/dist/testing/setup.d.ts +2 -0
- package/dist/testing/setup.d.ts.map +1 -0
- package/dist/testing/setup.js +3 -0
- package/dist/testing/setup.js.map +1 -0
- package/dist/testing/test-index.d.ts +28 -0
- package/dist/testing/test-index.d.ts.map +1 -0
- package/dist/testing/test-index.js +35 -0
- package/dist/testing/test-index.js.map +1 -0
- package/dist/testing/test-setup.d.ts +32 -0
- package/dist/testing/test-setup.d.ts.map +1 -0
- package/dist/testing/test-setup.js +72 -0
- package/dist/testing/test-setup.js.map +1 -0
- package/dist/testing/upstream-kv-test-setup.d.ts +30 -0
- package/dist/testing/upstream-kv-test-setup.d.ts.map +1 -0
- package/dist/testing/upstream-kv-test-setup.js +66 -0
- package/dist/testing/upstream-kv-test-setup.js.map +1 -0
- package/dist/testing/vitest-compat.d.ts +92 -0
- package/dist/testing/vitest-compat.d.ts.map +1 -0
- package/dist/testing/vitest-compat.js +601 -0
- package/dist/testing/vitest-compat.js.map +1 -0
- package/dist/tracing.d.ts +71 -0
- package/dist/tracing.d.ts.map +1 -0
- package/dist/tracing.js +232 -0
- package/dist/tracing.js.map +1 -0
- package/dist/typed-kv.d.ts +120 -0
- package/dist/typed-kv.d.ts.map +1 -0
- package/dist/typed-kv.js +565 -0
- package/dist/typed-kv.js.map +1 -0
- package/dist/typed-upstream-kv.d.ts +17 -0
- package/dist/typed-upstream-kv.d.ts.map +1 -0
- package/dist/typed-upstream-kv.js +38 -0
- package/dist/typed-upstream-kv.js.map +1 -0
- package/dist/types.d.ts +199 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +23 -0
- package/dist/types.js.map +1 -0
- package/dist/upstream-kv.d.ts +84 -0
- package/dist/upstream-kv.d.ts.map +1 -0
- package/dist/upstream-kv.js +375 -0
- package/dist/upstream-kv.js.map +1 -0
- package/docs/api-reference.md +222 -0
- package/docs/caching.md +60 -0
- package/docs/cli.md +123 -0
- package/docs/copy-on-write-branches.md +98 -0
- package/docs/getting-started.md +61 -0
- package/docs/indexes.md +122 -0
- package/docs/iterating-and-pagination.md +93 -0
- package/docs/metadata.md +82 -0
- package/docs/optimistic-locking.md +72 -0
- package/docs/schema-and-trees.md +222 -0
- package/docs/streaming.md +61 -0
- package/docs/testing-and-tracing.md +141 -0
- package/docs/typed-stores.md +68 -0
- package/package.json +63 -0
package/dist/typed-kv.js
ADDED
|
@@ -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"}
|