@procedures/client 0.17.0 → 0.17.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.
Files changed (30) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/adapters/http/server/cors.d.ts +5 -4
  4. package/dist/adapters/http/server/cors.d.ts.map +1 -1
  5. package/dist/adapters/http/server/cors.js +4 -3
  6. package/dist/adapters/http/server/cors.js.map +1 -1
  7. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  8. package/dist/adapters/http/server/transport.js +3 -2
  9. package/dist/adapters/http/server/transport.js.map +1 -1
  10. package/dist/adapters/http/server/types.d.ts +3 -1
  11. package/dist/adapters/http/server/types.d.ts.map +1 -1
  12. package/dist/procedures/collection/admission.d.ts +52 -2
  13. package/dist/procedures/collection/admission.d.ts.map +1 -1
  14. package/dist/procedures/collection/admission.js +149 -29
  15. package/dist/procedures/collection/admission.js.map +1 -1
  16. package/dist/procedures/collection/patch-in-parts.d.ts +6 -1
  17. package/dist/procedures/collection/patch-in-parts.d.ts.map +1 -1
  18. package/dist/procedures/collection/patch-in-parts.js +7 -2
  19. package/dist/procedures/collection/patch-in-parts.js.map +1 -1
  20. package/dist/procedures/collection/procedures.d.ts +3 -2
  21. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  22. package/dist/procedures/collection/procedures.js +2 -1
  23. package/dist/procedures/collection/procedures.js.map +1 -1
  24. package/package.json +1 -1
  25. package/src/adapters/http/server/cors.ts +5 -4
  26. package/src/adapters/http/server/transport.ts +3 -2
  27. package/src/adapters/http/server/types.ts +3 -1
  28. package/src/procedures/collection/admission.ts +177 -30
  29. package/src/procedures/collection/patch-in-parts.ts +8 -1
  30. package/src/procedures/collection/procedures.ts +5 -3
@@ -1 +1 @@
1
- {"version":3,"file":"patch-in-parts.js","sourceRoot":"","sources":["../../../src/procedures/collection/patch-in-parts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAG3D;;;;GAIG;AACH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAyC,CAAC;AAErE;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAmC,EACnC,EAAU,EACV,MAAoB,EACpB,OAA6B,EAC7B,KAAuD;IAEvD,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC;IACtB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO;YAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uIAAuI;AACvI,MAAM,UAAU,SAAS,CAAC,OAAmC,EAAE,EAAU,EAAE,MAAoB,EAAE,OAA6B;IAC5H,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACzG,CAAC"}
1
+ {"version":3,"file":"patch-in-parts.js","sourceRoot":"","sources":["../../../src/procedures/collection/patch-in-parts.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAI3D;;;;GAIG;AACH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAyC,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAmC,EACnC,EAAU,EACV,MAAoB,EACpB,OAA6B,EAC7B,KAAuD,EACvD,SAA8B;IAE9B,IAAI,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC;IACtB,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,KAAK;YAAE,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,eAAe,GAAG,SAAS,EAAE,CAAC,OAAO,CAAC,CAAC;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;QACvG,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CACxB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CAChB,CAAC;IACF,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACvB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,OAAO;YAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uIAAuI;AACvI,MAAM,UAAU,SAAS,CAAC,OAAmC,EAAE,EAAU,EAAE,MAAoB,EAAE,OAA6B;IAC5H,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACzG,CAAC"}
@@ -44,8 +44,9 @@ export interface CollectionProceduresOptions {
44
44
  /**
45
45
  * The rules of the rows (roadmap CLI-41). `admit` examines each row of each read and of each
46
46
  * change event with values. `guard` examines each write before the storage changes, and a
47
- * refused write gets `FORBIDDEN` (reason `write-not-allowed`). Without it, the procedures check
48
- * only the partition.
47
+ * refused write gets `FORBIDDEN` (reason `write-not-allowed`). With `versionOf`, a guarded write
48
+ * expects the version that the guard read. `maxScanned` stops the scan of a `find` (roadmap
49
+ * CLI-55). Without it, the procedures check only the partition.
49
50
  */
50
51
  admission?: CollectionAdmission | undefined;
51
52
  }
@@ -1 +1 @@
1
- {"version":3,"file":"procedures.d.ts","sourceRoot":"","sources":["../../../src/procedures/collection/procedures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkDlE,OAAO,EAA8D,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIjH,OAAO,EAA8B,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA6BtF,sFAAsF;AACtF,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACvH;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC7C;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,6BAA6B,GAAG,SAAS,CAAC;IACnE;;;;;OAKG;IACH,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC7C;AAwBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,2BAAgC,GAAG,YAAY,EAAE,CA4T5H"}
1
+ {"version":3,"file":"procedures.d.ts","sourceRoot":"","sources":["../../../src/procedures/collection/procedures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAkDlE,OAAO,EAA8D,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIjH,OAAO,EAA8C,KAAK,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AA6BtG,sFAAsF;AACtF,MAAM,WAAW,6BAA6B;IAC5C;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACvH;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,WAAW,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC7C;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,6BAA6B,GAAG,SAAS,CAAC;IACnE;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;CAC7C;AAwBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,2BAAgC,GAAG,YAAY,EAAE,CA6T5H"}
@@ -9,7 +9,7 @@ import { getInputSchema, getOutputSchema, setInputSchema, setOutputSchema, delet
9
9
  import { DEFAULT_FIND_LIMIT, queryEntries } from "./query.js";
10
10
  import { collectionChangeTopic, startChangeChain, writeWithChangeEvent } from "./changes.js";
11
11
  import { partitionOfCall, storageOfCall, withPartition } from "./partition.js";
12
- import { admitsRow, admittedStorage } from "./admission.js";
12
+ import { admitsRow, admittedStorage, checkAdmission } from "./admission.js";
13
13
  import { patchItem } from "./patch-in-parts.js";
14
14
  // =============================================================================
15
15
  // Handler Factory
@@ -79,6 +79,7 @@ export function createCollectionProcedures(collectionName, options = {}) {
79
79
  const topicOf = (ctx, partition) => topicRule?.(collectionName, ctx, partition);
80
80
  const withValues = events !== false && events !== true && events.values === true;
81
81
  const admission = options.admission;
82
+ checkAdmission(admission);
82
83
  /** A write, and then its change event on the bus of the context. The chain of the events belongs to the storage, not to its view. */
83
84
  const changing = (ctx, partition, storage, ids, origin, write) => writeWithChangeEvent(ctx.bus, storage, topicRule ? topicOf(ctx, partition) : undefined, ids, origin, write, withValues, admission?.admit);
84
85
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"procedures.js","sourceRoot":"","sources":["../../../src/procedures/collection/procedures.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"procedures.js","sourceRoot":"","sources":["../../../src/procedures/collection/procedures.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/client",
4
- "version": "0.17.0",
4
+ "version": "0.17.2",
5
5
  "description": "Procedures as data for TypeScript: define typed procedures once and call them in process, over HTTP, WebSocket, the CLI or MCP. Streaming, middleware, retries, caching and a JSON program format.",
6
6
  "keywords": [
7
7
  "rpc",
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * The CORS headers of a procedure server, without a framework. `procedureHandler` applies them to
3
3
  * the requests on its path. The Express shim `HttpServerTransport` applies them to each request of
4
- * its app, as before. `credentialedCors()` applies them to a route of the app next to the faces,
5
- * for example the auth routes, from the trusted origins of the host (CLI-49). This module imports
6
- * only the types of `node:http`.
4
+ * its app. Both send no CORS header to an origin that is not permitted (CLI-56, CLI-59).
5
+ * `credentialedCors()` applies them to a route of the app next to the faces, for example the auth
6
+ * routes. It takes the trusted origins of the host (CLI-49). This module imports only the types of
7
+ * `node:http`.
7
8
  */
8
9
 
9
10
  import type { IncomingMessage, ServerResponse } from "node:http";
@@ -80,7 +81,7 @@ export interface CorsPolicy {
80
81
  readonly credentials: boolean;
81
82
  /** The value of `Access-Control-Max-Age` in seconds, or undefined. */
82
83
  readonly maxAge: string | undefined;
83
- /** True: a response for an origin that is not permitted gets no CORS header (`credentialedCors()`, `procedureHandler`). */
84
+ /** True: a response for an origin that is not permitted gets no CORS header (`credentialedCors()`, `procedureHandler`, `HttpServerTransport`). */
84
85
  readonly permittedOnly?: boolean | undefined;
85
86
  }
86
87
 
@@ -65,8 +65,9 @@ export class HttpServerTransport implements ServerTransport {
65
65
  // inferring the operation from the verb (BUGS-2026-07 C3, bug 16)
66
66
  const urlStrategy = options.urlStrategy ?? createPatternServerUrlStrategy(basePath);
67
67
  const corsOptions = this.options.cors ? (options.corsOptions ?? {}) : undefined;
68
- // The given options go over the defaults, and the transport sends the credentials by default
69
- this.cors = corsOptions ? corsPolicy(corsOptions, true) : undefined;
68
+ // The given options go over the defaults, and the transport sends the credentials by default.
69
+ // An origin that is not permitted gets no CORS header, as with procedureHandler (CLI-59)
70
+ this.cors = corsOptions ? { ...corsPolicy(corsOptions, true), permittedOnly: true } : undefined;
70
71
  this.handler = createProcedureHandler(
71
72
  server,
72
73
  {
@@ -110,7 +110,9 @@ export interface HttpServerTransportOptions extends BrowserGuardOptions {
110
110
 
111
111
  /**
112
112
  * Custom CORS options. `origin` is "*", one origin or a list: the response names the
113
- * request's origin when it is in the list.
113
+ * request's origin when it is in the list. A response for another origin, or for a request
114
+ * without an origin, gets no `Access-Control-*` header (CLI-59). Each response gets
115
+ * `Vary: Origin` when `origin` is not "*".
114
116
  */
115
117
  corsOptions?: {
116
118
  origin?: string | string[];
@@ -8,6 +8,9 @@
8
8
  * subscriber, so the reads and the events obey one rule.
9
9
  * - `guard` examines each write `{ op, id, doc, prev }` before the storage changes. A refused write
10
10
  * gets `FORBIDDEN` with the reason `write-not-allowed`.
11
+ * - `versionOf` gives the version of a stored item (roadmap CLI-55). With it, a guarded write
12
+ * expects the version of the item that the guard examined.
13
+ * - `maxScanned` sets the largest number of rows that one `find` examines (roadmap CLI-55).
11
14
  *
12
15
  * The procedures apply the rules in one place: the view of the storage of a call
13
16
  * (`admittedStorage()`). Each read and each write of each procedure goes through this view.
@@ -16,16 +19,20 @@
16
19
  * `find` and `changes` do not have it. A delta of `changes` puts the id of a refused row in
17
20
  * `deleted`, so a copy of the caller drops it.
18
21
  * - An error of `admit` fails the read. It does not hide the rows, so a sync does not delete them.
19
- * - The guard reads the stored item before the write. CLI-16 (`expectedVersion`) closes the gap of
20
- * a write of another writer between that read and the write.
22
+ * - The guard reads the stored item before the write. With `versionOf`, the write expects the
23
+ * version of that item (roadmap CLI-16). A change of another writer between the read and the
24
+ * write then gives `VERSION_CONFLICT`, and the storage does not change.
25
+ * - A `VERSION_CONFLICT` of a write has the current item. When the rule refuses that item, the
26
+ * conflict has no value.
21
27
  * - The rules get the invocation of the call (`ctx.invocation`). A call without an invocation gets
22
28
  * no row and makes no write.
23
29
  */
24
30
  import { InvocationError, type AdmitItem, type Invocation } from "../invoke.js";
25
31
  import type { ProcedureContext } from "../types.js";
26
- import { applyPatch, type StoragePatch, type StorageQueryOptions, type StorageQueryPolicy, type StorageSelector } from "./query.js";
27
- import type { CollectionStorage, StorageChanges, StorageWriteOptions } from "./storage.js";
32
+ import { applyPatch, queryEntries, type StoragePatch, type StorageQueryOptions, type StorageQueryPolicy, type StorageSelector } from "./query.js";
33
+ import type { CollectionStorage, StorageBatchWriteOptions, StorageChanges, StorageItemWriteOptions, StorageWriteOptions } from "./storage.js";
28
34
  import { patchInParts } from "./patch-in-parts.js";
35
+ import { VersionConflictError, versionConflictsOf, type VersionConflict, type VersionOf } from "./precondition.js";
29
36
 
30
37
  /** A row of a collection: the id and the stored item. The rule `admit` examines one row at a time. */
31
38
  export interface CollectionRow {
@@ -65,6 +72,44 @@ export interface CollectionAdmission {
65
72
  admit?: AdmitItem | undefined;
66
73
  /** The guard of each `set`, `patch` and `delete`, also of the batches and of `clear`. */
67
74
  guard?: CollectionWriteGuard | undefined;
75
+ /**
76
+ * The version of a stored item: the function `versionOf` of the storage (roadmap CLI-55). Give
77
+ * the same function, because the storage tests the version.
78
+ *
79
+ * - With it, each `set`, `delete`, `setBatch` and `patch` that the guard permits expects the
80
+ * version of the item that the guard examined. An id without an item expects `null`.
81
+ * - A change of another writer between the read of the guard and the write gives
82
+ * `VERSION_CONFLICT`. The storage does not change.
83
+ * - An expected version of the caller stays. The view adds a version only for an id without one.
84
+ * - A guarded `patch` writes the merged item that the guard examined with `set`. A `patch()` of
85
+ * the storage does not merge the fields again.
86
+ * - An item without a version gets no precondition. `deleteBatch` and `clear` get no
87
+ * precondition, because the storage cannot test one for them.
88
+ * - A storage without `versionOf` refuses each guarded write with `PRECONDITION_NOT_SUPPORTED`.
89
+ *
90
+ * Without it, a guarded write has no precondition. A change of another writer between the read
91
+ * of the guard and the write is then lost.
92
+ */
93
+ versionOf?: VersionOf<unknown> | undefined;
94
+ /**
95
+ * The largest number of rows that one `find` examines with the rule `admit` (roadmap CLI-55). It
96
+ * is a whole number, 1 or more.
97
+ *
98
+ * - A `find` counts its skip and its limit in the admitted rows. Thus a caller with few admitted
99
+ * rows makes the view read many rows of the storage. This option stops that scan.
100
+ * - The view counts the rows that match the selector, in the order of the query, from the first
101
+ * row. The rows of the skip also count.
102
+ * - When the scan gets to the bound, `find` gives the admitted rows that it found. That page can
103
+ * be shorter than the limit, also when more rows match. The result has no other mark.
104
+ * - A storage with `query()` gives the rows page by page. The view does not ask for a row after
105
+ * the bound.
106
+ * - A storage without `query()` gives all its entries in one read. The view then runs the
107
+ * selector and the order, and the rule examines at most this number of rows.
108
+ *
109
+ * Without it, `find` reads the rows until its page is full, or until the rows end. Without `admit`,
110
+ * the option has no effect.
111
+ */
112
+ maxScanned?: number | undefined;
68
113
  }
69
114
 
70
115
  /** The size of a page of a query of the storage, when the policy gives no `maxLimit`. */
@@ -75,6 +120,17 @@ function writeRefused(ctx: ProcedureContext, write: CollectionWrite): Invocation
75
120
  return new InvocationError("FORBIDDEN", `The rule of the collection does not permit the ${write.op} of "${write.id}"`, ctx.path, "write-not-allowed");
76
121
  }
77
122
 
123
+ /**
124
+ * This function throws a `TypeError` when an option of the rules of the rows is not correct. The
125
+ * collection procedures call it when they are made.
126
+ */
127
+ export function checkAdmission(admission: CollectionAdmission | undefined): void {
128
+ const maxScanned = admission?.maxScanned;
129
+ if (maxScanned !== undefined && (!Number.isSafeInteger(maxScanned) || maxScanned < 1)) {
130
+ throw new TypeError(`admission.maxScanned must be a whole number, 1 or more: ${String(maxScanned)}`);
131
+ }
132
+ }
133
+
78
134
  /**
79
135
  * This function tells if the rule of the rows admits a row for a call. Without a rule, it gives
80
136
  * true. A call without an invocation gets no row.
@@ -86,6 +142,11 @@ export async function admitsRow(admission: CollectionAdmission | undefined, ctx:
86
142
  return invocation !== undefined && (await admit({ id, value }, invocation)) === true;
87
143
  }
88
144
 
145
+ /** A conflict without the current item. It keeps the id, the expected version and the version. */
146
+ function withoutValue(conflict: VersionConflict): VersionConflict {
147
+ return { id: conflict.id, expected: conflict.expected, found: conflict.found, ...(conflict.version !== undefined && { version: conflict.version }) };
148
+ }
149
+
89
150
  /**
90
151
  * This function gives the view of the storage of a call: the storage, with the rules of the
91
152
  * collection for each read and each write. Without rules, it gives the storage itself.
@@ -98,7 +159,11 @@ export function admittedStorage<T>(storage: CollectionStorage<T>, admission: Col
98
159
  const admit = admission?.admit;
99
160
  const guard = admission?.guard;
100
161
  if (!admit && !guard) return storage;
162
+ checkAdmission(admission);
101
163
  const invocation = ctx.invocation;
164
+ // The version of a stored item: only a guarded write expects one (roadmap CLI-55)
165
+ const versionOf = guard ? admission?.versionOf : undefined;
166
+ const maxScanned = admission?.maxScanned;
102
167
 
103
168
  const admits = (id: string, value: unknown): Promise<boolean> => admitsRow(admission, ctx, id, value);
104
169
  /** The entries that the rule admits, in their order. */
@@ -119,6 +184,55 @@ export function admittedStorage<T>(storage: CollectionStorage<T>, admission: Col
119
184
  if (invocation === undefined || (await guard(write, invocation)) !== true) throw writeRefused(ctx, write);
120
185
  }
121
186
  };
187
+ /**
188
+ * The expected version of the stored item that the guard examined: its version, or `null` for
189
+ * no item. It is undefined without `versionOf`, and for an item without a version.
190
+ */
191
+ const expectedOf = (found: boolean, prev: unknown): string | null | undefined => {
192
+ if (versionOf === undefined) return undefined;
193
+ return found ? versionOf(prev) : null;
194
+ };
195
+ /** The options of a guarded write of one item. An expected version of the caller stays. */
196
+ const itemOptions = (options: StorageItemWriteOptions | undefined, prev: unknown): StorageItemWriteOptions | undefined => {
197
+ if (options?.expectedVersion !== undefined) return options;
198
+ const expectedVersion = expectedOf(prev !== undefined, prev);
199
+ return expectedVersion === undefined ? options : { ...options, expectedVersion };
200
+ };
201
+ /** The options of a guarded `setBatch`. The view adds an expected version for each id that has none. */
202
+ const batchOptions = (options: StorageBatchWriteOptions | undefined, ids: readonly string[], before: Map<string, T>): StorageBatchWriteOptions | undefined => {
203
+ if (versionOf === undefined) return options;
204
+ const given = options?.expectedVersions ?? [];
205
+ const covered = new Set(given.map(([id]) => id));
206
+ const added: Array<[string, string | null]> = [];
207
+ for (const id of new Set(ids)) {
208
+ if (covered.has(id)) continue;
209
+ const expected = expectedOf(before.has(id), before.get(id));
210
+ if (expected !== undefined) added.push([id, expected]);
211
+ }
212
+ return added.length === 0 ? options : { ...options, expectedVersions: [...given, ...added] };
213
+ };
214
+ /**
215
+ * This function runs a write. A `VERSION_CONFLICT` has the current item of each conflict. When
216
+ * the rule refuses that item, the error does not give its value.
217
+ */
218
+ const writing = async <R>(write: () => Promise<R>): Promise<R> => {
219
+ if (!admit) return write();
220
+ try {
221
+ return await write();
222
+ } catch (error) {
223
+ throw await withoutRefusedValues(error);
224
+ }
225
+ };
226
+ /** The error of a write, without the current items that the rule refuses. */
227
+ const withoutRefusedValues = async (error: unknown): Promise<unknown> => {
228
+ const conflicts = versionConflictsOf(error);
229
+ if (conflicts === undefined) return error;
230
+ const kept = await Promise.all(
231
+ conflicts.map(async (conflict) => (conflict.found && "value" in conflict && !(await admits(conflict.id, conflict.value)) ? withoutValue(conflict) : conflict)),
232
+ );
233
+ if (kept.every((conflict, index) => conflict === conflicts[index])) return error;
234
+ return new VersionConflictError(kept, error instanceof Error ? error.message : undefined);
235
+ };
122
236
 
123
237
  const view: CollectionStorage<T> = {
124
238
  async get(id) {
@@ -145,12 +259,16 @@ export function admittedStorage<T>(storage: CollectionStorage<T>, admission: Col
145
259
  },
146
260
 
147
261
  async set(id, value, options) {
148
- if (guard) await permit([{ op: "set", id, doc: value, prev: await storage.get(id) }]);
149
- return storage.set(id, value, options);
262
+ if (!guard) return writing(() => storage.set(id, value, options));
263
+ const prev = await storage.get(id);
264
+ await permit([{ op: "set", id, doc: value, prev }]);
265
+ return writing(() => storage.set(id, value, itemOptions(options, prev)));
150
266
  },
151
267
  async delete(id, options) {
152
- if (guard) await permit([{ op: "delete", id, doc: undefined, prev: await storage.get(id) }]);
153
- return storage.delete(id, options);
268
+ if (!guard) return writing(() => storage.delete(id, options));
269
+ const prev = await storage.get(id);
270
+ await permit([{ op: "delete", id, doc: undefined, prev }]);
271
+ return writing(() => storage.delete(id, itemOptions(options, prev)));
154
272
  },
155
273
  async clear(options) {
156
274
  if (!guard) return storage.clear(options);
@@ -161,11 +279,11 @@ export function admittedStorage<T>(storage: CollectionStorage<T>, admission: Col
161
279
  if (all.length > 0) await storage.deleteBatch(all.map(([id]) => id), options);
162
280
  },
163
281
  async setBatch(items, options) {
164
- if (guard) {
165
- const before = await storage.getBatch(items.map(([id]) => id));
166
- await permit(items.map(([id, value]) => ({ op: "set" as const, id, doc: value, prev: before.get(id) })));
167
- }
168
- return storage.setBatch(items, options);
282
+ if (!guard) return writing(() => storage.setBatch(items, options));
283
+ const ids = items.map(([id]) => id);
284
+ const before = await storage.getBatch(ids);
285
+ await permit(items.map(([id, value]) => ({ op: "set" as const, id, doc: value, prev: before.get(id) })));
286
+ return writing(() => storage.setBatch(items, batchOptions(options, ids, before)));
169
287
  },
170
288
  async deleteBatch(ids, options) {
171
289
  if (guard) {
@@ -176,14 +294,20 @@ export function admittedStorage<T>(storage: CollectionStorage<T>, admission: Col
176
294
  },
177
295
  async patch(id: string, fields: StoragePatch, options?: StorageWriteOptions): Promise<T | undefined> {
178
296
  const check = async (prev: unknown, doc: unknown): Promise<void> => permit([{ op: "patch", id, doc, prev }]);
179
- if (!storage.patch) return patchInParts(storage as CollectionStorage<unknown>, id, fields, options, guard ? check : undefined) as Promise<T | undefined>;
180
- if (guard) {
181
- const prev = await storage.get(id);
182
- // A patch of a missing id changes nothing
183
- if (prev === undefined) return undefined;
184
- await check(prev, applyPatch(prev, fields));
297
+ if (!storage.patch) {
298
+ return writing(() => patchInParts(storage as CollectionStorage<unknown>, id, fields, options, guard ? check : undefined, versionOf) as Promise<T | undefined>);
185
299
  }
186
- return storage.patch(id, fields, options);
300
+ if (!guard) return storage.patch(id, fields, options);
301
+ const prev = await storage.get(id);
302
+ // A patch of a missing id changes nothing
303
+ if (prev === undefined) return undefined;
304
+ const doc = applyPatch(prev, fields) as T;
305
+ await check(prev, doc);
306
+ const expectedVersion = expectedOf(true, prev);
307
+ if (expectedVersion === undefined) return storage.patch(id, fields, options);
308
+ // The storage writes the item that the guard examined, only while the stored item has the version that the guard read
309
+ await writing(() => storage.set(id, doc, { ...options, expectedVersion }));
310
+ return doc;
187
311
  },
188
312
  close: () => storage.close(),
189
313
  };
@@ -205,30 +329,54 @@ export function admittedStorage<T>(storage: CollectionStorage<T>, admission: Col
205
329
  };
206
330
  }
207
331
  if (storage.query) {
208
- view.query = async (selector: StorageSelector, options?: StorageQueryOptions, policy?: StorageQueryPolicy) =>
209
- admit ? admittedQuery(storage, admitted, selector, options ?? {}, policy) : storage.query!(selector, options, policy);
332
+ view.query = async (selector: StorageSelector, options?: StorageQueryOptions, policy?: StorageQueryPolicy) => {
333
+ if (!admit) return storage.query!(selector, options, policy);
334
+ const sort = options?.sort;
335
+ const pageOf = (skip: number, limit: number): Promise<Array<[string, T]>> => storage.query!(selector, { ...(sort !== undefined && { sort }), skip, limit }, policy);
336
+ return admittedQuery(pageOf, admitted, options ?? {}, pageSizeOf(policy), maxScanned);
337
+ };
338
+ } else if (admit && maxScanned !== undefined && storage.getEntries) {
339
+ // A storage without query() gives all its entries. The rule examines at most maxScanned of the matching rows.
340
+ view.query = async (selector: StorageSelector, options?: StorageQueryOptions, policy?: StorageQueryPolicy) => {
341
+ const sort = options?.sort;
342
+ const matches = queryEntries(await storage.getEntries!(), selector, sort !== undefined ? { sort } : {}, { ...policy, maxLimit: undefined });
343
+ const pageOf = async (skip: number, limit: number): Promise<Array<[string, T]>> => matches.slice(skip, skip + limit);
344
+ return admittedQuery(pageOf, admitted, options ?? {}, pageSizeOf(policy), maxScanned);
345
+ };
210
346
  }
211
347
  return view;
212
348
  }
213
349
 
350
+ /** The size of a page of a query of the storage: the `maxLimit` of the policy, or `QUERY_PAGE`. */
351
+ function pageSizeOf(policy: StorageQueryPolicy | undefined): number {
352
+ return policy?.maxLimit !== undefined && Number.isFinite(policy.maxLimit) ? policy.maxLimit : QUERY_PAGE;
353
+ }
354
+
214
355
  /**
215
356
  * The query of a storage with the rule of the rows. The storage runs the selector and the order,
216
357
  * page by page. The skip and the limit count the admitted rows only, so a page of the caller is full.
358
+ * With `maxScanned`, the scan reads no row after the bound, and the page of the caller can be short.
359
+ *
360
+ * @param pageOf - The rows of the query from a position, at most `limit` rows
217
361
  */
218
362
  async function admittedQuery<T>(
219
- storage: CollectionStorage<T>,
363
+ pageOf: (skip: number, limit: number) => Promise<Array<[string, T]>>,
220
364
  admitted: (entries: Array<[string, T]>) => Promise<Array<[string, T]>>,
221
- selector: StorageSelector,
222
365
  options: StorageQueryOptions,
223
- policy: StorageQueryPolicy | undefined,
366
+ page: number,
367
+ maxScanned: number | undefined,
224
368
  ): Promise<Array<[string, T]>> {
225
- const page = policy?.maxLimit !== undefined && Number.isFinite(policy.maxLimit) ? policy.maxLimit : QUERY_PAGE;
226
369
  const skip = options.skip ?? 0;
227
370
  const limit = options.limit;
228
371
  const out: Array<[string, T]> = [];
229
372
  let skipped = 0;
230
- for (let offset = 0; ; offset += page) {
231
- const rows = await storage.query!(selector, { ...(options.sort !== undefined && { sort: options.sort }), skip: offset, limit: page }, policy);
373
+ let scanned = 0;
374
+ for (;;) {
375
+ const size = maxScanned === undefined ? page : Math.min(page, maxScanned - scanned);
376
+ // The scan got to the bound: the page of the caller has the rows that it found
377
+ if (size <= 0) return out;
378
+ const rows = await pageOf(scanned, size);
379
+ scanned += rows.length;
232
380
  for (const entry of await admitted(rows)) {
233
381
  if (skipped < skip) {
234
382
  skipped++;
@@ -237,7 +385,6 @@ async function admittedQuery<T>(
237
385
  out.push(entry);
238
386
  if (limit !== undefined && out.length >= limit) return out;
239
387
  }
240
- if (rows.length < page) return out;
388
+ if (rows.length < size) return out;
241
389
  }
242
390
  }
243
-
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { applyPatch, type StoragePatch } from "./query.js";
6
6
  import type { CollectionStorage, StorageWriteOptions } from "./storage.js";
7
+ import type { VersionOf } from "./precondition.js";
7
8
 
8
9
  /**
9
10
  * The patches of a storage without `patch()` that run, for each id. A patch of an id waits for the
@@ -16,6 +17,10 @@ const PATCHES = new WeakMap<object, Map<string, Promise<unknown>>>();
16
17
  * This function patches an item of a storage without `patch()`: a read, a merge and a write. The
17
18
  * check gets the stored item and the merged item before the write. An error of the check stops
18
19
  * the patch, and the storage does not change.
20
+ *
21
+ * With `versionOf`, the write expects the version of the item that the patch read (roadmap
22
+ * CLI-55). A change of another writer between the read and the write then gives
23
+ * `VERSION_CONFLICT`. An item without a version gets no precondition.
19
24
  */
20
25
  export function patchInParts(
21
26
  storage: CollectionStorage<unknown>,
@@ -23,6 +28,7 @@ export function patchInParts(
23
28
  fields: StoragePatch,
24
29
  options?: StorageWriteOptions,
25
30
  check?: (prev: unknown, next: unknown) => Promise<void>,
31
+ versionOf?: VersionOf<unknown>,
26
32
  ): Promise<unknown> {
27
33
  let running = PATCHES.get(storage);
28
34
  if (!running) {
@@ -36,7 +42,8 @@ export function patchInParts(
36
42
  if (current === undefined) return undefined;
37
43
  const next = applyPatch(current, fields);
38
44
  if (check) await check(current, next);
39
- await storage.set(id, next, options);
45
+ const expectedVersion = versionOf?.(current);
46
+ await storage.set(id, next, expectedVersion === undefined ? options : { ...options, expectedVersion });
40
47
  return next;
41
48
  });
42
49
  const settled = patch.then(
@@ -60,7 +60,7 @@ import { DEFAULT_FIND_LIMIT, queryEntries, type StorageQueryOptions, type Storag
60
60
  import type { CollectionStorage, StorageBatchWriteOptions, StorageItemWriteOptions, StorageWriteOptions } from "./storage.js";
61
61
  import { collectionChangeTopic, startChangeChain, writeWithChangeEvent } from "./changes.js";
62
62
  import { partitionOfCall, storageOfCall, withPartition, type PartitionInput } from "./partition.js";
63
- import { admitsRow, admittedStorage, type CollectionAdmission } from "./admission.js";
63
+ import { admitsRow, admittedStorage, checkAdmission, type CollectionAdmission } from "./admission.js";
64
64
  import { patchItem } from "./patch-in-parts.js";
65
65
 
66
66
  // =============================================================================
@@ -127,8 +127,9 @@ export interface CollectionProceduresOptions {
127
127
  /**
128
128
  * The rules of the rows (roadmap CLI-41). `admit` examines each row of each read and of each
129
129
  * change event with values. `guard` examines each write before the storage changes, and a
130
- * refused write gets `FORBIDDEN` (reason `write-not-allowed`). Without it, the procedures check
131
- * only the partition.
130
+ * refused write gets `FORBIDDEN` (reason `write-not-allowed`). With `versionOf`, a guarded write
131
+ * expects the version that the guard read. `maxScanned` stops the scan of a `find` (roadmap
132
+ * CLI-55). Without it, the procedures check only the partition.
132
133
  */
133
134
  admission?: CollectionAdmission | undefined;
134
135
  }
@@ -181,6 +182,7 @@ export function createCollectionProcedures(collectionName: string, options: Coll
181
182
  const topicOf = (ctx: ProcedureContext, partition: string | undefined): string | undefined => topicRule?.(collectionName, ctx, partition);
182
183
  const withValues = events !== false && events !== true && events.values === true;
183
184
  const admission = options.admission;
185
+ checkAdmission(admission);
184
186
  /** A write, and then its change event on the bus of the context. The chain of the events belongs to the storage, not to its view. */
185
187
  const changing = <R>(ctx: ProcedureContext, partition: string | undefined, storage: CollectionStorage<unknown>, ids: readonly string[] | "*", origin: string | undefined, write: () => Promise<R>): Promise<R> =>
186
188
  writeWithChangeEvent(ctx.bus, storage, topicRule ? topicOf(ctx, partition) : undefined, ids, origin, write, withValues, admission?.admit);