OverviewFilesCommitsIssuesDocsReleasesPeers

pear-git-v3 / scripts / inspect-identity-db.mjs

75 lines · javascript ref:
#!/usr/bin/env node
/**
 * Read-only inspect of pear-git-v3's identity-db hyperbee — the direct-
 * write per-daemon KV store, separate from the autobase view.
 *
 * Daemon must be stopped first (RocksDB exclusive lock).
 *
 * Usage: node scripts/inspect-identity-db.mjs [storage-path]
 */
import Corestore from 'corestore'
import Hyperbee from 'hyperbee'
import b4a from 'b4a'

const STORE = process.argv[2] || '/home/fleeky/pgv3-storage/store'

async function main () {
  console.log('opening', STORE, '(read-only)')
  const store = new Corestore(STORE)
  await store.ready()

  const dbCore = store.namespace('identity-db').get({ name: 'db' })
  await dbCore.ready()

  console.log('--- identity-db core ---')
  console.log('  key:        ', b4a.toString(dbCore.key, 'hex').slice(0, 24) + '…')
  console.log('  length:     ', dbCore.length)
  console.log('  fork:       ', dbCore.fork)
  console.log('  writable:   ', dbCore.writable)

  if (dbCore.length === 0) {
    console.log('  (empty — no entries to enumerate)')
    await dbCore.close()
    await store.close()
    return
  }

  const bee = new Hyperbee(dbCore, {
    keyEncoding: 'utf-8',
    valueEncoding: 'json'
  })
  await bee.ready()

  console.log('--- bee ---')
  console.log('  version:    ', bee.version)
  console.log('  feed.length:', bee.feed && bee.feed.length)

  console.log('--- entries by prefix ---')
  const prefixes = ['identity:', 'sshkey:', 'pubkey:', 'noisekey:', 'username:', 'pending:']
  for (const prefix of prefixes) {
    let count = 0
    const samples = []
    for await (const e of bee.createReadStream({ gte: prefix, lt: prefix + '\xff' })) {
      count++
      if (samples.length < 3) samples.push(e.key)
    }
    if (count > 0) {
      console.log(`  ${prefix.padEnd(14)} ${count} entries  sample: ${samples.join(', ').slice(0, 100)}`)
    }
  }

  console.log('--- TOTAL keys (full scan) ---')
  let total = 0
  for await (const _ of bee.createReadStream()) total++
  console.log('  total entries:', total)

  await dbCore.close()
  await store.close()
}

main().catch(err => {
  console.error('error:', err.message)
  if (err.stack) console.error(err.stack)
  process.exit(1)
})