@nodeboot/http-server
Version:
Node-Boot http server package. It provides a simple way to create HTTP servers using Node.js, with support for routing, middleware, and request handling.
98 lines • 3.68 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isOriginAllowed = isOriginAllowed;
exports.applyCorsHeaders = applyCorsHeaders;
function isOriginAllowed(requestOrigin, allowedOrigin) {
if (!requestOrigin)
return false;
if (Array.isArray(allowedOrigin)) {
return allowedOrigin.some(o => isOriginAllowed(requestOrigin, o));
}
if (typeof allowedOrigin === "string") {
return requestOrigin === allowedOrigin;
}
if (allowedOrigin instanceof RegExp) {
return allowedOrigin.test(requestOrigin);
}
return Boolean(allowedOrigin); // true allows all, false blocks all
}
async function applyCorsHeaders(req, res, options = {}) {
const requestOrigin = req.headers.origin;
const isPreflight = req.method === "OPTIONS";
const { origin = "*", methods = "GET,HEAD,PUT,PATCH,POST,DELETE", allowedHeaders, exposedHeaders, credentials = false, maxAge, preflightContinue = false, optionsSuccessStatus = 204, } = options;
let resolvedOrigin = undefined;
// Handle dynamic origin
if (typeof origin === "function") {
return new Promise((resolve, _) => {
origin(requestOrigin, (err, allow) => {
if (err || allow === false) {
resolve(false);
return;
}
resolvedOrigin =
requestOrigin && isOriginAllowed(requestOrigin, allow ?? "*") ? requestOrigin : undefined;
if (resolvedOrigin) {
setCorsHeaders(res, {
resolvedOrigin,
methods,
allowedHeaders,
exposedHeaders,
credentials,
maxAge,
});
}
if (isPreflight && !preflightContinue) {
res.statusCode = optionsSuccessStatus;
res.end();
resolve(false); // stop processing
}
else {
resolve(true); // continue processing
}
});
});
}
// Static origin matching
if (origin === true || origin === "*") {
resolvedOrigin = "*";
}
else if (isOriginAllowed(requestOrigin, origin)) {
resolvedOrigin = requestOrigin;
}
if (resolvedOrigin) {
setCorsHeaders(res, {
resolvedOrigin,
methods,
allowedHeaders,
exposedHeaders,
credentials,
maxAge,
});
}
// Handle preflight short-circuit
if (isPreflight && !preflightContinue) {
res.statusCode = optionsSuccessStatus;
res.end();
return false;
}
return true;
}
function setCorsHeaders(res, { resolvedOrigin, methods, allowedHeaders, exposedHeaders, credentials, maxAge, }) {
res.setHeader("Access-Control-Allow-Origin", resolvedOrigin);
if (credentials) {
res.setHeader("Access-Control-Allow-Credentials", "true");
}
if (methods) {
res.setHeader("Access-Control-Allow-Methods", Array.isArray(methods) ? methods.join(",") : methods);
}
if (allowedHeaders) {
res.setHeader("Access-Control-Allow-Headers", Array.isArray(allowedHeaders) ? allowedHeaders.join(",") : allowedHeaders);
}
if (exposedHeaders) {
res.setHeader("Access-Control-Expose-Headers", Array.isArray(exposedHeaders) ? exposedHeaders.join(",") : exposedHeaders);
}
if (maxAge) {
res.setHeader("Access-Control-Max-Age", maxAge.toString());
}
}
//# sourceMappingURL=cors.js.map