one
Version:
One is a new React Framework that makes Vite serve both native and web.
64 lines (63 loc) • 2.28 kB
JavaScript
import { isResponse } from "../utils/isResponse";
import { asyncHeadersCache, mergeHeaders, runWithAsyncLocalContext } from "./one-server-only";
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.js.map