lavva.exalushome
Version:
Library implementing communication and abstraction layers for ExalusHome system
1 lines • 499 kB
JavaScript
(()=>{"use strict";var e,t,n,r,s,o,i={d:(e,t)=>{for(var n in t)i.o(t,n)&&!i.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})}};i.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),i.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),i.d({},{j:()=>gy}),function(e){e[e.Debug=0]="Debug",e[e.Info=1]="Info",e[e.Warning=2]="Warning",e[e.Error=3]="Error",e[e.None=4]="None"}(e||(e={}));class a{constructor(){this._blockedServices=[],this._logLevel=e.Debug;const t=globalThis;void 0!==t.loglevel&&null!==t.loglevel&&(this._logLevel=t.loglevel),t.logger=this}EnableStackTrace(){a.DoesThrowStackTrace=!0}DisableStackTrace(){a.DoesThrowStackTrace=!1}IsBlocked(e){return void 0!==e&&this._blockedServices.any((t=>t==e))}DisableLogsFrom(e){this._blockedServices.all((t=>t!=e))&&this._blockedServices.push(e),this.Debug(a.ServiceName,`Disabling logs from ${e}`)}EnableLogsFrom(e){this._blockedServices.any((t=>t==e))&&(this._blockedServices=this._blockedServices.where((t=>t!=e)).toArray()),this.Debug(a.ServiceName,`Enaabling logs from ${e}`)}get LogLevel(){return this._logLevel}set LogLevel(e){this._logLevel=e}GetServiceName(){return a.ServiceName}GetTimeStamp(){const e=new Date;return`${e.getHours()}:${e.getMinutes()}:${e.getSeconds()}.${e.getMilliseconds()} | `}Warning(t,n){switch(this._logLevel){case e.Warning:case e.Info:case e.Debug:break;case e.None:default:return}void 0===t||this.IsBlocked(t)||null!=t&&(null==n?console.warn(`${this.GetTimeStamp()}[WARN] ${t}`):console.warn(`${this.GetTimeStamp()}[WARN] [${t}] ${n}`))}Error(t,n){switch(this._logLevel){case e.Warning:case e.Info:case e.Debug:case e.Error:break;case e.None:default:return}null!=t&&(null==n?console.error(`${this.GetTimeStamp()}[ERROR] ${t}`):console.error(`${this.GetTimeStamp()}[ERROR] [${t}] ${n}`))}Info(t,n){switch(this._logLevel){case e.Info:case e.Debug:break;case e.None:default:return}void 0===t||this.IsBlocked(t)||null!=t&&(null==n?console.info(`${this.GetTimeStamp()}[INFO] ${t}`):console.info(`${this.GetTimeStamp()}[INFO] [${t}] ${n}`))}Debug(t,n){switch(this._logLevel){case e.Debug:break;case e.None:default:return}void 0===t||this.IsBlocked(t)||null!=t&&(null==n?console.debug(`${this.GetTimeStamp()}[DEBUG] ${t}`):a.DoesThrowStackTrace||!0===globalThis.stacktrace?console.debug(`${this.GetTimeStamp()}[DEBUG] [${t}] ${n} \nstack:\n${(new Error).stack}}`):console.debug(`${this.GetTimeStamp()}[DEBUG] [${t}] ${n}`))}Log(t,n){this._logLevel!==e.None&&(void 0===t||this.IsBlocked(t)||null!=t&&(null==n?console.log(`${this.GetTimeStamp()}[LOG] ${t}`):console.log(`${this.GetTimeStamp()}[LOG] [${t}] ${n}`)))}}a.ServiceName="LoggerService",a.DoesThrowStackTrace=!1;class c{constructor(){this.handlers=[]}Subscribe(e){this.handlers.includes(e)||this.handlers.push(e)}Unsubscribe(e){this.handlers=this.handlers.filter((t=>t!==e))}Invoke(e){this.handlers.slice(0).forEach((t=>{var n;try{t(e)}catch(e){null===(n=u.Log)||void 0===n||n.Error(e)}}))}}class u{constructor(){this._services=new Map,this._serviceRegistrationEvent=new c,this._pendingResolutions=new Map,this._nextResolutionId=1}static get Timers(){return globalThis}static get Instance(){const e=globalThis;if(e.__dc_instance)return e.__dc_instance;const t=new u;return e.__dc_instance=t,"undefined"==typeof window||window.LavvaDI||(window.appservices=t),this.Log=new a,this.Log.Warning(u.ServiceName,"Initializing DependencyContainer"),t.RegisterService(this.Log),this.IsInitialized=!0,t}RegisterService(e){var t;const n=e.GetServiceName();this._services.has(n)&&(null===(t=u.Log)||void 0===t||t.Warning(u.ServiceName,`Service "${n}" is being re-registered and the previous instance will be overwritten.`)),this._services.set(n,e),this._serviceRegistrationEvent.Invoke(e)}GetService(e){return this._services.get(e)}GetServiceAsync(e,t){var n,r;if(this._services.has(e))return null===(n=u.Log)||void 0===n||n.Debug(u.ServiceName,`Resolved service "${e}" immediately.`),Promise.resolve(this._services.get(e));const s=this.CreatePendingResolution(e);return this._pendingResolutions.set(s.Id,s),null===(r=u.Log)||void 0===r||r.Debug(u.ServiceName,`Waiting for service "${e}" (request #${s.Id}). Registered services: ${this.GetRegisteredServiceNamesForLogs()}.`),new Promise(((n,r)=>{const o=r=>{var a;if(r.GetServiceName()===e&&this.TryCompleteResolution(s.Id)){this._serviceRegistrationEvent.Unsubscribe(o),null==t||t.CancellationEvent.Unsubscribe(i);const c=Date.now()-s.StartedAt;null===(a=u.Log)||void 0===a||a.Info(u.ServiceName,`Resolved service "${e}" after ${c}ms (request #${s.Id}).`),n(r)}},i=()=>{var t;if(this._serviceRegistrationEvent.Unsubscribe(o),!this.TryCompleteResolution(s.Id))return;const n=Date.now()-s.StartedAt;null===(t=u.Log)||void 0===t||t.Warning(u.ServiceName,`Cancelled waiting for service "${e}" after ${n}ms (request #${s.Id}).`),r(new Error("cancelled"))};null==t||t.CancellationEvent.Subscribe(i),this._serviceRegistrationEvent.Subscribe(o)}))}GetServiceWithTimeoutAsync(e,t){var n,r;if(this._services.has(e))return null===(n=u.Log)||void 0===n||n.Debug(u.ServiceName,`Resolved service "${e}" immediately.`),Promise.resolve(this._services.get(e));const s=this.CreatePendingResolution(e);return this._pendingResolutions.set(s.Id,s),null===(r=u.Log)||void 0===r||r.Debug(u.ServiceName,`Waiting for service "${e}" with timeout ${t}ms (request #${s.Id}). Registered services: ${this.GetRegisteredServiceNamesForLogs()}.`),new Promise(((n,r)=>{const o=t=>{var r;if(t.GetServiceName()===e&&this.TryCompleteResolution(s.Id)){u.Timers.clearTimeout(i),this._serviceRegistrationEvent.Unsubscribe(o);const a=Date.now()-s.StartedAt;null===(r=u.Log)||void 0===r||r.Info(u.ServiceName,`Resolved service "${e}" after ${a}ms (request #${s.Id}).`),n(t)}},i=u.Timers.setTimeout((()=>{var t;if(this._serviceRegistrationEvent.Unsubscribe(o),!this.TryCompleteResolution(s.Id))return;const n=Date.now()-s.StartedAt;null===(t=u.Log)||void 0===t||t.Warning(u.ServiceName,`Timeout waiting for service "${e}" after ${n}ms (request #${s.Id}). Registered services: ${this.GetRegisteredServiceNamesForLogs()}.`),r(new Error(`timeout waiting for "${e}"`))}),t);this._serviceRegistrationEvent.Subscribe(o)}))}CreatePendingResolution(e){return{Id:this._nextResolutionId++,ServiceName:e,StartedAt:Date.now()}}TryCompleteResolution(e){return this._pendingResolutions.delete(e)}GetRegisteredServiceNamesForLogs(){const e=[...this._services.keys()].sort();return 0===e.length?"<none>":e.join(", ")}}u.ServiceName="DependencyContainer",u.IsInitialized=!1;class l{GetServiceName(){return l.ServiceName}GetResourceName(e,t){return`_exalus_${gy.WorksInContextOf}_${e}_${t}`}Remove(e,t){localStorage.removeItem(this.GetResourceName(e,t))}DropStorage(e){const t=`_exalus_${gy.WorksInContextOf}_${e}`;Object.keys(localStorage).filter((e=>e.startsWith(t))).forEach((e=>{var t;null===(t=u.Log)||void 0===t||t.Warning(l.ServiceName,`Clearing API cache for key: ${e}`),localStorage.removeItem(e)}))}Save(e,t,n){localStorage.setItem(this.GetResourceName(e,t),JSON.stringify(n))}Read(e,t){var n;try{let n=this.GetResourceName(e,t),r=localStorage.getItem(n);return null==r?null:JSON.parse(r)}catch(r){return null===(n=u.Log)||void 0===n||n.Error(l.ServiceName,`Exception has occurred while reading ${this.GetResourceName(e,t)}`),null}}}l.ServiceName="LocalStorageService",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"}(n||(n={})),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"}(r||(r={}));class d{static write(e){return`${e}${d.RecordSeparator}`}static parse(e){if(e[e.length-1]!==d.RecordSeparator)throw new Error("Message is incomplete.");const t=e.split(d.RecordSeparator);return t.pop(),t}}d.RecordSeparatorCode=30,d.RecordSeparator=String.fromCharCode(d.RecordSeparatorCode);class h{constructor(){}log(e,t){}}h.instance=new h;class p{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 g{static get isBrowser(){return!g.isNode&&"object"==typeof window&&"object"==typeof window.document}static get isWebWorker(){return!g.isNode&&"object"==typeof self&&"importScripts"in self}static get isReactNative(){return!g.isNode&&"object"==typeof window&&void 0===window.document}static get isNode(){return"undefined"!=typeof process&&process.release&&"node"===process.release.name}}function f(e,t){let n="";return v(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 v(e){return e&&"undefined"!=typeof ArrayBuffer&&(e instanceof ArrayBuffer||e.constructor&&"ArrayBuffer"===e.constructor.name)}async function y(e,t,n,s,o,i){const a={},[c,u]=S();a[c]=u,e.log(r.Trace,`(${t} transport) sending data. ${f(o,i.logMessageContent)}.`);const l=v(o)?"arraybuffer":"text",d=await n.post(s,{content:o,headers:{...a,...i.headers},responseType:l,timeout:i.timeout,withCredentials:i.withCredentials});e.log(r.Trace,`(${t} transport) request complete. Response status: ${d.statusCode}.`)}class m{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 w{constructor(e){this._minLevel=e,this.out=console}log(e,t){if(e>=this._minLevel){const n=`[${(new Date).toISOString()}] ${r[e]}: ${t}`;switch(e){case r.Critical:case r.Error:this.out.error(n);break;case r.Warning:this.out.warn(n);break;case r.Information:this.out.info(n);break;default:this.out.log(n)}}}}function S(){let e="X-SignalR-User-Agent";return g.isNode&&(e="User-Agent"),[e,A("8.0.7",_(),g.isNode?"NodeJS":"Browser",C())]}function A(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 _(){if(!g.isNode)return"";switch(process.platform){case"win32":return"Windows NT";case"darwin":return"macOS";case"linux":return"Linux";default:return process.platform}}function C(){if(g.isNode)return process.versions.node}function T(e){return e.stack?e.stack:e.message?e.message:`${e}`}class D{writeHandshakeRequest(e){return d.write(JSON.stringify(e))}parseHandshakeResponse(e){let t,n;if(v(e)){const r=new Uint8Array(e),s=r.indexOf(d.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(d.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=d.parse(t),s=JSON.parse(r[0]);if(s.type)throw new Error("Expected a handshake response from the server.");return[n,s]}}class k extends Error{constructor(e,t){const n=new.target.prototype;super(`${e}: Status code '${t}'`),this.statusCode=t,this.__proto__=n}}class I extends Error{constructor(e="A timeout occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class E extends Error{constructor(e="An abort occurred."){const t=new.target.prototype;super(e),this.__proto__=t}}class b extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="UnsupportedTransportError",this.__proto__=n}}class N extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="DisabledTransportError",this.__proto__=n}}class G extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.transport=t,this.errorType="FailedToStartTransportError",this.__proto__=n}}class R extends Error{constructor(e){const t=new.target.prototype;super(e),this.errorType="FailedToNegotiateWithServerError",this.__proto__=t}}class P extends Error{constructor(e,t){const n=new.target.prototype;super(e),this.innerErrors=t,this.__proto__=n}}!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"}(s||(s={}));class U{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 m(this,e)}}class O{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=()=>{};v(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 M(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,v(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===s.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:s.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 s.Invocation:case s.StreamItem:case s.Completion:case s.StreamInvocation:case s.CancelInvocation:return!0;case s.Close:case s.Sequence:case s.Ping:case s.Ack:return!1}}_ackTimer(){void 0===this._ackTimerHandle&&(this._ackTimerHandle=setTimeout((async()=>{try{this._reconnectInProgress||await this._connection.send(this._protocol.writeMessage({type:s.Ack,sequenceId:this._latestReceivedSequenceId}))}catch{}clearTimeout(this._ackTimerHandle),this._ackTimerHandle=void 0}),1e3))}}class M{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"}(o||(o={}));class x{static create(e,t,n,r,s,o,i){return new x(e,t,n,r,s,o,i)}constructor(e,t,n,i,a,c,u){this._nextKeepAlive=0,this._freezeEventListener=()=>{this._logger.log(r.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")},p.isRequired(e,"connection"),p.isRequired(t,"logger"),p.isRequired(n,"protocol"),this.serverTimeoutInMilliseconds=null!=a?a:3e4,this.keepAliveIntervalInMilliseconds=null!=c?c:15e3,this._statefulReconnectBufferSize=null!=u?u:1e5,this._logger=t,this._protocol=n,this.connection=e,this._reconnectPolicy=i,this._handshakeProtocol=new D,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=o.Disconnected,this._connectionStarted=!1,this._cachedPingMessage=this._protocol.writeMessage({type:s.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!==o.Disconnected&&this._connectionState!==o.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!==o.Disconnected)return Promise.reject(new Error("Cannot start a HubConnection that is not in the 'Disconnected' state."));this._connectionState=o.Connecting,this._logger.log(r.Debug,"Starting HubConnection.");try{await this._startInternal(),g.isBrowser&&window.document.addEventListener("freeze",this._freezeEventListener),this._connectionState=o.Connected,this._connectionStarted=!0,this._logger.log(r.Debug,"HubConnection connected successfully.")}catch(e){return this._connectionState=o.Disconnected,this._logger.log(r.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(r.Debug,"Sending handshake request."),await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(n)),this._logger.log(r.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 O(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(r.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===o.Disconnected)return this._logger.log(r.Debug,`Call to HubConnection.stop(${e}) ignored because it is already in the disconnected state.`),Promise.resolve();if(this._connectionState===o.Disconnecting)return this._logger.log(r.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=o.Disconnecting,this._logger.log(r.Debug,"Stopping HubConnection."),this._reconnectDelayHandle?(this._logger.log(r.Debug,"Connection stopped during reconnect delay. Done reconnecting."),clearTimeout(this._reconnectDelayHandle),this._reconnectDelayHandle=void 0,this._completeClose(),Promise.resolve()):(t===o.Connected&&this._sendCloseMessage(),this._cleanupTimeout(),this._cleanupPingTimer(),this._stopDuringStartError=e||new E("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),o=this._createStreamInvocation(e,t,r);let i;const a=new U;return a.cancelCallback=()=>{const e=this._createCancelInvocation(o.invocationId);return delete this._callbacks[o.invocationId],i.then((()=>this._sendWithProtocol(e)))},this._callbacks[o.invocationId]=(e,t)=>{t?a.error(t):e&&(e.type===s.Completion?e.error?a.error(new Error(e.error)):a.complete():a.next(e.item))},i=this._sendWithProtocol(o).catch((e=>{a.error(e),delete this._callbacks[o.invocationId]})),this._launchStreams(n,i),a}_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),o=this._createInvocation(e,t,!1,r);return new Promise(((e,t)=>{this._callbacks[o.invocationId]=(n,r)=>{r?t(r):n&&(n.type===s.Completion?n.error?t(new Error(n.error)):e(n.result):t(new Error(`Unexpected message type: ${n.type}`)))};const r=this._sendWithProtocol(o).catch((e=>{t(e),delete this._callbacks[o.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 s.Invocation:this._invokeClientMethod(e).catch((e=>{this._logger.log(r.Error,`Invoke client method threw error: ${T(e)}`)}));break;case s.StreamItem:case s.Completion:{const t=this._callbacks[e.invocationId];if(t){e.type===s.Completion&&delete this._callbacks[e.invocationId];try{t(e)}catch(e){this._logger.log(r.Error,`Stream callback threw error: ${T(e)}`)}}break}case s.Ping:break;case s.Close:{this._logger.log(r.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 s.Ack:this._messageBuffer&&this._messageBuffer._ack(e);break;case s.Sequence:this._messageBuffer&&this._messageBuffer._resetSequence(e);break;default:this._logger.log(r.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(r.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(r.Error,e);const n=new Error(e);throw this._handshakeRejecter(n),n}return this._logger.log(r.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===o.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(r.Warning,`No client method with the name '${t}' found.`),void(e.invocationId&&(this._logger.log(r.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 s=n.slice(),o=!!e.invocationId;let i,a,c;for(const n of s)try{const s=i;i=await n.apply(this,e.arguments),o&&i&&s&&(this._logger.log(r.Error,`Multiple results provided for '${t}'. Sending error to server.`),c=this._createCompletionMessage(e.invocationId,"Client provided multiple results.",null)),a=void 0}catch(e){a=e,this._logger.log(r.Error,`A callback for the method '${t}' threw error '${e}'.`)}c?await this._sendWithProtocol(c):o?(a?c=this._createCompletionMessage(e.invocationId,`${a}`,null):void 0!==i?c=this._createCompletionMessage(e.invocationId,null,i):(this._logger.log(r.Warning,`No result given for '${t}' method and invocation ID '${e.invocationId}'.`),c=this._createCompletionMessage(e.invocationId,"Client didn't provide a result.",null)),await this._sendWithProtocol(c)):i&&this._logger.log(r.Error,`Result given for '${t}' method but server is not expecting a result.`)}_connectionClosed(e){this._logger.log(r.Debug,`HubConnection.connectionClosed(${e}) called while in state ${this._connectionState}.`),this._stopDuringStartError=this._stopDuringStartError||e||new E("The underlying connection was closed before the hub handshake could complete."),this._handshakeResolver&&this._handshakeResolver(),this._cancelCallbacksWithError(e||new Error("Invocation canceled due to the underlying connection being closed.")),this._cleanupTimeout(),this._cleanupPingTimer(),this._connectionState===o.Disconnecting?this._completeClose(e):this._connectionState===o.Connected&&this._reconnectPolicy?this._reconnect(e):this._connectionState===o.Connected&&this._completeClose(e)}_completeClose(e){if(this._connectionStarted){this._connectionState=o.Disconnected,this._connectionStarted=!1,this._messageBuffer&&(this._messageBuffer._dispose(null!=e?e:new Error("Connection closed.")),this._messageBuffer=void 0),g.isBrowser&&window.document.removeEventListener("freeze",this._freezeEventListener);try{this._closedCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(r.Error,`An onclose callback called with error '${e}' threw error '${t}'.`)}}}async _reconnect(e){const t=Date.now();let n=0,s=void 0!==e?e:new Error("Attempting to reconnect due to a unknown error."),i=this._getNextRetryDelay(n++,0,s);if(null===i)return this._logger.log(r.Debug,"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt."),void this._completeClose(e);if(this._connectionState=o.Reconnecting,e?this._logger.log(r.Information,`Connection reconnecting because of error '${e}'.`):this._logger.log(r.Information,"Connection reconnecting."),0!==this._reconnectingCallbacks.length){try{this._reconnectingCallbacks.forEach((t=>t.apply(this,[e])))}catch(t){this._logger.log(r.Error,`An onreconnecting callback called with error '${e}' threw error '${t}'.`)}if(this._connectionState!==o.Reconnecting)return void this._logger.log(r.Debug,"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.")}for(;null!==i;){if(this._logger.log(r.Information,`Reconnect attempt number ${n} will start in ${i} ms.`),await new Promise((e=>{this._reconnectDelayHandle=setTimeout(e,i)})),this._reconnectDelayHandle=void 0,this._connectionState!==o.Reconnecting)return void this._logger.log(r.Debug,"Connection left the reconnecting state during reconnect delay. Done reconnecting.");try{if(await this._startInternal(),this._connectionState=o.Connected,this._logger.log(r.Information,"HubConnection reconnected successfully."),0!==this._reconnectedCallbacks.length)try{this._reconnectedCallbacks.forEach((e=>e.apply(this,[this.connection.connectionId])))}catch(e){this._logger.log(r.Error,`An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`)}return}catch(e){if(this._logger.log(r.Information,`Reconnect attempt failed because of error '${e}'.`),this._connectionState!==o.Reconnecting)return this._logger.log(r.Debug,`Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`),void(this._connectionState===o.Disconnecting&&this._completeClose());s=e instanceof Error?e:new Error(e.toString()),i=this._getNextRetryDelay(n++,Date.now()-t,s)}}this._logger.log(r.Information,`Reconnect retries have been exhausted after ${Date.now()-t} ms and ${n} failed attempts. Connection disconnecting.`),this._completeClose()}_getNextRetryDelay(e,t,n){try{return this._reconnectPolicy.nextRetryDelayInMilliseconds({elapsedMilliseconds:t,previousRetryCount:e,retryReason:n})}catch(n){return this._logger.log(r.Error,`IRetryPolicy.nextRetryDelayInMilliseconds(${e}, ${t}) threw error '${n}'.`),null}}_cancelCallbacksWithError(e){const t=this._callbacks;this._callbacks={},Object.keys(t).forEach((n=>{const s=t[n];try{s(null,e)}catch(t){this._logger.log(r.Error,`Stream 'error' callback called with '${e}' threw error: ${T(t)}`)}}))}_cleanupPingTimer(){this._pingServerHandle&&(clearTimeout(this._pingServerHandle),this._pingServerHandle=void 0)}_cleanupTimeout(){this._timeoutHandle&&clearTimeout(this._timeoutHandle)}_createInvocation(e,t,n,r){if(n)return 0!==r.length?{arguments:t,streamIds:r,target:e,type:s.Invocation}:{arguments:t,target:e,type:s.Invocation};{const n=this._invocationId;return this._invocationId++,0!==r.length?{arguments:t,invocationId:n.toString(),streamIds:r,target:e,type:s.Invocation}:{arguments:t,invocationId:n.toString(),target:e,type:s.Invocation}}}_launchStreams(e,t){if(0!==e.length){t||(t=Promise.resolve());for(const n in e)e[n].subscribe({complete:()=>{t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n))))},error:e=>{let r;r=e instanceof Error?e.message:e&&e.toString?e.toString():"Unknown error",t=t.then((()=>this._sendWithProtocol(this._createCompletionMessage(n,r))))},next:e=>{t=t.then((()=>this._sendWithProtocol(this._createStreamItemMessage(n,e))))}})}}_replaceStreamingParams(e){const t=[],n=[];for(let r=0;r<e.length;r++){const s=e[r];if(this._isObservable(s)){const o=this._invocationId;this._invocationId++,t[o]=s,n.push(o.toString()),e.splice(r,1)}}return[t,n]}_isObservable(e){return e&&e.subscribe&&"function"==typeof e.subscribe}_createStreamInvocation(e,t,n){const r=this._invocationId;return this._invocationId++,0!==n.length?{arguments:t,invocationId:r.toString(),streamIds:n,target:e,type:s.StreamInvocation}:{arguments:t,invocationId:r.toString(),target:e,type:s.StreamInvocation}}_createCancelInvocation(e){return{invocationId:e,type:s.CancelInvocation}}_createStreamItemMessage(e,t){return{invocationId:e,item:t,type:s.StreamItem}}_createCompletionMessage(e,t,n){return t?{error:t,invocationId:e,type:s.Completion}:{invocationId:e,result:n,type:s.Completion}}_createCloseMessage(){return{type:s.Close}}}const F=[0,2e3,1e4,3e4,null];class L{constructor(e){this._retryDelays=void 0!==e?[...e,null]:F}nextRetryDelayInMilliseconds(e){return this._retryDelays[e.previousRetryCount]}}class B{}B.Authorization="Authorization",B.Cookie="Cookie";class W{constructor(e,t,n){this.statusCode=e,this.statusText=t,this.content=n}}class ${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 V extends ${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[B.Authorization]=`Bearer ${this._accessToken}`:this._accessTokenFactory&&e.headers[B.Authorization]&&delete e.headers[B.Authorization]}getCookieString(e){return this._innerClient.getCookieString(e)}}class q extends ${constructor(e){if(super(),this._logger=e,"undefined"==typeof fetch||g.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!==i.g)return i.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 E;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 E});let s,o=null;if(e.timeout){const s=e.timeout;o=setTimeout((()=>{t.abort(),this._logger.log(r.Warning,"Timeout from HTTP request."),n=new I}),s)}""===e.content&&(e.content=void 0),e.content&&(e.headers=e.headers||{},v(e.content)?e.headers["Content-Type"]="application/octet-stream":e.headers["Content-Type"]="text/plain;charset=UTF-8");try{s=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(r.Warning,`Error from HTTP request. ${e}.`),e}finally{o&&clearTimeout(o),e.abortSignal&&(e.abortSignal.onabort=null)}if(!s.ok){const e=await H(s,"text");throw new k(e||s.statusText,s.status)}const i=H(s,e.responseType),a=await i;return new W(s.status,s.statusText,a)}getCookieString(e){let t="";return g.isNode&&this._jar&&this._jar.getCookies(e,((e,n)=>t=n.join("; "))),t}}function H(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 K extends ${constructor(e){super(),this._logger=e}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new E):e.method?e.url?new Promise(((t,n)=>{const s=new XMLHttpRequest;s.open(e.method,e.url,!0),s.withCredentials=void 0===e.withCredentials||e.withCredentials,s.setRequestHeader("X-Requested-With","XMLHttpRequest"),""===e.content&&(e.content=void 0),e.content&&(v(e.content)?s.setRequestHeader("Content-Type","application/octet-stream"):s.setRequestHeader("Content-Type","text/plain;charset=UTF-8"));const o=e.headers;o&&Object.keys(o).forEach((e=>{s.setRequestHeader(e,o[e])})),e.responseType&&(s.responseType=e.responseType),e.abortSignal&&(e.abortSignal.onabort=()=>{s.abort(),n(new E)}),e.timeout&&(s.timeout=e.timeout),s.onload=()=>{e.abortSignal&&(e.abortSignal.onabort=null),s.status>=200&&s.status<300?t(new W(s.status,s.statusText,s.response||s.responseText)):n(new k(s.response||s.responseText||s.statusText,s.status))},s.onerror=()=>{this._logger.log(r.Warning,`Error from HTTP request. ${s.status}: ${s.statusText}.`),n(new k(s.statusText,s.status))},s.ontimeout=()=>{this._logger.log(r.Warning,"Timeout from HTTP request."),n(new I)},s.send(e.content)})):Promise.reject(new Error("No url defined.")):Promise.reject(new Error("No method defined."))}}class j extends ${constructor(e){if(super(),"undefined"!=typeof fetch||g.isNode)this._httpClient=new q(e);else{if("undefined"==typeof XMLHttpRequest)throw new Error("No usable HttpClient found.");this._httpClient=new K(e)}}send(e){return e.abortSignal&&e.abortSignal.aborted?Promise.reject(new E):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)}}class z{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 J{get pollAborted(){return this._pollAbort.aborted}constructor(e,t,n){this._httpClient=e,this._logger=t,this._pollAbort=new z,this._options=n,this._running=!1,this.onreceive=null,this.onclose=null}async connect(e,t){if(p.isRequired(e,"url"),p.isRequired(t,"transferFormat"),p.isIn(t,n,"transferFormat"),this._url=e,this._logger.log(r.Trace,"(LongPolling transport) Connecting."),t===n.Binary&&"undefined"!=typeof XMLHttpRequest&&"string"!=typeof(new XMLHttpRequest).responseType)throw new Error("Binary protocols over XmlHttpRequest not implementing advanced features are not supported.");const[s,o]=S(),i={[s]:o,...this._options.headers},a={abortSignal:this._pollAbort.signal,headers:i,timeout:1e5,withCredentials:this._options.withCredentials};t===n.Binary&&(a.responseType="arraybuffer");const c=`${e}&_=${Date.now()}`;this._logger.log(r.Trace,`(LongPolling transport) polling: ${c}.`);const u=await this._httpClient.get(c,a);200!==u.statusCode?(this._logger.log(r.Error,`(LongPolling transport) Unexpected response code: ${u.statusCode}.`),this._closeError=new k(u.statusText||"",u.statusCode),this._running=!1):this._running=!0,this._receiving=this._poll(this._url,a)}async _poll(e,t){try{for(;this._running;)try{const n=`${e}&_=${Date.now()}`;this._logger.log(r.Trace,`(LongPolling transport) polling: ${n}.`);const s=await this._httpClient.get(n,t);204===s.statusCode?(this._logger.log(r.Information,"(LongPolling transport) Poll terminated by server."),this._running=!1):200!==s.statusCode?(this._logger.log(r.Error,`(LongPolling transport) Unexpected response code: ${s.statusCode}.`),this._closeError=new k(s.statusText||"",s.statusCode),this._running=!1):s.content?(this._logger.log(r.Trace,`(LongPolling transport) data received. ${f(s.content,this._options.logMessageContent)}.`),this.onreceive&&this.onreceive(s.content)):this._logger.log(r.Trace,"(LongPolling transport) Poll timed out, reissuing.")}catch(e){this._running?e instanceof I?this._logger.log(r.Trace,"(LongPolling transport) Poll timed out, reissuing."):(this._closeError=e,this._running=!1):this._logger.log(r.Trace,`(LongPolling transport) Poll errored after shutdown: ${e.message}`)}}finally{this._logger.log(r.Trace,"(LongPolling transport) Polling complete."),this.pollAborted||this._raiseOnClose()}}async send(e){return this._running?y(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(r.Trace,"(LongPolling transport) Stopping polling."),this._running=!1,this._pollAbort.abort();try{await this._receiving,this._logger.log(r.Trace,`(LongPolling transport) sending DELETE request to ${this._url}.`);const e={},[t,n]=S();e[t]=n;const s={headers:{...e,...this._options.headers},timeout:this._options.timeout,withCredentials:this._options.withCredentials};let o;try{await this._httpClient.delete(this._url,s)}catch(e){o=e}o?o instanceof k&&(404===o.statusCode?this._logger.log(r.Trace,"(LongPolling transport) A 404 response was returned from sending a DELETE request."):this._logger.log(r.Trace,`(LongPolling transport) Error sending a DELETE request: ${o}`)):this._logger.log(r.Trace,"(LongPolling transport) DELETE request accepted.")}finally{this._logger.log(r.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(r.Trace,e),this.onclose(this._closeError)}}}class X{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 p.isRequired(e,"url"),p.isRequired(t,"transferFormat"),p.isIn(t,n,"transferFormat"),this._logger.log(r.Trace,"(SSE transport) Connecting."),this._url=e,this._accessToken&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(this._accessToken)}`),new Promise(((s,o)=>{let i,a=!1;if(t===n.Text){if(g.isBrowser||g.isWebWorker)i=new this._options.EventSource(e,{withCredentials:this._options.withCredentials});else{const t=this._httpClient.getCookieString(e),n={};n.Cookie=t;const[r,s]=S();n[r]=s,i=new this._options.EventSource(e,{withCredentials:this._options.withCredentials,headers:{...n,...this._options.headers}})}try{i.onmessage=e=>{if(this.onreceive)try{this._logger.log(r.Trace,`(SSE transport) data received. ${f(e.data,this._options.logMessageContent)}.`),this.onreceive(e.data)}catch(e){return void this._close(e)}},i.onerror=e=>{a?this._close():o(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."))},i.onopen=()=>{this._logger.log(r.Information,`SSE connected to ${this._url}`),this._eventSource=i,a=!0,s()}}catch(e){return void o(e)}}else o(new Error("The Server-Sent Events transport only supports the 'Text' transfer format"))}))}async send(e){return this._eventSource?y(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 Y{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 s;return p.isRequired(e,"url"),p.isRequired(t,"transferFormat"),p.isIn(t,n,"transferFormat"),this._logger.log(r.Trace,"(WebSockets transport) Connecting."),this._accessTokenFactory&&(s=await this._accessTokenFactory()),new Promise(((o,i)=>{let a;e=e.replace(/^http/,"ws");const c=this._httpClient.getCookieString(e);let u=!1;if(g.isNode||g.isReactNative){const t={},[n,r]=S();t[n]=r,s&&(t[B.Authorization]=`Bearer ${s}`),c&&(t[B.Cookie]=c),a=new this._webSocketConstructor(e,void 0,{headers:{...t,...this._headers}})}else s&&(e+=(e.indexOf("?")<0?"?":"&")+`access_token=${encodeURIComponent(s)}`);a||(a=new this._webSocketConstructor(e)),t===n.Binary&&(a.binaryType="arraybuffer"),a.onopen=t=>{this._logger.log(r.Information,`WebSocket connected to ${e}.`),this._webSocket=a,u=!0,o()},a.onerror=e=>{let t=null;t="undefined"!=typeof ErrorEvent&&e instanceof ErrorEvent?e.error:"There was an error with the transport",this._logger.log(r.Information,`(WebSockets transport) ${t}.`)},a.onmessage=e=>{if(this._logger.log(r.Trace,`(WebSockets transport) data received. ${f(e.data,this._logMessageContent)}.`),this.onreceive)try{this.onreceive(e.data)}catch(e){return void this._close(e)}},a.onclose=e=>{if(u)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.",i(new Error(t))}}}))}send(e){return this._webSocket&&this._webSocket.readyState===this._webSocketConstructor.OPEN?(this._logger.log(r.Trace,`(WebSockets transport) sending data. ${f(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(r.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 Q{constructor(e,t={}){var n;if(this._stopPromiseResolver=()=>{},this.features={},this._negotiateVersion=1,p.isRequired(e,"url"),this._logger=void 0===(n=t.logger)?new w(r.Information):null===n?h.instance:void 0!==n.log?n:new w(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 s=null,o=null;if(g.isNode){const e=require;s=e("ws"),o=e("eventsource")}g.isNode||"undefined"==typeof WebSocket||t.WebSocket?g.isNode&&!t.WebSocket&&s&&(t.WebSocket=s):t.WebSocket=WebSocket,g.isNode||"undefined"==typeof EventSource||t.EventSource?g.isNode&&!t.EventSource&&void 0!==o&&(t.EventSource=o):t.EventSource=EventSource,this._httpClient=new V(t.httpClient||new j(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||n.Binary,p.isIn(e,n,"transferFormat"),this._logger.log(r.Debug,`Starting connection with transfer format '${n[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(r.Error,e),await this._stopPromise,Promise.reject(new E(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(r.Error,e),Promise.reject(new E(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 Z(this.transport)),this._sendQueue.send(e))}async stop(e){return"Disconnected"===this._connectionState?(this._logger.log(r.Debug,`Call to HttpConnection.stop(${e}) ignored because the connection is already in the disconnected state.`),Promise.resolve()):"Disconnecting"===this._connectionState?(this._logger.log(r.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(r.Error,`HttpConnection.transport.stop() threw error '${e}'.`),this._stopConnection()}this.transport=void 0}else this._logger.log(r.Debug,"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.")}async _startInternal(e){let n=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(n,e)}else{let t=null,r=0;do{if(t=await this._getNegotiationResponse(n),"Disconnecting"===this._connectionState||"Disconnected"===this._connectionState)throw new E("The connection was stopped during negotiation.");if(t.error)throw new Error(t.error);if(t.ProtocolVersion)throw new Error("Detected a connection attempt