@koi-design/callkit 2.0.5-beta.13 → 2.0.5-beta.14
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.
- package/dist/index.global.js +2 -2
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +1 -1
package/dist/index.global.js
CHANGED
|
@@ -3,7 +3,7 @@ var WebCall=(()=>{var Gn=Object.create;var Yt=Object.defineProperty;var Vn=Objec
|
|
|
3
3
|
`).join(`
|
|
4
4
|
`+s),n.push(i+"m+"+ar.exports.humanize(this.diff)+"\x1B[0m")}else n[0]=Go()+e+" "+n[0]}function Go(){return ae.inspectOpts.hideDate?"":new Date().toISOString()+" "}function Vo(...n){return process.stderr.write(or.formatWithOptions(ae.inspectOpts,...n)+`
|
|
5
5
|
`)}function Wo(n){n?process.env.DEBUG=n:delete process.env.DEBUG}function Yo(){return process.env.DEBUG}function Jo(n){n.inspectOpts={};let e=Object.keys(ae.inspectOpts);for(let t=0;t<e.length;t++)n.inspectOpts[e[t]]=ae.inspectOpts[e[t]]}ar.exports=li()(ae);var{formatters:Hs}=ar.exports;Hs.o=function(n){return this.inspectOpts.colors=this.useColors,or.inspect(n,this.inspectOpts).split(`
|
|
6
|
-
`).map(e=>e.trim()).join(" ")};Hs.O=function(n){return this.inspectOpts.colors=this.useColors,or.inspect(n,this.inspectOpts)}});var Ls=L((yc,ui)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?ui.exports=$s():ui.exports=qs()});var Fs=L((Ic,Ms)=>{var Nt;Ms.exports=function(){if(!Nt){try{Nt=Ls()("follow-redirects")}catch{}typeof Nt!="function"&&(Nt=function(){})}Nt.apply(null,arguments)}});var Ii=L((bc,yi)=>{var kt=ye("url"),Ot=kt.URL,zo=ye("http"),Zo=ye("https"),Ci=ye("stream").Writable,vi=ye("assert"),Us=Fs();(function(){var e=typeof process<"u",t=typeof window<"u"&&typeof document<"u",r=at(Error.captureStackTrace);!e&&(t||!r)&&console.warn("The follow-redirects package should be excluded from browser builds.")})();var Ei=!1;try{vi(new Ot(""))}catch(n){Ei=n.code==="ERR_INVALID_URL"}var Xo=["auth","host","hostname","href","path","pathname","port","protocol","query","search","hash"],wi=["abort","aborted","connect","error","socket","timeout"],Ti=Object.create(null);wi.forEach(function(n){Ti[n]=function(e,t,r){this._redirectable.emit(n,e,t,r)}});var fi=Ht("ERR_INVALID_URL","Invalid URL",TypeError),pi=Ht("ERR_FR_REDIRECTION_FAILURE","Redirected request failed"),Qo=Ht("ERR_FR_TOO_MANY_REDIRECTS","Maximum number of redirects exceeded",pi),ea=Ht("ERR_FR_MAX_BODY_LENGTH_EXCEEDED","Request body larger than maxBodyLength limit"),ta=Ht("ERR_STREAM_WRITE_AFTER_END","write after end"),ra=Ci.prototype.destroy||js;function Ee(n,e){Ci.call(this),this._sanitizeOptions(n),this._options=n,this._ended=!1,this._ending=!1,this._redirectCount=0,this._redirects=[],this._requestBodyLength=0,this._requestBodyBuffers=[],e&&this.on("response",e);var t=this;this._onNativeResponse=function(r){try{t._processResponse(r)}catch(i){t.emit("error",i instanceof pi?i:new pi({cause:i}))}},this._performRequest()}Ee.prototype=Object.create(Ci.prototype);Ee.prototype.abort=function(){Si(this._currentRequest),this._currentRequest.abort(),this.emit("abort")};Ee.prototype.destroy=function(n){return Si(this._currentRequest,n),ra.call(this,n),this};Ee.prototype.write=function(n,e,t){if(this._ending)throw new ta;if(!ot(n)&&!na(n))throw new TypeError("data should be a string, Buffer or Uint8Array");if(at(e)&&(t=e,e=null),n.length===0){t&&t();return}this._requestBodyLength+n.length<=this._options.maxBodyLength?(this._requestBodyLength+=n.length,this._requestBodyBuffers.push({data:n,encoding:e}),this._currentRequest.write(n,e,t)):(this.emit("error",new ea),this.abort())};Ee.prototype.end=function(n,e,t){if(at(n)?(t=n,n=e=null):at(e)&&(t=e,e=null),!n)this._ended=this._ending=!0,this._currentRequest.end(null,null,t);else{var r=this,i=this._currentRequest;this.write(n,e,function(){r._ended=!0,i.end(null,null,t)}),this._ending=!0}};Ee.prototype.setHeader=function(n,e){this._options.headers[n]=e,this._currentRequest.setHeader(n,e)};Ee.prototype.removeHeader=function(n){delete this._options.headers[n],this._currentRequest.removeHeader(n)};Ee.prototype.setTimeout=function(n,e){var t=this;function r(o){o.setTimeout(n),o.removeListener("timeout",o.destroy),o.addListener("timeout",o.destroy)}function i(o){t._timeout&&clearTimeout(t._timeout),t._timeout=setTimeout(function(){t.emit("timeout"),s()},n),r(o)}function s(){t._timeout&&(clearTimeout(t._timeout),t._timeout=null),t.removeListener("abort",s),t.removeListener("error",s),t.removeListener("response",s),t.removeListener("close",s),e&&t.removeListener("timeout",e),t.socket||t._currentRequest.removeListener("socket",i)}return e&&this.on("timeout",e),this.socket?i(this.socket):this._currentRequest.once("socket",i),this.on("socket",r),this.on("abort",s),this.on("error",s),this.on("response",s),this.on("close",s),this};["flushHeaders","getHeader","setNoDelay","setSocketKeepAlive"].forEach(function(n){Ee.prototype[n]=function(e,t){return this._currentRequest[n](e,t)}});["aborted","connection","socket"].forEach(function(n){Object.defineProperty(Ee.prototype,n,{get:function(){return this._currentRequest[n]}})});Ee.prototype._sanitizeOptions=function(n){if(n.headers||(n.headers={}),n.host&&(n.hostname||(n.hostname=n.host),delete n.host),!n.pathname&&n.path){var e=n.path.indexOf("?");e<0?n.pathname=n.path:(n.pathname=n.path.substring(0,e),n.search=n.path.substring(e))}};Ee.prototype._performRequest=function(){var n=this._options.protocol,e=this._options.nativeProtocols[n];if(!e)throw new TypeError("Unsupported protocol "+n);if(this._options.agents){var t=n.slice(0,-1);this._options.agent=this._options.agents[t]}var r=this._currentRequest=e.request(this._options,this._onNativeResponse);r._redirectable=this;for(var i of wi)r.on(i,Ti[i]);if(this._currentUrl=/^\//.test(this._options.path)?kt.format(this._options):this._options.path,this._isRedirect){var s=0,o=this,a=this._requestBodyBuffers;(function d(h){if(r===o._currentRequest)if(h)o.emit("error",h);else if(s<a.length){var l=a[s++];r.finished||r.write(l.data,l.encoding,d)}else o._ended&&r.end()})()}};Ee.prototype._processResponse=function(n){var e=n.statusCode;this._options.trackRedirects&&this._redirects.push({url:this._currentUrl,headers:n.headers,statusCode:e});var t=n.headers.location;if(!t||this._options.followRedirects===!1||e<300||e>=400){n.responseUrl=this._currentUrl,n.redirects=this._redirects,this.emit("response",n),this._requestBodyBuffers=[];return}if(Si(this._currentRequest),n.destroy(),++this._redirectCount>this._options.maxRedirects)throw new Qo;var r,i=this._options.beforeRedirect;i&&(r=Object.assign({Host:n.req.getHeader("host")},this._options.headers));var s=this._options.method;((e===301||e===302)&&this._options.method==="POST"||e===303&&!/^(?:GET|HEAD)$/.test(this._options.method))&&(this._options.method="GET",this._requestBodyBuffers=[],gi(/^content-/i,this._options.headers));var o=gi(/^host$/i,this._options.headers),a=Ri(this._currentUrl),d=o||a.host,h=/^\w+:/.test(t)?this._currentUrl:kt.format(Object.assign(a,{host:d})),l=ia(t,h);if(Us("redirecting to",l.href),this._isRedirect=!0,mi(l,this._options),(l.protocol!==a.protocol&&l.protocol!=="https:"||l.host!==d&&!sa(l.host,d))&&gi(/^(?:(?:proxy-)?authorization|cookie)$/i,this._options.headers),at(i)){var u={headers:n.headers,statusCode:e},T={url:h,method:s,headers:r};i(this._options,u,T),this._sanitizeOptions(this._options)}this._performRequest()};function Bs(n){var e={maxRedirects:21,maxBodyLength:10485760},t={};return Object.keys(n).forEach(function(r){var i=r+":",s=t[i]=n[r],o=e[r]=Object.create(s);function a(h,l,u){return oa(h)?h=mi(h):ot(h)?h=mi(Ri(h)):(u=l,l=Ks(h),h={protocol:i}),at(l)&&(u=l,l=null),l=Object.assign({maxRedirects:e.maxRedirects,maxBodyLength:e.maxBodyLength},h,l),l.nativeProtocols=t,!ot(l.host)&&!ot(l.hostname)&&(l.hostname="::1"),vi.equal(l.protocol,i,"protocol mismatch"),Us("options",l),new Ee(l,u)}function d(h,l,u){var T=o.request(h,l,u);return T.end(),T}Object.defineProperties(o,{request:{value:a,configurable:!0,enumerable:!0,writable:!0},get:{value:d,configurable:!0,enumerable:!0,writable:!0}})}),e}function js(){}function Ri(n){var e;if(Ei)e=new Ot(n);else if(e=Ks(kt.parse(n)),!ot(e.protocol))throw new fi({input:n});return e}function ia(n,e){return Ei?new Ot(n,e):Ri(kt.resolve(e,n))}function Ks(n){if(/^\[/.test(n.hostname)&&!/^\[[:0-9a-f]+\]$/i.test(n.hostname))throw new fi({input:n.href||n});if(/^\[/.test(n.host)&&!/^\[[:0-9a-f]+\](:\d+)?$/i.test(n.host))throw new fi({input:n.href||n});return n}function mi(n,e){var t=e||{};for(var r of Xo)t[r]=n[r];return t.hostname.startsWith("[")&&(t.hostname=t.hostname.slice(1,-1)),t.port!==""&&(t.port=Number(t.port)),t.path=t.search?t.pathname+t.search:t.pathname,t}function gi(n,e){var t;for(var r in e)n.test(r)&&(t=e[r],delete e[r]);return t===null||typeof t>"u"?void 0:String(t).trim()}function Ht(n,e,t){function r(i){at(Error.captureStackTrace)&&Error.captureStackTrace(this,this.constructor),Object.assign(this,i||{}),this.code=n,this.message=this.cause?e+": "+this.cause.message:e}return r.prototype=new(t||Error),Object.defineProperties(r.prototype,{constructor:{value:r,enumerable:!1},name:{value:"Error ["+n+"]",enumerable:!1}}),r}function Si(n,e){for(var t of wi)n.removeListener(t,Ti[t]);n.on("error",js),n.destroy(e)}function sa(n,e){vi(ot(n)&&ot(e));var t=n.length-e.length-1;return t>0&&n[t]==="."&&n.endsWith(e)}function ot(n){return typeof n=="string"||n instanceof String}function at(n){return typeof n=="function"}function na(n){return typeof n=="object"&&"length"in n}function oa(n){return Ot&&n instanceof Ot}yi.exports=Bs({http:zo,https:Zo});yi.exports.wrap=Bs});var cr=L((xc,Gs)=>{Gs.exports={version:"0.26.1"}});var Xs=L((Ac,Zs)=>{"use strict";var qt=de(),Vs=si(),aa=ni(),Ws=Zt(),ca=ye("http"),la=ye("https"),da=Ii().http,ha=Ii().https,Ys=ye("url"),ua=ye("zlib"),ga=cr().version,Ct=tr(),lr=Qt(),fa=er(),pa=gt(),Js=/https:?/;function zs(n,e,t){if(n.hostname=e.host,n.host=e.host,n.port=e.port,n.path=t,e.auth){var r=Buffer.from(e.auth.username+":"+e.auth.password,"utf8").toString("base64");n.headers["Proxy-Authorization"]="Basic "+r}n.beforeRedirect=function(s){s.headers.host=s.host,zs(s,e,s.href)}}Zs.exports=function(e){return new Promise(function(r,i){var s;function o(){e.cancelToken&&e.cancelToken.unsubscribe(s),e.signal&&e.signal.removeEventListener("abort",s)}var a=function(F){o(),r(F)},d=!1,h=function(F){o(),d=!0,i(F)},l=e.data,u=e.headers,T={};if(Object.keys(u).forEach(function(F){T[F.toLowerCase()]=F}),"user-agent"in T?u[T["user-agent"]]||delete u[T["user-agent"]]:u["User-Agent"]="axios/"+ga,l&&!qt.isStream(l)){if(!Buffer.isBuffer(l))if(qt.isArrayBuffer(l))l=Buffer.from(new Uint8Array(l));else if(qt.isString(l))l=Buffer.from(l,"utf-8");else return h(Ct("Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream",e));if(e.maxBodyLength>-1&&l.length>e.maxBodyLength)return h(Ct("Request body larger than maxBodyLength limit",e));T["content-length"]||(u["Content-Length"]=l.length)}var A=void 0;if(e.auth){var _=e.auth.username||"",$=e.auth.password||"";A=_+":"+$}var N=aa(e.baseURL,e.url),P=Ys.parse(N),k=P.protocol||"http:";if(!A&&P.auth){var C=P.auth.split(":"),f=C[0]||"",x=C[1]||"";A=f+":"+x}A&&T.authorization&&delete u[T.authorization];var w=Js.test(k),U=w?e.httpsAgent:e.httpAgent;try{Ws(P.path,e.params,e.paramsSerializer).replace(/^\?/,"")}catch(D){var K=new Error(D.message);K.config=e,K.url=e.url,K.exists=!0,h(K)}var B={path:Ws(P.path,e.params,e.paramsSerializer).replace(/^\?/,""),method:e.method.toUpperCase(),headers:u,agent:U,agents:{http:e.httpAgent,https:e.httpsAgent},auth:A};e.socketPath?B.socketPath=e.socketPath:(B.hostname=P.hostname,B.port=P.port);var z=e.proxy;if(!z&&z!==!1){var y=k.slice(0,-1)+"_proxy",R=process.env[y]||process.env[y.toUpperCase()];if(R){var c=Ys.parse(R),S=process.env.no_proxy||process.env.NO_PROXY,Vt=!0;if(S){var g=S.split(",").map(function(F){return F.trim()});Vt=!g.some(function(F){return F?F==="*"||F[0]==="."&&P.hostname.substr(P.hostname.length-F.length)===F?!0:P.hostname===F:!1})}if(Vt&&(z={host:c.hostname,port:c.port,protocol:c.protocol},c.auth)){var E=c.auth.split(":");z.auth={username:E[0],password:E[1]}}}}z&&(B.headers.host=P.hostname+(P.port?":"+P.port:""),zs(B,z,k+"//"+P.hostname+(P.port?":"+P.port:"")+B.path));var m,fe=w&&(z?Js.test(z.protocol):!0);e.transport?m=e.transport:e.maxRedirects===0?m=fe?la:ca:(e.maxRedirects&&(B.maxRedirects=e.maxRedirects),m=fe?ha:da),e.maxBodyLength>-1&&(B.maxBodyLength=e.maxBodyLength),e.insecureHTTPParser&&(B.insecureHTTPParser=e.insecureHTTPParser);var q=m.request(B,function(F){if(!q.aborted){var Se=F,Pt=F.req||q;if(F.statusCode!==204&&Pt.method!=="HEAD"&&e.decompress!==!1)switch(F.headers["content-encoding"]){case"gzip":case"compress":case"deflate":Se=Se.pipe(ua.createUnzip()),delete F.headers["content-encoding"];break}var ht={status:F.statusCode,statusText:F.statusMessage,headers:F.headers,config:e,request:Pt};if(e.responseType==="stream")ht.data=Se,Vs(a,h,ht);else{var Wt=[],Gi=0;Se.on("data",function(Le){Wt.push(Le),Gi+=Le.length,e.maxContentLength>-1&&Gi>e.maxContentLength&&(d=!0,Se.destroy(),h(Ct("maxContentLength size of "+e.maxContentLength+" exceeded",e,null,Pt)))}),Se.on("aborted",function(){d||(Se.destroy(),h(Ct("error request aborted",e,"ERR_REQUEST_ABORTED",Pt)))}),Se.on("error",function(Le){q.aborted||h(lr(Le,e,null,Pt))}),Se.on("end",function(){try{var Le=Wt.length===1?Wt[0]:Buffer.concat(Wt);e.responseType!=="arraybuffer"&&(Le=Le.toString(e.responseEncoding),(!e.responseEncoding||e.responseEncoding==="utf8")&&(Le=qt.stripBOM(Le))),ht.data=Le}catch(Vi){h(lr(Vi,e,Vi.code,ht.request,ht))}Vs(a,h,ht)})}}});if(q.on("error",function(F){q.aborted&&F.code!=="ERR_FR_TOO_MANY_REDIRECTS"||h(lr(F,e,null,q))}),q.on("socket",function(F){F.setKeepAlive(!0,1e3*60)}),e.timeout){var Re=parseInt(e.timeout,10);if(isNaN(Re)){h(Ct("error trying to parse `config.timeout` to int",e,"ERR_PARSE_TIMEOUT",q));return}q.setTimeout(Re,function(){q.abort();var F="";e.timeoutErrorMessage?F=e.timeoutErrorMessage:F="timeout of "+e.timeout+"ms exceeded";var Se=e.transitional||fa;h(Ct(F,e,Se.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",q))})}(e.cancelToken||e.signal)&&(s=function(D){q.aborted||(q.abort(),h(!D||D&&D.type?new pa("canceled"):D))},e.cancelToken&&e.cancelToken.subscribe(s),e.signal&&(e.signal.aborted?s():e.signal.addEventListener("abort",s))),qt.isStream(l)?l.on("error",function(F){h(lr(F,e,null,q))}).pipe(q):q.end(l)})}});var hr=L((_c,tn)=>{"use strict";var le=de(),Qs=as(),ma=Qt(),Ca=er(),va={"Content-Type":"application/x-www-form-urlencoded"};function en(n,e){!le.isUndefined(n)&&le.isUndefined(n["Content-Type"])&&(n["Content-Type"]=e)}function Ea(){var n;return typeof XMLHttpRequest<"u"?n=bs():typeof process<"u"&&Object.prototype.toString.call(process)==="[object process]"&&(n=Xs()),n}function wa(n,e,t){if(le.isString(n))try{return(e||JSON.parse)(n),le.trim(n)}catch(r){if(r.name!=="SyntaxError")throw r}return(t||JSON.stringify)(n)}var dr={transitional:Ca,adapter:Ea(),transformRequest:[function(e,t){return Qs(t,"Accept"),Qs(t,"Content-Type"),le.isFormData(e)||le.isArrayBuffer(e)||le.isBuffer(e)||le.isStream(e)||le.isFile(e)||le.isBlob(e)?e:le.isArrayBufferView(e)?e.buffer:le.isURLSearchParams(e)?(en(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):le.isObject(e)||t&&t["Content-Type"]==="application/json"?(en(t,"application/json"),wa(e)):e}],transformResponse:[function(e){var t=this.transitional||dr.transitional,r=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,s=!r&&this.responseType==="json";if(s||i&&le.isString(e)&&e.length)try{return JSON.parse(e)}catch(o){if(s)throw o.name==="SyntaxError"?ma(o,this,"E_JSON_PARSE"):o}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};le.forEach(["delete","get","head"],function(e){dr.headers[e]={}});le.forEach(["post","put","patch"],function(e){dr.headers[e]=le.merge(va)});tn.exports=dr});var sn=L(($c,rn)=>{"use strict";var Ta=de(),Ra=hr();rn.exports=function(e,t,r){var i=this||Ra;return Ta.forEach(r,function(o){e=o.call(i,e,t)}),e}});var bi=L((Dc,nn)=>{"use strict";nn.exports=function(e){return!!(e&&e.__CANCEL__)}});var cn=L((Pc,an)=>{"use strict";var on=de(),xi=sn(),Sa=bi(),ya=hr(),Ia=gt();function Ai(n){if(n.cancelToken&&n.cancelToken.throwIfRequested(),n.signal&&n.signal.aborted)throw new Ia("canceled")}an.exports=function(e){Ai(e),e.headers=e.headers||{},e.data=xi.call(e,e.data,e.headers,e.transformRequest),e.headers=on.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),on.forEach(["delete","get","head","post","put","patch","common"],function(i){delete e.headers[i]});var t=e.adapter||ya.adapter;return t(e).then(function(i){return Ai(e),i.data=xi.call(e,i.data,i.headers,e.transformResponse),i},function(i){return Sa(i)||(Ai(e),i&&i.response&&(i.response.data=xi.call(e,i.response.data,i.response.headers,e.transformResponse))),Promise.reject(i)})}});var _i=L((Nc,ln)=>{"use strict";var Ie=de();ln.exports=function(e,t){t=t||{};var r={};function i(l,u){return Ie.isPlainObject(l)&&Ie.isPlainObject(u)?Ie.merge(l,u):Ie.isPlainObject(u)?Ie.merge({},u):Ie.isArray(u)?u.slice():u}function s(l){if(Ie.isUndefined(t[l])){if(!Ie.isUndefined(e[l]))return i(void 0,e[l])}else return i(e[l],t[l])}function o(l){if(!Ie.isUndefined(t[l]))return i(void 0,t[l])}function a(l){if(Ie.isUndefined(t[l])){if(!Ie.isUndefined(e[l]))return i(void 0,e[l])}else return i(void 0,t[l])}function d(l){if(l in t)return i(e[l],t[l]);if(l in e)return i(void 0,e[l])}var h={url:o,method:o,data:o,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:d};return Ie.forEach(Object.keys(e).concat(Object.keys(t)),function(u){var T=h[u]||s,A=T(u);Ie.isUndefined(A)&&T!==d||(r[u]=A)}),r}});var un=L((Oc,hn)=>{"use strict";var ba=cr().version,$i={};["object","boolean","number","function","string","symbol"].forEach(function(n,e){$i[n]=function(r){return typeof r===n||"a"+(e<1?"n ":" ")+n}});var dn={};$i.transitional=function(e,t,r){function i(s,o){return"[Axios v"+ba+"] Transitional option '"+s+"'"+o+(r?". "+r:"")}return function(s,o,a){if(e===!1)throw new Error(i(o," has been removed"+(t?" in "+t:"")));return t&&!dn[o]&&(dn[o]=!0,console.warn(i(o," has been deprecated since v"+t+" and will be removed in the near future"))),e?e(s,o,a):!0}};function xa(n,e,t){if(typeof n!="object")throw new TypeError("options must be an object");for(var r=Object.keys(n),i=r.length;i-- >0;){var s=r[i],o=e[s];if(o){var a=n[s],d=a===void 0||o(a,s,n);if(d!==!0)throw new TypeError("option "+s+" must be "+d);continue}if(t!==!0)throw Error("Unknown option "+s)}}hn.exports={assertOptions:xa,validators:$i}});var vn=L((kc,Cn)=>{"use strict";var pn=de(),Aa=Zt(),gn=ns(),fn=cn(),ur=_i(),mn=un(),vt=mn.validators;function Lt(n){this.defaults=n,this.interceptors={request:new gn,response:new gn}}Lt.prototype.request=function(e,t){typeof e=="string"?(t=t||{},t.url=e):t=e||{},t=ur(this.defaults,t),t.method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var r=t.transitional;r!==void 0&&mn.assertOptions(r,{silentJSONParsing:vt.transitional(vt.boolean),forcedJSONParsing:vt.transitional(vt.boolean),clarifyTimeoutError:vt.transitional(vt.boolean)},!1);var i=[],s=!0;this.interceptors.request.forEach(function(A){typeof A.runWhen=="function"&&A.runWhen(t)===!1||(s=s&&A.synchronous,i.unshift(A.fulfilled,A.rejected))});var o=[];this.interceptors.response.forEach(function(A){o.push(A.fulfilled,A.rejected)});var a;if(!s){var d=[fn,void 0];for(Array.prototype.unshift.apply(d,i),d=d.concat(o),a=Promise.resolve(t);d.length;)a=a.then(d.shift(),d.shift());return a}for(var h=t;i.length;){var l=i.shift(),u=i.shift();try{h=l(h)}catch(T){u(T);break}}try{a=fn(h)}catch(T){return Promise.reject(T)}for(;o.length;)a=a.then(o.shift(),o.shift());return a};Lt.prototype.getUri=function(e){return e=ur(this.defaults,e),Aa(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")};pn.forEach(["delete","get","head","options"],function(e){Lt.prototype[e]=function(t,r){return this.request(ur(r||{},{method:e,url:t,data:(r||{}).data}))}});pn.forEach(["post","put","patch"],function(e){Lt.prototype[e]=function(t,r,i){return this.request(ur(i||{},{method:e,url:t,data:r}))}});Cn.exports=Lt});var wn=L((Hc,En)=>{"use strict";var _a=gt();function Et(n){if(typeof n!="function")throw new TypeError("executor must be a function.");var e;this.promise=new Promise(function(i){e=i});var t=this;this.promise.then(function(r){if(t._listeners){var i,s=t._listeners.length;for(i=0;i<s;i++)t._listeners[i](r);t._listeners=null}}),this.promise.then=function(r){var i,s=new Promise(function(o){t.subscribe(o),i=o}).then(r);return s.cancel=function(){t.unsubscribe(i)},s},n(function(i){t.reason||(t.reason=new _a(i),e(t.reason))})}Et.prototype.throwIfRequested=function(){if(this.reason)throw this.reason};Et.prototype.subscribe=function(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]};Et.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}};Et.source=function(){var e,t=new Et(function(i){e=i});return{token:t,cancel:e}};En.exports=Et});var Rn=L((qc,Tn)=>{"use strict";Tn.exports=function(e){return function(r){return e.apply(null,r)}}});var yn=L((Lc,Sn)=>{"use strict";var $a=de();Sn.exports=function(e){return $a.isObject(e)&&e.isAxiosError===!0}});var xn=L((Mc,Di)=>{"use strict";var In=de(),Da=Qr(),gr=vn(),Pa=_i(),Na=hr();function bn(n){var e=new gr(n),t=Da(gr.prototype.request,e);return In.extend(t,gr.prototype,e),In.extend(t,e),t.create=function(i){return bn(Pa(n,i))},t}var Me=bn(Na);Me.Axios=gr;Me.Cancel=gt();Me.CancelToken=wn();Me.isCancel=bi();Me.VERSION=cr().version;Me.all=function(e){return Promise.all(e)};Me.spread=Rn();Me.isAxiosError=yn();Di.exports=Me;Di.exports.default=Me});var _n=L((Fc,An)=>{An.exports=xn()});var Hn=L((Ni,kn)=>{Ni=kn.exports=Ha;Ni.getSerialize=On;function Ha(n,e,t,r){return JSON.stringify(n,On(e,r),t)}function On(n,e){var t=[],r=[];return e==null&&(e=function(i,s){return t[0]===s?"[Circular ~]":"[Circular ~."+r.slice(0,t.indexOf(s)).join(".")+"]"}),function(i,s){if(t.length>0){var o=t.indexOf(this);~o?t.splice(o+1):t.push(this),~o?r.splice(o,1/0,i):r.push(i),~t.indexOf(s)&&(s=e.call(this,i,s))}else t.push(s);return n==null?s:n.call(this,i,s)}}});var tc={};Wi(tc,{CallKit:()=>Ki});var Gt=Xr(zi());var $n=Xr(_n()),Pi=$n.default.create({headers:{"Content-Type":"application/x-www-form-urlencoded"},timeout:6e4});Pi.interceptors.request.use(n=>n);Pi.interceptors.response.use(n=>n.data,n=>Promise.reject(n));var Oa=n=>Pi.request(n),Dn=Oa;var fr=class{callKit;constructor(e){this.callKit=e}isLogining=!1;isLoginOuting=!1;async login(e){if(this.isLogining){this.callKit.logger.info("login is already in progress cancel",{caller:"Api.login",content:{userName:e.userName,timestamp:e.timestamp}});return}this.isLogining=!0;try{return await this.post({url:"/auth/agentUser/login",method:"post",data:e})}finally{this.isLogining=!1}}async loginOut(e){if(this.isLoginOuting){this.callKit.logger.info("loginOut is already in progress cancel",{caller:"Api.loginOut",content:{sessionId:e.sessionId,timestamp:e.timestamp}});return}this.isLoginOuting=!0;try{return await this.post({url:"/auth/agentUser/loginOut",method:"post",data:e})}finally{this.isLoginOuting=!1}}async trackLogs(e){return this.post({url:"/agent/user/sdkLog",method:"post",data:{content:[e]}},{useFormData:!0,skipLog:!0})}async updateUserStatus(e){return this.post({url:"/agent/user/changeStatus",method:"post",data:e})}async post(e,t={skipLog:!1}){let{userInfo:r,host:i}=this.callKit.config.getConfig(),{sessionId:s}=r;if(e.url=`${i}${e.url}`,e.headers={"Content-Type":"application/x-www-form-urlencoded",...e.headers},e.headers["Content-Type"]==="application/x-www-form-urlencoded"&&t.useFormData){let T=new FormData,A=e.data||{};for(let _ in A)Object.prototype.hasOwnProperty.call(A,_)&&T.append(_,A[_]);e.data=T}else e.data=new URLSearchParams(e.data).toString();s&&(e.headers.sessionId=s);let o=Date.now();t.skipLog||this.callKit.logger.info("API Request Start",{type:"API",caller:"API.Request",content:{url:e.url,headers:e.headers,data:e.data,extra:t,startTime:o}});let a=await Dn(e).catch(()=>{this.callKit.config.reset()}),d=Date.now();if(t.skipLog||this.callKit.logger.info("API Request Finish",{type:"API",caller:"API.Request",content:{url:e.url,duration:`${d-o}ms`,response:a}}),!a)throw this.callKit.reset(),new Error("Network error");let{code:h,data:l,message:u}=a;if(h==="000000")return l;throw h==="100013"&&this.callKit.config.reset(),new Error(u??"Request failed")}};var ne={init:0,connecting:2,ringing:4,calling:5},H={KIT_LOG:"log",KIT_USER_STATUS_CHANGE:"userStatusChange",KIT_LOGIN_CHANGE:"loginChange",KIT_REGISTER_CHANGE:"registerChange",KIT_CALL_STATUS_CHANGE:"callStatusChange",KIT_SET_HOLD:"holdChange",KIT_SET_MUTE:"muteChange",KIT_CALL_ID_CHANGE:"callIdChange",KIT_ERROR:"error",KIT_INVITE:"invite",KIT_OUTGOING_INVITE:"outgoingInvite",CALL_CONNECTING:"connecting",CALL_RINGING:"ringing",AGENT_PICK_UP:"agentPickUp",CALL_PICK_UP:"pickUp",CALL_NO_ANSWER:"noAnswer",CALL_HANG_UP:"hangUp",CALL_END:"callEnd",CALL_CDR:"callCdr",SERVER_SOCKET_EVENT:"socketEvent",USER_STATUS_CHANGE:"userStatusChange",INCALL_CONNECT_EVENT:"IncallConnectEvent",SIP_CONNECT_EVENT:"sipConnectEvent",SIP_REGISTERER_EVENT:"sipRegistererEvent",SIP_SESSION_EVENT:"sipSessionEvent"},V={UNKNOWN_ERROR:-1,API_USER_LOGIN_ERROR:1000001,API_USER_STATUS_UPDATE_ERROR:1000002,API_USER_LOGOUT_ERROR:1000003,CONNECT_CALL_STATUS_ERROR:2000001,USER_NOT_LOGIN:2000002,WEBRTC_USER_MEDIA_ERROR:2000003,WEBRTC_HOLE_STATUS_ERROR:2000004,WEBRTC_AUDIO_PLAYER_ERROR:2000005,WEBRTC_AUDIO_PLAY_ERROR:2000006,WEBRTC_USER_AGENT_ERROR:2000007,WEBRTC_CALL_INVITE_ERROR:2000008,WEBRTC_REGISTER_ERROR:2000009,WEBRTC_MUTE_STATUS_ERROR:2000010,WEBRTC_CANCEL_REGISTER_ERROR:2000011,WEBRTC_MUTE_ERROR:2000012,SOCKET_CONNECT_ERROR:3000001,SOCKET_PING_TIMEOUT:3000002,SOKET_SERVER_ERROR:3000003,SOCKET_CALL_ERROR:3000004,SOCKET_RECONNECT_FAILED:3000005},Pn={info:9,success:4,warn:3,error:2,silent:1},be={PING:"PING",START:"START",AGENT_HANGUP:"AGENT_HANG_UP",CALL_CANCEL:"AGENT_CANCEL",HOLD:"AGENT_HOLD",UNHOLD:"AGENT_UN_HOLD",MUTE:"AGENT_MUTE",UNMUTE:"AGENT_UN_MUTE",CALL:"CALL",END:"STOP",AGENT_TRANSFER:"AGENT_TRANSFER",HANG_UP_REASON:"HANG_UP_REASON",ACK:"ACK"},pe={PONG:"PONG",START_CONFIRM:"START_CONFIRM",CALL_SUCCESS:"CALL_SUCCESS",CALL_FAILED:"CALL_FAILED",CUSTOMER_RINGING:"CUSTOMER_RINGING",AGENT_PICK_UP:"AGENT_PICK_UP",CUSTOMER_PICK_UP:"CUSTOMER_PICK_UP",CUSTOMER_NO_ANSWER:"CUSTOMER_NO_ANSWER",CUSTOMER_HANG_UP:"CUSTOMER_HANG_UP",AGENT_NO_ANSWER:"AGENT_NO_ANSWER",AGENT_HANG_UP:"AGENT_HANG_UP",CALL_CDR:"CALL_CDR",STOP_CONFIRM:"STOP_CONFIRM",CLOSE:"CLOSE",ERROR:"ERROR",SESSION_ERROR:"SESSION_ERROR"},je={NONE:"NONE",INTERNAL:"INTERNAL"},pr={audio:{autoGainControl:!0,noiseSuppression:!0,echoCancellation:!0},video:!1},xe={phoneNum:1,workOrderId:2},Mt={enabled:!1,interval:5e3,maxSize:8192},Ft={enabled:!0,maxAttempts:3,delay:1e3,pingInterval:3e4,pingTimeout:5e3},Ut={enabled:!0,maxAttempts:3,delay:1e3};var mr=class{callKit;constructor(e){this.callKit=e}async callStart(e){if(this.callKit.config.check()){if(this.callKit.logger.info("callStart",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}}),!this.callKit.socket.startConfirm){this.callKit.logger.warn("server not confirm start",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}});return}this.callKit.connect.call(async t=>{let r={...e?.extra||{},agentId:t.agentId,sourceType:t.sourceType};t.sourceType===xe.phoneNum?r.phoneNum=t.extno:t.sourceType===xe.workOrderId&&(r.workOrderId=t.workOrderId),this.callKit.socket.send(be.CALL,r)})}}async callRefer(e,t){this.callKit.config.check()&&(this.callKit.logger.info("callRefer",{caller:"Call.callRefer",content:{referTo:e,options:t}}),this.callKit.connect.refer(e,t))}async callEnd(e=!1,t=!1){this.callKit.connect.connectStatus!==ne.init&&this.callKit.config.check()&&(this.callKit.logger.info("callEnd",{caller:"Call.callEnd",content:{isUnprompted:e,isError:t,connectStatus:this.callKit.connect.connectStatus}}),this.callKit.connect.hangup(e,t))}async callHold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be held",{caller:"Call.callHold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!0)}}async callUnhold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot unhold",{caller:"Call.callUnhold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!1)}}async callMute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be muted",{caller:"Call.callMute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!0)}}async callUnmute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be unmuted",{caller:"Call.callUnmute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!1)}}};var Nn={name:"@koi-design/callkit",version:"2.0.5-beta.13",description:"callkit",author:"koi",license:"ISC",scripts:{build:"tsup",start:"vite",dev:"tsup --watch",lint:"eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",release:"tsup && node scripts/pkg.js"},exports:{".":{types:"./dist/index.d.ts",require:"./dist/index.js",import:"./dist/index.mjs"}},main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",files:["dist"],dependencies:{axios:"~0.26.1","blueimp-md5":"^2.12.0","eslint-plugin-jsonc":"^2.21.0","json-stringify-safe":"^5.0.1","sip.js":"^0.21.2"},devDependencies:{"@commitlint/cli":"^9.1.2","@commitlint/config-conventional":"^9.1.2","@koi-design/eslint-config-ts":"^0.0.14","@types/blueimp-md5":"^2.18.2",archiver:"^5.3.1",consola:"^3.4.2",eslint:"~8.29.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.5.0",husky:"^8.0.3","lint-staged":"^10.5.4",prettier:"^2.6.2",tsup:"6.6.3",typescript:"^4.6.3",vite:"^4"}};var Cr=class{callKit;constructor(e){this.callKit=e}config={version:`V${Nn.version}`,host:"",log:"info",trackLogs:Mt,audioRef:void 0,constrains:pr,socket:"",reconnect:{sip:Ut,incall:Ft},userInfo:{wsUrl:"",logGather:!1,sessionId:"",username:"",password:"",encryptionPassword:je.INTERNAL,sourceType:xe.phoneNum,extno:"",workOrderId:"",userPart:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:0,encryptionMethod:je.INTERNAL}};getConfig=()=>this.config;setConfig=async(e,t)=>{this.config[e]=t};setUserInfo=async(e,t)=>{this.config.userInfo[e]=t,this.callKit.logger.info("setUserInfo",{caller:"Config.setUserInfo",content:{key:e,value:t}})};reset=async()=>{this.isLogin()&&(this.config.userInfo={wsUrl:"",sessionId:"",username:"",password:"",encryptionPassword:"",userPart:"",sourceType:xe.phoneNum,extno:"",workOrderId:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:this.config.userInfo.iceGatheringTimeout,encryptionMethod:je.INTERNAL,logGather:!1},this.callKit.trigger(H.KIT_LOGIN_CHANGE,!1))};validate=()=>{let{userPart:e,fsIp:t,fsPassword:r,fsPort:i}=this.config.userInfo;return!(!e||!t||!i||!r)};isLogin=()=>this.validate();check(){return this.isLogin()?!0:(this.callKit.logger.warn("User not logged in",{caller:"Config.check",content:{errCode:V.USER_NOT_LOGIN}}),!1)}getTrackLogsConfig(){return{...Mt,...this.config?.trackLogs}}getReconnectConfig(e){return{...this.config?.reconnect?.[e]??(e==="sip"?Ut:Ft)}}enableTrackLogs(e){this.config.trackLogs.enabled=e}};var Ln=Xr(Hn());function Je(n){return Pn[n]}function qa(n){let{timestamp:e,level:t,type:r="OTHER",message:i,caller:s,content:o}=n,a=String(t).toUpperCase();return`${e} [${a}] [${r}] [${s??"unknown"}] [${i}] ${(0,Ln.default)(o)}`.trim()}function qn(n){return new Blob([n]).size}var vr=class{prefix="CallKit";level="info";pendingTrackLogs=[];trackLogsTimer=null;callKit;constructor(e,t){this.callKit=e,this.level=t||"info",this.startTrackLogsTimer()}startTrackLogsTimer(){let{interval:e}=this.callKit.config.getTrackLogsConfig();this.trackLogsTimer||(this.trackLogsTimer=setInterval(()=>{this.flushTrackLogs()},e))}flushTrackLogs(){if(this.pendingTrackLogs.length===0)return;let{enabled:e,maxSize:t}=this.callKit.config.getTrackLogsConfig();if(e)try{let r=[],i=[],s=0;for(let o of this.pendingTrackLogs){let a=qn(o),d=i.length>0?`
|
|
6
|
+
`).map(e=>e.trim()).join(" ")};Hs.O=function(n){return this.inspectOpts.colors=this.useColors,or.inspect(n,this.inspectOpts)}});var Ls=L((yc,ui)=>{typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?ui.exports=$s():ui.exports=qs()});var Fs=L((Ic,Ms)=>{var Nt;Ms.exports=function(){if(!Nt){try{Nt=Ls()("follow-redirects")}catch{}typeof Nt!="function"&&(Nt=function(){})}Nt.apply(null,arguments)}});var Ii=L((bc,yi)=>{var kt=ye("url"),Ot=kt.URL,zo=ye("http"),Zo=ye("https"),Ci=ye("stream").Writable,vi=ye("assert"),Us=Fs();(function(){var e=typeof process<"u",t=typeof window<"u"&&typeof document<"u",r=at(Error.captureStackTrace);!e&&(t||!r)&&console.warn("The follow-redirects package should be excluded from browser builds.")})();var Ei=!1;try{vi(new Ot(""))}catch(n){Ei=n.code==="ERR_INVALID_URL"}var Xo=["auth","host","hostname","href","path","pathname","port","protocol","query","search","hash"],wi=["abort","aborted","connect","error","socket","timeout"],Ti=Object.create(null);wi.forEach(function(n){Ti[n]=function(e,t,r){this._redirectable.emit(n,e,t,r)}});var fi=Ht("ERR_INVALID_URL","Invalid URL",TypeError),pi=Ht("ERR_FR_REDIRECTION_FAILURE","Redirected request failed"),Qo=Ht("ERR_FR_TOO_MANY_REDIRECTS","Maximum number of redirects exceeded",pi),ea=Ht("ERR_FR_MAX_BODY_LENGTH_EXCEEDED","Request body larger than maxBodyLength limit"),ta=Ht("ERR_STREAM_WRITE_AFTER_END","write after end"),ra=Ci.prototype.destroy||js;function Ee(n,e){Ci.call(this),this._sanitizeOptions(n),this._options=n,this._ended=!1,this._ending=!1,this._redirectCount=0,this._redirects=[],this._requestBodyLength=0,this._requestBodyBuffers=[],e&&this.on("response",e);var t=this;this._onNativeResponse=function(r){try{t._processResponse(r)}catch(i){t.emit("error",i instanceof pi?i:new pi({cause:i}))}},this._performRequest()}Ee.prototype=Object.create(Ci.prototype);Ee.prototype.abort=function(){Si(this._currentRequest),this._currentRequest.abort(),this.emit("abort")};Ee.prototype.destroy=function(n){return Si(this._currentRequest,n),ra.call(this,n),this};Ee.prototype.write=function(n,e,t){if(this._ending)throw new ta;if(!ot(n)&&!na(n))throw new TypeError("data should be a string, Buffer or Uint8Array");if(at(e)&&(t=e,e=null),n.length===0){t&&t();return}this._requestBodyLength+n.length<=this._options.maxBodyLength?(this._requestBodyLength+=n.length,this._requestBodyBuffers.push({data:n,encoding:e}),this._currentRequest.write(n,e,t)):(this.emit("error",new ea),this.abort())};Ee.prototype.end=function(n,e,t){if(at(n)?(t=n,n=e=null):at(e)&&(t=e,e=null),!n)this._ended=this._ending=!0,this._currentRequest.end(null,null,t);else{var r=this,i=this._currentRequest;this.write(n,e,function(){r._ended=!0,i.end(null,null,t)}),this._ending=!0}};Ee.prototype.setHeader=function(n,e){this._options.headers[n]=e,this._currentRequest.setHeader(n,e)};Ee.prototype.removeHeader=function(n){delete this._options.headers[n],this._currentRequest.removeHeader(n)};Ee.prototype.setTimeout=function(n,e){var t=this;function r(o){o.setTimeout(n),o.removeListener("timeout",o.destroy),o.addListener("timeout",o.destroy)}function i(o){t._timeout&&clearTimeout(t._timeout),t._timeout=setTimeout(function(){t.emit("timeout"),s()},n),r(o)}function s(){t._timeout&&(clearTimeout(t._timeout),t._timeout=null),t.removeListener("abort",s),t.removeListener("error",s),t.removeListener("response",s),t.removeListener("close",s),e&&t.removeListener("timeout",e),t.socket||t._currentRequest.removeListener("socket",i)}return e&&this.on("timeout",e),this.socket?i(this.socket):this._currentRequest.once("socket",i),this.on("socket",r),this.on("abort",s),this.on("error",s),this.on("response",s),this.on("close",s),this};["flushHeaders","getHeader","setNoDelay","setSocketKeepAlive"].forEach(function(n){Ee.prototype[n]=function(e,t){return this._currentRequest[n](e,t)}});["aborted","connection","socket"].forEach(function(n){Object.defineProperty(Ee.prototype,n,{get:function(){return this._currentRequest[n]}})});Ee.prototype._sanitizeOptions=function(n){if(n.headers||(n.headers={}),n.host&&(n.hostname||(n.hostname=n.host),delete n.host),!n.pathname&&n.path){var e=n.path.indexOf("?");e<0?n.pathname=n.path:(n.pathname=n.path.substring(0,e),n.search=n.path.substring(e))}};Ee.prototype._performRequest=function(){var n=this._options.protocol,e=this._options.nativeProtocols[n];if(!e)throw new TypeError("Unsupported protocol "+n);if(this._options.agents){var t=n.slice(0,-1);this._options.agent=this._options.agents[t]}var r=this._currentRequest=e.request(this._options,this._onNativeResponse);r._redirectable=this;for(var i of wi)r.on(i,Ti[i]);if(this._currentUrl=/^\//.test(this._options.path)?kt.format(this._options):this._options.path,this._isRedirect){var s=0,o=this,a=this._requestBodyBuffers;(function d(h){if(r===o._currentRequest)if(h)o.emit("error",h);else if(s<a.length){var l=a[s++];r.finished||r.write(l.data,l.encoding,d)}else o._ended&&r.end()})()}};Ee.prototype._processResponse=function(n){var e=n.statusCode;this._options.trackRedirects&&this._redirects.push({url:this._currentUrl,headers:n.headers,statusCode:e});var t=n.headers.location;if(!t||this._options.followRedirects===!1||e<300||e>=400){n.responseUrl=this._currentUrl,n.redirects=this._redirects,this.emit("response",n),this._requestBodyBuffers=[];return}if(Si(this._currentRequest),n.destroy(),++this._redirectCount>this._options.maxRedirects)throw new Qo;var r,i=this._options.beforeRedirect;i&&(r=Object.assign({Host:n.req.getHeader("host")},this._options.headers));var s=this._options.method;((e===301||e===302)&&this._options.method==="POST"||e===303&&!/^(?:GET|HEAD)$/.test(this._options.method))&&(this._options.method="GET",this._requestBodyBuffers=[],gi(/^content-/i,this._options.headers));var o=gi(/^host$/i,this._options.headers),a=Ri(this._currentUrl),d=o||a.host,h=/^\w+:/.test(t)?this._currentUrl:kt.format(Object.assign(a,{host:d})),l=ia(t,h);if(Us("redirecting to",l.href),this._isRedirect=!0,mi(l,this._options),(l.protocol!==a.protocol&&l.protocol!=="https:"||l.host!==d&&!sa(l.host,d))&&gi(/^(?:(?:proxy-)?authorization|cookie)$/i,this._options.headers),at(i)){var u={headers:n.headers,statusCode:e},T={url:h,method:s,headers:r};i(this._options,u,T),this._sanitizeOptions(this._options)}this._performRequest()};function Bs(n){var e={maxRedirects:21,maxBodyLength:10485760},t={};return Object.keys(n).forEach(function(r){var i=r+":",s=t[i]=n[r],o=e[r]=Object.create(s);function a(h,l,u){return oa(h)?h=mi(h):ot(h)?h=mi(Ri(h)):(u=l,l=Ks(h),h={protocol:i}),at(l)&&(u=l,l=null),l=Object.assign({maxRedirects:e.maxRedirects,maxBodyLength:e.maxBodyLength},h,l),l.nativeProtocols=t,!ot(l.host)&&!ot(l.hostname)&&(l.hostname="::1"),vi.equal(l.protocol,i,"protocol mismatch"),Us("options",l),new Ee(l,u)}function d(h,l,u){var T=o.request(h,l,u);return T.end(),T}Object.defineProperties(o,{request:{value:a,configurable:!0,enumerable:!0,writable:!0},get:{value:d,configurable:!0,enumerable:!0,writable:!0}})}),e}function js(){}function Ri(n){var e;if(Ei)e=new Ot(n);else if(e=Ks(kt.parse(n)),!ot(e.protocol))throw new fi({input:n});return e}function ia(n,e){return Ei?new Ot(n,e):Ri(kt.resolve(e,n))}function Ks(n){if(/^\[/.test(n.hostname)&&!/^\[[:0-9a-f]+\]$/i.test(n.hostname))throw new fi({input:n.href||n});if(/^\[/.test(n.host)&&!/^\[[:0-9a-f]+\](:\d+)?$/i.test(n.host))throw new fi({input:n.href||n});return n}function mi(n,e){var t=e||{};for(var r of Xo)t[r]=n[r];return t.hostname.startsWith("[")&&(t.hostname=t.hostname.slice(1,-1)),t.port!==""&&(t.port=Number(t.port)),t.path=t.search?t.pathname+t.search:t.pathname,t}function gi(n,e){var t;for(var r in e)n.test(r)&&(t=e[r],delete e[r]);return t===null||typeof t>"u"?void 0:String(t).trim()}function Ht(n,e,t){function r(i){at(Error.captureStackTrace)&&Error.captureStackTrace(this,this.constructor),Object.assign(this,i||{}),this.code=n,this.message=this.cause?e+": "+this.cause.message:e}return r.prototype=new(t||Error),Object.defineProperties(r.prototype,{constructor:{value:r,enumerable:!1},name:{value:"Error ["+n+"]",enumerable:!1}}),r}function Si(n,e){for(var t of wi)n.removeListener(t,Ti[t]);n.on("error",js),n.destroy(e)}function sa(n,e){vi(ot(n)&&ot(e));var t=n.length-e.length-1;return t>0&&n[t]==="."&&n.endsWith(e)}function ot(n){return typeof n=="string"||n instanceof String}function at(n){return typeof n=="function"}function na(n){return typeof n=="object"&&"length"in n}function oa(n){return Ot&&n instanceof Ot}yi.exports=Bs({http:zo,https:Zo});yi.exports.wrap=Bs});var cr=L((xc,Gs)=>{Gs.exports={version:"0.26.1"}});var Xs=L((Ac,Zs)=>{"use strict";var qt=de(),Vs=si(),aa=ni(),Ws=Zt(),ca=ye("http"),la=ye("https"),da=Ii().http,ha=Ii().https,Ys=ye("url"),ua=ye("zlib"),ga=cr().version,Ct=tr(),lr=Qt(),fa=er(),pa=gt(),Js=/https:?/;function zs(n,e,t){if(n.hostname=e.host,n.host=e.host,n.port=e.port,n.path=t,e.auth){var r=Buffer.from(e.auth.username+":"+e.auth.password,"utf8").toString("base64");n.headers["Proxy-Authorization"]="Basic "+r}n.beforeRedirect=function(s){s.headers.host=s.host,zs(s,e,s.href)}}Zs.exports=function(e){return new Promise(function(r,i){var s;function o(){e.cancelToken&&e.cancelToken.unsubscribe(s),e.signal&&e.signal.removeEventListener("abort",s)}var a=function(F){o(),r(F)},d=!1,h=function(F){o(),d=!0,i(F)},l=e.data,u=e.headers,T={};if(Object.keys(u).forEach(function(F){T[F.toLowerCase()]=F}),"user-agent"in T?u[T["user-agent"]]||delete u[T["user-agent"]]:u["User-Agent"]="axios/"+ga,l&&!qt.isStream(l)){if(!Buffer.isBuffer(l))if(qt.isArrayBuffer(l))l=Buffer.from(new Uint8Array(l));else if(qt.isString(l))l=Buffer.from(l,"utf-8");else return h(Ct("Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream",e));if(e.maxBodyLength>-1&&l.length>e.maxBodyLength)return h(Ct("Request body larger than maxBodyLength limit",e));T["content-length"]||(u["Content-Length"]=l.length)}var A=void 0;if(e.auth){var _=e.auth.username||"",$=e.auth.password||"";A=_+":"+$}var N=aa(e.baseURL,e.url),P=Ys.parse(N),k=P.protocol||"http:";if(!A&&P.auth){var C=P.auth.split(":"),f=C[0]||"",x=C[1]||"";A=f+":"+x}A&&T.authorization&&delete u[T.authorization];var w=Js.test(k),U=w?e.httpsAgent:e.httpAgent;try{Ws(P.path,e.params,e.paramsSerializer).replace(/^\?/,"")}catch(D){var K=new Error(D.message);K.config=e,K.url=e.url,K.exists=!0,h(K)}var B={path:Ws(P.path,e.params,e.paramsSerializer).replace(/^\?/,""),method:e.method.toUpperCase(),headers:u,agent:U,agents:{http:e.httpAgent,https:e.httpsAgent},auth:A};e.socketPath?B.socketPath=e.socketPath:(B.hostname=P.hostname,B.port=P.port);var z=e.proxy;if(!z&&z!==!1){var y=k.slice(0,-1)+"_proxy",R=process.env[y]||process.env[y.toUpperCase()];if(R){var c=Ys.parse(R),S=process.env.no_proxy||process.env.NO_PROXY,Vt=!0;if(S){var g=S.split(",").map(function(F){return F.trim()});Vt=!g.some(function(F){return F?F==="*"||F[0]==="."&&P.hostname.substr(P.hostname.length-F.length)===F?!0:P.hostname===F:!1})}if(Vt&&(z={host:c.hostname,port:c.port,protocol:c.protocol},c.auth)){var E=c.auth.split(":");z.auth={username:E[0],password:E[1]}}}}z&&(B.headers.host=P.hostname+(P.port?":"+P.port:""),zs(B,z,k+"//"+P.hostname+(P.port?":"+P.port:"")+B.path));var m,fe=w&&(z?Js.test(z.protocol):!0);e.transport?m=e.transport:e.maxRedirects===0?m=fe?la:ca:(e.maxRedirects&&(B.maxRedirects=e.maxRedirects),m=fe?ha:da),e.maxBodyLength>-1&&(B.maxBodyLength=e.maxBodyLength),e.insecureHTTPParser&&(B.insecureHTTPParser=e.insecureHTTPParser);var q=m.request(B,function(F){if(!q.aborted){var Se=F,Pt=F.req||q;if(F.statusCode!==204&&Pt.method!=="HEAD"&&e.decompress!==!1)switch(F.headers["content-encoding"]){case"gzip":case"compress":case"deflate":Se=Se.pipe(ua.createUnzip()),delete F.headers["content-encoding"];break}var ht={status:F.statusCode,statusText:F.statusMessage,headers:F.headers,config:e,request:Pt};if(e.responseType==="stream")ht.data=Se,Vs(a,h,ht);else{var Wt=[],Gi=0;Se.on("data",function(Le){Wt.push(Le),Gi+=Le.length,e.maxContentLength>-1&&Gi>e.maxContentLength&&(d=!0,Se.destroy(),h(Ct("maxContentLength size of "+e.maxContentLength+" exceeded",e,null,Pt)))}),Se.on("aborted",function(){d||(Se.destroy(),h(Ct("error request aborted",e,"ERR_REQUEST_ABORTED",Pt)))}),Se.on("error",function(Le){q.aborted||h(lr(Le,e,null,Pt))}),Se.on("end",function(){try{var Le=Wt.length===1?Wt[0]:Buffer.concat(Wt);e.responseType!=="arraybuffer"&&(Le=Le.toString(e.responseEncoding),(!e.responseEncoding||e.responseEncoding==="utf8")&&(Le=qt.stripBOM(Le))),ht.data=Le}catch(Vi){h(lr(Vi,e,Vi.code,ht.request,ht))}Vs(a,h,ht)})}}});if(q.on("error",function(F){q.aborted&&F.code!=="ERR_FR_TOO_MANY_REDIRECTS"||h(lr(F,e,null,q))}),q.on("socket",function(F){F.setKeepAlive(!0,1e3*60)}),e.timeout){var Re=parseInt(e.timeout,10);if(isNaN(Re)){h(Ct("error trying to parse `config.timeout` to int",e,"ERR_PARSE_TIMEOUT",q));return}q.setTimeout(Re,function(){q.abort();var F="";e.timeoutErrorMessage?F=e.timeoutErrorMessage:F="timeout of "+e.timeout+"ms exceeded";var Se=e.transitional||fa;h(Ct(F,e,Se.clarifyTimeoutError?"ETIMEDOUT":"ECONNABORTED",q))})}(e.cancelToken||e.signal)&&(s=function(D){q.aborted||(q.abort(),h(!D||D&&D.type?new pa("canceled"):D))},e.cancelToken&&e.cancelToken.subscribe(s),e.signal&&(e.signal.aborted?s():e.signal.addEventListener("abort",s))),qt.isStream(l)?l.on("error",function(F){h(lr(F,e,null,q))}).pipe(q):q.end(l)})}});var hr=L((_c,tn)=>{"use strict";var le=de(),Qs=as(),ma=Qt(),Ca=er(),va={"Content-Type":"application/x-www-form-urlencoded"};function en(n,e){!le.isUndefined(n)&&le.isUndefined(n["Content-Type"])&&(n["Content-Type"]=e)}function Ea(){var n;return typeof XMLHttpRequest<"u"?n=bs():typeof process<"u"&&Object.prototype.toString.call(process)==="[object process]"&&(n=Xs()),n}function wa(n,e,t){if(le.isString(n))try{return(e||JSON.parse)(n),le.trim(n)}catch(r){if(r.name!=="SyntaxError")throw r}return(t||JSON.stringify)(n)}var dr={transitional:Ca,adapter:Ea(),transformRequest:[function(e,t){return Qs(t,"Accept"),Qs(t,"Content-Type"),le.isFormData(e)||le.isArrayBuffer(e)||le.isBuffer(e)||le.isStream(e)||le.isFile(e)||le.isBlob(e)?e:le.isArrayBufferView(e)?e.buffer:le.isURLSearchParams(e)?(en(t,"application/x-www-form-urlencoded;charset=utf-8"),e.toString()):le.isObject(e)||t&&t["Content-Type"]==="application/json"?(en(t,"application/json"),wa(e)):e}],transformResponse:[function(e){var t=this.transitional||dr.transitional,r=t&&t.silentJSONParsing,i=t&&t.forcedJSONParsing,s=!r&&this.responseType==="json";if(s||i&&le.isString(e)&&e.length)try{return JSON.parse(e)}catch(o){if(s)throw o.name==="SyntaxError"?ma(o,this,"E_JSON_PARSE"):o}return e}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(e){return e>=200&&e<300},headers:{common:{Accept:"application/json, text/plain, */*"}}};le.forEach(["delete","get","head"],function(e){dr.headers[e]={}});le.forEach(["post","put","patch"],function(e){dr.headers[e]=le.merge(va)});tn.exports=dr});var sn=L(($c,rn)=>{"use strict";var Ta=de(),Ra=hr();rn.exports=function(e,t,r){var i=this||Ra;return Ta.forEach(r,function(o){e=o.call(i,e,t)}),e}});var bi=L((Dc,nn)=>{"use strict";nn.exports=function(e){return!!(e&&e.__CANCEL__)}});var cn=L((Pc,an)=>{"use strict";var on=de(),xi=sn(),Sa=bi(),ya=hr(),Ia=gt();function Ai(n){if(n.cancelToken&&n.cancelToken.throwIfRequested(),n.signal&&n.signal.aborted)throw new Ia("canceled")}an.exports=function(e){Ai(e),e.headers=e.headers||{},e.data=xi.call(e,e.data,e.headers,e.transformRequest),e.headers=on.merge(e.headers.common||{},e.headers[e.method]||{},e.headers),on.forEach(["delete","get","head","post","put","patch","common"],function(i){delete e.headers[i]});var t=e.adapter||ya.adapter;return t(e).then(function(i){return Ai(e),i.data=xi.call(e,i.data,i.headers,e.transformResponse),i},function(i){return Sa(i)||(Ai(e),i&&i.response&&(i.response.data=xi.call(e,i.response.data,i.response.headers,e.transformResponse))),Promise.reject(i)})}});var _i=L((Nc,ln)=>{"use strict";var Ie=de();ln.exports=function(e,t){t=t||{};var r={};function i(l,u){return Ie.isPlainObject(l)&&Ie.isPlainObject(u)?Ie.merge(l,u):Ie.isPlainObject(u)?Ie.merge({},u):Ie.isArray(u)?u.slice():u}function s(l){if(Ie.isUndefined(t[l])){if(!Ie.isUndefined(e[l]))return i(void 0,e[l])}else return i(e[l],t[l])}function o(l){if(!Ie.isUndefined(t[l]))return i(void 0,t[l])}function a(l){if(Ie.isUndefined(t[l])){if(!Ie.isUndefined(e[l]))return i(void 0,e[l])}else return i(void 0,t[l])}function d(l){if(l in t)return i(e[l],t[l]);if(l in e)return i(void 0,e[l])}var h={url:o,method:o,data:o,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:d};return Ie.forEach(Object.keys(e).concat(Object.keys(t)),function(u){var T=h[u]||s,A=T(u);Ie.isUndefined(A)&&T!==d||(r[u]=A)}),r}});var un=L((Oc,hn)=>{"use strict";var ba=cr().version,$i={};["object","boolean","number","function","string","symbol"].forEach(function(n,e){$i[n]=function(r){return typeof r===n||"a"+(e<1?"n ":" ")+n}});var dn={};$i.transitional=function(e,t,r){function i(s,o){return"[Axios v"+ba+"] Transitional option '"+s+"'"+o+(r?". "+r:"")}return function(s,o,a){if(e===!1)throw new Error(i(o," has been removed"+(t?" in "+t:"")));return t&&!dn[o]&&(dn[o]=!0,console.warn(i(o," has been deprecated since v"+t+" and will be removed in the near future"))),e?e(s,o,a):!0}};function xa(n,e,t){if(typeof n!="object")throw new TypeError("options must be an object");for(var r=Object.keys(n),i=r.length;i-- >0;){var s=r[i],o=e[s];if(o){var a=n[s],d=a===void 0||o(a,s,n);if(d!==!0)throw new TypeError("option "+s+" must be "+d);continue}if(t!==!0)throw Error("Unknown option "+s)}}hn.exports={assertOptions:xa,validators:$i}});var vn=L((kc,Cn)=>{"use strict";var pn=de(),Aa=Zt(),gn=ns(),fn=cn(),ur=_i(),mn=un(),vt=mn.validators;function Lt(n){this.defaults=n,this.interceptors={request:new gn,response:new gn}}Lt.prototype.request=function(e,t){typeof e=="string"?(t=t||{},t.url=e):t=e||{},t=ur(this.defaults,t),t.method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method="get";var r=t.transitional;r!==void 0&&mn.assertOptions(r,{silentJSONParsing:vt.transitional(vt.boolean),forcedJSONParsing:vt.transitional(vt.boolean),clarifyTimeoutError:vt.transitional(vt.boolean)},!1);var i=[],s=!0;this.interceptors.request.forEach(function(A){typeof A.runWhen=="function"&&A.runWhen(t)===!1||(s=s&&A.synchronous,i.unshift(A.fulfilled,A.rejected))});var o=[];this.interceptors.response.forEach(function(A){o.push(A.fulfilled,A.rejected)});var a;if(!s){var d=[fn,void 0];for(Array.prototype.unshift.apply(d,i),d=d.concat(o),a=Promise.resolve(t);d.length;)a=a.then(d.shift(),d.shift());return a}for(var h=t;i.length;){var l=i.shift(),u=i.shift();try{h=l(h)}catch(T){u(T);break}}try{a=fn(h)}catch(T){return Promise.reject(T)}for(;o.length;)a=a.then(o.shift(),o.shift());return a};Lt.prototype.getUri=function(e){return e=ur(this.defaults,e),Aa(e.url,e.params,e.paramsSerializer).replace(/^\?/,"")};pn.forEach(["delete","get","head","options"],function(e){Lt.prototype[e]=function(t,r){return this.request(ur(r||{},{method:e,url:t,data:(r||{}).data}))}});pn.forEach(["post","put","patch"],function(e){Lt.prototype[e]=function(t,r,i){return this.request(ur(i||{},{method:e,url:t,data:r}))}});Cn.exports=Lt});var wn=L((Hc,En)=>{"use strict";var _a=gt();function Et(n){if(typeof n!="function")throw new TypeError("executor must be a function.");var e;this.promise=new Promise(function(i){e=i});var t=this;this.promise.then(function(r){if(t._listeners){var i,s=t._listeners.length;for(i=0;i<s;i++)t._listeners[i](r);t._listeners=null}}),this.promise.then=function(r){var i,s=new Promise(function(o){t.subscribe(o),i=o}).then(r);return s.cancel=function(){t.unsubscribe(i)},s},n(function(i){t.reason||(t.reason=new _a(i),e(t.reason))})}Et.prototype.throwIfRequested=function(){if(this.reason)throw this.reason};Et.prototype.subscribe=function(e){if(this.reason){e(this.reason);return}this._listeners?this._listeners.push(e):this._listeners=[e]};Et.prototype.unsubscribe=function(e){if(this._listeners){var t=this._listeners.indexOf(e);t!==-1&&this._listeners.splice(t,1)}};Et.source=function(){var e,t=new Et(function(i){e=i});return{token:t,cancel:e}};En.exports=Et});var Rn=L((qc,Tn)=>{"use strict";Tn.exports=function(e){return function(r){return e.apply(null,r)}}});var yn=L((Lc,Sn)=>{"use strict";var $a=de();Sn.exports=function(e){return $a.isObject(e)&&e.isAxiosError===!0}});var xn=L((Mc,Di)=>{"use strict";var In=de(),Da=Qr(),gr=vn(),Pa=_i(),Na=hr();function bn(n){var e=new gr(n),t=Da(gr.prototype.request,e);return In.extend(t,gr.prototype,e),In.extend(t,e),t.create=function(i){return bn(Pa(n,i))},t}var Me=bn(Na);Me.Axios=gr;Me.Cancel=gt();Me.CancelToken=wn();Me.isCancel=bi();Me.VERSION=cr().version;Me.all=function(e){return Promise.all(e)};Me.spread=Rn();Me.isAxiosError=yn();Di.exports=Me;Di.exports.default=Me});var _n=L((Fc,An)=>{An.exports=xn()});var Hn=L((Ni,kn)=>{Ni=kn.exports=Ha;Ni.getSerialize=On;function Ha(n,e,t,r){return JSON.stringify(n,On(e,r),t)}function On(n,e){var t=[],r=[];return e==null&&(e=function(i,s){return t[0]===s?"[Circular ~]":"[Circular ~."+r.slice(0,t.indexOf(s)).join(".")+"]"}),function(i,s){if(t.length>0){var o=t.indexOf(this);~o?t.splice(o+1):t.push(this),~o?r.splice(o,1/0,i):r.push(i),~t.indexOf(s)&&(s=e.call(this,i,s))}else t.push(s);return n==null?s:n.call(this,i,s)}}});var tc={};Wi(tc,{CallKit:()=>Ki});var Gt=Xr(zi());var $n=Xr(_n()),Pi=$n.default.create({headers:{"Content-Type":"application/x-www-form-urlencoded"},timeout:6e4});Pi.interceptors.request.use(n=>n);Pi.interceptors.response.use(n=>n.data,n=>Promise.reject(n));var Oa=n=>Pi.request(n),Dn=Oa;var fr=class{callKit;constructor(e){this.callKit=e}isLogining=!1;isLoginOuting=!1;async login(e){if(this.isLogining){this.callKit.logger.info("login is already in progress cancel",{caller:"Api.login",content:{userName:e.userName,timestamp:e.timestamp}});return}this.isLogining=!0;try{return await this.post({url:"/auth/agentUser/login",method:"post",data:e})}finally{this.isLogining=!1}}async loginOut(e){if(this.isLoginOuting){this.callKit.logger.info("loginOut is already in progress cancel",{caller:"Api.loginOut",content:{sessionId:e.sessionId,timestamp:e.timestamp}});return}this.isLoginOuting=!0;try{return await this.post({url:"/auth/agentUser/loginOut",method:"post",data:e})}finally{this.isLoginOuting=!1}}async trackLogs(e){return this.post({url:"/agent/user/sdkLog",method:"post",data:{content:[e]}},{useFormData:!0,skipLog:!0})}async updateUserStatus(e){return this.post({url:"/agent/user/changeStatus",method:"post",data:e})}async post(e,t={skipLog:!1}){let{userInfo:r,host:i}=this.callKit.config.getConfig(),{sessionId:s}=r;if(e.url=`${i}${e.url}`,e.headers={"Content-Type":"application/x-www-form-urlencoded",...e.headers},e.headers["Content-Type"]==="application/x-www-form-urlencoded"&&t.useFormData){let T=new FormData,A=e.data||{};for(let _ in A)Object.prototype.hasOwnProperty.call(A,_)&&T.append(_,A[_]);e.data=T}else e.data=new URLSearchParams(e.data).toString();s&&(e.headers.sessionId=s);let o=Date.now();t.skipLog||this.callKit.logger.info("API Request Start",{type:"API",caller:"API.Request",content:{url:e.url,headers:e.headers,data:e.data,extra:t,startTime:o}});let a=await Dn(e).catch(()=>{this.callKit.config.reset()}),d=Date.now();if(t.skipLog||this.callKit.logger.info("API Request Finish",{type:"API",caller:"API.Request",content:{url:e.url,duration:`${d-o}ms`,response:a}}),!a)throw this.callKit.reset(),new Error("Network error");let{code:h,data:l,message:u}=a;if(h==="000000")return l;throw h==="100013"&&this.callKit.config.reset(),new Error(u??"Request failed")}};var ne={init:0,connecting:2,ringing:4,calling:5},H={KIT_LOG:"log",KIT_USER_STATUS_CHANGE:"userStatusChange",KIT_LOGIN_CHANGE:"loginChange",KIT_REGISTER_CHANGE:"registerChange",KIT_CALL_STATUS_CHANGE:"callStatusChange",KIT_SET_HOLD:"holdChange",KIT_SET_MUTE:"muteChange",KIT_CALL_ID_CHANGE:"callIdChange",KIT_ERROR:"error",KIT_INVITE:"invite",KIT_OUTGOING_INVITE:"outgoingInvite",CALL_CONNECTING:"connecting",CALL_RINGING:"ringing",AGENT_PICK_UP:"agentPickUp",CALL_PICK_UP:"pickUp",CALL_NO_ANSWER:"noAnswer",CALL_HANG_UP:"hangUp",CALL_END:"callEnd",CALL_CDR:"callCdr",SERVER_SOCKET_EVENT:"socketEvent",USER_STATUS_CHANGE:"userStatusChange",INCALL_CONNECT_EVENT:"IncallConnectEvent",SIP_CONNECT_EVENT:"sipConnectEvent",SIP_REGISTERER_EVENT:"sipRegistererEvent",SIP_SESSION_EVENT:"sipSessionEvent"},V={UNKNOWN_ERROR:-1,API_USER_LOGIN_ERROR:1000001,API_USER_STATUS_UPDATE_ERROR:1000002,API_USER_LOGOUT_ERROR:1000003,CONNECT_CALL_STATUS_ERROR:2000001,USER_NOT_LOGIN:2000002,WEBRTC_USER_MEDIA_ERROR:2000003,WEBRTC_HOLE_STATUS_ERROR:2000004,WEBRTC_AUDIO_PLAYER_ERROR:2000005,WEBRTC_AUDIO_PLAY_ERROR:2000006,WEBRTC_USER_AGENT_ERROR:2000007,WEBRTC_CALL_INVITE_ERROR:2000008,WEBRTC_REGISTER_ERROR:2000009,WEBRTC_MUTE_STATUS_ERROR:2000010,WEBRTC_CANCEL_REGISTER_ERROR:2000011,WEBRTC_MUTE_ERROR:2000012,SOCKET_CONNECT_ERROR:3000001,SOCKET_PING_TIMEOUT:3000002,SOKET_SERVER_ERROR:3000003,SOCKET_CALL_ERROR:3000004,SOCKET_RECONNECT_FAILED:3000005},Pn={info:9,success:4,warn:3,error:2,silent:1},be={PING:"PING",START:"START",AGENT_HANGUP:"AGENT_HANG_UP",CALL_CANCEL:"AGENT_CANCEL",HOLD:"AGENT_HOLD",UNHOLD:"AGENT_UN_HOLD",MUTE:"AGENT_MUTE",UNMUTE:"AGENT_UN_MUTE",CALL:"CALL",END:"STOP",AGENT_TRANSFER:"AGENT_TRANSFER",HANG_UP_REASON:"HANG_UP_REASON",ACK:"ACK"},pe={PONG:"PONG",START_CONFIRM:"START_CONFIRM",CALL_SUCCESS:"CALL_SUCCESS",CALL_FAILED:"CALL_FAILED",CUSTOMER_RINGING:"CUSTOMER_RINGING",AGENT_PICK_UP:"AGENT_PICK_UP",CUSTOMER_PICK_UP:"CUSTOMER_PICK_UP",CUSTOMER_NO_ANSWER:"CUSTOMER_NO_ANSWER",CUSTOMER_HANG_UP:"CUSTOMER_HANG_UP",AGENT_NO_ANSWER:"AGENT_NO_ANSWER",AGENT_HANG_UP:"AGENT_HANG_UP",CALL_CDR:"CALL_CDR",STOP_CONFIRM:"STOP_CONFIRM",CLOSE:"CLOSE",ERROR:"ERROR",SESSION_ERROR:"SESSION_ERROR"},je={NONE:"NONE",INTERNAL:"INTERNAL"},pr={audio:{autoGainControl:!0,noiseSuppression:!0,echoCancellation:!0},video:!1},xe={phoneNum:1,workOrderId:2},Mt={enabled:!1,interval:5e3,maxSize:8192},Ft={enabled:!0,maxAttempts:3,delay:1e3,pingInterval:3e4,pingTimeout:5e3},Ut={enabled:!0,maxAttempts:3,delay:1e3};var mr=class{callKit;constructor(e){this.callKit=e}async callStart(e){if(this.callKit.config.check()){if(this.callKit.logger.info("callStart",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}}),!this.callKit.socket.startConfirm){this.callKit.logger.warn("server not confirm start",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}});return}this.callKit.connect.call(async t=>{let r={...e?.extra||{},agentId:t.agentId,sourceType:t.sourceType};t.sourceType===xe.phoneNum?r.phoneNum=t.extno:t.sourceType===xe.workOrderId&&(r.workOrderId=t.workOrderId),this.callKit.socket.send(be.CALL,r)})}}async callRefer(e,t){this.callKit.config.check()&&(this.callKit.logger.info("callRefer",{caller:"Call.callRefer",content:{referTo:e,options:t}}),this.callKit.connect.refer(e,t))}async callEnd(e=!1,t=!1){this.callKit.connect.connectStatus!==ne.init&&this.callKit.config.check()&&(this.callKit.logger.info("callEnd",{caller:"Call.callEnd",content:{isUnprompted:e,isError:t,connectStatus:this.callKit.connect.connectStatus}}),this.callKit.connect.hangup(e,t))}async callHold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be held",{caller:"Call.callHold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!0)}}async callUnhold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot unhold",{caller:"Call.callUnhold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!1)}}async callMute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be muted",{caller:"Call.callMute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!0)}}async callUnmute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be unmuted",{caller:"Call.callUnmute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!1)}}};var Nn={name:"@koi-design/callkit",version:"2.0.5-beta.14",description:"callkit",author:"koi",license:"ISC",scripts:{build:"tsup",start:"vite",dev:"tsup --watch",lint:"eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",release:"tsup && node scripts/pkg.js"},exports:{".":{types:"./dist/index.d.ts",require:"./dist/index.js",import:"./dist/index.mjs"}},main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",files:["dist"],dependencies:{axios:"~0.26.1","blueimp-md5":"^2.12.0","eslint-plugin-jsonc":"^2.21.0","json-stringify-safe":"^5.0.1","sip.js":"^0.21.2"},devDependencies:{"@commitlint/cli":"^9.1.2","@commitlint/config-conventional":"^9.1.2","@koi-design/eslint-config-ts":"^0.0.14","@types/blueimp-md5":"^2.18.2",archiver:"^5.3.1",consola:"^3.4.2",eslint:"~8.29.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.5.0",husky:"^8.0.3","lint-staged":"^10.5.4",prettier:"^2.6.2",tsup:"6.6.3",typescript:"^4.6.3",vite:"^4"}};var Cr=class{callKit;constructor(e){this.callKit=e}config={version:`V${Nn.version}`,host:"",log:"info",trackLogs:Mt,audioRef:void 0,constrains:pr,socket:"",reconnect:{sip:Ut,incall:Ft},userInfo:{wsUrl:"",logGather:!1,sessionId:"",username:"",password:"",encryptionPassword:je.INTERNAL,sourceType:xe.phoneNum,extno:"",workOrderId:"",userPart:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:0,encryptionMethod:je.INTERNAL}};getConfig=()=>this.config;setConfig=async(e,t)=>{this.config[e]=t};setUserInfo=async(e,t)=>{this.config.userInfo[e]=t,this.callKit.logger.info("setUserInfo",{caller:"Config.setUserInfo",content:{key:e,value:t}})};reset=async()=>{this.isLogin()&&(this.config.userInfo={wsUrl:"",sessionId:"",username:"",password:"",encryptionPassword:"",userPart:"",sourceType:xe.phoneNum,extno:"",workOrderId:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:this.config.userInfo.iceGatheringTimeout,encryptionMethod:je.INTERNAL,logGather:!1},this.callKit.trigger(H.KIT_LOGIN_CHANGE,!1))};validate=()=>{let{userPart:e,fsIp:t,fsPassword:r,fsPort:i}=this.config.userInfo;return!(!e||!t||!i||!r)};isLogin=()=>this.validate();check(){return this.isLogin()?!0:(this.callKit.logger.warn("User not logged in",{caller:"Config.check",content:{errCode:V.USER_NOT_LOGIN}}),!1)}getTrackLogsConfig(){return{...Mt,...this.config?.trackLogs}}getReconnectConfig(e){return{...this.config?.reconnect?.[e]??(e==="sip"?Ut:Ft)}}enableTrackLogs(e){this.config.trackLogs.enabled=e}};var Ln=Xr(Hn());function Je(n){return Pn[n]}function qa(n){let{timestamp:e,level:t,type:r="OTHER",message:i,caller:s,content:o}=n,a=String(t).toUpperCase();return`${e} [${a}] [${r}] [${s??"unknown"}] [${i}] ${(0,Ln.default)(o)}`.trim()}function qn(n){return new Blob([n]).size}var vr=class{prefix="CallKit";level="info";pendingTrackLogs=[];trackLogsTimer=null;callKit;constructor(e,t){this.callKit=e,this.level=t||"info",this.startTrackLogsTimer()}startTrackLogsTimer(){let{interval:e}=this.callKit.config.getTrackLogsConfig();this.trackLogsTimer||(this.trackLogsTimer=setInterval(()=>{this.flushTrackLogs()},e))}flushTrackLogs(){if(this.pendingTrackLogs.length===0)return;let{enabled:e,maxSize:t}=this.callKit.config.getTrackLogsConfig();if(e)try{let r=[],i=[],s=0;for(let o of this.pendingTrackLogs){let a=qn(o),d=i.length>0?`
|
|
7
7
|
`:"",h=qn(d);s+a+h>t&&i.length>0?(r.push(i.join(`
|
|
8
8
|
`)),i=[o],s=a):(i.push(o),s+=a+h)}i.length>0&&r.push(i.join(`
|
|
9
9
|
`));for(let o of r)this.callKit.api.trackLogs(o);this.pendingTrackLogs=[]}catch(r){console.error(r)}}destroy(){this.trackLogsTimer&&(clearInterval(this.trackLogsTimer),this.trackLogsTimer=null),this.flushTrackLogs()}setLevel(e){this.level=e}info(e,t){let r=this.catchLog(e,t,"info");Je(this.level)>=Je("info")&&console.log(`%c${r}`,"color: gray;")}success(e,t){let r=this.catchLog(e,t,"success");Je(this.level)>=Je("success")&&console.log(`%c${r}`,"color: green;")}warn(e,t){let r=this.catchLog(e,t,"warn");Je(this.level)>=Je("warn")&&console.log(`%c${r}`,"color: orange;")}error(e,t,r=!1){let i=e instanceof Error?e.message:e,s=this.catchLog(i,t,"error");Je(this.level)>=Je("error")&&console.log(`%c${s}`,"color: red;");let{errCode:o,...a}=t?.content??{},d=o??V.UNKNOWN_ERROR;r||this.callKit.trigger(H.KIT_ERROR,{code:d,msg:i,data:a});let h=new Error(i);throw h.name="CallKitError",h.code=d,h.data=a,h}catchLog(e,t,r){let i=new Date,{enabled:s}=this.callKit.config.getTrackLogsConfig(),{userInfo:o}=this.callKit.config.getConfig(),a={agentId:o?.agentId,sessionId:o?.sessionId,...t?.content??{}},d={timestamp:i.toLocaleString().replace("T"," ").replace(".000Z",""),level:r,message:e,caller:t?.caller,type:t?.type,content:a},h=qa(d);return s&&this.pendingTrackLogs.push(h),this.callKit.trigger(H.KIT_LOG,h,!0),h}};var Mn="0.21.1";var he=class extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}};var ct=class extends he{constructor(e){super(e||"Unsupported content type.")}};var Fe=class extends he{constructor(e){super(e||"Request pending.")}};var Er=class extends he{constructor(e){super(e||"Unspecified session description handler error.")}};var wt=class extends he{constructor(){super("The session has terminated.")}};var ze=class extends he{constructor(e){super(e||"An error occurred during state transition.")}};var wr=class{constructor(e){this.incomingAckRequest=e}get request(){return this.incomingAckRequest.message}};var Tr=class{constructor(e){this.incomingByeRequest=e}get request(){return this.incomingByeRequest.message}accept(e){return this.incomingByeRequest.accept(e),Promise.resolve()}reject(e){return this.incomingByeRequest.reject(e),Promise.resolve()}};var Rr=class{constructor(e){this.incomingCancelRequest=e}get request(){return this.incomingCancelRequest}};var He=class{constructor(){this.listeners=new Array}addListener(e,t){let r=i=>{this.removeListener(r),e(i)};t?.once===!0?this.listeners.push(r):this.listeners.push(e)}emit(e){this.listeners.slice().forEach(t=>t(e))}removeAllListeners(){this.listeners=[]}removeListener(e){this.listeners=this.listeners.filter(t=>t!==e)}on(e){return this.addListener(e)}off(e){return this.removeListener(e)}once(e){return this.addListener(e,{once:!0})}};var Sr=class{constructor(e){this.incomingInfoRequest=e}get request(){return this.incomingInfoRequest.message}accept(e){return this.incomingInfoRequest.accept(e),Promise.resolve()}reject(e){return this.incomingInfoRequest.reject(e),Promise.resolve()}};var Tt=class{constructor(e){this.parameters={};for(let t in e)e.hasOwnProperty(t)&&this.setParam(t,e[t])}setParam(e,t){e&&(this.parameters[e.toLowerCase()]=typeof t>"u"||t===null?null:t.toString())}getParam(e){if(e)return this.parameters[e.toLowerCase()]}hasParam(e){return!!(e&&this.parameters[e.toLowerCase()]!==void 0)}deleteParam(e){if(e=e.toLowerCase(),this.hasParam(e)){let t=this.parameters[e];return delete this.parameters[e],t}}clearParams(){this.parameters={}}};var ee=class extends Tt{constructor(e,t,r){super(r),this.uri=e,this._displayName=t}get friendlyName(){return this.displayName||this.uri.aor}get displayName(){return this._displayName}set displayName(e){this._displayName=e}clone(){return new ee(this.uri.clone(),this._displayName,JSON.parse(JSON.stringify(this.parameters)))}toString(){let e=this.displayName||this.displayName==="0"?'"'+this.displayName+'" ':"";e+="<"+this.uri.toString()+">";for(let t in this.parameters)this.parameters.hasOwnProperty(t)&&(e+=";"+t,this.parameters[t]!==null&&(e+="="+this.parameters[t]));return e}};var ue=class extends Tt{constructor(e="sip",t,r,i,s,o){if(super(s||{}),this.headers={},!r)throw new TypeError('missing or invalid "host" parameter');for(let a in o)o.hasOwnProperty(a)&&this.setHeader(a,o[a]);this.raw={scheme:e,user:t,host:r,port:i},this.normal={scheme:e.toLowerCase(),user:t,host:r.toLowerCase(),port:i}}get scheme(){return this.normal.scheme}set scheme(e){this.raw.scheme=e,this.normal.scheme=e.toLowerCase()}get user(){return this.normal.user}set user(e){this.normal.user=this.raw.user=e}get host(){return this.normal.host}set host(e){this.raw.host=e,this.normal.host=e.toLowerCase()}get aor(){return this.normal.user+"@"+this.normal.host}get port(){return this.normal.port}set port(e){this.normal.port=this.raw.port=e}setHeader(e,t){this.headers[this.headerize(e)]=t instanceof Array?t:[t]}getHeader(e){if(e)return this.headers[this.headerize(e)]}hasHeader(e){return!!e&&!!this.headers.hasOwnProperty(this.headerize(e))}deleteHeader(e){if(e=this.headerize(e),this.headers.hasOwnProperty(e)){let t=this.headers[e];return delete this.headers[e],t}}clearHeaders(){this.headers={}}clone(){return new ue(this._raw.scheme,this._raw.user||"",this._raw.host,this._raw.port,JSON.parse(JSON.stringify(this.parameters)),JSON.parse(JSON.stringify(this.headers)))}toRaw(){return this._toString(this._raw)}toString(){return this._toString(this._normal)}get _normal(){return this.normal}get _raw(){return this.raw}_toString(e){let t=e.scheme+":";e.scheme.toLowerCase().match("^sips?$")||(t+="//"),e.user&&(t+=this.escapeUser(e.user)+"@"),t+=e.host,(e.port||e.port===0)&&(t+=":"+e.port);for(let i in this.parameters)this.parameters.hasOwnProperty(i)&&(t+=";"+i,this.parameters[i]!==null&&(t+="="+this.parameters[i]));let r=[];for(let i in this.headers)if(this.headers.hasOwnProperty(i))for(let s in this.headers[i])this.headers[i].hasOwnProperty(s)&&r.push(i+"="+this.headers[i][s]);return r.length>0&&(t+="?"+r.join("&")),t}escapeUser(e){let t;try{t=decodeURIComponent(e)}catch(r){throw r}return encodeURIComponent(t).replace(/%3A/ig,":").replace(/%2B/ig,"+").replace(/%3F/ig,"?").replace(/%2F/ig,"/")}headerize(e){let t={"Call-Id":"Call-ID",Cseq:"CSeq","Min-Se":"Min-SE",Rack:"RAck",Rseq:"RSeq","Www-Authenticate":"WWW-Authenticate"},r=e.toLowerCase().replace(/_/g,"-").split("-"),i=r.length,s="";for(let o=0;o<i;o++)o!==0&&(s+="-"),s+=r[o].charAt(0).toUpperCase()+r[o].substring(1);return t[s]&&(s=t[s]),s}};function Oi(n,e){if(n.scheme!==e.scheme||n.user!==e.user||n.host!==e.host||n.port!==e.port)return!1;function t(s,o){let a=Object.keys(s.parameters),d=Object.keys(o.parameters);return!(!a.filter(l=>d.includes(l)).every(l=>s.parameters[l]===o.parameters[l])||!["user","ttl","method","transport"].every(l=>s.hasParam(l)&&o.hasParam(l)||!s.hasParam(l)&&!o.hasParam(l))||!["maddr"].every(l=>s.hasParam(l)&&o.hasParam(l)||!s.hasParam(l)&&!o.hasParam(l)))}if(!t(n,e))return!1;let r=Object.keys(n.headers),i=Object.keys(e.headers);if(r.length!==0||i.length!==0){if(r.length!==i.length)return!1;let s=r.filter(o=>i.includes(o));if(s.length!==i.length||!s.every(o=>n.headers[o].length&&e.headers[o].length&&n.headers[o][0]===e.headers[o][0]))return!1}return!0}function ki(n,e,t){return t=t||" ",n.length>e?n:(e-=n.length,t+=t.repeat(e),n+t.slice(0,e))}var Ke=class extends Error{constructor(e,t,r,i){super(),this.message=e,this.expected=t,this.found=r,this.location=i,this.name="SyntaxError",typeof Object.setPrototypeOf=="function"?Object.setPrototypeOf(this,Ke.prototype):this.__proto__=Ke.prototype,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Ke)}static buildMessage(e,t){function r(h){return h.charCodeAt(0).toString(16).toUpperCase()}function i(h){return h.replace(/\\/g,"\\\\").replace(/"/g,'\\"').replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,l=>"\\x0"+r(l)).replace(/[\x10-\x1F\x7F-\x9F]/g,l=>"\\x"+r(l))}function s(h){return h.replace(/\\/g,"\\\\").replace(/\]/g,"\\]").replace(/\^/g,"\\^").replace(/-/g,"\\-").replace(/\0/g,"\\0").replace(/\t/g,"\\t").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/[\x00-\x0F]/g,l=>"\\x0"+r(l)).replace(/[\x10-\x1F\x7F-\x9F]/g,l=>"\\x"+r(l))}function o(h){switch(h.type){case"literal":return'"'+i(h.text)+'"';case"class":let l=h.parts.map(u=>Array.isArray(u)?s(u[0])+"-"+s(u[1]):s(u));return"["+(h.inverted?"^":"")+l+"]";case"any":return"any character";case"end":return"end of input";case"other":return h.description}}function a(h){let l=h.map(o),u,T;if(l.sort(),l.length>0){for(u=1,T=1;u<l.length;u++)l[u-1]!==l[u]&&(l[T]=l[u],T++);l.length=T}switch(l.length){case 1:return l[0];case 2:return l[0]+" or "+l[1];default:return l.slice(0,-1).join(", ")+", or "+l[l.length-1]}}function d(h){return h?'"'+i(h)+'"':"end of input"}return"Expected "+a(e)+" but "+d(t)+" found."}format(e){let t="Error: "+this.message;if(this.location){let r=null,i;for(i=0;i<e.length;i++)if(e[i].source===this.location.source){r=e[i].text.split(/\r\n|\n|\r/g);break}let s=this.location.start,o=this.location.source+":"+s.line+":"+s.column;if(r){let a=this.location.end,d=ki("",s.line.toString().length," "),h=r[s.line-1],l=s.line===a.line?a.column:h.length+1;t+=`
|
|
@@ -62,4 +62,4 @@ a=mid:`+s}),r.forEach((i,s)=>{t&&t[s]&&(r[s]=i+t[s])}),e=r.join(""),n.sdp=e}retu
|
|
|
62
62
|
`)):e=e.replace(/(m=[^\r]*\r\n)/g,`$1a=sendonly\r
|
|
63
63
|
`)),Promise.resolve({sdp:e,type:t})}function Xa(n){if(n.length<2)throw new Error("Start local conference requires at leaast 2 sessions.");(t=>t.map((r,i)=>t.slice(i+1).map(s=>[r,s])).reduce((r,i)=>r.concat(i),[]))(n.map(t=>t.sessionDescriptionHandler)).forEach(([t,r])=>{if(!(t instanceof ge&&r instanceof ge))throw new Error("Session description handler not instance of SessionManagerSessionDescriptionHandler");t.joinWith(r)})}var ge=class extends re{constructor(e,t,r){super(e,t,r),ge.audioContext||(ge.audioContext=new AudioContext)}enableSenderTracks(e){let t=this.localMediaStreamReal;if(t===void 0)throw new Error("Stream undefined.");t.getAudioTracks().forEach(r=>{r.enabled=e})}initLocalMediaStream(e){if(!ge.audioContext)throw new Error("SessionManagerSessionDescriptionHandler.audioContext undefined.");return this.localMediaStreamReal=e,this.localMediaStreamSourceNode=ge.audioContext.createMediaStreamSource(e),this.localMediaStreamDestinationNode=ge.audioContext.createMediaStreamDestination(),this.localMediaStreamSourceNode.connect(this.localMediaStreamDestinationNode),this.localMediaStreamDestinationNode.stream}joinWith(e){if(!ge.audioContext)throw new Error("SessionManagerSessionDescriptionHandler.audioContext undefined.");let t=ge.audioContext.createMediaStreamSource(this.remoteMediaStream),r=e.localMediaStreamDestinationNode;if(r===void 0)throw new Error("Peer outbound (local) stream local media stream destination is undefined.");t.connect(r);let i=ge.audioContext.createMediaStreamSource(e.remoteMediaStream),s=this.localMediaStreamDestinationNode;if(s===void 0)throw new Error("Our outbound (local) stream local media stream destination is undefined.");i.connect(s)}setRealLocalMediaStream(e){if(!ge.audioContext)throw new Error("SessionManagerSessionDescriptionHandler.audioContext undefined.");if(!this.localMediaStreamReal){this.initLocalMediaStream(e);return}if(!this.localMediaStreamDestinationNode||!this.localMediaStreamSourceNode||!this.localMediaStreamReal)throw new Error("Local media stream undefined.");this.localMediaStreamReal=e,this.localMediaStreamSourceNode.disconnect(this.localMediaStreamDestinationNode),this.localMediaStreamSourceNode=ge.audioContext.createMediaStreamSource(e),this.localMediaStreamSourceNode.connect(this.localMediaStreamDestinationNode)}};function Ui(){return(n,e)=>({session:e,held:!1,muted:!1})}var dt=class{constructor(e,t={}){this.managedSessions=[],this.attemptingReconnection=!1,this.optionsPingFailure=!1,this.optionsPingRunning=!1,this.shouldBeConnected=!1,this.shouldBeRegistered=!1,this.delegate=t.delegate,this.options=Object.assign({aor:"",autoStop:!0,delegate:{},iceStopWaitingOnServerReflexive:!1,managedSessionFactory:Ui(),maxSimultaneousSessions:2,media:{},optionsPingInterval:-1,optionsPingRequestURI:"",reconnectionAttempts:3,reconnectionDelay:4,registrationRetry:!1,registrationRetryInterval:3,registerGuard:null,registererOptions:{},registererRegisterOptions:{},sendDTMFUsingSessionDescriptionHandler:!1,userAgentOptions:{}},dt.stripUndefinedProperties(t));let r=Object.assign({},t.userAgentOptions);if(r.transportConstructor||(r.transportConstructor=Be),r.transportOptions||(r.transportOptions={server:e}),!r.uri&&t.aor){let i=ce.makeURI(t.aor);if(!i)throw new Error(`Failed to create valid URI from ${t.aor}`);r.uri=i}if(this.userAgent=new ce(r),this.userAgent.delegate={onConnect:()=>{this.logger.log("Connected"),this.delegate&&this.delegate.onServerConnect&&this.delegate.onServerConnect(),this.shouldBeRegistered&&this.register(),this.options.optionsPingInterval>0&&this.optionsPingStart()},onDisconnect:async i=>{this.logger.log("Disconnected");let s=!1;this.options.optionsPingInterval>0&&(s=this.optionsPingFailure,this.optionsPingFailure=!1,this.optionsPingStop()),this.delegate&&this.delegate.onServerDisconnect&&this.delegate.onServerDisconnect(i),(i||s)&&(this.registerer&&(this.logger.log("Disposing of registerer..."),this.registerer.dispose().catch(o=>{this.logger.debug("Error occurred disposing of registerer after connection with server was lost."),this.logger.debug(o.toString())}),this.registerer=void 0),this.managedSessions.slice().map(o=>o.session).forEach(async o=>{this.logger.log("Disposing of session..."),o.dispose().catch(a=>{this.logger.debug("Error occurred disposing of a session after connection with server was lost."),this.logger.debug(a.toString())})}),this.shouldBeConnected&&this.attemptReconnection())},onInvite:i=>{this.logger.log(`[${i.id}] Received INVITE`);let s=this.options.maxSimultaneousSessions;if(s!==0&&this.managedSessions.length>s){this.logger.warn(`[${i.id}] Session already in progress, rejecting INVITE...`),i.reject().then(()=>{this.logger.log(`[${i.id}] Rejected INVITE`)}).catch(a=>{this.logger.error(`[${i.id}] Failed to reject INVITE`),this.logger.error(a.toString())});return}let o={sessionDescriptionHandlerOptions:{constraints:this.constraints}};this.initSession(i,o),this.delegate&&this.delegate.onCallReceived?this.delegate.onCallReceived(i):(this.logger.warn(`[${i.id}] No handler available, rejecting INVITE...`),i.reject().then(()=>{this.logger.log(`[${i.id}] Rejected INVITE`)}).catch(a=>{this.logger.error(`[${i.id}] Failed to reject INVITE`),this.logger.error(a.toString())}))},onMessage:i=>{i.accept().then(()=>{this.delegate&&this.delegate.onMessageReceived&&this.delegate.onMessageReceived(i)})},onNotify:i=>{i.accept().then(()=>{this.delegate&&this.delegate.onNotificationReceived&&this.delegate.onNotificationReceived(i)})}},this.registererOptions=Object.assign({},t.registererOptions),this.registererRegisterOptions=Object.assign({},t.registererRegisterOptions),this.options.registrationRetry){this.registererRegisterOptions.requestDelegate=this.registererRegisterOptions.requestDelegate||{};let i=this.registererRegisterOptions.requestDelegate.onReject;this.registererRegisterOptions.requestDelegate.onReject=s=>{i&&i(s),this.attemptRegistration()}}this.logger=this.userAgent.getLogger("sip.SessionManager"),window.addEventListener("online",()=>{this.logger.log("Online"),this.shouldBeConnected&&this.connect()}),this.options.autoStop&&window.addEventListener("beforeunload",async()=>{this.shouldBeConnected=!1,this.shouldBeRegistered=!1,this.userAgent.state!==X.Stopped&&await this.userAgent.stop()})}static stripUndefinedProperties(e){return Object.keys(e).reduce((t,r)=>(e[r]!==void 0&&(t[r]=e[r]),t),{})}getLocalMediaStream(e){let t=e.sessionDescriptionHandler;if(t){if(!(t instanceof re))throw new Error("Session description handler not instance of web SessionDescriptionHandler");return t.localMediaStream}}getRemoteMediaStream(e){let t=e.sessionDescriptionHandler;if(t){if(!(t instanceof re))throw new Error("Session description handler not instance of web SessionDescriptionHandler");return t.remoteMediaStream}}getLocalAudioTrack(e){var t;return(t=this.getLocalMediaStream(e))===null||t===void 0?void 0:t.getTracks().find(r=>r.kind==="audio")}getLocalVideoTrack(e){var t;return(t=this.getLocalMediaStream(e))===null||t===void 0?void 0:t.getTracks().find(r=>r.kind==="video")}getRemoteAudioTrack(e){var t;return(t=this.getRemoteMediaStream(e))===null||t===void 0?void 0:t.getTracks().find(r=>r.kind==="audio")}getRemoteVideoTrack(e){var t;return(t=this.getRemoteMediaStream(e))===null||t===void 0?void 0:t.getTracks().find(r=>r.kind==="video")}async connect(){return this.logger.log("Connecting UserAgent..."),this.shouldBeConnected=!0,this.userAgent.state!==X.Started?this.userAgent.start():this.userAgent.reconnect()}async disconnect(){return this.logger.log("Disconnecting UserAgent..."),this.userAgent.state===X.Stopped?Promise.resolve():(this.shouldBeConnected=!1,this.shouldBeRegistered=!1,this.registerer=void 0,this.userAgent.stop())}isConnected(){return this.userAgent.isConnected()}async register(e){return this.logger.log("Registering UserAgent..."),this.shouldBeRegistered=!0,e!==void 0&&(this.registererRegisterOptions=Object.assign({},e)),this.registerer||(this.registerer=new Ce(this.userAgent,this.registererOptions),this.registerer.stateChange.addListener(t=>{switch(t){case M.Initial:break;case M.Registered:this.delegate&&this.delegate.onRegistered&&this.delegate.onRegistered();break;case M.Unregistered:this.delegate&&this.delegate.onUnregistered&&this.delegate.onUnregistered(),this.shouldBeRegistered&&this.attemptRegistration();break;case M.Terminated:break;default:throw new Error("Unknown registerer state.")}})),this.attemptRegistration(!0)}async unregister(e){return this.logger.log("Unregistering UserAgent..."),this.shouldBeRegistered=!1,this.registerer?this.registerer.unregister(e).then(()=>{}):(this.logger.warn("No registerer to unregister."),Promise.resolve())}async call(e,t,r){this.logger.log("Beginning Session...");let i=this.options.maxSimultaneousSessions;if(i!==0&&this.managedSessions.length>i)return Promise.reject(new Error("Maximum number of sessions already exists."));let s=ce.makeURI(e);if(!s)return Promise.reject(new Error(`Failed to create a valid URI from "${e}"`));if(t||(t={}),t.sessionDescriptionHandlerOptions||(t.sessionDescriptionHandlerOptions={}),t.sessionDescriptionHandlerOptions.constraints||(t.sessionDescriptionHandlerOptions.constraints=this.constraints),t.earlyMedia){r=r||{},r.requestDelegate=r.requestDelegate||{};let a=r.requestDelegate.onProgress;r.requestDelegate.onProgress=d=>{d.message.statusCode===183&&this.setupRemoteMedia(o),a&&a(d)}}this.options.iceStopWaitingOnServerReflexive&&(t.delegate=t.delegate||{},t.delegate.onSessionDescriptionHandler=a=>{if(!(a instanceof re))throw new Error("Session description handler not instance of SessionDescriptionHandler");a.peerConnectionDelegate={onicecandidate:d=>{var h;((h=d.candidate)===null||h===void 0?void 0:h.type)==="srflx"&&(this.logger.log(`[${o.id}] Found srflx ICE candidate, stop waiting...`),a.iceGatheringComplete())}}});let o=new tt(this.userAgent,s,t);return this.sendInvite(o,t,r).then(()=>o)}async hangup(e){return this.logger.log(`[${e.id}] Hangup...`),this.sessionExists(e)?this.terminate(e):Promise.reject(new Error("Session does not exist."))}async answer(e,t){return this.logger.log(`[${e.id}] Accepting Invitation...`),this.sessionExists(e)?e instanceof Ge?(t||(t={}),t.sessionDescriptionHandlerOptions||(t.sessionDescriptionHandlerOptions={}),t.sessionDescriptionHandlerOptions.constraints||(t.sessionDescriptionHandlerOptions.constraints=this.constraints),e.accept(t)):Promise.reject(new Error("Session not instance of Invitation.")):Promise.reject(new Error("Session does not exist."))}async decline(e){return this.logger.log(`[${e.id}] Rejecting Invitation...`),this.sessionExists(e)?e instanceof Ge?e.reject():Promise.reject(new Error("Session not instance of Invitation.")):Promise.reject(new Error("Session does not exist."))}async hold(e){return this.logger.log(`[${e.id}] Holding session...`),this.setHold(e,!0)}async unhold(e){return this.logger.log(`[${e.id}] Unholding session...`),this.setHold(e,!1)}isHeld(e){let t=this.sessionManaged(e);return t?t.held:!1}mute(e){this.logger.log(`[${e.id}] Disabling media tracks...`),this.setMute(e,!0)}unmute(e){this.logger.log(`[${e.id}] Enabling media tracks...`),this.setMute(e,!1)}isMuted(e){let t=this.sessionManaged(e);return t?t.muted:!1}async sendDTMF(e,t){if(this.logger.log(`[${e.id}] Sending DTMF...`),!/^[0-9A-D#*,]$/.exec(t))return Promise.reject(new Error("Invalid DTMF tone."));if(!this.sessionExists(e))return Promise.reject(new Error("Session does not exist."));if(this.logger.log(`[${e.id}] Sending DTMF tone: ${t}`),this.options.sendDTMFUsingSessionDescriptionHandler)return e.sessionDescriptionHandler?e.sessionDescriptionHandler.sendDtmf(t)?Promise.resolve():Promise.reject(new Error("Failed to send DTMF")):Promise.reject(new Error("Session desciption handler undefined."));{let r=t,i=2e3,o={body:{contentDisposition:"render",contentType:"application/dtmf-relay",content:"Signal="+r+`\r
|
|
64
64
|
Duration=`+i}};return e.info({requestOptions:o}).then(()=>{})}}async transfer(e,t,r){if(this.logger.log(`[${e.id}] Referring session...`),t instanceof qe)return e.refer(t,r).then(()=>{});let i=ce.makeURI(t);return i?e.refer(i,r).then(()=>{}):Promise.reject(new Error(`Failed to create a valid URI from "${t}"`))}async message(e,t){this.logger.log("Sending message...");let r=ce.makeURI(e);return r?new Ir(this.userAgent,r,t).message():Promise.reject(new Error(`Failed to create a valid URI from "${e}"`))}get constraints(){let e={audio:!0,video:!1};return this.options.media.constraints&&(e=Object.assign({},this.options.media.constraints)),e}attemptReconnection(e=1){let t=this.options.reconnectionAttempts,r=this.options.reconnectionDelay;if(!this.shouldBeConnected){this.logger.log("Should not be connected currently");return}if(this.attemptingReconnection&&this.logger.log("Reconnection attempt already in progress"),e>t){this.logger.log("Reconnection maximum attempts reached");return}e===1?this.logger.log(`Reconnection attempt ${e} of ${t} - trying`):this.logger.log(`Reconnection attempt ${e} of ${t} - trying in ${r} seconds`),this.attemptingReconnection=!0,setTimeout(()=>{if(!this.shouldBeConnected){this.logger.log(`Reconnection attempt ${e} of ${t} - aborted`),this.attemptingReconnection=!1;return}this.userAgent.reconnect().then(()=>{this.logger.log(`Reconnection attempt ${e} of ${t} - succeeded`),this.attemptingReconnection=!1}).catch(i=>{this.logger.log(`Reconnection attempt ${e} of ${t} - failed`),this.logger.error(i.message),this.attemptingReconnection=!1,this.attemptReconnection(++e)})},e===1?0:r*1e3)}attemptRegistration(e=!1){if(this.logger.log(`Registration attempt ${e?"without delay":""}`),!this.shouldBeRegistered)return this.logger.log("Should not be registered currently"),Promise.resolve();if(this.registrationAttemptTimeout!==void 0)return this.logger.log("Registration attempt already in progress"),Promise.resolve();let t=()=>this.registerer?this.isConnected()?this.userAgent.state===X.Stopped?(this.logger.log("User agent stopped"),Promise.resolve()):this.options.registerGuard?this.options.registerGuard().catch(i=>{throw this.logger.log("Register guard rejected will making registration attempt"),i}).then(i=>i||!this.registerer?Promise.resolve():this.registerer.register(this.registererRegisterOptions).then(()=>{})):this.registerer.register(this.registererRegisterOptions).then(()=>{}):(this.logger.log("User agent not connected"),Promise.resolve()):(this.logger.log("Registerer undefined"),Promise.resolve()),r=i=>{let s=i*2;return 1e3*(Math.random()*(s-i)+i)};return new Promise((i,s)=>{this.registrationAttemptTimeout=setTimeout(()=>{t().then(()=>{this.registrationAttemptTimeout=void 0,i()}).catch(o=>{this.registrationAttemptTimeout=void 0,o instanceof Fe?i():s(o)})},e?0:r(this.options.registrationRetryInterval))})}cleanupMedia(e){let t=this.sessionManaged(e);if(!t)throw new Error("Managed session does not exist.");t.mediaLocal&&t.mediaLocal.video&&(t.mediaLocal.video.srcObject=null,t.mediaLocal.video.pause()),t.mediaRemote&&(t.mediaRemote.audio&&(t.mediaRemote.audio.srcObject=null,t.mediaRemote.audio.pause()),t.mediaRemote.video&&(t.mediaRemote.video.srcObject=null,t.mediaRemote.video.pause()))}enableReceiverTracks(e,t){if(!this.sessionExists(e))throw new Error("Session does not exist.");let r=e.sessionDescriptionHandler;if(!(r instanceof re))throw new Error("Session's session description handler not instance of SessionDescriptionHandler.");r.enableReceiverTracks(t)}enableSenderTracks(e,t){if(!this.sessionExists(e))throw new Error("Session does not exist.");let r=e.sessionDescriptionHandler;if(!(r instanceof re))throw new Error("Session's session description handler not instance of SessionDescriptionHandler.");r.enableSenderTracks(t)}initSession(e,t){this.sessionAdd(e),this.delegate&&this.delegate.onCallCreated&&this.delegate.onCallCreated(e),e.stateChange.addListener(r=>{switch(this.logger.log(`[${e.id}] Session state changed to ${r}`),r){case v.Initial:break;case v.Establishing:break;case v.Established:this.setupLocalMedia(e),this.setupRemoteMedia(e),this.delegate&&this.delegate.onCallAnswered&&this.delegate.onCallAnswered(e);break;case v.Terminating:case v.Terminated:this.sessionExists(e)&&(this.cleanupMedia(e),this.sessionRemove(e),this.delegate&&this.delegate.onCallHangup&&this.delegate.onCallHangup(e));break;default:throw new Error("Unknown session state.")}}),e.delegate=e.delegate||{},e.delegate.onInfo=r=>{var i;if(((i=this.delegate)===null||i===void 0?void 0:i.onCallDTMFReceived)===void 0){r.reject();return}let s=r.request.getHeader("content-type");if(!s||!/^application\/dtmf-relay/i.exec(s)){r.reject();return}let o=r.request.body.split(`\r
|
|
65
|
-
`,2);if(o.length!==2){r.reject();return}let a,d=/^(Signal\s*?=\s*?)([0-9A-D#*]{1})(\s)?.*/;if(o[0]!==void 0&&d.test(o[0])&&(a=o[0].replace(d,"$2")),!a){r.reject();return}let h,l=/^(Duration\s?=\s?)([0-9]{1,4})(\s)?.*/;if(o[1]!==void 0&&l.test(o[1])&&(h=parseInt(o[1].replace(l,"$2"),10)),!h){r.reject();return}r.accept().then(()=>{if(this.delegate&&this.delegate.onCallDTMFReceived){if(!a||!h)throw new Error("Tone or duration undefined.");this.delegate.onCallDTMFReceived(e,a,h)}}).catch(u=>{this.logger.error(u.message)})},e.delegate.onRefer=r=>{r.accept().then(()=>this.sendInvite(r.makeInviter(t),t)).catch(i=>{this.logger.error(i.message)})}}optionsPingRun(e,t,r){if(this.options.optionsPingInterval<1)throw new Error("Invalid options ping interval.");this.optionsPingRunning||(this.optionsPingRunning=!0,this.optionsPingTimeout=setTimeout(()=>{this.optionsPingTimeout=void 0;let i=()=>{this.optionsPingFailure=!1,this.optionsPingRunning&&(this.optionsPingRunning=!1,this.optionsPingRun(e,t,r))},s=()=>{this.logger.error("OPTIONS ping failed"),this.optionsPingFailure=!0,this.optionsPingRunning=!1,this.userAgent.transport.disconnect().catch(d=>this.logger.error(d))},o=this.userAgent.userAgentCore,a=o.makeOutgoingRequestMessage("OPTIONS",e,t,r,{});this.optionsPingRequest=o.request(a,{onAccept:()=>{this.optionsPingRequest=void 0,i()},onReject:d=>{this.optionsPingRequest=void 0,d.message.statusCode===408||d.message.statusCode===503?s():i()}})},this.options.optionsPingInterval*1e3))}optionsPingStart(){this.logger.log("OPTIONS pings started");let e,t,r;if(this.options.optionsPingRequestURI){if(e=ce.makeURI(this.options.optionsPingRequestURI),!e)throw new Error("Failed to create Request URI.");t=this.userAgent.contact.uri.clone(),r=this.userAgent.contact.uri.clone()}else if(this.options.aor){let i=ce.makeURI(this.options.aor);if(!i)throw new Error("Failed to create URI.");e=i.clone(),e.user=void 0,t=i.clone(),r=i.clone()}else{this.logger.error("You have enabled sending OPTIONS pings and as such you must provide either a) an AOR to register, or b) an RURI to use for the target of the OPTIONS ping requests. ");return}this.optionsPingRun(e,t,r)}optionsPingStop(){this.logger.log("OPTIONS pings stopped"),this.optionsPingRunning=!1,this.optionsPingFailure=!1,this.optionsPingRequest&&(this.optionsPingRequest.dispose(),this.optionsPingRequest=void 0),this.optionsPingTimeout&&(clearTimeout(this.optionsPingTimeout),this.optionsPingTimeout=void 0)}async sendInvite(e,t,r){return this.initSession(e,t),e.invite(r).then(()=>{this.logger.log(`[${e.id}] Sent INVITE`)})}sessionAdd(e){let t=this.options.managedSessionFactory(this,e);this.managedSessions.push(t)}sessionExists(e){return this.sessionManaged(e)!==void 0}sessionManaged(e){return this.managedSessions.find(t=>t.session.id===e.id)}sessionRemove(e){this.managedSessions=this.managedSessions.filter(t=>t.session.id!==e.id)}async setHold(e,t){if(!this.sessionExists(e))return Promise.reject(new Error("Session does not exist."));if(this.isHeld(e)===t)return Promise.resolve();if(!(e.sessionDescriptionHandler instanceof re))throw new Error("Session's session description handler not instance of SessionDescriptionHandler.");let i={requestDelegate:{onAccept:()=>{let a=this.sessionManaged(e);a!==void 0&&(a.held=t,this.enableReceiverTracks(e,!a.held),this.enableSenderTracks(e,!a.held&&!a.muted),this.delegate&&this.delegate.onCallHold&&this.delegate.onCallHold(e,a.held))},onReject:()=>{this.logger.warn(`[${e.id}] Re-invite request was rejected`);let a=this.sessionManaged(e);a!==void 0&&(a.held=!t,this.enableReceiverTracks(e,!a.held),this.enableSenderTracks(e,!a.held&&!a.muted),this.delegate&&this.delegate.onCallHold&&this.delegate.onCallHold(e,a.held))}}},s=e.sessionDescriptionHandlerOptionsReInvite;s.hold=t,e.sessionDescriptionHandlerOptionsReInvite=s;let o=this.sessionManaged(e);if(!o)throw new Error("Managed session is undefiend.");return o.held=t,e.invite(i).then(()=>{let a=this.sessionManaged(e);a!==void 0&&(this.enableReceiverTracks(e,!a.held),this.enableSenderTracks(e,!a.held&&!a.muted))}).catch(a=>{throw o.held=!t,a instanceof Fe&&this.logger.error(`[${e.id}] A hold request is already in progress.`),a})}setMute(e,t){if(!this.sessionExists(e)){this.logger.warn(`[${e.id}] A session is required to enabled/disable media tracks`);return}if(e.state!==v.Established){this.logger.warn(`[${e.id}] An established session is required to enable/disable media tracks`);return}let r=this.sessionManaged(e);r!==void 0&&(r.muted=t,this.enableSenderTracks(e,!r.held&&!r.muted))}setupLocalMedia(e){let t=this.sessionManaged(e);if(!t)throw new Error("Managed session does not exist.");let r=typeof this.options.media.local=="function"?this.options.media.local(e):this.options.media.local;t.mediaLocal=r;let i=r?.video;if(i){let s=this.getLocalMediaStream(e);if(!s)throw new Error("Local media stream undefiend.");i.srcObject=s,i.volume=0,i.play().catch(o=>{this.logger.error(`[${e.id}] Failed to play local media`),this.logger.error(o.message)})}}setupRemoteMedia(e){let t=this.sessionManaged(e);if(!t)throw new Error("Managed session does not exist.");let r=typeof this.options.media.remote=="function"?this.options.media.remote(e):this.options.media.remote;t.mediaRemote=r;let i=r?.video||r?.audio;if(i){let s=this.getRemoteMediaStream(e);if(!s)throw new Error("Remote media stream undefiend.");i.autoplay=!0,i.srcObject=s,i.play().catch(o=>{this.logger.error(`[${e.id}] Failed to play remote media`),this.logger.error(o.message)}),s.onaddtrack=()=>{this.logger.log("Remote media onaddtrack"),i.load(),i.play().catch(o=>{this.logger.error(`[${e.id}] Failed to play remote media`),this.logger.error(o.message)})}}}async terminate(e){switch(this.logger.log(`[${e.id}] Terminating...`),e.state){case v.Initial:if(e instanceof tt)return e.cancel().then(()=>{this.logger.log(`[${e.id}] Inviter never sent INVITE (canceled)`)});if(e instanceof Ge)return e.reject().then(()=>{this.logger.log(`[${e.id}] Invitation rejected (sent 480)`)});throw new Error("Unknown session type.");case v.Establishing:if(e instanceof tt)return e.cancel().then(()=>{this.logger.log(`[${e.id}] Inviter canceled (sent CANCEL)`)});if(e instanceof Ge)return e.reject().then(()=>{this.logger.log(`[${e.id}] Invitation rejected (sent 480)`)});throw new Error("Unknown session type.");case v.Established:return e.bye().then(()=>{this.logger.log(`[${e.id}] Session ended (sent BYE)`)});case v.Terminating:break;case v.Terminated:break;default:throw new Error("Unknown state")}return this.logger.log(`[${e.id}] Terminating in state ${e.state}, no action taken`),Promise.resolve()}};var Bi=class{constructor(e,t={}){this.session=void 0,this.delegate=t.delegate,this.options=Object.assign({},t);let r={aor:this.options.aor,delegate:{onCallAnswered:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onCallAnswered)===null||s===void 0?void 0:s.call(i)},onCallCreated:i=>{var s,o;this.session=i,(o=(s=this.delegate)===null||s===void 0?void 0:s.onCallCreated)===null||o===void 0||o.call(s)},onCallReceived:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onCallReceived)===null||s===void 0?void 0:s.call(i)},onCallHangup:()=>{var i,s;this.session=void 0,!((i=this.delegate)===null||i===void 0)&&i.onCallHangup&&((s=this.delegate)===null||s===void 0||s.onCallHangup())},onCallHold:(i,s)=>{var o,a;return(a=(o=this.delegate)===null||o===void 0?void 0:o.onCallHold)===null||a===void 0?void 0:a.call(o,s)},onCallDTMFReceived:(i,s,o)=>{var a,d;return(d=(a=this.delegate)===null||a===void 0?void 0:a.onCallDTMFReceived)===null||d===void 0?void 0:d.call(a,s,o)},onMessageReceived:i=>{var s,o;return(o=(s=this.delegate)===null||s===void 0?void 0:s.onMessageReceived)===null||o===void 0?void 0:o.call(s,i.request.body)},onRegistered:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onRegistered)===null||s===void 0?void 0:s.call(i)},onUnregistered:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onUnregistered)===null||s===void 0?void 0:s.call(i)},onServerConnect:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onServerConnect)===null||s===void 0?void 0:s.call(i)},onServerDisconnect:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onServerDisconnect)===null||s===void 0?void 0:s.call(i)}},maxSimultaneousSessions:1,media:this.options.media,reconnectionAttempts:this.options.reconnectionAttempts,reconnectionDelay:this.options.reconnectionDelay,registererOptions:this.options.registererOptions,sendDTMFUsingSessionDescriptionHandler:this.options.sendDTMFUsingSessionDescriptionHandler,userAgentOptions:this.options.userAgentOptions};this.sessionManager=new dt(e,r),this.logger=this.sessionManager.userAgent.getLogger("sip.SimpleUser")}get id(){return this.options.userAgentOptions&&this.options.userAgentOptions.displayName||"Anonymous"}get localMediaStream(){return this.session&&this.sessionManager.getLocalMediaStream(this.session)}get remoteMediaStream(){return this.session&&this.sessionManager.getRemoteMediaStream(this.session)}get localAudioTrack(){return this.session&&this.sessionManager.getLocalAudioTrack(this.session)}get localVideoTrack(){return this.session&&this.sessionManager.getLocalVideoTrack(this.session)}get remoteAudioTrack(){return this.session&&this.sessionManager.getRemoteAudioTrack(this.session)}get remoteVideoTrack(){return this.session&&this.sessionManager.getRemoteVideoTrack(this.session)}connect(){return this.logger.log(`[${this.id}] Connecting UserAgent...`),this.sessionManager.connect()}disconnect(){return this.logger.log(`[${this.id}] Disconnecting UserAgent...`),this.sessionManager.disconnect()}isConnected(){return this.sessionManager.isConnected()}register(e){return this.logger.log(`[${this.id}] Registering UserAgent...`),this.sessionManager.register(e)}unregister(e){return this.logger.log(`[${this.id}] Unregistering UserAgent...`),this.sessionManager.unregister(e)}call(e,t,r){return this.logger.log(`[${this.id}] Beginning Session...`),this.session?Promise.reject(new Error("Session already exists.")):this.sessionManager.call(e,t,r).then(()=>{})}hangup(){return this.logger.log(`[${this.id}] Hangup...`),this.session?this.sessionManager.hangup(this.session).then(()=>{this.session=void 0}):Promise.reject(new Error("Session does not exist."))}answer(e){return this.logger.log(`[${this.id}] Accepting Invitation...`),this.session?this.sessionManager.answer(this.session,e):Promise.reject(new Error("Session does not exist."))}decline(){return this.logger.log(`[${this.id}] rejecting Invitation...`),this.session?this.sessionManager.decline(this.session):Promise.reject(new Error("Session does not exist."))}hold(){return this.logger.log(`[${this.id}] holding session...`),this.session?this.sessionManager.hold(this.session):Promise.reject(new Error("Session does not exist."))}unhold(){return this.logger.log(`[${this.id}] unholding session...`),this.session?this.sessionManager.unhold(this.session):Promise.reject(new Error("Session does not exist."))}isHeld(){return this.session?this.sessionManager.isHeld(this.session):!1}mute(){return this.logger.log(`[${this.id}] disabling media tracks...`),this.session&&this.sessionManager.mute(this.session)}unmute(){return this.logger.log(`[${this.id}] enabling media tracks...`),this.session&&this.sessionManager.unmute(this.session)}isMuted(){return this.session?this.sessionManager.isMuted(this.session):!1}sendDTMF(e){return this.logger.log(`[${this.id}] sending DTMF...`),this.session?this.sessionManager.sendDTMF(this.session,e):Promise.reject(new Error("Session does not exist."))}message(e,t){return this.logger.log(`[${this.id}] sending message...`),this.sessionManager.message(e,t)}};var Kn=n=>{let e=n["x-antaios-manual-extend_info"]||n["x-antaios-manual-extend-info"],t=null;try{if(e&&typeof e=="string"){let r=e.replace(/\\/g,"");return t=JSON.parse(r),t}}catch{return{}}};var Yr=6;function Qa(n){return n.replace(/(\w+):\s*'(.*?)'/g,'"$1": "$2"').replace(/'/g,'"')}var ji=n=>{n&&n.getTracks().forEach(e=>e.stop())},ec=()=>{typeof navigator.mediaDevices>"u"&&(navigator.mediaDevices={}),typeof navigator.mediaDevices.getUserMedia>"u"&&(navigator.mediaDevices.getUserMedia=n=>{let e=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return e?new Promise((t,r)=>{e.call(navigator,n,t,r)}):Promise.reject(new Error("Unable to obtain device permissions. Please check your browser settings or device permissions."))})},Jr=class{callKit;isMute=!1;isRegister=!1;isHold=!1;connectStatus=ne.init;currentSession;mediaStream;userAgent;registerer;isReConnected=!1;isOutgoing=!1;isUnprompted=!1;hasInvite=!1;constructor(e){this.callKit=e}get reconnectConfig(){return this.callKit.config.getReconnectConfig("sip")}currentCallId=null;getCurrentCallId(){return this.currentCallId}setOutgoing(e){this.isOutgoing!==e&&(this.callKit.logger.info("setOutgoing",{caller:"Connect.setOutgoing",content:{outgoing:e}}),this.isOutgoing=e)}setCallId(e){this.callKit.logger.info("setCallId",{caller:"Connect.setCallId",content:{callId:e}}),this.currentCallId=e,this.callKit.trigger(H.KIT_CALL_ID_CHANGE,e)}async reset(){if(this.setOutgoing(!1),this.isUnprompted=!1,this.hasInvite=!1,this.isHolding()&&await this.setHold(!1),this.isMuted()&&await this.setMute(!1),this.connectStatus!==ne.init&&this.setConnectStatus(ne.init),this.isRegistered()&&await this.unregister(),this.currentCallId&&this.setCallId(null),this.currentSession=void 0,this.mediaStream=void 0,this.userAgent=void 0,this.registerer=void 0,this.mediaStream)try{ji(this.mediaStream);let e=this.getAduioReference();e&&(e.pause(),e.srcObject=null)}catch(e){this.callKit.logger.error(e,{caller:"Connect.reset",content:{}})}this.setConnectStatus(ne.init),this.clearHeartbeat()}getAduioReference(){let{audioRef:e}=this.callKit.config.getConfig();return typeof e=="function"?e():e}async permission(){this.callKit.logger.info("permission",{caller:"Connect.permission",content:{permission:!0}}),ec();let e=await navigator.mediaDevices.getUserMedia({audio:!0});ji(e)}isConnecting(){return this.connectStatus===ne.connecting}isCalling(){return this.connectStatus===ne.calling}isRinging(){return this.connectStatus===ne.ringing}isHolding(){return this.isHold}isRegistered(){return this.isRegister}isMuted(){return this.isMute}isInit(){return this.connectStatus===ne.init}heartbeatInterval;heartbeatFlag=Yr;clearHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.heartbeatFlag=Yr}startHeartbeat(){this.heartbeatFlag=Yr,this.clearHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.heartbeatFlag-=1,this.heartbeatFlag<=0&&(this.heartbeatFlag=Yr,this.callKit.trigger(H.SIP_CONNECT_EVENT,{event:"OPTIONS_HEARTBEAT_EXPIRED"}))},1e3)}socketTriggerHangup(e){!this.isCalling()||e!==this.currentCallId||(this.callKit.logger.info("socketHangup trigger hangup",{caller:"Connect.socketHangup",content:{callId:e,currentCallId:this.currentCallId}}),this.callKit.hangup())}async register(){if(this.connectStatus!==ne.init){if(this.isRegistered()){this.callKit.logger.warn("connectStatus is registered",{caller:"Connect.register",content:{errCode:V.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.reset(),this.callKit.logger.error("connectStatus is not init",{caller:"Connect.register",content:{errCode:V.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.logger.info("connect register",{caller:"Connect.register",content:{connectStatus:this.connectStatus}}),await this.permission().catch(_=>{this.callKit.reset(),this.callKit.logger.error(_,{caller:"Connect.register",content:{errCode:V.WEBRTC_USER_MEDIA_ERROR}})});let{userInfo:e,constrains:t}=this.callKit.config.getConfig(),r=async()=>(this.mediaStream=await navigator.mediaDevices.getUserMedia(t),this.mediaStream),{userPart:i,fsIp:s,fsPort:o,iceInfo:a,wsUrl:d}=e,h={uri:ce.makeURI(`sip:${i}@${s}:${o}`),displayName:i,transportOptions:{wsServers:[d],traceSip:!0},logLevel:"error",allowLegacyNotifications:!0,contactName:i,sessionDescriptionHandlerFactory:Wr.defaultSessionDescriptionHandlerFactory(r),sessionDescriptionHandlerFactoryOptions:{constraints:t,iceGatheringTimeout:e.iceGatheringTimeout,peerConnectionConfiguration:{iceServers:JSON.parse(Qa(a))}}};this.callKit.logger.info("connect connectConfig",{caller:"Connect.register",content:h}),this.userAgent=new ce(h);let l=new MediaStream,u=_=>{let $=this.getAduioReference();this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.register.setupRemoteMedia",content:$}),_.sessionDescriptionHandler.peerConnection.getReceivers().forEach(N=>{N.track&&l.addTrack(N.track)}),$?($.srcObject=l,$.play().catch(N=>{this.callKit.logger.error(N.message,{caller:"Connect.register.setupRemoteMedia",content:{errCode:V.WEBRTC_AUDIO_PLAY_ERROR}})})):this.callKit.logger.error("video is not exist",{caller:"Connect.register",content:{errCode:V.WEBRTC_AUDIO_PLAYER_ERROR}})},T=(_,$)=>{let{that:N=this}=$,P=_.userAgentCore,k=P.receiveIncomingRequestFromTransport.bind(P);P.receiveIncomingRequestFromTransport=x=>(x.method==="OPTIONS"&&N.startHeartbeat(),N.callKit.logger.info(`SIP Receive: ${x?.method}`,{caller:"Connect.register.observeSocketStatus.receiveRequest",type:"SIP",content:{request:x}}),k(x));let C=P.receiveIncomingResponseFromTransport.bind(P);P.receiveIncomingResponseFromTransport=x=>(N.callKit.logger.info(`SIP Receive Response: ${x?.statusCode} ${x?.reasonPhrase}`,{caller:"Connect.register.observeSocketStatus.receiveResponse",type:"SIP",content:{response:x}}),C(x));let{transport:f}=_;if(f){let x=f.send.bind(f);f.send=w=>(N.callKit.logger.info("SIP send message",{caller:"Connect.register.observeSocketStatus",type:"SIP",content:{message:w.toString()}}),x(w))}},A={};this.registerer=new Ce(this.userAgent,A),this.registerer.stateChange.addListener(_=>{switch(_){case M.Initial:this.callKit.logger.info("registerer stateChange Initial",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:_,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(ne.init),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;case M.Registered:this.callKit.logger.info("registerer stateChange Registered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:_,isRegistered:this.isRegistered()}}),this.setRegister(!0),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;case M.Terminated:this.callKit.logger.info("registerer stateChange Terminated",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:_,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(ne.init),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;case M.Unregistered:this.callKit.logger.info("registerer stateChange Unregistered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{isRegistered:this.isRegistered(),registererState:_}}),this.setRegister(!1),this.setConnectStatus(ne.init),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;default:break}}),this.userAgent.delegate={onInvite:_=>{this.callKit.logger.info("connect onInvite",{type:"SIP",caller:"Connect.register.onInvite",content:{invite:_,isRegistered:this.isRegistered(),isOutgoing:this.isOutgoing}}),this.currentSession=_,this.currentSession.stateChange.addListener(k=>{switch(k){case v.Establishing:this.callKit.logger.info("connect Establishing",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:k}}),this.setConnectStatus(ne.ringing),this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()});break;case v.Established:this.callKit.logger.info("connect Established",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:k}}),this.callKit.connect.setConnectStatus(ne.calling),this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()}),u(this.currentSession);break;case v.Terminating:this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()});break;case v.Terminated:this.callKit.logger.info("connect Terminated",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:k}}),this.hasInvite=!1,this.isUnprompted||this.callKit.callCenter.callEnd(),this.isUnprompted=!1,this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()});break;default:break}});let $={sessionDescriptionHandlerOptions:{constraints:t,alwaysAcquireMediaFirst:!0}},N=()=>{let{request:k}=this.currentSession,C=Object.keys(k.headers),f={};return C.filter(x=>x.toLocaleLowerCase().startsWith("x-antaios")).forEach(x=>{f[x.toLocaleLowerCase()]=k.getHeader(x)}),this.callKit.logger.info("get invite data",{caller:"Connect.register.onInvite",content:f}),f},P=N();try{let k=Kn(P);k?.callUuid?this.setCallId(k.callUuid):(this.setCallId(null),this.callKit.logger.warn("call id is not exist",{caller:"Connect.register.onInvite",content:{inviteData:k}}))}catch(k){this.callKit.logger.info(k,{caller:"Connect.register.onInvite",content:P})}if(this.isOutgoing)this.currentSession.accept($),this.callKit.trigger(H.KIT_OUTGOING_INVITE,{getInviteData:N});else{this.hasInvite=!0;let k=()=>{this.currentSession?.state!==v.Terminated&&this.currentSession?.state!==v.Terminating&&this.currentSession.reject(),this.hasInvite=!1,this.callKit.callCenter.callEnd(!0,!1)};this.callKit.trigger(H.KIT_INVITE,{accept:()=>{this.callKit.trigger(H.CALL_CONNECTING,new Date),this.hasInvite=!1,this.currentSession.accept($)},reject:k,getInviteData:N})}},onConnect:async()=>{this.reconnectAttempts=0,this.reconnectTimer=null,this.callKit.logger.info("connect onConnect",{caller:"Connect.register",type:"SIP",content:{version:`${this.callKit.config.getConfig().version}`}}),await this.registerer.register().catch(async _=>{this.callKit.reset(),this.callKit.logger.error(_?.message,{caller:"Connect.register",type:"SIP",content:{errCode:V.WEBRTC_REGISTER_ERROR}})})},onDisconnect:_=>{_?(this.callKit.logger.warn("SIP User Agent Disconnected with error",{caller:"Connect.register",type:"SIP",content:{err:_.message,errCode:V.WEBRTC_USER_AGENT_ERROR}}),this.startReconnectTimer()):this.callKit.logger.warn("SIP User Agent Disconnected",{caller:"Connect.register",type:"SIP",content:{}})},onRegister:()=>{this.callKit.logger.info("connect onRegister",{caller:"Connect.register",type:"SIP",content:{version:`V${this.callKit.config.getConfig().version}`}})}},T(this.userAgent,{that:this}),await this.userAgent.start().catch(_=>{this.callKit.reset(),this.callKit.logger.error(_,{caller:"Connect.register",type:"SIP",content:{errCode:V.WEBRTC_USER_AGENT_ERROR}})})}reconnectTimer;reconnectAttempts=0;startReconnectTimer(){if(this.reconnectAttempts>=this.reconnectConfig.maxAttempts&&this.callKit.config.isLogin()){this.callKit.reset(),this.callKit.logger.error("Reconnect failed max attempts",{caller:"Connect.startReconnectTimer",type:"SIP",content:{errCode:V.SOCKET_RECONNECT_FAILED,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}});return}this.callKit.logger.info("Reconnect timer started",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}}),this.reconnectAttempts+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer&&this.callKit.config.isLogin()?(this.userAgent?.reconnect(),this.callKit.logger.info("Reconnect attempt",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})):this.callKit.logger.info("Reconnect timer already expired",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})},this.reconnectConfig.delay)}async stop(){await this.userAgent.stop()}async unregister(){if(this.callKit.logger.info("connect unregister",{caller:"Connect.unregister",type:"SIP",content:{isRegistered:this.isRegistered()}}),!this.isRegistered()||!this.registerer){this.callKit.logger.warn("No registerer to unregister.",{caller:"Connect.unregister",type:"SIP",content:{errCode:V.WEBRTC_CANCEL_REGISTER_ERROR}});return}await this.registerer.unregister({all:!0}).catch(e=>{this.callKit.logger.warn(e,{caller:"Connect.unregister",type:"SIP",content:{errCode:V.WEBRTC_CANCEL_REGISTER_ERROR}})}).finally(()=>{this.setRegister(!1)}),await this.userAgent?.stop().catch(e=>{this.callKit.logger.warn(e,{caller:"Connect.unregister",type:"SIP",content:{errCode:V.WEBRTC_CANCEL_REGISTER_ERROR}})})}async call(e){this.callKit.logger.info("connect call",{caller:"Connect.call",type:"SIP",content:{callback:e}}),this.setOutgoing(!0),this.isRegistered()||await this.register(),this.setConnectStatus(ne.connecting),this.callKit.trigger(H.CALL_CONNECTING,new Date);let{userInfo:t}=this.callKit.config.getConfig();e(t)}setRegister(e){this.isRegister!==e&&(this.callKit.logger.info("connect setRegister",{caller:"Connect.setRegister",type:"SIP",content:{register:e}}),this.isRegister=e,this.callKit.trigger(H.KIT_REGISTER_CHANGE,e))}setConnectStatus(e){this.callKit.logger.info("connect setConnectStatus",{caller:"Connect.setConnectStatus",type:"SIP",content:{status:e}}),this.connectStatus=e,this.callKit.trigger(H.KIT_CALL_STATUS_CHANGE,e)}async hangup(e=!1,t=!1){if(this.callKit.logger.info("connect hangup",{caller:"Connect.hangup",type:"SIP",content:{isUnprompted:e,isError:t,connectStatus:this.connectStatus}}),this.setOutgoing(!1),this.isUnprompted=e,this.setHold(!1),this.setMute(!1),this.connectStatus!==ne.init)try{e&&(this.isRinging()||this.isCalling())&&(this.hasInvite?(this.currentSession?.state!==v.Terminated&&this.currentSession?.state!==v.Terminating&&this.currentSession.reject(),this.hasInvite=!1):await this.currentSession?.bye()),ji(this.mediaStream);let r=this.getAduioReference();r&&(r.pause(),r.srcObject=null),this.setConnectStatus(ne.init),this.callKit.trigger(H.CALL_END,new Date),this.setCallId(null)}catch(r){this.callKit.trigger(H.CALL_END,new Date),this.callKit.reset(),this.callKit.logger.error(r,{caller:"Connect.hangup",type:"SIP",content:{connectStatus:this.connectStatus,isError:t,isUnprompted:e}})}}getRemoteMediaStream(e){this.callKit.logger.info("connect getRemoteMediaStream",{caller:"Connect.getRemoteMediaStream",type:"SIP",content:{session:e}});let t=e.sessionDescriptionHandler;if(t)return t.remoteMediaStream}setupRemoteMedia(e){this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:e}});let t=this.getRemoteMediaStream(e),r=this.getAduioReference();r?(r.autoplay=!0,r.srcObject=t,r.play().catch(i=>{this.callKit.logger.error(i.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:V.WEBRTC_AUDIO_PLAY_ERROR}})}),t.onaddtrack=()=>{this.callKit.logger.info("Remote media onaddtrack",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:e}}),r.load(),r.play().catch(i=>{this.callKit.logger.error(i.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:V.WEBRTC_AUDIO_PLAY_ERROR}})})}):this.callKit.logger.error("video is not exist",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:V.WEBRTC_AUDIO_PLAYER_ERROR}})}async setHold(e){if(this.isHold===e){this.callKit.logger.warn("Already holding",{caller:"Connect.setHold",type:"SIP",content:{isHold:this.isHold}});return}this.callKit.socket.send(e?be.HOLD:be.UNHOLD),this.isHold=e,this.callKit.logger.info("connect setHold",{caller:"Connect.setHold",type:"SIP",content:{hold:e}}),this.callKit.trigger(H.KIT_SET_HOLD,e)}async setMute(e){if(this.isMute===e){this.callKit.logger.warn("Already muted",{caller:"Connect.setMute",type:"SIP",content:{isCalling:this.isCalling(),isMuted:this.isMuted()}});return}this.callKit.socket.send(e?be.MUTE:be.UNMUTE),this.isMute=e,this.callKit.trigger(H.KIT_SET_MUTE,e)}async refer(e,t){this.callKit.logger.info("connect refer",{caller:"Connect.refer",type:"SIP",content:{referTo:e,extra:t}});let r;e&&(r=ce.makeURI(e)),this.currentSession.refer(r,t?.sessionReferOptions)}};var zr=class{callKit;ws;lastPingTime=void 0;pingTimer;reconnectTimer;reconnectAttempts=0;connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1};get startConfirm(){return this.connectAuthState.startConfirm}get isError(){return this.connectAuthState.isError}constructor(e){this.callKit=e}get reconnectConfig(){return this.callKit.config.getReconnectConfig("incall")}init(){let{socket:e}=this.callKit.config.getConfig();this.callKit.logger.info(`socket init: ${e}`,{caller:"Socket.init",type:"INCALL",content:{socket:e}}),this.connect(e)}setConnectAuthState(e,t){this.connectAuthState[e]!==t&&(this.connectAuthState[e]=t)}handleDisconnect(){this.setConnectAuthState("isConnected",!1);let{enabled:e}=this.reconnectConfig;if(!this.callKit.config.isLogin()||!e){this.callKit.reset(),this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"});return}this.connectAuthState.isReconnecting||this.connectAuthState.isError||this.attemptReconnect()}clearWebSocket(){this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null),(this.ws?.readyState===WebSocket.CONNECTING||this.ws?.readyState===WebSocket.OPEN)&&(this.ws?.close(1e3,"socket close"),this.callKit.logger.info("socket clear",{caller:"Socket.clearWebSocket",type:"INCALL",content:{}})),this.ws=void 0,this.setConnectAuthState("isConnected",!1)}connect(e){this.ws&&this.clearWebSocket(),this.ws=new WebSocket(e),this.ws.onopen=t=>this.onOpen(t),this.ws.onclose=t=>this.onClose(t),this.ws.onerror=t=>this.onError(t),this.ws.onmessage=t=>this.onMessage(t)}onOpen(e){this.callKit.logger.info("socket onOpen",{caller:"Socket.onOpen",type:"INCALL",content:{ev:e}}),this.setConnectAuthState("isConnected",!0),this.lastPingTime=Date.now(),this.checkPing(),this.send(be.START),this.connectAuthState.isReconnecting&&(this.setConnectAuthState("isReconnecting",!1),this.callKit.logger.info("reconnect success",{caller:"Socket.onOpen",type:"INCALL",content:{event:"INCALL_RECONNECT_SUCCESS",reconnectAttempts:this.reconnectAttempts}}),this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_SUCCESS"}))}cleanReconnectState(){this.reconnectAttempts=0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.setConnectAuthState("isReconnecting",!1),this.setConnectAuthState("isError",!1)}resetConnectState(){this.connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1},this.cleanReconnectState(),this.callKit.logger.info("reset connect state",{caller:"Socket.resetConnectState",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,connectAuthState:this.connectAuthState}})}onClose(e){this.callKit.logger.info("socket onClose",{caller:"Socket.onClose",type:"INCALL",content:{ev:e}}),this.handleDisconnect()}onError(e){this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_CONNECT_ERROR",err:e}),this.callKit.logger.error("socket onError",{caller:"Socket.onError",type:"INCALL",content:{errCode:V.SOCKET_CONNECT_ERROR,data:e}})}confirmAck(e){let{ack:t,messageId:r}=e;t&&this.send(be.ACK,{messageId:r})}onMessage(e){let t=JSON.parse(e.data),r=t.data;try{typeof t.data=="string"&&t.data&&(r=JSON.parse(t.data))}catch{this.callKit.logger.info("socket onMessage parse error",{caller:"Socket.onMessage",type:"INCALL",content:{data:t.data}})}this.callKit.logger.info(`socket onMessage: ${t.event}`,{caller:"Socket.onMessage",type:"INCALL",content:{data:r,event:t.event}}),this.confirmAck(t);let i=r?.callUuid||"";if(t.event===pe.PONG){this.lastPingTime=Date.now();return}if(t.event===pe.START_CONFIRM&&(this.setConnectAuthState("startConfirm",!0),this.cleanReconnectState()),t.event===pe.CUSTOMER_RINGING&&this.callKit.trigger(H.CALL_RINGING,{time:new Date,callUuid:i}),t.event===pe.CUSTOMER_PICK_UP&&this.callKit.trigger(H.CALL_PICK_UP,{time:new Date,callUuid:i}),t.event===pe.AGENT_PICK_UP&&this.callKit.trigger(H.AGENT_PICK_UP,{time:new Date,callUuid:i}),t.event===pe.CUSTOMER_HANG_UP&&(this.callKit.trigger(H.CALL_HANG_UP,{time:new Date,callUuid:i}),i&&this.callKit.connect.socketTriggerHangup(i)),t.event===pe.CUSTOMER_NO_ANSWER&&(this.callKit.trigger(H.CALL_NO_ANSWER,{time:new Date,callUuid:i}),i&&this.callKit.connect.socketTriggerHangup(i)),t.event===pe.CALL_CDR&&this.callKit.trigger(H.CALL_CDR,{time:new Date,callUuid:i,...r}),t.event===pe.CLOSE){let{userInfo:s}=this.callKit.config.getConfig();this.send(be.END,{agentId:s.agentId,callUuid:i})}t.event===pe.ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(t.msg,{caller:`Socket.onMessage:${t.event}`,type:"INCALL",content:{errCode:V.SOKET_SERVER_ERROR,data:r,callUuid:i}})),t.event===pe.SESSION_ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(t.msg,{caller:`Socket.onMessage:${t.event}`,type:"INCALL",content:{data:r,event:pe.SESSION_ERROR,callUuid:i}})),t.event===pe.AGENT_NO_ANSWER&&i&&this.callKit.connect.socketTriggerHangup(i),t.event===pe.AGENT_HANG_UP&&i&&this.callKit.connect.socketTriggerHangup(i),this.callKit.trigger(H.SERVER_SOCKET_EVENT,{...t,callUuid:i})}send(e,t){if(!this.connectAuthState.isConnected){this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"}),this.callKit.reset(),this.callKit.logger.error("socket not connected",{caller:"Socket.send",type:"INCALL",content:{errCode:V.SOCKET_CONNECT_ERROR}});return}let{userInfo:r,version:i}=this.callKit.config.getConfig(),{sessionId:s,extno:o,agentId:a}=r;if(this.callKit.logger.info("Socket send",{caller:"Socket.send",type:"INCALL",content:{agentId:a,sessionId:s,userInfo:r}}),!s){this.callKit.logger.error("sessionId is empty",{caller:"Socket.send",type:"INCALL",content:{errCode:V.SOCKET_CONNECT_ERROR}});return}let d={event:e,sessionId:s,version:i,...t};be.CALL===e&&(d.phoneNum=o,d.agentId=a,t?.sourceType===xe.phoneNum?delete d.workOrderId:t?.sourceType===xe.workOrderId&&delete d.phoneNum),this.callKit.logger.info("socket send",{caller:"Socket.send",type:"INCALL",content:{...d}}),this.ws?.send(JSON.stringify({event:e,...d}))}ping(){if(!this.connectAuthState.isConnected)return;this.send(be.PING);let e=Date.now(),{pingInterval:t,pingTimeout:r}=this.reconnectConfig;e-this.lastPingTime>t+r&&(this.ws&&this.connectAuthState.isConnected?this.ws.close(4001,"ping timeout"):this.callKit.reset(),this.callKit.logger.error("socket ping timeout",{caller:"Socket.ping",type:"INCALL",content:{errCode:V.SOCKET_PING_TIMEOUT}}),this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_PING_TIMEOUT"}))}checkPing(){this.pingTimer&&clearInterval(this.pingTimer);let{pingInterval:e}=this.reconnectConfig;this.pingTimer=setInterval(()=>{this.ping()},e)}async reset(e){let{force:t=!1}=e||{};this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=void 0),t&&(this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RESET"}),this.resetConnectState()),this.lastPingTime=void 0,this.setConnectAuthState("startConfirm",!1),this.clearWebSocket()}attemptReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let{maxAttempts:e}=this.reconnectConfig;if(this.reconnectAttempts>=e){this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_ERROR"}),this.callKit.reset(),this.callKit.logger.error("Maximum reconnection attempts reached",{caller:"Socket.attemptReconnect",type:"INCALL",content:{errCode:V.SOCKET_RECONNECT_FAILED,reconnectAttempts:this.reconnectAttempts}});return}this.reconnectAttempts===0&&this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_START"}),this.setConnectAuthState("isReconnecting",!0),this.reconnectAttempts+=1;let{delay:t}=this.reconnectConfig;this.callKit.logger.info(`Preparing reconnection attempt ${this.reconnectAttempts}/${e}, delay: ${t}ms`,{caller:"Socket.attemptReconnect",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:e,delay:t}}),this.reconnectTimer=setTimeout(()=>{let{socket:r}=this.callKit.config.getConfig();this.connect(r)},t)}};var Ki=class{api;config;logger;callCenter;connect;socket;listener=[];constructor(e){this.config=new Cr(this),this.api=new fr(this),this.connect=new Jr(this),this.callCenter=new mr(this),this.socket=new zr(this),this.logger=new vr(this,e.log),e.log&&this.config.setConfig("log",e.log),e.trackLogs&&this.config.setConfig("trackLogs",{...Mt,...e.trackLogs}),e.audioRef&&this.config.setConfig("audioRef",e.audioRef),e.host&&this.config.setConfig("host",e.host),this.config.setConfig("constrains",e.constrains||pr),this.config.setConfig("socket",e.socket),this.config.setConfig("reconnect",{sip:{...Ut,...e.reconnect?.sip||{}},incall:{...Ft,...e.reconnect?.incall||{}}}),this.logger.info("callKit init",{caller:"CallKit.init",content:e})}async login(e,t,r={encryptionMethod:je.INTERNAL}){if(this.config.isLogin()){this.logger.warn("already login",{caller:"CallKit.login",content:{username:e,password:t,extra:r}});return}let i="",{encryptionMethod:s=je.INTERNAL}=r;switch(s){case je.NONE:i=t;break;case je.INTERNAL:i=(0,Gt.default)(e+(0,Gt.default)(t));break;default:i=(0,Gt.default)(e+(0,Gt.default)(t));break}if(this.logger.info("login info:",{caller:"CallKit.login",content:{username:e,password:t,encryptionMethod:s,encryptionPassword:i}}),this.socket.isError){this.logger.warn("socket is error",{caller:"CallKit.login",content:{username:e,password:t,extra:r,socketError:this.socket.isError}});return}try{let o=await this.api.login({userName:e,password:i,timestamp:Date.now()});o&&(this.config.setConfig("userInfo",{wsUrl:`wss://${o.wsUrl}`,sessionId:o.sessionId,username:e,password:i,encryptionPassword:i,agentId:o.agentId,fsUserId:o.fsUserId,userPart:o.userPart,fsPassword:o.fsPassword,fsIp:o.fsIp,fsPort:o.fsPort,iceInfo:o.iceInfo,iceGatheringTimeout:o.iceGatheringTimeout,logGather:o.logGather,...r}),this.socket.init(),this.trigger(H.KIT_LOGIN_CHANGE,!0))}catch(o){this.logger.error(o,{caller:"CallKit.login",content:{errCode:V.API_USER_LOGIN_ERROR}})}}async logout({isReset:e=!0}={isReset:!0}){if(!this.config.check())return;let{userInfo:t}=this.config.getConfig();if(this.logger.info("logout",{caller:"CallKit.logout",content:{sessionId:t.sessionId}}),this.config.isLogin()){let{sessionId:r}=t;try{await this.api.loginOut({sessionId:r,timestamp:Date.now()})}catch(i){this.logger.warn(i,{caller:"CallKit.logout",content:{errCode:V.API_USER_LOGOUT_ERROR}})}}e?await this.reset():this.config.reset()}async call(e="",t={sourceType:xe.phoneNum,workOrderId:""}){if(!this.config.check())return;if(!this.connect.isRegistered){this.logger.warn("Currently not registered",{caller:"CallKit.call",content:{extno:e,options:t}});return}let{sourceType:r,workOrderId:i}=t;this.config.setUserInfo("sourceType",r),r===xe.phoneNum?e&&this.config.setUserInfo("extno",e):r===xe.workOrderId&&i&&this.config.setUserInfo("workOrderId",i),this.logger.info("call",{caller:"CallKit.call",content:{extno:e,options:t}}),this.callCenter.callStart(t)}async refer(e,t){this.config.check()&&(this.logger.info("refer",{caller:"CallKit.refer",content:{uri:e,options:t}}),this.callCenter.callRefer(e,t))}async register(){this.config.check()&&(this.logger.info("register",{caller:"CallKit.register",content:{}}),this.connect.register())}async unregister(){this.config.check()&&(this.logger.info("unregister",{caller:"CallKit.unregister",content:{}}),this.connect.unregister())}async hangup(){if(this.config.check()){if(this.logger.info("hangup",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}}),!this.connect.isConnecting()&&!this.connect.isRinging()&&!this.connect.isCalling()&&!this.connect.isHolding()){this.logger.warn("Currently not in a call",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}});return}await this.callCenter.callEnd(!0)}}hold(){this.config.check()&&(this.logger.info("hold",{caller:"CallKit.hold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callHold())}unhold(){this.config.check()&&(this.logger.info("unhold",{caller:"CallKit.unhold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnhold())}mute(){this.config.check()&&(this.logger.info("mute",{caller:"CallKit.mute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callMute())}unmute(){this.config.check()&&(this.logger.info("unmute",{caller:"CallKit.unmute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnmute())}async setUserStatus(e,t={}){let{agentId:r}=this.config.getConfig().userInfo;this.logger.info("setUserStatus",{caller:"CallKit.setUserStatus",content:{status:e,agentId:r}}),await this.api.updateUserStatus({agentId:r,userStatus:e,timestamp:Date.now(),...t})}async reset(e){let{force:t=!1}=e||{};this.logger.info("reset",{caller:"CallKit.reset",content:{connectStatus:this.connect.connectStatus,force:t}}),this.connect.isCalling()&&await this.hangup(),await this.connect.reset(),this.config.isLogin()?await this.logout({isReset:!1}):await this.config.reset(),await this.socket.reset({force:t})}on(e,t){this.listener.push({event:e,callback:t})}off(e,t){this.logger.info(`off ${e}`,{caller:"CallKit.off",content:{event:e}}),t?this.listener=this.listener.filter(r=>!(r.event===e&&r.callback===t)):this.listener=this.listener.filter(r=>r.event!==e)}removeAllListeners(){this.listener=this.listener.splice(0,this.listener.length),this.logger.info("removeAllListeners",{caller:"CallKit.removeAllListeners",content:{listener:this.listener}})}trigger(e,t,r=!1){r||this.logger.info(`Trigger Event: ${e}`,{caller:"CallKit.trigger",content:t}),this.listener.forEach(i=>{if(i.event===e)try{i.callback(t)}catch(s){this.logger.error(`Event callback error: ${e}`,s,!0)}})}};return zn(tc);})();
|
|
65
|
+
`,2);if(o.length!==2){r.reject();return}let a,d=/^(Signal\s*?=\s*?)([0-9A-D#*]{1})(\s)?.*/;if(o[0]!==void 0&&d.test(o[0])&&(a=o[0].replace(d,"$2")),!a){r.reject();return}let h,l=/^(Duration\s?=\s?)([0-9]{1,4})(\s)?.*/;if(o[1]!==void 0&&l.test(o[1])&&(h=parseInt(o[1].replace(l,"$2"),10)),!h){r.reject();return}r.accept().then(()=>{if(this.delegate&&this.delegate.onCallDTMFReceived){if(!a||!h)throw new Error("Tone or duration undefined.");this.delegate.onCallDTMFReceived(e,a,h)}}).catch(u=>{this.logger.error(u.message)})},e.delegate.onRefer=r=>{r.accept().then(()=>this.sendInvite(r.makeInviter(t),t)).catch(i=>{this.logger.error(i.message)})}}optionsPingRun(e,t,r){if(this.options.optionsPingInterval<1)throw new Error("Invalid options ping interval.");this.optionsPingRunning||(this.optionsPingRunning=!0,this.optionsPingTimeout=setTimeout(()=>{this.optionsPingTimeout=void 0;let i=()=>{this.optionsPingFailure=!1,this.optionsPingRunning&&(this.optionsPingRunning=!1,this.optionsPingRun(e,t,r))},s=()=>{this.logger.error("OPTIONS ping failed"),this.optionsPingFailure=!0,this.optionsPingRunning=!1,this.userAgent.transport.disconnect().catch(d=>this.logger.error(d))},o=this.userAgent.userAgentCore,a=o.makeOutgoingRequestMessage("OPTIONS",e,t,r,{});this.optionsPingRequest=o.request(a,{onAccept:()=>{this.optionsPingRequest=void 0,i()},onReject:d=>{this.optionsPingRequest=void 0,d.message.statusCode===408||d.message.statusCode===503?s():i()}})},this.options.optionsPingInterval*1e3))}optionsPingStart(){this.logger.log("OPTIONS pings started");let e,t,r;if(this.options.optionsPingRequestURI){if(e=ce.makeURI(this.options.optionsPingRequestURI),!e)throw new Error("Failed to create Request URI.");t=this.userAgent.contact.uri.clone(),r=this.userAgent.contact.uri.clone()}else if(this.options.aor){let i=ce.makeURI(this.options.aor);if(!i)throw new Error("Failed to create URI.");e=i.clone(),e.user=void 0,t=i.clone(),r=i.clone()}else{this.logger.error("You have enabled sending OPTIONS pings and as such you must provide either a) an AOR to register, or b) an RURI to use for the target of the OPTIONS ping requests. ");return}this.optionsPingRun(e,t,r)}optionsPingStop(){this.logger.log("OPTIONS pings stopped"),this.optionsPingRunning=!1,this.optionsPingFailure=!1,this.optionsPingRequest&&(this.optionsPingRequest.dispose(),this.optionsPingRequest=void 0),this.optionsPingTimeout&&(clearTimeout(this.optionsPingTimeout),this.optionsPingTimeout=void 0)}async sendInvite(e,t,r){return this.initSession(e,t),e.invite(r).then(()=>{this.logger.log(`[${e.id}] Sent INVITE`)})}sessionAdd(e){let t=this.options.managedSessionFactory(this,e);this.managedSessions.push(t)}sessionExists(e){return this.sessionManaged(e)!==void 0}sessionManaged(e){return this.managedSessions.find(t=>t.session.id===e.id)}sessionRemove(e){this.managedSessions=this.managedSessions.filter(t=>t.session.id!==e.id)}async setHold(e,t){if(!this.sessionExists(e))return Promise.reject(new Error("Session does not exist."));if(this.isHeld(e)===t)return Promise.resolve();if(!(e.sessionDescriptionHandler instanceof re))throw new Error("Session's session description handler not instance of SessionDescriptionHandler.");let i={requestDelegate:{onAccept:()=>{let a=this.sessionManaged(e);a!==void 0&&(a.held=t,this.enableReceiverTracks(e,!a.held),this.enableSenderTracks(e,!a.held&&!a.muted),this.delegate&&this.delegate.onCallHold&&this.delegate.onCallHold(e,a.held))},onReject:()=>{this.logger.warn(`[${e.id}] Re-invite request was rejected`);let a=this.sessionManaged(e);a!==void 0&&(a.held=!t,this.enableReceiverTracks(e,!a.held),this.enableSenderTracks(e,!a.held&&!a.muted),this.delegate&&this.delegate.onCallHold&&this.delegate.onCallHold(e,a.held))}}},s=e.sessionDescriptionHandlerOptionsReInvite;s.hold=t,e.sessionDescriptionHandlerOptionsReInvite=s;let o=this.sessionManaged(e);if(!o)throw new Error("Managed session is undefiend.");return o.held=t,e.invite(i).then(()=>{let a=this.sessionManaged(e);a!==void 0&&(this.enableReceiverTracks(e,!a.held),this.enableSenderTracks(e,!a.held&&!a.muted))}).catch(a=>{throw o.held=!t,a instanceof Fe&&this.logger.error(`[${e.id}] A hold request is already in progress.`),a})}setMute(e,t){if(!this.sessionExists(e)){this.logger.warn(`[${e.id}] A session is required to enabled/disable media tracks`);return}if(e.state!==v.Established){this.logger.warn(`[${e.id}] An established session is required to enable/disable media tracks`);return}let r=this.sessionManaged(e);r!==void 0&&(r.muted=t,this.enableSenderTracks(e,!r.held&&!r.muted))}setupLocalMedia(e){let t=this.sessionManaged(e);if(!t)throw new Error("Managed session does not exist.");let r=typeof this.options.media.local=="function"?this.options.media.local(e):this.options.media.local;t.mediaLocal=r;let i=r?.video;if(i){let s=this.getLocalMediaStream(e);if(!s)throw new Error("Local media stream undefiend.");i.srcObject=s,i.volume=0,i.play().catch(o=>{this.logger.error(`[${e.id}] Failed to play local media`),this.logger.error(o.message)})}}setupRemoteMedia(e){let t=this.sessionManaged(e);if(!t)throw new Error("Managed session does not exist.");let r=typeof this.options.media.remote=="function"?this.options.media.remote(e):this.options.media.remote;t.mediaRemote=r;let i=r?.video||r?.audio;if(i){let s=this.getRemoteMediaStream(e);if(!s)throw new Error("Remote media stream undefiend.");i.autoplay=!0,i.srcObject=s,i.play().catch(o=>{this.logger.error(`[${e.id}] Failed to play remote media`),this.logger.error(o.message)}),s.onaddtrack=()=>{this.logger.log("Remote media onaddtrack"),i.load(),i.play().catch(o=>{this.logger.error(`[${e.id}] Failed to play remote media`),this.logger.error(o.message)})}}}async terminate(e){switch(this.logger.log(`[${e.id}] Terminating...`),e.state){case v.Initial:if(e instanceof tt)return e.cancel().then(()=>{this.logger.log(`[${e.id}] Inviter never sent INVITE (canceled)`)});if(e instanceof Ge)return e.reject().then(()=>{this.logger.log(`[${e.id}] Invitation rejected (sent 480)`)});throw new Error("Unknown session type.");case v.Establishing:if(e instanceof tt)return e.cancel().then(()=>{this.logger.log(`[${e.id}] Inviter canceled (sent CANCEL)`)});if(e instanceof Ge)return e.reject().then(()=>{this.logger.log(`[${e.id}] Invitation rejected (sent 480)`)});throw new Error("Unknown session type.");case v.Established:return e.bye().then(()=>{this.logger.log(`[${e.id}] Session ended (sent BYE)`)});case v.Terminating:break;case v.Terminated:break;default:throw new Error("Unknown state")}return this.logger.log(`[${e.id}] Terminating in state ${e.state}, no action taken`),Promise.resolve()}};var Bi=class{constructor(e,t={}){this.session=void 0,this.delegate=t.delegate,this.options=Object.assign({},t);let r={aor:this.options.aor,delegate:{onCallAnswered:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onCallAnswered)===null||s===void 0?void 0:s.call(i)},onCallCreated:i=>{var s,o;this.session=i,(o=(s=this.delegate)===null||s===void 0?void 0:s.onCallCreated)===null||o===void 0||o.call(s)},onCallReceived:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onCallReceived)===null||s===void 0?void 0:s.call(i)},onCallHangup:()=>{var i,s;this.session=void 0,!((i=this.delegate)===null||i===void 0)&&i.onCallHangup&&((s=this.delegate)===null||s===void 0||s.onCallHangup())},onCallHold:(i,s)=>{var o,a;return(a=(o=this.delegate)===null||o===void 0?void 0:o.onCallHold)===null||a===void 0?void 0:a.call(o,s)},onCallDTMFReceived:(i,s,o)=>{var a,d;return(d=(a=this.delegate)===null||a===void 0?void 0:a.onCallDTMFReceived)===null||d===void 0?void 0:d.call(a,s,o)},onMessageReceived:i=>{var s,o;return(o=(s=this.delegate)===null||s===void 0?void 0:s.onMessageReceived)===null||o===void 0?void 0:o.call(s,i.request.body)},onRegistered:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onRegistered)===null||s===void 0?void 0:s.call(i)},onUnregistered:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onUnregistered)===null||s===void 0?void 0:s.call(i)},onServerConnect:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onServerConnect)===null||s===void 0?void 0:s.call(i)},onServerDisconnect:()=>{var i,s;return(s=(i=this.delegate)===null||i===void 0?void 0:i.onServerDisconnect)===null||s===void 0?void 0:s.call(i)}},maxSimultaneousSessions:1,media:this.options.media,reconnectionAttempts:this.options.reconnectionAttempts,reconnectionDelay:this.options.reconnectionDelay,registererOptions:this.options.registererOptions,sendDTMFUsingSessionDescriptionHandler:this.options.sendDTMFUsingSessionDescriptionHandler,userAgentOptions:this.options.userAgentOptions};this.sessionManager=new dt(e,r),this.logger=this.sessionManager.userAgent.getLogger("sip.SimpleUser")}get id(){return this.options.userAgentOptions&&this.options.userAgentOptions.displayName||"Anonymous"}get localMediaStream(){return this.session&&this.sessionManager.getLocalMediaStream(this.session)}get remoteMediaStream(){return this.session&&this.sessionManager.getRemoteMediaStream(this.session)}get localAudioTrack(){return this.session&&this.sessionManager.getLocalAudioTrack(this.session)}get localVideoTrack(){return this.session&&this.sessionManager.getLocalVideoTrack(this.session)}get remoteAudioTrack(){return this.session&&this.sessionManager.getRemoteAudioTrack(this.session)}get remoteVideoTrack(){return this.session&&this.sessionManager.getRemoteVideoTrack(this.session)}connect(){return this.logger.log(`[${this.id}] Connecting UserAgent...`),this.sessionManager.connect()}disconnect(){return this.logger.log(`[${this.id}] Disconnecting UserAgent...`),this.sessionManager.disconnect()}isConnected(){return this.sessionManager.isConnected()}register(e){return this.logger.log(`[${this.id}] Registering UserAgent...`),this.sessionManager.register(e)}unregister(e){return this.logger.log(`[${this.id}] Unregistering UserAgent...`),this.sessionManager.unregister(e)}call(e,t,r){return this.logger.log(`[${this.id}] Beginning Session...`),this.session?Promise.reject(new Error("Session already exists.")):this.sessionManager.call(e,t,r).then(()=>{})}hangup(){return this.logger.log(`[${this.id}] Hangup...`),this.session?this.sessionManager.hangup(this.session).then(()=>{this.session=void 0}):Promise.reject(new Error("Session does not exist."))}answer(e){return this.logger.log(`[${this.id}] Accepting Invitation...`),this.session?this.sessionManager.answer(this.session,e):Promise.reject(new Error("Session does not exist."))}decline(){return this.logger.log(`[${this.id}] rejecting Invitation...`),this.session?this.sessionManager.decline(this.session):Promise.reject(new Error("Session does not exist."))}hold(){return this.logger.log(`[${this.id}] holding session...`),this.session?this.sessionManager.hold(this.session):Promise.reject(new Error("Session does not exist."))}unhold(){return this.logger.log(`[${this.id}] unholding session...`),this.session?this.sessionManager.unhold(this.session):Promise.reject(new Error("Session does not exist."))}isHeld(){return this.session?this.sessionManager.isHeld(this.session):!1}mute(){return this.logger.log(`[${this.id}] disabling media tracks...`),this.session&&this.sessionManager.mute(this.session)}unmute(){return this.logger.log(`[${this.id}] enabling media tracks...`),this.session&&this.sessionManager.unmute(this.session)}isMuted(){return this.session?this.sessionManager.isMuted(this.session):!1}sendDTMF(e){return this.logger.log(`[${this.id}] sending DTMF...`),this.session?this.sessionManager.sendDTMF(this.session,e):Promise.reject(new Error("Session does not exist."))}message(e,t){return this.logger.log(`[${this.id}] sending message...`),this.sessionManager.message(e,t)}};var Kn=n=>{let e=n["x-antaios-manual-extend_info"]||n["x-antaios-manual-extend-info"],t=null;try{if(e&&typeof e=="string"){let r=e.replace(/\\/g,"");return t=JSON.parse(r),t}}catch{return{}}};var Yr=6;function Qa(n){return n.replace(/(\w+):\s*'(.*?)'/g,'"$1": "$2"').replace(/'/g,'"')}var ji=n=>{n&&n.getTracks().forEach(e=>e.stop())},ec=()=>{typeof navigator.mediaDevices>"u"&&(navigator.mediaDevices={}),typeof navigator.mediaDevices.getUserMedia>"u"&&(navigator.mediaDevices.getUserMedia=n=>{let e=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return e?new Promise((t,r)=>{e.call(navigator,n,t,r)}):Promise.reject(new Error("Unable to obtain device permissions. Please check your browser settings or device permissions."))})},Jr=class{callKit;isMute=!1;isRegister=!1;isHold=!1;connectStatus=ne.init;currentSession;mediaStream;userAgent;registerer;isReConnected=!1;isOutgoing=!1;isUnprompted=!1;hasInvite=!1;constructor(e){this.callKit=e}get reconnectConfig(){return this.callKit.config.getReconnectConfig("sip")}currentCallId=null;getCurrentCallId(){return this.currentCallId}setOutgoing(e){this.isOutgoing!==e&&(this.callKit.logger.info("setOutgoing",{caller:"Connect.setOutgoing",content:{outgoing:e}}),this.isOutgoing=e)}setCallId(e){this.callKit.logger.info("setCallId",{caller:"Connect.setCallId",content:{callId:e}}),this.currentCallId=e,this.callKit.trigger(H.KIT_CALL_ID_CHANGE,e)}async reset(){if(this.setOutgoing(!1),this.isUnprompted=!1,this.hasInvite=!1,this.isHolding()&&await this.setHold(!1),this.isMuted()&&await this.setMute(!1),this.connectStatus!==ne.init&&this.setConnectStatus(ne.init),this.isRegistered()&&await this.unregister(),this.currentCallId&&this.setCallId(null),this.currentSession=void 0,this.mediaStream=void 0,this.userAgent=void 0,this.registerer=void 0,this.mediaStream)try{ji(this.mediaStream);let e=this.getAduioReference();e&&(e.pause(),e.srcObject=null)}catch(e){this.callKit.logger.error(e,{caller:"Connect.reset",content:{}})}this.setConnectStatus(ne.init),this.clearHeartbeat()}getAduioReference(){let{audioRef:e}=this.callKit.config.getConfig();return typeof e=="function"?e():e}async permission(){this.callKit.logger.info("permission",{caller:"Connect.permission",content:{permission:!0}}),ec();let e=await navigator.mediaDevices.getUserMedia({audio:!0});ji(e)}isConnecting(){return this.connectStatus===ne.connecting}isCalling(){return this.connectStatus===ne.calling}isRinging(){return this.connectStatus===ne.ringing}isHolding(){return this.isHold}isRegistered(){return this.isRegister}isMuted(){return this.isMute}isInit(){return this.connectStatus===ne.init}heartbeatInterval;heartbeatFlag=Yr;clearHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.heartbeatFlag=Yr}startHeartbeat(){this.heartbeatFlag=Yr,this.clearHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.heartbeatFlag-=1,this.heartbeatFlag<=0&&(this.heartbeatFlag=Yr,this.callKit.trigger(H.SIP_CONNECT_EVENT,{event:"OPTIONS_HEARTBEAT_EXPIRED"}))},1e3)}socketTriggerHangup(e){!this.isCalling()||e!==this.currentCallId||(this.callKit.logger.info("socketHangup trigger hangup",{caller:"Connect.socketHangup",content:{callId:e,currentCallId:this.currentCallId}}),this.callKit.hangup())}async register(){if(this.connectStatus!==ne.init){if(this.isRegistered()){this.callKit.logger.warn("connectStatus is registered",{caller:"Connect.register",content:{errCode:V.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.reset(),this.callKit.logger.error("connectStatus is not init",{caller:"Connect.register",content:{errCode:V.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.logger.info("connect register",{caller:"Connect.register",content:{connectStatus:this.connectStatus}}),await this.permission().catch(_=>{this.callKit.reset(),this.callKit.logger.error(_,{caller:"Connect.register",content:{errCode:V.WEBRTC_USER_MEDIA_ERROR}})});let{userInfo:e,constrains:t}=this.callKit.config.getConfig(),r=async()=>(this.mediaStream=await navigator.mediaDevices.getUserMedia(t),this.mediaStream),{userPart:i,fsIp:s,fsPort:o,iceInfo:a,wsUrl:d}=e,h={uri:ce.makeURI(`sip:${i}@${s}:${o}`),displayName:i,transportOptions:{wsServers:[d],traceSip:!0},logLevel:"error",allowLegacyNotifications:!0,contactName:i,sessionDescriptionHandlerFactory:Wr.defaultSessionDescriptionHandlerFactory(r),sessionDescriptionHandlerFactoryOptions:{constraints:t,iceGatheringTimeout:e.iceGatheringTimeout,peerConnectionConfiguration:{iceServers:JSON.parse(Qa(a))}}};this.callKit.logger.info("connect connectConfig",{caller:"Connect.register",content:h}),this.userAgent=new ce(h);let l=new MediaStream,u=_=>{let $=this.getAduioReference();this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.register.setupRemoteMedia",content:$}),_.sessionDescriptionHandler.peerConnection.getReceivers().forEach(N=>{N.track&&l.addTrack(N.track)}),$?($.srcObject=l,$.play().catch(N=>{this.callKit.logger.error(N.message,{caller:"Connect.register.setupRemoteMedia",content:{errCode:V.WEBRTC_AUDIO_PLAY_ERROR}})})):this.callKit.logger.error("video is not exist",{caller:"Connect.register",content:{errCode:V.WEBRTC_AUDIO_PLAYER_ERROR}})},T=(_,$)=>{let{that:N=this}=$,P=_.userAgentCore,k=P.receiveIncomingRequestFromTransport.bind(P);P.receiveIncomingRequestFromTransport=x=>(x.method==="OPTIONS"&&N.startHeartbeat(),N.callKit.logger.info(`SIP Receive: ${x?.method}`,{caller:"Connect.register.observeSocketStatus.receiveRequest",type:"SIP",content:{request:x}}),k(x));let C=P.receiveIncomingResponseFromTransport.bind(P);P.receiveIncomingResponseFromTransport=x=>(N.callKit.logger.info(`SIP Receive Response: ${x?.statusCode} ${x?.reasonPhrase}`,{caller:"Connect.register.observeSocketStatus.receiveResponse",type:"SIP",content:{response:x}}),C(x));let{transport:f}=_;if(f){let x=f.send.bind(f);f.send=w=>(N.callKit.logger.info("SIP send message",{caller:"Connect.register.observeSocketStatus",type:"SIP",content:{message:w.toString()}}),x(w))}},A={};this.registerer=new Ce(this.userAgent,A),this.registerer.stateChange.addListener(_=>{switch(_){case M.Initial:this.callKit.logger.info("registerer stateChange Initial",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:_,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(ne.init),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;case M.Registered:this.callKit.logger.info("registerer stateChange Registered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:_,isRegistered:this.isRegistered()}}),this.setRegister(!0),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;case M.Terminated:this.callKit.logger.info("registerer stateChange Terminated",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:_,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(ne.init),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;case M.Unregistered:this.callKit.logger.info("registerer stateChange Unregistered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{isRegistered:this.isRegistered(),registererState:_}}),this.setRegister(!1),this.setConnectStatus(ne.init),this.callKit.trigger(H.SIP_REGISTERER_EVENT,{registererState:_,isRegistered:this.isRegistered()});break;default:break}}),this.userAgent.delegate={onInvite:_=>{this.callKit.logger.info("connect onInvite",{type:"SIP",caller:"Connect.register.onInvite",content:{invite:_,isRegistered:this.isRegistered(),isOutgoing:this.isOutgoing}}),this.currentSession=_,this.currentSession.stateChange.addListener(k=>{switch(k){case v.Establishing:this.callKit.logger.info("connect Establishing",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:k}}),this.setConnectStatus(ne.ringing),this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()});break;case v.Established:this.callKit.logger.info("connect Established",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:k}}),this.callKit.connect.setConnectStatus(ne.calling),this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()}),u(this.currentSession);break;case v.Terminating:this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()});break;case v.Terminated:this.callKit.logger.info("connect Terminated",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:k}}),this.hasInvite=!1,this.isUnprompted||this.callKit.callCenter.callEnd(),this.isUnprompted=!1,this.callKit.trigger(H.SIP_SESSION_EVENT,{sessionState:k,isRegistered:this.isRegistered()});break;default:break}});let $={sessionDescriptionHandlerOptions:{constraints:t,alwaysAcquireMediaFirst:!0}},N=()=>{let{request:k}=this.currentSession,C=Object.keys(k.headers),f={};return C.filter(x=>x.toLocaleLowerCase().startsWith("x-antaios")).forEach(x=>{f[x.toLocaleLowerCase()]=k.getHeader(x)}),this.callKit.logger.info("get invite data",{caller:"Connect.register.onInvite",content:f}),f},P=N();try{let k=Kn(P);k?.callUuid?this.setCallId(k.callUuid):(this.setCallId(null),this.callKit.logger.warn("call id is not exist",{caller:"Connect.register.onInvite",content:{inviteData:k}}))}catch(k){this.callKit.logger.info(k,{caller:"Connect.register.onInvite",content:P})}if(this.isOutgoing)this.currentSession.accept($),this.callKit.trigger(H.KIT_OUTGOING_INVITE,{getInviteData:N});else{this.hasInvite=!0;let k=()=>{this.currentSession?.state!==v.Terminated&&this.currentSession?.state!==v.Terminating&&this.currentSession.reject(),this.hasInvite=!1,this.callKit.callCenter.callEnd(!0,!1)};this.callKit.trigger(H.KIT_INVITE,{accept:()=>{this.callKit.trigger(H.CALL_CONNECTING,new Date),this.hasInvite=!1,this.currentSession.accept($)},reject:k,getInviteData:N})}},onConnect:async()=>{this.reconnectAttempts=0,this.reconnectTimer=null,this.callKit.logger.info("connect onConnect",{caller:"Connect.register",type:"SIP",content:{version:`${this.callKit.config.getConfig().version}`}}),await this.registerer.register().catch(async _=>{this.callKit.reset(),this.callKit.logger.error(_?.message,{caller:"Connect.register",type:"SIP",content:{errCode:V.WEBRTC_REGISTER_ERROR}})})},onDisconnect:_=>{_?(this.callKit.logger.warn("SIP User Agent Disconnected with error",{caller:"Connect.register",type:"SIP",content:{err:_.message,errCode:V.WEBRTC_USER_AGENT_ERROR}}),this.startReconnectTimer()):this.callKit.logger.warn("SIP User Agent Disconnected",{caller:"Connect.register",type:"SIP",content:{}})},onRegister:()=>{this.callKit.logger.info("connect onRegister",{caller:"Connect.register",type:"SIP",content:{version:`V${this.callKit.config.getConfig().version}`}})}},T(this.userAgent,{that:this}),await this.userAgent.start().catch(_=>{this.callKit.reset(),this.callKit.logger.error(_,{caller:"Connect.register",type:"SIP",content:{errCode:V.WEBRTC_USER_AGENT_ERROR}})})}reconnectTimer;reconnectAttempts=0;startReconnectTimer(){if(this.reconnectAttempts>=this.reconnectConfig.maxAttempts&&this.callKit.config.isLogin()){this.callKit.reset(),this.callKit.logger.error("Reconnect failed max attempts",{caller:"Connect.startReconnectTimer",type:"SIP",content:{errCode:V.SOCKET_RECONNECT_FAILED,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}});return}this.callKit.logger.info("Reconnect timer started",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}}),this.reconnectAttempts+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer&&this.callKit.config.isLogin()?(this.userAgent?.reconnect(),this.callKit.logger.info("Reconnect attempt",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})):this.callKit.logger.info("Reconnect timer already expired",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})},this.reconnectConfig.delay)}async stop(){await this.userAgent.stop()}async unregister(){if(this.callKit.logger.info("connect unregister",{caller:"Connect.unregister",type:"SIP",content:{isRegistered:this.isRegistered()}}),!this.isRegistered()||!this.registerer){this.callKit.logger.warn("No registerer to unregister.",{caller:"Connect.unregister",type:"SIP",content:{errCode:V.WEBRTC_CANCEL_REGISTER_ERROR}});return}await this.registerer.unregister({all:!0}).catch(e=>{this.callKit.logger.warn(e,{caller:"Connect.unregister",type:"SIP",content:{errCode:V.WEBRTC_CANCEL_REGISTER_ERROR}})}).finally(()=>{this.setRegister(!1)}),await this.userAgent?.stop().catch(e=>{this.callKit.logger.warn(e,{caller:"Connect.unregister",type:"SIP",content:{errCode:V.WEBRTC_CANCEL_REGISTER_ERROR}})})}async call(e){this.callKit.logger.info("connect call",{caller:"Connect.call",type:"SIP",content:{callback:e}}),this.setOutgoing(!0),this.isRegistered()||await this.register(),this.setConnectStatus(ne.connecting),this.callKit.trigger(H.CALL_CONNECTING,new Date);let{userInfo:t}=this.callKit.config.getConfig();e(t)}setRegister(e){this.isRegister!==e&&(this.callKit.logger.info("connect setRegister",{caller:"Connect.setRegister",type:"SIP",content:{register:e}}),this.isRegister=e,this.callKit.trigger(H.KIT_REGISTER_CHANGE,e))}setConnectStatus(e){this.callKit.logger.info("connect setConnectStatus",{caller:"Connect.setConnectStatus",type:"SIP",content:{status:e}}),this.connectStatus=e,this.callKit.trigger(H.KIT_CALL_STATUS_CHANGE,e)}async hangup(e=!1,t=!1){if(this.callKit.logger.info("connect hangup",{caller:"Connect.hangup",type:"SIP",content:{isUnprompted:e,isError:t,connectStatus:this.connectStatus}}),this.setOutgoing(!1),this.isUnprompted=e,this.setHold(!1),this.setMute(!1),this.connectStatus!==ne.init)try{e&&(this.isRinging()||this.isCalling())&&(this.hasInvite?(this.currentSession?.state!==v.Terminated&&this.currentSession?.state!==v.Terminating&&this.currentSession.reject(),this.hasInvite=!1):await this.currentSession?.bye()),ji(this.mediaStream);let r=this.getAduioReference();r&&(r.pause(),r.srcObject=null),this.setConnectStatus(ne.init),this.callKit.trigger(H.CALL_END,new Date),this.setCallId(null)}catch(r){this.callKit.trigger(H.CALL_END,new Date),this.callKit.reset(),this.callKit.logger.error(r,{caller:"Connect.hangup",type:"SIP",content:{connectStatus:this.connectStatus,isError:t,isUnprompted:e}})}}getRemoteMediaStream(e){this.callKit.logger.info("connect getRemoteMediaStream",{caller:"Connect.getRemoteMediaStream",type:"SIP",content:{session:e}});let t=e.sessionDescriptionHandler;if(t)return t.remoteMediaStream}setupRemoteMedia(e){this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:e}});let t=this.getRemoteMediaStream(e),r=this.getAduioReference();r?(r.autoplay=!0,r.srcObject=t,r.play().catch(i=>{this.callKit.logger.error(i.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:V.WEBRTC_AUDIO_PLAY_ERROR}})}),t.onaddtrack=()=>{this.callKit.logger.info("Remote media onaddtrack",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:e}}),r.load(),r.play().catch(i=>{this.callKit.logger.error(i.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:V.WEBRTC_AUDIO_PLAY_ERROR}})})}):this.callKit.logger.error("video is not exist",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:V.WEBRTC_AUDIO_PLAYER_ERROR}})}async setHold(e){if(this.isHold===e){this.callKit.logger.warn("Already holding",{caller:"Connect.setHold",type:"SIP",content:{isHold:this.isHold}});return}this.callKit.socket.send(e?be.HOLD:be.UNHOLD),this.isHold=e,this.callKit.logger.info("connect setHold",{caller:"Connect.setHold",type:"SIP",content:{hold:e}}),this.callKit.trigger(H.KIT_SET_HOLD,e)}async setMute(e){if(this.isMute===e){this.callKit.logger.warn("Already muted",{caller:"Connect.setMute",type:"SIP",content:{isCalling:this.isCalling(),isMuted:this.isMuted()}});return}this.callKit.socket.send(e?be.MUTE:be.UNMUTE),this.isMute=e,this.callKit.trigger(H.KIT_SET_MUTE,e)}async refer(e,t){this.callKit.logger.info("connect refer",{caller:"Connect.refer",type:"SIP",content:{referTo:e,extra:t}});let r;e&&(r=ce.makeURI(e)),this.currentSession.refer(r,t?.sessionReferOptions)}};var zr=class{callKit;ws;lastPingTime=void 0;pingTimer;reconnectTimer;reconnectAttempts=0;connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1};get startConfirm(){return this.connectAuthState.startConfirm}get isError(){return this.connectAuthState.isError}constructor(e){this.callKit=e}get reconnectConfig(){return this.callKit.config.getReconnectConfig("incall")}init(){let{socket:e}=this.callKit.config.getConfig();this.callKit.logger.info(`socket init: ${e}`,{caller:"Socket.init",type:"INCALL",content:{socket:e}}),this.connect(e)}setConnectAuthState(e,t){this.connectAuthState[e]!==t&&(this.connectAuthState[e]=t)}handleDisconnect(){this.setConnectAuthState("isConnected",!1);let{enabled:e}=this.reconnectConfig;if(!this.callKit.config.isLogin()||!e){this.callKit.reset(),this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"});return}this.connectAuthState.isReconnecting||this.connectAuthState.isError||this.attemptReconnect()}clearWebSocket(){this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null),(this.ws?.readyState===WebSocket.CONNECTING||this.ws?.readyState===WebSocket.OPEN)&&(this.ws?.close(1e3,"socket close"),this.callKit.logger.info("socket clear",{caller:"Socket.clearWebSocket",type:"INCALL",content:{}})),this.ws=void 0,this.setConnectAuthState("isConnected",!1)}connect(e){this.ws&&this.clearWebSocket(),this.ws=new WebSocket(e),this.ws.onopen=t=>this.onOpen(t),this.ws.onclose=t=>this.onClose(t),this.ws.onerror=t=>this.onError(t),this.ws.onmessage=t=>this.onMessage(t)}onOpen(e){this.callKit.logger.info("socket onOpen",{caller:"Socket.onOpen",type:"INCALL",content:{ev:e}}),this.setConnectAuthState("isConnected",!0),this.lastPingTime=Date.now(),this.checkPing(),this.send(be.START),this.connectAuthState.isReconnecting&&(this.setConnectAuthState("isReconnecting",!1),this.callKit.logger.info("reconnect success",{caller:"Socket.onOpen",type:"INCALL",content:{event:"INCALL_RECONNECT_SUCCESS",reconnectAttempts:this.reconnectAttempts}}),this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_SUCCESS"}))}cleanReconnectState(){this.reconnectAttempts=0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.setConnectAuthState("isReconnecting",!1),this.setConnectAuthState("isError",!1)}resetConnectState(){this.connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1},this.cleanReconnectState(),this.callKit.logger.info("reset connect state",{caller:"Socket.resetConnectState",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,connectAuthState:this.connectAuthState}})}onClose(e){this.callKit.logger.info("socket onClose",{caller:"Socket.onClose",type:"INCALL",content:{ev:e}}),this.handleDisconnect()}onError(e){this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_CONNECT_ERROR",err:e}),this.callKit.logger.error("socket onError",{caller:"Socket.onError",type:"INCALL",content:{errCode:V.SOCKET_CONNECT_ERROR,data:e}})}confirmAck(e){let{ack:t,messageId:r}=e;t&&this.send(be.ACK,{messageId:r})}onMessage(e){let t=JSON.parse(e.data),r=t.data;try{typeof t.data=="string"&&t.data&&(r=JSON.parse(t.data))}catch{this.callKit.logger.info("socket onMessage parse error",{caller:"Socket.onMessage",type:"INCALL",content:{data:t.data}})}this.callKit.logger.info(`socket onMessage: ${t.event}`,{caller:"Socket.onMessage",type:"INCALL",content:{data:r,event:t.event}}),this.confirmAck(t);let i=r?.callUuid||"";if(t.event===pe.PONG){this.lastPingTime=Date.now();return}if(t.event===pe.START_CONFIRM&&(this.setConnectAuthState("startConfirm",!0),this.cleanReconnectState()),t.event===pe.CUSTOMER_RINGING&&this.callKit.trigger(H.CALL_RINGING,{time:new Date,callUuid:i}),t.event===pe.CUSTOMER_PICK_UP&&this.callKit.trigger(H.CALL_PICK_UP,{time:new Date,callUuid:i}),t.event===pe.AGENT_PICK_UP&&this.callKit.trigger(H.AGENT_PICK_UP,{time:new Date,callUuid:i}),t.event===pe.CUSTOMER_HANG_UP&&(this.callKit.trigger(H.CALL_HANG_UP,{time:new Date,callUuid:i}),i&&this.callKit.connect.socketTriggerHangup(i)),t.event===pe.CUSTOMER_NO_ANSWER&&(this.callKit.trigger(H.CALL_NO_ANSWER,{time:new Date,callUuid:i}),i&&this.callKit.connect.socketTriggerHangup(i)),t.event===pe.CALL_CDR&&this.callKit.trigger(H.CALL_CDR,{time:new Date,callUuid:i,...r}),t.event===pe.CLOSE){let{userInfo:s}=this.callKit.config.getConfig();this.send(be.END,{agentId:s.agentId,callUuid:i})}t.event===pe.ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(t.msg,{caller:`Socket.onMessage:${t.event}`,type:"INCALL",content:{errCode:V.SOKET_SERVER_ERROR,data:r,callUuid:i}})),t.event===pe.SESSION_ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(t.msg,{caller:`Socket.onMessage:${t.event}`,type:"INCALL",content:{data:r,event:pe.SESSION_ERROR,callUuid:i}})),t.event===pe.AGENT_NO_ANSWER&&i&&this.callKit.connect.socketTriggerHangup(i),t.event===pe.AGENT_HANG_UP&&i&&this.callKit.connect.socketTriggerHangup(i),this.callKit.trigger(H.SERVER_SOCKET_EVENT,{...t,callUuid:i})}send(e,t){if(!this.connectAuthState.isConnected){this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"}),this.callKit.reset(),this.callKit.logger.error("socket not connected",{caller:"Socket.send",type:"INCALL",content:{errCode:V.SOCKET_CONNECT_ERROR}});return}let{userInfo:r,version:i}=this.callKit.config.getConfig(),{sessionId:s,extno:o,agentId:a}=r;if(this.callKit.logger.info("Socket send",{caller:"Socket.send",type:"INCALL",content:{agentId:a,sessionId:s,userInfo:r}}),!s){this.callKit.logger.error("sessionId is empty",{caller:"Socket.send",type:"INCALL",content:{errCode:V.SOCKET_CONNECT_ERROR}});return}let d={event:e,sessionId:s,version:i,...t};be.CALL===e&&(d.phoneNum=o,d.agentId=a,t?.sourceType===xe.phoneNum?delete d.workOrderId:t?.sourceType===xe.workOrderId&&delete d.phoneNum),this.callKit.logger.info("socket send",{caller:"Socket.send",type:"INCALL",content:{...d}}),this.ws?.send(JSON.stringify({event:e,...d}))}ping(){if(!this.connectAuthState.isConnected)return;this.send(be.PING);let e=Date.now(),{pingInterval:t,pingTimeout:r}=this.reconnectConfig;e-this.lastPingTime>t+r&&(this.ws&&this.connectAuthState.isConnected?this.ws.close(4001,"ping timeout"):this.callKit.reset(),this.callKit.logger.error("socket ping timeout",{caller:"Socket.ping",type:"INCALL",content:{errCode:V.SOCKET_PING_TIMEOUT}}),this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_PING_TIMEOUT"}))}checkPing(){this.pingTimer&&clearInterval(this.pingTimer);let{pingInterval:e}=this.reconnectConfig;this.pingTimer=setInterval(()=>{this.ping()},e)}async reset(e){let{force:t=!1}=e||{};this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=void 0),t&&(this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RESET"}),this.resetConnectState()),this.lastPingTime=void 0,this.setConnectAuthState("startConfirm",!1),this.clearWebSocket()}attemptReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let{maxAttempts:e}=this.reconnectConfig;if(this.reconnectAttempts>=e){this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_ERROR"}),this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error("Maximum reconnection attempts reached",{caller:"Socket.attemptReconnect",type:"INCALL",content:{errCode:V.SOCKET_RECONNECT_FAILED,reconnectAttempts:this.reconnectAttempts}});return}this.reconnectAttempts===0&&this.callKit.trigger(H.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_START"}),this.setConnectAuthState("isReconnecting",!0),this.reconnectAttempts+=1;let{delay:t}=this.reconnectConfig;this.callKit.logger.info(`Preparing reconnection attempt ${this.reconnectAttempts}/${e}, delay: ${t}ms`,{caller:"Socket.attemptReconnect",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:e,delay:t}}),this.reconnectTimer=setTimeout(()=>{let{socket:r}=this.callKit.config.getConfig();this.connect(r)},t)}};var Ki=class{api;config;logger;callCenter;connect;socket;listener=[];constructor(e){this.config=new Cr(this),this.api=new fr(this),this.connect=new Jr(this),this.callCenter=new mr(this),this.socket=new zr(this),this.logger=new vr(this,e.log),e.log&&this.config.setConfig("log",e.log),e.trackLogs&&this.config.setConfig("trackLogs",{...Mt,...e.trackLogs}),e.audioRef&&this.config.setConfig("audioRef",e.audioRef),e.host&&this.config.setConfig("host",e.host),this.config.setConfig("constrains",e.constrains||pr),this.config.setConfig("socket",e.socket),this.config.setConfig("reconnect",{sip:{...Ut,...e.reconnect?.sip||{}},incall:{...Ft,...e.reconnect?.incall||{}}}),this.logger.info("callKit init",{caller:"CallKit.init",content:e})}async login(e,t,r={encryptionMethod:je.INTERNAL}){if(this.config.isLogin()){this.logger.warn("already login",{caller:"CallKit.login",content:{username:e,password:t,extra:r}});return}let i="",{encryptionMethod:s=je.INTERNAL}=r;switch(s){case je.NONE:i=t;break;case je.INTERNAL:i=(0,Gt.default)(e+(0,Gt.default)(t));break;default:i=(0,Gt.default)(e+(0,Gt.default)(t));break}if(this.logger.info("login info:",{caller:"CallKit.login",content:{username:e,password:t,encryptionMethod:s,encryptionPassword:i}}),this.socket.isError){this.logger.warn("socket is error",{caller:"CallKit.login",content:{username:e,password:t,extra:r,socketError:this.socket.isError}});return}try{let o=await this.api.login({userName:e,password:i,timestamp:Date.now()});o&&(this.config.setConfig("userInfo",{wsUrl:`wss://${o.wsUrl}`,sessionId:o.sessionId,username:e,password:i,encryptionPassword:i,agentId:o.agentId,fsUserId:o.fsUserId,userPart:o.userPart,fsPassword:o.fsPassword,fsIp:o.fsIp,fsPort:o.fsPort,iceInfo:o.iceInfo,iceGatheringTimeout:o.iceGatheringTimeout,logGather:o.logGather,...r}),this.socket.init(),this.trigger(H.KIT_LOGIN_CHANGE,!0))}catch(o){this.logger.error(o,{caller:"CallKit.login",content:{errCode:V.API_USER_LOGIN_ERROR}})}}async logout({isReset:e=!0}={isReset:!0}){if(!this.config.check())return;let{userInfo:t}=this.config.getConfig();if(this.logger.info("logout",{caller:"CallKit.logout",content:{sessionId:t.sessionId}}),this.config.isLogin()){let{sessionId:r}=t;try{await this.api.loginOut({sessionId:r,timestamp:Date.now()})}catch(i){this.logger.warn(i,{caller:"CallKit.logout",content:{errCode:V.API_USER_LOGOUT_ERROR}})}}e?await this.reset():this.config.reset()}async call(e="",t={sourceType:xe.phoneNum,workOrderId:""}){if(!this.config.check())return;if(!this.connect.isRegistered){this.logger.warn("Currently not registered",{caller:"CallKit.call",content:{extno:e,options:t}});return}let{sourceType:r,workOrderId:i}=t;this.config.setUserInfo("sourceType",r),r===xe.phoneNum?e&&this.config.setUserInfo("extno",e):r===xe.workOrderId&&i&&this.config.setUserInfo("workOrderId",i),this.logger.info("call",{caller:"CallKit.call",content:{extno:e,options:t}}),this.callCenter.callStart(t)}async refer(e,t){this.config.check()&&(this.logger.info("refer",{caller:"CallKit.refer",content:{uri:e,options:t}}),this.callCenter.callRefer(e,t))}async register(){this.config.check()&&(this.logger.info("register",{caller:"CallKit.register",content:{}}),this.connect.register())}async unregister(){this.config.check()&&(this.logger.info("unregister",{caller:"CallKit.unregister",content:{}}),this.connect.unregister())}async hangup(){if(this.config.check()){if(this.logger.info("hangup",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}}),!this.connect.isConnecting()&&!this.connect.isRinging()&&!this.connect.isCalling()&&!this.connect.isHolding()){this.logger.warn("Currently not in a call",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}});return}await this.callCenter.callEnd(!0)}}hold(){this.config.check()&&(this.logger.info("hold",{caller:"CallKit.hold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callHold())}unhold(){this.config.check()&&(this.logger.info("unhold",{caller:"CallKit.unhold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnhold())}mute(){this.config.check()&&(this.logger.info("mute",{caller:"CallKit.mute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callMute())}unmute(){this.config.check()&&(this.logger.info("unmute",{caller:"CallKit.unmute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnmute())}async setUserStatus(e,t={}){let{agentId:r}=this.config.getConfig().userInfo;this.logger.info("setUserStatus",{caller:"CallKit.setUserStatus",content:{status:e,agentId:r}}),await this.api.updateUserStatus({agentId:r,userStatus:e,timestamp:Date.now(),...t})}async reset(e){let{force:t=!1}=e||{};this.logger.info("reset",{caller:"CallKit.reset",content:{connectStatus:this.connect.connectStatus,force:t}}),this.connect.isCalling()&&await this.hangup(),await this.connect.reset(),this.config.isLogin()?await this.logout({isReset:!1}):await this.config.reset(),await this.socket.reset({force:t})}on(e,t){this.listener.push({event:e,callback:t})}off(e,t){this.logger.info(`off ${e}`,{caller:"CallKit.off",content:{event:e}}),t?this.listener=this.listener.filter(r=>!(r.event===e&&r.callback===t)):this.listener=this.listener.filter(r=>r.event!==e)}removeAllListeners(){this.listener=this.listener.splice(0,this.listener.length),this.logger.info("removeAllListeners",{caller:"CallKit.removeAllListeners",content:{listener:this.listener}})}trigger(e,t,r=!1){r||this.logger.info(`Trigger Event: ${e}`,{caller:"CallKit.trigger",content:t}),this.listener.forEach(i=>{if(i.event===e)try{i.callback(t)}catch(s){this.logger.error(`Event callback error: ${e}`,s,!0)}})}};return zn(tc);})();
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var nt=Object.create;var w=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var rt=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,ct=Object.prototype.hasOwnProperty;var at=(s,t)=>{for(var e in t)w(s,e,{get:t[e],enumerable:!0})},J=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of rt(t))!ct.call(s,n)&&n!==e&&w(s,n,{get:()=>t[n],enumerable:!(i=st(t,n))||i.enumerable});return s};var V=(s,t,e)=>(e=s!=null?nt(ot(s)):{},J(t||!s||!s.__esModule?w(e,"default",{value:s,enumerable:!0}):e,s)),lt=s=>J(w({},"__esModule",{value:!0}),s);var dt={};at(dt,{CallKit:()=>q});module.exports=lt(dt);var v=V(require("blueimp-md5"));var Y=V(require("axios")),j=Y.default.create({headers:{"Content-Type":"application/x-www-form-urlencoded"},timeout:6e4});j.interceptors.request.use(s=>s);j.interceptors.response.use(s=>s.data,s=>Promise.reject(s));var gt=s=>j.request(s),X=gt;var U=class{callKit;constructor(t){this.callKit=t}isLogining=!1;isLoginOuting=!1;async login(t){if(this.isLogining){this.callKit.logger.info("login is already in progress cancel",{caller:"Api.login",content:{userName:t.userName,timestamp:t.timestamp}});return}this.isLogining=!0;try{return await this.post({url:"/auth/agentUser/login",method:"post",data:t})}finally{this.isLogining=!1}}async loginOut(t){if(this.isLoginOuting){this.callKit.logger.info("loginOut is already in progress cancel",{caller:"Api.loginOut",content:{sessionId:t.sessionId,timestamp:t.timestamp}});return}this.isLoginOuting=!0;try{return await this.post({url:"/auth/agentUser/loginOut",method:"post",data:t})}finally{this.isLoginOuting=!1}}async trackLogs(t){return this.post({url:"/agent/user/sdkLog",method:"post",data:{content:[t]}},{useFormData:!0,skipLog:!0})}async updateUserStatus(t){return this.post({url:"/agent/user/changeStatus",method:"post",data:t})}async post(t,e={skipLog:!1}){let{userInfo:i,host:n}=this.callKit.config.getConfig(),{sessionId:l}=i;if(t.url=`${n}${t.url}`,t.headers={"Content-Type":"application/x-www-form-urlencoded",...t.headers},t.headers["Content-Type"]==="application/x-www-form-urlencoded"&&e.useFormData){let P=new FormData,K=t.data||{};for(let c in K)Object.prototype.hasOwnProperty.call(K,c)&&P.append(c,K[c]);t.data=P}else t.data=new URLSearchParams(t.data).toString();l&&(t.headers.sessionId=l);let o=Date.now();e.skipLog||this.callKit.logger.info("API Request Start",{type:"API",caller:"API.Request",content:{url:t.url,headers:t.headers,data:t.data,extra:e,startTime:o}});let C=await X(t).catch(()=>{this.callKit.config.reset()}),u=Date.now();if(e.skipLog||this.callKit.logger.info("API Request Finish",{type:"API",caller:"API.Request",content:{url:t.url,duration:`${u-o}ms`,response:C}}),!C)throw this.callKit.reset(),new Error("Network error");let{code:d,data:k,message:F}=C;if(d==="000000")return k;throw d==="100013"&&this.callKit.config.reset(),new Error(F??"Request failed")}};var f={init:0,connecting:2,ringing:4,calling:5},r={KIT_LOG:"log",KIT_USER_STATUS_CHANGE:"userStatusChange",KIT_LOGIN_CHANGE:"loginChange",KIT_REGISTER_CHANGE:"registerChange",KIT_CALL_STATUS_CHANGE:"callStatusChange",KIT_SET_HOLD:"holdChange",KIT_SET_MUTE:"muteChange",KIT_CALL_ID_CHANGE:"callIdChange",KIT_ERROR:"error",KIT_INVITE:"invite",KIT_OUTGOING_INVITE:"outgoingInvite",CALL_CONNECTING:"connecting",CALL_RINGING:"ringing",AGENT_PICK_UP:"agentPickUp",CALL_PICK_UP:"pickUp",CALL_NO_ANSWER:"noAnswer",CALL_HANG_UP:"hangUp",CALL_END:"callEnd",CALL_CDR:"callCdr",SERVER_SOCKET_EVENT:"socketEvent",USER_STATUS_CHANGE:"userStatusChange",INCALL_CONNECT_EVENT:"IncallConnectEvent",SIP_CONNECT_EVENT:"sipConnectEvent",SIP_REGISTERER_EVENT:"sipRegistererEvent",SIP_SESSION_EVENT:"sipSessionEvent"},a={UNKNOWN_ERROR:-1,API_USER_LOGIN_ERROR:1000001,API_USER_STATUS_UPDATE_ERROR:1000002,API_USER_LOGOUT_ERROR:1000003,CONNECT_CALL_STATUS_ERROR:2000001,USER_NOT_LOGIN:2000002,WEBRTC_USER_MEDIA_ERROR:2000003,WEBRTC_HOLE_STATUS_ERROR:2000004,WEBRTC_AUDIO_PLAYER_ERROR:2000005,WEBRTC_AUDIO_PLAY_ERROR:2000006,WEBRTC_USER_AGENT_ERROR:2000007,WEBRTC_CALL_INVITE_ERROR:2000008,WEBRTC_REGISTER_ERROR:2000009,WEBRTC_MUTE_STATUS_ERROR:2000010,WEBRTC_CANCEL_REGISTER_ERROR:2000011,WEBRTC_MUTE_ERROR:2000012,SOCKET_CONNECT_ERROR:3000001,SOCKET_PING_TIMEOUT:3000002,SOKET_SERVER_ERROR:3000003,SOCKET_CALL_ERROR:3000004,SOCKET_RECONNECT_FAILED:3000005},Z={info:9,success:4,warn:3,error:2,silent:1},R={PING:"PING",START:"START",AGENT_HANGUP:"AGENT_HANG_UP",CALL_CANCEL:"AGENT_CANCEL",HOLD:"AGENT_HOLD",UNHOLD:"AGENT_UN_HOLD",MUTE:"AGENT_MUTE",UNMUTE:"AGENT_UN_MUTE",CALL:"CALL",END:"STOP",AGENT_TRANSFER:"AGENT_TRANSFER",HANG_UP_REASON:"HANG_UP_REASON",ACK:"ACK"},S={PONG:"PONG",START_CONFIRM:"START_CONFIRM",CALL_SUCCESS:"CALL_SUCCESS",CALL_FAILED:"CALL_FAILED",CUSTOMER_RINGING:"CUSTOMER_RINGING",AGENT_PICK_UP:"AGENT_PICK_UP",CUSTOMER_PICK_UP:"CUSTOMER_PICK_UP",CUSTOMER_NO_ANSWER:"CUSTOMER_NO_ANSWER",CUSTOMER_HANG_UP:"CUSTOMER_HANG_UP",AGENT_NO_ANSWER:"AGENT_NO_ANSWER",AGENT_HANG_UP:"AGENT_HANG_UP",CALL_CDR:"CALL_CDR",STOP_CONFIRM:"STOP_CONFIRM",CLOSE:"CLOSE",ERROR:"ERROR",SESSION_ERROR:"SESSION_ERROR"},_={NONE:"NONE",INTERNAL:"INTERNAL"},G={audio:{autoGainControl:!0,noiseSuppression:!0,echoCancellation:!0},video:!1},m={phoneNum:1,workOrderId:2},L={enabled:!1,interval:5e3,maxSize:8192},A={enabled:!0,maxAttempts:3,delay:1e3,pingInterval:3e4,pingTimeout:5e3},O={enabled:!0,maxAttempts:3,delay:1e3};var b=class{callKit;constructor(t){this.callKit=t}async callStart(t){if(this.callKit.config.check()){if(this.callKit.logger.info("callStart",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}}),!this.callKit.socket.startConfirm){this.callKit.logger.warn("server not confirm start",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}});return}this.callKit.connect.call(async e=>{let i={...t?.extra||{},agentId:e.agentId,sourceType:e.sourceType};e.sourceType===m.phoneNum?i.phoneNum=e.extno:e.sourceType===m.workOrderId&&(i.workOrderId=e.workOrderId),this.callKit.socket.send(R.CALL,i)})}}async callRefer(t,e){this.callKit.config.check()&&(this.callKit.logger.info("callRefer",{caller:"Call.callRefer",content:{referTo:t,options:e}}),this.callKit.connect.refer(t,e))}async callEnd(t=!1,e=!1){this.callKit.connect.connectStatus!==f.init&&this.callKit.config.check()&&(this.callKit.logger.info("callEnd",{caller:"Call.callEnd",content:{isUnprompted:t,isError:e,connectStatus:this.callKit.connect.connectStatus}}),this.callKit.connect.hangup(t,e))}async callHold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be held",{caller:"Call.callHold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!0)}}async callUnhold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot unhold",{caller:"Call.callUnhold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!1)}}async callMute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be muted",{caller:"Call.callMute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!0)}}async callUnmute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be unmuted",{caller:"Call.callUnmute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!1)}}};var Q={name:"@koi-design/callkit",version:"2.0.5-beta.13",description:"callkit",author:"koi",license:"ISC",scripts:{build:"tsup",start:"vite",dev:"tsup --watch",lint:"eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",release:"tsup && node scripts/pkg.js"},exports:{".":{types:"./dist/index.d.ts",require:"./dist/index.js",import:"./dist/index.mjs"}},main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",files:["dist"],dependencies:{axios:"~0.26.1","blueimp-md5":"^2.12.0","eslint-plugin-jsonc":"^2.21.0","json-stringify-safe":"^5.0.1","sip.js":"^0.21.2"},devDependencies:{"@commitlint/cli":"^9.1.2","@commitlint/config-conventional":"^9.1.2","@koi-design/eslint-config-ts":"^0.0.14","@types/blueimp-md5":"^2.18.2",archiver:"^5.3.1",consola:"^3.4.2",eslint:"~8.29.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.5.0",husky:"^8.0.3","lint-staged":"^10.5.4",prettier:"^2.6.2",tsup:"6.6.3",typescript:"^4.6.3",vite:"^4"}};var M=class{callKit;constructor(t){this.callKit=t}config={version:`V${Q.version}`,host:"",log:"info",trackLogs:L,audioRef:void 0,constrains:G,socket:"",reconnect:{sip:O,incall:A},userInfo:{wsUrl:"",logGather:!1,sessionId:"",username:"",password:"",encryptionPassword:_.INTERNAL,sourceType:m.phoneNum,extno:"",workOrderId:"",userPart:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:0,encryptionMethod:_.INTERNAL}};getConfig=()=>this.config;setConfig=async(t,e)=>{this.config[t]=e};setUserInfo=async(t,e)=>{this.config.userInfo[t]=e,this.callKit.logger.info("setUserInfo",{caller:"Config.setUserInfo",content:{key:t,value:e}})};reset=async()=>{this.isLogin()&&(this.config.userInfo={wsUrl:"",sessionId:"",username:"",password:"",encryptionPassword:"",userPart:"",sourceType:m.phoneNum,extno:"",workOrderId:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:this.config.userInfo.iceGatheringTimeout,encryptionMethod:_.INTERNAL,logGather:!1},this.callKit.trigger(r.KIT_LOGIN_CHANGE,!1))};validate=()=>{let{userPart:t,fsIp:e,fsPassword:i,fsPort:n}=this.config.userInfo;return!(!t||!e||!n||!i)};isLogin=()=>this.validate();check(){return this.isLogin()?!0:(this.callKit.logger.warn("User not logged in",{caller:"Config.check",content:{errCode:a.USER_NOT_LOGIN}}),!1)}getTrackLogsConfig(){return{...L,...this.config?.trackLogs}}getReconnectConfig(t){return{...this.config?.reconnect?.[t]??(t==="sip"?O:A)}}enableTrackLogs(t){this.config.trackLogs.enabled=t}};var et=V(require("json-stringify-safe"));function y(s){return Z[s]}function ft(s){let{timestamp:t,level:e,type:i="OTHER",message:n,caller:l,content:o}=s,C=String(e).toUpperCase();return`${t} [${C}] [${i}] [${l??"unknown"}] [${n}] ${(0,et.default)(o)}`.trim()}function tt(s){return new Blob([s]).size}var D=class{prefix="CallKit";level="info";pendingTrackLogs=[];trackLogsTimer=null;callKit;constructor(t,e){this.callKit=t,this.level=e||"info",this.startTrackLogsTimer()}startTrackLogsTimer(){let{interval:t}=this.callKit.config.getTrackLogsConfig();this.trackLogsTimer||(this.trackLogsTimer=setInterval(()=>{this.flushTrackLogs()},t))}flushTrackLogs(){if(this.pendingTrackLogs.length===0)return;let{enabled:t,maxSize:e}=this.callKit.config.getTrackLogsConfig();if(t)try{let i=[],n=[],l=0;for(let o of this.pendingTrackLogs){let C=tt(o),u=n.length>0?`
|
|
1
|
+
var nt=Object.create;var w=Object.defineProperty;var st=Object.getOwnPropertyDescriptor;var rt=Object.getOwnPropertyNames;var ot=Object.getPrototypeOf,ct=Object.prototype.hasOwnProperty;var at=(s,t)=>{for(var e in t)w(s,e,{get:t[e],enumerable:!0})},J=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of rt(t))!ct.call(s,n)&&n!==e&&w(s,n,{get:()=>t[n],enumerable:!(i=st(t,n))||i.enumerable});return s};var V=(s,t,e)=>(e=s!=null?nt(ot(s)):{},J(t||!s||!s.__esModule?w(e,"default",{value:s,enumerable:!0}):e,s)),lt=s=>J(w({},"__esModule",{value:!0}),s);var dt={};at(dt,{CallKit:()=>q});module.exports=lt(dt);var v=V(require("blueimp-md5"));var Y=V(require("axios")),j=Y.default.create({headers:{"Content-Type":"application/x-www-form-urlencoded"},timeout:6e4});j.interceptors.request.use(s=>s);j.interceptors.response.use(s=>s.data,s=>Promise.reject(s));var gt=s=>j.request(s),X=gt;var U=class{callKit;constructor(t){this.callKit=t}isLogining=!1;isLoginOuting=!1;async login(t){if(this.isLogining){this.callKit.logger.info("login is already in progress cancel",{caller:"Api.login",content:{userName:t.userName,timestamp:t.timestamp}});return}this.isLogining=!0;try{return await this.post({url:"/auth/agentUser/login",method:"post",data:t})}finally{this.isLogining=!1}}async loginOut(t){if(this.isLoginOuting){this.callKit.logger.info("loginOut is already in progress cancel",{caller:"Api.loginOut",content:{sessionId:t.sessionId,timestamp:t.timestamp}});return}this.isLoginOuting=!0;try{return await this.post({url:"/auth/agentUser/loginOut",method:"post",data:t})}finally{this.isLoginOuting=!1}}async trackLogs(t){return this.post({url:"/agent/user/sdkLog",method:"post",data:{content:[t]}},{useFormData:!0,skipLog:!0})}async updateUserStatus(t){return this.post({url:"/agent/user/changeStatus",method:"post",data:t})}async post(t,e={skipLog:!1}){let{userInfo:i,host:n}=this.callKit.config.getConfig(),{sessionId:l}=i;if(t.url=`${n}${t.url}`,t.headers={"Content-Type":"application/x-www-form-urlencoded",...t.headers},t.headers["Content-Type"]==="application/x-www-form-urlencoded"&&e.useFormData){let P=new FormData,K=t.data||{};for(let c in K)Object.prototype.hasOwnProperty.call(K,c)&&P.append(c,K[c]);t.data=P}else t.data=new URLSearchParams(t.data).toString();l&&(t.headers.sessionId=l);let o=Date.now();e.skipLog||this.callKit.logger.info("API Request Start",{type:"API",caller:"API.Request",content:{url:t.url,headers:t.headers,data:t.data,extra:e,startTime:o}});let C=await X(t).catch(()=>{this.callKit.config.reset()}),u=Date.now();if(e.skipLog||this.callKit.logger.info("API Request Finish",{type:"API",caller:"API.Request",content:{url:t.url,duration:`${u-o}ms`,response:C}}),!C)throw this.callKit.reset(),new Error("Network error");let{code:d,data:k,message:F}=C;if(d==="000000")return k;throw d==="100013"&&this.callKit.config.reset(),new Error(F??"Request failed")}};var f={init:0,connecting:2,ringing:4,calling:5},r={KIT_LOG:"log",KIT_USER_STATUS_CHANGE:"userStatusChange",KIT_LOGIN_CHANGE:"loginChange",KIT_REGISTER_CHANGE:"registerChange",KIT_CALL_STATUS_CHANGE:"callStatusChange",KIT_SET_HOLD:"holdChange",KIT_SET_MUTE:"muteChange",KIT_CALL_ID_CHANGE:"callIdChange",KIT_ERROR:"error",KIT_INVITE:"invite",KIT_OUTGOING_INVITE:"outgoingInvite",CALL_CONNECTING:"connecting",CALL_RINGING:"ringing",AGENT_PICK_UP:"agentPickUp",CALL_PICK_UP:"pickUp",CALL_NO_ANSWER:"noAnswer",CALL_HANG_UP:"hangUp",CALL_END:"callEnd",CALL_CDR:"callCdr",SERVER_SOCKET_EVENT:"socketEvent",USER_STATUS_CHANGE:"userStatusChange",INCALL_CONNECT_EVENT:"IncallConnectEvent",SIP_CONNECT_EVENT:"sipConnectEvent",SIP_REGISTERER_EVENT:"sipRegistererEvent",SIP_SESSION_EVENT:"sipSessionEvent"},a={UNKNOWN_ERROR:-1,API_USER_LOGIN_ERROR:1000001,API_USER_STATUS_UPDATE_ERROR:1000002,API_USER_LOGOUT_ERROR:1000003,CONNECT_CALL_STATUS_ERROR:2000001,USER_NOT_LOGIN:2000002,WEBRTC_USER_MEDIA_ERROR:2000003,WEBRTC_HOLE_STATUS_ERROR:2000004,WEBRTC_AUDIO_PLAYER_ERROR:2000005,WEBRTC_AUDIO_PLAY_ERROR:2000006,WEBRTC_USER_AGENT_ERROR:2000007,WEBRTC_CALL_INVITE_ERROR:2000008,WEBRTC_REGISTER_ERROR:2000009,WEBRTC_MUTE_STATUS_ERROR:2000010,WEBRTC_CANCEL_REGISTER_ERROR:2000011,WEBRTC_MUTE_ERROR:2000012,SOCKET_CONNECT_ERROR:3000001,SOCKET_PING_TIMEOUT:3000002,SOKET_SERVER_ERROR:3000003,SOCKET_CALL_ERROR:3000004,SOCKET_RECONNECT_FAILED:3000005},Z={info:9,success:4,warn:3,error:2,silent:1},R={PING:"PING",START:"START",AGENT_HANGUP:"AGENT_HANG_UP",CALL_CANCEL:"AGENT_CANCEL",HOLD:"AGENT_HOLD",UNHOLD:"AGENT_UN_HOLD",MUTE:"AGENT_MUTE",UNMUTE:"AGENT_UN_MUTE",CALL:"CALL",END:"STOP",AGENT_TRANSFER:"AGENT_TRANSFER",HANG_UP_REASON:"HANG_UP_REASON",ACK:"ACK"},S={PONG:"PONG",START_CONFIRM:"START_CONFIRM",CALL_SUCCESS:"CALL_SUCCESS",CALL_FAILED:"CALL_FAILED",CUSTOMER_RINGING:"CUSTOMER_RINGING",AGENT_PICK_UP:"AGENT_PICK_UP",CUSTOMER_PICK_UP:"CUSTOMER_PICK_UP",CUSTOMER_NO_ANSWER:"CUSTOMER_NO_ANSWER",CUSTOMER_HANG_UP:"CUSTOMER_HANG_UP",AGENT_NO_ANSWER:"AGENT_NO_ANSWER",AGENT_HANG_UP:"AGENT_HANG_UP",CALL_CDR:"CALL_CDR",STOP_CONFIRM:"STOP_CONFIRM",CLOSE:"CLOSE",ERROR:"ERROR",SESSION_ERROR:"SESSION_ERROR"},_={NONE:"NONE",INTERNAL:"INTERNAL"},G={audio:{autoGainControl:!0,noiseSuppression:!0,echoCancellation:!0},video:!1},m={phoneNum:1,workOrderId:2},L={enabled:!1,interval:5e3,maxSize:8192},A={enabled:!0,maxAttempts:3,delay:1e3,pingInterval:3e4,pingTimeout:5e3},O={enabled:!0,maxAttempts:3,delay:1e3};var b=class{callKit;constructor(t){this.callKit=t}async callStart(t){if(this.callKit.config.check()){if(this.callKit.logger.info("callStart",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}}),!this.callKit.socket.startConfirm){this.callKit.logger.warn("server not confirm start",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}});return}this.callKit.connect.call(async e=>{let i={...t?.extra||{},agentId:e.agentId,sourceType:e.sourceType};e.sourceType===m.phoneNum?i.phoneNum=e.extno:e.sourceType===m.workOrderId&&(i.workOrderId=e.workOrderId),this.callKit.socket.send(R.CALL,i)})}}async callRefer(t,e){this.callKit.config.check()&&(this.callKit.logger.info("callRefer",{caller:"Call.callRefer",content:{referTo:t,options:e}}),this.callKit.connect.refer(t,e))}async callEnd(t=!1,e=!1){this.callKit.connect.connectStatus!==f.init&&this.callKit.config.check()&&(this.callKit.logger.info("callEnd",{caller:"Call.callEnd",content:{isUnprompted:t,isError:e,connectStatus:this.callKit.connect.connectStatus}}),this.callKit.connect.hangup(t,e))}async callHold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be held",{caller:"Call.callHold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!0)}}async callUnhold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot unhold",{caller:"Call.callUnhold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!1)}}async callMute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be muted",{caller:"Call.callMute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!0)}}async callUnmute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be unmuted",{caller:"Call.callUnmute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!1)}}};var Q={name:"@koi-design/callkit",version:"2.0.5-beta.14",description:"callkit",author:"koi",license:"ISC",scripts:{build:"tsup",start:"vite",dev:"tsup --watch",lint:"eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",release:"tsup && node scripts/pkg.js"},exports:{".":{types:"./dist/index.d.ts",require:"./dist/index.js",import:"./dist/index.mjs"}},main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",files:["dist"],dependencies:{axios:"~0.26.1","blueimp-md5":"^2.12.0","eslint-plugin-jsonc":"^2.21.0","json-stringify-safe":"^5.0.1","sip.js":"^0.21.2"},devDependencies:{"@commitlint/cli":"^9.1.2","@commitlint/config-conventional":"^9.1.2","@koi-design/eslint-config-ts":"^0.0.14","@types/blueimp-md5":"^2.18.2",archiver:"^5.3.1",consola:"^3.4.2",eslint:"~8.29.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.5.0",husky:"^8.0.3","lint-staged":"^10.5.4",prettier:"^2.6.2",tsup:"6.6.3",typescript:"^4.6.3",vite:"^4"}};var M=class{callKit;constructor(t){this.callKit=t}config={version:`V${Q.version}`,host:"",log:"info",trackLogs:L,audioRef:void 0,constrains:G,socket:"",reconnect:{sip:O,incall:A},userInfo:{wsUrl:"",logGather:!1,sessionId:"",username:"",password:"",encryptionPassword:_.INTERNAL,sourceType:m.phoneNum,extno:"",workOrderId:"",userPart:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:0,encryptionMethod:_.INTERNAL}};getConfig=()=>this.config;setConfig=async(t,e)=>{this.config[t]=e};setUserInfo=async(t,e)=>{this.config.userInfo[t]=e,this.callKit.logger.info("setUserInfo",{caller:"Config.setUserInfo",content:{key:t,value:e}})};reset=async()=>{this.isLogin()&&(this.config.userInfo={wsUrl:"",sessionId:"",username:"",password:"",encryptionPassword:"",userPart:"",sourceType:m.phoneNum,extno:"",workOrderId:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:this.config.userInfo.iceGatheringTimeout,encryptionMethod:_.INTERNAL,logGather:!1},this.callKit.trigger(r.KIT_LOGIN_CHANGE,!1))};validate=()=>{let{userPart:t,fsIp:e,fsPassword:i,fsPort:n}=this.config.userInfo;return!(!t||!e||!n||!i)};isLogin=()=>this.validate();check(){return this.isLogin()?!0:(this.callKit.logger.warn("User not logged in",{caller:"Config.check",content:{errCode:a.USER_NOT_LOGIN}}),!1)}getTrackLogsConfig(){return{...L,...this.config?.trackLogs}}getReconnectConfig(t){return{...this.config?.reconnect?.[t]??(t==="sip"?O:A)}}enableTrackLogs(t){this.config.trackLogs.enabled=t}};var et=V(require("json-stringify-safe"));function y(s){return Z[s]}function ft(s){let{timestamp:t,level:e,type:i="OTHER",message:n,caller:l,content:o}=s,C=String(e).toUpperCase();return`${t} [${C}] [${i}] [${l??"unknown"}] [${n}] ${(0,et.default)(o)}`.trim()}function tt(s){return new Blob([s]).size}var D=class{prefix="CallKit";level="info";pendingTrackLogs=[];trackLogsTimer=null;callKit;constructor(t,e){this.callKit=t,this.level=e||"info",this.startTrackLogsTimer()}startTrackLogsTimer(){let{interval:t}=this.callKit.config.getTrackLogsConfig();this.trackLogsTimer||(this.trackLogsTimer=setInterval(()=>{this.flushTrackLogs()},t))}flushTrackLogs(){if(this.pendingTrackLogs.length===0)return;let{enabled:t,maxSize:e}=this.callKit.config.getTrackLogsConfig();if(t)try{let i=[],n=[],l=0;for(let o of this.pendingTrackLogs){let C=tt(o),u=n.length>0?`
|
|
2
2
|
`:"",d=tt(u);l+C+d>e&&n.length>0?(i.push(n.join(`
|
|
3
3
|
`)),n=[o],l=C):(n.push(o),l+=C+d)}n.length>0&&i.push(n.join(`
|
|
4
|
-
`));for(let o of i)this.callKit.api.trackLogs(o);this.pendingTrackLogs=[]}catch(i){console.error(i)}}destroy(){this.trackLogsTimer&&(clearInterval(this.trackLogsTimer),this.trackLogsTimer=null),this.flushTrackLogs()}setLevel(t){this.level=t}info(t,e){let i=this.catchLog(t,e,"info");y(this.level)>=y("info")&&console.log(`%c${i}`,"color: gray;")}success(t,e){let i=this.catchLog(t,e,"success");y(this.level)>=y("success")&&console.log(`%c${i}`,"color: green;")}warn(t,e){let i=this.catchLog(t,e,"warn");y(this.level)>=y("warn")&&console.log(`%c${i}`,"color: orange;")}error(t,e,i=!1){let n=t instanceof Error?t.message:t,l=this.catchLog(n,e,"error");y(this.level)>=y("error")&&console.log(`%c${l}`,"color: red;");let{errCode:o,...C}=e?.content??{},u=o??a.UNKNOWN_ERROR;i||this.callKit.trigger(r.KIT_ERROR,{code:u,msg:n,data:C});let d=new Error(n);throw d.name="CallKitError",d.code=u,d.data=C,d}catchLog(t,e,i){let n=new Date,{enabled:l}=this.callKit.config.getTrackLogsConfig(),{userInfo:o}=this.callKit.config.getConfig(),C={agentId:o?.agentId,sessionId:o?.sessionId,...e?.content??{}},u={timestamp:n.toLocaleString().replace("T"," ").replace(".000Z",""),level:i,message:t,caller:e?.caller,type:e?.type,content:C},d=ft(u);return l&&this.pendingTrackLogs.push(d),this.callKit.trigger(r.KIT_LOG,d,!0),d}};var g=require("sip.js");var it=s=>{let t=s["x-antaios-manual-extend_info"]||s["x-antaios-manual-extend-info"],e=null;try{if(t&&typeof t=="string"){let i=t.replace(/\\/g,"");return e=JSON.parse(i),e}}catch{return{}}};var x=6;function Ct(s){return s.replace(/(\w+):\s*'(.*?)'/g,'"$1": "$2"').replace(/'/g,'"')}var B=s=>{s&&s.getTracks().forEach(t=>t.stop())},ut=()=>{typeof navigator.mediaDevices>"u"&&(navigator.mediaDevices={}),typeof navigator.mediaDevices.getUserMedia>"u"&&(navigator.mediaDevices.getUserMedia=s=>{let t=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return t?new Promise((e,i)=>{t.call(navigator,s,e,i)}):Promise.reject(new Error("Unable to obtain device permissions. Please check your browser settings or device permissions."))})},H=class{callKit;isMute=!1;isRegister=!1;isHold=!1;connectStatus=f.init;currentSession;mediaStream;userAgent;registerer;isReConnected=!1;isOutgoing=!1;isUnprompted=!1;hasInvite=!1;constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("sip")}currentCallId=null;getCurrentCallId(){return this.currentCallId}setOutgoing(t){this.isOutgoing!==t&&(this.callKit.logger.info("setOutgoing",{caller:"Connect.setOutgoing",content:{outgoing:t}}),this.isOutgoing=t)}setCallId(t){this.callKit.logger.info("setCallId",{caller:"Connect.setCallId",content:{callId:t}}),this.currentCallId=t,this.callKit.trigger(r.KIT_CALL_ID_CHANGE,t)}async reset(){if(this.setOutgoing(!1),this.isUnprompted=!1,this.hasInvite=!1,this.isHolding()&&await this.setHold(!1),this.isMuted()&&await this.setMute(!1),this.connectStatus!==f.init&&this.setConnectStatus(f.init),this.isRegistered()&&await this.unregister(),this.currentCallId&&this.setCallId(null),this.currentSession=void 0,this.mediaStream=void 0,this.userAgent=void 0,this.registerer=void 0,this.mediaStream)try{B(this.mediaStream);let t=this.getAduioReference();t&&(t.pause(),t.srcObject=null)}catch(t){this.callKit.logger.error(t,{caller:"Connect.reset",content:{}})}this.setConnectStatus(f.init),this.clearHeartbeat()}getAduioReference(){let{audioRef:t}=this.callKit.config.getConfig();return typeof t=="function"?t():t}async permission(){this.callKit.logger.info("permission",{caller:"Connect.permission",content:{permission:!0}}),ut();let t=await navigator.mediaDevices.getUserMedia({audio:!0});B(t)}isConnecting(){return this.connectStatus===f.connecting}isCalling(){return this.connectStatus===f.calling}isRinging(){return this.connectStatus===f.ringing}isHolding(){return this.isHold}isRegistered(){return this.isRegister}isMuted(){return this.isMute}isInit(){return this.connectStatus===f.init}heartbeatInterval;heartbeatFlag=x;clearHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.heartbeatFlag=x}startHeartbeat(){this.heartbeatFlag=x,this.clearHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.heartbeatFlag-=1,this.heartbeatFlag<=0&&(this.heartbeatFlag=x,this.callKit.trigger(r.SIP_CONNECT_EVENT,{event:"OPTIONS_HEARTBEAT_EXPIRED"}))},1e3)}socketTriggerHangup(t){!this.isCalling()||t!==this.currentCallId||(this.callKit.logger.info("socketHangup trigger hangup",{caller:"Connect.socketHangup",content:{callId:t,currentCallId:this.currentCallId}}),this.callKit.hangup())}async register(){if(this.connectStatus!==f.init){if(this.isRegistered()){this.callKit.logger.warn("connectStatus is registered",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.reset(),this.callKit.logger.error("connectStatus is not init",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.logger.info("connect register",{caller:"Connect.register",content:{connectStatus:this.connectStatus}}),await this.permission().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",content:{errCode:a.WEBRTC_USER_MEDIA_ERROR}})});let{userInfo:t,constrains:e}=this.callKit.config.getConfig(),i=async()=>(this.mediaStream=await navigator.mediaDevices.getUserMedia(e),this.mediaStream),{userPart:n,fsIp:l,fsPort:o,iceInfo:C,wsUrl:u}=t,d={uri:g.UserAgent.makeURI(`sip:${n}@${l}:${o}`),displayName:n,transportOptions:{wsServers:[u],traceSip:!0},logLevel:"error",allowLegacyNotifications:!0,contactName:n,sessionDescriptionHandlerFactory:g.Web.defaultSessionDescriptionHandlerFactory(i),sessionDescriptionHandlerFactoryOptions:{constraints:e,iceGatheringTimeout:t.iceGatheringTimeout,peerConnectionConfiguration:{iceServers:JSON.parse(Ct(C))}}};this.callKit.logger.info("connect connectConfig",{caller:"Connect.register",content:d}),this.userAgent=new g.UserAgent(d);let k=new MediaStream,F=c=>{let I=this.getAduioReference();this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.register.setupRemoteMedia",content:I}),c.sessionDescriptionHandler.peerConnection.getReceivers().forEach(E=>{E.track&&k.addTrack(E.track)}),I?(I.srcObject=k,I.play().catch(E=>{this.callKit.logger.error(E.message,{caller:"Connect.register.setupRemoteMedia",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})):this.callKit.logger.error("video is not exist",{caller:"Connect.register",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})},P=(c,I)=>{let{that:E=this}=I,T=c.userAgentCore,h=T.receiveIncomingRequestFromTransport.bind(T);T.receiveIncomingRequestFromTransport=p=>(p.method==="OPTIONS"&&E.startHeartbeat(),E.callKit.logger.info(`SIP Receive: ${p?.method}`,{caller:"Connect.register.observeSocketStatus.receiveRequest",type:"SIP",content:{request:p}}),h(p));let $=T.receiveIncomingResponseFromTransport.bind(T);T.receiveIncomingResponseFromTransport=p=>(E.callKit.logger.info(`SIP Receive Response: ${p?.statusCode} ${p?.reasonPhrase}`,{caller:"Connect.register.observeSocketStatus.receiveResponse",type:"SIP",content:{response:p}}),$(p));let{transport:N}=c;if(N){let p=N.send.bind(N);N.send=z=>(E.callKit.logger.info("SIP send message",{caller:"Connect.register.observeSocketStatus",type:"SIP",content:{message:z.toString()}}),p(z))}},K={};this.registerer=new g.Registerer(this.userAgent,K),this.registerer.stateChange.addListener(c=>{switch(c){case g.RegistererState.Initial:this.callKit.logger.info("registerer stateChange Initial",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(f.init),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case g.RegistererState.Registered:this.callKit.logger.info("registerer stateChange Registered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!0),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case g.RegistererState.Terminated:this.callKit.logger.info("registerer stateChange Terminated",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(f.init),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case g.RegistererState.Unregistered:this.callKit.logger.info("registerer stateChange Unregistered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{isRegistered:this.isRegistered(),registererState:c}}),this.setRegister(!1),this.setConnectStatus(f.init),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;default:break}}),this.userAgent.delegate={onInvite:c=>{this.callKit.logger.info("connect onInvite",{type:"SIP",caller:"Connect.register.onInvite",content:{invite:c,isRegistered:this.isRegistered(),isOutgoing:this.isOutgoing}}),this.currentSession=c,this.currentSession.stateChange.addListener(h=>{switch(h){case g.SessionState.Establishing:this.callKit.logger.info("connect Establishing",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:h}}),this.setConnectStatus(f.ringing),this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()});break;case g.SessionState.Established:this.callKit.logger.info("connect Established",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:h}}),this.callKit.connect.setConnectStatus(f.calling),this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()}),F(this.currentSession);break;case g.SessionState.Terminating:this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()});break;case g.SessionState.Terminated:this.callKit.logger.info("connect Terminated",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:h}}),this.hasInvite=!1,this.isUnprompted||this.callKit.callCenter.callEnd(),this.isUnprompted=!1,this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()});break;default:break}});let I={sessionDescriptionHandlerOptions:{constraints:e,alwaysAcquireMediaFirst:!0}},E=()=>{let{request:h}=this.currentSession,$=Object.keys(h.headers),N={};return $.filter(p=>p.toLocaleLowerCase().startsWith("x-antaios")).forEach(p=>{N[p.toLocaleLowerCase()]=h.getHeader(p)}),this.callKit.logger.info("get invite data",{caller:"Connect.register.onInvite",content:N}),N},T=E();try{let h=it(T);h?.callUuid?this.setCallId(h.callUuid):(this.setCallId(null),this.callKit.logger.warn("call id is not exist",{caller:"Connect.register.onInvite",content:{inviteData:h}}))}catch(h){this.callKit.logger.info(h,{caller:"Connect.register.onInvite",content:T})}if(this.isOutgoing)this.currentSession.accept(I),this.callKit.trigger(r.KIT_OUTGOING_INVITE,{getInviteData:E});else{this.hasInvite=!0;let h=()=>{this.currentSession?.state!==g.SessionState.Terminated&&this.currentSession?.state!==g.SessionState.Terminating&&this.currentSession.reject(),this.hasInvite=!1,this.callKit.callCenter.callEnd(!0,!1)};this.callKit.trigger(r.KIT_INVITE,{accept:()=>{this.callKit.trigger(r.CALL_CONNECTING,new Date),this.hasInvite=!1,this.currentSession.accept(I)},reject:h,getInviteData:E})}},onConnect:async()=>{this.reconnectAttempts=0,this.reconnectTimer=null,this.callKit.logger.info("connect onConnect",{caller:"Connect.register",type:"SIP",content:{version:`${this.callKit.config.getConfig().version}`}}),await this.registerer.register().catch(async c=>{this.callKit.reset(),this.callKit.logger.error(c?.message,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_REGISTER_ERROR}})})},onDisconnect:c=>{c?(this.callKit.logger.warn("SIP User Agent Disconnected with error",{caller:"Connect.register",type:"SIP",content:{err:c.message,errCode:a.WEBRTC_USER_AGENT_ERROR}}),this.startReconnectTimer()):this.callKit.logger.warn("SIP User Agent Disconnected",{caller:"Connect.register",type:"SIP",content:{}})},onRegister:()=>{this.callKit.logger.info("connect onRegister",{caller:"Connect.register",type:"SIP",content:{version:`V${this.callKit.config.getConfig().version}`}})}},P(this.userAgent,{that:this}),await this.userAgent.start().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_USER_AGENT_ERROR}})})}reconnectTimer;reconnectAttempts=0;startReconnectTimer(){if(this.reconnectAttempts>=this.reconnectConfig.maxAttempts&&this.callKit.config.isLogin()){this.callKit.reset(),this.callKit.logger.error("Reconnect failed max attempts",{caller:"Connect.startReconnectTimer",type:"SIP",content:{errCode:a.SOCKET_RECONNECT_FAILED,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}});return}this.callKit.logger.info("Reconnect timer started",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}}),this.reconnectAttempts+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer&&this.callKit.config.isLogin()?(this.userAgent?.reconnect(),this.callKit.logger.info("Reconnect attempt",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})):this.callKit.logger.info("Reconnect timer already expired",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})},this.reconnectConfig.delay)}async stop(){await this.userAgent.stop()}async unregister(){if(this.callKit.logger.info("connect unregister",{caller:"Connect.unregister",type:"SIP",content:{isRegistered:this.isRegistered()}}),!this.isRegistered()||!this.registerer){this.callKit.logger.warn("No registerer to unregister.",{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}});return}await this.registerer.unregister({all:!0}).catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})}).finally(()=>{this.setRegister(!1)}),await this.userAgent?.stop().catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})})}async call(t){this.callKit.logger.info("connect call",{caller:"Connect.call",type:"SIP",content:{callback:t}}),this.setOutgoing(!0),this.isRegistered()||await this.register(),this.setConnectStatus(f.connecting),this.callKit.trigger(r.CALL_CONNECTING,new Date);let{userInfo:e}=this.callKit.config.getConfig();t(e)}setRegister(t){this.isRegister!==t&&(this.callKit.logger.info("connect setRegister",{caller:"Connect.setRegister",type:"SIP",content:{register:t}}),this.isRegister=t,this.callKit.trigger(r.KIT_REGISTER_CHANGE,t))}setConnectStatus(t){this.callKit.logger.info("connect setConnectStatus",{caller:"Connect.setConnectStatus",type:"SIP",content:{status:t}}),this.connectStatus=t,this.callKit.trigger(r.KIT_CALL_STATUS_CHANGE,t)}async hangup(t=!1,e=!1){if(this.callKit.logger.info("connect hangup",{caller:"Connect.hangup",type:"SIP",content:{isUnprompted:t,isError:e,connectStatus:this.connectStatus}}),this.setOutgoing(!1),this.isUnprompted=t,this.setHold(!1),this.setMute(!1),this.connectStatus!==f.init)try{t&&(this.isRinging()||this.isCalling())&&(this.hasInvite?(this.currentSession?.state!==g.SessionState.Terminated&&this.currentSession?.state!==g.SessionState.Terminating&&this.currentSession.reject(),this.hasInvite=!1):await this.currentSession?.bye()),B(this.mediaStream);let i=this.getAduioReference();i&&(i.pause(),i.srcObject=null),this.setConnectStatus(f.init),this.callKit.trigger(r.CALL_END,new Date),this.setCallId(null)}catch(i){this.callKit.trigger(r.CALL_END,new Date),this.callKit.reset(),this.callKit.logger.error(i,{caller:"Connect.hangup",type:"SIP",content:{connectStatus:this.connectStatus,isError:e,isUnprompted:t}})}}getRemoteMediaStream(t){this.callKit.logger.info("connect getRemoteMediaStream",{caller:"Connect.getRemoteMediaStream",type:"SIP",content:{session:t}});let e=t.sessionDescriptionHandler;if(e)return e.remoteMediaStream}setupRemoteMedia(t){this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}});let e=this.getRemoteMediaStream(t),i=this.getAduioReference();i?(i.autoplay=!0,i.srcObject=e,i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})}),e.onaddtrack=()=>{this.callKit.logger.info("Remote media onaddtrack",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}}),i.load(),i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})}):this.callKit.logger.error("video is not exist",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})}async setHold(t){if(this.isHold===t){this.callKit.logger.warn("Already holding",{caller:"Connect.setHold",type:"SIP",content:{isHold:this.isHold}});return}this.callKit.socket.send(t?R.HOLD:R.UNHOLD),this.isHold=t,this.callKit.logger.info("connect setHold",{caller:"Connect.setHold",type:"SIP",content:{hold:t}}),this.callKit.trigger(r.KIT_SET_HOLD,t)}async setMute(t){if(this.isMute===t){this.callKit.logger.warn("Already muted",{caller:"Connect.setMute",type:"SIP",content:{isCalling:this.isCalling(),isMuted:this.isMuted()}});return}this.callKit.socket.send(t?R.MUTE:R.UNMUTE),this.isMute=t,this.callKit.trigger(r.KIT_SET_MUTE,t)}async refer(t,e){this.callKit.logger.info("connect refer",{caller:"Connect.refer",type:"SIP",content:{referTo:t,extra:e}});let i;t&&(i=g.UserAgent.makeURI(t)),this.currentSession.refer(i,e?.sessionReferOptions)}};var W=class{callKit;ws;lastPingTime=void 0;pingTimer;reconnectTimer;reconnectAttempts=0;connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1};get startConfirm(){return this.connectAuthState.startConfirm}get isError(){return this.connectAuthState.isError}constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("incall")}init(){let{socket:t}=this.callKit.config.getConfig();this.callKit.logger.info(`socket init: ${t}`,{caller:"Socket.init",type:"INCALL",content:{socket:t}}),this.connect(t)}setConnectAuthState(t,e){this.connectAuthState[t]!==e&&(this.connectAuthState[t]=e)}handleDisconnect(){this.setConnectAuthState("isConnected",!1);let{enabled:t}=this.reconnectConfig;if(!this.callKit.config.isLogin()||!t){this.callKit.reset(),this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"});return}this.connectAuthState.isReconnecting||this.connectAuthState.isError||this.attemptReconnect()}clearWebSocket(){this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null),(this.ws?.readyState===WebSocket.CONNECTING||this.ws?.readyState===WebSocket.OPEN)&&(this.ws?.close(1e3,"socket close"),this.callKit.logger.info("socket clear",{caller:"Socket.clearWebSocket",type:"INCALL",content:{}})),this.ws=void 0,this.setConnectAuthState("isConnected",!1)}connect(t){this.ws&&this.clearWebSocket(),this.ws=new WebSocket(t),this.ws.onopen=e=>this.onOpen(e),this.ws.onclose=e=>this.onClose(e),this.ws.onerror=e=>this.onError(e),this.ws.onmessage=e=>this.onMessage(e)}onOpen(t){this.callKit.logger.info("socket onOpen",{caller:"Socket.onOpen",type:"INCALL",content:{ev:t}}),this.setConnectAuthState("isConnected",!0),this.lastPingTime=Date.now(),this.checkPing(),this.send(R.START),this.connectAuthState.isReconnecting&&(this.setConnectAuthState("isReconnecting",!1),this.callKit.logger.info("reconnect success",{caller:"Socket.onOpen",type:"INCALL",content:{event:"INCALL_RECONNECT_SUCCESS",reconnectAttempts:this.reconnectAttempts}}),this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_SUCCESS"}))}cleanReconnectState(){this.reconnectAttempts=0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.setConnectAuthState("isReconnecting",!1),this.setConnectAuthState("isError",!1)}resetConnectState(){this.connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1},this.cleanReconnectState(),this.callKit.logger.info("reset connect state",{caller:"Socket.resetConnectState",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,connectAuthState:this.connectAuthState}})}onClose(t){this.callKit.logger.info("socket onClose",{caller:"Socket.onClose",type:"INCALL",content:{ev:t}}),this.handleDisconnect()}onError(t){this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_CONNECT_ERROR",err:t}),this.callKit.logger.error("socket onError",{caller:"Socket.onError",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR,data:t}})}confirmAck(t){let{ack:e,messageId:i}=t;e&&this.send(R.ACK,{messageId:i})}onMessage(t){let e=JSON.parse(t.data),i=e.data;try{typeof e.data=="string"&&e.data&&(i=JSON.parse(e.data))}catch{this.callKit.logger.info("socket onMessage parse error",{caller:"Socket.onMessage",type:"INCALL",content:{data:e.data}})}this.callKit.logger.info(`socket onMessage: ${e.event}`,{caller:"Socket.onMessage",type:"INCALL",content:{data:i,event:e.event}}),this.confirmAck(e);let n=i?.callUuid||"";if(e.event===S.PONG){this.lastPingTime=Date.now();return}if(e.event===S.START_CONFIRM&&(this.setConnectAuthState("startConfirm",!0),this.cleanReconnectState()),e.event===S.CUSTOMER_RINGING&&this.callKit.trigger(r.CALL_RINGING,{time:new Date,callUuid:n}),e.event===S.CUSTOMER_PICK_UP&&this.callKit.trigger(r.CALL_PICK_UP,{time:new Date,callUuid:n}),e.event===S.AGENT_PICK_UP&&this.callKit.trigger(r.AGENT_PICK_UP,{time:new Date,callUuid:n}),e.event===S.CUSTOMER_HANG_UP&&(this.callKit.trigger(r.CALL_HANG_UP,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===S.CUSTOMER_NO_ANSWER&&(this.callKit.trigger(r.CALL_NO_ANSWER,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===S.CALL_CDR&&this.callKit.trigger(r.CALL_CDR,{time:new Date,callUuid:n,...i}),e.event===S.CLOSE){let{userInfo:l}=this.callKit.config.getConfig();this.send(R.END,{agentId:l.agentId,callUuid:n})}e.event===S.ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{errCode:a.SOKET_SERVER_ERROR,data:i,callUuid:n}})),e.event===S.SESSION_ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{data:i,event:S.SESSION_ERROR,callUuid:n}})),e.event===S.AGENT_NO_ANSWER&&n&&this.callKit.connect.socketTriggerHangup(n),e.event===S.AGENT_HANG_UP&&n&&this.callKit.connect.socketTriggerHangup(n),this.callKit.trigger(r.SERVER_SOCKET_EVENT,{...e,callUuid:n})}send(t,e){if(!this.connectAuthState.isConnected){this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"}),this.callKit.reset(),this.callKit.logger.error("socket not connected",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let{userInfo:i,version:n}=this.callKit.config.getConfig(),{sessionId:l,extno:o,agentId:C}=i;if(this.callKit.logger.info("Socket send",{caller:"Socket.send",type:"INCALL",content:{agentId:C,sessionId:l,userInfo:i}}),!l){this.callKit.logger.error("sessionId is empty",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let u={event:t,sessionId:l,version:n,...e};R.CALL===t&&(u.phoneNum=o,u.agentId=C,e?.sourceType===m.phoneNum?delete u.workOrderId:e?.sourceType===m.workOrderId&&delete u.phoneNum),this.callKit.logger.info("socket send",{caller:"Socket.send",type:"INCALL",content:{...u}}),this.ws?.send(JSON.stringify({event:t,...u}))}ping(){if(!this.connectAuthState.isConnected)return;this.send(R.PING);let t=Date.now(),{pingInterval:e,pingTimeout:i}=this.reconnectConfig;t-this.lastPingTime>e+i&&(this.ws&&this.connectAuthState.isConnected?this.ws.close(4001,"ping timeout"):this.callKit.reset(),this.callKit.logger.error("socket ping timeout",{caller:"Socket.ping",type:"INCALL",content:{errCode:a.SOCKET_PING_TIMEOUT}}),this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_PING_TIMEOUT"}))}checkPing(){this.pingTimer&&clearInterval(this.pingTimer);let{pingInterval:t}=this.reconnectConfig;this.pingTimer=setInterval(()=>{this.ping()},t)}async reset(t){let{force:e=!1}=t||{};this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=void 0),e&&(this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RESET"}),this.resetConnectState()),this.lastPingTime=void 0,this.setConnectAuthState("startConfirm",!1),this.clearWebSocket()}attemptReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let{maxAttempts:t}=this.reconnectConfig;if(this.reconnectAttempts>=t){this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_ERROR"}),this.callKit.reset(),this.callKit.logger.error("Maximum reconnection attempts reached",{caller:"Socket.attemptReconnect",type:"INCALL",content:{errCode:a.SOCKET_RECONNECT_FAILED,reconnectAttempts:this.reconnectAttempts}});return}this.reconnectAttempts===0&&this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_START"}),this.setConnectAuthState("isReconnecting",!0),this.reconnectAttempts+=1;let{delay:e}=this.reconnectConfig;this.callKit.logger.info(`Preparing reconnection attempt ${this.reconnectAttempts}/${t}, delay: ${e}ms`,{caller:"Socket.attemptReconnect",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:t,delay:e}}),this.reconnectTimer=setTimeout(()=>{let{socket:i}=this.callKit.config.getConfig();this.connect(i)},e)}};var q=class{api;config;logger;callCenter;connect;socket;listener=[];constructor(t){this.config=new M(this),this.api=new U(this),this.connect=new H(this),this.callCenter=new b(this),this.socket=new W(this),this.logger=new D(this,t.log),t.log&&this.config.setConfig("log",t.log),t.trackLogs&&this.config.setConfig("trackLogs",{...L,...t.trackLogs}),t.audioRef&&this.config.setConfig("audioRef",t.audioRef),t.host&&this.config.setConfig("host",t.host),this.config.setConfig("constrains",t.constrains||G),this.config.setConfig("socket",t.socket),this.config.setConfig("reconnect",{sip:{...O,...t.reconnect?.sip||{}},incall:{...A,...t.reconnect?.incall||{}}}),this.logger.info("callKit init",{caller:"CallKit.init",content:t})}async login(t,e,i={encryptionMethod:_.INTERNAL}){if(this.config.isLogin()){this.logger.warn("already login",{caller:"CallKit.login",content:{username:t,password:e,extra:i}});return}let n="",{encryptionMethod:l=_.INTERNAL}=i;switch(l){case _.NONE:n=e;break;case _.INTERNAL:n=(0,v.default)(t+(0,v.default)(e));break;default:n=(0,v.default)(t+(0,v.default)(e));break}if(this.logger.info("login info:",{caller:"CallKit.login",content:{username:t,password:e,encryptionMethod:l,encryptionPassword:n}}),this.socket.isError){this.logger.warn("socket is error",{caller:"CallKit.login",content:{username:t,password:e,extra:i,socketError:this.socket.isError}});return}try{let o=await this.api.login({userName:t,password:n,timestamp:Date.now()});o&&(this.config.setConfig("userInfo",{wsUrl:`wss://${o.wsUrl}`,sessionId:o.sessionId,username:t,password:n,encryptionPassword:n,agentId:o.agentId,fsUserId:o.fsUserId,userPart:o.userPart,fsPassword:o.fsPassword,fsIp:o.fsIp,fsPort:o.fsPort,iceInfo:o.iceInfo,iceGatheringTimeout:o.iceGatheringTimeout,logGather:o.logGather,...i}),this.socket.init(),this.trigger(r.KIT_LOGIN_CHANGE,!0))}catch(o){this.logger.error(o,{caller:"CallKit.login",content:{errCode:a.API_USER_LOGIN_ERROR}})}}async logout({isReset:t=!0}={isReset:!0}){if(!this.config.check())return;let{userInfo:e}=this.config.getConfig();if(this.logger.info("logout",{caller:"CallKit.logout",content:{sessionId:e.sessionId}}),this.config.isLogin()){let{sessionId:i}=e;try{await this.api.loginOut({sessionId:i,timestamp:Date.now()})}catch(n){this.logger.warn(n,{caller:"CallKit.logout",content:{errCode:a.API_USER_LOGOUT_ERROR}})}}t?await this.reset():this.config.reset()}async call(t="",e={sourceType:m.phoneNum,workOrderId:""}){if(!this.config.check())return;if(!this.connect.isRegistered){this.logger.warn("Currently not registered",{caller:"CallKit.call",content:{extno:t,options:e}});return}let{sourceType:i,workOrderId:n}=e;this.config.setUserInfo("sourceType",i),i===m.phoneNum?t&&this.config.setUserInfo("extno",t):i===m.workOrderId&&n&&this.config.setUserInfo("workOrderId",n),this.logger.info("call",{caller:"CallKit.call",content:{extno:t,options:e}}),this.callCenter.callStart(e)}async refer(t,e){this.config.check()&&(this.logger.info("refer",{caller:"CallKit.refer",content:{uri:t,options:e}}),this.callCenter.callRefer(t,e))}async register(){this.config.check()&&(this.logger.info("register",{caller:"CallKit.register",content:{}}),this.connect.register())}async unregister(){this.config.check()&&(this.logger.info("unregister",{caller:"CallKit.unregister",content:{}}),this.connect.unregister())}async hangup(){if(this.config.check()){if(this.logger.info("hangup",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}}),!this.connect.isConnecting()&&!this.connect.isRinging()&&!this.connect.isCalling()&&!this.connect.isHolding()){this.logger.warn("Currently not in a call",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}});return}await this.callCenter.callEnd(!0)}}hold(){this.config.check()&&(this.logger.info("hold",{caller:"CallKit.hold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callHold())}unhold(){this.config.check()&&(this.logger.info("unhold",{caller:"CallKit.unhold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnhold())}mute(){this.config.check()&&(this.logger.info("mute",{caller:"CallKit.mute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callMute())}unmute(){this.config.check()&&(this.logger.info("unmute",{caller:"CallKit.unmute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnmute())}async setUserStatus(t,e={}){let{agentId:i}=this.config.getConfig().userInfo;this.logger.info("setUserStatus",{caller:"CallKit.setUserStatus",content:{status:t,agentId:i}}),await this.api.updateUserStatus({agentId:i,userStatus:t,timestamp:Date.now(),...e})}async reset(t){let{force:e=!1}=t||{};this.logger.info("reset",{caller:"CallKit.reset",content:{connectStatus:this.connect.connectStatus,force:e}}),this.connect.isCalling()&&await this.hangup(),await this.connect.reset(),this.config.isLogin()?await this.logout({isReset:!1}):await this.config.reset(),await this.socket.reset({force:e})}on(t,e){this.listener.push({event:t,callback:e})}off(t,e){this.logger.info(`off ${t}`,{caller:"CallKit.off",content:{event:t}}),e?this.listener=this.listener.filter(i=>!(i.event===t&&i.callback===e)):this.listener=this.listener.filter(i=>i.event!==t)}removeAllListeners(){this.listener=this.listener.splice(0,this.listener.length),this.logger.info("removeAllListeners",{caller:"CallKit.removeAllListeners",content:{listener:this.listener}})}trigger(t,e,i=!1){i||this.logger.info(`Trigger Event: ${t}`,{caller:"CallKit.trigger",content:e}),this.listener.forEach(n=>{if(n.event===t)try{n.callback(e)}catch(l){this.logger.error(`Event callback error: ${t}`,l,!0)}})}};0&&(module.exports={CallKit});
|
|
4
|
+
`));for(let o of i)this.callKit.api.trackLogs(o);this.pendingTrackLogs=[]}catch(i){console.error(i)}}destroy(){this.trackLogsTimer&&(clearInterval(this.trackLogsTimer),this.trackLogsTimer=null),this.flushTrackLogs()}setLevel(t){this.level=t}info(t,e){let i=this.catchLog(t,e,"info");y(this.level)>=y("info")&&console.log(`%c${i}`,"color: gray;")}success(t,e){let i=this.catchLog(t,e,"success");y(this.level)>=y("success")&&console.log(`%c${i}`,"color: green;")}warn(t,e){let i=this.catchLog(t,e,"warn");y(this.level)>=y("warn")&&console.log(`%c${i}`,"color: orange;")}error(t,e,i=!1){let n=t instanceof Error?t.message:t,l=this.catchLog(n,e,"error");y(this.level)>=y("error")&&console.log(`%c${l}`,"color: red;");let{errCode:o,...C}=e?.content??{},u=o??a.UNKNOWN_ERROR;i||this.callKit.trigger(r.KIT_ERROR,{code:u,msg:n,data:C});let d=new Error(n);throw d.name="CallKitError",d.code=u,d.data=C,d}catchLog(t,e,i){let n=new Date,{enabled:l}=this.callKit.config.getTrackLogsConfig(),{userInfo:o}=this.callKit.config.getConfig(),C={agentId:o?.agentId,sessionId:o?.sessionId,...e?.content??{}},u={timestamp:n.toLocaleString().replace("T"," ").replace(".000Z",""),level:i,message:t,caller:e?.caller,type:e?.type,content:C},d=ft(u);return l&&this.pendingTrackLogs.push(d),this.callKit.trigger(r.KIT_LOG,d,!0),d}};var g=require("sip.js");var it=s=>{let t=s["x-antaios-manual-extend_info"]||s["x-antaios-manual-extend-info"],e=null;try{if(t&&typeof t=="string"){let i=t.replace(/\\/g,"");return e=JSON.parse(i),e}}catch{return{}}};var x=6;function Ct(s){return s.replace(/(\w+):\s*'(.*?)'/g,'"$1": "$2"').replace(/'/g,'"')}var B=s=>{s&&s.getTracks().forEach(t=>t.stop())},ut=()=>{typeof navigator.mediaDevices>"u"&&(navigator.mediaDevices={}),typeof navigator.mediaDevices.getUserMedia>"u"&&(navigator.mediaDevices.getUserMedia=s=>{let t=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return t?new Promise((e,i)=>{t.call(navigator,s,e,i)}):Promise.reject(new Error("Unable to obtain device permissions. Please check your browser settings or device permissions."))})},H=class{callKit;isMute=!1;isRegister=!1;isHold=!1;connectStatus=f.init;currentSession;mediaStream;userAgent;registerer;isReConnected=!1;isOutgoing=!1;isUnprompted=!1;hasInvite=!1;constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("sip")}currentCallId=null;getCurrentCallId(){return this.currentCallId}setOutgoing(t){this.isOutgoing!==t&&(this.callKit.logger.info("setOutgoing",{caller:"Connect.setOutgoing",content:{outgoing:t}}),this.isOutgoing=t)}setCallId(t){this.callKit.logger.info("setCallId",{caller:"Connect.setCallId",content:{callId:t}}),this.currentCallId=t,this.callKit.trigger(r.KIT_CALL_ID_CHANGE,t)}async reset(){if(this.setOutgoing(!1),this.isUnprompted=!1,this.hasInvite=!1,this.isHolding()&&await this.setHold(!1),this.isMuted()&&await this.setMute(!1),this.connectStatus!==f.init&&this.setConnectStatus(f.init),this.isRegistered()&&await this.unregister(),this.currentCallId&&this.setCallId(null),this.currentSession=void 0,this.mediaStream=void 0,this.userAgent=void 0,this.registerer=void 0,this.mediaStream)try{B(this.mediaStream);let t=this.getAduioReference();t&&(t.pause(),t.srcObject=null)}catch(t){this.callKit.logger.error(t,{caller:"Connect.reset",content:{}})}this.setConnectStatus(f.init),this.clearHeartbeat()}getAduioReference(){let{audioRef:t}=this.callKit.config.getConfig();return typeof t=="function"?t():t}async permission(){this.callKit.logger.info("permission",{caller:"Connect.permission",content:{permission:!0}}),ut();let t=await navigator.mediaDevices.getUserMedia({audio:!0});B(t)}isConnecting(){return this.connectStatus===f.connecting}isCalling(){return this.connectStatus===f.calling}isRinging(){return this.connectStatus===f.ringing}isHolding(){return this.isHold}isRegistered(){return this.isRegister}isMuted(){return this.isMute}isInit(){return this.connectStatus===f.init}heartbeatInterval;heartbeatFlag=x;clearHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.heartbeatFlag=x}startHeartbeat(){this.heartbeatFlag=x,this.clearHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.heartbeatFlag-=1,this.heartbeatFlag<=0&&(this.heartbeatFlag=x,this.callKit.trigger(r.SIP_CONNECT_EVENT,{event:"OPTIONS_HEARTBEAT_EXPIRED"}))},1e3)}socketTriggerHangup(t){!this.isCalling()||t!==this.currentCallId||(this.callKit.logger.info("socketHangup trigger hangup",{caller:"Connect.socketHangup",content:{callId:t,currentCallId:this.currentCallId}}),this.callKit.hangup())}async register(){if(this.connectStatus!==f.init){if(this.isRegistered()){this.callKit.logger.warn("connectStatus is registered",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.reset(),this.callKit.logger.error("connectStatus is not init",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.logger.info("connect register",{caller:"Connect.register",content:{connectStatus:this.connectStatus}}),await this.permission().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",content:{errCode:a.WEBRTC_USER_MEDIA_ERROR}})});let{userInfo:t,constrains:e}=this.callKit.config.getConfig(),i=async()=>(this.mediaStream=await navigator.mediaDevices.getUserMedia(e),this.mediaStream),{userPart:n,fsIp:l,fsPort:o,iceInfo:C,wsUrl:u}=t,d={uri:g.UserAgent.makeURI(`sip:${n}@${l}:${o}`),displayName:n,transportOptions:{wsServers:[u],traceSip:!0},logLevel:"error",allowLegacyNotifications:!0,contactName:n,sessionDescriptionHandlerFactory:g.Web.defaultSessionDescriptionHandlerFactory(i),sessionDescriptionHandlerFactoryOptions:{constraints:e,iceGatheringTimeout:t.iceGatheringTimeout,peerConnectionConfiguration:{iceServers:JSON.parse(Ct(C))}}};this.callKit.logger.info("connect connectConfig",{caller:"Connect.register",content:d}),this.userAgent=new g.UserAgent(d);let k=new MediaStream,F=c=>{let I=this.getAduioReference();this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.register.setupRemoteMedia",content:I}),c.sessionDescriptionHandler.peerConnection.getReceivers().forEach(E=>{E.track&&k.addTrack(E.track)}),I?(I.srcObject=k,I.play().catch(E=>{this.callKit.logger.error(E.message,{caller:"Connect.register.setupRemoteMedia",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})):this.callKit.logger.error("video is not exist",{caller:"Connect.register",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})},P=(c,I)=>{let{that:E=this}=I,T=c.userAgentCore,h=T.receiveIncomingRequestFromTransport.bind(T);T.receiveIncomingRequestFromTransport=p=>(p.method==="OPTIONS"&&E.startHeartbeat(),E.callKit.logger.info(`SIP Receive: ${p?.method}`,{caller:"Connect.register.observeSocketStatus.receiveRequest",type:"SIP",content:{request:p}}),h(p));let $=T.receiveIncomingResponseFromTransport.bind(T);T.receiveIncomingResponseFromTransport=p=>(E.callKit.logger.info(`SIP Receive Response: ${p?.statusCode} ${p?.reasonPhrase}`,{caller:"Connect.register.observeSocketStatus.receiveResponse",type:"SIP",content:{response:p}}),$(p));let{transport:N}=c;if(N){let p=N.send.bind(N);N.send=z=>(E.callKit.logger.info("SIP send message",{caller:"Connect.register.observeSocketStatus",type:"SIP",content:{message:z.toString()}}),p(z))}},K={};this.registerer=new g.Registerer(this.userAgent,K),this.registerer.stateChange.addListener(c=>{switch(c){case g.RegistererState.Initial:this.callKit.logger.info("registerer stateChange Initial",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(f.init),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case g.RegistererState.Registered:this.callKit.logger.info("registerer stateChange Registered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!0),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case g.RegistererState.Terminated:this.callKit.logger.info("registerer stateChange Terminated",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(f.init),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case g.RegistererState.Unregistered:this.callKit.logger.info("registerer stateChange Unregistered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{isRegistered:this.isRegistered(),registererState:c}}),this.setRegister(!1),this.setConnectStatus(f.init),this.callKit.trigger(r.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;default:break}}),this.userAgent.delegate={onInvite:c=>{this.callKit.logger.info("connect onInvite",{type:"SIP",caller:"Connect.register.onInvite",content:{invite:c,isRegistered:this.isRegistered(),isOutgoing:this.isOutgoing}}),this.currentSession=c,this.currentSession.stateChange.addListener(h=>{switch(h){case g.SessionState.Establishing:this.callKit.logger.info("connect Establishing",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:h}}),this.setConnectStatus(f.ringing),this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()});break;case g.SessionState.Established:this.callKit.logger.info("connect Established",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:h}}),this.callKit.connect.setConnectStatus(f.calling),this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()}),F(this.currentSession);break;case g.SessionState.Terminating:this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()});break;case g.SessionState.Terminated:this.callKit.logger.info("connect Terminated",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:h}}),this.hasInvite=!1,this.isUnprompted||this.callKit.callCenter.callEnd(),this.isUnprompted=!1,this.callKit.trigger(r.SIP_SESSION_EVENT,{sessionState:h,isRegistered:this.isRegistered()});break;default:break}});let I={sessionDescriptionHandlerOptions:{constraints:e,alwaysAcquireMediaFirst:!0}},E=()=>{let{request:h}=this.currentSession,$=Object.keys(h.headers),N={};return $.filter(p=>p.toLocaleLowerCase().startsWith("x-antaios")).forEach(p=>{N[p.toLocaleLowerCase()]=h.getHeader(p)}),this.callKit.logger.info("get invite data",{caller:"Connect.register.onInvite",content:N}),N},T=E();try{let h=it(T);h?.callUuid?this.setCallId(h.callUuid):(this.setCallId(null),this.callKit.logger.warn("call id is not exist",{caller:"Connect.register.onInvite",content:{inviteData:h}}))}catch(h){this.callKit.logger.info(h,{caller:"Connect.register.onInvite",content:T})}if(this.isOutgoing)this.currentSession.accept(I),this.callKit.trigger(r.KIT_OUTGOING_INVITE,{getInviteData:E});else{this.hasInvite=!0;let h=()=>{this.currentSession?.state!==g.SessionState.Terminated&&this.currentSession?.state!==g.SessionState.Terminating&&this.currentSession.reject(),this.hasInvite=!1,this.callKit.callCenter.callEnd(!0,!1)};this.callKit.trigger(r.KIT_INVITE,{accept:()=>{this.callKit.trigger(r.CALL_CONNECTING,new Date),this.hasInvite=!1,this.currentSession.accept(I)},reject:h,getInviteData:E})}},onConnect:async()=>{this.reconnectAttempts=0,this.reconnectTimer=null,this.callKit.logger.info("connect onConnect",{caller:"Connect.register",type:"SIP",content:{version:`${this.callKit.config.getConfig().version}`}}),await this.registerer.register().catch(async c=>{this.callKit.reset(),this.callKit.logger.error(c?.message,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_REGISTER_ERROR}})})},onDisconnect:c=>{c?(this.callKit.logger.warn("SIP User Agent Disconnected with error",{caller:"Connect.register",type:"SIP",content:{err:c.message,errCode:a.WEBRTC_USER_AGENT_ERROR}}),this.startReconnectTimer()):this.callKit.logger.warn("SIP User Agent Disconnected",{caller:"Connect.register",type:"SIP",content:{}})},onRegister:()=>{this.callKit.logger.info("connect onRegister",{caller:"Connect.register",type:"SIP",content:{version:`V${this.callKit.config.getConfig().version}`}})}},P(this.userAgent,{that:this}),await this.userAgent.start().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_USER_AGENT_ERROR}})})}reconnectTimer;reconnectAttempts=0;startReconnectTimer(){if(this.reconnectAttempts>=this.reconnectConfig.maxAttempts&&this.callKit.config.isLogin()){this.callKit.reset(),this.callKit.logger.error("Reconnect failed max attempts",{caller:"Connect.startReconnectTimer",type:"SIP",content:{errCode:a.SOCKET_RECONNECT_FAILED,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}});return}this.callKit.logger.info("Reconnect timer started",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}}),this.reconnectAttempts+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer&&this.callKit.config.isLogin()?(this.userAgent?.reconnect(),this.callKit.logger.info("Reconnect attempt",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})):this.callKit.logger.info("Reconnect timer already expired",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})},this.reconnectConfig.delay)}async stop(){await this.userAgent.stop()}async unregister(){if(this.callKit.logger.info("connect unregister",{caller:"Connect.unregister",type:"SIP",content:{isRegistered:this.isRegistered()}}),!this.isRegistered()||!this.registerer){this.callKit.logger.warn("No registerer to unregister.",{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}});return}await this.registerer.unregister({all:!0}).catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})}).finally(()=>{this.setRegister(!1)}),await this.userAgent?.stop().catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})})}async call(t){this.callKit.logger.info("connect call",{caller:"Connect.call",type:"SIP",content:{callback:t}}),this.setOutgoing(!0),this.isRegistered()||await this.register(),this.setConnectStatus(f.connecting),this.callKit.trigger(r.CALL_CONNECTING,new Date);let{userInfo:e}=this.callKit.config.getConfig();t(e)}setRegister(t){this.isRegister!==t&&(this.callKit.logger.info("connect setRegister",{caller:"Connect.setRegister",type:"SIP",content:{register:t}}),this.isRegister=t,this.callKit.trigger(r.KIT_REGISTER_CHANGE,t))}setConnectStatus(t){this.callKit.logger.info("connect setConnectStatus",{caller:"Connect.setConnectStatus",type:"SIP",content:{status:t}}),this.connectStatus=t,this.callKit.trigger(r.KIT_CALL_STATUS_CHANGE,t)}async hangup(t=!1,e=!1){if(this.callKit.logger.info("connect hangup",{caller:"Connect.hangup",type:"SIP",content:{isUnprompted:t,isError:e,connectStatus:this.connectStatus}}),this.setOutgoing(!1),this.isUnprompted=t,this.setHold(!1),this.setMute(!1),this.connectStatus!==f.init)try{t&&(this.isRinging()||this.isCalling())&&(this.hasInvite?(this.currentSession?.state!==g.SessionState.Terminated&&this.currentSession?.state!==g.SessionState.Terminating&&this.currentSession.reject(),this.hasInvite=!1):await this.currentSession?.bye()),B(this.mediaStream);let i=this.getAduioReference();i&&(i.pause(),i.srcObject=null),this.setConnectStatus(f.init),this.callKit.trigger(r.CALL_END,new Date),this.setCallId(null)}catch(i){this.callKit.trigger(r.CALL_END,new Date),this.callKit.reset(),this.callKit.logger.error(i,{caller:"Connect.hangup",type:"SIP",content:{connectStatus:this.connectStatus,isError:e,isUnprompted:t}})}}getRemoteMediaStream(t){this.callKit.logger.info("connect getRemoteMediaStream",{caller:"Connect.getRemoteMediaStream",type:"SIP",content:{session:t}});let e=t.sessionDescriptionHandler;if(e)return e.remoteMediaStream}setupRemoteMedia(t){this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}});let e=this.getRemoteMediaStream(t),i=this.getAduioReference();i?(i.autoplay=!0,i.srcObject=e,i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})}),e.onaddtrack=()=>{this.callKit.logger.info("Remote media onaddtrack",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}}),i.load(),i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})}):this.callKit.logger.error("video is not exist",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})}async setHold(t){if(this.isHold===t){this.callKit.logger.warn("Already holding",{caller:"Connect.setHold",type:"SIP",content:{isHold:this.isHold}});return}this.callKit.socket.send(t?R.HOLD:R.UNHOLD),this.isHold=t,this.callKit.logger.info("connect setHold",{caller:"Connect.setHold",type:"SIP",content:{hold:t}}),this.callKit.trigger(r.KIT_SET_HOLD,t)}async setMute(t){if(this.isMute===t){this.callKit.logger.warn("Already muted",{caller:"Connect.setMute",type:"SIP",content:{isCalling:this.isCalling(),isMuted:this.isMuted()}});return}this.callKit.socket.send(t?R.MUTE:R.UNMUTE),this.isMute=t,this.callKit.trigger(r.KIT_SET_MUTE,t)}async refer(t,e){this.callKit.logger.info("connect refer",{caller:"Connect.refer",type:"SIP",content:{referTo:t,extra:e}});let i;t&&(i=g.UserAgent.makeURI(t)),this.currentSession.refer(i,e?.sessionReferOptions)}};var W=class{callKit;ws;lastPingTime=void 0;pingTimer;reconnectTimer;reconnectAttempts=0;connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1};get startConfirm(){return this.connectAuthState.startConfirm}get isError(){return this.connectAuthState.isError}constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("incall")}init(){let{socket:t}=this.callKit.config.getConfig();this.callKit.logger.info(`socket init: ${t}`,{caller:"Socket.init",type:"INCALL",content:{socket:t}}),this.connect(t)}setConnectAuthState(t,e){this.connectAuthState[t]!==e&&(this.connectAuthState[t]=e)}handleDisconnect(){this.setConnectAuthState("isConnected",!1);let{enabled:t}=this.reconnectConfig;if(!this.callKit.config.isLogin()||!t){this.callKit.reset(),this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"});return}this.connectAuthState.isReconnecting||this.connectAuthState.isError||this.attemptReconnect()}clearWebSocket(){this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null),(this.ws?.readyState===WebSocket.CONNECTING||this.ws?.readyState===WebSocket.OPEN)&&(this.ws?.close(1e3,"socket close"),this.callKit.logger.info("socket clear",{caller:"Socket.clearWebSocket",type:"INCALL",content:{}})),this.ws=void 0,this.setConnectAuthState("isConnected",!1)}connect(t){this.ws&&this.clearWebSocket(),this.ws=new WebSocket(t),this.ws.onopen=e=>this.onOpen(e),this.ws.onclose=e=>this.onClose(e),this.ws.onerror=e=>this.onError(e),this.ws.onmessage=e=>this.onMessage(e)}onOpen(t){this.callKit.logger.info("socket onOpen",{caller:"Socket.onOpen",type:"INCALL",content:{ev:t}}),this.setConnectAuthState("isConnected",!0),this.lastPingTime=Date.now(),this.checkPing(),this.send(R.START),this.connectAuthState.isReconnecting&&(this.setConnectAuthState("isReconnecting",!1),this.callKit.logger.info("reconnect success",{caller:"Socket.onOpen",type:"INCALL",content:{event:"INCALL_RECONNECT_SUCCESS",reconnectAttempts:this.reconnectAttempts}}),this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_SUCCESS"}))}cleanReconnectState(){this.reconnectAttempts=0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.setConnectAuthState("isReconnecting",!1),this.setConnectAuthState("isError",!1)}resetConnectState(){this.connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1},this.cleanReconnectState(),this.callKit.logger.info("reset connect state",{caller:"Socket.resetConnectState",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,connectAuthState:this.connectAuthState}})}onClose(t){this.callKit.logger.info("socket onClose",{caller:"Socket.onClose",type:"INCALL",content:{ev:t}}),this.handleDisconnect()}onError(t){this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_CONNECT_ERROR",err:t}),this.callKit.logger.error("socket onError",{caller:"Socket.onError",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR,data:t}})}confirmAck(t){let{ack:e,messageId:i}=t;e&&this.send(R.ACK,{messageId:i})}onMessage(t){let e=JSON.parse(t.data),i=e.data;try{typeof e.data=="string"&&e.data&&(i=JSON.parse(e.data))}catch{this.callKit.logger.info("socket onMessage parse error",{caller:"Socket.onMessage",type:"INCALL",content:{data:e.data}})}this.callKit.logger.info(`socket onMessage: ${e.event}`,{caller:"Socket.onMessage",type:"INCALL",content:{data:i,event:e.event}}),this.confirmAck(e);let n=i?.callUuid||"";if(e.event===S.PONG){this.lastPingTime=Date.now();return}if(e.event===S.START_CONFIRM&&(this.setConnectAuthState("startConfirm",!0),this.cleanReconnectState()),e.event===S.CUSTOMER_RINGING&&this.callKit.trigger(r.CALL_RINGING,{time:new Date,callUuid:n}),e.event===S.CUSTOMER_PICK_UP&&this.callKit.trigger(r.CALL_PICK_UP,{time:new Date,callUuid:n}),e.event===S.AGENT_PICK_UP&&this.callKit.trigger(r.AGENT_PICK_UP,{time:new Date,callUuid:n}),e.event===S.CUSTOMER_HANG_UP&&(this.callKit.trigger(r.CALL_HANG_UP,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===S.CUSTOMER_NO_ANSWER&&(this.callKit.trigger(r.CALL_NO_ANSWER,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===S.CALL_CDR&&this.callKit.trigger(r.CALL_CDR,{time:new Date,callUuid:n,...i}),e.event===S.CLOSE){let{userInfo:l}=this.callKit.config.getConfig();this.send(R.END,{agentId:l.agentId,callUuid:n})}e.event===S.ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{errCode:a.SOKET_SERVER_ERROR,data:i,callUuid:n}})),e.event===S.SESSION_ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{data:i,event:S.SESSION_ERROR,callUuid:n}})),e.event===S.AGENT_NO_ANSWER&&n&&this.callKit.connect.socketTriggerHangup(n),e.event===S.AGENT_HANG_UP&&n&&this.callKit.connect.socketTriggerHangup(n),this.callKit.trigger(r.SERVER_SOCKET_EVENT,{...e,callUuid:n})}send(t,e){if(!this.connectAuthState.isConnected){this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"}),this.callKit.reset(),this.callKit.logger.error("socket not connected",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let{userInfo:i,version:n}=this.callKit.config.getConfig(),{sessionId:l,extno:o,agentId:C}=i;if(this.callKit.logger.info("Socket send",{caller:"Socket.send",type:"INCALL",content:{agentId:C,sessionId:l,userInfo:i}}),!l){this.callKit.logger.error("sessionId is empty",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let u={event:t,sessionId:l,version:n,...e};R.CALL===t&&(u.phoneNum=o,u.agentId=C,e?.sourceType===m.phoneNum?delete u.workOrderId:e?.sourceType===m.workOrderId&&delete u.phoneNum),this.callKit.logger.info("socket send",{caller:"Socket.send",type:"INCALL",content:{...u}}),this.ws?.send(JSON.stringify({event:t,...u}))}ping(){if(!this.connectAuthState.isConnected)return;this.send(R.PING);let t=Date.now(),{pingInterval:e,pingTimeout:i}=this.reconnectConfig;t-this.lastPingTime>e+i&&(this.ws&&this.connectAuthState.isConnected?this.ws.close(4001,"ping timeout"):this.callKit.reset(),this.callKit.logger.error("socket ping timeout",{caller:"Socket.ping",type:"INCALL",content:{errCode:a.SOCKET_PING_TIMEOUT}}),this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_PING_TIMEOUT"}))}checkPing(){this.pingTimer&&clearInterval(this.pingTimer);let{pingInterval:t}=this.reconnectConfig;this.pingTimer=setInterval(()=>{this.ping()},t)}async reset(t){let{force:e=!1}=t||{};this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=void 0),e&&(this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RESET"}),this.resetConnectState()),this.lastPingTime=void 0,this.setConnectAuthState("startConfirm",!1),this.clearWebSocket()}attemptReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let{maxAttempts:t}=this.reconnectConfig;if(this.reconnectAttempts>=t){this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_ERROR"}),this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error("Maximum reconnection attempts reached",{caller:"Socket.attemptReconnect",type:"INCALL",content:{errCode:a.SOCKET_RECONNECT_FAILED,reconnectAttempts:this.reconnectAttempts}});return}this.reconnectAttempts===0&&this.callKit.trigger(r.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_START"}),this.setConnectAuthState("isReconnecting",!0),this.reconnectAttempts+=1;let{delay:e}=this.reconnectConfig;this.callKit.logger.info(`Preparing reconnection attempt ${this.reconnectAttempts}/${t}, delay: ${e}ms`,{caller:"Socket.attemptReconnect",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:t,delay:e}}),this.reconnectTimer=setTimeout(()=>{let{socket:i}=this.callKit.config.getConfig();this.connect(i)},e)}};var q=class{api;config;logger;callCenter;connect;socket;listener=[];constructor(t){this.config=new M(this),this.api=new U(this),this.connect=new H(this),this.callCenter=new b(this),this.socket=new W(this),this.logger=new D(this,t.log),t.log&&this.config.setConfig("log",t.log),t.trackLogs&&this.config.setConfig("trackLogs",{...L,...t.trackLogs}),t.audioRef&&this.config.setConfig("audioRef",t.audioRef),t.host&&this.config.setConfig("host",t.host),this.config.setConfig("constrains",t.constrains||G),this.config.setConfig("socket",t.socket),this.config.setConfig("reconnect",{sip:{...O,...t.reconnect?.sip||{}},incall:{...A,...t.reconnect?.incall||{}}}),this.logger.info("callKit init",{caller:"CallKit.init",content:t})}async login(t,e,i={encryptionMethod:_.INTERNAL}){if(this.config.isLogin()){this.logger.warn("already login",{caller:"CallKit.login",content:{username:t,password:e,extra:i}});return}let n="",{encryptionMethod:l=_.INTERNAL}=i;switch(l){case _.NONE:n=e;break;case _.INTERNAL:n=(0,v.default)(t+(0,v.default)(e));break;default:n=(0,v.default)(t+(0,v.default)(e));break}if(this.logger.info("login info:",{caller:"CallKit.login",content:{username:t,password:e,encryptionMethod:l,encryptionPassword:n}}),this.socket.isError){this.logger.warn("socket is error",{caller:"CallKit.login",content:{username:t,password:e,extra:i,socketError:this.socket.isError}});return}try{let o=await this.api.login({userName:t,password:n,timestamp:Date.now()});o&&(this.config.setConfig("userInfo",{wsUrl:`wss://${o.wsUrl}`,sessionId:o.sessionId,username:t,password:n,encryptionPassword:n,agentId:o.agentId,fsUserId:o.fsUserId,userPart:o.userPart,fsPassword:o.fsPassword,fsIp:o.fsIp,fsPort:o.fsPort,iceInfo:o.iceInfo,iceGatheringTimeout:o.iceGatheringTimeout,logGather:o.logGather,...i}),this.socket.init(),this.trigger(r.KIT_LOGIN_CHANGE,!0))}catch(o){this.logger.error(o,{caller:"CallKit.login",content:{errCode:a.API_USER_LOGIN_ERROR}})}}async logout({isReset:t=!0}={isReset:!0}){if(!this.config.check())return;let{userInfo:e}=this.config.getConfig();if(this.logger.info("logout",{caller:"CallKit.logout",content:{sessionId:e.sessionId}}),this.config.isLogin()){let{sessionId:i}=e;try{await this.api.loginOut({sessionId:i,timestamp:Date.now()})}catch(n){this.logger.warn(n,{caller:"CallKit.logout",content:{errCode:a.API_USER_LOGOUT_ERROR}})}}t?await this.reset():this.config.reset()}async call(t="",e={sourceType:m.phoneNum,workOrderId:""}){if(!this.config.check())return;if(!this.connect.isRegistered){this.logger.warn("Currently not registered",{caller:"CallKit.call",content:{extno:t,options:e}});return}let{sourceType:i,workOrderId:n}=e;this.config.setUserInfo("sourceType",i),i===m.phoneNum?t&&this.config.setUserInfo("extno",t):i===m.workOrderId&&n&&this.config.setUserInfo("workOrderId",n),this.logger.info("call",{caller:"CallKit.call",content:{extno:t,options:e}}),this.callCenter.callStart(e)}async refer(t,e){this.config.check()&&(this.logger.info("refer",{caller:"CallKit.refer",content:{uri:t,options:e}}),this.callCenter.callRefer(t,e))}async register(){this.config.check()&&(this.logger.info("register",{caller:"CallKit.register",content:{}}),this.connect.register())}async unregister(){this.config.check()&&(this.logger.info("unregister",{caller:"CallKit.unregister",content:{}}),this.connect.unregister())}async hangup(){if(this.config.check()){if(this.logger.info("hangup",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}}),!this.connect.isConnecting()&&!this.connect.isRinging()&&!this.connect.isCalling()&&!this.connect.isHolding()){this.logger.warn("Currently not in a call",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}});return}await this.callCenter.callEnd(!0)}}hold(){this.config.check()&&(this.logger.info("hold",{caller:"CallKit.hold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callHold())}unhold(){this.config.check()&&(this.logger.info("unhold",{caller:"CallKit.unhold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnhold())}mute(){this.config.check()&&(this.logger.info("mute",{caller:"CallKit.mute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callMute())}unmute(){this.config.check()&&(this.logger.info("unmute",{caller:"CallKit.unmute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnmute())}async setUserStatus(t,e={}){let{agentId:i}=this.config.getConfig().userInfo;this.logger.info("setUserStatus",{caller:"CallKit.setUserStatus",content:{status:t,agentId:i}}),await this.api.updateUserStatus({agentId:i,userStatus:t,timestamp:Date.now(),...e})}async reset(t){let{force:e=!1}=t||{};this.logger.info("reset",{caller:"CallKit.reset",content:{connectStatus:this.connect.connectStatus,force:e}}),this.connect.isCalling()&&await this.hangup(),await this.connect.reset(),this.config.isLogin()?await this.logout({isReset:!1}):await this.config.reset(),await this.socket.reset({force:e})}on(t,e){this.listener.push({event:t,callback:e})}off(t,e){this.logger.info(`off ${t}`,{caller:"CallKit.off",content:{event:t}}),e?this.listener=this.listener.filter(i=>!(i.event===t&&i.callback===e)):this.listener=this.listener.filter(i=>i.event!==t)}removeAllListeners(){this.listener=this.listener.splice(0,this.listener.length),this.logger.info("removeAllListeners",{caller:"CallKit.removeAllListeners",content:{listener:this.listener}})}trigger(t,e,i=!1){i||this.logger.info(`Trigger Event: ${t}`,{caller:"CallKit.trigger",content:e}),this.listener.forEach(n=>{if(n.event===t)try{n.callback(e)}catch(l){this.logger.error(`Event callback error: ${t}`,l,!0)}})}};0&&(module.exports={CallKit});
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import W from"blueimp-md5";import tt from"axios";var V=tt.create({headers:{"Content-Type":"application/x-www-form-urlencoded"},timeout:6e4});V.interceptors.request.use(o=>o);V.interceptors.response.use(o=>o.data,o=>Promise.reject(o));var et=o=>V.request(o),z=et;var P=class{callKit;constructor(t){this.callKit=t}isLogining=!1;isLoginOuting=!1;async login(t){if(this.isLogining){this.callKit.logger.info("login is already in progress cancel",{caller:"Api.login",content:{userName:t.userName,timestamp:t.timestamp}});return}this.isLogining=!0;try{return await this.post({url:"/auth/agentUser/login",method:"post",data:t})}finally{this.isLogining=!1}}async loginOut(t){if(this.isLoginOuting){this.callKit.logger.info("loginOut is already in progress cancel",{caller:"Api.loginOut",content:{sessionId:t.sessionId,timestamp:t.timestamp}});return}this.isLoginOuting=!0;try{return await this.post({url:"/auth/agentUser/loginOut",method:"post",data:t})}finally{this.isLoginOuting=!1}}async trackLogs(t){return this.post({url:"/agent/user/sdkLog",method:"post",data:{content:[t]}},{useFormData:!0,skipLog:!0})}async updateUserStatus(t){return this.post({url:"/agent/user/changeStatus",method:"post",data:t})}async post(t,e={skipLog:!1}){let{userInfo:i,host:n}=this.callKit.config.getConfig(),{sessionId:l}=i;if(t.url=`${n}${t.url}`,t.headers={"Content-Type":"application/x-www-form-urlencoded",...t.headers},t.headers["Content-Type"]==="application/x-www-form-urlencoded"&&e.useFormData){let k=new FormData,K=t.data||{};for(let c in K)Object.prototype.hasOwnProperty.call(K,c)&&k.append(c,K[c]);t.data=k}else t.data=new URLSearchParams(t.data).toString();l&&(t.headers.sessionId=l);let r=Date.now();e.skipLog||this.callKit.logger.info("API Request Start",{type:"API",caller:"API.Request",content:{url:t.url,headers:t.headers,data:t.data,extra:e,startTime:r}});let f=await z(t).catch(()=>{this.callKit.config.reset()}),C=Date.now();if(e.skipLog||this.callKit.logger.info("API Request Finish",{type:"API",caller:"API.Request",content:{url:t.url,duration:`${C-r}ms`,response:f}}),!f)throw this.callKit.reset(),new Error("Network error");let{code:u,data:v,message:F}=f;if(u==="000000")return v;throw u==="100013"&&this.callKit.config.reset(),new Error(F??"Request failed")}};var h={init:0,connecting:2,ringing:4,calling:5},s={KIT_LOG:"log",KIT_USER_STATUS_CHANGE:"userStatusChange",KIT_LOGIN_CHANGE:"loginChange",KIT_REGISTER_CHANGE:"registerChange",KIT_CALL_STATUS_CHANGE:"callStatusChange",KIT_SET_HOLD:"holdChange",KIT_SET_MUTE:"muteChange",KIT_CALL_ID_CHANGE:"callIdChange",KIT_ERROR:"error",KIT_INVITE:"invite",KIT_OUTGOING_INVITE:"outgoingInvite",CALL_CONNECTING:"connecting",CALL_RINGING:"ringing",AGENT_PICK_UP:"agentPickUp",CALL_PICK_UP:"pickUp",CALL_NO_ANSWER:"noAnswer",CALL_HANG_UP:"hangUp",CALL_END:"callEnd",CALL_CDR:"callCdr",SERVER_SOCKET_EVENT:"socketEvent",USER_STATUS_CHANGE:"userStatusChange",INCALL_CONNECT_EVENT:"IncallConnectEvent",SIP_CONNECT_EVENT:"sipConnectEvent",SIP_REGISTERER_EVENT:"sipRegistererEvent",SIP_SESSION_EVENT:"sipSessionEvent"},a={UNKNOWN_ERROR:-1,API_USER_LOGIN_ERROR:1000001,API_USER_STATUS_UPDATE_ERROR:1000002,API_USER_LOGOUT_ERROR:1000003,CONNECT_CALL_STATUS_ERROR:2000001,USER_NOT_LOGIN:2000002,WEBRTC_USER_MEDIA_ERROR:2000003,WEBRTC_HOLE_STATUS_ERROR:2000004,WEBRTC_AUDIO_PLAYER_ERROR:2000005,WEBRTC_AUDIO_PLAY_ERROR:2000006,WEBRTC_USER_AGENT_ERROR:2000007,WEBRTC_CALL_INVITE_ERROR:2000008,WEBRTC_REGISTER_ERROR:2000009,WEBRTC_MUTE_STATUS_ERROR:2000010,WEBRTC_CANCEL_REGISTER_ERROR:2000011,WEBRTC_MUTE_ERROR:2000012,SOCKET_CONNECT_ERROR:3000001,SOCKET_PING_TIMEOUT:3000002,SOKET_SERVER_ERROR:3000003,SOCKET_CALL_ERROR:3000004,SOCKET_RECONNECT_FAILED:3000005},J={info:9,success:4,warn:3,error:2,silent:1},E={PING:"PING",START:"START",AGENT_HANGUP:"AGENT_HANG_UP",CALL_CANCEL:"AGENT_CANCEL",HOLD:"AGENT_HOLD",UNHOLD:"AGENT_UN_HOLD",MUTE:"AGENT_MUTE",UNMUTE:"AGENT_UN_MUTE",CALL:"CALL",END:"STOP",AGENT_TRANSFER:"AGENT_TRANSFER",HANG_UP_REASON:"HANG_UP_REASON",ACK:"ACK"},p={PONG:"PONG",START_CONFIRM:"START_CONFIRM",CALL_SUCCESS:"CALL_SUCCESS",CALL_FAILED:"CALL_FAILED",CUSTOMER_RINGING:"CUSTOMER_RINGING",AGENT_PICK_UP:"AGENT_PICK_UP",CUSTOMER_PICK_UP:"CUSTOMER_PICK_UP",CUSTOMER_NO_ANSWER:"CUSTOMER_NO_ANSWER",CUSTOMER_HANG_UP:"CUSTOMER_HANG_UP",AGENT_NO_ANSWER:"AGENT_NO_ANSWER",AGENT_HANG_UP:"AGENT_HANG_UP",CALL_CDR:"CALL_CDR",STOP_CONFIRM:"STOP_CONFIRM",CLOSE:"CLOSE",ERROR:"ERROR",SESSION_ERROR:"SESSION_ERROR"},T={NONE:"NONE",INTERNAL:"INTERNAL"},w={audio:{autoGainControl:!0,noiseSuppression:!0,echoCancellation:!0},video:!1},R={phoneNum:1,workOrderId:2},L={enabled:!1,interval:5e3,maxSize:8192},A={enabled:!0,maxAttempts:3,delay:1e3,pingInterval:3e4,pingTimeout:5e3},O={enabled:!0,maxAttempts:3,delay:1e3};var U=class{callKit;constructor(t){this.callKit=t}async callStart(t){if(this.callKit.config.check()){if(this.callKit.logger.info("callStart",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}}),!this.callKit.socket.startConfirm){this.callKit.logger.warn("server not confirm start",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}});return}this.callKit.connect.call(async e=>{let i={...t?.extra||{},agentId:e.agentId,sourceType:e.sourceType};e.sourceType===R.phoneNum?i.phoneNum=e.extno:e.sourceType===R.workOrderId&&(i.workOrderId=e.workOrderId),this.callKit.socket.send(E.CALL,i)})}}async callRefer(t,e){this.callKit.config.check()&&(this.callKit.logger.info("callRefer",{caller:"Call.callRefer",content:{referTo:t,options:e}}),this.callKit.connect.refer(t,e))}async callEnd(t=!1,e=!1){this.callKit.connect.connectStatus!==h.init&&this.callKit.config.check()&&(this.callKit.logger.info("callEnd",{caller:"Call.callEnd",content:{isUnprompted:t,isError:e,connectStatus:this.callKit.connect.connectStatus}}),this.callKit.connect.hangup(t,e))}async callHold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be held",{caller:"Call.callHold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!0)}}async callUnhold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot unhold",{caller:"Call.callUnhold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!1)}}async callMute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be muted",{caller:"Call.callMute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!0)}}async callUnmute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be unmuted",{caller:"Call.callUnmute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!1)}}};var Y={name:"@koi-design/callkit",version:"2.0.5-beta.13",description:"callkit",author:"koi",license:"ISC",scripts:{build:"tsup",start:"vite",dev:"tsup --watch",lint:"eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",release:"tsup && node scripts/pkg.js"},exports:{".":{types:"./dist/index.d.ts",require:"./dist/index.js",import:"./dist/index.mjs"}},main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",files:["dist"],dependencies:{axios:"~0.26.1","blueimp-md5":"^2.12.0","eslint-plugin-jsonc":"^2.21.0","json-stringify-safe":"^5.0.1","sip.js":"^0.21.2"},devDependencies:{"@commitlint/cli":"^9.1.2","@commitlint/config-conventional":"^9.1.2","@koi-design/eslint-config-ts":"^0.0.14","@types/blueimp-md5":"^2.18.2",archiver:"^5.3.1",consola:"^3.4.2",eslint:"~8.29.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.5.0",husky:"^8.0.3","lint-staged":"^10.5.4",prettier:"^2.6.2",tsup:"6.6.3",typescript:"^4.6.3",vite:"^4"}};var G=class{callKit;constructor(t){this.callKit=t}config={version:`V${Y.version}`,host:"",log:"info",trackLogs:L,audioRef:void 0,constrains:w,socket:"",reconnect:{sip:O,incall:A},userInfo:{wsUrl:"",logGather:!1,sessionId:"",username:"",password:"",encryptionPassword:T.INTERNAL,sourceType:R.phoneNum,extno:"",workOrderId:"",userPart:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:0,encryptionMethod:T.INTERNAL}};getConfig=()=>this.config;setConfig=async(t,e)=>{this.config[t]=e};setUserInfo=async(t,e)=>{this.config.userInfo[t]=e,this.callKit.logger.info("setUserInfo",{caller:"Config.setUserInfo",content:{key:t,value:e}})};reset=async()=>{this.isLogin()&&(this.config.userInfo={wsUrl:"",sessionId:"",username:"",password:"",encryptionPassword:"",userPart:"",sourceType:R.phoneNum,extno:"",workOrderId:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:this.config.userInfo.iceGatheringTimeout,encryptionMethod:T.INTERNAL,logGather:!1},this.callKit.trigger(s.KIT_LOGIN_CHANGE,!1))};validate=()=>{let{userPart:t,fsIp:e,fsPassword:i,fsPort:n}=this.config.userInfo;return!(!t||!e||!n||!i)};isLogin=()=>this.validate();check(){return this.isLogin()?!0:(this.callKit.logger.warn("User not logged in",{caller:"Config.check",content:{errCode:a.USER_NOT_LOGIN}}),!1)}getTrackLogsConfig(){return{...L,...this.config?.trackLogs}}getReconnectConfig(t){return{...this.config?.reconnect?.[t]??(t==="sip"?O:A)}}enableTrackLogs(t){this.config.trackLogs.enabled=t}};import nt from"json-stringify-safe";function N(o){return J[o]}function st(o){let{timestamp:t,level:e,type:i="OTHER",message:n,caller:l,content:r}=o,f=String(e).toUpperCase();return`${t} [${f}] [${i}] [${l??"unknown"}] [${n}] ${nt(r)}`.trim()}function X(o){return new Blob([o]).size}var b=class{prefix="CallKit";level="info";pendingTrackLogs=[];trackLogsTimer=null;callKit;constructor(t,e){this.callKit=t,this.level=e||"info",this.startTrackLogsTimer()}startTrackLogsTimer(){let{interval:t}=this.callKit.config.getTrackLogsConfig();this.trackLogsTimer||(this.trackLogsTimer=setInterval(()=>{this.flushTrackLogs()},t))}flushTrackLogs(){if(this.pendingTrackLogs.length===0)return;let{enabled:t,maxSize:e}=this.callKit.config.getTrackLogsConfig();if(t)try{let i=[],n=[],l=0;for(let r of this.pendingTrackLogs){let f=X(r),C=n.length>0?`
|
|
1
|
+
import W from"blueimp-md5";import tt from"axios";var V=tt.create({headers:{"Content-Type":"application/x-www-form-urlencoded"},timeout:6e4});V.interceptors.request.use(o=>o);V.interceptors.response.use(o=>o.data,o=>Promise.reject(o));var et=o=>V.request(o),z=et;var P=class{callKit;constructor(t){this.callKit=t}isLogining=!1;isLoginOuting=!1;async login(t){if(this.isLogining){this.callKit.logger.info("login is already in progress cancel",{caller:"Api.login",content:{userName:t.userName,timestamp:t.timestamp}});return}this.isLogining=!0;try{return await this.post({url:"/auth/agentUser/login",method:"post",data:t})}finally{this.isLogining=!1}}async loginOut(t){if(this.isLoginOuting){this.callKit.logger.info("loginOut is already in progress cancel",{caller:"Api.loginOut",content:{sessionId:t.sessionId,timestamp:t.timestamp}});return}this.isLoginOuting=!0;try{return await this.post({url:"/auth/agentUser/loginOut",method:"post",data:t})}finally{this.isLoginOuting=!1}}async trackLogs(t){return this.post({url:"/agent/user/sdkLog",method:"post",data:{content:[t]}},{useFormData:!0,skipLog:!0})}async updateUserStatus(t){return this.post({url:"/agent/user/changeStatus",method:"post",data:t})}async post(t,e={skipLog:!1}){let{userInfo:i,host:n}=this.callKit.config.getConfig(),{sessionId:l}=i;if(t.url=`${n}${t.url}`,t.headers={"Content-Type":"application/x-www-form-urlencoded",...t.headers},t.headers["Content-Type"]==="application/x-www-form-urlencoded"&&e.useFormData){let k=new FormData,K=t.data||{};for(let c in K)Object.prototype.hasOwnProperty.call(K,c)&&k.append(c,K[c]);t.data=k}else t.data=new URLSearchParams(t.data).toString();l&&(t.headers.sessionId=l);let r=Date.now();e.skipLog||this.callKit.logger.info("API Request Start",{type:"API",caller:"API.Request",content:{url:t.url,headers:t.headers,data:t.data,extra:e,startTime:r}});let f=await z(t).catch(()=>{this.callKit.config.reset()}),C=Date.now();if(e.skipLog||this.callKit.logger.info("API Request Finish",{type:"API",caller:"API.Request",content:{url:t.url,duration:`${C-r}ms`,response:f}}),!f)throw this.callKit.reset(),new Error("Network error");let{code:u,data:v,message:F}=f;if(u==="000000")return v;throw u==="100013"&&this.callKit.config.reset(),new Error(F??"Request failed")}};var h={init:0,connecting:2,ringing:4,calling:5},s={KIT_LOG:"log",KIT_USER_STATUS_CHANGE:"userStatusChange",KIT_LOGIN_CHANGE:"loginChange",KIT_REGISTER_CHANGE:"registerChange",KIT_CALL_STATUS_CHANGE:"callStatusChange",KIT_SET_HOLD:"holdChange",KIT_SET_MUTE:"muteChange",KIT_CALL_ID_CHANGE:"callIdChange",KIT_ERROR:"error",KIT_INVITE:"invite",KIT_OUTGOING_INVITE:"outgoingInvite",CALL_CONNECTING:"connecting",CALL_RINGING:"ringing",AGENT_PICK_UP:"agentPickUp",CALL_PICK_UP:"pickUp",CALL_NO_ANSWER:"noAnswer",CALL_HANG_UP:"hangUp",CALL_END:"callEnd",CALL_CDR:"callCdr",SERVER_SOCKET_EVENT:"socketEvent",USER_STATUS_CHANGE:"userStatusChange",INCALL_CONNECT_EVENT:"IncallConnectEvent",SIP_CONNECT_EVENT:"sipConnectEvent",SIP_REGISTERER_EVENT:"sipRegistererEvent",SIP_SESSION_EVENT:"sipSessionEvent"},a={UNKNOWN_ERROR:-1,API_USER_LOGIN_ERROR:1000001,API_USER_STATUS_UPDATE_ERROR:1000002,API_USER_LOGOUT_ERROR:1000003,CONNECT_CALL_STATUS_ERROR:2000001,USER_NOT_LOGIN:2000002,WEBRTC_USER_MEDIA_ERROR:2000003,WEBRTC_HOLE_STATUS_ERROR:2000004,WEBRTC_AUDIO_PLAYER_ERROR:2000005,WEBRTC_AUDIO_PLAY_ERROR:2000006,WEBRTC_USER_AGENT_ERROR:2000007,WEBRTC_CALL_INVITE_ERROR:2000008,WEBRTC_REGISTER_ERROR:2000009,WEBRTC_MUTE_STATUS_ERROR:2000010,WEBRTC_CANCEL_REGISTER_ERROR:2000011,WEBRTC_MUTE_ERROR:2000012,SOCKET_CONNECT_ERROR:3000001,SOCKET_PING_TIMEOUT:3000002,SOKET_SERVER_ERROR:3000003,SOCKET_CALL_ERROR:3000004,SOCKET_RECONNECT_FAILED:3000005},J={info:9,success:4,warn:3,error:2,silent:1},E={PING:"PING",START:"START",AGENT_HANGUP:"AGENT_HANG_UP",CALL_CANCEL:"AGENT_CANCEL",HOLD:"AGENT_HOLD",UNHOLD:"AGENT_UN_HOLD",MUTE:"AGENT_MUTE",UNMUTE:"AGENT_UN_MUTE",CALL:"CALL",END:"STOP",AGENT_TRANSFER:"AGENT_TRANSFER",HANG_UP_REASON:"HANG_UP_REASON",ACK:"ACK"},p={PONG:"PONG",START_CONFIRM:"START_CONFIRM",CALL_SUCCESS:"CALL_SUCCESS",CALL_FAILED:"CALL_FAILED",CUSTOMER_RINGING:"CUSTOMER_RINGING",AGENT_PICK_UP:"AGENT_PICK_UP",CUSTOMER_PICK_UP:"CUSTOMER_PICK_UP",CUSTOMER_NO_ANSWER:"CUSTOMER_NO_ANSWER",CUSTOMER_HANG_UP:"CUSTOMER_HANG_UP",AGENT_NO_ANSWER:"AGENT_NO_ANSWER",AGENT_HANG_UP:"AGENT_HANG_UP",CALL_CDR:"CALL_CDR",STOP_CONFIRM:"STOP_CONFIRM",CLOSE:"CLOSE",ERROR:"ERROR",SESSION_ERROR:"SESSION_ERROR"},T={NONE:"NONE",INTERNAL:"INTERNAL"},w={audio:{autoGainControl:!0,noiseSuppression:!0,echoCancellation:!0},video:!1},R={phoneNum:1,workOrderId:2},L={enabled:!1,interval:5e3,maxSize:8192},A={enabled:!0,maxAttempts:3,delay:1e3,pingInterval:3e4,pingTimeout:5e3},O={enabled:!0,maxAttempts:3,delay:1e3};var U=class{callKit;constructor(t){this.callKit=t}async callStart(t){if(this.callKit.config.check()){if(this.callKit.logger.info("callStart",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}}),!this.callKit.socket.startConfirm){this.callKit.logger.warn("server not confirm start",{caller:"Call.callStart",content:{startConfirm:this.callKit.socket.startConfirm}});return}this.callKit.connect.call(async e=>{let i={...t?.extra||{},agentId:e.agentId,sourceType:e.sourceType};e.sourceType===R.phoneNum?i.phoneNum=e.extno:e.sourceType===R.workOrderId&&(i.workOrderId=e.workOrderId),this.callKit.socket.send(E.CALL,i)})}}async callRefer(t,e){this.callKit.config.check()&&(this.callKit.logger.info("callRefer",{caller:"Call.callRefer",content:{referTo:t,options:e}}),this.callKit.connect.refer(t,e))}async callEnd(t=!1,e=!1){this.callKit.connect.connectStatus!==h.init&&this.callKit.config.check()&&(this.callKit.logger.info("callEnd",{caller:"Call.callEnd",content:{isUnprompted:t,isError:e,connectStatus:this.callKit.connect.connectStatus}}),this.callKit.connect.hangup(t,e))}async callHold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be held",{caller:"Call.callHold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!0)}}async callUnhold(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot unhold",{caller:"Call.callUnhold",content:{isHold:this.callKit.connect.isHolding(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setHold(!1)}}async callMute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be muted",{caller:"Call.callMute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!0)}}async callUnmute(){if(this.callKit.config.check()){if(!this.callKit.connect.isCalling()){this.callKit.logger.warn("Current state cannot be unmuted",{caller:"Call.callUnmute",content:{isMuted:this.callKit.connect.isMuted(),isCalling:this.callKit.connect.isCalling()}});return}this.callKit.connect.setMute(!1)}}};var Y={name:"@koi-design/callkit",version:"2.0.5-beta.14",description:"callkit",author:"koi",license:"ISC",scripts:{build:"tsup",start:"vite",dev:"tsup --watch",lint:"eslint -c ../../.eslintrc.js --ext .jsx,.js,.tsx,.ts ./package --fix",release:"tsup && node scripts/pkg.js"},exports:{".":{types:"./dist/index.d.ts",require:"./dist/index.js",import:"./dist/index.mjs"}},main:"./dist/index.js",module:"./dist/index.mjs",types:"./dist/index.d.ts",files:["dist"],dependencies:{axios:"~0.26.1","blueimp-md5":"^2.12.0","eslint-plugin-jsonc":"^2.21.0","json-stringify-safe":"^5.0.1","sip.js":"^0.21.2"},devDependencies:{"@commitlint/cli":"^9.1.2","@commitlint/config-conventional":"^9.1.2","@koi-design/eslint-config-ts":"^0.0.14","@types/blueimp-md5":"^2.18.2",archiver:"^5.3.1",consola:"^3.4.2",eslint:"~8.29.0","eslint-config-prettier":"^10.1.5","eslint-plugin-prettier":"^5.5.0",husky:"^8.0.3","lint-staged":"^10.5.4",prettier:"^2.6.2",tsup:"6.6.3",typescript:"^4.6.3",vite:"^4"}};var G=class{callKit;constructor(t){this.callKit=t}config={version:`V${Y.version}`,host:"",log:"info",trackLogs:L,audioRef:void 0,constrains:w,socket:"",reconnect:{sip:O,incall:A},userInfo:{wsUrl:"",logGather:!1,sessionId:"",username:"",password:"",encryptionPassword:T.INTERNAL,sourceType:R.phoneNum,extno:"",workOrderId:"",userPart:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:0,encryptionMethod:T.INTERNAL}};getConfig=()=>this.config;setConfig=async(t,e)=>{this.config[t]=e};setUserInfo=async(t,e)=>{this.config.userInfo[t]=e,this.callKit.logger.info("setUserInfo",{caller:"Config.setUserInfo",content:{key:t,value:e}})};reset=async()=>{this.isLogin()&&(this.config.userInfo={wsUrl:"",sessionId:"",username:"",password:"",encryptionPassword:"",userPart:"",sourceType:R.phoneNum,extno:"",workOrderId:"",agentId:"",fsUserId:"",fsPassword:"",fsIp:"",fsPort:"",iceInfo:[],iceGatheringTimeout:this.config.userInfo.iceGatheringTimeout,encryptionMethod:T.INTERNAL,logGather:!1},this.callKit.trigger(s.KIT_LOGIN_CHANGE,!1))};validate=()=>{let{userPart:t,fsIp:e,fsPassword:i,fsPort:n}=this.config.userInfo;return!(!t||!e||!n||!i)};isLogin=()=>this.validate();check(){return this.isLogin()?!0:(this.callKit.logger.warn("User not logged in",{caller:"Config.check",content:{errCode:a.USER_NOT_LOGIN}}),!1)}getTrackLogsConfig(){return{...L,...this.config?.trackLogs}}getReconnectConfig(t){return{...this.config?.reconnect?.[t]??(t==="sip"?O:A)}}enableTrackLogs(t){this.config.trackLogs.enabled=t}};import nt from"json-stringify-safe";function N(o){return J[o]}function st(o){let{timestamp:t,level:e,type:i="OTHER",message:n,caller:l,content:r}=o,f=String(e).toUpperCase();return`${t} [${f}] [${i}] [${l??"unknown"}] [${n}] ${nt(r)}`.trim()}function X(o){return new Blob([o]).size}var b=class{prefix="CallKit";level="info";pendingTrackLogs=[];trackLogsTimer=null;callKit;constructor(t,e){this.callKit=t,this.level=e||"info",this.startTrackLogsTimer()}startTrackLogsTimer(){let{interval:t}=this.callKit.config.getTrackLogsConfig();this.trackLogsTimer||(this.trackLogsTimer=setInterval(()=>{this.flushTrackLogs()},t))}flushTrackLogs(){if(this.pendingTrackLogs.length===0)return;let{enabled:t,maxSize:e}=this.callKit.config.getTrackLogsConfig();if(t)try{let i=[],n=[],l=0;for(let r of this.pendingTrackLogs){let f=X(r),C=n.length>0?`
|
|
2
2
|
`:"",u=X(C);l+f+u>e&&n.length>0?(i.push(n.join(`
|
|
3
3
|
`)),n=[r],l=f):(n.push(r),l+=f+u)}n.length>0&&i.push(n.join(`
|
|
4
|
-
`));for(let r of i)this.callKit.api.trackLogs(r);this.pendingTrackLogs=[]}catch(i){console.error(i)}}destroy(){this.trackLogsTimer&&(clearInterval(this.trackLogsTimer),this.trackLogsTimer=null),this.flushTrackLogs()}setLevel(t){this.level=t}info(t,e){let i=this.catchLog(t,e,"info");N(this.level)>=N("info")&&console.log(`%c${i}`,"color: gray;")}success(t,e){let i=this.catchLog(t,e,"success");N(this.level)>=N("success")&&console.log(`%c${i}`,"color: green;")}warn(t,e){let i=this.catchLog(t,e,"warn");N(this.level)>=N("warn")&&console.log(`%c${i}`,"color: orange;")}error(t,e,i=!1){let n=t instanceof Error?t.message:t,l=this.catchLog(n,e,"error");N(this.level)>=N("error")&&console.log(`%c${l}`,"color: red;");let{errCode:r,...f}=e?.content??{},C=r??a.UNKNOWN_ERROR;i||this.callKit.trigger(s.KIT_ERROR,{code:C,msg:n,data:f});let u=new Error(n);throw u.name="CallKitError",u.code=C,u.data=f,u}catchLog(t,e,i){let n=new Date,{enabled:l}=this.callKit.config.getTrackLogsConfig(),{userInfo:r}=this.callKit.config.getConfig(),f={agentId:r?.agentId,sessionId:r?.sessionId,...e?.content??{}},C={timestamp:n.toLocaleString().replace("T"," ").replace(".000Z",""),level:i,message:t,caller:e?.caller,type:e?.type,content:f},u=st(C);return l&&this.pendingTrackLogs.push(u),this.callKit.trigger(s.KIT_LOG,u,!0),u}};import{UserAgent as j,Web as rt,Registerer as ot,SessionState as y,RegistererState as M}from"sip.js";var Z=o=>{let t=o["x-antaios-manual-extend_info"]||o["x-antaios-manual-extend-info"],e=null;try{if(t&&typeof t=="string"){let i=t.replace(/\\/g,"");return e=JSON.parse(i),e}}catch{return{}}};var D=6;function ct(o){return o.replace(/(\w+):\s*'(.*?)'/g,'"$1": "$2"').replace(/'/g,'"')}var B=o=>{o&&o.getTracks().forEach(t=>t.stop())},at=()=>{typeof navigator.mediaDevices>"u"&&(navigator.mediaDevices={}),typeof navigator.mediaDevices.getUserMedia>"u"&&(navigator.mediaDevices.getUserMedia=o=>{let t=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return t?new Promise((e,i)=>{t.call(navigator,o,e,i)}):Promise.reject(new Error("Unable to obtain device permissions. Please check your browser settings or device permissions."))})},x=class{callKit;isMute=!1;isRegister=!1;isHold=!1;connectStatus=h.init;currentSession;mediaStream;userAgent;registerer;isReConnected=!1;isOutgoing=!1;isUnprompted=!1;hasInvite=!1;constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("sip")}currentCallId=null;getCurrentCallId(){return this.currentCallId}setOutgoing(t){this.isOutgoing!==t&&(this.callKit.logger.info("setOutgoing",{caller:"Connect.setOutgoing",content:{outgoing:t}}),this.isOutgoing=t)}setCallId(t){this.callKit.logger.info("setCallId",{caller:"Connect.setCallId",content:{callId:t}}),this.currentCallId=t,this.callKit.trigger(s.KIT_CALL_ID_CHANGE,t)}async reset(){if(this.setOutgoing(!1),this.isUnprompted=!1,this.hasInvite=!1,this.isHolding()&&await this.setHold(!1),this.isMuted()&&await this.setMute(!1),this.connectStatus!==h.init&&this.setConnectStatus(h.init),this.isRegistered()&&await this.unregister(),this.currentCallId&&this.setCallId(null),this.currentSession=void 0,this.mediaStream=void 0,this.userAgent=void 0,this.registerer=void 0,this.mediaStream)try{B(this.mediaStream);let t=this.getAduioReference();t&&(t.pause(),t.srcObject=null)}catch(t){this.callKit.logger.error(t,{caller:"Connect.reset",content:{}})}this.setConnectStatus(h.init),this.clearHeartbeat()}getAduioReference(){let{audioRef:t}=this.callKit.config.getConfig();return typeof t=="function"?t():t}async permission(){this.callKit.logger.info("permission",{caller:"Connect.permission",content:{permission:!0}}),at();let t=await navigator.mediaDevices.getUserMedia({audio:!0});B(t)}isConnecting(){return this.connectStatus===h.connecting}isCalling(){return this.connectStatus===h.calling}isRinging(){return this.connectStatus===h.ringing}isHolding(){return this.isHold}isRegistered(){return this.isRegister}isMuted(){return this.isMute}isInit(){return this.connectStatus===h.init}heartbeatInterval;heartbeatFlag=D;clearHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.heartbeatFlag=D}startHeartbeat(){this.heartbeatFlag=D,this.clearHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.heartbeatFlag-=1,this.heartbeatFlag<=0&&(this.heartbeatFlag=D,this.callKit.trigger(s.SIP_CONNECT_EVENT,{event:"OPTIONS_HEARTBEAT_EXPIRED"}))},1e3)}socketTriggerHangup(t){!this.isCalling()||t!==this.currentCallId||(this.callKit.logger.info("socketHangup trigger hangup",{caller:"Connect.socketHangup",content:{callId:t,currentCallId:this.currentCallId}}),this.callKit.hangup())}async register(){if(this.connectStatus!==h.init){if(this.isRegistered()){this.callKit.logger.warn("connectStatus is registered",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.reset(),this.callKit.logger.error("connectStatus is not init",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.logger.info("connect register",{caller:"Connect.register",content:{connectStatus:this.connectStatus}}),await this.permission().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",content:{errCode:a.WEBRTC_USER_MEDIA_ERROR}})});let{userInfo:t,constrains:e}=this.callKit.config.getConfig(),i=async()=>(this.mediaStream=await navigator.mediaDevices.getUserMedia(e),this.mediaStream),{userPart:n,fsIp:l,fsPort:r,iceInfo:f,wsUrl:C}=t,u={uri:j.makeURI(`sip:${n}@${l}:${r}`),displayName:n,transportOptions:{wsServers:[C],traceSip:!0},logLevel:"error",allowLegacyNotifications:!0,contactName:n,sessionDescriptionHandlerFactory:rt.defaultSessionDescriptionHandlerFactory(i),sessionDescriptionHandlerFactoryOptions:{constraints:e,iceGatheringTimeout:t.iceGatheringTimeout,peerConnectionConfiguration:{iceServers:JSON.parse(ct(f))}}};this.callKit.logger.info("connect connectConfig",{caller:"Connect.register",content:u}),this.userAgent=new j(u);let v=new MediaStream,F=c=>{let m=this.getAduioReference();this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.register.setupRemoteMedia",content:m}),c.sessionDescriptionHandler.peerConnection.getReceivers().forEach(S=>{S.track&&v.addTrack(S.track)}),m?(m.srcObject=v,m.play().catch(S=>{this.callKit.logger.error(S.message,{caller:"Connect.register.setupRemoteMedia",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})):this.callKit.logger.error("video is not exist",{caller:"Connect.register",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})},k=(c,m)=>{let{that:S=this}=m,I=c.userAgentCore,g=I.receiveIncomingRequestFromTransport.bind(I);I.receiveIncomingRequestFromTransport=d=>(d.method==="OPTIONS"&&S.startHeartbeat(),S.callKit.logger.info(`SIP Receive: ${d?.method}`,{caller:"Connect.register.observeSocketStatus.receiveRequest",type:"SIP",content:{request:d}}),g(d));let $=I.receiveIncomingResponseFromTransport.bind(I);I.receiveIncomingResponseFromTransport=d=>(S.callKit.logger.info(`SIP Receive Response: ${d?.statusCode} ${d?.reasonPhrase}`,{caller:"Connect.register.observeSocketStatus.receiveResponse",type:"SIP",content:{response:d}}),$(d));let{transport:_}=c;if(_){let d=_.send.bind(_);_.send=q=>(S.callKit.logger.info("SIP send message",{caller:"Connect.register.observeSocketStatus",type:"SIP",content:{message:q.toString()}}),d(q))}},K={};this.registerer=new ot(this.userAgent,K),this.registerer.stateChange.addListener(c=>{switch(c){case M.Initial:this.callKit.logger.info("registerer stateChange Initial",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(h.init),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case M.Registered:this.callKit.logger.info("registerer stateChange Registered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!0),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case M.Terminated:this.callKit.logger.info("registerer stateChange Terminated",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(h.init),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case M.Unregistered:this.callKit.logger.info("registerer stateChange Unregistered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{isRegistered:this.isRegistered(),registererState:c}}),this.setRegister(!1),this.setConnectStatus(h.init),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;default:break}}),this.userAgent.delegate={onInvite:c=>{this.callKit.logger.info("connect onInvite",{type:"SIP",caller:"Connect.register.onInvite",content:{invite:c,isRegistered:this.isRegistered(),isOutgoing:this.isOutgoing}}),this.currentSession=c,this.currentSession.stateChange.addListener(g=>{switch(g){case y.Establishing:this.callKit.logger.info("connect Establishing",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:g}}),this.setConnectStatus(h.ringing),this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()});break;case y.Established:this.callKit.logger.info("connect Established",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:g}}),this.callKit.connect.setConnectStatus(h.calling),this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()}),F(this.currentSession);break;case y.Terminating:this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()});break;case y.Terminated:this.callKit.logger.info("connect Terminated",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:g}}),this.hasInvite=!1,this.isUnprompted||this.callKit.callCenter.callEnd(),this.isUnprompted=!1,this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()});break;default:break}});let m={sessionDescriptionHandlerOptions:{constraints:e,alwaysAcquireMediaFirst:!0}},S=()=>{let{request:g}=this.currentSession,$=Object.keys(g.headers),_={};return $.filter(d=>d.toLocaleLowerCase().startsWith("x-antaios")).forEach(d=>{_[d.toLocaleLowerCase()]=g.getHeader(d)}),this.callKit.logger.info("get invite data",{caller:"Connect.register.onInvite",content:_}),_},I=S();try{let g=Z(I);g?.callUuid?this.setCallId(g.callUuid):(this.setCallId(null),this.callKit.logger.warn("call id is not exist",{caller:"Connect.register.onInvite",content:{inviteData:g}}))}catch(g){this.callKit.logger.info(g,{caller:"Connect.register.onInvite",content:I})}if(this.isOutgoing)this.currentSession.accept(m),this.callKit.trigger(s.KIT_OUTGOING_INVITE,{getInviteData:S});else{this.hasInvite=!0;let g=()=>{this.currentSession?.state!==y.Terminated&&this.currentSession?.state!==y.Terminating&&this.currentSession.reject(),this.hasInvite=!1,this.callKit.callCenter.callEnd(!0,!1)};this.callKit.trigger(s.KIT_INVITE,{accept:()=>{this.callKit.trigger(s.CALL_CONNECTING,new Date),this.hasInvite=!1,this.currentSession.accept(m)},reject:g,getInviteData:S})}},onConnect:async()=>{this.reconnectAttempts=0,this.reconnectTimer=null,this.callKit.logger.info("connect onConnect",{caller:"Connect.register",type:"SIP",content:{version:`${this.callKit.config.getConfig().version}`}}),await this.registerer.register().catch(async c=>{this.callKit.reset(),this.callKit.logger.error(c?.message,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_REGISTER_ERROR}})})},onDisconnect:c=>{c?(this.callKit.logger.warn("SIP User Agent Disconnected with error",{caller:"Connect.register",type:"SIP",content:{err:c.message,errCode:a.WEBRTC_USER_AGENT_ERROR}}),this.startReconnectTimer()):this.callKit.logger.warn("SIP User Agent Disconnected",{caller:"Connect.register",type:"SIP",content:{}})},onRegister:()=>{this.callKit.logger.info("connect onRegister",{caller:"Connect.register",type:"SIP",content:{version:`V${this.callKit.config.getConfig().version}`}})}},k(this.userAgent,{that:this}),await this.userAgent.start().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_USER_AGENT_ERROR}})})}reconnectTimer;reconnectAttempts=0;startReconnectTimer(){if(this.reconnectAttempts>=this.reconnectConfig.maxAttempts&&this.callKit.config.isLogin()){this.callKit.reset(),this.callKit.logger.error("Reconnect failed max attempts",{caller:"Connect.startReconnectTimer",type:"SIP",content:{errCode:a.SOCKET_RECONNECT_FAILED,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}});return}this.callKit.logger.info("Reconnect timer started",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}}),this.reconnectAttempts+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer&&this.callKit.config.isLogin()?(this.userAgent?.reconnect(),this.callKit.logger.info("Reconnect attempt",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})):this.callKit.logger.info("Reconnect timer already expired",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})},this.reconnectConfig.delay)}async stop(){await this.userAgent.stop()}async unregister(){if(this.callKit.logger.info("connect unregister",{caller:"Connect.unregister",type:"SIP",content:{isRegistered:this.isRegistered()}}),!this.isRegistered()||!this.registerer){this.callKit.logger.warn("No registerer to unregister.",{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}});return}await this.registerer.unregister({all:!0}).catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})}).finally(()=>{this.setRegister(!1)}),await this.userAgent?.stop().catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})})}async call(t){this.callKit.logger.info("connect call",{caller:"Connect.call",type:"SIP",content:{callback:t}}),this.setOutgoing(!0),this.isRegistered()||await this.register(),this.setConnectStatus(h.connecting),this.callKit.trigger(s.CALL_CONNECTING,new Date);let{userInfo:e}=this.callKit.config.getConfig();t(e)}setRegister(t){this.isRegister!==t&&(this.callKit.logger.info("connect setRegister",{caller:"Connect.setRegister",type:"SIP",content:{register:t}}),this.isRegister=t,this.callKit.trigger(s.KIT_REGISTER_CHANGE,t))}setConnectStatus(t){this.callKit.logger.info("connect setConnectStatus",{caller:"Connect.setConnectStatus",type:"SIP",content:{status:t}}),this.connectStatus=t,this.callKit.trigger(s.KIT_CALL_STATUS_CHANGE,t)}async hangup(t=!1,e=!1){if(this.callKit.logger.info("connect hangup",{caller:"Connect.hangup",type:"SIP",content:{isUnprompted:t,isError:e,connectStatus:this.connectStatus}}),this.setOutgoing(!1),this.isUnprompted=t,this.setHold(!1),this.setMute(!1),this.connectStatus!==h.init)try{t&&(this.isRinging()||this.isCalling())&&(this.hasInvite?(this.currentSession?.state!==y.Terminated&&this.currentSession?.state!==y.Terminating&&this.currentSession.reject(),this.hasInvite=!1):await this.currentSession?.bye()),B(this.mediaStream);let i=this.getAduioReference();i&&(i.pause(),i.srcObject=null),this.setConnectStatus(h.init),this.callKit.trigger(s.CALL_END,new Date),this.setCallId(null)}catch(i){this.callKit.trigger(s.CALL_END,new Date),this.callKit.reset(),this.callKit.logger.error(i,{caller:"Connect.hangup",type:"SIP",content:{connectStatus:this.connectStatus,isError:e,isUnprompted:t}})}}getRemoteMediaStream(t){this.callKit.logger.info("connect getRemoteMediaStream",{caller:"Connect.getRemoteMediaStream",type:"SIP",content:{session:t}});let e=t.sessionDescriptionHandler;if(e)return e.remoteMediaStream}setupRemoteMedia(t){this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}});let e=this.getRemoteMediaStream(t),i=this.getAduioReference();i?(i.autoplay=!0,i.srcObject=e,i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})}),e.onaddtrack=()=>{this.callKit.logger.info("Remote media onaddtrack",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}}),i.load(),i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})}):this.callKit.logger.error("video is not exist",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})}async setHold(t){if(this.isHold===t){this.callKit.logger.warn("Already holding",{caller:"Connect.setHold",type:"SIP",content:{isHold:this.isHold}});return}this.callKit.socket.send(t?E.HOLD:E.UNHOLD),this.isHold=t,this.callKit.logger.info("connect setHold",{caller:"Connect.setHold",type:"SIP",content:{hold:t}}),this.callKit.trigger(s.KIT_SET_HOLD,t)}async setMute(t){if(this.isMute===t){this.callKit.logger.warn("Already muted",{caller:"Connect.setMute",type:"SIP",content:{isCalling:this.isCalling(),isMuted:this.isMuted()}});return}this.callKit.socket.send(t?E.MUTE:E.UNMUTE),this.isMute=t,this.callKit.trigger(s.KIT_SET_MUTE,t)}async refer(t,e){this.callKit.logger.info("connect refer",{caller:"Connect.refer",type:"SIP",content:{referTo:t,extra:e}});let i;t&&(i=j.makeURI(t)),this.currentSession.refer(i,e?.sessionReferOptions)}};var H=class{callKit;ws;lastPingTime=void 0;pingTimer;reconnectTimer;reconnectAttempts=0;connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1};get startConfirm(){return this.connectAuthState.startConfirm}get isError(){return this.connectAuthState.isError}constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("incall")}init(){let{socket:t}=this.callKit.config.getConfig();this.callKit.logger.info(`socket init: ${t}`,{caller:"Socket.init",type:"INCALL",content:{socket:t}}),this.connect(t)}setConnectAuthState(t,e){this.connectAuthState[t]!==e&&(this.connectAuthState[t]=e)}handleDisconnect(){this.setConnectAuthState("isConnected",!1);let{enabled:t}=this.reconnectConfig;if(!this.callKit.config.isLogin()||!t){this.callKit.reset(),this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"});return}this.connectAuthState.isReconnecting||this.connectAuthState.isError||this.attemptReconnect()}clearWebSocket(){this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null),(this.ws?.readyState===WebSocket.CONNECTING||this.ws?.readyState===WebSocket.OPEN)&&(this.ws?.close(1e3,"socket close"),this.callKit.logger.info("socket clear",{caller:"Socket.clearWebSocket",type:"INCALL",content:{}})),this.ws=void 0,this.setConnectAuthState("isConnected",!1)}connect(t){this.ws&&this.clearWebSocket(),this.ws=new WebSocket(t),this.ws.onopen=e=>this.onOpen(e),this.ws.onclose=e=>this.onClose(e),this.ws.onerror=e=>this.onError(e),this.ws.onmessage=e=>this.onMessage(e)}onOpen(t){this.callKit.logger.info("socket onOpen",{caller:"Socket.onOpen",type:"INCALL",content:{ev:t}}),this.setConnectAuthState("isConnected",!0),this.lastPingTime=Date.now(),this.checkPing(),this.send(E.START),this.connectAuthState.isReconnecting&&(this.setConnectAuthState("isReconnecting",!1),this.callKit.logger.info("reconnect success",{caller:"Socket.onOpen",type:"INCALL",content:{event:"INCALL_RECONNECT_SUCCESS",reconnectAttempts:this.reconnectAttempts}}),this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_SUCCESS"}))}cleanReconnectState(){this.reconnectAttempts=0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.setConnectAuthState("isReconnecting",!1),this.setConnectAuthState("isError",!1)}resetConnectState(){this.connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1},this.cleanReconnectState(),this.callKit.logger.info("reset connect state",{caller:"Socket.resetConnectState",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,connectAuthState:this.connectAuthState}})}onClose(t){this.callKit.logger.info("socket onClose",{caller:"Socket.onClose",type:"INCALL",content:{ev:t}}),this.handleDisconnect()}onError(t){this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_CONNECT_ERROR",err:t}),this.callKit.logger.error("socket onError",{caller:"Socket.onError",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR,data:t}})}confirmAck(t){let{ack:e,messageId:i}=t;e&&this.send(E.ACK,{messageId:i})}onMessage(t){let e=JSON.parse(t.data),i=e.data;try{typeof e.data=="string"&&e.data&&(i=JSON.parse(e.data))}catch{this.callKit.logger.info("socket onMessage parse error",{caller:"Socket.onMessage",type:"INCALL",content:{data:e.data}})}this.callKit.logger.info(`socket onMessage: ${e.event}`,{caller:"Socket.onMessage",type:"INCALL",content:{data:i,event:e.event}}),this.confirmAck(e);let n=i?.callUuid||"";if(e.event===p.PONG){this.lastPingTime=Date.now();return}if(e.event===p.START_CONFIRM&&(this.setConnectAuthState("startConfirm",!0),this.cleanReconnectState()),e.event===p.CUSTOMER_RINGING&&this.callKit.trigger(s.CALL_RINGING,{time:new Date,callUuid:n}),e.event===p.CUSTOMER_PICK_UP&&this.callKit.trigger(s.CALL_PICK_UP,{time:new Date,callUuid:n}),e.event===p.AGENT_PICK_UP&&this.callKit.trigger(s.AGENT_PICK_UP,{time:new Date,callUuid:n}),e.event===p.CUSTOMER_HANG_UP&&(this.callKit.trigger(s.CALL_HANG_UP,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===p.CUSTOMER_NO_ANSWER&&(this.callKit.trigger(s.CALL_NO_ANSWER,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===p.CALL_CDR&&this.callKit.trigger(s.CALL_CDR,{time:new Date,callUuid:n,...i}),e.event===p.CLOSE){let{userInfo:l}=this.callKit.config.getConfig();this.send(E.END,{agentId:l.agentId,callUuid:n})}e.event===p.ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{errCode:a.SOKET_SERVER_ERROR,data:i,callUuid:n}})),e.event===p.SESSION_ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{data:i,event:p.SESSION_ERROR,callUuid:n}})),e.event===p.AGENT_NO_ANSWER&&n&&this.callKit.connect.socketTriggerHangup(n),e.event===p.AGENT_HANG_UP&&n&&this.callKit.connect.socketTriggerHangup(n),this.callKit.trigger(s.SERVER_SOCKET_EVENT,{...e,callUuid:n})}send(t,e){if(!this.connectAuthState.isConnected){this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"}),this.callKit.reset(),this.callKit.logger.error("socket not connected",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let{userInfo:i,version:n}=this.callKit.config.getConfig(),{sessionId:l,extno:r,agentId:f}=i;if(this.callKit.logger.info("Socket send",{caller:"Socket.send",type:"INCALL",content:{agentId:f,sessionId:l,userInfo:i}}),!l){this.callKit.logger.error("sessionId is empty",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let C={event:t,sessionId:l,version:n,...e};E.CALL===t&&(C.phoneNum=r,C.agentId=f,e?.sourceType===R.phoneNum?delete C.workOrderId:e?.sourceType===R.workOrderId&&delete C.phoneNum),this.callKit.logger.info("socket send",{caller:"Socket.send",type:"INCALL",content:{...C}}),this.ws?.send(JSON.stringify({event:t,...C}))}ping(){if(!this.connectAuthState.isConnected)return;this.send(E.PING);let t=Date.now(),{pingInterval:e,pingTimeout:i}=this.reconnectConfig;t-this.lastPingTime>e+i&&(this.ws&&this.connectAuthState.isConnected?this.ws.close(4001,"ping timeout"):this.callKit.reset(),this.callKit.logger.error("socket ping timeout",{caller:"Socket.ping",type:"INCALL",content:{errCode:a.SOCKET_PING_TIMEOUT}}),this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_PING_TIMEOUT"}))}checkPing(){this.pingTimer&&clearInterval(this.pingTimer);let{pingInterval:t}=this.reconnectConfig;this.pingTimer=setInterval(()=>{this.ping()},t)}async reset(t){let{force:e=!1}=t||{};this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=void 0),e&&(this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RESET"}),this.resetConnectState()),this.lastPingTime=void 0,this.setConnectAuthState("startConfirm",!1),this.clearWebSocket()}attemptReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let{maxAttempts:t}=this.reconnectConfig;if(this.reconnectAttempts>=t){this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_ERROR"}),this.callKit.reset(),this.callKit.logger.error("Maximum reconnection attempts reached",{caller:"Socket.attemptReconnect",type:"INCALL",content:{errCode:a.SOCKET_RECONNECT_FAILED,reconnectAttempts:this.reconnectAttempts}});return}this.reconnectAttempts===0&&this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_START"}),this.setConnectAuthState("isReconnecting",!0),this.reconnectAttempts+=1;let{delay:e}=this.reconnectConfig;this.callKit.logger.info(`Preparing reconnection attempt ${this.reconnectAttempts}/${t}, delay: ${e}ms`,{caller:"Socket.attemptReconnect",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:t,delay:e}}),this.reconnectTimer=setTimeout(()=>{let{socket:i}=this.callKit.config.getConfig();this.connect(i)},e)}};var Q=class{api;config;logger;callCenter;connect;socket;listener=[];constructor(t){this.config=new G(this),this.api=new P(this),this.connect=new x(this),this.callCenter=new U(this),this.socket=new H(this),this.logger=new b(this,t.log),t.log&&this.config.setConfig("log",t.log),t.trackLogs&&this.config.setConfig("trackLogs",{...L,...t.trackLogs}),t.audioRef&&this.config.setConfig("audioRef",t.audioRef),t.host&&this.config.setConfig("host",t.host),this.config.setConfig("constrains",t.constrains||w),this.config.setConfig("socket",t.socket),this.config.setConfig("reconnect",{sip:{...O,...t.reconnect?.sip||{}},incall:{...A,...t.reconnect?.incall||{}}}),this.logger.info("callKit init",{caller:"CallKit.init",content:t})}async login(t,e,i={encryptionMethod:T.INTERNAL}){if(this.config.isLogin()){this.logger.warn("already login",{caller:"CallKit.login",content:{username:t,password:e,extra:i}});return}let n="",{encryptionMethod:l=T.INTERNAL}=i;switch(l){case T.NONE:n=e;break;case T.INTERNAL:n=W(t+W(e));break;default:n=W(t+W(e));break}if(this.logger.info("login info:",{caller:"CallKit.login",content:{username:t,password:e,encryptionMethod:l,encryptionPassword:n}}),this.socket.isError){this.logger.warn("socket is error",{caller:"CallKit.login",content:{username:t,password:e,extra:i,socketError:this.socket.isError}});return}try{let r=await this.api.login({userName:t,password:n,timestamp:Date.now()});r&&(this.config.setConfig("userInfo",{wsUrl:`wss://${r.wsUrl}`,sessionId:r.sessionId,username:t,password:n,encryptionPassword:n,agentId:r.agentId,fsUserId:r.fsUserId,userPart:r.userPart,fsPassword:r.fsPassword,fsIp:r.fsIp,fsPort:r.fsPort,iceInfo:r.iceInfo,iceGatheringTimeout:r.iceGatheringTimeout,logGather:r.logGather,...i}),this.socket.init(),this.trigger(s.KIT_LOGIN_CHANGE,!0))}catch(r){this.logger.error(r,{caller:"CallKit.login",content:{errCode:a.API_USER_LOGIN_ERROR}})}}async logout({isReset:t=!0}={isReset:!0}){if(!this.config.check())return;let{userInfo:e}=this.config.getConfig();if(this.logger.info("logout",{caller:"CallKit.logout",content:{sessionId:e.sessionId}}),this.config.isLogin()){let{sessionId:i}=e;try{await this.api.loginOut({sessionId:i,timestamp:Date.now()})}catch(n){this.logger.warn(n,{caller:"CallKit.logout",content:{errCode:a.API_USER_LOGOUT_ERROR}})}}t?await this.reset():this.config.reset()}async call(t="",e={sourceType:R.phoneNum,workOrderId:""}){if(!this.config.check())return;if(!this.connect.isRegistered){this.logger.warn("Currently not registered",{caller:"CallKit.call",content:{extno:t,options:e}});return}let{sourceType:i,workOrderId:n}=e;this.config.setUserInfo("sourceType",i),i===R.phoneNum?t&&this.config.setUserInfo("extno",t):i===R.workOrderId&&n&&this.config.setUserInfo("workOrderId",n),this.logger.info("call",{caller:"CallKit.call",content:{extno:t,options:e}}),this.callCenter.callStart(e)}async refer(t,e){this.config.check()&&(this.logger.info("refer",{caller:"CallKit.refer",content:{uri:t,options:e}}),this.callCenter.callRefer(t,e))}async register(){this.config.check()&&(this.logger.info("register",{caller:"CallKit.register",content:{}}),this.connect.register())}async unregister(){this.config.check()&&(this.logger.info("unregister",{caller:"CallKit.unregister",content:{}}),this.connect.unregister())}async hangup(){if(this.config.check()){if(this.logger.info("hangup",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}}),!this.connect.isConnecting()&&!this.connect.isRinging()&&!this.connect.isCalling()&&!this.connect.isHolding()){this.logger.warn("Currently not in a call",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}});return}await this.callCenter.callEnd(!0)}}hold(){this.config.check()&&(this.logger.info("hold",{caller:"CallKit.hold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callHold())}unhold(){this.config.check()&&(this.logger.info("unhold",{caller:"CallKit.unhold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnhold())}mute(){this.config.check()&&(this.logger.info("mute",{caller:"CallKit.mute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callMute())}unmute(){this.config.check()&&(this.logger.info("unmute",{caller:"CallKit.unmute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnmute())}async setUserStatus(t,e={}){let{agentId:i}=this.config.getConfig().userInfo;this.logger.info("setUserStatus",{caller:"CallKit.setUserStatus",content:{status:t,agentId:i}}),await this.api.updateUserStatus({agentId:i,userStatus:t,timestamp:Date.now(),...e})}async reset(t){let{force:e=!1}=t||{};this.logger.info("reset",{caller:"CallKit.reset",content:{connectStatus:this.connect.connectStatus,force:e}}),this.connect.isCalling()&&await this.hangup(),await this.connect.reset(),this.config.isLogin()?await this.logout({isReset:!1}):await this.config.reset(),await this.socket.reset({force:e})}on(t,e){this.listener.push({event:t,callback:e})}off(t,e){this.logger.info(`off ${t}`,{caller:"CallKit.off",content:{event:t}}),e?this.listener=this.listener.filter(i=>!(i.event===t&&i.callback===e)):this.listener=this.listener.filter(i=>i.event!==t)}removeAllListeners(){this.listener=this.listener.splice(0,this.listener.length),this.logger.info("removeAllListeners",{caller:"CallKit.removeAllListeners",content:{listener:this.listener}})}trigger(t,e,i=!1){i||this.logger.info(`Trigger Event: ${t}`,{caller:"CallKit.trigger",content:e}),this.listener.forEach(n=>{if(n.event===t)try{n.callback(e)}catch(l){this.logger.error(`Event callback error: ${t}`,l,!0)}})}};export{Q as CallKit};
|
|
4
|
+
`));for(let r of i)this.callKit.api.trackLogs(r);this.pendingTrackLogs=[]}catch(i){console.error(i)}}destroy(){this.trackLogsTimer&&(clearInterval(this.trackLogsTimer),this.trackLogsTimer=null),this.flushTrackLogs()}setLevel(t){this.level=t}info(t,e){let i=this.catchLog(t,e,"info");N(this.level)>=N("info")&&console.log(`%c${i}`,"color: gray;")}success(t,e){let i=this.catchLog(t,e,"success");N(this.level)>=N("success")&&console.log(`%c${i}`,"color: green;")}warn(t,e){let i=this.catchLog(t,e,"warn");N(this.level)>=N("warn")&&console.log(`%c${i}`,"color: orange;")}error(t,e,i=!1){let n=t instanceof Error?t.message:t,l=this.catchLog(n,e,"error");N(this.level)>=N("error")&&console.log(`%c${l}`,"color: red;");let{errCode:r,...f}=e?.content??{},C=r??a.UNKNOWN_ERROR;i||this.callKit.trigger(s.KIT_ERROR,{code:C,msg:n,data:f});let u=new Error(n);throw u.name="CallKitError",u.code=C,u.data=f,u}catchLog(t,e,i){let n=new Date,{enabled:l}=this.callKit.config.getTrackLogsConfig(),{userInfo:r}=this.callKit.config.getConfig(),f={agentId:r?.agentId,sessionId:r?.sessionId,...e?.content??{}},C={timestamp:n.toLocaleString().replace("T"," ").replace(".000Z",""),level:i,message:t,caller:e?.caller,type:e?.type,content:f},u=st(C);return l&&this.pendingTrackLogs.push(u),this.callKit.trigger(s.KIT_LOG,u,!0),u}};import{UserAgent as j,Web as rt,Registerer as ot,SessionState as y,RegistererState as M}from"sip.js";var Z=o=>{let t=o["x-antaios-manual-extend_info"]||o["x-antaios-manual-extend-info"],e=null;try{if(t&&typeof t=="string"){let i=t.replace(/\\/g,"");return e=JSON.parse(i),e}}catch{return{}}};var D=6;function ct(o){return o.replace(/(\w+):\s*'(.*?)'/g,'"$1": "$2"').replace(/'/g,'"')}var B=o=>{o&&o.getTracks().forEach(t=>t.stop())},at=()=>{typeof navigator.mediaDevices>"u"&&(navigator.mediaDevices={}),typeof navigator.mediaDevices.getUserMedia>"u"&&(navigator.mediaDevices.getUserMedia=o=>{let t=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.mozGetUserMedia;return t?new Promise((e,i)=>{t.call(navigator,o,e,i)}):Promise.reject(new Error("Unable to obtain device permissions. Please check your browser settings or device permissions."))})},x=class{callKit;isMute=!1;isRegister=!1;isHold=!1;connectStatus=h.init;currentSession;mediaStream;userAgent;registerer;isReConnected=!1;isOutgoing=!1;isUnprompted=!1;hasInvite=!1;constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("sip")}currentCallId=null;getCurrentCallId(){return this.currentCallId}setOutgoing(t){this.isOutgoing!==t&&(this.callKit.logger.info("setOutgoing",{caller:"Connect.setOutgoing",content:{outgoing:t}}),this.isOutgoing=t)}setCallId(t){this.callKit.logger.info("setCallId",{caller:"Connect.setCallId",content:{callId:t}}),this.currentCallId=t,this.callKit.trigger(s.KIT_CALL_ID_CHANGE,t)}async reset(){if(this.setOutgoing(!1),this.isUnprompted=!1,this.hasInvite=!1,this.isHolding()&&await this.setHold(!1),this.isMuted()&&await this.setMute(!1),this.connectStatus!==h.init&&this.setConnectStatus(h.init),this.isRegistered()&&await this.unregister(),this.currentCallId&&this.setCallId(null),this.currentSession=void 0,this.mediaStream=void 0,this.userAgent=void 0,this.registerer=void 0,this.mediaStream)try{B(this.mediaStream);let t=this.getAduioReference();t&&(t.pause(),t.srcObject=null)}catch(t){this.callKit.logger.error(t,{caller:"Connect.reset",content:{}})}this.setConnectStatus(h.init),this.clearHeartbeat()}getAduioReference(){let{audioRef:t}=this.callKit.config.getConfig();return typeof t=="function"?t():t}async permission(){this.callKit.logger.info("permission",{caller:"Connect.permission",content:{permission:!0}}),at();let t=await navigator.mediaDevices.getUserMedia({audio:!0});B(t)}isConnecting(){return this.connectStatus===h.connecting}isCalling(){return this.connectStatus===h.calling}isRinging(){return this.connectStatus===h.ringing}isHolding(){return this.isHold}isRegistered(){return this.isRegister}isMuted(){return this.isMute}isInit(){return this.connectStatus===h.init}heartbeatInterval;heartbeatFlag=D;clearHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null),this.heartbeatFlag=D}startHeartbeat(){this.heartbeatFlag=D,this.clearHeartbeat(),this.heartbeatInterval=setInterval(()=>{this.heartbeatFlag-=1,this.heartbeatFlag<=0&&(this.heartbeatFlag=D,this.callKit.trigger(s.SIP_CONNECT_EVENT,{event:"OPTIONS_HEARTBEAT_EXPIRED"}))},1e3)}socketTriggerHangup(t){!this.isCalling()||t!==this.currentCallId||(this.callKit.logger.info("socketHangup trigger hangup",{caller:"Connect.socketHangup",content:{callId:t,currentCallId:this.currentCallId}}),this.callKit.hangup())}async register(){if(this.connectStatus!==h.init){if(this.isRegistered()){this.callKit.logger.warn("connectStatus is registered",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.reset(),this.callKit.logger.error("connectStatus is not init",{caller:"Connect.register",content:{errCode:a.CONNECT_CALL_STATUS_ERROR}});return}this.callKit.logger.info("connect register",{caller:"Connect.register",content:{connectStatus:this.connectStatus}}),await this.permission().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",content:{errCode:a.WEBRTC_USER_MEDIA_ERROR}})});let{userInfo:t,constrains:e}=this.callKit.config.getConfig(),i=async()=>(this.mediaStream=await navigator.mediaDevices.getUserMedia(e),this.mediaStream),{userPart:n,fsIp:l,fsPort:r,iceInfo:f,wsUrl:C}=t,u={uri:j.makeURI(`sip:${n}@${l}:${r}`),displayName:n,transportOptions:{wsServers:[C],traceSip:!0},logLevel:"error",allowLegacyNotifications:!0,contactName:n,sessionDescriptionHandlerFactory:rt.defaultSessionDescriptionHandlerFactory(i),sessionDescriptionHandlerFactoryOptions:{constraints:e,iceGatheringTimeout:t.iceGatheringTimeout,peerConnectionConfiguration:{iceServers:JSON.parse(ct(f))}}};this.callKit.logger.info("connect connectConfig",{caller:"Connect.register",content:u}),this.userAgent=new j(u);let v=new MediaStream,F=c=>{let m=this.getAduioReference();this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.register.setupRemoteMedia",content:m}),c.sessionDescriptionHandler.peerConnection.getReceivers().forEach(S=>{S.track&&v.addTrack(S.track)}),m?(m.srcObject=v,m.play().catch(S=>{this.callKit.logger.error(S.message,{caller:"Connect.register.setupRemoteMedia",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})):this.callKit.logger.error("video is not exist",{caller:"Connect.register",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})},k=(c,m)=>{let{that:S=this}=m,I=c.userAgentCore,g=I.receiveIncomingRequestFromTransport.bind(I);I.receiveIncomingRequestFromTransport=d=>(d.method==="OPTIONS"&&S.startHeartbeat(),S.callKit.logger.info(`SIP Receive: ${d?.method}`,{caller:"Connect.register.observeSocketStatus.receiveRequest",type:"SIP",content:{request:d}}),g(d));let $=I.receiveIncomingResponseFromTransport.bind(I);I.receiveIncomingResponseFromTransport=d=>(S.callKit.logger.info(`SIP Receive Response: ${d?.statusCode} ${d?.reasonPhrase}`,{caller:"Connect.register.observeSocketStatus.receiveResponse",type:"SIP",content:{response:d}}),$(d));let{transport:_}=c;if(_){let d=_.send.bind(_);_.send=q=>(S.callKit.logger.info("SIP send message",{caller:"Connect.register.observeSocketStatus",type:"SIP",content:{message:q.toString()}}),d(q))}},K={};this.registerer=new ot(this.userAgent,K),this.registerer.stateChange.addListener(c=>{switch(c){case M.Initial:this.callKit.logger.info("registerer stateChange Initial",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(h.init),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case M.Registered:this.callKit.logger.info("registerer stateChange Registered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!0),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case M.Terminated:this.callKit.logger.info("registerer stateChange Terminated",{caller:"Connect.register.registererStateChange",type:"SIP",content:{registererState:c,isRegistered:this.isRegistered()}}),this.setRegister(!1),this.setConnectStatus(h.init),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;case M.Unregistered:this.callKit.logger.info("registerer stateChange Unregistered",{caller:"Connect.register.registererStateChange",type:"SIP",content:{isRegistered:this.isRegistered(),registererState:c}}),this.setRegister(!1),this.setConnectStatus(h.init),this.callKit.trigger(s.SIP_REGISTERER_EVENT,{registererState:c,isRegistered:this.isRegistered()});break;default:break}}),this.userAgent.delegate={onInvite:c=>{this.callKit.logger.info("connect onInvite",{type:"SIP",caller:"Connect.register.onInvite",content:{invite:c,isRegistered:this.isRegistered(),isOutgoing:this.isOutgoing}}),this.currentSession=c,this.currentSession.stateChange.addListener(g=>{switch(g){case y.Establishing:this.callKit.logger.info("connect Establishing",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:g}}),this.setConnectStatus(h.ringing),this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()});break;case y.Established:this.callKit.logger.info("connect Established",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:g}}),this.callKit.connect.setConnectStatus(h.calling),this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()}),F(this.currentSession);break;case y.Terminating:this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()});break;case y.Terminated:this.callKit.logger.info("connect Terminated",{caller:"Connect.register.onInvite",type:"SIP",content:{sessionState:g}}),this.hasInvite=!1,this.isUnprompted||this.callKit.callCenter.callEnd(),this.isUnprompted=!1,this.callKit.trigger(s.SIP_SESSION_EVENT,{sessionState:g,isRegistered:this.isRegistered()});break;default:break}});let m={sessionDescriptionHandlerOptions:{constraints:e,alwaysAcquireMediaFirst:!0}},S=()=>{let{request:g}=this.currentSession,$=Object.keys(g.headers),_={};return $.filter(d=>d.toLocaleLowerCase().startsWith("x-antaios")).forEach(d=>{_[d.toLocaleLowerCase()]=g.getHeader(d)}),this.callKit.logger.info("get invite data",{caller:"Connect.register.onInvite",content:_}),_},I=S();try{let g=Z(I);g?.callUuid?this.setCallId(g.callUuid):(this.setCallId(null),this.callKit.logger.warn("call id is not exist",{caller:"Connect.register.onInvite",content:{inviteData:g}}))}catch(g){this.callKit.logger.info(g,{caller:"Connect.register.onInvite",content:I})}if(this.isOutgoing)this.currentSession.accept(m),this.callKit.trigger(s.KIT_OUTGOING_INVITE,{getInviteData:S});else{this.hasInvite=!0;let g=()=>{this.currentSession?.state!==y.Terminated&&this.currentSession?.state!==y.Terminating&&this.currentSession.reject(),this.hasInvite=!1,this.callKit.callCenter.callEnd(!0,!1)};this.callKit.trigger(s.KIT_INVITE,{accept:()=>{this.callKit.trigger(s.CALL_CONNECTING,new Date),this.hasInvite=!1,this.currentSession.accept(m)},reject:g,getInviteData:S})}},onConnect:async()=>{this.reconnectAttempts=0,this.reconnectTimer=null,this.callKit.logger.info("connect onConnect",{caller:"Connect.register",type:"SIP",content:{version:`${this.callKit.config.getConfig().version}`}}),await this.registerer.register().catch(async c=>{this.callKit.reset(),this.callKit.logger.error(c?.message,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_REGISTER_ERROR}})})},onDisconnect:c=>{c?(this.callKit.logger.warn("SIP User Agent Disconnected with error",{caller:"Connect.register",type:"SIP",content:{err:c.message,errCode:a.WEBRTC_USER_AGENT_ERROR}}),this.startReconnectTimer()):this.callKit.logger.warn("SIP User Agent Disconnected",{caller:"Connect.register",type:"SIP",content:{}})},onRegister:()=>{this.callKit.logger.info("connect onRegister",{caller:"Connect.register",type:"SIP",content:{version:`V${this.callKit.config.getConfig().version}`}})}},k(this.userAgent,{that:this}),await this.userAgent.start().catch(c=>{this.callKit.reset(),this.callKit.logger.error(c,{caller:"Connect.register",type:"SIP",content:{errCode:a.WEBRTC_USER_AGENT_ERROR}})})}reconnectTimer;reconnectAttempts=0;startReconnectTimer(){if(this.reconnectAttempts>=this.reconnectConfig.maxAttempts&&this.callKit.config.isLogin()){this.callKit.reset(),this.callKit.logger.error("Reconnect failed max attempts",{caller:"Connect.startReconnectTimer",type:"SIP",content:{errCode:a.SOCKET_RECONNECT_FAILED,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}});return}this.callKit.logger.info("Reconnect timer started",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}}),this.reconnectAttempts+=1,this.reconnectTimer=setTimeout(()=>{this.reconnectTimer&&this.callKit.config.isLogin()?(this.userAgent?.reconnect(),this.callKit.logger.info("Reconnect attempt",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})):this.callKit.logger.info("Reconnect timer already expired",{caller:"Connect.startReconnectTimer",type:"SIP",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:this.reconnectConfig.maxAttempts,delay:this.reconnectConfig.delay}})},this.reconnectConfig.delay)}async stop(){await this.userAgent.stop()}async unregister(){if(this.callKit.logger.info("connect unregister",{caller:"Connect.unregister",type:"SIP",content:{isRegistered:this.isRegistered()}}),!this.isRegistered()||!this.registerer){this.callKit.logger.warn("No registerer to unregister.",{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}});return}await this.registerer.unregister({all:!0}).catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})}).finally(()=>{this.setRegister(!1)}),await this.userAgent?.stop().catch(t=>{this.callKit.logger.warn(t,{caller:"Connect.unregister",type:"SIP",content:{errCode:a.WEBRTC_CANCEL_REGISTER_ERROR}})})}async call(t){this.callKit.logger.info("connect call",{caller:"Connect.call",type:"SIP",content:{callback:t}}),this.setOutgoing(!0),this.isRegistered()||await this.register(),this.setConnectStatus(h.connecting),this.callKit.trigger(s.CALL_CONNECTING,new Date);let{userInfo:e}=this.callKit.config.getConfig();t(e)}setRegister(t){this.isRegister!==t&&(this.callKit.logger.info("connect setRegister",{caller:"Connect.setRegister",type:"SIP",content:{register:t}}),this.isRegister=t,this.callKit.trigger(s.KIT_REGISTER_CHANGE,t))}setConnectStatus(t){this.callKit.logger.info("connect setConnectStatus",{caller:"Connect.setConnectStatus",type:"SIP",content:{status:t}}),this.connectStatus=t,this.callKit.trigger(s.KIT_CALL_STATUS_CHANGE,t)}async hangup(t=!1,e=!1){if(this.callKit.logger.info("connect hangup",{caller:"Connect.hangup",type:"SIP",content:{isUnprompted:t,isError:e,connectStatus:this.connectStatus}}),this.setOutgoing(!1),this.isUnprompted=t,this.setHold(!1),this.setMute(!1),this.connectStatus!==h.init)try{t&&(this.isRinging()||this.isCalling())&&(this.hasInvite?(this.currentSession?.state!==y.Terminated&&this.currentSession?.state!==y.Terminating&&this.currentSession.reject(),this.hasInvite=!1):await this.currentSession?.bye()),B(this.mediaStream);let i=this.getAduioReference();i&&(i.pause(),i.srcObject=null),this.setConnectStatus(h.init),this.callKit.trigger(s.CALL_END,new Date),this.setCallId(null)}catch(i){this.callKit.trigger(s.CALL_END,new Date),this.callKit.reset(),this.callKit.logger.error(i,{caller:"Connect.hangup",type:"SIP",content:{connectStatus:this.connectStatus,isError:e,isUnprompted:t}})}}getRemoteMediaStream(t){this.callKit.logger.info("connect getRemoteMediaStream",{caller:"Connect.getRemoteMediaStream",type:"SIP",content:{session:t}});let e=t.sessionDescriptionHandler;if(e)return e.remoteMediaStream}setupRemoteMedia(t){this.callKit.logger.info("connect setupRemoteMedia",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}});let e=this.getRemoteMediaStream(t),i=this.getAduioReference();i?(i.autoplay=!0,i.srcObject=e,i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})}),e.onaddtrack=()=>{this.callKit.logger.info("Remote media onaddtrack",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{session:t}}),i.load(),i.play().catch(n=>{this.callKit.logger.error(n.message,{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAY_ERROR}})})}):this.callKit.logger.error("video is not exist",{caller:"Connect.setupRemoteMedia",type:"SIP",content:{errCode:a.WEBRTC_AUDIO_PLAYER_ERROR}})}async setHold(t){if(this.isHold===t){this.callKit.logger.warn("Already holding",{caller:"Connect.setHold",type:"SIP",content:{isHold:this.isHold}});return}this.callKit.socket.send(t?E.HOLD:E.UNHOLD),this.isHold=t,this.callKit.logger.info("connect setHold",{caller:"Connect.setHold",type:"SIP",content:{hold:t}}),this.callKit.trigger(s.KIT_SET_HOLD,t)}async setMute(t){if(this.isMute===t){this.callKit.logger.warn("Already muted",{caller:"Connect.setMute",type:"SIP",content:{isCalling:this.isCalling(),isMuted:this.isMuted()}});return}this.callKit.socket.send(t?E.MUTE:E.UNMUTE),this.isMute=t,this.callKit.trigger(s.KIT_SET_MUTE,t)}async refer(t,e){this.callKit.logger.info("connect refer",{caller:"Connect.refer",type:"SIP",content:{referTo:t,extra:e}});let i;t&&(i=j.makeURI(t)),this.currentSession.refer(i,e?.sessionReferOptions)}};var H=class{callKit;ws;lastPingTime=void 0;pingTimer;reconnectTimer;reconnectAttempts=0;connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1};get startConfirm(){return this.connectAuthState.startConfirm}get isError(){return this.connectAuthState.isError}constructor(t){this.callKit=t}get reconnectConfig(){return this.callKit.config.getReconnectConfig("incall")}init(){let{socket:t}=this.callKit.config.getConfig();this.callKit.logger.info(`socket init: ${t}`,{caller:"Socket.init",type:"INCALL",content:{socket:t}}),this.connect(t)}setConnectAuthState(t,e){this.connectAuthState[t]!==e&&(this.connectAuthState[t]=e)}handleDisconnect(){this.setConnectAuthState("isConnected",!1);let{enabled:t}=this.reconnectConfig;if(!this.callKit.config.isLogin()||!t){this.callKit.reset(),this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"});return}this.connectAuthState.isReconnecting||this.connectAuthState.isError||this.attemptReconnect()}clearWebSocket(){this.ws&&(this.ws.onopen=null,this.ws.onclose=null,this.ws.onerror=null,this.ws.onmessage=null),(this.ws?.readyState===WebSocket.CONNECTING||this.ws?.readyState===WebSocket.OPEN)&&(this.ws?.close(1e3,"socket close"),this.callKit.logger.info("socket clear",{caller:"Socket.clearWebSocket",type:"INCALL",content:{}})),this.ws=void 0,this.setConnectAuthState("isConnected",!1)}connect(t){this.ws&&this.clearWebSocket(),this.ws=new WebSocket(t),this.ws.onopen=e=>this.onOpen(e),this.ws.onclose=e=>this.onClose(e),this.ws.onerror=e=>this.onError(e),this.ws.onmessage=e=>this.onMessage(e)}onOpen(t){this.callKit.logger.info("socket onOpen",{caller:"Socket.onOpen",type:"INCALL",content:{ev:t}}),this.setConnectAuthState("isConnected",!0),this.lastPingTime=Date.now(),this.checkPing(),this.send(E.START),this.connectAuthState.isReconnecting&&(this.setConnectAuthState("isReconnecting",!1),this.callKit.logger.info("reconnect success",{caller:"Socket.onOpen",type:"INCALL",content:{event:"INCALL_RECONNECT_SUCCESS",reconnectAttempts:this.reconnectAttempts}}),this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_SUCCESS"}))}cleanReconnectState(){this.reconnectAttempts=0,this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0),this.setConnectAuthState("isReconnecting",!1),this.setConnectAuthState("isError",!1)}resetConnectState(){this.connectAuthState={startConfirm:!1,isConnected:!1,isReconnecting:!1,isError:!1},this.cleanReconnectState(),this.callKit.logger.info("reset connect state",{caller:"Socket.resetConnectState",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,connectAuthState:this.connectAuthState}})}onClose(t){this.callKit.logger.info("socket onClose",{caller:"Socket.onClose",type:"INCALL",content:{ev:t}}),this.handleDisconnect()}onError(t){this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_CONNECT_ERROR",err:t}),this.callKit.logger.error("socket onError",{caller:"Socket.onError",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR,data:t}})}confirmAck(t){let{ack:e,messageId:i}=t;e&&this.send(E.ACK,{messageId:i})}onMessage(t){let e=JSON.parse(t.data),i=e.data;try{typeof e.data=="string"&&e.data&&(i=JSON.parse(e.data))}catch{this.callKit.logger.info("socket onMessage parse error",{caller:"Socket.onMessage",type:"INCALL",content:{data:e.data}})}this.callKit.logger.info(`socket onMessage: ${e.event}`,{caller:"Socket.onMessage",type:"INCALL",content:{data:i,event:e.event}}),this.confirmAck(e);let n=i?.callUuid||"";if(e.event===p.PONG){this.lastPingTime=Date.now();return}if(e.event===p.START_CONFIRM&&(this.setConnectAuthState("startConfirm",!0),this.cleanReconnectState()),e.event===p.CUSTOMER_RINGING&&this.callKit.trigger(s.CALL_RINGING,{time:new Date,callUuid:n}),e.event===p.CUSTOMER_PICK_UP&&this.callKit.trigger(s.CALL_PICK_UP,{time:new Date,callUuid:n}),e.event===p.AGENT_PICK_UP&&this.callKit.trigger(s.AGENT_PICK_UP,{time:new Date,callUuid:n}),e.event===p.CUSTOMER_HANG_UP&&(this.callKit.trigger(s.CALL_HANG_UP,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===p.CUSTOMER_NO_ANSWER&&(this.callKit.trigger(s.CALL_NO_ANSWER,{time:new Date,callUuid:n}),n&&this.callKit.connect.socketTriggerHangup(n)),e.event===p.CALL_CDR&&this.callKit.trigger(s.CALL_CDR,{time:new Date,callUuid:n,...i}),e.event===p.CLOSE){let{userInfo:l}=this.callKit.config.getConfig();this.send(E.END,{agentId:l.agentId,callUuid:n})}e.event===p.ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{errCode:a.SOKET_SERVER_ERROR,data:i,callUuid:n}})),e.event===p.SESSION_ERROR&&(this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error(e.msg,{caller:`Socket.onMessage:${e.event}`,type:"INCALL",content:{data:i,event:p.SESSION_ERROR,callUuid:n}})),e.event===p.AGENT_NO_ANSWER&&n&&this.callKit.connect.socketTriggerHangup(n),e.event===p.AGENT_HANG_UP&&n&&this.callKit.connect.socketTriggerHangup(n),this.callKit.trigger(s.SERVER_SOCKET_EVENT,{...e,callUuid:n})}send(t,e){if(!this.connectAuthState.isConnected){this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_NOT_CONNECTED"}),this.callKit.reset(),this.callKit.logger.error("socket not connected",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let{userInfo:i,version:n}=this.callKit.config.getConfig(),{sessionId:l,extno:r,agentId:f}=i;if(this.callKit.logger.info("Socket send",{caller:"Socket.send",type:"INCALL",content:{agentId:f,sessionId:l,userInfo:i}}),!l){this.callKit.logger.error("sessionId is empty",{caller:"Socket.send",type:"INCALL",content:{errCode:a.SOCKET_CONNECT_ERROR}});return}let C={event:t,sessionId:l,version:n,...e};E.CALL===t&&(C.phoneNum=r,C.agentId=f,e?.sourceType===R.phoneNum?delete C.workOrderId:e?.sourceType===R.workOrderId&&delete C.phoneNum),this.callKit.logger.info("socket send",{caller:"Socket.send",type:"INCALL",content:{...C}}),this.ws?.send(JSON.stringify({event:t,...C}))}ping(){if(!this.connectAuthState.isConnected)return;this.send(E.PING);let t=Date.now(),{pingInterval:e,pingTimeout:i}=this.reconnectConfig;t-this.lastPingTime>e+i&&(this.ws&&this.connectAuthState.isConnected?this.ws.close(4001,"ping timeout"):this.callKit.reset(),this.callKit.logger.error("socket ping timeout",{caller:"Socket.ping",type:"INCALL",content:{errCode:a.SOCKET_PING_TIMEOUT}}),this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_PING_TIMEOUT"}))}checkPing(){this.pingTimer&&clearInterval(this.pingTimer);let{pingInterval:t}=this.reconnectConfig;this.pingTimer=setInterval(()=>{this.ping()},t)}async reset(t){let{force:e=!1}=t||{};this.pingTimer&&(clearInterval(this.pingTimer),this.pingTimer=void 0),e&&(this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RESET"}),this.resetConnectState()),this.lastPingTime=void 0,this.setConnectAuthState("startConfirm",!1),this.clearWebSocket()}attemptReconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=void 0);let{maxAttempts:t}=this.reconnectConfig;if(this.reconnectAttempts>=t){this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_ERROR"}),this.setConnectAuthState("isError",!0),this.callKit.reset(),this.callKit.logger.error("Maximum reconnection attempts reached",{caller:"Socket.attemptReconnect",type:"INCALL",content:{errCode:a.SOCKET_RECONNECT_FAILED,reconnectAttempts:this.reconnectAttempts}});return}this.reconnectAttempts===0&&this.callKit.trigger(s.INCALL_CONNECT_EVENT,{event:"INCALL_RECONNECT_START"}),this.setConnectAuthState("isReconnecting",!0),this.reconnectAttempts+=1;let{delay:e}=this.reconnectConfig;this.callKit.logger.info(`Preparing reconnection attempt ${this.reconnectAttempts}/${t}, delay: ${e}ms`,{caller:"Socket.attemptReconnect",type:"INCALL",content:{reconnectAttempts:this.reconnectAttempts,maxAttempts:t,delay:e}}),this.reconnectTimer=setTimeout(()=>{let{socket:i}=this.callKit.config.getConfig();this.connect(i)},e)}};var Q=class{api;config;logger;callCenter;connect;socket;listener=[];constructor(t){this.config=new G(this),this.api=new P(this),this.connect=new x(this),this.callCenter=new U(this),this.socket=new H(this),this.logger=new b(this,t.log),t.log&&this.config.setConfig("log",t.log),t.trackLogs&&this.config.setConfig("trackLogs",{...L,...t.trackLogs}),t.audioRef&&this.config.setConfig("audioRef",t.audioRef),t.host&&this.config.setConfig("host",t.host),this.config.setConfig("constrains",t.constrains||w),this.config.setConfig("socket",t.socket),this.config.setConfig("reconnect",{sip:{...O,...t.reconnect?.sip||{}},incall:{...A,...t.reconnect?.incall||{}}}),this.logger.info("callKit init",{caller:"CallKit.init",content:t})}async login(t,e,i={encryptionMethod:T.INTERNAL}){if(this.config.isLogin()){this.logger.warn("already login",{caller:"CallKit.login",content:{username:t,password:e,extra:i}});return}let n="",{encryptionMethod:l=T.INTERNAL}=i;switch(l){case T.NONE:n=e;break;case T.INTERNAL:n=W(t+W(e));break;default:n=W(t+W(e));break}if(this.logger.info("login info:",{caller:"CallKit.login",content:{username:t,password:e,encryptionMethod:l,encryptionPassword:n}}),this.socket.isError){this.logger.warn("socket is error",{caller:"CallKit.login",content:{username:t,password:e,extra:i,socketError:this.socket.isError}});return}try{let r=await this.api.login({userName:t,password:n,timestamp:Date.now()});r&&(this.config.setConfig("userInfo",{wsUrl:`wss://${r.wsUrl}`,sessionId:r.sessionId,username:t,password:n,encryptionPassword:n,agentId:r.agentId,fsUserId:r.fsUserId,userPart:r.userPart,fsPassword:r.fsPassword,fsIp:r.fsIp,fsPort:r.fsPort,iceInfo:r.iceInfo,iceGatheringTimeout:r.iceGatheringTimeout,logGather:r.logGather,...i}),this.socket.init(),this.trigger(s.KIT_LOGIN_CHANGE,!0))}catch(r){this.logger.error(r,{caller:"CallKit.login",content:{errCode:a.API_USER_LOGIN_ERROR}})}}async logout({isReset:t=!0}={isReset:!0}){if(!this.config.check())return;let{userInfo:e}=this.config.getConfig();if(this.logger.info("logout",{caller:"CallKit.logout",content:{sessionId:e.sessionId}}),this.config.isLogin()){let{sessionId:i}=e;try{await this.api.loginOut({sessionId:i,timestamp:Date.now()})}catch(n){this.logger.warn(n,{caller:"CallKit.logout",content:{errCode:a.API_USER_LOGOUT_ERROR}})}}t?await this.reset():this.config.reset()}async call(t="",e={sourceType:R.phoneNum,workOrderId:""}){if(!this.config.check())return;if(!this.connect.isRegistered){this.logger.warn("Currently not registered",{caller:"CallKit.call",content:{extno:t,options:e}});return}let{sourceType:i,workOrderId:n}=e;this.config.setUserInfo("sourceType",i),i===R.phoneNum?t&&this.config.setUserInfo("extno",t):i===R.workOrderId&&n&&this.config.setUserInfo("workOrderId",n),this.logger.info("call",{caller:"CallKit.call",content:{extno:t,options:e}}),this.callCenter.callStart(e)}async refer(t,e){this.config.check()&&(this.logger.info("refer",{caller:"CallKit.refer",content:{uri:t,options:e}}),this.callCenter.callRefer(t,e))}async register(){this.config.check()&&(this.logger.info("register",{caller:"CallKit.register",content:{}}),this.connect.register())}async unregister(){this.config.check()&&(this.logger.info("unregister",{caller:"CallKit.unregister",content:{}}),this.connect.unregister())}async hangup(){if(this.config.check()){if(this.logger.info("hangup",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}}),!this.connect.isConnecting()&&!this.connect.isRinging()&&!this.connect.isCalling()&&!this.connect.isHolding()){this.logger.warn("Currently not in a call",{caller:"CallKit.hangup",content:{connectStatus:this.connect.connectStatus}});return}await this.callCenter.callEnd(!0)}}hold(){this.config.check()&&(this.logger.info("hold",{caller:"CallKit.hold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callHold())}unhold(){this.config.check()&&(this.logger.info("unhold",{caller:"CallKit.unhold",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnhold())}mute(){this.config.check()&&(this.logger.info("mute",{caller:"CallKit.mute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callMute())}unmute(){this.config.check()&&(this.logger.info("unmute",{caller:"CallKit.unmute",content:{connectStatus:this.connect.connectStatus}}),this.callCenter.callUnmute())}async setUserStatus(t,e={}){let{agentId:i}=this.config.getConfig().userInfo;this.logger.info("setUserStatus",{caller:"CallKit.setUserStatus",content:{status:t,agentId:i}}),await this.api.updateUserStatus({agentId:i,userStatus:t,timestamp:Date.now(),...e})}async reset(t){let{force:e=!1}=t||{};this.logger.info("reset",{caller:"CallKit.reset",content:{connectStatus:this.connect.connectStatus,force:e}}),this.connect.isCalling()&&await this.hangup(),await this.connect.reset(),this.config.isLogin()?await this.logout({isReset:!1}):await this.config.reset(),await this.socket.reset({force:e})}on(t,e){this.listener.push({event:t,callback:e})}off(t,e){this.logger.info(`off ${t}`,{caller:"CallKit.off",content:{event:t}}),e?this.listener=this.listener.filter(i=>!(i.event===t&&i.callback===e)):this.listener=this.listener.filter(i=>i.event!==t)}removeAllListeners(){this.listener=this.listener.splice(0,this.listener.length),this.logger.info("removeAllListeners",{caller:"CallKit.removeAllListeners",content:{listener:this.listener}})}trigger(t,e,i=!1){i||this.logger.info(`Trigger Event: ${t}`,{caller:"CallKit.trigger",content:e}),this.listener.forEach(n=>{if(n.event===t)try{n.callback(e)}catch(l){this.logger.error(`Event callback error: ${t}`,l,!0)}})}};export{Q as CallKit};
|