UNPKG

@netlify/remix-edge-adapter

Version:

Remix Adapter for Netlify Edge Functions

112 lines (107 loc) 4.08 kB
"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/globals.ts var require_globals = __commonJS({ "src/globals.ts"() { "use strict"; globalThis.process ||= { env: Netlify.env.toObject() }; } }); // src/index.ts var index_exports = {}; __export(index_exports, { createHydrogenAppLoadContext: () => createHydrogenAppLoadContext, createRequestHandler: () => createRequestHandler }); module.exports = __toCommonJS(index_exports); var import_globals = __toESM(require_globals()); // src/server.ts var import_remix_runtime = require("@netlify/remix-runtime"); function createRequestHandler({ build, mode, getLoadContext }) { const remixHandler = (0, import_remix_runtime.createRequestHandler)(build, mode); const assetPath = build.assets.url.split("/").slice(0, -1).join("/"); return async (request, context) => { const { pathname } = new URL(request.url); if (pathname.startsWith(`${assetPath}/`)) { return; } try { const loadContext = await getLoadContext?.(request, context) || context; const response = await remixHandler(request, loadContext); response.headers.set("x-nf-runtime", "Edge"); if (response.status === 404) { const originResponse = await loadContext.next({ sendConditionalRequest: true }); if (originResponse && originResponse?.status !== 404) { return originResponse; } } return response; } catch (error) { console.error(error); return new Response("Internal Error", { status: 500 }); } }; } // src/hydrogen.ts var executionContext = { /** * Hydrogen expects a `waitUntil` function like the one in the workerd runtime: * https://developers.cloudflare.com/workers/runtime-apis/context/#waituntil. * Netlify Edge Functions don't have such a function, but Deno Deploy isolates make a best-effort * attempt to wait for the event loop to drain, so just awaiting the promise here is equivalent. */ async waitUntil(p) { await p; } }; var getEnv = () => { if (globalThis.Netlify) { return globalThis.Netlify.env.toObject(); } return process.env; }; var createHydrogenAppLoadContext = async (request, netlifyContext, createAppLoadContext) => { const env = getEnv(); const userHydrogenContext = await createAppLoadContext(request, env, executionContext); return Object.assign(netlifyContext, userHydrogenContext); }; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { createHydrogenAppLoadContext, createRequestHandler });