Skip to main content Skills Marketplace Discover and explore AI skills built by the community.
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Copy promptShow prompt details A direct command skips the review prompt. Inspect the source before running it.
npx skills add https://github.com/miles990/claude-software-skills --skill realtime-systemsThe command stays on one line. Scroll horizontally to inspect it before copying.
Prefer a local copy? Download the files currently available to SkillsMP.
Download Zip Downloading... More from this repository Related occupations SOC
Based on SOC occupation classification
name realtime-systems description WebSocket, real-time communication, and event-driven architectures domain development-stacks version 1.0.0 tags ["websocket","socket-io","sse","pubsub","real-time","events"] triggers {"keywords":{"primary":["realtime","real-time","websocket","socket.io","sse","pubsub"],"secondary":["event driven","push","streaming","live","notification","kafka","rabbitmq"]},"context_boost":["chat","collaboration","live update","sync"],"context_penalty":["batch","static","frontend"],"priority":"medium"}
Real-time Systems
Overview
Building real-time applications with WebSocket, Server-Sent Events, and event-driven architectures.
WebSocket
Server Implementation (Node.js)
import { WebSocketServer , WebSocket } from 'ws' ;
{ createServer } ;
{ v4 uuid } ;
server = ();
wss = ({ server });
{
: ;
: ;
?: ;
: < >;
}
clients = < , >();
rooms = < , < >>();
wss. ( , {
clientId = ();
: = {
: clientId,
ws,
: (),
};
clients. (clientId, client);
. ( );
ws. ( , {
{
message = . (data. ());
(client, message);
} (error) {
. ( , error);
}
});
ws. ( , {
client. . ( (client, room));
clients. (clientId);
. ( );
});
(ws, { : , clientId });
});
( ) {
(message. ) {
:
client. = message. ;
;
:
(client, message. );
;
:
(client, message. );
;
:
(message. , {
: ,
: client. ,
: message. ,
: . (),
}, client. );
;
:
(client. , { : });
;
}
}
( ) {
(!rooms. (room)) {
rooms. (room, ());
}
rooms. (room)!. (client. );
client. . (room);
(room, {
: ,
: client. ,
room,
}, client. );
}
( ) {
rooms. (room)?. (client. );
client. . (room);
(room, {
: ,
: client. ,
room,
});
}
( ) {
roomClients = rooms. (room);
(!roomClients) ;
roomClients. ( {
(clientId !== excludeClientId) {
client = clients. (clientId);
(client?. . === . ) {
(client. , message);
}
}
});
}
( ) {
ws. ( . (message));
}
server. ( );
import
from
'http'
import
as
from
'uuid'
const
createServer
const
new
WebSocketServer
interface
Client
id
string
ws
WebSocket
userId
string
rooms
Set
string
const
new
Map
string
Client
const
new
Map
string
Set
string
on
'connection'
(ws, req ) =>
const
uuid
const
client
Client
id
rooms
new
Set
set
console
log
`Client connected: ${clientId} `
on
'message'
(data ) =>
try
const
JSON
parse
toString
handleMessage
catch
console
error
'Invalid message:'
on
'close'
() =>
rooms
forEach
room =>
leaveRoom
delete
console
log
`Client disconnected: ${clientId} `
send
type
'connected'
function
handleMessage
client : Client , message : any
switch
type
case
'authenticate'
userId
userId
break
case
'join'
joinRoom
room
break
case
'leave'
leaveRoom
room
break
case
'message'
broadcastToRoom
room
type
'message'
from
userId
content
content
timestamp
Date
now
id
break
case
'ping'
send
ws
type
'pong'
break
function
joinRoom
client : Client , room : string
if
has
set
new
Set
get
add
id
rooms
add
broadcastToRoom
type
'user_joined'
userId
userId
id
function
leaveRoom
client : Client , room : string
get
delete
id
rooms
delete
broadcastToRoom
type
'user_left'
userId
userId
function
broadcastToRoom
room : string , message : any , excludeClientId ?: string
const
get
if
return
forEach
clientId =>
if
const
get
if
ws
readyState
WebSocket
OPEN
send
ws
function
send
ws : WebSocket , message : any
send
JSON
stringify
listen
8080
Client Implementation class WebSocketClient {
private ws : WebSocket | null = null ;
private reconnectAttempts = 0 ;
private maxReconnectAttempts = 5 ;
private reconnectDelay = 1000 ;
private messageHandlers = new Map <string , Set <Function >>();
private messageQueue : any [] = [];
constructor (private url : string ) {}
connect (): Promise <void > {
return new Promise ((resolve, reject ) => {
this .ws = new WebSocket (this .url );
this .ws .onopen = () => {
console .log ('WebSocket connected' );
this .reconnectAttempts = 0 ;
this .flushMessageQueue ();
resolve ();
};
this .ws .onmessage = (event ) => {
const message = JSON .parse (event.data );
this .handleMessage (message);
};
this .ws .onclose = (event ) => {
console .log ('WebSocket closed:' , event.code , event.reason );
this .attemptReconnect ();
};
this .ws .onerror = (error ) => {
console .error ('WebSocket error:' , error);
reject (error);
};
});
}
private attemptReconnect ( ) {
if (this .reconnectAttempts >= this .maxReconnectAttempts ) {
console .error ('Max reconnection attempts reached' );
return ;
}
this .reconnectAttempts ++;
const delay = this .reconnectDelay * Math .pow (2 , this .reconnectAttempts - 1 );
console .log (`Reconnecting in ${delay} ms (attempt ${this .reconnectAttempts} )` );
setTimeout (() => {
this .connect ().catch (() => {});
}, delay);
}
send (message : any ) {
if (this .ws ?.readyState === WebSocket .OPEN ) {
this .ws .send (JSON .stringify (message));
} else {
this .messageQueue .push (message);
}
}
private flushMessageQueue ( ) {
while (this .messageQueue .length > 0 ) {
const message = this .messageQueue .shift ();
this .send (message);
}
}
private handleMessage (message : any ) {
const handlers = this .messageHandlers .get (message.type );
handlers?.forEach (handler => handler (message));
const wildcardHandlers = this .messageHandlers .get ('*' );
wildcardHandlers?.forEach (handler => handler (message));
}
on (type : string , handler : Function ) {
if (!this .messageHandlers .has (type )) {
this .messageHandlers .set (type , new Set ());
}
this .messageHandlers .get (type )!.add (handler);
return () => {
this .messageHandlers .get (type )?.delete (handler);
};
}
joinRoom (room : string ) {
this .send ({ type : 'join' , room });
}
leaveRoom (room : string ) {
this .send ({ type : 'leave' , room });
}
sendMessage (room : string , content : string ) {
this .send ({ type : 'message' , room, content });
}
disconnect ( ) {
this .ws ?.close ();
this .ws = null ;
}
}
const ws = new WebSocketClient ('wss://api.example.com/ws' );
ws.on ('connected' , (msg ) => {
console .log ('Connected with ID:' , msg.clientId );
ws.joinRoom ('general' );
});
ws.on ('message' , (msg ) => {
console .log (`[${msg.from } ]: ${msg.content} ` );
});
await ws.connect ();
Socket.IO
Server import { Server } from 'socket.io' ;
import { createServer } from 'http' ;
import { createAdapter } from '@socket.io/redis-adapter' ;
import { createClient } from 'redis' ;
const httpServer = createServer ();
const io = new Server (httpServer, {
cors : {
origin : process.env .ALLOWED_ORIGINS ?.split (',' ) || '*' ,
credentials : true ,
},
});
const pubClient = createClient ({ url : process.env .REDIS_URL });
const subClient = pubClient.duplicate ();
Promise .all ([pubClient.connect (), subClient.connect ()]).then (() => {
io.adapter (createAdapter (pubClient, subClient));
});
io.use (async (socket, next) => {
const token = socket.handshake .auth .token ;
try {
const user = await verifyToken (token);
socket.data .user = user;
next ();
} catch (err) {
next (new Error ('Authentication failed' ));
}
});
const chatNamespace = io.of ('/chat' );
chatNamespace.on ('connection' , (socket ) => {
const user = socket.data .user ;
console .log (`User connected: ${user.name} ` );
socket.join (`user:${user.id} ` );
socket.on ('join_room' , async (roomId : string ) => {
const hasAccess = await checkRoomAccess (user.id , roomId);
if (!hasAccess) {
socket.emit ('error' , { message : 'Access denied' });
return ;
}
socket.join (roomId);
socket.to (roomId).emit ('user_joined' , {
userId : user.id ,
userName : user.name ,
});
const messages = await getRecentMessages (roomId, 50 );
socket.emit ('room_history' , { roomId, messages });
});
socket.on ('leave_room' , (roomId : string ) => {
socket.leave (roomId);
socket.to (roomId).emit ('user_left' , {
userId : user.id ,
userName : user.name ,
});
});
socket.on ('message' , async (data : { roomId : string ; content : string }) => {
const message = {
id : uuid (),
roomId : data.roomId ,
userId : user.id ,
userName : user.name ,
content : data.content ,
timestamp : new Date (),
};
await saveMessage (message);
chatNamespace.to (data.roomId ).emit ('message' , message);
});
socket.on ('typing_start' , (roomId : string ) => {
socket.to (roomId).emit ('user_typing' , {
userId : user.id ,
userName : user.name ,
});
});
socket.on ('typing_stop' , (roomId : string ) => {
socket.to (roomId).emit ('user_stopped_typing' , {
userId : user.id ,
});
});
socket.on ('disconnect' , () => {
console .log (`User disconnected: ${user.name} ` );
});
});
function sendToUser (userId : string , event : string , data : any ) {
chatNamespace.to (`user:${userId} ` ).emit (event, data);
}
httpServer.listen (3000 );
Client (React) import { io, Socket } from 'socket.io-client' ;
import { createContext, useContext, useEffect, useState } from 'react' ;
const SocketContext = createContext<Socket | null >(null );
export function SocketProvider ({ children }: { children: React.ReactNode } ) {
const [socket, setSocket] = useState<Socket | null >(null );
const { token } = useAuth ();
useEffect (() => {
if (!token) return ;
const newSocket = io (`${API_URL} /chat` , {
auth : { token },
transports : ['websocket' ],
});
newSocket.on ('connect' , () => {
console .log ('Socket connected' );
});
newSocket.on ('connect_error' , (error ) => {
console .error ('Socket connection error:' , error);
});
setSocket (newSocket);
return () => {
newSocket.close ();
};
}, [token]);
return (
<SocketContext.Provider value ={socket} >
{children}
</SocketContext.Provider >
);
}
export function useSocket ( ) {
return useContext (SocketContext );
}
function useChatRoom (roomId : string ) {
const socket = useSocket ();
const [messages, setMessages] = useState<Message []>([]);
const [typingUsers, setTypingUsers] = useState<Set <string >>(new Set ());
useEffect (() => {
if (!socket || !roomId) return ;
socket.emit ('join_room' , roomId);
socket.on ('message' , (message : Message ) => {
setMessages (prev => [...prev, message]);
});
socket.on ('room_history' , ({ messages }: { messages: Message[] } ) => {
setMessages (messages);
});
socket.on ('user_typing' , ({ userId }: { userId: string } ) => {
setTypingUsers (prev => new Set (prev).add (userId));
});
socket.on ('user_stopped_typing' , ({ userId }: { userId: string } ) => {
setTypingUsers (prev => {
const next = new Set (prev);
next.delete (userId);
return next;
});
});
return () => {
socket.emit ('leave_room' , roomId);
socket.off ('message' );
socket.off ('room_history' );
socket.off ('user_typing' );
socket.off ('user_stopped_typing' );
};
}, [socket, roomId]);
const sendMessage = (content : string ) => {
socket?.emit ('message' , { roomId, content });
};
const startTyping = ( ) => {
socket?.emit ('typing_start' , roomId);
};
const stopTyping = ( ) => {
socket?.emit ('typing_stop' , roomId);
};
return { messages, typingUsers, sendMessage, startTyping, stopTyping };
}
Server-Sent Events (SSE)
Server import express from 'express' ;
const app = express ();
app.get ('/events' , (req, res ) => {
res.setHeader ('Content-Type' , 'text/event-stream' );
res.setHeader ('Cache-Control' , 'no-cache' );
res.setHeader ('Connection' , 'keep-alive' );
res.write (`event: connected\ndata: ${JSON .stringify({ time: Date .now() })} \n\n` );
const keepAlive = setInterval (() => {
res.write (`: keep-alive\n\n` );
}, 30000 );
const unsubscribe = eventEmitter.on ('update' , (data ) => {
res.write (`event: update\ndata: ${JSON .stringify(data)} \n\n` );
});
req.on ('close' , () => {
clearInterval (keepAlive);
unsubscribe ();
});
});
app.get ('/events/user/:userId' , authenticate, (req, res ) => {
const { userId } = req.params ;
res.setHeader ('Content-Type' , 'text/event-stream' );
res.setHeader ('Cache-Control' , 'no-cache' );
res.setHeader ('Connection' , 'keep-alive' );
const channel = `user:${userId} ` ;
const unsubscribe = pubsub.subscribe (channel, (message ) => {
res.write (`event: ${message.type } \ndata: ${JSON .stringify(message.data)} \n\n` );
});
req.on ('close' , () => {
unsubscribe ();
});
});
Client class EventSourceClient {
private eventSource : EventSource | null = null ;
private handlers = new Map <string , Set <Function >>();
connect (url : string ) {
this .eventSource = new EventSource (url);
this .eventSource .onopen = () => {
console .log ('SSE connected' );
};
this .eventSource .onerror = (error ) => {
console .error ('SSE error:' , error);
};
this .handlers .forEach ((handlers, eventType ) => {
this .eventSource !.addEventListener (eventType, (event : MessageEvent ) => {
const data = JSON .parse (event.data );
handlers.forEach (handler => handler (data));
});
});
}
on (eventType : string , handler : Function ) {
if (!this .handlers .has (eventType)) {
this .handlers .set (eventType, new Set ());
if (this .eventSource ) {
this .eventSource .addEventListener (eventType, (event : MessageEvent ) => {
const data = JSON .parse (event.data );
this .handlers .get (eventType)?.forEach (h => h (data));
});
}
}
this .handlers .get (eventType)!.add (handler);
return () => {
this .handlers .get (eventType)?.delete (handler);
};
}
close ( ) {
this .eventSource ?.close ();
this .eventSource = null ;
}
}
const sse = new EventSourceClient ();
sse.on ('update' , (data ) => console .log ('Update:' , data));
sse.on ('notification' , (data ) => showNotification (data));
sse.connect ('/events' );
Pub/Sub with Redis import Redis from 'ioredis' ;
const publisher = new Redis (process.env .REDIS_URL );
const subscriber = new Redis (process.env .REDIS_URL );
async function publishEvent (channel : string , event : any ) {
await publisher.publish (channel, JSON .stringify (event));
}
function subscribe (channel : string , handler : (event: any ) => void ) {
subscriber.subscribe (channel);
subscriber.on ('message' , (ch, message ) => {
if (ch === channel) {
handler (JSON .parse (message));
}
});
}
function subscribePattern (pattern : string , handler : (channel: string , event: any ) => void ) {
subscriber.psubscribe (pattern);
subscriber.on ('pmessage' , (pat, channel, message ) => {
if (pat === pattern) {
handler (channel, JSON .parse (message));
}
});
}
subscribe ('notifications' , (event ) => {
console .log ('Notification:' , event);
});
subscribePattern ('room:*' , (channel, event ) => {
const roomId = channel.split (':' )[1 ];
console .log (`Room ${roomId} :` , event);
});
publishEvent ('notifications' , { type : 'alert' , message : 'New message' });
publishEvent ('room:123' , { type : 'message' , content : 'Hello!' });
Related Skills
[[backend]] - Server implementation
[[system-design]] - Event-driven architecture
[[cloud-platforms]] - Managed pub/sub services