/**
* Minimal JS test: verify meta.set stores all fields.
* Run: node test_meta_set.js
* Requires keet-daemon running on /tmp/keet-daemon.sock
*/
import net from 'net'
const SOCKET = process.env.SOCKET_PATH || '/tmp/keet-daemon.sock'
let nextId = 1
const pending = new Map()
let recvBuf = Buffer.alloc(0)
const sock = net.connect(SOCKET)
sock.on('connect', async () => {
console.log('connected to daemon')
// 1. Get status
const status = await rpc('status')
console.log('status:', JSON.stringify(status))
// 2. Create a room
const roomResult = await rpc('room.create', { title: 'Meta Test Room' })
const roomId = typeof roomResult === 'string' ? roomResult : roomResult.roomId || roomResult.id
console.log('room created:', roomId)
// 3. Set 3 keys in one meta.set call
const metadata = {
'game:map': 'arena',
'game:mode': 'deathmatch',
'game:max_players': '8'
}
console.log('sending meta.set with:', JSON.stringify(metadata))
const setResult = await rpc('meta.set', { roomId, metadata })
console.log('meta.set result:', JSON.stringify(setResult))
// 4. Read back with meta.list
const listResult = await rpc('meta.list')
console.log('meta.list result:', JSON.stringify(listResult, null, 2))
// 5. Check if all 3 keys are present
const roomMeta = listResult[roomId]
if (roomMeta) {
console.log('\nRoom metadata keys:', Object.keys(roomMeta))
console.log(' game:map =', roomMeta['game:map'])
console.log(' game:mode =', roomMeta['game:mode'])
console.log(' game:max_players =', roomMeta['game:max_players'])
const allPresent = roomMeta['game:map'] === 'arena' &&
roomMeta['game:mode'] === 'deathmatch' &&
roomMeta['game:max_players'] === '8'
console.log('\nAll 3 keys present:', allPresent ? 'YES' : 'NO')
} else {
console.log('ERROR: room not found in meta.list')
}
// 6. Also test individual set calls (like old set_batch)
console.log('\n--- Testing individual set calls ---')
await rpc('meta.set', { roomId, metadata: { 'game:test1': 'val1' } })
await rpc('meta.set', { roomId, metadata: { 'game:test2': 'val2' } })
await rpc('meta.set', { roomId, metadata: { 'game:test3': 'val3' } })
const list2 = await rpc('meta.list')
const rm2 = list2[roomId]
console.log('After individual sets, keys:', Object.keys(rm2))
console.log(' game:test1 =', rm2['game:test1'])
console.log(' game:test2 =', rm2['game:test2'])
console.log(' game:test3 =', rm2['game:test3'])
sock.destroy()
})
sock.on('data', (chunk) => {
recvBuf = Buffer.concat([recvBuf, chunk])
while (recvBuf.length >= 4) {
const len = recvBuf.readUInt32LE(0)
if (recvBuf.length < 4 + len) break
const frame = recvBuf.subarray(4, 4 + len)
recvBuf = recvBuf.subarray(4 + len)
try {
const msg = JSON.parse(frame.toString('utf8'))
if (msg.id && pending.has(msg.id)) {
const { resolve, reject } = pending.get(msg.id)
pending.delete(msg.id)
if (msg.ok) resolve(msg.data)
else reject(new Error(msg.error || 'Unknown error'))
}
} catch {}
}
})
sock.on('error', (err) => {
console.error('socket error:', err.message)
process.exit(1)
})
function rpc (method, params = {}) {
return new Promise((resolve, reject) => {
const id = nextId++
pending.set(id, { resolve, reject })
const json = JSON.stringify({ id, method, params })
const buf = Buffer.from(json, 'utf8')
const header = Buffer.alloc(4)
header.writeUInt32LE(buf.length, 0)
sock.write(Buffer.concat([header, buf]))
})
}