websocket-implementation · secondsky — скилл для Claude Code: real-time
Скилл для агента, который пишет сервер и клиент WebSocket: комнаты, переподключение, масштабирование через Redis.
npx skills add secondsky/claude-skills --skill websocket-implementation -a claude-codeЧто делает websocket-implementation
Скилл даёт агенту готовые шаблоны для real-time связи на Socket.IO. Внутри — серверная часть с аутентификацией по токену из handshake, карта подключённых пользователей, комнаты через socket.join и рассылка сообщений в комнату или конкретному пользователю. Есть утилиты для точечной доставки: обновление профиля, уведомление комнаты, личное сообщение.
Клиентская часть — класс с очередью сообщений: если сокет отключён, сообщение не теряется, а уходит после восстановления связи. Переподключение настроено с задержкой и числом попыток. Для React есть хук useWebSocket, который отдаёт состояние соединения, список сообщений и функцию отправки. Токен хук берёт из вашей функции getToken() — её нужно написать самому, готовой реализации в скилле нет.
Для нескольких серверов подключается адаптер @socket.io/redis-adapter через REDIS_URL. Без Redis горизонтальное масштабирование не заработает: сообщение, отправленное на одном инстансе, не дойдёт до клиентов на другом. В скилле есть таблица выбора архитектуры по числу соединений и Express-эндпоинты /api/ws/stats и /api/ws/health для мониторинга. Python-вариант на aiohttp и FastAPI вынесен в отдельный файл references/python-websocket.md.
Какие задачи решает
- поднять сервер Socket.IO с аутентификацией по токену
- раздавать сообщения по комнатам и отдельным пользователям
- пережить обрыв связи без потери отправленных сообщений
- развести соединения по нескольким инстансам через Redis
- подключить WebSocket к React-компоненту одним хуком
Примеры запросов агенту
- Напиши сервер Socket.IO с комнатами и аутентификацией по токену из handshake
- Сделай React-хук useWebSocket с очередью сообщений на время обрыва связи
- Подключи Redis-адаптер, чтобы сообщения доходили между инстансами
Как установить websocket-implementation
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill websocket-implementation -a claude-code2Вручную: положить файлы
~/.claude/skills/websocket-implementation/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/websocket-implementation/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill websocket-implementation -a codex2Вручную: положить файлы
.agents/skills/websocket-implementation/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill websocket-implementation -a cursor2Вручную: положить файлы
.cursor/skills/websocket-implementation/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install secondsky/claude-skills websocket-implementation2Вручную: положить файлы
.github/skills/websocket-implementation/SKILL.md1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill websocket-implementation -a gemini-cli2Командой платформы
gemini skills install https://github.com/secondsky/claude-skills --path plugins/websocket-implementation/skills/websocket-implementationВручную: положить файлы
.devin/skills/websocket-implementation/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill websocket-implementation -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Из того же набора89
Другие версии websocket-implementation
Похожие
Рядом в теме «Бэкенд и API»
Всё по теме «Бэкенд и API» →Вопросы о websocket-implementation
Как установить websocket-implementation в Claude?
Выполните npx skills add secondsky/claude-skills --skill websocket-implementation -a claude-code. После этого файл скилла лежит в ~/.claude/skills/websocket-implementation/SKILL.md.
Что делает websocket-implementation?
Даёт агенту шаблоны сервера и клиента Socket.IO: управление подключениями, комнаты, очередь сообщений, переподключение и адаптер Redis для нескольких инстансов.
Нужен ли Redis для работы скилла?
Для одного сервера нет. Redis нужен, когда инстансов несколько: без адаптера @socket.io/redis-adapter сообщения не расходятся между ними.
Исходный текст
SKILL.md · MIT
---
name: websocket-implementation
description: Implements real-time WebSocket communication with connection management, room-based messaging, and horizontal scaling. Use when building chat systems, live notifications, collaborative tools, or real-time dashboards.
license: MIT
---
# WebSocket Implementation
Build scalable real-time communication systems with proper connection management.
## Server Implementation (Socket.IO)
```javascript
const { Server } = require('socket.io');
const { createAdapter } = require('@socket.io/redis-adapter');
const { createClient } = require('redis');
const io = new Server(server, {
cors: { origin: process.env.CLIENT_URL, credentials: true }
});
// Redis adapter for horizontal scaling
const pubClient = createClient({ url: process.env.REDIS_URL });
const subClient = pubClient.duplicate();
Promise.all([pubClient.connect(), subClient.connect()]).then(() => {
io.adapter(createAdapter(pubClient, subClient));
});
// Connection management
const users = new Map();
io.use((socket, next) => {
const token = socket.handshake.auth.token;
try {
socket.user = verifyToken(token);
next();
} catch (err) {
next(new Error('Authentication failed'));
}
});
io.on('connection', (socket) => {
users.set(socket.user.id, socket.id);
console.log(`User ${socket.user.id} connected`);
socket.on('join-room', (roomId) => {
socket.join(roomId);
socket.to(roomId).emit('user-joined', socket.user);
});
socket.on('message', ({ roomId, content }) => {
io.to(roomId).emit('message', {
userId: socket.user.id,
content,
timestamp: Date.now()
});
});
socket.on('disconnect', () => {
users.delete(socket.user.id);
});
});
// Utility methods for message distribution
function broadcastUserUpdate(userId, data) {
io.to(`user:${userId}`).emit('user-update', data);
}
function notifyRoom(roomId, event, data) {
io.to(`room:${roomId}`).emit(event, data);
}
function sendDirectMessage(userId, message) {
const socketId = users.get(userId);
if (socketId) {
io.to(socketId).emit('direct-message', message);
}
}
```
## Client Implementation
```javascript
import { io } from 'socket.io-client';
class WebSocketClient {
constructor(url, token) {
this.socket = io(url, {
auth: { token },
reconnection: true,
reconnectionDelay: 1000,
reconnectionAttempts: 5
});
this.messageQueue = [];
this.setupListeners();
}
setupListeners() {
this.socket.on('connect', () => {
console.log('Connected');
this.flushQueue();
});
this.socket.on('disconnect', (reason) => {
console.log('Disconnected:', reason);
});
this.socket.on('message', (msg) => {
this.onMessage?.(msg);
});
}
joinRoom(roomId) {
this.socket.emit('join-room', roomId);
}
send(roomId, content) {
if (this.socket.connected) {
this.socket.emit('message', { roomId, content });
} else {
this.messageQueue.push({ roomId, content });
}
}
flushQueue() {
while (this.messageQueue.length > 0) {
const msg = this.messageQueue.shift();
this.socket.emit('message', msg);
}
}
}
```
## React Hook
```javascript
function useWebSocket(url) {
const [socket, setSocket] = useState(null);
const [connected, setConnected] = useState(false);
const [messages, setMessages] = useState([]);
useEffect(() => {
// getToken() is a user-supplied helper that returns the current auth token
// Example implementations:
// - From localStorage: () => localStorage.getItem('authToken')
// - From context: () => authContext.token
// - From cookie: () => document.cookie.split('token=')[1]
const ws = io(url, { auth: { token: getToken() } });
ws.on('connect', () => setConnected(true));
ws.on('disconnect', () => setConnected(false));
ws.on('message', (msg) => {
setMessages(prev => [...prev, msg]);
});
setSocket(ws);
return () => ws.disconnect();
}, [url]);
const send = useCallback((roomId, content) => {
socket?.emit('message', { roomId, content });
}, [socket]);
return { connected, messages, send };
}
```
## Message Protocol
```typescript
interface Message {
type: 'message' | 'typing' | 'presence';
roomId: string;
userId: string;
content?: string;
timestamp: number;
}
// Acknowledge delivery
socket.emit('message', data, (ack) => {
if (ack.success) console.log('Delivered');
});
```
## Additional Implementations
See [references/python-websocket.md](references/python-websocket.md) for:
- Python aiohttp WebSocket server
- FastAPI WebSocket endpoints
- Async connection handling
## Scaling Considerations
| Connections | Architecture |
|-------------|--------------|
| <10K | Single server |
| 10K-100K | Redis pub/sub |
| >100K | Sharded Redis + load balancer |
## Monitoring Endpoints
```javascript
// Express endpoints for operational visibility
app.get('/api/ws/stats', (req, res) => {
res.json({
activeConnections: io.sockets.sockets.size,
rooms: [...io.sockets.adapter.rooms.keys()],
users: users.size
});
});
app.get('/api/ws/health', (req, res) => {
res.json({
status: 'healthy',
uptime: process.uptime(),
memoryUsage: process.memoryUsage()
});
});
```
## Best Practices
- Authenticate before allowing operations
- Implement reconnection with exponential backoff
- Use rooms and channels for targeted broadcasting
- Add heartbeat/ping for connection health
- Persist important messages to database
- Monitor active connection counts
- Display user presence/availability status
- Implement rate limiting on incoming messages
- Use acknowledgments to confirm message delivery
- Leverage Redis for distributed deployments
- Implement comprehensive error handling
## Never Do
- Send sensitive data unencrypted
- Store unlimited messages in memory
- Skip authorization on room joins
- Ignore connection error handling
- Allow unbounded room subscriptions
- Neglect cleanup of disconnected user data
- Send frequent oversized message payloads
- Include authentication credentials in message bodies
- Deploy without security validation
- Allow uncontrolled connection accumulation
- Build without scalability consideration
© secondsky · MIT · secondsky/claude-skills