UNPKG

firebase-frameworks

Version:

Experimental addon to the Firebase CLI to add web framework support

45 lines (44 loc) 1.88 kB
import { pathToFileURL } from "url"; import { installPolyfills } from "@sveltejs/kit/node/polyfills"; const kitPromise = import(`${pathToFileURL(process.cwd())}/index.js`); const manifestPromise = import(`${pathToFileURL(process.cwd())}/manifest.js`); // Request, Response, fetch, etc. installPolyfills(); const server = Promise.all([kitPromise, manifestPromise]).then(async ([{ Server }, { manifest }]) => { const server = new Server(manifest); await server.init({ env: process.env }); return server; }); export const handle = async (req, res) => { const rendered = await (await server).respond(toSvelteKitRequest(req)); if (!rendered) { return res.writeHead(404, "Not Found").end(); } const body = await rendered.arrayBuffer(); return res .writeHead(rendered.status, Object.fromEntries(rendered.headers)) .end(Buffer.from(body)); }; // https://github.com/jthegedus/svelte-adapter-firebase/blob/main/src/files/firebase-to-svelte-kit.js function toSvelteKitRequest(request) { // Firebase sometimes omits the protocol used. Default to http. const protocol = request.headers["x-forwarded-proto"] || "http"; // Firebase forwards the request to sveltekit, use the forwarded host. const host = `${protocol}://${request.headers["x-forwarded-host"]}`; const { href } = new URL(request.url || "", host); return new Request(href, { method: request.method, headers: toSvelteKitHeaders(request.headers), body: request.rawBody ? request.rawBody : null, }); } function toSvelteKitHeaders(headers) { const finalHeaders = {}; // Assume string | string[] types for all values for (const [key, value] of Object.entries(headers)) { if (value) { finalHeaders[key] = Array.isArray(value) ? value.join(",") : value; } } return finalHeaders; }