@tanstack/router-core
Version:
Modern and scalable routing for React applications
91 lines (90 loc) • 2.77 kB
JavaScript
//#region src/ssr/handlerCallback.ts
function isSsrResponse(value) {
return typeof value === "object" && value !== null && "response" in value && "serverSsrCleanup" in value;
}
function normalizeSsrResponse(result) {
return isSsrResponse(result) ? result : {
response: result,
serverSsrCleanup: "none"
};
}
function disposeSsrResponse(response, reason) {
if (response.serverSsrCleanup !== "stream") return Promise.resolve();
try {
return Promise.resolve(response.dispose(reason));
} catch (error) {
return Promise.reject(error);
}
}
function disposeSsrResponseDetached(result, reason, onError = console.error) {
const ssrResponse = normalizeSsrResponse(result);
if (ssrResponse.serverSsrCleanup === "stream") {
disposeSsrResponse(ssrResponse, reason).catch(onError);
return;
}
if (ssrResponse.response.body) try {
ssrResponse.response.body.cancel(reason).catch(onError);
} catch (error) {
onError(error);
}
}
function createSsrStreamResponse(router, response) {
if (!response.body) throw new Error("Invariant failed: SSR stream response requires a body");
let disposed = false;
return {
response,
serverSsrCleanup: "stream",
async dispose(reason) {
if (disposed) return;
disposed = true;
router.serverSsr?.cleanup();
try {
await response.body.cancel(reason);
} catch {}
}
};
}
function bindSsrResponseToRequest(router, result, signal) {
const ssrResponse = normalizeSsrResponse(result);
if (ssrResponse.serverSsrCleanup !== "stream") {
if (signal.aborted) disposeSsrResponseDetached(result, signal.reason);
return ssrResponse;
}
const failed = (error) => {
router?.serverSsr?.cleanup();
console.error(error);
};
const abort = () => {
disposeSsrResponseDetached(ssrResponse, signal.reason, failed);
};
if (signal.aborted) {
abort();
return ssrResponse;
}
signal.addEventListener("abort", abort, { once: true });
router?.serverSsr?.onCleanup(() => {
signal.removeEventListener("abort", abort);
});
return ssrResponse;
}
async function replaceSsrResponse(result, response, reason) {
await disposeSsrResponse(normalizeSsrResponse(result), reason);
return {
response,
serverSsrCleanup: "none"
};
}
async function stripSsrResponseBody(result, reason) {
const ssrResponse = normalizeSsrResponse(result);
await disposeSsrResponse(ssrResponse, reason);
return {
response: new Response(null, ssrResponse.response),
serverSsrCleanup: "none"
};
}
function defineHandlerCallback(handler) {
return handler;
}
//#endregion
export { bindSsrResponseToRequest, createSsrStreamResponse, defineHandlerCallback, disposeSsrResponse, disposeSsrResponseDetached, isSsrResponse, normalizeSsrResponse, replaceSsrResponse, stripSsrResponseBody };
//# sourceMappingURL=handlerCallback.js.map