Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
44 lines
1.3 KiB
JavaScript
44 lines
1.3 KiB
JavaScript
const WebSocket = require('ws')
|
|
|
|
const base = (room) => `ws://127.0.0.1:3000/ws?room=${room}`
|
|
|
|
function connect(name, room) {
|
|
return new Promise((resolve, reject) => {
|
|
const ws = new WebSocket(base(room))
|
|
const messages = []
|
|
ws.on('open', () => resolve({ ws, messages }))
|
|
ws.on('message', (data) => messages.push(JSON.parse(data.toString())))
|
|
ws.on('error', reject)
|
|
})
|
|
}
|
|
|
|
function waitFor(messages, pred, timeout = 10000) {
|
|
const start = Date.now()
|
|
return new Promise((resolve, reject) => {
|
|
const check = () => {
|
|
if (pred()) return resolve(undefined)
|
|
if (Date.now() - start > timeout) return reject(new Error('timeout'))
|
|
setTimeout(check, 50)
|
|
}
|
|
check()
|
|
})
|
|
}
|
|
|
|
;(async () => {
|
|
const room = 'ROOMFULL' + Math.floor(Math.random() * 1000)
|
|
const p1 = await connect('p1', room)
|
|
const p2 = await connect('p2', room)
|
|
const p3 = await connect('p3', room)
|
|
await waitFor(p1.messages, () => p1.messages.some(m => m.type === 'game_state'), 5000)
|
|
await waitFor(p2.messages, () => p2.messages.some(m => m.type === 'game_state'), 5000)
|
|
await waitFor(p3.messages, () => p3.messages.some(m => m.type === 'game_state'), 5000)
|
|
console.log('Multiple observers can watch the same room state')
|
|
p1.ws.close()
|
|
p2.ws.close()
|
|
p3.ws.close()
|
|
process.exit(0)
|
|
})().catch((e) => {
|
|
console.error(e)
|
|
process.exit(1)
|
|
})
|