/** * Cloudflare R2 Webhook Adapter * * Handles S3-compatible event notifications from Cloudflare R2 Storage * * R2 sends notifications for: * - s3:ObjectCreated:Put * - s3:ObjectCreated:Post * - s3:ObjectCreated:Copy * - s3:ObjectRemoved:Delete * * @example * ```ts * const adapter = new CloudflareR2Webhook({ * secret: process.env.R2_WEBHOOK_SECRET!, * signatureMethod: STORAGE_SIGNATURE_METHOD.HmacSha256, * signatureHeader: 'x-r2-signature', * logger, * }); * * webhookManager.registerAdapter(adapter); * ``` */ import { BaseWebhookAdapter } from '../base/BaseWebhookAdapter'; import type { StorageWebhookPayload, ProcessedStorageWebhookEvent, R2WebhookPayload, CloudflareR2WebhookConfig } from '@plyaz/types/storage'; import { R2WebhookPayloadSchema } from '@plyaz/types/storage'; /** * Cloudflare R2 Webhook Adapter * * Handles S3-compatible event notifications from Cloudflare R2 */ export declare class CloudflareR2Webhook extends BaseWebhookAdapter { readonly providerName: string; readonly eventType: string; readonly schema: typeof R2WebhookPayloadSchema; constructor(config: CloudflareR2WebhookConfig); /** * Process R2 webhook payload * R2 sends an array of records (S3-compatible format) */ process(payload: StorageWebhookPayload): Promise; /** * Process a single R2 event record */ private processRecord; /** * Extract object key from event */ protected extractObjectKey(event: R2WebhookPayload): string; /** * Extract bucket from event */ protected extractBucket(event: R2WebhookPayload): string | undefined; /** * Generate idempotency key * Use bucket + object key + eTag for uniqueness */ getIdempotencyKey(payload: StorageWebhookPayload): string; /** * Check if adapter should process this webhook */ shouldProcess(payload: StorageWebhookPayload): boolean; }