const fs = require('node:fs'); const vm = require('node:vm'); class SocketFixture { constructor() { this.connected = false; this.id = 'ordering-fixture-socket'; this.listeners = new Map(); this.emitted = []; this.connectCount = 0; this.listenersReadyAtConnect = []; this.handshakeAuth = []; } on(eventName, callback) { const callbacks = this.listeners.get(eventName) || []; callbacks.push(callback); this.listeners.set(eventName, callbacks); } emit(eventName, payload) { this.emitted.push({ eventName, payload }); } deliver(eventName, payload) { for (const callback of this.listeners.get(eventName) || []) callback(payload); } connect(authProvider) { if (this.connected) return; if (authProvider === undefined) authProvider = this.authProvider; let auth = null; if (typeof authProvider === 'function') { authProvider(payload => { auth = payload; }); } this.handshakeAuth.push(auth); this.connected = true; this.connectCount += 1; this.listenersReadyAtConnect.push( ['connect', 'session_token', 'session_resumed'].every(name => this.listeners.has(name)) ); // The server can emit session state immediately after the client's connect event. this.deliver('connect'); if (this.connectCount === 1) { this.deliver('session_token', { token: 'fixture-session-first', userId: 41 }); } else if (this.connectCount === 2) { this.deliver('session_resumed', { token: 'fixture-session-resumed', userId: 41, credits: 0 }); } else { this.deliver('session_resumed', { token: 'fixture-session-latest', userId: 41, credits: 0 }); } } disconnect() { if (!this.connected) return; this.connected = false; this.deliver('disconnect'); } } function makeJQueryStub() { return function jqueryStub() { const chain = { length: 0, on() { return this; }, append() { return this; }, remove() { return this; }, hide() { return this; }, show() { return this; }, val() { return this; }, text() { return this; }, html() { return this; }, css() { return this; }, prop() { return this; }, removeData() { return this; } }; return chain; }; } function loadLobbyClient({ storageUnavailable = false } = {}) { const html = fs.readFileSync(require.resolve('../html/index.html'), 'utf8'); const bootstrap = html.match(/