Screen events while finding them, so limits work properly

This commit is contained in:
Mike Dilger 2024-02-20 08:22:34 +13:00
parent cb4d897a7d
commit abcdf4df6d
2 changed files with 16 additions and 14 deletions

View File

@ -107,17 +107,16 @@ impl WebSocketService {
{
let mut events: Vec<Event> = Vec::new();
for filter in filters.iter() {
let mut filter_events = GLOBALS
let screen = |event: &Event| {
let event_flags = event_flags(event, &user);
screen_outgoing_event(event, event_flags, authorized_user)
};
let filter_events = GLOBALS
.store
.get()
.unwrap()
.find_events(filter.as_filter()?)?;
for event in filter_events.drain(..) {
let event_flags = event_flags(&event, &user);
if screen_outgoing_event(&event, event_flags, authorized_user) {
events.push(event);
}
}
.find_events(filter.as_filter()?, screen)?;
events.extend(filter_events);
}
// sort

View File

@ -226,7 +226,10 @@ impl Store {
}
/// Find all events that match the filter
pub fn find_events(&self, filter: Filter) -> Result<Vec<Event>, Error> {
pub fn find_events<F>(&self, filter: Filter, screen: F) -> Result<Vec<Event>, Error>
where
F: Fn(&Event) -> bool,
{
let mut output: Vec<Event> = Vec::new();
if filter.num_ids() > 0 {
@ -234,7 +237,7 @@ impl Store {
for id in filter.ids() {
if let Some(event) = self.get_event_by_id(id)? {
// and check each against the rest of the filter
if filter.event_matches(&event)? {
if filter.event_matches(&event)? && screen(&event) {
output.push(event);
}
}
@ -268,7 +271,7 @@ impl Store {
let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? {
// check against the rest of the filter
if filter.event_matches(&event)? {
if filter.event_matches(&event)? && screen(&event) {
output.push(event);
// If kind is replaceable (and not parameterized)
// then don't take any more events for this author-kind
@ -317,7 +320,7 @@ impl Store {
let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? {
// check against the rest of the filter
if filter.event_matches(&event)? {
if filter.event_matches(&event)? && screen(&event) {
output.push(event);
}
}
@ -360,7 +363,7 @@ impl Store {
let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? {
// check against the rest of the filter
if filter.event_matches(&event)? {
if filter.event_matches(&event)? && screen(&event) {
output.push(event);
}
}
@ -383,7 +386,7 @@ impl Store {
for result in iter {
let (_key, offset) = result?;
if let Some(event) = self.events.get_event_by_offset(offset)? {
if filter.event_matches(&event)? {
if filter.event_matches(&event)? && screen(&event) {
output.push(event);
count += 1;
if count >= filter.limit() {