UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

100 lines (99 loc) 2.88 kB
import { isResponse } from "../utils/isResponse.mjs"; import { asyncHeadersCache, mergeHeaders, requestAsyncLocalStore, runWithAsyncLocalContext } from "./one-server-only.mjs"; let _nextId = 1; function createId() { return { _id: _nextId++ }; } async function resolveResponse(getResponse) { const store = requestAsyncLocalStore ?? globalThis["__vxrnrequestAsyncLocalStore"]; if (store) { const id = createId(); let response; await store.run(id, async () => { try { response = await getResponse(); response = await getResponseWithAddedHeaders(response, id); } catch (err) { if (isResponse(err)) { response = err; } else { throw err; } } }); return response; } return runWithAsyncLocalContext(async id => { try { const response = await getResponse(); return await getResponseWithAddedHeaders(response, id); } catch (err) { if (isResponse(err)) { return err; } throw err; } }); } function withRequestContext(fn) { const store = requestAsyncLocalStore; if (store) { const id = createId(); return store.run(id, fn); } return fn(); } function resolveAPIEndpoint(runEndpoint, request, params) { return resolveResponse(async () => { const imported = await runEndpoint(); const requestType = request.method || "GET"; const handler = imported[requestType] || imported.default; if (!handler) { console.warn(`No handler found for request ${requestType}`); return; } return await handler(request, { params }); }); } async function getResponseWithAddedHeaders(response, id) { const cache = globalThis["__vxrnasyncHeadersCache"] ?? asyncHeadersCache; const asyncHeaders = cache.get(id); if (asyncHeaders) { try { if (response instanceof Response) { const cloned = response.clone(); const headers = new Headers(); mergeHeaders(headers, cloned.headers); mergeHeaders(headers, asyncHeaders); response = new Response(cloned.body, { status: cloned.status, statusText: cloned.statusText, headers }); } else { if (response && typeof response === "object") { response = Response.json(response, { headers: asyncHeaders }); } else { const headers = new Headers(asyncHeaders); if (!headers.has("content-type")) { headers.set("content-type", "text/html"); } response = new Response(response, { headers }); } } } catch (err) { console.error(` [one] error adding headers: ${err}`); } } return response; } export { resolveAPIEndpoint, resolveResponse, withRequestContext }; //# sourceMappingURL=resolveResponse.mjs.map