Skip to main content

Documentation Index

Fetch the complete documentation index at: https://socket-serve.mintlify.app/llms.txt

Use this file to discover all available pages before exploring further.

Overview

socket-serve provides a clean, type-safe API for building real-time applications in serverless environments. The API is divided into three main parts:

Server API

Server-side socket management and event handling

Client API

Browser client SDK for connecting to socket servers

Types

TypeScript type definitions and interfaces

Quick Reference

Server

import { createSocketServer } from 'socket-serve';
import { createNextJSAdapter, createExpressAdapter } from 'socket-serve/adapters';

// Create server
const server = createSocketServer(options);

// Handle connections
server.on('connection', (socket) => {
  // Socket methods
  socket.emit(event, data, ackCallback?);
  socket.on(event, handler);
  socket.join(room);
  socket.leave(room);
  socket.getRooms();
  socket.broadcastToRoom(room, event, data);
  socket.disconnect();
});

// Adapters
const nextAdapter = createNextJSAdapter(server);
const expressAdapter = createExpressAdapter(server);

Client

import { connect } from 'socket-serve/client';

// Connect
const socket = connect(url, options?);

// Events
socket.on('connect', () => {});
socket.on('disconnect', () => {});
socket.on(event, handler);

// Methods
socket.emit(event, data, ackCallback?);
socket.disconnect();

// Properties
socket.id;
socket.connected;

Core Concepts

Event-Driven

Both server and client use an event-driven architecture:
// Server listens for events from clients
socket.on('message', (data) => {
  console.log('Received:', data);
});

// Server emits events to clients
socket.emit('response', { success: true });

// Client listens for events from server
socket.on('response', (data) => {
  console.log('Server said:', data);
});

// Client emits events to server
socket.emit('message', { text: 'Hello!' });

Acknowledgments

Request/response pattern with callbacks:
// Client requests with acknowledgment
socket.emit('getData', { id: 123 }, (response) => {
  console.log('Got response:', response);
});

// Server responds
socket.on('getData', (data, ack) => {
  const result = fetchData(data.id);
  ack({ success: true, data: result });
});

Rooms

Group clients for targeted broadcasting:
// Join room
socket.join('lobby');

// Broadcast to room
socket.broadcastToRoom('lobby', 'announcement', {
  message: 'Welcome to the lobby!'
});

// Leave room
socket.leave('lobby');

Socket Server

Main server class and configuration

Server Socket

Individual client socket on the server

Adapters

Framework integration adapters

Client Connection

Connecting from the browser

Socket Methods

Client socket methods and properties

Events

Built-in and custom events

Type Safety

socket-serve is written in TypeScript and provides full type safety:
import type {
  SocketServer,
  ServerSocket,
  ClientSocket,
  SocketMessage,
  SocketServerOptions
} from 'socket-serve/types';

// Typed event handlers
socket.on<{ message: string }>('chat', (data) => {
  data.message; // TypeScript knows this is a string
});

// Typed acknowledgments
socket.emit<{ id: number }, { data: string }>(
  'getData',
  { id: 123 },
  (response) => {
    response.data; // TypeScript knows this is a string
  }
);

Error Handling

Server Errors

server.on('connection', (socket) => {
  socket.on('error', (error) => {
    console.error('Socket error:', error);
  });
  
  socket.on('riskyOperation', async (data) => {
    try {
      const result = await performOperation(data);
      socket.emit('success', result);
    } catch (error) {
      socket.emit('error', {
        message: 'Operation failed',
        details: error.message
      });
    }
  });
});

Client Errors

socket.on('error', (error) => {
  console.error('Connection error:', error);
});

socket.on('connect_error', (error) => {
  console.error('Failed to connect:', error);
});

// Acknowledgment timeout
socket.emit('getData', { id: 123 }, (response, error) => {
  if (error) {
    console.error('Request timed out');
  } else {
    console.log('Got response:', response);
  }
});

Best Practices

Server Side

// ✅ Clean up on disconnect
socket.on('disconnect', () => {
  // Release resources
  // Clean up subscriptions
  // Notify other users
});

// ✅ Validate input
socket.on('message', (data) => {
  if (!data.text || typeof data.text !== 'string') {
    socket.emit('error', { message: 'Invalid message' });
    return;
  }
  // Process message
});

// ✅ Use rooms for efficient broadcasting
socket.join(`user:${userId}`);
socket.broadcastToRoom(`user:${userId}`, 'notification', data);

Client Side

// ✅ Handle reconnection
socket.on('connect', () => {
  // Re-subscribe to events
  // Sync state
});

// ✅ Clean up on unmount
useEffect(() => {
  const socket = connect('/api/socket');
  
  return () => {
    socket.disconnect();
  };
}, []);

// ✅ Use acknowledgments for critical operations
socket.emit('saveData', data, (response, error) => {
  if (error) {
    showError('Save failed');
  } else {
    showSuccess('Saved!');
  }
});

Next Steps

Server API

Dive into the server API

Client API

Explore the client SDK

Examples

See complete examples

Concepts

Understand the architecture