bda63b6f0a
Resolved conflicts in routes.js and share.html: kept the dev tree's superset (ALLOW_LOCAL_LOGIN dev escape, avatar sync, richer login errors) which already includes the incoming production BizGaze-only behavior; took the more descriptive incoming comments. Restored 5 untracked modules (chat, calls, directory, reminders, webhooks) that were missing from disk — required by routes/signaling. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
32 lines
1.0 KiB
JavaScript
32 lines
1.0 KiB
JavaScript
// Chat presence + real-time delivery. A logged-in user opens a WebSocket and sends
|
|
// `chat-hello`; signaling.js registers the socket here. Messages are persisted over HTTP
|
|
// (routes.js) and pushed live to the recipient's sockets via pushToUser().
|
|
const { chatClients } = require('./presence');
|
|
|
|
function register(userId, ws) {
|
|
if (!chatClients.has(userId)) chatClients.set(userId, new Set());
|
|
chatClients.get(userId).add(ws);
|
|
ws._chatUserId = userId;
|
|
}
|
|
|
|
function unregister(ws) {
|
|
const id = ws && ws._chatUserId;
|
|
if (!id) return;
|
|
const set = chatClients.get(id);
|
|
if (set) { set.delete(ws); if (!set.size) chatClients.delete(id); }
|
|
}
|
|
|
|
function isOnline(userId) {
|
|
const s = chatClients.get(userId);
|
|
return !!(s && s.size);
|
|
}
|
|
|
|
function pushToUser(userId, obj) {
|
|
const s = chatClients.get(userId);
|
|
if (!s) return;
|
|
const data = JSON.stringify(obj);
|
|
for (const ws of s) { if (ws.readyState === 1) { try { ws.send(data); } catch (_) {} } }
|
|
}
|
|
|
|
module.exports = { register, unregister, isOnline, pushToUser };
|