@busy-hour/blaze
Version:
<h1 align='center'>🔥 Blaze</h1> <div align='center'> An event driven framework for 🔥 Hono.js </div>
88 lines (87 loc) • 2.43 kB
JavaScript
// src/middlewares/cors.ts
import { BlazeContext } from "../internal/context/index.js";
var defaults = {
origin: "*",
allowMethods: ["HEAD", "POST", "PUT", "PATCH", "GET", "DELETE"],
allowHeaders: [],
exposeHeaders: []
};
function findAllowOrigin(optsOrigin) {
if (typeof optsOrigin === "string") {
return () => optsOrigin;
}
if (typeof optsOrigin === "function") {
return optsOrigin;
}
return (origin) => optsOrigin.includes(origin) ? origin : optsOrigin[0];
}
function set(honoCtx) {
return function set2(key, value) {
honoCtx.res.headers.set(key, value);
};
}
function cors(options = defaults) {
const opts = {
...defaults,
...options
};
return async function cors2(honoCtx, next) {
const setRes = set(honoCtx);
const ctx = new BlazeContext({
body: null,
honoCtx,
headers: null,
meta: null,
params: null,
query: null
});
const allowOrigin = findAllowOrigin(opts.origin)(
honoCtx.req.header("origin") || "",
ctx
);
if (allowOrigin) {
setRes("Access-Control-Allow-Origin", allowOrigin);
}
if (opts.origin !== "*") {
setRes("Vary", "Origin");
}
if (opts.credentials) {
setRes("Access-Control-Allow-Credentials", "true");
}
if (opts.exposeHeaders?.length) {
setRes("Access-Control-Expose-Headers", opts.exposeHeaders.join(","));
}
if (honoCtx.req.method === "OPTIONS") {
if (opts.maxAge != null) {
setRes("Access-Control-Max-Age", opts.maxAge.toString());
}
if (opts.allowMethods?.length) {
setRes("Access-Control-Allow-Methods", opts.allowMethods.join(","));
}
let headers = opts.allowHeaders;
if (!headers?.length) {
const requestHeaders = honoCtx.req.header(
"Access-Control-Request-Headers"
);
if (requestHeaders) {
headers = requestHeaders.split(/\s*,\s*/);
}
}
if (headers?.length) {
setRes("Access-Control-Allow-Headers", headers.join(","));
honoCtx.res.headers.append("Vary", "Access-Control-Request-Headers");
}
honoCtx.res.headers.delete("Content-Length");
honoCtx.res.headers.delete("Content-Type");
return new Response(null, {
headers: honoCtx.res.headers,
status: 204,
statusText: honoCtx.res.statusText
});
}
await next();
};
}
export {
cors
};