diff --git a/.changeset/clean-rabbits-complain.md b/.changeset/clean-rabbits-complain.md new file mode 100644 index 000000000..cbaab41d6 --- /dev/null +++ b/.changeset/clean-rabbits-complain.md @@ -0,0 +1,5 @@ +--- +"nostrudel": minor +--- + +Add option to wipe wasm relay database diff --git a/package.json b/package.json index 69ab0982d..99cf812c4 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "@noble/hashes": "^1.3.2", "@noble/secp256k1": "^1.7.0", "@scure/base": "^1.1.6", - "@snort/worker-relay": "^1.2.0", + "@snort/worker-relay": "^1.3.0", "@uiw/codemirror-theme-github": "^4.23.0", "@uiw/react-codemirror": "^4.23.0", "@webscopeio/react-textarea-autocomplete": "^4.9.2", diff --git a/src/services/wasm-relay/index.ts b/src/services/wasm-relay/index.ts index 2fd4431cf..641b3b1e1 100644 --- a/src/services/wasm-relay/index.ts +++ b/src/services/wasm-relay/index.ts @@ -87,6 +87,10 @@ export default class WasmRelay implements SimpleRelay { this.subscriptions.delete(id); } } + + wipe() { + return this.worker?.wipe(); + } } class WasmRelaySubscription { diff --git a/src/views/relays/cache/database/wasm.tsx b/src/views/relays/cache/database/wasm.tsx index dc8d569e7..ea58656a7 100644 --- a/src/views/relays/cache/database/wasm.tsx +++ b/src/views/relays/cache/database/wasm.tsx @@ -1,5 +1,6 @@ import { useCallback, useEffect, useState } from "react"; import { + Button, ButtonGroup, Card, Flex, @@ -77,6 +78,18 @@ export default function WasmDatabasePage() { [worker, refresh], ); + const [deleting, setDeleting] = useState(false); + const deleteDatabase = useCallback(async () => { + try { + setDeleting(true); + if (localRelay instanceof WasmRelay) { + await localRelay.wipe(); + location.reload(); + } + } catch (error) {} + setDeleting(false); + }, []); + useEffect(() => { refresh(); }, []); @@ -88,6 +101,9 @@ export default function WasmDatabasePage() { + diff --git a/src/views/relays/cache/index.tsx b/src/views/relays/cache/index.tsx index 74156dc3a..af21278c8 100644 --- a/src/views/relays/cache/index.tsx +++ b/src/views/relays/cache/index.tsx @@ -1,7 +1,11 @@ +import { useCallback, useState } from "react"; import { useAsync } from "react-use"; import { Box, Button, + ButtonGroup, + ButtonGroupProps, + ButtonProps, Card, CardBody, CardFooter, @@ -9,7 +13,12 @@ import { Divider, Flex, Heading, + IconButton, Link, + Menu, + MenuButton, + MenuItem, + MenuList, Text, useDisclosure, } from "@chakra-ui/react"; @@ -18,9 +27,48 @@ import { Link as RouterLink } from "react-router-dom"; import BackButton from "../../../components/router/back-button"; import { NOSTR_RELAY_TRAY_URL, checkNostrRelayTray, localRelay } from "../../../services/local-relay"; -import WasmRelay from "../../../services/wasm-relay"; import { ChevronDownIcon, ChevronUpIcon } from "../../../components/icons"; +import WasmRelay from "../../../services/wasm-relay"; import MemoryRelay from "../../../classes/memory-relay"; +import Trash01 from "../../../components/icons/trash-01"; +import { deleteDatabase } from "../../../services/db"; + +function EnableWithDelete({ + enable, + enabled, + wipe, + ...props +}: Omit & { + enable: () => void; + enabled: boolean; + wipe: () => Promise; +}) { + const [deleting, setDeleting] = useState(false); + const wipeDatabase = useCallback(async () => { + try { + setDeleting(true); + await wipe(); + location.reload(); + } catch (error) {} + setDeleting(false); + }, []); + + return ( + + + + } aria-label="More options" /> + + } color="red.500" onClick={wipeDatabase}> + Clear Database + + + + + ); +} function InternalRelay() { const enabled = localRelay instanceof CacheRelay; @@ -29,13 +77,15 @@ function InternalRelay() { location.reload(); }; + const wipe = async () => { + await deleteDatabase(); + }; + return ( Browser Cache - + Use the browsers built-in database to cache events. @@ -60,13 +110,22 @@ function WasmWorkerRelay() { location.reload(); }; + const wipe = async () => { + if (localRelay instanceof WasmRelay) { + await localRelay.wipe(); + } else { + // import and delete database + console.log("Importing worker to wipe database"); + const { default: worker } = await import("../../../services/wasm-relay/worker"); + await worker.wipe(); + } + }; + return ( Internal SQLite Cache - + @@ -112,7 +171,7 @@ function NostrRelayTray() { GitHub - {available ? ( + {available || enabled ? ( diff --git a/yarn.lock b/yarn.lock index a7709966b..0d6af6bc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2815,10 +2815,10 @@ "@noble/hashes" "~1.3.2" "@scure/base" "~1.1.4" -"@snort/worker-relay@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@snort/worker-relay/-/worker-relay-1.2.0.tgz#e8affd9b19f5929ab23cf7d8f1810e884ce955f7" - integrity sha512-xq4R193So4CJt2JlyuLQRhPRUsl6VhWplx9tndwD8IZ41DPxv2sx2MR4MYnBhwNEo3atwyp3fgfgcHfY1PrWeg== +"@snort/worker-relay@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@snort/worker-relay/-/worker-relay-1.3.0.tgz#f6adf0e4d561f4cad3a15233b07c73d0a348e3c3" + integrity sha512-o6RuXCgwF4jG6lLATGTHXRRB1kllZMp7WnpMA4GzaY5fAI6uixSXFFna76WPwte6TMQ04uDM25hpByZrs2/L5Q== dependencies: "@sqlite.org/sqlite-wasm" "^3.46.1-build3" eventemitter3 "^5.0.1"