@procedures/client 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/README.md +1 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/adapters/http/server/transport.d.ts.map +1 -1
- package/dist/adapters/http/server/transport.js +1 -0
- package/dist/adapters/http/server/transport.js.map +1 -1
- package/dist/browser.d.ts +5 -2
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -1
- package/dist/browser.js.map +1 -1
- package/dist/client/client.d.ts +9 -1
- package/dist/client/client.d.ts.map +1 -1
- package/dist/client/client.js +27 -6
- package/dist/client/client.js.map +1 -1
- package/dist/client/types.d.ts +9 -0
- package/dist/client/types.d.ts.map +1 -1
- package/dist/client/types.js.map +1 -1
- package/dist/procedures/capability.d.ts +111 -0
- package/dist/procedures/capability.d.ts.map +1 -0
- package/dist/procedures/capability.js +269 -0
- package/dist/procedures/capability.js.map +1 -0
- package/dist/procedures/cli/discover.d.ts +3 -3
- package/dist/procedures/cli/discover.js +3 -3
- package/dist/procedures/cli/index.js +5 -3
- package/dist/procedures/cli/index.js.map +1 -1
- package/dist/procedures/cli/init.js +1 -1
- package/dist/procedures/collection/procedures.d.ts.map +1 -1
- package/dist/procedures/collection/procedures.js +12 -0
- package/dist/procedures/collection/procedures.js.map +1 -1
- package/dist/procedures/core/array.d.ts.map +1 -1
- package/dist/procedures/core/array.js +3 -1
- package/dist/procedures/core/array.js.map +1 -1
- package/dist/procedures/core/comparison.d.ts.map +1 -1
- package/dist/procedures/core/comparison.js +3 -1
- package/dist/procedures/core/comparison.js.map +1 -1
- package/dist/procedures/core/index.d.ts.map +1 -1
- package/dist/procedures/core/index.js +5 -2
- package/dist/procedures/core/index.js.map +1 -1
- package/dist/procedures/core/math.d.ts.map +1 -1
- package/dist/procedures/core/math.js +3 -1
- package/dist/procedures/core/math.js.map +1 -1
- package/dist/procedures/core/meta.d.ts.map +1 -1
- package/dist/procedures/core/meta.js +11 -6
- package/dist/procedures/core/meta.js.map +1 -1
- package/dist/procedures/core/object.d.ts.map +1 -1
- package/dist/procedures/core/object.js +3 -1
- package/dist/procedures/core/object.js.map +1 -1
- package/dist/procedures/core/string.d.ts.map +1 -1
- package/dist/procedures/core/string.js +3 -1
- package/dist/procedures/core/string.js.map +1 -1
- package/dist/procedures/core/type.d.ts.map +1 -1
- package/dist/procedures/core/type.js +3 -1
- package/dist/procedures/core/type.js.map +1 -1
- package/dist/procedures/define-procedure.d.ts.map +1 -1
- package/dist/procedures/define-procedure.js +5 -4
- package/dist/procedures/define-procedure.js.map +1 -1
- package/dist/procedures/effects.d.ts +15 -0
- package/dist/procedures/effects.d.ts.map +1 -0
- package/dist/procedures/effects.js +18 -0
- package/dist/procedures/effects.js.map +1 -0
- package/dist/procedures/index.d.ts +5 -2
- package/dist/procedures/index.d.ts.map +1 -1
- package/dist/procedures/index.js +8 -23
- package/dist/procedures/index.js.map +1 -1
- package/dist/procedures/interceptors.d.ts.map +1 -1
- package/dist/procedures/interceptors.js +2 -1
- package/dist/procedures/interceptors.js.map +1 -1
- package/dist/procedures/invoke.d.ts +31 -3
- package/dist/procedures/invoke.d.ts.map +1 -1
- package/dist/procedures/invoke.js +78 -12
- package/dist/procedures/invoke.js.map +1 -1
- package/dist/procedures/module.d.ts +13 -8
- package/dist/procedures/module.d.ts.map +1 -1
- package/dist/procedures/module.js +19 -9
- package/dist/procedures/module.js.map +1 -1
- package/dist/procedures/types.d.ts +100 -2
- package/dist/procedures/types.d.ts.map +1 -1
- package/dist/procedures/types.js.map +1 -1
- package/dist/register.d.ts +8 -0
- package/dist/register.d.ts.map +1 -0
- package/dist/register.js +9 -0
- package/dist/register.js.map +1 -0
- package/dist/server/host-policy.d.ts +24 -2
- package/dist/server/host-policy.d.ts.map +1 -1
- package/dist/server/host-policy.js +22 -0
- package/dist/server/host-policy.js.map +1 -1
- package/dist/server/procedure-server.d.ts +16 -2
- package/dist/server/procedure-server.d.ts.map +1 -1
- package/dist/server/procedure-server.js +26 -1
- package/dist/server/procedure-server.js.map +1 -1
- package/package.json +6 -4
- package/src/adapters/http/server/transport.ts +1 -0
- package/src/browser.ts +28 -0
- package/src/client/client.ts +33 -6
- package/src/client/types.ts +11 -0
- package/src/procedures/capability.ts +333 -0
- package/src/procedures/cli/discover.ts +3 -3
- package/src/procedures/cli/index.ts +5 -3
- package/src/procedures/cli/init.ts +1 -1
- package/src/procedures/collection/procedures.ts +12 -0
- package/src/procedures/core/array.ts +3 -1
- package/src/procedures/core/comparison.ts +3 -1
- package/src/procedures/core/index.ts +5 -2
- package/src/procedures/core/math.ts +3 -1
- package/src/procedures/core/meta.ts +11 -6
- package/src/procedures/core/object.ts +3 -1
- package/src/procedures/core/string.ts +3 -1
- package/src/procedures/core/type.ts +3 -1
- package/src/procedures/define-procedure.ts +5 -4
- package/src/procedures/effects.ts +24 -0
- package/src/procedures/index.ts +33 -22
- package/src/procedures/interceptors.ts +2 -1
- package/src/procedures/invoke.ts +106 -13
- package/src/procedures/module.ts +19 -9
- package/src/procedures/types.ts +113 -2
- package/src/register.ts +10 -0
- package/src/server/host-policy.ts +44 -2
- package/src/server/procedure-server.ts +44 -2
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
* procedures (a host for an outside caller sets it).
|
|
13
13
|
* - `timeoutMs`: the time limit of each call from a caller (not of its nested calls).
|
|
14
14
|
* - `token`, `browser`: the checks of the network transports (`client-server` applies them).
|
|
15
|
+
* - `capability`, `readOnly`, `clearanceOrder`, `resources`, `admitItem`: the capability of each
|
|
16
|
+
* call and what the host gives for it (CAPABILITIES-2026-10).
|
|
15
17
|
*/
|
|
18
|
+
import { narrowCapability } from "../procedures/capability.js";
|
|
16
19
|
import { timeoutInterceptor } from "../procedures/interceptors.js";
|
|
17
20
|
/** The rule of a list of patterns: an exact key (`git.status`), a prefix (`git.*`) or `*`. */
|
|
18
21
|
export function exposePatterns(patterns) {
|
|
@@ -40,6 +43,17 @@ export function surfaceRule(surface) {
|
|
|
40
43
|
const excluded = new Set(surface.exclude ?? []);
|
|
41
44
|
return (path) => namespaces.has(path[0] ?? "") && !excluded.has(path.join("."));
|
|
42
45
|
}
|
|
46
|
+
/** The capability function of a policy: the capability of the options, narrowed by `readOnly`. */
|
|
47
|
+
function capabilityOfOptions(options) {
|
|
48
|
+
const { capability, readOnly } = options;
|
|
49
|
+
if (capability === undefined && !readOnly)
|
|
50
|
+
return undefined;
|
|
51
|
+
const readOnlyRequest = readOnly ? { effects: { writes: [] } } : undefined;
|
|
52
|
+
return (request) => {
|
|
53
|
+
const base = typeof capability === "function" ? (request ? capability(request) : undefined) : capability;
|
|
54
|
+
return readOnlyRequest ? narrowCapability(base, readOnlyRequest, options.clearanceOrder) : base;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
43
57
|
function exposeOf(options) {
|
|
44
58
|
const { expose } = options;
|
|
45
59
|
const rule = expose === undefined
|
|
@@ -67,6 +81,10 @@ export function hostPolicy(options = {}) {
|
|
|
67
81
|
interceptors,
|
|
68
82
|
token: options.token,
|
|
69
83
|
browser: options.browser ?? {},
|
|
84
|
+
capabilityOf: capabilityOfOptions(options),
|
|
85
|
+
clearanceOrder: options.clearanceOrder,
|
|
86
|
+
resources: options.resources,
|
|
87
|
+
admitItem: options.admitItem,
|
|
70
88
|
};
|
|
71
89
|
}
|
|
72
90
|
/** The options of a `ProcedureServer` that serves a registry under a policy. */
|
|
@@ -77,6 +95,10 @@ export function procedureServerOptions(policy, registry) {
|
|
|
77
95
|
...(policy.expose ? { expose: policy.expose } : {}),
|
|
78
96
|
strictCalls: policy.strictCalls,
|
|
79
97
|
...(policy.interceptors.length > 0 ? { interceptors: policy.interceptors } : {}),
|
|
98
|
+
...(policy.capabilityOf ? { capability: policy.capabilityOf } : {}),
|
|
99
|
+
...(policy.clearanceOrder ? { clearanceOrder: policy.clearanceOrder } : {}),
|
|
100
|
+
...(policy.resources ? { resources: policy.resources } : {}),
|
|
101
|
+
...(policy.admitItem ? { admitItem: policy.admitItem } : {}),
|
|
80
102
|
};
|
|
81
103
|
}
|
|
82
104
|
//# sourceMappingURL=host-policy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-policy.js","sourceRoot":"","sources":["../../src/server/host-policy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"host-policy.js","sourceRoot":"","sources":["../../src/server/host-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,10 +5,11 @@
|
|
|
5
5
|
* Integrates with ProcedureRegistry and CollectionStorage backends.
|
|
6
6
|
*/
|
|
7
7
|
import { Server, type ServerOptions } from "./server.js";
|
|
8
|
-
import type { Method, ServerHandler, ServerResponse } from "./types.js";
|
|
8
|
+
import type { Method, ServerHandler, ServerRequest, ServerResponse } from "./types.js";
|
|
9
9
|
import type { AnyProcedure, ProcedurePath, RepositoryProvider, ProcedureModule } from "../procedures/types.js";
|
|
10
10
|
import { ProcedureRegistry } from "../procedures/registry.js";
|
|
11
|
-
import { type Interceptor } from "../procedures/invoke.js";
|
|
11
|
+
import { type Interceptor, type Invocation } from "../procedures/invoke.js";
|
|
12
|
+
import type { Capability, ClearanceOrder, ResourcesOf } from "../procedures/types.js";
|
|
12
13
|
import type { CollectionStorage } from "../procedures/collection/storage.js";
|
|
13
14
|
/**
|
|
14
15
|
* Storage configuration for a collection.
|
|
@@ -48,6 +49,17 @@ export interface ProcedureServerOptions extends ServerOptions {
|
|
|
48
49
|
* tracing, timeouts, metrics (see `procedures/interceptors.ts`).
|
|
49
50
|
*/
|
|
50
51
|
interceptors?: readonly Interceptor[] | undefined;
|
|
52
|
+
/**
|
|
53
|
+
* The capability of each request (CAPABILITIES-2026-10): one value, or a function of the
|
|
54
|
+
* request. The function reads only what the transport authenticated. Without it: no limits.
|
|
55
|
+
*/
|
|
56
|
+
capability?: Capability | ((request: ServerRequest<unknown>) => Capability | undefined) | undefined;
|
|
57
|
+
/** The order of the clearance values. */
|
|
58
|
+
clearanceOrder?: ClearanceOrder | undefined;
|
|
59
|
+
/** The resources of each invocation for its capability (`ctx.resources`). */
|
|
60
|
+
resources?: ((invocation: Invocation) => ResourcesOf) | undefined;
|
|
61
|
+
/** The filter of the output that leaves the server. */
|
|
62
|
+
admitItem?: ((item: unknown, invocation: Invocation) => boolean) | undefined;
|
|
51
63
|
}
|
|
52
64
|
/**
|
|
53
65
|
* The error response of a failed invocation. An invocation error keeps its code
|
|
@@ -96,6 +108,8 @@ export declare class ProcedureServer extends Server implements RepositoryProvide
|
|
|
96
108
|
private readonly expose;
|
|
97
109
|
private readonly strictCalls;
|
|
98
110
|
private readonly interceptors;
|
|
111
|
+
/** The capability options of the requests (CAPABILITIES-2026-10). */
|
|
112
|
+
private readonly capabilityOptions;
|
|
99
113
|
constructor(options?: ProcedureServerOptions);
|
|
100
114
|
/**
|
|
101
115
|
* Get storage for a collection.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"procedure-server.d.ts","sourceRoot":"","sources":["../../src/server/procedure-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"procedure-server.d.ts","sourceRoot":"","sources":["../../src/server/procedure-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,14 @@ import { pathToKey } from "../procedures/types.js";
|
|
|
10
10
|
import { ProcedureRegistry, PROCEDURE_REGISTRY } from "../procedures/registry.js";
|
|
11
11
|
import { createCollectionProcedures } from "../procedures/collection/procedures.js";
|
|
12
12
|
import { InvocationError, invokeProcedure } from "../procedures/invoke.js";
|
|
13
|
+
import { TIMEOUT_METADATA_KEY, narrowCapability } from "../procedures/capability.js";
|
|
14
|
+
/** The capability of a request with the remaining time of its caller, when it sends one. */
|
|
15
|
+
function withRequestTimeout(capability, request, order) {
|
|
16
|
+
const timeoutMs = request.metadata[TIMEOUT_METADATA_KEY];
|
|
17
|
+
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs < 0)
|
|
18
|
+
return capability;
|
|
19
|
+
return narrowCapability(capability, { timeoutMs }, order);
|
|
20
|
+
}
|
|
13
21
|
/**
|
|
14
22
|
* The error response of a failed invocation. An invocation error keeps its code
|
|
15
23
|
* (VALIDATION_ERROR, NOT_EXPOSED, ABORTED and so on). An error of the handler is HANDLER_ERROR.
|
|
@@ -18,6 +26,8 @@ export function errorResponse(id, error) {
|
|
|
18
26
|
// An error that says it is retryable stays retryable: before, every error lost the flag
|
|
19
27
|
// (deep dive TRN-7)
|
|
20
28
|
const retryable = error?.retryable;
|
|
29
|
+
// A refusal of the capability says why (CAPABILITIES-2026-10)
|
|
30
|
+
const reason = error instanceof InvocationError ? error.reason : undefined;
|
|
21
31
|
return {
|
|
22
32
|
id,
|
|
23
33
|
status: {
|
|
@@ -26,7 +36,7 @@ export function errorResponse(id, error) {
|
|
|
26
36
|
message: error instanceof Error ? error.message : String(error),
|
|
27
37
|
retryable: typeof retryable === "boolean" ? retryable : false,
|
|
28
38
|
},
|
|
29
|
-
metadata: {},
|
|
39
|
+
metadata: reason ? { reason } : {},
|
|
30
40
|
};
|
|
31
41
|
}
|
|
32
42
|
// =============================================================================
|
|
@@ -74,12 +84,20 @@ export class ProcedureServer extends Server {
|
|
|
74
84
|
expose;
|
|
75
85
|
strictCalls;
|
|
76
86
|
interceptors;
|
|
87
|
+
/** The capability options of the requests (CAPABILITIES-2026-10). */
|
|
88
|
+
capabilityOptions;
|
|
77
89
|
constructor(options = {}) {
|
|
78
90
|
super(options);
|
|
79
91
|
this.procedureRegistry = options.registry ?? PROCEDURE_REGISTRY;
|
|
80
92
|
this.expose = options.expose;
|
|
81
93
|
this.strictCalls = options.strictCalls ?? false;
|
|
82
94
|
this.interceptors = options.interceptors ?? [];
|
|
95
|
+
this.capabilityOptions = {
|
|
96
|
+
capability: options.capability,
|
|
97
|
+
clearanceOrder: options.clearanceOrder,
|
|
98
|
+
resources: options.resources,
|
|
99
|
+
admitItem: options.admitItem,
|
|
100
|
+
};
|
|
83
101
|
// Configure collections
|
|
84
102
|
if (options.collections) {
|
|
85
103
|
for (const [name, storage] of Object.entries(options.collections)) {
|
|
@@ -223,6 +241,7 @@ export class ProcedureServer extends Server {
|
|
|
223
241
|
try {
|
|
224
242
|
// One invocation path for every host (ARCHITECTURE-PROPOSALS P1): input validation, the
|
|
225
243
|
// context, the expose rule for nested calls (BUGS-2026-07 H18) and output validation
|
|
244
|
+
const { capability, clearanceOrder, resources, admitItem } = this.capabilityOptions;
|
|
226
245
|
const output = await invokeProcedure(procedure, request.payload, {
|
|
227
246
|
registry: this.procedureRegistry,
|
|
228
247
|
metadata: request.metadata,
|
|
@@ -231,6 +250,12 @@ export class ProcedureServer extends Server {
|
|
|
231
250
|
expose: this.expose,
|
|
232
251
|
strictCalls: this.strictCalls,
|
|
233
252
|
interceptors: this.interceptors,
|
|
253
|
+
// The capability comes from the server, never from the request. The remaining time of
|
|
254
|
+
// the caller can only make the deadline earlier (CAPABILITIES-2026-10, decision 9).
|
|
255
|
+
capability: withRequestTimeout(typeof capability === "function" ? capability(request) : capability, request, clearanceOrder),
|
|
256
|
+
clearanceOrder,
|
|
257
|
+
resources,
|
|
258
|
+
admitItem,
|
|
234
259
|
});
|
|
235
260
|
if (output.kind === "stream") {
|
|
236
261
|
return { id: request.id, status: { type: "success", code: 200 }, stream: output.items, metadata: {} };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"procedure-server.js","sourceRoot":"","sources":["../../src/server/procedure-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOzD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EAAE,0BAA0B,EAAE,MAAM,wCAAwC,CAAC;AACpF,OAAO,EAAE,eAAe,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"procedure-server.js","sourceRoot":"","sources":["../../src/server/procedure-server.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package",
|
|
3
3
|
"name": "@procedures/client",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"description": "Procedures as data for TypeScript: define typed procedures once and call them in process, over HTTP, WebSocket, the CLI or MCP. Streaming, middleware, retries, caching and a JSON program format.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"rpc",
|
|
@@ -43,6 +43,10 @@
|
|
|
43
43
|
"types": "./dist/browser.d.ts",
|
|
44
44
|
"import": "./dist/browser.js"
|
|
45
45
|
},
|
|
46
|
+
"./register": {
|
|
47
|
+
"types": "./dist/register.d.ts",
|
|
48
|
+
"import": "./dist/register.js"
|
|
49
|
+
},
|
|
46
50
|
"./client": {
|
|
47
51
|
"types": "./dist/client/index.d.ts",
|
|
48
52
|
"import": "./dist/client/index.js"
|
|
@@ -76,9 +80,7 @@
|
|
|
76
80
|
"CHANGELOG.md"
|
|
77
81
|
],
|
|
78
82
|
"sideEffects": [
|
|
79
|
-
"./dist/
|
|
80
|
-
"./dist/browser.js",
|
|
81
|
-
"./dist/procedures/index.js"
|
|
83
|
+
"./dist/register.js"
|
|
82
84
|
],
|
|
83
85
|
"engines": {
|
|
84
86
|
"node": ">=22"
|
package/src/browser.ts
CHANGED
|
@@ -119,6 +119,7 @@ export {
|
|
|
119
119
|
moduleClosure,
|
|
120
120
|
registerModules,
|
|
121
121
|
createRegistry,
|
|
122
|
+
registerClientProcedures,
|
|
122
123
|
// Procedure reference system (procedure-as-data)
|
|
123
124
|
PROCEDURE_SYMBOL,
|
|
124
125
|
PROCEDURE_JSON_KEY,
|
|
@@ -202,6 +203,15 @@ export {
|
|
|
202
203
|
} from "./procedures/index.js";
|
|
203
204
|
|
|
204
205
|
export type {
|
|
206
|
+
Effects,
|
|
207
|
+
PermittedEffects,
|
|
208
|
+
Register,
|
|
209
|
+
ClearanceOf,
|
|
210
|
+
ResourcesOf,
|
|
211
|
+
Capability,
|
|
212
|
+
CapabilityRequest,
|
|
213
|
+
ClearanceOrder,
|
|
214
|
+
NestedCallOptions,
|
|
205
215
|
Procedure,
|
|
206
216
|
AnyProcedure,
|
|
207
217
|
ProcedurePath,
|
|
@@ -267,6 +277,24 @@ export type {
|
|
|
267
277
|
Interceptor,
|
|
268
278
|
} from "./procedures/invoke.js";
|
|
269
279
|
export { callMatches, validateCalls, declaredCalls, nestedCallRefusal, hasCallPolicy, hiddenReach } from "./procedures/policy.js";
|
|
280
|
+
// Capabilities (CAPABILITIES-2026-10)
|
|
281
|
+
export {
|
|
282
|
+
STANDARD_RESOURCES,
|
|
283
|
+
UNLIMITED_CAPABILITY,
|
|
284
|
+
ladder,
|
|
285
|
+
effectsOf,
|
|
286
|
+
isReadOnly,
|
|
287
|
+
isDestructive,
|
|
288
|
+
isOpenWorld,
|
|
289
|
+
toolHints,
|
|
290
|
+
narrowCapability,
|
|
291
|
+
capabilityRefusal,
|
|
292
|
+
examinesNestedCall,
|
|
293
|
+
explainInvocation,
|
|
294
|
+
checkEffects,
|
|
295
|
+
} from "./procedures/capability.js";
|
|
296
|
+
export { PURE_EFFECTS, REGISTRY_READ_EFFECTS, withEffects } from "./procedures/effects.js";
|
|
297
|
+
export type { ToolHints, CapabilityRefusal, CapabilityRefusalReason, InvocationExplanation, EffectsViolation } from "./procedures/capability.js";
|
|
270
298
|
export type { CallPolicy, CallRefusal, HiddenCall } from "./procedures/policy.js";
|
|
271
299
|
export { timeoutInterceptor, tracingInterceptor, metricsInterceptor } from "./procedures/interceptors.js";
|
|
272
300
|
export type {
|
package/src/client/client.ts
CHANGED
|
@@ -56,6 +56,8 @@ import { RouteResolver, type ResolvedRoute, type RouteResolutionResult } from ".
|
|
|
56
56
|
import { BatchExecutor, type ExecutionContext } from "./batch-executor.js";
|
|
57
57
|
import type { ProcedureRegistry } from "../procedures/registry.js";
|
|
58
58
|
import type { EventBus } from "../events/types.js";
|
|
59
|
+
import { TIMEOUT_METADATA_KEY, narrowCapability } from "../procedures/capability.js";
|
|
60
|
+
import type { Capability, ClearanceOrder, NestedCallOptions } from "../procedures/types.js";
|
|
59
61
|
import { PROCEDURE_REGISTRY } from "../procedures/registry.js";
|
|
60
62
|
import { validateSchema } from "../procedures/schema.js";
|
|
61
63
|
import type { AnyProcedure, ProcedureClient, ProcedurePath } from "../procedures/types.js";
|
|
@@ -139,6 +141,8 @@ interface CallerContext {
|
|
|
139
141
|
parent?: Invocation | undefined;
|
|
140
142
|
/** The hydration observer of the program (`exec(ref, input, { onRef })`). */
|
|
141
143
|
onRef?: ((event: HydrationEvent) => void) | undefined;
|
|
144
|
+
/** The capability of the caller: the nested calls get it, or a narrower one. */
|
|
145
|
+
capability?: Capability | undefined;
|
|
142
146
|
}
|
|
143
147
|
|
|
144
148
|
/** The options of `exec()` and `execStream()`. */
|
|
@@ -205,6 +209,10 @@ export class Client<TContext = {}> {
|
|
|
205
209
|
private bus: EventBus | undefined;
|
|
206
210
|
/** The interceptors of the local invocations (roadmap 1.2) */
|
|
207
211
|
private interceptors: readonly Interceptor[] = [];
|
|
212
|
+
/** The capability of the local invocations (CAPABILITIES-2026-10). Undefined: no limits. */
|
|
213
|
+
private capability: Capability | undefined;
|
|
214
|
+
/** The order of the clearance values. */
|
|
215
|
+
private clearanceOrder: ClearanceOrder | undefined;
|
|
208
216
|
|
|
209
217
|
/**
|
|
210
218
|
* Context values set via withContext().
|
|
@@ -234,6 +242,8 @@ export class Client<TContext = {}> {
|
|
|
234
242
|
this.throwOnError = opts.throwOnError !== false;
|
|
235
243
|
this.bus = opts.bus;
|
|
236
244
|
this.interceptors = opts.interceptors ?? [];
|
|
245
|
+
this.capability = opts.capability;
|
|
246
|
+
this.clearanceOrder = opts.clearanceOrder;
|
|
237
247
|
}
|
|
238
248
|
|
|
239
249
|
// Initialize empty context (child clients override this)
|
|
@@ -257,6 +267,8 @@ export class Client<TContext = {}> {
|
|
|
257
267
|
(child as any).throwOnError = parent.throwOnError;
|
|
258
268
|
(child as any).bus = parent.bus;
|
|
259
269
|
(child as any).interceptors = parent.interceptors;
|
|
270
|
+
(child as any).capability = parent.capability;
|
|
271
|
+
(child as any).clearanceOrder = parent.clearanceOrder;
|
|
260
272
|
|
|
261
273
|
// Object.create() bypasses class-field initializers, so procedureRegistry (which normally
|
|
262
274
|
// defaults to PROCEDURE_REGISTRY via a field initializer) would be undefined on the child
|
|
@@ -553,15 +565,21 @@ export class Client<TContext = {}> {
|
|
|
553
565
|
// The nested calls get the metadata and the signal of the invocation (an interceptor can
|
|
554
566
|
// change them), and name it as their parent
|
|
555
567
|
const client = (invocation: Invocation): ProcedureClient => {
|
|
556
|
-
|
|
568
|
+
// The nested calls get the capability of the invocation, or a narrower one on request
|
|
569
|
+
const nested = (options?: NestedCallOptions): CallerContext => ({
|
|
557
570
|
metadata: invocation.metadata,
|
|
558
571
|
signal: invocation.signal,
|
|
559
572
|
parent: invocation,
|
|
560
573
|
onRef: caller.onRef,
|
|
561
|
-
|
|
574
|
+
capability: options?.narrow
|
|
575
|
+
? narrowCapability(invocation.capability, options.narrow, self.clearanceOrder)
|
|
576
|
+
: invocation.capability,
|
|
577
|
+
});
|
|
562
578
|
return {
|
|
563
|
-
call: <TInput, TOutput>(path: ProcedurePath, input: TInput
|
|
564
|
-
|
|
579
|
+
call: <TInput, TOutput>(path: ProcedurePath, input: TInput, options?: NestedCallOptions) =>
|
|
580
|
+
self.execInternal<TOutput>(path, input, nested(options)),
|
|
581
|
+
stream: <TInput, TOutput>(path: ProcedurePath, input: TInput, options?: NestedCallOptions) =>
|
|
582
|
+
self.execStreamInternal<TOutput>(path, input, nested(options)),
|
|
565
583
|
};
|
|
566
584
|
};
|
|
567
585
|
return {
|
|
@@ -573,12 +591,21 @@ export class Client<TContext = {}> {
|
|
|
573
591
|
interceptors: this.interceptors,
|
|
574
592
|
parent: caller.parent,
|
|
575
593
|
onRef: caller.onRef,
|
|
594
|
+
capability: caller.capability ?? this.capability,
|
|
595
|
+
clearanceOrder: this.clearanceOrder,
|
|
576
596
|
};
|
|
577
597
|
}
|
|
578
598
|
|
|
579
|
-
/**
|
|
599
|
+
/**
|
|
600
|
+
* The call options of a remote call for a caller: its metadata as context, and its signal. A
|
|
601
|
+
* deadline goes as the remaining time (`procedure-timeout`, in milliseconds): the server
|
|
602
|
+
* calculates its own deadline, so a difference between two clocks has no effect.
|
|
603
|
+
*/
|
|
580
604
|
private remoteCallOptions(caller: CallerContext): CallOptions<TContext> {
|
|
581
|
-
const
|
|
605
|
+
const deadline = (caller.capability ?? this.capability)?.deadline;
|
|
606
|
+
const metadata =
|
|
607
|
+
deadline === undefined ? caller.metadata ?? {} : { ...caller.metadata, [TIMEOUT_METADATA_KEY]: Math.max(0, deadline - Date.now()) };
|
|
608
|
+
const options: CallOptions<TContext> = { context: metadata as ClientContextInput<TContext> };
|
|
582
609
|
if (caller.signal) {
|
|
583
610
|
options.signal = caller.signal;
|
|
584
611
|
}
|
package/src/client/types.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* These types work across HTTP, gRPC, WebSocket, and local transports.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import type { Capability, ClearanceOrder } from "../procedures/types.js";
|
|
8
9
|
import type { EventBus } from "../events/types.js";
|
|
9
10
|
import type { Interceptor } from "../procedures/invoke.js";
|
|
10
11
|
import type { ErrorMetadata } from "./errors/index.js";
|
|
@@ -358,4 +359,14 @@ export interface ClientOptions {
|
|
|
358
359
|
* `procedures/interceptors.ts`). A remote call goes through the middlewares, not these.
|
|
359
360
|
*/
|
|
360
361
|
interceptors?: readonly Interceptor[];
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* The capability of the local invocations of this client and of their nested calls
|
|
365
|
+
* (CAPABILITIES-2026-10). Without it: no limits. A page that runs programs of its visitors
|
|
366
|
+
* gives a read-only one.
|
|
367
|
+
*/
|
|
368
|
+
capability?: Capability;
|
|
369
|
+
|
|
370
|
+
/** The order of the clearance values of the capability. */
|
|
371
|
+
clearanceOrder?: ClearanceOrder;
|
|
361
372
|
}
|