WebSockets

Build real-time applications with MoroJS WebSocket support. Handle connections, rooms, and message broadcasting with type safety.

Basic WebSocket Setup

WebSocket Server (Actual Implementation)

typescript

1import { createApp } from '@morojs/moro';
2
3const app = createApp();
4
5// WebSocket chat implementation
6app.websocket('/chat', {
7  connect: (socket) => {
8    console.log(`WebSocket client connected: ${socket.id}`);
9  },
10  
11  disconnect: (socket) => {
12    console.log(`WebSocket client disconnected: ${socket.id}`);
13  },
14  
15  join: (socket, data) => {
16    console.log(`Join event received:`, data);
17    const roomId = data.roomId || 'general';
18    const username = data.username || 'Anonymous';
19    
20    console.log(`${username} joined room ${roomId}`);
21    
22    return { 
23      success: true, 
24      message: `Joined room ${roomId}`,
25      room: { id: roomId, name: roomId }
26    };
27  },
28  
29  message: (socket, data) => {
30    console.log(`Message event received:`, data);
31    const roomId = data.roomId || 'general';
32    const username = data.username || 'Anonymous';
33    
34    const message = {
35      id: Date.now(),
36      content: data.message,
37      sender: username,
38      roomId,
39      timestamp: new Date().toISOString()
40    };
41    
42    console.log(`Broadcasting message to room ${roomId}:`, message);
43    
44    return { success: true, message: 'Message sent' };
45  }
46});
47
48app.listen(3000);

Client-Side Connection

typescript

1// Client-side WebSocket connection
2const ws = new WebSocket('ws://localhost:3000/chat');
3
4ws.onopen = () => {
5  console.log('Connected to server');
6  
7  // Send a message
8  ws.send(JSON.stringify({
9    type: 'chat',
10    message: 'Hello from client!'
11  }));
12};
13
14ws.onmessage = (event) => {
15  const data = JSON.parse(event.data);
16  console.log('Received:', data);
17};
18
19ws.onclose = () => {
20  console.log('Disconnected from server');
21};

Advanced WebSocket Features

WebSocket Event Handling

typescript

1// Based on actual feature-showcase implementation
2app.websocket('/chat', {
3  join: (socket, data) => {
4    socket.join('chat-room');
5    socket.to('chat-room').emit('user-joined', { 
6      message: `${data.username} joined the chat` 
7    });
8    return { success: true, message: 'Joined chat room' };
9  },
10  
11  message: (socket, data) => {
12    socket.to('chat-room').emit('message', {
13      username: data.username,
14      message: data.message,
15      timestamp: new Date().toISOString()
16    });
17    return { success: true };
18  }
19});
20
21// Simple WebSocket endpoint without rooms
22app.websocket('/notifications', {
23  connect: (socket) => {
24    console.log('Notification client connected');
25    socket.emit('welcome', { 
26      message: 'Connected to notifications' 
27    });
28  },
29  
30  disconnect: (socket) => {
31    console.log('Notification client disconnected');
32  },
33  
34  subscribe: (socket, data) => {
35    const { channel } = data;
36    socket.join(channel);
37    return { success: true, channel };
38  }
39});

Authentication & Middleware

typescript

1// WebSocket with authentication
2app.ws('/secure-chat', {
3  middleware: [
4    // Auth middleware for WebSocket
5    async ({ request }) => {
6      const token = request.headers.get('authorization');
7      if (!token) {
8        throw new Error('Authentication required');
9      }
10      
11      const user = await verifyToken(token);
12      return { user };
13    }
14  ],
15  
16  onConnect: (socket, request, context) => {
17    // context.user is available from middleware
18    socket.user = context.user;
19    
20    console.log(`User ${context.user.name} connected`);
21    
22    socket.send({
23      type: 'authenticated',
24      user: context.user
25    });
26  },
27  
28  onMessage: (socket, message) => {
29    // Handle authenticated user messages
30    if (message.type === 'private-message') {
31      const targetSocket = wsManager.findByUserId(message.targetUserId);
32      if (targetSocket) {
33        targetSocket.send({
34          type: 'private-message',
35          from: socket.user.name,
36          message: message.text
37        });
38      }
39    }
40  }
41});

Real-time Features

Built-in Features

  • Room management
  • Message broadcasting
  • Connection authentication
  • Automatic reconnection
  • Message queuing

Use Cases

  • Real-time chat applications
  • Live notifications
  • Collaborative editing
  • Live data updates
  • Gaming applications

Next Steps