@procedures/collections 0.14.1 → 0.15.0
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/CHANGELOG.md +38 -0
- package/README.md +40 -4
- package/dist/.tsbuildinfo +1 -1
- package/dist/storage/index.d.ts +3 -1
- package/dist/storage/index.d.ts.map +1 -1
- package/dist/storage/index.js +3 -0
- package/dist/storage/index.js.map +1 -1
- package/dist/storage/interface.d.ts +40 -9
- package/dist/storage/interface.d.ts.map +1 -1
- package/dist/storage/interface.js.map +1 -1
- package/dist/storage/memory.d.ts +27 -7
- package/dist/storage/memory.d.ts.map +1 -1
- package/dist/storage/memory.js +31 -2
- package/dist/storage/memory.js.map +1 -1
- package/dist/testing/index.d.ts +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/storage-contract.d.ts +16 -0
- package/dist/testing/storage-contract.d.ts.map +1 -1
- package/dist/testing/storage-contract.js +102 -1
- package/dist/testing/storage-contract.js.map +1 -1
- package/package.json +2 -2
- package/src/storage/index.ts +18 -0
- package/src/storage/interface.ts +42 -9
- package/src/storage/memory.ts +45 -6
- package/src/testing/index.ts +1 -0
- package/src/testing/storage-contract.ts +144 -1
|
@@ -31,6 +31,10 @@ import type { StoragePatch, StorageQueryOptions, StorageQueryPolicy, StorageSele
|
|
|
31
31
|
* - `query()` gives the result of `queryEntries()` for the entries of the storage.
|
|
32
32
|
* - `observe()` gives one batch for each write that changes the storage, before the write resolves.
|
|
33
33
|
* - `patch()` changes the item in one step: two patches at the same time keep each field.
|
|
34
|
+
* - A write with a precondition (`expectedVersion` of `set` and `delete`, `expectedVersions` of
|
|
35
|
+
* `setBatch`) tests the version of the current item and writes in one step. A conflict changes
|
|
36
|
+
* nothing and rejects with `VersionConflictError`. A storage that cannot test a precondition
|
|
37
|
+
* rejects the write with a `TypeError`: it never ignores a precondition (roadmap CLI-16).
|
|
34
38
|
*
|
|
35
39
|
* The optional methods are features: a caller tests for each one before it uses it.
|
|
36
40
|
*/
|
|
@@ -126,18 +130,21 @@ export interface CollectionStorage<T> {
|
|
|
126
130
|
*
|
|
127
131
|
* @param id - Item identifier
|
|
128
132
|
* @param value - Item to store
|
|
129
|
-
* @param options - The origin of the write, for the observers
|
|
130
|
-
*
|
|
133
|
+
* @param options - The origin of the write, for the observers, and the expected version of the
|
|
134
|
+
* current item (roadmap CLI-16)
|
|
135
|
+
* @returns Promise resolving when operation completes. A conflict rejects with `VersionConflictError`.
|
|
131
136
|
*/
|
|
132
|
-
set(id: string, value: T, options?:
|
|
137
|
+
set(id: string, value: T, options?: StorageItemWriteOptions): Promise<void>;
|
|
133
138
|
/**
|
|
134
139
|
* Delete item by ID.
|
|
135
140
|
*
|
|
136
141
|
* @param id - Item identifier
|
|
137
|
-
* @param options - The origin of the write, for the observers
|
|
138
|
-
*
|
|
142
|
+
* @param options - The origin of the write, for the observers, and the expected version of the
|
|
143
|
+
* current item (roadmap CLI-16)
|
|
144
|
+
* @returns Promise resolving to true if item was deleted, false if not found. A conflict rejects
|
|
145
|
+
* with `VersionConflictError`.
|
|
139
146
|
*/
|
|
140
|
-
delete(id: string, options?:
|
|
147
|
+
delete(id: string, options?: StorageItemWriteOptions): Promise<boolean>;
|
|
141
148
|
/**
|
|
142
149
|
* Clear all items from collection.
|
|
143
150
|
*
|
|
@@ -164,10 +171,12 @@ export interface CollectionStorage<T> {
|
|
|
164
171
|
* Set multiple items at once (more efficient than individual sets).
|
|
165
172
|
*
|
|
166
173
|
* @param items - Array of [id, value] tuples
|
|
167
|
-
* @param options - The origin of the write, for the observers
|
|
168
|
-
*
|
|
174
|
+
* @param options - The origin of the write, for the observers, and the expected version of
|
|
175
|
+
* each id (roadmap CLI-16)
|
|
176
|
+
* @returns Promise resolving when operation completes. A conflict of one id rejects with
|
|
177
|
+
* `VersionConflictError`, and the batch changes no item.
|
|
169
178
|
*/
|
|
170
|
-
setBatch(items: Array<[string, T]>, options?:
|
|
179
|
+
setBatch(items: Array<[string, T]>, options?: StorageBatchWriteOptions): Promise<void>;
|
|
171
180
|
/**
|
|
172
181
|
* Delete multiple items at once.
|
|
173
182
|
*
|
|
@@ -214,6 +223,28 @@ export interface StorageWriteOptions {
|
|
|
214
223
|
*/
|
|
215
224
|
readonly origin?: string | undefined;
|
|
216
225
|
}
|
|
226
|
+
/**
|
|
227
|
+
* The options of `set` and `delete`: the origin, and the precondition of the write (roadmap
|
|
228
|
+
* CLI-16).
|
|
229
|
+
*/
|
|
230
|
+
export interface StorageItemWriteOptions extends StorageWriteOptions {
|
|
231
|
+
/**
|
|
232
|
+
* The version that the write expects for the current item: the value of `versionOf` of the
|
|
233
|
+
* storage for that item. `null` expects no item. When the current item has another version, the
|
|
234
|
+
* write changes nothing and rejects with `VersionConflictError`. A storage without `versionOf`
|
|
235
|
+
* rejects the write with a `TypeError`. Absent: no precondition, and the last write wins.
|
|
236
|
+
*/
|
|
237
|
+
readonly expectedVersion?: string | null | undefined;
|
|
238
|
+
}
|
|
239
|
+
/** The options of `setBatch`: the origin, and the precondition of each id (roadmap CLI-16). */
|
|
240
|
+
export interface StorageBatchWriteOptions extends StorageWriteOptions {
|
|
241
|
+
/**
|
|
242
|
+
* The version that the write expects for the current item of each id, as `expectedVersion`
|
|
243
|
+
* does. When one id has a conflict, the batch changes no item. An id without an entry has no
|
|
244
|
+
* precondition.
|
|
245
|
+
*/
|
|
246
|
+
readonly expectedVersions?: ReadonlyArray<readonly [string, string | null]> | undefined;
|
|
247
|
+
}
|
|
217
248
|
/** A change of `observe()`: an id got a value. */
|
|
218
249
|
export interface StorageSetChange<T> {
|
|
219
250
|
readonly type: "set";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEvH
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA0WH;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAI,KAAiB;IACzD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/storage/memory.d.ts
CHANGED
|
@@ -4,11 +4,11 @@
|
|
|
4
4
|
* Fast, volatile storage using JavaScript Map.
|
|
5
5
|
* All operations return Promises for interface consistency.
|
|
6
6
|
*/
|
|
7
|
-
import type { CollectionStorage, StorageChanges, StorageMetadata, StorageObserver, StorageWriteOptions } from "./interface.js";
|
|
7
|
+
import type { CollectionStorage, StorageBatchWriteOptions, StorageChanges, StorageItemWriteOptions, StorageMetadata, StorageObserver, StorageWriteOptions } from "./interface.js";
|
|
8
8
|
import { type ListenerErrorHandler } from "./listeners.js";
|
|
9
9
|
import { type StoragePatch, type StorageQueryOptions, type StorageQueryPolicy, type StorageSelector } from "@procedures/client/query";
|
|
10
10
|
/** Options of an in-memory storage. */
|
|
11
|
-
export interface InMemoryStorageOptions {
|
|
11
|
+
export interface InMemoryStorageOptions<T = unknown> {
|
|
12
12
|
/**
|
|
13
13
|
* The function that gets the error of an observer of `observe()`. The default throws the error
|
|
14
14
|
* again in a microtask (`reportListenerError`). The write and the other observers do not fail.
|
|
@@ -37,6 +37,13 @@ export interface InMemoryStorageOptions {
|
|
|
37
37
|
* @default true
|
|
38
38
|
*/
|
|
39
39
|
copies?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* The version of an item, for example `(item) => item.rev` (roadmap CLI-16). With it, `set`,
|
|
42
|
+
* `delete` and `setBatch` take an expected version: a write whose current item has another
|
|
43
|
+
* version changes nothing and rejects with `VersionConflictError`. The test and the write are
|
|
44
|
+
* one synchronous step. Without it, a write with an expected version rejects with a `TypeError`.
|
|
45
|
+
*/
|
|
46
|
+
versionOf?: ((item: T) => string | undefined) | undefined;
|
|
40
47
|
}
|
|
41
48
|
/**
|
|
42
49
|
* In-memory storage backed by JavaScript Map.
|
|
@@ -54,6 +61,8 @@ export interface InMemoryStorageOptions {
|
|
|
54
61
|
* - `query()` runs a selector, `observe()` tells each change with the origin of its write, and
|
|
55
62
|
* `patch()` merges fields into an item in one step
|
|
56
63
|
* - After `close()`, each operation rejects, and a second `close()` does nothing
|
|
64
|
+
* - With the option `versionOf`, a write can expect the version of the current item (roadmap
|
|
65
|
+
* CLI-16). The test and the write are one synchronous step.
|
|
57
66
|
*
|
|
58
67
|
* @example
|
|
59
68
|
* ```typescript
|
|
@@ -79,7 +88,9 @@ export declare class InMemoryStorage<T> implements CollectionStorage<T> {
|
|
|
79
88
|
private readonly observers;
|
|
80
89
|
/** The query policy of a call without a policy */
|
|
81
90
|
private readonly queryPolicy;
|
|
82
|
-
|
|
91
|
+
/** The version of an item, for the preconditions of the writes (roadmap CLI-16) */
|
|
92
|
+
private readonly versionOf;
|
|
93
|
+
constructor(options?: InMemoryStorageOptions<T>);
|
|
83
94
|
get(id: string): Promise<T | undefined>;
|
|
84
95
|
getAll(): Promise<T[]>;
|
|
85
96
|
getEntries(): Promise<Array<[string, T]>>;
|
|
@@ -107,8 +118,8 @@ export declare class InMemoryStorage<T> implements CollectionStorage<T> {
|
|
|
107
118
|
observe(observer: StorageObserver<T>): () => void;
|
|
108
119
|
has(id: string): Promise<boolean>;
|
|
109
120
|
size(): Promise<number>;
|
|
110
|
-
set(id: string, value: T, options?:
|
|
111
|
-
delete(id: string, options?:
|
|
121
|
+
set(id: string, value: T, options?: StorageItemWriteOptions): Promise<void>;
|
|
122
|
+
delete(id: string, options?: StorageItemWriteOptions): Promise<boolean>;
|
|
112
123
|
clear(options?: StorageWriteOptions): Promise<void>;
|
|
113
124
|
/**
|
|
114
125
|
* This method changes the item of the id in one step (a JSON Merge Patch, or the operations
|
|
@@ -116,8 +127,11 @@ export declare class InMemoryStorage<T> implements CollectionStorage<T> {
|
|
|
116
127
|
* result is undefined. A patch that cannot apply to the item changes nothing.
|
|
117
128
|
*/
|
|
118
129
|
patch(id: string, fields: StoragePatch, options?: StorageWriteOptions): Promise<T | undefined>;
|
|
119
|
-
/**
|
|
120
|
-
|
|
130
|
+
/**
|
|
131
|
+
* This method sets several items. When one value has no copy, or one expected version has a
|
|
132
|
+
* conflict, nothing changes.
|
|
133
|
+
*/
|
|
134
|
+
setBatch(items: Array<[string, T]>, options?: StorageBatchWriteOptions): Promise<void>;
|
|
121
135
|
deleteBatch(ids: string[], options?: StorageWriteOptions): Promise<number>;
|
|
122
136
|
getBatch(ids: string[]): Promise<Map<string, T>>;
|
|
123
137
|
/**
|
|
@@ -157,6 +171,12 @@ export declare class InMemoryStorage<T> implements CollectionStorage<T> {
|
|
|
157
171
|
[Symbol.iterator](): IterableIterator<[string, T]>;
|
|
158
172
|
/** This method throws after `close()`. In an async method, the throw rejects the promise. */
|
|
159
173
|
private checkOpen;
|
|
174
|
+
/**
|
|
175
|
+
* This method tests the expected versions against the current items (roadmap CLI-16). A conflict
|
|
176
|
+
* throws `VersionConflictError` with copies of the current items. Without `versionOf`, it throws
|
|
177
|
+
* a `TypeError`. The caller writes in the same synchronous step, so no write comes between.
|
|
178
|
+
*/
|
|
179
|
+
private checkVersions;
|
|
160
180
|
/** The entries with copies of the values. */
|
|
161
181
|
private copiedEntries;
|
|
162
182
|
/** The `set` change of a stored value: a copy of it for the observers. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,iBAAiB,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/memory.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* All operations return Promises for interface consistency.
|
|
6
6
|
*/
|
|
7
7
|
import { StorageListeners } from "./listeners.js";
|
|
8
|
-
import { applyPatch, patchProblems, queryEntries, } from "@procedures/client/query";
|
|
8
|
+
import { VersionConflictError, applyPatch, patchProblems, preconditionNotSupported, queryEntries, versionConflicts, } from "@procedures/client/query";
|
|
9
9
|
/** A new epoch: a version of another storage does not match it. */
|
|
10
10
|
function newEpoch() {
|
|
11
11
|
return Math.random().toString(36).slice(2, 10);
|
|
@@ -32,6 +32,8 @@ function withOrigin(change, options) {
|
|
|
32
32
|
* - `query()` runs a selector, `observe()` tells each change with the origin of its write, and
|
|
33
33
|
* `patch()` merges fields into an item in one step
|
|
34
34
|
* - After `close()`, each operation rejects, and a second `close()` does nothing
|
|
35
|
+
* - With the option `versionOf`, a write can expect the version of the current item (roadmap
|
|
36
|
+
* CLI-16). The test and the write are one synchronous step.
|
|
35
37
|
*
|
|
36
38
|
* @example
|
|
37
39
|
* ```typescript
|
|
@@ -59,11 +61,14 @@ export class InMemoryStorage {
|
|
|
59
61
|
observers;
|
|
60
62
|
/** The query policy of a call without a policy */
|
|
61
63
|
queryPolicy;
|
|
64
|
+
/** The version of an item, for the preconditions of the writes (roadmap CLI-16) */
|
|
65
|
+
versionOf;
|
|
62
66
|
constructor(options = {}) {
|
|
63
67
|
this.maxTombstones = Math.max(0, options.maxTombstones ?? 10_000);
|
|
64
68
|
this.copy = options.copies === false ? same : clone;
|
|
65
69
|
this.observers = new StorageListeners(options.onObserverError);
|
|
66
70
|
this.queryPolicy = options.queryPolicy;
|
|
71
|
+
this.versionOf = options.versionOf;
|
|
67
72
|
}
|
|
68
73
|
//
|
|
69
74
|
// ═══ Read Operations ═══
|
|
@@ -152,6 +157,8 @@ export class InMemoryStorage {
|
|
|
152
157
|
//
|
|
153
158
|
async set(id, value, options) {
|
|
154
159
|
this.checkOpen();
|
|
160
|
+
if (options?.expectedVersion !== undefined)
|
|
161
|
+
this.checkVersions([[id, options.expectedVersion]]);
|
|
155
162
|
const stored = this.copy(value);
|
|
156
163
|
this.data.set(id, stored);
|
|
157
164
|
this.noteSet(id);
|
|
@@ -160,6 +167,8 @@ export class InMemoryStorage {
|
|
|
160
167
|
}
|
|
161
168
|
async delete(id, options) {
|
|
162
169
|
this.checkOpen();
|
|
170
|
+
if (options?.expectedVersion !== undefined)
|
|
171
|
+
this.checkVersions([[id, options.expectedVersion]]);
|
|
163
172
|
const existed = this.data.delete(id);
|
|
164
173
|
if (existed) {
|
|
165
174
|
this.noteDelete(id);
|
|
@@ -199,9 +208,14 @@ export class InMemoryStorage {
|
|
|
199
208
|
//
|
|
200
209
|
// ═══ Bulk Operations ═══
|
|
201
210
|
//
|
|
202
|
-
/**
|
|
211
|
+
/**
|
|
212
|
+
* This method sets several items. When one value has no copy, or one expected version has a
|
|
213
|
+
* conflict, nothing changes.
|
|
214
|
+
*/
|
|
203
215
|
async setBatch(items, options) {
|
|
204
216
|
this.checkOpen();
|
|
217
|
+
if (options?.expectedVersions !== undefined && options.expectedVersions.length > 0)
|
|
218
|
+
this.checkVersions(options.expectedVersions);
|
|
205
219
|
const copies = items.map(([id, value]) => [id, this.copy(value)]);
|
|
206
220
|
for (const [id, value] of copies) {
|
|
207
221
|
this.data.set(id, value);
|
|
@@ -320,6 +334,21 @@ export class InMemoryStorage {
|
|
|
320
334
|
if (this.closed)
|
|
321
335
|
throw new Error("The InMemoryStorage is closed");
|
|
322
336
|
}
|
|
337
|
+
/**
|
|
338
|
+
* This method tests the expected versions against the current items (roadmap CLI-16). A conflict
|
|
339
|
+
* throws `VersionConflictError` with copies of the current items. Without `versionOf`, it throws
|
|
340
|
+
* a `TypeError`. The caller writes in the same synchronous step, so no write comes between.
|
|
341
|
+
*/
|
|
342
|
+
checkVersions(expected) {
|
|
343
|
+
const versionOf = this.versionOf;
|
|
344
|
+
if (!versionOf)
|
|
345
|
+
throw preconditionNotSupported("This InMemoryStorage");
|
|
346
|
+
const currentOf = (id) => (this.data.has(id) ? { found: true, value: this.data.get(id) } : { found: false });
|
|
347
|
+
const conflicts = versionConflicts(expected, currentOf, versionOf);
|
|
348
|
+
if (conflicts.length > 0) {
|
|
349
|
+
throw new VersionConflictError(conflicts.map((conflict) => (conflict.found ? { ...conflict, value: this.copy(conflict.value) } : conflict)));
|
|
350
|
+
}
|
|
351
|
+
}
|
|
323
352
|
/** The entries with copies of the values. */
|
|
324
353
|
copiedEntries() {
|
|
325
354
|
return Array.from(this.data, ([id, value]) => [id, this.copy(value)]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/storage/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* tests with a factory of its storage. The entry imports no test framework: the caller gives
|
|
6
6
|
* `describe` and `it`. The runtime entries of the package do not import this entry.
|
|
7
7
|
*/
|
|
8
|
-
export { collectionStorageContract, describeCollectionStorageContract, type CollectionStorageContractOptions, type ContractCase, type ContractItem, type ContractStorage, type ContractTestApi, type ContractTestContext, } from "./storage-contract.js";
|
|
8
|
+
export { collectionStorageContract, contractVersionOf, describeCollectionStorageContract, type CollectionStorageContractOptions, type ContractCase, type ContractItem, type ContractStorage, type ContractTestApi, type ContractTestContext, } from "./storage-contract.js";
|
|
9
9
|
export { ContractViolation, deepEqual } from "./check.js";
|
|
10
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,yBAAyB,EACzB,iCAAiC,EACjC,KAAK,gCAAgC,EACrC,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,iCAAiC,EACjC,KAAK,gCAAgC,EACrC,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/testing/index.js
CHANGED
|
@@ -5,6 +5,6 @@
|
|
|
5
5
|
* tests with a factory of its storage. The entry imports no test framework: the caller gives
|
|
6
6
|
* `describe` and `it`. The runtime entries of the package do not import this entry.
|
|
7
7
|
*/
|
|
8
|
-
export { collectionStorageContract, describeCollectionStorageContract, } from "./storage-contract.js";
|
|
8
|
+
export { collectionStorageContract, contractVersionOf, describeCollectionStorageContract, } from "./storage-contract.js";
|
|
9
9
|
export { ContractViolation, deepEqual } from "./check.js";
|
|
10
10
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,yBAAyB,EACzB,iCAAiC,GAOlC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,yBAAyB,EACzB,iBAAiB,EACjB,iCAAiC,GAOlC,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -25,6 +25,11 @@
|
|
|
25
25
|
* With `createWithQueryPolicy`, the suite also tests the opt-in of `$regex` and each limit of a
|
|
26
26
|
* policy. `observe()` gives one batch for each write that changes the storage. `patch()` changes
|
|
27
27
|
* an item in one step, in each of its two forms. A storage without them skips their cases.
|
|
28
|
+
*
|
|
29
|
+
* The preconditions of the writes (roadmap CLI-16): a storage of `create()` cannot test an
|
|
30
|
+
* expected version, so it rejects such a write and changes nothing. With `createWithVersions`, the
|
|
31
|
+
* suite tests `expectedVersion` of `set` and `delete`, `expectedVersions` of `setBatch`, the
|
|
32
|
+
* conflicts and their current items, and two writes at the same time.
|
|
28
33
|
*/
|
|
29
34
|
import type { CollectionStorage } from "../storage/interface.js";
|
|
30
35
|
import { type StorageQueryPolicy } from "@procedures/client/query";
|
|
@@ -36,6 +41,11 @@ export interface ContractItem {
|
|
|
36
41
|
}
|
|
37
42
|
/** A storage of the suite. */
|
|
38
43
|
export type ContractStorage = CollectionStorage<ContractItem>;
|
|
44
|
+
/**
|
|
45
|
+
* The version of an item of the suite: `v` and the field `n`. A storage of `createWithVersions`
|
|
46
|
+
* gives it as its `versionOf` (roadmap CLI-16).
|
|
47
|
+
*/
|
|
48
|
+
export declare function contractVersionOf(item: ContractItem): string | undefined;
|
|
39
49
|
/** The options of the suite: the factories of the storage. */
|
|
40
50
|
export interface CollectionStorageContractOptions {
|
|
41
51
|
/**
|
|
@@ -54,6 +64,12 @@ export interface CollectionStorageContractOptions {
|
|
|
54
64
|
* and each limit of a policy.
|
|
55
65
|
*/
|
|
56
66
|
createWithQueryPolicy?: ((policy: StorageQueryPolicy) => ContractStorage | Promise<ContractStorage>) | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* This function makes a new, empty storage that gives each item the version of `versionOf` (the
|
|
69
|
+
* storage of the server for a remote storage). With it, the suite tests the preconditions of
|
|
70
|
+
* the writes (roadmap CLI-16). `versionOf` is `contractVersionOf`.
|
|
71
|
+
*/
|
|
72
|
+
createWithVersions?: ((versionOf: (item: ContractItem) => string | undefined) => ContractStorage | Promise<ContractStorage>) | undefined;
|
|
57
73
|
}
|
|
58
74
|
/** The context that a test framework gives to a case. Vitest gives `skip`. */
|
|
59
75
|
export interface ContractTestContext {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-contract.d.ts","sourceRoot":"","sources":["../../src/testing/storage-contract.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"storage-contract.d.ts","sourceRoot":"","sources":["../../src/testing/storage-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,yBAAyB,CAAC;AACrG,OAAO,EAKL,KAAK,kBAAkB,EAGxB,MAAM,0BAA0B,CAAC;AAGlC,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,8BAA8B;AAC9B,MAAM,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;AAE9D;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAExE;AAED,8DAA8D;AAC9D,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,MAAM,IAAI,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACrD;;;OAGG;IACH,uBAAuB,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,SAAS,CAAC;IACpG;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,kBAAkB,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,SAAS,CAAC;IACjH;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,MAAM,GAAG,SAAS,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,GAAG,SAAS,CAAC;CAC1I;AAED,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,6BAA6B;AAC7B,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,gGAAgG;AAChG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC;IAClD,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC;CAClF;AAuMD;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gCAAgC,GAAG,YAAY,EAAE,CA+2BnG;AAoHD;;;GAGG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gCAAgC,EAAE,GAAG,EAAE,eAAe,GAAG,IAAI,CAMrI"}
|
|
@@ -25,9 +25,21 @@
|
|
|
25
25
|
* With `createWithQueryPolicy`, the suite also tests the opt-in of `$regex` and each limit of a
|
|
26
26
|
* policy. `observe()` gives one batch for each write that changes the storage. `patch()` changes
|
|
27
27
|
* an item in one step, in each of its two forms. A storage without them skips their cases.
|
|
28
|
+
*
|
|
29
|
+
* The preconditions of the writes (roadmap CLI-16): a storage of `create()` cannot test an
|
|
30
|
+
* expected version, so it rejects such a write and changes nothing. With `createWithVersions`, the
|
|
31
|
+
* suite tests `expectedVersion` of `set` and `delete`, `expectedVersions` of `setBatch`, the
|
|
32
|
+
* conflicts and their current items, and two writes at the same time.
|
|
28
33
|
*/
|
|
29
|
-
import { QUERY_OPERATORS, queryEntries } from "@procedures/client/query";
|
|
34
|
+
import { QUERY_OPERATORS, queryEntries, versionConflictsOf, } from "@procedures/client/query";
|
|
30
35
|
import { holds, rejects, same, show } from "./check.js";
|
|
36
|
+
/**
|
|
37
|
+
* The version of an item of the suite: `v` and the field `n`. A storage of `createWithVersions`
|
|
38
|
+
* gives it as its `versionOf` (roadmap CLI-16).
|
|
39
|
+
*/
|
|
40
|
+
export function contractVersionOf(item) {
|
|
41
|
+
return typeof item?.n === "number" ? `v${item.n}` : undefined;
|
|
42
|
+
}
|
|
31
43
|
const item = (id, n, tags) => (tags === undefined ? { id, n } : { id, n, tags });
|
|
32
44
|
const ids = (items) => items.map((value) => value.id);
|
|
33
45
|
/** True for a value with a `then` function. */
|
|
@@ -1003,8 +1015,97 @@ export function collectionStorageContract(options) {
|
|
|
1003
1015
|
await check("after a second close()");
|
|
1004
1016
|
checkObserve("after a second close()");
|
|
1005
1017
|
}));
|
|
1018
|
+
addPreconditionCases(add, create, options.createWithVersions);
|
|
1006
1019
|
return cases;
|
|
1007
1020
|
}
|
|
1021
|
+
/**
|
|
1022
|
+
* This function gives the conflicts of a rejected write with a precondition. It checks the code
|
|
1023
|
+
* `VERSION_CONFLICT` first.
|
|
1024
|
+
*/
|
|
1025
|
+
function conflictsOfRejection(error, what) {
|
|
1026
|
+
const code = error?.code;
|
|
1027
|
+
holds(code === "VERSION_CONFLICT", `${what}: the error must have the code VERSION_CONFLICT, not ${show(code)} (${show(error instanceof Error ? error.message : error)})`);
|
|
1028
|
+
const conflicts = versionConflictsOf(error);
|
|
1029
|
+
holds(conflicts !== undefined, `${what}: the error must have its conflicts`);
|
|
1030
|
+
return conflicts;
|
|
1031
|
+
}
|
|
1032
|
+
/** The cases of the preconditions of the writes (roadmap CLI-16). */
|
|
1033
|
+
function addPreconditionCases(add, create, createWithVersions) {
|
|
1034
|
+
add("a storage that cannot test an expected version rejects the write, and changes nothing", () => withStorage(create, async (storage) => {
|
|
1035
|
+
await storage.set("a", item("a", 1));
|
|
1036
|
+
await rejects(() => storage.set("a", item("a", 2), { expectedVersion: "v1" }), "set() with expectedVersion on a storage without versions");
|
|
1037
|
+
await rejects(() => storage.delete("a", { expectedVersion: "v1" }), "delete() with expectedVersion on a storage without versions");
|
|
1038
|
+
await rejects(() => storage.setBatch([["a", item("a", 3)]], { expectedVersions: [["a", "v1"]] }), "setBatch() with expectedVersions on a storage without versions");
|
|
1039
|
+
same(await storage.get("a"), item("a", 1), "the item after the refused writes");
|
|
1040
|
+
// A write without a precondition is the write of before
|
|
1041
|
+
await storage.set("a", item("a", 4));
|
|
1042
|
+
same(await storage.get("a"), item("a", 4), "a write without expectedVersion");
|
|
1043
|
+
}));
|
|
1044
|
+
if (!createWithVersions)
|
|
1045
|
+
return;
|
|
1046
|
+
const versioned = () => createWithVersions(contractVersionOf);
|
|
1047
|
+
add("a write with the expected version of the current item writes, and a write without one writes as before", () => withStorage(versioned, async (storage) => {
|
|
1048
|
+
await storage.set("a", item("a", 1));
|
|
1049
|
+
await storage.set("a", item("a", 2), { expectedVersion: "v1" });
|
|
1050
|
+
same(await storage.get("a"), item("a", 2), "the item after set() with the expected version");
|
|
1051
|
+
await storage.set("a", item("a", 3));
|
|
1052
|
+
same(await storage.get("a"), item("a", 3), "the item after set() without expectedVersion");
|
|
1053
|
+
same(await storage.delete("a", { expectedVersion: "v3" }), true, "delete() with the expected version");
|
|
1054
|
+
same(await storage.get("a"), undefined, "the item after delete() with the expected version");
|
|
1055
|
+
}));
|
|
1056
|
+
add("a write with another expected version changes nothing, and rejects with VERSION_CONFLICT and the current item", () => withStorage(versioned, async (storage) => {
|
|
1057
|
+
await storage.set("a", item("a", 1));
|
|
1058
|
+
let batches = 0;
|
|
1059
|
+
const stop = storage.observe?.(() => {
|
|
1060
|
+
batches++;
|
|
1061
|
+
});
|
|
1062
|
+
const before = storage.getChangesSince ? (await storage.getChangesSince()).version : undefined;
|
|
1063
|
+
const expected = { id: "a", expected: "v2", found: true, value: item("a", 1), version: "v1" };
|
|
1064
|
+
const setError = await rejects(() => storage.set("a", item("a", 3), { expectedVersion: "v2" }), "set() with a stale version");
|
|
1065
|
+
same(conflictsOfRejection(setError, "set() with a stale version"), [expected], "the conflicts of set() with a stale version");
|
|
1066
|
+
const deleteError = await rejects(() => storage.delete("a", { expectedVersion: "v2" }), "delete() with a stale version");
|
|
1067
|
+
same(conflictsOfRejection(deleteError, "delete() with a stale version"), [expected], "the conflicts of delete() with a stale version");
|
|
1068
|
+
same(await storage.get("a"), item("a", 1), "the item after the refused writes");
|
|
1069
|
+
stop?.();
|
|
1070
|
+
same(batches, 0, "the batches of observe() for the refused writes");
|
|
1071
|
+
if (storage.getChangesSince && before !== undefined) {
|
|
1072
|
+
const after = await storage.getChangesSince(before);
|
|
1073
|
+
same({ changed: after.changed, deleted: after.deleted }, { changed: [], deleted: [] }, "the changes after the refused writes");
|
|
1074
|
+
}
|
|
1075
|
+
}));
|
|
1076
|
+
add("the expected version null expects no item", () => withStorage(versioned, async (storage) => {
|
|
1077
|
+
await storage.set("b", item("b", 1), { expectedVersion: null });
|
|
1078
|
+
same(await storage.get("b"), item("b", 1), "set() with expectedVersion null of a missing id");
|
|
1079
|
+
const exists = await rejects(() => storage.set("b", item("b", 2), { expectedVersion: null }), "set() with expectedVersion null of an existing id");
|
|
1080
|
+
same(conflictsOfRejection(exists, "set() with expectedVersion null of an existing id"), [{ id: "b", expected: null, found: true, value: item("b", 1), version: "v1" }], "the conflict of an existing id");
|
|
1081
|
+
const missing = await rejects(() => storage.set("c", item("c", 1), { expectedVersion: "v1" }), "set() with a version of a missing id");
|
|
1082
|
+
same(conflictsOfRejection(missing, "set() with a version of a missing id"), [{ id: "c", expected: "v1", found: false, version: null }], "the conflict of a missing id");
|
|
1083
|
+
same(await storage.has("c"), false, "the missing id after the refused set()");
|
|
1084
|
+
same(await storage.delete("x", { expectedVersion: null }), false, "delete() with expectedVersion null of a missing id");
|
|
1085
|
+
}));
|
|
1086
|
+
add("setBatch() tests the expected version of each id, and a conflict changes no item", () => withStorage(versioned, async (storage) => {
|
|
1087
|
+
await storage.setBatch([["a", item("a", 1)], ["b", item("b", 1)]]);
|
|
1088
|
+
const error = await rejects(() => storage.setBatch([["a", item("a", 2)], ["b", item("b", 2)], ["c", item("c", 1)]], { expectedVersions: [["a", "v1"], ["b", "v9"]] }), "setBatch() with one stale version");
|
|
1089
|
+
same(conflictsOfRejection(error, "setBatch() with one stale version"), [{ id: "b", expected: "v9", found: true, value: item("b", 1), version: "v1" }], "the conflicts of setBatch()");
|
|
1090
|
+
same(await storage.getBatch(["a", "b", "c"]), new Map([["a", item("a", 1)], ["b", item("b", 1)]]), "the items after the refused batch");
|
|
1091
|
+
// An id without an expected version has no precondition
|
|
1092
|
+
await storage.setBatch([["a", item("a", 2)], ["b", item("b", 2)], ["c", item("c", 1)]], { expectedVersions: [["a", "v1"], ["b", "v1"]] });
|
|
1093
|
+
same(await storage.getBatch(["a", "b", "c"]), new Map([["a", item("a", 2)], ["b", item("b", 2)], ["c", item("c", 1)]]), "the items after the batch");
|
|
1094
|
+
}));
|
|
1095
|
+
add("two writes with the same expected version at the same time: one writes, and the other gets VERSION_CONFLICT", () => withStorage(versioned, async (storage) => {
|
|
1096
|
+
await storage.set("a", item("a", 1));
|
|
1097
|
+
const results = await Promise.allSettled([
|
|
1098
|
+
storage.set("a", item("a", 2), { expectedVersion: "v1" }),
|
|
1099
|
+
storage.set("a", item("a", 3), { expectedVersion: "v1" }),
|
|
1100
|
+
]);
|
|
1101
|
+
const won = results.flatMap((result, index) => (result.status === "fulfilled" ? [index] : []));
|
|
1102
|
+
same(won.length, 1, "the number of writes that won");
|
|
1103
|
+
const lost = results.find((result) => result.status === "rejected");
|
|
1104
|
+
const conflicts = conflictsOfRejection(lost.reason, "the write that lost");
|
|
1105
|
+
same(conflicts.map((conflict) => conflict.id), ["a"], "the conflict of the write that lost");
|
|
1106
|
+
same(await storage.get("a"), item("a", won[0] === 0 ? 2 : 3), "the item of the write that won");
|
|
1107
|
+
}));
|
|
1108
|
+
}
|
|
1008
1109
|
/**
|
|
1009
1110
|
* This function declares the suite in a test framework: one `describe` with one `it` for each
|
|
1010
1111
|
* case. Vitest gives `skip` to a case, so a case for a missing optional method shows as skipped.
|