1/* v8 ignore start -- @preserve */
2import { MutationClient } from "../src/client.ts";
3
4export interface TestMutationClient {
5 client: MutationClient<{ contextValue: number }, {}>;
6 errorMessages: Array<{ message: string; error: unknown }>;
7 successMessages: string[];
8}
9
10export function createTestMutationClient(): TestMutationClient {
11 const errorMessages: Array<{ message: string; error: unknown }> = [];
12 const successMessages: string[] = [];
13
14 const client = new MutationClient({
15 context: { contextValue: 42 },
16 getOptimisticHelpers: () => ({}),
17 reportError: (message: string, error: unknown) => {
18 errorMessages.push({ message, error });
19 },
20 reportSuccess: (message: string) => {
21 successMessages.push(message);
22 },
23 });
24
25 return { client, errorMessages, successMessages };
26}
27
28export class IterableStream<T> implements AsyncIterableIterator<T> {
29 #buffer: T[] = [];
30 #listeners = new Set<{
31 resolve(value: IteratorResult<T>): void;
32 reject(error: unknown): void;
33 }>();
34 #ended = false;
35
36 [Symbol.asyncIterator](): AsyncIterableIterator<T> {
37 return this;
38 }
39
40 async next(): Promise<IteratorResult<T>> {
41 if (this.#buffer.length > 0) {
42 return { done: false, value: this.#buffer.shift()! };
43 }
44 if (this.#ended) {
45 return { done: true, value: undefined };
46 }
47 return new Promise((resolve, reject) => this.#listeners.add({ resolve, reject }));
48 }
49
50 push(value: T) {
51 if (this.#listeners.size > 0) {
52 const listeners = [...this.#listeners];
53 this.#listeners.clear();
54 for (const listener of listeners) {
55 listener.resolve({ done: false, value });
56 }
57 } else {
58 this.#buffer.push(value);
59 }
60 }
61
62 throw(error: unknown) {
63 this.#buffer = [];
64 for (const listener of this.#listeners) {
65 listener.reject(error);
66 }
67 this.#listeners.clear();
68 return Promise.resolve({ done: true, value: undefined } as IteratorResult<T>);
69 }
70
71 end() {
72 this.#ended = true;
73 if (this.#listeners.size > 0) {
74 for (const listener of this.#listeners) {
75 listener.resolve({ done: true, value: undefined });
76 }
77 this.#listeners.clear();
78 }
79 }
80}