/
RcStreamGroup.js
50 lines (43 loc) · 1.39 KB
/
RcStreamGroup.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import { readable } from 'svelte/store';
import { RcStream } from './RcStream';
import { OresQueue } from './Ores';
import { filterEvents } from './AppConfig';
/**
* @var {Array<Array<RcEvent>>} eventGroups
*
* New events at the front
*/
let eventGroups = [];
export const RcStreamGroups = readable(eventGroups, async (set) => {
RcStream.subscribe((events) => {
if (!events || events.length < 1) {
return;
}
const filteredEvents = filterEvents(events);
const newEventIds = [];
for (const newEvent of filteredEvents) {
newEventIds.push({ revid: newEvent.revision.new, dbName: newEvent.wiki });
}
OresQueue.update((eventIds) => [...eventIds, ...newEventIds]);
for (const newEvent of filteredEvents) {
// TODO: These operations are expensive; O(N) on every new event received; see if we can improve
// Find in `eventGroups`
const groupIndex = eventGroups.findIndex((group) => {
return (
group[0].server_url === newEvent.server_url &&
group[0].title === newEvent.title
);
});
// "Bubble" the new group up
if (groupIndex > -1) {
const events = [newEvent, ...eventGroups[groupIndex]];
eventGroups.splice(groupIndex, 1);
eventGroups.unshift(events);
} else {
eventGroups.unshift([newEvent]);
}
}
RcStream.set([]);
set(eventGroups);
});
});