@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
|
@@ -17,7 +17,9 @@ import type {
|
|
|
17
17
|
import { pathToKey } from "../procedures/types.js";
|
|
18
18
|
import { ProcedureRegistry, PROCEDURE_REGISTRY } from "../procedures/registry.js";
|
|
19
19
|
import { createCollectionProcedures } from "../procedures/collection/procedures.js";
|
|
20
|
-
import { InvocationError, invokeProcedure, type Interceptor } from "../procedures/invoke.js";
|
|
20
|
+
import { InvocationError, invokeProcedure, type Interceptor, type Invocation } from "../procedures/invoke.js";
|
|
21
|
+
import type { Capability, ClearanceOrder, ResourcesOf } from "../procedures/types.js";
|
|
22
|
+
import { TIMEOUT_METADATA_KEY, narrowCapability } from "../procedures/capability.js";
|
|
21
23
|
import type { CollectionStorage } from "../procedures/collection/storage.js";
|
|
22
24
|
|
|
23
25
|
// =============================================================================
|
|
@@ -68,6 +70,29 @@ export interface ProcedureServerOptions extends ServerOptions {
|
|
|
68
70
|
* tracing, timeouts, metrics (see `procedures/interceptors.ts`).
|
|
69
71
|
*/
|
|
70
72
|
interceptors?: readonly Interceptor[] | undefined;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* The capability of each request (CAPABILITIES-2026-10): one value, or a function of the
|
|
76
|
+
* request. The function reads only what the transport authenticated. Without it: no limits.
|
|
77
|
+
*/
|
|
78
|
+
capability?: Capability | ((request: ServerRequest<unknown>) => Capability | undefined) | undefined;
|
|
79
|
+
/** The order of the clearance values. */
|
|
80
|
+
clearanceOrder?: ClearanceOrder | undefined;
|
|
81
|
+
/** The resources of each invocation for its capability (`ctx.resources`). */
|
|
82
|
+
resources?: ((invocation: Invocation) => ResourcesOf) | undefined;
|
|
83
|
+
/** The filter of the output that leaves the server. */
|
|
84
|
+
admitItem?: ((item: unknown, invocation: Invocation) => boolean) | undefined;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** The capability of a request with the remaining time of its caller, when it sends one. */
|
|
88
|
+
function withRequestTimeout(
|
|
89
|
+
capability: Capability | undefined,
|
|
90
|
+
request: ServerRequest<unknown>,
|
|
91
|
+
order: ClearanceOrder | undefined
|
|
92
|
+
): Capability | undefined {
|
|
93
|
+
const timeoutMs = request.metadata[TIMEOUT_METADATA_KEY];
|
|
94
|
+
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs) || timeoutMs < 0) return capability;
|
|
95
|
+
return narrowCapability(capability, { timeoutMs }, order);
|
|
71
96
|
}
|
|
72
97
|
|
|
73
98
|
/**
|
|
@@ -78,6 +103,8 @@ export function errorResponse(id: string, error: unknown): ServerResponse<unknow
|
|
|
78
103
|
// An error that says it is retryable stays retryable: before, every error lost the flag
|
|
79
104
|
// (deep dive TRN-7)
|
|
80
105
|
const retryable = (error as { retryable?: unknown } | undefined)?.retryable;
|
|
106
|
+
// A refusal of the capability says why (CAPABILITIES-2026-10)
|
|
107
|
+
const reason = error instanceof InvocationError ? error.reason : undefined;
|
|
81
108
|
return {
|
|
82
109
|
id,
|
|
83
110
|
status: {
|
|
@@ -86,7 +113,7 @@ export function errorResponse(id: string, error: unknown): ServerResponse<unknow
|
|
|
86
113
|
message: error instanceof Error ? error.message : String(error),
|
|
87
114
|
retryable: typeof retryable === "boolean" ? retryable : false,
|
|
88
115
|
},
|
|
89
|
-
metadata: {},
|
|
116
|
+
metadata: reason ? { reason } : {},
|
|
90
117
|
};
|
|
91
118
|
}
|
|
92
119
|
|
|
@@ -136,6 +163,8 @@ export class ProcedureServer extends Server implements RepositoryProvider {
|
|
|
136
163
|
private readonly expose: ((path: ProcedurePath) => boolean) | undefined;
|
|
137
164
|
private readonly strictCalls: boolean;
|
|
138
165
|
private readonly interceptors: readonly Interceptor[];
|
|
166
|
+
/** The capability options of the requests (CAPABILITIES-2026-10). */
|
|
167
|
+
private readonly capabilityOptions: Pick<ProcedureServerOptions, "capability" | "clearanceOrder" | "resources" | "admitItem">;
|
|
139
168
|
|
|
140
169
|
constructor(options: ProcedureServerOptions = {}) {
|
|
141
170
|
super(options);
|
|
@@ -144,6 +173,12 @@ export class ProcedureServer extends Server implements RepositoryProvider {
|
|
|
144
173
|
this.expose = options.expose;
|
|
145
174
|
this.strictCalls = options.strictCalls ?? false;
|
|
146
175
|
this.interceptors = options.interceptors ?? [];
|
|
176
|
+
this.capabilityOptions = {
|
|
177
|
+
capability: options.capability,
|
|
178
|
+
clearanceOrder: options.clearanceOrder,
|
|
179
|
+
resources: options.resources,
|
|
180
|
+
admitItem: options.admitItem,
|
|
181
|
+
};
|
|
147
182
|
|
|
148
183
|
// Configure collections
|
|
149
184
|
if (options.collections) {
|
|
@@ -303,6 +338,7 @@ export class ProcedureServer extends Server implements RepositoryProvider {
|
|
|
303
338
|
try {
|
|
304
339
|
// One invocation path for every host (ARCHITECTURE-PROPOSALS P1): input validation, the
|
|
305
340
|
// context, the expose rule for nested calls (BUGS-2026-07 H18) and output validation
|
|
341
|
+
const { capability, clearanceOrder, resources, admitItem } = this.capabilityOptions;
|
|
306
342
|
const output = await invokeProcedure(procedure, request.payload, {
|
|
307
343
|
registry: this.procedureRegistry,
|
|
308
344
|
metadata: request.metadata,
|
|
@@ -311,6 +347,12 @@ export class ProcedureServer extends Server implements RepositoryProvider {
|
|
|
311
347
|
expose: this.expose,
|
|
312
348
|
strictCalls: this.strictCalls,
|
|
313
349
|
interceptors: this.interceptors,
|
|
350
|
+
// The capability comes from the server, never from the request. The remaining time of
|
|
351
|
+
// the caller can only make the deadline earlier (CAPABILITIES-2026-10, decision 9).
|
|
352
|
+
capability: withRequestTimeout(typeof capability === "function" ? capability(request) : capability, request, clearanceOrder),
|
|
353
|
+
clearanceOrder,
|
|
354
|
+
resources,
|
|
355
|
+
admitItem,
|
|
314
356
|
});
|
|
315
357
|
if (output.kind === "stream") {
|
|
316
358
|
return { id: request.id, status: { type: "success", code: 200 }, stream: output.items, metadata: {} };
|