diff --git a/packages/app/src/Pages/settings/Cache.tsx b/packages/app/src/Pages/settings/Cache.tsx index 032c16f3..ed415354 100644 --- a/packages/app/src/Pages/settings/Cache.tsx +++ b/packages/app/src/Pages/settings/Cache.tsx @@ -65,10 +65,17 @@ function RelayCacheStats() {
- {myEvents &&

- - }} />

} + {myEvents && ( +

+ , + }} + /> +

+ )} @@ -99,7 +106,7 @@ function RelayCacheStats() {
- { }}> + {}}> , path: "follows-relay-health", - } + }, ], }, { - title: , items: [ { icon: "repost", iconBg: "bg-blue-800", message: , - path: "sync-account" - } - ] - } + path: "sync-account", + }, + ], + }, ] as SettingsMenuItems; export const ToolsPages = [ @@ -62,8 +61,8 @@ export const ToolsPages = [ }, { path: "sync-account", - element: - } + element: , + }, ] as Array; export function ToolsPage() { diff --git a/packages/app/src/Pages/settings/tools/sync-account.tsx b/packages/app/src/Pages/settings/tools/sync-account.tsx index 33e274c7..aa27b1e0 100644 --- a/packages/app/src/Pages/settings/tools/sync-account.tsx +++ b/packages/app/src/Pages/settings/tools/sync-account.tsx @@ -1,5 +1,5 @@ import { unwrap } from "@snort/shared"; -import { RangeSync, TaggedNostrEvent } from "@snort/system" +import { RangeSync, TaggedNostrEvent } from "@snort/system"; import { SnortContext } from "@snort/system-react"; import { useContext, useState } from "react"; import { FormattedMessage, FormattedNumber } from "react-intl"; @@ -9,40 +9,56 @@ import useLogin from "@/Hooks/useLogin"; import { SearchRelays } from "@/Utils/Const"; export default function SyncAccountTool() { - const system = useContext(SnortContext); - const login = useLogin(); - const [scan, setScan] = useState(); - const [results, setResults] = useState>([]); + const system = useContext(SnortContext); + const login = useLogin(); + const [scan, setScan] = useState(); + const [results, setResults] = useState>([]); - async function start() { - const relays = Object.entries(login.relays.item).filter(([, v]) => v.write).map(([k,]) => k); - const sync = new RangeSync(system); - sync.on("event", evs => { - setResults(r => [...r, ...evs]); - }); - sync.on("scan", t => setScan(t)); - await sync.sync({ - authors: [unwrap(login.publicKey)], - relays: [...relays, ...Object.keys(CONFIG.defaultRelays), ...SearchRelays] - }) - } - return <> -

- -

+ async function start() { + const relays = Object.entries(login.relays.item) + .filter(([, v]) => v.write) + .map(([k]) => k); + const sync = new RangeSync(system); + sync.on("event", evs => { + setResults(r => [...r, ...evs]); + }); + sync.on("scan", t => setScan(t)); + await sync.sync({ + authors: [unwrap(login.publicKey)], + relays: [...relays, ...Object.keys(CONFIG.defaultRelays), ...SearchRelays], + }); + } + return ( + <> +

+ +

- {results.length > 0 &&

- - }} /> -

} - {scan !== undefined &&

- -

} - - - + {results.length > 0 && ( +

+ , + }} + /> +

+ )} + {scan !== undefined && ( +

+ +

+ )} + + + -} \ No newline at end of file + ); +} diff --git a/packages/app/src/Utils/Const.ts b/packages/app/src/Utils/Const.ts index e92097d7..2b4c728c 100644 --- a/packages/app/src/Utils/Const.ts +++ b/packages/app/src/Utils/Const.ts @@ -31,11 +31,7 @@ export const SnortPubKey = "npub1sn0rtcjcf543gj4wsg7fa59s700d5ztys5ctj0g69g2x680 /** * Default search relays */ -export const SearchRelays = [ - "wss://relay.nostr.band/", - "wss://search.nos.today/", - "wss://relay.noswhere.com/", -]; +export const SearchRelays = ["wss://relay.nostr.band/", "wss://search.nos.today/", "wss://relay.noswhere.com/"]; export const DeveloperAccounts = [ "63fe6318dc58583cfe16810f86dd09e18bfd76aabc24a0081ce2856f330504ed", // kieran diff --git a/packages/system/src/outbox/outbox-model.ts b/packages/system/src/outbox/outbox-model.ts index 5e961f91..f1c25de5 100644 --- a/packages/system/src/outbox/outbox-model.ts +++ b/packages/system/src/outbox/outbox-model.ts @@ -62,7 +62,7 @@ export class OutboxModel extends BaseRequestRouter { const topRelays = [...relayUserMap.entries()].sort(([, v], [, v1]) => v1.size - v.size); if (missing.length > 0) { - this.#log("No relay metadata found, outbox model will not work for %O", missing) + this.#log("No relay metadata found, outbox model will not work for %O", missing); } // - count keys per relay // - pick n top relays @@ -101,9 +101,11 @@ export class OutboxModel extends BaseRequestRouter { return [filter]; } - const topWriteRelays = this.pickTopRelays(unwrap(authors), + const topWriteRelays = this.pickTopRelays( + unwrap(authors), pickN ?? DefaultPickNRelays, - pattern === "inbox" ? "read" : "write"); + pattern === "inbox" ? "read" : "write", + ); const pickedRelays = dedupe(topWriteRelays.flatMap(a => a.relays)); const picked = pickedRelays.map(a => { @@ -111,7 +113,7 @@ export class OutboxModel extends BaseRequestRouter { return { ...filter, [key]: keysOnPickedRelay, - relays: appendDedupe(filter.relays, [a]) + relays: appendDedupe(filter.relays, [a]), } as ReqFilter; }); const noRelays = dedupe(topWriteRelays.filter(a => a.relays.length === 0).map(a => a.key)); @@ -175,7 +177,7 @@ export class OutboxModel extends BaseRequestRouter { await this.updateRelayLists(recipients); const relays = this.pickTopRelays(recipients, pickN ?? DefaultPickNRelays, "read"); const ret = removeUndefined(dedupe(relays.map(a => a.relays).flat())); - + this.#log("Picked: pattern=%s, input=%O, output=%O", "inbox", ev, ret); return ret; } diff --git a/packages/system/src/profile-cache.ts b/packages/system/src/profile-cache.ts index fc13bb3e..4496948e 100644 --- a/packages/system/src/profile-cache.ts +++ b/packages/system/src/profile-cache.ts @@ -19,10 +19,7 @@ export class ProfileLoaderService extends BackgroundLoader { override buildSub(missing: string[]): RequestBuilder { const sub = new RequestBuilder(`profiles`); - sub.withFilter() - .kinds([EventKind.SetMetadata]) - .authors(missing) - .relay(MetadataRelays); + sub.withFilter().kinds([EventKind.SetMetadata]).authors(missing).relay(MetadataRelays); return sub; } diff --git a/packages/system/src/range-sync.ts b/packages/system/src/range-sync.ts index d29a2c68..ecda6426 100644 --- a/packages/system/src/range-sync.ts +++ b/packages/system/src/range-sync.ts @@ -8,63 +8,63 @@ import { ReqFilter, RequestBuilder, SystemInterface, TaggedNostrEvent } from "." const NostrBirthday: number = new Date(2021, 1, 1).getTime() / 1000; interface RangeSyncEvents { - event: (ev: Array) => void - scan: (from: number) => void + event: (ev: Array) => void; + scan: (from: number) => void; } /** * A simple time based sync for pulling lots of data from nostr */ export class RangeSync extends EventEmitter { - #start: number = NostrBirthday; - #windowSize: number = 60 * 60 * 12; + #start: number = NostrBirthday; + #windowSize: number = 60 * 60 * 12; - constructor(readonly system: SystemInterface) { - super(); + constructor(readonly system: SystemInterface) { + super(); + } + + /** + * Set window size in seconds + */ + setWindowSize(n: number) { + if (n < 60) { + throw new Error("Window size too small"); + } + this.#windowSize = n; + } + + /** + * Set start time for range sync + * @param n Unix timestamp + */ + setStartPoint(n: number) { + if (n < NostrBirthday) { + throw new Error("Start point cannot be before nostr's birthday"); + } + this.#start = n; + } + + /** + * Request to sync with a given filter + */ + async sync(filter: ReqFilter) { + if (filter.since !== undefined || filter.until !== undefined || filter.limit !== undefined) { + throw new Error("Filter must not contain since/until/limit"); } - /** - * Set window size in seconds - */ - setWindowSize(n: number) { - if (n < 60) { - throw new Error("Window size too small"); - } - this.#windowSize = n; + if (!this.system.requestRouter) { + throw new Error("RangeSync cannot work without request router!"); } - /** - * Set start time for range sync - * @param n Unix timestamp - */ - setStartPoint(n: number) { - if (n < NostrBirthday) { - throw new Error("Start point cannot be before nostr's birthday"); - } - this.#start = n; + const now = unixNow(); + for (let end = now; end > this.#start; end -= this.#windowSize) { + const rb = new RequestBuilder(`range-query:${end}`); + rb.withBareFilter(filter) + .since(end - this.#windowSize) + .until(end); + this.emit("scan", end); + const results = await this.system.Fetch(rb); + this.emit("event", results); } - - /** - * Request to sync with a given filter - */ - async sync(filter: ReqFilter) { - if (filter.since !== undefined || filter.until !== undefined || filter.limit !== undefined) { - throw new Error("Filter must not contain since/until/limit"); - } - - if (!this.system.requestRouter) { - throw new Error("RangeSync cannot work without request router!"); - } - - const now = unixNow(); - for (let end = now; end > this.#start; end -= this.#windowSize) { - const rb = new RequestBuilder(`range-query:${end}`); - rb.withBareFilter(filter) - .since(end - this.#windowSize) - .until(end); - this.emit("scan", end); - const results = await this.system.Fetch(rb); - this.emit("event", results); - } - } -} \ No newline at end of file + } +}