feat(groups): audio and video calls in group chats; release v6.6.6
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
This commit is contained in:
+26
-1
@@ -31,6 +31,9 @@
|
||||
},
|
||||
"ui": {
|
||||
"language.label": "언어",
|
||||
"language.suggest.text": "이 페이지는 한국어로도 볼 수 있습니다.",
|
||||
"language.suggest.cta": "한국어로 보기",
|
||||
"language.suggest.dismiss": "닫기",
|
||||
"community.title": "프라이버시의 미래를 함께 만듭니다",
|
||||
"community.description": "SecureBit은 커뮤니티 덕분에 자랍니다. 여러분의 아이디어와 의견이 안전한 소통의 미래를 만듭니다 - 모든 과정이 공개되어 있고, 전 구간에서 ASN.1 검증을 수행합니다.",
|
||||
"community.github": "GitHub 저장소",
|
||||
@@ -776,7 +779,29 @@
|
||||
"offline.disconnect": "연결 끊기",
|
||||
"offline.learnMore": "자세히 보기",
|
||||
"pwa.installApp": "앱 설치",
|
||||
"chat.onWeb": "웹 버전을 쓰고 있습니다"
|
||||
"chat.onWeb": "웹 버전을 쓰고 있습니다",
|
||||
"groupCall.startVoice": "그룹 음성 통화 시작",
|
||||
"groupCall.startVideo": "그룹 영상 통화 시작",
|
||||
"groupCall.join": "참여",
|
||||
"groupCall.dismiss": "나중에",
|
||||
"groupCall.leave": "통화 나가기",
|
||||
"groupCall.you": "나",
|
||||
"groupCall.connecting": "연결 중…",
|
||||
"groupCall.waitingLink": "직접 연결을 기다리는 중…",
|
||||
"groupCall.legFailed": "연결하지 못했습니다",
|
||||
"groupCall.startedVoice": "{name} 님이 음성 통화를 시작했습니다",
|
||||
"groupCall.startedVideo": "{name} 님이 영상 통화를 시작했습니다",
|
||||
"groupCall.inCall": "통화 중 {count}명",
|
||||
"groupCall.err.permission_denied": "통화를 시작할 수 없습니다 - 마이크와 카메라 접근이 차단되어 있습니다. 이 사이트에 허용한 뒤 다시 시도하세요.",
|
||||
"groupCall.err.device_not_found": "통화를 시작할 수 없습니다 - 이 기기에서 마이크를 찾을 수 없습니다.",
|
||||
"groupCall.err.device_busy": "통화를 시작할 수 없습니다 - 마이크를 다른 앱이 사용 중입니다. 종료한 뒤 다시 시도하세요.",
|
||||
"groupCall.err.media_failed": "통화를 시작할 수 없습니다 - 마이크를 열지 못했습니다.",
|
||||
"groupCall.err.call_in_progress": "이 그룹에서 이미 통화가 진행 중입니다. 새로 시작하지 말고 참여하세요.",
|
||||
"groupCall.err.not_ready": "통화하기 전에 그룹 코드를 확인하세요.",
|
||||
"groupCall.speaking": "{name} 님이 말하는 중",
|
||||
"groupCall.pin": "{name} 크게 보기",
|
||||
"groupCall.unpin": "전체 보기로 돌아가기",
|
||||
"groupCall.showEveryone": "전체"
|
||||
},
|
||||
"manifest": {
|
||||
"name": "SecureBit.chat - 종단 간 암호화 비공개 메신저",
|
||||
|
||||
Reference in New Issue
Block a user