rwsdk
Version:
Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime
51 lines (50 loc) • 1.76 kB
JavaScript
// context(justinvdm, 24 Mar 2025): React flight limits chunks to 28 bytes, so we need to rechunk
// the stream to avoid losing data
function rechunkStream(stream, maxChunkSize = 28) {
const reader = stream.getReader();
return new ReadableStream({
async pull(controller) {
let buffer = new Uint8Array(0);
try {
while (true) {
const { done, value } = await reader.read();
if (done && buffer.length === 0) {
controller.close();
return;
}
if (value) {
buffer = new Uint8Array([...buffer, ...value]);
}
while (buffer.length >= maxChunkSize || (done && buffer.length > 0)) {
const chunk = buffer.slice(0, maxChunkSize);
buffer = buffer.slice(maxChunkSize);
controller.enqueue(chunk);
}
if (done) {
controller.close();
return;
}
}
}
catch (error) {
controller.error(error);
}
},
});
}
export const normalizeActionResult = (actionResult) => {
if (actionResult instanceof Response) {
return {
__rw_action_response: {
status: actionResult.status,
headers: {
location: actionResult.headers.get("location"),
},
},
};
}
if (actionResult instanceof ReadableStream) {
return rechunkStream(actionResult);
}
return actionResult;
};