ConciergeGuestApp
In-room guest webapp — casting, room control, F&B/shop ordering, concierge chat, and (as of 2026-09-01) real WebRTC voice calling. See the backend side of calling at Concierge domain.
Overview
React + Vite SPA. Served under base path /concierge/.
Main sections (tabs)
- Cast — TV casting, VTV channels
- Remote — TV/room control (temp, volume, input)
- Order — F&B/shop ordering, cart, checkout
- Concierge — department chat threads + voice calling
- Hotel — inbox, activity, folio/room-charge
Calling architecture
src/webrtc/Peer.js wraps mediasoup-client, consuming the same 7 RTC
signaling endpoints CoreAPI exposes at /concierge/rtc/*. The remote
audio/video plays through an always-mounted <video> element
(remoteAudioRef in useConciergeApp.js) rather than a plain <audio>
tag — temporary, for visually confirming a call connects without needing
two people to talk/listen.
Speaker output routing (routeAudioOutput() in useConciergeApp.js,
added 2026-09-04) uses HTMLMediaElement.setSinkId() — Chromium-only
(desktop + Android Chrome). iOS Safari has no web API for output routing
at all; the toggle button still renders there but has no effect, by
platform limitation, not a bug. Falls back to a console.warn rather than
silently doing nothing.
Running locally
npm run dev # Vite dev server, port 5173
Env vars
.env.example lists exactly one:
| Var | Notes |
|---|---|
VITE_CORE_API_URL |
e.g. http://localhost:8081/api/v1 — the app appends /concierge itself |
Via Quickstart (for calling specifically)
mediasoup-service doesn't start automatically — see the
Concierge domain doc's "Running this locally"
section for the real make rtc command and why /concierge/rtc/* 503s
without it.
See Changelog for real, dated feature history.