OverviewFilesCommitsIssuesDocsReleasesPeers

hyperswarm-peer / integration / test_meta_set.js

108 lines · javascript ref:
/**
 * 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]))
  })
}