Files
peardata/server/db/index.js
T
Raven Scott 1d46b7b3ad
CI / test (push) Failing after 6s
Release rolling / release (push) Has been cancelled
updates
2026-07-18 19:11:32 -04:00

90 lines
1.9 KiB
JavaScript

/**
* Open / close the agent HyperDB (Corestore-backed bee).
*
* Storage layout (under PEARDATA_DATA_DIR):
* data/corestore/ — Corestore rocks/hypercores
* Named core: "peardata-meta"
*
* Disable with PEARDATA_HYPERDB=0
*/
import path from 'path'
import Corestore from 'corestore'
import { PearDataModel } from './model.js'
import logger from '../utils/logger.js'
const log = logger.child('db')
/** @type {import('corestore')|null} */
let store = null
/** @type {PearDataModel|null} */
let model = null
export function isHyperDbEnabled() {
const v = process.env.PEARDATA_HYPERDB
if (v === '0' || v === 'off' || v === 'false') return false
return true
}
export function getDataDir() {
return process.env.PEARDATA_DATA_DIR || path.resolve('data')
}
/**
* @returns {Promise<PearDataModel|null>}
*/
export async function openDb() {
if (!isHyperDbEnabled()) {
log.info('HyperDB disabled (PEARDATA_HYPERDB=0)')
return null
}
if (model) return model
const dataDir = getDataDir()
const storePath = path.join(dataDir, 'corestore')
store = new Corestore(storePath)
await store.ready()
const core = store.get({ name: 'peardata-meta' })
model = new PearDataModel(core, { autoUpdate: true })
await model.ready()
log.info('HyperDB ready', {
storePath,
publicKeyHex: model.publicKeyHex,
discoveryKeyHex: model.discoveryKeyHex,
})
return model
}
/**
* @returns {PearDataModel|null}
*/
export function getDb() {
return model
}
/**
* @returns {import('corestore')|null}
*/
export function getCorestore() {
return store
}
export async function closeDb() {
try {
const { closeRemoteDbs } = await import('./remote.js')
await closeRemoteDbs()
} catch {
// ignore
}
if (model) {
await model.close().catch(() => {})
model = null
}
if (store) {
await store.close().catch(() => {})
store = null
}
log.info('HyperDB closed')
}