feat(server): sendCallRelay surfaces undeliverable messageIds (#18)

CallRelayResult success arm gains undeliverable: string[]. sendCallRelay
parses FederationRelayResponse.undeliverable (when present) and returns
the messageIds so sendFederatedCallStart can reclassify per-peer results.
Old peers that omit the field → empty array → today's behavior.
TDD — three tests cover old-peer, new-peer-with-undeliverable, and 5xx paths.
This commit is contained in:
Jannis Braun
2026-04-24 21:05:28 +02:00
parent 7533d8ca14
commit 7d2137b6d4
3 changed files with 157 additions and 5 deletions
@@ -144,7 +144,7 @@ describe('handleDmCallEnd Path-2 relay failure', () => {
const fedCall = makeFedCall({ state: 'active' });
connectionManager.createFederatedCall(fedCall);
const sendToUserSpy = vi.spyOn(connectionManager, 'sendToUser');
sendCallRelayMock.mockResolvedValue({ ok: true });
sendCallRelayMock.mockResolvedValue({ ok: true, undeliverable: [] });
await handleDmCallEndForTest(
{ federatedCallId: fedCall.federatedId },
@@ -191,7 +191,7 @@ describe('handleDmCallReject Path-2 relay failure', () => {
const fedCall = makeFedCall();
connectionManager.createFederatedCall(fedCall);
const sendToUserSpy = vi.spyOn(connectionManager, 'sendToUser');
sendCallRelayMock.mockResolvedValue({ ok: true });
sendCallRelayMock.mockResolvedValue({ ok: true, undeliverable: [] });
await handleDmCallRejectForTest(
{ federatedCallId: fedCall.federatedId },
@@ -282,7 +282,7 @@ describe('handleDmCallAccept Path-2 relay failure', () => {
const fedCall = makeFedCall();
connectionManager.createFederatedCall(fedCall);
const sendToUserSpy = vi.spyOn(connectionManager, 'sendToUser');
sendCallRelayMock.mockResolvedValue({ ok: true });
sendCallRelayMock.mockResolvedValue({ ok: true, undeliverable: [] });
await handleDmCallAcceptForTest(
{ federatedCallId: fedCall.federatedId },