delete event[] before insert

This commit is contained in:
Martti Malmi 2023-03-12 09:31:12 +02:00
parent 8100578969
commit 4a5b1b12b4
3 changed files with 42 additions and 38 deletions

View File

@ -257,9 +257,10 @@ const Events = {
},
insert(event: Event) {
try {
delete event['$loki'];
this.db.insert(event);
} catch (e) {
// console.log('failed to insert event', e, typeof e);
console.log('failed to insert event', e, typeof e);
// suppress error on duplicate insert. lokijs should throw a different error kind?
}
},
@ -394,13 +395,13 @@ const Events = {
}
return true;
},
handle(event: Event, force = false, saveToIdb = true) {
handle(event: Event, force = false, saveToIdb = true): boolean {
if (!event) return;
if (!force && !!this.db.by('id', event.id)) {
return;
return false;
}
if (!force && !this.acceptEvent(event)) {
return;
return false;
}
// Accepting metadata so we still get their name. But should we instead save the name on our own list?
// They might spam with 1 MB events and keep changing their name or something.
@ -429,7 +430,7 @@ const Events = {
switch (event.kind) {
case 0:
if (this.handleMetadata(event) === false) {
return;
return false;
}
break;
case 1:
@ -448,7 +449,7 @@ const Events = {
break;
case 3:
if (SocialNetwork.followEventByUser.get(event.pubkey)?.created_at >= event.created_at) {
return;
return false;
}
this.maybeAddNotification(event);
this.handleFollow(event);
@ -503,12 +504,13 @@ const Events = {
// go through subscriptions and callback if filters match
for (const sub of PubSub.subscriptions.values()) {
if (!sub.filters) {
return;
continue;
}
if (this.matchFilters(event, sub.filters)) {
sub.callback && sub.callback(event);
}
}
return true;
},
handleNextFutureEvent() {
if (this.futureEventIds.size === 0) {

View File

@ -1,11 +1,10 @@
import Dexie, { Table } from 'dexie';
import { throttle } from 'lodash';
import { Event, Filter, matchFilter } from '../lib/nostr-tools';
import Events from './Events';
import Key from './Key';
import SocialNetwork from './SocialNetwork';
import {throttle} from "lodash";
export class MyDexie extends Dexie {
events!: Table<Event & { id: string }>;
@ -58,7 +57,7 @@ export default {
.orderBy('created_at')
.reverse()
.filter((event) => event.kind === 1)
.limit(3000)
.limit(5000)
.each((event) => {
Events.handle(event, false, false);
});

View File

@ -1,5 +1,5 @@
import localForage from 'localforage';
import { debounce } from 'lodash';
import { debounce, throttle } from 'lodash';
import { Event } from '../lib/nostr-tools';
@ -7,35 +7,36 @@ import Events from './Events';
import Key from './Key';
import SocialNetwork from './SocialNetwork';
let latestByFollows;
const getLatestByFollows = () => {
if (latestByFollows) {
return latestByFollows;
}
latestByFollows = Events.db.addDynamicView('latest_by_follows', { persist: true });
latestByFollows.applyFind({ kind: 1 });
latestByFollows.applySimpleSort('created_at', { desc: true });
latestByFollows.applyWhere((event: Event) => {
return SocialNetwork.followDistanceByUser.get(event.pubkey) <= 1;
});
return latestByFollows;
};
let latestByEveryone;
const getLatestByEveryone = () => {
if (latestByEveryone) {
return latestByEveryone;
}
latestByEveryone = Events.db.addDynamicView('latest_by_everyone', { persist: true });
latestByEveryone.applyFind({ kind: 1 });
latestByEveryone.applySimpleSort('created_at', { desc: true });
return latestByEveryone;
};
export default {
loaded: false,
saveEvents: debounce(() => {
const latestMsgs = Events.db
.chain()
.simplesort('created_at')
.where((e: Event) => {
if (e.kind !== 1) {
return false;
}
const followDistance = SocialNetwork.followDistanceByUser.get(e.pubkey);
if (followDistance > 1) {
return false;
}
return true;
})
.limit(100)
.data();
const latestMsgsByEveryone = Events.db
.chain()
.simplesort('created_at')
.where((e: Event) => {
if (e.kind !== 1) {
return false;
}
return true;
})
.limit(100)
.data();
saveEvents: throttle(() => {
const latestMsgs = getLatestByFollows().data().slice(0, 100);
const latestMsgsByEveryone = getLatestByEveryone().data().slice(0, 100);
const notifications = Events.notifications.eventIds
.map((eventId: any) => {
return Events.db.by('id', eventId);
@ -56,6 +57,8 @@ export default {
localForage.setItem('dms', dms);
localForage.setItem('keyValueEvents', kvEvents);
// TODO save own block and flag events
console.log('saved latestMsgs', latestMsgs.length);
console.log('saved latestMsgsByEveryone', latestMsgsByEveryone.length);
}, 5000),
saveProfilesAndFollows: debounce(() => {