feat: add federation + DWN seed data to mock backend
- Federation: 3 federated nodes with full state snapshots (apps, CPU, disk, uptime) - Federation invite/join/sync/set-trust/remove/deploy-app mock handlers - DWN status with 3 protocols, message counts, sync state - Enables testing Federation.vue and Web5.vue in local dev mode Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
1ced0fdbf3
commit
73bd1b8601
@ -1275,6 +1275,175 @@ app.post('/rpc/v1', (req, res) => {
|
|||||||
return res.json({ result: [] })
|
return res.json({ result: [] })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// Federation (multi-node clusters)
|
||||||
|
// =====================================================================
|
||||||
|
case 'federation.list-nodes': {
|
||||||
|
return res.json({
|
||||||
|
result: {
|
||||||
|
nodes: [
|
||||||
|
{
|
||||||
|
did: 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2ReMkBe4bR6XBIDNq9',
|
||||||
|
pubkey: 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2',
|
||||||
|
onion: 'peer1abc2def3ghi4jkl5mno6pqr7stu8vwx9yz.onion',
|
||||||
|
trust_level: 'trusted',
|
||||||
|
added_at: '2026-02-15T10:30:00Z',
|
||||||
|
name: 'archy-198',
|
||||||
|
last_seen: new Date(Date.now() - 120000).toISOString(),
|
||||||
|
last_state: {
|
||||||
|
timestamp: new Date(Date.now() - 120000).toISOString(),
|
||||||
|
apps: [
|
||||||
|
{ id: 'bitcoin-knots', status: 'running', version: '27.1' },
|
||||||
|
{ id: 'lnd', status: 'running', version: '0.18.0' },
|
||||||
|
{ id: 'mempool', status: 'running', version: '3.0' },
|
||||||
|
{ id: 'electrs', status: 'running', version: '0.10.0' },
|
||||||
|
],
|
||||||
|
cpu_usage_percent: 18.3,
|
||||||
|
mem_used_bytes: 6_200_000_000,
|
||||||
|
mem_total_bytes: 16_000_000_000,
|
||||||
|
disk_used_bytes: 820_000_000_000,
|
||||||
|
disk_total_bytes: 1_800_000_000_000,
|
||||||
|
uptime_secs: 604800,
|
||||||
|
tor_active: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
did: 'did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH',
|
||||||
|
pubkey: 'f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5d4c3b2a1f6e5',
|
||||||
|
onion: 'peer2xyz9wvu8tsr7qpo6nml5kji4hgf3edc2ba.onion',
|
||||||
|
trust_level: 'trusted',
|
||||||
|
added_at: '2026-03-01T14:00:00Z',
|
||||||
|
name: 'arch-tailscale-1',
|
||||||
|
last_seen: new Date(Date.now() - 300000).toISOString(),
|
||||||
|
last_state: {
|
||||||
|
timestamp: new Date(Date.now() - 300000).toISOString(),
|
||||||
|
apps: [
|
||||||
|
{ id: 'bitcoin-knots', status: 'running', version: '27.1' },
|
||||||
|
{ id: 'lnd', status: 'running', version: '0.18.0' },
|
||||||
|
{ id: 'nextcloud', status: 'running', version: '29.0' },
|
||||||
|
],
|
||||||
|
cpu_usage_percent: 42.1,
|
||||||
|
mem_used_bytes: 10_500_000_000,
|
||||||
|
mem_total_bytes: 32_000_000_000,
|
||||||
|
disk_used_bytes: 1_200_000_000_000,
|
||||||
|
disk_total_bytes: 2_000_000_000_000,
|
||||||
|
uptime_secs: 259200,
|
||||||
|
tor_active: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
did: 'did:key:z6MkrHKPxJP6tvCvXMaJKZd3rRA2Y44tyftVhR8FDCMKGFjb',
|
||||||
|
pubkey: 'c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4',
|
||||||
|
onion: 'peer3mno6pqr7stu8vwx9yzabc2def3ghi4jkl5.onion',
|
||||||
|
trust_level: 'observer',
|
||||||
|
added_at: '2026-03-10T09:15:00Z',
|
||||||
|
name: 'bunker-alpha',
|
||||||
|
last_seen: new Date(Date.now() - 3600000).toISOString(),
|
||||||
|
last_state: {
|
||||||
|
timestamp: new Date(Date.now() - 3600000).toISOString(),
|
||||||
|
apps: [
|
||||||
|
{ id: 'bitcoin-knots', status: 'running', version: '27.1' },
|
||||||
|
{ id: 'vaultwarden', status: 'running', version: '1.31.0' },
|
||||||
|
],
|
||||||
|
cpu_usage_percent: 5.8,
|
||||||
|
mem_used_bytes: 2_100_000_000,
|
||||||
|
mem_total_bytes: 8_000_000_000,
|
||||||
|
disk_used_bytes: 450_000_000_000,
|
||||||
|
disk_total_bytes: 1_000_000_000_000,
|
||||||
|
uptime_secs: 1209600,
|
||||||
|
tor_active: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'federation.invite': {
|
||||||
|
const mockCode = 'fed1:' + Buffer.from(JSON.stringify({
|
||||||
|
did: 'did:key:z6MkTest228NodeInvite',
|
||||||
|
onion: 'self228abc2def3ghi4jkl5mno6pqr7stu8vwx.onion',
|
||||||
|
pubkey: 'aabbccdd',
|
||||||
|
token: 'mock-invite-token-' + Date.now(),
|
||||||
|
})).toString('base64url')
|
||||||
|
return res.json({
|
||||||
|
result: {
|
||||||
|
code: mockCode,
|
||||||
|
did: 'did:key:z6MkTest228NodeInvite',
|
||||||
|
onion: 'self228abc2def3ghi4jkl5mno6pqr7stu8vwx.onion',
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'federation.join': {
|
||||||
|
console.log(`[Federation] Joining with code: ${params?.code?.substring(0, 20)}...`)
|
||||||
|
return res.json({
|
||||||
|
result: {
|
||||||
|
joined: true,
|
||||||
|
node: {
|
||||||
|
did: 'did:key:z6MkNewJoinedNode',
|
||||||
|
onion: 'newnode123abc456def789ghi012jkl345mno6pqr.onion',
|
||||||
|
pubkey: 'ddeeff11',
|
||||||
|
trust_level: 'trusted',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'federation.sync-state': {
|
||||||
|
return res.json({
|
||||||
|
result: {
|
||||||
|
synced: 3,
|
||||||
|
failed: 0,
|
||||||
|
results: [
|
||||||
|
{ did: 'did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2ReMkBe4bR6XBIDNq9', status: 'synced', apps: 4 },
|
||||||
|
{ did: 'did:key:z6MkpTHR8VNsBxYAAWHut2Geadd9jSwuBV8xRoAnwWsdvktH', status: 'synced', apps: 3 },
|
||||||
|
{ did: 'did:key:z6MkrHKPxJP6tvCvXMaJKZd3rRA2Y44tyftVhR8FDCMKGFjb', status: 'synced', apps: 2 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'federation.set-trust': {
|
||||||
|
console.log(`[Federation] Set trust: ${params?.did} -> ${params?.trust_level}`)
|
||||||
|
return res.json({ result: { updated: true, did: params?.did, trust_level: params?.trust_level } })
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'federation.remove-node': {
|
||||||
|
console.log(`[Federation] Remove node: ${params?.did}`)
|
||||||
|
return res.json({ result: { removed: true, nodes_remaining: 2 } })
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'federation.deploy-app': {
|
||||||
|
console.log(`[Federation] Deploy app: ${params?.app_id} to ${params?.target_did}`)
|
||||||
|
return res.json({ result: { deployed: true, app_id: params?.app_id } })
|
||||||
|
}
|
||||||
|
|
||||||
|
// =====================================================================
|
||||||
|
// DWN (Decentralized Web Node)
|
||||||
|
// =====================================================================
|
||||||
|
case 'dwn.status': {
|
||||||
|
return res.json({
|
||||||
|
result: {
|
||||||
|
running: true,
|
||||||
|
protocols_registered: 3,
|
||||||
|
messages_stored: 47,
|
||||||
|
peers_synced: 2,
|
||||||
|
last_sync: new Date(Date.now() - 600000).toISOString(),
|
||||||
|
protocols: [
|
||||||
|
{ uri: 'https://archipelago.dev/protocols/node-identity/v1', published: true, messages: 12 },
|
||||||
|
{ uri: 'https://archipelago.dev/protocols/federation/v1', published: false, messages: 28 },
|
||||||
|
{ uri: 'https://archipelago.dev/protocols/app-deploy/v1', published: false, messages: 7 },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
case 'dwn.sync': {
|
||||||
|
console.log('[DWN] Syncing with peers...')
|
||||||
|
return res.json({ result: { synced: true, messages_pulled: 5, messages_pushed: 3 } })
|
||||||
|
}
|
||||||
|
|
||||||
// =====================================================================
|
// =====================================================================
|
||||||
// Mesh Networking (LoRa radio via Meshcore)
|
// Mesh Networking (LoRa radio via Meshcore)
|
||||||
// =====================================================================
|
// =====================================================================
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user