import test from 'node:test' import assert from 'node:assert/strict' import {createTaskSocket} from '../src/utils/taskSocket.js' function fixture() { const sockets = [], states = [], messages = [], timers = new Map() let id = 0, opens = 0 const manager = createTaskSocket({url: 'wss://example.invalid', onOpen: () => opens++, onState: value => states.push(value), onMessage: event => messages.push(event.data), setTimer: (fn, delay) => { timers.set(++id, {fn, delay}); return id }, clearTimer: key => timers.delete(key), createSocket: () => { const socket = {sent: [], send(value) { this.sent.push(value) }, close() { this.closed = true }} sockets.push(socket) return socket } }) function tick(delay) { const entry = [...timers].find(([, timer]) => timer.delay === delay) assert.ok(entry, `expected timer ${delay}`) timers.delete(entry[0]); entry[1].fn() } return {manager, sockets, states, messages, timers, tick, opens: () => opens} } test('reconnects and refreshes after each successful connection', () => { const f = fixture(); f.manager.start() f.sockets[0].onopen() assert.deepEqual(f.sockets[0].sent, ['DownloaderWebsocket']) f.sockets[0].onclose() f.tick(1000) f.sockets[1].onopen() assert.equal(f.opens(), 2) assert.equal(f.states.at(-1), 'connected') assert.equal(f.timers.size, 0) f.manager.stop() }) test('backs off and times out connection attempts', () => { const f = fixture(); f.manager.start() f.tick(10000) assert.equal(f.sockets[0].closed, true) f.tick(1000); f.sockets[1].onerror(); f.tick(2000) f.sockets[2].onerror(); f.tick(4000) assert.equal(f.sockets.length, 4) f.manager.stop() }) test('stop cancels timers and ignores callbacks from replaced sockets', () => { const f = fixture(); f.manager.start() const oldOpen = f.sockets[0].onopen, oldMessage = f.sockets[0].onmessage f.sockets[0].onerror() f.manager.stop() assert.equal(f.timers.size, 0) f.manager.start() oldOpen(); oldMessage({data: 'stale'}) assert.equal(f.opens(), 0) assert.deepEqual(f.messages, []) f.sockets[1].onopen() f.sockets[1].onmessage({data: 'current'}) assert.deepEqual(f.messages, ['current']) f.manager.stop() })