Re: [whatwg/streams] Returning buffers to the underlying source (Issue #1217)

If we are talking about API design (which means the consumer needs to explicitly release the buffer), I think it's already possible like this:

```ts

declare function pullFromSource<T>(): Promise<T>;
declare function releaseToSource<T>(value: T): void;

interface ReusableData<T> {
    value: T;
    release: () => void;
}

class ReusableReadableStream<T> extends ReadableStream<ReusableData<T>>{
    constructor() {
        super({
            async pull(controller) {
                const value = await pullFromSource<T>();
                controller.enqueue({
                    value, release: () => {
                        releaseToSource(value);
                    }
                });
            }
        })
    }
}


const stream = new ReusableReadableStream<Uint8Array>();
stream.pipeTo(new WritableStream({
    write(chunk) {
        // do things to chunk
        console.log(chunk.value);
        chunk.release();
    }
}))
```

The consumer needs to use `chunk.value`, so it knows it's special, and remembers to call `release()`.

If we don't want the consumer to learn new things, is it possible to let GC release the buffer?

-- 
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/issues/1217#issuecomment-1152852831
You are receiving this because you are subscribed to this thread.

Message ID: <whatwg/streams/issues/1217/1152852831@github.com>

Received on Saturday, 11 June 2022 04:28:06 UTC