@copilotkitnext/runtime 1.51.5-next.0 → 1.51.5-next.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.
- package/dist/_virtual/_rolldown/runtime.cjs +29 -0
- package/dist/endpoints/express-single.cjs +187 -0
- package/dist/endpoints/express-single.cjs.map +1 -0
- package/dist/endpoints/express-single.d.cts +15 -0
- package/dist/endpoints/express-single.d.cts.map +1 -0
- package/dist/endpoints/express-single.d.mts +15 -0
- package/dist/endpoints/express-single.d.mts.map +1 -0
- package/dist/endpoints/express-single.mjs +184 -0
- package/dist/endpoints/express-single.mjs.map +1 -0
- package/dist/endpoints/express-utils.cjs +118 -0
- package/dist/endpoints/express-utils.cjs.map +1 -0
- package/dist/endpoints/express-utils.mjs +116 -0
- package/dist/endpoints/express-utils.mjs.map +1 -0
- package/dist/endpoints/express.cjs +165 -0
- package/dist/endpoints/express.cjs.map +1 -0
- package/dist/endpoints/express.d.cts +15 -0
- package/dist/endpoints/express.d.cts.map +1 -0
- package/dist/endpoints/express.d.mts +15 -0
- package/dist/endpoints/express.d.mts.map +1 -0
- package/dist/endpoints/express.mjs +162 -0
- package/dist/endpoints/express.mjs.map +1 -0
- package/dist/endpoints/hono-single.cjs +140 -0
- package/dist/endpoints/hono-single.cjs.map +1 -0
- package/dist/endpoints/hono-single.d.cts +31 -0
- package/dist/endpoints/hono-single.d.cts.map +1 -0
- package/dist/endpoints/hono-single.d.mts +31 -0
- package/dist/endpoints/hono-single.d.mts.map +1 -0
- package/dist/endpoints/hono-single.mjs +139 -0
- package/dist/endpoints/hono-single.mjs.map +1 -0
- package/dist/endpoints/hono.cjs +152 -0
- package/dist/endpoints/hono.cjs.map +1 -0
- package/dist/endpoints/hono.d.cts +47 -0
- package/dist/endpoints/hono.d.cts.map +1 -0
- package/dist/endpoints/hono.d.mts +47 -0
- package/dist/endpoints/hono.d.mts.map +1 -0
- package/dist/endpoints/hono.mjs +151 -0
- package/dist/endpoints/hono.mjs.map +1 -0
- package/dist/endpoints/index.cjs +2 -0
- package/dist/endpoints/index.d.mts +2 -0
- package/dist/endpoints/index.mjs +4 -0
- package/dist/endpoints/single-route-helpers.cjs +67 -0
- package/dist/endpoints/single-route-helpers.cjs.map +1 -0
- package/dist/endpoints/single-route-helpers.mjs +64 -0
- package/dist/endpoints/single-route-helpers.mjs.map +1 -0
- package/dist/express.cjs +6 -0
- package/dist/express.d.cts +3 -0
- package/dist/express.d.mts +3 -19
- package/dist/express.mjs +3 -477
- package/dist/handlers/get-runtime-info.cjs +36 -0
- package/dist/handlers/get-runtime-info.cjs.map +1 -0
- package/dist/handlers/get-runtime-info.mjs +36 -0
- package/dist/handlers/get-runtime-info.mjs.map +1 -0
- package/dist/handlers/handle-connect.cjs +102 -0
- package/dist/handlers/handle-connect.cjs.map +1 -0
- package/dist/handlers/handle-connect.mjs +101 -0
- package/dist/handlers/handle-connect.mjs.map +1 -0
- package/dist/handlers/handle-run.cjs +114 -0
- package/dist/handlers/handle-run.cjs.map +1 -0
- package/dist/handlers/handle-run.mjs +113 -0
- package/dist/handlers/handle-run.mjs.map +1 -0
- package/dist/handlers/handle-stop.cjs +46 -0
- package/dist/handlers/handle-stop.cjs.map +1 -0
- package/dist/handlers/handle-stop.mjs +45 -0
- package/dist/handlers/handle-stop.mjs.map +1 -0
- package/dist/handlers/handle-transcribe.cjs +111 -0
- package/dist/handlers/handle-transcribe.cjs.map +1 -0
- package/dist/handlers/handle-transcribe.mjs +110 -0
- package/dist/handlers/handle-transcribe.mjs.map +1 -0
- package/dist/handlers/header-utils.cjs +25 -0
- package/dist/handlers/header-utils.cjs.map +1 -0
- package/dist/handlers/header-utils.mjs +24 -0
- package/dist/handlers/header-utils.mjs.map +1 -0
- package/dist/index.cjs +25 -0
- package/dist/index.d.cts +8 -0
- package/dist/index.d.mts +9 -139
- package/dist/index.mjs +10 -335
- package/dist/middleware.cjs +29 -0
- package/dist/middleware.cjs.map +1 -0
- package/dist/middleware.d.cts +24 -0
- package/dist/middleware.d.cts.map +1 -0
- package/dist/middleware.d.mts +24 -0
- package/dist/middleware.d.mts.map +1 -0
- package/dist/middleware.mjs +27 -0
- package/dist/middleware.mjs.map +1 -0
- package/dist/package.cjs +12 -0
- package/dist/package.cjs.map +1 -0
- package/dist/package.mjs +6 -0
- package/dist/package.mjs.map +1 -0
- package/dist/runner/agent-runner.cjs +7 -0
- package/dist/runner/agent-runner.cjs.map +1 -0
- package/dist/runner/agent-runner.d.cts +28 -0
- package/dist/runner/agent-runner.d.cts.map +1 -0
- package/dist/runner/agent-runner.d.mts +28 -0
- package/dist/runner/agent-runner.d.mts.map +1 -0
- package/dist/runner/agent-runner.mjs +6 -0
- package/dist/runner/agent-runner.mjs.map +1 -0
- package/dist/runner/in-memory.cjs +230 -0
- package/dist/runner/in-memory.cjs.map +1 -0
- package/dist/runner/in-memory.d.cts +14 -0
- package/dist/runner/in-memory.d.cts.map +1 -0
- package/dist/runner/in-memory.d.mts +14 -0
- package/dist/runner/in-memory.d.mts.map +1 -0
- package/dist/runner/in-memory.mjs +229 -0
- package/dist/runner/in-memory.mjs.map +1 -0
- package/dist/runner/index.cjs +4 -0
- package/dist/runner/index.d.cts +4 -0
- package/dist/runner/index.d.mts +4 -0
- package/dist/runner/index.mjs +5 -0
- package/dist/runtime.cjs +27 -0
- package/dist/runtime.cjs.map +1 -0
- package/dist/runtime.d.cts +43 -0
- package/dist/runtime.d.cts.map +1 -0
- package/dist/runtime.d.mts +43 -0
- package/dist/runtime.d.mts.map +1 -0
- package/dist/runtime.mjs +26 -0
- package/dist/runtime.mjs.map +1 -0
- package/dist/transcription-service/transcription-service.cjs +7 -0
- package/dist/transcription-service/transcription-service.cjs.map +1 -0
- package/dist/transcription-service/transcription-service.d.cts +14 -0
- package/dist/transcription-service/transcription-service.d.cts.map +1 -0
- package/dist/transcription-service/transcription-service.d.mts +14 -0
- package/dist/transcription-service/transcription-service.d.mts.map +1 -0
- package/dist/transcription-service/transcription-service.mjs +6 -0
- package/dist/transcription-service/transcription-service.mjs.map +1 -0
- package/package.json +19 -16
- package/tsdown.config.ts +16 -0
- package/dist/chunk-A22ZUI3P.mjs +0 -1054
- package/dist/chunk-A22ZUI3P.mjs.map +0 -1
- package/dist/express.d.ts +0 -19
- package/dist/express.js +0 -1292
- package/dist/express.js.map +0 -1
- package/dist/express.mjs.map +0 -1
- package/dist/index.d.ts +0 -139
- package/dist/index.js +0 -1387
- package/dist/index.js.map +0 -1
- package/dist/index.mjs.map +0 -1
- package/dist/runtime-BsuyYT2l.d.mts +0 -98
- package/dist/runtime-BsuyYT2l.d.ts +0 -98
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
11
|
+
key = keys[i];
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except) {
|
|
13
|
+
__defProp(to, key, {
|
|
14
|
+
get: ((k) => from[k]).bind(null, key),
|
|
15
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
23
|
+
value: mod,
|
|
24
|
+
enumerable: true
|
|
25
|
+
}) : target, mod));
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
|
|
29
|
+
exports.__toESM = __toESM;
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
const require_handle_run = require('../handlers/handle-run.cjs');
|
|
3
|
+
const require_get_runtime_info = require('../handlers/get-runtime-info.cjs');
|
|
4
|
+
const require_handle_transcribe = require('../handlers/handle-transcribe.cjs');
|
|
5
|
+
const require_middleware = require('../middleware.cjs');
|
|
6
|
+
const require_handle_connect = require('../handlers/handle-connect.cjs');
|
|
7
|
+
const require_handle_stop = require('../handlers/handle-stop.cjs');
|
|
8
|
+
const require_single_route_helpers = require('./single-route-helpers.cjs');
|
|
9
|
+
const require_express_utils = require('./express-utils.cjs');
|
|
10
|
+
let _copilotkitnext_shared = require("@copilotkitnext/shared");
|
|
11
|
+
let express = require("express");
|
|
12
|
+
express = require_runtime.__toESM(express);
|
|
13
|
+
let cors = require("cors");
|
|
14
|
+
cors = require_runtime.__toESM(cors);
|
|
15
|
+
|
|
16
|
+
//#region src/endpoints/express-single.ts
|
|
17
|
+
function createCopilotEndpointSingleRouteExpress({ runtime, basePath }) {
|
|
18
|
+
const router = express.default.Router();
|
|
19
|
+
const routePath = normalizeSingleRoutePath(basePath);
|
|
20
|
+
router.use((0, cors.default)({
|
|
21
|
+
origin: "*",
|
|
22
|
+
methods: [
|
|
23
|
+
"GET",
|
|
24
|
+
"HEAD",
|
|
25
|
+
"PUT",
|
|
26
|
+
"POST",
|
|
27
|
+
"DELETE",
|
|
28
|
+
"PATCH",
|
|
29
|
+
"OPTIONS"
|
|
30
|
+
],
|
|
31
|
+
allowedHeaders: ["*"]
|
|
32
|
+
}));
|
|
33
|
+
router.post(routePath, createSingleRouteHandler(runtime));
|
|
34
|
+
router.use((req, res) => {
|
|
35
|
+
res.status(404).json({ error: "Not found" });
|
|
36
|
+
});
|
|
37
|
+
return router;
|
|
38
|
+
}
|
|
39
|
+
function createSingleRouteHandler(runtime) {
|
|
40
|
+
return async (req, res, next) => {
|
|
41
|
+
const path = req.originalUrl ?? req.path;
|
|
42
|
+
let request = require_express_utils.createFetchRequestFromExpress(req);
|
|
43
|
+
try {
|
|
44
|
+
const maybeModifiedRequest = await require_middleware.callBeforeRequestMiddleware({
|
|
45
|
+
runtime,
|
|
46
|
+
request,
|
|
47
|
+
path
|
|
48
|
+
});
|
|
49
|
+
if (maybeModifiedRequest) request = maybeModifiedRequest;
|
|
50
|
+
} catch (error) {
|
|
51
|
+
_copilotkitnext_shared.logger.error({
|
|
52
|
+
err: error,
|
|
53
|
+
url: request.url,
|
|
54
|
+
path
|
|
55
|
+
}, "Error running before request middleware");
|
|
56
|
+
if (error instanceof Response) {
|
|
57
|
+
try {
|
|
58
|
+
await require_express_utils.sendFetchResponse(res, error);
|
|
59
|
+
} catch (streamError) {
|
|
60
|
+
next(streamError);
|
|
61
|
+
}
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
next(error);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
let methodCall;
|
|
68
|
+
try {
|
|
69
|
+
methodCall = await require_single_route_helpers.parseMethodCall(request);
|
|
70
|
+
} catch (error) {
|
|
71
|
+
if (error instanceof Response) {
|
|
72
|
+
_copilotkitnext_shared.logger.warn({ url: request.url }, "Invalid single-route payload");
|
|
73
|
+
try {
|
|
74
|
+
await require_express_utils.sendFetchResponse(res, error);
|
|
75
|
+
} catch (streamError) {
|
|
76
|
+
next(streamError);
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
_copilotkitnext_shared.logger.warn({
|
|
81
|
+
err: error,
|
|
82
|
+
url: request.url
|
|
83
|
+
}, "Invalid single-route payload");
|
|
84
|
+
res.status(400).json({
|
|
85
|
+
error: "invalid_request",
|
|
86
|
+
message: error instanceof Error ? error.message : "Invalid request payload"
|
|
87
|
+
});
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
let response;
|
|
92
|
+
switch (methodCall.method) {
|
|
93
|
+
case "agent/run": {
|
|
94
|
+
const agentId = require_single_route_helpers.expectString(methodCall.params, "agentId");
|
|
95
|
+
response = await require_handle_run.handleRunAgent({
|
|
96
|
+
runtime,
|
|
97
|
+
request: require_single_route_helpers.createJsonRequest(request, methodCall.body),
|
|
98
|
+
agentId
|
|
99
|
+
});
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case "agent/connect": {
|
|
103
|
+
const agentId = require_single_route_helpers.expectString(methodCall.params, "agentId");
|
|
104
|
+
response = await require_handle_connect.handleConnectAgent({
|
|
105
|
+
runtime,
|
|
106
|
+
request: require_single_route_helpers.createJsonRequest(request, methodCall.body),
|
|
107
|
+
agentId
|
|
108
|
+
});
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case "agent/stop": {
|
|
112
|
+
const agentId = require_single_route_helpers.expectString(methodCall.params, "agentId");
|
|
113
|
+
const threadId = require_single_route_helpers.expectString(methodCall.params, "threadId");
|
|
114
|
+
response = await require_handle_stop.handleStopAgent({
|
|
115
|
+
runtime,
|
|
116
|
+
request,
|
|
117
|
+
agentId,
|
|
118
|
+
threadId
|
|
119
|
+
});
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
case "info":
|
|
123
|
+
response = await require_get_runtime_info.handleGetRuntimeInfo({
|
|
124
|
+
runtime,
|
|
125
|
+
request
|
|
126
|
+
});
|
|
127
|
+
break;
|
|
128
|
+
case "transcribe":
|
|
129
|
+
response = await require_handle_transcribe.handleTranscribe({
|
|
130
|
+
runtime,
|
|
131
|
+
request: require_single_route_helpers.createJsonRequest(request, methodCall.body)
|
|
132
|
+
});
|
|
133
|
+
break;
|
|
134
|
+
default: return methodCall.method;
|
|
135
|
+
}
|
|
136
|
+
await require_express_utils.sendFetchResponse(res, response);
|
|
137
|
+
require_middleware.callAfterRequestMiddleware({
|
|
138
|
+
runtime,
|
|
139
|
+
response,
|
|
140
|
+
path
|
|
141
|
+
}).catch((error) => {
|
|
142
|
+
_copilotkitnext_shared.logger.error({
|
|
143
|
+
err: error,
|
|
144
|
+
url: req.originalUrl ?? req.url,
|
|
145
|
+
path
|
|
146
|
+
}, "Error running after request middleware");
|
|
147
|
+
});
|
|
148
|
+
} catch (error) {
|
|
149
|
+
if (error instanceof Response) {
|
|
150
|
+
try {
|
|
151
|
+
await require_express_utils.sendFetchResponse(res, error);
|
|
152
|
+
} catch (streamError) {
|
|
153
|
+
next(streamError);
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
require_middleware.callAfterRequestMiddleware({
|
|
157
|
+
runtime,
|
|
158
|
+
response: error,
|
|
159
|
+
path
|
|
160
|
+
}).catch((mwError) => {
|
|
161
|
+
_copilotkitnext_shared.logger.error({
|
|
162
|
+
err: mwError,
|
|
163
|
+
url: req.originalUrl ?? req.url,
|
|
164
|
+
path
|
|
165
|
+
}, "Error running after request middleware");
|
|
166
|
+
});
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
_copilotkitnext_shared.logger.error({
|
|
170
|
+
err: error,
|
|
171
|
+
url: request.url,
|
|
172
|
+
path
|
|
173
|
+
}, "Error running single-route handler");
|
|
174
|
+
next(error);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function normalizeSingleRoutePath(path) {
|
|
179
|
+
if (!path) throw new Error("basePath must be provided for Express single-route endpoint");
|
|
180
|
+
if (!path.startsWith("/")) return `/${path}`;
|
|
181
|
+
if (path.length > 1 && path.endsWith("/")) return path.slice(0, -1);
|
|
182
|
+
return path;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
//#endregion
|
|
186
|
+
exports.createCopilotEndpointSingleRouteExpress = createCopilotEndpointSingleRouteExpress;
|
|
187
|
+
//# sourceMappingURL=express-single.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-single.cjs","names":["createFetchRequestFromExpress","callBeforeRequestMiddleware","sendFetchResponse","parseMethodCall","expectString","handleRunAgent","createJsonRequest","handleConnectAgent","handleStopAgent","handleGetRuntimeInfo","handleTranscribe"],"sources":["../../src/endpoints/express-single.ts"],"sourcesContent":["import express from \"express\";\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Router,\n} from \"express\";\nimport cors from \"cors\";\n\nimport { CopilotRuntime } from \"../runtime\";\nimport { handleRunAgent } from \"../handlers/handle-run\";\nimport { handleConnectAgent } from \"../handlers/handle-connect\";\nimport { handleStopAgent } from \"../handlers/handle-stop\";\nimport { handleGetRuntimeInfo } from \"../handlers/get-runtime-info\";\nimport { handleTranscribe } from \"../handlers/handle-transcribe\";\nimport { logger } from \"@copilotkitnext/shared\";\nimport {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"../middleware\";\nimport {\n createFetchRequestFromExpress,\n sendFetchResponse,\n} from \"./express-utils\";\nimport {\n createJsonRequest,\n expectString,\n MethodCall,\n parseMethodCall,\n} from \"./single-route-helpers\";\n\ninterface CopilotSingleRouteExpressParams {\n runtime: CopilotRuntime;\n basePath: string;\n}\n\nexport function createCopilotEndpointSingleRouteExpress({\n runtime,\n basePath,\n}: CopilotSingleRouteExpressParams): Router {\n const router = express.Router();\n const routePath = normalizeSingleRoutePath(basePath);\n\n router.use(\n cors({\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\"*\"],\n }),\n );\n\n router.post(routePath, createSingleRouteHandler(runtime));\n\n router.use((req, res) => {\n res.status(404).json({ error: \"Not found\" });\n });\n\n return router;\n}\n\nfunction createSingleRouteHandler(runtime: CopilotRuntime) {\n return async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction,\n ) => {\n const path = req.originalUrl ?? req.path;\n let request = createFetchRequestFromExpress(req);\n\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n request = maybeModifiedRequest;\n }\n } catch (error) {\n logger.error(\n { err: error, url: request.url, path },\n \"Error running before request middleware\",\n );\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n next(error);\n return;\n }\n\n let methodCall: MethodCall;\n try {\n methodCall = await parseMethodCall(request);\n } catch (error) {\n if (error instanceof Response) {\n logger.warn({ url: request.url }, \"Invalid single-route payload\");\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n logger.warn(\n { err: error, url: request.url },\n \"Invalid single-route payload\",\n );\n res.status(400).json({\n error: \"invalid_request\",\n message:\n error instanceof Error ? error.message : \"Invalid request payload\",\n });\n return;\n }\n\n try {\n let response: Response;\n switch (methodCall.method) {\n case \"agent/run\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleRunAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/connect\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleConnectAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/stop\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const threadId = expectString(methodCall.params, \"threadId\");\n response = await handleStopAgent({\n runtime,\n request,\n agentId,\n threadId,\n });\n break;\n }\n case \"info\": {\n response = await handleGetRuntimeInfo({ runtime, request });\n break;\n }\n case \"transcribe\": {\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleTranscribe({\n runtime,\n request: handlerRequest,\n });\n break;\n }\n default: {\n const exhaustive: never = methodCall.method;\n return exhaustive;\n }\n }\n\n await sendFetchResponse(res, response);\n callAfterRequestMiddleware({ runtime, response, path }).catch((error) => {\n logger.error(\n { err: error, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n } catch (error) {\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n return;\n }\n callAfterRequestMiddleware({ runtime, response: error, path }).catch(\n (mwError) => {\n logger.error(\n { err: mwError, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n },\n );\n return;\n }\n logger.error(\n { err: error, url: request.url, path },\n \"Error running single-route handler\",\n );\n next(error);\n }\n };\n}\n\nfunction normalizeSingleRoutePath(path: string): string {\n if (!path) {\n throw new Error(\n \"basePath must be provided for Express single-route endpoint\",\n );\n }\n\n if (!path.startsWith(\"/\")) {\n return `/${path}`;\n }\n\n if (path.length > 1 && path.endsWith(\"/\")) {\n return path.slice(0, -1);\n }\n\n return path;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CopilotRuntime } from "../runtime.cjs";
|
|
2
|
+
import { Router } from "express";
|
|
3
|
+
|
|
4
|
+
//#region src/endpoints/express-single.d.ts
|
|
5
|
+
interface CopilotSingleRouteExpressParams {
|
|
6
|
+
runtime: CopilotRuntime;
|
|
7
|
+
basePath: string;
|
|
8
|
+
}
|
|
9
|
+
declare function createCopilotEndpointSingleRouteExpress({
|
|
10
|
+
runtime,
|
|
11
|
+
basePath
|
|
12
|
+
}: CopilotSingleRouteExpressParams): Router;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { createCopilotEndpointSingleRouteExpress };
|
|
15
|
+
//# sourceMappingURL=express-single.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-single.d.cts","names":[],"sources":["../../src/endpoints/express-single.ts"],"mappings":";;;;UA+BU,+BAAA;EACR,OAAA,EAAS,cAAA;EACT,QAAA;AAAA;AAAA,iBAGc,uCAAA,CAAA;EACd,OAAA;EACA;AAAA,GACC,+BAAA,GAAkC,MAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { CopilotRuntime } from "../runtime.mjs";
|
|
2
|
+
import { Router } from "express";
|
|
3
|
+
|
|
4
|
+
//#region src/endpoints/express-single.d.ts
|
|
5
|
+
interface CopilotSingleRouteExpressParams {
|
|
6
|
+
runtime: CopilotRuntime;
|
|
7
|
+
basePath: string;
|
|
8
|
+
}
|
|
9
|
+
declare function createCopilotEndpointSingleRouteExpress({
|
|
10
|
+
runtime,
|
|
11
|
+
basePath
|
|
12
|
+
}: CopilotSingleRouteExpressParams): Router;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { createCopilotEndpointSingleRouteExpress };
|
|
15
|
+
//# sourceMappingURL=express-single.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-single.d.mts","names":[],"sources":["../../src/endpoints/express-single.ts"],"mappings":";;;;UA+BU,+BAAA;EACR,OAAA,EAAS,cAAA;EACT,QAAA;AAAA;AAAA,iBAGc,uCAAA,CAAA;EACd,OAAA;EACA;AAAA,GACC,+BAAA,GAAkC,MAAA"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { handleRunAgent } from "../handlers/handle-run.mjs";
|
|
2
|
+
import { handleGetRuntimeInfo } from "../handlers/get-runtime-info.mjs";
|
|
3
|
+
import { handleTranscribe } from "../handlers/handle-transcribe.mjs";
|
|
4
|
+
import { callAfterRequestMiddleware, callBeforeRequestMiddleware } from "../middleware.mjs";
|
|
5
|
+
import { handleConnectAgent } from "../handlers/handle-connect.mjs";
|
|
6
|
+
import { handleStopAgent } from "../handlers/handle-stop.mjs";
|
|
7
|
+
import { createJsonRequest, expectString, parseMethodCall } from "./single-route-helpers.mjs";
|
|
8
|
+
import { createFetchRequestFromExpress, sendFetchResponse } from "./express-utils.mjs";
|
|
9
|
+
import { logger } from "@copilotkitnext/shared";
|
|
10
|
+
import express from "express";
|
|
11
|
+
import cors from "cors";
|
|
12
|
+
|
|
13
|
+
//#region src/endpoints/express-single.ts
|
|
14
|
+
function createCopilotEndpointSingleRouteExpress({ runtime, basePath }) {
|
|
15
|
+
const router = express.Router();
|
|
16
|
+
const routePath = normalizeSingleRoutePath(basePath);
|
|
17
|
+
router.use(cors({
|
|
18
|
+
origin: "*",
|
|
19
|
+
methods: [
|
|
20
|
+
"GET",
|
|
21
|
+
"HEAD",
|
|
22
|
+
"PUT",
|
|
23
|
+
"POST",
|
|
24
|
+
"DELETE",
|
|
25
|
+
"PATCH",
|
|
26
|
+
"OPTIONS"
|
|
27
|
+
],
|
|
28
|
+
allowedHeaders: ["*"]
|
|
29
|
+
}));
|
|
30
|
+
router.post(routePath, createSingleRouteHandler(runtime));
|
|
31
|
+
router.use((req, res) => {
|
|
32
|
+
res.status(404).json({ error: "Not found" });
|
|
33
|
+
});
|
|
34
|
+
return router;
|
|
35
|
+
}
|
|
36
|
+
function createSingleRouteHandler(runtime) {
|
|
37
|
+
return async (req, res, next) => {
|
|
38
|
+
const path = req.originalUrl ?? req.path;
|
|
39
|
+
let request = createFetchRequestFromExpress(req);
|
|
40
|
+
try {
|
|
41
|
+
const maybeModifiedRequest = await callBeforeRequestMiddleware({
|
|
42
|
+
runtime,
|
|
43
|
+
request,
|
|
44
|
+
path
|
|
45
|
+
});
|
|
46
|
+
if (maybeModifiedRequest) request = maybeModifiedRequest;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
logger.error({
|
|
49
|
+
err: error,
|
|
50
|
+
url: request.url,
|
|
51
|
+
path
|
|
52
|
+
}, "Error running before request middleware");
|
|
53
|
+
if (error instanceof Response) {
|
|
54
|
+
try {
|
|
55
|
+
await sendFetchResponse(res, error);
|
|
56
|
+
} catch (streamError) {
|
|
57
|
+
next(streamError);
|
|
58
|
+
}
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
next(error);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
let methodCall;
|
|
65
|
+
try {
|
|
66
|
+
methodCall = await parseMethodCall(request);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
if (error instanceof Response) {
|
|
69
|
+
logger.warn({ url: request.url }, "Invalid single-route payload");
|
|
70
|
+
try {
|
|
71
|
+
await sendFetchResponse(res, error);
|
|
72
|
+
} catch (streamError) {
|
|
73
|
+
next(streamError);
|
|
74
|
+
}
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
logger.warn({
|
|
78
|
+
err: error,
|
|
79
|
+
url: request.url
|
|
80
|
+
}, "Invalid single-route payload");
|
|
81
|
+
res.status(400).json({
|
|
82
|
+
error: "invalid_request",
|
|
83
|
+
message: error instanceof Error ? error.message : "Invalid request payload"
|
|
84
|
+
});
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
try {
|
|
88
|
+
let response;
|
|
89
|
+
switch (methodCall.method) {
|
|
90
|
+
case "agent/run": {
|
|
91
|
+
const agentId = expectString(methodCall.params, "agentId");
|
|
92
|
+
response = await handleRunAgent({
|
|
93
|
+
runtime,
|
|
94
|
+
request: createJsonRequest(request, methodCall.body),
|
|
95
|
+
agentId
|
|
96
|
+
});
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case "agent/connect": {
|
|
100
|
+
const agentId = expectString(methodCall.params, "agentId");
|
|
101
|
+
response = await handleConnectAgent({
|
|
102
|
+
runtime,
|
|
103
|
+
request: createJsonRequest(request, methodCall.body),
|
|
104
|
+
agentId
|
|
105
|
+
});
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
case "agent/stop": {
|
|
109
|
+
const agentId = expectString(methodCall.params, "agentId");
|
|
110
|
+
const threadId = expectString(methodCall.params, "threadId");
|
|
111
|
+
response = await handleStopAgent({
|
|
112
|
+
runtime,
|
|
113
|
+
request,
|
|
114
|
+
agentId,
|
|
115
|
+
threadId
|
|
116
|
+
});
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case "info":
|
|
120
|
+
response = await handleGetRuntimeInfo({
|
|
121
|
+
runtime,
|
|
122
|
+
request
|
|
123
|
+
});
|
|
124
|
+
break;
|
|
125
|
+
case "transcribe":
|
|
126
|
+
response = await handleTranscribe({
|
|
127
|
+
runtime,
|
|
128
|
+
request: createJsonRequest(request, methodCall.body)
|
|
129
|
+
});
|
|
130
|
+
break;
|
|
131
|
+
default: return methodCall.method;
|
|
132
|
+
}
|
|
133
|
+
await sendFetchResponse(res, response);
|
|
134
|
+
callAfterRequestMiddleware({
|
|
135
|
+
runtime,
|
|
136
|
+
response,
|
|
137
|
+
path
|
|
138
|
+
}).catch((error) => {
|
|
139
|
+
logger.error({
|
|
140
|
+
err: error,
|
|
141
|
+
url: req.originalUrl ?? req.url,
|
|
142
|
+
path
|
|
143
|
+
}, "Error running after request middleware");
|
|
144
|
+
});
|
|
145
|
+
} catch (error) {
|
|
146
|
+
if (error instanceof Response) {
|
|
147
|
+
try {
|
|
148
|
+
await sendFetchResponse(res, error);
|
|
149
|
+
} catch (streamError) {
|
|
150
|
+
next(streamError);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
callAfterRequestMiddleware({
|
|
154
|
+
runtime,
|
|
155
|
+
response: error,
|
|
156
|
+
path
|
|
157
|
+
}).catch((mwError) => {
|
|
158
|
+
logger.error({
|
|
159
|
+
err: mwError,
|
|
160
|
+
url: req.originalUrl ?? req.url,
|
|
161
|
+
path
|
|
162
|
+
}, "Error running after request middleware");
|
|
163
|
+
});
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
logger.error({
|
|
167
|
+
err: error,
|
|
168
|
+
url: request.url,
|
|
169
|
+
path
|
|
170
|
+
}, "Error running single-route handler");
|
|
171
|
+
next(error);
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function normalizeSingleRoutePath(path) {
|
|
176
|
+
if (!path) throw new Error("basePath must be provided for Express single-route endpoint");
|
|
177
|
+
if (!path.startsWith("/")) return `/${path}`;
|
|
178
|
+
if (path.length > 1 && path.endsWith("/")) return path.slice(0, -1);
|
|
179
|
+
return path;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//#endregion
|
|
183
|
+
export { createCopilotEndpointSingleRouteExpress };
|
|
184
|
+
//# sourceMappingURL=express-single.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-single.mjs","names":[],"sources":["../../src/endpoints/express-single.ts"],"sourcesContent":["import express from \"express\";\nimport type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n NextFunction,\n Router,\n} from \"express\";\nimport cors from \"cors\";\n\nimport { CopilotRuntime } from \"../runtime\";\nimport { handleRunAgent } from \"../handlers/handle-run\";\nimport { handleConnectAgent } from \"../handlers/handle-connect\";\nimport { handleStopAgent } from \"../handlers/handle-stop\";\nimport { handleGetRuntimeInfo } from \"../handlers/get-runtime-info\";\nimport { handleTranscribe } from \"../handlers/handle-transcribe\";\nimport { logger } from \"@copilotkitnext/shared\";\nimport {\n callBeforeRequestMiddleware,\n callAfterRequestMiddleware,\n} from \"../middleware\";\nimport {\n createFetchRequestFromExpress,\n sendFetchResponse,\n} from \"./express-utils\";\nimport {\n createJsonRequest,\n expectString,\n MethodCall,\n parseMethodCall,\n} from \"./single-route-helpers\";\n\ninterface CopilotSingleRouteExpressParams {\n runtime: CopilotRuntime;\n basePath: string;\n}\n\nexport function createCopilotEndpointSingleRouteExpress({\n runtime,\n basePath,\n}: CopilotSingleRouteExpressParams): Router {\n const router = express.Router();\n const routePath = normalizeSingleRoutePath(basePath);\n\n router.use(\n cors({\n origin: \"*\",\n methods: [\"GET\", \"HEAD\", \"PUT\", \"POST\", \"DELETE\", \"PATCH\", \"OPTIONS\"],\n allowedHeaders: [\"*\"],\n }),\n );\n\n router.post(routePath, createSingleRouteHandler(runtime));\n\n router.use((req, res) => {\n res.status(404).json({ error: \"Not found\" });\n });\n\n return router;\n}\n\nfunction createSingleRouteHandler(runtime: CopilotRuntime) {\n return async (\n req: ExpressRequest,\n res: ExpressResponse,\n next: NextFunction,\n ) => {\n const path = req.originalUrl ?? req.path;\n let request = createFetchRequestFromExpress(req);\n\n try {\n const maybeModifiedRequest = await callBeforeRequestMiddleware({\n runtime,\n request,\n path,\n });\n if (maybeModifiedRequest) {\n request = maybeModifiedRequest;\n }\n } catch (error) {\n logger.error(\n { err: error, url: request.url, path },\n \"Error running before request middleware\",\n );\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n next(error);\n return;\n }\n\n let methodCall: MethodCall;\n try {\n methodCall = await parseMethodCall(request);\n } catch (error) {\n if (error instanceof Response) {\n logger.warn({ url: request.url }, \"Invalid single-route payload\");\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n }\n return;\n }\n logger.warn(\n { err: error, url: request.url },\n \"Invalid single-route payload\",\n );\n res.status(400).json({\n error: \"invalid_request\",\n message:\n error instanceof Error ? error.message : \"Invalid request payload\",\n });\n return;\n }\n\n try {\n let response: Response;\n switch (methodCall.method) {\n case \"agent/run\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleRunAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/connect\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleConnectAgent({\n runtime,\n request: handlerRequest,\n agentId,\n });\n break;\n }\n case \"agent/stop\": {\n const agentId = expectString(methodCall.params, \"agentId\");\n const threadId = expectString(methodCall.params, \"threadId\");\n response = await handleStopAgent({\n runtime,\n request,\n agentId,\n threadId,\n });\n break;\n }\n case \"info\": {\n response = await handleGetRuntimeInfo({ runtime, request });\n break;\n }\n case \"transcribe\": {\n const handlerRequest = createJsonRequest(request, methodCall.body);\n response = await handleTranscribe({\n runtime,\n request: handlerRequest,\n });\n break;\n }\n default: {\n const exhaustive: never = methodCall.method;\n return exhaustive;\n }\n }\n\n await sendFetchResponse(res, response);\n callAfterRequestMiddleware({ runtime, response, path }).catch((error) => {\n logger.error(\n { err: error, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n });\n } catch (error) {\n if (error instanceof Response) {\n try {\n await sendFetchResponse(res, error);\n } catch (streamError) {\n next(streamError);\n return;\n }\n callAfterRequestMiddleware({ runtime, response: error, path }).catch(\n (mwError) => {\n logger.error(\n { err: mwError, url: req.originalUrl ?? req.url, path },\n \"Error running after request middleware\",\n );\n },\n );\n return;\n }\n logger.error(\n { err: error, url: request.url, path },\n \"Error running single-route handler\",\n );\n next(error);\n }\n };\n}\n\nfunction normalizeSingleRoutePath(path: string): string {\n if (!path) {\n throw new Error(\n \"basePath must be provided for Express single-route endpoint\",\n );\n }\n\n if (!path.startsWith(\"/\")) {\n return `/${path}`;\n }\n\n if (path.length > 1 && path.endsWith(\"/\")) {\n return path.slice(0, -1);\n }\n\n return path;\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
|
|
2
|
+
let _copilotkitnext_shared = require("@copilotkitnext/shared");
|
|
3
|
+
let node_stream = require("node:stream");
|
|
4
|
+
let node_util = require("node:util");
|
|
5
|
+
|
|
6
|
+
//#region src/endpoints/express-utils.ts
|
|
7
|
+
const streamPipeline = (0, node_util.promisify)(node_stream.pipeline);
|
|
8
|
+
const METHODS_WITHOUT_BODY = new Set(["GET", "HEAD"]);
|
|
9
|
+
function createFetchRequestFromExpress(req) {
|
|
10
|
+
const method = req.method?.toUpperCase() ?? "GET";
|
|
11
|
+
const url = `${buildOrigin(req)}${req.originalUrl ?? req.url ?? ""}`;
|
|
12
|
+
const headers = new Headers();
|
|
13
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
14
|
+
if (value === void 0) continue;
|
|
15
|
+
if (Array.isArray(value)) value.forEach((v) => headers.append(key, v));
|
|
16
|
+
else headers.set(key, value);
|
|
17
|
+
}
|
|
18
|
+
const init = {
|
|
19
|
+
method,
|
|
20
|
+
headers
|
|
21
|
+
};
|
|
22
|
+
const hasParsedBody = req.body !== void 0 && req.body !== null;
|
|
23
|
+
const streamConsumed = isStreamConsumed(req, hasParsedBody);
|
|
24
|
+
if (!METHODS_WITHOUT_BODY.has(method)) if (req.readable !== false && !streamConsumed) {
|
|
25
|
+
init.body = node_stream.Readable.toWeb(req);
|
|
26
|
+
init.duplex = "half";
|
|
27
|
+
} else if (hasParsedBody) {
|
|
28
|
+
const { body, contentType } = synthesizeBody(req.body);
|
|
29
|
+
if (contentType) headers.set("content-type", contentType);
|
|
30
|
+
headers.delete("content-length");
|
|
31
|
+
if (body !== void 0) init.body = body;
|
|
32
|
+
_copilotkitnext_shared.logger.info({
|
|
33
|
+
url,
|
|
34
|
+
method,
|
|
35
|
+
readable: req.readable,
|
|
36
|
+
readableEnded: req.readableEnded,
|
|
37
|
+
complete: req.complete
|
|
38
|
+
}, "Express request stream already consumed; synthesized body from parsed content");
|
|
39
|
+
} else {
|
|
40
|
+
headers.delete("content-length");
|
|
41
|
+
_copilotkitnext_shared.logger.warn({
|
|
42
|
+
url,
|
|
43
|
+
method
|
|
44
|
+
}, "Request stream already consumed but no body was available; sending empty body");
|
|
45
|
+
}
|
|
46
|
+
const controller = new AbortController();
|
|
47
|
+
const abort = () => controller.abort();
|
|
48
|
+
req.on("aborted", abort);
|
|
49
|
+
req.on("error", abort);
|
|
50
|
+
req.on("close", () => {
|
|
51
|
+
if (req.aborted) abort();
|
|
52
|
+
});
|
|
53
|
+
init.signal = controller.signal;
|
|
54
|
+
try {
|
|
55
|
+
return new Request(url, init);
|
|
56
|
+
} catch (error) {
|
|
57
|
+
if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {
|
|
58
|
+
headers.delete("content-length");
|
|
59
|
+
delete init.duplex;
|
|
60
|
+
if (hasParsedBody) {
|
|
61
|
+
const { body, contentType } = synthesizeBody(req.body);
|
|
62
|
+
if (contentType) headers.set("content-type", contentType);
|
|
63
|
+
init.body = body;
|
|
64
|
+
_copilotkitnext_shared.logger.info({
|
|
65
|
+
url,
|
|
66
|
+
method
|
|
67
|
+
}, "Request stream disturbed while constructing Request; reused parsed body");
|
|
68
|
+
} else {
|
|
69
|
+
init.body = void 0;
|
|
70
|
+
_copilotkitnext_shared.logger.warn({
|
|
71
|
+
url,
|
|
72
|
+
method
|
|
73
|
+
}, "Request stream was disturbed; falling back to empty body");
|
|
74
|
+
}
|
|
75
|
+
return new Request(url, init);
|
|
76
|
+
}
|
|
77
|
+
throw error;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function sendFetchResponse(res, response) {
|
|
81
|
+
res.status(response.status);
|
|
82
|
+
response.headers.forEach((value, key) => {
|
|
83
|
+
if (key.toLowerCase() === "content-length" && response.body !== null) return;
|
|
84
|
+
res.setHeader(key, value);
|
|
85
|
+
});
|
|
86
|
+
if (!response.body) {
|
|
87
|
+
res.end();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const nodeStream = node_stream.Readable.fromWeb(response.body);
|
|
91
|
+
try {
|
|
92
|
+
await streamPipeline(nodeStream, res);
|
|
93
|
+
} catch (error) {
|
|
94
|
+
res.destroy(error);
|
|
95
|
+
throw error;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function buildOrigin(req) {
|
|
99
|
+
return `${req.protocol || (req.secure ? "https" : "http")}://${req.get("host") ?? "localhost"}`;
|
|
100
|
+
}
|
|
101
|
+
function isStreamConsumed(req, hasParsedBody) {
|
|
102
|
+
const state = req._readableState;
|
|
103
|
+
return Boolean(hasParsedBody || req.readableEnded || req.complete || state?.ended || state?.endEmitted);
|
|
104
|
+
}
|
|
105
|
+
function synthesizeBody(body) {
|
|
106
|
+
if (Buffer.isBuffer(body) || body instanceof Uint8Array) return { body };
|
|
107
|
+
if (typeof body === "string") return { body };
|
|
108
|
+
if (typeof body === "object" && body !== void 0) return {
|
|
109
|
+
body: JSON.stringify(body),
|
|
110
|
+
contentType: "application/json"
|
|
111
|
+
};
|
|
112
|
+
return {};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//#endregion
|
|
116
|
+
exports.createFetchRequestFromExpress = createFetchRequestFromExpress;
|
|
117
|
+
exports.sendFetchResponse = sendFetchResponse;
|
|
118
|
+
//# sourceMappingURL=express-utils.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-utils.cjs","names":["pipeline","Readable"],"sources":["../../src/endpoints/express-utils.ts"],"sourcesContent":["import type {\n Request as ExpressRequest,\n Response as ExpressResponse,\n} from \"express\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream\";\nimport { promisify } from \"node:util\";\nimport { logger } from \"@copilotkitnext/shared\";\n\nconst streamPipeline = promisify(pipeline);\n\nconst METHODS_WITHOUT_BODY = new Set([\"GET\", \"HEAD\"]);\n\nexport function createFetchRequestFromExpress(req: ExpressRequest): Request {\n const method = req.method?.toUpperCase() ?? \"GET\";\n const origin = buildOrigin(req);\n const url = `${origin}${req.originalUrl ?? req.url ?? \"\"}`;\n\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n value.forEach((v) => headers.append(key, v));\n } else {\n headers.set(key, value);\n }\n }\n\n const init: RequestInit & { duplex?: \"half\" } = {\n method,\n headers,\n };\n\n const hasParsedBody = req.body !== undefined && req.body !== null;\n const streamConsumed = isStreamConsumed(req, hasParsedBody);\n\n if (!METHODS_WITHOUT_BODY.has(method)) {\n const canStreamBody = req.readable !== false && !streamConsumed;\n\n if (canStreamBody) {\n init.body = Readable.toWeb(req) as unknown as BodyInit;\n init.duplex = \"half\";\n } else if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n headers.delete(\"content-length\");\n if (body !== undefined) {\n init.body = body;\n }\n logger.info(\n {\n url,\n method,\n readable: req.readable,\n readableEnded: req.readableEnded,\n complete: req.complete,\n },\n \"Express request stream already consumed; synthesized body from parsed content\",\n );\n } else {\n headers.delete(\"content-length\");\n logger.warn(\n { url, method },\n \"Request stream already consumed but no body was available; sending empty body\",\n );\n }\n }\n\n const controller = new AbortController();\n const abort = () => controller.abort();\n req.on(\"aborted\", abort);\n req.on(\"error\", abort);\n req.on(\"close\", () => {\n if (req.aborted) {\n abort();\n }\n });\n init.signal = controller.signal;\n\n try {\n return new Request(url, init);\n } catch (error) {\n if (error instanceof TypeError && /disturbed|locked/i.test(error.message)) {\n // Fallback to synthesized/empty body when the stream was already consumed.\n headers.delete(\"content-length\");\n delete init.duplex;\n\n if (hasParsedBody) {\n const { body, contentType } = synthesizeBody(req.body);\n if (contentType) {\n headers.set(\"content-type\", contentType);\n }\n init.body = body;\n logger.info(\n { url, method },\n \"Request stream disturbed while constructing Request; reused parsed body\",\n );\n } else {\n init.body = undefined;\n logger.warn(\n { url, method },\n \"Request stream was disturbed; falling back to empty body\",\n );\n }\n\n return new Request(url, init);\n }\n throw error;\n }\n}\n\nexport async function sendFetchResponse(\n res: ExpressResponse,\n response: Response,\n): Promise<void> {\n res.status(response.status);\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() === \"content-length\" && response.body !== null) {\n return;\n }\n res.setHeader(key, value);\n });\n\n if (!response.body) {\n res.end();\n return;\n }\n\n const nodeStream = Readable.fromWeb(response.body as any);\n try {\n await streamPipeline(nodeStream, res);\n } catch (error) {\n res.destroy(error as Error);\n throw error;\n }\n}\n\nfunction buildOrigin(req: ExpressRequest): string {\n const protocol = req.protocol || (req.secure ? \"https\" : \"http\");\n const host = req.get(\"host\") ?? \"localhost\";\n return `${protocol}://${host}`;\n}\n\nfunction isStreamConsumed(\n req: ExpressRequest,\n hasParsedBody: boolean,\n): boolean {\n const state = (\n req as unknown as {\n _readableState?: { ended?: boolean; endEmitted?: boolean };\n }\n )._readableState;\n return Boolean(\n hasParsedBody ||\n req.readableEnded ||\n req.complete ||\n state?.ended ||\n state?.endEmitted,\n );\n}\n\nfunction synthesizeBody(body: unknown): {\n body?: BodyInit;\n contentType?: string;\n} {\n if (Buffer.isBuffer(body) || body instanceof Uint8Array) {\n return { body };\n }\n\n if (typeof body === \"string\") {\n return { body };\n }\n\n if (typeof body === \"object\" && body !== undefined) {\n return { body: JSON.stringify(body), contentType: \"application/json\" };\n }\n\n return {};\n}\n"],"mappings":";;;;;;AASA,MAAM,0CAA2BA,qBAAS;AAE1C,MAAM,uBAAuB,IAAI,IAAI,CAAC,OAAO,OAAO,CAAC;AAErD,SAAgB,8BAA8B,KAA8B;CAC1E,MAAM,SAAS,IAAI,QAAQ,aAAa,IAAI;CAE5C,MAAM,MAAM,GADG,YAAY,IAAI,GACP,IAAI,eAAe,IAAI,OAAO;CAEtD,MAAM,UAAU,IAAI,SAAS;AAC7B,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,IAAI,QAAQ,EAAE;AACtD,MAAI,UAAU,OAAW;AACzB,MAAI,MAAM,QAAQ,MAAM,CACtB,OAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,EAAE,CAAC;MAE5C,SAAQ,IAAI,KAAK,MAAM;;CAI3B,MAAM,OAA0C;EAC9C;EACA;EACD;CAED,MAAM,gBAAgB,IAAI,SAAS,UAAa,IAAI,SAAS;CAC7D,MAAM,iBAAiB,iBAAiB,KAAK,cAAc;AAE3D,KAAI,CAAC,qBAAqB,IAAI,OAAO,CAGnC,KAFsB,IAAI,aAAa,SAAS,CAAC,gBAE9B;AACjB,OAAK,OAAOC,qBAAS,MAAM,IAAI;AAC/B,OAAK,SAAS;YACL,eAAe;EACxB,MAAM,EAAE,MAAM,gBAAgB,eAAe,IAAI,KAAK;AACtD,MAAI,YACF,SAAQ,IAAI,gBAAgB,YAAY;AAE1C,UAAQ,OAAO,iBAAiB;AAChC,MAAI,SAAS,OACX,MAAK,OAAO;AAEd,gCAAO,KACL;GACE;GACA;GACA,UAAU,IAAI;GACd,eAAe,IAAI;GACnB,UAAU,IAAI;GACf,EACD,gFACD;QACI;AACL,UAAQ,OAAO,iBAAiB;AAChC,gCAAO,KACL;GAAE;GAAK;GAAQ,EACf,gFACD;;CAIL,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,cAAc,WAAW,OAAO;AACtC,KAAI,GAAG,WAAW,MAAM;AACxB,KAAI,GAAG,SAAS,MAAM;AACtB,KAAI,GAAG,eAAe;AACpB,MAAI,IAAI,QACN,QAAO;GAET;AACF,MAAK,SAAS,WAAW;AAEzB,KAAI;AACF,SAAO,IAAI,QAAQ,KAAK,KAAK;UACtB,OAAO;AACd,MAAI,iBAAiB,aAAa,oBAAoB,KAAK,MAAM,QAAQ,EAAE;AAEzE,WAAQ,OAAO,iBAAiB;AAChC,UAAO,KAAK;AAEZ,OAAI,eAAe;IACjB,MAAM,EAAE,MAAM,gBAAgB,eAAe,IAAI,KAAK;AACtD,QAAI,YACF,SAAQ,IAAI,gBAAgB,YAAY;AAE1C,SAAK,OAAO;AACZ,kCAAO,KACL;KAAE;KAAK;KAAQ,EACf,0EACD;UACI;AACL,SAAK,OAAO;AACZ,kCAAO,KACL;KAAE;KAAK;KAAQ,EACf,2DACD;;AAGH,UAAO,IAAI,QAAQ,KAAK,KAAK;;AAE/B,QAAM;;;AAIV,eAAsB,kBACpB,KACA,UACe;AACf,KAAI,OAAO,SAAS,OAAO;AAE3B,UAAS,QAAQ,SAAS,OAAO,QAAQ;AACvC,MAAI,IAAI,aAAa,KAAK,oBAAoB,SAAS,SAAS,KAC9D;AAEF,MAAI,UAAU,KAAK,MAAM;GACzB;AAEF,KAAI,CAAC,SAAS,MAAM;AAClB,MAAI,KAAK;AACT;;CAGF,MAAM,aAAaA,qBAAS,QAAQ,SAAS,KAAY;AACzD,KAAI;AACF,QAAM,eAAe,YAAY,IAAI;UAC9B,OAAO;AACd,MAAI,QAAQ,MAAe;AAC3B,QAAM;;;AAIV,SAAS,YAAY,KAA6B;AAGhD,QAAO,GAFU,IAAI,aAAa,IAAI,SAAS,UAAU,QAEtC,KADN,IAAI,IAAI,OAAO,IAAI;;AAIlC,SAAS,iBACP,KACA,eACS;CACT,MAAM,QACJ,IAGA;AACF,QAAO,QACL,iBACA,IAAI,iBACJ,IAAI,YACJ,OAAO,SACP,OAAO,WACR;;AAGH,SAAS,eAAe,MAGtB;AACA,KAAI,OAAO,SAAS,KAAK,IAAI,gBAAgB,WAC3C,QAAO,EAAE,MAAM;AAGjB,KAAI,OAAO,SAAS,SAClB,QAAO,EAAE,MAAM;AAGjB,KAAI,OAAO,SAAS,YAAY,SAAS,OACvC,QAAO;EAAE,MAAM,KAAK,UAAU,KAAK;EAAE,aAAa;EAAoB;AAGxE,QAAO,EAAE"}
|