stitchkit 0.46.0 → 0.48.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/README.md +13 -3
- package/dist/browser/cancellation.d.ts +14 -0
- package/dist/browser/cancellation.d.ts.map +1 -0
- package/dist/browser/client-multipart.d.ts +3 -1
- package/dist/browser/client-multipart.d.ts.map +1 -1
- package/dist/browser/client.d.ts +1 -0
- package/dist/browser/client.d.ts.map +1 -1
- package/dist/browser/http.d.ts +1 -0
- package/dist/browser/http.d.ts.map +1 -1
- package/dist/cli.js +2 -2
- package/dist/contract/define.d.ts +67 -15
- package/dist/contract/define.d.ts.map +1 -1
- package/dist/contract/index.d.ts +1 -1
- package/dist/contract/index.d.ts.map +1 -1
- package/dist/contract/index.js +1 -1
- package/dist/{index-zwqty9zf.js → index-44xysy8r.js} +465 -49
- package/dist/{index-pwyedf7b.js → index-45dz4m51.js} +46 -0
- package/dist/{index-c40tkxcd.js → index-8ekq6res.js} +1 -1
- package/dist/{index-5s8b7z6q.js → index-ee621cmy.js} +9 -9
- package/dist/{index-62pqb23z.js → index-kp8xamqp.js} +1 -1
- package/dist/{index-w1s873ng.js → index-nrytvb30.js} +4 -3
- package/dist/index.js +195 -94
- package/dist/node.js +2 -2
- package/dist/observability/audit.d.ts +22 -3
- package/dist/observability/audit.d.ts.map +1 -1
- package/dist/observability/index.d.ts +1 -1
- package/dist/observability/index.d.ts.map +1 -1
- package/dist/observability/index.js +82 -15
- package/dist/server/context.d.ts +8 -5
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/implement.d.ts +33 -2
- package/dist/server/implement.d.ts.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +28 -6
- package/dist/server/middleware/auth.d.ts +7 -4
- package/dist/server/middleware/auth.d.ts.map +1 -1
- package/dist/server/multipart.d.ts +13 -18
- package/dist/server/multipart.d.ts.map +1 -1
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/types.d.ts +48 -15
- package/dist/server/types.d.ts.map +1 -1
- package/dist/tools.js +171 -74
- package/llms-full.txt +411 -67
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
redact,
|
|
4
4
|
sanitizePayload,
|
|
5
5
|
truncatePreview
|
|
6
|
-
} from "../index-
|
|
6
|
+
} from "../index-8ekq6res.js";
|
|
7
7
|
import {
|
|
8
8
|
childSpan,
|
|
9
9
|
createTraceContext,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
setRequestError,
|
|
23
23
|
setRequestUser,
|
|
24
24
|
wrapInRequestContext
|
|
25
|
-
} from "../index-
|
|
25
|
+
} from "../index-ee621cmy.js";
|
|
26
26
|
|
|
27
27
|
// src/observability/audit.ts
|
|
28
28
|
function toolErrorMessage(result) {
|
|
@@ -63,24 +63,81 @@ function readMcpContext(value) {
|
|
|
63
63
|
...round !== undefined && { round }
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
var DEFAULT_MAX_PENDING = 1000;
|
|
67
|
+
function invokeIsolated(callback) {
|
|
68
|
+
if (!callback)
|
|
69
|
+
return;
|
|
70
|
+
Promise.resolve().then(callback).catch(() => {});
|
|
71
|
+
}
|
|
72
|
+
function createSinkManager(config) {
|
|
73
|
+
const maxPending = config.maxPending ?? DEFAULT_MAX_PENDING;
|
|
74
|
+
if (!Number.isSafeInteger(maxPending) || maxPending <= 0) {
|
|
75
|
+
throw new TypeError("Observability maxPending must be a positive safe integer");
|
|
76
|
+
}
|
|
77
|
+
let sequence = 0;
|
|
78
|
+
let closed = false;
|
|
79
|
+
let closePromise;
|
|
80
|
+
const preparing = new Map;
|
|
81
|
+
const writes = new Map;
|
|
82
|
+
const reportError = (error, event) => {
|
|
83
|
+
invokeIsolated(config.onSinkError ? () => config.onSinkError?.({ error, ...event !== undefined && { event } }) : undefined);
|
|
84
|
+
};
|
|
85
|
+
const reportDrop = (reason, event) => {
|
|
86
|
+
invokeIsolated(config.onDrop ? () => config.onDrop?.({ reason, event, pending: writes.size }) : undefined);
|
|
87
|
+
};
|
|
88
|
+
const admit = (id, event) => {
|
|
68
89
|
try {
|
|
69
90
|
if (config.filter && !config.filter(event))
|
|
70
91
|
return;
|
|
71
|
-
|
|
72
|
-
|
|
92
|
+
} catch (error) {
|
|
93
|
+
reportError(error, event);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
if (writes.size >= maxPending) {
|
|
97
|
+
reportDrop("capacity", event);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const write = Promise.resolve().then(() => config.write(event)).catch((error) => reportError(error, event)).finally(() => writes.delete(id));
|
|
101
|
+
writes.set(id, write);
|
|
102
|
+
};
|
|
103
|
+
const awaitGeneration = async (boundary) => {
|
|
104
|
+
const through = (values) => [...values].filter(([id]) => id <= boundary).map(([, value]) => value);
|
|
105
|
+
await Promise.allSettled(through(preparing));
|
|
106
|
+
await Promise.allSettled(through(writes));
|
|
107
|
+
};
|
|
108
|
+
return {
|
|
109
|
+
submit(produce) {
|
|
110
|
+
const id = ++sequence;
|
|
111
|
+
if (closed) {
|
|
112
|
+
Promise.resolve().then(produce).then((event) => reportDrop("closed", event)).catch((error) => reportError(error));
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const preparation = Promise.resolve().then(produce).then((event) => admit(id, event)).catch((error) => reportError(error)).finally(() => preparing.delete(id));
|
|
116
|
+
preparing.set(id, preparation);
|
|
117
|
+
},
|
|
118
|
+
flush() {
|
|
119
|
+
return awaitGeneration(sequence);
|
|
120
|
+
},
|
|
121
|
+
close() {
|
|
122
|
+
if (closePromise)
|
|
123
|
+
return closePromise;
|
|
124
|
+
closed = true;
|
|
125
|
+
closePromise = awaitGeneration(sequence);
|
|
126
|
+
return closePromise;
|
|
127
|
+
}
|
|
73
128
|
};
|
|
74
129
|
}
|
|
75
130
|
function createObservability(config) {
|
|
131
|
+
const requestManager = config.request ? createSinkManager(config.request) : undefined;
|
|
132
|
+
const toolManager = config.tools ? createSinkManager(config.tools) : undefined;
|
|
133
|
+
let closePromise;
|
|
76
134
|
const request = config.request ? {
|
|
77
135
|
includePayload: config.request.includePayload ?? false,
|
|
78
136
|
complete: ({ context, statusCode, durationMs, payload }) => {
|
|
79
137
|
const requestConfig = config.request;
|
|
80
138
|
if (!requestConfig)
|
|
81
139
|
return;
|
|
82
|
-
|
|
83
|
-
(async () => {
|
|
140
|
+
requestManager?.submit(async () => {
|
|
84
141
|
let body;
|
|
85
142
|
if (payload) {
|
|
86
143
|
try {
|
|
@@ -89,7 +146,7 @@ function createObservability(config) {
|
|
|
89
146
|
body = undefined;
|
|
90
147
|
}
|
|
91
148
|
}
|
|
92
|
-
|
|
149
|
+
return {
|
|
93
150
|
source: context.source,
|
|
94
151
|
method: context.method,
|
|
95
152
|
path: context.path,
|
|
@@ -118,8 +175,8 @@ function createObservability(config) {
|
|
|
118
175
|
ipAddress: context.ipAddress,
|
|
119
176
|
userAgent: context.userAgent,
|
|
120
177
|
startedAt: new Date(Date.now() - durationMs)
|
|
121
|
-
}
|
|
122
|
-
})
|
|
178
|
+
};
|
|
179
|
+
});
|
|
123
180
|
}
|
|
124
181
|
} : undefined;
|
|
125
182
|
const toolCall = config.tools ? {
|
|
@@ -128,13 +185,12 @@ function createObservability(config) {
|
|
|
128
185
|
const toolConfig = config.tools;
|
|
129
186
|
if (!toolConfig)
|
|
130
187
|
return;
|
|
131
|
-
const emit = createEmitter(toolConfig);
|
|
132
188
|
const requestCtx = getRequestContext();
|
|
133
189
|
const span = requestCtx ? childSpan(requestCtx.trace) : createTraceContext();
|
|
134
190
|
const measure = result.ok ? measureSize(result.data) : { resultSize: null, responseBytes: 0 };
|
|
135
191
|
const mcp = context.source === "mcp" ? readMcpContext(context.mcp) : undefined;
|
|
136
192
|
const toolPhase = mcp?.outcome === "input_required" ? "input-round" : "operation";
|
|
137
|
-
|
|
193
|
+
toolManager?.submit(() => ({
|
|
138
194
|
source: context.source,
|
|
139
195
|
method: "TOOL",
|
|
140
196
|
httpMethod: endpoint.method,
|
|
@@ -168,13 +224,24 @@ function createObservability(config) {
|
|
|
168
224
|
ipAddress: readString(context.ipAddress),
|
|
169
225
|
userAgent: readString(context.userAgent),
|
|
170
226
|
startedAt: new Date(Date.now() - durationMs)
|
|
171
|
-
});
|
|
227
|
+
}));
|
|
172
228
|
} catch {}
|
|
173
229
|
}
|
|
174
230
|
} : undefined;
|
|
175
231
|
return {
|
|
176
232
|
...request && { request },
|
|
177
|
-
toolCall: toolCall ?? {}
|
|
233
|
+
toolCall: toolCall ?? {},
|
|
234
|
+
async flush() {
|
|
235
|
+
await Promise.all([requestManager?.flush(), toolManager?.flush()]);
|
|
236
|
+
},
|
|
237
|
+
close() {
|
|
238
|
+
if (!closePromise) {
|
|
239
|
+
closePromise = Promise.all([requestManager?.close(), toolManager?.close()]).then(() => {
|
|
240
|
+
return;
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
return closePromise;
|
|
244
|
+
}
|
|
178
245
|
};
|
|
179
246
|
}
|
|
180
247
|
export {
|
package/dist/server/context.d.ts
CHANGED
|
@@ -3,25 +3,28 @@
|
|
|
3
3
|
* endpoint schemas and gathers request metadata (trace id, client info).
|
|
4
4
|
*/
|
|
5
5
|
import { type RuntimeContext } from '../contract';
|
|
6
|
+
import { type MultipartLifecycle } from './multipart';
|
|
6
7
|
import { type ClientIpOptions } from './request';
|
|
7
|
-
import type { MethodDef } from './types';
|
|
8
|
+
import type { AuthorizationContext, MethodDef } from './types';
|
|
8
9
|
/**
|
|
9
10
|
* Assemble everything knowable from the URL alone — path params, the request,
|
|
10
11
|
* trace id and client info — **before** any schema parsing. Bound first so a
|
|
11
12
|
* later validation failure still hands `onError` the path params and the
|
|
12
|
-
* request (an empty context loses both);
|
|
13
|
-
* with
|
|
13
|
+
* request (an empty context loses both); the two parsing phases then enrich it
|
|
14
|
+
* with schema-validated params and payload.
|
|
14
15
|
*
|
|
15
16
|
* `params` starts as the raw matched path params (a property of the URL, known
|
|
16
17
|
* the moment the route matched) and is replaced by the validated value when the
|
|
17
18
|
* endpoint declares a `paramsSchema`.
|
|
18
19
|
*/
|
|
19
|
-
export declare function buildBaseContext(req: Request, url: URL, pathParams: Record<string, string>, traceId: string, clientIp: ClientIpOptions):
|
|
20
|
+
export declare function buildBaseContext(req: Request, url: URL, pathParams: Record<string, string>, traceId: string, clientIp: ClientIpOptions): AuthorizationContext;
|
|
20
21
|
/**
|
|
21
22
|
* Parse `params` / `input` against the endpoint schemas and write them onto an
|
|
22
23
|
* already-assembled base context. A validation failure throws a `ZodError`
|
|
23
24
|
* here — the base context (path params, request) is preserved for `onError`.
|
|
24
25
|
*/
|
|
25
|
-
export declare function
|
|
26
|
+
export declare function parsePathParamsInto(ctx: RuntimeContext, method: MethodDef): void;
|
|
27
|
+
/** Parse query, JSON or multipart payload after pre-body authorization. */
|
|
28
|
+
export declare function parseRequestPayloadInto(ctx: RuntimeContext, req: Request, url: URL, method: MethodDef, maxJsonBodyBytes?: number): Promise<MultipartLifecycle | undefined>;
|
|
26
29
|
export declare function buildErrorContext(req: Request, url: URL, traceId: string, clientIp: ClientIpOptions): RuntimeContext;
|
|
27
30
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/server/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/server/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,KAAK,kBAAkB,EAAkB,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,KAAK,eAAe,EAAmC,MAAM,WAAW,CAAC;AAElF,OAAO,KAAK,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAmC/D;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAClC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe,GACxB,oBAAoB,CAmBtB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,GAAG,IAAI,CAIhF;AAED,2EAA2E;AAC3E,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,GAAG,EACR,MAAM,EAAE,SAAS,EACjB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC,CA+BzC;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,eAAe,GACxB,cAAc,CAWhB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/server/create.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/server/create.ts"],"names":[],"mappings":"AAoDA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAA2B,MAAM,SAAS,CAAC;AAIpF,wBAAgB,aAAa,CAAC,OAAO,GAAG,OAAO,EAC7C,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAC7B,YAAY,CAAC,OAAO,CAAC,CA8fvB"}
|
|
@@ -1,5 +1,35 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { ZodType } from 'zod';
|
|
2
|
+
import type { ContractDef, EndpointDef, MultipartDescriptor, RuntimeContext } from '../contract';
|
|
3
|
+
import type { EndpointHandlerContext, Handlers, MultipartReceiver, ServiceDef, StreamingMultipartImplementation } from './types';
|
|
4
|
+
type StreamingEndpoint = EndpointDef & {
|
|
5
|
+
multipart: MultipartDescriptor & {
|
|
6
|
+
delivery: 'stream';
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
type ReceiverMap<E extends StreamingEndpoint> = {
|
|
10
|
+
[K in keyof E['multipart']['files']]: MultipartReceiver;
|
|
11
|
+
};
|
|
12
|
+
type ReceiverValue<R> = R extends MultipartReceiver<infer V> ? V : never;
|
|
13
|
+
type StreamedFiles<E extends StreamingEndpoint, R extends ReceiverMap<E>> = {
|
|
14
|
+
[K in keyof E['multipart']['files']]: E['multipart']['files'][K] extends {
|
|
15
|
+
multiple: true;
|
|
16
|
+
} ? ReceiverValue<R[K]>[] : E['multipart']['files'][K] extends {
|
|
17
|
+
required: false;
|
|
18
|
+
} ? ReceiverValue<R[K]> | undefined : ReceiverValue<R[K]>;
|
|
19
|
+
};
|
|
20
|
+
type StreamingReturn<E extends EndpointDef> = E extends {
|
|
21
|
+
output: ZodType<infer O>;
|
|
22
|
+
} ? O | Promise<O> : void | Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Bind streaming multipart receivers to one endpoint while inferring the
|
|
25
|
+
* receiver values handed to its final handler.
|
|
26
|
+
*/
|
|
27
|
+
export declare function defineMultipartStream<const E extends StreamingEndpoint, const R extends ReceiverMap<E>>(endpoint: E, config: {
|
|
28
|
+
files: R & Record<Exclude<keyof R, keyof E['multipart']['files']>, never>;
|
|
29
|
+
handler: (ctx: EndpointHandlerContext<E, RuntimeContext> & {
|
|
30
|
+
files: StreamedFiles<E, R>;
|
|
31
|
+
}) => StreamingReturn<E>;
|
|
32
|
+
}): StreamingMultipartImplementation;
|
|
3
33
|
/**
|
|
4
34
|
* Bind a contract to its typed `handlers`, producing a `ServiceDef` to mount on
|
|
5
35
|
* `createServer`. Every handler is type-checked against its endpoint's schemas.
|
|
@@ -13,4 +43,5 @@ export declare function implement<T extends Record<string, EndpointDef>, TCtx ex
|
|
|
13
43
|
* the generic. The application declares its context shape in a single place.
|
|
14
44
|
*/
|
|
15
45
|
export declare function createImplement<TCtx extends RuntimeContext>(): <T extends Record<string, EndpointDef>>(contract: ContractDef<T, string>, handlers: Handlers<T, TCtx>) => ServiceDef;
|
|
46
|
+
export {};
|
|
16
47
|
//# sourceMappingURL=implement.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/server/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/server/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,mBAAmB,EACnB,cAAc,EACf,MAAM,aAAa,CAAC;AAGrB,OAAO,KAAK,EACV,sBAAsB,EACtB,QAAQ,EAER,iBAAiB,EACjB,UAAU,EACV,gCAAgC,EACjC,MAAM,SAAS,CAAC;AAEjB,KAAK,iBAAiB,GAAG,WAAW,GAAG;IACrC,SAAS,EAAE,mBAAmB,GAAG;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE,CAAC;CACzD,CAAC;AACF,KAAK,WAAW,CAAC,CAAC,SAAS,iBAAiB,IAAI;KAC7C,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,iBAAiB;CACxD,CAAC;AACF,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACzE,KAAK,aAAa,CAAC,CAAC,SAAS,iBAAiB,EAAE,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,IAAI;KACzE,CAAC,IAAI,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QACvE,QAAQ,EAAE,IAAI,CAAC;KAChB,GACG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GACrB,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,QAAQ,EAAE,KAAK,CAAA;KAAE,GACpD,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAC/B,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC1B,CAAC;AACF,KAAK,eAAe,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,SAAS;IAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,GAChF,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACd,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAWzB;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,CAAC,CAAC,SAAS,iBAAiB,EACjC,KAAK,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EAE9B,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE;IACN,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC1E,OAAO,EAAE,CACP,GAAG,EAAE,sBAAsB,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG;QAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;KAAE,KAC5E,eAAe,CAAC,CAAC,CAAC,CAAC;CACzB,GACA,gCAAgC,CAqBlC;AAKD;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACrC,IAAI,SAAS,cAAc,GAAG,cAAc,EAC5C,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU,CAwF3E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS,cAAc,MACjD,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,YACjC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,YACtB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAC1B,UAAU,CACd"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -7,13 +7,13 @@ export { createHandler } from './create';
|
|
|
7
7
|
export { createErrorHook, type ErrorHookConfig, type ResolvedError, } from './error-hook';
|
|
8
8
|
export { createEventBus, type DefaultEventMap, type EventBus, type EventBusOptions, type EventHandler, } from './event-bus';
|
|
9
9
|
export { type ByteRange, parseByteRange, type ServeFileOptions, serveFile, staticRoute, weakETag, } from './file';
|
|
10
|
-
export { createImplement, implement } from './implement';
|
|
10
|
+
export { createImplement, defineMultipartStream, implement } from './implement';
|
|
11
11
|
export type { LogFormat } from './logger';
|
|
12
12
|
export { type AuthHook, type AuthHookConfig, type AuthRule, type BearerResolverConfig, createAuthHook, createBearerResolver, extractToken, type JwtPayload, type SignJwtOptions, signJwt, type VerifyJwtOptions, verifyJwt, } from './middleware/auth';
|
|
13
13
|
export { type CookieDef, type CookieOptions, defineCookie, parseCookies, serializeCookie, } from './middleware/cookies';
|
|
14
14
|
export { type CorsConfig, corsHeaders, corsPreflightResponse, DEFAULT_CORS_ALLOW_HEADERS, DEFAULT_CORS_EXPOSE_HEADERS, } from './middleware/cors';
|
|
15
15
|
export { deriveCodeChallenge, type PkceMethod, verifyPkce } from './middleware/pkce';
|
|
16
|
-
export { type MultipartResult, parseMultipart } from './multipart';
|
|
16
|
+
export { type MultipartLifecycle, type MultipartResult, parseMultipart } from './multipart';
|
|
17
17
|
export { generateOpenApiDocument, type OpenApiConfig, type OpenApiDocument, type OpenApiInfo, type OpenApiServer, openApiRoute, } from './openapi';
|
|
18
18
|
export { createRateLimiter, type RateLimitConfig } from './rate-limit';
|
|
19
19
|
export { errorResponse, parseBody, respondJson } from './raw';
|
|
@@ -22,6 +22,6 @@ export { type ClientIpOptions, extractIp, generateTraceId, getClientInfo, resolv
|
|
|
22
22
|
export type { SocketIOServerConfig, SocketIOServerHandle } from './socket-io';
|
|
23
23
|
export { createSocketIOServer, socketIoLane } from './socket-io';
|
|
24
24
|
export { type ParseSSEOptions, parseSSE, streamSSE } from './stream';
|
|
25
|
-
export type { Handlers, LifecycleHooks, LoggingConfig, LogOutcome, MethodDef, OperationIdentity, RouteGroup, ServiceDef, StitchLogger, } from './types';
|
|
25
|
+
export type { AuthorizationContext, EndpointHandlerContext, Handlers, LifecycleHooks, LoggingConfig, LogOutcome, MethodDef, MultipartFileMetadata, MultipartReceiver, MultipartReceiverResult, OperationIdentity, RouteGroup, ServiceDef, StitchLogger, StreamingMultipartImplementation, } from './types';
|
|
26
26
|
export { type ComposedLane, composeWebSocketHandlers, type WebSocketComposeConfig, type WebSocketLane, webSocketLane, } from './websocket';
|
|
27
27
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,aAAa,CAAC;AAIrB,OAAO,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EACL,KAAK,mBAAmB,IAAI,gBAAgB,EAC5C,KAAK,eAAe,IAAI,YAAY,EACpC,KAAK,gBAAgB,IAAI,aAAa,EACtC,KAAK,WAAW,IAAI,QAAQ,EAC5B,KAAK,kBAAkB,IAAI,eAAe,EAC1C,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,KAAK,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,KAAK,SAAS,EACd,cAAc,EACd,KAAK,gBAAgB,EACrB,SAAS,EACT,WAAW,EACX,QAAQ,GACT,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.js
CHANGED
|
@@ -4,11 +4,12 @@ import {
|
|
|
4
4
|
createHandler,
|
|
5
5
|
createImplement,
|
|
6
6
|
createSocketIOServer,
|
|
7
|
+
defineMultipartStream,
|
|
7
8
|
implement,
|
|
8
9
|
parseMultipart,
|
|
9
10
|
socketIoLane,
|
|
10
11
|
webSocketLane
|
|
11
|
-
} from "../index-
|
|
12
|
+
} from "../index-44xysy8r.js";
|
|
12
13
|
import {
|
|
13
14
|
createAuthHook,
|
|
14
15
|
createBearerResolver,
|
|
@@ -21,7 +22,7 @@ import {
|
|
|
21
22
|
signJwt,
|
|
22
23
|
verifyJwt,
|
|
23
24
|
verifyPkce
|
|
24
|
-
} from "../index-
|
|
25
|
+
} from "../index-nrytvb30.js";
|
|
25
26
|
import {
|
|
26
27
|
DEFAULT_CORS_ALLOW_HEADERS,
|
|
27
28
|
DEFAULT_CORS_EXPOSE_HEADERS,
|
|
@@ -57,7 +58,7 @@ import {
|
|
|
57
58
|
resolveTraceId,
|
|
58
59
|
unauthorized,
|
|
59
60
|
zodIssues
|
|
60
|
-
} from "../index-
|
|
61
|
+
} from "../index-ee621cmy.js";
|
|
61
62
|
// src/server/bun.ts
|
|
62
63
|
function createServer(config) {
|
|
63
64
|
const { routes, websocket, development, bun: bunExtra, port = 3000, hostname } = config;
|
|
@@ -575,17 +576,37 @@ function generateOpenApiDocument(config) {
|
|
|
575
576
|
const inputJson = safeJson(method.inputSchema, "input");
|
|
576
577
|
const baseProps = isRecord(inputJson.properties) ? inputJson.properties : {};
|
|
577
578
|
const baseRequired = Array.isArray(inputJson.required) ? inputJson.required : [];
|
|
579
|
+
const fileProperties = {};
|
|
580
|
+
const requiredFiles = [];
|
|
581
|
+
for (const [field, policy] of Object.entries(method.multipart.files)) {
|
|
582
|
+
const binary = {
|
|
583
|
+
type: "string",
|
|
584
|
+
format: "binary",
|
|
585
|
+
...policy.maxBytes !== undefined && { maxLength: policy.maxBytes },
|
|
586
|
+
...policy.contentTypes !== undefined && {
|
|
587
|
+
"x-accepted-content-types": policy.contentTypes
|
|
588
|
+
}
|
|
589
|
+
};
|
|
590
|
+
fileProperties[field] = policy.multiple === true ? {
|
|
591
|
+
type: "array",
|
|
592
|
+
items: binary,
|
|
593
|
+
minItems: policy.required === false ? 0 : 1,
|
|
594
|
+
...policy.maxFiles !== undefined && { maxItems: policy.maxFiles }
|
|
595
|
+
} : binary;
|
|
596
|
+
if (policy.required !== false)
|
|
597
|
+
requiredFiles.push(field);
|
|
598
|
+
}
|
|
578
599
|
operation.requestBody = {
|
|
579
|
-
required:
|
|
600
|
+
required: baseRequired.length > 0 || requiredFiles.length > 0,
|
|
580
601
|
content: {
|
|
581
602
|
"multipart/form-data": {
|
|
582
603
|
schema: {
|
|
583
604
|
type: "object",
|
|
584
605
|
properties: {
|
|
585
606
|
...baseProps,
|
|
586
|
-
|
|
607
|
+
...fileProperties
|
|
587
608
|
},
|
|
588
|
-
required: [...baseRequired,
|
|
609
|
+
required: [...baseRequired, ...requiredFiles]
|
|
589
610
|
}
|
|
590
611
|
}
|
|
591
612
|
}
|
|
@@ -800,6 +821,7 @@ export {
|
|
|
800
821
|
errorResponse2 as errorResponse,
|
|
801
822
|
errorCode,
|
|
802
823
|
deriveCodeChallenge,
|
|
824
|
+
defineMultipartStream,
|
|
803
825
|
defineCookie,
|
|
804
826
|
createSocketIOServer,
|
|
805
827
|
createServer,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { RuntimeContext } from '../../contract';
|
|
2
|
-
import type { OperationIdentity } from '../types';
|
|
2
|
+
import type { AuthorizationContext, OperationIdentity } from '../types';
|
|
3
3
|
export interface JwtPayload {
|
|
4
4
|
[key: string]: unknown;
|
|
5
5
|
}
|
|
@@ -62,15 +62,18 @@ export interface AuthHookConfig<TIdentity> {
|
|
|
62
62
|
/** Thrown when an identity is present but the rule rejects it. */
|
|
63
63
|
onForbidden?: () => never;
|
|
64
64
|
}
|
|
65
|
-
export
|
|
65
|
+
export interface AuthHook {
|
|
66
|
+
(ctx: AuthorizationContext, endpoint: OperationIdentity): Promise<void>;
|
|
67
|
+
(ctx: RuntimeContext, endpoint: OperationIdentity): Promise<void>;
|
|
68
|
+
}
|
|
66
69
|
/**
|
|
67
|
-
* Build a
|
|
70
|
+
* Build a scope authorization hook.
|
|
68
71
|
*
|
|
69
72
|
* Identity resolution and the scope vocabulary stay in the project; the
|
|
70
73
|
* project annotates its `rules` object with `satisfies Record<MyScope, …>` to
|
|
71
74
|
* keep scope coverage exhaustive.
|
|
72
75
|
*
|
|
73
|
-
* The hook runs on both surfaces: as `createServer`'s `
|
|
76
|
+
* The hook runs on both surfaces: as `createServer`'s `authorize` (HTTP) and
|
|
74
77
|
* as a tool mount's `lifecycle.beforeHandle` (MCP / agent). On HTTP it resolves
|
|
75
78
|
* identity from `ctx.req` via `resolve`; on a tool call — where there is no
|
|
76
79
|
* `req` — it uses `resolveFromContext`. If `resolveFromContext` is omitted, a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/server/middleware/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAKrD,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAGxE,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,8BAA8B;AAC9B,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,UAAU,CAAC,CAgErB;AAED,4BAA4B;AAC5B,MAAM,WAAW,cAAc;IAC7B,0EAA0E;IAC1E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mBAAmB;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,OAAO,EAAE,UAAU,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,CA+BjB;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAU7E;AAUD;;;;;;;GAOG;AACH,MAAM,MAAM,QAAQ,CAAC,SAAS,IAC1B,QAAQ,GACR,eAAe,GACf,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,cAAc,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAExF,MAAM,WAAW,cAAc,CAAC,SAAS;IACvC,kEAAkE;IAClE,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC5D;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,KAAK,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3F,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3C,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iEAAiE;IACjE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IAC5E,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,KAAK,CAAC;IAC1B,kEAAkE;IAClE,WAAW,CAAC,EAAE,MAAM,KAAK,CAAC;CAC3B;AAED,MAAM,WAAW,QAAQ;IACvB,CAAC,GAAG,EAAE,oBAAoB,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,QAAQ,CAoCrF;AAID;;;;GAIG;AACH,MAAM,WAAW,oBAAoB,CAAC,SAAS;IAC7C,4EAA4E;IAC5E,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;CACpE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAC5C,MAAM,EAAE,oBAAoB,CAAC,SAAS,CAAC,GACtC,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAM7C"}
|
|
@@ -1,23 +1,18 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
export interface
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import type { MultipartDescriptor } from '../contract';
|
|
2
|
+
import type { MultipartReceiver } from './types';
|
|
3
|
+
export interface MultipartLifecycle {
|
|
4
|
+
rollback(): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
/** Parsed multipart fields, files and rollback ownership for streamed handles. */
|
|
7
|
+
export interface MultipartResult extends MultipartLifecycle {
|
|
8
|
+
files: Record<string, unknown>;
|
|
6
9
|
fields: unknown;
|
|
7
10
|
}
|
|
8
11
|
/**
|
|
9
|
-
* Parse a
|
|
10
|
-
*
|
|
11
|
-
* Rejects with a 400 if the file is missing or the upload exceeds `maxBytes`
|
|
12
|
-
* (default 25 MB).
|
|
13
|
-
*
|
|
14
|
-
* A multipart text field is always a **string** (per the spec) and is handed to
|
|
15
|
-
* the schema as one — the schema decides its type, exactly as with query params:
|
|
16
|
-
* `z.coerce.number()` for a number, `z.stringbool()` for a boolean (NOT
|
|
17
|
-
* `z.coerce.boolean()`, which is `Boolean(str)` — `'false'` would become `true`),
|
|
18
|
-
* and `z.preprocess((v) => JSON.parse(String(v)), Schema)` to opt a field into JSON.
|
|
19
|
-
* Content is never sniffed to guess a type — the contract owns the type, not the
|
|
20
|
-
* value (so an id like `'33111715'` never turns into a number under a `z.string()`).
|
|
12
|
+
* Parse a typed multipart descriptor. Buffered delivery materialises `File`
|
|
13
|
+
* values; streaming delivery invokes consumer receivers as each part arrives.
|
|
21
14
|
*/
|
|
22
|
-
export declare function parseMultipart(req: Request,
|
|
15
|
+
export declare function parseMultipart(req: Request, descriptor: MultipartDescriptor, fieldsSchema?: {
|
|
16
|
+
parse(value: unknown): unknown;
|
|
17
|
+
}, receivers?: Record<string, MultipartReceiver>): Promise<MultipartResult>;
|
|
23
18
|
//# sourceMappingURL=multipart.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../../src/server/multipart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"multipart.d.ts","sourceRoot":"","sources":["../../src/server/multipart.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAuB,MAAM,aAAa,CAAC;AAG5E,OAAO,KAAK,EAAE,iBAAiB,EAA2B,MAAM,SAAS,CAAC;AAW1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAgB,SAAQ,kBAAkB;IACzD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,OAAO,CAAC;CACjB;AA0UD;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,mBAAmB,EAC/B,YAAY,CAAC,EAAE;IAAE,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAA;CAAE,EACjD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAC5C,OAAO,CAAC,eAAe,CAAC,CAoH1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,iFAAiF;IACjF,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC,CAAC;IAChE,oCAAoC;IACpC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAChD;AAsED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,
|
|
1
|
+
{"version":3,"file":"openapi.d.ts","sourceRoot":"","sources":["../../src/server/openapi.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,WAAW,CAAC;IAClB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;IACxB,iFAAiF;IACjF,MAAM,CAAC,EAAE,KAAK,CAAC;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC,CAAC;IAChE,oCAAoC;IACpC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B;;;;;;;;;;;OAWG;IACH,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC;CAC1D;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAChD;AAsED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,aAAa,GAAG,eAAe,CA8K9E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,QAAQ,CAM9E"}
|
package/dist/server/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ZodType } from 'zod';
|
|
2
|
-
import type { EndpointDef, EndpointMcpPolicy, EndpointResponseMeta, EndpointToolAnnotations, EndpointUiMeta, HandlerContext, HttpMethod, ResponseMetadata, RuntimeContext, Transport } from '../contract';
|
|
2
|
+
import type { EndpointDef, EndpointMcpPolicy, EndpointResponseMeta, EndpointToolAnnotations, EndpointUiMeta, HandlerContext, HttpMethod, MultipartBufferedFiles, MultipartDescriptor, ResponseMetadata, RuntimeContext, Transport } from '../contract';
|
|
3
3
|
import type { StitchLogger } from '../logger';
|
|
4
4
|
import type { HttpRequestObserver } from '../observability/audit';
|
|
5
5
|
import type { LogFormat } from './logger';
|
|
@@ -52,12 +52,44 @@ type RequiredResponseMetadata<E> = E extends {
|
|
|
52
52
|
req: Request;
|
|
53
53
|
response: ResponseMetadata;
|
|
54
54
|
} : unknown;
|
|
55
|
+
export type EndpointHandlerContext<E extends EndpointDef, TCtx extends RuntimeContext = HandlerContext> = TCtx & {
|
|
56
|
+
params: InferParams<E>;
|
|
57
|
+
input: InferInput<E>;
|
|
58
|
+
} & RequiredRequest<E> & RetainedRawBody<E> & RequiredResponseMetadata<E> & InferMcpInput<E> & (E extends {
|
|
59
|
+
multipart: infer M extends MultipartDescriptor;
|
|
60
|
+
} ? M extends {
|
|
61
|
+
delivery: 'stream';
|
|
62
|
+
} ? unknown : {
|
|
63
|
+
files: MultipartBufferedFiles<M>;
|
|
64
|
+
} : unknown);
|
|
55
65
|
export type Handlers<C extends Record<string, EndpointDef>, TCtx extends RuntimeContext = HandlerContext> = {
|
|
56
|
-
[K in keyof C]:
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
66
|
+
[K in keyof C]: C[K] extends {
|
|
67
|
+
multipart: {
|
|
68
|
+
delivery: 'stream';
|
|
69
|
+
};
|
|
70
|
+
} ? StreamingMultipartImplementation : (ctx: EndpointHandlerContext<C[K], TCtx>) => HandlerReturn<C[K]>;
|
|
60
71
|
};
|
|
72
|
+
export interface MultipartFileMetadata {
|
|
73
|
+
field: string;
|
|
74
|
+
filename: string;
|
|
75
|
+
contentType: string;
|
|
76
|
+
size?: number;
|
|
77
|
+
}
|
|
78
|
+
export interface MultipartReceiverResult<T> {
|
|
79
|
+
value: T;
|
|
80
|
+
cleanup: () => void | Promise<void>;
|
|
81
|
+
}
|
|
82
|
+
export type MultipartReceiver<T = unknown> = (options: {
|
|
83
|
+
metadata: MultipartFileMetadata;
|
|
84
|
+
stream: ReadableStream<Uint8Array>;
|
|
85
|
+
signal: AbortSignal;
|
|
86
|
+
}) => MultipartReceiverResult<T> | Promise<MultipartReceiverResult<T>>;
|
|
87
|
+
/** Runtime-neutral representation produced by `defineMultipartStream`. */
|
|
88
|
+
export interface StreamingMultipartImplementation {
|
|
89
|
+
readonly kind: 'stitchkit.multipart.stream';
|
|
90
|
+
readonly receivers: Record<string, MultipartReceiver>;
|
|
91
|
+
execute(ctx: RuntimeContext, files: Record<string, unknown>): unknown;
|
|
92
|
+
}
|
|
61
93
|
/**
|
|
62
94
|
* Stable identity shared by HTTP contract endpoints and pathless native tool
|
|
63
95
|
* operations. Tool lifecycle/audit consume this shape; only `MethodDef` adds an
|
|
@@ -99,10 +131,8 @@ export interface MethodDef<TParams = unknown, TInput = unknown, TOutput = unknow
|
|
|
99
131
|
paramsSchema?: ZodType<TParams>;
|
|
100
132
|
inputSchema?: ZodType<TInput>;
|
|
101
133
|
outputSchema?: ZodType<TOutput>;
|
|
102
|
-
multipart?:
|
|
103
|
-
|
|
104
|
-
* server `maxUploadBytes` default; from `EndpointDef.maxUploadBytes`. */
|
|
105
|
-
maxUploadBytes?: number;
|
|
134
|
+
multipart?: MultipartDescriptor;
|
|
135
|
+
multipartReceivers?: Record<string, MultipartReceiver>;
|
|
106
136
|
/** Per-route JSON body ceiling; enforced before full buffering. */
|
|
107
137
|
maxJsonBodyBytes?: number;
|
|
108
138
|
/**
|
|
@@ -126,6 +156,14 @@ export interface MethodDef<TParams = unknown, TInput = unknown, TOutput = unknow
|
|
|
126
156
|
contentType?: string;
|
|
127
157
|
handler: (ctx: RuntimeContext) => Promise<TOutput> | TOutput;
|
|
128
158
|
}
|
|
159
|
+
/**
|
|
160
|
+
* HTTP context available to the pre-body authorization phase. Path params have
|
|
161
|
+
* already been validated, while request payload state is deliberately absent.
|
|
162
|
+
*/
|
|
163
|
+
export interface AuthorizationContext extends RuntimeContext {
|
|
164
|
+
input: undefined;
|
|
165
|
+
files?: never;
|
|
166
|
+
}
|
|
129
167
|
export interface ServiceDef {
|
|
130
168
|
name: string;
|
|
131
169
|
prefix: string;
|
|
@@ -134,6 +172,7 @@ export interface ServiceDef {
|
|
|
134
172
|
}
|
|
135
173
|
export interface LifecycleHooks {
|
|
136
174
|
onRequest?: (req: Request) => undefined | Response | Promise<undefined | Response>;
|
|
175
|
+
authorize?: (ctx: AuthorizationContext, endpoint: MethodDef) => void | Promise<void>;
|
|
137
176
|
beforeHandle?: (ctx: RuntimeContext, endpoint: MethodDef) => void | Promise<void>;
|
|
138
177
|
afterHandle?: (ctx: RuntimeContext, result: unknown, endpoint: MethodDef) => unknown | Promise<unknown>;
|
|
139
178
|
onError?: (ctx: RuntimeContext, error: unknown, endpoint?: MethodDef) => Response | Promise<Response> | undefined;
|
|
@@ -291,12 +330,6 @@ export interface HandlerConfig<TServer = unknown> {
|
|
|
291
330
|
*/
|
|
292
331
|
scopePrefixes?: Record<string, string>;
|
|
293
332
|
rawRoutes?: RawRoute<TServer>[];
|
|
294
|
-
/**
|
|
295
|
-
* Default upload ceiling (bytes) for every `multipart` endpoint. A per-route
|
|
296
|
-
* `EndpointDef.maxUploadBytes` overrides it; without either, multipart uploads
|
|
297
|
-
* are capped at the 25 MB framework default.
|
|
298
|
-
*/
|
|
299
|
-
maxUploadBytes?: number;
|
|
300
333
|
/**
|
|
301
334
|
* Default JSON request-body ceiling in bytes. A per-route
|
|
302
335
|
* `EndpointDef.maxJsonBodyBytes` overrides it. Unset preserves the existing
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;AACnC,OAAO,KAAK,EACV,WAAW,EACX,iBAAiB,EACjB,oBAAoB,EACpB,uBAAuB,EACvB,cAAc,EACd,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,SAAS,EACV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;AACtE,KAAK,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AACjF,KAAK,UAAU,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC;AAC/E,KAAK,WAAW,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC7E,KAAK,aAAa,CAAC,CAAC,IAClB,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC,SAAS;IACrB,aAAa,EAAE,MAAM,CAAC,SAAS,SAAS;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;CAC5E,GACG;IACE,QAAQ,CAAC,EAAE;SACR,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAChF,CAAC,GACD,KAAK;KACV,CAAC;CACH,GACD,OAAO,CAAC;AAEd;;;;;;GAMG;AACH,KAAK,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,GACnD,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAC5B,IAAI,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,GAC/B,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GACxC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE3B;;;;;;GAMG;AACH,KAAK,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,WAAW,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC;AACvF,KAAK,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GACjD;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC,OAAO,CAAC;AACZ,KAAK,wBAAwB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,YAAY,EAAE,oBAAoB,CAAA;CAAE,GAC/E;IAAE,GAAG,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,gBAAgB,CAAA;CAAE,GAC5C,OAAO,CAAC;AAEZ,MAAM,MAAM,QAAQ,CAClB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACrC,IAAI,SAAS,cAAc,GAAG,cAAc,IAC1C;KACD,CAAC,IAAI,MAAM,CAAC,GAAG,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/server/types.ts"],"names":[],"mappings":"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"}
|