feat(mobile): callSignal subscribe + broadcast helpers
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
import { rtc } from '@chat-app/shared';
|
||||
import type { CallSignal } from '@chat-app/shared/rtc';
|
||||
import type { AppSupabaseClient } from '@chat-app/shared/supabase';
|
||||
|
||||
// Thin wrapper around Supabase realtime broadcast for call signaling.
|
||||
// One channel per peer userId. Subscriptions live for the lifetime of
|
||||
// the AuthProvider's session; teardown returns a no-arg unsubscribe.
|
||||
|
||||
export type SignalListener = (signal: CallSignal) => void;
|
||||
|
||||
export function subscribeCallSignals(
|
||||
client: AppSupabaseClient,
|
||||
myUserId: string,
|
||||
onSignal: SignalListener,
|
||||
): () => void {
|
||||
const ch = client.channel(rtc.signalTopic(myUserId));
|
||||
ch.on('broadcast', { event: 'signal' }, (msg) => {
|
||||
if (msg.payload && typeof msg.payload === 'object') {
|
||||
onSignal(msg.payload as CallSignal);
|
||||
}
|
||||
});
|
||||
void ch.subscribe();
|
||||
return () => {
|
||||
void client.removeChannel(ch);
|
||||
};
|
||||
}
|
||||
|
||||
export async function sendCallSignal(
|
||||
client: AppSupabaseClient,
|
||||
toUserId: string,
|
||||
payload: CallSignal,
|
||||
): Promise<void> {
|
||||
const ch = client.channel(rtc.signalTopic(toUserId));
|
||||
await ch.subscribe();
|
||||
await ch.send({ type: 'broadcast', event: 'signal', payload });
|
||||
await client.removeChannel(ch);
|
||||
}
|
||||
Reference in New Issue
Block a user