@nuxfly/core
Version:
Nuxt module for Fly.io integration with storage and database support
73 lines (72 loc) • 2.42 kB
JavaScript
export function parseFlyProxyHeaders(headers) {
const normalizedHeaders = {};
for (const [key, value] of Object.entries(headers)) {
if (value !== void 0) {
normalizedHeaders[key.toLowerCase()] = Array.isArray(value) ? value[0] || "" : value;
}
}
const flyHeaders = {
clientIP: normalizedHeaders["fly-client-ip"],
forwardedPort: normalizedHeaders["fly-forwarded-port"],
region: normalizedHeaders["fly-region"],
forwardedFor: normalizedHeaders["x-forwarded-for"],
forwardedProto: normalizedHeaders["x-forwarded-proto"],
forwardedPortClient: normalizedHeaders["x-forwarded-port"],
forwardedSSL: normalizedHeaders["x-forwarded-ssl"],
via: normalizedHeaders["via"]
};
const getClientIP = () => {
if (flyHeaders.clientIP) {
return flyHeaders.clientIP;
}
if (flyHeaders.forwardedFor) {
const ips = flyHeaders.forwardedFor.split(",").map((ip) => ip.trim());
return ips[0] || null;
}
return null;
};
const getForwardedIPs = () => {
if (!flyHeaders.forwardedFor) return [];
return flyHeaders.forwardedFor.split(",").map((ip) => ip.trim()).filter(Boolean);
};
const isFromRegion = (regionCode) => {
return flyHeaders.region?.toLowerCase() === regionCode.toLowerCase();
};
const getOriginalClientIP = () => {
const ips = getForwardedIPs();
return ips.length > 0 ? ips[0] || null : null;
};
return {
headers: flyHeaders,
clientIP: getClientIP(),
region: flyHeaders.region || null,
isSSL: flyHeaders.forwardedSSL === "on" || flyHeaders.forwardedProto === "https",
protocol: flyHeaders.forwardedProto || null,
port: flyHeaders.forwardedPort || flyHeaders.forwardedPortClient || null,
getForwardedIPs,
isFromRegion,
getOriginalClientIP
};
}
export function useFlyProxy() {
let headers = {};
if (typeof window === "undefined") {
try {
const requestHeaders = globalThis.useRequestHeaders?.() || {};
headers = requestHeaders;
} catch {
}
}
return parseFlyProxyHeaders(headers);
}
export function useFlyProxyServer() {
if (typeof window !== "undefined") {
throw new Error("useFlyProxyServer() can only be used on the server-side");
}
return useFlyProxy();
}
export function useFlyProxyFromEvent(event) {
const headers = event?.node?.req?.headers || {};
return parseFlyProxyHeaders(headers);
}
export default useFlyProxy;