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: [] })
|
||||
}
|
||||
|
||||
// =====================================================================
|
||||
// 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)
|
||||
// =====================================================================
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user