consolidate views

This commit is contained in:
2026-04-09 01:12:26 -04:00
parent fa1d3fe31f
commit 34b780b9bf
9 changed files with 201 additions and 504 deletions
+14 -111
View File
@@ -682,37 +682,16 @@ pub fn set_sharing_screen(ctx: &ReducerContext, sharing: bool) {
ctx.db.watching().id().delete(id);
}
let s_offers: Vec<_> = ctx
let signals: Vec<_> = ctx
.db
.screen_sdp_offer()
.webrtc_signal()
.sender()
.filter(ctx.sender())
.map(|r| r.id)
.filter(|s| s.media_type == MediaType::Screen)
.map(|s| s.id)
.collect();
for id in s_offers {
ctx.db.screen_sdp_offer().id().delete(id);
}
let s_answers: Vec<_> = ctx
.db
.screen_sdp_answer()
.sender()
.filter(ctx.sender())
.map(|r| r.id)
.collect();
for id in s_answers {
ctx.db.screen_sdp_answer().id().delete(id);
}
let s_ice: Vec<_> = ctx
.db
.screen_ice_candidate()
.sender()
.filter(ctx.sender())
.map(|r| r.id)
.collect();
for id in s_ice {
ctx.db.screen_ice_candidate().id().delete(id);
for id in signals {
ctx.db.webrtc_signal().id().delete(id);
}
}
}
@@ -777,97 +756,21 @@ pub fn leave_voice(ctx: &ReducerContext) {
}
#[spacetimedb::reducer]
pub fn send_voice_sdp_offer(
pub fn send_webrtc_signal(
ctx: &ReducerContext,
receiver: Identity,
sdp: String,
signal_kind: SignalKind,
media_type: MediaType,
data: String,
channel_id: u64,
) {
ctx.db.voice_sdp_offer().insert(VoiceSdpOffer {
ctx.db.webrtc_signal().insert(WebRTCSignal {
id: 0,
sender: ctx.sender(),
receiver,
sdp,
channel_id,
});
}
#[spacetimedb::reducer]
pub fn send_voice_sdp_answer(
ctx: &ReducerContext,
receiver: Identity,
sdp: String,
channel_id: u64,
) {
ctx.db.voice_sdp_answer().insert(VoiceSdpAnswer {
id: 0,
sender: ctx.sender(),
receiver,
sdp,
channel_id,
});
}
#[spacetimedb::reducer]
pub fn send_voice_ice_candidate(
ctx: &ReducerContext,
receiver: Identity,
candidate: String,
channel_id: u64,
) {
ctx.db.voice_ice_candidate().insert(VoiceIceCandidate {
id: 0,
sender: ctx.sender(),
receiver,
candidate,
channel_id,
});
}
#[spacetimedb::reducer]
pub fn send_screen_sdp_offer(
ctx: &ReducerContext,
receiver: Identity,
sdp: String,
channel_id: u64,
) {
ctx.db.screen_sdp_offer().insert(ScreenSdpOffer {
id: 0,
sender: ctx.sender(),
receiver,
sdp,
channel_id,
});
}
#[spacetimedb::reducer]
pub fn send_screen_sdp_answer(
ctx: &ReducerContext,
receiver: Identity,
sdp: String,
channel_id: u64,
) {
ctx.db.screen_sdp_answer().insert(ScreenSdpAnswer {
id: 0,
sender: ctx.sender(),
receiver,
sdp,
channel_id,
});
}
#[spacetimedb::reducer]
pub fn send_screen_ice_candidate(
ctx: &ReducerContext,
receiver: Identity,
candidate: String,
channel_id: u64,
) {
ctx.db.screen_ice_candidate().insert(ScreenIceCandidate {
id: 0,
sender: ctx.sender(),
receiver,
candidate,
signal_kind,
media_type,
data,
channel_id,
});
}
+14 -69
View File
@@ -117,36 +117,21 @@ pub struct Watching {
pub channel_id: u64,
}
#[spacetimedb::table(accessor = voice_sdp_offer)]
pub struct VoiceSdpOffer {
#[primary_key]
#[auto_inc]
pub id: u64,
#[index(btree)]
pub sender: Identity,
#[index(btree)]
pub receiver: Identity,
pub sdp: String,
#[index(btree)]
pub channel_id: u64,
#[derive(spacetimedb::SpacetimeType, Clone, Copy, Debug, PartialEq)]
pub enum SignalKind {
Offer,
Answer,
IceCandidate,
}
#[spacetimedb::table(accessor = voice_sdp_answer)]
pub struct VoiceSdpAnswer {
#[primary_key]
#[auto_inc]
pub id: u64,
#[index(btree)]
pub sender: Identity,
#[index(btree)]
pub receiver: Identity,
pub sdp: String,
#[index(btree)]
pub channel_id: u64,
#[derive(spacetimedb::SpacetimeType, Clone, Copy, Debug, PartialEq)]
pub enum MediaType {
Voice,
Screen,
}
#[spacetimedb::table(accessor = voice_ice_candidate)]
pub struct VoiceIceCandidate {
#[spacetimedb::table(accessor = webrtc_signal)]
pub struct WebRTCSignal {
#[primary_key]
#[auto_inc]
pub id: u64,
@@ -154,49 +139,9 @@ pub struct VoiceIceCandidate {
pub sender: Identity,
#[index(btree)]
pub receiver: Identity,
pub candidate: String,
#[index(btree)]
pub channel_id: u64,
}
#[spacetimedb::table(accessor = screen_sdp_offer)]
pub struct ScreenSdpOffer {
#[primary_key]
#[auto_inc]
pub id: u64,
#[index(btree)]
pub sender: Identity,
#[index(btree)]
pub receiver: Identity,
pub sdp: String,
#[index(btree)]
pub channel_id: u64,
}
#[spacetimedb::table(accessor = screen_sdp_answer)]
pub struct ScreenSdpAnswer {
#[primary_key]
#[auto_inc]
pub id: u64,
#[index(btree)]
pub sender: Identity,
#[index(btree)]
pub receiver: Identity,
pub sdp: String,
#[index(btree)]
pub channel_id: u64,
}
#[spacetimedb::table(accessor = screen_ice_candidate)]
pub struct ScreenIceCandidate {
#[primary_key]
#[auto_inc]
pub id: u64,
#[index(btree)]
pub sender: Identity,
#[index(btree)]
pub receiver: Identity,
pub candidate: String,
pub signal_kind: SignalKind,
pub media_type: MediaType,
pub data: String,
#[index(btree)]
pub channel_id: u64,
}
+4 -38
View File
@@ -354,54 +354,20 @@ pub fn clear_signaling_for_user(db: &Local, identity: Identity) {
}
for row in db
.voice_sdp_offer()
.webrtc_signal()
.sender()
.filter(identity)
.collect::<Vec<_>>()
{
db.voice_sdp_offer().delete(row);
db.webrtc_signal().delete(row);
}
for row in db
.voice_sdp_offer()
.webrtc_signal()
.receiver()
.filter(identity)
.collect::<Vec<_>>()
{
db.voice_sdp_offer().delete(row);
}
for row in db
.voice_sdp_answer()
.sender()
.filter(identity)
.collect::<Vec<_>>()
{
db.voice_sdp_answer().delete(row);
}
for row in db
.voice_sdp_answer()
.receiver()
.filter(identity)
.collect::<Vec<_>>()
{
db.voice_sdp_answer().delete(row);
}
for row in db
.voice_ice_candidate()
.sender()
.filter(identity)
.collect::<Vec<_>>()
{
db.voice_ice_candidate().delete(row);
}
for row in db
.voice_ice_candidate()
.receiver()
.filter(identity)
.collect::<Vec<_>>()
{
db.voice_ice_candidate().delete(row);
db.webrtc_signal().delete(row);
}
}
+57 -126
View File
@@ -52,6 +52,57 @@ pub struct VisibleDirectMessageRow {
pub is_open_recipient: bool,
}
#[spacetimedb::view(accessor = visible_recent_activity, public)]
pub fn visible_recent_activity(ctx: &ViewContext) -> Vec<RecentMessage> {
let identity = ctx.sender();
let mut results = Vec::new();
let mut seen_ids = std::collections::HashSet::new();
// 1. Servers I'm a member of
let my_server_ids: Vec<u64> = ctx
.db
.server_member()
.identity()
.filter(identity)
.map(|m| m.server_id)
.collect();
for server_id in my_server_ids {
for rm in ctx.db.recent_message().server_id().filter(server_id) {
if seen_ids.insert(rm.id) {
results.push(rm);
}
}
}
// 2. Open DMs
let my_dms: Vec<_> = ctx
.db
.direct_message()
.sender()
.filter(identity)
.filter(|dm| dm.is_open_sender)
.chain(
ctx.db
.direct_message()
.recipient()
.filter(identity)
.filter(|dm| dm.is_open_recipient),
)
.map(|dm| dm.channel_id)
.collect();
for channel_id in my_dms {
for rm in ctx.db.recent_message().channel_id().filter(channel_id) {
if seen_ids.insert(rm.id) {
results.push(rm);
}
}
}
results
}
#[spacetimedb::view(accessor = visible_servers, public)]
pub fn visible_servers(ctx: &ViewContext) -> Vec<Server> {
let identity = ctx.sender();
@@ -168,58 +219,16 @@ pub fn visible_images(ctx: &ViewContext) -> Vec<VisibleImageRow> {
results
}
#[spacetimedb::view(accessor = visible_messages, public)]
pub fn visible_messages(ctx: &ViewContext) -> Vec<RecentMessage> {
#[spacetimedb::view(accessor = visible_webrtc_signals, public)]
pub fn visible_webrtc_signals(ctx: &ViewContext) -> Vec<WebRTCSignal> {
let identity = ctx.sender();
let mut results = Vec::new();
// 1. Find all server IDs I am in
let my_server_ids: std::collections::HashSet<u64> = ctx
.db
.server_member()
.identity()
.filter(identity)
.map(|m| m.server_id)
.collect();
// 2. Find recent messages for those servers
for server_id in my_server_ids {
for rm in ctx.db.recent_message().server_id().filter(server_id) {
results.push(rm);
}
for signal in ctx.db.webrtc_signal().sender().filter(identity) {
results.push(signal);
}
results
}
#[spacetimedb::view(accessor = visible_dm_messages, public)]
pub fn visible_dm_messages(ctx: &ViewContext) -> Vec<RecentMessage> {
let mut results = Vec::new();
let identity = ctx.sender();
// DM FAST PATH: Recent messages from Open DMs
let my_dms: Vec<_> = ctx
.db
.direct_message()
.sender()
.filter(identity)
.filter(|dm| dm.is_open_sender)
.chain(
ctx.db
.direct_message()
.recipient()
.filter(identity)
.filter(|dm| dm.is_open_recipient),
)
.map(|dm| dm.channel_id)
.collect();
for channel_id in my_dms {
for rm in ctx.db.recent_message().channel_id().filter(channel_id) {
results.push(rm);
}
for signal in ctx.db.webrtc_signal().receiver().filter(identity) {
results.push(signal);
}
results
}
@@ -283,84 +292,6 @@ pub fn visible_scrollback_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()) {