lavva.exalushome.webcams
Version:
Library implementing webcams and abstraction layers for webcams configuration API in ExalusHome system
1 lines • 462 kB
JavaScript
(()=>{"use strict";var e,t,n,r={};r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}();class s{constructor(){this.Guid="",this.RtspUrl="",this.UserName=null,this.Password=null}}class o{static GenerateUUID(){var e=(new Date).getTime(),t="undefined"!=typeof performance&&performance.now&&1e3*performance.now()||0;return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(n){var r=16*Math.random();return e>0?(r=(e+r)%16|0,e=Math.floor(e/16)):(r=(t+r)%16|0,t=Math.floor(t/16)),("x"===n?r:3&r|8).toString(16)}))}static GenerateMd5(e){let t="0123456789abcdef";function n(e){let n,r="";for(n=0;n<=3;n++)r+=t.charAt(e>>8*n+4&15)+t.charAt(e>>8*n&15);return r}function r(e,t){let n=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(n>>16)<<16|65535&n}function s(e,t,n,s,o,i){return r(function(e,t){return e<<t|e>>>32-t}(r(r(t,e),r(s,i)),o),n)}function o(e,t,n,r,o,i,a){return s(t&n|~t&r,e,t,o,i,a)}function i(e,t,n,r,o,i,a){return s(t&r|n&~r,e,t,o,i,a)}function a(e,t,n,r,o,i,a){return s(t^n^r,e,t,o,i,a)}function c(e,t,n,r,o,i,a){return s(n^(t|~r),e,t,o,i,a)}let u,l,d,h,p,g=function(e){let t,n=1+(e.length+8>>6),r=new Array(16*n);for(t=0;t<16*n;t++)r[t]=0;for(t=0;t<e.length;t++)r[t>>2]|=e.charCodeAt(t)<<t%4*8;return r[t>>2]|=128<<t%4*8,r[16*n-2]=8*e.length,r}(""+e),f=1732584193,v=-271733879,m=-1732584194,y=271733878;for(u=0;u<g.length;u+=16)l=f,d=v,h=m,p=y,f=o(f,v,m,y,g[u+0],7,-680876936),y=o(y,f,v,m,g[u+1],12,-389564586),m=o(m,y,f,v,g[u+2],17,606105819),v=o(v,m,y,f,g[u+3],22,-1044525330),f=o(f,v,m,y,g[u+4],7,-176418897),y=o(y,f,v,m,g[u+5],12,1200080426),m=o(m,y,f,v,g[u+6],17,-1473231341),v=o(v,m,y,f,g[u+7],22,-45705983),f=o(f,v,m,y,g[u+8],7,1770035416),y=o(y,f,v,m,g[u+9],12,-1958414417),m=o(m,y,f,v,g[u+10],17,-42063),v=o(v,m,y,f,g[u+11],22,-1990404162),f=o(f,v,m,y,g[u+12],7,1804603682),y=o(y,f,v,m,g[u+13],12,-40341101),m=o(m,y,f,v,g[u+14],17,-1502002290),v=o(v,m,y,f,g[u+15],22,1236535329),f=i(f,v,m,y,g[u+1],5,-165796510),y=i(y,f,v,m,g[u+6],9,-1069501632),m=i(m,y,f,v,g[u+11],14,643717713),v=i(v,m,y,f,g[u+0],20,-373897302),f=i(f,v,m,y,g[u+5],5,-701558691),y=i(y,f,v,m,g[u+10],9,38016083),m=i(m,y,f,v,g[u+15],14,-660478335),v=i(v,m,y,f,g[u+4],20,-405537848),f=i(f,v,m,y,g[u+9],5,568446438),y=i(y,f,v,m,g[u+14],9,-1019803690),m=i(m,y,f,v,g[u+3],14,-187363961),v=i(v,m,y,f,g[u+8],20,1163531501),f=i(f,v,m,y,g[u+13],5,-1444681467),y=i(y,f,v,m,g[u+2],9,-51403784),m=i(m,y,f,v,g[u+7],14,1735328473),v=i(v,m,y,f,g[u+12],20,-1926607734),f=a(f,v,m,y,g[u+5],4,-378558),y=a(y,f,v,m,g[u+8],11,-2022574463),m=a(m,y,f,v,g[u+11],16,1839030562),v=a(v,m,y,f,g[u+14],23,-35309556),f=a(f,v,m,y,g[u+1],4,-1530992060),y=a(y,f,v,m,g[u+4],11,1272893353),m=a(m,y,f,v,g[u+7],16,-155497632),v=a(v,m,y,f,g[u+10],23,-1094730640),f=a(f,v,m,y,g[u+13],4,681279174),y=a(y,f,v,m,g[u+0],11,-358537222),m=a(m,y,f,v,g[u+3],16,-722521979),v=a(v,m,y,f,g[u+6],23,76029189),f=a(f,v,m,y,g[u+9],4,-640364487),y=a(y,f,v,m,g[u+12],11,-421815835),m=a(m,y,f,v,g[u+15],16,530742520),v=a(v,m,y,f,g[u+2],23,-995338651),f=c(f,v,m,y,g[u+0],6,-198630844),y=c(y,f,v,m,g[u+7],10,1126891415),m=c(m,y,f,v,g[u+14],15,-1416354905),v=c(v,m,y,f,g[u+5],21,-57434055),f=c(f,v,m,y,g[u+12],6,1700485571),y=c(y,f,v,m,g[u+3],10,-1894986606),m=c(m,y,f,v,g[u+10],15,-1051523),v=c(v,m,y,f,g[u+1],21,-2054922799),f=c(f,v,m,y,g[u+8],6,1873313359),y=c(y,f,v,m,g[u+15],10,-30611744),m=c(m,y,f,v,g[u+6],15,-1560198380),v=c(v,m,y,f,g[u+13],21,1309151649),f=c(f,v,m,y,g[u+4],6,-145523070),y=c(y,f,v,m,g[u+11],10,-1120210379),m=c(m,y,f,v,g[u+2],15,718787259),v=c(v,m,y,f,g[u+9],21,-343485551),f=r(f,l),v=r(v,d),m=r(m,h),y=r(y,p);return n(f)+n(v)+n(m)+n(y)}}class i{static Delay(e){return new Promise((t=>setTimeout(t,e)))}}function a(e){return new Map(Object.entries(e))}class c{constructor(){this.TransactionId=o.GenerateUUID()}}(n=e||(e={}))[n.OK=0]="OK",n[n.UnknownError=1]="UnknownError",n[n.FatalError=2]="FatalError",n[n.WrongData=3]="WrongData",n[n.ResourceDoesNotExists=4]="ResourceDoesNotExists",n[n.NoPermissionToPerformThisOperation=5]="NoPermissionToPerformThisOperation",n[n.SessionHasAlreadyLoggedOnUser=6]="SessionHasAlreadyLoggedOnUser",n[n.OperationNotPermitted=7]="OperationNotPermitted",n[n.NoPermissionsToCallGivenResource=8]="NoPermissionsToCallGivenResource",n[n.ResourceIsNotAvailable=9]="ResourceIsNotAvailable",n[n.Error=10]="Error",n[n.NoData=11]="NoData",n[n.NotSupportedMethod=12]="NotSupportedMethod",n[n.UserIsNotLoggedIn=13]="UserIsNotLoggedIn",n[n.MultiDataResponseStart=14]="MultiDataResponseStart",n[n.MultiDataResponse=15]="MultiDataResponse",n[n.MultiDataResponseStop=16]="MultiDataResponseStop",function(e){e[e.Get=0]="Get",e[e.Post=1]="Post",e[e.Delete=2]="Delete",e[e.Put=3]="Put",e[e.Options=4]="Options",e[e.Head=5]="Head"}(t||(t={}));const u=[0,2e3,1e4,3e4,null];class l{constructor(e){this._retryDelays=void 0!==e?[...e,null]:u}nextRetryDelayInMilliseconds(e){return this._retryDelays[e.previousRetryCount]}}class d{}d.Authorization="Authorization",d.Cookie="Cookie";class h{constructor(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}}class p{get(e,t){return this.send({...t,method:"GET",url:e})}post(e,t){return this.send({...t,method:"POST",url:e})}delete(e,t){return this.send({...t,method:"DELETE",url:e})}getCookieString(e){return""}}class g extends p{constructor(e,t){super(),this._innerClient=e,this._accessTokenFactory=t}async send(e){let t=!0;this._accessTokenFactory&&(!this._accessToken||e.url&&e.url.indexOf("/negotiate?")>0)&&(t=!1,this._accessToken=await this._accessTokenFactory()),this._setAuthorizationHeader(e);const n=await this._innerClient.send(e);return t&&401===n.statusCode&&this._accessTokenFactory?(this._accessToken=await this._accessTokenFactory(),this._setAuthorizationHeader(e),await this._innerClient.send(e)):n}_setAuthorizationHeader(e){e.headers||(e.headers={}),this._accessToken?e.headers[d.Authorization]=`Bearer ${this._accessToken}`:this._accessTokenFactory&&e.headers[d.Authorization]&&delete e.headers[d.Authorization]}getCookieString(e){return this._innerClient.getCookieString(e)}}class f extends Error{constructor(e,t){const n=new.target.prototype;super(`${e}: Status code '${t}'`),this.statusCode=t,this.__proto__=n}}class v extends Error{constructor(e="A timeout occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class m extends Error{constructor(e="An abort occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class y extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="UnsupportedTransportError",this.__proto__=n}}class w extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="DisabledTransportError",this.__proto__=n}}class S extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="FailedToStartTransportError",this.__proto__=n}}class A extends Error{constructor(e){const t=new.target.prototype;super(e),this.errorType="FailedToNegotiateWithServerError",this.__proto__=t}}class _ extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.innerErrors=t,this.__proto__=n}}var C,T,D,k,E;!function(e){e[e.Trace=0]="Trace",e[e.Debug=1]="Debug",e[e.Information=2]="Information",e[e.Warning=3]="Warning",e[e.Error=4]="Error",e[e.Critical=5]="Critical",e[e.None=6]="None"}(C||(C={}));class G{constructor(){}log(e,t){}}G.instance=new G;class N{static isRequired(e,t){if(null==e)throw new Error(`The '${t}' argument is required.`)}static isNotEmpty(e,t){if(!e||e.match(/^\s*$/))throw new Error(`The '${t}' argument should not be empty.`)}static isIn(e,t,n){if(!(e in t))throw new Error(`Unknown ${n} value: ${e}.`)}}class b{static get isBrowser(){return!b.isNode&&"object"==typeof window&&"object"==typeof window.document}static get isWebWorker(){return!b.isNode&&"object"==typeof self&&"importScripts"in self}static get isReactNative(){return!b.isNode&&"object"==typeof window&&void 0===window.document}static get isNode(){return"undefined"!=typeof process&&process.release&&"node"===process.release.name}}function I(e,t){let n="";return R(e)?(n=`Binary data of length ${e.byteLength}`,t&&(n+=`. Content: '${function(e){const t=new Uint8Array(e);let n="";return t.forEach((e=>{n+=`0x${e<16?"0":""}${e.toString(16)} `})),n.substr(0,n.length-1)}(e)}'`)):"string"==typeof e&&(n=`String data of length ${e.length}`,t&&(n+=`. Content: '${e}'`)),n}function R(e){return e&&"undefined"!=typeof ArrayBuffer&&(e instanceof ArrayBuffer||e.constructor&&"ArrayBuffer"===e.constructor.name)}async function P(e,t,n,r,s,o){const i={},[a,c]=M();i[a]=c,e.log(C.Trace,`(${t} transport) sending data. ${I(s,o.logMessageContent)}.`);const u=R(s)?"arraybuffer":"text",l=await n.post(r,{content:s,headers:{...i,...o.headers},responseType:u,timeout:o.timeout,withCredentials:o.withCredentials});e.log(C.Trace,`(${t} transport) request complete. Response status: ${l.statusCode}.`)}class O{constructor(e,t){this._subject=e,this._observer=t}dispose(){const e=this._subject.observers.indexOf(this._observer);e>-1&&this._subject.observers.splice(e,1),0===this._subject.observers.length&&this._subject.cancelCallback&&this._subject.cancelCallback().catch((e=>{}))}}class U{constructor(e){this._minLevel=e,this.out=console}log(e,t){if(e>=this._minLevel){const n=`[${(new Date).toISOString()}] ${C[e]}: ${t}`;switch(e){case C.Critical:case C.Error:this.out.error(n);break;case C.Warning:this.out.warn(n);break;case C.Information:this.out.info(n);break;default:this.out.log(n)}}}}function M(){let e="X-SignalR-User-Agent";return b.isNode&&(e="User-Agent"),[e,x("8.0.7",F(),b.isNode?"NodeJS":"Browser",L())]}function x(e,t,n,r){let s="Microsoft SignalR/";const o=e.split(".");return s+=`${o[0]}.${o[1]}`,s+=` (${e}; `,s+=t&&""!==t?`${t}; `:"Unknown OS; ",s+=`${n}`,s+=r?`; ${r}`:"; Unknown Runtime Version",s+=")",s}function F(){if(!b.isNode)return"";switch(process.platform){case"win32":return"Windows NT";case"darwin":return"macOS";case"linux":return"Linux";default:return process.platform}}function L(){if(b.isNode)return process.versions.node}function B(e){return e.stack?e.stack:e.message?e.message:`${e}`}class W extends p{constructor(e){if(super(),this._logger=e,"undefined"==typeof fetch||b.isNode){const e=require;this._jar=new(e("tough-cookie").CookieJar),"undefined"==typeof fetch?this._fetchType=e("node-fetch"):this._fetchType=fetch,this._fetchType=e("fetch-cookie")(this._fetchType,this._jar)}else this._fetchType=fetch.bind(function(){if("undefined"!=typeof globalThis)return globalThis;if("undefined"!=typeof self)return self;if("undefined"!=typeof window)return window;if(void 0!==r.g)return r.g;throw new Error("could not find global")}());if("undefined"==typeof AbortController){const e=require;this._abortControllerType=e("abort-controller")}else this._abortControllerType=AbortController}async send(e){if(e.abortSignal&&e.abortSignal.aborted)throw new m;if(!e.method)throw new Error("No method defined.");if(!e.url)throw new Error("No url defined.");const t=new this._abortControllerType;let n;e.abortSignal&&(e.abortSignal.onabort=()=>{t.abort(),n=new m});let r,s=null;if(e.timeout){const r=e.timeout;s=setTimeout((()=>{t.abort(),this._logger.log(C.Warning,"Timeout from HTTP request."),n=new v}),r)}""===e.content&&(e.content=void 0),e.content&&(e.headers=e.headers||{},R(e.content)?e.headers["Content-Type"]="application/octet-stream":e.headers["Content-Type"]="text/plain;charset=UTF-8");try{r=await this._fetchType(e.url,{body:e.content,cache:"no-cache",credentials:!0===e.withCredentials?"include":"same-origin",headers:{"X-Requested-With":"XMLHttpRequest",...e.headers},method:e.method,mode:"cors",redirect:"follow",signal:t.signal})}catch(e){if(n)throw n;throw this._logger.log(C.Warning,`Error from HTTP request. ${e}.`),e}finally{s&&clearTimeout(s),e.abortSignal&&(e.abortSignal.onabort=null)}if(!r.ok){const e=await $(r,"text");throw new f(e||r.statusText,r.status)}const o=$(r,e.responseType),i=await o;return new h(r.status,r.statusText,i)}getCookieString(e){let t="";return b.isNode&&this._jar&&this._jar.getCookies(e,((e,n)=>t=n.join("; "))),t}}function $(e,t){let n;switch(t){case"arraybuffer":n=e.arrayBuffer();break;case"text":default:n=e.text();break;case"blob":case"document":case"json":throw new Error(`${t} is not supported.`)}return n}class q extends p{constructor(e){super(),this._logger=e}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new m):e.method?e.url?new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open(e.method,e.url,!0),r.withCredentials=void 0===e.withCredentials||e.withCredentials,r.setRequestHeader("X-Requested-With","XMLHttpRequest"),""===e.content&&(e.content=void 0),e.content&&(R(e.content)?r.setRequestHeader("Content-Type","application/octet-stream"):r.setRequestHeader("Content-Type","text/plain;charset=UTF-8"));const s=e.headers;s&&Object.keys(s).forEach((e=>{r.setRequestHeader(e,s[e])})),e.responseType&&(r.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=()=>{r.abort(),n(new m)}),e.timeout&&(r.timeout=e.timeout),r.onload=()=>{e.abortSignal&&(e.abortSignal.onabort=null),r.status>=200&&r.status<300?t(new h(r.status,r.statusText,r.response||r.responseText)):n(new f(r.response||r.responseText||r.statusText,r.status))},r.onerror=()=>{this._logger.log(C.Warning,`Error from HTTP request. ${r.status}: ${r.statusText}.`),n(new f(r.statusText,r.status))},r.ontimeout=()=>{this._logger.log(C.Warning,"Timeout from HTTP request."),n(new v)},r.send(e.content)})):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}}class V extends p{constructor(e){if(super(),"undefined"!=typeof fetch||b.isNode)this._httpClient=new W(e);else{if("undefined"==typeof XMLHttpRequest)throw new Error("No usable HttpClient found.");this._httpClient=new q(e)}}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new m):e.method?e.url?this._httpClient.send(e):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}getCookieString(e){return this._httpClient.getCookieString(e)}}!function(e){e[e.None=0]="None",e[e.WebSockets=1]="WebSockets",e[e.ServerSentEvents=2]="ServerSentEvents",e[e.LongPolling=4]="LongPolling"}(T||(T={})),function(e){e[e.Text=1]="Text",e[e.Binary=2]="Binary"}(D||(D={}));class H{constructor(){this._isAborted=!1,this.onabort=null}abort(){this._isAborted||(this._isAborted=!0,this.onabort&&this.onabort())}get signal(){return this}get aborted(){return this._isAborted}}class K{get pollAborted(){return this._pollAbort.aborted}constructor(e,t,n){this._httpClient=e,this._logger=t,this._pollAbort=new H,this._options=n,this._running=!1,this.onreceive=null,this.onclose=null}async connect(e,t){if(N.isRequired(e,"url"),N.isRequired(t,"transferFormat"),N.isIn(t,D,"transferFormat"),this._url=e,this._logger.log(C.Trace,"(LongPolling transport) Connecting."),t===D.Binary&&"undefined"!=typeof XMLHttpRequest&&"string"!=typeof(new XMLHttpRequest).responseType)throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");const[n,r]=M(),s={[n]:r,...this._options.headers},o={abortSignal:this._pollAbort.signal,headers:s,timeout:1e5,withCredentials:this._options.withCredentials};t===D.Binary&&(o.responseType="arraybuffer");const i=`${e}&_=${Date.now()}`;this._logger.log(C.Trace,`(LongPolling transport) polling: ${i}.`);const a=await this._httpClient.get(i,o);200!==a.statusCode?(this._logger.log(C.Error,`(LongPolling transport) Unexpected response code: ${a.statusCode}.`),this._closeError=new f(a.statusText||"",a.statusCode),this._running=!1):this._running=!0,this._receiving=this._poll(this._url,o)}async _poll(e,t){try{for(;this._running;)try{const n=`${e}&_=${Date.now()}`;this._logger.log(C.Trace,`(LongPolling transport) polling: ${n}.`);const r=await this._httpClient.get(n,t);204===r.statusCode?(this._logger.log(C.Information,"(LongPolling transport) Poll terminated by server."),this._running=!1):200!==r.statusCode?(this._logger.log(C.Error,`(LongPolling transport) Unexpected response code: ${r.statusCode}.`),this._closeError=new f(r.statusText||"",r.statusCode),this._running=!1):r.content?(this._logger.log(C.Trace,`(LongPolling transport) data received. ${I(r.content,this._options.logMessageContent)}.`),this.onreceive&&this.onreceive(r.content)):this._logger.log(C.Trace,"(LongPolling transport) Poll timed out, reissuing.")}catch(e){this._running?e instanceof v?this._logger.log(C.Trace,"(LongPolling transport) Poll timed out, reissuing."):(this._closeError=e,this._running=!1):this._logger.log(C.Trace,`(LongPolling transport) Poll errored after shutdown: ${e.message}`)}}finally{this._logger.log(C.Trace,"(LongPolling transport) Polling complete."),this.pollAborted||this._raiseOnClose()}}async send(e){return this._running?P(this._logger,"LongPolling",this._httpClient,this._url,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}async stop(){this._logger.log(C.Trace,"(LongPolling transport) Stopping polling."),this._running=!1,this._pollAbort.abort();try{await this._receiving,this._logger.log(C.Trace,`(LongPolling transport) sending DELETE request to ${this._url}.`);const e={},[t,n]=M();e[t]=n;const r={headers:{...e,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials};let s;try{await this._httpClient.delete(this._url,r)}catch(e){s=e}s?s instanceof f&&(404===s.statusCode?this._logger.log(C.Trace,"(LongPolling transport) A 404 response was returned from sending a DELETE request."):this._logger.log(C.Trace,`(LongPolling transport) Error sending a DELETE request: ${s}`)):this._logger.log(C.Trace,"(LongPolling transport) DELETE request accepted.")}finally{this._logger.log(C.Trace,"(LongPolling transport) Stop finished."),this._raiseOnClose()}}_raiseOnClose(){if(this.onclose){let e="(LongPolling transport) Firing onclose event.";this._closeError&&(e+=" Error: "+this._closeError),this._logger.log(C.Trace,e),this.onclose(this._closeError)}}}class j{constructor(e,t,n,r){this._httpClient=e,this._accessToken=t,this._logger=n,this._options=r,this.onreceive=null,this.onclose=null}async connect(e,t){return N.isRequired(e,"url"),N.isRequired(t,"transferFormat"),N.isIn(t,D,"transferFormat"),this._logger.log(C.Trace,"(SSE transport) Connecting."),this._url=e,this._accessToken&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(this._accessToken)}`),new Promise(((n,r)=>{let s,o=!1;if(t===D.Text){if(b.isBrowser||b.isWebWorker)s=new this._options.EventSource(e,{withCredentials:this._options.withCredentials});else{const t=this._httpClient.getCookieString(e),n={};n.Cookie=t;const[r,o]=M();n[r]=o,s=new this._options.EventSource(e,{withCredentials:this._options.withCredentials,headers:{...n,...this._options.headers}})}try{s.onmessage=e=>{if(this.onreceive)try{this._logger.log(C.Trace,`(SSE transport) data received. ${I(e.data,this._options.logMessageContent)}.`),this.onreceive(e.data)}catch(e){return void this._close(e)}},s.onerror=e=>{o?this._close():r(new Error("EventSource failed to connect. The connection could not be found on the server, either the connection ID is not present on the server, or a proxy is refusing/buffering the connection. If you have multiple servers check that sticky sessions are enabled."))},s.onopen=()=>{this._logger.log(C.Information,`SSE connected to ${this._url}`),this._eventSource=s,o=!0,n()}}catch(e){return void r(e)}}else r(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"))}))}async send(e){return this._eventSource?P(this._logger,"SSE",this._httpClient,this._url,e,this._options):Promise.reject(new Error("Cannot send until the transport is connected"))}stop(){return this._close(),Promise.resolve()}_close(e){this._eventSource&&(this._eventSource.close(),this._eventSource=void 0,this.onclose&&this.onclose(e))}}class z{constructor(e,t,n,r,s,o){this._logger=n,this._accessTokenFactory=t,this._logMessageContent=r,this._webSocketConstructor=s,this._httpClient=e,this.onreceive=null,this.onclose=null,this._headers=o}async connect(e,t){let n;return N.isRequired(e,"url"),N.isRequired(t,"transferFormat"),N.isIn(t,D,"transferFormat"),this._logger.log(C.Trace,"(WebSockets transport) Connecting."),this._accessTokenFactory&&(n=await this._accessTokenFactory()),new Promise(((r,s)=>{let o;e=e.replace(/^http/,"ws");const i=this._httpClient.getCookieString(e);let a=!1;if(b.isNode||b.isReactNative){const t={},[r,s]=M();t[r]=s,n&&(t[d.Authorization]=`Bearer ${n}`),i&&(t[d.Cookie]=i),o=new this._webSocketConstructor(e,void 0,{headers:{...t,...this._headers}})}else n&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(n)}`);o||(o=new this._webSocketConstructor(e)),t===D.Binary&&(o.binaryType="arraybuffer"),o.onopen=t=>{this._logger.log(C.Information,`WebSocket connected to ${e}.`),this._webSocket=o,a=!0,r()},o.onerror=e=>{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"There was an error with the transport",this._logger.log(C.Information,`(WebSockets transport) ${t}.`)},o.onmessage=e=>{if(this._logger.log(C.Trace,`(WebSockets transport) data received. ${I(e.data,this._logMessageContent)}.`),this.onreceive)try{this.onreceive(e.data)}catch(e){return void this._close(e)}},o.onclose=e=>{if(a)this._close(e);else{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"WebSocket failed to connect. The connection could not be found on the server, either the endpoint may not be a SignalR endpoint, the connection ID is not present on the server, or there is a proxy blocking WebSockets. If you have multiple servers check that sticky sessions are enabled.",s(new Error(t))}}}))}send(e){return this._webSocket&&this._webSocket.readyState===this._webSocketConstructor.OPEN?(this._logger.log(C.Trace,`(WebSockets transport) sending data. ${I(e,this._logMessageContent)}.`),this._webSocket.send(e),Promise.resolve()):Promise.reject("WebSocket is not in the OPEN state")}stop(){return this._webSocket&&this._close(void 0),Promise.resolve()}_close(e){this._webSocket&&(this._webSocket.onclose=()=>{},this._webSocket.onmessage=()=>{},this._webSocket.onerror=()=>{},this._webSocket.close(),this._webSocket=void 0),this._logger.log(C.Trace,"(WebSockets transport) socket closed."),this.onclose&&(!this._isCloseEvent(e)||!1!==e.wasClean&&1e3===e.code?e instanceof Error?this.onclose(e):this.onclose():this.onclose(new Error(`WebSocket closed with status code: ${e.code} (${e.reason||"no reason given"}).`)))}_isCloseEvent(e){return e&&"boolean"==typeof e.wasClean&&"number"==typeof e.code}}class J{constructor(e,t={}){var n;if(this._stopPromiseResolver=()=>{},this.features={},this._negotiateVersion=1,N.isRequired(e,"url"),this._logger=void 0===(n=t.logger)?new U(C.Information):null===n?G.instance:void 0!==n.log?n:new U(n),this.baseUrl=this._resolveUrl(e),(t=t||{}).logMessageContent=void 0!==t.logMessageContent&&t.logMessageContent,"boolean"!=typeof t.withCredentials&&void 0!==t.withCredentials)throw new Error("withCredentials option was not a 'boolean' or 'undefined' value");t.withCredentials=void 0===t.withCredentials||t.withCredentials,t.timeout=void 0===t.timeout?1e5:t.timeout;let r=null,s=null;if(b.isNode){const e=require;r=e("ws"),s=e("eventsource")}b.isNode||"undefined"==typeof WebSocket||t.WebSocket?b.isNode&&!t.WebSocket&&r&&(t.WebSocket=r):t.WebSocket=WebSocket,b.isNode||"undefined"==typeof EventSource||t.EventSource?b.isNode&&!t.EventSource&&void 0!==s&&(t.EventSource=s):t.EventSource=EventSource,this._httpClient=new g(t.httpClient||new V(this._logger),t.accessTokenFactory),this._connectionState="Disconnected",this._connectionStarted=!1,this._options=t,this.onreceive=null,this.onclose=null}async start(e){if(e=e||D.Binary,N.isIn(e,D,"transferFormat"),this._logger.log(C.Debug,`Starting connection with transfer format '${D[e]}'.`),"Disconnected"!==this._connectionState)return Promise.reject(new Error("Cannot start an HttpConnection that is not in the 'Disconnected' state."));if(this._connectionState="Connecting",this._startInternalPromise=this._startInternal(e),await this._startInternalPromise,"Disconnecting"===this._connectionState){const e="Failed to start the HttpConnection before stop() was called.";return this._logger.log(C.Error,e),await this._stopPromise,Promise.reject(new m(e))}if("Connected"!==this._connectionState){const e="HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!";return this._logger.log(C.Error,e),Promise.reject(new m(e))}this._connectionStarted=!0}send(e){return"Connected"!==this._connectionState?Promise.reject(new Error("Cannot send data if the connection is not in the 'Connected' State.")):(this._sendQueue||(this._sendQueue=new X(this.transport)),this._sendQueue.send(e))}async stop(e){return"Disconnected"===this._connectionState?(this._logger.log(C.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnected state.`),Promise.resolve()):"Disconnecting"===this._connectionState?(this._logger.log(C.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise):(this._connectionState="Disconnecting",this._stopPromise=new Promise((e=>{this._stopPromiseResolver=e})),await this._stopInternal(e),void await this._stopPromise)}async _stopInternal(e){this._stopError=e;try{await this._startInternalPromise}catch(e){}if(this.transport){try{await this.transport.stop()}catch(e){this._logger.log(C.Error,`HttpConnection.transport.stop() threw error '${e}'.`),this._stopConnection()}this.transport=void 0}else this._logger.log(C.Debug,"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.")}async _startInternal(e){let t=this.baseUrl;this._accessTokenFactory=this._options.accessTokenFactory,this._httpClient._accessTokenFactory=this._accessTokenFactory;try{if(this._options.skipNegotiation){if(this._options.transport!==T.WebSockets)throw new Error("Negotiation can only be skipped when using the WebSocket transport directly.");this.transport=this._constructTransport(T.WebSockets),await this._startTransport(t,e)}else{let n=null,r=0;do{if(n=await this._getNegotiationResponse(t),"Disconnecting"===this._connectionState||"Disconnected"===this._connectionState)throw new m("The connection was stopped during negotiation.");if(n.error)throw new Error(n.error);if(n.ProtocolVersion)throw new Error("Detected a connection attempt to an ASP.NET SignalR Server. This client only supports connecting to an ASP.NET Core SignalR Server. See https://aka.ms/signalr-core-differences for details.");if(n.url&&(t=n.url),n.accessToken){const e=n.accessToken;this._accessTokenFactory=()=>e,this._httpClient._accessToken=e,this._httpClient._accessTokenFactory=void 0}r++}while(n.url&&r<100);if(100===r&&n.url)throw new Error("Negotiate redirection limit exceeded.");await this._createTransport(t,this._options.transport,n,e)}this.transport instanceof K&&(this.features.inherentKeepAlive=!0),"Connecting"===this._connectionState&&(this._logger.log(C.Debug,"The HttpConnection connected successfully."),this._connectionState="Connected")}catch(e){return this._logger.log(C.Error,"Failed to start the connection: "+e),this._connectionState="Disconnected",this.transport=void 0,this._stopPromiseResolver(),Promise.reject(e)}}async _getNegotiationResponse(e){const t={},[n,r]=M();t[n]=r;const s=this._resolveNegotiateUrl(e);this._logger.log(C.Debug,`Sending negotiation request: ${s}.`);try{const e=await this._httpClient.post(s,{content:"",headers:{...t,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials});if(200!==e.statusCode)return Promise.reject(new Error(`Unexpected status code returned from negotiate '${e.statusCode}'`));const n=JSON.parse(e.content);return(!n.negotiateVersion||n.negotiateVersion<1)&&(n.connectionToken=n.connectionId),n.useStatefulReconnect&&!0!==this._options._useStatefulReconnect?Promise.reject(new A("Client didn't negotiate Stateful Reconnect but the server did.")):n}catch(e){let t="Failed to complete negotiation with the server: "+e;return e instanceof f&&404===e.statusCode&&(t+=" Either this is not a SignalR endpoint or there is a proxy blocking the connection."),this._logger.log(C.Error,t),Promise.reject(new A(t))}}_createConnectUrl(e,t){return t?e+(-1===e.indexOf("?")?"?":"&")+`id=${t}`:e}async _createTransport(e,t,n,r){let s=this._createConnectUrl(e,n.connectionToken);if(this._isITransport(t))return this._logger.log(C.Debug,"Connection was provided an instance of ITransport, using that directly."),this.transport=t,await this._startTransport(s,r),void(this.connectionId=n.connectionId);const o=[],i=n.availableTransports||[];let a=n;for(const n of i){const i=this._resolveTransportOrError(n,t,r,!0===(null==a?void 0:a.useStatefulReconnect));if(i instanceof Error)o.push(`${n.transport} failed:`),o.push(i);else if(this._isITransport(i)){if(this.transport=i,!a){try{a=await this._getNegotiationResponse(e)}catch(e){return Promise.reject(e)}s=this._createConnectUrl(e,a.connectionToken)}try{return await this._startTransport(s,r),void(this.connectionId=a.connectionId)}catch(e){if(this._logger.log(C.Error,`Failed to start the transport '${n.transport}': ${e}`),a=void 0,o.push(new S(`${n.transport} failed: ${e}`,T[n.transport])),"Connecting"!==this._connectionState){const e="Failed to select transport before stop() was called.";return this._logger.log(C.Debug,e),Promise.reject(new m(e))}}}}return o.length>0?Promise.reject(new _(`Unable to connect to the server with any of the available transports. ${o.join(" ")}`,o)):Promise.reject(new Error("None of the transports supported by the client are supported by the server."))}_constructTransport(e){switch(e){case T.WebSockets:if(!this._options.WebSocket)throw new Error("'WebSocket' is not supported in your environment.");return new z(this._httpClient,this._accessTokenFactory,this._logger,this._options.logMessageContent,this._options.WebSocket,this._options.headers||{});case T.ServerSentEvents:if(!this._options.EventSource)throw new Error("'EventSource' is not supported in your environment.");return new j(this._httpClient,this._httpClient._accessToken,this._logger,this._options);case T.LongPolling:return new K(this._httpClient,this._logger,this._options);default:throw new Error(`Unknown transport: ${e}.`)}}_startTransport(e,t){return this.transport.onreceive=this.onreceive,this.features.reconnect?this.transport.onclose=async n=>{let r=!1;if(this.features.reconnect){try{this.features.disconnected(),await this.transport.connect(e,t),await this.features.resend()}catch{r=!0}r&&this._stopConnection(n)}else this._stopConnection(n)}:this.transport.onclose=e=>this._stopConnection(e),this.transport.connect(e,t)}_resolveTransportOrError(e,t,n,r){const s=T[e.transport];if(null==s)return this._logger.log(C.Debug,`Skipping transport '${e.transport}' because it is not supported by this client.`),new Error(`Skipping transport '${e.transport}' because it is not supported by this client.`);if(!function(e,t){return!e||!!(t&e)}(t,s))return this._logger.log(C.Debug,`Skipping transport '${T[s]}' because it was disabled by the client.`),new w(`'${T[s]}' is disabled by the client.`,s);if(!(e.transferFormats.map((e=>D[e])).indexOf(n)>=0))return this._logger.log(C.Debug,`Skipping transport '${T[s]}' because it does not support the requested transfer format '${D[n]}'.`),new Error(`'${T[s]}' does not support ${D[n]}.`);if(s===T.WebSockets&&!this._options.WebSocket||s===T.ServerSentEvents&&!this._options.EventSource)return this._logger.log(C.Debug,`Skipping transport '${T[s]}' because it is not supported in your environment.'`),new y(`'${T[s]}' is not supported in your environment.`,s);this._logger.log(C.Debug,`Selecting transport '${T[s]}'.`);try{return this.features.reconnect=s===T.WebSockets?r:void 0,this._constructTransport(s)}catch(e){return e}}_isITransport(e){return e&&"object"==typeof e&&"connect"in e}_stopConnection(e){if(this._logger.log(C.Debug,`HttpConnection.stopConnection(${e}) called while in state ${this._connectionState}.`),this.transport=void 0,e=this._stopError||e,this._stopError=void 0,"Disconnected"!==this._connectionState){if("Connecting"===this._connectionState)throw this._logger.log(C.Warning,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is still in the connecting state.`),new Error(`HttpConnection.stopConnection(${e}) was called while the connection is still in the connecting state.`);if("Disconnecting"===this._connectionState&&this._stopPromiseResolver(),e?this._logger.log(C.Error,`Connection disconnected with error '${e}'.`):this._logger.log(C.Information,"Connection disconnected."),this._sendQueue&&(this._sendQueue.stop().catch((e=>{this._logger.log(C.Error,`TransportSendQueue.stop() threw error '${e}'.`)})),this._sendQueue=void 0),this.connectionId=void 0,this._connectionState="Disconnected",this._connectionStarted){this._connectionStarted=!1;try{this.onclose&&this.onclose(e)}catch(t){this._logger.log(C.Error,`HttpConnection.onclose(${e}) threw error '${t}'.`)}}}else this._logger.log(C.Debug,`Call to HttpConnection.stopConnection(${e}) was ignored because the connection is already in the disconnected state.`)}_resolveUrl(e){if(0===e.lastIndexOf("https://",0)||0===e.lastIndexOf("http://",0))return e;if(!b.isBrowser)throw new Error(`Cannot resolve '${e}'.`);const t=window.document.createElement("a");return t.href=e,this._logger.log(C.Information,`Normalizing '${e}' to '${t.href}'.`),t.href}_resolveNegotiateUrl(e){const t=new URL(e);t.pathname.endsWith("/")?t.pathname+="negotiate":t.pathname+="/negotiate";const n=new URLSearchParams(t.searchParams);return n.has("negotiateVersion")||n.append("negotiateVersion",this._negotiateVersion.toString()),n.has("useStatefulReconnect")?"true"===n.get("useStatefulReconnect")&&(this._options._useStatefulReconnect=!0):!0===this._options._useStatefulReconnect&&n.append("useStatefulReconnect","true"),t.search=n.toString(),t.toString()}}class X{constructor(e){this._transport=e,this._buffer=[],this._executing=!0,this._sendBufferedData=new Y,this._transportResult=new Y,this._sendLoopPromise=this._sendLoop()}send(e){return this._bufferData(e),this._transportResult||(this._transportResult=new Y),this._transportResult.promise}stop(){return this._executing=!1,this._sendBufferedData.resolve(),this._sendLoopPromise}_bufferData(e){if(this._buffer.length&&typeof this._buffer[0]!=typeof e)throw new Error(`Expected data to be of type ${typeof this._buffer} but was of type ${typeof e}`);this._buffer.push(e),this._sendBufferedData.resolve()}async _sendLoop(){for(;;){if(await this._sendBufferedData.promise,!this._executing){this._transportResult&&this._transportResult.reject("Connection stopped.");break}this._sendBufferedData=new Y;const e=this._transportResult;this._transportResult=void 0;const t="string"==typeof this._buffer[0]?this._buffer.join(""):X._concatBuffers(this._buffer);this._buffer.length=0;try{await this._transport.send(t),e.resolve()}catch(t){e.reject(t)}}}static _concatBuffers(e){const t=e.map((e=>e.byteLength)).reduce(((e,t)=>e+t)),n=new Uint8Array(t);let r=0;for(const t of e)n.set(new Uint8Array(t),r),r+=t.byteLength;return n.buffer}}class Y{constructor(){this.promise=new Promise(((e,t)=>[this._resolver,this._rejecter]=[e,t]))}resolve(){this._resolver()}reject(e){this._rejecter(e)}}class Q{static write(e){return`${e}${Q.RecordSeparator}`}static parse(e){if(e[e.length-1]!==Q.RecordSeparator)throw new Error("Message is incomplete.");const t=e.split(Q.RecordSeparator);return t.pop(),t}}Q.RecordSeparatorCode=30,Q.RecordSeparator=String.fromCharCode(Q.RecordSeparatorCode);class Z{writeHandshakeRequest(e){return Q.write(JSON.stringify(e))}parseHandshakeResponse(e){let t,n;if(R(e)){const r=new Uint8Array(e),s=r.indexOf(Q.RecordSeparatorCode);if(-1===s)throw new Error("Message is incomplete.");const o=s+1;t=String.fromCharCode.apply(null,Array.prototype.slice.call(r.slice(0,o))),n=r.byteLength>o?r.slice(o).buffer:null}else{const r=e,s=r.indexOf(Q.RecordSeparator);if(-1===s)throw new Error("Message is incomplete.");const o=s+1;t=r.substring(0,o),n=r.length>o?r.substring(o):null}const r=Q.parse(t),s=JSON.parse(r[0]);if(s.type)throw new Error("Expected a handshake response from the server.");return[n,s]}}!function(e){e[e.Invocation=1]="Invocation",e[e.StreamItem=2]="StreamItem",e[e.Completion=3]="Completion",e[e.StreamInvocation=4]="StreamInvocation",e[e.CancelInvocation=5]="CancelInvocation",e[e.Ping=6]="Ping",e[e.Close=7]="Close",e[e.Ack=8]="Ack",e[e.Sequence=9]="Sequence"}(k||(k={}));class ee{constructor(){this.observers=[]}next(e){for(const t of this.observers)t.next(e)}error(e){for(const t of this.observers)t.error&&t.error(e)}complete(){for(const e of this.observers)e.complete&&e.complete()}subscribe(e){return this.observers.push(e),new O(this,e)}}class te{constructor(e,t,n){this._bufferSize=1e5,this._messages=[],this._totalMessageCount=0,this._waitForSequenceMessage=!1,this._nextReceivingSequenceId=1,this._latestReceivedSequenceId=0,this._bufferedByteCount=0,this._reconnectInProgress=!1,this._protocol=e,this._connection=t,this._bufferSize=n}async _send(e){const t=this._protocol.writeMessage(e);let n=Promise.resolve();if(this._isInvocationMessage(e)){this._totalMessageCount++;let e=()=>{},r=()=>{};R(t)?this._bufferedByteCount+=t.byteLength:this._bufferedByteCount+=t.length,this._bufferedByteCount>=this._bufferSize&&(n=new Promise(((t,n)=>{e=t,r=n}))),this._messages.push(new ne(t,this._totalMessageCount,e,r))}try{this._reconnectInProgress||await this._connection.send(t)}catch{this._disconnected()}await n}_ack(e){let t=-1;for(let n=0;n<this._messages.length;n++){const r=this._messages[n];if(r._id<=e.sequenceId)t=n,R(r._message)?this._bufferedByteCount-=r._message.byteLength:this._bufferedByteCount-=r._message.length,r._resolver();else{if(!(this._bufferedByteCount<this._bufferSize))break;r._resolver()}}-1!==t&&(this._messages=this._messages.slice(t+1))}_shouldProcessMessage(e){if(this._waitForSequenceMessage)return e.type===k.Sequence&&(this._waitForSequenceMessage=!1,!0);if(!this._isInvocationMessage(e))return!0;const t=this._nextReceivingSequenceId;return this._nextReceivingSequenceId++,t<=this._latestReceivedSequenceId?(t===this._latestReceivedSequenceId&&this._ackTimer(),!1):(this._latestReceivedSequenceId=t,this._ackTimer(),!0)}_resetSequence(e){e.sequenceId>this._nextReceivingSequenceId?this._connection.stop(new Error("Sequence ID greater than amount of messages we've received.")):this._nextReceivingSequenceId=e.sequenceId}_disconnected(){this._reconnectInProgress=!0,this._waitForSequenceMessage=!0}async _resend(){const e=0!==this._messages.length?this._messages[0]._id:this._totalMessageCount+1;await this._connection.send(this._protocol.writeMessage({type:k.Sequence,sequenceId:e}));const t=this._messages;for(const e of t)await this._connection.send(e._message);this._reconnectInProgress=!1}_dispose(e){null!=e||(e=new Error("Unable to reconnect to server."));for(const t of this._messages)t._rejector(e)}_isInvocationMessage(e){switch(e.type){case k.Invocation:case k.StreamItem:case k.Completion:case k.StreamInvocation:case k.CancelInvocation:return!0;case k.Close:case k.Sequence:case k.Ping:case k.Ack:return!1}}_ackTimer(){void 0===this._ackTimerHandle&&(this._ackTimerHandle=setTimeout((async()=>{try{this._reconnectInProgress||await this._connection.send(this._protocol.writeMessage({type:k.Ack,sequenceId:this._latestReceivedSequenceId}))}catch{}clearTimeout(this._ackTimerHandle),this._ackTimerHandle=void 0}),1e3))}}class ne{constructor(e,t,n,r){this._message=e,this._id=t,this._resolver=n,this._rejector=r}}!function(e){e.Disconnected="Disconnected",e.Connecting="Connecting",e.Connected="Connected",e.Disconnecting="Disconnecting",e.Reconnecting="Reconnecting"}(E||(E={}));class re{static create(e,t,n,r,s,o,i){return new re(e,t,n,r,s,o,i)}constructor(e,t,n,r,s,o,i){this._nextKeepAlive=0,this._freezeEventListener=()=>{this._logger.log(C.Warning,"The page is being frozen, this will likely lead to the connection being closed and messages being lost. For more information see the docs at https://learn.microsoft.com/aspnet/core/signalr/javascript-client#bsleep")},N.isRequired(e,"connection"),N.isRequired(t,"logger"),N.isRequired(n,"protocol"),this.serverTimeoutInMilliseconds=null!=s?s:3e4,this.keepAliveIntervalInMilliseconds=null!=o?o:15e3,this._statefulReconnectBufferSize=null!=i?i:1e5,this._logger=t,this._protocol=n,this.connection=e,this._reconnectPolicy=r,this._handshakeProtocol=new Z,this.connection.onreceive=e=>this._processIncomingData(e),this.connection.onclose=e=>this._connectionClosed(e),this._callbacks={},this._methods={},this._closedCallbacks=[],this._reconnectingCallbacks=[],this._reconnectedCallbacks=[],this._invocationId=0,this._receivedHandshakeResponse=!1,this._connectionState=E.Disconnected,this._connectionStarted=!1,this._cachedPingMessage=this._protocol.writeMessage({type:k.Ping})}get state(){return this._connectionState}get connectionId(){return this.connection&&this.connection.connectionId||null}get baseUrl(){return this.connection.baseUrl||""}set baseUrl(e){if(this._connectionState!==E.Disconnected&&this._connectionState!==E.Reconnecting)throw new Error("The HubConnection must be in the Disconnected or Reconnecting state to change the url.");if(!e)throw new Error("The HubConnection url must be a valid url.");this.connection.baseUrl=e}start(){return this._startPromise=this._startWithStateTransitions(),this._startPromise}async _startWithStateTransitions(){if(this._connectionState!==E.Disconnected)return Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."));this._connectionState=E.Connecting,this._logger.log(C.Debug,"Starting HubConnection.");try{await this._startInternal(),b.isBrowser&&window.document.addEventListener("freeze",this._freezeEventListener),this._connectionState=E.Connected,this._connectionStarted=!0,this._logger.log(C.Debug,"HubConnection connected successfully.")}catch(e){return this._connectionState=E.Disconnected,this._logger.log(C.Debug,`HubConnection failed to start successfully because of error '${e}'.`),Promise.reject(e)}}async _startInternal(){this._stopDuringStartError=void 0,this._receivedHandshakeResponse=!1;const e=new Promise(((e,t)=>{this._handshakeResolver=e,this._handshakeRejecter=t}));await this.connection.start(this._protocol.transferFormat);try{let t=this._protocol.version;this.connection.features.reconnect||(t=1);const n={protocol:this._protocol.name,version:t};if(this._logger.log(C.Debug,"Sending handshake request."),await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(n)),this._logger.log(C.Information,`Using HubProtocol '${this._protocol.name}'.`),this._cleanupTimeout(),this._resetTimeoutPeriod(),this._resetKeepAliveInterval(),await e,this._stopDuringStartError)throw this._stopDuringStartError;!!this.connection.features.reconnect&&(this._messageBuffer=new te(this._protocol,this.connection,this._statefulReconnectBufferSize),this.connection.features.disconnected=this._messageBuffer._disconnected.bind(this._messageBuffer),this.connection.features.resend=()=>{if(this._messageBuffer)return this._messageBuffer._resend()}),this.connection.features.inherentKeepAlive||await this._sendMessage(this._cachedPingMessage)}catch(e){throw this._logger.log(C.Debug,`Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`),this._cleanupTimeout(),this._cleanupPingTimer(),await this.connection.stop(e),e}}async stop(){const e=this._startPromise;this.connection.features.reconnect=!1,this._stopPromise=this._stopInternal(),await this._stopPromise;try{await e}catch(e){}}_stopInternal(e){if(this._connectionState===E.Disconnected)return this._logger.log(C.Debug,`Call to HubConnection.stop(${e}) ignored because it is already in the disconnected state.`),Promise.resolve();if(this._connectionState===E.Disconnecting)return this._logger.log(C.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnecting state.`),this._stopPromise;const t=this._connectionState;return this._connectionState=E.Disconnecting,this._logger.log(C.Debug,"Stopping HubConnection."),this._reconnectDelayHandle?(this._logger.log(C.Debug,"Connection stopped during reconnect delay. Done reconnecting."),clearTimeout(this._reconnectDelayHandle),this._reconnectDelayHandle=void 0,this._completeClose(),Promise.resolve()):(t===E.Connected&&this._sendCloseMessage(),this._cleanupTimeout(),this._cleanupPingTimer(),this._stopDuringStartError=e||new m("The connection was stopped before the hub handshake could complete."),this.connection.stop(e))}async _sendCloseMessage(){try{await this._sendWithProtocol(this._createCloseMessage())}catch{}}stream(e,...t){const[n,r]=this._replaceStreamingParams(t),s=this._createStreamInvocation(e,t,r);let o;const i=new ee;return i.cancelCallback=()=>{const e=this._createCancelInvocation(s.invocationId);return delete this._callbacks[s.invocationId],o.then((()=>this._sendWithProtocol(e)))},this._callbacks[s.invocationId]=(e,t)=>{t?i.error(t):e&&(e.type===k.Completion?e.error?i.error(new Error(e.error)):i.complete():i.next(e.item))},o=this._sendWithProtocol(s).catch((e=>{i.error(e),delete this._callbacks[s.invocationId]})),this._launchStreams(n,o),i}_sendMessage(e){return this._resetKeepAliveInterval(),this.connection.send(e)}_sendWithProtocol(e){return this._messageBuffer?this._messageBuffer._send(e):this._sendMessage(this._protocol.writeMessage(e))}send(e,...t){const[n,r]=this._replaceStreamingParams(t),s=this._sendWithProtocol(this._createInvocation(e,t,!0,r));return this._launchStreams(n,s),s}invoke(e,...t){const[n,r]=this._replaceStreamingParams(t),s=this._createInvocation(e,t,!1,r);return new Promise(((e,t)=>{this._callbacks[s.invocationId]=(n,r)=>{r?t(r):n&&(n.type===k.Completion?n.error?t(new Error(n.error)):e(n.result):t(new Error(`Unexpected message type: ${n.type}`)))};const r=this._sendWithProtocol(s).catch((e=>{t(e),delete this._callbacks[s.invocationId]}));this._launchStreams(n,r)}))}on(e,t){e&&t&&(e=e.toLowerCase(),this._methods[e]||(this._methods[e]=[]),-1===this._methods[e].indexOf(t)&&this._methods[e].push(t))}off(e,t){if(!e)return;e=e.toLowerCase();const n=this._methods[e];if(n)if(t){const r=n.indexOf(t);-1!==r&&(n.splice(r,1),0===n.length&&delete this._methods[e])}else delete this._methods[e]}onclose(e){e&&this._closedCallbacks.push(e)}onreconnecting(e){e&&this._reconnectingCallbacks.push(e)}onreconnected(e){e&&this._reconnectedCallbacks.push(e)}_processIncomingData(e){if(this._cleanupTimeout(),this._receivedHandshakeResponse||(e=this._processHandshakeResponse(e),this._receivedHandshakeResponse=!0),e){const t=this._protocol.parseMessages(e,this._logger);for(const e of t)if(!this._messageBuffer||this._messageBuffer._shouldProcessMessage(e))switch(e.type){case k.Invocation:this._invokeClientMethod(e).catch((e=>{this._logger.log(C.Error,`Invoke client method threw error: ${B(e)}`)}));break;case k.StreamItem:case k.Completion:{const t=this._callbacks[e.invocationId];if(t){e.type===k.Completion&&delete this._callbacks[e.invocationId];try{t(e)}catch(e){this._logger.log(C.Error,`Stream callback threw error: ${B(e)}`)}}break}case k.Ping:break;case k.Close:{this._logger.log(C.Information,"Close message received from server.");const t=e.error?new Error("Server returned an error on close: "+e.error):void 0;!0===e.allowReconnect?this.connection.stop(t):this._stopPromise=this._stopInternal(t);break}case k.Ack:this._messageBuffer&&this._messageBuffer._ack(e);break;case k.Sequence:this._messageBuffer&&this._messageBuffer._resetSequence(e);break;default:this._logger.log(C.Warning,`Invalid message type: ${e.type}.`)}}this._resetTimeoutPeriod()}_processHandshakeResponse(e){let t,n;try{[n,t]=this._handshakeProtocol.parseHandshakeResponse(e)}catch(e){const t="Error parsing handshake response: "+e;this._logger.log(C.Error,t);const n=new Error(t);throw this._handshakeRejecter(n),n}if(t.error){const e="Server returned handshake error: "+t.error;this._logger.log(C.Error,e);const n=new Error(e);throw this._handshakeRejecter(n),n}return this._logger.log(C.Debug,"Server handshake complete."),this._handshakeResolver(),n}_resetKeepAliveInterval(){this.connection.features.inherentKeepAlive||(this._nextKeepAlive=(new Date).getTime()+this.keepAliveIntervalInMilliseconds,this._cleanupPingTimer())}_resetTimeoutPeriod(){if(!(this.connection.features&&this.connection.features.inherentKeepAlive||(this._timeoutHandle=setTimeout((()=>this.serverTimeout()),this.serverTimeoutInMilliseconds),void 0!==this._pingServerHandle))){let e=this._nextKeepAlive-(new Date).getTime();e<0&&(e=0),this._pingServerHandle=setTimeout((async()=>{if(this._connectionState===E.Connected)try{await this._sendMessage(this._cachedPingMessage)}catch{this._cleanupPingTimer()}}),e)}}serverTimeout(){this.connection.stop(new Error("Server timeout elapsed without receiving a message from the server."))}async _invokeClientMethod(e){const t=e.target.toLowerCase(),n=this._methods[t];if(!n)return this._logger.log(C.Warning,`No client method with the name '${t}' found.`),void(e.invocationId&&(this._logger.log(C.Warning,`No result given for '${t}' method and invocation ID '${e.invocationId}'.`),await this._sendWithProtocol(this._createCompletionMessage(e.invocationId,"Client didn't provide a result.",null))));const r=n.slice(),s=!!e.invocationId;let o,i,a;for(const n of r)try{const r=o;o=await n.apply(this,e.arguments),s&&o&&r&&(this._logger.log(C.Error,`Multiple results provided for '${t}'. Sending error to server.`),a=this._createCompletionMessage(e.invocationId,"Client provided multiple results.",null)),i=void 0}catch(e){i=e,this._logger.