From 73bd1b8601a73385cd88dfd0574df4a35a964919 Mon Sep 17 00:00:00 2001 From: Dorian Date: Tue, 17 Mar 2026 01:32:02 +0000 Subject: [PATCH] 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) --- neode-ui/mock-backend.js | 169 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 169 insertions(+) diff --git a/neode-ui/mock-backend.js b/neode-ui/mock-backend.js index 14402ddd..d02cd914 100755 --- a/neode-ui/mock-backend.js +++ b/neode-ui/mock-backend.js @@ -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) // =====================================================================