{"version":3,"sources":["../src/errors.ts","../src/providers/braintree.ts","../src/utils/crypto.ts","../src/providers/github.ts","../src/providers/slack.ts","../src/providers/stripe.ts","../src/verifier.ts","../src/stores/memory.ts","../src/stores/redis.ts","../src/dispatcher.ts"],"sourcesContent":["export class WebhookSentinelxError extends Error {\n  code: string;\n  constructor(code: string, msg: string) {\n    super(msg);\n    this.code = code;\n    this.name = \"WebhookSentinelxError\";\n  }\n}\nexport const ERR = {\n  UNSUPPORTED_SOURCE: \"UNSUPPORTED_SOURCE\",\n  SIGNATURE_VERIFICATION_FAILED: \"SIGNATURE_VERIFICATION_FAILED\",\n  STALE_TIMESTAMP: \"STALE_TIMESTAMP\",\n} as const;\n","import { WebhookSentinelxError, ERR } from \"../errors\";\nimport { NormalizedEvent, VerifierConfig, HeadersLike } from \"../types\";\n\ntype BraintreeSDK = {\n  Environment: Record<string, unknown>;\n  BraintreeGateway: new (opts: unknown) => {\n    webhookNotification: { parse(signature: string, payload: string): Promise<unknown> };\n  };\n};\n\nfunction pickDefault<T>(m: unknown): T {\n  const rec = m as Record<string, unknown>;\n  return rec && typeof rec === \"object\" && \"default\" in rec ? (rec.default as T) : (m as T);\n}\n\nexport async function verifyBraintree(\n  headers: HeadersLike,\n  raw: Buffer,\n  cfg: VerifierConfig\n): Promise<NormalizedEvent> {\n  const bt = cfg.braintree;\n  if (!bt) throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"braintree config missing\");\n\n  const text = raw.toString(\"utf8\");\n  const params = new URLSearchParams(text);\n  const btSig = params.get(\"bt_signature\");\n  const btPayload = params.get(\"bt_payload\");\n  if (!btSig || !btPayload)\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"bt form fields missing\");\n\n  const mod: unknown = await import(\"braintree\");\n  const sdk = pickDefault<BraintreeSDK>(mod);\n\n  const envKey = (bt.environment ?? \"sandbox\").toUpperCase();\n  const environment = (sdk.Environment as Record<string, unknown>)[envKey];\n  if (!sdk.BraintreeGateway || !environment) {\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"braintree SDK not available\");\n  }\n\n  const gateway = new sdk.BraintreeGateway({\n    environment,\n    merchantId: bt.merchantId,\n    publicKey: bt.publicKey,\n    privateKey: bt.privateKey,\n  });\n\n  const notification = (await gateway.webhookNotification.parse(btSig, btPayload)) as {\n    subject?: { id?: string };\n    kind?: string;\n    timestamp?: Date;\n  };\n\n  const id = String(\n    notification?.subject?.id || notification?.timestamp?.getTime?.() || Date.now()\n  );\n  const type = String(notification?.kind || \"event\");\n\n  return {\n    id,\n    source: \"braintree\",\n    type,\n    createdAt: notification?.timestamp ?? new Date(),\n    payload: notification,\n    raw,\n    requestId: (headers[\"x-request-id\"] || headers[\"request-id\"]) as string | undefined,\n  };\n}\n","import crypto from \"node:crypto\";\n\nexport function hmac(alg: \"sha256\" | \"sha1\", secret: string, data: Buffer | string) {\n  return crypto.createHmac(alg, secret).update(data).digest(\"hex\");\n}\n\nexport function timingSafeEqualHex(a: string, b: string) {\n  const ab = Buffer.from(a, \"hex\");\n  const bb = Buffer.from(b, \"hex\");\n  if (ab.length !== bb.length) return false;\n  return crypto.timingSafeEqual(ab, bb);\n}\n\nexport function randomId(): string {\n  return crypto.randomBytes(12).toString(\"hex\");\n}\n","import { WebhookSentinelxError, ERR } from \"../errors\";\nimport { NormalizedEvent, VerifierConfig, HeadersLike } from \"../types\";\nimport { hmac, timingSafeEqualHex, randomId } from \"../utils/crypto\";\n\ntype GithubEventParsed = {\n  delivery?: string;\n  action?: string;\n  [k: string]: unknown;\n};\n\nexport async function verifyGitHub(\n  headers: HeadersLike,\n  raw: Buffer,\n  _cfg: VerifierConfig\n): Promise<NormalizedEvent> {\n  const secret = _cfg.github?.secret;\n  if (!secret) throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"github secret missing\");\n\n  const sig256 = headers[\"x-hub-signature-256\"] as string | undefined;\n  if (!sig256 || !sig256.startsWith(\"sha256=\"))\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"no github signature header\");\n\n  const their = sig256.slice(\"sha256=\".length);\n  const ours = hmac(\"sha256\", secret, raw);\n  if (!timingSafeEqualHex(their, ours))\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"github hmac mismatch\");\n\n  const evt = JSON.parse(raw.toString(\"utf8\")) as GithubEventParsed;\n  const delivery = typeof evt.delivery === \"string\" ? evt.delivery : undefined;\n  const action = typeof evt.action === \"string\" ? evt.action : undefined;\n\n  return {\n    id: String(headers[\"x-github-delivery\"] || delivery || randomId()),\n    source: \"github\",\n    type: String(headers[\"x-github-event\"] || action || \"event\"),\n    createdAt: new Date(),\n    payload: evt,\n    raw,\n    requestId: headers[\"x-request-id\"] as string | undefined,\n  };\n}\n","import { WebhookSentinelxError, ERR } from \"../errors\";\nimport { NormalizedEvent, VerifierConfig, HeadersLike } from \"../types\";\nimport { hmac, timingSafeEqualHex } from \"../utils/crypto\";\n\ntype SlackEventRaw = {\n  event_id?: string;\n  trigger_id?: string;\n  team_id?: string;\n  type?: string;\n  event?: { ts?: string; type?: string };\n  [k: string]: unknown;\n};\n\nexport async function verifySlack(\n  headers: HeadersLike,\n  raw: Buffer,\n  cfg: VerifierConfig\n): Promise<NormalizedEvent> {\n  const secret = cfg.slack?.signingSecret;\n  if (!secret)\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"slack signing secret missing\");\n\n  const ts = String(headers[\"x-slack-request-timestamp\"] || \"\");\n  const sig = String(headers[\"x-slack-signature\"] || \"\");\n  if (!ts || !sig.startsWith(\"v0=\"))\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"bad slack headers\");\n\n  const base = `v0:${ts}:` + raw.toString(\"utf8\");\n  const ours = hmac(\"sha256\", secret, base);\n  const theirs = sig.slice(3);\n  if (!timingSafeEqualHex(theirs, ours))\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"slack hmac mismatch\");\n\n  const tolerance = cfg.toleranceSec ?? 300;\n  const now = Math.floor(Date.now() / 1000);\n  if (tolerance && Math.abs(now - Number(ts)) > tolerance)\n    throw new WebhookSentinelxError(ERR.STALE_TIMESTAMP, \"slack stale timestamp\");\n\n  const evt = JSON.parse(raw.toString(\"utf8\")) as SlackEventRaw;\n  const id = String(\n    evt.event_id ?? evt.trigger_id ?? `${evt.team_id ?? \"team\"}:${evt.event?.ts ?? ts}`\n  );\n  const type = String(evt.type ?? evt.event?.type ?? \"event\");\n\n  return {\n    id,\n    source: \"slack\",\n    type,\n    createdAt: new Date(),\n    payload: evt,\n    raw,\n    requestId: (headers[\"x-request-id\"] || headers[\"request-id\"]) as string | undefined,\n  };\n}\n","import { WebhookSentinelxError, ERR } from \"../errors\";\nimport { NormalizedEvent, VerifierConfig, HeadersLike } from \"../types\";\nimport { hmac, timingSafeEqualHex } from \"../utils/crypto\";\n\nfunction parseStripeHeader(h: string) {\n  const kvs = h.split(\",\").map((kv) => kv.trim().split(\"=\"));\n  const map = Object.fromEntries(kvs);\n  const t = Number(map[\"t\"]);\n  const v1s = kvs.filter(([k]) => k === \"v1\").map(([, v]) => v);\n  return { t, v1s };\n}\n\nexport async function verifyStripe(\n  headers: HeadersLike,\n  raw: Buffer,\n  cfg: VerifierConfig\n): Promise<NormalizedEvent> {\n  const secret = cfg.stripe?.endpointSecret;\n  if (!secret) throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"stripe secret missing\");\n\n  const sig = (headers[\"stripe-signature\"] ||\n    headers[\"Stripe-Signature\"] ||\n    headers[\"STRIPE-SIGNATURE\"]) as string | undefined;\n  if (!sig)\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"no stripe signature header\");\n\n  const { t, v1s } = parseStripeHeader(sig);\n  if (!t || !v1s.length)\n    throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"bad stripe signature header\");\n\n  const payloadToSign = Buffer.concat([Buffer.from(String(t)), Buffer.from(\".\"), raw]);\n  const expected = hmac(\"sha256\", secret, payloadToSign);\n  const match = v1s.some((v1) => timingSafeEqualHex(v1, expected));\n  if (!match) throw new WebhookSentinelxError(ERR.SIGNATURE_VERIFICATION_FAILED, \"stripe hmac mismatch\");\n\n  const tolerance = cfg.toleranceSec ?? 300;\n  const now = Math.floor(Date.now() / 1000);\n  if (tolerance && Math.abs(now - t) > tolerance)\n    throw new WebhookSentinelxError(ERR.STALE_TIMESTAMP, \"stripe stale timestamp\");\n\n  const event = JSON.parse(raw.toString(\"utf8\"));\n  return {\n    id: String(event.id || event.data?.object?.id || `${event.type}:${t}`),\n    source: \"stripe\",\n    type: String(event.type),\n    createdAt: new Date((event.created ?? now) * 1000),\n    payload: event,\n    raw,\n    requestId: (headers[\"request-id\"] || headers[\"x-request-id\"]) as string | undefined,\n  };\n}\n","import { WebhookSentinelxError, ERR } from \"./errors\";\nimport { verifyBraintree } from \"./providers/braintree\";\nimport { verifyGitHub } from \"./providers/github\";\nimport { verifySlack } from \"./providers/slack\";\nimport { verifyStripe } from \"./providers/stripe\";\nimport { NormalizedEvent, Provider, VerifierConfig, HeadersLike } from \"./types\";\n\nexport function createVerifier(cfg: VerifierConfig) {\n  return async function verify(\n    source: Provider,\n    headers: HeadersLike,\n    raw: Buffer\n  ): Promise<NormalizedEvent> {\n    switch (source) {\n      case \"stripe\":\n        return verifyStripe(headers, raw, cfg);\n      case \"github\":\n        return verifyGitHub(headers, raw, cfg);\n      case \"slack\":\n        return verifySlack(headers, raw, cfg);\n      case \"braintree\":\n        return verifyBraintree(headers, raw, cfg);\n      default:\n        throw new WebhookSentinelxError(ERR.UNSUPPORTED_SOURCE, `unknown source ${String(source)}`);\n    }\n  };\n}\n","import type { DedupStore } from \"./types\";\n\nexport class MemoryStore implements DedupStore {\n  private ttl: number;\n  private map = new Map<string, number>();\n  private timer?: ReturnType<typeof setInterval>;\n\n  constructor(opts?: { ttlSec?: number; sweepMs?: number }) {\n    this.ttl = Math.max(1, opts?.ttlSec ?? 600);\n    const sweep = Math.max(1000, opts?.sweepMs ?? 30_000);\n    this.timer = setInterval(() => this.gc(), sweep);\n    (this.timer as unknown as NodeJS.Timeout | undefined)?.unref?.();\n  }\n\n  async seen(id: string, ttlSec?: number): Promise<boolean> {\n    const ttl = (ttlSec ?? this.ttl) * 1000;\n    const now = Date.now();\n    const exp = this.map.get(id);\n    if (exp && exp > now) return true;\n    this.map.set(id, now + ttl);\n    return false;\n  }\n\n  private gc() {\n    const now = Date.now();\n    for (const [k, v] of this.map) if (v <= now) this.map.delete(k);\n  }\n}\n","import type { RedisClientType } from \"redis\";\n\nimport type { DedupStore } from \"./types\";\n\nexport class RedisStore implements DedupStore {\n  private client: RedisClientType | null = null;\n  private clientReady: Promise<RedisClientType>;\n  private prefix: string;\n\n  constructor(opts: { url: string; keyPrefix?: string }) {\n    this.prefix = opts.keyPrefix ?? \"webhook-sentinelx\";\n    this.clientReady = (async () => {\n      const mod = await import(\"redis\");\n      const client = mod.createClient({ url: opts.url });\n      await client.connect();\n      this.client = client;\n      return client;\n    })();\n  }\n\n  async seen(id: string, ttlSec = 600): Promise<boolean> {\n    const client = await this.clientReady;\n    const key = `${this.prefix}:seen:${id}`;\n    const r = await client.set(key, \"1\", { NX: true, EX: ttlSec });\n    return r !== \"OK\";\n  }\n}\n","import type { NormalizedEvent } from \"./types\";\n\nexport type Handler<T = unknown> = (evt: NormalizedEvent & { context?: T }) => Promise<void> | void;\n\nexport function createDispatcher<T = unknown>() {\n  const map = new Map<string, Handler<T>[]>();\n  return {\n    on(eventName: string, handler: Handler<T>) {\n      const arr = map.get(eventName) || [];\n      arr.push(handler);\n      map.set(eventName, arr);\n    },\n    async dispatch(eventName: string, evt: NormalizedEvent & { context?: T }) {\n      for (const fn of map.get(eventName) || []) await fn(evt);\n    },\n  };\n}\n"],"mappings":"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","names":[]}