websocket
@mmm/websocket
Realtime-WebSocket-Package für @mmm-Apps: tenant-gescopte Topics, Auth-Handshake und
Signal-basierte Live-Subscriptions. Server (NestJS) + Client (Angular), framework-freie
Verträge dazwischen. Aufbau analog zu @mmm/auth.
Pakete
| Import | Paket | Inhalt |
|---|---|---|
@mmm/websocket/contracts | @mmm/websocket-contracts | Envelope, Event-Typen, Topic-Konvention (framework-frei) |
@mmm/websocket/server | @mmm/websocket-server | NestJS: WebsocketModule, Socket.IO-Gateway, RealtimeService |
@mmm/websocket/client | @mmm/websocket-client | Angular: WebsocketClient.subscribe(topic) → Signal, provideWebsocket |
Consumer installieren @mmm/websocket + @mmm/websocket-contracts.
Server (NestJS)
import { WebsocketModule } from '@mmm/websocket/server';
WebsocketModule.forRoot({ // The application provides token verification (decoupled from the auth implementation) verifyToken: async (raw) => /* → { sub, tid?, roles? } | null */, // Optional: join authorization (default: strict tenant isolation; global topics are denied) authorizeJoin: (claims, topic) => boolean,})
// Emit an event (e.g. after a database write or from a status producer):realtime.emit(topic, RealtimeEventTypes.StatusChanged, payload, { retain: true });Handshake-Auth läuft als Socket.IO-Middleware (blockiert bis verifyToken aufgelöst).
retain: true hält den letzten Envelope je Topic und stellt ihn späten Abonnenten beim
Join sofort zu (wie MQTT retained).
Client (Angular)
provideWebsocket({ tokenProvider: () => currentToken })
const feed = ws.subscribe<MyPayload>(topic); // Signal<RealtimeEnvelope<MyPayload> | null>Topics
- Tenant-gescopt:
resourceTopic({ tenant, app, resourceType, resourceId? })→t/{tenant}/{app}/{type}[/{id}] - Global (rollen-gegated):
globalTopic(key)→g/{key}
Scale-out
Broadcast über server.to(topic) funktioniert bei einem Pod. Bei 2+ Pods den
Socket.IO-Redis-Adapter in der App setzen (Drop-in). Locks/Presence + Shared-Store folgen.
Build & Release
pnpm installpnpm run build # contracts (tsc) → server (tsc) → client (ng-packagr)Release über Bitbucket Pipelines (analog @mmm/auth): Merge auf main erkennt den
Release-Typ aus der Commit-Message (feat/BREAKING CHANGE) und setzt einen Tag
websocket-v<x.y.z>; der Tag-Build setzt die Versionen, schreibt interne workspace:*-Deps
auf die Version um, baut und publiziert nach npm.dev.appcenter.de. Voraussetzung: die
Repository-Variable NPM_AUTH_TOKEN (Publish-Token der Registry) ist in Bitbucket gesetzt.