feresbr-webhooktester
Version:
A real-time webhook testing tool for local development. See webhook data instantly in your browser, making it easy to debug integrations with services like Stripe, PayPal, and others.
102 lines (89 loc) • 3.29 kB
JavaScript
const express = require('express');
const bodyParser = require('body-parser');
const WebSocket = require('ws');
module.exports = function createWebhookTester(options = {}) {
const app = express();
const port = options.port || 3000;
const webhookPath = options.path || '/webhook';
const webhookData = [];
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
const wss = new WebSocket.Server({ noServer: true });
wss.on('connection', ws => {
ws.send(JSON.stringify(webhookData));
ws.on('close', () => {
console.log('Client disconnected');
});
});
app.post(webhookPath, (req, res) => {
const newWebhook = {
headers: req.headers,
body: req.body,
timestamp: new Date().toISOString(),
};
webhookData.push(newWebhook);
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify([newWebhook]));
}
});
res.status(200).send('Webhook received');
});
app.post('/clear', (req, res) => {
webhookData.length = 0;
wss.clients.forEach(client => {
if (client.readyState === WebSocket.OPEN) {
client.send(JSON.stringify([]));
}
});
res.redirect('/');
});
app.get('/', (req, res) => {
res.send(`
<h1>Webhook Tester</h1>
<p>Send webhooks to <code>${webhookPath}</code></p>
<div id="webhook-data"></div>
<script>
const ws = new WebSocket('ws://' + window.location.host);
const webhookDataElement = document.getElementById('webhook-data');
ws.onopen = () => console.log('Connected to WebSocket server');
ws.onmessage = (event) => {
const newWebhooks = JSON.parse(event.data);
let html = "";
newWebhooks.forEach(webhook => {
html += "<pre>" + JSON.stringify(webhook, null, 2) + "</pre><hr>";
})
webhookDataElement.innerHTML += html;
};
ws.onclose = () => console.log('Disconnected from WebSocket server');
</script>
`);
});
let server;
return {
start: () => {
return new Promise((resolve, reject) => {
server = app.listen(port, (err) => {
if (err) {
reject(err);
} else {
console.log(`Webhook tester listening on port ${port}`);
server.on('upgrade', (request, socket, head) => {
wss.handleUpgrade(request, socket, head, socket => {
wss.emit('connection', socket, request);
});
});
resolve(`http://localhost:${port}`);
}
});
});
},
stop: () => {
if (server) {
server.close();
console.log("Webhook tester stopped")
}
},
getWebhooks: () => webhookData,
};
};