mirror of
https://github.com/hzrd149/nostrudel.git
synced 2025-10-10 21:03:39 +02:00
fix reconnecting to relay
small fixes for task manager
This commit is contained in:
@@ -5,7 +5,6 @@ import relayPoolService from "../services/relay-pool";
|
|||||||
import createDefer from "./deferred";
|
import createDefer from "./deferred";
|
||||||
import { PersistentSubject } from "./subject";
|
import { PersistentSubject } from "./subject";
|
||||||
import ControlledObservable from "./controlled-observable";
|
import ControlledObservable from "./controlled-observable";
|
||||||
import dayjs from "dayjs";
|
|
||||||
|
|
||||||
export type PublishResult = { relay: AbstractRelay; success: boolean; message: string };
|
export type PublishResult = { relay: AbstractRelay; success: boolean; message: string };
|
||||||
|
|
||||||
|
@@ -12,6 +12,7 @@ import processManager from "../services/process-manager";
|
|||||||
export type Notice = {
|
export type Notice = {
|
||||||
message: string;
|
message: string;
|
||||||
date: number;
|
date: number;
|
||||||
|
relay: AbstractRelay;
|
||||||
};
|
};
|
||||||
|
|
||||||
export default class RelayPool {
|
export default class RelayPool {
|
||||||
@@ -24,6 +25,9 @@ export default class RelayPool {
|
|||||||
connectionErrors = new SuperMap<AbstractRelay, Error[]>(() => []);
|
connectionErrors = new SuperMap<AbstractRelay, Error[]>(() => []);
|
||||||
connecting = new SuperMap<AbstractRelay, PersistentSubject<boolean>>(() => new PersistentSubject(false));
|
connecting = new SuperMap<AbstractRelay, PersistentSubject<boolean>>(() => new PersistentSubject(false));
|
||||||
|
|
||||||
|
authForPublish = new SuperMap<AbstractRelay, Subject<boolean>>(() => new Subject());
|
||||||
|
authForSubscribe = new SuperMap<AbstractRelay, Subject<boolean>>(() => new Subject());
|
||||||
|
|
||||||
log = logger.extend("RelayPool");
|
log = logger.extend("RelayPool");
|
||||||
|
|
||||||
getRelay(relayOrUrl: string | URL | AbstractRelay) {
|
getRelay(relayOrUrl: string | URL | AbstractRelay) {
|
||||||
@@ -110,7 +114,10 @@ export default class RelayPool {
|
|||||||
|
|
||||||
handleRelayNotice(relay: AbstractRelay, message: string) {
|
handleRelayNotice(relay: AbstractRelay, message: string) {
|
||||||
const subject = this.notices.get(relay);
|
const subject = this.notices.get(relay);
|
||||||
subject.next([...subject.value, { message, date: dayjs().unix() }]);
|
subject.next([...subject.value, { message, date: dayjs().unix(), relay }]);
|
||||||
|
|
||||||
|
const authForSubscribe = this.authForSubscribe.get(relay);
|
||||||
|
if (!authForSubscribe.value) authForSubscribe.next(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
disconnectFromUnused() {
|
disconnectFromUnused() {
|
||||||
@@ -128,6 +135,10 @@ export default class RelayPool {
|
|||||||
if (disconnect) {
|
if (disconnect) {
|
||||||
this.log(`No active processes using ${relay.url}, disconnecting`);
|
this.log(`No active processes using ${relay.url}, disconnecting`);
|
||||||
relay.close();
|
relay.close();
|
||||||
|
|
||||||
|
// NOTE: fix nostr-tools not resetting the connection promise
|
||||||
|
// @ts-expect-error
|
||||||
|
relay.connectionPromise = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import { useMemo, useState } from "react";
|
import { useMemo, useState } from "react";
|
||||||
import { Button, Card, CardBody, CardHeader, CardProps, Flex, Heading, Link, LinkBox, Text } from "@chakra-ui/react";
|
import { Button, Card, CardBody, CardHeader, CardProps, Flex, Heading, Link, LinkBox, Text } from "@chakra-ui/react";
|
||||||
import { Link as RouterLink, useNavigate } from "react-router-dom";
|
import { Link as RouterLink, useNavigate } from "react-router-dom";
|
||||||
|
import { nip19 } from "nostr-tools";
|
||||||
|
|
||||||
import KeyboardShortcut from "../../../components/keyboard-shortcut";
|
import KeyboardShortcut from "../../../components/keyboard-shortcut";
|
||||||
import useCurrentAccount from "../../../hooks/use-current-account";
|
import useCurrentAccount from "../../../hooks/use-current-account";
|
||||||
@@ -18,7 +19,6 @@ import UserAvatar from "../../../components/user/user-avatar";
|
|||||||
import HoverLinkOverlay from "../../../components/hover-link-overlay";
|
import HoverLinkOverlay from "../../../components/hover-link-overlay";
|
||||||
import UserName from "../../../components/user/user-name";
|
import UserName from "../../../components/user/user-name";
|
||||||
import UserDnsIdentity from "../../../components/user/user-dns-identity";
|
import UserDnsIdentity from "../../../components/user/user-dns-identity";
|
||||||
import { nip19 } from "nostr-tools";
|
|
||||||
import { useDecryptionContainer, useDecryptionContext } from "../../../providers/global/decryption-provider";
|
import { useDecryptionContainer, useDecryptionContext } from "../../../providers/global/decryption-provider";
|
||||||
import Timestamp from "../../../components/timestamp";
|
import Timestamp from "../../../components/timestamp";
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ export default function DMsCard({ ...props }: Omit<CardProps, "children">) {
|
|||||||
const grouped = groupIntoConversations(messages)
|
const grouped = groupIntoConversations(messages)
|
||||||
.map((c) => identifyConversation(c, account.pubkey))
|
.map((c) => identifyConversation(c, account.pubkey))
|
||||||
.filter((c) => {
|
.filter((c) => {
|
||||||
if (c.messages.some((m) => m.pubkey === c.correspondent)) return hasResponded(c);
|
if (c.messages.some((m) => m.pubkey === c.correspondent)) return !hasResponded(c);
|
||||||
else return false;
|
else return false;
|
||||||
});
|
});
|
||||||
const sorted = sortConversationsByLastReceived(grouped);
|
const sorted = sortConversationsByLastReceived(grouped);
|
||||||
|
@@ -1,4 +1,19 @@
|
|||||||
import { Flex, LinkBox, Spacer } from "@chakra-ui/react";
|
import {
|
||||||
|
Box,
|
||||||
|
Flex,
|
||||||
|
Heading,
|
||||||
|
LinkBox,
|
||||||
|
Spacer,
|
||||||
|
Tab,
|
||||||
|
TabIndicator,
|
||||||
|
TabList,
|
||||||
|
TabPanel,
|
||||||
|
TabPanels,
|
||||||
|
Tabs,
|
||||||
|
Text,
|
||||||
|
useForceUpdate,
|
||||||
|
useInterval,
|
||||||
|
} from "@chakra-ui/react";
|
||||||
import { Link as RouterLink } from "react-router-dom";
|
import { Link as RouterLink } from "react-router-dom";
|
||||||
import { AbstractRelay } from "nostr-tools";
|
import { AbstractRelay } from "nostr-tools";
|
||||||
|
|
||||||
@@ -7,6 +22,8 @@ import { RelayFavicon } from "../../../components/relay-favicon";
|
|||||||
import { RelayStatus } from "../../../components/relay-status";
|
import { RelayStatus } from "../../../components/relay-status";
|
||||||
import HoverLinkOverlay from "../../../components/hover-link-overlay";
|
import HoverLinkOverlay from "../../../components/hover-link-overlay";
|
||||||
import { localRelay } from "../../../services/local-relay";
|
import { localRelay } from "../../../services/local-relay";
|
||||||
|
import useSubjects from "../../../hooks/use-subjects";
|
||||||
|
import Timestamp from "../../../components/timestamp";
|
||||||
|
|
||||||
function RelayRow({ relay }: { relay: AbstractRelay }) {
|
function RelayRow({ relay }: { relay: AbstractRelay }) {
|
||||||
return (
|
return (
|
||||||
@@ -22,14 +39,50 @@ function RelayRow({ relay }: { relay: AbstractRelay }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function TaskManagerRelays() {
|
export default function TaskManagerRelays() {
|
||||||
|
const update = useForceUpdate();
|
||||||
|
useInterval(update, 2000);
|
||||||
|
|
||||||
|
const relays = Array.from(relayPoolService.relays.values())
|
||||||
|
.filter((r) => r !== localRelay)
|
||||||
|
.sort((a, b) => +b.connected - +a.connected || a.url.localeCompare(b.url));
|
||||||
|
|
||||||
|
const notices = useSubjects(Array.from(relayPoolService.notices.values()))
|
||||||
|
.flat()
|
||||||
|
.sort((a, b) => b.date - a.date);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
<Tabs position="relative" variant="unstyled">
|
||||||
|
<TabList>
|
||||||
|
<Tab>Relays ({relays.length})</Tab>
|
||||||
|
<Tab>Notices ({notices.length})</Tab>
|
||||||
|
</TabList>
|
||||||
|
<TabIndicator mt="-1.5px" height="2px" bg="primary.500" borderRadius="1px" />
|
||||||
|
|
||||||
|
<TabPanels>
|
||||||
|
<TabPanel p="0">
|
||||||
<Flex direction="column">
|
<Flex direction="column">
|
||||||
{localRelay instanceof AbstractRelay && <RelayRow relay={localRelay} />}
|
{localRelay instanceof AbstractRelay && <RelayRow relay={localRelay} />}
|
||||||
{Array.from(relayPoolService.relays.values())
|
{relays.map((relay) => (
|
||||||
.filter((r) => r !== localRelay)
|
|
||||||
.map((relay) => (
|
|
||||||
<RelayRow key={relay.url} relay={relay} />
|
<RelayRow key={relay.url} relay={relay} />
|
||||||
))}
|
))}
|
||||||
</Flex>
|
</Flex>
|
||||||
|
</TabPanel>
|
||||||
|
<TabPanel p="0">
|
||||||
|
{notices.map((notice) => (
|
||||||
|
<LinkBox key={notice.date + notice.message} px="2" py="1">
|
||||||
|
<HoverLinkOverlay
|
||||||
|
as={RouterLink}
|
||||||
|
to={`/r/${encodeURIComponent(notice.relay.url)}`}
|
||||||
|
fontFamily="monospace"
|
||||||
|
fontWeight="bold"
|
||||||
|
>
|
||||||
|
{notice.relay.url}
|
||||||
|
</HoverLinkOverlay>
|
||||||
|
<Text fontFamily="monospace">{notice.message}</Text>
|
||||||
|
</LinkBox>
|
||||||
|
))}
|
||||||
|
</TabPanel>
|
||||||
|
</TabPanels>
|
||||||
|
</Tabs>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@@ -26,6 +26,7 @@ import useSubject from "../../../hooks/use-subject";
|
|||||||
import ProcessBranch from "../processes/process/process-tree";
|
import ProcessBranch from "../processes/process/process-tree";
|
||||||
import processManager from "../../../services/process-manager";
|
import processManager from "../../../services/process-manager";
|
||||||
import RelayAuthButton from "../../../components/relays/relay-auth-button";
|
import RelayAuthButton from "../../../components/relays/relay-auth-button";
|
||||||
|
import { RelayStatus } from "../../../components/relay-status";
|
||||||
import Timestamp from "../../../components/timestamp";
|
import Timestamp from "../../../components/timestamp";
|
||||||
|
|
||||||
export default function InspectRelayView() {
|
export default function InspectRelayView() {
|
||||||
@@ -55,15 +56,12 @@ export default function InspectRelayView() {
|
|||||||
<Flex gap="2" alignItems="center" wrap="wrap">
|
<Flex gap="2" alignItems="center" wrap="wrap">
|
||||||
<BackButton size="sm" />
|
<BackButton size="sm" />
|
||||||
<Heading size="md">{url}</Heading>
|
<Heading size="md">{url}</Heading>
|
||||||
|
<RelayStatus relay={relay} />
|
||||||
<Spacer />
|
<Spacer />
|
||||||
<ButtonGroup size="sm">
|
<ButtonGroup size="sm">
|
||||||
<RelayAuthButton relay={relay} />
|
<RelayAuthButton relay={relay} />
|
||||||
<Button
|
<Button variant="outline" colorScheme={connecting ? "orange" : "green"} onClick={connect}>
|
||||||
variant="outline"
|
{connecting ? "Connecting..." : relay.connected ? "Connected" : "Connect"}
|
||||||
colorScheme={connecting ? "orange" : relay.connected ? "green" : "red"}
|
|
||||||
onClick={connect}
|
|
||||||
>
|
|
||||||
{connecting ? "Connecting..." : relay.connected ? "Connected" : "Disconnected"}
|
|
||||||
</Button>
|
</Button>
|
||||||
</ButtonGroup>
|
</ButtonGroup>
|
||||||
</Flex>
|
</Flex>
|
||||||
|
Reference in New Issue
Block a user