UNPKG

@universal-middleware/cloudflare

Version:

Cloudflare Pages adapter for universal middlewares

93 lines (91 loc) 2.77 kB
// src/common.ts import { bindUniversal, getAdapterRuntime, universalSymbol } from "@universal-middleware/core"; var contextSymbol = Symbol.for("unContext"); function createHandler(handlerFactory) { return (...args) => { const handler = handlerFactory(...args); return { fetch: bindUniversal(handler, async function universalHandlerCloudflare(request, env, ctx) { const universalContext = initContext(env); const response = await this[universalSymbol]( request, universalContext, getRuntime(env, ctx) ); return response; }) }; }; } function createPagesFunction(middlewareFactory) { return (...args) => { const middleware = middlewareFactory(...args); return bindUniversal(middleware, async function universalPagesFunctionCloudflare(context) { const universalContext = initContext(context.env); const response = await this[universalSymbol]( context.request, universalContext, getRuntime(context) ); if (typeof response === "function") { const cloudflareResponse = await context.next(); const res = await response(cloudflareResponse); return res ?? cloudflareResponse; } if (response !== null && typeof response === "object") { if (response instanceof Response) { return response; } setContext(context.env, response); return await context.next(); } return await context.next(); }); }; } function initContext(env) { env[contextSymbol] ??= {}; return env[contextSymbol]; } function getContext(env) { return env[contextSymbol]; } function setContext(env, value) { env[contextSymbol] = value; } function getRuntime(...args) { const isContext = args.length === 1; const key = isContext ? "cloudflare-pages" : "cloudflare-worker"; return getAdapterRuntime( isContext ? "cloudflare-pages" : "cloudflare-worker", { params: isContext ? args[0].params ?? void 0 : void 0, [key]: isContext ? args[0] : { env: args[0], ctx: args[1] } }, { env: isContext ? args[0].env : args[0], ctx: { waitUntil: isContext ? args[0].waitUntil : args[1].waitUntil, passThroughOnException: isContext ? args[0].passThroughOnException : args[1].passThroughOnException } } ); } // src/router.ts import { apply as applyCore, UniversalRouter, universalSymbol as universalSymbol2 } from "@universal-middleware/core"; function apply(middlewares) { const router = new UniversalRouter(true, true); applyCore(router, middlewares); return createHandler(() => router[universalSymbol2])(); } export { apply, createHandler, createPagesFunction, getContext, getRuntime };