firebase-frameworks
Version:
Experimental addon to the Firebase CLI to add web framework support
45 lines (44 loc) • 1.88 kB
JavaScript
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;
}