{"version":3,"file":"krisp.mjs","sources":["../src/hooks/cloud/krisp/useKrispNoiseFilter.ts"],"sourcesContent":["import * as React from 'react';\nimport { LocalAudioTrack } from 'livekit-client';\nimport { log } from '@livekit/components-core';\nimport type { KrispNoiseFilterProcessor, NoiseFilterOptions } from '@livekit/krisp-noise-filter';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { useLocalParticipant } from '../../..';\n\n/**\n * @beta\n */\nexport interface useKrispNoiseFilterOptions {\n  /**\n   * The track reference to use for the noise filter (defaults: local microphone track)\n   */\n  trackRef?: TrackReferenceOrPlaceholder;\n  /**\n   * @internal\n   */\n  filterOptions?: NoiseFilterOptions;\n}\n\n/**\n * Enable the Krisp enhanced noise cancellation feature for local audio tracks.\n *\n * Defaults to the localParticipant's microphone track publication, but you can override this behavior by passing in a different track reference.\n *\n * @package \\@livekit/components-react/krisp\n * @remarks This filter requires that you install the `@livekit/krisp-noise-filter` package and is supported only on {@link https://cloud.livekit.io | LiveKit Cloud}.\n * @beta\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 * @returns Use `setIsNoiseFilterEnabled` to enable/disable the noise filter.\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        log.warn('LiveKit-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            log.error('Krisp hook: error enabling filter', 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","log","prev","LocalAudioTrack","currentProcessor","_a","e"],"mappings":";;;;AAyCO,SAASA,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;AAC5E,MAAIK,IAAiBC,IAAsB;AAC3C,QAAM,CAACC,GAAgBC,CAAiB,IAAIR,EAAM,SAAA;AAGlD,EAAIH,EAAQ,aACVQ,IAAiBR,EAAQ,SAAS;AAGpC,QAAMY,IAAwBT,EAAM,YAAY,OAAOU,MAAoB;AACzE,QAAIA,GAAQ;AACV,YAAM,EAAE,kBAAAC,GAAkB,6BAAAC,MAAgC,MAAM,OAC9D,6BACF;AAEA,UAAI,CAACA,KAA+B;AAClC,QAAAC,EAAI,KAAK,6DAA6D;AACtE;AAAA,MACF;AACA,MAAKN,KACHC,EAAkBG,EAAiBd,EAAQ,aAAa,CAAC;AAAA,IAE7D;AACA,IAAAE,EAAgB,CAACe,OACXA,MAASJ,KACXR,EAAwB,EAAI,GAEvBQ,EACR;AAAA,EACH,GAAG,CAAA,CAAE;AAEL,SAAAV,EAAM,UAAU,MAAM;;AACpB,QAAIK,KAAkBA,EAAe,iBAAiBU,KAAmBR,GAAgB;AACvF,YAAMS,IAAmBX,EAAe,MAAM,aAAA;AAC9C,MAAIW,KAAoBA,EAAiB,SAAS,0BAChDd,EAAwB,EAAI,GAC3Bc,EAA+C,WAAWlB,CAAY,EAAE,QAAQ,MAAM;AACrF,QAAAI,EAAwB,EAAK,GAC7BE,EAAwBN,CAAY;AAAA,MACtC,CAAC,KACQ,CAACkB,KAAoBlB,MAC9BI,EAAwB,EAAI,IAC5Be,IAAAZ,KAAA,gBAAAA,EAAgB,UAAhB,QAAAY,EACI,aAAaV,GACd,KAAK,MAAMA,EAAe,WAAWT,CAAY,GACjD,KAAK,MAAM;AACV,QAAAM,EAAwB,EAAI;AAAA,MAC9B,GACC,MAAM,CAACc,MAAW;AACjB,QAAAd,EAAwB,EAAK,GAC7BS,EAAI,MAAM,qCAAqCK,CAAC;AAAA,MAClD,GACC,QAAQ,MAAM;AACb,QAAAhB,EAAwB,EAAK;AAAA,MAC/B;AAAA,IAEN;AAAA,EACF,GAAG,CAACJ,GAAcO,GAAgBE,CAAc,CAAC,GAE1C;AAAA,IACL,uBAAAE;AAAA,IACA,sBAAAN;AAAA,IACA,sBAAAF;AAAA,IACA,WAAWM;AAAA,EAAA;AAEf;"}