@procedures/collections 0.3.0 → 0.5.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-contract.js","sourceRoot":"","sources":["../../src/testing/storage-contract.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "@procedures/collections",
4
- "version": "0.3.0",
4
+ "version": "0.5.0",
5
5
  "description": "Collections for TypeScript: ArrayList, LinkedList, ArrayDeque, HashMap, LinkedHashMap, TreeMap (red-black), PriorityQueue, LRU and TTL maps, async queues, channels and collectors, tested with fast-check.",
6
6
  "keywords": [
7
7
  "collections",
@@ -36,6 +36,10 @@
36
36
  ".": {
37
37
  "types": "./dist/index.d.ts",
38
38
  "import": "./dist/index.js"
39
+ },
40
+ "./testing": {
41
+ "types": "./dist/testing/index.d.ts",
42
+ "import": "./dist/testing/index.js"
39
43
  }
40
44
  },
41
45
  "files": [
@@ -17,6 +17,15 @@
17
17
  * All methods return Promise<T> to ensure consistent async behavior.
18
18
  * This guarantees client code remains agnostic to the storage backend,
19
19
  * enabling seamless switching between local and remote storage.
20
+ *
21
+ * The contract (the suite of `@procedures/collections/testing` tests it for each storage):
22
+ * - A storage keeps a copy of each value that a write takes, and each read gives a new copy. A
23
+ * change of a written or a read value does not change the stored item.
24
+ * - A stored `null` reads back as `null`. A missing id reads back as `undefined`.
25
+ * - The entries keep the order of the first set of each id, as a `Map` does.
26
+ * - A delta of `getChangesSince` follows the order of the last change of each id.
27
+ * - After `close()`, each operation rejects with an error whose message says "closed". A second
28
+ * `close()` does nothing.
20
29
  */
21
30
  export interface CollectionStorage<T> {
22
31
  //
@@ -27,7 +36,7 @@ export interface CollectionStorage<T> {
27
36
  * Get item by ID.
28
37
  *
29
38
  * @param id - Item identifier
30
- * @returns Promise resolving to item or undefined if not found
39
+ * @returns Promise resolving to a copy of the item, or undefined if not found. A stored null is null.
31
40
  */
32
41
  get(id: string): Promise<T | undefined>;
33
42
 
@@ -46,9 +55,19 @@ export interface CollectionStorage<T> {
46
55
  */
47
56
  getEntries?(): Promise<Array<[string, T]>>;
48
57
 
58
+ /**
59
+ * The ids of the items, in the order of the entries. The storage does not read or copy the
60
+ * values, so a sync that needs only the ids does not copy each item. A storage that cannot
61
+ * give the ids cheaply does not have this method, and a caller uses `getEntries()`.
62
+ *
63
+ * @returns Promise resolving to the ids, as a new array
64
+ */
65
+ getIds?(): Promise<string[]>;
66
+
49
67
  /**
50
68
  * The changes after a version (roadmap R28). A storage without a change log does not have
51
- * this method, and a sync uses `getEntries()`.
69
+ * this method, and a sync uses `getEntries()`. A full result follows the order of the entries.
70
+ * A delta follows the order of the last change of each id.
52
71
  *
53
72
  * @param since - A `version` that an earlier call gave. Without it, the result has all items.
54
73
  * @returns Promise resolving to the changed items, the deleted ids and the new version
@@ -147,8 +166,9 @@ export interface CollectionStorage<T> {
147
166
  flush?(): Promise<void>;
148
167
 
149
168
  /**
150
- * Close storage and cleanup resources.
151
- * Should be called when collection is no longer needed.
169
+ * This method closes the storage and releases its resources. After it, each operation rejects
170
+ * with an error whose message says "closed". A second `close()` does nothing. A durable storage
171
+ * keeps its items for a new storage of the same place.
152
172
  *
153
173
  * @returns Promise resolving when cleanup completes
154
174
  */
@@ -172,6 +192,8 @@ export interface CollectionStorage<T> {
172
192
  * the first call, a version of an older run, or a change log that dropped old deletes.
173
193
  * - When `full` is false, `changed` has the items that changed after the version, and `deleted`
174
194
  * has the ids that were deleted after it.
195
+ * - The order of a full result is the order of the entries. The order of a delta is the order of
196
+ * the last change of each id: an id that changed again comes after the ids that changed before.
175
197
  */
176
198
  export interface StorageChanges<T> {
177
199
  /** The version of the storage that includes these changes. */
@@ -15,13 +15,28 @@ export interface InMemoryStorageOptions {
15
15
  * @default 10000
16
16
  */
17
17
  maxTombstones?: number;
18
+ /**
19
+ * True: the storage keeps a copy of each value that a write takes, and each read gives a new
20
+ * copy (`structuredClone`). Then a change of a written or a read value does not change the
21
+ * stored item, as in each other storage.
22
+ *
23
+ * False: the storage keeps the values themselves, and the reads give them. This is faster.
24
+ * Give it only when no caller changes a value after a write or a read.
25
+ * @default true
26
+ */
27
+ copies?: boolean;
18
28
  }
19
29
 
20
- /** A new epoch: a version of another storage, or of a closed one, does not match it. */
30
+ /** A new epoch: a version of another storage does not match it. */
21
31
  function newEpoch(): string {
22
32
  return Math.random().toString(36).slice(2, 10);
23
33
  }
24
34
 
35
+ /** The copy of a value: `structuredClone`, or the value itself without copies. */
36
+ type Copy = <V>(value: V) => V;
37
+ const same: Copy = (value) => value;
38
+ const clone: Copy = (value) => structuredClone(value);
39
+
25
40
  /**
26
41
  * In-memory storage backed by JavaScript Map.
27
42
  *
@@ -30,7 +45,12 @@ function newEpoch(): string {
30
45
  * - No persistence (data lost on restart)
31
46
  * - Memory-bound (limited by available RAM)
32
47
  * - Returns Promises for API consistency with remote storage
48
+ * - Each error is a rejected promise: an error of a `find` predicate does not throw at once
33
49
  * - A change log: `getChangesSince(version)` gives the changes after a version (roadmap R28)
50
+ * - Copies: a change of a written or a read value does not change the stored item (the option
51
+ * `copies: false` turns this off)
52
+ * - `getIds()` gives the ids without a copy of the values
53
+ * - After `close()`, each operation rejects, and a second `close()` does nothing
34
54
  *
35
55
  * @example
36
56
  * ```typescript
@@ -44,110 +64,133 @@ export class InMemoryStorage<T> implements CollectionStorage<T> {
44
64
 
45
65
  // The change log (roadmap R28). Each write gets the next number of `seq`. A version is
46
66
  // `<epoch>:<seq>`.
47
- private epoch = newEpoch();
67
+ private readonly epoch = newEpoch();
48
68
  private seq = 0;
49
- /** The number of the last write of each id that has an item */
69
+ /** The number of the last write of each id that has an item, the oldest first */
50
70
  private readonly changedAt = new Map<string, number>();
51
71
  /** The number of the delete of each id that has no item, the oldest first (the tombstones) */
52
72
  private readonly deletedAt = new Map<string, number>();
53
73
  /** The log does not know the deletes at or below this number: they were dropped */
54
74
  private floor = 0;
55
75
  private readonly maxTombstones: number;
76
+ private readonly copy: Copy;
77
+ private closed = false;
56
78
 
57
79
  constructor(options: InMemoryStorageOptions = {}) {
58
80
  this.maxTombstones = Math.max(0, options.maxTombstones ?? 10_000);
81
+ this.copy = options.copies === false ? same : clone;
59
82
  }
60
83
 
61
84
  //
62
85
  // ═══ Read Operations ═══
63
86
  //
64
87
 
65
- get(id: string): Promise<T | undefined> {
66
- return Promise.resolve(this.data.get(id));
88
+ async get(id: string): Promise<T | undefined> {
89
+ this.checkOpen();
90
+ return this.copy(this.data.get(id));
67
91
  }
68
92
 
69
- getAll(): Promise<T[]> {
70
- return Promise.resolve(Array.from(this.data.values()));
93
+ async getAll(): Promise<T[]> {
94
+ this.checkOpen();
95
+ return Array.from(this.data.values(), this.copy);
71
96
  }
72
97
 
73
- getEntries(): Promise<Array<[string, T]>> {
74
- return Promise.resolve(Array.from(this.data.entries()));
98
+ async getEntries(): Promise<Array<[string, T]>> {
99
+ this.checkOpen();
100
+ return this.copiedEntries();
101
+ }
102
+
103
+ /** The ids of the items, in the order of the entries. This method copies no value. */
104
+ async getIds(): Promise<string[]> {
105
+ this.checkOpen();
106
+ return Array.from(this.data.keys());
75
107
  }
76
108
 
77
109
  /**
78
- * The changes after a version (roadmap R28). A version of another storage, of a closed
79
- * storage, or older than the dropped deletes gives all items (`full: true`).
110
+ * The changes after a version (roadmap R28). A version of another storage, or older than the
111
+ * dropped deletes, gives all items (`full: true`) in the order of the entries. A delta gives
112
+ * the changed items and the deleted ids in the order of the last change of each id.
80
113
  */
81
- getChangesSince(since?: string): Promise<StorageChanges<T>> {
114
+ async getChangesSince(since?: string): Promise<StorageChanges<T>> {
115
+ this.checkOpen();
82
116
  const version = `${this.epoch}:${this.seq}`;
83
117
  const from = this.parseVersion(since);
84
118
  if (from === undefined || from < this.floor) {
85
- return Promise.resolve({ version, full: true, changed: Array.from(this.data.entries()), deleted: [] });
119
+ return { version, full: true, changed: this.copiedEntries(), deleted: [] };
86
120
  }
87
121
  const changed: Array<[string, T]> = [];
88
122
  for (const [id, at] of this.changedAt) {
89
- if (at > from) changed.push([id, this.data.get(id) as T]);
123
+ if (at > from) changed.push([id, this.copy(this.data.get(id) as T)]);
90
124
  }
91
125
  const deleted: string[] = [];
92
126
  for (const [id, at] of this.deletedAt) {
93
127
  if (at > from) deleted.push(id);
94
128
  }
95
- return Promise.resolve({ version, full: false, changed, deleted });
129
+ return { version, full: false, changed, deleted };
96
130
  }
97
131
 
98
- find(predicate: (item: T) => boolean): Promise<T[]> {
132
+ /** The items for which the predicate gives true. The predicate gets a copy of each item. */
133
+ async find(predicate: (item: T) => boolean): Promise<T[]> {
134
+ this.checkOpen();
99
135
  const results: T[] = [];
100
- for (const item of this.data.values()) {
136
+ for (const stored of this.data.values()) {
137
+ const item = this.copy(stored);
101
138
  if (predicate(item)) {
102
139
  results.push(item);
103
140
  }
104
141
  }
105
- return Promise.resolve(results);
142
+ return results;
106
143
  }
107
144
 
108
- has(id: string): Promise<boolean> {
109
- return Promise.resolve(this.data.has(id));
145
+ async has(id: string): Promise<boolean> {
146
+ this.checkOpen();
147
+ return this.data.has(id);
110
148
  }
111
149
 
112
- size(): Promise<number> {
113
- return Promise.resolve(this.data.size);
150
+ async size(): Promise<number> {
151
+ this.checkOpen();
152
+ return this.data.size;
114
153
  }
115
154
 
116
155
  //
117
156
  // ═══ Write Operations ═══
118
157
  //
119
158
 
120
- set(id: string, value: T): Promise<void> {
121
- this.data.set(id, value);
159
+ async set(id: string, value: T): Promise<void> {
160
+ this.checkOpen();
161
+ this.data.set(id, this.copy(value));
122
162
  this.noteSet(id);
123
- return Promise.resolve();
124
163
  }
125
164
 
126
- delete(id: string): Promise<boolean> {
165
+ async delete(id: string): Promise<boolean> {
166
+ this.checkOpen();
127
167
  const existed = this.data.delete(id);
128
168
  if (existed) this.noteDelete(id);
129
- return Promise.resolve(existed);
169
+ return existed;
130
170
  }
131
171
 
132
- clear(): Promise<void> {
172
+ async clear(): Promise<void> {
173
+ this.checkOpen();
133
174
  for (const id of this.data.keys()) this.noteDelete(id);
134
175
  this.data.clear();
135
- return Promise.resolve();
136
176
  }
137
177
 
138
178
  //
139
179
  // ═══ Bulk Operations ═══
140
180
  //
141
181
 
142
- setBatch(items: Array<[string, T]>): Promise<void> {
143
- for (const [id, value] of items) {
182
+ /** This method sets several items. When one value has no copy, nothing changes. */
183
+ async setBatch(items: Array<[string, T]>): Promise<void> {
184
+ this.checkOpen();
185
+ const copies = items.map(([id, value]): [string, T] => [id, this.copy(value)]);
186
+ for (const [id, value] of copies) {
144
187
  this.data.set(id, value);
145
188
  this.noteSet(id);
146
189
  }
147
- return Promise.resolve();
148
190
  }
149
191
 
150
- deleteBatch(ids: string[]): Promise<number> {
192
+ async deleteBatch(ids: string[]): Promise<number> {
193
+ this.checkOpen();
151
194
  let deleted = 0;
152
195
  for (const id of ids) {
153
196
  if (this.data.delete(id)) {
@@ -155,49 +198,51 @@ export class InMemoryStorage<T> implements CollectionStorage<T> {
155
198
  deleted++;
156
199
  }
157
200
  }
158
- return Promise.resolve(deleted);
201
+ return deleted;
159
202
  }
160
203
 
161
- getBatch(ids: string[]): Promise<Map<string, T>> {
204
+ async getBatch(ids: string[]): Promise<Map<string, T>> {
205
+ this.checkOpen();
162
206
  const result = new Map<string, T>();
163
207
  for (const id of ids) {
164
208
  const value = this.data.get(id);
165
209
  if (value !== undefined) {
166
- result.set(id, value);
210
+ result.set(id, this.copy(value));
167
211
  }
168
212
  }
169
- return Promise.resolve(result);
213
+ return result;
170
214
  }
171
215
 
172
216
  //
173
217
  // ═══ Lifecycle & Metadata ═══
174
218
  //
175
219
 
176
- close(): Promise<void> {
177
- // No cleanup needed for in-memory storage
220
+ /**
221
+ * This method closes the storage and drops its items. After it, each operation rejects (and
222
+ * each method of the `Map` interface throws). A second `close()` does nothing.
223
+ */
224
+ async close(): Promise<void> {
225
+ if (this.closed) return;
226
+ this.closed = true;
178
227
  this.data.clear();
179
- // A new epoch: a version of the closed storage gives all items
180
228
  this.changedAt.clear();
181
229
  this.deletedAt.clear();
182
- this.epoch = newEpoch();
183
- this.seq = 0;
184
- this.floor = 0;
185
- return Promise.resolve();
186
230
  }
187
231
 
188
- getMetadata(): Promise<StorageMetadata> {
232
+ async getMetadata(): Promise<StorageMetadata> {
233
+ this.checkOpen();
189
234
  // Rough memory estimation:
190
235
  // Each entry has ~overhead of 100 bytes (key string + Map entry overhead)
191
236
  const estimatedEntrySize = 100;
192
237
  const memoryUsage = this.data.size * estimatedEntrySize;
193
238
 
194
- return Promise.resolve({
239
+ return {
195
240
  type: "memory",
196
241
  size: this.data.size,
197
242
  stats: {
198
243
  memoryUsage,
199
244
  },
200
- });
245
+ };
201
246
  }
202
247
 
203
248
  //
@@ -210,48 +255,69 @@ export class InMemoryStorage<T> implements CollectionStorage<T> {
210
255
  * @returns Iterator of keys
211
256
  */
212
257
  keys(): IterableIterator<string> {
258
+ this.checkOpen();
213
259
  return this.data.keys();
214
260
  }
215
261
 
216
262
  /**
217
- * Get all values in storage.
263
+ * The values in storage: copies, unless the option `copies` is false.
218
264
  *
219
265
  * @returns Iterator of values
220
266
  */
221
267
  values(): IterableIterator<T> {
222
- return this.data.values();
268
+ this.checkOpen();
269
+ return this.copiedEntries().map(([, value]) => value)[Symbol.iterator]();
223
270
  }
224
271
 
225
272
  /**
226
- * Get all entries in storage.
273
+ * The entries in storage: copies of the values, unless the option `copies` is false.
227
274
  *
228
275
  * @returns Iterator of [id, value] tuples
229
276
  */
230
277
  entries(): IterableIterator<[string, T]> {
231
- return this.data.entries();
278
+ this.checkOpen();
279
+ return this.copiedEntries()[Symbol.iterator]();
232
280
  }
233
281
 
234
282
  /**
235
- * Iterate over storage entries.
283
+ * Iterate over storage entries. The callback gets a copy of each value, and a `Map` of the
284
+ * copies, unless the option `copies` is false.
236
285
  *
237
286
  * @param callback - Function to call for each entry
238
287
  */
239
288
  forEach(callback: (value: T, key: string, map: Map<string, T>) => void): void {
240
- this.data.forEach(callback);
289
+ this.checkOpen();
290
+ new Map(this.copiedEntries()).forEach(callback);
241
291
  }
242
292
 
243
293
  /**
244
294
  * Make storage iterable.
245
295
  */
246
296
  [Symbol.iterator](): IterableIterator<[string, T]> {
247
- return this.data.entries();
297
+ return this.entries();
298
+ }
299
+
300
+ //
301
+ // ═══ Internal Helpers ═══
302
+ //
303
+
304
+ /** This method throws after `close()`. In an async method, the throw rejects the promise. */
305
+ private checkOpen(): void {
306
+ if (this.closed) throw new Error("The InMemoryStorage is closed");
307
+ }
308
+
309
+ /** The entries with copies of the values. */
310
+ private copiedEntries(): Array<[string, T]> {
311
+ return Array.from(this.data, ([id, value]): [string, T] => [id, this.copy(value)]);
248
312
  }
249
313
 
250
314
  //
251
315
  // ═══ The change log ═══
252
316
  //
253
317
 
318
+ /** A set moves the id to the end of the order of the log: the order of the last change. */
254
319
  private noteSet(id: string): void {
320
+ this.changedAt.delete(id);
255
321
  this.changedAt.set(id, ++this.seq);
256
322
  this.deletedAt.delete(id);
257
323
  }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * The checks of the contract suite. The suite does not import a test framework, so a runtime
3
+ * entry of this package never loads one. A failed check throws `ContractViolation`.
4
+ */
5
+
6
+ /** The error of a failed check of the contract suite. */
7
+ export class ContractViolation extends Error {
8
+ override readonly name = "ContractViolation";
9
+ }
10
+
11
+ /** This function gives the text of a value for a message: JSON, with a `Map` as its entries. */
12
+ export function show(value: unknown): string {
13
+ if (value === undefined) return "undefined";
14
+ try {
15
+ return JSON.stringify(value, (_key, item: unknown) => (item instanceof Map ? { Map: [...item.entries()] } : item === undefined ? "<undefined>" : item));
16
+ } catch {
17
+ return String(value);
18
+ }
19
+ }
20
+
21
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
22
+ if (typeof value !== "object" || value === null) return false;
23
+ const prototype = Object.getPrototypeOf(value) as unknown;
24
+ return prototype === Object.prototype || prototype === null;
25
+ }
26
+
27
+ /**
28
+ * This function compares two values deeply: JSON values, arrays, plain objects and maps. Two maps
29
+ * are equal when they have the same keys with equal values, in any order.
30
+ */
31
+ export function deepEqual(actual: unknown, expected: unknown): boolean {
32
+ if (Object.is(actual, expected)) return true;
33
+ if (actual instanceof Map && expected instanceof Map) {
34
+ if (actual.size !== expected.size) return false;
35
+ for (const [key, value] of actual) {
36
+ if (!expected.has(key) || !deepEqual(value, expected.get(key))) return false;
37
+ }
38
+ return true;
39
+ }
40
+ if (Array.isArray(actual) && Array.isArray(expected)) {
41
+ return actual.length === expected.length && actual.every((item, index) => deepEqual(item, expected[index]));
42
+ }
43
+ if (isPlainObject(actual) && isPlainObject(expected)) {
44
+ const keys = Object.keys(actual);
45
+ if (keys.length !== Object.keys(expected).length) return false;
46
+ return keys.every((key) => Object.prototype.hasOwnProperty.call(expected, key) && deepEqual(actual[key], expected[key]));
47
+ }
48
+ return false;
49
+ }
50
+
51
+ /** This function throws `ContractViolation` when the two values are not deeply equal. */
52
+ export function same(actual: unknown, expected: unknown, what: string): void {
53
+ if (!deepEqual(actual, expected)) {
54
+ throw new ContractViolation(`${what}: expected ${show(expected)}, got ${show(actual)}`);
55
+ }
56
+ }
57
+
58
+ /** This function throws `ContractViolation` when the condition is false. */
59
+ export function holds(condition: boolean, what: string): void {
60
+ if (!condition) throw new ContractViolation(what);
61
+ }
62
+
63
+ /**
64
+ * This function starts an operation that must fail with a rejected promise, and gives the error.
65
+ * A synchronous throw breaks the contract too: each method of a storage gives a promise.
66
+ */
67
+ export async function rejects(start: () => Promise<unknown>, what: string): Promise<unknown> {
68
+ let promise: Promise<unknown>;
69
+ try {
70
+ promise = start();
71
+ } catch (error) {
72
+ throw new ContractViolation(`${what}: the method threw at once (${show(error instanceof Error ? error.message : error)}), and did not give a rejected promise`);
73
+ }
74
+ holds(typeof promise?.then === "function", `${what}: the method did not give a promise`);
75
+ try {
76
+ await promise;
77
+ } catch (error) {
78
+ return error;
79
+ }
80
+ throw new ContractViolation(`${what}: the promise did not reject`);
81
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * `@procedures/collections/testing`: the test-only entry of this package.
3
+ *
4
+ * This entry holds the contract suite of `CollectionStorage`. A storage package runs it in its
5
+ * tests with a factory of its storage. The entry imports no test framework: the caller gives
6
+ * `describe` and `it`. The runtime entries of the package do not import this entry.
7
+ */
8
+
9
+ export {
10
+ collectionStorageContract,
11
+ describeCollectionStorageContract,
12
+ type CollectionStorageContractOptions,
13
+ type ContractCase,
14
+ type ContractItem,
15
+ type ContractStorage,
16
+ type ContractTestApi,
17
+ type ContractTestContext,
18
+ } from "./storage-contract.js";
19
+ export { ContractViolation, deepEqual } from "./check.js";