import type { Client, ClientCallOptions, StreamDataOptions } from "../client"; import type { StatusRequest, StatusResponse } from "../status"; import type { StreamDataRequest, StreamDataResponse } from "../stream"; export class MockClient implements Client { constructor( private messageFactory: ( request: StreamDataRequest, options?: StreamDataOptions, ) => (StreamDataResponse | Error)[], ) {} async status( request?: StatusRequest, options?: ClientCallOptions, ): Promise { throw new Error("Client.status is not implemented for VcrClient"); } streamData(request: StreamDataRequest, options?: StreamDataOptions) { const messages = this.messageFactory(request, options); return new StreamDataIterable(messages); } } export class StreamDataIterable { constructor(private messages: (StreamDataResponse | Error)[]) {} [Symbol.asyncIterator](): AsyncIterator> { let index = 0; const messages = this.messages; return { async next() { if (index >= messages.length) { return { done: true, value: undefined }; } const message = messages[index++]; if (message instanceof Error) { throw message; } return { done: false, value: message }; }, }; } }