nodejs-cryptomus
Version:
A comprehensive Node.js client for the Cryptomus API
72 lines (61 loc) • 2.25 kB
text/typescript
import { WebhookPayload, PaymentWebhookPayload, PayoutWebhookPayload } from '../types';
import { verifyWebhookSignature } from '../utils/signature';
/**
* Webhook service for handling and validating webhooks
*/
export class WebhookService {
private readonly apiKey: string;
/**
* Create a new webhook service
*
* @param apiKey - API key for signature verification
*/
constructor(apiKey: string) {
this.apiKey = apiKey;
}
/**
* Parse and validate a webhook payload
*
* @param payload - Raw webhook payload as string
* @param signature - Signature from webhook headers
* @returns Parsed webhook payload
* @throws Error if signature is invalid
*/
parseWebhook(payload: string, signature: string): WebhookPayload {
if (!verifyWebhookSignature(payload, signature, this.apiKey)) {
throw new Error('Invalid webhook signature');
}
const parsedPayload = JSON.parse(payload) as WebhookPayload;
return parsedPayload;
}
/**
* Parse and validate a payment webhook payload
*
* @param payload - Raw webhook payload as string
* @param signature - Signature from webhook headers
* @returns Parsed payment webhook payload
* @throws Error if signature is invalid or payload type is not payment
*/
parsePaymentWebhook(payload: string, signature: string): PaymentWebhookPayload {
const parsedPayload = this.parseWebhook(payload, signature);
if (parsedPayload.type !== 'payment') {
throw new Error('Invalid webhook type, expected payment webhook');
}
return parsedPayload as PaymentWebhookPayload;
}
/**
* Parse and validate a payout webhook payload
*
* @param payload - Raw webhook payload as string
* @param signature - Signature from webhook headers
* @returns Parsed payout webhook payload
* @throws Error if signature is invalid or payload type is not payout
*/
parsePayoutWebhook(payload: string, signature: string): PayoutWebhookPayload {
const parsedPayload = this.parseWebhook(payload, signature);
if (parsedPayload.type !== 'payout') {
throw new Error('Invalid webhook type, expected payout webhook');
}
return parsedPayload as PayoutWebhookPayload;
}
}