Files
simstudioai--sim/apps/sim/lib/webhooks/providers/registry.ts
T
wehub-resource-sync d25d482dc2
CI / Migrate Dev DB (push) Has been skipped
CI / Detect Version (push) Has been cancelled
CI / Migrate DB (push) Has been cancelled
CI / Build Dev ECR (./docker/app.Dockerfile, ECR_APP) (push) Has been cancelled
CI / Build Dev ECR (./docker/db.Dockerfile, ECR_MIGRATIONS) (push) Has been cancelled
CI / Build Dev ECR (./docker/pii.Dockerfile, ECR_PII) (push) Has been cancelled
CI / Build Dev ECR (./docker/realtime.Dockerfile, ECR_REALTIME) (push) Has been cancelled
CI / Deploy Trigger.dev (Dev) (push) Has been cancelled
CI / Build AMD64 (./docker/app.Dockerfile, ECR_APP, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build AMD64 (./docker/db.Dockerfile, ECR_MIGRATIONS, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build AMD64 (./docker/pii.Dockerfile, ECR_PII, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build AMD64 (./docker/realtime.Dockerfile, ECR_REALTIME, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/app.Dockerfile, ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/db.Dockerfile, ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/pii.Dockerfile, ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Build ARM64 (GHCR Only) (./docker/realtime.Dockerfile, ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/migrations) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/pii) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/realtime) (push) Has been cancelled
CI / Create GHCR Manifests (ghcr.io/simstudioai/simstudio) (push) Has been cancelled
CI / Check Docs Changes (push) Has been cancelled
CI / Process Docs (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled
CI / Test and Build (push) Has been cancelled
Publish CLI Package / publish-npm (push) Has been cancelled
Publish Python SDK / publish-pypi (push) Has been cancelled
Publish TypeScript SDK / publish-npm (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:20:55 +08:00

147 lines
6.4 KiB
TypeScript

import { createLogger } from '@sim/logger'
import { NextResponse } from 'next/server'
import { airtableHandler } from '@/lib/webhooks/providers/airtable'
import { ashbyHandler } from '@/lib/webhooks/providers/ashby'
import { attioHandler } from '@/lib/webhooks/providers/attio'
import { azureDevOpsHandler } from '@/lib/webhooks/providers/azure-devops'
import { calcomHandler } from '@/lib/webhooks/providers/calcom'
import { calendlyHandler } from '@/lib/webhooks/providers/calendly'
import { circlebackHandler } from '@/lib/webhooks/providers/circleback'
import { clerkHandler } from '@/lib/webhooks/providers/clerk'
import { confluenceHandler } from '@/lib/webhooks/providers/confluence'
import { emailBisonHandler } from '@/lib/webhooks/providers/emailbison'
import { fathomHandler } from '@/lib/webhooks/providers/fathom'
import { firefliesHandler } from '@/lib/webhooks/providers/fireflies'
import { genericHandler } from '@/lib/webhooks/providers/generic'
import { githubHandler } from '@/lib/webhooks/providers/github'
import { gitlabHandler } from '@/lib/webhooks/providers/gitlab'
import { gmailHandler } from '@/lib/webhooks/providers/gmail'
import { gongHandler } from '@/lib/webhooks/providers/gong'
import { googleFormsHandler } from '@/lib/webhooks/providers/google-forms'
import { grainHandler } from '@/lib/webhooks/providers/grain'
import { greenhouseHandler } from '@/lib/webhooks/providers/greenhouse'
import { imapHandler } from '@/lib/webhooks/providers/imap'
import { incidentioHandler } from '@/lib/webhooks/providers/incidentio'
import { instantlyHandler } from '@/lib/webhooks/providers/instantly'
import { intercomHandler } from '@/lib/webhooks/providers/intercom'
import { jiraHandler } from '@/lib/webhooks/providers/jira'
import { jsmHandler } from '@/lib/webhooks/providers/jsm'
import { lemlistHandler } from '@/lib/webhooks/providers/lemlist'
import { linearHandler } from '@/lib/webhooks/providers/linear'
import { linqHandler } from '@/lib/webhooks/providers/linq'
import { loopsHandler } from '@/lib/webhooks/providers/loops'
import { microsoftTeamsHandler } from '@/lib/webhooks/providers/microsoft-teams'
import { mondayHandler } from '@/lib/webhooks/providers/monday'
import { notionHandler } from '@/lib/webhooks/providers/notion'
import { outlookHandler } from '@/lib/webhooks/providers/outlook'
import { pagerdutyHandler } from '@/lib/webhooks/providers/pagerduty'
import { resendHandler } from '@/lib/webhooks/providers/resend'
import { revenueCatHandler } from '@/lib/webhooks/providers/revenuecat'
import { rootlyHandler } from '@/lib/webhooks/providers/rootly'
import { rssHandler } from '@/lib/webhooks/providers/rss'
import { salesforceHandler } from '@/lib/webhooks/providers/salesforce'
import { sendblueHandler } from '@/lib/webhooks/providers/sendblue'
import { sentryHandler } from '@/lib/webhooks/providers/sentry'
import { servicenowHandler } from '@/lib/webhooks/providers/servicenow'
import { slackHandler } from '@/lib/webhooks/providers/slack'
import { stripeHandler } from '@/lib/webhooks/providers/stripe'
import { tableProviderHandler } from '@/lib/webhooks/providers/table'
import { telegramHandler } from '@/lib/webhooks/providers/telegram'
import { tiktokHandler } from '@/lib/webhooks/providers/tiktok'
import { twilioHandler } from '@/lib/webhooks/providers/twilio'
import { twilioVoiceHandler } from '@/lib/webhooks/providers/twilio-voice'
import { typeformHandler } from '@/lib/webhooks/providers/typeform'
import type { WebhookProviderHandler } from '@/lib/webhooks/providers/types'
import { verifyTokenAuth } from '@/lib/webhooks/providers/utils'
import { vercelHandler } from '@/lib/webhooks/providers/vercel'
import { webflowHandler } from '@/lib/webhooks/providers/webflow'
import { whatsappHandler } from '@/lib/webhooks/providers/whatsapp'
import { zendeskHandler } from '@/lib/webhooks/providers/zendesk'
import { zoomHandler } from '@/lib/webhooks/providers/zoom'
const logger = createLogger('WebhookProviderRegistry')
const PROVIDER_HANDLERS: Record<string, WebhookProviderHandler> = {
airtable: airtableHandler,
ashby: ashbyHandler,
attio: attioHandler,
azure_devops: azureDevOpsHandler,
calendly: calendlyHandler,
calcom: calcomHandler,
circleback: circlebackHandler,
clerk: clerkHandler,
confluence: confluenceHandler,
emailbison: emailBisonHandler,
fireflies: firefliesHandler,
generic: genericHandler,
gmail: gmailHandler,
github: githubHandler,
gitlab: gitlabHandler,
gong: gongHandler,
google_forms: googleFormsHandler,
fathom: fathomHandler,
grain: grainHandler,
greenhouse: greenhouseHandler,
imap: imapHandler,
incidentio: incidentioHandler,
intercom: intercomHandler,
instantly: instantlyHandler,
jira: jiraHandler,
jsm: jsmHandler,
lemlist: lemlistHandler,
linear: linearHandler,
linq: linqHandler,
loops: loopsHandler,
monday: mondayHandler,
resend: resendHandler,
revenuecat: revenueCatHandler,
rootly: rootlyHandler,
sentry: sentryHandler,
'microsoft-teams': microsoftTeamsHandler,
notion: notionHandler,
outlook: outlookHandler,
pagerduty: pagerdutyHandler,
rss: rssHandler,
salesforce: salesforceHandler,
sendblue: sendblueHandler,
servicenow: servicenowHandler,
slack: slackHandler,
// Native OAuth Slack trigger — inbound events are verified in the shared
// /api/webhooks/slack route; the handler reuses Slack payload normalization.
slack_app: slackHandler,
stripe: stripeHandler,
table: tableProviderHandler,
telegram: telegramHandler,
tiktok: tiktokHandler,
twilio: twilioHandler,
twilio_voice: twilioVoiceHandler,
typeform: typeformHandler,
vercel: vercelHandler,
webflow: webflowHandler,
whatsapp: whatsappHandler,
zendesk: zendeskHandler,
zoom: zoomHandler,
}
/**
* Default handler for unknown/future providers.
* Uses timing-safe comparison for bearer token validation.
*/
const defaultHandler: WebhookProviderHandler = {
verifyAuth({ request, requestId, providerConfig }) {
const token = providerConfig.token
if (typeof token === 'string') {
if (!verifyTokenAuth(request, token)) {
logger.warn(`[${requestId}] Unauthorized webhook access attempt - invalid token`)
return new NextResponse('Unauthorized', { status: 401 })
}
}
return null
},
}
/** Look up the provider handler, falling back to the default bearer token handler. */
export function getProviderHandler(provider: string): WebhookProviderHandler {
return PROVIDER_HANDLERS[provider] ?? defaultHandler
}