diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/PeerManager.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/PeerManager.java index e5653848..05242302 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/PeerManager.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/PeerManager.java @@ -180,7 +180,7 @@ public class PeerManager { }); } - private Optional selectBestAddress(PeerId host) { + public Optional selectBestAddress(PeerId host) { return peerDiscoveryDirectory.getForPeer(host).stream().min(Comparator.comparing(PeerAddress::type)); } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/KnownPeerInfo.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/KnownPeerInfo.java index 6700fc78..5cd2e561 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/KnownPeerInfo.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/KnownPeerInfo.java @@ -1,4 +1,6 @@ package com.usatiuk.dhfs.repository.webapi; -public record KnownPeerInfo(String uuid) { +import jakarta.annotation.Nullable; + +public record KnownPeerInfo(String uuid, @Nullable String knownAddress) { } diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/KnownPeers.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/KnownPeers.java new file mode 100644 index 00000000..5e7fe932 --- /dev/null +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/KnownPeers.java @@ -0,0 +1,6 @@ +package com.usatiuk.dhfs.repository.webapi; + +import java.util.List; + +public record KnownPeers(List peers, String selfUuid) { +} diff --git a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/PeerManagementApi.java b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/PeerManagementApi.java index 272a3a69..aa19e6d1 100644 --- a/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/PeerManagementApi.java +++ b/dhfs-parent/sync-base/src/main/java/com/usatiuk/dhfs/repository/webapi/PeerManagementApi.java @@ -2,6 +2,7 @@ package com.usatiuk.dhfs.repository.webapi; import com.usatiuk.dhfs.PeerId; import com.usatiuk.dhfs.repository.PeerManager; +import com.usatiuk.dhfs.repository.PersistentPeerDataService; import com.usatiuk.dhfs.repository.peersync.PeerInfoService; import jakarta.inject.Inject; import jakarta.ws.rs.DELETE; @@ -11,6 +12,8 @@ import jakarta.ws.rs.Path; import java.util.Collection; import java.util.List; +import java.util.Objects; +import java.util.Optional; @Path("/peers-manage") public class PeerManagementApi { @@ -18,11 +21,15 @@ public class PeerManagementApi { PeerInfoService peerInfoService; @Inject PeerManager peerManager; + @Inject + PersistentPeerDataService persistentPeerDataService; @Path("known-peers") @GET - public List knownPeers() { - return peerInfoService.getPeers().stream().map(peerInfo -> new KnownPeerInfo(peerInfo.id().toString())).toList(); + public KnownPeers knownPeers() { + return new KnownPeers(peerInfoService.getPeers().stream().map(peerInfo -> new KnownPeerInfo(peerInfo.id().toString(), + Optional.ofNullable(peerManager.getAddress(peerInfo.id())).map(Objects::toString).orElse(null))).toList(), + persistentPeerDataService.getSelfUuid().toString()); } @Path("known-peers") @@ -40,7 +47,10 @@ public class PeerManagementApi { @Path("available-peers") @GET public Collection availablePeers() { - return peerManager.getSeenButNotAddedHosts().stream().map(p -> new KnownPeerInfo(p.toString())).toList(); + return peerManager.getSeenButNotAddedHosts().stream() + .map(p -> new KnownPeerInfo(p.toString(), + peerManager.selectBestAddress(p).map(Objects::toString).orElse(null))) + .toList(); } @Path("peer-state") diff --git a/webui/src/PeerAvailableCard.tsx b/webui/src/PeerAvailableCard.tsx index 0798f654..d813be9c 100644 --- a/webui/src/PeerAvailableCard.tsx +++ b/webui/src/PeerAvailableCard.tsx @@ -12,8 +12,14 @@ export function PeerAvailableCard({ peerInfo }: TPeerAvailableCardProps) { return (
- UUID: - {peerInfo.uuid} +
+ UUID: + {peerInfo.uuid} +
+
+ Address: + {peerInfo.knownAddress} +
+
+ UUID: {peerInfo.uuid} +
+
+ Address: + {peerInfo.knownAddress || "not connected"} +
; - const knownPeers = loaderData.knownPeers.map((p) => ( - - )); + const knownPeers = loaderData.knownPeers.peers + .filter((p) => p.uuid !== loaderData.knownPeers.selfUuid) + .map((p) => ); const availablePeers = loaderData.availablePeers.map((p) => ( @@ -18,6 +18,7 @@ export function PeerState() { return (
+
Self UUID: {loaderData.knownPeers.selfUuid}
Known peers
{knownPeers}
diff --git a/webui/src/api/PeerState.ts b/webui/src/api/PeerState.ts index 7fa6aca0..3c5bb399 100644 --- a/webui/src/api/PeerState.ts +++ b/webui/src/api/PeerState.ts @@ -1,13 +1,13 @@ import { fetchJSON, fetchJSON_throws } from "./utils"; import { AvailablePeerInfoToResp, - KnownPeerInfoToResp, + KnownPeersToResp, NoContentToResp, PeerAddressInfoToResp, TAvailablePeerInfoArrTo, TAvailablePeerInfoToResp, - TKnownPeerInfoArrTo, - TKnownPeerInfoToResp, + TKnownPeerInfoArrTo, TKnownPeersTo, + TKnownPeersToResp, TNoContentToResp, TPeerAddressInfoArrTo, TPeerAddressInfoToResp, @@ -20,11 +20,11 @@ export async function getAvailablePeers(): Promise { >("/peers-manage/available-peers", "GET", AvailablePeerInfoToResp); } -export async function getKnownPeers(): Promise { - return fetchJSON_throws( +export async function getKnownPeers(): Promise { + return fetchJSON_throws( "/peers-manage/known-peers", "GET", - KnownPeerInfoToResp, + KnownPeersToResp, ); } diff --git a/webui/src/api/dto.ts b/webui/src/api/dto.ts index 98eb22a7..f893a623 100644 --- a/webui/src/api/dto.ts +++ b/webui/src/api/dto.ts @@ -39,6 +39,7 @@ export type TTokenToResp = z.infer; // AvailablePeerInfo export const AvailablePeerInfoTo = z.object({ uuid: z.string(), + knownAddress: z.string().optional(), // addr: z.string(), // port: z.number(), }); @@ -55,14 +56,21 @@ export type TAvailablePeerInfoToResp = z.infer; // KnownPeerInfo export const KnownPeerInfoTo = z.object({ uuid: z.string(), + knownAddress: z.string().optional(), }); export type TKnownPeerInfoTo = z.infer; export const KnownPeerInfoArrTo = z.array(KnownPeerInfoTo); export type TKnownPeerInfoArrTo = z.infer; -export const KnownPeerInfoToResp = CreateAPIResponse(KnownPeerInfoArrTo); -export type TKnownPeerInfoToResp = z.infer; +export const KnownPeersTo = z.object({ + selfUuid: z.string(), + peers: KnownPeerInfoArrTo, +}); +export type TKnownPeersTo = z.infer; + +export const KnownPeersToResp = CreateAPIResponse(KnownPeersTo); +export type TKnownPeersToResp = z.infer; // PeerAddressInfo export const PeerAddressInfoTo = z.object({