one
Version:
One is a new React Framework that makes Vite serve both native and web.
74 lines (73 loc) • 2.34 kB
JavaScript
import { isResponse } from "../utils/isResponse.mjs";
import { asyncHeadersCache, mergeHeaders, runWithAsyncLocalContext } from "./one-server-only.mjs";
function resolveResponse(getResponse) {
return new Promise((res, rej) => {
runWithAsyncLocalContext(async id => {
try {
const response = await getResponse(),
modifiedResponse = await getResponseWithAddedHeaders(response, id);
res(modifiedResponse);
} catch (err) {
isResponse(err) ? res(err) : rej(err);
}
});
});
}
function resolveAPIEndpoint(runEndpoint, request, params) {
return resolveResponse(async () => {
const imported = await runEndpoint(),
requestType = request.method || "GET",
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 asyncHeaders = asyncHeadersCache.get(id);
if (asyncHeaders) try {
response instanceof Response ? mergeHeaders(response.headers, asyncHeaders) : response && typeof response == "object" ? response = Response.json(response, {
headers: asyncHeaders
}) : response = new Response(response, {
headers: asyncHeaders
});
} catch (err) {
if (`${err}`.includes("immutable")) {
const body = response.body ? await streamToString(response.body) : "";
response = new Response(body, {
headers: response.headers,
status: response.status,
statusText: response.statusText
}), mergeHeaders(response.headers, asyncHeaders);
} else console.error(` [one] error adding headers: ${err}`);
}
return response;
}
async function streamToString(stream) {
const reader = stream.getReader(),
decoder = new TextDecoder();
let result = "";
try {
for (;;) {
const {
done,
value
} = await reader.read();
if (done) break;
result += decoder.decode(value, {
stream: !0
});
}
} catch (error) {
console.error("Error reading the stream:", error);
} finally {
reader.releaseLock();
}
return result;
}
export { resolveAPIEndpoint, resolveResponse };
//# sourceMappingURL=resolveResponse.mjs.map