feat: implement fully dynamic real-time domains list via WebSocket

Add WebSocket broadcasting of complete domains list from server to clients
Implement periodic domain list updates (10-second intervals)
Fix reconnection issues where domains list remained empty after p2ns restart
Add proper state management for WebSocket disconnect/reconnect scenarios
Enhance empty state messages to show "Disconnected" status during outages
Reset scroll/pagination state when receiving WebSocket domain updates
Add client-server request/response mechanism for immediate domain list refresh
Ensure domains list updates in real-time during consensus resolution
Remove conflicting HTTP fetches during reconnection to prevent race conditions
This commit is contained in:
Raven Scott
2025-12-26 18:16:02 -05:00
parent eff22719ff
commit 0e03ff10e2
5 changed files with 330 additions and 12 deletions
+13 -3
View File
@@ -136,11 +136,21 @@ function genericRenderInfiniteScroll(tabId) {
const emptyRow = document.createElement('tr');
emptyRow.className = 'border-b';
const colCount = tabId === 'host-servers' ? 7 : (tabId === 'host-clients' ? 6 : (tabId === 'domains' ? 4 : 3));
let message = '';
let subMessage = '';
if (tabId === 'domains' && !window.wsConnected) {
message = 'Disconnected';
subMessage = 'Reconnecting to P2NS server...';
} else {
message = `No ${tabId === 'host-servers' ? 'servers' : tabId === 'host-clients' ? 'clients' : 'items'} found`;
subMessage = tabId === 'host-servers' ? 'Create a server to get started' : tabId === 'host-clients' ? 'Create a client to get started' : 'Try adjusting your search';
}
emptyRow.innerHTML = `<td colspan="${colCount}" class="p-8 text-center theme-text-tertiary">
<div class="flex flex-col items-center gap-2">
<span class="text-4xl">📭</span>
<span class="text-lg font-semibold">No ${tabId === 'host-servers' ? 'servers' : tabId === 'host-clients' ? 'clients' : 'items'} found</span>
<span class="text-sm">${tabId === 'host-servers' ? 'Create a server to get started' : tabId === 'host-clients' ? 'Create a client to get started' : 'Try adjusting your search'}</span>
<span class="text-4xl">${tabId === 'domains' && !window.wsConnected ? '🔌' : '📭'}</span>
<span class="text-lg font-semibold">${message}</span>
<span class="text-sm">${subMessage}</span>
</div>
</td>`;
container.appendChild(emptyRow);