2ec9e903ce
* feat: implement webhook tasker with async/sync fallback This PR implements a webhook tasker with async/sync fallback architecture to fix failing E2E tests. The solution follows the existing proration tasker pattern and uses Dependency Injection with @evyweb/ioctopus. Key changes: - Create IWebhookTasker interface for webhook delivery - Implement WebhookSyncTasker for immediate execution (E2E tests) - Implement WebhookAsyncTasker for queued execution (production) - Create main WebhookTasker class extending Tasker<IWebhookTasker> - Add DI modules and tokens for all tasker components - Update WebhookTaskerProducerService to use new WebhookTasker - Add unit tests for sync and async taskers The ENABLE_ASYNC_TASKER flag automatically selects the appropriate mode: - Production: Uses WebhookAsyncTasker to queue tasks - E2E Tests: Uses WebhookSyncTasker for immediate execution This ensures webhooks are delivered immediately in E2E tests without requiring the cron job that processes queued tasks. Co-Authored-By: ali@cal.com <alishahbaz7@gmail.com> * fix: update WebhookTaskerProducerService tests for new interface Update tests to use the new deps-based constructor and mockWebhookTasker.deliverWebhook instead of mockTasker.create Co-Authored-By: ali@cal.com <alishahbaz7@gmail.com> * fix: use moduleLoader pattern for WebhookProducerService in container Co-Authored-By: ali@cal.com <alishahbaz7@gmail.com> * refactor: replace InternalTasker with Trigger.dev for webhook delivery This commit refactors the WebhookTasker to use Trigger.dev instead of InternalTasker, following the pattern established in BookingEmailAndSmsTasker and PlatformOrganizationBillingTasker (PR #26803). Changes: - Replace WebhookAsyncTasker with WebhookTriggerTasker that uses trigger.dev - Create trigger.dev task files (deliver-webhook.ts, config.ts, schema.ts) - Update DI modules to use WebhookTriggerTasker - Remove old InternalTasker-based implementation - Update unit tests for new implementation The WebhookSyncTasker continues to execute webhooks immediately for E2E tests where ENABLE_ASYNC_TASKER is automatically false. Co-Authored-By: ali@cal.com <alishahbaz7@gmail.com> * fix: update comments to reflect Trigger.dev usage instead of InternalTasker Co-Authored-By: unknown <> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
45 lines
1.6 KiB
TypeScript
45 lines
1.6 KiB
TypeScript
import { Tasker } from "@calcom/lib/tasker/Tasker";
|
|
import type { ILogger } from "@calcom/lib/tasker/types";
|
|
|
|
import type { WebhookTaskPayload } from "../types/webhookTask";
|
|
import type { WebhookSyncTasker } from "./WebhookSyncTasker";
|
|
import type { WebhookTriggerTasker } from "./WebhookTriggerTasker";
|
|
import type { IWebhookTasker, WebhookDeliveryResult } from "./types";
|
|
|
|
/**
|
|
* Dependencies for WebhookTasker
|
|
*/
|
|
export interface WebhookTaskerDependencies {
|
|
asyncTasker: WebhookTriggerTasker;
|
|
syncTasker: WebhookSyncTasker;
|
|
logger: ILogger;
|
|
}
|
|
|
|
/**
|
|
* Webhook Tasker with Async/Sync Fallback
|
|
*
|
|
* This tasker automatically selects the appropriate execution mode:
|
|
* - Production (ENABLE_ASYNC_TASKER=true): Uses WebhookTriggerTasker to queue tasks via trigger.dev
|
|
* - E2E Tests (ENABLE_ASYNC_TASKER=false): Uses WebhookSyncTasker for immediate execution
|
|
*
|
|
* The base Tasker class handles the mode selection based on environment variables:
|
|
* - ENABLE_ASYNC_TASKER (automatically false in E2E tests)
|
|
* - TRIGGER_SECRET_KEY
|
|
* - TRIGGER_API_URL
|
|
*
|
|
* This pattern ensures webhooks are delivered immediately in E2E tests
|
|
* without requiring trigger.dev or the cron job that processes queued tasks.
|
|
*
|
|
* This follows the same pattern as BookingEmailAndSmsTasker and
|
|
* PlatformOrganizationBillingTasker.
|
|
*/
|
|
export class WebhookTasker extends Tasker<IWebhookTasker> {
|
|
constructor(dependencies: WebhookTaskerDependencies) {
|
|
super(dependencies);
|
|
}
|
|
|
|
async deliverWebhook(payload: WebhookTaskPayload): Promise<WebhookDeliveryResult> {
|
|
return await this.dispatch("deliverWebhook", payload);
|
|
}
|
|
}
|