diff --git a/spacetimedb/src/tables.rs b/spacetimedb/src/tables.rs index c20f4a7..c80d241 100644 --- a/spacetimedb/src/tables.rs +++ b/spacetimedb/src/tables.rs @@ -114,7 +114,7 @@ pub struct Watching { pub channel_id: u64, } -#[spacetimedb::table(accessor = voice_sdp_offer, public)] +#[spacetimedb::table(accessor = voice_sdp_offer)] pub struct VoiceSdpOffer { #[primary_key] #[auto_inc] @@ -128,7 +128,7 @@ pub struct VoiceSdpOffer { pub channel_id: u64, } -#[spacetimedb::table(accessor = voice_sdp_answer, public)] +#[spacetimedb::table(accessor = voice_sdp_answer)] pub struct VoiceSdpAnswer { #[primary_key] #[auto_inc] @@ -142,7 +142,7 @@ pub struct VoiceSdpAnswer { pub channel_id: u64, } -#[spacetimedb::table(accessor = voice_ice_candidate, public)] +#[spacetimedb::table(accessor = voice_ice_candidate)] pub struct VoiceIceCandidate { #[primary_key] #[auto_inc] @@ -156,7 +156,7 @@ pub struct VoiceIceCandidate { pub channel_id: u64, } -#[spacetimedb::table(accessor = screen_sdp_offer, public)] +#[spacetimedb::table(accessor = screen_sdp_offer)] pub struct ScreenSdpOffer { #[primary_key] #[auto_inc] @@ -170,7 +170,7 @@ pub struct ScreenSdpOffer { pub channel_id: u64, } -#[spacetimedb::table(accessor = screen_sdp_answer, public)] +#[spacetimedb::table(accessor = screen_sdp_answer)] pub struct ScreenSdpAnswer { #[primary_key] #[auto_inc] @@ -184,7 +184,7 @@ pub struct ScreenSdpAnswer { pub channel_id: u64, } -#[spacetimedb::table(accessor = screen_ice_candidate, public)] +#[spacetimedb::table(accessor = screen_ice_candidate)] pub struct ScreenIceCandidate { #[primary_key] #[auto_inc] diff --git a/spacetimedb/src/views.rs b/spacetimedb/src/views.rs index 8cb5536..d3d2264 100644 --- a/spacetimedb/src/views.rs +++ b/spacetimedb/src/views.rs @@ -240,6 +240,84 @@ pub fn visible_messages(ctx: &ViewContext) -> Vec { results } +#[spacetimedb::view(accessor = visible_voice_sdp_offers, public)] +pub fn visible_voice_sdp_offers(ctx: &ViewContext) -> Vec { + let identity = ctx.sender(); + let mut results = Vec::new(); + for offer in ctx.db.voice_sdp_offer().sender().filter(identity) { + results.push(offer); + } + for offer in ctx.db.voice_sdp_offer().receiver().filter(identity) { + results.push(offer); + } + results +} + +#[spacetimedb::view(accessor = visible_voice_sdp_answers, public)] +pub fn visible_voice_sdp_answers(ctx: &ViewContext) -> Vec { + let identity = ctx.sender(); + let mut results = Vec::new(); + for answer in ctx.db.voice_sdp_answer().sender().filter(identity) { + results.push(answer); + } + for answer in ctx.db.voice_sdp_answer().receiver().filter(identity) { + results.push(answer); + } + results +} + +#[spacetimedb::view(accessor = visible_voice_ice_candidates, public)] +pub fn visible_voice_ice_candidates(ctx: &ViewContext) -> Vec { + let identity = ctx.sender(); + let mut results = Vec::new(); + for candidate in ctx.db.voice_ice_candidate().sender().filter(identity) { + results.push(candidate); + } + for candidate in ctx.db.voice_ice_candidate().receiver().filter(identity) { + results.push(candidate); + } + results +} + +#[spacetimedb::view(accessor = visible_screen_sdp_offers, public)] +pub fn visible_screen_sdp_offers(ctx: &ViewContext) -> Vec { + let identity = ctx.sender(); + let mut results = Vec::new(); + for offer in ctx.db.screen_sdp_offer().sender().filter(identity) { + results.push(offer); + } + for offer in ctx.db.screen_sdp_offer().receiver().filter(identity) { + results.push(offer); + } + results +} + +#[spacetimedb::view(accessor = visible_screen_sdp_answers, public)] +pub fn visible_screen_sdp_answers(ctx: &ViewContext) -> Vec { + let identity = ctx.sender(); + let mut results = Vec::new(); + for answer in ctx.db.screen_sdp_answer().sender().filter(identity) { + results.push(answer); + } + for answer in ctx.db.screen_sdp_answer().receiver().filter(identity) { + results.push(answer); + } + results +} + +#[spacetimedb::view(accessor = visible_screen_ice_candidates, public)] +pub fn visible_screen_ice_candidates(ctx: &ViewContext) -> Vec { + let identity = ctx.sender(); + let mut results = Vec::new(); + for candidate in ctx.db.screen_ice_candidate().sender().filter(identity) { + results.push(candidate); + } + for candidate in ctx.db.screen_ice_candidate().receiver().filter(identity) { + results.push(candidate); + } + results +} + #[spacetimedb::view(accessor = my_channel_subscriptions, public)] pub fn my_channel_subscriptions(ctx: &ViewContext) -> Vec { if let Some(sub) = ctx.db.channel_subscription().identity().find(ctx.sender()) { diff --git a/src/chat/services/messaging.svelte.ts b/src/chat/services/messaging.svelte.ts index 7cc3182..3be5b58 100644 --- a/src/chat/services/messaging.svelte.ts +++ b/src/chat/services/messaging.svelte.ts @@ -88,6 +88,14 @@ export class MessagingService { queries.push(`SELECT * FROM visible_channels`); queries.push(`SELECT * FROM visible_direct_messages`); queries.push(`SELECT * FROM my_channel_subscriptions`); + + // WebRTC Signaling + queries.push(`SELECT * FROM visible_voice_sdp_offers`); + queries.push(`SELECT * FROM visible_voice_sdp_answers`); + queries.push(`SELECT * FROM visible_voice_ice_candidates`); + queries.push(`SELECT * FROM visible_screen_sdp_offers`); + queries.push(`SELECT * FROM visible_screen_sdp_answers`); + queries.push(`SELECT * FROM visible_screen_ice_candidates`); } // 2. View-specific queries diff --git a/src/chat/services/webrtc/channel-audio-webrtc.svelte.ts b/src/chat/services/webrtc/channel-audio-webrtc.svelte.ts index 532b241..331d7b4 100644 --- a/src/chat/services/webrtc/channel-audio-webrtc.svelte.ts +++ b/src/chat/services/webrtc/channel-audio-webrtc.svelte.ts @@ -45,9 +45,9 @@ export class ChannelAudioWebRTCService { const [vsStore] = useTable(tables.voice_state); vsStore.subscribe((v) => (this.voiceStates = v)); - const [offStore] = useTable(tables.voice_sdp_offer); - const [ansStore] = useTable(tables.voice_sdp_answer); - const [iceStore] = useTable(tables.voice_ice_candidate); + const [offStore] = useTable(tables.visible_voice_sdp_offers); + const [ansStore] = useTable(tables.visible_voice_sdp_answers); + const [iceStore] = useTable(tables.visible_voice_ice_candidates); offStore.subscribe((v) => (this.offers = v)); ansStore.subscribe((v) => (this.answers = v)); diff --git a/src/chat/services/webrtc/screen-sharing-webrtc.svelte.ts b/src/chat/services/webrtc/screen-sharing-webrtc.svelte.ts index ba86d3c..2ae99a6 100644 --- a/src/chat/services/webrtc/screen-sharing-webrtc.svelte.ts +++ b/src/chat/services/webrtc/screen-sharing-webrtc.svelte.ts @@ -42,9 +42,9 @@ export class ScreenSharingWebRTCService { const [wStore] = useTable(tables.watching); wStore.subscribe((v) => (this.watching = v)); - const [offStore] = useTable(tables.screen_sdp_offer); - const [ansStore] = useTable(tables.screen_sdp_answer); - const [iceStore] = useTable(tables.screen_ice_candidate); + const [offStore] = useTable(tables.visible_screen_sdp_offers); + const [ansStore] = useTable(tables.visible_screen_sdp_answers); + const [iceStore] = useTable(tables.visible_screen_ice_candidates); offStore.subscribe((v) => (this.offers = v)); ansStore.subscribe((v) => (this.answers = v));