* refactor: apply biome formatting to packages/features (batch 1 - small subdirs) Format small subdirectories in packages/features: di, flags, holidays, oauth, settings, users, assignment-reason, selectedCalendar, hashedLink, host, form, form-builder, availability, data-table, pbac, schedules, troubleshooter, eventtypes, calendar-subscription, and root-level files. Also includes straggler apps/web BookEventForm.tsx. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: apply biome formatting to packages/features (batch 2 - medium subdirs) Format medium subdirectories in packages/features: auth, credentials, calendars, routing-forms, routing-trace, attributes, watchlist, calAIPhone, tasker, and webhooks. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: apply biome formatting to packages/features (batch 3 - bookings + insights) Format bookings and insights subdirectories in packages/features. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: apply biome formatting to packages/features (batch 4 - ee) Format packages/features/ee subdirectory covering billing, workflows, organizations, teams, managed-event-types, round-robin, dsync, integration-attribute-sync, and payments. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: apply biome formatting to packages/features (batch 5 - booking-audit part 1) Format booking-audit di, actions, common, dto, repository, and types subdirectories in packages/features/booking-audit. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: apply biome formatting to packages/features (batch 6 - booking-audit part 2) Format booking-audit service subdirectory in packages/features/booking-audit. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import logger from "@calcom/lib/logger";
|
|
import { safeStringify } from "@calcom/lib/safeStringify";
|
|
|
|
import type { WebhookSubscriber } from "./dto/types";
|
|
import getWebhooks from "./getWebhooks";
|
|
import type { GetSubscriberOptions } from "./getWebhooks";
|
|
import sendOrSchedulePayload from "./sendOrSchedulePayload";
|
|
|
|
const log = logger.getSubLogger({ prefix: ["[WebhookService] "] });
|
|
|
|
/** This is a WIP. With minimal methods until the API matures and stabilizes */
|
|
export class WebhookService {
|
|
private constructor(
|
|
private options: GetSubscriberOptions,
|
|
private webhooks: WebhookSubscriber[]
|
|
) {}
|
|
static async init(options: GetSubscriberOptions) {
|
|
const webhooks = await getWebhooks(options);
|
|
return new WebhookService(options, webhooks);
|
|
}
|
|
getWebhooks() {
|
|
return this.webhooks;
|
|
}
|
|
async sendPayload(payload: Parameters<typeof sendOrSchedulePayload>[4]) {
|
|
const promises = this.webhooks.map((sub) =>
|
|
sendOrSchedulePayload(
|
|
sub.secret,
|
|
this.options.triggerEvent,
|
|
new Date().toISOString(),
|
|
sub,
|
|
payload
|
|
).catch((e) => {
|
|
log.error(
|
|
`Error executing webhook for event: ${this.options.triggerEvent}, URL: ${sub.subscriberUrl}`,
|
|
safeStringify(e)
|
|
);
|
|
})
|
|
);
|
|
await Promise.allSettled(promises);
|
|
}
|
|
}
|