OverviewFilesCommitsIssuesDocsReleasesPeers

keet-daemon / test / probe-state-v3-class.mjs

50 lines · javascript ref:
// P1 verify: StateBaseV3 class — single-writer set/get/list/del + persistence
// across a close/reopen (the "survives restart" guarantee). network:false.
import { StateBaseV3 } from '../lib/state-base-v3.js'
import crypto from 'hypercore-crypto'
import fs from 'bare-fs'
import path from 'bare-path'
import os from 'bare-os'

const root = path.join(os.tmpdir(), 'sbv3-class-' + Bare.pid)
try { fs.rmSync(root, { recursive: true, force: true }) } catch {}
const roomKey = crypto.randomBytes(32)
const roomSeed = crypto.randomBytes(32)
const opts = { roomSeed, encryptionKey: roomSeed, network: false }

let pass = 0; let fail = 0
const ok = (c, m) => { if (c) { pass++; console.log('  ok  ' + m) } else { fail++; console.log('  FAIL ' + m) } }

async function main () {
  // session 1
  const a = new StateBaseV3(root, roomKey, opts)
  await a.ready()
  ok(a.writable, 'creator opens writable')
  await a.set('world:players:m1', { memberId: 'm1', pos: [1, 2, 3], level: 'town', ts: 10 })
  await a.set('world:settings:sky', { value: 12.5 })
  await a.set('world:terrain:0:0', { data: 'chunk' })
  const p = await a.get('world:players:m1')
  ok(p && p.level === 'town' && p.pos[0] === 1, 'get player round-trips')
  const list = await a.list('world:')
  ok(Object.keys(list).length === 3, 'list prefix world: → ' + Object.keys(list).length + ' (expect 3)')
  await a.del('world:settings:sky')
  ok((await a.get('world:settings:sky')) === null, 'del removes setting')
  await a.close()

  // session 2 — reopen same path+seed → must persist
  const b = new StateBaseV3(root, roomKey, opts)
  await b.ready()
  const p2 = await b.get('world:players:m1')
  ok(p2 && p2.level === 'town', 'PERSISTED across reopen: player survives (level=' + (p2 && p2.level) + ')')
  const t2 = await b.get('world:terrain:0:0')
  ok(t2 && t2.data === 'chunk', 'PERSISTED across reopen: terrain survives')
  ok((await b.get('world:settings:sky')) === null, 'PERSISTED across reopen: deleted setting stays gone')
  ok(b.stateBaseKey && a, 'deterministic base.key stable')
  await b.close()

  try { fs.rmSync(root, { recursive: true, force: true }) } catch {}
  console.log('\n[probe] pass=' + pass + ' fail=' + fail)
  Bare.exit(fail ? 1 : 0)
}
main().catch((e) => { console.error('[probe] THREW:', e && e.stack ? e.stack : e); Bare.exit(2) })