Inter-service communication

All FaceKom runtime edges that are proven in source. Four transports carry inter-process/inter-service traffic:

  1. RabbitMQ (AMQP, via mq ConnectionPool) — the primary backbone between vuer_css (CSS, customer side) and vuer_oss (OSS, operator side + DB owner), and between OSS’s own 7 processes. RPC (request/reply), work-queues (point-to-point durable), and pub/sub (fanout).
  2. HTTP RESTvuer_ossvuer_cv only (fetch POST/GET to https://<cv-host>/api/v1|v2/...).
  3. Socket.IOvuer_css ↔ browser/kiosk (the WebRTC signaling + UI realtime channel).
  4. Janus WebRTC signalingvuer_oss → Janus Gateway (JSON-over-WebSocket via janus-api). CSS does not talk to Janus.

Branch basis

OSS verified against local devel (git show devel:<path>); CSS verified against origin/devel (no local devel ref); CV against local devel. Both vuer_oss and vuer_css working trees were checked out on customization branches, so every queue/event name below is from the devel-line core, not a partner branch.

mq queue/exchange semantics (from mq)

  • getRPCClient(name) / getRPCServer(name) → RPC over a durable named queue name + per-call reply queue, correlationId-matched (RPCServer.ts:94-113, RPCClient.ts:128-159).
  • getQueueClient(name) / getQueueServer(name)point-to-point durable work queue named name (QueueClient.ts:11-37, QueueServer.ts:36-50).
  • getPublisher(name) / getSubscriber(name)fanout exchange name, each subscriber gets an exclusive auto-delete queue (Publisher.ts:54-58, Subscriber.ts:86-102). The string passed to these is the queue/exchange name on the wire. Producer = client/publisher; consumer = server/subscriber. An edge exists only where one process registers the client/publisher and another registers the server/subscriber for the same name.

1. RabbitMQ — RPC endpoints (request/reply)

Queue nameProducer (RPC client)Consumer (RPC server)PurposeSource
rpc-create-customerCSS server.js:116OSS server.js rpc-create-customerCreate/register a customervuer_oss server.js; vuer_css server.js:116
rpc-customer-portal-dataCSS server.js:117OSS rpc-customer-portal-dataFetch customer portal datavuer_oss/css server.js
rpc-jwt-authCSS server.js:118OSS rpc-jwt-authJWT-based auth of a customer/sessionvuer_oss/css server.js
rpc-get-customerCSS server.js:119OSS rpc-get-customerRead a customer recordvuer_oss/css server.js
rpc-waiting-roomCSS server.js:120OSS rpc-waiting-roomWaiting-room state/opsvuer_oss/css server.js
rpc-videochat-ossCSS server.js:121 (+ socket videochat.js:18)OSS rpc-videochat-ossVideochat room join + room datavuer_oss server.js; vuer_css server/socket/events/videochat.js:18
rpc-callback-requestCSS server.js:122OSS rpc-callback-requestRequest-callback submissionvuer_oss/css server.js
rpc-openhoursCSS server.js:123OSS rpc-openhoursOpening-hours lookupvuer_oss/css server.js
rpc-openhours-calendarsCSS server.js:124OSS rpc-openhours-calendarsOpening-hours calendarsvuer_oss/css server.js
rpc-partner-serviceCSS server.js:125OSS rpc-partner-servicePartner-specific service callsvuer_oss/css server.js
rpc-custom-contentCSS server.js:126OSS rpc-custom-contentCustom/branded contentvuer_oss/css server.js
rpc-selfservice-actionsCSS server.js:127OSS rpc-selfservice-actionsSelf-service flow actionsvuer_oss/css server.js
rpc-selfservice-uploadCSS server.js:128OSS rpc-selfservice-uploadSelf-service file uploadvuer_oss/css server.js
client-gateCSS server.js:129OSS client-gateClientGate SAML/IdP gatevuer_oss/css server.js
background-room-exportCSS server.js:130 and OSS server.js (client)OSS background.js:174 (server)Room export jobvuer_oss background.js:174; vuer_css server.js:130
background-self-service-room-exportCSS server.js:131 and OSS server.js (client)OSS background.js:175Self-service room export jobvuer_oss background.js:175; vuer_css server.js:131
rpc-system-checkCSS server.js:132OSS rpc-system-checkSystem-check / diagnosticsvuer_oss/css server.js
rpc-jwt-kiosk-authCSS server.js:133OSS rpc-jwt-kiosk-authKiosk JWT authvuer_oss/css server.js
rpc-kiosk-alive-checkCSS server.js:134 (+ socket ping.js ping:oss)OSS rpc-kiosk-alive-checkKiosk/OSS liveness (checkOssStatus)vuer_oss server.js; vuer_css server/socket/events/ping.js
rpc-media-contentCSS server.js:135OSS rpc-media-contentMedia content lookupvuer_oss/css server.js
rpc-identification-routerCSS server.js:136OSS rpc-identification-routerIdentification routingvuer_oss/css server.js
rpc-device-compatibility-checkCSS server.js:137OSS rpc-device-compatibility-checkDevice compatibility checkvuer_oss/css server.js
rpc-appointmentCSS server.js:138OSS rpc-appointmentAppointment bookingvuer_oss/css server.js
rpc-selfservice-v2 (cond: flow+selfService)CSS server.js:142OSS server.js rpc-selfservice-v2Self-service v2 actionsvuer_oss/css server.js
rpc-device-change (cond)CSS server.js:148OSS server.js rpc-device-changeDevice-change flowvuer_oss/css server.js
rpc-document-upload (cond: documentUpload)CSS server.js:156OSS server.js rpc-document-uploadDocument uploadvuer_oss/css server.js
rpc-document-delete (cond)CSS server.js:157OSS server.js rpc-document-deleteDocument deletevuer_oss/css server.js
rpc-customer-documents (cond)CSS server.js:158 (marked “Never used”)OSS server.js rpc-customer-documentsCustomer documents listvuer_css server.js:158 (TODO comment); vuer_oss server.js
rpc-flow-documents (cond)CSS server.js:159 (marked “Never used”)OSS server.js rpc-flow-documentsFlow documentsvuer_css server.js:159; vuer_oss server.js
rpc-presentation (cond: presentationMode)CSS server.js:163OSS server.js rpc-presentationPresentation-mode opsvuer_oss/css server.js
css-pingOSS server.js (client cssPing)CSS server.js:84 (server)OSS→CSS liveness pingvuer_oss server.js; vuer_css server.js:84
rpc-system-ossOSS server.js (client systemOss)CSS server.js:85 (server)OSS→CSS system statusvuer_oss server.js; vuer_css server.js:85
kiosk-document-scan (cond: documentScanner)OSS server.js (client documentScan)CSS server.js:89 (server)OSS→CSS kiosk document-scan requestvuer_oss server.js; vuer_css server.js:89
rpc-transport-cssOSS server.js (TransportCss RPC client)CSS server.js:217 (TransportCss RPC server)OSS→CSS transport/media-signaling RPCvuer_oss server.js; vuer_css server.js:217
rpc-transport-ossCSS server.js:216 (TransportOss RPC client)OSS server.js (TransportOss RPC server)CSS→OSS transport/media-signaling RPCvuer_css server.js:216; vuer_oss server.js

OSS-internal RPC (between OSS’s own processes)

Queue nameProducer (RPC client)Consumer (RPC server)PurposeSource
convert-pingOSS server.js (convertPing)OSS convert.js:59Liveness ping to converter daemonvuer_oss server.js, convert.js:59
cron-pingOSS server.js (cronPing)OSS cron.js:113Liveness ping to cron daemonvuer_oss server.js, cron.js:113
background-pingOSS server.js (backgroundPing)OSS background.js:171Liveness ping to background workervuer_oss server.js, background.js:171
media-pingOSS server.js (mediaPing)OSS media.js:84Liveness ping to media servervuer_oss server.js, media.js:84
storage-ping(registered server)OSS storage.js:52Liveness ping to storage workervuer_oss storage.js:52
backgroundOSS background.js:178 (client)OSS server.js (BackgroundRPCServer)Background→main RPCvuer_oss background.js:178, server.js
background-reportsOSS server.js (reports)OSS background.js:172Report generationvuer_oss server.js, background.js:172
background-archiveOSS server.js (archive)OSS background.js:173Archive jobsvuer_oss server.js, background.js:173
background-recognition (cond: ocr/config)OSS server.js (recognition)OSS background.js:182Face/document recognition jobsvuer_oss server.js, background.js:182
rpc-xml-report (cond: xmlReport)OSS server.js + cron.js:122 (clients)OSS background.js:187 (server)XML reportvuer_oss server.js, cron.js:122, background.js:187
rpc-xlsx-report (cond: xlsxReport)OSS server.js (xlsxReport)OSS background.js:192XLSX reportvuer_oss server.js, background.js:192
cronManager (cond: features.cronManager)OSS server.js (cronManager)OSS cron.js:117Cron managementvuer_oss server.js, cron.js:117
flow-autoclear (cond: flowClear+flow.autoClear)OSS cron.js:127 (client)OSS server.js (FlowAutoClearRPCServer)Flow auto-clearvuer_oss cron.js:127, server.js
integration-log (cond: integrationLog.enabled)OSS server.js (integrationLog)OSS integrationLog.js:48Encrypted integration-log sinkvuer_oss server.js, integrationLog.js:48

Cross-service RPC: OSS → e-sign

Queue nameProducerConsumerPurposeSource
rpc-esign:external (cond: esign.active)OSS server.js + background.js:200-202 (EsignApi RPC client)esign_oss (external e-sign service)E-signature API callsvuer_oss server.js, background.js:196-203

rpc-esign:external uses a dedicated queue connection when esign.queueConnection names a pool connection that connectionPool.hasConnection(...); otherwise the default connection (server.js, background.js:196-203). The consumer (esign service) lives in another repo — see esign_oss.


2. RabbitMQ — work queues (point-to-point, durable)

Queue nameProducer (queue client)Consumer (queue server)PurposeSource
queue-feedbackCSS server.js:193OSS server.js (FeedbackQueueServer)Customer feedback submissionvuer_css server.js:193; vuer_oss server.js
queue-videochat-ossCSS server.js:194 (+ socket videochat.js:12,17)OSS server.js (VideoChatOssQueueServer)Videochat events CSS→OSS (join/leave)vuer_css server.js:194, server/socket/events/videochat.js:12,17; vuer_oss server.js
queue-customer-historyCSS server.js:195OSS server.js (CustomerHistoryQueueServer)Customer history eventsvuer_css server.js:195; vuer_oss server.js
queue-webrtc-logCSS server.js:196OSS server.js (WebRTCLogQueueServer)WebRTC log eventsvuer_css server.js:196; vuer_oss server.js
queue-clienterror-logCSS server.js:197OSS server.js (ClientErrorLogQueueServer)Client-side error logvuer_css server.js:197; vuer_oss server.js
queue-customerCSS server.js:198OSS server.js (CustomerQueueServer)Customer eventsvuer_css server.js:198; vuer_oss server.js
queue-selfservice-eventsCSS server.js:199OSS server.js (SelfServiceEvents, cond flow+selfService)Self-service events CSS→OSSvuer_css server.js:199; vuer_oss server.js
queue-selfservice-v2CSS server.js:200OSS server.js (SelfServiceV2QueueServer, cond)Self-service v2 events CSS→OSSvuer_css server.js:200; vuer_oss server.js
css-client-ping-resultCSS server.js:201OSS server.js (CssClientPingResult)Client ping-result report CSS→OSSvuer_css server.js:201; vuer_oss server.js
kiosk-queue-document-scan (cond: documentScanner)CSS server.js:205OSS server.js (KioskDocumentScanQueueServer)Kiosk document-scan store CSS→OSSvuer_css server.js:205; vuer_oss server.js
queue-transport-ossCSS server.js:211 (TransportOss queue client)OSS server.js (TransportOss queue server)CSS→OSS media-transport messagesvuer_css server.js:211; vuer_oss server.js
queue-transport-cssOSS server.js (TransportCss queue client)CSS server.js:212 (TransportCss queue server)OSS→CSS media-transport messagesvuer_oss server.js; vuer_css server.js:212
queue-service-busOSS server.js (ServiceBusQueueClient)CSS server.js:172 (ServiceBusQueueServer)OSS→CSS service-bus eventsvuer_oss server.js; vuer_css server.js:172
queue-waiting-roomOSS server.js (WaitingRoomQueueClient)CSS server.js:173 (WaitingRoomQueueServer)OSS→CSS waiting-room updatesvuer_oss server.js; vuer_css server.js:173
queue-videochat-cssOSS server.js (VideochatCssQueueClient)CSS server.js:174 (VideoChatCssQueueServer)OSS→CSS videochat eventsvuer_oss server.js; vuer_css server.js:174
queue-selfservice-cssOSS server.js (SelfServiceCssQueueClient, cond)CSS server.js:175 (SelfServiceCssQueueServer)OSS→CSS self-service eventsvuer_oss server.js; vuer_css server.js:175
queue-selfservice-v2-cssOSS server.js (SelfServiceV2CssQueueClient, cond)CSS server.js:179 (SelfServiceV2CssQueueServer, cond)OSS→CSS self-service v2 eventsvuer_oss server.js; vuer_css server.js:179

OSS-internal work queues

Queue nameProducer (queue client)Consumer (queue server)PurposeSource
queue-convertOSS server.js (convert) + storage.js:62OSS convert.js:63 (ConvertQueueServer)Push recordings for transcodingvuer_oss server.js, storage.js:62, convert.js:63
queue-storageOSS server.js (storage) + cron.js:131 (clients)OSS storage.js:56 (StorageQueueServer)Move media between storages (e.g. S3)vuer_oss server.js, cron.js:131, storage.js:56
queue-job-status-changeOSS server.js (JobStatusChangeQueueClient)OSS server.js (JobStatusChangeQueueServer)Job status-change eventsvuer_oss server.js
queue-selfservice-cron (cond)OSS cron.js:135 (client)OSS server.js (SelfServiceCron queue server)Self-service cron jobsvuer_oss cron.js:135, server.js
queue-room-cron (cond: roomAutoCloseHours)OSS cron.js:139 (client)OSS server.js (RoomCron queue server)Room auto-close cronvuer_oss cron.js:139, server.js
queue-convert-state(produced by converter pipeline)OSS server.js (ConvertStateQueueServer)Convert-state updatesvuer_oss server.js
queue-storage-state(produced by storage worker)OSS server.js (StorageStateQueueServer)Storage-state updatesvuer_oss server.js

queue-convert-state / queue-storage-state: only the queue server (consumer) is registered in server.js; the matching producer is the convert/storage worker writing back state. The reverse direction (queue-convert, queue-storage) has the explicit client registrations shown above.


3. RabbitMQ — pub/sub (fanout exchanges)

Exchange namePublishersSubscribersPurposeSource
settings-changeOSS server.js, convert.js:67, cron.js:146, background.js:210, media.js:91, integrationLog.js:49OSS server.js, convert.js:71, cron.js:157, background.js:221, media.js:98Broadcast settings changes to all OSS processesvuer_oss server.js, convert.js, cron.js, background.js, media.js, integrationLog.js
customer-keyOSS server.js, cron.js:145, background.js:209, media.js:90OSS server.js, cron.js:156, background.js:220, media.js:97Broadcast customer encryption-key eventsvuer_oss server.js, cron.js, background.js, media.js
background-process (cond: backgroundProcess)OSS server.js, cron.js:150, background.js:214OSS server.js, cron.js:161, background.js:225Broadcast background-process lifecyclevuer_oss server.js, cron.js, background.js

These three are OSS-internal fanout (all six OSS processes register the same publisher+subscriber so a state change in one propagates to all). No CSS subscriber is registered for them.


4. HTTP — vuer_oss → vuer_cv (REST)

Only OSS calls CV over HTTP. CV ( vuer_cv) is a leaf: it exposes Falcon REST under /api/v* (fronted by nginx; /ws for streaming) and makes no outbound FaceKom calls. There is no HTTP from CSS to OSS — that path is entirely RabbitMQ.

OSS builds the base URL as ${config.cv.httpProtocol||'https'}://${host} and calls with fetch (POST JSON or GET), using an https.Agent({ rejectUnauthorized: config.cv.rejectUnauthorized ?? true }).

  • Vision APIs (server/cv/visions/* via VuerCVService): host from each entry of config.hosts.cvs (array; per-host key/cert/ca TLS). Instantiated in customization/customization.js:79-86 (cv:setup hook → one VuerCVService per host). Base URL set at VuerCVService.js:24 (vuerCVBaseUrl), passed into vision APIs at VuerCVService.js:40.
  • OCR / MRZ / face-recognition engines (server/ocr/engines/*, server/faceRecognition/engine/*): host from config.hosts.cv (single string), base URL at VuerCVOCRRecognition.js:17, VuerCVMRZDetector.js:17, VuerCVFaceRecognitionEngine.js:23.
Endpoint (method)Producer (OSS caller)Consumer (CV route)PurposeSource
POST /api/v1/face-compareOSS FaceCompareApi.js:26, VuerCVFaceRecognitionEngine.jsCV app_http.py:70 FaceCompareResourceCompare two faces (cosine distance)vuer_oss server/cv/visions/faceComparision/FaceCompareApi.js:26; vuer_cv app_http.py:70
POST /api/v1/face-detectOSS FaceDetectionApi.js:67, VuerCVFaceRecognitionEngine.jsCV app_http.py:69 FaceDetectResourceDetect faces in an imagevuer_oss server/cv/visions/faceDetection/FaceDetectionApi.js:67; vuer_cv app_http.py:69
POST /api/v1/face-drawOSS VuerCVService.js:257, VuerCVFaceRecognitionEngine.jsCV app_http.py:71 FaceDrawResourceDraw face markers on imagevuer_oss server/service/VuerCVService.js:257; vuer_cv app_http.py:71
POST /api/v1/reference-face-extractOSS FaceExtractionApi.js:59, VuerCVService.js:412CV app_http.py:72 ReferenceFaceExtractResourceExtract reference facevuer_oss server/cv/visions/faceExtraction/FaceExtractionApi.js:59; vuer_cv app_http.py:72
POST /api/v1/face-gender-ageOSS VuerCVService.js:466CV app_http.py:73 FaceGenderAgeResourceGender/age estimationvuer_oss server/service/VuerCVService.js:466; vuer_cv app_http.py:73
POST /api/v1/mrzOSS MRZDetectionApi.js:23, VuerCVMRZDetector.js:40, VuerCVService.js:358CV app_http.py:68 MrzResourceRead passport/ID MRZvuer_oss server/cv/visions/mrzRecognition/MRZDetectionApi.js:23, server/ocr/engines/VuerCVMRZDetector.js:40; vuer_cv app_http.py:68
POST /api/v1/document-ocrOSS VuerCVOCRRecognition.js:71, VuerCVService.js:321CV app_http.py:78 DocumentOcrResourceTemplated document OCRvuer_oss server/ocr/engines/VuerCVOCRRecognition.js:71; vuer_cv app_http.py:78
POST /api/v2/document-warpOSS VuerCVOCRRecognition.js:46, VuerCVService.js:286CV app_http.py:82 DocumentWarpResourceV2Warp/dewarp documentvuer_oss server/ocr/engines/VuerCVOCRRecognition.js:46; vuer_cv app_http.py:82
POST /api/v2/document-recognitionOSS DocumentRecognitionApi.js:25CV app_http.py:79 DocumentRecognitionResourceV2Document classification/recognitionvuer_oss server/cv/visions/documentRecognition/DocumentRecognitionApi.js:25; vuer_cv app_http.py:79
POST /api/v1/barcodeOSS BarcodeDetectionApi.js:21CV app_http.py:76 BarCodeResourceBarcode decodevuer_oss server/cv/visions/barcodeDetection/BarcodeDetectionApi.js:21; vuer_cv app_http.py:76
POST /api/v1/barcode-detectOSS BarcodeDetectionV2Api.js:29CV app_http.py:77 BarCodeDetectResourceBarcode localizationvuer_oss server/cv/visions/barcodeDetectionV2/BarcodeDetectionV2Api.js:29; vuer_cv app_http.py:77
POST /api/v1/sharpnessOSS SharpnessDetectionApi.js:27, VuerCVService.js:378CV app_http.py:75 SharpnessResourceImage sharpness estimationvuer_oss server/cv/visions/sharpnessDetection/SharpnessDetectionApi.js:27; vuer_cv app_http.py:75
POST /api/v1/card-integrity-checkOSS VuerCVService.js:503CV app_http.py:88 CardIntegrityCheckResourceID-card integrity checkvuer_oss server/service/VuerCVService.js:503; vuer_cv app_http.py:88
POST /api/v1/image-uploadOSS VuerCVService.js:194, VuerCVOCRRecognition.js:27, VuerCVMRZDetector.js:26, VuerCVFaceRecognitionEngine.jsCV app_http.py:67 ImageUploadResourceUpload an image (returns id for later calls)vuer_oss server/service/VuerCVService.js:194; vuer_cv app_http.py:67
GET /api/v1/image-downloadOSS VuerCVService.js:223, VuerCVFaceRecognitionEngine.jsCV app_http.py:74 ImageDownloadResourceDownload a processed imagevuer_oss server/service/VuerCVService.js:223; vuer_cv app_http.py:74
GET /api/v1/pingOSS VuerCVService.js:110 (health check, every diagnostic.cvPingIntervalMs), VuerCVFaceRecognitionEngine.jsCV app_http.py:66 PingResourceCV server liveness/healthvuer_oss server/service/VuerCVService.js:110; vuer_cv app_http.py:66

The CV image flow is two-step: OSS POST /api/v1/image-upload returns an image id, then vision/OCR endpoints are called with that id (e.g. face-compare sends {firstImageId, secondImageId}, FaceCompareApi.js:33-36). CV caches frames in Redis (appcache.py, TTL ~60s) — see vuer_cv.

CV routes that exist but no OSS caller was found in source (devel): /api/v3/document-recognition, /api/v3/document-warp, /api/v1/document-types, /api/v1/ocr, /api/v1/background-mask, /api/v1/kaptcha-decoder, /api/v1/card-warp, /api/v1/status (app_http.py:80-89). Listed for completeness; not asserted as live OSS→CV edges.

HTTP/WebSocket streaming — vuer_oss → vuer_cv /ws

Separate from REST, OSS opens a WebSocket to CV for streaming CV tasks (PAD, liveness, document/face/barcode/mrz/etc. on a video stream):

ChannelProducerConsumerPurposeSource
wss://<cv-host>/ws (JSON frames)OSS VuerCVWebSocket.js:41 (new WebSocket(url)), driven by VuerCVSession/VuerCVListenerSessionCV WS workers app_websocket.py:109-114 (port 40082+worker, nginx upstream /ws, max_conns=1)Streaming CV tasks; init msg carries taskType selecting a CV taskvuer_oss server/cv/VuerCVWebSocket.js:20,41,77, server/cv/VuerCVSession.js:149-161; vuer_cv app_websocket.py:56-61,109-114, nginx_vuer_cv_docker.conf.j2:36-37
  • URL: ${config.cv.wsProtocol||'wss'}://${host}/ws (VuerCVWebSocket.js:20).
  • Messages are JSON.stringify({type, payload}) (VuerCVWebSocket.js:98). CV validates the init message against jsonschemas.websocket.init-message and dispatches taskType via taskMap (app_websocket.py:58-61).
  • This is the streaming sibling of the REST API; both target the same CV host.

5. Socket.IO — vuer_css ↔ browser/kiosk

CSS runs a Socket.IO 4 server (server/socket/socket-server.js, behind nginx /socket.io127.0.0.1:10082). On each connection it applies a fixed list of event modules (socket-server.js:18-36): client, then events/{auth, pagevisit, lobby, waiting-room, echotest, ping, videochat, videochat.presentation, videochat.customerDataChange, videochat.validation, videochat.signature, webrtclog, mobile, selfservice, selfservice-v2, flow} — plus any pushed by callHooks('socket', modules). Handlers register client.on('<event>') (inbound) and reply/emit <event> (outbound, often to the room peer).

This is the WebRTC signaling channel for the customer browser. SDP offer/answer and ICE candidates between the browser and the operator's media are exchanged as videochat:senderPeer:* / videochat:receivingPeer:* events here, then bridged to OSS over the RabbitMQ transport pair (§2), and OSS drives Janus (§6). The browser does not signal Janus directly.

Representative events (verified; not exhaustive):

EventDirectionHandlerPurposeSource
auth:authbrowser → CSSevents/auth.jsAuthenticate the socket/sessionvuer_css server/socket/events/auth.js
ping:serverbrowser → CSSevents/ping.jsRound-trip latency to CSSvuer_css server/socket/events/ping.js
ping:client / pingClientbrowser → CSS → peerevents/ping.jsLatency to the other room membervuer_css server/socket/events/ping.js
ping:distancebrowser → CSSevents/ping.jsReport measured distance/latencyvuer_css server/socket/events/ping.js
ping:ossbrowser → CSS (→ OSS via rpc-kiosk-alive-check)events/ping.jsCheck OSS status from kioskvuer_css server/socket/events/ping.js
join-waiting-roombrowser → CSSevents/waiting-room.jsEnter the waiting roomvuer_css server/socket/events/waiting-room.js
echotest:start / echotest:candidate / echotest:messagebrowser → CSSevents/echotest.jsJanus echotest signaling (system-check)vuer_css server/socket/events/echotest.js
echotest:jsepCSS → browserevents/echotest.jsEchotest SDP answervuer_css server/socket/events/echotest.js
videochat:joinbrowser → CSSevents/videochat.js:16Join videochat (CSS calls rpc-videochat-oss + queue-videochat-oss)vuer_css server/socket/events/videochat.js:16-18
videochat:senderPeer:init / :start / :candidatebrowser → CSSevents/videochat.jsCustomer→operator WebRTC: SDP offer + ICE candidatesvuer_css server/socket/events/videochat.js
videochat:receivingPeer:candidatebrowser → CSSevents/videochat.jsOperator→customer WebRTC: customer ICE for the receiving peervuer_css server/socket/events/videochat.js
videochat:receivingPeer:start / :stopCSS → browserevents/videochat.jsReceiving-peer SDP (relayed from Janus listener jsep)vuer_css server/socket/events/videochat.js; OSS server/transport/session/RoomTransportSession.js:976,1007
videochat:chat:messagebrowser ↔ CSSevents/videochat.jsIn-call text chatvuer_css server/socket/events/videochat.js
videochat:selfMute / :highContrast / :localVideoTrackStatus / :remoteUserHoldMediabrowser ↔ CSSevents/videochat.jsIn-call media/UI statevuer_css server/socket/events/videochat.js
videochat:screen:resize / :deviceorientationbrowser → CSSevents/videochat.jsViewport/orientation reportingvuer_css server/socket/events/videochat.js
videochat:camera:get:values / :set:value / :revert:default / :values:completebrowser ↔ CSSevents/videochat.jsCamera control protocolvuer_css server/socket/events/videochat.js
videochat:closebrowser ↔ CSSevents/videochat.jsEnd videochatvuer_css server/socket/events/videochat.js
videochat:invite / videochat:flow:change / videochat:promptSmsTokenCSS → browserevents/videochat.jsOperator-driven prompts/flow changesvuer_css server/socket/events/videochat.js
videochat:screenshot:remote / :guide:show / :guide:hideCSS → browserevents/videochat.jsOperator-triggered screenshot guidancevuer_css server/socket/events/videochat.js
documentScan:result (in) / documentScan:send:id (out)browser ↔ CSSevents/videochat.jsKiosk document-scan exchangevuer_css server/socket/events/videochat.js
redirectCSS → browserevents/videochat.jsForce client navigationvuer_css server/socket/events/videochat.js
disconnect(socket lifecycle)events/videochat.js, waiting-room.js, echotest.jsCleanup on disconnect (videochat triggers queue-videochat-oss.leave)vuer_css server/socket/events/videochat.js:7-13

Additional event modules ( videochat.presentation, videochat.customerDataChange, videochat.validation, videochat.signature, pagevisit, lobby, mobile, selfservice, selfservice-v2, flow, webrtclog) register their own client.on(...) events in the same pattern; only the high-traffic videochat/auth/ping/waiting-room/echotest events were enumerated from source here. See "Unverified / gaps".

OSS also runs a Socket.IO server ( server/socket/, port :10080) for the operator console (operator browser ↔ OSS). The task scope is CSS↔browser; the OSS operator socket events were not enumerated here.


6. Janus WebRTC signaling — vuer_oss → Janus Gateway

OSS is the only FaceKom node that signals Janus, using janus-api (JSON-over-WebSocket, subprotocol janus-protocol). The media bridge lives in server/transport/session/RoomTransportSession.js.

ChannelProducerConsumerPurposeSource
wss://... Janus signaling (webrtc.janusServers.<name>.url)OSS JanusService.getJanusInstance({url})new Janus(...)Janus Gateway (videoroom/streaming/echotest plugins)Session create + plugin attach + SDP/ICE relay for the videoroomvuer_oss server/service/JanusService.js:57-63; config config/dev.json:357-360 (url: wss://localhost:8989)
Janus Admin API (webrtc.janusServers.<name>.adminUrl, subprotocol janus-admin-protocol)OSS room-inspector / janus-api JanusAdminJanus Gateway adminSession/handle introspectionvuer_oss server/room-inspector/*, config config/dev.json:360 (adminUrl: wss://localhost:7989); janus-api src/JanusAdmin.js

Signaling flow proven in RoomTransportSession.js:

  • this.janus = serviceContainer.service.janus.getJanusInstance(janusConfig) then this.janus.connect() (:905-910).
  • Attaches VideoRoomPublisherJanusPlugin (pluginName janus.plugin.videoroom, display 'customer') for the customer’s outbound feed (:929-930).
  • Attaches VideoRoomListenerJanusPlugin (ptype subscriber) for the operator/remote feed (:967-1012).
  • Customer SDP offer → videoRoomPublisherJanusPlugin.configure(data.jsep) (:1032); customer ICE (videochat:senderPeer:candidate) → publisher .candidate(...) (:1041-1048).
  • Operator/remote ICE (videochat:receivingPeer:candidate) → videoRoomListenerJanusPlugin.candidate(...) (:250-255).
  • Listener jsep → sent back as {type: 'videochat:receivingPeer:start', message: jsep} (:975-976, :1006-1007) → over the transport queues to CSS → to the browser as videochat:receivingPeer:start.

@techteamer/janus-api demuxes Janus async messages (event/webrtcup/hangup/media/slowlink/detached/error/ack/success/keepalive) back to the owning plugin handle (Janus.js:220-398). janus-api also munges SDP: filters H.264 profiles and (when webrtc.janusConfig.filterDirectCandidates) strips host/srflx candidates to force TURN relay (SdpHelper.js; passed at RoomTransportSession.js:929,1005). See janus-api.

Janus recording post-processing is local, not a network edge: OSS server/convert/JanusConvertProcess.js:52 shells out to the janus-pp-rec CLI to convert .mjr recordings (consumed via queue-convert → converter daemon). TURN/STUN credentials are minted by TurnPasswordService in both OSS and CSS from webrtc.turn.secret (not Janus signaling).


7. End-to-end videochat media path (synthesis)

Browser ──Socket.IO──> CSS ──RabbitMQ──> OSS ──WebSocket(janus-api)──> Janus Gateway
(videochat:*)         (queue/rpc-       (RoomTransportSession         (videoroom plugin:
                       videochat-oss,    + JanusService)               publisher/listener)
                       transport pair)
        <─Socket.IO── CSS <──RabbitMQ── OSS <──WebSocket──────────────┘
        (videochat:receivingPeer:start = listener jsep)
  • Browser↔CSS: §5 Socket.IO videochat:* events.
  • CSS↔OSS: §1/§2 rpc-videochat-oss + queue-videochat-* (room join/leave/events) and queue-transport-* + rpc-transport-* (the SDP/ICE-bearing transport messages).
  • OSS↔Janus: §6 janus-api WebSocket.
  • In parallel, OSS↔CV: §4 HTTP/WS for face/document/PAD CV on the captured media.

Unverified / gaps

  • Socket.IO events: enumerated client.on(...)/emit(...) for client, auth, ping, waiting-room, echotest, and videochat from source. The other 10 event modules (videochat.presentation/.customerDataChange/.validation/.signature, pagevisit, lobby, mobile, selfservice, selfservice-v2, flow, webrtclog) were confirmed to be loaded (socket-server.js:18-36) and follow the same pattern, but their individual event names were not transcribed.
  • OSS operator Socket.IO (server/socket/, :10080): out of task scope (CSS↔browser); not enumerated.
  • queue-convert-state / queue-storage-state producers: only the consumer (queue server) registration was read in server.js; the producing call sites in the convert/storage pipeline were not located line-by-line.
  • rpc-esign:external consumer: lives in esign_oss; only the OSS client side was verified here.
  • CV routes without an OSS caller (/api/v3/*, /api/v1/{document-types,ocr,background-mask,kaptcha-decoder,card-warp,status}): listed from app_http.py for completeness, not asserted as live edges.
  • Exact webrtc.janusServers host list and hosts.cvs values are deployment config (dev.json ships wss://localhost:8989 / empty hosts.cv); production values come from partner config / Spring Cloud Config.
  • Customization branches may add/override event modules and queue participants via callHooks('socket'|'queue', ...); this doc reflects the devel core only. See customization-architecture.

Sources

Files actually read (via git show <ref>:<path> / git grep, read-only; OSS ref devel, CSS ref origin/devel, CV ref devel):

  • vuer_oss: server.js (setupQueue, full), convert.js, cron.js, background.js, media.js, integrationLog.js, storage.js (queue registrations); server/cv/CVApi.js, server/cv/VuerCVWebSocket.js, server/cv/VuerCVSession.js, server/cv/visions/faceComparision/FaceCompareApi.js; server/service/VuerCVService.js, server/service/JanusService.js; server/ocr/engines/VuerCVOCRRecognition.js, server/ocr/engines/VuerCVMRZDetector.js, server/faceRecognition/engine/VuerCVFaceRecognitionEngine.js; server/transport/session/RoomTransportSession.js; server/convert/JanusConvertProcess.js; customization/customization.js (cv:setup); config/dev.json (hosts/cv/janus blocks). Plus git grep for all /api/v* endpoints across server/cv, server/ocr, server/faceRecognition, server/service/VuerCVService.js.
  • vuer_css: server.js (queue registrations, full grep); server/socket/socket-server.js; server/socket/events/{ping,auth,waiting-room,echotest,videochat}.js; server/socket/client.js; server/socket/events/ dir listing; server/service/TurnPasswordService.js (grep, to confirm CSS has no Janus client).
  • vuer_cv: app_http.py (routes), app_websocket.py (init/taskType/port), nginx_vuer_cv_docker.conf.j2 (/ws, /api).
  • Orientation (cross-checked, then independently re-verified): mq, vuer_oss, vuer_css, vuer_cv, janus-api.
  • Git: git -C <repo> for-each-ref / rev-parse / ls-tree / show / grep (read-only).