UNPKG

@copilotkit/runtime

Version:

<img src="https://github.com/user-attachments/assets/0a6b64d9-e193-4940-a3f6-60334ac34084" alt="banner" style="border-radius: 12px; border: 2px solid #d6d4fa;" />

87 lines (85 loc) 4.29 kB
require("reflect-metadata"); const require_hono_single = require('../../../v2/runtime/endpoints/hono-single.cjs'); const require_telemetry_client = require('../../telemetry-client.cjs'); const require_shared = require('../shared.cjs'); const require_request_handler = require('./request-handler.cjs'); //#region src/lib/integrations/node-http/index.ts function copilotRuntimeNodeHttpEndpoint(options) { const commonConfig = require_shared.getCommonConfig(options); require_telemetry_client.default.setGlobalProperties({ runtime: { framework: "node-http" } }); if (options.properties?._copilotkit) require_telemetry_client.default.setGlobalProperties({ _copilotkit: options.properties._copilotkit }); require_telemetry_client.default.capture("oss.runtime.instance_created", require_telemetry_client.getRuntimeInstanceTelemetryInfo(options)); const logger = commonConfig.logging; logger.debug("Creating Node HTTP endpoint"); const serviceAdapter = options.serviceAdapter; if (serviceAdapter) options.runtime.handleServiceAdapter(serviceAdapter); const honoApp = require_hono_single.createCopilotEndpointSingleRoute({ runtime: options.runtime.instance, basePath: options.baseUrl ?? options.endpoint, ...options.cors && { cors: options.cors } }); const handle = async function handler(req, res) { const url = require_request_handler.getFullUrl(req); const hasBody = req.method !== "GET" && req.method !== "HEAD"; const baseHeaders = require_request_handler.toHeaders(req.headers); const parsedBody = req.body; const streamConsumed = require_request_handler.isStreamConsumed(req) || parsedBody !== void 0; const canStream = hasBody && !streamConsumed; let requestBody = void 0; let useDuplex = false; if (hasBody && canStream) { requestBody = require_request_handler.nodeStreamToReadableStream(req); useDuplex = true; } if (hasBody && streamConsumed) if (parsedBody !== void 0) { const synthesized = require_request_handler.synthesizeBodyFromParsedBody(parsedBody, baseHeaders); requestBody = synthesized.body ?? void 0; baseHeaders.delete("content-length"); if (synthesized.contentType) baseHeaders.set("content-type", synthesized.contentType); logger.debug("Request stream already consumed; using parsed req.body to rebuild request."); } else { logger.warn("Request stream consumed with no available body; sending empty payload."); requestBody = void 0; } const buildRequest = (body, headers, duplex) => new Request(url, { method: req.method, headers, body, duplex: duplex ? "half" : void 0 }); let response; try { response = await honoApp.fetch(buildRequest(requestBody, baseHeaders, useDuplex)); } catch (error) { if (require_request_handler.isDisturbedOrLockedError(error) && hasBody) { logger.warn("Encountered disturbed/locked request body; rebuilding request using parsed body or empty payload."); const fallbackHeaders = new Headers(baseHeaders); let fallbackBody; if (parsedBody !== void 0) { const synthesized = require_request_handler.synthesizeBodyFromParsedBody(parsedBody, fallbackHeaders); fallbackBody = synthesized.body ?? void 0; fallbackHeaders.delete("content-length"); if (synthesized.contentType) fallbackHeaders.set("content-type", synthesized.contentType); } else fallbackBody = void 0; response = await honoApp.fetch(buildRequest(fallbackBody, fallbackHeaders, false)); } else throw error; } res.statusCode = response.status; response.headers.forEach((value, key) => { res.setHeader(key, value); }); if (response.body) require_request_handler.readableStreamToNodeStream(response.body).pipe(res); else res.end(); }; function isRequestLike(obj) { return obj instanceof Request || typeof obj === "object" && obj !== null && "url" in obj && "method" in obj && "headers" in obj && typeof obj.url === "string" && typeof obj.method === "string"; } return function(reqOrRequest, res) { if (isRequestLike(reqOrRequest) && !res) return honoApp.fetch(reqOrRequest); if (!res) throw new TypeError("ServerResponse is required for Node HTTP requests"); return handle(reqOrRequest, res); }; } //#endregion exports.copilotRuntimeNodeHttpEndpoint = copilotRuntimeNodeHttpEndpoint; //# sourceMappingURL=index.cjs.map