Loading…
Opinionated Express.js HTTP server wrapper for @bsv/overlay with built-in configuration, health checks, and peer discovery.
npm install @bsv/overlay-expressimport OverlayExpress from '@bsv/overlay-express'
const server = new OverlayExpress('testnode', process.env.SERVER_PRIVATE_KEY!, 'example.com')
server.configurePort(8080)
await server.configureKnex(process.env.KNEX_URL!)
await server.configureMongo(process.env.MONGO_URL!)
server.configureTopicManager('tm_helloworld', new HelloWorldTopicManager())
await server.configureLookupServiceWithMongo('ls_helloworld', mongoDb =>
createHelloWorldLookupService(mongoDb)
)
await server.configureEngine()
await server.start()
process.once('SIGTERM', () => void server.close())
process.once('SIGINT', () => void server.close())/health/live, /health/ready, /health with custom checksclose() drains HTTP and closes background work and databasesconst server = new OverlayExpress('mynode', privateKey, 'mynode.example.com')
server.configurePort(3000)
await server.configureKnex('postgresql://user:pass@localhost/db')server.configureTopicManager('tm_helloworld', new HelloWorldTopicManager())
server.configureTopicManager('tm_kvstore', new KVStoreTopicManager())
server.configureTopicManager('tm_did', new DIDTopicManager())
await server.configureLookupServiceWithMongo('ls_helloworld', db =>
createHelloWorldLookupService(db)
)
await server.configureLookupServiceWithMongo('ls_kvstore', db => createKVStoreLookupService(db))
await server.configureLookupServiceWithMongo('ls_did', db => createDIDLookupService(db))
await server.configureEngine()
await server.start()server.configureHealth({
contextProvider: async () => ({
deployment: 'my-overlay',
network: 'main'
})
})
server.registerHealthCheck({
name: 'custom-cache',
critical: false,
handler: async () => ({
status: 'ok',
details: { warmed: true }
})
})server.configureEngineParams({
logTime: true,
throwOnBroadcastFailure: true,
suppressDefaultSyncAdvertisements: false
})
server.configureEnableGASPSync(true)
server.configureArcade(process.env.ARCADE_URL!, {
apiKey: process.env.ARCADE_API_KEY,
deploymentId: process.env.ARCADE_DEPLOYMENT_ID
})
server.configureArcApiKey(process.env.ARC_API_KEY!)
server.configureChaintracks(process.env.CHAINTRACKS_URL ?? process.env.ARCADE_URL!, {
apiPrefix: '/chaintracks/v2',
reorgStream: true,
scanDepth: 3
})
server.configureEnableBASMSync(true)
server.configureUnprovenMaintenance({
thresholdBlocks: 144,
intervalMs: 60 * 60 * 1000
})
server.configureWebUI({
host: 'https://example.com',
primaryColor: '#ff0000'
})import { OverlayMonitor } from '@bsv/overlay-express'
const monitor = new OverlayMonitor({
intervalMs: 60 * 60 * 1000,
targets: [
{
name: 'production-overlay',
baseUrl: 'https://overlay.example',
adminToken: process.env.ADMIN_TOKEN,
probes: [
{
name: 'protomap',
service: 'ls_protomap',
query: { topic: 'tm_protomap' },
maxOutputs: 50
}
],
maintenance: {
startBASMSync: true,
maintainUnproven: { thresholdBlocks: 144 },
janitor: true
}
}
]
})
monitor.start()/admin/syncAdvertisements, /admin/startGASPSync)OVERLAY_CORS_ALLOWED_HEADERS only for a strict
comma-separated browser header allowlist/arc-ingest accepts Arc/Arcade callback notifications,
applies proofs, and evicts terminal invalid or double-spent transactionsconfigureKnex and configureMongo must complete before configureEngine()critical: true only for mandatory dependencies; failures block /health/readythrowOnBroadcastFailure: true for production so
provider outages do not create local-only overlay state./chaintracks/v2.await server.close() from the owning runtime
so listeners, sync timers, reorg streaming, Knex, and MongoDB close together.