WCAG 2.2 AA compliance, ARIA patterns, keyboard navigation, screen reader optimization
The English summary is being prepared. Showing the original description.
Connection management, room patterns, reconnection strategies, message buffering, and binary protocol design.
The English summary is being prepared. Showing the original description.
See how to installReview the instructions the agent will receive before you install.
Production WebSocket patterns for real-time applications.
import { WebSocketServer, WebSocket } from 'ws'
interface Client {
id: string
ws: WebSocket
rooms: Set<string>
lastPing: number
metadata: Record<string, unknown>
}
class ConnectionManager {
private clients = new Map<string, Client>()
private heartbeatInterval: NodeJS.Timeout
constructor(private wss: WebSocketServer) {
this.heartbeatInterval = setInterval(() => this.checkHeartbeats(), 30_000)
wss.on('connection', (ws, req) => {
const clientId = crypto.randomUUID()
const client: Client = {
id: clientId,
ws,
rooms: new Set(),
lastPing: Date.now(),
metadata: { ip: req.socket.remoteAddress }
}
this.clients.set(clientId, client)
ws.on('pong', () => { client.lastPing = Date.now() })
ws.on('close', () => this.removeClient(clientId))
ws.on('error', () => this.removeClient(clientId))
this.send(client, { type: 'connected', clientId })
})
}
private checkHeartbeats(): void {
const staleThreshold = Date.now() - 45_000
for (const [id, client] of this.clients) {
if (client.lastPing < staleThreshold) {
client.ws.terminate()
this.removeClient(id)
} else {
client.ws.ping()
}
}
}
private removeClient(id: string): void {
const client = this.clients.get(id)
if (!client) return
for (const room of client.rooms) {
this.leaveRoom(id, room)
}
this.clients.delete(id)
}
send(client: Client, data: unknown): void {
if (client.ws.readyState === WebSocket.OPEN) {
client.ws.send(JSON.stringify(data))
}
}
destroy(): void {
clearInterval(this.heartbeatInterval)
}
}
class RoomManager {
private rooms = new Map<string, Set<string>>()
joinRoom(clientId: string, room: string): void {
if (!this.rooms.has(room)) {
this.rooms.set(room, new Set())
}
this.rooms.get(room)!.add(clientId)
}
leaveRoom(clientId: string, room: string): void {
const members = this.rooms.get(room)
if (!members) return
members.delete(clientId)
if (members.size === 0) this.rooms.delete(room)
}
broadcast(room: string, data: unknown, excludeId?: string): void {
const members = this.rooms.get(room)
if (!members) return
const payload = JSON.stringify(data)
for (const id of members) {
if (id === excludeId) continue
const client = this.clients.get(id)
if (client?.ws.readyState === WebSocket.OPEN) {
client.ws.send(payload)
}
}
}
getRoomSize(room: string): number {
return this.rooms.get(room)?.size ?? 0
}
}
class ReconnectingWebSocket {
private ws: WebSocket | null = null
private reconnectAttempts = 0
private maxReconnectDelay = 30_000
private messageBuffer: unknown[] = []
private handlers = new Map<string, Function[]>()
constructor(private url: string) {
this.connect()
}
private connect(): void {
this.ws = new WebSocket(this.url)
this.ws.onopen = () => {
this.reconnectAttempts = 0
this.flushBuffer()
this.emit('connected')
}
this.ws.onclose = (event) => {
if (event.code === 1000) return // Normal closure, no reconnect
this.scheduleReconnect()
}
this.ws.onmessage = (event) => {
const data = JSON.parse(event.data as string)
this.emit(data.type, data)
}
this.ws.onerror = () => {
this.ws?.close()
}
}
private scheduleReconnect(): void {
// Exponential backoff with jitter
const baseDelay = Math.min(1000 * 2 ** this.reconnectAttempts, this.maxReconnectDelay)
const jitter = baseDelay * 0.3 * Math.random()
const delay = baseDelay + jitter
this.reconnectAttempts++
setTimeout(() => this.connect(), delay)
}
send(data: unknown): void {
if (this.ws?.readyState === WebSocket.OPEN) {
this.ws.send(JSON.stringify(data))
} else {
// Buffer messages while disconnected (max 100)
if (this.messageBuffer.length < 100) {
this.messageBuffer.push(data)
}
}
}
private flushBuffer(): void {
const buffered = [...this.messageBuffer]
this.messageBuffer = []
for (const msg of buffered) {
this.send(msg)
}
}
on(event: string, handler: Function): void {
if (!this.handlers.has(event)) this.handlers.set(event, [])
this.handlers.get(event)!.push(handler)
}
private emit(event: string, ...args: unknown[]): void {
for (const handler of this.handlers.get(event) ?? []) {
handler(...args)
}
}
}
// Typed message envelope
interface WsMessage<T = unknown> {
type: string
id: string // For request-response correlation
timestamp: number
payload: T
}
// Request-response over WebSocket
class WsRpc {
private pending = new Map<string, { resolve: Function; timer: NodeJS.Timeout }>()
async request<T>(type: string, payload: unknown, timeoutMs = 5000): Promise<T> {
const id = crypto.randomUUID()
const msg: WsMessage = { type, id, timestamp: Date.now(), payload }
return new Promise((resolve, reject) => {
const timer = setTimeout(() => {
this.pending.delete(id)
reject(new Error(`RPC timeout: ${type}`))
}, timeoutMs)
this.pending.set(id, { resolve, timer })
this.ws.send(JSON.stringify(msg))
})
}
handleResponse(msg: WsMessage): void {
const entry = this.pending.get(msg.id)
if (!entry) return
clearTimeout(entry.timer)
this.pending.delete(msg.id)
entry.resolve(msg.payload)
}
}
No reviews yet. Tell others what you thought.
No login needed. Share how it worked for you, ask a question, or note where it did not run.
No comments yet. Be the first to write one.
WCAG 2.2 AA compliance, ARIA patterns, keyboard navigation, screen reader optimization
The English summary is being prepared. Showing the original description.
axe-core integration, WCAG 2.2 AA checklist, keyboard navigation testing, screen reader testing, and ARIA pattern validation.
The English summary is being prepared. Showing the original description.
Steam-style achievement system with XP, levels, streaks, and skill trees. Gamifies the development workflow. 25 achievements across 5 categories.
The English summary is being prepared. Showing the original description.
Framework for measuring and tracking agent response quality over time. Detects regressions before they reach production. Use when evaluating agent changes, auditing quality, or establishing performance baselines.
The English summary is being prepared. Showing the original description.
Agent Context Isolation
The English summary is being prepared. Showing the original description.
Agent ve skill dosyalarinin yapisal dogrulamasi. Frontmatter kontrol, naming convention, zorunlu bolum kontrolu, tutarlilik denetimi. Yeni agent/skill eklendiginde veya mevcut dosyalar duzenlediginde otomatik calistirilir.
The English summary is being prepared. Showing the original description.