hanc-webrtc-widgets 2.4.5 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -33810,9 +33810,9 @@ class BE extends EventTarget {
33810
33810
  })
33811
33811
  });
33812
33812
  if (!t.ok) {
33813
- const s = await t.text();
33813
+ const C = await t.text();
33814
33814
  throw new Error(
33815
- `Failed to get room token: ${t.status} ${s}`
33815
+ `Failed to get room token: ${t.status} ${C}`
33816
33816
  );
33817
33817
  }
33818
33818
  const { token: g, url: o, room_name: n, user_identity: I } = await t.json();
@@ -33825,22 +33825,31 @@ class BE extends EventTarget {
33825
33825
  await Promise.all([
33826
33826
  e.localParticipant.setMicrophoneEnabled(!0, a).then(() => {
33827
33827
  this.microphoneEnabled = !0, this.dispatchEvent(new CustomEvent("microphone-enabled"));
33828
- }).catch((s) => {
33829
- console.warn("Could not enable microphone:", s), this.microphoneEnabled = !1, this.dispatchEvent(new CustomEvent("microphone-disabled"));
33828
+ }).catch((C) => {
33829
+ console.warn("Could not enable microphone:", C), this.microphoneEnabled = !1, this.dispatchEvent(new CustomEvent("microphone-disabled"));
33830
33830
  }),
33831
33831
  e.connect(o, g)
33832
- ]), this.updateStatus("connected"), this.isReady = !0, setTimeout(async () => {
33833
- const s = Array.from(e.localParticipant.audioTrackPublications.values()).find((C) => C.kind === "audio");
33834
- if (s != null && s.track) {
33835
- await this.applyKrispFilter(s.track);
33836
- const C = s.track.mediaStreamTrack;
33837
- C && this.dispatchEvent(
33838
- new CustomEvent("local-audio-track", {
33839
- detail: C
33840
- })
33841
- );
33832
+ ]), await new Promise((C) => setTimeout(C, 700)), this.updateStatus("connected"), this.isReady = !0;
33833
+ const s = async (C) => {
33834
+ if (C.kind !== "audio" || !C.track) return;
33835
+ const r = C.track;
33836
+ await new Promise((B) => setTimeout(B, 500));
33837
+ try {
33838
+ await this.applyKrispFilter(r), console.log("[Krisp] Filter applied via LocalTrackPublished event");
33839
+ } catch (B) {
33840
+ console.warn("[Krisp] Failed to apply filter:", B);
33842
33841
  }
33843
- }, 100), this.dispatchEvent(
33842
+ const Q = r.mediaStreamTrack;
33843
+ Q && this.dispatchEvent(
33844
+ new CustomEvent("local-audio-track", {
33845
+ detail: Q
33846
+ })
33847
+ );
33848
+ };
33849
+ e.localParticipant.on("localTrackPublished", s);
33850
+ for (const C of e.localParticipant.audioTrackPublications.values())
33851
+ C.track && s(C);
33852
+ this.dispatchEvent(
33844
33853
  new CustomEvent("room-connected", {
33845
33854
  detail: { roomName: n, identity: I }
33846
33855
  })
@@ -33957,17 +33966,20 @@ class BE extends EventTarget {
33957
33966
  async toggleMicrophone() {
33958
33967
  if (this.room)
33959
33968
  try {
33960
- if (this.microphoneEnabled)
33961
- await this.room.localParticipant.setMicrophoneEnabled(!1), this.microphoneEnabled = !1, this.dispatchEvent(new CustomEvent("microphone-disabled"));
33962
- else {
33963
- await this.room.localParticipant.setMicrophoneEnabled(!0, {
33964
- echoCancellation: !0,
33965
- noiseSuppression: !0,
33966
- autoGainControl: !0
33967
- }), this.microphoneEnabled = !0, this.dispatchEvent(new CustomEvent("microphone-enabled"));
33969
+ this.microphoneEnabled ? (await this.room.localParticipant.setMicrophoneEnabled(!1), this.microphoneEnabled = !1, this.dispatchEvent(new CustomEvent("microphone-disabled"))) : (await this.room.localParticipant.setMicrophoneEnabled(!0, {
33970
+ echoCancellation: !0,
33971
+ noiseSuppression: !0,
33972
+ autoGainControl: !0
33973
+ }), this.microphoneEnabled = !0, this.dispatchEvent(new CustomEvent("microphone-enabled")), setTimeout(async () => {
33974
+ if (!this.room) return;
33968
33975
  const A = Array.from(this.room.localParticipant.audioTrackPublications.values()).find((e) => e.kind === "audio");
33969
- A != null && A.track && await this.applyKrispFilter(A.track);
33970
- }
33976
+ if (A != null && A.track)
33977
+ try {
33978
+ await this.applyKrispFilter(A.track), console.log("[Krisp] Filter applied on toggle");
33979
+ } catch (e) {
33980
+ console.warn("[Krisp] Failed to apply on toggle:", e);
33981
+ }
33982
+ }, 500));
33971
33983
  } catch (A) {
33972
33984
  this.error = `Failed to toggle microphone: ${A instanceof Error ? A.message : String(A)}`, this.dispatchEvent(
33973
33985
  new CustomEvent("error", {
@@ -181,7 +181,7 @@ a=extmap-allow-mixed`)!==-1){const g=t.sdp.split(`
181
181
  </div>
182
182
  `,"outputLatency","INIT_WASM_PROCESSOR","logs","ue boom","store","antlion wireless microphone","createWAVBlob","MODEL_NOT_FOUND","STATE","usb/xlr dynamic microphone","charCodeAt","1672448QvIZkP","KrispSDK:init","AudioFiletrNode:constructor","jbl go","audioengine","inc2000","message","mi portable bluetooth speaker","_malloc","SDK_ALREADY_INITIALIZED","lg ph1(2a)","jbl charge","stadia controller rev. a","rog eye s","razer nommo chroma","audio/wav; codecs=wav","1062s","anker soundcore boost","logi rally bar mini audio","sembrandt ht3000","auna mic cm900","enableOnceReady","razer base station v2 chroma","ready elite","BVC:add","DISABLE_VAD","hypemic","audiohub speaker","unloadModuleModel","movo-um700","konftel ego","logi mx sound","aoni microphone","røde nt-usb","Loading compatible devices from: ","bluetooth music","jbl tuner fm","map","Preparing BVC compatible devices list","blue snowball","_inputData","Logger is not initialized","logAudio","anker powerconf s3(大会議室)","audiopro x5 microphone","klipsch groove","live streamer cam313 microphone","state","TOGGLE","bind","ln01a",'"><source src="',"SDK is not initialized","send","KrispSDK","_state","MIN_BVC_SUPPORT_SAMPLE_RATE","dell slim soundbar sb521a","philips s3505","SET_AUDIO_PROCESSOR_READY","soundsticks","paths","xech t2s","polycom","logic sp2","cambridge audio one","loadModel","collectFrom","trust gxt 242 microphone","KWebWorker","WORKLET_URL","AudioFilterNode:isNCEnabled","obsbot tiny 4k microphone","instances","querySelector","sennheiser xs lav usb-c","mts-2026","enable","AudioFilterNode","spa4040b","_fetchFile","_isReady","data","responseType","anker powerconf s3","mu900","gxt 244 microphone","Adding Runtime BVC allowed device","usb lcs","cmteck","akg s30","cybertrack h6","dispose","creating web worker (type: module)","AudioFilterNode:enableNC","sennheiser sp 30","worker","mediaDevices","megablast","samson gomic","_channelData","result","connectedCallback","threadName","logitech x50","gxt 256 microphone","webcam","AudioFilterNode:constructor","label",`<p>
183
183
  <audio controls title="recording-input-`,"onmousemove","logitech speakerphone p710e","display","hk onyx studio 4","kz-dc4k audio","revolabs digital audio device","axcs speaker","wba31","fifine k690 microphone","BVC_ALLOWED_DEVICES","VAD_CB","removeDebugWidget","useBVC","onmessage","at2005usb","subarray","port1","clientY","srs-xb43","BVC:remove","isEnabled","chat 150",`
184
- <p>Recording: `,"soundtech","KrispSDK:preload","printAvailableReadAndWrite","stanmore speaker","sp-ad70-a","hasInvalidFilePath","ready","forceAllowBVC","absolute","createObjectURL","prototype","isSupported","enumerateDevices","isNcEnabled","INVALID_MODEL_URL","yeti","ModelLoader","WORKLET_PROCESSOR_NAME","jbl pulse 3"];return Bs=function(){return i},Bs()}const Ke=vI;(function(i,A){const e=vI,t=i();for(;;)try{if(parseInt(e(427))/1*(parseInt(e(488))/2)+parseInt(e(418))/3*(parseInt(e(509))/4)+parseInt(e(423))/5*(-parseInt(e(503))/6)+parseInt(e(460))/7+parseInt(e(472))/8+-parseInt(e(478))/9*(-parseInt(e(448))/10)+-parseInt(e(465))/11===A)break;t.push(t.shift())}catch{t.push(t.shift())}})(Es,590710);function vI(i,A){const e=Es();return vI=function(t,g){return t=t-418,e[t]},vI(i,A)}function Es(){const i=["model16","token","ject is no","rning earl","Server res","4UxfDAa","Bearer ","modelPaths","ugin, retu","iveKit pro","te. Server","setEnabled","statusText","Could not ","shed yet.","Krisp: Not","ld not ena","us ","se filter","createMedi","bleState","Krisp: Cou","isEnabled","warn","audioConte","abling noi","stream","model8","status","livekit","bufferOver","onEnable","json","Krisp: Ena","aStreamDes","createNois","enable","replace","1201299HSSAAe","isSupporte","debug","vekit.io/i","model32","1269155XLbAQH","settings","ntegration"," first","1Bqtovj"," missing","eFilter","it wasn't "," with stat","e filter"," not publi","enhancedNo","Krisp: Def","noise filt","t supporte","er, this L","enabled an","desiredEna","Models are","https://li","ation"," enabling ","not restar","ble plugin","SDK not in","1270Rstlki","zed","disable","h status ","erring ena","debugLogs"," responded","iseCancell","tination","node, but ","startsWith","Krisp: Det","7757155WjQtwu","t without ","Krisp: Dis","node","init","20733482QXslvX","restart","Krisp: Err","or disabli","itialized","til SDK is",", track is","5757560UMZDdX","disable pl","ng SDK","to enable/","or disposi","yways","1827hMCuhx","connect","dispose","connecting","ng filter ","s/enc/v1","aStreamSou","flowMs","isReady","Krisp: Can","950658wrRENs","bling nois"," loaded","http","onPublish","rce","ected newe","authentica","ponded wit","disconnect","blement un","isInitiali","url","engine","r request ","6RTcZIV"];return Es=function(){return i},Es()}const Yi=fi(Ke(533));var cg,_t,LI,_o,eo,xn,UI,cs,Mx,Gx,Fx,vx,MQ,Lx,GQ,Ux;class FQ{constructor(A){hi(this,MQ),hi(this,GQ),hi(this,cg,void 0),hi(this,_t,void 0),hi(this,LI,!1),hi(this,_o,void 0),hi(this,eo,void 0),hi(this,xn,void 0),hi(this,UI,void 0),hi(this,cs,void 0),di(this,Mx,!1),di(this,Gx,!0),di(this,Fx),di(this,vx),Lt(this,UI,A)}static[Ke(419)+"d"](){return bx[Ke(419)+"d"]()}get[(Mx=Ke(486),Gx=Ke(440)+Ke(524),Fx=Ke(528)+"xt",Ke(499)+Ke(449))](){return WA(this,LI)}async[(vx=Ke(535),Ke(464))](){var A,e;const t=Ke,{model8:g,model16:o,model32:n}=await Fd(this,GQ,Ux).call(this);if(!WA(this,cg)){if(!g||!o||!o)throw new Error(t(441)+t(428));Lt(this,cg,new bx({params:{debugLogs:(A=WA(this,UI))==null?void 0:A[t(453)],logProcessStats:!1,useSharedArrayBuffer:!1,bufferOverflowMS:((e=WA(this,UI))==null?void 0:e[t(534)+t(485)])??50,models:{model8:g,model16:o,model32:n}}}))}await WA(this,cg)[t(464)](),Lt(this,LI,!0)}[Ke(480)](){var A,e,t,g,o;const n=Ke;(A=this[n(535)])==null||A.call(this,!1),Lt(this,xn,void 0);let I=(e=WA(this,_t))==null?void 0:e[n(526)]();try{(t=WA(this,_t))==null||t[n(450)]()}catch(a){I?Yi[n(527)](n(467)+n(468)+n(482)+n(463),a):Yi[n(420)](n(467)+n(468)+n(482)+n(457)+n(430)+n(439)+n(477),a)}try{(g=WA(this,_t))==null||g[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(482)+n(463),a)}try{(o=WA(this,cg))==null||o[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(474),a)}Lt(this,cg,void 0),Lt(this,LI,!1),this[n(486)]=!1,clearInterval(WA(this,cs))}async[Ke(479)](A,e){const t=Ke;if(!WA(this,cg))throw new TypeError(t(447)+t(469));return Lt(this,_t,await WA(this,cg)[t(539)+t(429)]({audioContext:A,stream:e},async()=>{const g=t;this[g(486)]=!0},()=>{const g=t;this[g(486)]=!1})),this[t(528)+"xt"]=A,Lt(this,_o,this[t(528)+"xt"][t(523)+t(484)+t(493)](e)),WA(this,eo)??Lt(this,eo,this[t(528)+"xt"][t(523)+t(538)+t(456)]()),WA(this,_o)[t(479)](WA(this,_t))[t(479)](WA(this,eo)),WA(this,eo)[t(530)]}async[Ke(492)](A){Lt(this,xn,A)}async[Ke(515)](A){var e,t,g,o,n,I,a;const s=Ke;if(this[s(440)+s(524)]=A,!this[s(486)]&&(Yi[s(420)](s(435)+s(452)+s(498)+s(470)+s(490)),await new Promise(C=>{Lt(this,cs,setInterval(()=>{this[vI(486)]&&C(void 0)},20))})),A!==this[s(440)+s(524)]){Yi[s(420)](s(459)+s(494)+s(502)+s(475)+s(473)+s(512)+s(507)+"y");return}return A?WA(this,xn)?await Fd(this,MQ,Lx).call(this,WA(this,xn))?(Yi[s(420)](s(537)+s(489)+s(432)),(g=WA(this,_t))==null||g[s(540)](),(o=this[s(535)])==null||o.call(this,!0),!0):(Yi[s(527)](s(519)+s(444)+s(436)+s(438)+s(513)+s(506)+s(437)+"d."),(n=WA(this,_t))==null||n[s(450)](),(I=this[s(535)])==null||I.call(this,!1),!1):(Yi[s(527)](s(525)+s(520)+s(446)+s(471)+s(433)+s(518)),(a=this[s(535)])==null||a.call(this,!1),!1):(Yi[s(420)](s(462)+s(529)+s(522)),(e=WA(this,_t))==null||e[s(450)](),(t=this[s(535)])==null||t.call(this,!1),!1)}[Ke(526)](){const A=Ke;return this[A(499)+A(449)]&&this[A(486)]&&!!WA(this,_t)&&WA(this,_t)[A(526)]()}async[Ke(466)](A){var e,t;const g=Ke;if(!WA(this,_t)||!WA(this,eo)||!WA(this,_o)||!this[g(528)+"xt"])throw Error(g(487)+g(445)+g(461)+g(481)+g(426));return WA(this,_o)[g(497)](),(e=WA(this,_t))==null||e[g(497)](WA(this,eo)),(t=WA(this,_t))==null||t[g(480)](),Lt(this,_o,void 0),this[g(479)](this[g(528)+"xt"],A)}}cg=new WeakMap,_t=new WeakMap,LI=new WeakMap,_o=new WeakMap,eo=new WeakMap,xn=new WeakMap,UI=new WeakMap,cs=new WeakMap,MQ=new WeakSet,Lx=async function(i){const A=Ke;let e=i[A(501)][A(500)];e[A(458)]("ws")&&(e=e[A(541)](/^(ws)/,A(491)));const t=i[A(501)][A(505)],g=new URL(A(424),e),o=await fetch(g,{headers:{authorization:A(510)+t}});if(o.ok)return(await o[A(536)]())[A(434)+A(455)+A(443)]===!0;throw new Error(A(517)+A(495)+A(514)+A(454)+A(431)+A(521)+o[A(532)]+": "+o[A(516)])},GQ=new WeakSet,Ux=async function(){const i=Ke,A=await fetch(i(442)+i(421)+i(425)+i(483));if(A.ok){const e=await A[i(536)]();return{model8:e[i(511)][i(531)],model16:e[i(511)][i(504)],model32:e[i(511)][i(422)]}}else throw new Error(i(508)+i(496)+i(451)+A[i(532)]+": "+A[i(516)])};const vQ=fi("livekit");var Tt;class Tx{constructor(A){di(this,"name","livekit-noise-filter"),di(this,"processedTrack"),di(this,"trackSettings"),di(this,"originalTrack"),hi(this,Tt,void 0),di(this,"init",async e=>{vQ.debug("Krisp: Initializing track processor"),this.originalTrack=e.track,this.trackSettings=e.track.getSettings(),e.audioContext.sampleRate!==this.trackSettings.sampleRate&&vQ.debug("Krisp: Sample rate mismatch, reapplying"),await e.track.applyConstraints({...this.trackSettings,noiseSuppression:!1,voiceIsolation:!1,sampleRate:e.audioContext.sampleRate}),WA(this,Tt)||Lt(this,Tt,new FQ),WA(this,Tt).onEnable=t=>{var g;const o=new Event(`${t?"enable":"disable"}-lk-krisp-noise-filter`);(g=this.processedTrack)==null||g.dispatchEvent(o)},await WA(this,Tt).init(),this.processedTrack=(await WA(this,Tt).connect(e.audioContext,new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"restart",async e=>{if(!WA(this,Tt))throw Error("LiveKit-Krisp: Cannot restart without having initialized first");vQ.debug("Krisp: Restarting plugin"),this.processedTrack=(await WA(this,Tt).restart(new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"destroy",async()=>{var e,t;(e=WA(this,Tt))==null||e.dispose(),await((t=this.originalTrack)==null?void 0:t.applyConstraints(this.trackSettings))}),Lt(this,Tt,new FQ(A))}static isSupported(){return FQ.isSupported()}async onPublish(A){WA(this,Tt).onPublish(A),this.setEnabled(!0)}async setEnabled(A){return await WA(this,Tt).setEnabled(A)}isEnabled(){return WA(this,Tt).isEnabled()}}Tt=new WeakMap;const Hy=Tx.isSupported,Py=i=>new Tx(i);class LQ extends EventTarget{constructor(){super(...arguments),this.room=null,this.callStatus="idle",this.isReady=!1,this.error=null,this.microphoneEnabled=!1,this.connectedParticipants=[],this.userIdentity="",this.roomName="",this.audioPlaybackPrompt=!1,this.isAppleDevice=/iPhone|iPad|iPod|Macintosh|Mac OS/i.test(navigator.userAgent),this.krispFilter=null,this.krispSupported=Hy()}set serviceUrl(A){this._serviceUrl=A}get serviceUrl(){return this._serviceUrl??"https://voice.hanc.ai"}get status(){return this.callStatus}get ready(){return this.isReady}get currentError(){return this.error}get currentRoom(){return this.room}get isMicrophoneEnabled(){return this.microphoneEnabled}get participants(){return this.connectedParticipants}get identity(){return this.userIdentity}get roomNameValue(){return this.roomName}get showAudioPrompt(){return this.audioPlaybackPrompt}updateStatus(A){this.callStatus=A,this.dispatchEvent(new CustomEvent("status-changed",{detail:A}))}async makeCall({agentId:A}){if(!(this.room&&this.room.state==="connected")){this.updateStatus("connecting"),this.error=null,this.isReady=!1,this.room&&(await this.room.disconnect(),this.room=null);try{const e=new gn({webAudioMix:!0});this.room=e,this.setupRoomEventListeners(e);const t=await fetch(`${this.serviceUrl}/create-room-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metadata:{agent_id:A,timestamp:Date.now(),is_apple_device:this.isAppleDevice}})});if(!t.ok){const s=await t.text();throw new Error(`Failed to get room token: ${t.status} ${s}`)}const{token:g,url:o,room_name:n,user_identity:I}=await t.json();this.roomName=n,this.userIdentity=I;const a={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};await Promise.all([e.localParticipant.setMicrophoneEnabled(!0,a).then(()=>{this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled"))}).catch(s=>{console.warn("Could not enable microphone:",s),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))}),e.connect(o,g)]),this.updateStatus("connected"),this.isReady=!0,setTimeout(async()=>{const s=Array.from(e.localParticipant.audioTrackPublications.values()).find(C=>C.kind==="audio");if(s!=null&&s.track){await this.applyKrispFilter(s.track);const C=s.track.mediaStreamTrack;C&&this.dispatchEvent(new CustomEvent("local-audio-track",{detail:C}))}},100),this.dispatchEvent(new CustomEvent("room-connected",{detail:{roomName:n,identity:I}}))}catch(e){this.error=`Connection failed: ${e instanceof Error?e.message:String(e)}`,this.updateStatus("error"),this.isReady=!1,this.room=null,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}}setupRoomEventListeners(A){A.on(IA.Connected,()=>{this.updateStatus("connected"),this.isReady=!0}),A.on(IA.Disconnected,()=>{this.updateStatus("disconnected"),this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.room=null,this.isReady=!1,this.krispFilter=null,this.dispatchEvent(new CustomEvent("disconnected"))}),A.on(IA.ParticipantConnected,e=>{this.connectedParticipants=[...this.connectedParticipants,e.identity];const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("agent-connected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-connected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(IA.ParticipantDisconnected,e=>{this.connectedParticipants=this.connectedParticipants.filter(g=>g!==e.identity);const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.audioPlaybackPrompt=!1,this.updateStatus("connected"),this.dispatchEvent(new CustomEvent("agent-disconnected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-disconnected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(IA.TrackSubscribed,(e,t,g)=>{if(e.kind==="audio"){const o=e.attach();document.body.appendChild(o),this.dispatchEvent(new CustomEvent("audio-track-added",{detail:{participant:g.identity,element:o}}));const n=e.mediaStreamTrack;n&&this.dispatchEvent(new CustomEvent("audio-track",{detail:n}))}}),A.on(IA.TrackUnsubscribed,(e,t,g)=>{e.detach(),this.dispatchEvent(new CustomEvent("audio-track-removed",{detail:{participant:g.identity}}))}),A.on(IA.MediaDevicesError,e=>{this.error=`Media device error: ${e.message}`,this.updateStatus("error"),this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}),A.on(IA.AudioPlaybackStatusChanged,async()=>{A.canPlaybackAudio||this.connectedParticipants.some(t=>t.includes("agent")||t.includes("voice-assistant")||t.includes("AJ_"))&&!this.audioPlaybackPrompt&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0),this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:A.canPlaybackAudio}}))})}async applyKrispFilter(A){if(!this.krispSupported){console.log("[Krisp] Not supported in this browser");return}try{this.krispFilter||(this.krispFilter=Py()),await A.setProcessor(this.krispFilter),console.log("[Krisp] Noise filter applied successfully")}catch(e){console.warn("[Krisp] Failed to apply noise filter:",e)}}async toggleMicrophone(){if(this.room)try{if(this.microphoneEnabled)await this.room.localParticipant.setMicrophoneEnabled(!1),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"));else{await this.room.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled"));const A=Array.from(this.room.localParticipant.audioTrackPublications.values()).find(e=>e.kind==="audio");A!=null&&A.track&&await this.applyKrispFilter(A.track)}}catch(A){this.error=`Failed to toggle microphone: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async enableAudio(){if(this.room)try{await this.room.startAudio(),this.audioPlaybackPrompt=!1;const A=JSON.stringify({type:"audio_enabled"}),t=new TextEncoder().encode(A);await this.room.localParticipant.publishData(t,{reliable:!0}),this.dispatchEvent(new CustomEvent("audio-enabled"))}catch(A){this.error=`Failed to enable audio: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async hangUp(){if(!this.room){this.error="No active connection to end.";return}this.updateStatus("disconnecting");const A=this.room;this.room=null,this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.isReady=!1,this.krispFilter=null,this.updateStatus("disconnected"),this.dispatchEvent(new CustomEvent("call-ended")),requestAnimationFrame(()=>{setTimeout(async()=>{try{await A.disconnect()}catch(e){console.warn("Error during room disconnect:",e)}},0)})}}/**
184
+ <p>Recording: `,"soundtech","KrispSDK:preload","printAvailableReadAndWrite","stanmore speaker","sp-ad70-a","hasInvalidFilePath","ready","forceAllowBVC","absolute","createObjectURL","prototype","isSupported","enumerateDevices","isNcEnabled","INVALID_MODEL_URL","yeti","ModelLoader","WORKLET_PROCESSOR_NAME","jbl pulse 3"];return Bs=function(){return i},Bs()}const Ke=vI;(function(i,A){const e=vI,t=i();for(;;)try{if(parseInt(e(427))/1*(parseInt(e(488))/2)+parseInt(e(418))/3*(parseInt(e(509))/4)+parseInt(e(423))/5*(-parseInt(e(503))/6)+parseInt(e(460))/7+parseInt(e(472))/8+-parseInt(e(478))/9*(-parseInt(e(448))/10)+-parseInt(e(465))/11===A)break;t.push(t.shift())}catch{t.push(t.shift())}})(Es,590710);function vI(i,A){const e=Es();return vI=function(t,g){return t=t-418,e[t]},vI(i,A)}function Es(){const i=["model16","token","ject is no","rning earl","Server res","4UxfDAa","Bearer ","modelPaths","ugin, retu","iveKit pro","te. Server","setEnabled","statusText","Could not ","shed yet.","Krisp: Not","ld not ena","us ","se filter","createMedi","bleState","Krisp: Cou","isEnabled","warn","audioConte","abling noi","stream","model8","status","livekit","bufferOver","onEnable","json","Krisp: Ena","aStreamDes","createNois","enable","replace","1201299HSSAAe","isSupporte","debug","vekit.io/i","model32","1269155XLbAQH","settings","ntegration"," first","1Bqtovj"," missing","eFilter","it wasn't "," with stat","e filter"," not publi","enhancedNo","Krisp: Def","noise filt","t supporte","er, this L","enabled an","desiredEna","Models are","https://li","ation"," enabling ","not restar","ble plugin","SDK not in","1270Rstlki","zed","disable","h status ","erring ena","debugLogs"," responded","iseCancell","tination","node, but ","startsWith","Krisp: Det","7757155WjQtwu","t without ","Krisp: Dis","node","init","20733482QXslvX","restart","Krisp: Err","or disabli","itialized","til SDK is",", track is","5757560UMZDdX","disable pl","ng SDK","to enable/","or disposi","yways","1827hMCuhx","connect","dispose","connecting","ng filter ","s/enc/v1","aStreamSou","flowMs","isReady","Krisp: Can","950658wrRENs","bling nois"," loaded","http","onPublish","rce","ected newe","authentica","ponded wit","disconnect","blement un","isInitiali","url","engine","r request ","6RTcZIV"];return Es=function(){return i},Es()}const Yi=fi(Ke(533));var cg,_t,LI,_o,eo,xn,UI,cs,Mx,Gx,Fx,vx,MQ,Lx,GQ,Ux;class FQ{constructor(A){hi(this,MQ),hi(this,GQ),hi(this,cg,void 0),hi(this,_t,void 0),hi(this,LI,!1),hi(this,_o,void 0),hi(this,eo,void 0),hi(this,xn,void 0),hi(this,UI,void 0),hi(this,cs,void 0),di(this,Mx,!1),di(this,Gx,!0),di(this,Fx),di(this,vx),Lt(this,UI,A)}static[Ke(419)+"d"](){return bx[Ke(419)+"d"]()}get[(Mx=Ke(486),Gx=Ke(440)+Ke(524),Fx=Ke(528)+"xt",Ke(499)+Ke(449))](){return WA(this,LI)}async[(vx=Ke(535),Ke(464))](){var A,e;const t=Ke,{model8:g,model16:o,model32:n}=await Fd(this,GQ,Ux).call(this);if(!WA(this,cg)){if(!g||!o||!o)throw new Error(t(441)+t(428));Lt(this,cg,new bx({params:{debugLogs:(A=WA(this,UI))==null?void 0:A[t(453)],logProcessStats:!1,useSharedArrayBuffer:!1,bufferOverflowMS:((e=WA(this,UI))==null?void 0:e[t(534)+t(485)])??50,models:{model8:g,model16:o,model32:n}}}))}await WA(this,cg)[t(464)](),Lt(this,LI,!0)}[Ke(480)](){var A,e,t,g,o;const n=Ke;(A=this[n(535)])==null||A.call(this,!1),Lt(this,xn,void 0);let I=(e=WA(this,_t))==null?void 0:e[n(526)]();try{(t=WA(this,_t))==null||t[n(450)]()}catch(a){I?Yi[n(527)](n(467)+n(468)+n(482)+n(463),a):Yi[n(420)](n(467)+n(468)+n(482)+n(457)+n(430)+n(439)+n(477),a)}try{(g=WA(this,_t))==null||g[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(482)+n(463),a)}try{(o=WA(this,cg))==null||o[n(480)]()}catch(a){Yi[n(527)](n(467)+n(476)+n(474),a)}Lt(this,cg,void 0),Lt(this,LI,!1),this[n(486)]=!1,clearInterval(WA(this,cs))}async[Ke(479)](A,e){const t=Ke;if(!WA(this,cg))throw new TypeError(t(447)+t(469));return Lt(this,_t,await WA(this,cg)[t(539)+t(429)]({audioContext:A,stream:e},async()=>{const g=t;this[g(486)]=!0},()=>{const g=t;this[g(486)]=!1})),this[t(528)+"xt"]=A,Lt(this,_o,this[t(528)+"xt"][t(523)+t(484)+t(493)](e)),WA(this,eo)??Lt(this,eo,this[t(528)+"xt"][t(523)+t(538)+t(456)]()),WA(this,_o)[t(479)](WA(this,_t))[t(479)](WA(this,eo)),WA(this,eo)[t(530)]}async[Ke(492)](A){Lt(this,xn,A)}async[Ke(515)](A){var e,t,g,o,n,I,a;const s=Ke;if(this[s(440)+s(524)]=A,!this[s(486)]&&(Yi[s(420)](s(435)+s(452)+s(498)+s(470)+s(490)),await new Promise(C=>{Lt(this,cs,setInterval(()=>{this[vI(486)]&&C(void 0)},20))})),A!==this[s(440)+s(524)]){Yi[s(420)](s(459)+s(494)+s(502)+s(475)+s(473)+s(512)+s(507)+"y");return}return A?WA(this,xn)?await Fd(this,MQ,Lx).call(this,WA(this,xn))?(Yi[s(420)](s(537)+s(489)+s(432)),(g=WA(this,_t))==null||g[s(540)](),(o=this[s(535)])==null||o.call(this,!0),!0):(Yi[s(527)](s(519)+s(444)+s(436)+s(438)+s(513)+s(506)+s(437)+"d."),(n=WA(this,_t))==null||n[s(450)](),(I=this[s(535)])==null||I.call(this,!1),!1):(Yi[s(527)](s(525)+s(520)+s(446)+s(471)+s(433)+s(518)),(a=this[s(535)])==null||a.call(this,!1),!1):(Yi[s(420)](s(462)+s(529)+s(522)),(e=WA(this,_t))==null||e[s(450)](),(t=this[s(535)])==null||t.call(this,!1),!1)}[Ke(526)](){const A=Ke;return this[A(499)+A(449)]&&this[A(486)]&&!!WA(this,_t)&&WA(this,_t)[A(526)]()}async[Ke(466)](A){var e,t;const g=Ke;if(!WA(this,_t)||!WA(this,eo)||!WA(this,_o)||!this[g(528)+"xt"])throw Error(g(487)+g(445)+g(461)+g(481)+g(426));return WA(this,_o)[g(497)](),(e=WA(this,_t))==null||e[g(497)](WA(this,eo)),(t=WA(this,_t))==null||t[g(480)](),Lt(this,_o,void 0),this[g(479)](this[g(528)+"xt"],A)}}cg=new WeakMap,_t=new WeakMap,LI=new WeakMap,_o=new WeakMap,eo=new WeakMap,xn=new WeakMap,UI=new WeakMap,cs=new WeakMap,MQ=new WeakSet,Lx=async function(i){const A=Ke;let e=i[A(501)][A(500)];e[A(458)]("ws")&&(e=e[A(541)](/^(ws)/,A(491)));const t=i[A(501)][A(505)],g=new URL(A(424),e),o=await fetch(g,{headers:{authorization:A(510)+t}});if(o.ok)return(await o[A(536)]())[A(434)+A(455)+A(443)]===!0;throw new Error(A(517)+A(495)+A(514)+A(454)+A(431)+A(521)+o[A(532)]+": "+o[A(516)])},GQ=new WeakSet,Ux=async function(){const i=Ke,A=await fetch(i(442)+i(421)+i(425)+i(483));if(A.ok){const e=await A[i(536)]();return{model8:e[i(511)][i(531)],model16:e[i(511)][i(504)],model32:e[i(511)][i(422)]}}else throw new Error(i(508)+i(496)+i(451)+A[i(532)]+": "+A[i(516)])};const vQ=fi("livekit");var Tt;class Tx{constructor(A){di(this,"name","livekit-noise-filter"),di(this,"processedTrack"),di(this,"trackSettings"),di(this,"originalTrack"),hi(this,Tt,void 0),di(this,"init",async e=>{vQ.debug("Krisp: Initializing track processor"),this.originalTrack=e.track,this.trackSettings=e.track.getSettings(),e.audioContext.sampleRate!==this.trackSettings.sampleRate&&vQ.debug("Krisp: Sample rate mismatch, reapplying"),await e.track.applyConstraints({...this.trackSettings,noiseSuppression:!1,voiceIsolation:!1,sampleRate:e.audioContext.sampleRate}),WA(this,Tt)||Lt(this,Tt,new FQ),WA(this,Tt).onEnable=t=>{var g;const o=new Event(`${t?"enable":"disable"}-lk-krisp-noise-filter`);(g=this.processedTrack)==null||g.dispatchEvent(o)},await WA(this,Tt).init(),this.processedTrack=(await WA(this,Tt).connect(e.audioContext,new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"restart",async e=>{if(!WA(this,Tt))throw Error("LiveKit-Krisp: Cannot restart without having initialized first");vQ.debug("Krisp: Restarting plugin"),this.processedTrack=(await WA(this,Tt).restart(new MediaStream([e.track]))).getAudioTracks()[0]}),di(this,"destroy",async()=>{var e,t;(e=WA(this,Tt))==null||e.dispose(),await((t=this.originalTrack)==null?void 0:t.applyConstraints(this.trackSettings))}),Lt(this,Tt,new FQ(A))}static isSupported(){return FQ.isSupported()}async onPublish(A){WA(this,Tt).onPublish(A),this.setEnabled(!0)}async setEnabled(A){return await WA(this,Tt).setEnabled(A)}isEnabled(){return WA(this,Tt).isEnabled()}}Tt=new WeakMap;const Hy=Tx.isSupported,Py=i=>new Tx(i);class LQ extends EventTarget{constructor(){super(...arguments),this.room=null,this.callStatus="idle",this.isReady=!1,this.error=null,this.microphoneEnabled=!1,this.connectedParticipants=[],this.userIdentity="",this.roomName="",this.audioPlaybackPrompt=!1,this.isAppleDevice=/iPhone|iPad|iPod|Macintosh|Mac OS/i.test(navigator.userAgent),this.krispFilter=null,this.krispSupported=Hy()}set serviceUrl(A){this._serviceUrl=A}get serviceUrl(){return this._serviceUrl??"https://voice.hanc.ai"}get status(){return this.callStatus}get ready(){return this.isReady}get currentError(){return this.error}get currentRoom(){return this.room}get isMicrophoneEnabled(){return this.microphoneEnabled}get participants(){return this.connectedParticipants}get identity(){return this.userIdentity}get roomNameValue(){return this.roomName}get showAudioPrompt(){return this.audioPlaybackPrompt}updateStatus(A){this.callStatus=A,this.dispatchEvent(new CustomEvent("status-changed",{detail:A}))}async makeCall({agentId:A}){if(!(this.room&&this.room.state==="connected")){this.updateStatus("connecting"),this.error=null,this.isReady=!1,this.room&&(await this.room.disconnect(),this.room=null);try{const e=new gn({webAudioMix:!0});this.room=e,this.setupRoomEventListeners(e);const t=await fetch(`${this.serviceUrl}/create-room-token`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({metadata:{agent_id:A,timestamp:Date.now(),is_apple_device:this.isAppleDevice}})});if(!t.ok){const C=await t.text();throw new Error(`Failed to get room token: ${t.status} ${C}`)}const{token:g,url:o,room_name:n,user_identity:I}=await t.json();this.roomName=n,this.userIdentity=I;const a={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0};await Promise.all([e.localParticipant.setMicrophoneEnabled(!0,a).then(()=>{this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled"))}).catch(C=>{console.warn("Could not enable microphone:",C),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))}),e.connect(o,g)]),await new Promise(C=>setTimeout(C,700)),this.updateStatus("connected"),this.isReady=!0;const s=async C=>{if(C.kind!=="audio"||!C.track)return;const r=C.track;await new Promise(B=>setTimeout(B,500));try{await this.applyKrispFilter(r),console.log("[Krisp] Filter applied via LocalTrackPublished event")}catch(B){console.warn("[Krisp] Failed to apply filter:",B)}const Q=r.mediaStreamTrack;Q&&this.dispatchEvent(new CustomEvent("local-audio-track",{detail:Q}))};e.localParticipant.on("localTrackPublished",s);for(const C of e.localParticipant.audioTrackPublications.values())C.track&&s(C);this.dispatchEvent(new CustomEvent("room-connected",{detail:{roomName:n,identity:I}}))}catch(e){this.error=`Connection failed: ${e instanceof Error?e.message:String(e)}`,this.updateStatus("error"),this.isReady=!1,this.room=null,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}}setupRoomEventListeners(A){A.on(IA.Connected,()=>{this.updateStatus("connected"),this.isReady=!0}),A.on(IA.Disconnected,()=>{this.updateStatus("disconnected"),this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.room=null,this.isReady=!1,this.krispFilter=null,this.dispatchEvent(new CustomEvent("disconnected"))}),A.on(IA.ParticipantConnected,e=>{this.connectedParticipants=[...this.connectedParticipants,e.identity];const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0,this.dispatchEvent(new CustomEvent("agent-connected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-connected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(IA.ParticipantDisconnected,e=>{this.connectedParticipants=this.connectedParticipants.filter(g=>g!==e.identity);const t=e.identity.includes("agent")||e.identity.includes("voice-assistant")||e.identity.includes("AJ_");t&&(this.audioPlaybackPrompt=!1,this.updateStatus("connected"),this.dispatchEvent(new CustomEvent("agent-disconnected",{detail:{participant:e.identity}}))),this.dispatchEvent(new CustomEvent("participant-disconnected",{detail:{participant:e.identity,isAgent:t}}))}),A.on(IA.TrackSubscribed,(e,t,g)=>{if(e.kind==="audio"){const o=e.attach();document.body.appendChild(o),this.dispatchEvent(new CustomEvent("audio-track-added",{detail:{participant:g.identity,element:o}}));const n=e.mediaStreamTrack;n&&this.dispatchEvent(new CustomEvent("audio-track",{detail:n}))}}),A.on(IA.TrackUnsubscribed,(e,t,g)=>{e.detach(),this.dispatchEvent(new CustomEvent("audio-track-removed",{detail:{participant:g.identity}}))}),A.on(IA.MediaDevicesError,e=>{this.error=`Media device error: ${e.message}`,this.updateStatus("error"),this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}),A.on(IA.AudioPlaybackStatusChanged,async()=>{A.canPlaybackAudio||this.connectedParticipants.some(t=>t.includes("agent")||t.includes("voice-assistant")||t.includes("AJ_"))&&!this.audioPlaybackPrompt&&(this.updateStatus("agent-connected"),this.audioPlaybackPrompt=!0),this.dispatchEvent(new CustomEvent("audio-playback-status-changed",{detail:{canPlayback:A.canPlaybackAudio}}))})}async applyKrispFilter(A){if(!this.krispSupported){console.log("[Krisp] Not supported in this browser");return}try{this.krispFilter||(this.krispFilter=Py()),await A.setProcessor(this.krispFilter),console.log("[Krisp] Noise filter applied successfully")}catch(e){console.warn("[Krisp] Failed to apply noise filter:",e)}}async toggleMicrophone(){if(this.room)try{this.microphoneEnabled?(await this.room.localParticipant.setMicrophoneEnabled(!1),this.microphoneEnabled=!1,this.dispatchEvent(new CustomEvent("microphone-disabled"))):(await this.room.localParticipant.setMicrophoneEnabled(!0,{echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0}),this.microphoneEnabled=!0,this.dispatchEvent(new CustomEvent("microphone-enabled")),setTimeout(async()=>{if(!this.room)return;const A=Array.from(this.room.localParticipant.audioTrackPublications.values()).find(e=>e.kind==="audio");if(A!=null&&A.track)try{await this.applyKrispFilter(A.track),console.log("[Krisp] Filter applied on toggle")}catch(e){console.warn("[Krisp] Failed to apply on toggle:",e)}},500))}catch(A){this.error=`Failed to toggle microphone: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async enableAudio(){if(this.room)try{await this.room.startAudio(),this.audioPlaybackPrompt=!1;const A=JSON.stringify({type:"audio_enabled"}),t=new TextEncoder().encode(A);await this.room.localParticipant.publishData(t,{reliable:!0}),this.dispatchEvent(new CustomEvent("audio-enabled"))}catch(A){this.error=`Failed to enable audio: ${A instanceof Error?A.message:String(A)}`,this.dispatchEvent(new CustomEvent("error",{detail:{error:this.error}}))}}async hangUp(){if(!this.room){this.error="No active connection to end.";return}this.updateStatus("disconnecting");const A=this.room;this.room=null,this.connectedParticipants=[],this.microphoneEnabled=!1,this.audioPlaybackPrompt=!1,this.isReady=!1,this.krispFilter=null,this.updateStatus("disconnected"),this.dispatchEvent(new CustomEvent("call-ended")),requestAnimationFrame(()=>{setTimeout(async()=>{try{await A.disconnect()}catch(e){console.warn("Error during room disconnect:",e)}},0)})}}/**
185
185
  * @license
186
186
  * Copyright 2010-2025 Three.js Authors
187
187
  * SPDX-License-Identifier: MIT
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hanc-webrtc-widgets",
3
- "version": "2.4.5",
3
+ "version": "2.4.6",
4
4
  "type": "module",
5
5
  "main": "dist/hanc-webrtc-widgets.umd.js",
6
6
  "module": "dist/hanc-webrtc-widgets.es.js",