sdp/ice offers view

This commit is contained in:
2026-04-08 12:55:27 -04:00
parent 4c45c69402
commit 8dc3d556be
5 changed files with 98 additions and 12 deletions
+6 -6
View File
@@ -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]
+78
View File
@@ -240,6 +240,84 @@ pub fn visible_messages(ctx: &ViewContext) -> Vec<VisibleMessageRow> {
results
}
#[spacetimedb::view(accessor = visible_voice_sdp_offers, public)]
pub fn visible_voice_sdp_offers(ctx: &ViewContext) -> Vec<VoiceSdpOffer> {
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<VoiceSdpAnswer> {
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<VoiceIceCandidate> {
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<ScreenSdpOffer> {
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<ScreenSdpAnswer> {
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<ScreenIceCandidate> {
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<MyChannelSubscriptionRow> {
if let Some(sub) = ctx.db.channel_subscription().identity().find(ctx.sender()) {
+8
View File
@@ -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
@@ -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));
@@ -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));