{"version":3,"file":"muxWebhookHandler.mjs","names":[],"sources":["../../src/endpoints/muxWebhookHandler.ts"],"sourcesContent":["import { useErrorHandler } from '../hooks/useErrorHandler'\nimport { MediaCloudErrors } from '../types/errors'\n\nimport type { Mux } from '@mux/mux-node'\nimport type { BasePayload, PayloadHandler } from 'payload'\nimport type { StaticRenditions } from '../types'\n\ninterface GetMuxWebhookHandlerArgs {\n  getMuxClient: () => Mux\n  collection: string\n}\n\nconst { logError, log } = useErrorHandler()\n\nexport function getMuxWebhookHandler(\n  args: GetMuxWebhookHandlerArgs\n): PayloadHandler {\n  const { getMuxClient, collection } = args\n\n  return async (req) => {\n    const mux = getMuxClient()\n\n    try {\n      const body = req.text ? await req.text() : ''\n      const headers = req.headers\n\n      if (!body) {\n        logError(MediaCloudErrors.MUX_WEBHOOK_BODY_INVALID.message)\n      }\n\n      // Verify the webhook signature\n      mux.webhooks.verifySignature(body, headers)\n\n      // Parse the request body\n      const event = JSON.parse(body)\n\n      // Handle the event\n      switch (event.type) {\n        case 'video.asset.created':\n        case 'video.asset.errored':\n        case 'video.asset.deleted':\n          log(`Received Mux webhook: ${event.type}, ${event.object.id}`)\n          break\n        case 'video.asset.ready':\n        case 'video.asset.static_renditions.ready':\n        case 'video.asset.static_renditions.deleted':\n          await updateMuxAsset({\n            asset: event.object,\n            payload: req.payload,\n            collection,\n          })\n          break\n      }\n\n      return Response.json({ message: 'Webhook received' }, { status: 200 })\n    } catch (error) {\n      return Response.json(\n        { message: error instanceof Error ? error.message : String(error) },\n        { status: 500 }\n      )\n    }\n  }\n}\n\ninterface UpdateMuxAssetArgs {\n  asset: Mux.Video.Asset\n  payload: BasePayload\n  collection: string\n}\n\nasync function updateMuxAsset(args: UpdateMuxAssetArgs): Promise<void> {\n  const { asset, payload, collection } = args\n\n  if (asset.status === 'ready') {\n    const { docs } = await payload.find({\n      collection,\n      where: {\n        'mux.assetId': {\n          equals: asset.id,\n        },\n      },\n      limit: 1,\n      pagination: false,\n    })\n\n    if (docs.length > 0) {\n      const { id } = docs[0]\n\n      const width = Array.from(asset.tracks ?? []).reduce(\n        (max, track) =>\n          track.type === 'video' && track.max_width\n            ? Math.max(max, track.max_width)\n            : max,\n        0\n      )\n\n      const height = Array.from(asset.tracks ?? []).reduce(\n        (max, track) =>\n          track.type === 'video' && track.max_height\n            ? Math.max(max, track.max_height)\n            : max,\n        0\n      )\n\n      await payload.update({\n        collection,\n        id,\n        data: {\n          mux: {\n            status: asset.status,\n            assetId: asset.id,\n            playbackId: asset.playback_ids?.[0]?.id,\n            aspectRatio: asset.aspect_ratio,\n            duration: asset.duration,\n            tracks: asset.tracks,\n            maxResolutionTier: asset.max_resolution_tier,\n            videoQuality: asset.video_quality,\n            staticRenditions: asset.static_renditions as StaticRenditions,\n          },\n          width,\n          height,\n        },\n      })\n    }\n  }\n}\n"],"mappings":";;;;AAYA,MAAM,EAAE,UAAU,QAAQ,iBAAiB;AAE3C,SAAgB,qBACd,MACgB;CAChB,MAAM,EAAE,cAAc,eAAe;AAErC,QAAO,OAAO,QAAQ;EACpB,MAAM,MAAM,cAAc;AAE1B,MAAI;GACF,MAAM,OAAO,IAAI,OAAO,MAAM,IAAI,MAAM,GAAG;GAC3C,MAAM,UAAU,IAAI;AAEpB,OAAI,CAAC,KACH,UAAS,iBAAiB,yBAAyB,QAAQ;AAI7D,OAAI,SAAS,gBAAgB,MAAM,QAAQ;GAG3C,MAAM,QAAQ,KAAK,MAAM,KAAK;AAG9B,WAAQ,MAAM,MAAd;IACE,KAAK;IACL,KAAK;IACL,KAAK;AACH,SAAI,yBAAyB,MAAM,KAAK,IAAI,MAAM,OAAO,KAAK;AAC9D;IACF,KAAK;IACL,KAAK;IACL,KAAK;AACH,WAAM,eAAe;MACnB,OAAO,MAAM;MACb,SAAS,IAAI;MACb;MACD,CAAC;AACF;;AAGJ,UAAO,SAAS,KAAK,EAAE,SAAS,oBAAoB,EAAE,EAAE,QAAQ,KAAK,CAAC;WAC/D,OAAO;AACd,UAAO,SAAS,KACd,EAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM,EAAE,EACnE,EAAE,QAAQ,KAAK,CAChB;;;;AAWP,eAAe,eAAe,MAAyC;CACrE,MAAM,EAAE,OAAO,SAAS,eAAe;AAEvC,KAAI,MAAM,WAAW,SAAS;EAC5B,MAAM,EAAE,SAAS,MAAM,QAAQ,KAAK;GAClC;GACA,OAAO,EACL,eAAe,EACb,QAAQ,MAAM,IACf,EACF;GACD,OAAO;GACP,YAAY;GACb,CAAC;AAEF,MAAI,KAAK,SAAS,GAAG;GACnB,MAAM,EAAE,OAAO,KAAK;GAEpB,MAAM,QAAQ,MAAM,KAAK,MAAM,UAAU,EAAE,CAAC,CAAC,QAC1C,KAAK,UACJ,MAAM,SAAS,WAAW,MAAM,YAC5B,KAAK,IAAI,KAAK,MAAM,UAAU,GAC9B,KACN,EACD;GAED,MAAM,SAAS,MAAM,KAAK,MAAM,UAAU,EAAE,CAAC,CAAC,QAC3C,KAAK,UACJ,MAAM,SAAS,WAAW,MAAM,aAC5B,KAAK,IAAI,KAAK,MAAM,WAAW,GAC/B,KACN,EACD;AAED,SAAM,QAAQ,OAAO;IACnB;IACA;IACA,MAAM;KACJ,KAAK;MACH,QAAQ,MAAM;MACd,SAAS,MAAM;MACf,YAAY,MAAM,eAAe,IAAI;MACrC,aAAa,MAAM;MACnB,UAAU,MAAM;MAChB,QAAQ,MAAM;MACd,mBAAmB,MAAM;MACzB,cAAc,MAAM;MACpB,kBAAkB,MAAM;MACzB;KACD;KACA;KACD;IACF,CAAC"}