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:
Dorian 2026-03-17 01:32:02 +00:00
parent 1ced0fdbf3
commit 73bd1b8601

View File

@ -1275,6 +1275,175 @@ app.post('/rpc/v1', (req, res) => {
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)
// =====================================================================