@@ -7,6 +7,7 @@ import type {
77import {
88 canonicalizeWebhookPayload ,
99 enqueueWebhookDeliveries ,
10+ getDeliveryHistory ,
1011 verifyWebhookSignature ,
1112} from '../services/webhooks/index.js' ;
1213import logger from '../utils/logger.js' ;
@@ -55,6 +56,39 @@ router.get('/health', async (_req: Request, res: Response) => {
5556 } ) ;
5657} ) ;
5758
59+ // GET /deliveries — delivery log inspection for the admin dashboard.
60+ // Returns recent webhook delivery attempts (in-memory rolling window),
61+ // optionally filtered by destination URL or event type.
62+ router . get ( '/deliveries' , async ( req : Request , res : Response ) => {
63+ try {
64+ const { url, event, state, limit } = req . query ;
65+
66+ let deliveries = getDeliveryHistory ( ) ;
67+
68+ if ( typeof url === 'string' && url . length > 0 ) {
69+ deliveries = deliveries . filter ( ( d ) => d . destinationUrl . includes ( url ) ) ;
70+ }
71+ if ( typeof event === 'string' && event . length > 0 ) {
72+ deliveries = deliveries . filter ( ( d ) => d . eventType === event ) ;
73+ }
74+ if ( typeof state === 'string' && state . length > 0 ) {
75+ deliveries = deliveries . filter ( ( d ) => d . state === state ) ;
76+ }
77+
78+ const parsedLimit = Number ( limit ) ;
79+ const capped = Number . isFinite ( parsedLimit ) && parsedLimit > 0 ? Math . min ( parsedLimit , 500 ) : 100 ;
80+
81+ return res . status ( 200 ) . json ( {
82+ status : 'success' ,
83+ count : deliveries . length ,
84+ deliveries : deliveries . slice ( 0 , capped ) ,
85+ } ) ;
86+ } catch ( error ) {
87+ logger . error ( 'Failed to list webhook deliveries:' , error ) ;
88+ return res . status ( 500 ) . json ( { error : 'Failed to list webhook deliveries' } ) ;
89+ }
90+ } ) ;
91+
5892import {
5993 getStellarWebhookSecret ,
6094 processStellarHorizonWebhook ,
0 commit comments