A group call is N-1 ordinary 1:1 calls, one to each other member, each riding the pairwise session that member already has — a transport a human already authenticated by comparing the safety code. No mixer, no SFU, no point at which two people's media meets anywhere but on a device. Call control is separate from call media, because the two reach different sets of people. Who opened a call, who joined and who left travels as group frames signed with the sender's group identity key, so it reaches members currently reachable only through a relay — and a relaying member can drop one but cannot write one. Media flows only where a direct link exists, so a member without one shows as connecting rather than being omitted. Frames carry a per-sender sequence checked before the action, so a captured leave cannot end a later call, and simultaneous calls converge on the lower random call id. One capture is shared across every leg rather than one getUserMedia per member, and legs answer without prompting: the flag permitting that is set only locally, only while this user is in the call, and cleared when they leave. UI: a gallery that sizes itself from the space it has, a spotlight view, an active-speaker indicator read from the waveform, and the call surface in the same visual language as the 1:1 one. Also in this commit, the v6.5.0 language-suggestion work that had not been pushed yet; its notes are in the changelog. And two fixes: the safety-code input asks for digits rather than text, and starting a new chat from inside a group no longer creates it behind the group where it cannot be seen — which had made it impossible to connect to anyone new, or to add anyone to a group, while a group was open. Claude-Session: https://claude.ai/code/session_01XSxAkET3hQTkYDQfbjCQwZ
27 lines
1.1 KiB
Docker
27 lines
1.1 KiB
Docker
# SecureBit.chat is a static PWA (no backend). The committed build artifacts in
|
|
# dist/ are served as-is by nginx — matching the project's release workflow,
|
|
# where dist/ is rebuilt and committed for every release.
|
|
FROM nginx:1.27-alpine
|
|
|
|
# Replace the default nginx config with our static-serving config.
|
|
COPY deploy/nginx.conf /etc/nginx/nginx.conf
|
|
|
|
# The www.securebit.chat kill-switch worker. It lives outside the web root because
|
|
# it is deployment plumbing, not site content: the apex must never serve it as
|
|
# /sw.js, which is the real, caching worker.
|
|
COPY deploy/www-sw.js /etc/nginx/www-sw.js
|
|
|
|
# Serve the repository (src/, assets/, libs/, dist/, config/, logo/, sw.js, ...).
|
|
COPY . /usr/share/nginx/html
|
|
|
|
# config/ice-servers.js is git-ignored (it can hold operator TURN credentials),
|
|
# so it is absent from the build context. Provide the public-STUN production
|
|
# override so the operator-override path is populated and nothing 404s.
|
|
RUN cp /usr/share/nginx/html/config/ice-servers.prod.js \
|
|
/usr/share/nginx/html/config/ice-servers.js
|
|
|
|
# Fly.io health checks and routing target this port.
|
|
EXPOSE 8080
|
|
|
|
CMD ["nginx", "-g", "daemon off;"]
|