@zudojs/api 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,10 +9,12 @@
9
9
  export declare const DEFAULT_OPERATION_TIMEOUT = 30000;
10
10
  /**
11
11
  * Maximum number of interceptors allowed in a pipeline.
12
+ * Enforced by the APIExecutor constructor.
12
13
  */
13
14
  export declare const MAX_INTERCEPTORS = 32;
14
15
  /**
15
16
  * Maximum number of policies allowed on a single operation.
17
+ * Reserved for the policy system — not yet enforced.
16
18
  */
17
19
  export declare const MAX_POLICIES = 16;
18
20
  //# sourceMappingURL=constants.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/api/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;GAEG;AACH,eAAO,MAAM,YAAY,KAAK,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/api/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAEhD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAEnC;;;GAGG;AACH,eAAO,MAAM,YAAY,KAAK,CAAC"}
@@ -9,10 +9,12 @@
9
9
  export const DEFAULT_OPERATION_TIMEOUT = 30_000;
10
10
  /**
11
11
  * Maximum number of interceptors allowed in a pipeline.
12
+ * Enforced by the APIExecutor constructor.
12
13
  */
13
14
  export const MAX_INTERCEPTORS = 32;
14
15
  /**
15
16
  * Maximum number of policies allowed on a single operation.
17
+ * Reserved for the policy system — not yet enforced.
16
18
  */
17
19
  export const MAX_POLICIES = 16;
18
20
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/api/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/api/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"context.type.d.ts","sourceRoot":"","sources":["../../../src/api/context/context.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B;;;;GAIG;AACH,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,OAAO;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAE9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAE7C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAE9C,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAG,OAAO,EAC/C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,UAAU,CAAC,MAAM,CAAC,CAqBpB;AAED,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,CAAC"}
1
+ {"version":3,"file":"context.type.d.ts","sourceRoot":"","sources":["../../../src/api/context/context.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,sBAAsB,CAAC;AAE9B;;;;GAIG;AACH,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,OAAO;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAE9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;IAE7C,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAE9C,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,GAAG,OAAO,EAC/C,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,WAAW,GACnB,UAAU,CAAC,MAAM,CAAC,CAsBpB;AAED,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,CAAC"}
@@ -15,8 +15,9 @@ export function createAPIContext(requestId, state, signal) {
15
15
  set(key, value) {
16
16
  metadata.set(key.name, value);
17
17
  },
18
+ // Live read-only view of the internal map (no per-access copy).
18
19
  get metadata() {
19
- return new Map(metadata);
20
+ return metadata;
20
21
  },
21
22
  };
22
23
  return Object.freeze(context);
@@ -1 +1 @@
1
- {"version":3,"file":"context.type.js","sourceRoot":"","sources":["../../../src/api/context/context.type.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAqB9B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,KAAa,EACb,MAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE5C,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG;QACd,SAAS;QACT,MAAM;QACN,KAAK;QACL,GAAG,CAAI,GAAqB;YAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAkB,CAAC;QACjD,CAAC;QACD,GAAG,CAAI,GAAqB,EAAE,KAAQ;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,QAAQ;YACV,OAAO,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAuB,CAAC;AACtD,CAAC;AAID,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,CAAC"}
1
+ {"version":3,"file":"context.type.js","sourceRoot":"","sources":["../../../src/api/context/context.type.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAqB9B;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,KAAa,EACb,MAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE5C,QAAQ,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG;QACd,SAAS;QACT,MAAM;QACN,KAAK;QACL,GAAG,CAAI,GAAqB;YAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAkB,CAAC;QACjD,CAAC;QACD,GAAG,CAAI,GAAqB,EAAE,KAAQ;YACpC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,gEAAgE;QAChE,IAAI,QAAQ;YACV,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAuB,CAAC;AACtD,CAAC;AAID,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,GACjB,CAAC"}
@@ -2,21 +2,22 @@ import type { APIContext } from "../context/context.type.js";
2
2
  import type { APIResult } from "../result/apiResult.type.js";
3
3
  import type { APIOperation } from "../operation/operation.type.js";
4
4
  import type { APIInterceptor } from "../interceptors/interceptor.type.js";
5
+ import { APIError } from "../errors/index.js";
6
+ export type { APIExecutionContext } from "../interceptors/interceptor.type.js";
5
7
  /**
6
- * Execution context passed through the interceptor pipeline.
8
+ * Error normalizer for converting unknown errors into APIError instances.
9
+ *
10
+ * APIErrors pass through untouched. Other errors are wrapped in
11
+ * APIInternalError (`expose: false`), preserving the original message and
12
+ * error for logging via `cause` while keeping internals out of anything
13
+ * a transport would serialize to a client.
7
14
  */
8
- export interface APIExecutionContext<TInput = unknown, TOutput = unknown> {
9
- readonly operation: APIOperation<TInput, TOutput>;
10
- readonly input: TInput;
11
- readonly context: APIContext;
12
- readonly result?: APIResult<TOutput>;
13
- }
14
- /**
15
- * Error normalizer for converting unknown errors into Error instances.
16
- */
17
- export declare function normalizeAPIError(error: unknown, operationName?: string): Error;
15
+ export declare function normalizeAPIError(error: unknown, operationName?: string): APIError;
18
16
  /**
19
17
  * Executes an API operation through its interceptor pipeline.
18
+ *
19
+ * Enforces the operation timeout, honors the context AbortSignal, and
20
+ * validates input when the operation's `input` is a Standard Schema.
20
21
  */
21
22
  export declare class APIExecutor {
22
23
  private readonly interceptors;
@@ -26,7 +27,15 @@ export declare class APIExecutor {
26
27
  */
27
28
  execute<TInput = unknown, TOutput = unknown>(operation: APIOperation<TInput, TOutput>, input: TInput, context: APIContext): Promise<APIResult<TOutput>>;
28
29
  /**
29
- * Runs the interceptor pipeline.
30
+ * Invokes the operation handler under its timeout and abort signal.
31
+ */
32
+ private invokeHandler;
33
+ /**
34
+ * Runs the interceptor pipeline (Koa-style dispatch).
35
+ *
36
+ * Each interceptor's `next()` may be awaited at most once; a second
37
+ * call rejects instead of silently re-executing the handler while
38
+ * bypassing downstream interceptors.
30
39
  */
31
40
  private runPipeline;
32
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"executor.core.d.ts","sourceRoot":"","sources":["../../../src/api/executor/executor.core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AAE1E;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACtE,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAE7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,KAAK,CAOP;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IAEzD,YAAY,YAAY,GAAE,SAAS,cAAc,EAAO,EAEvD;IAED;;OAEG;IACG,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC/C,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAoB7B;IAED;;OAEG;YACW,WAAW;CAyB1B"}
1
+ {"version":3,"file":"executor.core.d.ts","sourceRoot":"","sources":["../../../src/api/executor/executor.core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACL,QAAQ,EAMT,MAAM,oBAAoB,CAAC;AAI5B,YAAY,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAE/E;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,EACd,aAAa,CAAC,EAAE,MAAM,GACrB,QAAQ,CAgBV;AAqCD;;;;;GAKG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4B;IAEzD,YAAY,YAAY,GAAE,SAAS,cAAc,EAAO,EAOvD;IAED;;OAEG;IACG,OAAO,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC/C,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,EACxC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CA+C7B;IAED;;OAEG;YACW,aAAa;IA2B3B;;;;;;OAMG;IACH,OAAO,CAAC,WAAW;CAyBpB"}
@@ -1,62 +1,174 @@
1
+ import { APIError, APIInternalError, APITimeoutError, APIValidationError, createAPIError, isAPIError, } from "../errors/index.js";
2
+ import { DEFAULT_OPERATION_TIMEOUT, MAX_INTERCEPTORS } from "../constants.js";
1
3
  /**
2
- * Error normalizer for converting unknown errors into Error instances.
4
+ * Error normalizer for converting unknown errors into APIError instances.
5
+ *
6
+ * APIErrors pass through untouched. Other errors are wrapped in
7
+ * APIInternalError (`expose: false`), preserving the original message and
8
+ * error for logging via `cause` while keeping internals out of anything
9
+ * a transport would serialize to a client.
3
10
  */
4
11
  export function normalizeAPIError(error, operationName) {
5
- if (error instanceof Error) {
12
+ if (isAPIError(error)) {
6
13
  return error;
7
14
  }
8
- return new Error(`Unexpected non-error thrown in operation "${operationName}": ${String(error)}`);
15
+ if (error instanceof Error) {
16
+ const wrapped = new APIInternalError(error.message);
17
+ // The published @zudojs/errors 0.1.0 constructor doesn't accept
18
+ // `cause`; the field is a plain writable property on BaseError.
19
+ // Switch to `new APIInternalError(msg, { cause })` once this package
20
+ // depends on the next @zudojs/errors release.
21
+ wrapped.cause = error;
22
+ return wrapped;
23
+ }
24
+ return new APIInternalError(`Unexpected non-error thrown in operation "${operationName}": ${String(error)}`);
25
+ }
26
+ function isStandardSchema(value) {
27
+ return (typeof value === "object" &&
28
+ value !== null &&
29
+ typeof value["~standard"]
30
+ ?.validate === "function");
9
31
  }
10
32
  /**
11
33
  * Executes an API operation through its interceptor pipeline.
34
+ *
35
+ * Enforces the operation timeout, honors the context AbortSignal, and
36
+ * validates input when the operation's `input` is a Standard Schema.
12
37
  */
13
38
  export class APIExecutor {
14
39
  interceptors;
15
40
  constructor(interceptors = []) {
41
+ if (interceptors.length > MAX_INTERCEPTORS) {
42
+ throw new RangeError(`Interceptor pipeline exceeds MAX_INTERCEPTORS (${MAX_INTERCEPTORS}).`);
43
+ }
16
44
  this.interceptors = Object.freeze([...interceptors]);
17
45
  }
18
46
  /**
19
47
  * Executes an operation with the given input and context.
20
48
  */
21
49
  async execute(operation, input, context) {
22
- const executionContext = {
23
- operation,
24
- input,
25
- context,
26
- };
27
- const executeNext = async () => {
50
+ if (context.signal?.aborted) {
51
+ return { ok: false, error: abortedError(operation.name) };
52
+ }
53
+ let effectiveInput = input;
54
+ if (isStandardSchema(operation.input)) {
28
55
  try {
29
- const output = await operation.handler(input, context);
30
- return { ok: true, data: output };
56
+ const validation = await operation.input["~standard"].validate(input);
57
+ if (validation.issues) {
58
+ return {
59
+ ok: false,
60
+ error: new APIValidationError(`Invalid input for operation "${operation.name}".`, validation.issues.map((issue) => issue.message)),
61
+ };
62
+ }
63
+ effectiveInput = validation.value;
31
64
  }
32
65
  catch (error) {
33
- return {
34
- ok: false,
35
- error: normalizeAPIError(error, operation.name),
36
- };
66
+ return { ok: false, error: normalizeAPIError(error, operation.name) };
37
67
  }
68
+ }
69
+ const executionContext = {
70
+ operation,
71
+ input: effectiveInput,
72
+ context,
73
+ };
74
+ const executeHandler = async () => {
75
+ const result = await this.invokeHandler(operation, effectiveInput, context);
76
+ executionContext.result = result;
77
+ return result;
38
78
  };
39
- return this.runPipeline(executionContext, executeNext);
79
+ try {
80
+ const result = await this.runPipeline(executionContext, executeHandler);
81
+ executionContext.result = result;
82
+ return result;
83
+ }
84
+ catch (error) {
85
+ return { ok: false, error: normalizeAPIError(error, operation.name) };
86
+ }
40
87
  }
41
88
  /**
42
- * Runs the interceptor pipeline.
89
+ * Invokes the operation handler under its timeout and abort signal.
43
90
  */
44
- async runPipeline(context, next) {
91
+ async invokeHandler(operation, input, context) {
92
+ if (context.signal?.aborted) {
93
+ return { ok: false, error: abortedError(operation.name) };
94
+ }
95
+ const timeoutMs = operation.timeout ??
96
+ operation.metadata?.timeout ??
97
+ DEFAULT_OPERATION_TIMEOUT;
98
+ try {
99
+ const output = await withDeadline(operation.handler(input, context), timeoutMs, operation.name, context.signal);
100
+ return { ok: true, data: output };
101
+ }
102
+ catch (error) {
103
+ return { ok: false, error: normalizeAPIError(error, operation.name) };
104
+ }
105
+ }
106
+ /**
107
+ * Runs the interceptor pipeline (Koa-style dispatch).
108
+ *
109
+ * Each interceptor's `next()` may be awaited at most once; a second
110
+ * call rejects instead of silently re-executing the handler while
111
+ * bypassing downstream interceptors.
112
+ */
113
+ runPipeline(context, terminal) {
45
114
  const interceptors = this.interceptors;
46
- let index = 0;
47
- const runNext = async () => {
115
+ let lastDispatched = -1;
116
+ const dispatch = async (index) => {
117
+ if (index <= lastDispatched) {
118
+ throw new APIInternalError("next() called multiple times in interceptor pipeline.");
119
+ }
120
+ lastDispatched = index;
48
121
  if (index >= interceptors.length) {
49
- return next();
122
+ return terminal();
50
123
  }
51
124
  const interceptor = interceptors[index];
52
- index += 1;
53
- if (!interceptor) {
54
- return next();
55
- }
56
- return interceptor.intercept(context, runNext);
125
+ return interceptor.intercept(context, () => dispatch(index + 1));
57
126
  };
58
- const result = await runNext();
59
- return result;
127
+ return dispatch(0);
128
+ }
129
+ }
130
+ // ─── Internal helpers ─────────────────────────────────────────────────────
131
+ function abortedError(operationName) {
132
+ return createAPIError(`Operation "${operationName}" was aborted.`, {
133
+ statusCode: 499,
134
+ expose: true,
135
+ });
136
+ }
137
+ /**
138
+ * Awaits a handler promise, rejecting when the timeout elapses or the
139
+ * abort signal fires. The handler itself keeps running (promises are not
140
+ * cancellable), but the caller stops waiting and resources are released.
141
+ */
142
+ function withDeadline(promise, timeoutMs, operationName, signal) {
143
+ const useTimeout = Number.isFinite(timeoutMs) && timeoutMs > 0;
144
+ if (!useTimeout && !signal) {
145
+ return promise;
60
146
  }
147
+ return new Promise((resolve, reject) => {
148
+ let timer;
149
+ const cleanup = () => {
150
+ if (timer !== undefined)
151
+ clearTimeout(timer);
152
+ signal?.removeEventListener("abort", onAbort);
153
+ };
154
+ const onAbort = () => {
155
+ cleanup();
156
+ reject(abortedError(operationName));
157
+ };
158
+ if (useTimeout) {
159
+ timer = setTimeout(() => {
160
+ cleanup();
161
+ reject(new APITimeoutError(timeoutMs));
162
+ }, timeoutMs);
163
+ }
164
+ signal?.addEventListener("abort", onAbort, { once: true });
165
+ promise.then((value) => {
166
+ cleanup();
167
+ resolve(value);
168
+ }, (error) => {
169
+ cleanup();
170
+ reject(error);
171
+ });
172
+ });
61
173
  }
62
174
  //# sourceMappingURL=executor.core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"executor.core.js","sourceRoot":"","sources":["../../../src/api/executor/executor.core.ts"],"names":[],"mappings":"AAqBA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAAc,EACd,aAAsB;IAEtB,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,KAAK,CACd,6CAA6C,aAAa,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,CAChF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,WAAW;IACL,YAAY,CAA4B;IAEzD,YAAY,YAAY,GAA8B,EAAE;QACtD,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC;IACvD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO,CACX,SAAwC,EACxC,KAAa,EACb,OAAmB;QAEnB,MAAM,gBAAgB,GAAyC;YAC7D,SAAS;YACT,KAAK;YACL,OAAO;SACR,CAAC;QAEF,MAAM,WAAW,GAAG,KAAK,IAAiC,EAAE;YAC1D,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAwB,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC;iBAC1B,CAAC;YAC1B,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IACzD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CACvB,OAA6C,EAC7C,IAAuC;QAEvC,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACvC,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,MAAM,OAAO,GAAG,KAAK,IAAiC,EAAE;YACtD,IAAI,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;gBACjC,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,KAAK,IAAI,CAAC,CAAC;YAEX,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO,IAAI,EAAE,CAAC;YAChB,CAAC;YAED,OAAO,WAAW,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAC;QAC/B,OAAO,MAA4B,CAAC;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"executor.core.js","sourceRoot":"","sources":["../../../src/api/executor/executor.core.ts"],"names":[],"mappings":"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"}
@@ -2,8 +2,11 @@ import type { APIContext } from "../context/context.type.js";
2
2
  /**
3
3
  * Handler for an API operation.
4
4
  *
5
- * Receives validated input and the execution context,
6
- * and returns the operation output.
5
+ * Receives the operation input and the execution context, and returns
6
+ * the operation output. Input is validated by the executor only when the
7
+ * operation's `input` is a Standard Schema (https://standardschema.dev,
8
+ * implemented by Zod, Valibot, ArkType, …); otherwise it is passed
9
+ * through as-is and the handler must validate it itself.
7
10
  */
8
11
  export type APIHandler<TInput = unknown, TOutput = unknown> = (input: TInput, context: APIContext) => Promise<TOutput>;
9
12
  //# sourceMappingURL=handler.type.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.type.d.ts","sourceRoot":"","sources":["../../../src/api/handler/handler.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;;;GAKG;AACH,MAAM,MAAM,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,CAC5D,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"handler.type.d.ts","sourceRoot":"","sources":["../../../src/api/handler/handler.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,MAAM,UAAU,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,CAC5D,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC"}
@@ -8,6 +8,11 @@ export interface APIExecutionContext<TInput = unknown, TOutput = unknown> {
8
8
  readonly operation: APIOperation<TInput, TOutput>;
9
9
  readonly input: TInput;
10
10
  readonly context: APIContext;
11
+ /**
12
+ * The operation result. Populated by the executor once the handler has
13
+ * run, so interceptor code after `await next()` can read it here as
14
+ * well as from `next()`'s return value.
15
+ */
11
16
  readonly result?: APIResult<TOutput>;
12
17
  }
13
18
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.type.d.ts","sourceRoot":"","sources":["../../../src/api/interceptors/interceptor.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACtE,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAE7B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC3C,OAAO,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GACtC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAMtD"}
1
+ {"version":3,"file":"interceptor.type.d.ts","sourceRoot":"","sources":["../../../src/api/interceptors/interceptor.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACtE,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAElD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAE7B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC3C,OAAO,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7C,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,GACtC,OAAO,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;CAChC;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAMtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"interceptor.type.js","sourceRoot":"","sources":["../../../src/api/interceptors/interceptor.type.ts"],"names":[],"mappings":"AA+BA;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI;YAC5B,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"interceptor.type.js","sourceRoot":"","sources":["../../../src/api/interceptors/interceptor.type.ts"],"names":[],"mappings":"AAoCA;;GAEG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO;QACL,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI;YAC5B,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -18,6 +18,11 @@ export interface APIOperationMetadata {
18
18
  */
19
19
  export interface APIOperation<TInput = unknown, TOutput = unknown> {
20
20
  readonly name: string;
21
+ /**
22
+ * Input schema. When this is a Standard Schema
23
+ * (https://standardschema.dev), the executor validates input against it
24
+ * before invoking the handler; other values are documentation-only.
25
+ */
21
26
  readonly input?: unknown;
22
27
  readonly output?: unknown;
23
28
  readonly handler: APIHandler<TInput, TOutput>;
@@ -1 +1 @@
1
- {"version":3,"file":"operation.type.d.ts","sourceRoot":"","sources":["../../../src/api/operation/operation.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAI7D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAElC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACjE,OAAO,EAAE,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ/B"}
1
+ {"version":3,"file":"operation.type.d.ts","sourceRoot":"","sources":["../../../src/api/operation/operation.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAI7D;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAElC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAE9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAC/D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACzE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAE1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAEzC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EACjE,OAAO,EAAE,sBAAsB,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/C,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ/B"}
@@ -1 +1 @@
1
- {"version":3,"file":"operation.type.js","sourceRoot":"","sources":["../../../src/api/operation/operation.type.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAwD5D;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAgD;IAEhD,MAAM,SAAS,GAAkC;QAC/C,GAAG,OAAO;QACV,OAAO,EACL,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,IAAI,yBAAyB;KAC5E,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"operation.type.js","sourceRoot":"","sources":["../../../src/api/operation/operation.type.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AA6D5D;;GAEG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAgD;IAEhD,MAAM,SAAS,GAAkC;QAC/C,GAAG,OAAO;QACV,OAAO,EACL,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,OAAO,IAAI,yBAAyB;KAC5E,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zudojs/api",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "Application-facing API layer for Zudojs — operation definitions, execution context, interceptors, policies, and transport-agnostic contracts.",
5
5
  "license": "MIT",
6
6
  "type": "module",