d25d482dc2
Publish CLI Package / publish-npm (push) Waiting to run
Publish Python SDK / publish-pypi (push) Waiting to run
Publish TypeScript SDK / publish-npm (push) Waiting to run
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
147 lines
6.4 KiB
TypeScript
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
|
|
}
|