@zudojs/api 0.0.1 → 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.0.1",
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",
@@ -16,14 +16,21 @@
16
16
  "files": [
17
17
  "dist"
18
18
  ],
19
+ "scripts": {
20
+ "build": "tsc -p tsconfig.json",
21
+ "typecheck": "tsc -p tsconfig.json --noEmit",
22
+ "clean": "rm -rf dist",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest"
25
+ },
19
26
  "engines": {
20
27
  "node": ">=24.0.0"
21
28
  },
22
29
  "dependencies": {
23
- "@zudojs/errors": "0.0.1",
24
- "@zudojs/constants": "0.0.1",
25
- "@zudojs/types": "0.0.1",
26
- "@zudojs/schema": "0.0.1"
30
+ "@zudojs/errors": "0.1.0",
31
+ "@zudojs/constants": "0.1.0",
32
+ "@zudojs/types": "0.1.0",
33
+ "@zudojs/schema": "0.1.0"
27
34
  },
28
35
  "devDependencies": {
29
36
  "typescript": "^7.0.2",
@@ -42,12 +49,5 @@
42
49
  "repository": {
43
50
  "type": "git",
44
51
  "url": "https://github.com/oyinlola-tech/zudo"
45
- },
46
- "scripts": {
47
- "build": "tsc -p tsconfig.json",
48
- "typecheck": "tsc -p tsconfig.json --noEmit",
49
- "clean": "rm -rf dist",
50
- "test": "vitest run",
51
- "test:watch": "vitest"
52
52
  }
53
- }
53
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Zudojs Contributors
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.