eve
Version:
Filesystem-first framework for durable backend AI agents that run anywhere.
54 lines (42 loc) • 3.82 kB
JavaScript
import{join}from"node:path";import{readFile,writeFile}from"node:fs/promises";const EVE_SHARED_SERVER_FUNCTION_PATH=`eve/__server.func`,EVE_SERVICE_ROUTE_PREFIX_WRAPPER=`index.__eve_service_route_prefix.mjs`,EVE_VERCEL_FUNCTION_PREFIXES=[`eve/`,`.well-known/workflow/`];function isRecord(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function isEveVercelFunctionPath(e){return EVE_VERCEL_FUNCTION_PREFIXES.some(t=>e.startsWith(t))}function normalizeEveVercelRoutes(e,t){return e.filter(isEveVercelRoute).map(e=>normalizeEveVercelRoute(e,t))}function isEveVercelRoute(e){if(!isRecord(e)||`handle`in e)return!0;let t=typeof e.src==`string`?e.src:``,n=typeof e.dest==`string`?e.dest:``;return isEveVercelRoutePath(t)||isEveVercelRoutePath(n)}function isEveVercelRoutePath(e){return e.includes(`/eve/v1`)||e.includes(`/.well-known/workflow/`)}function isEveProtocolRoutePath(e){return e.includes(`/eve/v1`)}function normalizeEveVercelRoute(e,t){if(!isRecord(e)||`handle`in e||typeof e.src!=`string`)return e;let n=isEveProtocolRoutePath(e.src)||typeof e.dest==`string`&&isEveProtocolRoutePath(e.dest),r={...e,src:prefixEveVercelRoutePath(e.src,t)};return n&&(r.dest=`/eve/__server`),r}function prefixEveVercelRoutePath(e,t){if(t===void 0||t===`/`||!isEveVercelRoutePath(e)||e.includes(t))return e;let n=t.endsWith(`/`)?t.slice(0,-1):t,r=n.replaceAll(`/`,`\\/`);return e.includes(r)?e:e.startsWith(`^(?:/`)?`^(?:${n}${e.slice(4)}`:e.startsWith(`^/`)?`^${n}${e.slice(1)}`:e.startsWith(`/`)?`${n}${e}`:e}async function applyEveServiceRoutePrefixWrapper(r,i){let a=join(r,`.vc-config.json`),o=join(r,EVE_SERVICE_ROUTE_PREFIX_WRAPPER),s=JSON.parse(await readFile(a,`utf8`)),c=isRecord(s)?s:{};await writeFile(o,createEveServiceRoutePrefixWrapper(i)),await writeFile(a,`${JSON.stringify({...c,handler:EVE_SERVICE_ROUTE_PREFIX_WRAPPER},null,2)}\n`)}function createEveServiceRoutePrefixWrapper(e){return`
import { Server } from "node:http";
const SERVICE_PREFIX = ${JSON.stringify(normalizeServiceRoutePrefix(e))};
const PATCH_SYMBOL = Symbol.for("eve.service.route-prefix-strip.patch");
function stripServiceRoutePrefix(requestUrl) {
if (typeof requestUrl !== "string" || requestUrl === "*") {
return requestUrl;
}
const queryIndex = requestUrl.indexOf("?");
const rawPath = queryIndex === -1 ? requestUrl : requestUrl.slice(0, queryIndex);
const query = queryIndex === -1 ? "" : requestUrl.slice(queryIndex);
const path = rawPath.startsWith("/") ? rawPath : \`/\${rawPath}\`;
if (path === SERVICE_PREFIX) {
return \`/\${query}\`;
}
if (path.startsWith(\`\${SERVICE_PREFIX}/\`)) {
return path.slice(SERVICE_PREFIX.length) + query;
}
return path + query;
}
if (!globalThis[PATCH_SYMBOL]) {
globalThis[PATCH_SYMBOL] = true;
const originalEmit = Server.prototype.emit;
Server.prototype.emit = function patchedEmit(event, request, ...args) {
if ((event === "request" || event === "upgrade") && request && typeof request.url === "string") {
request.url = stripServiceRoutePrefix(request.url);
}
return originalEmit.call(this, event, request, ...args);
};
}
const originalModule = await import("./index.mjs");
const entrypoint = originalModule?.default ?? originalModule;
export const handleUpgrade = originalModule.handleUpgrade
? (request, socket, head) => {
if (request && typeof request.url === "string") {
request.url = stripServiceRoutePrefix(request.url);
}
return originalModule.handleUpgrade(request, socket, head);
}
: undefined;
export default entrypoint;
`.trimStart()}function normalizeServiceRoutePrefix(e){let t=(e.startsWith(`/`)?e:`/${e}`).replace(/\/+$/,``);return t.length===0?`/`:t}export{EVE_SHARED_SERVER_FUNCTION_PATH,applyEveServiceRoutePrefixWrapper,isEveVercelFunctionPath,normalizeEveVercelRoutes};