@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,199 @@
1
+ import type { Readable } from "node:stream";
2
+ import type { GetBlobResult, GetCommandOptions, ListBlobResult, ListCommandOptions, PutBlobResult, PutCommandOptions } from "@vercel/blob";
3
+ /**
4
+ * Result of a set operation.
5
+ */
6
+ export interface KVSetResult {
7
+ /** Version (etag) of the written blob, for use with optimistic locking */
8
+ version: string;
9
+ }
10
+ /**
11
+ * Options for set operations.
12
+ */
13
+ export interface SetOptions {
14
+ /** Only succeed if current version matches (optimistic locking) */
15
+ expectedVersion?: string;
16
+ /** Allow overwriting existing values. Default: true */
17
+ override?: boolean;
18
+ }
19
+ /**
20
+ * Error thrown when a conditional update fails due to version mismatch.
21
+ */
22
+ export declare class KVVersionConflictError extends Error {
23
+ constructor(key: string);
24
+ }
25
+ /**
26
+ * Error thrown when a unique index constraint is violated.
27
+ */
28
+ export declare class KVIndexConflictError extends Error {
29
+ indexName: string;
30
+ indexKey: string;
31
+ constructor(indexName: string, indexKey: string);
32
+ }
33
+ export interface KVEntry<V, M> {
34
+ exists: true;
35
+ metadata: M;
36
+ /** Lazily buffers and parses the value on first access */
37
+ value: Promise<V>;
38
+ /** Lazily returns a stream of the raw payload bytes */
39
+ stream: Promise<ReadableStream<Uint8Array>>;
40
+ /** Version (etag) of this entry, for use with optimistic locking */
41
+ version: string;
42
+ /** Conditionally update using the version from when this entry was read */
43
+ update(value: V | ReadableStream<Uint8Array>, metadata?: M): Promise<KVSetResult>;
44
+ }
45
+ export interface KVEntryNotFound {
46
+ exists: false;
47
+ metadata: undefined;
48
+ value: undefined;
49
+ stream: undefined;
50
+ }
51
+ export type KVGetResult<V, M> = KVEntry<V, M> | KVEntryNotFound;
52
+ /**
53
+ * Result of a paginated keys query.
54
+ */
55
+ export interface KeysPage {
56
+ keys: string[];
57
+ cursor?: string;
58
+ }
59
+ /**
60
+ * Result of a paginated entries query.
61
+ */
62
+ export interface EntriesPage<V, M> {
63
+ entries: [string, KVEntry<V, M>][];
64
+ cursor?: string;
65
+ }
66
+ /**
67
+ * AsyncIterable for keys with pagination support.
68
+ */
69
+ export interface KeysIterable extends AsyncIterable<string> {
70
+ /**
71
+ * Fetch a page of keys.
72
+ * @param limit - Maximum number of keys to return
73
+ * @param cursor - Cursor from previous page (undefined for first page)
74
+ */
75
+ page(limit: number, cursor?: string): Promise<KeysPage>;
76
+ }
77
+ /**
78
+ * AsyncIterable for entries with pagination support.
79
+ */
80
+ export interface EntriesIterable<V, M> extends AsyncIterable<[string, KVEntry<V, M>]> {
81
+ /**
82
+ * Fetch a page of entries.
83
+ * @param limit - Maximum number of entries to return
84
+ * @param cursor - Cursor from previous page (undefined for first page)
85
+ */
86
+ page(limit: number, cursor?: string): Promise<EntriesPage<V, M>>;
87
+ }
88
+ /**
89
+ * Common interface for KV stores (KV2 and UpstreamKV).
90
+ * Used by TypedKV to support both as parents.
91
+ */
92
+ export interface KVLike<M> {
93
+ get<V = unknown>(key: string): Promise<KVGetResult<V, M>>;
94
+ set<V = unknown>(key: string, value: V | ReadableStream<Uint8Array>, metadata?: M, options?: SetOptions): Promise<KVSetResult>;
95
+ delete(key: string): Promise<void>;
96
+ keys(prefix?: string): KeysIterable;
97
+ entries<V = unknown>(prefix?: string): EntriesIterable<V, M>;
98
+ getMany<V = unknown>(keys: string[], concurrency?: number): Promise<Map<string, KVEntry<V, M>>>;
99
+ }
100
+ /** A string that ends with a forward slash */
101
+ export type PrefixString = `${string}/`;
102
+ /** Cache interface for KVCache dependency injection */
103
+ export interface CacheLike {
104
+ get(key: string): Promise<unknown>;
105
+ set(key: string, value: unknown, options?: {
106
+ tags?: string[];
107
+ ttl?: number;
108
+ }): Promise<void>;
109
+ expireTag(tag: string): Promise<void>;
110
+ }
111
+ export interface KV2Options {
112
+ /** Global prefix for all keys (must end with /) */
113
+ prefix?: PrefixString;
114
+ /** Blob access token (defaults to BLOB_READ_WRITE_TOKEN) */
115
+ token?: string;
116
+ /** Byte threshold for large value separation (default: 1MB) */
117
+ largeValueThreshold?: number;
118
+ /** Cache TTL in seconds (default: 3600) */
119
+ cacheTtl?: number;
120
+ /** Blob store implementation (defaults to VercelBlobStore) */
121
+ blobStore?: BlobStore;
122
+ /** Cache implementation for testing (defaults to Vercel Runtime Cache) */
123
+ cache?: CacheLike;
124
+ /** Tracer for performance monitoring (defaults to no-op) */
125
+ tracer?: Tracer;
126
+ }
127
+ /** Tracer interface for pluggable tracing (OTEL compatible) */
128
+ export interface Tracer {
129
+ startSpan(name: string, attributes?: Record<string, string | number | boolean>): Span;
130
+ }
131
+ /** Span interface for tracing */
132
+ export interface Span {
133
+ setAttributes(attrs: Record<string, string | number | boolean>): void;
134
+ setError(error: Error): void;
135
+ end(): void;
136
+ }
137
+ /**
138
+ * Blob Storage Format (v1)
139
+ *
140
+ * Two formats based on whether payload exists:
141
+ *
142
+ * 1. Pure JSON (small values, no payload):
143
+ * If first byte is '{' (0x7B), entire blob is JSON header.
144
+ *
145
+ * {"metadata":{"v":1},"value":{"name":"Alice"},"encoding":"json"}
146
+ * {"metadata":{"v":1},"value":"SGVsbG8=","encoding":"base64"}
147
+ *
148
+ * 2. Binary format (large values with payload after header):
149
+ * [4 bytes: header length (uint32 BE)][header JSON][payload bytes]
150
+ *
151
+ * 00 00 00 28 {"metadata":{"v":1},"encoding":"raw-json"}{"name":"Alice",...}
152
+ * 00 00 00 2A {"metadata":{"v":1},"encoding":"raw-binary"}<raw bytes>
153
+ *
154
+ * Detection: check if buffer[0] === 0x7B ('{')
155
+ * - Yes: pure JSON, parse entire buffer
156
+ * - No: binary format, read 4-byte length prefix first
157
+ *
158
+ * Safety: Header size capped at 100MB ensures uint32 BE first byte < 0x7B,
159
+ * preventing ambiguity (0x7B000000 = ~2GB would be needed for conflict).
160
+ *
161
+ * Small values (< largeValueThreshold) use pure JSON with inlined "value".
162
+ * Large values use binary format with "raw-json" or "raw-binary" encoding.
163
+ */
164
+ export type StoredEntryEncoding = "json" | "base64" | "raw-json" | "raw-binary";
165
+ export interface StoredEntry<M> {
166
+ metadata: M;
167
+ /** Inline value for small entries (when encoding is "json" or "base64") */
168
+ value?: unknown;
169
+ /**
170
+ * Encoding type:
171
+ * - "json": inline JSON value
172
+ * - "base64": inline base64-encoded binary
173
+ * - "raw-json": raw JSON payload after header (large JSON values)
174
+ * - "raw-binary": raw binary payload after header (large binary values)
175
+ */
176
+ encoding: StoredEntryEncoding;
177
+ /** Timestamp of the write (for consistency checking) */
178
+ writeTime?: number;
179
+ }
180
+ export type PutBody = string | Readable | Buffer | Blob | ArrayBuffer | ReadableStream | File;
181
+ export interface BlobStore {
182
+ get(pathname: string, options: GetCommandOptions): Promise<GetBlobResult | null>;
183
+ put(pathname: string, body: PutBody, options: PutCommandOptions): Promise<PutBlobResult>;
184
+ del(urlOrPathname: string | string[]): Promise<void>;
185
+ list(options?: ListCommandOptions): Promise<ListBlobResult>;
186
+ }
187
+ export interface CachedEntry<M> {
188
+ metadata: M;
189
+ /** Value - binary data is stored as base64 string */
190
+ value: unknown;
191
+ size: number;
192
+ /** Whether the value is binary (stored as base64) */
193
+ isBinary?: boolean;
194
+ /** Timestamp of the write (for stream consistency checking) */
195
+ writeTime?: number;
196
+ /** Etag for optimistic locking */
197
+ etag?: string;
198
+ }
199
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Error thrown when a conditional update fails due to version mismatch.
3
+ */
4
+ export class KVVersionConflictError extends Error {
5
+ constructor(key) {
6
+ super(`Version conflict: "${key}" was modified by another process`);
7
+ this.name = "KVVersionConflictError";
8
+ }
9
+ }
10
+ /**
11
+ * Error thrown when a unique index constraint is violated.
12
+ */
13
+ export class KVIndexConflictError extends Error {
14
+ indexName;
15
+ indexKey;
16
+ constructor(indexName, indexKey) {
17
+ super(`Unique index "${indexName}" conflict: key "${indexKey}" already exists`);
18
+ this.name = "KVIndexConflictError";
19
+ this.indexName = indexName;
20
+ this.indexKey = indexKey;
21
+ }
22
+ }
23
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAgCA;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAChD,YAAY,GAAW;QACtB,KAAK,CAAC,sBAAsB,GAAG,mCAAmC,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACtC,CAAC;CACD;AAED;;GAEG;AACH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC9C,SAAS,CAAS;IAClB,QAAQ,CAAS;IACjB,YAAY,SAAiB,EAAE,QAAgB;QAC9C,KAAK,CACJ,iBAAiB,SAAS,oBAAoB,QAAQ,kBAAkB,CACxE,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC1B,CAAC;CACD"}
@@ -0,0 +1,84 @@
1
+ import type { KV2 } from "./cached-kv.js";
2
+ import type { ManifestLog } from "./manifest-log.js";
3
+ import { TypedKV } from "./typed-kv.js";
4
+ import type { EntriesIterable, KVEntry, KVGetResult, KVLike, KVSetResult, KeysIterable, SetOptions } from "./types.js";
5
+ /**
6
+ * Wrapper that adds copy-on-write (CoW) behavior to KV2.
7
+ *
8
+ * - Reads check manifest to route to local or upstream (avoids unnecessary blob lookups)
9
+ * - Writes go to local only
10
+ * - Deletes create tombstones to prevent upstream fallthrough
11
+ * - keys() returns keys from the manifest (discovered + local)
12
+ */
13
+ export declare class UpstreamKV<M = undefined> implements KVLike<M> {
14
+ private local;
15
+ private upstream;
16
+ private manifest;
17
+ constructor(local: KV2<M>, upstream: KV2<M>, manifest: ManifestLog);
18
+ /**
19
+ * Wrap an upstream entry to redirect update() calls through UpstreamKV.set().
20
+ * This ensures updates write to local storage, not upstream.
21
+ *
22
+ * Note: We don't use expectedVersion here because we're creating a new local
23
+ * shadow of the upstream entry, not updating an existing local entry.
24
+ */
25
+ private wrapUpstreamEntry;
26
+ /**
27
+ * Get a value. Uses manifest to route efficiently:
28
+ * - Keys marked "local" → check local only
29
+ * - Keys marked "upstream" → check upstream only (skip local blob lookup)
30
+ * - Keys marked "tombstone" → return not found
31
+ * - Unknown keys → check local, then upstream
32
+ */
33
+ get<V = unknown>(key: string): Promise<KVGetResult<V, M>>;
34
+ /**
35
+ * Set a value. Writes to local only.
36
+ */
37
+ set<V = unknown>(key: string, value: V | ReadableStream<Uint8Array>, ...[metadata, options]: undefined extends M ? [M?, SetOptions?] : [M, SetOptions?]): Promise<KVSetResult>;
38
+ /**
39
+ * Delete a key. Creates a tombstone to prevent upstream fallthrough.
40
+ */
41
+ delete(key: string): Promise<void>;
42
+ /**
43
+ * Iterate over keys. Returns merged keys from local, manifest, and upstream,
44
+ * excluding tombstones.
45
+ */
46
+ keys(prefix?: string): KeysIterable;
47
+ /**
48
+ * Fetch multiple keys concurrently with bounded concurrency.
49
+ * Returns a Map of key -> entry for all existing keys.
50
+ * Uses this.get() which handles local/upstream routing and tombstones.
51
+ *
52
+ * @param keys - Array of keys to fetch
53
+ * @param concurrency - Number of concurrent get operations (default: 20)
54
+ */
55
+ getMany<V = unknown>(keys: string[], concurrency?: number): Promise<Map<string, KVEntry<V, M>>>;
56
+ /**
57
+ * Iterate over key-value entries with concurrent fetching.
58
+ * Yields entries as soon as each fetch completes.
59
+ * Returns merged entries from local and upstream, excluding tombstones.
60
+ *
61
+ * @param prefix - Optional prefix to filter keys
62
+ * @param concurrency - Number of concurrent get operations (default: 20)
63
+ */
64
+ entries<V = unknown>(prefix?: string, concurrency?: number): EntriesIterable<V, M>;
65
+ /**
66
+ * Discover all keys from upstream and add to manifest.
67
+ * Use when you need complete keys() immediately.
68
+ */
69
+ discoverAllKeys(): Promise<number>;
70
+ /**
71
+ * Delete all local data and manifest (for environment cleanup).
72
+ */
73
+ destroy(): Promise<void>;
74
+ /**
75
+ * Get the underlying local KV (for advanced use cases).
76
+ */
77
+ getLocalKV(): KV2<M>;
78
+ /**
79
+ * Get a typed sub-store with CoW behavior.
80
+ * Reads fall back to upstream, writes go to local.
81
+ */
82
+ getStore<V, SubM = M, I extends string = never>(subPrefix: string, indexes?: Record<I, import("./typed-kv.js").IndexDef<V>>): TypedKV<V, SubM, I>;
83
+ }
84
+ //# sourceMappingURL=upstream-kv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upstream-kv.d.ts","sourceRoot":"","sources":["../src/upstream-kv.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EACX,eAAe,EAEf,OAAO,EACP,WAAW,EACX,MAAM,EACN,WAAW,EACX,YAAY,EAEZ,UAAU,EACV,MAAM,YAAY,CAAC;AAEpB;;;;;;;GAOG;AACH,qBAAa,UAAU,CAAC,CAAC,GAAG,SAAS,CAAE,YAAW,MAAM,CAAC,CAAC,CAAC;IAEzD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ;gBAFR,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EACb,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,EAChB,QAAQ,EAAE,WAAW;IAG9B;;;;;;OAMG;IACH,OAAO,CAAC,iBAAiB;IA6BzB;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAkD/D;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,CAAC,GAAG,cAAc,CAAC,UAAU,CAAC,EACrC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,SAAS,SAAS,CAAC,GACxC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GACjB,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GACjB,OAAO,CAAC,WAAW,CAAC;IAiBvB;;OAEG;IACG,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC;;;OAGG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY;IA4InC;;;;;;;OAOG;IACG,OAAO,CAAC,CAAC,GAAG,OAAO,EACxB,IAAI,EAAE,MAAM,EAAE,EACd,WAAW,SAAK,GACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAwBtC;;;;;;;OAOG;IACH,OAAO,CAAC,CAAC,GAAG,OAAO,EAClB,MAAM,CAAC,EAAE,MAAM,EACf,WAAW,SAAK,GACd,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC;IAyExB;;;OAGG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAexC;;OAEG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAU9B;;OAEG;IACH,UAAU,IAAI,GAAG,CAAC,CAAC,CAAC;IAIpB;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,KAAK,EAC7C,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,GACtD,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;CAOtB"}