/ src / readable.ts
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  }