@procedures/client 0.15.0 → 0.15.1

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 (59) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/adapters/http/server/handler.d.ts.map +1 -1
  4. package/dist/adapters/http/server/handler.js +5 -3
  5. package/dist/adapters/http/server/handler.js.map +1 -1
  6. package/dist/browser.d.ts +2 -1
  7. package/dist/browser.d.ts.map +1 -1
  8. package/dist/browser.js.map +1 -1
  9. package/dist/client/errors/registry.d.ts.map +1 -1
  10. package/dist/client/errors/registry.js +12 -0
  11. package/dist/client/errors/registry.js.map +1 -1
  12. package/dist/client/middleware/rate-limit.d.ts +17 -0
  13. package/dist/client/middleware/rate-limit.d.ts.map +1 -1
  14. package/dist/client/middleware/rate-limit.js +94 -39
  15. package/dist/client/middleware/rate-limit.js.map +1 -1
  16. package/dist/events/index.d.ts +1 -0
  17. package/dist/events/index.d.ts.map +1 -1
  18. package/dist/events/index.js.map +1 -1
  19. package/dist/events/publisher.d.ts +46 -1
  20. package/dist/events/publisher.d.ts.map +1 -1
  21. package/dist/events/publisher.js +95 -5
  22. package/dist/events/publisher.js.map +1 -1
  23. package/dist/events/recheck.d.ts +84 -0
  24. package/dist/events/recheck.d.ts.map +1 -0
  25. package/dist/events/recheck.js +135 -0
  26. package/dist/events/recheck.js.map +1 -0
  27. package/dist/protocol.d.ts +1 -1
  28. package/dist/protocol.d.ts.map +1 -1
  29. package/dist/protocol.js +1 -0
  30. package/dist/protocol.js.map +1 -1
  31. package/dist/server/host-policy.d.ts +17 -0
  32. package/dist/server/host-policy.d.ts.map +1 -1
  33. package/dist/server/host-policy.js +7 -0
  34. package/dist/server/host-policy.js.map +1 -1
  35. package/dist/server/limits.d.ts +122 -0
  36. package/dist/server/limits.d.ts.map +1 -0
  37. package/dist/server/limits.js +153 -0
  38. package/dist/server/limits.js.map +1 -0
  39. package/dist/server/procedure-server.d.ts +31 -1
  40. package/dist/server/procedure-server.d.ts.map +1 -1
  41. package/dist/server/procedure-server.js +38 -2
  42. package/dist/server/procedure-server.js.map +1 -1
  43. package/dist/server/request-auth.d.ts +5 -1
  44. package/dist/server/request-auth.d.ts.map +1 -1
  45. package/dist/server/request-auth.js +19 -2
  46. package/dist/server/request-auth.js.map +1 -1
  47. package/package.json +3 -3
  48. package/src/adapters/http/server/handler.ts +5 -3
  49. package/src/browser.ts +4 -0
  50. package/src/client/errors/registry.ts +13 -0
  51. package/src/client/middleware/rate-limit.ts +116 -41
  52. package/src/events/index.ts +1 -0
  53. package/src/events/publisher.ts +116 -6
  54. package/src/events/recheck.ts +182 -0
  55. package/src/protocol.ts +3 -1
  56. package/src/server/host-policy.ts +22 -0
  57. package/src/server/limits.ts +254 -0
  58. package/src/server/procedure-server.ts +55 -3
  59. package/src/server/request-auth.ts +19 -2
@@ -1 +1 @@
1
- {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@
18
18
  * call and what the host gives for it (CAPABILITIES-2026-10).
19
19
  * - `events`: the remote events of the host (`documentation/EVENTS.md`). The server pins
20
20
  * `events.subscribe` with this topic rule, and its procedures get the bus as `ctx.bus`.
21
+ * - `limits`, `limitStores`: the limits of the calls (CLI-40). Each server of the policy makes one
22
+ * keyed limiter for each limit, and refuses a call above a limit with `RATE_LIMITED`.
21
23
  */
22
24
  import type { Capability, ClearanceOrder, ProcedurePath, ResourcesOf } from "../procedures/types.js";
23
25
  import type { AdmitItem, Interceptor, Invocation } from "../procedures/invoke.js";
@@ -27,6 +29,8 @@ import type { ProcedureRegistry } from "../procedures/registry.js";
27
29
  import type { ProcedureServerOptions } from "./procedure-server.js";
28
30
  import type { EventPublisherOptions } from "../events/publisher.js";
29
31
  import { type Duration } from "../duration.js";
32
+ import type { LimiterStore } from "@mark1russell7/service/limiter";
33
+ import type { CallLimit } from "./limits.js";
30
34
  /** The procedures of a host that are tools: namespaces (first path segments), less some keys. */
31
35
  export interface ToolSurface {
32
36
  namespaces: readonly string[];
@@ -77,6 +81,15 @@ export interface HostPolicyOptions {
77
81
  * `ctx.bus`. Without this option, the host does not serve `events.subscribe`.
78
82
  */
79
83
  events?: EventPublisherOptions | undefined;
84
+ /**
85
+ * The limits of the calls (CLI-40): each limit counts the calls of one key, for example the
86
+ * writes of each tenant. A refusal is `RATE_LIMITED` on each face. Without it: no limits.
87
+ * Each limit that covers a call takes one unit, in the sequence of the limits. A limit before a
88
+ * refusal keeps its unit: the server does not give it back.
89
+ */
90
+ limits?: readonly CallLimit[] | undefined;
91
+ /** The stores that the replicas share, by the name of their dependency, for the limits with a shared store. */
92
+ limitStores?: Readonly<Record<string, LimiterStore>> | undefined;
80
93
  }
81
94
  /** What a host lets its callers do. */
82
95
  export interface HostPolicy {
@@ -94,6 +107,10 @@ export interface HostPolicy {
94
107
  readonly admitItem: AdmitItem | undefined;
95
108
  /** The remote events: each server of the policy makes its own publisher from these options. */
96
109
  readonly events: EventPublisherOptions | undefined;
110
+ /** The limits of the calls (CLI-40). Each server of the policy makes its own keyed limiters from them. */
111
+ readonly limits?: readonly CallLimit[] | undefined;
112
+ /** The shared stores of the limits, by the name of their dependency. */
113
+ readonly limitStores?: Readonly<Record<string, LimiterStore>> | undefined;
97
114
  }
98
115
  /** This function builds the policy of a host from its options. */
99
116
  export declare function hostPolicy(options?: HostPolicyOptions): HostPolicy;
@@ -1 +1 @@
1
- {"version":3,"file":"host-policy.d.ts","sourceRoot":"","sources":["../../src/server/host-policy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host-policy.d.ts","sourceRoot":"","sources":["../../src/server/host-policy.ts"],"names":[],"mappings":"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"}
@@ -18,6 +18,8 @@
18
18
  * call and what the host gives for it (CAPABILITIES-2026-10).
19
19
  * - `events`: the remote events of the host (`documentation/EVENTS.md`). The server pins
20
20
  * `events.subscribe` with this topic rule, and its procedures get the bus as `ctx.bus`.
21
+ * - `limits`, `limitStores`: the limits of the calls (CLI-40). Each server of the policy makes one
22
+ * keyed limiter for each limit, and refuses a call above a limit with `RATE_LIMITED`.
21
23
  */
22
24
  import { narrowCapability } from "../procedures/capability.js";
23
25
  import { timeoutInterceptor } from "../procedures/interceptors.js";
@@ -92,6 +94,8 @@ export function hostPolicy(options = {}) {
92
94
  resources: options.resources,
93
95
  admitItem: options.admitItem,
94
96
  events: options.events,
97
+ ...(options.limits && options.limits.length > 0 ? { limits: options.limits } : {}),
98
+ ...(options.limitStores ? { limitStores: options.limitStores } : {}),
95
99
  };
96
100
  }
97
101
  /** The options of a `ProcedureServer` that serves a registry under a policy. */
@@ -112,6 +116,9 @@ export function procedureServerOptions(policy, registry) {
112
116
  ...(policy.admitItem ? { admitItem: policy.admitItem } : {}),
113
117
  // The remote events: the server makes its publisher and pins events.subscribe (EVENTS.md)
114
118
  ...(policy.events ? { events: policy.events } : {}),
119
+ // The limits of the calls: the server makes one keyed limiter for each one (CLI-40)
120
+ ...(policy.limits ? { limits: policy.limits } : {}),
121
+ ...(policy.limitStores ? { limitStores: policy.limitStores } : {}),
115
122
  };
116
123
  }
117
124
  //# sourceMappingURL=host-policy.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host-policy.js","sourceRoot":"","sources":["../../src/server/host-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAKnE,OAAO,EAAE,IAAI,EAAiB,MAAM,gBAAgB,CAAC;AAQrD,8FAA8F;AAC9F,MAAM,UAAU,cAAc,CAAC,QAA2B;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,GAAG,GAAG,KAAK,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,IAAI,OAAO,KAAK,GAAG;YAAE,GAAG,GAAG,IAAI,CAAC;aAC3B,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;;YAChE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,WAAW,CAAC,OAAoB;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAClF,CAAC;AA+DD,kGAAkG;AAClG,SAAS,mBAAmB,CAAC,OAA0B;IACrD,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IACzC,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5D,MAAM,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,EAAuB,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAChG,OAAO,CAAC,OAAO,EAAE,EAAE;QACjB,MAAM,IAAI,GAAG,OAAO,UAAU,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QACzG,OAAO,eAAe,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,EAAE,eAAe,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClG,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,OAA0B;IAC1C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,IAAI,GACR,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,OAAO,MAAM,KAAK,UAAU;YAC5B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;gBACrB,CAAC,CAAC,cAAc,CAAC,MAA2B,CAAC;gBAC7C,CAAC,CAAC,WAAW,CAAC,MAAqB,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAChD,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAC/E,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,UAAU,CAAC,OAAO,GAAsB,EAAE;IACxD,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,IAAI,OAAO,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1E,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACpE,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,KAAK;QACzC,YAAY;QACZ,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACpE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;QAC9B,YAAY,EAAE,mBAAmB,CAAC,OAAO,CAAC;QAC1C,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,MAAkB,EAAE,QAA4B;IACrF,OAAO;QACL,YAAY,EAAE,IAAI;QAClB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnD,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,sFAAsF;QACtF,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,8FAA8F;QAC9F,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5D,0FAA0F;QAC1F,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"host-policy.js","sourceRoot":"","sources":["../../src/server/host-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * The limits of the calls of a server (CLI-40): one admission step for each face.
3
+ *
4
+ * A limit is data: a key over the call, the calls that it covers, a limit policy, a store and a
5
+ * bound on its keys. Each limit is a keyed limiter of `@mark1russell7/service/limiter` (SYS-28) on
6
+ * the clock of the server. The server takes one unit of each limit that covers a call, after the
7
+ * authentication and before the run. Thus the key can read the principal of the call. It takes the
8
+ * units in the sequence of the limits, and the first refusal stops the call. A limit before the
9
+ * refusal keeps its unit: the server does not give it back.
10
+ *
11
+ * A refusal is `RATE_LIMITED` (retryable), with the wait in the metadata key `retry-after` (in
12
+ * milliseconds) and the cause in `reason` (`limit`, `cap` or `store`). The HTTP face answers 429
13
+ * with `Retry-After` in whole seconds. The WebSocket face and the MCP face give the same code and
14
+ * the same wait. The work did not start, so a retry after the wait is safe.
15
+ */
16
+ import { type KeyedLimiter, type LimitPolicy, type LimiterEviction, type LimiterStore, type LimiterStoreSpec, type Refused } from "@mark1russell7/service/limiter";
17
+ import type { Clock } from "../clock.js";
18
+ import { type Effects, type ProcedurePath } from "../procedures/types.js";
19
+ import type { Principal, ServerRequest, ServerResponse } from "./types.js";
20
+ /** The facts of a call that a limit reads. The server gives them after the authentication of the call. */
21
+ export interface LimitedCall {
22
+ /** The path of the procedure of the call. */
23
+ readonly path: ProcedurePath;
24
+ /** The route of the call: the key of its procedure, for example `collections.notes.set`. */
25
+ readonly route: string;
26
+ /** The effects that the procedure declares, or undefined when it declares none. */
27
+ readonly effects: Effects | undefined;
28
+ /** True when the procedure can change data: its effects do not say `writes: []`. A procedure without effects can change data. */
29
+ readonly writes: boolean;
30
+ /** The principal of the call: from the request hook, the token check or the authenticate function. Undefined for a call without one. */
31
+ readonly principal: Principal | undefined;
32
+ /** The request. Its payload and its metadata come from the caller, thus a key from them is a claim of the caller. */
33
+ readonly request: ServerRequest<unknown>;
34
+ }
35
+ /**
36
+ * A part of the key of a limit, as data:
37
+ * - `principal`: the id of the principal of the call.
38
+ * - `route`: the key of the procedure of the call.
39
+ * - `{ claim }`: a claim of the principal, for example `{ claim: "tenant" }`. A string or a number.
40
+ */
41
+ export type CallLimitKeyPart = "principal" | "route" | {
42
+ readonly claim: string;
43
+ };
44
+ /**
45
+ * The key of a limit: one part, a list of parts, or a function of the call. A call whose key has
46
+ * no value (a part without a value, or a function that gives undefined) is outside the limit.
47
+ */
48
+ export type CallLimitKey = CallLimitKeyPart | readonly CallLimitKeyPart[] | ((call: LimitedCall) => string | undefined);
49
+ /** The calls that a limit covers, as data. Each given field must agree. Without a field, the limit covers each call. */
50
+ export interface CallLimitCovers {
51
+ /** True: only the calls of a procedure that can change data. False: only the calls of a procedure that changes nothing. */
52
+ readonly writes?: boolean | undefined;
53
+ /** Only the calls of these procedures: an exact key (`notes.set`), a prefix (`collections.*`) or `*`. */
54
+ readonly routes?: readonly string[] | undefined;
55
+ }
56
+ /**
57
+ * A limit of the calls of a server (CLI-40): a keyed limiter of `@mark1russell7/service/limiter`
58
+ * with a key over the call. The policy, the store and the bound on the keys have no defaults, as
59
+ * in the spec of a keyed limiter (`LimiterSpec`).
60
+ */
61
+ export interface CallLimit {
62
+ /** The name of the limiter. It is unique in the service: `svc.limiter()` declares the limiter with this name. */
63
+ readonly name: string;
64
+ /** The key of each call: who or what the limit counts. */
65
+ readonly key: CallLimitKey;
66
+ /**
67
+ * The text of the key in the declaration of the service (`LimiterSpec.key`), for example
68
+ * `tenant`. The default names the parts of the key, or `call` for a function.
69
+ */
70
+ readonly keyName?: string | undefined;
71
+ /** The calls that the limit covers: the fields of `CallLimitCovers`, or a function of the call. Without it, each call. */
72
+ readonly covers?: CallLimitCovers | ((call: LimitedCall) => boolean) | undefined;
73
+ /** The policy: a token bucket or a sliding window. */
74
+ readonly policy: LimitPolicy;
75
+ /**
76
+ * The store of the counts. `{ kind: "local" }`: the memory of this replica. `{ kind: "shared",
77
+ * dependency, onStoreFailure }`: the store of `limitStores` with the name of the dependency.
78
+ */
79
+ readonly store: LimiterStoreSpec;
80
+ /** The bound on the keys that the store holds. */
81
+ readonly evict: LimiterEviction;
82
+ }
83
+ /** The refusal of a call by one limit. */
84
+ export interface CallLimitRefusal {
85
+ /** The name of the limit that refused the call. */
86
+ readonly limit: string;
87
+ readonly refused: Refused;
88
+ }
89
+ /** The limits of one server, as runtime: one keyed limiter for each limit. */
90
+ export interface CallLimiter {
91
+ /** The keyed limiters, in the sequence of the limits. A host declares each one with `svc.limiter(name, spec)`. */
92
+ readonly limiters: readonly KeyedLimiter[];
93
+ /**
94
+ * This method takes one unit of each limit that covers the call, in the sequence of the limits.
95
+ * It gives the first refusal, or undefined. A limit before the refusal keeps its unit.
96
+ */
97
+ admit(call: LimitedCall): Promise<CallLimitRefusal | undefined>;
98
+ }
99
+ /** The options of `callLimiter()`. */
100
+ export interface CallLimiterOptions {
101
+ /** The clock of the local store: give the clock of the server. */
102
+ readonly clock: Clock;
103
+ /** The stores that the replicas share, by the name of their dependency. */
104
+ readonly stores?: Readonly<Record<string, LimiterStore>> | undefined;
105
+ }
106
+ /**
107
+ * This function makes the runtime of the limits of a server: one keyed limiter for each limit. The
108
+ * local limits share one memory store on the clock of the options. It refuses two limits with one
109
+ * name, a limit with a problem in its spec, and a shared store that `stores` does not have.
110
+ */
111
+ export declare function callLimiter(limits: readonly CallLimit[], options: CallLimiterOptions): CallLimiter;
112
+ /** This function gives the facts of a call for the limits: its procedure, its effects, its principal and its request. */
113
+ export declare function limitedCall(procedure: {
114
+ readonly path: ProcedurePath;
115
+ readonly metadata?: unknown;
116
+ }, request: ServerRequest<unknown>): LimitedCall;
117
+ /**
118
+ * This function gives the response of a refused call: `RATE_LIMITED`, retryable, with the wait in
119
+ * `retry-after` (milliseconds) and the cause in `reason`. The failure of a store stays on the server.
120
+ */
121
+ export declare function rateLimitedResponse(id: string, refusal: CallLimitRefusal): ServerResponse<unknown>;
122
+ //# sourceMappingURL=limits.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.d.ts","sourceRoot":"","sources":["../../src/server/limits.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * The limits of the calls of a server (CLI-40): one admission step for each face.
3
+ *
4
+ * A limit is data: a key over the call, the calls that it covers, a limit policy, a store and a
5
+ * bound on its keys. Each limit is a keyed limiter of `@mark1russell7/service/limiter` (SYS-28) on
6
+ * the clock of the server. The server takes one unit of each limit that covers a call, after the
7
+ * authentication and before the run. Thus the key can read the principal of the call. It takes the
8
+ * units in the sequence of the limits, and the first refusal stops the call. A limit before the
9
+ * refusal keeps its unit: the server does not give it back.
10
+ *
11
+ * A refusal is `RATE_LIMITED` (retryable), with the wait in the metadata key `retry-after` (in
12
+ * milliseconds) and the cause in `reason` (`limit`, `cap` or `store`). The HTTP face answers 429
13
+ * with `Retry-After` in whole seconds. The WebSocket face and the MCP face give the same code and
14
+ * the same wait. The work did not start, so a retry after the wait is safe.
15
+ */
16
+ import { valueIn } from "@mark1russell7/quantity";
17
+ import { keyedLimiter, memoryStore, retryAfterSeconds, } from "@mark1russell7/service/limiter";
18
+ import { effectsOf, isReadOnly } from "../procedures/capability.js";
19
+ import { pathToKey } from "../procedures/types.js";
20
+ import { exposePatterns } from "./host-policy.js";
21
+ /** The metadata key of the wait of a refusal, in milliseconds (the same key as `retry-after` of wire v1). */
22
+ const RETRY_AFTER = "retry-after";
23
+ /** This function tells if a key is a list of parts. */
24
+ function isPartList(key) {
25
+ return Array.isArray(key);
26
+ }
27
+ /** The value of one part of a key, or undefined. */
28
+ function partValue(part, call) {
29
+ if (part === "principal")
30
+ return call.principal?.id;
31
+ if (part === "route")
32
+ return call.route;
33
+ const value = call.principal?.claims?.[part.claim];
34
+ return typeof value === "string" ? value : typeof value === "number" && Number.isFinite(value) ? String(value) : undefined;
35
+ }
36
+ /** The text of one part of a key, for the declaration of the service. */
37
+ function partName(part) {
38
+ return typeof part === "string" ? part : part.claim;
39
+ }
40
+ /** This function gives the function of the key of a limit. A list of parts gives the JSON of the values. */
41
+ function keyFunction(key) {
42
+ if (typeof key === "function")
43
+ return key;
44
+ const parts = isPartList(key) ? key : [key];
45
+ if (parts.length === 0)
46
+ throw new Error("A key of a limit needs one part or more");
47
+ return (call) => {
48
+ const values = [];
49
+ for (const part of parts) {
50
+ const value = partValue(part, call);
51
+ if (value === undefined)
52
+ return undefined;
53
+ values.push(value);
54
+ }
55
+ return values.length === 1 ? values[0] : JSON.stringify(values);
56
+ };
57
+ }
58
+ /** The text of the key of a limit, for the declaration of the service. */
59
+ function keyNameOf(limit) {
60
+ if (limit.keyName !== undefined)
61
+ return limit.keyName;
62
+ if (typeof limit.key === "function")
63
+ return "call";
64
+ return (isPartList(limit.key) ? limit.key : [limit.key]).map(partName).join("+");
65
+ }
66
+ /** This function gives the function that tells if a limit covers a call. */
67
+ function coversFunction(covers) {
68
+ if (covers === undefined)
69
+ return () => true;
70
+ if (typeof covers === "function")
71
+ return covers;
72
+ const { writes, routes } = covers;
73
+ const routeRule = routes === undefined ? undefined : exposePatterns(routes);
74
+ return (call) => (writes === undefined || call.writes === writes) && (routeRule === undefined || routeRule(call.path));
75
+ }
76
+ /** This function gives the store of a limit: the local store, or the shared store of its dependency. */
77
+ function storeOf(limit, local, stores) {
78
+ const spec = limit.store;
79
+ if (spec === undefined || spec.kind !== "shared")
80
+ return local;
81
+ const store = Object.prototype.hasOwnProperty.call(stores, spec.dependency) ? stores[spec.dependency] : undefined;
82
+ if (store === undefined) {
83
+ throw new Error(`The limit ${limit.name} keeps its counts in the shared store ${spec.dependency}, and limitStores has no store with that name`);
84
+ }
85
+ return store;
86
+ }
87
+ /**
88
+ * This function makes the runtime of the limits of a server: one keyed limiter for each limit. The
89
+ * local limits share one memory store on the clock of the options. It refuses two limits with one
90
+ * name, a limit with a problem in its spec, and a shared store that `stores` does not have.
91
+ */
92
+ export function callLimiter(limits, options) {
93
+ const local = memoryStore(options.clock);
94
+ const stores = options.stores ?? {};
95
+ const names = new Set();
96
+ const entries = limits.map((limit) => {
97
+ if (names.has(limit.name))
98
+ throw new Error(`Two limits have the name ${limit.name}: the name of a limit is unique`);
99
+ names.add(limit.name);
100
+ const keyOf = keyFunction(limit.key);
101
+ const covers = coversFunction(limit.covers);
102
+ const limiter = keyedLimiter(limit.name, { key: keyNameOf(limit), policy: limit.policy, store: limit.store, evict: limit.evict }, storeOf(limit, local, stores));
103
+ return { limiter, keyOf, covers };
104
+ });
105
+ return {
106
+ limiters: entries.map((entry) => entry.limiter),
107
+ async admit(call) {
108
+ for (const { limiter, keyOf, covers } of entries) {
109
+ if (!covers(call))
110
+ continue;
111
+ const key = keyOf(call);
112
+ if (key === undefined)
113
+ continue;
114
+ const decision = await limiter.take(key);
115
+ if (!decision.allowed)
116
+ return { limit: limiter.name, refused: decision };
117
+ }
118
+ return undefined;
119
+ },
120
+ };
121
+ }
122
+ /** This function gives the facts of a call for the limits: its procedure, its effects, its principal and its request. */
123
+ export function limitedCall(procedure, request) {
124
+ const effects = effectsOf(procedure);
125
+ return {
126
+ path: procedure.path,
127
+ route: pathToKey(procedure.path),
128
+ effects,
129
+ writes: !isReadOnly(effects),
130
+ principal: request.principal,
131
+ request,
132
+ };
133
+ }
134
+ /**
135
+ * This function gives the response of a refused call: `RATE_LIMITED`, retryable, with the wait in
136
+ * `retry-after` (milliseconds) and the cause in `reason`. The failure of a store stays on the server.
137
+ */
138
+ export function rateLimitedResponse(id, refusal) {
139
+ const { limit, refused } = refusal;
140
+ const waitMs = valueIn(refused.retryAfter, "ms");
141
+ const seconds = retryAfterSeconds(refused.retryAfter);
142
+ return {
143
+ id,
144
+ status: {
145
+ type: "error",
146
+ code: "RATE_LIMITED",
147
+ message: `The limit ${limit} of the host refuses the call (${refused.cause}): retry after ${seconds} s`,
148
+ retryable: true,
149
+ },
150
+ metadata: { [RETRY_AFTER]: waitMs, reason: refused.cause },
151
+ };
152
+ }
153
+ //# sourceMappingURL=limits.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/server/limits.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EACL,YAAY,EACZ,WAAW,EACX,iBAAiB,GAOlB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAoC,MAAM,wBAAwB,CAAC;AACrF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AA+FlD,6GAA6G;AAC7G,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,uDAAuD;AACvD,SAAS,UAAU,CAAC,GAAiB;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,oDAAoD;AACpD,SAAS,SAAS,CAAC,IAAsB,EAAE,IAAiB;IAC1D,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC;IACpD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7H,CAAC;AAED,yEAAyE;AACzE,SAAS,QAAQ,CAAC,IAAsB;IACtC,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AACtD,CAAC;AAED,4GAA4G;AAC5G,SAAS,WAAW,CAAC,GAAiB;IACpC,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACnF,OAAO,CAAC,IAAI,EAAE,EAAE;QACd,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC,CAAC;AACJ,CAAC;AAED,0EAA0E;AAC1E,SAAS,SAAS,CAAC,KAAgB;IACjC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACtD,IAAI,OAAO,KAAK,CAAC,GAAG,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IACnD,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnF,CAAC;AAED,4EAA4E;AAC5E,SAAS,cAAc,CAAC,MAA2B;IACjD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;IAC5C,IAAI,OAAO,MAAM,KAAK,UAAU;QAAE,OAAO,MAAM,CAAC;IAChD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5E,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,wGAAwG;AACxG,SAAS,OAAO,CAAC,KAAgB,EAAE,KAAmB,EAAE,MAA8C;IACpG,MAAM,IAAI,GAAG,KAAK,CAAC,KAAqC,CAAC;IACzD,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClH,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,yCAAyC,IAAI,CAAC,UAAU,+CAA+C,CAAC,CAAC;IAClJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAA4B,EAAE,OAA2B;IACnF,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACnC,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,IAAI,iCAAiC,CAAC,CAAC;QACpH,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;QACjK,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IACH,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC;QAC/C,KAAK,CAAC,KAAK,CAAC,IAAI;YACd,KAAK,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;gBACjD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;gBACxB,IAAI,GAAG,KAAK,SAAS;oBAAE,SAAS;gBAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,CAAC,QAAQ,CAAC,OAAO;oBAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;YAC3E,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,yHAAyH;AACzH,MAAM,UAAU,WAAW,CAAC,SAAwE,EAAE,OAA+B;IACnI,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,KAAK,EAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;QAChC,OAAO;QACP,MAAM,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAAU,EAAE,OAAyB;IACvE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,OAAO;QACL,EAAE;QACF,MAAM,EAAE;YACN,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,aAAa,KAAK,kCAAkC,OAAO,CAAC,KAAK,kBAAkB,OAAO,IAAI;YACvG,SAAS,EAAE,IAAI;SAChB;QACD,QAAQ,EAAE,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,EAAE;KAC3D,CAAC;AACJ,CAAC"}
@@ -18,6 +18,8 @@ import { type Clock } from "../clock.js";
18
18
  import { EventPublisher, type EventPublisherOptions } from "../events/publisher.js";
19
19
  import type { CollectionProceduresOptions } from "../procedures/collection/procedures.js";
20
20
  import type { ServerDebugReport } from "./types.js";
21
+ import type { KeyedLimiter, LimiterStore } from "@mark1russell7/service/limiter";
22
+ import { type CallLimit } from "./limits.js";
21
23
  /**
22
24
  * Storage configuration for a collection.
23
25
  */
@@ -134,7 +136,8 @@ export interface ProcedureServerOptions extends ServerOptions {
134
136
  * The remote events of the server (`documentation/EVENTS.md`): a bus and its topic rule, or an
135
137
  * `EventPublisher`. The server pins the procedure `events.subscribe`, outside its registry, so a
136
138
  * peer can subscribe to the topics. The procedures of the server get this bus as `ctx.bus`.
137
- * `stop()` ends each subscription first, with `UNAVAILABLE`.
139
+ * `stop()` ends each subscription first, with `UNAVAILABLE`. A publisher that the server makes
140
+ * from the options gets the clock of the server, unless the options give a clock (CLI-44).
138
141
  */
139
142
  events?: EventPublisherOptions | EventPublisher | undefined;
140
143
  /**
@@ -145,6 +148,19 @@ export interface ProcedureServerOptions extends ServerOptions {
145
148
  * @default false
146
149
  */
147
150
  debug?: boolean | ((report: ServerDebugReport) => void) | undefined;
151
+ /**
152
+ * The limits of the calls (CLI-40). Each limit is a keyed limiter of
153
+ * `@mark1russell7/service/limiter` on the clock of the server. The server takes one unit of each
154
+ * limit that covers a call, after the authentication and before the run, for each face. A
155
+ * refusal is `RATE_LIMITED` with the wait in `retry-after`: HTTP 429 with `Retry-After`. Without
156
+ * this option, the server limits nothing.
157
+ *
158
+ * The server takes the units in the sequence of the limits, and the first refusal stops the call.
159
+ * A limit before the refusal keeps its unit: the server does not give it back.
160
+ */
161
+ limits?: readonly CallLimit[] | undefined;
162
+ /** The stores that the replicas share, by the name of their dependency, for each limit with a shared store. */
163
+ limitStores?: Readonly<Record<string, LimiterStore>> | undefined;
148
164
  }
149
165
  /** The options of `registerProcedure()`, `registerProcedures()` and `registerModule()` (CLI-47). */
150
166
  export interface RegisterProcedureOptions {
@@ -306,6 +322,8 @@ export declare class ProcedureServer extends Server implements RepositoryProvide
306
322
  readonly ambientCredentials: AmbientCredentials | undefined;
307
323
  /** The receiver of the debug reports, or undefined when the option `debug` is off. */
308
324
  private readonly debugReport;
325
+ /** The limits of the calls (CLI-40), or undefined without the option `limits`. */
326
+ private readonly callLimits;
309
327
  constructor(options?: ProcedureServerOptions);
310
328
  /**
311
329
  * Get storage for a collection.
@@ -454,6 +472,12 @@ export declare class ProcedureServer extends Server implements RepositoryProvide
454
472
  * passes.
455
473
  */
456
474
  private admit;
475
+ /**
476
+ * The limits of a call (CLI-40): one unit of each limit that covers it. The function gives a
477
+ * `RATE_LIMITED` response, or undefined when the call passes. A key or a cover function that
478
+ * throws gives `INTERNAL_ERROR`, so a defect of a limit does not let a call in.
479
+ */
480
+ private limit;
457
481
  /** One call in flight ended: `drain()` can end when it was the last one. */
458
482
  private callEnded;
459
483
  /**
@@ -525,6 +549,12 @@ export declare class ProcedureServer extends Server implements RepositoryProvide
525
549
  * idempotency of each request (decision D3, CLI-7).
526
550
  */
527
551
  procedureOf(method: Method): AnyProcedure | undefined;
552
+ /**
553
+ * This method gives the keyed limiters of the option `limits`, in its sequence (CLI-40). A host
554
+ * declares each one on its service with `svc.limiter(limiter.name, limiter.spec)`, so
555
+ * `describe()` and `lint()` see it.
556
+ */
557
+ limiters(): readonly KeyedLimiter[];
528
558
  /**
529
559
  * This function publishes an event on the bus of the server: the bus of the option `events`, or
530
560
  * the global bus. Each subscription of the topic gets it (`documentation/EVENTS.md`).
@@ -1 +1 @@
1
- {"version":3,"file":"procedure-server.d.ts","sourceRoot":"","sources":["../../src/server/procedure-server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"procedure-server.d.ts","sourceRoot":"","sources":["../../src/server/procedure-server.ts"],"names":[],"mappings":"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"}
@@ -19,6 +19,7 @@ import { realClock } from "../clock.js";
19
19
  import { ERROR_CODES, errorCodeOf, isProtocolErrorCode } from "../protocol.js";
20
20
  import { EventPublisher } from "../events/publisher.js";
21
21
  import { getGlobalEventBus } from "../events/bus.js";
22
+ import { callLimiter, limitedCall, rateLimitedResponse } from "./limits.js";
22
23
  /**
23
24
  * The metadata key of a stream response whose procedure declares `stream: { unbounded: true }`.
24
25
  * Its value is "unbounded".
@@ -211,6 +212,8 @@ export class ProcedureServer extends Server {
211
212
  ambientCredentials;
212
213
  /** The receiver of the debug reports, or undefined when the option `debug` is off. */
213
214
  debugReport;
215
+ /** The limits of the calls (CLI-40), or undefined without the option `limits`. */
216
+ callLimits;
214
217
  constructor(options = {}) {
215
218
  super(options);
216
219
  this.procedureRegistry = options.registry ?? PROCEDURE_REGISTRY;
@@ -236,9 +239,13 @@ export class ProcedureServer extends Server {
236
239
  : options.debug === true
237
240
  ? (report) => console.debug(`[ProcedureServer] ${report.topic} of ${report.requestId}: ${report.message}`)
238
241
  : undefined;
242
+ // The limits of the calls: one keyed limiter for each limit, on the clock of the server (CLI-40)
243
+ this.callLimits = options.limits && options.limits.length > 0 ? callLimiter(options.limits, { clock: this.clock, stores: options.limitStores }) : undefined;
239
244
  // The remote events: the server pins events.subscribe, as a host pins host.health (EVENTS.md).
240
- // The topic rule is its expose rule, so the pin is always on (CLI-47).
241
- this.publisher = options.events instanceof EventPublisher ? options.events : options.events ? new EventPublisher(options.events) : undefined;
245
+ // The topic rule is its expose rule, so the pin is always on (CLI-47). The publisher that the
246
+ // server makes gets the clock of the server for its re-checks (CLI-44).
247
+ const events = options.events;
248
+ this.publisher = events instanceof EventPublisher ? events : events ? new EventPublisher({ ...events, clock: events.clock ?? this.clock }) : undefined;
242
249
  if (this.publisher)
243
250
  this.registerProcedure(this.publisher.procedure, { alwaysOn: true });
244
251
  // Configure collections
@@ -525,6 +532,10 @@ export class ProcedureServer extends Server {
525
532
  const refusal = await this.admit(request);
526
533
  if (refusal)
527
534
  return refusal;
535
+ // The limits come after the authentication, so a key can read the principal (CLI-40)
536
+ const limited = await this.limit(procedure, request);
537
+ if (limited)
538
+ return limited;
528
539
  this.calls++;
529
540
  let response;
530
541
  try {
@@ -607,6 +618,23 @@ export class ProcedureServer extends Server {
607
618
  }
608
619
  return undefined;
609
620
  }
621
+ /**
622
+ * The limits of a call (CLI-40): one unit of each limit that covers it. The function gives a
623
+ * `RATE_LIMITED` response, or undefined when the call passes. A key or a cover function that
624
+ * throws gives `INTERNAL_ERROR`, so a defect of a limit does not let a call in.
625
+ */
626
+ async limit(procedure, request) {
627
+ if (!this.callLimits)
628
+ return undefined;
629
+ try {
630
+ const refused = await this.callLimits.admit(limitedCall(procedure, request));
631
+ return refused ? rateLimitedResponse(request.id, refused) : undefined;
632
+ }
633
+ catch (error) {
634
+ const message = `The limits of the server cannot admit the call: ${error instanceof Error ? error.message : String(error)}`;
635
+ return errorResponse(request.id, Object.assign(new Error(message), { code: "INTERNAL_ERROR" }));
636
+ }
637
+ }
610
638
  /** One call in flight ended: `drain()` can end when it was the last one. */
611
639
  callEnded() {
612
640
  this.calls--;
@@ -837,6 +865,14 @@ export class ProcedureServer extends Server {
837
865
  procedureOf(method) {
838
866
  return this.resolveProcedure(method);
839
867
  }
868
+ /**
869
+ * This method gives the keyed limiters of the option `limits`, in its sequence (CLI-40). A host
870
+ * declares each one on its service with `svc.limiter(limiter.name, limiter.spec)`, so
871
+ * `describe()` and `lint()` see it.
872
+ */
873
+ limiters() {
874
+ return this.callLimits?.limiters ?? [];
875
+ }
840
876
  /**
841
877
  * This function publishes an event on the bus of the server: the bus of the option `events`, or
842
878
  * the global bus. Each subscription of the topic gets it (`documentation/EVENTS.md`).