From 8fb127b3471dd13d43f95165d8e04f684f26bbc9 Mon Sep 17 00:00:00 2001 From: Martti Malmi Date: Thu, 18 Jan 2024 20:52:21 +0200 Subject: [PATCH] initial state from LRUCache --- packages/app/src/Feed/WorkerRelayView.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/app/src/Feed/WorkerRelayView.ts b/packages/app/src/Feed/WorkerRelayView.ts index 48685052..9a06efd4 100644 --- a/packages/app/src/Feed/WorkerRelayView.ts +++ b/packages/app/src/Feed/WorkerRelayView.ts @@ -1,17 +1,29 @@ import { unixNow } from "@snort/shared"; import { EventKind, NostrEvent, NostrLink, ReqFilter, RequestBuilder, TaggedNostrEvent } from "@snort/system"; import { SnortContext, useRequestBuilder } from "@snort/system-react"; -import { useContext, useEffect, useMemo, useState } from "react"; +import { useCallback, useContext, useEffect, useMemo, useState } from "react"; +import { LRUCache } from "typescript-lru-cache"; import { Relay } from "@/Cache"; import useLogin from "@/Hooks/useLogin"; import { Day } from "@/Utils/Const"; +const cache = new LRUCache(20); + export function useWorkerRelayView(id: string, filters: Array, leaveOpen?: boolean, maxWindow?: number) { - const [events, setEvents] = useState>([]); + const cacheKey = useMemo(() => JSON.stringify(filters), [filters]); + const [events, setEvents] = useState>(cache.get(cacheKey) ?? []); const [rb, setRb] = useState(); const system = useContext(SnortContext); + const cacheAndSetEvents = useCallback( + (evs: Array) => { + cache.set(cacheKey, evs); + setEvents(evs); + }, + [cacheKey], + ); + useEffect(() => { if (rb) { const q = system.Query(rb); @@ -46,12 +58,12 @@ export function useWorkerRelayView(id: string, filters: Array, leaveO setRb(rb); }); Relay.req({ id, filters, leaveOpen }).then(res => { - setEvents(res.result); + cacheAndSetEvents(res.result); if (res.port) { res.port.addEventListener("message", ev => { const evs = ev.data as Array; if (evs.length > 0) { - setEvents(x => [...x, ...evs]); + cacheAndSetEvents(x => [...x, ...evs]); } }); res.port.start();