UNPKG

@nuxfly/core

Version:

Nuxt module for Fly.io integration with storage and database support

73 lines (72 loc) 2.42 kB
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;