// 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()