fix(session-sharing): show participant presence in member terminals (#1504)

This commit is contained in:
ZacharyZcR authored and GitHub committed 2026-09-30 09:46:40 -05:00
1 parent 0f6e48a95c
commit 4ed9b69aab
6 files changed
+114 -5

No files matched your search

@@ -471,7 +471,7 @@ export class TerminalSessionManager {
* leave, and only while someone besides the owner is (or just was) in the
* room - a solo owner never receives presence traffic.
*/
private broadcastParticipants(sessionId: string): void {
private broadcastParticipants(sessionId: string, includeSolo = false): void {
const session = this.sessions.get(sessionId);
if (!session) return;
const participants = Array.from(session.participants.values()).map(
@@ -481,7 +481,11 @@ export class TerminalSessionManager {
label: participant.displayName ?? participant.guestLabel ?? null,
}),
);
if (participants.every((participant) => participant.isOwner)) return;
if (
!includeSolo &&
participants.every((participant) => participant.isOwner)
)
return;
this.broadcast(sessionId, { type: "participants", participants });
}
@@ -545,7 +549,7 @@ export class TerminalSessionManager {
}
}
}
if (disconnected > 0) this.broadcastParticipants(sessionId);
if (disconnected > 0) this.broadcastParticipants(sessionId, true);
return disconnected;
}
@@ -585,7 +589,7 @@ export class TerminalSessionManager {
for (const [id, participant] of session.participants.entries()) {
if (participant.ws === ws && !participant.isOwner) {
session.participants.delete(id);
this.broadcastParticipants(sessionId);
this.broadcastParticipants(sessionId, true);
this.log.info("Participant left shared session", {
operation: "session_leave_participant",
sessionId,
@@ -417,6 +417,14 @@ describe("TerminalSessionManager - multiplayer participants", () => {
expect(session?.detachTimeout).toBeNull();
expect(session?.participants.size).toBe(1);
expect(sessionManager.getParticipantForWs(session!, guestWs)).toBeNull();
expect(
JSON.parse(
(ownerWs.send as ReturnType<typeof vi.fn>).mock.lastCall![0] as string,
),
).toMatchObject({
type: "participants",
participants: [{ isOwner: true }],
});
sessionManager.destroySession(id);
});