Skip to content

Realtime events ​

Socket.io runs on the same HTTP server as the API.

Connecting ​

js
import { io } from 'socket.io-client';

const socket = io(API_URL, { auth: { token }, transports: ['websocket', 'polling'] });

The server verifies the JWT and rejects inactive users with connect_error: unauthorized.

Rooms ​

RoomJoinedReceives
user:<id>Automatically on connectEvents for that user's trades
trade:<id>Via trade:joinTrade updates, messages, typing

Client → server ​

EventPayloadAck
trade:jointradeId{ ok: boolean } — false unless you're the buyer, seller or an admin
trade:leavetradeId—
trade:typing{ tradeId }— (only forwarded if you've joined the room)

Server → client ​

EventRoomPayload
order:createdeveryone{ id, type? } — also sent when an order is reopened
order:removedeveryone{ id } — matched, cancelled or expired
trade:createduser:<buyer>, user:<seller>{ tradeId, status }
trade:updatedtrade:<id>{ id, status }
trade:updateduser:<buyer>, user:<seller>{ tradeId, status }
message:newtrade:<id>Message object (with sender for user messages)
trade:typingtrade:<id> (except sender){ tradeId, userId }

TIP

trade:updated carries only the new status. Refetch GET /api/trades/:id for the full trade.

Emitting from services ​

Services import helpers from src/socket/io.js — emitToTrade, emitToUser, broadcast. They're no-ops until the socket server is initialised, so services work unchanged in scripts and tests.

Reconnection ​

Rooms are lost on reconnect. The client's trade room rejoins on every connect event.

Nexlm is a peer-to-peer facilitator and never holds customer Naira.