Skip to content

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

ImportPaketInhalt
@mmm/websocket/contracts@mmm/websocket-contractsEnvelope, Event-Typen, Topic-Konvention (framework-frei)
@mmm/websocket/server@mmm/websocket-serverNestJS: WebsocketModule, Socket.IO-Gateway, RealtimeService
@mmm/websocket/client@mmm/websocket-clientAngular: 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

Terminal window
pnpm install
pnpm 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.