fix(calls): "Channel Full" counts people, not devices (#342)
CI / Build & Quality Checks (pull_request) Successful in 3m9s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 8s
CI / Playwright smoke (e2e) (pull_request) Successful in 11m44s
CI / Build & Quality Checks (pull_request) Successful in 3m9s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 8s
CI / Playwright smoke (e2e) (pull_request) Successful in 11m44s
useVoiceChannelFull compared the number of MatrixRTC memberships (one per device) with io.lotus.voice_limit, so one person on desktop + phone, or a crashed tab whose membership hadn't expired, filled two slots and locked others out, while the server-side guard (which counts distinct users) would have admitted them. utils/voiceChannelFull.ts (unit-tested) counts distinct senders; the header/sidebar counter shows people too. Verified on the local stack: limit 2, @aud_main in the call on two devices; @aud_bob's prescreen now shows 1/2 with Join enabled (was "Channel Full (2/2)"), matching the guard's 200. Fixes #342 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
022e5e6987
commit
861293243c
@@ -0,0 +1,28 @@
|
||||
import { test } from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import { voiceChannelOccupancy } from './voiceChannelFull';
|
||||
|
||||
test('voiceChannelOccupancy: one user on two devices fills one slot, not two', () => {
|
||||
assert.deepEqual(voiceChannelOccupancy(['@a:x', '@a:x'], '@b:x', 2), {
|
||||
channelFull: false,
|
||||
current: 1,
|
||||
max: 2,
|
||||
});
|
||||
});
|
||||
|
||||
test('voiceChannelOccupancy: full when distinct users reach the limit', () => {
|
||||
assert.deepEqual(voiceChannelOccupancy(['@a:x', '@c:x', '@a:x'], '@b:x', 2), {
|
||||
channelFull: true,
|
||||
current: 2,
|
||||
max: 2,
|
||||
});
|
||||
});
|
||||
|
||||
test('voiceChannelOccupancy: someone already in the call can always join another device', () => {
|
||||
assert.equal(voiceChannelOccupancy(['@a:x', '@b:x'], '@b:x', 2).channelFull, false);
|
||||
});
|
||||
|
||||
test('voiceChannelOccupancy: no limit (0) is never full; unknown senders are ignored', () => {
|
||||
assert.equal(voiceChannelOccupancy(['@a:x', '@c:x'], '@b:x', 0).channelFull, false);
|
||||
assert.equal(voiceChannelOccupancy([undefined, '@a:x'], '@b:x', 2).current, 1);
|
||||
});
|
||||
Reference in New Issue
Block a user