From 465c59ea208cfbe055832aef76171a9ec79588b8 Mon Sep 17 00:00:00 2001 From: Kieran Date: Tue, 28 Mar 2023 15:34:01 +0100 Subject: [PATCH] refactor: RequestBuilder --- .github/workflows/eslint.yaml | 18 - .../{formatting.yaml => test-lint.yaml} | 10 +- packages/app/package.json | 4 +- packages/app/src/Db/index.ts | 20 +- packages/app/src/Element/Bookmarks.tsx | 11 +- packages/app/src/Element/DM.tsx | 8 +- packages/app/src/Element/HyperText.tsx | 15 +- packages/app/src/Element/Note.tsx | 65 ++-- packages/app/src/Element/NoteCreator.tsx | 12 +- packages/app/src/Element/NoteFooter.tsx | 46 +-- packages/app/src/Element/NoteReaction.tsx | 34 +- packages/app/src/Element/Relay.tsx | 18 +- packages/app/src/Element/SendSats.tsx | 15 +- packages/app/src/Element/SubDebug.css | 14 + packages/app/src/Element/SubDebug.tsx | 104 +++++ packages/app/src/Element/Tabs.tsx | 1 + packages/app/src/Element/Text.tsx | 34 +- packages/app/src/Element/Thread.tsx | 358 +++++++----------- packages/app/src/Element/Timeline.tsx | 99 +++-- packages/app/src/Feed/BadgesFeed.ts | 95 ++--- packages/app/src/Feed/BookmarkFeed.tsx | 4 +- packages/app/src/Feed/EventPublisher.ts | 210 +++++----- packages/app/src/Feed/FollowersFeed.ts | 20 +- packages/app/src/Feed/FollowsFeed.ts | 21 +- packages/app/src/Feed/LoginFeed.ts | 274 ++++++-------- packages/app/src/Feed/MuteList.ts | 29 +- packages/app/src/Feed/PinnedFeed.tsx | 2 +- packages/app/src/Feed/RelaysFeed.tsx | 24 +- packages/app/src/Feed/RelaysFeedFollows.tsx | 73 ++++ packages/app/src/Feed/Subscription.ts | 152 -------- packages/app/src/Feed/ThreadFeed.ts | 66 ++-- packages/app/src/Feed/TimelineFeed.ts | 189 ++++----- packages/app/src/Feed/ZapsFeed.ts | 29 +- .../app/src/Feed/useNotelistSubscription.ts | 62 --- .../app/src/Hooks/useNotelistSubscription.ts | 46 +++ .../app/src/Hooks/useRelaysForFollows.tsx | 65 ++++ packages/app/src/Hooks/useRequestBuilder.tsx | 50 +++ packages/app/src/Hooks/useSystemState.tsx | 9 + packages/app/src/Hooks/useTimelineWindow.tsx | 18 + packages/app/src/Hooks/useUserProfile.ts | 9 +- packages/app/src/LNURL.ts | 6 +- packages/app/src/Pages/EventPage.tsx | 17 - packages/app/src/Pages/Layout.tsx | 160 ++++---- packages/app/src/Pages/ProfilePage.tsx | 124 +++--- packages/app/src/Pages/Root.tsx | 218 +++++++---- .../app/src/Pages/settings/Preferences.tsx | 17 - packages/app/src/Pages/settings/RelayInfo.tsx | 19 +- packages/app/src/Pages/settings/Relays.tsx | 18 +- packages/app/src/Pages/settings/messages.ts | 2 - packages/app/src/State/Login.ts | 12 +- packages/app/src/State/Relays/index.ts | 83 ++++ packages/app/src/System.ts | 226 ----------- packages/app/src/System/EventExt.ts | 165 ++++++++ .../app/src/System/NoteCollection.test.ts | 52 +++ packages/app/src/System/NoteCollection.ts | 273 +++++++++++++ packages/app/src/System/ProfileCache.ts | 100 +++++ packages/app/src/System/Query.ts | 91 +++++ .../app/src/System/RequestBuilder.test.ts | 64 ++++ packages/app/src/System/RequestBuilder.ts | 148 ++++++++ .../app/src/System/RequestSplitter.test.ts | 74 ++++ packages/app/src/System/RequestSplitter.ts | 43 +++ packages/app/src/System/index.ts | 334 ++++++++++++++++ packages/app/src/Util.ts | 80 +++- packages/app/src/Wallet/LNDHub.ts | 21 +- packages/app/src/index.tsx | 11 +- packages/app/src/lang.json | 18 +- packages/app/src/translations/en.json | 6 +- packages/nostr/src/legacy/Connection.ts | 286 ++++++-------- packages/nostr/src/legacy/Const.ts | 2 +- packages/nostr/src/legacy/Event.ts | 213 ----------- packages/nostr/src/legacy/Nips.ts | 4 +- packages/nostr/src/legacy/RelayInfo.ts | 3 + packages/nostr/src/legacy/Subscriptions.ts | 176 --------- packages/nostr/src/legacy/Thread.ts | 56 --- packages/nostr/src/legacy/Util.ts | 8 + packages/nostr/src/legacy/index.ts | 10 +- yarn.lock | 11 +- 77 files changed, 3141 insertions(+), 2343 deletions(-) delete mode 100644 .github/workflows/eslint.yaml rename .github/workflows/{formatting.yaml => test-lint.yaml} (61%) create mode 100644 packages/app/src/Element/SubDebug.css create mode 100644 packages/app/src/Element/SubDebug.tsx create mode 100644 packages/app/src/Feed/RelaysFeedFollows.tsx delete mode 100644 packages/app/src/Feed/Subscription.ts delete mode 100644 packages/app/src/Feed/useNotelistSubscription.ts create mode 100644 packages/app/src/Hooks/useNotelistSubscription.ts create mode 100644 packages/app/src/Hooks/useRelaysForFollows.tsx create mode 100644 packages/app/src/Hooks/useRequestBuilder.tsx create mode 100644 packages/app/src/Hooks/useSystemState.tsx create mode 100644 packages/app/src/Hooks/useTimelineWindow.tsx delete mode 100644 packages/app/src/Pages/EventPage.tsx create mode 100644 packages/app/src/State/Relays/index.ts delete mode 100644 packages/app/src/System.ts create mode 100644 packages/app/src/System/EventExt.ts create mode 100644 packages/app/src/System/NoteCollection.test.ts create mode 100644 packages/app/src/System/NoteCollection.ts create mode 100644 packages/app/src/System/ProfileCache.ts create mode 100644 packages/app/src/System/Query.ts create mode 100644 packages/app/src/System/RequestBuilder.test.ts create mode 100644 packages/app/src/System/RequestBuilder.ts create mode 100644 packages/app/src/System/RequestSplitter.test.ts create mode 100644 packages/app/src/System/RequestSplitter.ts create mode 100644 packages/app/src/System/index.ts delete mode 100644 packages/nostr/src/legacy/Event.ts delete mode 100644 packages/nostr/src/legacy/Subscriptions.ts delete mode 100644 packages/nostr/src/legacy/Thread.ts diff --git a/.github/workflows/eslint.yaml b/.github/workflows/eslint.yaml deleted file mode 100644 index 60f342720..000000000 --- a/.github/workflows/eslint.yaml +++ /dev/null @@ -1,18 +0,0 @@ -name: Linting -on: - pull_request: -jobs: - formatting: - timeout-minutes: 15 - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Setup Node.js - uses: actions/setup-node@v3 - with: - node-version: 16 - - name: Install Dependencies - run: yarn install - - name: Check Eslint - run: yarn workspace @snort/app eslint diff --git a/.github/workflows/formatting.yaml b/.github/workflows/test-lint.yaml similarity index 61% rename from .github/workflows/formatting.yaml rename to .github/workflows/test-lint.yaml index 27c70bc1f..352a0a41b 100644 --- a/.github/workflows/formatting.yaml +++ b/.github/workflows/test-lint.yaml @@ -1,8 +1,8 @@ -name: Formatting +name: Test+Lint on: pull_request: jobs: - formatting: + test_and_lint: timeout-minutes: 15 runs-on: ubuntu-latest steps: @@ -14,5 +14,11 @@ jobs: node-version: 16 - name: Install Dependencies run: yarn install + - name: Build packages + run: yarn workspace @snort/nostr build + - name: Run tests + run: yarn workspace @snort/app test + - name: Check Eslint + run: yarn workspace @snort/app eslint - name: Check Formatting run: yarn workspace @snort/app prettier --check . diff --git a/packages/app/package.json b/packages/app/package.json index 2606fa5f6..8a9e094eb 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -20,6 +20,7 @@ "bech32": "^2.0.0", "dexie": "^3.2.2", "dexie-react-hooks": "^1.1.1", + "events": "^3.3.0", "light-bolt11-decoder": "^2.1.0", "qr-code-styling": "^1.6.0-rc.1", "react": "^18.2.0", @@ -30,9 +31,9 @@ "react-query": "^3.39.2", "react-redux": "^8.0.5", "react-router-dom": "^6.5.0", - "react-scripts": "5.0.1", "react-textarea-autosize": "^8.4.0", "react-twitter-embed": "^4.0.4", + "throttle-debounce": "^5.0.0", "unist-util-visit": "^4.1.2", "use-long-press": "^2.0.3", "uuid": "^9.0.0", @@ -94,6 +95,7 @@ "lint-staged": ">=10", "prettier": "2.8.3", "react-app-rewired": "^2.2.1", + "react-scripts": "5.0.1", "typescript": "^4.9.4" }, "lint-staged": { diff --git a/packages/app/src/Db/index.ts b/packages/app/src/Db/index.ts index 7a3b04eb5..f919369c8 100644 --- a/packages/app/src/Db/index.ts +++ b/packages/app/src/Db/index.ts @@ -1,9 +1,9 @@ import Dexie, { Table } from "dexie"; -import { u256 } from "@snort/nostr"; +import { FullRelaySettings, HexKey, u256 } from "@snort/nostr"; import { MetadataCache } from "State/Users"; export const NAME = "snortDB"; -export const VERSION = 4; +export const VERSION = 6; export interface SubCache { id: string; @@ -12,13 +12,29 @@ export interface SubCache { since?: number; } +export interface RelayMetrics { + addr: string; + events: number; + disconnects: number; + latency: number[]; +} + +export interface UsersRelays { + pubkey: HexKey; + relays: FullRelaySettings[]; +} + const STORES = { users: "++pubkey, name, display_name, picture, nip05, npub", + relays: "++addr", + userRelays: "++pubkey", }; export class SnortDB extends Dexie { ready = false; users!: Table; + relayMetrics!: Table; + userRelays!: Table; constructor() { super(NAME); diff --git a/packages/app/src/Element/Bookmarks.tsx b/packages/app/src/Element/Bookmarks.tsx index e9627ba60..238714175 100644 --- a/packages/app/src/Element/Bookmarks.tsx +++ b/packages/app/src/Element/Bookmarks.tsx @@ -1,10 +1,9 @@ import { useState, useMemo, ChangeEvent } from "react"; import { useSelector } from "react-redux"; import { FormattedMessage } from "react-intl"; - -import { dedupeByPubkey } from "Util"; -import Note from "Element/Note"; import { HexKey, TaggedRawEvent } from "@snort/nostr"; + +import Note from "Element/Note"; import { RootState } from "State/Store"; import { UserCache } from "State/Users/UserCache"; @@ -12,15 +11,15 @@ import messages from "./messages"; interface BookmarksProps { pubkey: HexKey; - bookmarks: TaggedRawEvent[]; - related: TaggedRawEvent[]; + bookmarks: readonly TaggedRawEvent[]; + related: readonly TaggedRawEvent[]; } const Bookmarks = ({ pubkey, bookmarks, related }: BookmarksProps) => { const [onlyPubkey, setOnlyPubkey] = useState("all"); const loginPubKey = useSelector((s: RootState) => s.login.publicKey); const ps = useMemo(() => { - return dedupeByPubkey(bookmarks).map(ev => ev.pubkey); + return [...new Set(bookmarks.map(ev => ev.pubkey))]; }, [bookmarks]); function renderOption(p: HexKey) { diff --git a/packages/app/src/Element/DM.tsx b/packages/app/src/Element/DM.tsx index ddadb92d3..8ebb5498d 100644 --- a/packages/app/src/Element/DM.tsx +++ b/packages/app/src/Element/DM.tsx @@ -3,14 +3,13 @@ import { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useIntl } from "react-intl"; import { useInView } from "react-intersection-observer"; +import { HexKey, TaggedRawEvent } from "@snort/nostr"; import useEventPublisher from "Feed/EventPublisher"; -import { Event } from "@snort/nostr"; import NoteTime from "Element/NoteTime"; import Text from "Element/Text"; import { setLastReadDm } from "Pages/MessagesPage"; import { RootState } from "State/Store"; -import { HexKey, TaggedRawEvent } from "@snort/nostr"; import { incDmInteraction } from "State/Login"; import { unwrap } from "Util"; @@ -32,11 +31,10 @@ export default function DM(props: DMProps) { const otherPubkey = isMe ? pubKey : unwrap(props.data.tags.find(a => a[0] === "p")?.[1]); async function decrypt() { - const e = new Event(props.data); - const decrypted = await publisher.decryptDm(e); + const decrypted = await publisher.decryptDm(props.data); setContent(decrypted || ""); if (!isMe) { - setLastReadDm(e.PubKey); + setLastReadDm(props.data.pubkey); dispatch(incDmInteraction()); } } diff --git a/packages/app/src/Element/HyperText.tsx b/packages/app/src/Element/HyperText.tsx index e5a9d70b7..05a16ecd6 100644 --- a/packages/app/src/Element/HyperText.tsx +++ b/packages/app/src/Element/HyperText.tsx @@ -111,25 +111,12 @@ export default function HyperText({ link, creator }: { link: string; creator: He ); } - } else if (tweetId && !pref.rewriteTwitterPosts) { + } else if (tweetId) { return (
); - } else if (pref.rewriteTwitterPosts && url.hostname == "twitter.com") { - url.host = "nitter.net"; - return ( - e.stopPropagation()} - target="_blank" - rel="noreferrer" - className="ext"> - {url.toString()} - - ); } else if (youtubeId) { return (