0.12.0 Begin neu Architecture

This commit is contained in:
2026-03-18 15:35:10 +00:00
parent d00191324b
commit 0a9cf6969f
30 changed files with 4570 additions and 183 deletions
+69 -13
View File
@@ -7,6 +7,17 @@ class WebSocketService {
this.clients = new Set();
}
_removeClient(socket, logLevel = 'info', event = 'client:removed') {
if (!socket) {
return;
}
const deleted = this.clients.delete(socket);
if (!deleted) {
return;
}
logger[logLevel](event, { clients: this.clients.size });
}
init(httpServer) {
if (this.wss) {
return;
@@ -18,21 +29,32 @@ class WebSocketService {
this.clients.add(socket);
logger.info('client:connected', { clients: this.clients.size });
socket.send(
JSON.stringify({
type: 'WS_CONNECTED',
payload: { connectedAt: new Date().toISOString() }
})
);
try {
socket.send(
JSON.stringify({
type: 'WS_CONNECTED',
payload: { connectedAt: new Date().toISOString() }
})
);
} catch (error) {
logger.warn('client:connected:initial-send-failed', {
clients: this.clients.size,
error: error?.message || String(error)
});
this._removeClient(socket, 'warn', 'client:connected:removed-after-send-failure');
return;
}
socket.on('close', () => {
this.clients.delete(socket);
logger.info('client:closed', { clients: this.clients.size });
this._removeClient(socket, 'info', 'client:closed');
});
socket.on('error', () => {
this.clients.delete(socket);
logger.warn('client:error', { clients: this.clients.size });
socket.on('error', (error) => {
logger.warn('client:error', {
clients: this.clients.size,
error: error?.message || String(error)
});
this._removeClient(socket, 'warn', 'client:error:removed');
});
});
}
@@ -55,8 +77,42 @@ class WebSocketService {
});
for (const client of this.clients) {
if (client.readyState === client.OPEN) {
client.send(message);
if (!client || client.readyState !== client.OPEN) {
if (client && client.readyState === client.CLOSED) {
this._removeClient(client, 'info', 'client:pruned-closed');
}
continue;
}
try {
client.send(message, (error) => {
if (!error) {
return;
}
logger.warn('broadcast:send-failed', {
type,
clients: this.clients.size,
error: error?.message || String(error)
});
this._removeClient(client, 'warn', 'client:removed-after-send-failure');
try {
client.terminate();
} catch (_error) {
// noop
}
});
} catch (error) {
logger.warn('broadcast:send-threw', {
type,
clients: this.clients.size,
error: error?.message || String(error)
});
this._removeClient(client, 'warn', 'client:removed-after-send-throw');
try {
client.terminate();
} catch (_terminateError) {
// noop
}
}
}
}