| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // src/utils/stream.ts
- var StreamingApi = class {
- writer;
- encoder;
- writable;
- abortSubscribers = [];
- responseReadable;
- /**
- * Whether the stream has been aborted.
- */
- aborted = false;
- /**
- * Whether the stream has been closed normally.
- */
- closed = false;
- constructor(writable, _readable) {
- this.writable = writable;
- this.writer = writable.getWriter();
- this.encoder = new TextEncoder();
- const reader = _readable.getReader();
- this.abortSubscribers.push(async () => {
- await reader.cancel();
- });
- this.responseReadable = new ReadableStream({
- async pull(controller) {
- const { done, value } = await reader.read();
- done ? controller.close() : controller.enqueue(value);
- },
- cancel: () => {
- this.abort();
- }
- });
- }
- async write(input) {
- try {
- if (typeof input === "string") {
- input = this.encoder.encode(input);
- }
- await this.writer.write(input);
- } catch {
- }
- return this;
- }
- async writeln(input) {
- await this.write(input + "\n");
- return this;
- }
- sleep(ms) {
- return new Promise((res) => setTimeout(res, ms));
- }
- async close() {
- try {
- await this.writer.close();
- } catch {
- }
- this.closed = true;
- }
- async pipe(body) {
- this.writer.releaseLock();
- await body.pipeTo(this.writable, { preventClose: true });
- this.writer = this.writable.getWriter();
- }
- onAbort(listener) {
- this.abortSubscribers.push(listener);
- }
- /**
- * Abort the stream.
- * You can call this method when stream is aborted by external event.
- */
- abort() {
- if (!this.aborted) {
- this.aborted = true;
- this.abortSubscribers.forEach((subscriber) => subscriber());
- }
- }
- };
- export {
- StreamingApi
- };
|