90 lines
1.9 KiB
JavaScript
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')
|
|
}
|