fc-nexmo-client1
Version:
Nexmo Client SDK for JavaScript
1 lines • 351 kB
JavaScript
!function(){return function r(e,t,n){function o(s,a){if(!t[s]){if(!e[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(i)return i(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var d=t[s]={exports:{}};e[s][0].call(d.exports,function(t){return o(e[s][1][t]||t)},d,d.exports,r,e,t,n)}return t[s].exports}for(var i="function"==typeof require&&require,s=0;s<n.length;s++)o(n[s]);return o}}()({1:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=e("wildemitter"),s=e("loglevel"),o=e("./nexmoClientError"),a=n(e("./user")),c=n(e("./conversation")),u=n(e("./modules/nxmCall")),d=n(e("./handlers/sip_events")),l=n(e("./handlers/rtc_events")),p=n(e("./handlers/application_events")),h=n(e("./utils")),f=n(e("./pages/page_config")),m=n(e("./pages/conversations_page")),g=n(e("./pages/user_sessions_page")),v=e("./handlers/events_queue"),y=n(e("./member"));let b=null,_=null,w=null;class Application{constructor(e,t){this.log=s.getLogger(this.constructor.name),this.session=e,this.conversations=new Map,this.synced_conversations_count=0,this.start_sync_time=0,this.stop_sync_time=0,this.calls=new Map,this._call_draft_list=new Map,this.pageConfig=new f.default((e.config||{}).conversations_page_config),this.conversations_page_last=null,this.activeStreams=[],b=new d.default(this),_=new l.default(this),w=new p.default(this),this.me=null,Object.assign(this,t),i.mixin(Application)}updateOrCreateConversation(e){const t=this.conversations.get(e.id);return t?(t._updateObjectInstance(e),this.conversations.set(e.id,t)):this.conversations.set(e.id,new c.default(this,e)),this.conversations.get(e.id)}async _enqueueEvent(e){this.session.config.enableEventsQueue?(this.eventsQueue||(this.eventsQueue=new v.EventsQueue(e=>this._handleEvent(e))),this.eventsQueue.enqueue(e,this)):this._handleEvent(e)}async _handleEvent(e){var t,r,n,i,s,o,a;const c=(null===(t=e._embedded)||void 0===t?void 0:t.from_user)?(null===(n=null===(r=e._embedded)||void 0===r?void 0:r.from_user)||void 0===n?void 0:n.id)===(null===(i=this.me)||void 0===i?void 0:i.id):(null===(o=null===(s=e.body)||void 0===s?void 0:s.user)||void 0===o?void 0:o.user_id)===(null===(a=this.me)||void 0===a?void 0:a.id),u=h.default._checkIfUserIsReInvited(this.conversations,e);if(e.type.startsWith("sip"))return b._handleSipCallEvent(e),e;if(this.conversations.has(e.cid)&&"rtc:transfer"!==e.type&&!u)return e.type.startsWith("rtc")&&_._handleRtcEvent(e),this.conversations.get(e.cid)._handleEvent(e),"member:joined"!==e.type&&"member:invited"!==e.type||!c||this._handleApplicationEvent(e),e;if(e.cid)try{let t;return u&&this.conversations.delete(e.cid),t=h.default._isCallEvent(e)?await this.getConversation(e.cid,Application.CONVERSATION_API_VERSION.v1):await this.getConversation(e.cid,Application.CONVERSATION_API_VERSION.v3),this.conversations.set(e.cid,t),await t._handleEvent(e),await this._handleApplicationEvent(e),e.type.startsWith("rtc")&&_._handleRtcEvent(e),Promise.resolve(e)}catch(e){return this.log.error(e),Promise.reject(e)}}async updateToken(e){if(this.session.connection&&this.session.connection.disconnected)return this.session.config.token=e,this.session.connection.io.opts.query.token=e,Promise.resolve();const t={url:`${this.session.config.nexmo_api_url}/v0.2/sessions/${this.session.session_id}`,type:"PUT",token:e};try{await h.default.networkRequest(t),this.me&&(this.session.config.token=e,this.session.connection.io.opts.query.token=e)}catch(e){throw new o.NexmoApiError(e)}}async _handleApplicationEvent(e){try{this.log.debug("_handleApplicationEvent: ",{event:e});const t=w.handleEvent(e),r=this.conversations.get(e.cid);let n;if(r.members.has((t||{}).from))n=r.members.get(t.from);else if("member:joined"===e.type||"member:invited"===e.type){const t={...e.body,...e.from&&{member_id:e.from}};n=new y.default(r,t)}else try{n=await r.getMember(t.from)}catch(e){this.log.warn(`There is an error getting the member ${e}`)}return this.emit(t.type,n,t),e}catch(e){throw this.log.error("_handleApplicationEvent: ",e),e}}async inAppCall(e){if(!e||!Array.isArray(e)||0===e.length)return Promise.reject(new o.NexmoClientError("error:application:call:params"));try{const t=new u.default(this);return await t.createCall(e),t.direction=t.CALL_DIRECTION.OUTBOUND,t}catch(e){throw e}}async callServer(e,t="phone",r={},ringingMuted = false){try{const n=new u.default(this);return n.direction=n.CALL_DIRECTION.OUTBOUND,await n.createServerCall(e,t,r,ringingMuted),n}catch(e){throw e}}async reconnectCall(e,t,r={}){try{if(!e||!t)throw new o.NexmoClientError("error:missing:params");const n=await this.getConversation(e,Application.CONVERSATION_API_VERSION.v1);await n.media.enable({...r,reconnectRtcId:t});const i=new u.default(this,n),s=Array.from(n.events.values()).map(e=>e.type);return s.includes("sip:answered")?i.status=i.CALL_STATUS.ANSWERED:s.includes("sip:ringing")?i.status=i.CALL_STATUS.RINGING:i.status=i.CALL_STATUS.STARTED,i.rtcObjects=n.media.rtcObjects,this.calls.set(n.id,i),i}catch(e){throw e}}async newConversation(e={}){try{const t=await this.session.sendNetworkRequest({type:"POST",path:"conversations",data:e}),r=new c.default(this,t);return this.conversations.set(r.id,r),this.getConversation(r.id,Application.CONVERSATION_API_VERSION.v1)}catch(e){throw new o.NexmoApiError(e)}}async newConversationAndJoin(e){const t=await this.newConversation(e);return await t.join(),t}async getConversation(e,t=Application.CONVERSATION_API_VERSION.v3){if(t!==Application.CONVERSATION_API_VERSION.v1&&t!==Application.CONVERSATION_API_VERSION.v3)throw new o.NexmoClientError("error:conversation-service:version");let r;if(t===Application.CONVERSATION_API_VERSION.v1)try{(r=await this.session.sendNetworkRequest({type:"GET",path:`conversations/${e}`})).id=r.uuid,delete r.uuid}catch(e){throw new o.NexmoApiError(e)}else try{r=await this.session.sendNetworkRequest({type:"GET",path:`conversations/${e}`,version:"v0.3"})}catch(e){throw new o.NexmoApiError(e)}const n=this.updateOrCreateConversation(r);if(t===Application.CONVERSATION_API_VERSION.v3&&!n.me)try{const e=await n.getMyMember();n.me=e,n.members.set(e.id,e)}catch(e){try{const e=await n.getMyMember();n.me=e,n.members.set(e.id,e)}catch(e){this.log.warn(`You don't have any membership in ${n.id}`)}}if("full"===this.session.config.sync){const{items:e}=await n.getEvents();return n.events=e,n}return n}async getConversations(e={}){const t=`${this.session.config.nexmo_api_url}/beta2/users/${this.me.id}/conversations`;let r=0===Object.keys(e).length?this.pageConfig:new f.default(e);try{const e=await h.default.paginationRequest(t,r,this.session.config.token);e.application=this;const n=new m.default(e);return this.conversations_page_last=n,n}catch(e){throw new o.NexmoApiError(e)}}syncConversations(e){const t=Array.from(e.values()),r=t.length,n=new Date;this.start_sync_time="undefined"!=typeof window&&window.performance?window.performance.now():n.getTime();const i=async()=>{this.synced_conversations_percentage=Number((this.synced_conversations_count/r*100).toFixed(2));const e={sync_progress:this.synced_conversations_percentage};if(this.emit("sync:progress",e),this.log.info("Loading sync progress: "+this.synced_conversations_count+"/"+r+" - "+this.synced_conversations_percentage+"%"),this.synced_conversations_percentage>=100){const e=new Date;this.stop_sync_time="undefined"!=typeof window&&window.performance?window.performance.now():e.getTime(),this.log.info("Loaded conversations in "+(this.stop_sync_time-this.start_sync_time)+"ms")}this.synced_conversations_count<r&&(await this.getConversation(t[this.synced_conversations_count].id),i(),this.synced_conversations_count++,this.sync_progress_buffer++)};i()}async getUser(e=this.me.id){try{const t=await this.session.sendNetworkRequest({type:"GET",path:`users/${e}`});return new a.default(this,t)}catch(e){throw new o.NexmoApiError(e)}}async getUserSessions(e={}){var t;const r=(null===(t=e)||void 0===t?void 0:t.user_id)||this.me.id,n=`${this.session.config.nexmo_api_url}/v0.3/users/${r}/sessions`;let i=0===Object.keys(e).length?this.pageConfig:new f.default(e);try{const e=await h.default.paginationRequest(n,i,this.session.config.token,Application.CONVERSATION_API_VERSION.v3);e.application=this;const t=new g.default(e);return this.user_sessions_page_last=t,t}catch(e){throw new o.NexmoApiError(e)}}}r.default=Application,Application.CONVERSATION_API_VERSION={v1:"v0.1",v3:"v0.3"},t.exports=Application},{"./conversation":2,"./handlers/application_events":7,"./handlers/events_queue":9,"./handlers/rtc_events":10,"./handlers/sip_events":11,"./member":13,"./modules/nxmCall":16,"./nexmoClientError":20,"./pages/conversations_page":22,"./pages/page_config":26,"./pages/user_sessions_page":27,"./user":29,"./utils":31,loglevel:63,wildemitter:107}],2:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=e("wildemitter"),s=e("loglevel"),o=e("./nexmoClientError"),a=n(e("./member")),c=n(e("./events/nxmEvent")),u=n(e("./events/text_event")),d=n(e("./events/message_event")),l=n(e("./modules/media")),p=n(e("./handlers/conversation_events")),h=n(e("./utils")),f=n(e("./pages/page_config")),m=n(e("./pages/events_page")),g=n(e("./pages/members_page")),v=n(e("./application"));class Conversation{constructor(e,t){this.log=s.getLogger(this.constructor.name),this.application=e,this.id=null,this.name=null,this.display_name=null,this.timestamp=null,this.members=new Map,this.events=new Map,this.sequence_number=0,this.pageConfig=new f.default(((this.application.session||{}).config||{}).events_page_config),this.events_page_last=null,this.members_page_last=null,this.conversationEventHandler=new p.default(e,this),this.media=new l.default(this),this.me=null,this._updateObjectInstance(t),i.mixin(Conversation)}_updateObjectInstance(e){for(let t in e)switch(t){case"id":this.id=e.id;break;case"name":this.name=e.name;break;case"display_name":this.display_name=e.display_name;break;case"members":e.members.forEach(e=>{if(this.members.has(e.member_id))this.members.get(e.member_id)._normalise(e),e.user_id===this.application.me.id&&"LEFT"!==e.state&&(this.me=this.members.get(e.member_id),this.members.set(this.me.id,this.me));else{const t=new a.default(this,e);e.user_id===this.application.me.id&&"LEFT"!==e.state&&(this.me=t),this.members.set(t.id,t)}});break;case"timestamp":this.timestamp=e.timestamp;break;case"sequence_number":this.sequence_number=e.sequence_number;break;case"member_id":const r={id:e.member_id,state:e.state,user:this.application.me};if(this.members.has(e.member_id)){const t=this.members.get(e.member_id);Object.assign(t,r)}else{const e=new a.default(this,r);this.me=e,this.members.set(e.id,e)}}}async join(e){var t,r;try{let n={state:"joined",channel:{type:"app"},user:{...!e&&{name:this.application.me.name,id:this.application.me.id},...e&&e.user_name&&{name:e.user_name},...e&&e.user_id&&{id:e.user_id}}};(null===(t=null===this||void 0===this?void 0:this.me)||void 0===t?void 0:t.id)&&"LEFT"!==(null===(r=null===this||void 0===this?void 0:this.me)||void 0===r?void 0:r.state)&&(n.from=this.me.id);const i=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/members`,version:"v0.3",data:n}),s=new a.default(this,i);return i._embedded.user.id===this.application.me.id&&(this.me=s,this.members.set(s.id,s)),this.application.getConversation(this.id,v.default.CONVERSATION_API_VERSION.v3),s}catch(e){throw new o.NexmoApiError(e)}}async del(){try{const e=await this.application.session.sendNetworkRequest({type:"DELETE",path:`conversations/${this.id}`});return this.application.conversations.delete(this.id),e}catch(e){throw new o.NexmoApiError(e)}}deleteEvent(e){return e.del()}async invite(e){var t,r;if(!e||!e.id&&!e.user_name)throw new o.NexmoClientError("error:invite:missing:params");const n={state:"invited",user:{...e.id&&{id:e.id},...e.user_name&&{name:e.user_name}},media:e.media,channel:{from:{type:"app"},to:{type:"app"},type:"app"}};(null===(t=null===this||void 0===this?void 0:this.me)||void 0===t?void 0:t.id)&&"LEFT"!==(null===(r=null===this||void 0===this?void 0:this.me)||void 0===r?void 0:r.state)&&(n.from=this.me.id);try{const e=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/members`,version:"v0.3",data:n});return new a.default(this,e)}catch(e){throw new o.NexmoApiError(e)}}inviteWithAudio(e){return e&&(e.id||e.user_name)?(e.media={audio_settings:{enabled:!0,muted:!1,earmuffed:!1}},this.invite(e)):Promise.reject(new o.NexmoClientError("error:invite:missing:params"))}leave(e){return this.me.kick(e)}async sendText(e){try{if(null===this.me)throw new o.NexmoClientError("error:self");const t={type:"text",cid:this.id,from:this.me.id,body:{text:e}},{id:r,timestamp:n}=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/events`,data:t});return t.id=r,t.body.timestamp=n,new u.default(this,t)}catch(e){throw new o.NexmoApiError(e)}}async sendCustomEvent({type:e,body:t}){try{if(null===this.me)throw new o.NexmoClientError("error:self");if(!e||"string"!=typeof e||e.length<1)throw new o.NexmoClientError("error:custom-event:invalid");const r={type:`custom:${e}`,cid:this.id,from:this.me.id,body:t},{id:n,timestamp:i}=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/events`,data:r});return r.id=n,r.timestamp=i,new c.default(this,r)}catch(e){throw new o.NexmoApiError(e)}}async uploadImage(e,t={quality_ratio:"100",medium_size_ratio:"50",thumbnail_size_ratio:"30"}){const r=new FormData;r.append("file",e),r.append("quality_ratio",t.quality_ratio),r.append("medium_size_ratio",t.medium_size_ratio),r.append("thumbnail_size_ratio",t.thumbnail_size_ratio);const n=await h.default.networkRequest({type:"POST",url:this.application.session.config.ips_url,data:r,token:this.application.session.config.token});return n.upload.addEventListener("progress",e=>{e.lengthComputable&&this.log.debug("uploading image "+e.loaded+"/"+e.total)},!1),n.onreadystatechange=(()=>{200!==n.status&&this.log.error(n)}),n}async sendImage(e,t={quality_ratio:"100",medium_size_ratio:"50",thumbnail_size_ratio:"30"}){const r=await this.uploadImage(e,t);return r.onreadystatechange=(()=>{if(4===r.readyState&&200===r.status)try{this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/events`,data:{type:"image",from:this.me.id,body:{representations:JSON.parse(r.responseText)}}}),this.log.info(r)}catch(e){this.log.error(new o.NexmoApiError(e))}}),r}abortSendImage(e){return e instanceof XMLHttpRequest?e.abort():new o.NexmoClientError("error:invalid:param:type")}async sendMessage(e){if(null===this.me)throw new o.NexmoClientError("error:self");if(!(null===e||void 0===e?void 0:e.message_type))throw new o.NexmoClientError("error:message-event:invalid");try{const t={type:"message",cid:this.id,from:this.me.id,body:{...e}},{id:r,timestamp:n}=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/events`,data:t});return t.id=r,t.body.timestamp=n,new d.default(this,t)}catch(e){throw new o.NexmoApiError(e)}}async _typing(e){const t={activity:"on"===e?1:0},r={type:"text:typing:"+e,cid:this.id,from:this.me.id,body:t};try{return await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/events`,data:r}),`text:typing:${e}:success`}catch(e){throw new o.NexmoApiError(e)}}startTyping(){return this._typing("on")}stopTyping(){return this._typing("off")}async getEvents(e={}){const t=`${this.application.session.config.nexmo_api_url}/beta2/conversations/${this.id}/events`;let r=0===Object.keys(e).length?this.pageConfig:new f.default(e);try{const e=await h.default.paginationRequest(t,r,this.application.session.config.token);e.application=this.application,e.conversation=this;const n=new m.default(e);return this.events_page_last=n,n}catch(e){throw new o.NexmoApiError(e)}}async getMembers(e={}){const t=`${this.application.session.config.nexmo_api_url}/beta2/conversations/${this.id}/members`;let r=0===Object.keys(e).length?this.pageConfig:new f.default(e);try{const e=await h.default.paginationRequest(t,r,this.application.session.config.token);e.application=this.application,e.conversation=this;const n=new g.default(e);return this.members_page_last=n,n}catch(e){throw new o.NexmoApiError(e)}}async getMyMember(){try{const e=await this.application.session.sendNetworkRequest({type:"GET",path:`conversations/${this.id}/members/me`,version:"v0.3"});return new a.default(this,e)}catch(e){throw new o.NexmoApiError(e)}}async getMember(e){try{const t=await this.application.session.sendNetworkRequest({type:"GET",path:`conversations/${this.id}/members/${e}`,version:"v0.3"});return new a.default(this,t)}catch(e){throw new o.NexmoApiError(e)}}_handleEvent(e){var t,r;if(e.type.startsWith("rtc"))return this.emit(e.type,e),Promise.resolve(e);this.sequence_number++,e.body&&e.body.event_id&&"string"==typeof e.body.event_id&&(e.body.event_id=parseInt(e.body.event_id));let n={memberId:e.from};if(null===(t=null===e||void 0===e?void 0:e.body)||void 0===t?void 0:t.user){const{id:t,name:r,display_name:i,image_url:s,custom_data:o}=e.body.user;n={...n,...{...t&&{userId:t},...r&&{userName:r},...i&&{displayName:i},...s&&{imageUrl:s},...o&&{customData:o}}}}else if(null===(r=null===e||void 0===e?void 0:e._embedded)||void 0===r?void 0:r.from_user){const{id:t,name:r,display_name:i,image_url:s,custom_data:o}=e._embedded.from_user;n={...n,...{...t&&{userId:t},...r&&{userName:r},...i&&{displayName:i},...s&&{imageUrl:s},...o&&{customData:o}}}}let i=this.conversationEventHandler.handleEvent(e);return["text:typing:on","text:typing:off"].includes(e.type)||this.events.set(i.id,i),e.type.startsWith("custom:")?(this.emit(i.type,n,i),Promise.resolve(e)):(this.emit(e.type,n,i),Promise.resolve(e))}}r.default=Conversation,t.exports=Conversation},{"./application":1,"./events/message_event":4,"./events/nxmEvent":5,"./events/text_event":6,"./handlers/conversation_events":8,"./member":13,"./modules/media":15,"./nexmoClientError":20,"./pages/events_page":23,"./pages/members_page":24,"./pages/page_config":26,"./utils":31,loglevel:63,wildemitter:107}],3:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=n(e("../utils")),s=e("loglevel"),o=n(e("./nxmEvent"));class ImageEvent extends o.default{constructor(e,t){super(e,t),this.log=s.getLogger(this.constructor.name),this.type="image",this.conversation=e,this.state={seen_by:{},delivered_to:{}},t&&t.body&&t.body.timestamp&&(this.timestamp=t.body.timestamp),Object.assign(this,t)}seen(){return super.seen()}delivered(){return super.delivered()}async del(){return await i.default.networkRequest({type:"DELETE",url:this.body.representations.original.url,token:this.conversation.application.session.config.token}),super.del()}async fetchImage(e="thumbnail",t=this.body.representations){try{return i.default._fetchImage(t[e].url,this.conversation.application.session.config.token)}catch(e){throw this.log.error(e),e}}}r.default=ImageEvent,t.exports=ImageEvent},{"../utils":31,"./nxmEvent":5,loglevel:63}],4:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=e("loglevel"),s=n(e("../utils")),o=n(e("./nxmEvent")),a=e("../nexmoClientError");class MessageEvent extends o.default{constructor(e,t){super(e,t),this.log=i.getLogger(this.constructor.name),this.type="message",this.conversation=e,this.state={seen_by:{},delivered_to:{},submitted_to:{},rejected_by:{},undeliverable_to:{}},t&&t.body&&t.body.timestamp&&(this.timestamp=t.body.timestamp),Object.assign(this,t)}seen(){return super.seen()}delivered(){return super.delivered()}del(){return super.del()}async fetchImage(){if("image"!==this.body.message_type)throw new a.NexmoClientError("error:message-event:invalid");try{return s.default._fetchImage(this.body.image.url,this.conversation.application.session.config.token)}catch(e){throw this.log.error(e),e}}}r.default=MessageEvent,t.exports=MessageEvent},{"../nexmoClientError":20,"../utils":31,"./nxmEvent":5,loglevel:63}],5:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});const n=e("wildemitter"),i=e("../nexmoClientError");class NXMEvent{constructor(e,t){var r,i,s,o;if(this.conversation=e,t)for(const e in t)switch(e){case"type":t.type.startsWith("custom:")?this.type=t.type.replace("custom:",""):this.type=t.type;break;case"application_id":this.application_id=t.application_id;break;case"cid":this.cid=t.cid;break;case"from":["member:invited","member:joined","member:left"].indexOf(t.type)>-1?(null===(i=null===(r=t._embedded)||void 0===r?void 0:r.from_member)||void 0===i?void 0:i.id)&&(this.from=null===(o=null===(s=t._embedded)||void 0===s?void 0:s.from_member)||void 0===o?void 0:o.id):this.from=t.from;break;case"timestamp":this.timestamp=t.timestamp;break;case"id":this.id=t.id;break;case"state":this.state=t.state;break;case"index":this.index=t.index;break;case"streamIndex":this.streamIndex=t.streamIndex;break;case"body":this.body=t.body,this.body.user&&this.body.user.user_id&&(this.body.user.id=this.body.user.user_id,delete this.body.user.user_id),this.body.digit&&(this.digit=this.body.digit,delete this.body.digit),this.body.digits&&(this.digit=this.body.digits,delete this.body.digits)}n.mixin(NXMEvent)}async del(e=this.id){try{return void await this.conversation.application.session.sendNetworkRequest({type:"DELETE",path:`conversations/${this.conversation.id}/events/${e}?from=${this.conversation.me.id}`,version:"beta2"})}catch(e){throw new i.NexmoApiError(e)}}async delivered(e=this.id){if("text"!==this.type&&"image"!==this.type&&"message"!==this.type&&(this.type="event"),this.conversation.me.id===this.from)throw new i.NexmoClientError("error:delivered:own-message");if(this.state&&this.state.delivered_to&&this.state.delivered_to[this.conversation.me.id])throw new i.NexmoClientError("error:already-delivered");try{return void await this.conversation.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.conversation.id}/events`,data:{type:`${this.type}:delivered`,from:this.conversation.me.id,body:{event_id:e}}})}catch(e){throw new i.NexmoApiError(e)}}async seen(e=this.id){if("text"!==this.type&&"image"!==this.type&&"message"!==this.type&&(this.type="event"),this.conversation.me.id===this.from)throw new i.NexmoClientError("error:seen:own-message");if(this.state&&this.state.seen_by&&this.state.seen_by[this.conversation.me.id])throw new i.NexmoClientError("error:already-seen");try{return void await this.conversation.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.conversation.id}/events`,data:{type:`${this.type}:seen`,from:this.conversation.me.id,body:{event_id:e}}})}catch(e){throw new i.NexmoApiError(e)}}}r.default=NXMEvent,t.exports=NXMEvent},{"../nexmoClientError":20,wildemitter:107}],6:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=n(e("./nxmEvent"));class TextEvent extends i.default{constructor(e,t){super(e,t),this.type="text",this.conversation=e,this.state={seen_by:{},delivered_to:{}},t&&t.body&&t.body.timestamp&&(this.timestamp=t.body.timestamp),Object.assign(this,t)}seen(){return super.seen()}delivered(){return super.delivered()}del(){return super.del()}}r.default=TextEvent,t.exports=TextEvent},{"./nxmEvent":5}],7:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=e("loglevel"),s=n(e("../events/nxmEvent")),o=n(e("../modules/nxmCall")),a=n(e("../utils")),c=n(e("../modules/rtc_helper"));class ApplicationEventsHandler{constructor(e){this.log=i.getLogger(this.constructor.name),this.application=e,this._handleApplicationEventMap={"member:joined":this._processMemberJoined,"member:invited":this._processMemberInvited}}handleEvent(e){const t=this.application.conversations.get(e.cid),r=Object.assign({},e);return this._handleApplicationEventMap.hasOwnProperty(e.type)?this._handleApplicationEventMap[e.type].call(this,t,new s.default(t,r),e):new s.default(t,r)}_processMemberJoined(e,t,r){try{if(t.body.channel&&this.application._call_draft_list.has(t.body.channel.id)){this.log.debug("_processMemberJoined: outbound serverCall from sdk",{event:t});const r=this.application._call_draft_list.get(t.body.channel.id);let n=((r.rtcObjects||{})[t.body.channel.id]||{}).pc;if(r._setFrom(e.me),r._setupConversationObject(e,t.body.channel.id),e.media._attachEndingEventHandlers(),0===Object.entries(e.media.rtcObjects).length&&0!==Object.entries(r.rtcObjects).length&&Object.assign(e.media.rtcObjects,r.rtcObjects),!e.media.pc&&n&&Object.assign(e.media.pc=n),0===e.application.activeStreams.length&&r.application.activeStreams.length>0&&(e.application.activeStreams=r.application.activeStreams),delete r.client_ref,delete r.knocking_id,r.rtcStats&&(e.media.rtcStats=r.rtcStats),this.application._call_draft_list.delete(t.body.channel.id),this.application.calls.set(e.id,r),r._handleStatusChange(t),this.log.debug("_processMemberJoined: processedCall ",{nxmCall:r}),e.members&&t.body.member_id){const n=e.members.get(t.body.member_id);n&&this.application.emit("member:call",n,r)}setTimeout(()=>{(null===e||void 0===e?void 0:e.me)&&c.default.emitMediaStream(e.me,n,r.stream)},200)}return this.log.debug("_processMemberJoined: default member joined: ",{event:t}),t}catch(e){this.log.error("_processMemberJoined: ",{e:e})}}_processMemberInvited(e,t){var r,n,i,s,c,u;try{if(!e)return this.log.warn(`no conversation object for ${t.type}`),t;if((null===(r=e.me)||void 0===r?void 0:r.user.id)===t.body.invited_by||!(null===(i=null===(n=t.body.user.media)||void 0===n?void 0:n.audio_settings)||void 0===i?void 0:i.enabled))return t;const d=a.default.getMemberNumberFromEventOrNull(t.body.channel)||a.default.getMemberFromNameOrNull(e,t.body.invited_by)||"unknown",l=new o.default(this.application,e,d);return this.application.calls.set(e.id,l),(null===(s=t.body)||void 0===s?void 0:s.sdp)&&this.application.session.config.enableInboundOffer&&l._setOffer({sdp:t.body.sdp,leg_id:t.body.channel.id}),(null===(c=e.display_name)||void 0===c?void 0:c.startsWith("CALL_"))||l._handleStatusChange(t),this.application.emit("member:call",this.application.conversations.get(t.cid).members.get(null===(u=t.body)||void 0===u?void 0:u.member_id),l),t}catch(e){this.log.error("_processMemberInvited: ",{e:e})}}}r.default=ApplicationEventsHandler,t.exports=ApplicationEventsHandler},{"../events/nxmEvent":5,"../modules/nxmCall":16,"../modules/rtc_helper":18,"../utils":31,loglevel:63}],8:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=e("loglevel"),s=n(e("../events/nxmEvent")),o=n(e("../events/text_event")),a=n(e("../events/image_event")),c=n(e("../events/message_event"));class ConversationEventHandler{constructor(e,t){this.log=i.getLogger(this.constructor.name),this.application=e,this.conversation=t,this.constructed_event=null,this._handleEventMap={"event:delete":this._processDelete,image:this._processImage,"image:delivered":this._processDelivered,"image:seen":this._processSeen,"member:invited":this._processMember,"member:joined":this._processMember,"member:left":this._processMember,"audio:ringing:start":this._processMember,"leg:status:update":this._processLegStatus,"member:media":this._processMedia,text:this._processText,"text:delivered":this._processDelivered,"text:seen":this._processSeen,"audio:mute:on":this._processMuteForMedia,"audio:mute:off":this._processMuteForMedia,message:this._processMessage,"message:delivered":this._processDelivered,"message:seen":this._processSeen,"message:submitted":this._processSubmitted,"message:rejected":this._processRejected,"message:undeliverable":this._processUndeliverable}}handleEvent(e){return this._handleEventMap.hasOwnProperty(e.type)&&this._handleEventMap[e.type].call(this,e)||new s.default(this.conversation,e)}_processDelivered(e){let t=this.conversation.events.get(e.body.event_id);return t?(t.state=t.state||{},t.state.delivered_to=t.state.delivered_to||{},t.state.delivered_to[e.from]=e.timestamp,t):(this.log.warn("NXMEvent not found"),null)}_processDelete(e){var t;let r=this.conversation.events.get(null===(t=null===e||void 0===e?void 0:e.body)||void 0===t?void 0:t.event_id);return r?(r.body.text&&(r.body.text=""),r.body.representations&&(r.body.representations=""),r.body.timestamp={deleted:e.timestamp},r):(this.log.warn("NXMEvent not found"),null)}_processImage(e){var t;const r=new a.default(this.conversation,e);return(null===(t=this.conversation.me)||void 0===t?void 0:t.id)!==r.from&&r.delivered(),r}_processMember(e){if(this.application.calls.has(this.conversation.id)){this.application.calls.get(this.conversation.id)._handleStatusChange(e)}return this.conversation.members.has(e.from)&&this.conversation.members.get(e.from)._handleEvent(e),new s.default(this.conversation,e)}_processLegStatus(e){return this.conversation.members.has(e.from)&&this.conversation.members.get(e.from)._handleEvent(e),new s.default(this.conversation,e)}_processMedia(e){return this.conversation.members.has(e.from)&&this.conversation.members.get(e.from)._handleEvent(e),null}_processMuteForMedia(e){return this.conversation.media.rtcObjects[e.body.rtc_id]?e.streamIndex=this.conversation.media.rtcObjects[e.body.rtc_id].streamIndex:this.log.warn("No audio stream was found"),null}_processSeen(e){let t=this.conversation.events.get(e.body.event_id);return t?(t.state=t.state||{},t.state.seen_by=t.state.seen_by||{},t.state.seen_by[e.from]=e.timestamp,t):(this.log.warn("NXMEvent not found"),null)}_processText(e){var t,r;const n=new o.default(this.conversation,e);return(null===(r=null===(t=this.conversation)||void 0===t?void 0:t.me)||void 0===r?void 0:r.id)!==n.from&&n.delivered(),n}_processMessage(e){var t,r;const n=new c.default(this.conversation,e);return(null===(r=null===(t=this.conversation)||void 0===t?void 0:t.me)||void 0===r?void 0:r.id)!==n.from&&n.delivered(),n}_processSubmitted(e){let t=this.conversation.events.get(e.body.event_id);return t?(t.state=t.state||{},t.state.submitted_to=t.state.submitted_to||{},t.state.submitted_to[e.from]=e.timestamp,t):(this.log.warn("NXMEvent not found"),null)}_processRejected(e){let t=this.conversation.events.get(e.body.event_id);return t?(t.state=t.state||{},t.state.rejected_by=t.state.rejected_by||{},t.state.rejected_by[e.from]=e.timestamp,t):(this.log.warn("NXMEvent not found"),null)}_processUndeliverable(e){let t=this.conversation.events.get(e.body.event_id);return t?(t.state=t.state||{},t.state.undeliverable_to=t.state.undeliverable_to||{},t.state.undeliverable_to[e.from]=e.timestamp,t):(this.log.warn("NXMEvent not found"),null)}}r.default=ConversationEventHandler,t.exports=ConversationEventHandler},{"../events/image_event":3,"../events/message_event":4,"../events/nxmEvent":5,"../events/text_event":6,loglevel:63}],9:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0}),r.ConversationEventsProcessor=r.EventsQueue=void 0;const i=e("../nexmoClientError"),s=n(e("../utils")),o=e("loglevel");class EventsQueue{constructor(e){this.callback=e,this.cidMap=new Map,this.log=o.getLogger(this.constructor.name)}async enqueue(e,t){var r,n,i,s;const{cid:o,id:a}=e,c=Number(a);if(!o||isNaN(c))return this.callback(e);if(!this.cidMap.get(o)){this.log.debug(`enqueue: create new ConversationEventsProcessor for ${o}`);const a=new ConversationEventsProcessor(o,c-1,t);if(this.cidMap.set(o,a),"member:media"==e.type&&(null===(n=null===(r=e.body)||void 0===r?void 0:r.media)||void 0===n?void 0:n.audio)||"member:joined"==e.type&&(null===(s=null===(i=e.body)||void 0===i?void 0:i.channel)||void 0===s?void 0:s.id)){const t=c-20<1?1:c-20;let r=!1;(await a.fetchConversationEvents(t,20)).forEach(t=>{"rtc:transfer"===t.type&&t.from===e.from&&(r=!0,a.lastEventIdProcessed=Number(t.id)-1),r&&a.enqueue(Number(t.id),t)})}}const u=this.cidMap.get(o);u.enqueue(c,e),u.processing||(u.processing=!0,await u.processEvents())}}r.EventsQueue=EventsQueue;class ConversationEventsProcessor{constructor(e,t,r){this.cid=e,this.eventsMap=new Map,this.callback=(e=>r._handleEvent(e)),this.lastEventIdProcessed=t,this.largestEventIdInQueue=t,this.processing=!1,this.application=r,this.eventsFetchRange=9,this.log=o.getLogger(this.constructor.name)}enqueue(e,t){return e>this.largestEventIdInQueue&&(this.largestEventIdInQueue=e),e>this.lastEventIdProcessed&&this.eventsMap.set(e,t),t}dequeue(e){const t=this.eventsMap.get(e);return this.eventsMap.delete(e),t}async processEvents(){const e=()=>(this.eventsMap.clear(),this.log.debug("processEvents: Done Processing"),this.processing=!1);if(this.eventsMap.size<1)return e();const t=this.lastEventIdProcessed+1,r=await this.processNextEvent(t);return r?(this.lastEventIdProcessed=Number(r.id),this.processEvents()):e()}async processNextEvent(e){this.log.debug(`processNextEvent: processing event number ${e}`);const t=this.dequeue(e);try{if(t)return await this.callback(t),t;if(this.largestEventIdInQueue>e){this.log.debug(`processNextEvent: largestEventIdInQueue-${this.largestEventIdInQueue} > eventId-${e}`);const t=await this.fetchEventsAndProcess(e);return t?(this.log.debug("processNextEvent: foundEvent ",{foundEvent:t}),await this.callback(t),t):(this.log.debug(`processNextEvent: not found process next ${e+1}`),this.processNextEvent(e+1))}return}catch(e){return}}async fetchEventsAndProcess(e){try{const t=await this.fetchConversationEvents(e,this.eventsFetchRange);let r;return this.log.debug("fetchEventsAndProcess: fetched events list ",{eventsList:t}),t.forEach(t=>{t.cid=this.cid;const n=Number(t.id);isNaN(n)||n<e||(n>e?(this.log.debug(`fetchEventsAndProcess: event > missingEvent ${n} `,{missingEvent:e}),this.enqueue(n,t)):(this.log.debug("fetchEventsAndProcess: foundEvent ",{event:t}),r=t))}),r}catch(e){return void this.log.debug("fetchEventsAndProcess: error ",{e:e})}}async fetchConversationEvents(e,t){this.log.debug("fetchConversationEvents: ",this.cid,e);const r=this.largestEventIdInQueue>e?this.largestEventIdInQueue+t:e+t,n=`${this.application.session.config.nexmo_api_url}/beta2/conversations/${this.cid}/events`;try{return(await s.default.paginationRequest(n,{start_id:e,end_id:r},this.application.session.config.token)).items}catch(e){throw new i.NexmoApiError(e)}}}r.ConversationEventsProcessor=ConversationEventsProcessor,t.exports={EventsQueue:EventsQueue,ConversationEventsProcessor:ConversationEventsProcessor}},{"../nexmoClientError":20,"../utils":31,loglevel:63}],10:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});const n=e("loglevel");class RtcEventHandler{constructor(e){this.log=n.getLogger(this.constructor.name),this.application=e,this._handleRtcEventMap={"rtc:transfer":this._processRtcTransfer,"rtc:answer":this._processRtcAnswer,"rtc:hangup":this._processRtcHangup}}_handleRtcEvent(e){if(this._handleRtcEventMap.hasOwnProperty(e.type))return this._handleRtcEventMap[e.type].call(this,e)}_processRtcTransfer(e){this.log.debug("_processRtcTransfer: ",{event:e});const t=this.application.conversations.get(e.body.transferred_from),r=this.application.conversations.get(e.cid),n=this.application.calls.get(e.body.transferred_from);n?(n.conversation.members.get(e.body.was_member).transferred_to=r,n._setupConversationObject(r),n.transferred=!0,this.application.calls.set(e.cid,n),this.application.calls.delete(e.body.transferred_from),t&&(r.members.get(e.from).transferred_from=t,r.media._attachEndingEventHandlers(),0===Object.entries(r.media.rtcObjects).length&&0!==Object.entries(t.media.rtcObjects).length&&Object.assign(r.media.rtcObjects,t.media.rtcObjects),!r.media.pc&&t.media.pc&&Object.assign(r.media.pc=t.media.pc),0===r.application.activeStreams.length&&t.application.activeStreams.length>0&&(r.application.activeStreams=t.application.activeStreams))):this.log.warn("NXMCall transfer for unknown nxmCall")}_processRtcAnswer(e){this.log.debug("_processRtcAnswer: ",{event:e}),this.application.calls.has(e.cid)&&(this.application.calls.get(e.cid).id=e.body.rtc_id)}_processRtcHangup(e){if(this.log.debug("_processRtcHangup: ",{event:e}),this.application.calls.has(e.cid)){this.application.calls.get(e.cid)._handleStatusChange(e)}}}r.default=RtcEventHandler,t.exports=RtcEventHandler},{loglevel:63}],11:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});const n=e("loglevel");class SipEventHandler{constructor(e){this.log=n.getLogger(this.constructor.name),this.application=e,this._handleSipCallEventMap={"sip:hangup":this._processSipHangup,"sip:ringing":this._processSipRinging}}_handleSipCallEvent(e){if(this.log.debug("_handleSipCallEvent: ",{event:e}),!this.application.calls.has(e.cid))return void this.log.warn("There is no call object for this Conversation id.");const t=this.application.calls.get(e.cid);return this._handleSipCallEventMap.hasOwnProperty(e.type)?this._handleSipCallEventMap[e.type].call(this,t,e):void 0}_processSipHangup(e,t){this.log.debug("_processSipHangup: ",t),e._handleStatusChange(t)}_processSipRinging(e,t){this.log.debug("_processSipRinging: ",t),e._handleStatusChange(t)}}r.default=SipEventHandler,t.exports=SipEventHandler},{loglevel:63}],12:[function(e,t,r){(function(t){(function(){"use strict";let r=t.NexmoClient||{};r=e("./sdk"),t.NexmoClient=r}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./sdk":28}],13:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=e("wildemitter"),s=e("./nexmoClientError"),o=n(e("./events/nxmEvent")),a=n(e("./utils"));class Member{constructor(e,t){this.conversation=e,this.callStatus=null,this._normalise(t),i.mixin(Member)}_normalise(e){if(e){let t;for(t in this.user=this.user||{},this.channel=e.channel||{type:"app"},e)switch(t){case"member_id":this.id=e.member_id;break;case"timestamp":this.timestamp=e.timestamp;break;case"state":this.state=e.state;break;case"from":this.id=e.from;break;case"user_id":this.user.id=e.user_id;break;case"name":this.user.name=e.name;break;case"user":this.user={name:e.user.name,id:e.user.user_id||e.user.id},this.display_name=this.display_name||e.user.display_name;break;case"invited_by":this.invited_by=e.invited_by;break;case"display_name":this.display_name=this.display_name||e.display_name;break;case"_embedded":e._embedded.user&&(this.user={id:e._embedded.user.id||this.user.id,name:e._embedded.user.name||this.user.name},this.display_name=this.display_name||e._embedded.user.display_name);case"conversation":break;default:e.type||(this[t]=e[t])}this.conversation.application.me&&e.user_id===this.conversation.application.me.id&&(this.user.name=this.conversation.application.me.name),delete this.user_id,delete this.name,delete this.user.user_id}}async playStream(e){try{const t=await this.conversation.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/events`,data:{type:"audio:play",to:this.id,body:e}});return new o.default(this.conversation,t)}catch(e){throw new s.NexmoApiError(e)}}async sayText(e){try{const t=await this.conversation.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.id}/events`,data:{type:"audio:say",cid:this.id,from:this.conversation.me.id,to:this.id,body:{text:e.text,voice_name:e.voice_name||"Amy",level:e.level||1,queue:e.queue||!0,loop:e.loop||1,ssml:e.ssml||!1}}});return new o.default(this.conversation,t)}catch(e){throw new s.NexmoApiError(e)}}async kick(e){var t,r;let n=`conversations/${this.conversation.id}/members/${this.id}`,i=new URLSearchParams;(null===(r=null===(t=null===this||void 0===this?void 0:this.conversation)||void 0===t?void 0:t.me)||void 0===r?void 0:r.id)&&i.append("from",this.conversation.me.id),e&&Object.keys(e).forEach(t=>{i.append(t,e[t])}),n+=`?${i.toString()}`;try{return await this.conversation.application.session.sendNetworkRequest({type:"DELETE",path:n})}catch(e){throw new s.NexmoApiError(e)}}mute(e,t=null){return this.conversation.media.mute(e,t)}earmuff(e){return this.conversation.media.earmuff(e)}_handleEvent(e){switch(e.type){case"member:invited":this._normalise(e.body),this.state="INVITED",this.timestamp.invited=e.body.timestamp.invited,!e.body.invited_by&&e.body.user.media&&e.body.user.media.audio_settings&&e.body.user.media.audio_settings.enabled&&this._setCallStatusAndEmit("started");break;case"member:joined":this._normalise(e.body),this.state="JOINED",this.timestamp.joined=e.body.timestamp.joined,e.body.channel&&e.body.channel.knocking_id&&this._setCallStatusAndEmit("started");break;case"member:left":this._normalise(e.body),this.state="LEFT",this.timestamp.left=e.body.timestamp.left,e.body.reason&&e.body.reason.text&&this._setCallStatusAndEmit(e.body.reason.text);break;case"member:media":this.media=e.body.media;break;case"leg:status:update":this.channel.legs=a.default.updateMemberLegs(this.channel.legs,e),this._setCallStatusAndEmit(e.body.status);break;case"audio:ringing:start":this.callStatus&&"started"!==this.callStatus||this._setCallStatusAndEmit("ringing")}}_setCallStatusAndEmit(e){this.callStatus!==String(e)&&(this.callStatus=e,this.conversation.emit("member:call:status",this))}}r.default=Member,t.exports=Member},{"./events/nxmEvent":5,"./nexmoClientError":20,"./utils":31,wildemitter:107}],14:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});const n=e("loglevel"),i=e("../nexmoClientError");class ErrorsEmitter{constructor(e){if(this.log=n.getLogger(this.constructor.name),!e)throw new i.NexmoClientError("no emitter object passed for the Error Emitter");this.emitter=e,this.LISTENER_GROUP="NXM-errors"}emitResponseIfError(e){if(this._isTypeError(e.type))return this.emitter.emit(e.type,this.LISTENER_GROUP,e)}cleanup(){return this.emitter.releaseGroup(this.LISTENER_GROUP)}_isTypeError(e){return-1!==e.indexOf("error")}}r.default=ErrorsEmitter,t.exports=ErrorsEmitter},{"../nexmoClientError":20,loglevel:63}],15:[function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(r,"__esModule",{value:!0});const i=e("loglevel"),s=e("../nexmoClientError"),o=n(e("./rtc_helper")),a=n(e("../utils")),c=n(e("../events/nxmEvent")),u=n(e("../conversation")),d=n(e("../application"));class Media{constructor(e){var t,r,n;const s=e instanceof u.default?e:null,a=e instanceof d.default?e:null;this.log=i.getLogger(this.constructor.name),s?(this.rtcHelper=new o.default,this.application=s.application,this.application.activeStreams=this.application.activeStreams||[],this.parentConversation=s,this.rtcObjects={},this.streamIndex=0,this.rtcstats_conf=(null===(n=null===(r=null===(t=this.application)||void 0===t?void 0:t.session)||void 0===r?void 0:r.config)||void 0===n?void 0:n.rtcStats)||{},this.rtcStats=null):a?(this.rtcHelper=new o.default,this.application=a):this.log.warn("No conversation object in Media")}_attachEndingEventHandlers(){this.parentConversation&&(this.log.debug("attaching leave listeners in media for "+this.parentConversation.id),this.parentConversation.on("rtc:hangup",async e=>{let t;if(this.parentConversation.members.has(e.from))t=this.parentConversation.members.get(e.from);else try{t=await this.parentConversation.getMember(e.from)}catch(e){this.log.warn(`There is an error getting the member ${e}`)}t.user.id===this.application.me.id&&this.application.activeStreams.length&&this._cleanMediaProperties(),t.user.id===this.application.me.id&&t.transferred_from&&t.transferred_from.media._cleanMediaProperties(),t.user.id===this.application.me.id&&this.parentConversation.off("rtc:hangup")}))}_enableStatsEvents(){this.rtcstats_conf.emit_rtc_analytics=!0,this.rtcstats_conf.remote_collection=!0;const e=this._findRtcObjectByType("audio");!this.rtcStats&&e&&(this.log.debug(`enabling stats events for ${e.rtc_id}`),this.rtcStats=o.default._initStatsEvents({application:this.application,rtc_id:e.rtc_id,pc:this.pc,conversation:this.parentConversation}))}_disableStatsEvents(){this.rtcstats_conf.emit_events=!1,this.rtcstats_conf.emit_rtc_analytics=!1,this.rtcstats_conf.remote_collection=!1,this.rtcStats.removeIntervals(),delete this.rtcStats}_audioInitHandler(e={},t){return new Promise(async(r,n)=>{const i=this.streamIndex;this.streamIndex++;const{audioConstraints:a}=e;try{const e=await o.default.getUserAudio(a),c=o.default.createPeerConnection(this.application);this.pc=c;const{application:u,log:d,parentConversation:l,rtcObjects:p}=this,h={pc:c,streamIndex:i,localStream:e,application:u,conversation:l,log:d,rtcObjects:p};t({...h,resolve:r,reject:n}),o.default.attachConversationEventHandlers(h),this._attachEndingEventHandlers()}catch(e){n(new s.NexmoClientError(e))}})}_execAnswer(e={}){const{offer:{sdp:t,leg_id:r}}=e;return this._audioInitHandler(e,e=>o.default.doAnswer(e,t,r))}_handleAudio(e={}){const{reconnectRtcId:t}=e;return this._audioInitHandler(e,e=>o.default.attachPeerConnectionEventHandlers({...e,reconnectRtcId:t}))}_findRtcObjectByType(e){return Object.values(this.rtcObjects).find(t=>t.type===e)}async _cleanConversationProperties(){this.pc&&this.pc.close(),delete this.pc,this.rtcStats=null,this.application.activeStreams=[],this.listeningToRtcEvent=!1,await Promise.resolve()}_cleanMediaProperties(){if(this.pc&&this.pc.close(),this.rtcObjects)for(const e in this.rtcObjects)o.default.closeStream(this.rtcObjects[e].stream);delete this.pc,this.rtcStats=null,this.application.activeStreams=[],this.rtcObjects={},this.listeningToRtcEvent=!1}async _disableLeg(e){const t=new Promise(async(t,r)=>{try{await this.application.session.sendNetworkRequest({type:"DELETE",path:`conversations/${this.parentConversation.id}/rtc/${e}?from=${this.parentConversation.me.id}&originating_session=${this.application.session.session_id}`,version:"beta2"}),t("rtc:terminate:success")}catch(e){r(new s.NexmoApiError(e))}}),r=new Promise(t=>{this.rtcObjects[e].pc&&this.rtcObjects[e].pc.close(),this.rtcObjects[e].stream&&o.default.closeStream(this.rtcObjects[e].stream),t()});try{return await Promise.all([t,r]),this.parentConversation.me.emit("media:stream:off",this.rtcObjects[e].streamIndex),delete this.rtcObjects[e],"rtc:terminate:success"}catch(e){throw e}}_enableMediaTracks(e,t){e.forEach(e=>{e.enabled=t})}async _setMediaTracksAndMute(e,t,r,n){this._enableMediaTracks(t,!r);try{return await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.parentConversation.id}/events`,data:{type:n,to:this.parentConversation.me.id,from:this.parentConversation.me.id,body:{rtc_id:e}}})}catch(e){throw this._enableMediaTracks(t,r),new s.NexmoApiError(e)}}async updateAudioConstraints(e={}){let t=this._findRtcObjectByType("audio");if(!t||!t.pc)throw new s.NexmoApiError("error:media:stream:not-found");try{const r=await o.default.getUserAudio(e);return r.getTracks().forEach(e=>{const r=t.pc.getSenders().find(t=>t.track.kind===e.kind);r&&(e.enabled=r.track.enabled,r.replaceTrack(e))}),o.default.closeStream(t.stream),t.stream=r,r}catch(e){return e}}mute(e=!1,t=null){const r="audio:mute:"+(e?"on":"off");let n=[],i={};if(null!==t){if(i[0]=Object.values(this.rtcObjects).find(e=>e.streamIndex===t),!i[0])throw new s.NexmoClientError("error:media:stream:not-found")}else i=this.rtcObjects;return Object.values(i).forEach(t=>{const i=t.stream.getAudioTracks(),s=this._setMediaTracksAndMute(t.rtc_id,i,e,r);n.push(s)}),Promise.all(n)}async earmuff(e){try{if(null===this.me)throw new s.NexmoClientError("error:self");{let t="audio:earmuff:off";e&&(t="audio:earmuff:on");const{response:r}=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.parentConversation.id}/events`,data:{type:t,to:this.parentConversation.me.id}});return r}}catch(e){throw new s.NexmoApiError(e)}}async enable(e){try{if(null===this.parentConversation.me)throw new s.NexmoClientError("error:self");{const{offer:t}=null!==e&&void 0!==e?e:{};let r=await(void 0!==t?this._execAnswer(e):this._handleAudio(e)),n=e&&(e.autoPlayAudio||void 0===e.autoPlayAudio);return e&&!n||o.default.playAudioStream(r),r}}catch(e){throw e}}disable(){let e=[];e.push(this._cleanConversationProperties());for(const t in this.rtcObjects)e.push(this._disableLeg(t));return Promise.all(e)}async sayText(e){try{const t=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.parentConversation.id}/events`,data:{type:"audio:say",cid:this.parentConversation.id,from:this.parentConversation.me.id,body:{text:e.text,voice_name:e.voice_name||"Amy",level:e.level||1,queue:e.queue||!0,loop:e.loop||1,ssml:e.ssml||!1}}});return new c.default(this.parentConversation,t)}catch(e){throw new s.NexmoApiError(e)}}async sendDTMF(e){try{if(!a.default.validateDTMF(e))throw new s.NexmoClientError("error:audio:dtmf:invalid-digit");if(!(this._findRtcObjectByType("audio")||{}).rtc_id)throw new s.NexmoClientError("error:audio:dtmf:audio-disabled");const{id:t,timestamp:r}=await this.application.session.sendNetworkRequest({type:"POST",path:`conversations/${this.parentConversation.id}/events`,data:{type:"audio:dtmf",from:this.parentConversation.me.id,body:{digit:e,channel:{type:"app",id:this._findRtcObjectByType("audio").rtc_id}}}}),n={body:{digit:e,dtmf_id:""},cid:this.paren