[feat](trx-frontend-http): auto-subscribe new sessions to primary channel
When a new tab connects and receives the initial channels event, automatically subscribe to channel 0 (primary) so the session joins the same tuned channel as other users on that rig. Uses a lightweight auto-join that skips scheduler control takeover since audio isn't started yet at this point. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Stan Grams <sjg@haxx.space>
This commit is contained in:
@@ -130,9 +130,15 @@ function vchanHandleChannels(data) {
|
|||||||
const d = JSON.parse(data);
|
const d = JSON.parse(data);
|
||||||
vchanRigId = d.rig_id || null;
|
vchanRigId = d.rig_id || null;
|
||||||
vchanChannels = d.channels || [];
|
vchanChannels = d.channels || [];
|
||||||
// If the active channel was evicted, fall back to channel 0 and reconnect audio.
|
|
||||||
const ids = new Set(vchanChannels.map(c => c.id));
|
const ids = new Set(vchanChannels.map(c => c.id));
|
||||||
if (vchanActiveId && !ids.has(vchanActiveId)) {
|
if (!vchanActiveId && vchanChannels.length > 0 && vchanSessionId) {
|
||||||
|
// First channels event for this session — auto-subscribe to channel 0
|
||||||
|
// so we join the same tuned channel as other users on this rig.
|
||||||
|
// Use a direct subscribe (no scheduler control takeover) to avoid
|
||||||
|
// side-effects on initial connect.
|
||||||
|
vchanAutoJoinPrimary(vchanChannels[0].id);
|
||||||
|
} else if (vchanActiveId && !ids.has(vchanActiveId)) {
|
||||||
|
// Active channel was evicted — fall back to channel 0 and reconnect audio.
|
||||||
vchanActiveId = vchanChannels.length > 0 ? vchanChannels[0].id : null;
|
vchanActiveId = vchanChannels.length > 0 ? vchanChannels[0].id : null;
|
||||||
vchanReconnectAudio();
|
vchanReconnectAudio();
|
||||||
}
|
}
|
||||||
@@ -243,6 +249,31 @@ async function vchanDelete(channelId) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lightweight auto-join for initial connect: registers the session on
|
||||||
|
// channel 0 without taking scheduler control or reconnecting audio
|
||||||
|
// (audio isn't started yet at this point).
|
||||||
|
async function vchanAutoJoinPrimary(channelId) {
|
||||||
|
if (!vchanSessionId || !vchanRigId) return;
|
||||||
|
try {
|
||||||
|
const resp = await fetch(
|
||||||
|
`/channels/${encodeURIComponent(vchanRigId)}/${encodeURIComponent(channelId)}/subscribe`,
|
||||||
|
{
|
||||||
|
method: "POST",
|
||||||
|
headers: { "Content-Type": "application/json" },
|
||||||
|
body: JSON.stringify({ session_id: vchanSessionId }),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
if (!resp.ok) {
|
||||||
|
console.warn("vchan: auto-join primary failed", resp.status);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
vchanActiveId = channelId;
|
||||||
|
vchanRender();
|
||||||
|
} catch (e) {
|
||||||
|
console.error("vchan: auto-join error", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function vchanSubscribe(channelId) {
|
async function vchanSubscribe(channelId) {
|
||||||
if (!vchanSessionId || !vchanRigId) return;
|
if (!vchanSessionId || !vchanRigId) return;
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user