@universal-middleware/cloudflare
Version:
Cloudflare Pages adapter for universal middlewares
93 lines (91 loc) • 2.77 kB
JavaScript
// 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
};