UNPKG

@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
// 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 };