feat(release): v1.14.0 discovery and conf pages
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
const { Webhook } = require('../models/webhook');
|
||||
const crypto = require('crypto');
|
||||
const fetch = require('node-fetch');
|
||||
|
||||
class WebhookEmitter {
|
||||
static async emit(event, payload) {
|
||||
try {
|
||||
const hooks = await Webhook.list({ where: { isActive: true } });
|
||||
const matched = hooks.filter(h => !h.events || h.events.length === 0 || h.events.includes(event));
|
||||
|
||||
for (const hook of matched) {
|
||||
this.sendPayload(hook, event, payload).catch(err => console.error(`Webhook ${hook.name} failed:`, err.message));
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Error emitting webhook:', e);
|
||||
}
|
||||
}
|
||||
|
||||
static async sendPayload(hook, event, payload) {
|
||||
const body = JSON.stringify({ event, payload, timestamp: Date.now() });
|
||||
const headers = { 'Content-Type': 'application/json' };
|
||||
|
||||
if (hook.secret) {
|
||||
const signature = crypto.createHmac('sha256', hook.secret).update(body).digest('hex');
|
||||
headers['X-Theta-Signature'] = signature;
|
||||
}
|
||||
|
||||
const res = await fetch(hook.url, { method: 'POST', body, headers, timeout: 5000 });
|
||||
if (!res.ok) {
|
||||
throw new Error(`Status ${res.status}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { WebhookEmitter };
|
||||
Reference in New Issue
Block a user