add GET /bee/stats — JWT-guarded read-only bee node stats
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
3244848ae0
commit
3618f5baf6
2 files changed
+66
No files matched your search
@@ -8,6 +8,7 @@ import { usersRoutes } from './users/routes';
|
|||||||
import { accountsRoutes } from './accounts/routes';
|
import { accountsRoutes } from './accounts/routes';
|
||||||
import { apiKeysRoutes } from './apiKeys/routes';
|
import { apiKeysRoutes } from './apiKeys/routes';
|
||||||
import { gatewayRoutes } from './gateway/routes';
|
import { gatewayRoutes } from './gateway/routes';
|
||||||
|
import { beeRoutes } from './bee/routes';
|
||||||
import { getGatewayContext } from './gateway/context';
|
import { getGatewayContext } from './gateway/context';
|
||||||
|
|
||||||
const app = new Elysia()
|
const app = new Elysia()
|
||||||
@@ -25,6 +26,7 @@ const app = new Elysia()
|
|||||||
.use(usersRoutes)
|
.use(usersRoutes)
|
||||||
.use(accountsRoutes)
|
.use(accountsRoutes)
|
||||||
.use(apiKeysRoutes)
|
.use(apiKeysRoutes)
|
||||||
|
.use(beeRoutes)
|
||||||
.use(gatewayRoutes);
|
.use(gatewayRoutes);
|
||||||
|
|
||||||
// Start the HTTP server immediately so auth / accounts / api-keys routes are
|
// Start the HTTP server immediately so auth / accounts / api-keys routes are
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
import Elysia from 'elysia';
|
||||||
|
import { Bee } from '@ethersphere/bee-js';
|
||||||
|
import { jwtGuard } from '../auth/jwt';
|
||||||
|
import { env } from '../env';
|
||||||
|
import { logger } from '../logger';
|
||||||
|
|
||||||
|
const bee = new Bee(env.BEE_API_URL);
|
||||||
|
|
||||||
|
function settled<T, U>(p: Promise<T>, map: (v: T) => U): Promise<U | null> {
|
||||||
|
return p.then(map).catch((err) => {
|
||||||
|
logger.warn({ err: (err as Error).message }, 'bee stats field failed');
|
||||||
|
return null;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export const beeRoutes = new Elysia({ prefix: '/bee' })
|
||||||
|
.use(jwtGuard)
|
||||||
|
.get('/stats', async () => {
|
||||||
|
const [health, addresses, topology, wallet, stamps, chain] = await Promise.all([
|
||||||
|
settled(bee.getHealth(), (h) => ({
|
||||||
|
status: h.status,
|
||||||
|
version: h.version,
|
||||||
|
apiVersion: h.apiVersion,
|
||||||
|
})),
|
||||||
|
settled(bee.getNodeAddresses(), (a) => ({
|
||||||
|
overlay: a.overlay.toString(),
|
||||||
|
ethereum: a.ethereum.toString(),
|
||||||
|
publicKey: a.publicKey.toString(),
|
||||||
|
pssPublicKey: a.pssPublicKey.toString(),
|
||||||
|
underlay: a.underlay,
|
||||||
|
})),
|
||||||
|
settled(bee.getTopology(), (t) => ({
|
||||||
|
connected: t.connected,
|
||||||
|
population: t.population,
|
||||||
|
depth: t.depth,
|
||||||
|
reachability: t.reachability,
|
||||||
|
networkAvailability: t.networkAvailability,
|
||||||
|
})),
|
||||||
|
settled(bee.getWalletBalance(), (w) => ({
|
||||||
|
bzz: w.bzzBalance.toDecimalString(),
|
||||||
|
xdai: w.nativeTokenBalance.toDecimalString(),
|
||||||
|
walletAddress: w.walletAddress,
|
||||||
|
chainID: w.chainID,
|
||||||
|
})),
|
||||||
|
settled(bee.getAllPostageBatch(), (batches) =>
|
||||||
|
batches.map((b) => ({
|
||||||
|
batchID: b.batchID.toString(),
|
||||||
|
label: b.label,
|
||||||
|
depth: b.depth,
|
||||||
|
amount: b.amount,
|
||||||
|
usable: b.usable,
|
||||||
|
usageText: b.usageText,
|
||||||
|
durationDays: b.duration.toDays(),
|
||||||
|
})),
|
||||||
|
),
|
||||||
|
settled(bee.getChainState(), (c) => ({
|
||||||
|
block: c.block,
|
||||||
|
chainTip: c.chainTip,
|
||||||
|
currentPrice: c.currentPrice,
|
||||||
|
})),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return { health, addresses, topology, wallet, stamps, chain };
|
||||||
|
});
|
||||||
Reference in new issue
Block a user