From 8f960be1e9f906ed94242a959ed27a8032c19982 Mon Sep 17 00:00:00 2001 From: Myx Date: Thu, 19 Mar 2026 03:57:51 +0100 Subject: [PATCH] Resync username instead of using Anonymous --- server/src/websocket/handler.ts | 18 ++++++++++----- src/app/core/services/webrtc.service.ts | 16 +++++++++++--- src/app/store/rooms/rooms.effects.ts | 14 ++++++++++-- src/app/store/users/users.effects.ts | 29 +++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 11 deletions(-) diff --git a/server/src/websocket/handler.ts b/server/src/websocket/handler.ts index 3a3dce0..aedb682 100644 --- a/server/src/websocket/handler.ts +++ b/server/src/websocket/handler.ts @@ -8,18 +8,24 @@ interface WsMessage { type: string; } +function normalizeDisplayName(value: unknown, fallback = 'User'): string { + const normalized = typeof value === 'string' ? value.trim() : ''; + + return normalized || fallback; +} + /** Sends the current user list for a given server to a single connected user. */ function sendServerUsers(user: ConnectedUser, serverId: string): void { const users = Array.from(connectedUsers.values()) .filter(cu => cu.serverIds.has(serverId) && cu.oderId !== user.oderId) - .map(cu => ({ oderId: cu.oderId, displayName: cu.displayName ?? 'Anonymous' })); + .map(cu => ({ oderId: cu.oderId, displayName: normalizeDisplayName(cu.displayName) })); user.ws.send(JSON.stringify({ type: 'server_users', serverId, users })); } function handleIdentify(user: ConnectedUser, message: WsMessage, connectionId: string): void { user.oderId = String(message['oderId'] || connectionId); - user.displayName = String(message['displayName'] || 'Anonymous'); + user.displayName = normalizeDisplayName(message['displayName'], normalizeDisplayName(user.displayName)); connectedUsers.set(connectionId, user); console.log(`User identified: ${user.displayName} (${user.oderId})`); } @@ -47,7 +53,7 @@ async function handleJoinServer(user: ConnectedUser, message: WsMessage, connect user.serverIds.add(sid); user.viewedServerId = sid; connectedUsers.set(connectionId, user); - console.log(`User ${user.displayName ?? 'Anonymous'} (${user.oderId}) joined server ${sid} (new=${isNew})`); + console.log(`User ${normalizeDisplayName(user.displayName)} (${user.oderId}) joined server ${sid} (new=${isNew})`); sendServerUsers(user, sid); @@ -55,7 +61,7 @@ async function handleJoinServer(user: ConnectedUser, message: WsMessage, connect broadcastToServer(sid, { type: 'user_joined', oderId: user.oderId, - displayName: user.displayName ?? 'Anonymous', + displayName: normalizeDisplayName(user.displayName), serverId: sid }, user.oderId); } @@ -66,7 +72,7 @@ function handleViewServer(user: ConnectedUser, message: WsMessage, connectionId: user.viewedServerId = viewSid; connectedUsers.set(connectionId, user); - console.log(`User ${user.displayName ?? 'Anonymous'} (${user.oderId}) viewing server ${viewSid}`); + console.log(`User ${normalizeDisplayName(user.displayName)} (${user.oderId}) viewing server ${viewSid}`); sendServerUsers(user, viewSid); } @@ -87,7 +93,7 @@ function handleLeaveServer(user: ConnectedUser, message: WsMessage, connectionId broadcastToServer(leaveSid, { type: 'user_left', oderId: user.oderId, - displayName: user.displayName ?? 'Anonymous', + displayName: normalizeDisplayName(user.displayName), serverId: leaveSid, serverIds: Array.from(user.serverIds) }, user.oderId); diff --git a/src/app/core/services/webrtc.service.ts b/src/app/core/services/webrtc.service.ts index 5892dde..00cf396 100644 --- a/src/app/core/services/webrtc.service.ts +++ b/src/app/core/services/webrtc.service.ts @@ -825,13 +825,15 @@ export class WebRTCService implements OnDestroy { * @param displayName - The user's display name. */ identify(oderId: string, displayName: string, signalUrl?: string): void { + const normalizedDisplayName = displayName.trim() || DEFAULT_DISPLAY_NAME; + this.lastIdentifyCredentials = { oderId, - displayName }; + displayName: normalizedDisplayName }; const identifyMessage = { type: SIGNALING_TYPE_IDENTIFY, oderId, - displayName + displayName: normalizedDisplayName }; if (signalUrl) { @@ -839,7 +841,15 @@ export class WebRTCService implements OnDestroy { return; } - this.sendRawMessage(identifyMessage); + const connectedManagers = this.getConnectedSignalingManagers(); + + if (connectedManagers.length === 0) { + return; + } + + for (const { manager } of connectedManagers) { + manager.sendRawMessage(identifyMessage); + } } /** diff --git a/src/app/store/rooms/rooms.effects.ts b/src/app/store/rooms/rooms.effects.ts index a114452..d86763e 100644 --- a/src/app/store/rooms/rooms.effects.ts +++ b/src/app/store/rooms/rooms.effects.ts @@ -60,7 +60,7 @@ function buildSignalingUser( data: { oderId: string; displayName?: string }, extras: Record = {} ) { - const displayName = data.displayName || 'User'; + const displayName = data.displayName?.trim() || 'User'; return { oderId: data.oderId, @@ -98,6 +98,16 @@ function isWrongServer( return !!(msgServerId && viewedServerId && msgServerId !== viewedServerId); } +function resolveUserDisplayName(user: Pick | null | undefined): string { + const displayName = user?.displayName?.trim(); + + if (displayName) { + return displayName; + } + + return user?.username?.trim() || 'User'; +} + interface RoomPresenceSignalingMessage { type: string; reason?: string; @@ -1379,7 +1389,7 @@ export class RoomsEffects { sourceUrl: room.sourceUrl }); const oderId = resolvedOderId || user?.oderId || this.webrtc.peerId(); - const displayName = user?.displayName || 'Anonymous'; + const displayName = resolveUserDisplayName(user); const sameSignalRooms = this.getRoomsForSignalingUrl(this.includeRoom(savedRooms, room), wsUrl); const backgroundRooms = sameSignalRooms.filter((candidate) => candidate.id !== room.id); const joinCurrentEndpointRooms = () => { diff --git a/src/app/store/users/users.effects.ts b/src/app/store/users/users.effects.ts index 0c8648f..a7c157c 100644 --- a/src/app/store/users/users.effects.ts +++ b/src/app/store/users/users.effects.ts @@ -438,6 +438,25 @@ export class UsersEffects { { dispatch: false } ); + /** Keep signaling identity aligned with the current profile to avoid stale fallback names. */ + syncSignalingIdentity$ = createEffect( + () => + this.actions$.pipe( + ofType( + UsersActions.setCurrentUser, + UsersActions.loadCurrentUserSuccess + ), + withLatestFrom(this.store.select(selectCurrentUser)), + tap(([, user]) => { + if (!user) + return; + + this.webrtc.identify(user.oderId || user.id, this.resolveDisplayName(user)); + }) + ), + { dispatch: false } + ); + private resolveRoom(roomId: string | undefined, currentRoom: Room | null, savedRooms: Room[]): Room | null { if (!roomId) return currentRoom; @@ -448,6 +467,16 @@ export class UsersEffects { return savedRooms.find((room) => room.id === roomId) ?? null; } + private resolveDisplayName(user: Pick): string { + const displayName = user.displayName?.trim(); + + if (displayName) { + return displayName; + } + + return user.username?.trim() || 'User'; + } + private toSourceSelector(room: Room): { sourceId?: string; sourceUrl?: string } { return { sourceId: room.sourceId,