From c14a8c24fc3dec2446310b218ec26074e1f319d1 Mon Sep 17 00:00:00 2001 From: Bas van den Aakster Date: Wed, 10 Dec 2025 19:17:19 +0100 Subject: [PATCH] Add efficient batch polling endpoint for answered offers Added GET /offers/answered endpoint that returns all answered offers for the authenticated peer with optional 'since' timestamp filtering. This allows offerers to efficiently poll for all incoming connections in a single request instead of polling each offer individually. --- src/app.ts | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/app.ts b/src/app.ts index 2dc7dd9..bef60db 100644 --- a/src/app.ts +++ b/src/app.ts @@ -528,6 +528,38 @@ export function createApp(storage: Storage, config: Config) { } }); + /** + * GET /offers/answered + * Get all answered offers for the authenticated peer (efficient batch polling) + */ + app.get('/offers/answered', authMiddleware, async (c) => { + try { + const peerId = getAuthenticatedPeerId(c); + const since = c.req.query('since'); + const sinceTimestamp = since ? parseInt(since, 10) : 0; + + const offers = await storage.getAnsweredOffers(peerId); + + // Filter by timestamp if provided + const filteredOffers = since + ? offers.filter(offer => offer.answeredAt && offer.answeredAt > sinceTimestamp) + : offers; + + return c.json({ + offers: filteredOffers.map(offer => ({ + offerId: offer.id, + serviceId: offer.serviceId, + answererId: offer.answererPeerId, + sdp: offer.answerSdp, + answeredAt: offer.answeredAt + })) + }, 200); + } catch (err) { + console.error('Error getting answered offers:', err); + return c.json({ error: 'Internal server error' }, 500); + } + }); + /** * POST /services/:fqn/offers/:offerId/ice-candidates * Add ICE candidates for a specific offer