> nestjs-real-time
WebSocket and SSE selection strategies and scaling. Use when implementing WebSocket gateways or Server-Sent Events in NestJS. (triggers: **/*.gateway.ts, **/*.controller.ts, WebSocketGateway, SubscribeMessage, Sse, Socket.io)
curl "https://skillshub.wtf/HoangNguyen0403/agent-skills-standard/nestjs-real-time?format=md"Real-Time & WebSockets
Priority: P1 (OPERATIONAL)
WebSocket and real-time communication patterns with NestJS.
- WebSockets (Bi-directional): Use for Chat, Multiplayer Games, Collaborative Editing.
- High Complexity: Requires custom scaling (Redis Adapter) and sticky sessions (sometimes).
- Server-Sent Events (SSE) (Uni-directional): Use for Notifications, Live Feeds, Tickers, CI Log streaming.
- Low Complexity: Standard HTTP. Works with standard Load Balancers. Easy to secure.
- NestJS: Use
@Sse('route')returningObservable<MessageEvent>.
- Long Polling: Use only as a fallback or for extremely low-frequency updates (e.g., job status check every 10m).
- Impact: High header overhead. Blocks threads if not handled carefully.
WebSockets Implementation
- Socket.io: Default choice. Features "Rooms", "Namespaces", and automatic reconnection. Heavy protocol.
- Fastify/WS: Use
wsadapter if performance is critical (e.g., high-frequency trading updates) and you don't need "Rooms" logic.
Scaling (Critical)
- WebSockets: In K8s, a client connects to Pod A. If Pod B emits an event, the client won't receive it.
- Solution: Redis Adapter (
@socket.io/redis-adapter). Every pod publishes to Redis; Redis distributes to all other pods.
- Solution: Redis Adapter (
- SSE: Stateless. No special adapter needed, but be aware of Connection Limits (6 concurrent connections per domain in HTTP/1.1; virtually unlimited in HTTP/2).
- Rule: Must use HTTP/2 for SSE at scale.
Security
- Handshake Auth: Standard HTTP Guards don't trigger on Ws connection efficiently.
- Pattern: Validate JWT during the
handleConnection()lifecycle method. Disconnect immediately if invalid.
- Pattern: Validate JWT during the
- Rate Limiting: Sockets are expensive. Apply strict throttling on "Message" events to prevent flooding.
Architecture
- Gateway != Service: The
WebSocketGatewayshould only handle client comms (Join Room, Ack message).- Rule: Delegate business logic to a Service or Command Bus.
- Events: Use
AsyncApiorSocketApidecorators (from community packages) to document WS events similarly to OpenAPI.
🚫 Anti-Patterns
- Do NOT use standard patterns if specific project rules exist.
- Do NOT ignore error handling or edge cases.
> related_skills --same-repo
> typescript-tooling
Development tools, linting, and build config for TypeScript. Use when configuring ESLint, Prettier, Jest, Vitest, tsconfig, or any TS build tooling. (triggers: tsconfig.json, .eslintrc.*, jest.config.*, package.json, eslint, prettier, jest, vitest, build, compile, lint)
> typescript-security
Secure coding practices for TypeScript. Use when validating input, handling auth tokens, sanitizing data, or managing secrets and sensitive configuration. (triggers: **/*.ts, **/*.tsx, validate, sanitize, xss, injection, auth, password, secret, token)
> typescript-language
Modern TypeScript standards for type safety and maintainability. Use when working with types, interfaces, generics, enums, unions, or tsconfig settings. (triggers: **/*.ts, **/*.tsx, tsconfig.json, type, interface, generic, enum, union, intersection, readonly, const, namespace)
> typescript-best-practices
Idiomatic TypeScript patterns for clean, maintainable code. Use when writing or refactoring TypeScript classes, functions, modules, or async logic. (triggers: **/*.ts, **/*.tsx, class, function, module, import, export, async, promise)