@quereus/store 4.3.0 → 4.3.2
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 +486 -436
- package/dist/src/common/bytes.d.ts +4 -1
- package/dist/src/common/bytes.d.ts.map +1 -1
- package/dist/src/common/bytes.js +23 -2
- package/dist/src/common/bytes.js.map +1 -1
- package/dist/src/common/cached-kv-store.d.ts.map +1 -1
- package/dist/src/common/cached-kv-store.js +6 -13
- package/dist/src/common/cached-kv-store.js.map +1 -1
- package/dist/src/common/encoding.d.ts +69 -26
- package/dist/src/common/encoding.d.ts.map +1 -1
- package/dist/src/common/encoding.js +292 -230
- package/dist/src/common/encoding.js.map +1 -1
- package/dist/src/common/index.d.ts +1 -1
- package/dist/src/common/index.d.ts.map +1 -1
- package/dist/src/common/index.js +1 -1
- package/dist/src/common/index.js.map +1 -1
- package/dist/src/common/key-builder.d.ts +5 -1
- package/dist/src/common/key-builder.d.ts.map +1 -1
- package/dist/src/common/key-builder.js +30 -2
- package/dist/src/common/key-builder.js.map +1 -1
- package/dist/src/common/kv-store.d.ts +1 -1
- package/dist/src/common/memory-store.d.ts.map +1 -1
- package/dist/src/common/memory-store.js +21 -6
- package/dist/src/common/memory-store.js.map +1 -1
- package/dist/src/common/serialization.d.ts.map +1 -1
- package/dist/src/common/serialization.js +6 -3
- package/dist/src/common/serialization.js.map +1 -1
- package/dist/src/common/store-module.d.ts +293 -26
- package/dist/src/common/store-module.d.ts.map +1 -1
- package/dist/src/common/store-module.js +1543 -612
- package/dist/src/common/store-module.js.map +1 -1
- package/dist/src/common/store-table.d.ts +515 -36
- package/dist/src/common/store-table.d.ts.map +1 -1
- package/dist/src/common/store-table.js +873 -100
- package/dist/src/common/store-table.js.map +1 -1
- package/dist/src/common/transaction.d.ts +8 -5
- package/dist/src/common/transaction.d.ts.map +1 -1
- package/dist/src/common/transaction.js +32 -5
- package/dist/src/common/transaction.js.map +1 -1
- package/dist/src/testing/kv-conformance.d.ts +47 -0
- package/dist/src/testing/kv-conformance.d.ts.map +1 -0
- package/dist/src/testing/kv-conformance.js +418 -0
- package/dist/src/testing/kv-conformance.js.map +1 -0
- package/package.json +17 -5
|
@@ -0,0 +1,418 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared KVStore conformance suite — test-support; run under Mocha.
|
|
3
|
+
*
|
|
4
|
+
* ONE parameterized battery of behavioral tests written against the {@link KVStore}
|
|
5
|
+
* contract (not against any single backend), invoked once per backend. Each backend
|
|
6
|
+
* supplies only a small {@link KVBackend} adapter (how to open / reopen / tear down);
|
|
7
|
+
* this file supplies every assertion. A behavior that drifts on one backend then
|
|
8
|
+
* fails the suite instead of silently diverging across the three interchangeable
|
|
9
|
+
* stores (in-memory, LevelDB, IndexedDB).
|
|
10
|
+
*
|
|
11
|
+
* Deps are deliberately minimal so this file can be compiled into `@quereus/store`'s
|
|
12
|
+
* normal `src` build without dragging a test framework into the shipped package:
|
|
13
|
+
* - assertions use `node:assert/strict` (built-in, zero deps);
|
|
14
|
+
* - Mocha's `describe`/`it`/`beforeEach`/`afterEach` are referenced through a
|
|
15
|
+
* module-local ambient declaration below. Because this file has imports/exports
|
|
16
|
+
* the declarations are module-scoped (no global pollution, no `@types/mocha`
|
|
17
|
+
* needed at store build time); at runtime the real Mocha globals bind.
|
|
18
|
+
*
|
|
19
|
+
* The ordering ORACLE is `compareBytes` — the literal definition of the KVStore
|
|
20
|
+
* iteration contract ("keys compared lexicographically by bytes") — NOT the in-memory
|
|
21
|
+
* store, so the memory backend is tested against the contract as honestly as the
|
|
22
|
+
* others.
|
|
23
|
+
*/
|
|
24
|
+
import assert from 'node:assert/strict';
|
|
25
|
+
import { compareBytes } from '../common/bytes.js';
|
|
26
|
+
import { encodeCompositeKey } from '../common/encoding.js';
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Assertion + iteration helpers
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Normalize a backend-returned buffer to a plain `Uint8Array`. LevelDB may hand back
|
|
32
|
+
* a `Buffer` (a `Uint8Array` subclass), which `assert.deepStrictEqual` treats as a
|
|
33
|
+
* DIFFERENT type from a plain `Uint8Array` of identical bytes — copying through
|
|
34
|
+
* `new Uint8Array(x)` erases that prototype difference so content comparison is fair.
|
|
35
|
+
*/
|
|
36
|
+
function u8(x) {
|
|
37
|
+
return new Uint8Array(x);
|
|
38
|
+
}
|
|
39
|
+
/** Assert a present value equals `expected` bytes (and is NOT the missing-key `undefined`). */
|
|
40
|
+
function assertBytes(actual, expected, message) {
|
|
41
|
+
assert.notStrictEqual(actual, undefined, message ?? 'expected a value, got undefined (missing key)');
|
|
42
|
+
assert.deepStrictEqual(u8(actual), u8(expected), message);
|
|
43
|
+
}
|
|
44
|
+
/** Collect the keys an iterate() yields, normalized to plain `Uint8Array`. */
|
|
45
|
+
async function keysOf(store, options) {
|
|
46
|
+
const out = [];
|
|
47
|
+
for await (const entry of store.iterate(options))
|
|
48
|
+
out.push(u8(entry.key));
|
|
49
|
+
return out;
|
|
50
|
+
}
|
|
51
|
+
/** `compareBytes`-sorted copy of a key list — the contract's expected iteration order. */
|
|
52
|
+
function sortedByBytes(keys) {
|
|
53
|
+
return [...keys].sort(compareBytes);
|
|
54
|
+
}
|
|
55
|
+
const b = (...bytes) => new Uint8Array(bytes);
|
|
56
|
+
/** Seed single-byte keys 1..5 with value [i*10] — the shared range-bound fixture. */
|
|
57
|
+
async function seed1to5(store) {
|
|
58
|
+
for (let i = 1; i <= 5; i++)
|
|
59
|
+
await store.put(b(i), b(i * 10));
|
|
60
|
+
}
|
|
61
|
+
// ============================================================================
|
|
62
|
+
// Tier 6 golden vector — cross-backend byte-ordering agreement
|
|
63
|
+
// ============================================================================
|
|
64
|
+
// Reorder-equal JSON objects: canonical encoding makes them the SAME key bytes, so a
|
|
65
|
+
// backend that stored both would collapse to one entry. Cast mirrors encoding.spec.ts.
|
|
66
|
+
const OBJ_A = { a: 1, b: 2 };
|
|
67
|
+
const OBJ_B = { b: 2, a: 1 };
|
|
68
|
+
/**
|
|
69
|
+
* Curated SQL values whose encoded keys must iterate identically on every backend.
|
|
70
|
+
* Each entry is a DISTINCT key; the collapse pairs (reorder-equal object, 5n vs 5.0)
|
|
71
|
+
* are exercised separately below. Covers: null; a negative int; zero; ints that
|
|
72
|
+
* interleave a real (2 < 2.5 < 3); the large-int64 double-tie (2^53 and 2^53+1 share
|
|
73
|
+
* a nearest double); NOCASE text; blobs that must sort by content not length
|
|
74
|
+
* (x'0102' < x'03'); and a JSON object.
|
|
75
|
+
*/
|
|
76
|
+
const GOLDEN = [
|
|
77
|
+
null,
|
|
78
|
+
-1000n,
|
|
79
|
+
0n,
|
|
80
|
+
2n,
|
|
81
|
+
2.5,
|
|
82
|
+
3n,
|
|
83
|
+
9007199254740992n, // 2^53
|
|
84
|
+
9007199254740993n, // 2^53 + 1 (rounds to the 2^53 double — needs the tie-break tail)
|
|
85
|
+
'abc',
|
|
86
|
+
'xyz',
|
|
87
|
+
b(0x01, 0x02), // sorts BEFORE the shorter x'03' — content, not length
|
|
88
|
+
b(0x03),
|
|
89
|
+
OBJ_A,
|
|
90
|
+
];
|
|
91
|
+
/** A fixed, non-sorted permutation of GOLDEN's indices (0..12) for shuffled insertion. */
|
|
92
|
+
const GOLDEN_SHUFFLE = [7, 2, 11, 0, 5, 9, 1, 12, 4, 8, 3, 10, 6];
|
|
93
|
+
/** Encode one SQL value as a single-column composite key (default NOCASE collation). */
|
|
94
|
+
const key1 = (v) => encodeCompositeKey([v]);
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// The suite
|
|
97
|
+
// ============================================================================
|
|
98
|
+
/**
|
|
99
|
+
* Register the full KVStore conformance battery under `describe(name)`. Call once per
|
|
100
|
+
* backend. `makeBackend` is invoked fresh for every test (so no state leaks); it is
|
|
101
|
+
* also probed once at registration to decide whether the persistence tier applies.
|
|
102
|
+
*/
|
|
103
|
+
export function runKVStoreConformance(name, makeBackend) {
|
|
104
|
+
// Probe (no open()/teardown() — the factory only builds the adapter object) to
|
|
105
|
+
// learn whether this backend persists across a reopen.
|
|
106
|
+
const supportsReopen = typeof makeBackend().reopen === 'function';
|
|
107
|
+
describe(name, () => {
|
|
108
|
+
let backend;
|
|
109
|
+
let store;
|
|
110
|
+
beforeEach(async () => {
|
|
111
|
+
backend = makeBackend();
|
|
112
|
+
store = await backend.open();
|
|
113
|
+
});
|
|
114
|
+
afterEach(async () => {
|
|
115
|
+
await backend.teardown();
|
|
116
|
+
});
|
|
117
|
+
// ------------------------------------------------------------------
|
|
118
|
+
// Tier 1 — point operations
|
|
119
|
+
// ------------------------------------------------------------------
|
|
120
|
+
describe('tier 1: point operations', () => {
|
|
121
|
+
it('put then get round-trips', async () => {
|
|
122
|
+
await store.put(b(1, 2), b(10, 20));
|
|
123
|
+
assertBytes(await store.get(b(1, 2)), b(10, 20));
|
|
124
|
+
});
|
|
125
|
+
it('get of a missing key is undefined', async () => {
|
|
126
|
+
assert.strictEqual(await store.get(b(9, 9)), undefined);
|
|
127
|
+
});
|
|
128
|
+
it('an empty value round-trips and is distinct from a missing key', async () => {
|
|
129
|
+
await store.put(b(1), b()); // empty value
|
|
130
|
+
const got = await store.get(b(1));
|
|
131
|
+
assert.notStrictEqual(got, undefined, 'empty value must not read back as missing');
|
|
132
|
+
assert.strictEqual(got.length, 0);
|
|
133
|
+
// A genuinely absent key still reads undefined.
|
|
134
|
+
assert.strictEqual(await store.get(b(2)), undefined);
|
|
135
|
+
});
|
|
136
|
+
it('an empty key is a valid key: put/get/has/delete round-trip', async () => {
|
|
137
|
+
const empty = b();
|
|
138
|
+
await store.put(empty, b(42));
|
|
139
|
+
assertBytes(await store.get(empty), b(42));
|
|
140
|
+
assert.strictEqual(await store.has(empty), true);
|
|
141
|
+
await store.delete(empty);
|
|
142
|
+
assert.strictEqual(await store.get(empty), undefined);
|
|
143
|
+
assert.strictEqual(await store.has(empty), false);
|
|
144
|
+
});
|
|
145
|
+
it('overwrite replaces the value', async () => {
|
|
146
|
+
await store.put(b(1), b(10));
|
|
147
|
+
await store.put(b(1), b(20));
|
|
148
|
+
assertBytes(await store.get(b(1)), b(20));
|
|
149
|
+
});
|
|
150
|
+
it('delete of a missing key is a no-op (no throw)', async () => {
|
|
151
|
+
await store.delete(b(123)); // must not throw
|
|
152
|
+
assert.strictEqual(await store.get(b(123)), undefined);
|
|
153
|
+
});
|
|
154
|
+
it('has agrees with get presence', async () => {
|
|
155
|
+
assert.strictEqual(await store.has(b(1)), false);
|
|
156
|
+
await store.put(b(1), b(10));
|
|
157
|
+
assert.strictEqual(await store.has(b(1)), true);
|
|
158
|
+
await store.delete(b(1));
|
|
159
|
+
assert.strictEqual(await store.has(b(1)), false);
|
|
160
|
+
});
|
|
161
|
+
it('mutating the caller buffers after put does not change stored data', async () => {
|
|
162
|
+
const key = b(1, 2, 3);
|
|
163
|
+
const val = b(4, 5, 6);
|
|
164
|
+
await store.put(key, val);
|
|
165
|
+
key[0] = 99;
|
|
166
|
+
val[0] = 99;
|
|
167
|
+
assertBytes(await store.get(b(1, 2, 3)), b(4, 5, 6));
|
|
168
|
+
});
|
|
169
|
+
it('mutating a returned value does not corrupt the store', async () => {
|
|
170
|
+
await store.put(b(1), b(10, 20));
|
|
171
|
+
const first = await store.get(b(1));
|
|
172
|
+
first[0] = 99; // caller scribbles on the read buffer
|
|
173
|
+
assertBytes(await store.get(b(1)), b(10, 20), 'a later read must be unaffected');
|
|
174
|
+
});
|
|
175
|
+
it('put/delete accept the { sync: true } WriteOptions hint and still persist', async () => {
|
|
176
|
+
await store.put(b(7), b(70), { sync: true });
|
|
177
|
+
assertBytes(await store.get(b(7)), b(70));
|
|
178
|
+
await store.delete(b(7), { sync: true });
|
|
179
|
+
assert.strictEqual(await store.get(b(7)), undefined);
|
|
180
|
+
});
|
|
181
|
+
it('get and put reject after close()', async () => {
|
|
182
|
+
await store.close();
|
|
183
|
+
await assert.rejects(() => store.get(b(1)), /closed/i);
|
|
184
|
+
await assert.rejects(() => store.put(b(1), b(2)), /closed/i);
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
// ------------------------------------------------------------------
|
|
188
|
+
// Tier 2 — iteration & ordering
|
|
189
|
+
// ------------------------------------------------------------------
|
|
190
|
+
describe('tier 2: iteration & ordering', () => {
|
|
191
|
+
it('empty store yields nothing and approximateCount is 0', async () => {
|
|
192
|
+
assert.deepStrictEqual(await keysOf(store), []);
|
|
193
|
+
assert.strictEqual(await store.approximateCount(), 0);
|
|
194
|
+
});
|
|
195
|
+
it('forward iterate returns compareBytes order; reverse returns the exact reverse', async () => {
|
|
196
|
+
// Byte extremes (0x00, 0xff) and prefix/extension relationships.
|
|
197
|
+
const keys = [
|
|
198
|
+
b(0x00), b(0x00, 0x00), b(0x01), b(0x01, 0x00), b(0x01, 0x01),
|
|
199
|
+
b(0x02), b(0x7f), b(0x80), b(0xff), b(0xff, 0x00),
|
|
200
|
+
];
|
|
201
|
+
// Insert in a scrambled order so ordering can't come from insertion order.
|
|
202
|
+
for (const k of [...keys].reverse())
|
|
203
|
+
await store.put(k, b(1));
|
|
204
|
+
const expected = sortedByBytes(keys);
|
|
205
|
+
assert.deepStrictEqual(await keysOf(store), expected);
|
|
206
|
+
assert.deepStrictEqual(await keysOf(store, { reverse: true }), [...expected].reverse());
|
|
207
|
+
});
|
|
208
|
+
it('a proper prefix sorts before its extensions ([1] < [1,0] < [1,1])', async () => {
|
|
209
|
+
for (const k of [b(1, 1), b(1), b(1, 0)])
|
|
210
|
+
await store.put(k, b(1));
|
|
211
|
+
assert.deepStrictEqual(await keysOf(store), [b(1), b(1, 0), b(1, 1)]);
|
|
212
|
+
});
|
|
213
|
+
it('honors each bound individually and combined', async () => {
|
|
214
|
+
await seed1to5(store);
|
|
215
|
+
assert.deepStrictEqual(await keysOf(store, { gte: b(3) }), [b(3), b(4), b(5)]);
|
|
216
|
+
assert.deepStrictEqual(await keysOf(store, { gt: b(3) }), [b(4), b(5)]);
|
|
217
|
+
assert.deepStrictEqual(await keysOf(store, { lte: b(3) }), [b(1), b(2), b(3)]);
|
|
218
|
+
assert.deepStrictEqual(await keysOf(store, { lt: b(3) }), [b(1), b(2)]);
|
|
219
|
+
assert.deepStrictEqual(await keysOf(store, { gte: b(2), lt: b(4) }), [b(2), b(3)]);
|
|
220
|
+
assert.deepStrictEqual(await keysOf(store, { gt: b(1), lt: b(5) }), [b(2), b(3), b(4)]);
|
|
221
|
+
});
|
|
222
|
+
it('honors bounds with reverse', async () => {
|
|
223
|
+
await seed1to5(store);
|
|
224
|
+
assert.deepStrictEqual(await keysOf(store, { gte: b(2), lte: b(4), reverse: true }), [b(4), b(3), b(2)]);
|
|
225
|
+
assert.deepStrictEqual(await keysOf(store, { gt: b(1), lt: b(5), reverse: true }), [b(4), b(3), b(2)]);
|
|
226
|
+
});
|
|
227
|
+
it('a crossed or empty range yields nothing (no throw)', async () => {
|
|
228
|
+
await seed1to5(store);
|
|
229
|
+
assert.deepStrictEqual(await keysOf(store, { gte: b(4), lt: b(2) }), []); // crossed
|
|
230
|
+
assert.deepStrictEqual(await keysOf(store, { gte: b(3), lt: b(3) }), []); // empty point
|
|
231
|
+
assert.deepStrictEqual(await keysOf(store, { gt: b(3), lte: b(3) }), []); // excluded point
|
|
232
|
+
assert.deepStrictEqual(await keysOf(store, { gte: b(90) }), []); // above all
|
|
233
|
+
});
|
|
234
|
+
it('honors limit (0, oversized, and with reverse)', async () => {
|
|
235
|
+
await seed1to5(store);
|
|
236
|
+
assert.deepStrictEqual(await keysOf(store, { limit: 0 }), []);
|
|
237
|
+
assert.deepStrictEqual(await keysOf(store, { limit: 2 }), [b(1), b(2)]);
|
|
238
|
+
assert.deepStrictEqual(await keysOf(store, { limit: 99 }), [b(1), b(2), b(3), b(4), b(5)]);
|
|
239
|
+
assert.deepStrictEqual(await keysOf(store, { reverse: true, limit: 2 }), [b(5), b(4)]);
|
|
240
|
+
});
|
|
241
|
+
it('yields COPIES: mutating a yielded key/value cannot corrupt the store', async () => {
|
|
242
|
+
// Iteration's read-buffer contract mirrors get() — a consumer scribbling on a
|
|
243
|
+
// yielded entry must not reach the store's internal buffers. (Regression guard
|
|
244
|
+
// for the in-memory backend, which once yielded its internal buffers directly;
|
|
245
|
+
// LevelDB/IndexedDB hand back fresh buffers per read.)
|
|
246
|
+
await seed1to5(store);
|
|
247
|
+
for await (const entry of store.iterate()) {
|
|
248
|
+
entry.key[0] = 0x99;
|
|
249
|
+
entry.value[0] = 0x99;
|
|
250
|
+
}
|
|
251
|
+
assert.deepStrictEqual(await keysOf(store), [b(1), b(2), b(3), b(4), b(5)]);
|
|
252
|
+
assertBytes(await store.get(b(3)), b(30), 'a value read after mutating an iterated entry must be intact');
|
|
253
|
+
});
|
|
254
|
+
it('approximateCount(range) equals the actual count over that range', async () => {
|
|
255
|
+
await seed1to5(store);
|
|
256
|
+
assert.strictEqual(await store.approximateCount(), 5);
|
|
257
|
+
assert.strictEqual(await store.approximateCount({ gte: b(2), lt: b(4) }), 2);
|
|
258
|
+
assert.strictEqual(await store.approximateCount({ gte: b(90) }), 0);
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
// ------------------------------------------------------------------
|
|
262
|
+
// Tier 3 — streaming iteration (bounded, crosses IndexedDB's 256-entry batch)
|
|
263
|
+
// ------------------------------------------------------------------
|
|
264
|
+
describe('tier 3: streaming iteration across a batch boundary', () => {
|
|
265
|
+
const COUNT = 306; // > 256 so iteration crosses at least one IndexedDB page boundary
|
|
266
|
+
const enc = (n) => b((n >> 8) & 0xff, n & 0xff); // 2-byte big-endian
|
|
267
|
+
const dec = (k) => (k[0] << 8) | k[1];
|
|
268
|
+
beforeEach(async () => {
|
|
269
|
+
const batch = store.batch();
|
|
270
|
+
for (let i = 0; i < COUNT; i++)
|
|
271
|
+
batch.put(enc(i), b(i & 0xff));
|
|
272
|
+
await batch.write();
|
|
273
|
+
});
|
|
274
|
+
it('streams every entry once, ascending, while awaiting an unrelated get each step', async () => {
|
|
275
|
+
const seen = [];
|
|
276
|
+
for await (const entry of store.iterate()) {
|
|
277
|
+
// Await an unrelated op mid-loop: a naive single-cursor IDB iterate would let
|
|
278
|
+
// its readonly tx auto-commit here and throw TransactionInactiveError next step.
|
|
279
|
+
await store.get(enc(0));
|
|
280
|
+
seen.push(dec(entry.key));
|
|
281
|
+
}
|
|
282
|
+
assert.strictEqual(seen.length, COUNT);
|
|
283
|
+
for (let i = 0; i < COUNT; i++)
|
|
284
|
+
assert.strictEqual(seen[i], i, `entry ${i}`);
|
|
285
|
+
});
|
|
286
|
+
it('honors reverse across the batch boundary', async () => {
|
|
287
|
+
const seen = [];
|
|
288
|
+
for await (const entry of store.iterate({ reverse: true }))
|
|
289
|
+
seen.push(dec(entry.key));
|
|
290
|
+
assert.strictEqual(seen.length, COUNT);
|
|
291
|
+
for (let i = 0; i < COUNT; i++)
|
|
292
|
+
assert.strictEqual(seen[i], COUNT - 1 - i);
|
|
293
|
+
});
|
|
294
|
+
it('honors a limit that spans the batch boundary', async () => {
|
|
295
|
+
const limit = 300;
|
|
296
|
+
const seen = [];
|
|
297
|
+
for await (const entry of store.iterate({ limit }))
|
|
298
|
+
seen.push(dec(entry.key));
|
|
299
|
+
assert.strictEqual(seen.length, limit);
|
|
300
|
+
assert.strictEqual(seen[0], 0);
|
|
301
|
+
assert.strictEqual(seen[limit - 1], limit - 1);
|
|
302
|
+
});
|
|
303
|
+
it('handles an inclusive upper bound landing on an exact batch multiple (no DataError)', async () => {
|
|
304
|
+
// [0..255] is exactly one 256-entry batch and its max key equals the inclusive
|
|
305
|
+
// lte bound — the resume edge collapses to an empty range that must read as
|
|
306
|
+
// "exhausted", never throw. Regression from plugins-indexeddb-diverges.
|
|
307
|
+
const seen = [];
|
|
308
|
+
for await (const entry of store.iterate({ lte: enc(255) }))
|
|
309
|
+
seen.push(dec(entry.key));
|
|
310
|
+
assert.strictEqual(seen.length, 256);
|
|
311
|
+
assert.strictEqual(seen[0], 0);
|
|
312
|
+
assert.strictEqual(seen[255], 255);
|
|
313
|
+
});
|
|
314
|
+
it('handles an inclusive lower bound landing on an exact reverse batch multiple', async () => {
|
|
315
|
+
// Reverse mirror: [50..305] is exactly 256, its min key equals the inclusive gte
|
|
316
|
+
// bound, and reverse resumes on the upper edge.
|
|
317
|
+
const seen = [];
|
|
318
|
+
for await (const entry of store.iterate({ gte: enc(50), reverse: true }))
|
|
319
|
+
seen.push(dec(entry.key));
|
|
320
|
+
assert.strictEqual(seen.length, 256);
|
|
321
|
+
assert.strictEqual(seen[0], 305);
|
|
322
|
+
assert.strictEqual(seen[255], 50);
|
|
323
|
+
});
|
|
324
|
+
});
|
|
325
|
+
// ------------------------------------------------------------------
|
|
326
|
+
// Tier 4 — batch
|
|
327
|
+
// ------------------------------------------------------------------
|
|
328
|
+
describe('tier 4: batch', () => {
|
|
329
|
+
it('nothing is visible until write(), then all ops apply', async () => {
|
|
330
|
+
const batch = store.batch();
|
|
331
|
+
batch.put(b(1), b(10));
|
|
332
|
+
batch.put(b(2), b(20));
|
|
333
|
+
assert.strictEqual(await store.has(b(1)), false, 'not visible before write()');
|
|
334
|
+
await batch.write();
|
|
335
|
+
assertBytes(await store.get(b(1)), b(10));
|
|
336
|
+
assertBytes(await store.get(b(2)), b(20));
|
|
337
|
+
});
|
|
338
|
+
it('mixed put + delete in one batch apply together', async () => {
|
|
339
|
+
await store.put(b(1), b(10));
|
|
340
|
+
const batch = store.batch();
|
|
341
|
+
batch.delete(b(1));
|
|
342
|
+
batch.put(b(2), b(20));
|
|
343
|
+
await batch.write();
|
|
344
|
+
assert.strictEqual(await store.get(b(1)), undefined);
|
|
345
|
+
assertBytes(await store.get(b(2)), b(20));
|
|
346
|
+
});
|
|
347
|
+
it('a committed batch does not re-apply its ops on reuse', async () => {
|
|
348
|
+
const batch = store.batch();
|
|
349
|
+
batch.put(b(1), b(11));
|
|
350
|
+
await batch.write();
|
|
351
|
+
assertBytes(await store.get(b(1)), b(11));
|
|
352
|
+
// Remove k1 out-of-band, then reuse the same batch handle.
|
|
353
|
+
await store.delete(b(1));
|
|
354
|
+
batch.put(b(2), b(22));
|
|
355
|
+
await batch.write();
|
|
356
|
+
// If write() had not cleared ops, the second commit would resurrect k1.
|
|
357
|
+
assert.strictEqual(await store.get(b(1)), undefined);
|
|
358
|
+
assertBytes(await store.get(b(2)), b(22));
|
|
359
|
+
});
|
|
360
|
+
it('clear() discards queued ops', async () => {
|
|
361
|
+
const batch = store.batch();
|
|
362
|
+
batch.put(b(1), b(10));
|
|
363
|
+
batch.clear();
|
|
364
|
+
await batch.write();
|
|
365
|
+
assert.strictEqual(await store.has(b(1)), false);
|
|
366
|
+
});
|
|
367
|
+
it('an empty batch write() is a no-op (no throw)', async () => {
|
|
368
|
+
await store.batch().write(); // must not throw
|
|
369
|
+
assert.strictEqual(await store.approximateCount(), 0);
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
// ------------------------------------------------------------------
|
|
373
|
+
// Tier 5 — persistence (only registered when the adapter provides reopen)
|
|
374
|
+
// ------------------------------------------------------------------
|
|
375
|
+
if (supportsReopen) {
|
|
376
|
+
describe('tier 5: persistence across reopen', () => {
|
|
377
|
+
it('data written before close is present after reopen', async () => {
|
|
378
|
+
await store.put(b(1, 2, 3), b(4, 5, 6));
|
|
379
|
+
await store.put(b(9), b(9, 9));
|
|
380
|
+
// reopen() closes the current handle and reopens the SAME keyspace, no wipe.
|
|
381
|
+
store = await backend.reopen();
|
|
382
|
+
assertBytes(await store.get(b(1, 2, 3)), b(4, 5, 6));
|
|
383
|
+
assertBytes(await store.get(b(9)), b(9, 9));
|
|
384
|
+
assert.strictEqual(await store.approximateCount(), 2);
|
|
385
|
+
});
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
// ------------------------------------------------------------------
|
|
389
|
+
// Tier 6 — cross-backend byte-ordering agreement (the encoding coupling)
|
|
390
|
+
// ------------------------------------------------------------------
|
|
391
|
+
describe('tier 6: encoded-key ordering agreement', () => {
|
|
392
|
+
it('iterates shuffled encoded keys in compareBytes order (forward and reverse)', async () => {
|
|
393
|
+
const encoded = GOLDEN.map(key1);
|
|
394
|
+
// Guard: the curated vector must be all-distinct, else the count assertions below
|
|
395
|
+
// would silently pass with a collision masking a missing key.
|
|
396
|
+
assert.strictEqual(new Set(encoded.map((k) => k.join(','))).size, encoded.length, 'GOLDEN must encode to distinct keys');
|
|
397
|
+
for (const idx of GOLDEN_SHUFFLE)
|
|
398
|
+
await store.put(encoded[idx], b(idx));
|
|
399
|
+
const expected = sortedByBytes(encoded);
|
|
400
|
+
assert.deepStrictEqual(await keysOf(store), expected);
|
|
401
|
+
assert.deepStrictEqual(await keysOf(store, { reverse: true }), [...expected].reverse());
|
|
402
|
+
});
|
|
403
|
+
it('reorder-equal JSON objects collapse to a single stored entry', async () => {
|
|
404
|
+
await store.put(key1(OBJ_A), b(1));
|
|
405
|
+
await store.put(key1(OBJ_B), b(2)); // same key bytes → overwrites
|
|
406
|
+
assert.strictEqual(await store.approximateCount(), 1);
|
|
407
|
+
assertBytes(await store.get(key1(OBJ_A)), b(2));
|
|
408
|
+
});
|
|
409
|
+
it('5n and 5.0 encode to one key and collapse to a single stored entry', async () => {
|
|
410
|
+
await store.put(key1(5n), b(1));
|
|
411
|
+
await store.put(key1(5), b(2)); // 5.0 → identical numeric key → overwrites
|
|
412
|
+
assert.strictEqual(await store.approximateCount(), 1);
|
|
413
|
+
assertBytes(await store.get(key1(5n)), b(2));
|
|
414
|
+
});
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
//# sourceMappingURL=kv-conformance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kv-conformance.js","sourceRoot":"","sources":["../../../src/testing/kv-conformance.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quereus/store",
|
|
3
|
-
"version": "4.3.
|
|
3
|
+
"version": "4.3.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Abstract key-value storage module for Quereus",
|
|
6
6
|
"keywords": [
|
|
@@ -30,22 +30,34 @@
|
|
|
30
30
|
".": {
|
|
31
31
|
"types": "./dist/src/index.d.ts",
|
|
32
32
|
"import": "./dist/src/index.js"
|
|
33
|
+
},
|
|
34
|
+
"./testing": {
|
|
35
|
+
"types": "./dist/src/testing/kv-conformance.d.ts",
|
|
36
|
+
"import": "./dist/src/testing/kv-conformance.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"typesVersions": {
|
|
40
|
+
"*": {
|
|
41
|
+
"testing": [
|
|
42
|
+
"./dist/src/testing/kv-conformance.d.ts"
|
|
43
|
+
]
|
|
33
44
|
}
|
|
34
45
|
},
|
|
35
46
|
"scripts": {
|
|
36
47
|
"clean": "rimraf dist",
|
|
37
48
|
"build": "tsc",
|
|
49
|
+
"lint": "echo 'No lint configured'",
|
|
38
50
|
"typecheck": "tsc --noEmit",
|
|
39
51
|
"test": "cd ../.. && node --import ./packages/quereus-store/register.mjs node_modules/mocha/bin/mocha.js \"packages/quereus-store/test/**/*.spec.ts\" --reporter min --colors",
|
|
40
52
|
"test:single": "cd ../.. && node --import ./packages/quereus-store/register.mjs node_modules/mocha/bin/mocha.js --bail"
|
|
41
53
|
},
|
|
42
54
|
"peerDependencies": {
|
|
43
|
-
"@quereus/isolation": "^4.3.
|
|
44
|
-
"@quereus/quereus": "^4.3.
|
|
55
|
+
"@quereus/isolation": "^4.3.2",
|
|
56
|
+
"@quereus/quereus": "^4.3.2"
|
|
45
57
|
},
|
|
46
58
|
"dependencies": {
|
|
47
|
-
"@quereus/isolation": "^4.3.
|
|
48
|
-
"@quereus/quereus": "^4.3.
|
|
59
|
+
"@quereus/isolation": "^4.3.2",
|
|
60
|
+
"@quereus/quereus": "^4.3.2"
|
|
49
61
|
},
|
|
50
62
|
"devDependencies": {
|
|
51
63
|
"@types/mocha": "^10.0.10",
|