// npm i web-streams-polyfill
const streams = require("web-streams-polyfill");
const {ReadableStream, WritableStream, TransformStream} = streams;

// writable stream
//NOTE: writable has no byte-array specific implementations
const ws1 = new WritableStream({
    async start(controller) {
        // called by constructor
        console.log("[start]");
        // to do some (asynchronous) initialization
    },
    async write(chunk, controller) {
        // called when writer.write()
        console.log("[write]", chunk);
    },
    async close(controller) {
        console.log("[close]");
    },
    async abort(reason) {
        // called when ws.abort(reason)
        console.log("[abort]", reason);
    }
});

(async () => {
    console.log(ws1.getWriter);
    const w1 = ws1.getWriter();
    //NOTE: write and close may spawn error
    for (const v of ["a", "b", "c"]) {
        await w1.write(v);
    }
    await w1.close();
})().catch(console.error);
// NOTE on difference between `close()` and `abort()`
// - close() is sequentially called after former write()s are finished
// - abort() is quickly called even if former write() is not yet finished