feat: implement right-click context menu for style customization and enhance real-time stats tracking
This commit is contained in:
@@ -55,8 +55,10 @@ async function flushStats(): Promise<void> {
|
||||
broadcastScheduled = false;
|
||||
lastBroadcastAt = Date.now();
|
||||
if (clients.size === 0) return;
|
||||
const distinctIps = new Set<string>();
|
||||
for (const s of clients.values()) distinctIps.add(s.ip);
|
||||
const snapshot = await buildSnapshot({
|
||||
connectedTabs: clients.size,
|
||||
connectedTabs: distinctIps.size,
|
||||
typingNow: countTyping(Date.now()),
|
||||
});
|
||||
const payload = JSON.stringify({ type: "stats", data: snapshot });
|
||||
@@ -78,6 +80,15 @@ setInterval(() => {
|
||||
if (clients.size > 0) void flushStats();
|
||||
}, 1000);
|
||||
|
||||
// Periodic console log of connected IPs (every 10 s).
|
||||
setInterval(() => {
|
||||
if (clients.size === 0) return;
|
||||
const ips = new Set<string>();
|
||||
for (const s of clients.values()) ips.add(s.ip);
|
||||
const lines = [...ips].map((ip) => ` ${ip}`).join("\n");
|
||||
console.log(`[connectés] ${ips.size} IP(s):\n${lines}`);
|
||||
}, 10_000);
|
||||
|
||||
/** Send an arbitrary frame to every connected tab. */
|
||||
export function broadcast(payload: object): void {
|
||||
const str = JSON.stringify(payload);
|
||||
|
||||
Reference in New Issue
Block a user