@procedures/client 0.8.0 → 0.9.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.
Files changed (197) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/README.md +95 -8
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/adapters/http/client/transport.d.ts +4 -0
  5. package/dist/adapters/http/client/transport.d.ts.map +1 -1
  6. package/dist/adapters/http/client/transport.js +11 -1
  7. package/dist/adapters/http/client/transport.js.map +1 -1
  8. package/dist/adapters/http/client/types.d.ts +19 -0
  9. package/dist/adapters/http/client/types.d.ts.map +1 -1
  10. package/dist/adapters/http/server/cors.d.ts +64 -0
  11. package/dist/adapters/http/server/cors.d.ts.map +1 -0
  12. package/dist/adapters/http/server/cors.js +113 -0
  13. package/dist/adapters/http/server/cors.js.map +1 -0
  14. package/dist/adapters/http/server/handler.d.ts +136 -0
  15. package/dist/adapters/http/server/handler.d.ts.map +1 -0
  16. package/dist/adapters/http/server/handler.js +495 -0
  17. package/dist/adapters/http/server/handler.js.map +1 -0
  18. package/dist/adapters/http/server/strategies.d.ts +14 -5
  19. package/dist/adapters/http/server/strategies.d.ts.map +1 -1
  20. package/dist/adapters/http/server/strategies.js.map +1 -1
  21. package/dist/adapters/http/server/transport.d.ts +30 -46
  22. package/dist/adapters/http/server/transport.d.ts.map +1 -1
  23. package/dist/adapters/http/server/transport.js +48 -432
  24. package/dist/adapters/http/server/transport.js.map +1 -1
  25. package/dist/adapters/http/server/types.d.ts +13 -0
  26. package/dist/adapters/http/server/types.d.ts.map +1 -1
  27. package/dist/adapters/websocket/client/transport.d.ts.map +1 -1
  28. package/dist/adapters/websocket/client/transport.js +4 -12
  29. package/dist/adapters/websocket/client/transport.js.map +1 -1
  30. package/dist/adapters/websocket/server/transport.d.ts +46 -1
  31. package/dist/adapters/websocket/server/transport.d.ts.map +1 -1
  32. package/dist/adapters/websocket/server/transport.js +152 -15
  33. package/dist/adapters/websocket/server/transport.js.map +1 -1
  34. package/dist/adapters/websocket/server/types.d.ts +10 -3
  35. package/dist/adapters/websocket/server/types.d.ts.map +1 -1
  36. package/dist/adapters/websocket/server/upgrade-router.d.ts +28 -0
  37. package/dist/adapters/websocket/server/upgrade-router.d.ts.map +1 -0
  38. package/dist/adapters/websocket/server/upgrade-router.js +62 -0
  39. package/dist/adapters/websocket/server/upgrade-router.js.map +1 -0
  40. package/dist/adapters/websocket/server/upgrade.d.ts +68 -0
  41. package/dist/adapters/websocket/server/upgrade.d.ts.map +1 -0
  42. package/dist/adapters/websocket/server/upgrade.js +49 -0
  43. package/dist/adapters/websocket/server/upgrade.js.map +1 -0
  44. package/dist/adapters/websocket/shared/rpc.d.ts +2 -0
  45. package/dist/adapters/websocket/shared/rpc.d.ts.map +1 -1
  46. package/dist/adapters/websocket/shared/rpc.js +8 -2
  47. package/dist/adapters/websocket/shared/rpc.js.map +1 -1
  48. package/dist/browser.d.ts +12 -4
  49. package/dist/browser.d.ts.map +1 -1
  50. package/dist/browser.js +13 -2
  51. package/dist/browser.js.map +1 -1
  52. package/dist/client/client.d.ts +43 -0
  53. package/dist/client/client.d.ts.map +1 -1
  54. package/dist/client/client.js +69 -1
  55. package/dist/client/client.js.map +1 -1
  56. package/dist/events/publisher.d.ts +25 -1
  57. package/dist/events/publisher.d.ts.map +1 -1
  58. package/dist/events/publisher.js +66 -9
  59. package/dist/events/publisher.js.map +1 -1
  60. package/dist/events/rows.d.ts +31 -0
  61. package/dist/events/rows.d.ts.map +1 -0
  62. package/dist/events/rows.js +39 -0
  63. package/dist/events/rows.js.map +1 -0
  64. package/dist/index.d.ts +1 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/node.d.ts +14 -0
  69. package/dist/node.d.ts.map +1 -1
  70. package/dist/node.js +9 -0
  71. package/dist/node.js.map +1 -1
  72. package/dist/procedures/capability.d.ts +6 -0
  73. package/dist/procedures/capability.d.ts.map +1 -1
  74. package/dist/procedures/capability.js +25 -0
  75. package/dist/procedures/capability.js.map +1 -1
  76. package/dist/procedures/collection/changes.d.ts +94 -0
  77. package/dist/procedures/collection/changes.d.ts.map +1 -0
  78. package/dist/procedures/collection/changes.js +182 -0
  79. package/dist/procedures/collection/changes.js.map +1 -0
  80. package/dist/procedures/collection/index.d.ts +10 -3
  81. package/dist/procedures/collection/index.d.ts.map +1 -1
  82. package/dist/procedures/collection/index.js +8 -1
  83. package/dist/procedures/collection/index.js.map +1 -1
  84. package/dist/procedures/collection/partition.d.ts +67 -0
  85. package/dist/procedures/collection/partition.d.ts.map +1 -0
  86. package/dist/procedures/collection/partition.js +82 -0
  87. package/dist/procedures/collection/partition.js.map +1 -0
  88. package/dist/procedures/collection/procedures.d.ts +39 -2
  89. package/dist/procedures/collection/procedures.d.ts.map +1 -1
  90. package/dist/procedures/collection/procedures.js +147 -44
  91. package/dist/procedures/collection/procedures.js.map +1 -1
  92. package/dist/procedures/collection/query.d.ts +246 -0
  93. package/dist/procedures/collection/query.d.ts.map +1 -0
  94. package/dist/procedures/collection/query.js +854 -0
  95. package/dist/procedures/collection/query.js.map +1 -0
  96. package/dist/procedures/collection/schemas.d.ts +50 -0
  97. package/dist/procedures/collection/schemas.d.ts.map +1 -1
  98. package/dist/procedures/collection/schemas.js +144 -6
  99. package/dist/procedures/collection/schemas.js.map +1 -1
  100. package/dist/procedures/collection/storage.d.ts +58 -6
  101. package/dist/procedures/collection/storage.d.ts.map +1 -1
  102. package/dist/procedures/collection/storage.js +23 -0
  103. package/dist/procedures/collection/storage.js.map +1 -1
  104. package/dist/procedures/elicit.d.ts +190 -0
  105. package/dist/procedures/elicit.d.ts.map +1 -0
  106. package/dist/procedures/elicit.js +127 -0
  107. package/dist/procedures/elicit.js.map +1 -0
  108. package/dist/procedures/hints.d.ts +43 -0
  109. package/dist/procedures/hints.d.ts.map +1 -0
  110. package/dist/procedures/hints.js +74 -0
  111. package/dist/procedures/hints.js.map +1 -0
  112. package/dist/procedures/index.d.ts +9 -2
  113. package/dist/procedures/index.d.ts.map +1 -1
  114. package/dist/procedures/index.js +5 -1
  115. package/dist/procedures/index.js.map +1 -1
  116. package/dist/procedures/invoke.d.ts +24 -2
  117. package/dist/procedures/invoke.d.ts.map +1 -1
  118. package/dist/procedures/invoke.js +14 -1
  119. package/dist/procedures/invoke.js.map +1 -1
  120. package/dist/procedures/progress.d.ts +24 -0
  121. package/dist/procedures/progress.d.ts.map +1 -0
  122. package/dist/procedures/progress.js +11 -0
  123. package/dist/procedures/progress.js.map +1 -0
  124. package/dist/procedures/registry.d.ts.map +1 -1
  125. package/dist/procedures/registry.js +5 -0
  126. package/dist/procedures/registry.js.map +1 -1
  127. package/dist/procedures/types.d.ts +55 -0
  128. package/dist/procedures/types.d.ts.map +1 -1
  129. package/dist/procedures/types.js.map +1 -1
  130. package/dist/procedures/untrusted.d.ts +28 -0
  131. package/dist/procedures/untrusted.d.ts.map +1 -0
  132. package/dist/procedures/untrusted.js +32 -0
  133. package/dist/procedures/untrusted.js.map +1 -0
  134. package/dist/server/browser-guard.d.ts +12 -2
  135. package/dist/server/browser-guard.d.ts.map +1 -1
  136. package/dist/server/browser-guard.js +43 -6
  137. package/dist/server/browser-guard.js.map +1 -1
  138. package/dist/server/host-policy.d.ts +10 -1
  139. package/dist/server/host-policy.d.ts.map +1 -1
  140. package/dist/server/host-policy.js +5 -0
  141. package/dist/server/host-policy.js.map +1 -1
  142. package/dist/server/index.d.ts +1 -1
  143. package/dist/server/index.d.ts.map +1 -1
  144. package/dist/server/index.js.map +1 -1
  145. package/dist/server/procedure-server.d.ts +68 -7
  146. package/dist/server/procedure-server.d.ts.map +1 -1
  147. package/dist/server/procedure-server.js +124 -24
  148. package/dist/server/procedure-server.js.map +1 -1
  149. package/dist/server/request-auth.d.ts +51 -4
  150. package/dist/server/request-auth.d.ts.map +1 -1
  151. package/dist/server/request-auth.js +116 -5
  152. package/dist/server/request-auth.js.map +1 -1
  153. package/dist/server/types.d.ts +73 -5
  154. package/dist/server/types.d.ts.map +1 -1
  155. package/dist/server/types.js.map +1 -1
  156. package/package.json +7 -3
  157. package/src/adapters/http/client/transport.ts +11 -1
  158. package/src/adapters/http/client/types.ts +22 -0
  159. package/src/adapters/http/server/cors.ts +144 -0
  160. package/src/adapters/http/server/handler.ts +624 -0
  161. package/src/adapters/http/server/strategies.ts +16 -6
  162. package/src/adapters/http/server/transport.ts +55 -478
  163. package/src/adapters/http/server/types.ts +15 -0
  164. package/src/adapters/websocket/client/transport.ts +4 -12
  165. package/src/adapters/websocket/server/transport.ts +166 -16
  166. package/src/adapters/websocket/server/types.ts +11 -3
  167. package/src/adapters/websocket/server/upgrade-router.ts +77 -0
  168. package/src/adapters/websocket/server/upgrade.ts +88 -0
  169. package/src/adapters/websocket/shared/rpc.ts +9 -2
  170. package/src/browser.ts +85 -2
  171. package/src/client/client.ts +83 -1
  172. package/src/events/publisher.ts +75 -11
  173. package/src/events/rows.ts +48 -0
  174. package/src/index.ts +1 -1
  175. package/src/node.ts +21 -0
  176. package/src/procedures/capability.ts +21 -0
  177. package/src/procedures/collection/changes.ts +245 -0
  178. package/src/procedures/collection/index.ts +57 -1
  179. package/src/procedures/collection/partition.ts +123 -0
  180. package/src/procedures/collection/procedures.ts +206 -51
  181. package/src/procedures/collection/query.ts +1009 -0
  182. package/src/procedures/collection/schemas.ts +196 -7
  183. package/src/procedures/collection/storage.ts +78 -6
  184. package/src/procedures/elicit.ts +320 -0
  185. package/src/procedures/hints.ts +91 -0
  186. package/src/procedures/index.ts +83 -2
  187. package/src/procedures/invoke.ts +33 -2
  188. package/src/procedures/progress.ts +25 -0
  189. package/src/procedures/registry.ts +4 -0
  190. package/src/procedures/types.ts +65 -0
  191. package/src/procedures/untrusted.ts +50 -0
  192. package/src/server/browser-guard.ts +48 -6
  193. package/src/server/host-policy.ts +13 -1
  194. package/src/server/index.ts +3 -0
  195. package/src/server/procedure-server.ts +147 -26
  196. package/src/server/request-auth.ts +128 -6
  197. package/src/server/types.ts +82 -5
@@ -146,6 +146,31 @@ export function narrowCapability(current, request, order, now = Date.now()) {
146
146
  result.deadline = deadline;
147
147
  return Object.freeze(result);
148
148
  }
149
+ /**
150
+ * This function joins two requests for a narrower capability into one request that asks for
151
+ * both: the meet of the clearances, the intersection of the effects and the shorter time. Two
152
+ * different clearances need an order.
153
+ */
154
+ export function joinNarrowing(first, second, order) {
155
+ const result = {};
156
+ if (first.clearance === undefined || second.clearance === undefined || Object.is(first.clearance, second.clearance)) {
157
+ const clearance = first.clearance ?? second.clearance;
158
+ if (clearance !== undefined)
159
+ result.clearance = clearance;
160
+ }
161
+ else {
162
+ if (!order)
163
+ throw new Error("Two different clearances need a clearance order: give clearanceOrder to the host (hostPolicy)");
164
+ result.clearance = order.meet(first.clearance, second.clearance);
165
+ }
166
+ const effects = first.effects === undefined ? second.effects : narrowEffects(first.effects, second.effects);
167
+ if (effects !== undefined)
168
+ result.effects = effects;
169
+ const times = [first.timeoutMs, second.timeoutMs].filter((time) => typeof time === "number" && Number.isFinite(time) && time >= 0);
170
+ if (times.length > 0)
171
+ result.timeoutMs = Math.min(...times);
172
+ return result;
173
+ }
149
174
  const VERB = { reads: "reads", writes: "changes" };
150
175
  /**
151
176
  * This function gives the refusal of an invocation under a capability, or undefined when the
@@ -1 +1 @@
1
- {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/procedures/capability.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capability.js","sourceRoot":"","sources":["../../src/procedures/capability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ /**
2
+ * The change events of the collection procedures (roadmap CLI-15).
3
+ *
4
+ * Each write of a collection procedure publishes one `CollectionChangeEvent` on the bus of its
5
+ * context (`ctx.bus`), under the topic `collections.<name>`. A peer gets the events with
6
+ * `events.subscribe` (`documentation/EVENTS.md`). The delivery is at most once, so an event is a
7
+ * hint of a change, and a subscriber reads the changes when it misses an event.
8
+ *
9
+ * - `since` and `version` are versions of `getChangesSince()` of the storage. The events of one
10
+ * storage and one topic make a chain: the `since` of an event is the `version` of the event
11
+ * before it. A subscriber whose cursor is `since` applies the event without a read.
12
+ * - The changes of an event come from the change log of the storage, not from the input of the
13
+ * write. Thus an event also has the writes that did not go through the procedures.
14
+ * - By default, an event has only the ids and the versions: a value reaches a caller only through
15
+ * a read, with its checks. With the option `values`, an event has the values too, and each row
16
+ * `{ id, value }` passes the output filter of the host for each subscriber (`withRows()`).
17
+ * - A subscriber of the topic must have a capability that reads `collection:<name>`, as for a
18
+ * read (`collectionTopicReads()`, the default `reads` of `EventPublisher`).
19
+ * - An event without `since` only tells that the collection changed: the storage has no change
20
+ * log, the chain starts, or the log dropped the version. The subscriber then reads the changes.
21
+ * - The chain starts at the version of a call of `changes` (a pull of a subscriber). While no one
22
+ * listens to the topic, the procedures publish nothing, and the chain stops.
23
+ * - The publishes of one storage and one topic run one at a time, in the order of the writes. A
24
+ * write resolves after its event is on the bus. A failed publish never fails the write.
25
+ */
26
+ import type { EventBus } from "../../events/types.js";
27
+ import type { StorageChanges } from "./storage.js";
28
+ /**
29
+ * The change event of the writes of a collection, on the topic `collections.<name>` (roadmap
30
+ * CLI-15). The data crosses the wire as JSON.
31
+ */
32
+ export interface CollectionChangeEvent {
33
+ /**
34
+ * The version of the storage before the changes. A subscriber whose cursor is this version
35
+ * applies the changes without a read. Without it, the event is only a hint: read the changes.
36
+ */
37
+ readonly since?: string | undefined;
38
+ /** The version of the storage after the changes, when the storage has a change log. */
39
+ readonly version?: string | undefined;
40
+ /** The ids of the items that changed, in the order of the last change of each id. */
41
+ readonly changed: readonly string[];
42
+ /** The ids that were deleted. */
43
+ readonly deleted: readonly string[];
44
+ /**
45
+ * With the option `values`: the changed items that the output filter of the subscriber admits.
46
+ * Without the option, the event has no values: read them with `changes`.
47
+ */
48
+ readonly values?: ReadonlyArray<{
49
+ readonly id: string;
50
+ readonly value: unknown;
51
+ }> | undefined;
52
+ /** With the option `values`: the changed ids whose values the filter refused. Read them with `changes`. */
53
+ readonly withheld?: readonly string[] | undefined;
54
+ /** The origin of the writes, when one origin made all the changes of the event. */
55
+ readonly origin?: string | undefined;
56
+ }
57
+ /**
58
+ * This function gives the topic of the change events of a collection: `collections.<name>`, or
59
+ * `collections.<name>.<partition>` for a partition (roadmap CLI-17).
60
+ */
61
+ export declare function collectionChangeTopic(collection: string, partition?: string): string;
62
+ /**
63
+ * This function gives the resources that a subscriber of a topic reads: `collection:<name>` for
64
+ * the topic `collections.<name>` and for a topic of a partition, `collections.<name>.<partition>`.
65
+ * Another topic gives no resource. `EventPublisher` uses it as its default `reads`.
66
+ */
67
+ export declare function collectionTopicReads(topic: string): readonly string[];
68
+ /** The part of a storage that the change events read. */
69
+ interface ChangeLog {
70
+ getChangesSince?(since?: string): Promise<StorageChanges<unknown>>;
71
+ }
72
+ /**
73
+ * This function runs a write of a collection procedure, and then publishes the change event of
74
+ * the write on the bus. Without a bus or a topic, it only runs the write. A failed write
75
+ * publishes too, because a batch can change a part of the storage. The error of the publish
76
+ * never reaches the caller.
77
+ *
78
+ * @param bus - The bus of the context, or undefined
79
+ * @param storage - The storage of the collection: the chain of the events belongs to it
80
+ * @param topic - The topic of the events, or undefined for no event
81
+ * @param ids - The ids of the write, or "*" for a clear
82
+ * @param origin - The origin of the write
83
+ * @param write - The write
84
+ * @param values - True: the events carry the values, for the output filter of each subscriber
85
+ */
86
+ export declare function writeWithChangeEvent<R>(bus: EventBus | undefined, storage: object & ChangeLog, topic: string | undefined, ids: readonly string[] | "*", origin: string | undefined, write: () => Promise<R>, values?: boolean): Promise<R>;
87
+ /**
88
+ * This function starts the chain of the events of a storage at the version of a call of
89
+ * `changes`, when the chain has no version. The subscriber that made the call then applies the
90
+ * next event without a read.
91
+ */
92
+ export declare function startChangeChain(bus: EventBus | undefined, storage: object, topic: string | undefined, version: string): void;
93
+ export {};
94
+ //# sourceMappingURL=changes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../../../src/procedures/collection/changes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,qFAAqF;IACrF,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC;QAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,SAAS,CAAC;IAC9F,2GAA2G;IAC3G,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;IAClD,mFAAmF;IACnF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAGrE;AAED,yDAAyD;AACzD,UAAU,SAAS;IACjB,eAAe,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;CACpE;AAyHD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,GAAG,EAAE,QAAQ,GAAG,SAAS,EACzB,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,GAAG,EAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACvB,MAAM,UAAQ,GACb,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,QAAQ,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI7H"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * The change events of the collection procedures (roadmap CLI-15).
3
+ *
4
+ * Each write of a collection procedure publishes one `CollectionChangeEvent` on the bus of its
5
+ * context (`ctx.bus`), under the topic `collections.<name>`. A peer gets the events with
6
+ * `events.subscribe` (`documentation/EVENTS.md`). The delivery is at most once, so an event is a
7
+ * hint of a change, and a subscriber reads the changes when it misses an event.
8
+ *
9
+ * - `since` and `version` are versions of `getChangesSince()` of the storage. The events of one
10
+ * storage and one topic make a chain: the `since` of an event is the `version` of the event
11
+ * before it. A subscriber whose cursor is `since` applies the event without a read.
12
+ * - The changes of an event come from the change log of the storage, not from the input of the
13
+ * write. Thus an event also has the writes that did not go through the procedures.
14
+ * - By default, an event has only the ids and the versions: a value reaches a caller only through
15
+ * a read, with its checks. With the option `values`, an event has the values too, and each row
16
+ * `{ id, value }` passes the output filter of the host for each subscriber (`withRows()`).
17
+ * - A subscriber of the topic must have a capability that reads `collection:<name>`, as for a
18
+ * read (`collectionTopicReads()`, the default `reads` of `EventPublisher`).
19
+ * - An event without `since` only tells that the collection changed: the storage has no change
20
+ * log, the chain starts, or the log dropped the version. The subscriber then reads the changes.
21
+ * - The chain starts at the version of a call of `changes` (a pull of a subscriber). While no one
22
+ * listens to the topic, the procedures publish nothing, and the chain stops.
23
+ * - The publishes of one storage and one topic run one at a time, in the order of the writes. A
24
+ * write resolves after its event is on the bus. A failed publish never fails the write.
25
+ */
26
+ import { withRows } from "../../events/rows.js";
27
+ /**
28
+ * This function gives the topic of the change events of a collection: `collections.<name>`, or
29
+ * `collections.<name>.<partition>` for a partition (roadmap CLI-17).
30
+ */
31
+ export function collectionChangeTopic(collection, partition) {
32
+ return partition === undefined ? `collections.${collection}` : `collections.${collection}.${partition}`;
33
+ }
34
+ /**
35
+ * This function gives the resources that a subscriber of a topic reads: `collection:<name>` for
36
+ * the topic `collections.<name>` and for a topic of a partition, `collections.<name>.<partition>`.
37
+ * Another topic gives no resource. `EventPublisher` uses it as its default `reads`.
38
+ */
39
+ export function collectionTopicReads(topic) {
40
+ const match = /^collections\.([^.]+)(?:\.|$)/.exec(topic);
41
+ return match ? [`collection:${match[1]}`] : [];
42
+ }
43
+ /** The chains of each storage, by topic. A storage that goes away takes its chains with it. */
44
+ const CHAINS = new WeakMap();
45
+ function chainOf(storage, topic) {
46
+ let topics = CHAINS.get(storage);
47
+ if (!topics) {
48
+ topics = new Map();
49
+ CHAINS.set(storage, topics);
50
+ }
51
+ let chain = topics.get(topic);
52
+ if (!chain) {
53
+ chain = { anchor: undefined, tail: Promise.resolve(), ended: [] };
54
+ topics.set(topic, chain);
55
+ }
56
+ return chain;
57
+ }
58
+ /** The origin of an event: the one origin of its writes, when the changes are only of these writes. */
59
+ function originOf(writes, changes) {
60
+ const origin = writes[0]?.origin;
61
+ if (origin === undefined || writes.some((write) => write.origin !== origin))
62
+ return undefined;
63
+ if (!changes || writes.some((write) => write.ids === "*"))
64
+ return origin;
65
+ const ids = new Set();
66
+ for (const write of writes)
67
+ for (const id of write.ids)
68
+ ids.add(id);
69
+ const own = changes.changed.every(([id]) => ids.has(id)) && changes.deleted.every((id) => ids.has(id));
70
+ return own ? origin : undefined;
71
+ }
72
+ /** A hint: the collection changed, and the subscriber reads the changes. */
73
+ function hint(version, origin) {
74
+ return {
75
+ ...(version !== undefined && { version }),
76
+ changed: [],
77
+ deleted: [],
78
+ ...(origin !== undefined && { origin }),
79
+ };
80
+ }
81
+ /**
82
+ * The event of a delta with the values of the changed items. Each row `{ id, value }` passes the
83
+ * output filter of each subscriber, and a refused row goes from `values` to `withheld`.
84
+ */
85
+ function withValues(event, entries) {
86
+ return withRows({ ...event, values: entries }, {
87
+ rows: entries,
88
+ keep: (admitted) => {
89
+ const withheld = entries.filter((_, index) => !admitted[index]).map(({ id }) => id);
90
+ return {
91
+ ...event,
92
+ values: entries.filter((_, index) => admitted[index]),
93
+ ...(withheld.length > 0 && { withheld }),
94
+ };
95
+ },
96
+ });
97
+ }
98
+ /** One publish: the event of the writes that ended since the last publish. */
99
+ async function publish(chain, storage, bus, topic, values) {
100
+ const writes = chain.ended.splice(0);
101
+ // An earlier publish told these writes
102
+ if (writes.length === 0)
103
+ return;
104
+ if (!bus.hasSubscribers(topic)) {
105
+ // No one listens: the procedures do not read the log. The next call of `changes` starts the chain again.
106
+ chain.anchor = undefined;
107
+ return;
108
+ }
109
+ const since = chain.anchor;
110
+ if (!storage.getChangesSince || since === undefined) {
111
+ bus.emit(topic, hint(undefined, originOf(writes, undefined)));
112
+ return;
113
+ }
114
+ let changes;
115
+ try {
116
+ changes = await storage.getChangesSince(since);
117
+ }
118
+ catch {
119
+ // The subscribers read the changes themselves. The chain keeps its version.
120
+ bus.emit(topic, hint(undefined, originOf(writes, undefined)));
121
+ return;
122
+ }
123
+ chain.anchor = changes.version;
124
+ // A full result: the log does not know the version of the chain any more
125
+ if (changes.full || writes.some((write) => !write.anchored)) {
126
+ bus.emit(topic, hint(changes.version, originOf(writes, undefined)));
127
+ return;
128
+ }
129
+ if (changes.changed.length === 0 && changes.deleted.length === 0)
130
+ return;
131
+ const origin = originOf(writes, changes);
132
+ const event = {
133
+ since,
134
+ version: changes.version,
135
+ changed: changes.changed.map(([id]) => id),
136
+ deleted: changes.deleted,
137
+ ...(origin !== undefined && { origin }),
138
+ };
139
+ bus.emit(topic, values ? withValues(event, changes.changed.map(([id, value]) => ({ id, value }))) : event);
140
+ }
141
+ /**
142
+ * This function runs a write of a collection procedure, and then publishes the change event of
143
+ * the write on the bus. Without a bus or a topic, it only runs the write. A failed write
144
+ * publishes too, because a batch can change a part of the storage. The error of the publish
145
+ * never reaches the caller.
146
+ *
147
+ * @param bus - The bus of the context, or undefined
148
+ * @param storage - The storage of the collection: the chain of the events belongs to it
149
+ * @param topic - The topic of the events, or undefined for no event
150
+ * @param ids - The ids of the write, or "*" for a clear
151
+ * @param origin - The origin of the write
152
+ * @param write - The write
153
+ * @param values - True: the events carry the values, for the output filter of each subscriber
154
+ */
155
+ export async function writeWithChangeEvent(bus, storage, topic, ids, origin, write, values = false) {
156
+ if (bus === undefined || topic === undefined)
157
+ return write();
158
+ const chain = chainOf(storage, topic);
159
+ const started = { ids, origin, anchored: chain.anchor !== undefined };
160
+ try {
161
+ return await write();
162
+ }
163
+ finally {
164
+ chain.ended.push(started);
165
+ const run = chain.tail.then(() => publish(chain, storage, bus, topic, values));
166
+ chain.tail = run.catch(() => undefined);
167
+ await chain.tail;
168
+ }
169
+ }
170
+ /**
171
+ * This function starts the chain of the events of a storage at the version of a call of
172
+ * `changes`, when the chain has no version. The subscriber that made the call then applies the
173
+ * next event without a read.
174
+ */
175
+ export function startChangeChain(bus, storage, topic, version) {
176
+ if (bus === undefined || topic === undefined)
177
+ return;
178
+ const chain = chainOf(storage, topic);
179
+ if (chain.anchor === undefined)
180
+ chain.anchor = version;
181
+ }
182
+ //# sourceMappingURL=changes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../../../src/procedures/collection/changes.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,15 @@
3
3
  *
4
4
  * Procedure definitions for collection CRUD operations.
5
5
  */
6
- export { idSchema, collectionNameSchema, valueSchema, getInputSchema, getOutputSchema, setInputSchema, setOutputSchema, deleteInputSchema, deleteOutputSchema, hasInputSchema, hasOutputSchema, getAllInputSchema, getAllOutputSchema, entriesInputSchema, entriesOutputSchema, idsInputSchema, idsOutputSchema, changesInputSchema, changesOutputSchema, sizeInputSchema, sizeOutputSchema, clearInputSchema, clearOutputSchema, getBatchInputSchema, getBatchOutputSchema, setBatchInputSchema, setBatchOutputSchema, deleteBatchInputSchema, deleteBatchOutputSchema, } from "./schemas.js";
7
- export type { GetInput, GetFoundOutput, SetInput, DeleteInput, HasInput, GetAllInput, EntriesInput, CollectionEntry, IdsInput, ChangesInput, ChangesOutput, SizeInput, ClearInput, GetBatchInput, SetBatchInput, DeleteBatchInput, } from "./schemas.js";
6
+ export { idSchema, collectionNameSchema, valueSchema, getInputSchema, getOutputSchema, setInputSchema, setOutputSchema, deleteInputSchema, deleteOutputSchema, hasInputSchema, hasOutputSchema, getAllInputSchema, getAllOutputSchema, entriesInputSchema, entriesOutputSchema, findInputSchema, findOutputSchema, patchInputSchema, patchOutputSchema, idsInputSchema, idsOutputSchema, changesInputSchema, changesOutputSchema, sizeInputSchema, sizeOutputSchema, clearInputSchema, clearOutputSchema, getBatchInputSchema, getBatchOutputSchema, setBatchInputSchema, setBatchOutputSchema, deleteBatchInputSchema, deleteBatchOutputSchema, } from "./schemas.js";
7
+ export type { GetInput, GetFoundOutput, SetInput, DeleteInput, HasInput, GetAllInput, EntriesInput, CollectionEntry, FindInput, PatchInput, IdsInput, ChangesInput, ChangesOutput, SizeInput, ClearInput, GetBatchInput, SetBatchInput, DeleteBatchInput, } from "./schemas.js";
8
8
  export { createCollectionProcedures } from "./procedures.js";
9
- export type { CollectionStorage, StorageChanges, StorageMetadata } from "./storage.js";
9
+ export type { CollectionProceduresOptions, CollectionChangeEventsOptions } from "./procedures.js";
10
+ export { collectionChangeTopic, collectionTopicReads } from "./changes.js";
11
+ export type { CollectionChangeEvent } from "./changes.js";
12
+ export { PARTITION_PATTERN, collectionTopicPartition, partitionOfCall, storageOfCall, withPartition } from "./partition.js";
13
+ export type { CollectionPartitions, PartitionInput, PartitionResolver } from "./partition.js";
14
+ export type { CollectionStorage, StorageChanges, StorageMetadata, StorageWriteOptions, StorageSetChange, StorageDeleteChange, StorageClearChange, StorageChangeEvent, StorageChangeBatch, StorageObserver, } from "./storage.js";
15
+ export { DEFAULT_FIND_LIMIT, DEFAULT_QUERY_OPERATORS, DEFAULT_QUERY_POLICY, QUERY_OPERATORS, applyPatch, compareStorageValues, compileSelector, isPatchOperations, matchesSelector, mergePatch, patchProblems, queryEntries, queryOptionsProblems, selectorProblems, } from "./query.js";
16
+ export type { StorageFieldOperators, StoragePatch, StoragePatchOperations, StorageQueryOperator, StorageQueryOptions, StorageQueryPolicy, StorageSelector, StorageSort, StorageSortDirection, } from "./query.js";
10
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/procedures/collection/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAG7D,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/procedures/collection/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAEtB,YAAY,EACV,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,WAAW,EACX,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,aAAa,EACb,SAAS,EACT,UAAU,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAC7D,YAAY,EAAE,2BAA2B,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC;AAGlG,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC3E,YAAY,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAG1D,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC5H,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAG9F,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,GAChB,MAAM,cAAc,CAAC;AAItB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,qBAAqB,EACrB,YAAY,EACZ,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,oBAAoB,GACrB,MAAM,YAAY,CAAC"}
@@ -4,7 +4,14 @@
4
4
  * Procedure definitions for collection CRUD operations.
5
5
  */
6
6
  // Schemas
7
- export { idSchema, collectionNameSchema, valueSchema, getInputSchema, getOutputSchema, setInputSchema, setOutputSchema, deleteInputSchema, deleteOutputSchema, hasInputSchema, hasOutputSchema, getAllInputSchema, getAllOutputSchema, entriesInputSchema, entriesOutputSchema, idsInputSchema, idsOutputSchema, changesInputSchema, changesOutputSchema, sizeInputSchema, sizeOutputSchema, clearInputSchema, clearOutputSchema, getBatchInputSchema, getBatchOutputSchema, setBatchInputSchema, setBatchOutputSchema, deleteBatchInputSchema, deleteBatchOutputSchema, } from "./schemas.js";
7
+ export { idSchema, collectionNameSchema, valueSchema, getInputSchema, getOutputSchema, setInputSchema, setOutputSchema, deleteInputSchema, deleteOutputSchema, hasInputSchema, hasOutputSchema, getAllInputSchema, getAllOutputSchema, entriesInputSchema, entriesOutputSchema, findInputSchema, findOutputSchema, patchInputSchema, patchOutputSchema, idsInputSchema, idsOutputSchema, changesInputSchema, changesOutputSchema, sizeInputSchema, sizeOutputSchema, clearInputSchema, clearOutputSchema, getBatchInputSchema, getBatchOutputSchema, setBatchInputSchema, setBatchOutputSchema, deleteBatchInputSchema, deleteBatchOutputSchema, } from "./schemas.js";
8
8
  // Procedures
9
9
  export { createCollectionProcedures } from "./procedures.js";
10
+ // The change events of the writes (roadmap CLI-15)
11
+ export { collectionChangeTopic, collectionTopicReads } from "./changes.js";
12
+ // The partitions of a collection (roadmap CLI-17)
13
+ export { PARTITION_PATTERN, collectionTopicPartition, partitionOfCall, storageOfCall, withPartition } from "./partition.js";
14
+ // The query language of the storages: the same JSON on the wire and in query() (roadmap CLI-34:
15
+ // the one copy of the language)
16
+ export { DEFAULT_FIND_LIMIT, DEFAULT_QUERY_OPERATORS, DEFAULT_QUERY_POLICY, QUERY_OPERATORS, applyPatch, compareStorageValues, compileSelector, isPatchOperations, matchesSelector, mergePatch, patchProblems, queryEntries, queryOptionsProblems, selectorProblems, } from "./query.js";
10
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/procedures/collection/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,UAAU;AACV,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAqBtB,aAAa;AACb,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/procedures/collection/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,UAAU;AACV,OAAO,EACL,QAAQ,EACR,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,eAAe,EACf,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AAuBtB,aAAa;AACb,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAG7D,mDAAmD;AACnD,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAG3E,kDAAkD;AAClD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAiB5H,gGAAgG;AAChG,gCAAgC;AAChC,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,oBAAoB,EACpB,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,aAAa,EACb,YAAY,EACZ,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * The partitions of a collection (roadmap CLI-17). One `collections.<name>.*` surface serves the
3
+ * items of several partitions, for example one per tenant, or one per tenant and scope. Each call
4
+ * reads and writes one partition.
5
+ *
6
+ * - The host registers the partitions of a collection with its repository: the storage of each
7
+ * partition and the resolver (`ProcedureServer.usePartitions(name, { storageOf, resolve })`).
8
+ * - The input of a call can ask for a partition (`partition`, for example a scope). The resolver
9
+ * gives the partition of the call from its context: the tenant comes from the principal, never
10
+ * from the input alone. It can refuse the call.
11
+ * - A subscriber names the partition that it asks for in the topic, as an input does:
12
+ * `collections.<name>.<requested>`. The publisher resolves it in the same way and listens to the
13
+ * topic of the resolved partition, so a subscriber cannot name the topic of another tenant.
14
+ * - A collection without partitions refuses a call or a topic with a partition.
15
+ */
16
+ import type { ZodLike } from "../../client/validation/types.js";
17
+ import type { ProcedureContext } from "../types.js";
18
+ import type { CollectionStorage } from "./storage.js";
19
+ /** The characters of a partition: letters, digits and `_ . : @ ~ + | / -`, 256 at most. */
20
+ export declare const PARTITION_PATTERN: RegExp;
21
+ /** The field of an input that asks for a partition. */
22
+ export interface PartitionInput {
23
+ partition?: string;
24
+ }
25
+ /**
26
+ * The resolver of the partition of a call. It gets the context (with `ctx.principal`) and the
27
+ * partition that the input asks for. It gives the partition, `undefined` for the storage of the
28
+ * collection without a partition, or `null` to refuse the call (`FORBIDDEN`, reason
29
+ * `partition-not-allowed`). An error that it throws passes through.
30
+ */
31
+ export type PartitionResolver = (ctx: ProcedureContext, requested: string | undefined) => string | undefined | null | Promise<string | undefined | null>;
32
+ /**
33
+ * This function adds the field `partition` to the input schema of a collection procedure. The
34
+ * repository of the call decides at the call if the collection has partitions.
35
+ */
36
+ export declare function withPartition<T>(schema: ZodLike<T>): ZodLike<T & PartitionInput>;
37
+ /** The partitions of a collection: the storage of each partition, and the resolver of a call. */
38
+ export interface CollectionPartitions<T = unknown> {
39
+ /**
40
+ * The storage of a partition. Give the same storage for the same partition each time: the change
41
+ * events of a storage keep their order with it.
42
+ */
43
+ storageOf(partition: string): CollectionStorage<T>;
44
+ /** The resolver of the partition of a call. */
45
+ resolve: PartitionResolver;
46
+ }
47
+ /**
48
+ * This function gives the partition of a call to a collection: the resolver of the repository
49
+ * gives it from the context and the requested partition. It throws `FORBIDDEN` (reason
50
+ * `partition-not-allowed`) when the resolver refuses, or when the collection has no partitions and
51
+ * the call asks for one.
52
+ */
53
+ export declare function partitionOfCall(ctx: ProcedureContext, collection: string, requested: string | undefined): Promise<string | undefined>;
54
+ /**
55
+ * This function gives the storage of a call: of the collection, or of its partition. A repository
56
+ * without `getPartitionStorage` refuses a partition.
57
+ */
58
+ export declare function storageOfCall<T>(ctx: ProcedureContext, collection: string, partition: string | undefined): CollectionStorage<T>;
59
+ /**
60
+ * This function gives the collection and the partition part of a topic `collections.<name>` or
61
+ * `collections.<name>.<partition>`, or undefined for another topic.
62
+ */
63
+ export declare function collectionTopicPartition(topic: string): {
64
+ collection: string;
65
+ partition: string | undefined;
66
+ } | undefined;
67
+ //# sourceMappingURL=partition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partition.d.ts","sourceRoot":"","sources":["../../../src/procedures/collection/partition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAEhE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,2FAA2F;AAC3F,eAAO,MAAM,iBAAiB,EAAE,MAAwC,CAAC;AAEzE,uDAAuD;AACvD,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;AAEzJ;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,CAoBhF;AAED,iGAAiG;AACjG,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC/C;;;OAGG;IACH,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACnD,+CAA+C;IAC/C,OAAO,EAAE,iBAAiB,CAAC;CAC5B;AAOD;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAc3I;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,GAAG,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAQ/H;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG,SAAS,CAIzH"}
@@ -0,0 +1,82 @@
1
+ import { InvocationError } from "../invoke.js";
2
+ /** The characters of a partition: letters, digits and `_ . : @ ~ + | / -`, 256 at most. */
3
+ export const PARTITION_PATTERN = /^[A-Za-z0-9_.:@~+|/-]{1,256}$/;
4
+ /**
5
+ * This function adds the field `partition` to the input schema of a collection procedure. The
6
+ * repository of the call decides at the call if the collection has partitions.
7
+ */
8
+ export function withPartition(schema) {
9
+ const validate = (data) => {
10
+ const fail = (message) => ({ success: false, error: { message, errors: [{ path: ["partition"], message }] } });
11
+ const requested = typeof data === "object" && data !== null && !Array.isArray(data) ? data["partition"] : undefined;
12
+ if (requested !== undefined && (typeof requested !== "string" || !PARTITION_PATTERN.test(requested))) {
13
+ return fail("partition must have 1 to 256 letters, digits or the characters _ . : @ ~ + | / -");
14
+ }
15
+ const inner = schema.safeParse(data);
16
+ if (!inner.success)
17
+ return inner;
18
+ const parsed = inner.data;
19
+ return { success: true, data: requested === undefined ? parsed : { ...parsed, partition: requested } };
20
+ };
21
+ return {
22
+ parse(data) {
23
+ const result = validate(data);
24
+ if (result.success)
25
+ return result.data;
26
+ throw new Error(result.error.message);
27
+ },
28
+ safeParse: validate,
29
+ };
30
+ }
31
+ /** The refusal of a partition. */
32
+ function partitionRefused(ctx, message) {
33
+ return new InvocationError("FORBIDDEN", message, ctx.path, "partition-not-allowed");
34
+ }
35
+ /**
36
+ * This function gives the partition of a call to a collection: the resolver of the repository
37
+ * gives it from the context and the requested partition. It throws `FORBIDDEN` (reason
38
+ * `partition-not-allowed`) when the resolver refuses, or when the collection has no partitions and
39
+ * the call asks for one.
40
+ */
41
+ export async function partitionOfCall(ctx, collection, requested) {
42
+ const repository = ctx.repository;
43
+ if (!repository?.hasPartitions?.(collection) || !repository.resolvePartition) {
44
+ if (requested !== undefined)
45
+ throw partitionRefused(ctx, `The collection ${collection} has no partitions`);
46
+ return undefined;
47
+ }
48
+ const partition = await repository.resolvePartition(collection, ctx, requested);
49
+ if (partition === null) {
50
+ throw partitionRefused(ctx, `The call cannot use the partition${requested === undefined ? "" : ` "${requested}"`} of ${collection}`);
51
+ }
52
+ if (partition !== undefined && !PARTITION_PATTERN.test(partition)) {
53
+ throw new Error(`The partition resolver gave a partition that is not valid: ${JSON.stringify(partition).slice(0, 80)}`);
54
+ }
55
+ return partition;
56
+ }
57
+ /**
58
+ * This function gives the storage of a call: of the collection, or of its partition. A repository
59
+ * without `getPartitionStorage` refuses a partition.
60
+ */
61
+ export function storageOfCall(ctx, collection, partition) {
62
+ const repository = ctx.repository;
63
+ if (!repository)
64
+ throw new Error("Repository not available in procedure context");
65
+ if (partition === undefined)
66
+ return repository.getStorage(collection);
67
+ if (!repository.getPartitionStorage) {
68
+ throw new Error(`The repository has no partitions, so it cannot give the partition "${partition}" of ${collection}`);
69
+ }
70
+ return repository.getPartitionStorage(collection, partition);
71
+ }
72
+ /**
73
+ * This function gives the collection and the partition part of a topic `collections.<name>` or
74
+ * `collections.<name>.<partition>`, or undefined for another topic.
75
+ */
76
+ export function collectionTopicPartition(topic) {
77
+ const match = /^collections\.([^.]+)(?:\.(.+))?$/.exec(topic);
78
+ if (!match)
79
+ return undefined;
80
+ return { collection: match[1], partition: match[2] };
81
+ }
82
+ //# sourceMappingURL=partition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partition.js","sourceRoot":"","sources":["../../../src/procedures/collection/partition.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAI/C,2FAA2F;AAC3F,MAAM,CAAC,MAAM,iBAAiB,GAAW,+BAA+B,CAAC;AAezE;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAI,MAAkB;IACjD,MAAM,QAAQ,GAAG,CAAC,IAAa,EAA0J,EAAE;QACzL,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAChI,MAAM,SAAS,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,IAAgC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACjJ,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACrG,OAAO,IAAI,CAAC,kFAAkF,CAAC,CAAC;QAClG,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,KAAiH,CAAC;QAC7I,MAAM,MAAM,GAAG,KAAK,CAAC,IAA0B,CAAC;QAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,SAAmB,EAAE,EAAE,CAAC;IACnH,CAAC,CAAC;IACF,OAAO;QACL,KAAK,CAAC,IAAa;YACjB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,MAAM,CAAC,OAAO;gBAAE,OAAO,MAAM,CAAC,IAAI,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,SAAS,EAAE,QAAQ;KACW,CAAC;AACnC,CAAC;AAaD,kCAAkC;AAClC,SAAS,gBAAgB,CAAC,GAAqB,EAAE,OAAe;IAC9D,OAAO,IAAI,eAAe,CAAC,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,uBAAuB,CAAC,CAAC;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,GAAqB,EAAE,UAAkB,EAAE,SAA6B;IAC5G,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,IAAI,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC;QAC7E,IAAI,SAAS,KAAK,SAAS;YAAE,MAAM,gBAAgB,CAAC,GAAG,EAAE,kBAAkB,UAAU,oBAAoB,CAAC,CAAC;QAC3G,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,gBAAgB,CAAC,UAAU,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAChF,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,gBAAgB,CAAC,GAAG,EAAE,oCAAoC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,GAAG,OAAO,UAAU,EAAE,CAAC,CAAC;IACvI,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CAAC,8DAA8D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1H,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAI,GAAqB,EAAE,UAAkB,EAAE,SAA6B;IACvG,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,IAAI,CAAC,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAClF,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC,UAAU,CAAI,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sEAAsE,SAAS,QAAQ,UAAU,EAAE,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,UAAU,CAAC,mBAAmB,CAAI,UAAU,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wBAAwB,CAAC,KAAa;IACpD,MAAM,KAAK,GAAG,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC"}