@conference-kit/signaling-server 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -74,6 +74,27 @@ type PresenceMessage = {
74
74
  action: "join" | "leave";
75
75
  };
76
76
  declare function parseMessage(raw: string): IncomingMessage | null;
77
+ declare const LOG_COLORS: {
78
+ reset: string;
79
+ bright: string;
80
+ dim: string;
81
+ cyan: string;
82
+ green: string;
83
+ yellow: string;
84
+ red: string;
85
+ magenta: string;
86
+ blue: string;
87
+ };
88
+ declare function timestamp(): string;
89
+ declare function logConnect(peerId: string, room: string | null | undefined, isHost: boolean, waitingRoom: boolean): void;
90
+ declare function logDisconnect(peerId: string, room: string | null | undefined): void;
91
+ declare function logMessage(direction: "IN" | "OUT", peerId: string, type: string, details: Record<string, unknown>): void;
92
+ declare function logPresence(action: "join" | "leave", peerId: string, room: string, totalPeers: number): void;
93
+ declare function logWaitingRoom(action: string, peerId: string, room: string, waitingCount: number): void;
94
+ declare function logControl(from: string, action: string, target?: string, room?: string | null): void;
95
+ declare function logSignal(from: string, to: string, signalType?: string): void;
96
+ declare function logBroadcast(from: string, room: string | null | undefined): void;
97
+ declare function logState(): void;
77
98
  declare const HOST = "0.0.0.0";
78
99
  declare const PORT = 8787;
79
100
  declare const roomMembers: Map<string, Set<string>>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,13 +7,72 @@ function parseMessage(raw) {
7
7
  parsed.type === "broadcast" ||
8
8
  parsed.type === "control"))
9
9
  return parsed;
10
+ console.warn("[PARSE] Invalid message type:", parsed?.type);
10
11
  return null;
11
12
  }
12
13
  catch (error) {
13
- console.error("Failed to parse message", error);
14
+ console.error("[PARSE] Failed to parse message:", error, "Raw:", raw.slice(0, 200));
14
15
  return null;
15
16
  }
16
17
  }
18
+ // ─────────────────────────────────────────────────────────────────────────────
19
+ // Logging utilities
20
+ // ─────────────────────────────────────────────────────────────────────────────
21
+ const LOG_COLORS = {
22
+ reset: "\x1b[0m",
23
+ bright: "\x1b[1m",
24
+ dim: "\x1b[2m",
25
+ cyan: "\x1b[36m",
26
+ green: "\x1b[32m",
27
+ yellow: "\x1b[33m",
28
+ red: "\x1b[31m",
29
+ magenta: "\x1b[35m",
30
+ blue: "\x1b[34m",
31
+ };
32
+ function timestamp() {
33
+ return new Date().toISOString();
34
+ }
35
+ function logConnect(peerId, room, isHost, waitingRoom) {
36
+ console.log(`${LOG_COLORS.green}[${timestamp()}] ➜ CONNECT${LOG_COLORS.reset}`, `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`, `room=${LOG_COLORS.yellow}${room ?? "(none)"}${LOG_COLORS.reset}`, `isHost=${isHost}`, `waitingRoom=${waitingRoom}`);
37
+ }
38
+ function logDisconnect(peerId, room) {
39
+ console.log(`${LOG_COLORS.red}[${timestamp()}] ✖ DISCONNECT${LOG_COLORS.reset}`, `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`, `room=${LOG_COLORS.yellow}${room ?? "(none)"}${LOG_COLORS.reset}`);
40
+ }
41
+ function logMessage(direction, peerId, type, details) {
42
+ const arrow = direction === "IN" ? "◀" : "▶";
43
+ const color = direction === "IN" ? LOG_COLORS.blue : LOG_COLORS.magenta;
44
+ console.log(`${color}[${timestamp()}] ${arrow} ${direction}${LOG_COLORS.reset}`, `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`, `type=${LOG_COLORS.yellow}${type}${LOG_COLORS.reset}`, JSON.stringify(details));
45
+ }
46
+ function logPresence(action, peerId, room, totalPeers) {
47
+ const icon = action === "join" ? "+" : "-";
48
+ const color = action === "join" ? LOG_COLORS.green : LOG_COLORS.red;
49
+ console.log(`${color}[${timestamp()}] ${icon} PRESENCE ${action.toUpperCase()}${LOG_COLORS.reset}`, `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`, `room=${LOG_COLORS.yellow}${room}${LOG_COLORS.reset}`, `totalPeers=${totalPeers}`);
50
+ }
51
+ function logWaitingRoom(action, peerId, room, waitingCount) {
52
+ console.log(`${LOG_COLORS.yellow}[${timestamp()}] ⏳ WAITING ${action.toUpperCase()}${LOG_COLORS.reset}`, `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`, `room=${LOG_COLORS.yellow}${room}${LOG_COLORS.reset}`, `waitingCount=${waitingCount}`);
53
+ }
54
+ function logControl(from, action, target, room) {
55
+ console.log(`${LOG_COLORS.magenta}[${timestamp()}] ⚙ CONTROL${LOG_COLORS.reset}`, `from=${LOG_COLORS.cyan}${from}${LOG_COLORS.reset}`, `action=${LOG_COLORS.yellow}${action}${LOG_COLORS.reset}`, target ? `target=${target}` : "", room ? `room=${room}` : "");
56
+ }
57
+ function logSignal(from, to, signalType) {
58
+ console.log(`${LOG_COLORS.blue}[${timestamp()}] ⚡ SIGNAL${LOG_COLORS.reset}`, `from=${LOG_COLORS.cyan}${from}${LOG_COLORS.reset}`, `to=${LOG_COLORS.cyan}${to}${LOG_COLORS.reset}`, signalType ? `signalType=${signalType}` : "");
59
+ }
60
+ function logBroadcast(from, room) {
61
+ console.log(`${LOG_COLORS.yellow}[${timestamp()}] 📢 BROADCAST${LOG_COLORS.reset}`, `from=${LOG_COLORS.cyan}${from}${LOG_COLORS.reset}`, `room=${LOG_COLORS.yellow}${room ?? "(none)"}${LOG_COLORS.reset}`);
62
+ }
63
+ function logState() {
64
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] 📊 STATE${LOG_COLORS.reset}`, `clients=${clients.size}`, `rooms=${roomMembers.size}`, `waitingRooms=${waitingRooms.size}`);
65
+ if (roomMembers.size > 0) {
66
+ roomMembers.forEach((members, room) => {
67
+ console.log(` ${LOG_COLORS.dim}room=${room}: [${Array.from(members).join(", ")}]${LOG_COLORS.reset}`);
68
+ });
69
+ }
70
+ if (waitingRooms.size > 0) {
71
+ waitingRooms.forEach((waiters, room) => {
72
+ console.log(` ${LOG_COLORS.dim}waiting=${room}: [${Array.from(waiters).join(", ")}]${LOG_COLORS.reset}`);
73
+ });
74
+ }
75
+ }
17
76
  const HOST = "0.0.0.0";
18
77
  const PORT = 8787;
19
78
  const roomMembers = new Map();
@@ -37,10 +96,16 @@ function sendControl(target, payload) {
37
96
  action: payload.action,
38
97
  data: payload.data,
39
98
  };
99
+ logMessage("OUT", target.data.peerId, `control:${payload.action}`, {
100
+ room: payload.room,
101
+ data: payload.data,
102
+ });
40
103
  target.send(JSON.stringify(message));
41
104
  }
42
105
  function broadcastToHosts(room, payload) {
43
- getHosts(room).forEach((hostWs) => sendControl(hostWs, { action: payload.action, data: payload.data, room }));
106
+ const hosts = getHosts(room);
107
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] Broadcasting to ${hosts.length} host(s) in room ${room}: ${payload.action}${LOG_COLORS.reset}`);
108
+ hosts.forEach((hostWs) => sendControl(hostWs, { action: payload.action, data: payload.data, room }));
44
109
  }
45
110
  // Signaling server with simple room presence
46
111
  const liveServer = Bun.serve({
@@ -52,7 +117,9 @@ const liveServer = Bun.serve({
52
117
  const room = url.searchParams.get("room");
53
118
  const isHost = url.searchParams.get("host") === "1";
54
119
  const waitingRoom = url.searchParams.get("waitingRoom") === "1";
120
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] HTTP UPGRADE REQUEST${LOG_COLORS.reset}`, `peerId=${peerId}`, `room=${room}`, `isHost=${isHost}`, `waitingRoom=${waitingRoom}`);
55
121
  if (!peerId) {
122
+ console.warn(`${LOG_COLORS.red}[${timestamp()}] Rejected: missing peerId${LOG_COLORS.reset}`);
56
123
  return new Response("peerId query param is required", { status: 400 });
57
124
  }
58
125
  const upgraded = bunServer.upgrade(req, {
@@ -65,20 +132,24 @@ const liveServer = Bun.serve({
65
132
  },
66
133
  });
67
134
  if (!upgraded) {
135
+ console.error(`${LOG_COLORS.red}[${timestamp()}] WebSocket upgrade FAILED for ${peerId}${LOG_COLORS.reset}`);
68
136
  return new Response("WebSocket upgrade failed", { status: 500 });
69
137
  }
70
138
  return undefined;
71
139
  },
72
140
  websocket: {
73
141
  open(ws) {
74
- const { peerId, room } = ws.data;
142
+ const { peerId, room, isHost, waitingRoom } = ws.data;
143
+ logConnect(peerId, room, isHost ?? false, waitingRoom ?? false);
75
144
  clients.set(peerId, ws);
76
145
  ws.subscribe(`peer:${peerId}`);
146
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] Subscribed ${peerId} to peer:${peerId}${LOG_COLORS.reset}`);
77
147
  if (room) {
78
148
  if (ws.data.waitingRoom && !ws.data.isHost) {
79
149
  const waiters = waitingRooms.get(room) ?? new Set();
80
150
  waiters.add(peerId);
81
151
  waitingRooms.set(room, waiters);
152
+ logWaitingRoom("added", peerId, room, waiters.size);
82
153
  broadcastToHosts(room, {
83
154
  action: "waiting-list",
84
155
  data: { waiting: Array.from(waiters) },
@@ -88,10 +159,12 @@ const liveServer = Bun.serve({
88
159
  room,
89
160
  data: { position: waiters.size },
90
161
  });
162
+ logState();
91
163
  return;
92
164
  }
93
165
  ws.data.admitted = true;
94
166
  ws.subscribe(`room:${room}`);
167
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] Subscribed ${peerId} to room:${room}${LOG_COLORS.reset}`);
95
168
  const set = roomMembers.get(room) ?? new Set();
96
169
  set.add(peerId);
97
170
  roomMembers.set(room, set);
@@ -102,30 +175,53 @@ const liveServer = Bun.serve({
102
175
  peers: Array.from(set),
103
176
  action: "join",
104
177
  };
178
+ logPresence("join", peerId, room, set.size);
179
+ logMessage("OUT", peerId, "presence:join", {
180
+ room,
181
+ peers: Array.from(set),
182
+ });
105
183
  ws.publish(`room:${room}`, JSON.stringify(presence));
106
184
  ws.send(JSON.stringify(presence));
107
185
  // send waiting list snapshot to host
108
186
  const pending = waitingRooms.get(room);
109
187
  if (ws.data.isHost && pending && pending.size) {
188
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] Sending waiting list snapshot to host ${peerId}: ${pending.size} waiting${LOG_COLORS.reset}`);
110
189
  sendControl(ws, {
111
190
  action: "waiting-list",
112
191
  room,
113
192
  data: { waiting: Array.from(pending) },
114
193
  });
115
194
  }
195
+ logState();
116
196
  }
117
197
  },
118
198
  message(ws, raw) {
119
199
  const payload = typeof raw === "string" ? raw : raw.toString();
120
200
  const parsed = parseMessage(payload);
121
201
  if (!parsed) {
202
+ console.warn(`${LOG_COLORS.red}[${timestamp()}] Invalid message from ${ws.data.peerId}${LOG_COLORS.reset}`);
122
203
  ws.send(JSON.stringify({
123
204
  type: "error",
124
205
  message: "Invalid message payload",
125
206
  }));
126
207
  return;
127
208
  }
209
+ // Log incoming message
210
+ logMessage("IN", ws.data.peerId, parsed.type, {
211
+ ...(parsed.type === "signal"
212
+ ? {
213
+ to: parsed.to,
214
+ signalType: parsed.data?.type,
215
+ }
216
+ : {}),
217
+ ...(parsed.type === "control"
218
+ ? { action: parsed.action }
219
+ : {}),
220
+ });
128
221
  if (parsed.type === "signal") {
222
+ const signalData = parsed.data;
223
+ const signalType = signalData?.type ?? signalData?.candidate ? "candidate" : "unknown";
224
+ logSignal(ws.data.peerId, parsed.to, signalType);
129
225
  const outgoing = {
130
226
  type: "signal",
131
227
  from: ws.data.peerId,
@@ -135,6 +231,7 @@ const liveServer = Bun.serve({
135
231
  return;
136
232
  }
137
233
  if (parsed.type === "broadcast") {
234
+ logBroadcast(ws.data.peerId, ws.data.room);
138
235
  const outgoing = {
139
236
  type: "broadcast",
140
237
  from: ws.data.peerId,
@@ -148,12 +245,16 @@ const liveServer = Bun.serve({
148
245
  }
149
246
  if (parsed.type === "control") {
150
247
  const room = ws.data.room;
248
+ logControl(ws.data.peerId, parsed.action, parsed.data?.peerId, room);
151
249
  if (parsed.action === "admit" && ws.data.isHost && room) {
152
250
  const targetId = parsed.data?.peerId;
153
- if (!targetId)
251
+ if (!targetId) {
252
+ console.warn(`${LOG_COLORS.red}[${timestamp()}] Admit failed: no targetId${LOG_COLORS.reset}`);
154
253
  return;
254
+ }
155
255
  const waiters = waitingRooms.get(room);
156
256
  const targetWs = targetId ? clients.get(targetId) : undefined;
257
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] Admit check: targetId=${targetId}, hasWaiters=${!!waiters}, inWaiters=${waiters?.has(targetId)}, hasTargetWs=${!!targetWs}${LOG_COLORS.reset}`);
157
258
  if (waiters && waiters.has(targetId) && targetWs) {
158
259
  waiters.delete(targetId);
159
260
  waitingRooms.set(room, waiters);
@@ -169,6 +270,8 @@ const liveServer = Bun.serve({
169
270
  peers: Array.from(set),
170
271
  action: "join",
171
272
  };
273
+ logPresence("join", targetId, room, set.size);
274
+ logWaitingRoom("admitted", targetId, room, waiters.size);
172
275
  targetWs.publish(`room:${room}`, JSON.stringify(presence));
173
276
  targetWs.send(JSON.stringify(presence));
174
277
  broadcastToHosts(room, {
@@ -180,18 +283,22 @@ const liveServer = Bun.serve({
180
283
  room,
181
284
  from: ws.data.peerId,
182
285
  });
286
+ logState();
183
287
  }
184
288
  return;
185
289
  }
186
290
  if (parsed.action === "reject" && ws.data.isHost && room) {
187
291
  const targetId = parsed.data?.peerId;
188
- if (!targetId)
292
+ if (!targetId) {
293
+ console.warn(`${LOG_COLORS.red}[${timestamp()}] Reject failed: no targetId${LOG_COLORS.reset}`);
189
294
  return;
295
+ }
190
296
  const waiters = waitingRooms.get(room);
191
297
  const targetWs = targetId ? clients.get(targetId) : undefined;
192
298
  if (waiters && waiters.has(targetId) && targetWs) {
193
299
  waiters.delete(targetId);
194
300
  waitingRooms.set(room, waiters);
301
+ logWaitingRoom("rejected", targetId, room, waiters.size);
195
302
  sendControl(targetWs, {
196
303
  action: "rejected",
197
304
  room,
@@ -202,10 +309,12 @@ const liveServer = Bun.serve({
202
309
  action: "waiting-list",
203
310
  data: { waiting: Array.from(waiters) },
204
311
  });
312
+ logState();
205
313
  }
206
314
  return;
207
315
  }
208
316
  if (parsed.action === "raise-hand" && room) {
317
+ console.log(`${LOG_COLORS.yellow}[${timestamp()}] ✋ RAISE HAND${LOG_COLORS.reset} peerId=${ws.data.peerId} room=${room}`);
209
318
  broadcastToHosts(room, {
210
319
  action: "raise-hand",
211
320
  data: { peerId: ws.data.peerId },
@@ -213,26 +322,32 @@ const liveServer = Bun.serve({
213
322
  return;
214
323
  }
215
324
  if (parsed.action === "hand-lowered" && room) {
325
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] ✋ LOWER HAND${LOG_COLORS.reset} peerId=${ws.data.peerId} room=${room}`);
216
326
  broadcastToHosts(room, {
217
327
  action: "hand-lowered",
218
328
  data: { peerId: ws.data.peerId },
219
329
  });
220
330
  return;
221
331
  }
332
+ // Unknown control action
333
+ console.warn(`${LOG_COLORS.yellow}[${timestamp()}] Unknown control action: ${parsed.action}${LOG_COLORS.reset}`);
222
334
  }
223
335
  },
224
336
  close(ws) {
225
337
  const { peerId, room } = ws.data;
338
+ logDisconnect(peerId, room);
226
339
  ws.unsubscribe(`peer:${peerId}`);
227
340
  clients.delete(peerId);
228
341
  if (room) {
229
342
  const waiters = waitingRooms.get(room);
230
343
  if (waiters && waiters.delete(peerId)) {
231
344
  waitingRooms.set(room, waiters);
345
+ logWaitingRoom("left", peerId, room, waiters.size);
232
346
  broadcastToHosts(room, {
233
347
  action: "waiting-list",
234
348
  data: { waiting: Array.from(waiters) },
235
349
  });
350
+ logState();
236
351
  return;
237
352
  }
238
353
  ws.unsubscribe(`room:${room}`);
@@ -241,6 +356,7 @@ const liveServer = Bun.serve({
241
356
  set.delete(peerId);
242
357
  if (set.size === 0) {
243
358
  roomMembers.delete(room);
359
+ console.log(`${LOG_COLORS.dim}[${timestamp()}] Room ${room} is now empty, removed from roomMembers${LOG_COLORS.reset}`);
244
360
  }
245
361
  else {
246
362
  roomMembers.set(room, set);
@@ -252,12 +368,37 @@ const liveServer = Bun.serve({
252
368
  peers: Array.from(set),
253
369
  action: "leave",
254
370
  };
371
+ logPresence("leave", peerId, room, set.size);
372
+ logMessage("OUT", peerId, "presence:leave", {
373
+ room,
374
+ peers: Array.from(set),
375
+ });
255
376
  ws.publish(`room:${room}`, JSON.stringify(presence));
256
377
  }
378
+ logState();
257
379
  }
258
380
  },
259
381
  },
260
382
  });
261
- console.log(`Signaling server running on ws://localhost:${liveServer.port}`);
262
- console.log(`LAN access (if allowed by firewall): ws://<your-lan-ip>:${liveServer.port}`);
383
+ console.log("");
384
+ console.log(`${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`);
385
+ console.log(`${LOG_COLORS.green}${LOG_COLORS.bright} Signaling Server Started${LOG_COLORS.reset}`);
386
+ console.log(`${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`);
387
+ console.log(` ${LOG_COLORS.cyan}Local:${LOG_COLORS.reset} ws://localhost:${liveServer.port}`);
388
+ console.log(` ${LOG_COLORS.cyan}Network:${LOG_COLORS.reset} ws://<your-lan-ip>:${liveServer.port}`);
389
+ console.log(`${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`);
390
+ console.log(` ${LOG_COLORS.dim}Verbose logging enabled - all messages will be logged${LOG_COLORS.reset}`);
391
+ console.log(`${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`);
392
+ console.log("");
393
+ // Periodic state dump every 30 seconds (only if there are clients)
394
+ setInterval(() => {
395
+ if (clients.size > 0) {
396
+ console.log("");
397
+ console.log(`${LOG_COLORS.bright}───────────────────────────────────────────────────────────────${LOG_COLORS.reset}`);
398
+ console.log(`${LOG_COLORS.cyan}[${timestamp()}] PERIODIC STATE DUMP${LOG_COLORS.reset}`);
399
+ logState();
400
+ console.log(`${LOG_COLORS.bright}───────────────────────────────────────────────────────────────${LOG_COLORS.reset}`);
401
+ console.log("");
402
+ }
403
+ }, 30000);
263
404
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@conference-kit/signaling-server",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
package/src/index.ts CHANGED
@@ -85,13 +85,170 @@ function parseMessage(raw: string): IncomingMessage | null {
85
85
  parsed.type === "control")
86
86
  )
87
87
  return parsed;
88
+ console.warn("[PARSE] Invalid message type:", parsed?.type);
88
89
  return null;
89
90
  } catch (error) {
90
- console.error("Failed to parse message", error);
91
+ console.error(
92
+ "[PARSE] Failed to parse message:",
93
+ error,
94
+ "Raw:",
95
+ raw.slice(0, 200)
96
+ );
91
97
  return null;
92
98
  }
93
99
  }
94
100
 
101
+ // ─────────────────────────────────────────────────────────────────────────────
102
+ // Logging utilities
103
+ // ─────────────────────────────────────────────────────────────────────────────
104
+ const LOG_COLORS = {
105
+ reset: "\x1b[0m",
106
+ bright: "\x1b[1m",
107
+ dim: "\x1b[2m",
108
+ cyan: "\x1b[36m",
109
+ green: "\x1b[32m",
110
+ yellow: "\x1b[33m",
111
+ red: "\x1b[31m",
112
+ magenta: "\x1b[35m",
113
+ blue: "\x1b[34m",
114
+ };
115
+
116
+ function timestamp() {
117
+ return new Date().toISOString();
118
+ }
119
+
120
+ function logConnect(
121
+ peerId: string,
122
+ room: string | null | undefined,
123
+ isHost: boolean,
124
+ waitingRoom: boolean
125
+ ) {
126
+ console.log(
127
+ `${LOG_COLORS.green}[${timestamp()}] ➜ CONNECT${LOG_COLORS.reset}`,
128
+ `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`,
129
+ `room=${LOG_COLORS.yellow}${room ?? "(none)"}${LOG_COLORS.reset}`,
130
+ `isHost=${isHost}`,
131
+ `waitingRoom=${waitingRoom}`
132
+ );
133
+ }
134
+
135
+ function logDisconnect(peerId: string, room: string | null | undefined) {
136
+ console.log(
137
+ `${LOG_COLORS.red}[${timestamp()}] ✖ DISCONNECT${LOG_COLORS.reset}`,
138
+ `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`,
139
+ `room=${LOG_COLORS.yellow}${room ?? "(none)"}${LOG_COLORS.reset}`
140
+ );
141
+ }
142
+
143
+ function logMessage(
144
+ direction: "IN" | "OUT",
145
+ peerId: string,
146
+ type: string,
147
+ details: Record<string, unknown>
148
+ ) {
149
+ const arrow = direction === "IN" ? "◀" : "▶";
150
+ const color = direction === "IN" ? LOG_COLORS.blue : LOG_COLORS.magenta;
151
+ console.log(
152
+ `${color}[${timestamp()}] ${arrow} ${direction}${LOG_COLORS.reset}`,
153
+ `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`,
154
+ `type=${LOG_COLORS.yellow}${type}${LOG_COLORS.reset}`,
155
+ JSON.stringify(details)
156
+ );
157
+ }
158
+
159
+ function logPresence(
160
+ action: "join" | "leave",
161
+ peerId: string,
162
+ room: string,
163
+ totalPeers: number
164
+ ) {
165
+ const icon = action === "join" ? "+" : "-";
166
+ const color = action === "join" ? LOG_COLORS.green : LOG_COLORS.red;
167
+ console.log(
168
+ `${color}[${timestamp()}] ${icon} PRESENCE ${action.toUpperCase()}${
169
+ LOG_COLORS.reset
170
+ }`,
171
+ `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`,
172
+ `room=${LOG_COLORS.yellow}${room}${LOG_COLORS.reset}`,
173
+ `totalPeers=${totalPeers}`
174
+ );
175
+ }
176
+
177
+ function logWaitingRoom(
178
+ action: string,
179
+ peerId: string,
180
+ room: string,
181
+ waitingCount: number
182
+ ) {
183
+ console.log(
184
+ `${LOG_COLORS.yellow}[${timestamp()}] ⏳ WAITING ${action.toUpperCase()}${
185
+ LOG_COLORS.reset
186
+ }`,
187
+ `peerId=${LOG_COLORS.cyan}${peerId}${LOG_COLORS.reset}`,
188
+ `room=${LOG_COLORS.yellow}${room}${LOG_COLORS.reset}`,
189
+ `waitingCount=${waitingCount}`
190
+ );
191
+ }
192
+
193
+ function logControl(
194
+ from: string,
195
+ action: string,
196
+ target?: string,
197
+ room?: string | null
198
+ ) {
199
+ console.log(
200
+ `${LOG_COLORS.magenta}[${timestamp()}] ⚙ CONTROL${LOG_COLORS.reset}`,
201
+ `from=${LOG_COLORS.cyan}${from}${LOG_COLORS.reset}`,
202
+ `action=${LOG_COLORS.yellow}${action}${LOG_COLORS.reset}`,
203
+ target ? `target=${target}` : "",
204
+ room ? `room=${room}` : ""
205
+ );
206
+ }
207
+
208
+ function logSignal(from: string, to: string, signalType?: string) {
209
+ console.log(
210
+ `${LOG_COLORS.blue}[${timestamp()}] ⚡ SIGNAL${LOG_COLORS.reset}`,
211
+ `from=${LOG_COLORS.cyan}${from}${LOG_COLORS.reset}`,
212
+ `to=${LOG_COLORS.cyan}${to}${LOG_COLORS.reset}`,
213
+ signalType ? `signalType=${signalType}` : ""
214
+ );
215
+ }
216
+
217
+ function logBroadcast(from: string, room: string | null | undefined) {
218
+ console.log(
219
+ `${LOG_COLORS.yellow}[${timestamp()}] 📢 BROADCAST${LOG_COLORS.reset}`,
220
+ `from=${LOG_COLORS.cyan}${from}${LOG_COLORS.reset}`,
221
+ `room=${LOG_COLORS.yellow}${room ?? "(none)"}${LOG_COLORS.reset}`
222
+ );
223
+ }
224
+
225
+ function logState() {
226
+ console.log(
227
+ `${LOG_COLORS.dim}[${timestamp()}] 📊 STATE${LOG_COLORS.reset}`,
228
+ `clients=${clients.size}`,
229
+ `rooms=${roomMembers.size}`,
230
+ `waitingRooms=${waitingRooms.size}`
231
+ );
232
+ if (roomMembers.size > 0) {
233
+ roomMembers.forEach((members, room) => {
234
+ console.log(
235
+ ` ${LOG_COLORS.dim}room=${room}: [${Array.from(members).join(", ")}]${
236
+ LOG_COLORS.reset
237
+ }`
238
+ );
239
+ });
240
+ }
241
+ if (waitingRooms.size > 0) {
242
+ waitingRooms.forEach((waiters, room) => {
243
+ console.log(
244
+ ` ${LOG_COLORS.dim}waiting=${room}: [${Array.from(waiters).join(
245
+ ", "
246
+ )}]${LOG_COLORS.reset}`
247
+ );
248
+ });
249
+ }
250
+ }
251
+
95
252
  const HOST = "0.0.0.0";
96
253
  const PORT = 8787;
97
254
 
@@ -124,6 +281,10 @@ function sendControl(
124
281
  action: payload.action,
125
282
  data: payload.data,
126
283
  };
284
+ logMessage("OUT", target.data.peerId, `control:${payload.action}`, {
285
+ room: payload.room,
286
+ data: payload.data,
287
+ });
127
288
  target.send(JSON.stringify(message));
128
289
  }
129
290
 
@@ -131,7 +292,13 @@ function broadcastToHosts(
131
292
  room: string | null | undefined,
132
293
  payload: { action: string; data?: unknown }
133
294
  ) {
134
- getHosts(room).forEach((hostWs) =>
295
+ const hosts = getHosts(room);
296
+ console.log(
297
+ `${LOG_COLORS.dim}[${timestamp()}] Broadcasting to ${
298
+ hosts.length
299
+ } host(s) in room ${room}: ${payload.action}${LOG_COLORS.reset}`
300
+ );
301
+ hosts.forEach((hostWs) =>
135
302
  sendControl(hostWs, { action: payload.action, data: payload.data, room })
136
303
  );
137
304
  }
@@ -147,7 +314,22 @@ const liveServer = Bun.serve<ClientMeta>({
147
314
  const isHost = url.searchParams.get("host") === "1";
148
315
  const waitingRoom = url.searchParams.get("waitingRoom") === "1";
149
316
 
317
+ console.log(
318
+ `${LOG_COLORS.dim}[${timestamp()}] HTTP UPGRADE REQUEST${
319
+ LOG_COLORS.reset
320
+ }`,
321
+ `peerId=${peerId}`,
322
+ `room=${room}`,
323
+ `isHost=${isHost}`,
324
+ `waitingRoom=${waitingRoom}`
325
+ );
326
+
150
327
  if (!peerId) {
328
+ console.warn(
329
+ `${LOG_COLORS.red}[${timestamp()}] Rejected: missing peerId${
330
+ LOG_COLORS.reset
331
+ }`
332
+ );
151
333
  return new Response("peerId query param is required", { status: 400 });
152
334
  }
153
335
 
@@ -161,6 +343,13 @@ const liveServer = Bun.serve<ClientMeta>({
161
343
  },
162
344
  });
163
345
  if (!upgraded) {
346
+ console.error(
347
+ `${
348
+ LOG_COLORS.red
349
+ }[${timestamp()}] WebSocket upgrade FAILED for ${peerId}${
350
+ LOG_COLORS.reset
351
+ }`
352
+ );
164
353
  return new Response("WebSocket upgrade failed", { status: 500 });
165
354
  }
166
355
 
@@ -168,14 +357,28 @@ const liveServer = Bun.serve<ClientMeta>({
168
357
  },
169
358
  websocket: {
170
359
  open(ws: ServerWebSocket<ClientMeta>) {
171
- const { peerId, room } = ws.data;
360
+ const { peerId, room, isHost, waitingRoom } = ws.data;
361
+
362
+ logConnect(peerId, room, isHost ?? false, waitingRoom ?? false);
363
+
172
364
  clients.set(peerId, ws);
173
365
  ws.subscribe(`peer:${peerId}`);
366
+ console.log(
367
+ `${
368
+ LOG_COLORS.dim
369
+ }[${timestamp()}] Subscribed ${peerId} to peer:${peerId}${
370
+ LOG_COLORS.reset
371
+ }`
372
+ );
373
+
174
374
  if (room) {
175
375
  if (ws.data.waitingRoom && !ws.data.isHost) {
176
376
  const waiters = waitingRooms.get(room) ?? new Set<string>();
177
377
  waiters.add(peerId);
178
378
  waitingRooms.set(room, waiters);
379
+
380
+ logWaitingRoom("added", peerId, room, waiters.size);
381
+
179
382
  broadcastToHosts(room, {
180
383
  action: "waiting-list",
181
384
  data: { waiting: Array.from(waiters) },
@@ -185,14 +388,24 @@ const liveServer = Bun.serve<ClientMeta>({
185
388
  room,
186
389
  data: { position: waiters.size },
187
390
  });
391
+ logState();
188
392
  return;
189
393
  }
190
394
 
191
395
  ws.data.admitted = true;
192
396
  ws.subscribe(`room:${room}`);
397
+ console.log(
398
+ `${
399
+ LOG_COLORS.dim
400
+ }[${timestamp()}] Subscribed ${peerId} to room:${room}${
401
+ LOG_COLORS.reset
402
+ }`
403
+ );
404
+
193
405
  const set = roomMembers.get(room) ?? new Set<string>();
194
406
  set.add(peerId);
195
407
  roomMembers.set(room, set);
408
+
196
409
  const presence: PresenceMessage = {
197
410
  type: "presence",
198
411
  room,
@@ -200,18 +413,34 @@ const liveServer = Bun.serve<ClientMeta>({
200
413
  peers: Array.from(set),
201
414
  action: "join",
202
415
  };
416
+
417
+ logPresence("join", peerId, room, set.size);
418
+ logMessage("OUT", peerId, "presence:join", {
419
+ room,
420
+ peers: Array.from(set),
421
+ });
422
+
203
423
  ws.publish(`room:${room}`, JSON.stringify(presence));
204
424
  ws.send(JSON.stringify(presence));
205
425
 
206
426
  // send waiting list snapshot to host
207
427
  const pending = waitingRooms.get(room);
208
428
  if (ws.data.isHost && pending && pending.size) {
429
+ console.log(
430
+ `${
431
+ LOG_COLORS.dim
432
+ }[${timestamp()}] Sending waiting list snapshot to host ${peerId}: ${
433
+ pending.size
434
+ } waiting${LOG_COLORS.reset}`
435
+ );
209
436
  sendControl(ws, {
210
437
  action: "waiting-list",
211
438
  room,
212
439
  data: { waiting: Array.from(pending) },
213
440
  });
214
441
  }
442
+
443
+ logState();
215
444
  }
216
445
  },
217
446
  message(
@@ -220,7 +449,13 @@ const liveServer = Bun.serve<ClientMeta>({
220
449
  ) {
221
450
  const payload = typeof raw === "string" ? raw : raw.toString();
222
451
  const parsed = parseMessage(payload);
452
+
223
453
  if (!parsed) {
454
+ console.warn(
455
+ `${LOG_COLORS.red}[${timestamp()}] Invalid message from ${
456
+ ws.data.peerId
457
+ }${LOG_COLORS.reset}`
458
+ );
224
459
  ws.send(
225
460
  JSON.stringify({
226
461
  type: "error",
@@ -230,7 +465,25 @@ const liveServer = Bun.serve<ClientMeta>({
230
465
  return;
231
466
  }
232
467
 
468
+ // Log incoming message
469
+ logMessage("IN", ws.data.peerId, parsed.type, {
470
+ ...(parsed.type === "signal"
471
+ ? {
472
+ to: (parsed as SignalPayload).to,
473
+ signalType: ((parsed as SignalPayload).data as any)?.type,
474
+ }
475
+ : {}),
476
+ ...(parsed.type === "control"
477
+ ? { action: (parsed as ControlPayload).action }
478
+ : {}),
479
+ });
480
+
233
481
  if (parsed.type === "signal") {
482
+ const signalData = parsed.data as any;
483
+ const signalType =
484
+ signalData?.type ?? signalData?.candidate ? "candidate" : "unknown";
485
+ logSignal(ws.data.peerId, parsed.to, signalType);
486
+
234
487
  const outgoing: OutgoingMessage = {
235
488
  type: "signal",
236
489
  from: ws.data.peerId,
@@ -241,6 +494,8 @@ const liveServer = Bun.serve<ClientMeta>({
241
494
  }
242
495
 
243
496
  if (parsed.type === "broadcast") {
497
+ logBroadcast(ws.data.peerId, ws.data.room);
498
+
244
499
  const outgoing: OutgoingMessage = {
245
500
  type: "broadcast",
246
501
  from: ws.data.peerId,
@@ -255,19 +510,44 @@ const liveServer = Bun.serve<ClientMeta>({
255
510
 
256
511
  if (parsed.type === "control") {
257
512
  const room = ws.data.room;
513
+ logControl(
514
+ ws.data.peerId,
515
+ parsed.action,
516
+ (parsed.data as any)?.peerId,
517
+ room
518
+ );
519
+
258
520
  if (parsed.action === "admit" && ws.data.isHost && room) {
259
521
  const targetId = (parsed.data as any)?.peerId as string | undefined;
260
- if (!targetId) return;
522
+ if (!targetId) {
523
+ console.warn(
524
+ `${LOG_COLORS.red}[${timestamp()}] Admit failed: no targetId${
525
+ LOG_COLORS.reset
526
+ }`
527
+ );
528
+ return;
529
+ }
261
530
  const waiters = waitingRooms.get(room);
262
531
  const targetWs = targetId ? clients.get(targetId) : undefined;
532
+
533
+ console.log(
534
+ `${
535
+ LOG_COLORS.dim
536
+ }[${timestamp()}] Admit check: targetId=${targetId}, hasWaiters=${!!waiters}, inWaiters=${waiters?.has(
537
+ targetId
538
+ )}, hasTargetWs=${!!targetWs}${LOG_COLORS.reset}`
539
+ );
540
+
263
541
  if (waiters && waiters.has(targetId) && targetWs) {
264
542
  waiters.delete(targetId);
265
543
  waitingRooms.set(room, waiters);
266
544
  targetWs.data.admitted = true;
267
545
  targetWs.subscribe(`room:${room}`);
546
+
268
547
  const set = roomMembers.get(room) ?? new Set<string>();
269
548
  set.add(targetId);
270
549
  roomMembers.set(room, set);
550
+
271
551
  const presence: PresenceMessage = {
272
552
  type: "presence",
273
553
  room,
@@ -275,6 +555,10 @@ const liveServer = Bun.serve<ClientMeta>({
275
555
  peers: Array.from(set),
276
556
  action: "join",
277
557
  };
558
+
559
+ logPresence("join", targetId, room, set.size);
560
+ logWaitingRoom("admitted", targetId, room, waiters.size);
561
+
278
562
  targetWs.publish(`room:${room}`, JSON.stringify(presence));
279
563
  targetWs.send(JSON.stringify(presence));
280
564
  broadcastToHosts(room, {
@@ -286,18 +570,30 @@ const liveServer = Bun.serve<ClientMeta>({
286
570
  room,
287
571
  from: ws.data.peerId,
288
572
  });
573
+
574
+ logState();
289
575
  }
290
576
  return;
291
577
  }
292
578
 
293
579
  if (parsed.action === "reject" && ws.data.isHost && room) {
294
580
  const targetId = (parsed.data as any)?.peerId as string | undefined;
295
- if (!targetId) return;
581
+ if (!targetId) {
582
+ console.warn(
583
+ `${LOG_COLORS.red}[${timestamp()}] Reject failed: no targetId${
584
+ LOG_COLORS.reset
585
+ }`
586
+ );
587
+ return;
588
+ }
296
589
  const waiters = waitingRooms.get(room);
297
590
  const targetWs = targetId ? clients.get(targetId) : undefined;
298
591
  if (waiters && waiters.has(targetId) && targetWs) {
299
592
  waiters.delete(targetId);
300
593
  waitingRooms.set(room, waiters);
594
+
595
+ logWaitingRoom("rejected", targetId, room, waiters.size);
596
+
301
597
  sendControl(targetWs, {
302
598
  action: "rejected",
303
599
  room,
@@ -308,11 +604,18 @@ const liveServer = Bun.serve<ClientMeta>({
308
604
  action: "waiting-list",
309
605
  data: { waiting: Array.from(waiters) },
310
606
  });
607
+
608
+ logState();
311
609
  }
312
610
  return;
313
611
  }
314
612
 
315
613
  if (parsed.action === "raise-hand" && room) {
614
+ console.log(
615
+ `${LOG_COLORS.yellow}[${timestamp()}] ✋ RAISE HAND${
616
+ LOG_COLORS.reset
617
+ } peerId=${ws.data.peerId} room=${room}`
618
+ );
316
619
  broadcastToHosts(room, {
317
620
  action: "raise-hand",
318
621
  data: { peerId: ws.data.peerId },
@@ -321,37 +624,64 @@ const liveServer = Bun.serve<ClientMeta>({
321
624
  }
322
625
 
323
626
  if (parsed.action === "hand-lowered" && room) {
627
+ console.log(
628
+ `${LOG_COLORS.dim}[${timestamp()}] ✋ LOWER HAND${
629
+ LOG_COLORS.reset
630
+ } peerId=${ws.data.peerId} room=${room}`
631
+ );
324
632
  broadcastToHosts(room, {
325
633
  action: "hand-lowered",
326
634
  data: { peerId: ws.data.peerId },
327
635
  });
328
636
  return;
329
637
  }
638
+
639
+ // Unknown control action
640
+ console.warn(
641
+ `${LOG_COLORS.yellow}[${timestamp()}] Unknown control action: ${
642
+ parsed.action
643
+ }${LOG_COLORS.reset}`
644
+ );
330
645
  }
331
646
  },
332
647
  close(ws: ServerWebSocket<ClientMeta>) {
333
648
  const { peerId, room } = ws.data;
649
+
650
+ logDisconnect(peerId, room);
651
+
334
652
  ws.unsubscribe(`peer:${peerId}`);
335
653
  clients.delete(peerId);
654
+
336
655
  if (room) {
337
656
  const waiters = waitingRooms.get(room);
338
657
  if (waiters && waiters.delete(peerId)) {
339
658
  waitingRooms.set(room, waiters);
659
+ logWaitingRoom("left", peerId, room, waiters.size);
340
660
  broadcastToHosts(room, {
341
661
  action: "waiting-list",
342
662
  data: { waiting: Array.from(waiters) },
343
663
  });
664
+ logState();
344
665
  return;
345
666
  }
667
+
346
668
  ws.unsubscribe(`room:${room}`);
347
669
  const set = roomMembers.get(room);
348
670
  if (set) {
349
671
  set.delete(peerId);
350
672
  if (set.size === 0) {
351
673
  roomMembers.delete(room);
674
+ console.log(
675
+ `${
676
+ LOG_COLORS.dim
677
+ }[${timestamp()}] Room ${room} is now empty, removed from roomMembers${
678
+ LOG_COLORS.reset
679
+ }`
680
+ );
352
681
  } else {
353
682
  roomMembers.set(room, set);
354
683
  }
684
+
355
685
  const presence: PresenceMessage = {
356
686
  type: "presence",
357
687
  room,
@@ -359,14 +689,65 @@ const liveServer = Bun.serve<ClientMeta>({
359
689
  peers: Array.from(set),
360
690
  action: "leave",
361
691
  };
692
+
693
+ logPresence("leave", peerId, room, set.size);
694
+ logMessage("OUT", peerId, "presence:leave", {
695
+ room,
696
+ peers: Array.from(set),
697
+ });
698
+
362
699
  ws.publish(`room:${room}`, JSON.stringify(presence));
363
700
  }
701
+
702
+ logState();
364
703
  }
365
704
  },
366
705
  },
367
706
  });
368
707
 
369
- console.log(`Signaling server running on ws://localhost:${liveServer.port}`);
708
+ console.log("");
709
+ console.log(
710
+ `${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`
711
+ );
712
+ console.log(
713
+ `${LOG_COLORS.green}${LOG_COLORS.bright} Signaling Server Started${LOG_COLORS.reset}`
714
+ );
715
+ console.log(
716
+ `${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`
717
+ );
718
+ console.log(
719
+ ` ${LOG_COLORS.cyan}Local:${LOG_COLORS.reset} ws://localhost:${liveServer.port}`
720
+ );
721
+ console.log(
722
+ ` ${LOG_COLORS.cyan}Network:${LOG_COLORS.reset} ws://<your-lan-ip>:${liveServer.port}`
723
+ );
370
724
  console.log(
371
- `LAN access (if allowed by firewall): ws://<your-lan-ip>:${liveServer.port}`
725
+ `${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`
372
726
  );
727
+ console.log(
728
+ ` ${LOG_COLORS.dim}Verbose logging enabled - all messages will be logged${LOG_COLORS.reset}`
729
+ );
730
+ console.log(
731
+ `${LOG_COLORS.bright}═══════════════════════════════════════════════════════════════${LOG_COLORS.reset}`
732
+ );
733
+ console.log("");
734
+
735
+ // Periodic state dump every 30 seconds (only if there are clients)
736
+ setInterval(() => {
737
+ if (clients.size > 0) {
738
+ console.log("");
739
+ console.log(
740
+ `${LOG_COLORS.bright}───────────────────────────────────────────────────────────────${LOG_COLORS.reset}`
741
+ );
742
+ console.log(
743
+ `${LOG_COLORS.cyan}[${timestamp()}] PERIODIC STATE DUMP${
744
+ LOG_COLORS.reset
745
+ }`
746
+ );
747
+ logState();
748
+ console.log(
749
+ `${LOG_COLORS.bright}───────────────────────────────────────────────────────────────${LOG_COLORS.reset}`
750
+ );
751
+ console.log("");
752
+ }
753
+ }, 30000);