Advanced Usage
Processing Different Event Types
app.post('/webhook', (req, res) => {
try {
const result = sdk.getEventFromRequest(req, WEBHOOK_SECRET);
if (!result.isValid) {
return res.status(400).json({ error: result.error });
}
const payload = result.payload;
// Process based on event type
if (payload.event.name === 'Transfer') {
handleTransferEvent(payload);
} else if (payload.event.name === 'Approval') {
handleApprovalEvent(payload);
} else {
console.log('Unknown event type:', payload.event.name);
}
res.json({ received: true });
} catch (error) {
console.error('Webhook error:', error.message);
res.status(500).json({ error: 'Internal server error' });
}
});
function handleTransferEvent(payload) {
const { from, to, value } = payload.event.args;
console.log(`Transfer: ${from} -> ${to}, value: ${value}`);
// Your business logic here
// Examples: Save to database, send notifications, update UI, etc.
}
Error Handling
const result = sdk.getEventFromRequest(req, WEBHOOK_SECRET);
if (!result.isValid) {
console.error('Webhook validation failed:', result.error);
return res.status(400).json({ error: result.error });
}
// Process verified event
const payload = result.payload;
Handling Retries
MOUNTAIN will retry failed webhook deliveries. Ensure your endpoint is idempotent:
const processedEvents = new Set();
app.post('/webhook', (req, res) => {
try {
const result = sdk.getEventFromRequest(req, WEBHOOK_SECRET);
if (!result.isValid) {
return res.status(400).json({ error: result.error });
}
const payload = result.payload;
// Check if we've already processed this event
if (processedEvents.has(payload.id)) {
console.log('Event already processed:', payload.id);
return res.json({ received: true });
}
// Process the event
processEvent(payload);
// Mark as processed
processedEvents.add(payload.id);
res.json({ received: true });
} catch (error) {
console.error('Webhook error:', error.message);
res.status(500).json({ error: 'Internal server error' });
}
});