// Demo data for testing the Members view without actual cluster data window.demoMembersData = { members: [ { hostname: "spore-node-1", ip: "192.168.1.100", lastSeen: Date.now(), latency: 3, status: "ACTIVE", resources: { freeHeap: 48748, chipId: 12345678, sdkVersion: "3.1.2", cpuFreqMHz: 80, flashChipSize: 1048576 }, api: [ { uri: "/api/node/status", method: "GET" }, { uri: "/api/tasks/status", method: "GET" } ] }, { hostname: "spore-node-2", ip: "192.168.1.101", lastSeen: Date.now() - 5000, latency: 8, status: "ACTIVE", resources: { freeHeap: 52340, chipId: 87654321, sdkVersion: "3.1.2", cpuFreqMHz: 80, flashChipSize: 1048576 }, api: [ { uri: "/api/node/status", method: "GET" }, { uri: "/api/tasks/status", method: "GET" } ] }, { hostname: "spore-node-3", ip: "192.168.1.102", lastSeen: Date.now() - 15000, latency: 12, status: "INACTIVE", resources: { freeHeap: 38920, chipId: 11223344, sdkVersion: "3.1.1", cpuFreqMHz: 80, flashChipSize: 1048576 }, api: [ { uri: "/api/node/status", method: "GET" } ] }, { hostname: "spore-node-4", ip: "192.168.1.103", lastSeen: Date.now() - 30000, latency: 25, status: "ACTIVE", resources: { freeHeap: 45678, chipId: 55667788, sdkVersion: "3.1.2", cpuFreqMHz: 80, flashChipSize: 1048576 }, api: [ { uri: "/api/node/status", method: "GET" }, { uri: "/api/tasks/status", method: "GET" }, { uri: "/api/capabilities", method: "GET" } ] }, { hostname: "spore-node-5", ip: "192.168.1.104", lastSeen: Date.now() - 60000, latency: 45, status: "DEAD", resources: { freeHeap: 0, chipId: 99887766, sdkVersion: "3.1.0", cpuFreqMHz: 0, flashChipSize: 1048576 }, api: [] } ] }; // Mock API client for demo purposes window.demoApiClient = { async getClusterMembers() { // Simulate network delay await new Promise(resolve => setTimeout(resolve, 500)); return window.demoMembersData; }, async getClusterMembersFromNode(ip) { // Simulate network delay await new Promise(resolve => setTimeout(resolve, 200)); // Return a subset of members to simulate different node perspectives const allMembers = window.demoMembersData.members; const nodeIndex = allMembers.findIndex(m => m.ip === ip); if (nodeIndex === -1) { return { members: [] }; } // Simulate each node seeing a different subset of the cluster const startIndex = (nodeIndex * 2) % allMembers.length; const members = [ allMembers[startIndex], allMembers[(startIndex + 1) % allMembers.length], allMembers[(startIndex + 2) % allMembers.length] ]; return { members: members.filter(m => m.ip !== ip) }; } };