Private servers with password and invite links (Experimental)

This commit is contained in:
2026-03-18 20:42:40 +01:00
parent f8fd78d21a
commit eb987ac672
54 changed files with 2910 additions and 286 deletions

View File

@@ -1,6 +1,7 @@
import { connectedUsers } from './state';
import { ConnectedUser } from './types';
import { broadcastToServer, findUserByOderId } from './broadcast';
import { authorizeWebSocketJoin } from '../services/server-access.service';
interface WsMessage {
[key: string]: unknown;
@@ -23,8 +24,24 @@ function handleIdentify(user: ConnectedUser, message: WsMessage, connectionId: s
console.log(`User identified: ${user.displayName} (${user.oderId})`);
}
function handleJoinServer(user: ConnectedUser, message: WsMessage, connectionId: string): void {
async function handleJoinServer(user: ConnectedUser, message: WsMessage, connectionId: string): Promise<void> {
const sid = String(message['serverId']);
if (!sid)
return;
const authorization = await authorizeWebSocketJoin(sid, user.oderId);
if (!authorization.allowed) {
user.ws.send(JSON.stringify({
type: 'access_denied',
serverId: sid,
reason: authorization.reason
}));
return;
}
const isNew = !user.serverIds.has(sid);
user.serverIds.add(sid);
@@ -121,7 +138,7 @@ function handleTyping(user: ConnectedUser, message: WsMessage): void {
}
}
export function handleWebSocketMessage(connectionId: string, message: WsMessage): void {
export async function handleWebSocketMessage(connectionId: string, message: WsMessage): Promise<void> {
const user = connectedUsers.get(connectionId);
if (!user)
@@ -133,7 +150,7 @@ export function handleWebSocketMessage(connectionId: string, message: WsMessage)
break;
case 'join_server':
handleJoinServer(user, message, connectionId);
await handleJoinServer(user, message, connectionId);
break;
case 'view_server':

View File

@@ -77,11 +77,11 @@ export function setupWebSocket(server: Server<typeof IncomingMessage, typeof Ser
}
});
ws.on('message', (data) => {
ws.on('message', async (data) => {
try {
const message = JSON.parse(data.toString());
handleWebSocketMessage(connectionId, message);
await handleWebSocketMessage(connectionId, message);
} catch (err) {
console.error('Invalid WebSocket message:', err);
}