{"version":3,"file":"krisp.mjs","sources":["../src/hooks/cloud/krisp/useKrispNoiseFilter.ts"],"sourcesContent":["import * as React from 'react';\nimport { LocalAudioTrack } from 'livekit-client';\nimport type { KrispNoiseFilterProcessor, NoiseFilterOptions } from '@livekit/krisp-noise-filter';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { useLocalParticipant } from '../../..';\n\n/**\n * @alpha\n */\nexport interface useKrispNoiseFilterOptions {\n  /**\n   * by default the hook will use the localParticipant's microphone track publication.\n   * You can override this behavior by passing in a target TrackReference here\n   */\n  trackRef?: TrackReferenceOrPlaceholder;\n  filterOptions?: NoiseFilterOptions;\n}\n\n/**\n * This hook is a convenience helper for enabling Krisp Enhanced Audio Noise Cancellation on LiveKit audio tracks.\n * It returns a `setNoiseFilterEnabled` method to conveniently toggle between enabled and disabled states.\n *\n * @remarks Krisp noise filter is a feature that's only supported on LiveKit cloud plans\n * @alpha\n * @example\n * ```tsx\n *   const krisp = useKrispNoiseFilter();\n *   return <input\n        type=\"checkbox\"\n        onChange={(ev) => krisp.setNoiseFilterEnabled(ev.target.checked)}\n        checked={krisp.isNoiseFilterEnabled}\n        disabled={krisp.isNoiseFilterPending}\n      />\n * ```\n */\nexport function useKrispNoiseFilter(options: useKrispNoiseFilterOptions = {}) {\n  const [shouldEnable, setShouldEnable] = React.useState(false);\n  const [isNoiseFilterPending, setIsNoiseFilterPending] = React.useState(false);\n  const [isNoiseFilterEnabled, setIsNoiseFilterEnabled] = React.useState(false);\n  let micPublication = useLocalParticipant().microphoneTrack;\n  const [krispProcessor, setKrispProcessor] = React.useState<\n    KrispNoiseFilterProcessor | undefined\n  >();\n  if (options.trackRef) {\n    micPublication = options.trackRef.publication;\n  }\n\n  const setNoiseFilterEnabled = React.useCallback(async (enable: boolean) => {\n    if (enable) {\n      const { KrispNoiseFilter, isKrispNoiseFilterSupported } = await import(\n        '@livekit/krisp-noise-filter'\n      );\n\n      if (!isKrispNoiseFilterSupported()) {\n        console.warn('Krisp noise filter is not supported in this browser');\n        return;\n      }\n      if (!krispProcessor) {\n        setKrispProcessor(KrispNoiseFilter(options.filterOptions));\n      }\n    }\n    setShouldEnable((prev) => {\n      if (prev !== enable) {\n        setIsNoiseFilterPending(true);\n      }\n      return enable;\n    });\n  }, []);\n\n  React.useEffect(() => {\n    if (micPublication && micPublication.track instanceof LocalAudioTrack && krispProcessor) {\n      const currentProcessor = micPublication.track.getProcessor();\n      if (currentProcessor && currentProcessor.name === 'livekit-noise-filter') {\n        setIsNoiseFilterPending(true);\n        (currentProcessor as KrispNoiseFilterProcessor).setEnabled(shouldEnable).finally(() => {\n          setIsNoiseFilterPending(false);\n          setIsNoiseFilterEnabled(shouldEnable);\n        });\n      } else if (!currentProcessor && shouldEnable) {\n        setIsNoiseFilterPending(true);\n        micPublication?.track\n          ?.setProcessor(krispProcessor)\n          .then(() => krispProcessor.setEnabled(shouldEnable))\n          .then(() => {\n            setIsNoiseFilterEnabled(true);\n          })\n          .catch((e: any) => {\n            setIsNoiseFilterEnabled(false);\n            console.error(e);\n          })\n          .finally(() => {\n            setIsNoiseFilterPending(false);\n          });\n      }\n    }\n  }, [shouldEnable, micPublication, krispProcessor]);\n\n  return {\n    setNoiseFilterEnabled,\n    isNoiseFilterEnabled,\n    isNoiseFilterPending,\n    processor: krispProcessor,\n  };\n}\n"],"names":["useKrispNoiseFilter","options","shouldEnable","setShouldEnable","React","isNoiseFilterPending","setIsNoiseFilterPending","isNoiseFilterEnabled","setIsNoiseFilterEnabled","micPublication","useLocalParticipant","krispProcessor","setKrispProcessor","setNoiseFilterEnabled","enable","KrispNoiseFilter","isKrispNoiseFilterSupported","prev","LocalAudioTrack","currentProcessor","_a","e"],"mappings":";;;AAmCgB,SAAAA,EAAoBC,IAAsC,IAAI;AAC5E,QAAM,CAACC,GAAcC,CAAe,IAAIC,EAAM,SAAS,EAAK,GACtD,CAACC,GAAsBC,CAAuB,IAAIF,EAAM,SAAS,EAAK,GACtE,CAACG,GAAsBC,CAAuB,IAAIJ,EAAM,SAAS,EAAK;AACxE,MAAAK,IAAiBC,EAAsB,EAAA;AAC3C,QAAM,CAACC,GAAgBC,CAAiB,IAAIR,EAAM,SAEhD;AACF,EAAIH,EAAQ,aACVQ,IAAiBR,EAAQ,SAAS;AAGpC,QAAMY,IAAwBT,EAAM,YAAY,OAAOU,MAAoB;AACzE,QAAIA,GAAQ;AACV,YAAM,EAAE,kBAAAC,GAAkB,6BAAAC,EAAgC,IAAA,MAAM,OAC9D,6BACF;AAEI,UAAA,CAACA,KAA+B;AAClC,gBAAQ,KAAK,qDAAqD;AAClE;AAAA,MACF;AACA,MAAKL,KACeC,EAAAG,EAAiBd,EAAQ,aAAa,CAAC;AAAA,IAE7D;AACA,IAAAE,EAAgB,CAACc,OACXA,MAASH,KACXR,EAAwB,EAAI,GAEvBQ,EACR;AAAA,EACH,GAAG,CAAE,CAAA;AAEL,SAAAV,EAAM,UAAU,MAAM;;AACpB,QAAIK,KAAkBA,EAAe,iBAAiBS,KAAmBP,GAAgB;AACjF,YAAAQ,IAAmBV,EAAe,MAAM,aAAa;AACvD,MAAAU,KAAoBA,EAAiB,SAAS,0BAChDb,EAAwB,EAAI,GAC3Ba,EAA+C,WAAWjB,CAAY,EAAE,QAAQ,MAAM;AACrF,QAAAI,EAAwB,EAAK,GAC7BE,EAAwBN,CAAY;AAAA,MAAA,CACrC,KACQ,CAACiB,KAAoBjB,MAC9BI,EAAwB,EAAI,IAC5Bc,IAAAX,KAAA,gBAAAA,EAAgB,UAAhB,QAAAW,EACI,aAAaT,GACd,KAAK,MAAMA,EAAe,WAAWT,CAAY,GACjD,KAAK,MAAM;AACV,QAAAM,EAAwB,EAAI;AAAA,MAAA,GAE7B,MAAM,CAACa,MAAW;AACjB,QAAAb,EAAwB,EAAK,GAC7B,QAAQ,MAAMa,CAAC;AAAA,MAAA,GAEhB,QAAQ,MAAM;AACb,QAAAf,EAAwB,EAAK;AAAA,MAAA;AAAA,IAGrC;AAAA,EACC,GAAA,CAACJ,GAAcO,GAAgBE,CAAc,CAAC,GAE1C;AAAA,IACL,uBAAAE;AAAA,IACA,sBAAAN;AAAA,IACA,sBAAAF;AAAA,IACA,WAAWM;AAAA,EAAA;AAEf;"}