diff --git a/packages/server/src/utils/federationWorker.ts b/packages/server/src/utils/federationWorker.ts index 233561fc..8d3ad240 100644 --- a/packages/server/src/utils/federationWorker.ts +++ b/packages/server/src/utils/federationWorker.ts @@ -11,7 +11,7 @@ import { getDmMessageWithUser } from '../routes/dm.js'; import { connectionManager } from '../ws/handler.js'; import { generateThumbnail } from './thumbnail.js'; import type { FederationRelayRequest, FederationRelayResponse, FederationRelayEvent } from '@backspace/shared'; -import { onPeerActivated, startupBootstrapSync } from './federationPeerActivation.js'; +import { onPeerActivated, startupBootstrapSync, onPeerDeactivated } from './federationPeerActivation.js'; import fs from 'node:fs'; import path from 'node:path'; import crypto from 'node:crypto'; @@ -310,6 +310,9 @@ export async function processOutboxTick(): Promise { }) .where(eq(schema.federationPeers.id, peerId)) .run(); + onPeerDeactivated(peerId, 'auth_threshold').catch(err => + console.error('[federation-worker] onPeerDeactivated from auth threshold failed:', err) + ); console.warn( `[federation-worker] Peer ${peerOrigin} transitioned to needs_attention after ${decision.newAuthFailures} consecutive ${response.status} responses`, ); @@ -416,6 +419,12 @@ function handleOutboxDeliveryFailure( .set(updates) .where(eq(schema.federationPeers.id, peerId)) .run(); + + if (newFailures >= PEER_UNREACHABLE_THRESHOLD) { + onPeerDeactivated(peerId, 'network_threshold').catch(err => + console.error('[federation-worker] onPeerDeactivated from unreachable threshold failed:', err) + ); + } } // ─── Pending Peer Resolution ─────────────────────────────────────────────── @@ -468,6 +477,10 @@ async function resolvePendingPeers(): Promise { .where(eq(schema.federationOutbox.peerId, peerId)) .run(); + onPeerDeactivated(peerId, 'remote_rejected').catch(err => + console.error('[federation-worker] onPeerDeactivated from resolvePendingPeers rejected failed:', err) + ); + // Push federation_peer_rejected WS event to affected users pushPeerRejectedEvent(peerOrigin, contextMap); // Notify admins of peer state change