(
events: ReadonlyArray<{ seq: number; stream: string; text: string }>,
predicate: (e: { seq: number; stream: string; text: string }) => boolean,
timeoutMs: number,
)
| 81 | } |
| 82 | |
| 83 | function waitFor<T>( |
| 84 | events: ReadonlyArray<{ seq: number; stream: string; text: string }>, |
| 85 | predicate: (e: { seq: number; stream: string; text: string }) => boolean, |
| 86 | timeoutMs: number, |
| 87 | ): Promise<{ seq: number; stream: string; text: string }> { |
| 88 | return new Promise((resolve, reject) => { |
| 89 | const started = Date.now(); |
| 90 | const tick = () => { |
| 91 | const hit = events.find(predicate); |
| 92 | if (hit) return resolve(hit); |
| 93 | if (Date.now() - started > timeoutMs) { |
| 94 | return reject(new Error(`Timed out waiting for predicate. Events: ${JSON.stringify(events)}`)); |
| 95 | } |
| 96 | setTimeout(tick, 20); |
| 97 | }; |
| 98 | tick(); |
| 99 | }); |
| 100 | } |
| 101 | |
| 102 | describe('MCP initialize handshake (issue #172)', () => { |
| 103 | let tempDir: string; |
no test coverage detected