import * as http from 'node:http' import * as Viem from './Viem.js' describe('createBatchClient', () => { test('cancels an in-flight batch without cancelling another batch or its deadline', async () => { const started = Promise.withResolvers() let received = 0 const server = http.createServer((request) => { request.resume() if (++received === 2) started.resolve() }) await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) try { const address = server.address() if (!address || typeof address === 'string') throw new Error('Expected a TCP server address.') const client = Viem.createBatchClient({ rpc: { url: `http://127.0.0.1:${address.port}` } }) const controller = new AbortController() const cancelled = client .request({ method: 'eth_blockNumber' }, { retryCount: 0, signal: controller.signal }) .catch((error) => error) const active = client .request({ method: 'eth_blockNumber' }, { retryCount: 0 }) .catch((error) => error) await vi.advanceTimersByTimeAsync(0) await started.promise controller.abort() await expect(cancelled).resolves.toHaveProperty('name', 'AbortError') await vi.advanceTimersByTimeAsync(10_000) await expect(active).resolves.toHaveProperty('name', 'TimeoutError') } finally { vi.useRealTimers() server.closeAllConnections() await new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve())), ) } }) test.each([false, true])( 'times out a stalled batch with caller signal %s', async (withSignal) => { const started = Promise.withResolvers() const server = http.createServer((request) => { request.resume() started.resolve() }) await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve)) vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] }) try { const address = server.address() if (!address || typeof address === 'string') throw new Error('Expected a TCP server address.') const client = Viem.createBatchClient({ rpc: { url: `http://127.0.0.1:${address.port}` } }) let failure: unknown const pending = client .request( { method: 'eth_blockNumber' }, { retryCount: 0, ...(withSignal ? { signal: new AbortController().signal } : {}) }, ) .catch((error) => { failure = error }) await vi.advanceTimersByTimeAsync(0) await started.promise await vi.advanceTimersByTimeAsync(10_000) await vi.waitFor(() => expect(failure).toHaveProperty('name', 'TimeoutError')) await pending expect(Viem.requestFailure(failure)?.failure).toBe('timeout') } finally { vi.useRealTimers() server.closeAllConnections() await new Promise((resolve, reject) => server.close((error) => (error ? reject(error) : resolve())), ) } }, ) })