From 0901e54ab616bac3912f085bad9c5db68ec3e0c2 Mon Sep 17 00:00:00 2001 From: kieran Date: Fri, 6 Dec 2024 13:22:13 +0000 Subject: [PATCH] fix: small performance tweaks --- .../app/src/Components/Toaster/Toaster.tsx | 7 +++- packages/app/src/Feed/WorkerRelayView.ts | 2 +- packages/app/src/Hooks/useProfileSearch.tsx | 38 +++---------------- .../Pages/Layout/HasNotificationsMarker.tsx | 12 +----- packages/app/src/Pages/Layout/LogoHeader.tsx | 2 +- packages/system/src/query-manager.ts | 5 +++ .../worker-relay/src/sqlite/sqlite-relay.ts | 6 +-- packages/worker-relay/src/worker.ts | 2 - 8 files changed, 20 insertions(+), 54 deletions(-) diff --git a/packages/app/src/Components/Toaster/Toaster.tsx b/packages/app/src/Components/Toaster/Toaster.tsx index e13c7daf..18208252 100644 --- a/packages/app/src/Components/Toaster/Toaster.tsx +++ b/packages/app/src/Components/Toaster/Toaster.tsx @@ -36,8 +36,11 @@ class ToasterSlots extends ExternalStore> { #eatToast() { const now = unixNow(); - this.#stack = this.#stack.filter(a => (a.expire ?? 0) > now); - this.notifyChange(); + const newStack = this.#stack.filter(a => (a.expire ?? 0) > now); + if (newStack.length !== this.#stack.length) { + this.#stack = newStack; + this.notifyChange(); + } } } diff --git a/packages/app/src/Feed/WorkerRelayView.ts b/packages/app/src/Feed/WorkerRelayView.ts index 740ce033..520b96e7 100644 --- a/packages/app/src/Feed/WorkerRelayView.ts +++ b/packages/app/src/Feed/WorkerRelayView.ts @@ -13,7 +13,7 @@ export function useNotificationsView() { leaveOpen: true, }); if (publicKey) { - rb.withFilter().kinds(kinds).tag("p", [publicKey]); + rb.withFilter().kinds(kinds).tag("p", [publicKey]).limit(100); } return rb; }, [publicKey]); diff --git a/packages/app/src/Hooks/useProfileSearch.tsx b/packages/app/src/Hooks/useProfileSearch.tsx index 5582072f..45a4902d 100644 --- a/packages/app/src/Hooks/useProfileSearch.tsx +++ b/packages/app/src/Hooks/useProfileSearch.tsx @@ -1,43 +1,15 @@ -import { useEffect, useMemo, useState } from "react"; - import fuzzySearch from "@/Db/FuzzySearch"; -import useTimelineFeed, { TimelineFeedOptions, TimelineSubject } from "@/Feed/TimelineFeed"; -import { debounce } from "@/Utils"; import useWoT from "./useWoT"; -const options: TimelineFeedOptions = { method: "LIMIT_UNTIL" }; - -export default function useProfileSearch(search: string) { - const [debouncedSearch, setDebouncedSearch] = useState(search); - - useEffect(() => { - return debounce(500, () => { - setDebouncedSearch(search); - }); - }, [search]); - - const subject = useMemo( - () => - ({ - type: "profile_keyword", - items: debouncedSearch ? [debouncedSearch] : [], - discriminator: debouncedSearch, - }) as TimelineSubject, - [debouncedSearch], - ); - const feed = useTimelineFeed(subject, options); - const results = useMemo(() => { - return userSearch(search); - }, [search, feed]); - - return results; +export default function useProfileSearch(search: string | undefined) { + return userSearch(search); } -export function userSearch(search: string) { +export function userSearch(search: string | undefined) { const wot = useWoT(); - const searchString = search.trim(); - const fuseResults = fuzzySearch.search(searchString); + const searchString = search?.trim() ?? ""; + const fuseResults = (searchString?.length ?? 0) > 0 ? fuzzySearch.search(searchString) : []; const followDistanceNormalizationFactor = 3; const seenIds = new Set(); diff --git a/packages/app/src/Pages/Layout/HasNotificationsMarker.tsx b/packages/app/src/Pages/Layout/HasNotificationsMarker.tsx index 72a2a3b1..9dcfbbc7 100644 --- a/packages/app/src/Pages/Layout/HasNotificationsMarker.tsx +++ b/packages/app/src/Pages/Layout/HasNotificationsMarker.tsx @@ -1,19 +1,11 @@ import { useMemo } from "react"; -import { useNotificationsView } from "@/Feed/WorkerRelayView"; import useLogin from "@/Hooks/useLogin"; export function HasNotificationsMarker() { const readNotifications = useLogin(s => s.readNotifications); - const notifications = useNotificationsView(); - const latestNotification = useMemo( - () => notifications.reduce((acc, v) => (v.created_at > acc ? v.created_at : acc), 0), - [notifications], - ); - const hasNotifications = useMemo( - () => latestNotification * 1000 > readNotifications, - [notifications, readNotifications], - ); + const latestNotification = 0; // TODO: get latest timestamp + const hasNotifications = useMemo(() => latestNotification * 1000 > readNotifications, [readNotifications]); if (hasNotifications) { return ( diff --git a/packages/app/src/Pages/Layout/LogoHeader.tsx b/packages/app/src/Pages/Layout/LogoHeader.tsx index 94a5990a..17a81247 100644 --- a/packages/app/src/Pages/Layout/LogoHeader.tsx +++ b/packages/app/src/Pages/Layout/LogoHeader.tsx @@ -20,7 +20,7 @@ const getExtra = () => { }; export function LogoHeader({ showText = false }: { showText: boolean }) { - const { subscriptions } = useLogin(); + const subscriptions = useLogin(s => s.subscriptions); const currentSubscription = getCurrentSubscription(subscriptions); const appName = CONFIG.appName === "iris" && isStPatricksDay() ? "Irish" : CONFIG.appName; diff --git a/packages/system/src/query-manager.ts b/packages/system/src/query-manager.ts index cc629401..9fbfbf9f 100644 --- a/packages/system/src/query-manager.ts +++ b/packages/system/src/query-manager.ts @@ -96,6 +96,11 @@ export class QueryManager extends EventEmitter { // check for empty filters filters = trimFilters(filters); + if (filters.length === 0) { + this.#log("Dropping %s %o", q.id); + return; + } + // automated outbox model, load relays for queried authors for (const f of filters) { if (f.authors) { diff --git a/packages/worker-relay/src/sqlite/sqlite-relay.ts b/packages/worker-relay/src/sqlite/sqlite-relay.ts index 40ba81f8..550d9176 100644 --- a/packages/worker-relay/src/sqlite/sqlite-relay.ts +++ b/packages/worker-relay/src/sqlite/sqlite-relay.ts @@ -49,10 +49,6 @@ export class SqliteRelay extends EventEmitter implements Rel this.#pool = await this.#sqlite.installOpfsSAHPoolVfs({}); this.db = new this.#pool.OpfsSAHPoolDb(path); this.#log(`Opened ${this.db.filename}`); - /*this.db.exec( - `PRAGMA cache_size=${32 * 1024 - }; PRAGMA page_size=8192; PRAGMA journal_mode=MEMORY; PRAGMA temp_store=MEMORY;`, - );*/ } /** @@ -237,7 +233,7 @@ export class SqliteRelay extends EventEmitter implements Rel }; }) ?? []; const time = unixNowMs() - start; - this.#log(`Query ${id} results took ${time.toLocaleString()}ms`); + this.#log(`Query ${id} results took ${time.toLocaleString()}ms`, req); return results; } diff --git a/packages/worker-relay/src/worker.ts b/packages/worker-relay/src/worker.ts index 7caaa5f0..156aeec8 100644 --- a/packages/worker-relay/src/worker.ts +++ b/packages/worker-relay/src/worker.ts @@ -3,7 +3,6 @@ import { SqliteRelay } from "./sqlite/sqlite-relay"; import { InMemoryRelay } from "./memory-relay"; import { setLogging } from "./debug"; -import { WorkQueueItem, barrierQueue, processWorkQueue } from "./queue"; import { NostrEvent, RelayHandler, @@ -42,7 +41,6 @@ async function insertBatch() { setTimeout(() => insertBatch(), 100); } -const cmdQueue: Array = []; try { setTimeout(() => insertBatch(), 100); } catch (e) {