From f94b3b93f75db9ef6a6544fb6e83343a7741f163 Mon Sep 17 00:00:00 2001 From: Jannis Braun <151788261+TheZwiss@users.noreply.github.com> Date: Wed, 1 Apr 2026 01:24:15 +0200 Subject: [PATCH] feat(web): add federation API client methods for rotation, peer update, and permanent delete --- packages/web/src/api/client.ts | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/web/src/api/client.ts b/packages/web/src/api/client.ts index dd585dfe..4f158e9e 100644 --- a/packages/web/src/api/client.ts +++ b/packages/web/src/api/client.ts @@ -59,6 +59,21 @@ export class RateLimitError extends Error { } } +export interface FederationPeer { + id: string; + origin: string; + instanceName: string | null; + status: string; + lastSeenAt: number | null; + lastFailureAt: number | null; + consecutiveFailures: number | null; + lastSyncedAt: number | null; + createdAt: number; + secretRotatedAt: number | null; + rotationInProgress: boolean; + autoRotateIntervalDays: number; +} + export class BackspaceApiClient { readonly auth: { register: (data: RegisterRequest) => Promise; @@ -201,9 +216,12 @@ export class BackspaceApiClient { }; readonly federation: { - initiatePeering: (data: { remoteOrigin: string }) => Promise<{ peer: { id: string; origin: string; instanceName: string | null; status: string; lastSeenAt: number | null; createdAt: number } }>; - peers: () => Promise<{ peers: Array<{ id: string; origin: string; instanceName: string | null; status: string; lastSeenAt: number | null; lastFailureAt: number | null; consecutiveFailures: number | null; lastSyncedAt: number | null; createdAt: number }> }>; + initiatePeering: (data: { remoteOrigin: string }) => Promise<{ peer: FederationPeer }>; + peers: () => Promise<{ peers: FederationPeer[] }>; revokePeer: (id: string) => Promise<{ success: boolean }>; + rotatePeerSecret: (id: string) => Promise<{ success: boolean; gracePeriodMs: number }>; + updatePeer: (id: string, data: { autoRotateIntervalDays: number }) => Promise<{ peer: FederationPeer }>; + deletePeerPermanently: (id: string) => Promise<{ success: boolean }>; }; readonly admin: { @@ -626,15 +644,21 @@ export class BackspaceApiClient { this.federation = { initiatePeering: (data: { remoteOrigin: string }) => - request<{ peer: { id: string; origin: string; instanceName: string | null; status: string; lastSeenAt: number | null; createdAt: number } }>( + request<{ peer: FederationPeer }>( 'POST', '/federation/peer/initiate', data ), peers: () => - request<{ peers: Array<{ id: string; origin: string; instanceName: string | null; status: string; lastSeenAt: number | null; lastFailureAt: number | null; consecutiveFailures: number | null; lastSyncedAt: number | null; createdAt: number }> }>( + request<{ peers: FederationPeer[] }>( 'GET', '/federation/peers' ), revokePeer: (id: string) => request<{ success: boolean }>('DELETE', `/federation/peers/${id}`), + rotatePeerSecret: (id: string) => + request<{ success: boolean; gracePeriodMs: number }>('POST', `/federation/peers/${id}/rotate`), + updatePeer: (id: string, data: { autoRotateIntervalDays: number }) => + request<{ peer: FederationPeer }>('PATCH', `/federation/peers/${id}`, data), + deletePeerPermanently: (id: string) => + request<{ success: boolean }>('DELETE', `/federation/peers/${id}/permanent`), }; this.admin = {