consolidate views
This commit is contained in:
+14
-111
@@ -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
@@ -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,
|
||||
}
|
||||
|
||||
@@ -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
@@ -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()) {
|
||||
|
||||
Reference in New Issue
Block a user