Zum Hauptinhalt springen

Echtzeit-Architektur

ChurchApps verwendet ein einzelnes WebSocket-basiertes Zustellungs-Framework für jede Echtzeit-Oberfläche -- Gruppen-Chat, private Nachrichten, Inhaltsnotizen, Live-Stream-Chat und Präsenz/Teilnahme.

Overview

┌────────────────────┐                ┌────────────────────────────┐
│ Browser / B1Admin │ │ MessagingApi (Lambda) │
│ Browser / B1App │ ─── WS ─────▶ │ ┌───────────────────────┐ │
│ - SocketHelper │ │ │ SocketHelper (server) │ │
│ - SubscriptionMgr │ POST /msg ──▶│ │ MessageController │ │
│ - ConversationStore│ POST /conn ─▶│ │ ConnectionController │ │
│ - PresenceStore │ ◀── action ── │ │ DeliveryHelper │ │
└────────────────────┘ │ └───────────────────────┘ │
└────────────────────────────┘

Das Protokoll hat drei Teile:

  1. Ein persistenter WebSocket pro Browser-Tab
  2. Verbindungszeilen (POST /messaging/connections)
  3. Server-seitige Fan-Out durch DeliveryHelper.sendConversationMessages()

Ports and transport

EnvironmentHTTPWebSocket
Local dev8084ws://localhost:8087
Railwaysharedshared
AWS LambdaAPI GatewayAPI Gateway

Wire protocol

Jeder Frame ist JSON der Form PayloadInterface:

interface PayloadInterface {
churchId: string;
conversationId: string;
action: PayloadAction;
data: unknown;
}

Server-side components

FileRole
Api/src/modules/messaging/helpers/SocketHelper.tsBesitzt den WebSocketServer
Api/src/modules/messaging/helpers/DeliveryHelper.tsLeitet Frames an Sockets
Api/src/modules/messaging/controllers/ConnectionController.tsJoins/Leaves
Api/src/modules/messaging/controllers/MessageController.tsSpeichert und Fan-Out

Client-side primitives

Alle fünf Primitiven sind statische Singletons.

SocketHelper

Besitzt die einzelne WebSocket-Verbindung.

SubscriptionManager

Ref-gezählte Raum-Mitgliedschaft.

ConversationStore

In-Memory-Cache nach conversationId.

PresenceStore

Spiegelt ConversationStore's Muster für die attendance-Aktion.

NotificationService

Top-Level-Boot für authentifizierte Aufrufer.

Live stream chat

Der Live-Stream ist der größte anonyme Consumer des Frameworks.