diff --git a/packages/app/public/bench.html b/packages/app/public/bench.html index 00b952b0..95159cd9 100644 --- a/packages/app/public/bench.html +++ b/packages/app/public/bench.html @@ -1,10 +1,10 @@ - + - - - Snort Benchmarks - - - Check console - - \ No newline at end of file + + + Snort Benchmarks + + + Check console + + diff --git a/packages/app/public/index.html b/packages/app/public/index.html index ee84c3b7..b5a13832 100644 --- a/packages/app/public/index.html +++ b/packages/app/public/index.html @@ -1,4 +1,4 @@ - + diff --git a/packages/app/src/Cache/GiftWrapCache.ts b/packages/app/src/Cache/GiftWrapCache.ts index 71e82b45..67f00b91 100644 --- a/packages/app/src/Cache/GiftWrapCache.ts +++ b/packages/app/src/Cache/GiftWrapCache.ts @@ -38,7 +38,7 @@ export class GiftWrapCache extends RefreshFeedCache { } catch (e) { console.debug(e, v); } - }) + }), ) ) .filter(a => a !== undefined) diff --git a/packages/app/src/Element/CashuNuts.tsx b/packages/app/src/Element/CashuNuts.tsx index 8674657b..4e124e38 100644 --- a/packages/app/src/Element/CashuNuts.tsx +++ b/packages/app/src/Element/CashuNuts.tsx @@ -26,7 +26,7 @@ export default function CashuNuts({ token }: { token: string }) { e.stopPropagation(); const lnurl = profile?.lud16 ?? ""; const url = `https://redeem.cashu.me?token=${encodeURIComponent(token)}&lightning=${encodeURIComponent( - lnurl + lnurl, )}&autopay=yes`; window.open(url, "_blank"); } diff --git a/packages/app/src/Element/FollowButton.tsx b/packages/app/src/Element/FollowButton.tsx index 64a1dc38..c2cb0e54 100644 --- a/packages/app/src/Element/FollowButton.tsx +++ b/packages/app/src/Element/FollowButton.tsx @@ -34,7 +34,7 @@ export default function FollowButton(props: FollowButtonProps) { if (publisher) { const ev = await publisher.contactList( follows.item.filter(a => a !== pubkey), - relays.item + relays.item, ); System.BroadcastEvent(ev); } diff --git a/packages/app/src/Element/Nip5Service.tsx b/packages/app/src/Element/Nip5Service.tsx index 19318901..5a389c44 100644 --- a/packages/app/src/Element/Nip5Service.tsx +++ b/packages/app/src/Element/Nip5Service.tsx @@ -261,9 +261,7 @@ export default function Nip5Service(props: Nip05ServiceProps) { />  @  )} diff --git a/packages/app/src/Element/Note.tsx b/packages/app/src/Element/Note.tsx index db857738..85deb9dc 100644 --- a/packages/app/src/Element/Note.tsx +++ b/packages/app/src/Element/Note.tsx @@ -135,7 +135,7 @@ export function NoteInner(props: NoteProps) { { [Reaction.Positive]: [] as TaggedNostrEvent[], [Reaction.Negative]: [] as TaggedNostrEvent[], - } + }, ); return { [Reaction.Positive]: dedupeByPubkey(result[Reaction.Positive]), @@ -150,7 +150,7 @@ export function NoteInner(props: NoteProps) { ...getReactions(related, ev.id, EventKind.TextNote).filter(e => e.tags.some(tagFilterOfTextRepost(e, ev.id))), ...getReactions(related, ev.id, EventKind.Repost), ]), - [related, ev] + [related, ev], ); const zaps = useMemo(() => { const sortedZaps = getReactions(related, ev.id, EventKind.ZapReceipt) @@ -241,7 +241,7 @@ export function NoteInner(props: NoteProps) { function goToEvent( e: React.MouseEvent, eTarget: TaggedNostrEvent, - isTargetAllowed: boolean = e.target === e.currentTarget + isTargetAllowed: boolean = e.target === e.currentTarget, ) { if (!isTargetAllowed || opt?.canClick === false) { return; diff --git a/packages/app/src/Element/NoteCreator.css b/packages/app/src/Element/NoteCreator.css index e879558e..44417017 100644 --- a/packages/app/src/Element/NoteCreator.css +++ b/packages/app/src/Element/NoteCreator.css @@ -2,7 +2,8 @@ border: 1px solid transparent; border-radius: 12px; box-shadow: 0px 0px 6px 1px rgba(182, 108, 156, 0.3); - background: linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box, + background: + linear-gradient(var(--gray-superdark), var(--gray-superdark)) padding-box, linear-gradient(90deg, #ef9644, #fd7c49, #ff5e58, #ff3b70, #ff088e, #eb00b1, #c31ed5, #7b41f6) border-box; } diff --git a/packages/app/src/Element/NoteCreator.tsx b/packages/app/src/Element/NoteCreator.tsx index d9a5ab85..3ea2e7dd 100644 --- a/packages/app/src/Element/NoteCreator.tsx +++ b/packages/app/src/Element/NoteCreator.tsx @@ -76,8 +76,8 @@ export function NoteCreator() { setError( formatMessage({ defaultMessage: "Invalid LNURL", - }) - ) + }), + ), ); return; } @@ -256,9 +256,9 @@ export function NoteCreator() { ? false : // otherwise return selectedCustomRelays with target relay added / removed a.filter(el => - el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el) - ) - ) + el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el), + ), + ), ) } /> diff --git a/packages/app/src/Element/NoteFooter.tsx b/packages/app/src/Element/NoteFooter.tsx index 6e74f1f1..068c8ac5 100644 --- a/packages/app/src/Element/NoteFooter.tsx +++ b/packages/app/src/Element/NoteFooter.tsx @@ -71,7 +71,7 @@ export default function NoteFooter(props: NoteFooterProps) { }, { captureEvent: true, - } + }, ); function hasReacted(emoji: string) { diff --git a/packages/app/src/Element/NoteReaction.tsx b/packages/app/src/Element/NoteReaction.tsx index b639b951..a2992c7f 100644 --- a/packages/app/src/Element/NoteReaction.tsx +++ b/packages/app/src/Element/NoteReaction.tsx @@ -46,7 +46,7 @@ export default function NoteReaction(props: NoteReactionProps) { * Some clients embed the reposted note in the content */ function extractRoot() { - if(!inView) return null; + if (!inView) return null; if (ev?.kind === EventKind.Repost && ev.content.length > 0 && ev.content !== "#[0]") { try { const r: NostrEvent = JSON.parse(ev.content); @@ -66,7 +66,7 @@ export default function NoteReaction(props: NoteReactionProps) { const root = useMemo(() => extractRoot(), [ev, props.root, inView]); if (!inView) { - return (
) + return
; } const isOpMuted = root && isMuted(root.pubkey); const shouldNotBeRendered = isOpMuted || root?.kind !== EventKind.TextNote; diff --git a/packages/app/src/Element/Poll.tsx b/packages/app/src/Element/Poll.tsx index a72cf2cd..d1c163db 100644 --- a/packages/app/src/Element/Poll.tsx +++ b/packages/app/src/Element/Poll.tsx @@ -47,15 +47,15 @@ export default function Poll(props: PollProps) { }, { amount, - } - ) + }, + ), ); } setVoting(opt); const r = Object.keys(relays.item); const zap = await publisher.zap(amount * 1000, props.ev.pubkey, r, props.ev.id, undefined, eb => - eb.tag(["poll_option", opt.toString()]) + eb.tag(["poll_option", opt.toString()]), ); const lnurl = props.ev.tags.find(a => a[0] === "zap")?.[1] || pollerProfile?.lud16 || pollerProfile?.lud06; @@ -68,7 +68,7 @@ export default function Poll(props: PollProps) { throw new Error( formatMessage({ defaultMessage: "Can't vote because LNURL service does not support zaps", - }) + }), ); } @@ -85,7 +85,7 @@ export default function Poll(props: PollProps) { setError( formatMessage({ defaultMessage: "Failed to send vote", - }) + }), ); } } finally { diff --git a/packages/app/src/Element/PubkeyList.tsx b/packages/app/src/Element/PubkeyList.tsx index 17648433..8a5d14df 100644 --- a/packages/app/src/Element/PubkeyList.tsx +++ b/packages/app/src/Element/PubkeyList.tsx @@ -34,7 +34,7 @@ export default function PubkeyList({ ev, className }: { ev: NostrEvent; classNam pk, Object.keys(login.relays.item), undefined, - `Zap from ${hexToBech32("note", ev.id)}` + `Zap from ${hexToBech32("note", ev.id)}`, ); const invoice = await svc.getInvoice(amtSend, undefined, zap); if (invoice.pr) { diff --git a/packages/app/src/Element/ReBroadcaster.tsx b/packages/app/src/Element/ReBroadcaster.tsx index b3ad9dab..53029aeb 100644 --- a/packages/app/src/Element/ReBroadcaster.tsx +++ b/packages/app/src/Element/ReBroadcaster.tsx @@ -55,9 +55,9 @@ export function ReBroadcaster() { ? false : // otherwise return selectedCustomRelays with target relay added / removed a.filter(el => - el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el) - ) - ) + el === r ? e.target.checked : !selectedCustomRelays || selectedCustomRelays.includes(el), + ), + ), ) } /> diff --git a/packages/app/src/Element/Reactions.tsx b/packages/app/src/Element/Reactions.tsx index cd755b26..076089c2 100644 --- a/packages/app/src/Element/Reactions.tsx +++ b/packages/app/src/Element/Reactions.tsx @@ -60,7 +60,7 @@ const Reactions = ({ show, setShow, positive, negative, reposts, zaps }: Reactio value: 3, }, ] - : [] + : [], ); const [tab, setTab] = useState(tabs[0]); diff --git a/packages/app/src/Element/Relay.tsx b/packages/app/src/Element/Relay.tsx index 1fca237a..0de4d288 100644 --- a/packages/app/src/Element/Relay.tsx +++ b/packages/app/src/Element/Relay.tsx @@ -22,7 +22,7 @@ export default function Relay(props: RelayProps) { const navigate = useNavigate(); const login = useLogin(); const relaySettings = unwrap( - login.relays.item[props.addr] ?? System.Sockets.find(a => a.address === props.addr)?.settings ?? {} + login.relays.item[props.addr] ?? System.Sockets.find(a => a.address === props.addr)?.settings ?? {}, ); const state = useRelayState(props.addr); const name = useMemo(() => getRelayName(props.addr), [props.addr]); @@ -34,7 +34,7 @@ export default function Relay(props: RelayProps) { ...login.relays.item, [props.addr]: o, }, - unixNowMs() + unixNowMs(), ); } diff --git a/packages/app/src/Element/SendSats.tsx b/packages/app/src/Element/SendSats.tsx index 368095d9..1c0823f0 100644 --- a/packages/app/src/Element/SendSats.tsx +++ b/packages/app/src/Element/SendSats.tsx @@ -285,7 +285,7 @@ export default function SendSats(props: SendSatsProps) { {makeTab(ZapType.AnonZap, )} {makeTab( ZapType.NonZap, - + , )} diff --git a/packages/app/src/Element/Thread.tsx b/packages/app/src/Element/Thread.tsx index ee6512b5..73532db7 100644 --- a/packages/app/src/Element/Thread.tsx +++ b/packages/app/src/Element/Thread.tsx @@ -243,7 +243,7 @@ export default function Thread() { if (t?.root?.key === "a" && t?.root?.value) { const parsed = t.root.value.split(":"); replyTo = thread.data?.find( - a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2] + a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2], )?.id; } if (replyTo) { @@ -264,7 +264,7 @@ export default function Thread() { thread.data?.find( ne => ne.id === currentId || - (link.type === NostrPrefix.Address && findTag(ne, "d") === currentId && ne.pubkey === link.author) + (link.type === NostrPrefix.Address && findTag(ne, "d") === currentId && ne.pubkey === link.author), ) ?? (location.state && "sig" in location.state ? (location.state as TaggedNostrEvent) : undefined); if (currentNote) { const currentThread = EventExt.extractThread(currentNote); @@ -280,7 +280,7 @@ export default function Thread() { if (replyTo.key === "a" && replyTo.value) { const parsed = replyTo.value.split(":"); return thread.data?.find( - a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2] + a => a.kind === Number(parsed[0]) && a.pubkey === parsed[1] && findTag(a, "d") === parsed[2], ); } if (replyTo.value) { @@ -348,7 +348,7 @@ export default function Thread() { notes={replies} related={getAllReactions( thread.data, - replies.map(a => a.id) + replies.map(a => a.id), )} chains={chains} onNavigate={navigateThread} diff --git a/packages/app/src/Element/Timeline.tsx b/packages/app/src/Element/Timeline.tsx index acdd1221..0b5c545a 100644 --- a/packages/app/src/Element/Timeline.tsx +++ b/packages/app/src/Element/Timeline.tsx @@ -47,7 +47,7 @@ const Timeline = (props: TimelineProps) => { ?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true)) .filter(a => props.ignoreModeration || !isMuted(a.pubkey)); }, - [props.postsOnly, muted, props.ignoreModeration] + [props.postsOnly, muted, props.ignoreModeration], ); const mainFeed = useMemo(() => { @@ -60,7 +60,7 @@ const Timeline = (props: TimelineProps) => { (id: u256) => { return (feed.related ?? []).filter(a => findTag(a, "e") === id); }, - [feed.related] + [feed.related], ); const liveStreams = useMemo(() => { return (feed.main ?? []).filter(a => a.kind === EventKind.LiveEvent && findTag(a, "status") === "live"); diff --git a/packages/app/src/Element/TimelineFollows.tsx b/packages/app/src/Element/TimelineFollows.tsx index 8866a285..c9649968 100644 --- a/packages/app/src/Element/TimelineFollows.tsx +++ b/packages/app/src/Element/TimelineFollows.tsx @@ -28,11 +28,11 @@ const TimelineFollows = (props: TimelineFollowsProps) => { const [latest, setLatest] = useState(unixNow()); const feed = useSyncExternalStore( cb => FollowsFeed.hook(cb, "*"), - () => FollowsFeed.snapshot() + () => FollowsFeed.snapshot(), ); const reactions = useReactions( "follows-feed-reactions", - feed.map(a => a.id) + feed.map(a => a.id), ); const system = useContext(SnortContext); const login = useLogin(); @@ -48,7 +48,7 @@ const TimelineFollows = (props: TimelineFollowsProps) => { ?.filter(a => (props.postsOnly ? !a.tags.some(b => b[0] === "e") : true)) .filter(a => !isMuted(a.pubkey) && login.follows.item.includes(a.pubkey)); }, - [props.postsOnly, muted, login.follows.timestamp] + [props.postsOnly, muted, login.follows.timestamp], ); const mainFeed = useMemo(() => { @@ -63,7 +63,7 @@ const TimelineFollows = (props: TimelineFollowsProps) => { (id: u256) => { return (reactions?.data ?? []).filter(a => findTag(a, "e") === id); }, - [reactions] + [reactions], ); const liveStreams = useMemo(() => { diff --git a/packages/app/src/Element/ZapstrEmbed.tsx b/packages/app/src/Element/ZapstrEmbed.tsx index 844b5b67..fa112e8a 100644 --- a/packages/app/src/Element/ZapstrEmbed.tsx +++ b/packages/app/src/Element/ZapstrEmbed.tsx @@ -17,7 +17,7 @@ export default function ZapstrEmbed({ ev }: { ev: NostrEvent }) { ev.tags.find(a => a[0] === "d")?.[1] ?? "", undefined, ev.kind, - ev.pubkey + ev.pubkey, ); return ( <> diff --git a/packages/app/src/Feed/BadgesFeed.ts b/packages/app/src/Feed/BadgesFeed.ts index d6905c5d..d180f160 100644 --- a/packages/app/src/Feed/BadgesFeed.ts +++ b/packages/app/src/Feed/BadgesFeed.ts @@ -23,7 +23,7 @@ export default function useProfileBadges(pubkey?: HexKey) { if (profileBadges.data) { return chunks( profileBadges.data.tags.filter(t => t[0] === "a" || t[0] === "e"), - 2 + 2, ).reduce((acc, [a, e]) => { return { ...acc, @@ -44,7 +44,7 @@ export default function useProfileBadges(pubkey?: HexKey) { } return acc; }, - { pubkeys: [], ds: [] } as BadgeAwards + { pubkeys: [], ds: [] } as BadgeAwards, ) as BadgeAwards; }, [profile]); @@ -77,7 +77,7 @@ export default function useProfileBadges(pubkey?: HexKey) { }) .filter( ({ award, badge }) => - badge && award.pubkey === badge.pubkey && award.tags.find(t => t[0] === "p" && t[1] === pubkey) + badge && award.pubkey === badge.pubkey && award.tags.find(t => t[0] === "p" && t[1] === pubkey), ) .map(({ badge }) => unwrap(badge)); } diff --git a/packages/app/src/Feed/FeedReactions.ts b/packages/app/src/Feed/FeedReactions.ts index cd32b57a..5faaeb00 100644 --- a/packages/app/src/Feed/FeedReactions.ts +++ b/packages/app/src/Feed/FeedReactions.ts @@ -13,7 +13,7 @@ export function useReactions(subId: string, ids: Array, others?: (rb: Re .kinds( pref.enableReactions ? [EventKind.Reaction, EventKind.Repost, EventKind.ZapReceipt] - : [EventKind.ZapReceipt, EventKind.Repost] + : [EventKind.ZapReceipt, EventKind.Repost], ) .tag("e", ids); } diff --git a/packages/app/src/Feed/FollowersFeed.ts b/packages/app/src/Feed/FollowersFeed.ts index 84544a29..e8b5c289 100644 --- a/packages/app/src/Feed/FollowersFeed.ts +++ b/packages/app/src/Feed/FollowersFeed.ts @@ -14,7 +14,7 @@ export default function useFollowersFeed(pubkey?: HexKey) { const followers = useMemo(() => { const contactLists = followersFeed.data?.filter( - a => a.kind === EventKind.ContactList && a.tags.some(b => b[0] === "p" && b[1] === pubkey) + a => a.kind === EventKind.ContactList && a.tags.some(b => b[0] === "p" && b[1] === pubkey), ); return [...new Set(contactLists?.map(a => a.pubkey))]; }, [followersFeed, pubkey]); diff --git a/packages/app/src/Feed/LoginFeed.ts b/packages/app/src/Feed/LoginFeed.ts index 8eceb79f..f1eda0d6 100644 --- a/packages/app/src/Feed/LoginFeed.ts +++ b/packages/app/src/Feed/LoginFeed.ts @@ -85,7 +85,7 @@ export default function useLoginFeed() { Nip4Chats.onEvent(loginFeed.data); const subs = loginFeed.data.filter( - a => a.kind === EventKind.SnortSubscriptions && a.pubkey === bech32ToHex(SnortPubKey) + a => a.kind === EventKind.SnortSubscriptions && a.pubkey === bech32ToHex(SnortPubKey), ); Promise.all( subs.map(async a => { @@ -97,7 +97,7 @@ export default function useLoginFeed() { ...ex, } as SubscriptionEvent; } - }) + }), ).then(a => addSubscription(login, ...a.filter(a => a !== undefined).map(unwrap))); } }, [loginFeed, publisher]); @@ -106,7 +106,7 @@ export default function useLoginFeed() { useEffect(() => { if (loginFeed.data) { const replies = loginFeed.data.filter( - a => a.kind === EventKind.TextNote && !isMuted(a.pubkey) && a.created_at > readNotifications + a => a.kind === EventKind.TextNote && !isMuted(a.pubkey) && a.created_at > readNotifications, ); replies.forEach(async nx => { const n = await makeNotification(nx); diff --git a/packages/app/src/Feed/ThreadFeed.ts b/packages/app/src/Feed/ThreadFeed.ts index 6603bd2d..8fe289a2 100644 --- a/packages/app/src/Feed/ThreadFeed.ts +++ b/packages/app/src/Feed/ThreadFeed.ts @@ -35,11 +35,11 @@ export default function useThreadFeed(link: NostrLink) { .kinds( pref.enableReactions ? [EventKind.Reaction, EventKind.TextNote, EventKind.Repost, EventKind.ZapReceipt] - : [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost] + : [EventKind.TextNote, EventKind.ZapReceipt, EventKind.Repost], ) .tag( "e", - allEvents.map(a => a.id) + allEvents.map(a => a.id), ); } if (trackingATags.length > 0) { @@ -50,7 +50,7 @@ export default function useThreadFeed(link: NostrLink) { .authors(parsed.map(a => a[1])) .tag( "d", - parsed.map(a => a[2]) + parsed.map(a => a[2]), ); sub.withFilter().tag("a", trackingATags); } @@ -85,7 +85,7 @@ export default function useThreadFeed(link: NostrLink) { id: b[1], relay: b[2], }; - }) + }), ) .flat(); const eTagsMissing = eTags.filter(a => !mainNotes.some(b => b.id === a.id)); diff --git a/packages/app/src/Feed/TimelineFeed.ts b/packages/app/src/Feed/TimelineFeed.ts index ea45ede4..6feb29da 100644 --- a/packages/app/src/Feed/TimelineFeed.ts +++ b/packages/app/src/Feed/TimelineFeed.ts @@ -43,7 +43,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel .kinds( subject.type === "profile_keyword" ? [EventKind.SetMetadata] - : [EventKind.TextNote, EventKind.Repost, EventKind.Polls] + : [EventKind.TextNote, EventKind.Repost, EventKind.Polls], ); if (subject.relay) { @@ -149,7 +149,7 @@ export default function useTimelineFeed(subject: TimelineSubject, options: Timel .map(a => unwrap(a)[1]); const repostsByKind1 = main.data .filter( - a => (a.kind === EventKind.Repost || a.kind === EventKind.TextNote) && a.tags.some(tagFilterOfTextRepost(a)) + a => (a.kind === EventKind.Repost || a.kind === EventKind.TextNote) && a.tags.some(tagFilterOfTextRepost(a)), ) .map(a => a.tags.find(tagFilterOfTextRepost(a))) .filter(a => a) diff --git a/packages/app/src/Hooks/useImgProxy.ts b/packages/app/src/Hooks/useImgProxy.ts index 090fa4f4..2f1a04cd 100644 --- a/packages/app/src/Hooks/useImgProxy.ts +++ b/packages/app/src/Hooks/useImgProxy.ts @@ -21,7 +21,7 @@ export default function useImgProxy() { const result = hmacSha256( utils.hexToBytes(unwrap(settings).key), utils.hexToBytes(unwrap(settings).salt), - te.encode(u) + te.encode(u), ); return urlSafe(base64.encode(result)); } diff --git a/packages/app/src/Hooks/useInteractionCache.tsx b/packages/app/src/Hooks/useInteractionCache.tsx index ab73a99c..64cc8122 100644 --- a/packages/app/src/Hooks/useInteractionCache.tsx +++ b/packages/app/src/Hooks/useInteractionCache.tsx @@ -15,7 +15,7 @@ export function useInteractionCache(pubkey?: HexKey, event?: u256) { const data = useSyncExternalStore( c => InteractionCache.hook(c, id), - () => InteractionCache.snapshot().find(a => a.id === id) + () => InteractionCache.snapshot().find(a => a.id === id), ) || EmptyInteraction; return { data: data, diff --git a/packages/app/src/Hooks/useLogin.tsx b/packages/app/src/Hooks/useLogin.tsx index b4ffedff..cf3a205e 100644 --- a/packages/app/src/Hooks/useLogin.tsx +++ b/packages/app/src/Hooks/useLogin.tsx @@ -4,6 +4,6 @@ import { useSyncExternalStore } from "react"; export default function useLogin() { return useSyncExternalStore( s => LoginStore.hook(s), - () => LoginStore.snapshot() + () => LoginStore.snapshot(), ); } diff --git a/packages/app/src/Login/MultiAccountStore.ts b/packages/app/src/Login/MultiAccountStore.ts index 3c35ec22..1b25a66c 100644 --- a/packages/app/src/Login/MultiAccountStore.ts +++ b/packages/app/src/Login/MultiAccountStore.ts @@ -96,7 +96,7 @@ export class MultiAccountStore extends ExternalStore { type: LoginSessionType, relays?: Record, remoteSignerRelays?: Array, - privateKey?: string + privateKey?: string, ) { if (this.#accounts.has(key)) { throw new Error("Already logged in with this pubkey"); diff --git a/packages/app/src/Nip05/ServiceProvider.ts b/packages/app/src/Nip05/ServiceProvider.ts index 610d4ed5..eda71371 100644 --- a/packages/app/src/Nip05/ServiceProvider.ts +++ b/packages/app/src/Nip05/ServiceProvider.ts @@ -97,7 +97,7 @@ export class ServiceProvider { path: string, method?: "GET" | string, body?: unknown, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { try { const rsp = await fetch(`${this.url}${path}`, { diff --git a/packages/app/src/Nip05/SnortServiceProvider.ts b/packages/app/src/Nip05/SnortServiceProvider.ts index d6efa314..f4de626a 100644 --- a/packages/app/src/Nip05/SnortServiceProvider.ts +++ b/packages/app/src/Nip05/SnortServiceProvider.ts @@ -54,7 +54,7 @@ export default class SnortServiceProvider extends ServiceProvider { path: string, method?: "GET" | string, body?: unknown, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { const auth = await this.#publisher.generic(eb => { eb.kind(EventKind.HttpAuthentication); diff --git a/packages/app/src/Pages/ErrorPage.tsx b/packages/app/src/Pages/ErrorPage.tsx index 687c068d..b3fcb541 100644 --- a/packages/app/src/Pages/ErrorPage.tsx +++ b/packages/app/src/Pages/ErrorPage.tsx @@ -25,7 +25,7 @@ const ErrorPage = () => { {JSON.stringify( error instanceof Error ? { name: error.name, message: error.message, stack: error.stack } : error, undefined, - " " + " ", )} } diff --git a/packages/app/src/Pages/Layout.tsx b/packages/app/src/Pages/Layout.tsx index 1df8c604..a428f941 100644 --- a/packages/app/src/Pages/Layout.tsx +++ b/packages/app/src/Pages/Layout.tsx @@ -89,7 +89,7 @@ export default function Layout() { useEffect(() => { const osTheme = window.matchMedia("(prefers-color-scheme: light)"); setTheme( - preferences.theme === "system" && osTheme.matches ? "light" : preferences.theme === "light" ? "light" : "dark" + preferences.theme === "system" && osTheme.matches ? "light" : preferences.theme === "light" ? "light" : "dark", ); osTheme.onchange = e => { @@ -174,7 +174,7 @@ const AccountHeader = () => { const hasNotifications = useMemo( () => latestNotification > readNotifications, - [latestNotification, readNotifications] + [latestNotification, readNotifications], ); const unreadDms = useMemo(() => (publicKey ? 0 : 0), [publicKey]); diff --git a/packages/app/src/Pages/LoginPage.tsx b/packages/app/src/Pages/LoginPage.tsx index ba004d7b..07401626 100644 --- a/packages/app/src/Pages/LoginPage.tsx +++ b/packages/app/src/Pages/LoginPage.tsx @@ -55,7 +55,7 @@ const Artwork: Array = [ export async function getNip05PubKey(addr: string): Promise { const [username, domain] = addr.split("@"); const rsp = await fetch( - `https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username.toLocaleLowerCase())}` + `https://${domain}/.well-known/nostr.json?name=${encodeURIComponent(username.toLocaleLowerCase())}`, ); if (rsp.ok) { const data = await rsp.json(); @@ -103,7 +103,7 @@ export default function LoginPage() { setError( formatMessage({ defaultMessage: "Unknown login error", - }) + }), ); } console.error(e); diff --git a/packages/app/src/Pages/Notifications.tsx b/packages/app/src/Pages/Notifications.tsx index 7af56025..23cefcd7 100644 --- a/packages/app/src/Pages/Notifications.tsx +++ b/packages/app/src/Pages/Notifications.tsx @@ -75,7 +75,7 @@ export default function NotificationsPage() { const notifications = useSyncExternalStore( c => Notifications.hook(c, "*"), - () => Notifications.snapshot() + () => Notifications.snapshot(), ); const timeKey = (ev: NostrEvent) => { @@ -119,7 +119,7 @@ function NotificationGroup({ evs }: { evs: Array }) { return zap.anonZap ? "anon" : zap.sender ?? a.pubkey; } return a.pubkey; - }) + }), ); const firstPubkey = pubkeys[0]; const firstPubkeyProfile = useUserProfile(inView ? (firstPubkey === "anon" ? "" : firstPubkey) : ""); @@ -213,7 +213,7 @@ function NotificationGroup({ evs }: { evs: Array }) { pubkeys.length - 1, firstPubkey === "anon" ? formatMessage({ defaultMessage: "Anon" }) - : getDisplayName(firstPubkeyProfile, firstPubkey) + : getDisplayName(firstPubkeyProfile, firstPubkey), )} )} diff --git a/packages/app/src/Pages/ProfilePage.tsx b/packages/app/src/Pages/ProfilePage.tsx index 434b816b..b5655eec 100644 --- a/packages/app/src/Pages/ProfilePage.tsx +++ b/packages/app/src/Pages/ProfilePage.tsx @@ -221,7 +221,7 @@ export default function ProfilePage() { } as { [key: string]: Tab }; const [tab, setTab] = useState(ProfileTab.Notes); const optionalTabs = [ProfileTab.Zaps, ProfileTab.Relays, ProfileTab.Bookmarks, ProfileTab.Muted].filter(a => - unwrap(a) + unwrap(a), ) as Tab[]; const horizontalScroll = useHorizontalScroll(); @@ -433,7 +433,7 @@ export default function ProfilePage() { type: TLVEntryType.Author, length: 64, value: id, - })}` + })}`, ) }> diff --git a/packages/app/src/Pages/ZapPool.tsx b/packages/app/src/Pages/ZapPool.tsx index f6703ee3..26664371 100644 --- a/packages/app/src/Pages/ZapPool.tsx +++ b/packages/app/src/Pages/ZapPool.tsx @@ -73,7 +73,7 @@ export default function ZapPoolPage() { const login = useLogin(); const zapPool = useSyncExternalStore( c => ZapPoolController.hook(c), - () => ZapPoolController.snapshot() + () => ZapPoolController.snapshot(), ); const { wallet } = useWallet(); diff --git a/packages/app/src/Pages/settings/Accounts.tsx b/packages/app/src/Pages/settings/Accounts.tsx index 9ad66696..ce113010 100644 --- a/packages/app/src/Pages/settings/Accounts.tsx +++ b/packages/app/src/Pages/settings/Accounts.tsx @@ -27,7 +27,7 @@ export default function AccountsPage() { setError( formatMessage({ defaultMessage: "Unknown login error", - }) + }), ); } console.error(e); diff --git a/packages/app/src/Pages/settings/handle/LNAddress.tsx b/packages/app/src/Pages/settings/handle/LNAddress.tsx index 562dc571..0cad952a 100644 --- a/packages/app/src/Pages/settings/handle/LNAddress.tsx +++ b/packages/app/src/Pages/settings/handle/LNAddress.tsx @@ -29,7 +29,7 @@ export default function LNForwardAddress({ handle }: { handle: ManageHandle }) { setError( formatMessage({ defaultMessage: "Invalid LNURL", - }) + }), ); return; } diff --git a/packages/app/src/Pages/settings/wallet/Cashu.tsx b/packages/app/src/Pages/settings/wallet/Cashu.tsx index 5a2f4efa..e1a6d411 100644 --- a/packages/app/src/Pages/settings/wallet/Cashu.tsx +++ b/packages/app/src/Pages/settings/wallet/Cashu.tsx @@ -39,7 +39,7 @@ const ConnectCashu = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/Pages/settings/wallet/LNC.tsx b/packages/app/src/Pages/settings/wallet/LNC.tsx index d33fa9fe..64c66d21 100644 --- a/packages/app/src/Pages/settings/wallet/LNC.tsx +++ b/packages/app/src/Pages/settings/wallet/LNC.tsx @@ -32,7 +32,7 @@ const ConnectLNC = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/Pages/settings/wallet/LNDHub.tsx b/packages/app/src/Pages/settings/wallet/LNDHub.tsx index b33462ec..d2c20f44 100644 --- a/packages/app/src/Pages/settings/wallet/LNDHub.tsx +++ b/packages/app/src/Pages/settings/wallet/LNDHub.tsx @@ -37,7 +37,7 @@ const ConnectLNDHub = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/Pages/settings/wallet/NWC.tsx b/packages/app/src/Pages/settings/wallet/NWC.tsx index 921d6c59..41419615 100644 --- a/packages/app/src/Pages/settings/wallet/NWC.tsx +++ b/packages/app/src/Pages/settings/wallet/NWC.tsx @@ -37,7 +37,7 @@ const ConnectNostrWallet = () => { setError( formatMessage({ defaultMessage: "Unknown error", - }) + }), ); } } diff --git a/packages/app/src/SnortApi.ts b/packages/app/src/SnortApi.ts index a69f71e6..f29a529e 100644 --- a/packages/app/src/SnortApi.ts +++ b/packages/app/src/SnortApi.ts @@ -88,7 +88,7 @@ export default class SnortApi { path: string, method?: "GET" | string, body?: { [key: string]: string }, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { if (!this.#publisher) { throw new Error("Publisher not set"); @@ -110,7 +110,7 @@ export default class SnortApi { path: string, method?: "GET" | string, body?: { [key: string]: string }, - headers?: { [key: string]: string } + headers?: { [key: string]: string }, ): Promise { const rsp = await fetch(`${this.#url}${path}`, { method: method, diff --git a/packages/app/src/SnortUtils/index.ts b/packages/app/src/SnortUtils/index.ts index 242b516f..65062b2a 100644 --- a/packages/app/src/SnortUtils/index.ts +++ b/packages/app/src/SnortUtils/index.ts @@ -50,7 +50,7 @@ export async function openFile(): Promise { } }, 300); }, - { once: true } + { once: true }, ); }); } @@ -209,7 +209,7 @@ export function dedupeByPubkey(events: TaggedNostrEvent[]) { list: [...list, ev], }; }, - { list: [], seen: new Set([]) } + { list: [], seen: new Set([]) }, ); return deduped.list as TaggedNostrEvent[]; } @@ -226,7 +226,7 @@ export function dedupeById(events: Array) { list: [...list, ev], }; }, - { list: [], seen: new Set([]) } + { list: [], seen: new Set([]) }, ); return deduped.list as Array; } @@ -487,7 +487,7 @@ export function kvToObject(o: string, sep?: string) { return [match[1], match[2]]; } return []; - }) + }), ) as T; } diff --git a/packages/app/src/Toaster.tsx b/packages/app/src/Toaster.tsx index eecb85ca..1d45a177 100644 --- a/packages/app/src/Toaster.tsx +++ b/packages/app/src/Toaster.tsx @@ -39,7 +39,7 @@ export const Toastore = new ToasterSlots(); export default function Toaster() { const toast = useSyncExternalStore( c => Toastore.hook(c), - () => Toastore.snapshot() + () => Toastore.snapshot(), ); return ( diff --git a/packages/app/src/Upload/VoidCat.ts b/packages/app/src/Upload/VoidCat.ts index 8eb8a11a..0fe5e010 100644 --- a/packages/app/src/Upload/VoidCat.ts +++ b/packages/app/src/Upload/VoidCat.ts @@ -12,7 +12,7 @@ import { magnetURIDecode } from "SnortUtils"; export default async function VoidCatUpload( file: File | Blob, filename: string, - publisher?: EventPublisher + publisher?: EventPublisher, ): Promise { const api = new VoidApi(VoidCatHost); const uploader = api.getUploader(file); diff --git a/packages/app/src/Wallet/Cashu.ts b/packages/app/src/Wallet/Cashu.ts index 541e65ba..b88dc13c 100644 --- a/packages/app/src/Wallet/Cashu.ts +++ b/packages/app/src/Wallet/Cashu.ts @@ -57,6 +57,6 @@ export interface NutStashBackup { mints: [ { mintURL: string; - } + }, ]; } diff --git a/packages/app/src/Wallet/LNCWallet.ts b/packages/app/src/Wallet/LNCWallet.ts index 342dfec8..6093289e 100644 --- a/packages/app/src/Wallet/LNCWallet.ts +++ b/packages/app/src/Wallet/LNCWallet.ts @@ -126,7 +126,7 @@ export class LNCWallet implements LNWallet { err => { this.#log(err); reject(err); - } + }, ); }); } diff --git a/packages/app/src/Wallet/NostrWalletConnect.ts b/packages/app/src/Wallet/NostrWalletConnect.ts index d2d1113d..5930e60d 100644 --- a/packages/app/src/Wallet/NostrWalletConnect.ts +++ b/packages/app/src/Wallet/NostrWalletConnect.ts @@ -182,7 +182,7 @@ export class NostrConnectWallet implements LNWallet { ], () => { // ignored - } + }, ); await this.#conn.SendAsync(evCommand); return await new Promise((resolve, reject) => { diff --git a/packages/app/src/Wallet/WebLN.ts b/packages/app/src/Wallet/WebLN.ts index e9708277..68db4212 100644 --- a/packages/app/src/Wallet/WebLN.ts +++ b/packages/app/src/Wallet/WebLN.ts @@ -84,7 +84,7 @@ export class WebLNWallet implements LNWallet { await window.webln?.makeInvoice({ amount: req.amount, defaultMemo: req.memo, - }) + }), ); if (rsp) { const invoice = prToWalletInvoice(rsp.paymentRequest); diff --git a/packages/app/src/Wallet/index.ts b/packages/app/src/Wallet/index.ts index ad8a01dd..cb5b98e0 100644 --- a/packages/app/src/Wallet/index.ts +++ b/packages/app/src/Wallet/index.ts @@ -248,7 +248,7 @@ window.document.addEventListener("close", () => { export function useWallet() { const wallet = useSyncExternalStore( h => Wallets.hook(h), - () => Wallets.snapshot() + () => Wallets.snapshot(), ); useEffect(() => { if (wallet.wallet?.isReady() === false && wallet.wallet.canAutoLogin()) { diff --git a/packages/app/src/ZapPoolController.ts b/packages/app/src/ZapPoolController.ts index 0695b5d7..617933bc 100644 --- a/packages/app/src/ZapPoolController.ts +++ b/packages/app/src/ZapPoolController.ts @@ -54,7 +54,7 @@ class ZapPool extends ExternalStore> { Toastore.push({ element: `Sent ${amtSend.toLocaleString()} sats to ${getDisplayName( profile, - x.pubkey + x.pubkey, )} from your zap pool`, expire: unixNow() + 10, icon: "zap", diff --git a/packages/app/src/benchmarks.ts b/packages/app/src/benchmarks.ts index c56a7415..1b6acb80 100644 --- a/packages/app/src/benchmarks.ts +++ b/packages/app/src/benchmarks.ts @@ -2,104 +2,113 @@ import { bytesToHex } from "@noble/hashes/utils"; import { DefaultQueryOptimizer, FlatReqFilter, QueryOptimizer, ReqFilter } from "@snort/system"; import { compress, expand_filter, flat_merge, get_diff, default as wasmInit } from "@snort/system-query"; import WasmPath from "@snort/system-query/pkg/system_query_bg.wasm"; -import { Bench } from 'tinybench'; +import { Bench } from "tinybench"; const WasmQueryOptimizer = { - expandFilter: (f: ReqFilter) => { - return expand_filter(f) as Array; - }, - getDiff: (prev: Array, next: Array) => { - return get_diff(prev, next) as Array; - }, - flatMerge: (all: Array) => { - return flat_merge(all) as Array; - }, - compress: (all: Array) => { - return compress(all) as Array; - } - } as QueryOptimizer; - - const makeOnePubkey = () => { - const rnd = globalThis.crypto.getRandomValues(new Uint8Array(32)); - return bytesToHex(rnd); - } + expandFilter: (f: ReqFilter) => { + return expand_filter(f) as Array; + }, + getDiff: (prev: Array, next: Array) => { + return get_diff(prev, next) as Array; + }, + flatMerge: (all: Array) => { + return flat_merge(all) as Array; + }, + compress: (all: Array) => { + return compress(all) as Array; + }, +} as QueryOptimizer; - const randomPubkeys = (() => { - const ret = []; - for(let x =0;x<50;x++) { - ret.push(makeOnePubkey()); - } - return ret; - })(); +const makeOnePubkey = () => { + const rnd = globalThis.crypto.getRandomValues(new Uint8Array(32)); + return bytesToHex(rnd); +}; - const testExpand = (q: QueryOptimizer) => { - q.expandFilter({ - kinds: [1,2,3], - authors: randomPubkeys - }); +const randomPubkeys = (() => { + const ret = []; + for (let x = 0; x < 50; x++) { + ret.push(makeOnePubkey()); } - const testGetDiff = (q: QueryOptimizer) => { - q.getDiff([{ + return ret; +})(); + +const testExpand = (q: QueryOptimizer) => { + q.expandFilter({ + kinds: [1, 2, 3], + authors: randomPubkeys, + }); +}; +const testGetDiff = (q: QueryOptimizer) => { + q.getDiff( + [ + { kinds: [1, 2, 3], - authors: randomPubkeys - }], [{ + authors: randomPubkeys, + }, + ], + [ + { kinds: [1, 2, 3, 4, 5], - authors: randomPubkeys - }]); -} + authors: randomPubkeys, + }, + ], + ); +}; const testFlatMerge = (q: QueryOptimizer) => { - q.flatMerge(q.expandFilter({ - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - })); -} + q.flatMerge( + q.expandFilter({ + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }), + ); +}; const testCompress = (q: QueryOptimizer) => { - q.compress([ - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - }, - { - kinds: [1, 6, 7, 6969], - authors: randomPubkeys - } - ]) -} + q.compress([ + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + { + kinds: [1, 6, 7, 6969], + authors: randomPubkeys, + }, + ]); +}; - const wasmSuite = new Bench({ time: 1_000 }); - const suite = new Bench({ time: 1_000 }); +const wasmSuite = new Bench({ time: 1_000 }); +const suite = new Bench({ time: 1_000 }); - const addTests = (s: Bench, q: QueryOptimizer) => { - s.add("expand", () => testExpand(q)); - s.add("get_diff", () => testGetDiff(q)); - s.add("flat_merge", () => testFlatMerge(q)); - s.add("compress", () => testCompress(q)); - } - - addTests(suite, DefaultQueryOptimizer); - addTests(wasmSuite, WasmQueryOptimizer); - - const runAll = async() => { - await wasmInit(WasmPath); +const addTests = (s: Bench, q: QueryOptimizer) => { + s.add("expand", () => testExpand(q)); + s.add("get_diff", () => testGetDiff(q)); + s.add("flat_merge", () => testFlatMerge(q)); + s.add("compress", () => testCompress(q)); +}; - console.log("DefaultQueryOptimizer"); - await suite.run(); - console.table(suite.table()); +addTests(suite, DefaultQueryOptimizer); +addTests(wasmSuite, WasmQueryOptimizer); - console.log("WasmQueryOptimizer"); - await wasmSuite.run(); - console.table(wasmSuite.table()); - }; - runAll().catch(console.error); \ No newline at end of file +const runAll = async () => { + await wasmInit(WasmPath); + + console.log("DefaultQueryOptimizer"); + await suite.run(); + console.table(suite.table()); + + console.log("WasmQueryOptimizer"); + await wasmSuite.run(); + console.table(wasmSuite.table()); +}; +runAll().catch(console.error); diff --git a/packages/app/src/chat/index.ts b/packages/app/src/chat/index.ts index f29f9122..d6b9326a 100644 --- a/packages/app/src/chat/index.ts +++ b/packages/app/src/chat/index.ts @@ -116,7 +116,7 @@ export function createChatLink(type: ChatType, ...params: Array) { type: TLVEntryType.Author, length: params[0].length, value: params[0], - } as TLVEntry + } as TLVEntry, )}`; } case ChatType.PrivateDirectMessage: { @@ -127,7 +127,7 @@ export function createChatLink(type: ChatType, ...params: Array) { type: TLVEntryType.Author, length: params[0].length, value: params[0], - } as TLVEntry + } as TLVEntry, )}`; } case ChatType.PrivateGroupChat: { @@ -139,8 +139,8 @@ export function createChatLink(type: ChatType, ...params: Array) { type: TLVEntryType.Author, length: a.length, value: a, - } as TLVEntry) - ) + }) as TLVEntry, + ), )}`; } } @@ -161,14 +161,14 @@ export function useNip4Chat() { const { publicKey } = useLogin(); return useSyncExternalStore( c => Nip4Chats.hook(c), - () => Nip4Chats.snapshot(publicKey) + () => Nip4Chats.snapshot(publicKey), ); } export function useNip29Chat() { return useSyncExternalStore( c => Nip29Chats.hook(c), - () => Nip29Chats.snapshot() + () => Nip29Chats.snapshot(), ); } @@ -176,7 +176,7 @@ export function useNip24Chat() { const { publicKey } = useLogin(); return useSyncExternalStore( c => Nip24Chats.hook(c), - () => Nip24Chats.snapshot(publicKey) + () => Nip24Chats.snapshot(publicKey), ); } diff --git a/packages/app/src/chat/nip24.ts b/packages/app/src/chat/nip24.ts index 9344e6fb..6281a6b7 100644 --- a/packages/app/src/chat/nip24.ts +++ b/packages/app/src/chat/nip24.ts @@ -39,8 +39,8 @@ export class Nip24ChatSystem extends ExternalStore> implements ChatS value: v, type: TLVEntryType.Author, length: v.length, - } as TLVEntry) - ) + }) as TLVEntry, + ), ); }; return dedupe(messages.map(a => chatId(a))).map(a => { @@ -72,7 +72,7 @@ export class Nip24ChatSystem extends ExternalStore> implements ChatS } as { t: number; title: string | undefined; - } + }, ); return { type: ChatType.PrivateDirectMessage, diff --git a/packages/app/src/chat/nip29.ts b/packages/app/src/chat/nip29.ts index 956472e7..261f7e86 100644 --- a/packages/app/src/chat/nip29.ts +++ b/packages/app/src/chat/nip29.ts @@ -46,12 +46,12 @@ export class Nip29ChatSystem extends ExternalStore> implements ChatS .map(a => a.tags.find(b => b[0] === "g")) .filter(a => a !== undefined) .map(a => unwrap(a)) - .map(a => `${a[2]}${a[1]}`) + .map(a => `${a[2]}${a[1]}`), ); return groups.map(g => { const [relay, channel] = g.split("/", 2); const messages = allMessages.filter( - a => `${a.tags.find(b => b[0] === "g")?.[2]}${a.tags.find(b => b[0] === "g")?.[1]}` === g + a => `${a.tags.find(b => b[0] === "g")?.[2]}${a.tags.find(b => b[0] === "g")?.[1]}` === g, ); const lastRead = lastReadInChat(g); return { diff --git a/packages/app/src/chat/nip4.ts b/packages/app/src/chat/nip4.ts index c766ba5a..f011d575 100644 --- a/packages/app/src/chat/nip4.ts +++ b/packages/app/src/chat/nip4.ts @@ -34,7 +34,7 @@ export class Nip4ChatSystem extends ExternalStore> implements ChatSy const dms = this.#cache.snapshot(); const dmSince = dms.reduce( (acc, v) => (v.created_at > acc && v.kind === EventKind.DirectMessage ? (acc = v.created_at) : acc), - 0 + 0, ); this.#log("Loading DMS since %s", new Date(dmSince * 1000)); @@ -49,12 +49,15 @@ export class Nip4ChatSystem extends ExternalStore> implements ChatSy listChats(pk: string): Chat[] { const myDms = this.#nip4Events(); - const chats = myDms.reduce((acc, v) => { - const chatId = inChatWith(v, pk); - acc[chatId] ??= []; - acc[chatId].push(v); - return acc; - }, {} as Record>); + const chats = myDms.reduce( + (acc, v) => { + const chatId = inChatWith(v, pk); + acc[chatId] ??= []; + acc[chatId].push(v); + return acc; + }, + {} as Record>, + ); return [...Object.entries(chats)].map(([k, v]) => Nip4ChatSystem.createChatObj(k, v)); } diff --git a/packages/app/src/index.tsx b/packages/app/src/index.tsx index 8435f23c..b86f360c 100644 --- a/packages/app/src/index.tsx +++ b/packages/app/src/index.tsx @@ -9,7 +9,16 @@ import { StrictMode } from "react"; import * as ReactDOM from "react-dom/client"; import { Provider } from "react-redux"; import { createBrowserRouter, RouterProvider } from "react-router-dom"; -import { EventPublisher, NostrSystem, ProfileLoaderService, Nip7Signer, PowWorker, QueryOptimizer, FlatReqFilter, ReqFilter } from "@snort/system"; +import { + EventPublisher, + NostrSystem, + ProfileLoaderService, + Nip7Signer, + PowWorker, + QueryOptimizer, + FlatReqFilter, + ReqFilter, +} from "@snort/system"; import { SnortContext } from "@snort/system-react"; import * as serviceWorkerRegistration from "serviceWorkerRegistration"; @@ -51,7 +60,7 @@ const WasmQueryOptimizer = { }, compress: (all: Array) => { return compress(all) as Array; - } + }, } as QueryOptimizer; /** @@ -193,5 +202,5 @@ root.render( - + , ); diff --git a/packages/app/webpack.config.js b/packages/app/webpack.config.js index 3c8edf01..d002edba 100644 --- a/packages/app/webpack.config.js +++ b/packages/app/webpack.config.js @@ -19,7 +19,7 @@ const config = { import: require.resolve("@snort/system/dist/pow-worker.js"), filename: "pow.js", }, - bench: "./src/benchmarks.ts" + bench: "./src/benchmarks.ts", }, target: "browserslist", mode: isProduction ? "production" : "development", @@ -156,7 +156,7 @@ const config = { extensions: ["...", ".tsx", ".ts", ".jsx", ".js"], modules: ["...", __dirname, path.resolve(__dirname, "src")], fallback: { crypto: false }, - } + }, }; module.exports = () => config; diff --git a/packages/system-query/pkg/package.json b/packages/system-query/pkg/package.json index 79f43f39..74743550 100644 --- a/packages/system-query/pkg/package.json +++ b/packages/system-query/pkg/package.json @@ -11,4 +11,4 @@ "sideEffects": [ "./snippets/*" ] -} \ No newline at end of file +} diff --git a/packages/system-query/pkg/system_query.d.ts b/packages/system-query/pkg/system_query.d.ts index 4fdcb2a9..b1781e0d 100644 --- a/packages/system-query/pkg/system_query.d.ts +++ b/packages/system-query/pkg/system_query.d.ts @@ -1,31 +1,31 @@ /* tslint:disable */ /* eslint-disable */ /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function diff_filters(prev: any, next: any): any; /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function expand_filter(val: any): any; /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function get_diff(prev: any, next: any): any; /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function flat_merge(val: any): any; /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function compress(val: any): any; export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembly.Module; @@ -45,21 +45,21 @@ export interface InitOutput { export type SyncInitInput = BufferSource | WebAssembly.Module; /** -* Instantiates the given `module`, which can either be bytes or -* a precompiled `WebAssembly.Module`. -* -* @param {SyncInitInput} module -* -* @returns {InitOutput} -*/ + * Instantiates the given `module`, which can either be bytes or + * a precompiled `WebAssembly.Module`. + * + * @param {SyncInitInput} module + * + * @returns {InitOutput} + */ export function initSync(module: SyncInitInput): InitOutput; /** -* If `module_or_path` is {RequestInfo} or {URL}, makes a request and -* for everything else, calls `WebAssembly.instantiate` directly. -* -* @param {InitInput | Promise} module_or_path -* -* @returns {Promise} -*/ -export default function __wbg_init (module_or_path?: InitInput | Promise): Promise; + * If `module_or_path` is {RequestInfo} or {URL}, makes a request and + * for everything else, calls `WebAssembly.instantiate` directly. + * + * @param {InitInput | Promise} module_or_path + * + * @returns {Promise} + */ +export default function __wbg_init(module_or_path?: InitInput | Promise): Promise; diff --git a/packages/system-query/pkg/system_query.js b/packages/system-query/pkg/system_query.js index 57dd87cf..67836cbd 100644 --- a/packages/system-query/pkg/system_query.js +++ b/packages/system-query/pkg/system_query.js @@ -4,20 +4,22 @@ const heap = new Array(128).fill(undefined); heap.push(undefined, null, true, false); -function getObject(idx) { return heap[idx]; } +function getObject(idx) { + return heap[idx]; +} let heap_next = heap.length; function dropObject(idx) { - if (idx < 132) return; - heap[idx] = heap_next; - heap_next = idx; + if (idx < 132) return; + heap[idx] = heap_next; + heap_next = idx; } function takeObject(idx) { - const ret = getObject(idx); - dropObject(idx); - return ret; + const ret = getObject(idx); + dropObject(idx); + return ret; } let WASM_VECTOR_LEN = 0; @@ -25,536 +27,560 @@ let WASM_VECTOR_LEN = 0; let cachedUint8Memory0 = null; function getUint8Memory0() { - if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { - cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); - } - return cachedUint8Memory0; + if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { + cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); + } + return cachedUint8Memory0; } -const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } ); +const cachedTextEncoder = + typeof TextEncoder !== "undefined" + ? new TextEncoder("utf-8") + : { + encode: () => { + throw Error("TextEncoder not available"); + }, + }; -const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' +const encodeString = + typeof cachedTextEncoder.encodeInto === "function" ? function (arg, view) { - return cachedTextEncoder.encodeInto(arg, view); -} + return cachedTextEncoder.encodeInto(arg, view); + } : function (arg, view) { - const buf = cachedTextEncoder.encode(arg); - view.set(buf); - return { - read: arg.length, - written: buf.length - }; -}); + const buf = cachedTextEncoder.encode(arg); + view.set(buf); + return { + read: arg.length, + written: buf.length, + }; + }; function passStringToWasm0(arg, malloc, realloc) { - - if (realloc === undefined) { - const buf = cachedTextEncoder.encode(arg); - const ptr = malloc(buf.length, 1) >>> 0; - getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf); - WASM_VECTOR_LEN = buf.length; - return ptr; - } - - let len = arg.length; - let ptr = malloc(len, 1) >>> 0; - - const mem = getUint8Memory0(); - - let offset = 0; - - for (; offset < len; offset++) { - const code = arg.charCodeAt(offset); - if (code > 0x7F) break; - mem[ptr + offset] = code; - } - - if (offset !== len) { - if (offset !== 0) { - arg = arg.slice(offset); - } - ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; - const view = getUint8Memory0().subarray(ptr + offset, ptr + len); - const ret = encodeString(arg, view); - - offset += ret.written; - } - - WASM_VECTOR_LEN = offset; + if (realloc === undefined) { + const buf = cachedTextEncoder.encode(arg); + const ptr = malloc(buf.length, 1) >>> 0; + getUint8Memory0() + .subarray(ptr, ptr + buf.length) + .set(buf); + WASM_VECTOR_LEN = buf.length; return ptr; + } + + let len = arg.length; + let ptr = malloc(len, 1) >>> 0; + + const mem = getUint8Memory0(); + + let offset = 0; + + for (; offset < len; offset++) { + const code = arg.charCodeAt(offset); + if (code > 0x7f) break; + mem[ptr + offset] = code; + } + + if (offset !== len) { + if (offset !== 0) { + arg = arg.slice(offset); + } + ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0; + const view = getUint8Memory0().subarray(ptr + offset, ptr + len); + const ret = encodeString(arg, view); + + offset += ret.written; + } + + WASM_VECTOR_LEN = offset; + return ptr; } function isLikeNone(x) { - return x === undefined || x === null; + return x === undefined || x === null; } let cachedInt32Memory0 = null; function getInt32Memory0() { - if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { - cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); - } - return cachedInt32Memory0; + if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { + cachedInt32Memory0 = new Int32Array(wasm.memory.buffer); + } + return cachedInt32Memory0; } -const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } ); +const cachedTextDecoder = + typeof TextDecoder !== "undefined" + ? new TextDecoder("utf-8", { ignoreBOM: true, fatal: true }) + : { + decode: () => { + throw Error("TextDecoder not available"); + }, + }; -if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); }; +if (typeof TextDecoder !== "undefined") { + cachedTextDecoder.decode(); +} function getStringFromWasm0(ptr, len) { - ptr = ptr >>> 0; - return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); + ptr = ptr >>> 0; + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)); } function addHeapObject(obj) { - if (heap_next === heap.length) heap.push(heap.length + 1); - const idx = heap_next; - heap_next = heap[idx]; + if (heap_next === heap.length) heap.push(heap.length + 1); + const idx = heap_next; + heap_next = heap[idx]; - heap[idx] = obj; - return idx; + heap[idx] = obj; + return idx; } let cachedFloat64Memory0 = null; function getFloat64Memory0() { - if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { - cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); - } - return cachedFloat64Memory0; + if (cachedFloat64Memory0 === null || cachedFloat64Memory0.byteLength === 0) { + cachedFloat64Memory0 = new Float64Array(wasm.memory.buffer); + } + return cachedFloat64Memory0; } function debugString(val) { - // primitive types - const type = typeof val; - if (type == 'number' || type == 'boolean' || val == null) { - return `${val}`; - } - if (type == 'string') { - return `"${val}"`; - } - if (type == 'symbol') { - const description = val.description; - if (description == null) { - return 'Symbol'; - } else { - return `Symbol(${description})`; - } - } - if (type == 'function') { - const name = val.name; - if (typeof name == 'string' && name.length > 0) { - return `Function(${name})`; - } else { - return 'Function'; - } - } - // objects - if (Array.isArray(val)) { - const length = val.length; - let debug = '['; - if (length > 0) { - debug += debugString(val[0]); - } - for(let i = 1; i < length; i++) { - debug += ', ' + debugString(val[i]); - } - debug += ']'; - return debug; - } - // Test for built-in - const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); - let className; - if (builtInMatches.length > 1) { - className = builtInMatches[1]; + // primitive types + const type = typeof val; + if (type == "number" || type == "boolean" || val == null) { + return `${val}`; + } + if (type == "string") { + return `"${val}"`; + } + if (type == "symbol") { + const description = val.description; + if (description == null) { + return "Symbol"; } else { - // Failed to match the standard '[object ClassName]' - return toString.call(val); + return `Symbol(${description})`; } - if (className == 'Object') { - // we're a user defined class or Object - // JSON.stringify avoids problems with cycles, and is generally much - // easier than looping through ownProperties of `val`. - try { - return 'Object(' + JSON.stringify(val) + ')'; - } catch (_) { - return 'Object'; - } + } + if (type == "function") { + const name = val.name; + if (typeof name == "string" && name.length > 0) { + return `Function(${name})`; + } else { + return "Function"; } - // errors - if (val instanceof Error) { - return `${val.name}: ${val.message}\n${val.stack}`; + } + // objects + if (Array.isArray(val)) { + const length = val.length; + let debug = "["; + if (length > 0) { + debug += debugString(val[0]); } - // TODO we could test for more things here, like `Set`s and `Map`s. - return className; + for (let i = 1; i < length; i++) { + debug += ", " + debugString(val[i]); + } + debug += "]"; + return debug; + } + // Test for built-in + const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); + let className; + if (builtInMatches.length > 1) { + className = builtInMatches[1]; + } else { + // Failed to match the standard '[object ClassName]' + return toString.call(val); + } + if (className == "Object") { + // we're a user defined class or Object + // JSON.stringify avoids problems with cycles, and is generally much + // easier than looping through ownProperties of `val`. + try { + return "Object(" + JSON.stringify(val) + ")"; + } catch (_) { + return "Object"; + } + } + // errors + if (val instanceof Error) { + return `${val.name}: ${val.message}\n${val.stack}`; + } + // TODO we could test for more things here, like `Set`s and `Map`s. + return className; } /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function diff_filters(prev, next) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.diff_filters(retptr, addHeapObject(prev), addHeapObject(next)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.diff_filters(retptr, addHeapObject(prev), addHeapObject(next)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function expand_filter(val) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.expand_filter(retptr, addHeapObject(val)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.expand_filter(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} prev -* @param {any} next -* @returns {any} -*/ + * @param {any} prev + * @param {any} next + * @returns {any} + */ export function get_diff(prev, next) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.get_diff(retptr, addHeapObject(prev), addHeapObject(next)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.get_diff(retptr, addHeapObject(prev), addHeapObject(next)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function flat_merge(val) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.flat_merge(retptr, addHeapObject(val)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.flat_merge(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } /** -* @param {any} val -* @returns {any} -*/ + * @param {any} val + * @returns {any} + */ export function compress(val) { - try { - const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); - wasm.compress(retptr, addHeapObject(val)); - var r0 = getInt32Memory0()[retptr / 4 + 0]; - var r1 = getInt32Memory0()[retptr / 4 + 1]; - var r2 = getInt32Memory0()[retptr / 4 + 2]; - if (r2) { - throw takeObject(r1); - } - return takeObject(r0); - } finally { - wasm.__wbindgen_add_to_stack_pointer(16); + try { + const retptr = wasm.__wbindgen_add_to_stack_pointer(-16); + wasm.compress(retptr, addHeapObject(val)); + var r0 = getInt32Memory0()[retptr / 4 + 0]; + var r1 = getInt32Memory0()[retptr / 4 + 1]; + var r2 = getInt32Memory0()[retptr / 4 + 2]; + if (r2) { + throw takeObject(r1); } + return takeObject(r0); + } finally { + wasm.__wbindgen_add_to_stack_pointer(16); + } } function handleError(f, args) { - try { - return f.apply(this, args); - } catch (e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); - } + try { + return f.apply(this, args); + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } } async function __wbg_load(module, imports) { - if (typeof Response === 'function' && module instanceof Response) { - if (typeof WebAssembly.instantiateStreaming === 'function') { - try { - return await WebAssembly.instantiateStreaming(module, imports); - - } catch (e) { - if (module.headers.get('Content-Type') != 'application/wasm') { - console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e); - - } else { - throw e; - } - } - } - - const bytes = await module.arrayBuffer(); - return await WebAssembly.instantiate(bytes, imports); - - } else { - const instance = await WebAssembly.instantiate(module, imports); - - if (instance instanceof WebAssembly.Instance) { - return { instance, module }; - + if (typeof Response === "function" && module instanceof Response) { + if (typeof WebAssembly.instantiateStreaming === "function") { + try { + return await WebAssembly.instantiateStreaming(module, imports); + } catch (e) { + if (module.headers.get("Content-Type") != "application/wasm") { + console.warn( + "`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", + e, + ); } else { - return instance; + throw e; } + } } + + const bytes = await module.arrayBuffer(); + return await WebAssembly.instantiate(bytes, imports); + } else { + const instance = await WebAssembly.instantiate(module, imports); + + if (instance instanceof WebAssembly.Instance) { + return { instance, module }; + } else { + return instance; + } + } } function __wbg_get_imports() { - const imports = {}; - imports.wbg = {}; - imports.wbg.__wbindgen_object_drop_ref = function(arg0) { - takeObject(arg0); - }; - imports.wbg.__wbindgen_string_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'string' ? obj : undefined; - var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - var len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbindgen_is_object = function(arg0) { - const val = getObject(arg0); - const ret = typeof(val) === 'object' && val !== null; - return ret; - }; - imports.wbg.__wbindgen_is_undefined = function(arg0) { - const ret = getObject(arg0) === undefined; - return ret; - }; - imports.wbg.__wbindgen_in = function(arg0, arg1) { - const ret = getObject(arg0) in getObject(arg1); - return ret; - }; - imports.wbg.__wbindgen_error_new = function(arg0, arg1) { - const ret = new Error(getStringFromWasm0(arg0, arg1)); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_object_clone_ref = function(arg0) { - const ret = getObject(arg0); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_jsval_loose_eq = function(arg0, arg1) { - const ret = getObject(arg0) == getObject(arg1); - return ret; - }; - imports.wbg.__wbindgen_boolean_get = function(arg0) { - const v = getObject(arg0); - const ret = typeof(v) === 'boolean' ? (v ? 1 : 0) : 2; - return ret; - }; - imports.wbg.__wbindgen_number_get = function(arg0, arg1) { - const obj = getObject(arg1); - const ret = typeof(obj) === 'number' ? obj : undefined; - getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; - getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); - }; - imports.wbg.__wbindgen_number_new = function(arg0) { - const ret = arg0; - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_string_new = function(arg0, arg1) { - const ret = getStringFromWasm0(arg0, arg1); - return addHeapObject(ret); - }; - imports.wbg.__wbg_getwithrefkey_5e6d9547403deab8 = function(arg0, arg1) { - const ret = getObject(arg0)[getObject(arg1)]; - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_841ac57cff3d672b = function(arg0, arg1, arg2) { - getObject(arg0)[takeObject(arg1)] = takeObject(arg2); - }; - imports.wbg.__wbg_get_44be0491f933a435 = function(arg0, arg1) { - const ret = getObject(arg0)[arg1 >>> 0]; - return addHeapObject(ret); - }; - imports.wbg.__wbg_length_fff51ee6522a1a18 = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbg_new_898a68150f225f2e = function() { - const ret = new Array(); - return addHeapObject(ret); - }; - imports.wbg.__wbindgen_is_function = function(arg0) { - const ret = typeof(getObject(arg0)) === 'function'; - return ret; - }; - imports.wbg.__wbg_next_526fc47e980da008 = function(arg0) { - const ret = getObject(arg0).next; - return addHeapObject(ret); - }; - imports.wbg.__wbg_next_ddb3312ca1c4e32a = function() { return handleError(function (arg0) { - const ret = getObject(arg0).next(); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_done_5c1f01fb660d73b5 = function(arg0) { - const ret = getObject(arg0).done; - return ret; - }; - imports.wbg.__wbg_value_1695675138684bd5 = function(arg0) { - const ret = getObject(arg0).value; - return addHeapObject(ret); - }; - imports.wbg.__wbg_iterator_97f0c81209c6c35a = function() { - const ret = Symbol.iterator; - return addHeapObject(ret); - }; - imports.wbg.__wbg_get_97b561fb56f034b5 = function() { return handleError(function (arg0, arg1) { - const ret = Reflect.get(getObject(arg0), getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_call_cb65541d95d71282 = function() { return handleError(function (arg0, arg1) { - const ret = getObject(arg0).call(getObject(arg1)); - return addHeapObject(ret); - }, arguments) }; - imports.wbg.__wbg_new_b51585de1b234aff = function() { - const ret = new Object(); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_502d29070ea18557 = function(arg0, arg1, arg2) { - getObject(arg0)[arg1 >>> 0] = takeObject(arg2); - }; - imports.wbg.__wbg_isArray_4c24b343cb13cfb1 = function(arg0) { - const ret = Array.isArray(getObject(arg0)); - return ret; - }; - imports.wbg.__wbg_instanceof_ArrayBuffer_39ac22089b74fddb = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof ArrayBuffer; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbg_isSafeInteger_bb8e18dd21c97288 = function(arg0) { - const ret = Number.isSafeInteger(getObject(arg0)); - return ret; - }; - imports.wbg.__wbg_buffer_085ec1f694018c4f = function(arg0) { - const ret = getObject(arg0).buffer; - return addHeapObject(ret); - }; - imports.wbg.__wbg_new_8125e318e6245eed = function(arg0) { - const ret = new Uint8Array(getObject(arg0)); - return addHeapObject(ret); - }; - imports.wbg.__wbg_set_5cf90238115182c3 = function(arg0, arg1, arg2) { - getObject(arg0).set(getObject(arg1), arg2 >>> 0); - }; - imports.wbg.__wbg_length_72e2208bbc0efc61 = function(arg0) { - const ret = getObject(arg0).length; - return ret; - }; - imports.wbg.__wbg_instanceof_Uint8Array_d8d9cb2b8e8ac1d4 = function(arg0) { - let result; - try { - result = getObject(arg0) instanceof Uint8Array; - } catch { - result = false; - } - const ret = result; - return ret; - }; - imports.wbg.__wbindgen_debug_string = function(arg0, arg1) { - const ret = debugString(getObject(arg1)); - const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); - const len1 = WASM_VECTOR_LEN; - getInt32Memory0()[arg0 / 4 + 1] = len1; - getInt32Memory0()[arg0 / 4 + 0] = ptr1; - }; - imports.wbg.__wbindgen_throw = function(arg0, arg1) { - throw new Error(getStringFromWasm0(arg0, arg1)); - }; - imports.wbg.__wbindgen_memory = function() { - const ret = wasm.memory; - return addHeapObject(ret); - }; + const imports = {}; + imports.wbg = {}; + imports.wbg.__wbindgen_object_drop_ref = function (arg0) { + takeObject(arg0); + }; + imports.wbg.__wbindgen_string_get = function (arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "string" ? obj : undefined; + var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + var len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbindgen_is_object = function (arg0) { + const val = getObject(arg0); + const ret = typeof val === "object" && val !== null; + return ret; + }; + imports.wbg.__wbindgen_is_undefined = function (arg0) { + const ret = getObject(arg0) === undefined; + return ret; + }; + imports.wbg.__wbindgen_in = function (arg0, arg1) { + const ret = getObject(arg0) in getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_error_new = function (arg0, arg1) { + const ret = new Error(getStringFromWasm0(arg0, arg1)); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_object_clone_ref = function (arg0) { + const ret = getObject(arg0); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_jsval_loose_eq = function (arg0, arg1) { + const ret = getObject(arg0) == getObject(arg1); + return ret; + }; + imports.wbg.__wbindgen_boolean_get = function (arg0) { + const v = getObject(arg0); + const ret = typeof v === "boolean" ? (v ? 1 : 0) : 2; + return ret; + }; + imports.wbg.__wbindgen_number_get = function (arg0, arg1) { + const obj = getObject(arg1); + const ret = typeof obj === "number" ? obj : undefined; + getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret; + getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret); + }; + imports.wbg.__wbindgen_number_new = function (arg0) { + const ret = arg0; + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_string_new = function (arg0, arg1) { + const ret = getStringFromWasm0(arg0, arg1); + return addHeapObject(ret); + }; + imports.wbg.__wbg_getwithrefkey_5e6d9547403deab8 = function (arg0, arg1) { + const ret = getObject(arg0)[getObject(arg1)]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_841ac57cff3d672b = function (arg0, arg1, arg2) { + getObject(arg0)[takeObject(arg1)] = takeObject(arg2); + }; + imports.wbg.__wbg_get_44be0491f933a435 = function (arg0, arg1) { + const ret = getObject(arg0)[arg1 >>> 0]; + return addHeapObject(ret); + }; + imports.wbg.__wbg_length_fff51ee6522a1a18 = function (arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_new_898a68150f225f2e = function () { + const ret = new Array(); + return addHeapObject(ret); + }; + imports.wbg.__wbindgen_is_function = function (arg0) { + const ret = typeof getObject(arg0) === "function"; + return ret; + }; + imports.wbg.__wbg_next_526fc47e980da008 = function (arg0) { + const ret = getObject(arg0).next; + return addHeapObject(ret); + }; + imports.wbg.__wbg_next_ddb3312ca1c4e32a = function () { + return handleError(function (arg0) { + const ret = getObject(arg0).next(); + return addHeapObject(ret); + }, arguments); + }; + imports.wbg.__wbg_done_5c1f01fb660d73b5 = function (arg0) { + const ret = getObject(arg0).done; + return ret; + }; + imports.wbg.__wbg_value_1695675138684bd5 = function (arg0) { + const ret = getObject(arg0).value; + return addHeapObject(ret); + }; + imports.wbg.__wbg_iterator_97f0c81209c6c35a = function () { + const ret = Symbol.iterator; + return addHeapObject(ret); + }; + imports.wbg.__wbg_get_97b561fb56f034b5 = function () { + return handleError(function (arg0, arg1) { + const ret = Reflect.get(getObject(arg0), getObject(arg1)); + return addHeapObject(ret); + }, arguments); + }; + imports.wbg.__wbg_call_cb65541d95d71282 = function () { + return handleError(function (arg0, arg1) { + const ret = getObject(arg0).call(getObject(arg1)); + return addHeapObject(ret); + }, arguments); + }; + imports.wbg.__wbg_new_b51585de1b234aff = function () { + const ret = new Object(); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_502d29070ea18557 = function (arg0, arg1, arg2) { + getObject(arg0)[arg1 >>> 0] = takeObject(arg2); + }; + imports.wbg.__wbg_isArray_4c24b343cb13cfb1 = function (arg0) { + const ret = Array.isArray(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_instanceof_ArrayBuffer_39ac22089b74fddb = function (arg0) { + let result; + try { + result = getObject(arg0) instanceof ArrayBuffer; + } catch { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbg_isSafeInteger_bb8e18dd21c97288 = function (arg0) { + const ret = Number.isSafeInteger(getObject(arg0)); + return ret; + }; + imports.wbg.__wbg_buffer_085ec1f694018c4f = function (arg0) { + const ret = getObject(arg0).buffer; + return addHeapObject(ret); + }; + imports.wbg.__wbg_new_8125e318e6245eed = function (arg0) { + const ret = new Uint8Array(getObject(arg0)); + return addHeapObject(ret); + }; + imports.wbg.__wbg_set_5cf90238115182c3 = function (arg0, arg1, arg2) { + getObject(arg0).set(getObject(arg1), arg2 >>> 0); + }; + imports.wbg.__wbg_length_72e2208bbc0efc61 = function (arg0) { + const ret = getObject(arg0).length; + return ret; + }; + imports.wbg.__wbg_instanceof_Uint8Array_d8d9cb2b8e8ac1d4 = function (arg0) { + let result; + try { + result = getObject(arg0) instanceof Uint8Array; + } catch { + result = false; + } + const ret = result; + return ret; + }; + imports.wbg.__wbindgen_debug_string = function (arg0, arg1) { + const ret = debugString(getObject(arg1)); + const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); + const len1 = WASM_VECTOR_LEN; + getInt32Memory0()[arg0 / 4 + 1] = len1; + getInt32Memory0()[arg0 / 4 + 0] = ptr1; + }; + imports.wbg.__wbindgen_throw = function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)); + }; + imports.wbg.__wbindgen_memory = function () { + const ret = wasm.memory; + return addHeapObject(ret); + }; - return imports; + return imports; } -function __wbg_init_memory(imports, maybe_memory) { - -} +function __wbg_init_memory(imports, maybe_memory) {} function __wbg_finalize_init(instance, module) { - wasm = instance.exports; - __wbg_init.__wbindgen_wasm_module = module; - cachedFloat64Memory0 = null; - cachedInt32Memory0 = null; - cachedUint8Memory0 = null; + wasm = instance.exports; + __wbg_init.__wbindgen_wasm_module = module; + cachedFloat64Memory0 = null; + cachedInt32Memory0 = null; + cachedUint8Memory0 = null; - - return wasm; + return wasm; } function initSync(module) { - if (wasm !== undefined) return wasm; + if (wasm !== undefined) return wasm; - const imports = __wbg_get_imports(); + const imports = __wbg_get_imports(); - __wbg_init_memory(imports); + __wbg_init_memory(imports); - if (!(module instanceof WebAssembly.Module)) { - module = new WebAssembly.Module(module); - } + if (!(module instanceof WebAssembly.Module)) { + module = new WebAssembly.Module(module); + } - const instance = new WebAssembly.Instance(module, imports); + const instance = new WebAssembly.Instance(module, imports); - return __wbg_finalize_init(instance, module); + return __wbg_finalize_init(instance, module); } async function __wbg_init(input) { - if (wasm !== undefined) return wasm; + if (wasm !== undefined) return wasm; - if (typeof input === 'undefined') { - input = new URL('system_query_bg.wasm', import.meta.url); - } - const imports = __wbg_get_imports(); + if (typeof input === "undefined") { + input = new URL("system_query_bg.wasm", import.meta.url); + } + const imports = __wbg_get_imports(); - if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) { - input = fetch(input); - } + if ( + typeof input === "string" || + (typeof Request === "function" && input instanceof Request) || + (typeof URL === "function" && input instanceof URL) + ) { + input = fetch(input); + } - __wbg_init_memory(imports); + __wbg_init_memory(imports); - const { instance, module } = await __wbg_load(await input, imports); + const { instance, module } = await __wbg_load(await input, imports); - return __wbg_finalize_init(instance, module); + return __wbg_finalize_init(instance, module); } -export { initSync } +export { initSync }; export default __wbg_init; diff --git a/packages/system-query/pkg/system_query_bg.wasm b/packages/system-query/pkg/system_query_bg.wasm index 8590da75..9ab1834b 100644 Binary files a/packages/system-query/pkg/system_query_bg.wasm and b/packages/system-query/pkg/system_query_bg.wasm differ diff --git a/packages/system/src/index.ts b/packages/system/src/index.ts index 9bc4dd06..cf8024c5 100644 --- a/packages/system/src/index.ts +++ b/packages/system/src/index.ts @@ -134,4 +134,4 @@ export interface MessageEncryptor { getSharedSecret(privateKey: string, publicKey: string): Promise | Uint8Array; encryptData(plaintext: string, sharedSecet: Uint8Array): Promise | MessageEncryptorPayload; decryptData(payload: MessageEncryptorPayload, sharedSecet: Uint8Array): Promise | string; -} \ No newline at end of file +} diff --git a/packages/system/src/nostr-system.ts b/packages/system/src/nostr-system.ts index b7105016..4382471e 100644 --- a/packages/system/src/nostr-system.ts +++ b/packages/system/src/nostr-system.ts @@ -93,7 +93,7 @@ export class NostrSystem extends ExternalStore implements System this.#profileCache = props.profileCache ?? new UserProfileCache(); this.#relayMetricsCache = props.relayMetrics ?? new RelayMetricCache(); this.#eventsCache = props.eventsCache ?? new EventsCache(); - this.#queryOptimizer = props.queryOptimizer ?? DefaultQueryOptimizer; + this.#queryOptimizer = props.queryOptimizer ?? DefaultQueryOptimizer; this.#profileLoader = new ProfileLoaderService(this, this.#profileCache); this.#relayMetrics = new RelayMetricHandler(this.#relayMetricsCache); @@ -254,9 +254,7 @@ export class NostrSystem extends ExternalStore implements System if (existing.fromInstance === req.instance) { return existing; } - const filters = !req.options?.skipDiff - ? req.buildDiff(this, existing.filters) - : req.build(this); + const filters = !req.options?.skipDiff ? req.buildDiff(this, existing.filters) : req.build(this); if (filters.length === 0 && !!req.options?.skipDiff) { return existing; } else { @@ -275,7 +273,7 @@ export class NostrSystem extends ExternalStore implements System const expectIds = new Set(filters.flatMap(a => a.filters).flatMap(a => a.ids ?? [])); q.feed.onEvent(async evs => { const toSet = evs.filter(a => expectIds.has(a.id) && this.#eventsCache.getFromCache(a.id) === undefined); - if(toSet.length > 0) { + if (toSet.length > 0) { await this.#eventsCache.bulkSet(toSet); } }); @@ -411,4 +409,4 @@ export class NostrSystem extends ExternalStore implements System } setTimeout(() => this.#cleanup(), 1_000); } -} \ No newline at end of file +} diff --git a/packages/system/src/query-optimizer/index.ts b/packages/system/src/query-optimizer/index.ts index eb5a166d..21d8b44a 100644 --- a/packages/system/src/query-optimizer/index.ts +++ b/packages/system/src/query-optimizer/index.ts @@ -1,7 +1,7 @@ -import { ReqFilter } from "../nostr" -import { expandFilter } from "./request-expander" -import { flatMerge, mergeSimilar } from "./request-merger" -import { diffFilters } from "./request-splitter" +import { ReqFilter } from "../nostr"; +import { expandFilter } from "./request-expander"; +import { flatMerge, mergeSimilar } from "./request-merger"; +import { diffFilters } from "./request-splitter"; export interface FlatReqFilter { keys: number; @@ -20,24 +20,27 @@ export interface FlatReqFilter { } export interface QueryOptimizer { - expandFilter(f: ReqFilter): Array - getDiff(prev: Array, next: Array): Array - flatMerge(all: Array): Array - compress(all: Array): Array + expandFilter(f: ReqFilter): Array; + getDiff(prev: Array, next: Array): Array; + flatMerge(all: Array): Array; + compress(all: Array): Array; } export const DefaultQueryOptimizer = { - expandFilter: (f: ReqFilter) => { - return expandFilter(f); - }, - getDiff: (prev: Array, next: Array) => { - const diff = diffFilters(prev.flatMap(a => expandFilter(a)), next.flatMap(a => expandFilter(a))); - return diff.added; - }, - flatMerge: (all: Array) => { - return flatMerge(all); - }, - compress: (all: Array) => { - return mergeSimilar(all); - } - } as QueryOptimizer; \ No newline at end of file + expandFilter: (f: ReqFilter) => { + return expandFilter(f); + }, + getDiff: (prev: Array, next: Array) => { + const diff = diffFilters( + prev.flatMap(a => expandFilter(a)), + next.flatMap(a => expandFilter(a)), + ); + return diff.added; + }, + flatMerge: (all: Array) => { + return flatMerge(all); + }, + compress: (all: Array) => { + return mergeSimilar(all); + }, +} as QueryOptimizer; diff --git a/packages/system/src/query-optimizer/request-splitter.ts b/packages/system/src/query-optimizer/request-splitter.ts index 97f9b628..623a2798 100644 --- a/packages/system/src/query-optimizer/request-splitter.ts +++ b/packages/system/src/query-optimizer/request-splitter.ts @@ -29,4 +29,4 @@ export function diffFilters(prev: Array, next: Array implements Syste get RelayCache(): RelayCache { throw new Error("Method not implemented."); } - + get QueryOptimizer(): QueryOptimizer { throw new Error("Method not implemented."); } diff --git a/packages/system/src/zaps.ts b/packages/system/src/zaps.ts index ee22cb15..bf9a65b5 100644 --- a/packages/system/src/zaps.ts +++ b/packages/system/src/zaps.ts @@ -16,7 +16,7 @@ function getInvoice(zap: NostrEvent): InvoiceDetails | undefined { export function parseZap(zapReceipt: NostrEvent, userCache: FeedCache, refNote?: NostrEvent): ParsedZap { const existing = ParsedZapCache.get(zapReceipt.id); - if(existing) { + if (existing) { return existing; } diff --git a/packages/system/tests/node.ts b/packages/system/tests/node.ts index 8dd7862e..d572afb0 100644 --- a/packages/system/tests/node.ts +++ b/packages/system/tests/node.ts @@ -1,14 +1,14 @@ -import {NostrSystem, SystemInterface} from ".."; +import { NostrSystem, SystemInterface } from ".."; const Relay = "wss://relay.snort.social/"; const system = new NostrSystem({}) as SystemInterface; async function test() { - await system.ConnectToRelay(Relay, {read: true, write: true}); - setTimeout(() => { - system.DisconnectRelay(Relay); - }, 1000); + await system.ConnectToRelay(Relay, { read: true, write: true }); + setTimeout(() => { + system.DisconnectRelay(Relay); + }, 1000); } -test().catch(console.error); \ No newline at end of file +test().catch(console.error); diff --git a/yarn.lock b/yarn.lock index 149d04eb..9946756b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2852,6 +2852,7 @@ __metadata: "@peculiar/webcrypto": ^1.4.3 "@scure/base": ^1.1.2 "@snort/shared": ^1.0.5 + "@snort/system-query": "workspace:*" "@stablelib/xchacha20": ^1.0.1 "@types/debug": ^4.1.8 "@types/jest": ^29.5.1