Skip to content

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.