/** * Webhook event type system for Contentstack. * * The raw payload has `module` and `event` as separate fields. * We compute a `type` field as `"${module}.${event}"` for discriminated union dispatch. */ interface WebhookHandlerConfig { secret: string; } interface BaseWebhookEvent { type: string; module: string; event: string; api_key: string; data: Record; triggered_at: string; } interface EntryPublishEvent { type: "entry.publish"; module: "entry"; event: "publish"; api_key: string; data: { entry: { uid: string; title: string; }; content_type: { uid: string; }; environment: { name: string; }; locale: string; }; triggered_at: string; } interface EntryUnpublishEvent { type: "entry.unpublish"; module: "entry"; event: "unpublish"; api_key: string; data: { entry: { uid: string; title: string; }; content_type: { uid: string; }; environment: { name: string; }; locale: string; }; triggered_at: string; } interface EntryUpdateEvent { type: "entry.update"; module: "entry"; event: "update"; api_key: string; data: { entry: { uid: string; title: string; }; content_type: { uid: string; }; }; triggered_at: string; } interface EntryCreateEvent { type: "entry.create"; module: "entry"; event: "create"; api_key: string; data: { entry: { uid: string; title: string; }; content_type: { uid: string; }; }; triggered_at: string; } interface EntryDeleteEvent { type: "entry.delete"; module: "entry"; event: "delete"; api_key: string; data: { entry: { uid: string; }; content_type: { uid: string; }; }; triggered_at: string; } interface AssetPublishEvent { type: "asset.publish"; module: "asset"; event: "publish"; api_key: string; data: { asset: { uid: string; filename: string; }; environment: { name: string; }; }; triggered_at: string; } interface AssetUnpublishEvent { type: "asset.unpublish"; module: "asset"; event: "unpublish"; api_key: string; data: { asset: { uid: string; filename: string; }; environment: { name: string; }; }; triggered_at: string; } interface AssetDeleteEvent { type: "asset.delete"; module: "asset"; event: "delete"; api_key: string; data: { asset: { uid: string; }; }; triggered_at: string; } interface ContentTypeCreateEvent { type: "content_type.create"; module: "content_type"; event: "create"; api_key: string; data: { content_type: { uid: string; title: string; }; }; triggered_at: string; } interface ContentTypeUpdateEvent { type: "content_type.update"; module: "content_type"; event: "update"; api_key: string; data: { content_type: { uid: string; title: string; }; }; triggered_at: string; } interface ContentTypeDeleteEvent { type: "content_type.delete"; module: "content_type"; event: "delete"; api_key: string; data: { content_type: { uid: string; title: string; }; }; triggered_at: string; } type WebhookEvent = EntryPublishEvent | EntryUnpublishEvent | EntryUpdateEvent | EntryCreateEvent | EntryDeleteEvent | AssetPublishEvent | AssetUnpublishEvent | AssetDeleteEvent | ContentTypeCreateEvent | ContentTypeUpdateEvent | ContentTypeDeleteEvent | BaseWebhookEvent; /** * Webhook signature verification using HMAC-SHA256. * Uses the Web Crypto API for cross-runtime compatibility (Node 18+, Deno, Bun, edge). */ /** * Verify a Contentstack webhook signature using HMAC-SHA256. * * @param body - The raw request body string * @param signature - The hex-encoded signature from the `X-Contentstack-Request-Signature` header * @param secret - The webhook secret configured in Contentstack * @returns `true` if the signature is valid */ declare function verifyWebhookSignature(body: string, signature: string, secret: string): Promise; /** * Create a webhook handler with signature verification and typed event parsing. * * @example * ```ts * const handler = createWebhookHandler({ secret: process.env.WEBHOOK_SECRET }) * * // In a route handler: * const event = await handler.verify(request) * if (event.type === "entry.publish") { * console.log(event.data.entry.uid) * } * ``` */ declare function createWebhookHandler(config: WebhookHandlerConfig): { /** * Read the request body, verify the signature, and return a typed event. * Throws `ContentstackAuthError` if the signature is missing or invalid. */ verify(request: Request): Promise; /** * Read the request body and return a typed event without verifying the signature. */ parse(request: Request): Promise; }; export { type AssetDeleteEvent, type AssetPublishEvent, type AssetUnpublishEvent, type BaseWebhookEvent, type ContentTypeCreateEvent, type ContentTypeDeleteEvent, type ContentTypeUpdateEvent, type EntryCreateEvent, type EntryDeleteEvent, type EntryPublishEvent, type EntryUnpublishEvent, type EntryUpdateEvent, type WebhookEvent, type WebhookHandlerConfig, createWebhookHandler, verifyWebhookSignature };