-
Notifications
You must be signed in to change notification settings - Fork 10
Open
Labels
enhancementNew feature or requestNew feature or request
Description
WHATWG fetch() implementation of Node.js and Deno support full-duplex streaming over fetch() with duplex:"half".
See oven-sh/bun#7206, https://github.com/guest271314/native-messaging-nodejs/tree/full-duplex, https://github.com/guest271314/native-messaging-deno/tree/fetch-duplex.
This can be tested with https://github.com/oven-sh/bun/files/13400754/full_duplex_fetch_test.js.zip.
var wait = async (ms) => new Promise((r) => setTimeout(r, ms));
var encoder = new TextEncoder();
var decoder = new TextDecoder();
var { writable, readable } = new TransformStream();
var abortable = new AbortController();
var { signal } = abortable;
var writer = writable.getWriter();
var settings = { url: "https://comfortable-deer-52.deno.dev", method: "post" };
fetch(settings.url, {
duplex: "half",
method: settings.method,
// Bun does not implement TextEncoderStream, TextDecoderStream
body: readable.pipeThrough(
new TransformStream({
transform(value, c) {
c.enqueue(encoder.encode(value));
},
}),
),
signal,
})
// .then((r) => r.body.pipeThrough(new TextDecoderStream()))
.then((r) =>
r.body.pipeTo(
new WritableStream({
async start() {
this.now = performance.now();
console.log(this.now);
return;
},
async write(value) {
console.log(decoder.decode(value));
},
async close() {
console.log("Stream closed");
},
async abort(reason) {
const now = ((performance.now() - this.now) / 1000) / 60;
console.log({ reason });
},
}),
)
).catch(async (e) => {
console.log(e);
});
await wait(1000);
await writer.write("test");
await wait(1500);
await writer.write("test, again");
await writer.close();
Metadata
Metadata
Assignees
Labels
enhancementNew feature or requestNew feature or request