diff --git a/src/js/nostr/Events.ts b/src/js/nostr/Events.ts index d5e40e66..0b71cc79 100644 --- a/src/js/nostr/Events.ts +++ b/src/js/nostr/Events.ts @@ -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) { diff --git a/src/js/nostr/IndexedDB.ts b/src/js/nostr/IndexedDB.ts index 91c9603a..638a2e3d 100644 --- a/src/js/nostr/IndexedDB.ts +++ b/src/js/nostr/IndexedDB.ts @@ -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; @@ -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); }); diff --git a/src/js/nostr/LocalForage.ts b/src/js/nostr/LocalForage.ts index 13314d93..513ecba5 100644 --- a/src/js/nostr/LocalForage.ts +++ b/src/js/nostr/LocalForage.ts @@ -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(() => {