readable.ts
1 import { StreamSearch, type Token } from "./search.js"; 2 3 export class ReadableStreamSearch { 4 private _search: StreamSearch; 5 6 public constructor( 7 needle: Uint8Array | string, 8 private _readableStream: ReadableStream<Uint8Array>, 9 ) { 10 this._search = new StreamSearch(needle); 11 } 12 13 public async *[Symbol.asyncIterator](): AsyncIterableIterator<Token> { 14 const reader = this._readableStream.getReader(); 15 try { 16 while (true) { 17 const result = await reader.read(); 18 if (result.done) { 19 break; 20 } 21 22 yield* this._search.feed(result.value); 23 } 24 25 const tail = this._search.end(); 26 if (tail.length) { 27 yield tail; 28 } 29 } finally { 30 reader.releaseLock(); 31 } 32 } 33 }