webhookHandler.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. /**
  2. * Webhook handler with modular callback system
  3. */
  4. import logger from './logger.js';
  5. export class WebhookHandler {
  6. constructor() {
  7. this.callbacks = new Map();
  8. this.globalCallbacks = [];
  9. }
  10. /**
  11. * Register a callback for a specific event type
  12. * @param {string} eventType - The Gogs event type (e.g., 'push', 'create', 'delete')
  13. * @param {Function} callback - Function to handle the event (payload, headers) => void
  14. */
  15. on(eventType, callback) {
  16. if (!this.callbacks.has(eventType)) {
  17. this.callbacks.set(eventType, []);
  18. }
  19. this.callbacks.get(eventType).push(callback);
  20. logger.info(`Registered callback for event: ${eventType}`);
  21. }
  22. /**
  23. * Register a global callback that runs for all events
  24. * @param {Function} callback - Function to handle any event (eventType, payload, headers) => void
  25. */
  26. onAny(callback) {
  27. this.globalCallbacks.push(callback);
  28. logger.info('Registered global callback');
  29. }
  30. /**
  31. * Process an incoming webhook
  32. * @param {string} eventType - The event type from X-Gogs-Event header
  33. * @param {object} payload - The parsed webhook payload
  34. * @param {object} headers - Request headers
  35. */
  36. async handle(eventType, payload, headers) {
  37. logger.webhook(eventType, payload);
  38. // Execute global callbacks
  39. for (const callback of this.globalCallbacks) {
  40. try {
  41. await callback(eventType, payload, headers);
  42. } catch (error) {
  43. logger.error('Error in global callback', error);
  44. }
  45. }
  46. // Execute event-specific callbacks
  47. const callbacks = this.callbacks.get(eventType);
  48. if (callbacks && callbacks.length > 0) {
  49. for (const callback of callbacks) {
  50. try {
  51. await callback(payload, headers);
  52. } catch (error) {
  53. logger.error(`Error in callback for event '${eventType}'`, error);
  54. }
  55. }
  56. }
  57. }
  58. /**
  59. * Get count of registered callbacks
  60. */
  61. getStats() {
  62. return {
  63. globalCallbacks: this.globalCallbacks.length,
  64. eventCallbacks: Object.fromEntries(
  65. Array.from(this.callbacks.entries()).map(([event, cbs]) => [event, cbs.length])
  66. )
  67. };
  68. }
  69. }