Skip to content

Instantly share code, notes, and snippets.

@kyleplo
Last active July 20, 2024 22:26
Show Gist options
  • Save kyleplo/44be6aaee51d0cfbe1672e524876a088 to your computer and use it in GitHub Desktop.
Save kyleplo/44be6aaee51d0cfbe1672e524876a088 to your computer and use it in GitHub Desktop.
Crude implementation of Writer for non-node environments
export class Writer extends EventTarget {
writer: WritableStream;
defaultWriter: WritableStreamDefaultWriter
constructor(writer: WritableStream) {
super();
this.writer = writer;
this.defaultWriter = writer.getWriter();
}
emit(event: string, data: any) {
this.dispatchEvent(new Event(event));
// TODO only on pipe
if (event === 'pipe') {
data.on('data', this.onData.bind(this));
data.on('end', this.onEnd.bind(this));
}
}
async onData(chunk: any) {
await this.defaultWriter.ready;
this.defaultWriter.write(chunk);
}
async onEnd() {
this.emit('finish', null);
await this.defaultWriter.ready;
await this.defaultWriter.close();
}
end() { /* needed but writer.close must be called later. */ }
on(evt: string, cb: EventListenerOrEventListenerObject) { this.addEventListener(evt, cb); return this; }
removeListener(evt: string, cb: EventListenerOrEventListenerObject) { this.removeEventListener(evt, cb); }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment