OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-vdrive / test / releases.mjs

68 lines · javascript ref:
// N successive releases into ONE virtual drive, at the same path.
// Measures store size and publish time per release.
//   node test/releases.mjs <workDir> <file...>
import { createRequire } from 'module'
const require = createRequire(import.meta.url)

const fs = require('fs')
const { execFileSync } = require('child_process')
const Corestore = require('corestore')
const Hyperdrive = require('hyperdrive')
const { ContentStore, build, stats } = require('../lib/storage.cjs')
const { chunk } = await import('../../hyper-overlay/lib/chunker.js')

const ROOT = process.argv[2]
const SRC = process.argv.slice(3)
const NAME = '/app.bin'
const PRIMARY = Buffer.alloc(32, 7)
const du = (p) => Number(execFileSync('du', ['-sb', p]).toString().split('\t')[0])

const content = new ContentStore()
const Storage = build(content)
const dir = ROOT + '/virtual'

function write (ws, buf) {
  return new Promise((resolve) => {
    if (ws.write(buf)) return resolve()
    ws.once('drain', resolve)
  })
}

for (const [i, file] of SRC.entries()) {
  const t0 = Date.now()
  const buf = fs.readFileSync(file)
  const chunks = chunk(buf)
  for (const c of chunks) content.add(c.hash, file, c.offset, c.length)

  const store = new Corestore(new Storage(dir), { primaryKey: PRIMARY, unsafe: true })
  const drive = new Hyperdrive(store)
  await drive.ready()

  const ws = drive.createWriteStream(NAME, { dedup: true })
  for (const c of chunks) await write(ws, c.data)
  await new Promise((resolve, reject) => {
    ws.once('error', reject)
    ws.once('close', resolve)
    ws.end()
  })

  await drive.getBlobs()
  const blobsLength = drive.blobs.core.length
  await drive.close()
  await store.close()

  console.log(
    JSON.stringify({
      release: i + 1,
      input: buf.length,
      blobsLength,
      redirectedBlocks: stats.putRedirected,
      literalBlocks: stats.putStored,
      storeBytes: du(dir),
      elapsedMs: Date.now() - t0
    })
  )
}

content.close()