{"version":3,"sources":["webpack:///./node_modules/@microsoft/signalr/dist/esm/ILogger.js","webpack:///./src/signalr/index.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/Utils.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/Loggers.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/Errors.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/HttpClient.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/Subject.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/HubConnection.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/HeaderNames.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/ITransport.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/AbortController.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/HttpConnection.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js","webpack:///./node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js"],"names":["LogLevel","signalR","require","SignalRConnection","initialize","hub","signalUrl","this","_connection","HubConnectionBuilder","withUrl","configureLogging","Information","build","callback","start","err","console","log","stop","invoke","method","params","on","event","result","VERSION","Arg","val","name","undefined","Error","match","values","Platform","window","document","self","isBrowser","isWebWorker","isReactNative","getDataDetail","data","includeContent","detail","isArrayBuffer","byteLength","formatArrayBuffer","length","view","Uint8Array","str","forEach","num","pad","toString","substr","ArrayBuffer","constructor","async","sendMessage","logger","transportName","httpClient","url","content","options","headers","value","getUserAgentHeader","Trace","logMessageContent","responseType","response","post","timeout","withCredentials","statusCode","createLogger","ConsoleLogger","instance","SubjectSubscription","subject","observer","_subject","_observer","index","observers","indexOf","splice","cancelCallback","catch","_","minimumLogLevel","_minLevel","out","logLevel","message","msg","Date","toISOString","Critical","error","Warning","warn","info","userAgentHeaderName","isNode","constructUserAgent","getOsName","getRuntime","getRuntimeVersion","version","os","runtime","runtimeVersion","userAgent","majorAndMinor","split","process","platform","versions","node","getErrorString","e","stack","getGlobalThis","globalThis","global","NullLogger","_logLevel","_message","HttpError","errorMessage","trueProto","prototype","super","__proto__","TimeoutError","AbortError","UnsupportedTransportError","transport","errorType","DisabledTransportError","FailedToStartTransportError","FailedToNegotiateWithServerError","AggregateErrors","innerErrors","HttpResponse","statusText","HttpClient","send","MessageType","_logger","fetch","requireFunc","_jar","CookieJar","_fetchType","bind","AbortController","_abortControllerType","request","abortSignal","aborted","abortController","onabort","abort","timeoutId","msTimeout","setTimeout","body","cache","credentials","mode","redirect","signal","clearTimeout","ok","deserializeContent","status","payload","cookies","getCookies","c","join","arrayBuffer","text","Promise","reject","resolve","xhr","XMLHttpRequest","open","setRequestHeader","Object","keys","header","onload","responseText","onerror","ontimeout","_httpClient","getCookieString","TextMessageFormat","output","RecordSeparator","input","messages","pop","RecordSeparatorCode","String","fromCharCode","handshakeRequest","write","JSON","stringify","messageData","remainingData","binaryData","separatorIndex","responseLength","apply","Array","slice","call","buffer","textData","substring","parse","type","responseMessage","item","next","complete","push","DEFAULT_TIMEOUT_IN_MS","DEFAULT_PING_INTERVAL_IN_MS","HubConnectionState","connection","protocol","reconnectPolicy","_nextKeepAlive","_freezeEventListener","isRequired","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","_protocol","_reconnectPolicy","_handshakeProtocol","onreceive","_processIncomingData","onclose","_connectionClosed","_callbacks","_methods","_closedCallbacks","_reconnectingCallbacks","_reconnectedCallbacks","_invocationId","_receivedHandshakeResponse","_connectionState","Disconnected","_connectionStarted","_cachedPingMessage","writeMessage","Ping","connectionId","baseUrl","Reconnecting","_startPromise","_startWithStateTransitions","Connecting","Debug","_startInternal","addEventListener","Connected","_stopDuringStartError","handshakePromise","_handshakeResolver","_handshakeRejecter","transferFormat","_sendMessage","writeHandshakeRequest","_cleanupTimeout","_resetTimeoutPeriod","_resetKeepAliveInterval","features","inherentKeepAlive","_cleanupPingTimer","startPromise","_stopPromise","_stopInternal","Disconnecting","_reconnectDelayHandle","_completeClose","methodName","args","streams","streamIds","_replaceStreamingParams","invocationDescriptor","_createStreamInvocation","promiseQueue","cancelInvocation","_createCancelInvocation","invocationId","then","_sendWithProtocol","invocationEvent","Completion","_launchStreams","sendPromise","_createInvocation","p","newMethod","toLowerCase","handlers","removeIdx","_processHandshakeResponse","parseMessages","Invocation","_invokeClientMethod","StreamItem","Close","allowReconnect","parseHandshakeResponse","getTime","_timeoutHandle","serverTimeout","_pingServerHandle","nextPing","invocationMessage","target","methods","_createCompletionMessage","methodsCopy","expectsResponse","res","exception","completionMessage","m","prevRes","arguments","_cancelCallbacksWithError","_reconnect","removeEventListener","reconnectStartTime","now","previousReconnectAttempts","retryError","nextRetryDelay","_getNextRetryDelay","previousRetryCount","elapsedMilliseconds","retryReason","nextRetryDelayInMilliseconds","callbacks","key","nonblocking","streamId","subscribe","_createStreamItemMessage","i","argument","_isObservable","arg","StreamInvocation","id","CancelInvocation","DEFAULT_RETRY_DELAYS_IN_MILLISECONDS","DefaultReconnectPolicy","retryDelays","_retryDelays","retryContext","HeaderNames","Authorization","Cookie","innerClient","accessTokenFactory","_innerClient","_accessTokenFactory","allowRetry","_accessToken","_setAuthorizationHeader","HttpTransportType","TransferFormat","_isAborted","_pollAbort","_options","_running","isIn","_url","Binary","pollOptions","pollUrl","get","_closeError","_receiving","_poll","pollAborted","_raiseOnClose","deleteOptions","delete","logMessage","accessToken","encodeURIComponent","eventSource","opened","Text","EventSource","onmessage","_close","onopen","_eventSource","close","webSocketConstructor","_logMessageContent","_webSocketConstructor","_headers","token","webSocket","replace","binaryType","_event","_webSocket","ErrorEvent","readyState","OPEN","_isCloseEvent","wasClean","code","reason","MAX_REDIRECTS","_stopPromiseResolver","_negotiateVersion","_resolveUrl","webSocketModule","eventSourceModule","WebSocket","_startInternalPromise","_sendQueue","TransportSendQueue","_stopError","_stopConnection","skipNegotiation","WebSockets","_constructTransport","_startTransport","negotiateResponse","redirects","_getNegotiationResponse","ProtocolVersion","_createTransport","negotiateUrl","_resolveNegotiateUrl","negotiateVersion","connectionToken","requestedTransport","requestedTransferFormat","connectUrl","_createConnectUrl","_isITransport","transportExceptions","transports","availableTransports","negotiate","endpoint","transportOrError","_resolveTransportOrError","ex","ServerSentEvents","LongPolling","connect","transportMatches","transferFormats","map","s","lastIndexOf","aTag","createElement","href","actualTransport","_transport","_buffer","_executing","_sendBufferedData","PromiseSource","_transportResult","_sendLoopPromise","_sendLoop","_bufferData","promise","transportResult","_concatBuffers","arrayBuffers","totalLength","b","reduce","a","offset","set","_resolver","_rejecter","JSON_HUB_PROTOCOL_NAME","hubMessages","parsedMessage","_isInvocationMessage","_isStreamItemMessage","_isCompletionMessage","_assertNotEmptyString","LogLevelNameMapping","trace","debug","information","warning","critical","none","None","parseLogLevel","mapping","logging","isLogger","transportTypeOrOptions","isNotEmpty","httpConnectionOptions","retryDelaysOrReconnectPolicy","isArray","create"],"mappings":"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","file":"chunk-47adaaa8.15ab4bf7.js","sourcesContent":["// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// These values are designed to match the ASP.NET Log Levels since that's the pattern we're emulating here.\r\n/** Indicates the severity of a log message.\r\n *\r\n * Log Levels are ordered in increasing severity. So `Debug` is more severe than `Trace`, etc.\r\n */\r\nexport var LogLevel;\r\n(function (LogLevel) {\r\n /** Log level for very low severity diagnostic messages. */\r\n LogLevel[LogLevel[\"Trace\"] = 0] = \"Trace\";\r\n /** Log level for low severity diagnostic messages. */\r\n LogLevel[LogLevel[\"Debug\"] = 1] = \"Debug\";\r\n /** Log level for informational diagnostic messages. */\r\n LogLevel[LogLevel[\"Information\"] = 2] = \"Information\";\r\n /** Log level for diagnostic messages that indicate a non-fatal problem. */\r\n LogLevel[LogLevel[\"Warning\"] = 3] = \"Warning\";\r\n /** Log level for diagnostic messages that indicate a failure in the current operation. */\r\n LogLevel[LogLevel[\"Error\"] = 4] = \"Error\";\r\n /** Log level for diagnostic messages that indicate a failure that will terminate the entire application. */\r\n LogLevel[LogLevel[\"Critical\"] = 5] = \"Critical\";\r\n /** The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted. */\r\n LogLevel[LogLevel[\"None\"] = 6] = \"None\";\r\n})(LogLevel || (LogLevel = {}));\r\n//# sourceMappingURL=ILogger.js.map","const signalR = require(\"@microsoft/signalr\");\n\nclass SignalRConnection {\n initialize(hub, signalUrl) {\n if (!this._connection) {\n this._connection = new signalR.HubConnectionBuilder()\n .withUrl(signalUrl + `/` + hub)\n .configureLogging(signalR.LogLevel.Information)\n .build();\n }\n }\n async start(callback) {\n try {\n await this._connection.start();\n callback();\n } catch (err) {\n console.log(err);\n }\n }\n async stop() {\n try {\n await this._connection.stop();\n } catch (err) {\n console.log(err);\n }\n }\n invoke(method, ...params) {\n this._connection.invoke(method, ...params);\n }\n on(event, callback) {\n this._connection.on(event, result => {\n callback(result);\n });\n }\n}\n\nexport default SignalRConnection;\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { NullLogger } from \"./Loggers\";\r\n// Version token that will be replaced by the prepack command\r\n/** The version of the SignalR client. */\r\nexport const VERSION = \"7.0.0\";\r\n/** @private */\r\nexport class Arg {\r\n static isRequired(val, name) {\r\n if (val === null || val === undefined) {\r\n throw new Error(`The '${name}' argument is required.`);\r\n }\r\n }\r\n static isNotEmpty(val, name) {\r\n if (!val || val.match(/^\\s*$/)) {\r\n throw new Error(`The '${name}' argument should not be empty.`);\r\n }\r\n }\r\n static isIn(val, values, name) {\r\n // TypeScript enums have keys for **both** the name and the value of each enum member on the type itself.\r\n if (!(val in values)) {\r\n throw new Error(`Unknown ${name} value: ${val}.`);\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport class Platform {\r\n // react-native has a window but no document so we should check both\r\n static get isBrowser() {\r\n return typeof window === \"object\" && typeof window.document === \"object\";\r\n }\r\n // WebWorkers don't have a window object so the isBrowser check would fail\r\n static get isWebWorker() {\r\n return typeof self === \"object\" && \"importScripts\" in self;\r\n }\r\n // react-native has a window but no document\r\n static get isReactNative() {\r\n return typeof window === \"object\" && typeof window.document === \"undefined\";\r\n }\r\n // Node apps shouldn't have a window object, but WebWorkers don't either\r\n // so we need to check for both WebWorker and window\r\n static get isNode() {\r\n return !this.isBrowser && !this.isWebWorker && !this.isReactNative;\r\n }\r\n}\r\n/** @private */\r\nexport function getDataDetail(data, includeContent) {\r\n let detail = \"\";\r\n if (isArrayBuffer(data)) {\r\n detail = `Binary data of length ${data.byteLength}`;\r\n if (includeContent) {\r\n detail += `. Content: '${formatArrayBuffer(data)}'`;\r\n }\r\n }\r\n else if (typeof data === \"string\") {\r\n detail = `String data of length ${data.length}`;\r\n if (includeContent) {\r\n detail += `. Content: '${data}'`;\r\n }\r\n }\r\n return detail;\r\n}\r\n/** @private */\r\nexport function formatArrayBuffer(data) {\r\n const view = new Uint8Array(data);\r\n // Uint8Array.map only supports returning another Uint8Array?\r\n let str = \"\";\r\n view.forEach((num) => {\r\n const pad = num < 16 ? \"0\" : \"\";\r\n str += `0x${pad}${num.toString(16)} `;\r\n });\r\n // Trim of trailing space.\r\n return str.substr(0, str.length - 1);\r\n}\r\n// Also in signalr-protocol-msgpack/Utils.ts\r\n/** @private */\r\nexport function isArrayBuffer(val) {\r\n return val && typeof ArrayBuffer !== \"undefined\" &&\r\n (val instanceof ArrayBuffer ||\r\n // Sometimes we get an ArrayBuffer that doesn't satisfy instanceof\r\n (val.constructor && val.constructor.name === \"ArrayBuffer\"));\r\n}\r\n/** @private */\r\nexport async function sendMessage(logger, transportName, httpClient, url, content, options) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n logger.log(LogLevel.Trace, `(${transportName} transport) sending data. ${getDataDetail(content, options.logMessageContent)}.`);\r\n const responseType = isArrayBuffer(content) ? \"arraybuffer\" : \"text\";\r\n const response = await httpClient.post(url, {\r\n content,\r\n headers: { ...headers, ...options.headers },\r\n responseType,\r\n timeout: options.timeout,\r\n withCredentials: options.withCredentials,\r\n });\r\n logger.log(LogLevel.Trace, `(${transportName} transport) request complete. Response status: ${response.statusCode}.`);\r\n}\r\n/** @private */\r\nexport function createLogger(logger) {\r\n if (logger === undefined) {\r\n return new ConsoleLogger(LogLevel.Information);\r\n }\r\n if (logger === null) {\r\n return NullLogger.instance;\r\n }\r\n if (logger.log !== undefined) {\r\n return logger;\r\n }\r\n return new ConsoleLogger(logger);\r\n}\r\n/** @private */\r\nexport class SubjectSubscription {\r\n constructor(subject, observer) {\r\n this._subject = subject;\r\n this._observer = observer;\r\n }\r\n dispose() {\r\n const index = this._subject.observers.indexOf(this._observer);\r\n if (index > -1) {\r\n this._subject.observers.splice(index, 1);\r\n }\r\n if (this._subject.observers.length === 0 && this._subject.cancelCallback) {\r\n this._subject.cancelCallback().catch((_) => { });\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport class ConsoleLogger {\r\n constructor(minimumLogLevel) {\r\n this._minLevel = minimumLogLevel;\r\n this.out = console;\r\n }\r\n log(logLevel, message) {\r\n if (logLevel >= this._minLevel) {\r\n const msg = `[${new Date().toISOString()}] ${LogLevel[logLevel]}: ${message}`;\r\n switch (logLevel) {\r\n case LogLevel.Critical:\r\n case LogLevel.Error:\r\n this.out.error(msg);\r\n break;\r\n case LogLevel.Warning:\r\n this.out.warn(msg);\r\n break;\r\n case LogLevel.Information:\r\n this.out.info(msg);\r\n break;\r\n default:\r\n // console.debug only goes to attached debuggers in Node, so we use console.log for Trace and Debug\r\n this.out.log(msg);\r\n break;\r\n }\r\n }\r\n }\r\n}\r\n/** @private */\r\nexport function getUserAgentHeader() {\r\n let userAgentHeaderName = \"X-SignalR-User-Agent\";\r\n if (Platform.isNode) {\r\n userAgentHeaderName = \"User-Agent\";\r\n }\r\n return [userAgentHeaderName, constructUserAgent(VERSION, getOsName(), getRuntime(), getRuntimeVersion())];\r\n}\r\n/** @private */\r\nexport function constructUserAgent(version, os, runtime, runtimeVersion) {\r\n // Microsoft SignalR/[Version] ([Detailed Version]; [Operating System]; [Runtime]; [Runtime Version])\r\n let userAgent = \"Microsoft SignalR/\";\r\n const majorAndMinor = version.split(\".\");\r\n userAgent += `${majorAndMinor[0]}.${majorAndMinor[1]}`;\r\n userAgent += ` (${version}; `;\r\n if (os && os !== \"\") {\r\n userAgent += `${os}; `;\r\n }\r\n else {\r\n userAgent += \"Unknown OS; \";\r\n }\r\n userAgent += `${runtime}`;\r\n if (runtimeVersion) {\r\n userAgent += `; ${runtimeVersion}`;\r\n }\r\n else {\r\n userAgent += \"; Unknown Runtime Version\";\r\n }\r\n userAgent += \")\";\r\n return userAgent;\r\n}\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getOsName() {\r\n if (Platform.isNode) {\r\n switch (process.platform) {\r\n case \"win32\":\r\n return \"Windows NT\";\r\n case \"darwin\":\r\n return \"macOS\";\r\n case \"linux\":\r\n return \"Linux\";\r\n default:\r\n return process.platform;\r\n }\r\n }\r\n else {\r\n return \"\";\r\n }\r\n}\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getRuntimeVersion() {\r\n if (Platform.isNode) {\r\n return process.versions.node;\r\n }\r\n return undefined;\r\n}\r\nfunction getRuntime() {\r\n if (Platform.isNode) {\r\n return \"NodeJS\";\r\n }\r\n else {\r\n return \"Browser\";\r\n }\r\n}\r\n/** @private */\r\nexport function getErrorString(e) {\r\n if (e.stack) {\r\n return e.stack;\r\n }\r\n else if (e.message) {\r\n return e.message;\r\n }\r\n return `${e}`;\r\n}\r\n/** @private */\r\nexport function getGlobalThis() {\r\n // globalThis is semi-new and not available in Node until v12\r\n if (typeof globalThis !== \"undefined\") {\r\n return globalThis;\r\n }\r\n if (typeof self !== \"undefined\") {\r\n return self;\r\n }\r\n if (typeof window !== \"undefined\") {\r\n return window;\r\n }\r\n if (typeof global !== \"undefined\") {\r\n return global;\r\n }\r\n throw new Error(\"could not find global\");\r\n}\r\n//# sourceMappingURL=Utils.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** A logger that does nothing when log messages are sent to it. */\r\nexport class NullLogger {\r\n constructor() { }\r\n /** @inheritDoc */\r\n // eslint-disable-next-line\r\n log(_logLevel, _message) {\r\n }\r\n}\r\n/** The singleton instance of the {@link @microsoft/signalr.NullLogger}. */\r\nNullLogger.instance = new NullLogger();\r\n//# sourceMappingURL=Loggers.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Error thrown when an HTTP request fails. */\r\nexport class HttpError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n * @param {number} statusCode The HTTP status code represented by this error.\r\n */\r\n constructor(errorMessage, statusCode) {\r\n const trueProto = new.target.prototype;\r\n super(`${errorMessage}: Status code '${statusCode}'`);\r\n this.statusCode = statusCode;\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when a timeout elapses. */\r\nexport class TimeoutError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.TimeoutError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage = \"A timeout occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when an action is aborted. */\r\nexport class AbortError extends Error {\r\n /** Constructs a new instance of {@link AbortError}.\r\n *\r\n * @param {string} errorMessage A descriptive error message.\r\n */\r\n constructor(errorMessage = \"An abort occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport is unsupported by the browser. */\r\n/** @private */\r\nexport class UnsupportedTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.UnsupportedTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'UnsupportedTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport is disabled by the browser. */\r\n/** @private */\r\nexport class DisabledTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.DisabledTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'DisabledTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the selected transport cannot be started. */\r\n/** @private */\r\nexport class FailedToStartTransportError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.FailedToStartTransportError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {HttpTransportType} transport The {@link @microsoft/signalr.HttpTransportType} this error occurred on.\r\n */\r\n constructor(message, transport) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'FailedToStartTransportError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when the negotiation with the server failed to complete. */\r\n/** @private */\r\nexport class FailedToNegotiateWithServerError extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.FailedToNegotiateWithServerError}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n */\r\n constructor(message) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.errorType = 'FailedToNegotiateWithServerError';\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n/** Error thrown when multiple errors have occurred. */\r\n/** @private */\r\nexport class AggregateErrors extends Error {\r\n /** Constructs a new instance of {@link @microsoft/signalr.AggregateErrors}.\r\n *\r\n * @param {string} message A descriptive error message.\r\n * @param {Error[]} innerErrors The collection of errors this error is aggregating.\r\n */\r\n constructor(message, innerErrors) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.innerErrors = innerErrors;\r\n // Workaround issue in Typescript compiler\r\n // https://github.com/Microsoft/TypeScript/issues/13965#issuecomment-278570200\r\n this.__proto__ = trueProto;\r\n }\r\n}\r\n//# sourceMappingURL=Errors.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Represents an HTTP response. */\r\nexport class HttpResponse {\r\n constructor(statusCode, statusText, content) {\r\n this.statusCode = statusCode;\r\n this.statusText = statusText;\r\n this.content = content;\r\n }\r\n}\r\n/** Abstraction over an HTTP client.\r\n *\r\n * This class provides an abstraction over an HTTP client so that a different implementation can be provided on different platforms.\r\n */\r\nexport class HttpClient {\r\n get(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"GET\",\r\n url,\r\n });\r\n }\r\n post(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"POST\",\r\n url,\r\n });\r\n }\r\n delete(url, options) {\r\n return this.send({\r\n ...options,\r\n method: \"DELETE\",\r\n url,\r\n });\r\n }\r\n /** Gets all cookies that apply to the specified URL.\r\n *\r\n * @param url The URL that the cookies are valid for.\r\n * @returns {string} A string containing all the key-value cookie pairs for the specified URL.\r\n */\r\n // @ts-ignore\r\n getCookieString(url) {\r\n return \"\";\r\n }\r\n}\r\n//# sourceMappingURL=HttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n/** Defines the type of a Hub Message. */\r\nexport var MessageType;\r\n(function (MessageType) {\r\n /** Indicates the message is an Invocation message and implements the {@link @microsoft/signalr.InvocationMessage} interface. */\r\n MessageType[MessageType[\"Invocation\"] = 1] = \"Invocation\";\r\n /** Indicates the message is a StreamItem message and implements the {@link @microsoft/signalr.StreamItemMessage} interface. */\r\n MessageType[MessageType[\"StreamItem\"] = 2] = \"StreamItem\";\r\n /** Indicates the message is a Completion message and implements the {@link @microsoft/signalr.CompletionMessage} interface. */\r\n MessageType[MessageType[\"Completion\"] = 3] = \"Completion\";\r\n /** Indicates the message is a Stream Invocation message and implements the {@link @microsoft/signalr.StreamInvocationMessage} interface. */\r\n MessageType[MessageType[\"StreamInvocation\"] = 4] = \"StreamInvocation\";\r\n /** Indicates the message is a Cancel Invocation message and implements the {@link @microsoft/signalr.CancelInvocationMessage} interface. */\r\n MessageType[MessageType[\"CancelInvocation\"] = 5] = \"CancelInvocation\";\r\n /** Indicates the message is a Ping message and implements the {@link @microsoft/signalr.PingMessage} interface. */\r\n MessageType[MessageType[\"Ping\"] = 6] = \"Ping\";\r\n /** Indicates the message is a Close message and implements the {@link @microsoft/signalr.CloseMessage} interface. */\r\n MessageType[MessageType[\"Close\"] = 7] = \"Close\";\r\n})(MessageType || (MessageType = {}));\r\n//# sourceMappingURL=IHubProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpResponse } from \"./HttpClient\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { Platform, getGlobalThis, isArrayBuffer } from \"./Utils\";\r\nexport class FetchHttpClient extends HttpClient {\r\n constructor(logger) {\r\n super();\r\n this._logger = logger;\r\n if (typeof fetch === \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n // Cookies aren't automatically handled in Node so we need to add a CookieJar to preserve cookies across requests\r\n this._jar = new (requireFunc(\"tough-cookie\")).CookieJar();\r\n this._fetchType = requireFunc(\"node-fetch\");\r\n // node-fetch doesn't have a nice API for getting and setting cookies\r\n // fetch-cookie will wrap a fetch implementation with a default CookieJar or a provided one\r\n this._fetchType = requireFunc(\"fetch-cookie\")(this._fetchType, this._jar);\r\n }\r\n else {\r\n this._fetchType = fetch.bind(getGlobalThis());\r\n }\r\n if (typeof AbortController === \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n // Node needs EventListener methods on AbortController which our custom polyfill doesn't provide\r\n this._abortControllerType = requireFunc(\"abort-controller\");\r\n }\r\n else {\r\n this._abortControllerType = AbortController;\r\n }\r\n }\r\n /** @inheritDoc */\r\n async send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n throw new AbortError();\r\n }\r\n if (!request.method) {\r\n throw new Error(\"No method defined.\");\r\n }\r\n if (!request.url) {\r\n throw new Error(\"No url defined.\");\r\n }\r\n const abortController = new this._abortControllerType();\r\n let error;\r\n // Hook our abortSignal into the abort controller\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = () => {\r\n abortController.abort();\r\n error = new AbortError();\r\n };\r\n }\r\n // If a timeout has been passed in, setup a timeout to call abort\r\n // Type needs to be any to fit window.setTimeout and NodeJS.setTimeout\r\n let timeoutId = null;\r\n if (request.timeout) {\r\n const msTimeout = request.timeout;\r\n timeoutId = setTimeout(() => {\r\n abortController.abort();\r\n this._logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n error = new TimeoutError();\r\n }, msTimeout);\r\n }\r\n if (request.content === \"\") {\r\n request.content = undefined;\r\n }\r\n if (request.content) {\r\n // Explicitly setting the Content-Type header for React Native on Android platform.\r\n request.headers = request.headers || {};\r\n if (isArrayBuffer(request.content)) {\r\n request.headers[\"Content-Type\"] = \"application/octet-stream\";\r\n }\r\n else {\r\n request.headers[\"Content-Type\"] = \"text/plain;charset=UTF-8\";\r\n }\r\n }\r\n let response;\r\n try {\r\n response = await this._fetchType(request.url, {\r\n body: request.content,\r\n cache: \"no-cache\",\r\n credentials: request.withCredentials === true ? \"include\" : \"same-origin\",\r\n headers: {\r\n \"X-Requested-With\": \"XMLHttpRequest\",\r\n ...request.headers,\r\n },\r\n method: request.method,\r\n mode: \"cors\",\r\n redirect: \"follow\",\r\n signal: abortController.signal,\r\n });\r\n }\r\n catch (e) {\r\n if (error) {\r\n throw error;\r\n }\r\n this._logger.log(LogLevel.Warning, `Error from HTTP request. ${e}.`);\r\n throw e;\r\n }\r\n finally {\r\n if (timeoutId) {\r\n clearTimeout(timeoutId);\r\n }\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\r\n }\r\n if (!response.ok) {\r\n const errorMessage = await deserializeContent(response, \"text\");\r\n throw new HttpError(errorMessage || response.statusText, response.status);\r\n }\r\n const content = deserializeContent(response, request.responseType);\r\n const payload = await content;\r\n return new HttpResponse(response.status, response.statusText, payload);\r\n }\r\n getCookieString(url) {\r\n let cookies = \"\";\r\n if (Platform.isNode && this._jar) {\r\n // @ts-ignore: unused variable\r\n this._jar.getCookies(url, (e, c) => cookies = c.join(\"; \"));\r\n }\r\n return cookies;\r\n }\r\n}\r\nfunction deserializeContent(response, responseType) {\r\n let content;\r\n switch (responseType) {\r\n case \"arraybuffer\":\r\n content = response.arrayBuffer();\r\n break;\r\n case \"text\":\r\n content = response.text();\r\n break;\r\n case \"blob\":\r\n case \"document\":\r\n case \"json\":\r\n throw new Error(`${responseType} is not supported.`);\r\n default:\r\n content = response.text();\r\n break;\r\n }\r\n return content;\r\n}\r\n//# sourceMappingURL=FetchHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpResponse } from \"./HttpClient\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\nexport class XhrHttpClient extends HttpClient {\r\n constructor(logger) {\r\n super();\r\n this._logger = logger;\r\n }\r\n /** @inheritDoc */\r\n send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n xhr.open(request.method, request.url, true);\r\n xhr.withCredentials = request.withCredentials === undefined ? true : request.withCredentials;\r\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\r\n if (request.content === \"\") {\r\n request.content = undefined;\r\n }\r\n if (request.content) {\r\n // Explicitly setting the Content-Type header for React Native on Android platform.\r\n if (isArrayBuffer(request.content)) {\r\n xhr.setRequestHeader(\"Content-Type\", \"application/octet-stream\");\r\n }\r\n else {\r\n xhr.setRequestHeader(\"Content-Type\", \"text/plain;charset=UTF-8\");\r\n }\r\n }\r\n const headers = request.headers;\r\n if (headers) {\r\n Object.keys(headers)\r\n .forEach((header) => {\r\n xhr.setRequestHeader(header, headers[header]);\r\n });\r\n }\r\n if (request.responseType) {\r\n xhr.responseType = request.responseType;\r\n }\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = () => {\r\n xhr.abort();\r\n reject(new AbortError());\r\n };\r\n }\r\n if (request.timeout) {\r\n xhr.timeout = request.timeout;\r\n }\r\n xhr.onload = () => {\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\r\n if (xhr.status >= 200 && xhr.status < 300) {\r\n resolve(new HttpResponse(xhr.status, xhr.statusText, xhr.response || xhr.responseText));\r\n }\r\n else {\r\n reject(new HttpError(xhr.response || xhr.responseText || xhr.statusText, xhr.status));\r\n }\r\n };\r\n xhr.onerror = () => {\r\n this._logger.log(LogLevel.Warning, `Error from HTTP request. ${xhr.status}: ${xhr.statusText}.`);\r\n reject(new HttpError(xhr.statusText, xhr.status));\r\n };\r\n xhr.ontimeout = () => {\r\n this._logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n reject(new TimeoutError());\r\n };\r\n xhr.send(request.content);\r\n });\r\n }\r\n}\r\n//# sourceMappingURL=XhrHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortError } from \"./Errors\";\r\nimport { FetchHttpClient } from \"./FetchHttpClient\";\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { Platform } from \"./Utils\";\r\nimport { XhrHttpClient } from \"./XhrHttpClient\";\r\n/** Default implementation of {@link @microsoft/signalr.HttpClient}. */\r\nexport class DefaultHttpClient extends HttpClient {\r\n /** Creates a new instance of the {@link @microsoft/signalr.DefaultHttpClient}, using the provided {@link @microsoft/signalr.ILogger} to log messages. */\r\n constructor(logger) {\r\n super();\r\n if (typeof fetch !== \"undefined\" || Platform.isNode) {\r\n this._httpClient = new FetchHttpClient(logger);\r\n }\r\n else if (typeof XMLHttpRequest !== \"undefined\") {\r\n this._httpClient = new XhrHttpClient(logger);\r\n }\r\n else {\r\n throw new Error(\"No usable HttpClient found.\");\r\n }\r\n }\r\n /** @inheritDoc */\r\n send(request) {\r\n // Check that abort was not signaled before calling send\r\n if (request.abortSignal && request.abortSignal.aborted) {\r\n return Promise.reject(new AbortError());\r\n }\r\n if (!request.method) {\r\n return Promise.reject(new Error(\"No method defined.\"));\r\n }\r\n if (!request.url) {\r\n return Promise.reject(new Error(\"No url defined.\"));\r\n }\r\n return this._httpClient.send(request);\r\n }\r\n getCookieString(url) {\r\n return this._httpClient.getCookieString(url);\r\n }\r\n}\r\n//# sourceMappingURL=DefaultHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// Not exported from index\r\n/** @private */\r\nexport class TextMessageFormat {\r\n static write(output) {\r\n return `${output}${TextMessageFormat.RecordSeparator}`;\r\n }\r\n static parse(input) {\r\n if (input[input.length - 1] !== TextMessageFormat.RecordSeparator) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n const messages = input.split(TextMessageFormat.RecordSeparator);\r\n messages.pop();\r\n return messages;\r\n }\r\n}\r\nTextMessageFormat.RecordSeparatorCode = 0x1e;\r\nTextMessageFormat.RecordSeparator = String.fromCharCode(TextMessageFormat.RecordSeparatorCode);\r\n//# sourceMappingURL=TextMessageFormat.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n/** @private */\r\nexport class HandshakeProtocol {\r\n // Handshake request is always JSON\r\n writeHandshakeRequest(handshakeRequest) {\r\n return TextMessageFormat.write(JSON.stringify(handshakeRequest));\r\n }\r\n parseHandshakeResponse(data) {\r\n let messageData;\r\n let remainingData;\r\n if (isArrayBuffer(data)) {\r\n // Format is binary but still need to read JSON text from handshake response\r\n const binaryData = new Uint8Array(data);\r\n const separatorIndex = binaryData.indexOf(TextMessageFormat.RecordSeparatorCode);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = String.fromCharCode.apply(null, Array.prototype.slice.call(binaryData.slice(0, responseLength)));\r\n remainingData = (binaryData.byteLength > responseLength) ? binaryData.slice(responseLength).buffer : null;\r\n }\r\n else {\r\n const textData = data;\r\n const separatorIndex = textData.indexOf(TextMessageFormat.RecordSeparator);\r\n if (separatorIndex === -1) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n // content before separator is handshake response\r\n // optional content after is additional messages\r\n const responseLength = separatorIndex + 1;\r\n messageData = textData.substring(0, responseLength);\r\n remainingData = (textData.length > responseLength) ? textData.substring(responseLength) : null;\r\n }\r\n // At this point we should have just the single handshake message\r\n const messages = TextMessageFormat.parse(messageData);\r\n const response = JSON.parse(messages[0]);\r\n if (response.type) {\r\n throw new Error(\"Expected a handshake response from the server.\");\r\n }\r\n const responseMessage = response;\r\n // multiple messages could have arrived with handshake\r\n // return additional data to be parsed as usual, or null if all parsed\r\n return [remainingData, responseMessage];\r\n }\r\n}\r\n//# sourceMappingURL=HandshakeProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { SubjectSubscription } from \"./Utils\";\r\n/** Stream implementation to stream items to the server. */\r\nexport class Subject {\r\n constructor() {\r\n this.observers = [];\r\n }\r\n next(item) {\r\n for (const observer of this.observers) {\r\n observer.next(item);\r\n }\r\n }\r\n error(err) {\r\n for (const observer of this.observers) {\r\n if (observer.error) {\r\n observer.error(err);\r\n }\r\n }\r\n }\r\n complete() {\r\n for (const observer of this.observers) {\r\n if (observer.complete) {\r\n observer.complete();\r\n }\r\n }\r\n }\r\n subscribe(observer) {\r\n this.observers.push(observer);\r\n return new SubjectSubscription(this, observer);\r\n }\r\n}\r\n//# sourceMappingURL=Subject.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HandshakeProtocol } from \"./HandshakeProtocol\";\r\nimport { AbortError } from \"./Errors\";\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { Subject } from \"./Subject\";\r\nimport { Arg, getErrorString, Platform } from \"./Utils\";\r\nconst DEFAULT_TIMEOUT_IN_MS = 30 * 1000;\r\nconst DEFAULT_PING_INTERVAL_IN_MS = 15 * 1000;\r\n/** Describes the current state of the {@link HubConnection} to the server. */\r\nexport var HubConnectionState;\r\n(function (HubConnectionState) {\r\n /** The hub connection is disconnected. */\r\n HubConnectionState[\"Disconnected\"] = \"Disconnected\";\r\n /** The hub connection is connecting. */\r\n HubConnectionState[\"Connecting\"] = \"Connecting\";\r\n /** The hub connection is connected. */\r\n HubConnectionState[\"Connected\"] = \"Connected\";\r\n /** The hub connection is disconnecting. */\r\n HubConnectionState[\"Disconnecting\"] = \"Disconnecting\";\r\n /** The hub connection is reconnecting. */\r\n HubConnectionState[\"Reconnecting\"] = \"Reconnecting\";\r\n})(HubConnectionState || (HubConnectionState = {}));\r\n/** Represents a connection to a SignalR Hub. */\r\nexport class HubConnection {\r\n constructor(connection, logger, protocol, reconnectPolicy) {\r\n this._nextKeepAlive = 0;\r\n this._freezeEventListener = () => {\r\n this._logger.log(LogLevel.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://docs.microsoft.com/aspnet/core/signalr/javascript-client#bsleep\");\r\n };\r\n Arg.isRequired(connection, \"connection\");\r\n Arg.isRequired(logger, \"logger\");\r\n Arg.isRequired(protocol, \"protocol\");\r\n this.serverTimeoutInMilliseconds = DEFAULT_TIMEOUT_IN_MS;\r\n this.keepAliveIntervalInMilliseconds = DEFAULT_PING_INTERVAL_IN_MS;\r\n this._logger = logger;\r\n this._protocol = protocol;\r\n this.connection = connection;\r\n this._reconnectPolicy = reconnectPolicy;\r\n this._handshakeProtocol = new HandshakeProtocol();\r\n this.connection.onreceive = (data) => this._processIncomingData(data);\r\n this.connection.onclose = (error) => this._connectionClosed(error);\r\n this._callbacks = {};\r\n this._methods = {};\r\n this._closedCallbacks = [];\r\n this._reconnectingCallbacks = [];\r\n this._reconnectedCallbacks = [];\r\n this._invocationId = 0;\r\n this._receivedHandshakeResponse = false;\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n this._cachedPingMessage = this._protocol.writeMessage({ type: MessageType.Ping });\r\n }\r\n /** @internal */\r\n // Using a public static factory method means we can have a private constructor and an _internal_\r\n // create method that can be used by HubConnectionBuilder. An \"internal\" constructor would just\r\n // be stripped away and the '.d.ts' file would have no constructor, which is interpreted as a\r\n // public parameter-less constructor.\r\n static create(connection, logger, protocol, reconnectPolicy) {\r\n return new HubConnection(connection, logger, protocol, reconnectPolicy);\r\n }\r\n /** Indicates the state of the {@link HubConnection} to the server. */\r\n get state() {\r\n return this._connectionState;\r\n }\r\n /** Represents the connection id of the {@link HubConnection} on the server. The connection id will be null when the connection is either\r\n * in the disconnected state or if the negotiation step was skipped.\r\n */\r\n get connectionId() {\r\n return this.connection ? (this.connection.connectionId || null) : null;\r\n }\r\n /** Indicates the url of the {@link HubConnection} to the server. */\r\n get baseUrl() {\r\n return this.connection.baseUrl || \"\";\r\n }\r\n /**\r\n * Sets a new url for the HubConnection. Note that the url can only be changed when the connection is in either the Disconnected or\r\n * Reconnecting states.\r\n * @param {string} url The url to connect to.\r\n */\r\n set baseUrl(url) {\r\n if (this._connectionState !== HubConnectionState.Disconnected && this._connectionState !== HubConnectionState.Reconnecting) {\r\n throw new Error(\"The HubConnection must be in the Disconnected or Reconnecting state to change the url.\");\r\n }\r\n if (!url) {\r\n throw new Error(\"The HubConnection url must be a valid url.\");\r\n }\r\n this.connection.baseUrl = url;\r\n }\r\n /** Starts the connection.\r\n *\r\n * @returns {Promise} A Promise that resolves when the connection has been successfully established, or rejects with an error.\r\n */\r\n start() {\r\n this._startPromise = this._startWithStateTransitions();\r\n return this._startPromise;\r\n }\r\n async _startWithStateTransitions() {\r\n if (this._connectionState !== HubConnectionState.Disconnected) {\r\n return Promise.reject(new Error(\"Cannot start a HubConnection that is not in the 'Disconnected' state.\"));\r\n }\r\n this._connectionState = HubConnectionState.Connecting;\r\n this._logger.log(LogLevel.Debug, \"Starting HubConnection.\");\r\n try {\r\n await this._startInternal();\r\n if (Platform.isBrowser) {\r\n // Log when the browser freezes the tab so users know why their connection unexpectedly stopped working\r\n window.document.addEventListener(\"freeze\", this._freezeEventListener);\r\n }\r\n this._connectionState = HubConnectionState.Connected;\r\n this._connectionStarted = true;\r\n this._logger.log(LogLevel.Debug, \"HubConnection connected successfully.\");\r\n }\r\n catch (e) {\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._logger.log(LogLevel.Debug, `HubConnection failed to start successfully because of error '${e}'.`);\r\n return Promise.reject(e);\r\n }\r\n }\r\n async _startInternal() {\r\n this._stopDuringStartError = undefined;\r\n this._receivedHandshakeResponse = false;\r\n // Set up the promise before any connection is (re)started otherwise it could race with received messages\r\n const handshakePromise = new Promise((resolve, reject) => {\r\n this._handshakeResolver = resolve;\r\n this._handshakeRejecter = reject;\r\n });\r\n await this.connection.start(this._protocol.transferFormat);\r\n try {\r\n const handshakeRequest = {\r\n protocol: this._protocol.name,\r\n version: this._protocol.version,\r\n };\r\n this._logger.log(LogLevel.Debug, \"Sending handshake request.\");\r\n await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(handshakeRequest));\r\n this._logger.log(LogLevel.Information, `Using HubProtocol '${this._protocol.name}'.`);\r\n // defensively cleanup timeout in case we receive a message from the server before we finish start\r\n this._cleanupTimeout();\r\n this._resetTimeoutPeriod();\r\n this._resetKeepAliveInterval();\r\n await handshakePromise;\r\n // It's important to check the stopDuringStartError instead of just relying on the handshakePromise\r\n // being rejected on close, because this continuation can run after both the handshake completed successfully\r\n // and the connection was closed.\r\n if (this._stopDuringStartError) {\r\n // It's important to throw instead of returning a rejected promise, because we don't want to allow any state\r\n // transitions to occur between now and the calling code observing the exceptions. Returning a rejected promise\r\n // will cause the calling continuation to get scheduled to run later.\r\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\r\n throw this._stopDuringStartError;\r\n }\r\n if (!this.connection.features.inherentKeepAlive) {\r\n await this._sendMessage(this._cachedPingMessage);\r\n }\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Debug, `Hub handshake failed with error '${e}' during start(). Stopping HubConnection.`);\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n // HttpConnection.stop() should not complete until after the onclose callback is invoked.\r\n // This will transition the HubConnection to the disconnected state before HttpConnection.stop() completes.\r\n await this.connection.stop(e);\r\n throw e;\r\n }\r\n }\r\n /** Stops the connection.\r\n *\r\n * @returns {Promise} A Promise that resolves when the connection has been successfully terminated, or rejects with an error.\r\n */\r\n async stop() {\r\n // Capture the start promise before the connection might be restarted in an onclose callback.\r\n const startPromise = this._startPromise;\r\n this._stopPromise = this._stopInternal();\r\n await this._stopPromise;\r\n try {\r\n // Awaiting undefined continues immediately\r\n await startPromise;\r\n }\r\n catch (e) {\r\n // This exception is returned to the user as a rejected Promise from the start method.\r\n }\r\n }\r\n _stopInternal(error) {\r\n if (this._connectionState === HubConnectionState.Disconnected) {\r\n this._logger.log(LogLevel.Debug, `Call to HubConnection.stop(${error}) ignored because it is already in the disconnected state.`);\r\n return Promise.resolve();\r\n }\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnecting state.`);\r\n return this._stopPromise;\r\n }\r\n this._connectionState = HubConnectionState.Disconnecting;\r\n this._logger.log(LogLevel.Debug, \"Stopping HubConnection.\");\r\n if (this._reconnectDelayHandle) {\r\n // We're in a reconnect delay which means the underlying connection is currently already stopped.\r\n // Just clear the handle to stop the reconnect loop (which no one is waiting on thankfully) and\r\n // fire the onclose callbacks.\r\n this._logger.log(LogLevel.Debug, \"Connection stopped during reconnect delay. Done reconnecting.\");\r\n clearTimeout(this._reconnectDelayHandle);\r\n this._reconnectDelayHandle = undefined;\r\n this._completeClose();\r\n return Promise.resolve();\r\n }\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n this._stopDuringStartError = error || new AbortError(\"The connection was stopped before the hub handshake could complete.\");\r\n // HttpConnection.stop() should not complete until after either HttpConnection.start() fails\r\n // or the onclose callback is invoked. The onclose callback will transition the HubConnection\r\n // to the disconnected state if need be before HttpConnection.stop() completes.\r\n return this.connection.stop(error);\r\n }\r\n /** Invokes a streaming hub method on the server using the specified name and arguments.\r\n *\r\n * @typeparam T The type of the items returned by the server.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {IStreamResult} An object that yields results from the server as they are received.\r\n */\r\n stream(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createStreamInvocation(methodName, args, streamIds);\r\n // eslint-disable-next-line prefer-const\r\n let promiseQueue;\r\n const subject = new Subject();\r\n subject.cancelCallback = () => {\r\n const cancelInvocation = this._createCancelInvocation(invocationDescriptor.invocationId);\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n return promiseQueue.then(() => {\r\n return this._sendWithProtocol(cancelInvocation);\r\n });\r\n };\r\n this._callbacks[invocationDescriptor.invocationId] = (invocationEvent, error) => {\r\n if (error) {\r\n subject.error(error);\r\n return;\r\n }\r\n else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n subject.error(new Error(invocationEvent.error));\r\n }\r\n else {\r\n subject.complete();\r\n }\r\n }\r\n else {\r\n subject.next((invocationEvent.item));\r\n }\r\n }\r\n };\r\n promiseQueue = this._sendWithProtocol(invocationDescriptor)\r\n .catch((e) => {\r\n subject.error(e);\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n });\r\n this._launchStreams(streams, promiseQueue);\r\n return subject;\r\n }\r\n _sendMessage(message) {\r\n this._resetKeepAliveInterval();\r\n return this.connection.send(message);\r\n }\r\n /**\r\n * Sends a js object to the server.\r\n * @param message The js object to serialize and send.\r\n */\r\n _sendWithProtocol(message) {\r\n return this._sendMessage(this._protocol.writeMessage(message));\r\n }\r\n /** Invokes a hub method on the server using the specified name and arguments. Does not wait for a response from the receiver.\r\n *\r\n * The Promise returned by this method resolves when the client has sent the invocation to the server. The server may still\r\n * be processing the invocation.\r\n *\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise} A Promise that resolves when the invocation has been successfully sent, or rejects with an error.\r\n */\r\n send(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const sendPromise = this._sendWithProtocol(this._createInvocation(methodName, args, true, streamIds));\r\n this._launchStreams(streams, sendPromise);\r\n return sendPromise;\r\n }\r\n /** Invokes a hub method on the server using the specified name and arguments.\r\n *\r\n * The Promise returned by this method resolves when the server indicates it has finished invoking the method. When the promise\r\n * resolves, the server has finished invoking the method. If the server method returns a result, it is produced as the result of\r\n * resolving the Promise.\r\n *\r\n * @typeparam T The expected return type.\r\n * @param {string} methodName The name of the server method to invoke.\r\n * @param {any[]} args The arguments used to invoke the server method.\r\n * @returns {Promise} A Promise that resolves with the result of the server method (if any), or rejects with an error.\r\n */\r\n invoke(methodName, ...args) {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createInvocation(methodName, args, false, streamIds);\r\n const p = new Promise((resolve, reject) => {\r\n // invocationId will always have a value for a non-blocking invocation\r\n this._callbacks[invocationDescriptor.invocationId] = (invocationEvent, error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n else if (invocationEvent) {\r\n // invocationEvent will not be null when an error is not passed to the callback\r\n if (invocationEvent.type === MessageType.Completion) {\r\n if (invocationEvent.error) {\r\n reject(new Error(invocationEvent.error));\r\n }\r\n else {\r\n resolve(invocationEvent.result);\r\n }\r\n }\r\n else {\r\n reject(new Error(`Unexpected message type: ${invocationEvent.type}`));\r\n }\r\n }\r\n };\r\n const promiseQueue = this._sendWithProtocol(invocationDescriptor)\r\n .catch((e) => {\r\n reject(e);\r\n // invocationId will always have a value for a non-blocking invocation\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n });\r\n this._launchStreams(streams, promiseQueue);\r\n });\r\n return p;\r\n }\r\n on(methodName, newMethod) {\r\n if (!methodName || !newMethod) {\r\n return;\r\n }\r\n methodName = methodName.toLowerCase();\r\n if (!this._methods[methodName]) {\r\n this._methods[methodName] = [];\r\n }\r\n // Preventing adding the same handler multiple times.\r\n if (this._methods[methodName].indexOf(newMethod) !== -1) {\r\n return;\r\n }\r\n this._methods[methodName].push(newMethod);\r\n }\r\n off(methodName, method) {\r\n if (!methodName) {\r\n return;\r\n }\r\n methodName = methodName.toLowerCase();\r\n const handlers = this._methods[methodName];\r\n if (!handlers) {\r\n return;\r\n }\r\n if (method) {\r\n const removeIdx = handlers.indexOf(method);\r\n if (removeIdx !== -1) {\r\n handlers.splice(removeIdx, 1);\r\n if (handlers.length === 0) {\r\n delete this._methods[methodName];\r\n }\r\n }\r\n }\r\n else {\r\n delete this._methods[methodName];\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection is closed.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection is closed. Optionally receives a single argument containing the error that caused the connection to close (if any).\r\n */\r\n onclose(callback) {\r\n if (callback) {\r\n this._closedCallbacks.push(callback);\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection starts reconnecting.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection starts reconnecting. Optionally receives a single argument containing the error that caused the connection to start reconnecting (if any).\r\n */\r\n onreconnecting(callback) {\r\n if (callback) {\r\n this._reconnectingCallbacks.push(callback);\r\n }\r\n }\r\n /** Registers a handler that will be invoked when the connection successfully reconnects.\r\n *\r\n * @param {Function} callback The handler that will be invoked when the connection successfully reconnects.\r\n */\r\n onreconnected(callback) {\r\n if (callback) {\r\n this._reconnectedCallbacks.push(callback);\r\n }\r\n }\r\n _processIncomingData(data) {\r\n this._cleanupTimeout();\r\n if (!this._receivedHandshakeResponse) {\r\n data = this._processHandshakeResponse(data);\r\n this._receivedHandshakeResponse = true;\r\n }\r\n // Data may have all been read when processing handshake response\r\n if (data) {\r\n // Parse the messages\r\n const messages = this._protocol.parseMessages(data, this._logger);\r\n for (const message of messages) {\r\n switch (message.type) {\r\n case MessageType.Invocation:\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._invokeClientMethod(message);\r\n break;\r\n case MessageType.StreamItem:\r\n case MessageType.Completion: {\r\n const callback = this._callbacks[message.invocationId];\r\n if (callback) {\r\n if (message.type === MessageType.Completion) {\r\n delete this._callbacks[message.invocationId];\r\n }\r\n try {\r\n callback(message);\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `Stream callback threw error: ${getErrorString(e)}`);\r\n }\r\n }\r\n break;\r\n }\r\n case MessageType.Ping:\r\n // Don't care about pings\r\n break;\r\n case MessageType.Close: {\r\n this._logger.log(LogLevel.Information, \"Close message received from server.\");\r\n const error = message.error ? new Error(\"Server returned an error on close: \" + message.error) : undefined;\r\n if (message.allowReconnect === true) {\r\n // It feels wrong not to await connection.stop() here, but processIncomingData is called as part of an onreceive callback which is not async,\r\n // this is already the behavior for serverTimeout(), and HttpConnection.Stop() should catch and log all possible exceptions.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.connection.stop(error);\r\n }\r\n else {\r\n // We cannot await stopInternal() here, but subsequent calls to stop() will await this if stopInternal() is still ongoing.\r\n this._stopPromise = this._stopInternal(error);\r\n }\r\n break;\r\n }\r\n default:\r\n this._logger.log(LogLevel.Warning, `Invalid message type: ${message.type}.`);\r\n break;\r\n }\r\n }\r\n }\r\n this._resetTimeoutPeriod();\r\n }\r\n _processHandshakeResponse(data) {\r\n let responseMessage;\r\n let remainingData;\r\n try {\r\n [remainingData, responseMessage] = this._handshakeProtocol.parseHandshakeResponse(data);\r\n }\r\n catch (e) {\r\n const message = \"Error parsing handshake response: \" + e;\r\n this._logger.log(LogLevel.Error, message);\r\n const error = new Error(message);\r\n this._handshakeRejecter(error);\r\n throw error;\r\n }\r\n if (responseMessage.error) {\r\n const message = \"Server returned handshake error: \" + responseMessage.error;\r\n this._logger.log(LogLevel.Error, message);\r\n const error = new Error(message);\r\n this._handshakeRejecter(error);\r\n throw error;\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, \"Server handshake complete.\");\r\n }\r\n this._handshakeResolver();\r\n return remainingData;\r\n }\r\n _resetKeepAliveInterval() {\r\n if (this.connection.features.inherentKeepAlive) {\r\n return;\r\n }\r\n // Set the time we want the next keep alive to be sent\r\n // Timer will be setup on next message receive\r\n this._nextKeepAlive = new Date().getTime() + this.keepAliveIntervalInMilliseconds;\r\n this._cleanupPingTimer();\r\n }\r\n _resetTimeoutPeriod() {\r\n if (!this.connection.features || !this.connection.features.inherentKeepAlive) {\r\n // Set the timeout timer\r\n this._timeoutHandle = setTimeout(() => this.serverTimeout(), this.serverTimeoutInMilliseconds);\r\n // Set keepAlive timer if there isn't one\r\n if (this._pingServerHandle === undefined) {\r\n let nextPing = this._nextKeepAlive - new Date().getTime();\r\n if (nextPing < 0) {\r\n nextPing = 0;\r\n }\r\n // The timer needs to be set from a networking callback to avoid Chrome timer throttling from causing timers to run once a minute\r\n this._pingServerHandle = setTimeout(async () => {\r\n if (this._connectionState === HubConnectionState.Connected) {\r\n try {\r\n await this._sendMessage(this._cachedPingMessage);\r\n }\r\n catch {\r\n // We don't care about the error. It should be seen elsewhere in the client.\r\n // The connection is probably in a bad or closed state now, cleanup the timer so it stops triggering\r\n this._cleanupPingTimer();\r\n }\r\n }\r\n }, nextPing);\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n serverTimeout() {\r\n // The server hasn't talked to us in a while. It doesn't like us anymore ... :(\r\n // Terminate the connection, but we don't need to wait on the promise. This could trigger reconnecting.\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.connection.stop(new Error(\"Server timeout elapsed without receiving a message from the server.\"));\r\n }\r\n async _invokeClientMethod(invocationMessage) {\r\n const methodName = invocationMessage.target.toLowerCase();\r\n const methods = this._methods[methodName];\r\n if (!methods) {\r\n this._logger.log(LogLevel.Warning, `No client method with the name '${methodName}' found.`);\r\n // No handlers provided by client but the server is expecting a response still, so we send an error\r\n if (invocationMessage.invocationId) {\r\n this._logger.log(LogLevel.Warning, `No result given for '${methodName}' method and invocation ID '${invocationMessage.invocationId}'.`);\r\n await this._sendWithProtocol(this._createCompletionMessage(invocationMessage.invocationId, \"Client didn't provide a result.\", null));\r\n }\r\n return;\r\n }\r\n // Avoid issues with handlers removing themselves thus modifying the list while iterating through it\r\n const methodsCopy = methods.slice();\r\n // Server expects a response\r\n const expectsResponse = invocationMessage.invocationId ? true : false;\r\n // We preserve the last result or exception but still call all handlers\r\n let res;\r\n let exception;\r\n let completionMessage;\r\n for (const m of methodsCopy) {\r\n try {\r\n const prevRes = res;\r\n res = await m.apply(this, invocationMessage.arguments);\r\n if (expectsResponse && res && prevRes) {\r\n this._logger.log(LogLevel.Error, `Multiple results provided for '${methodName}'. Sending error to server.`);\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, `Client provided multiple results.`, null);\r\n }\r\n // Ignore exception if we got a result after, the exception will be logged\r\n exception = undefined;\r\n }\r\n catch (e) {\r\n exception = e;\r\n this._logger.log(LogLevel.Error, `A callback for the method '${methodName}' threw error '${e}'.`);\r\n }\r\n }\r\n if (completionMessage) {\r\n await this._sendWithProtocol(completionMessage);\r\n }\r\n else if (expectsResponse) {\r\n // If there is an exception that means either no result was given or a handler after a result threw\r\n if (exception) {\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, `${exception}`, null);\r\n }\r\n else if (res !== undefined) {\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, null, res);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Warning, `No result given for '${methodName}' method and invocation ID '${invocationMessage.invocationId}'.`);\r\n // Client didn't provide a result or throw from a handler, server expects a response so we send an error\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId, \"Client didn't provide a result.\", null);\r\n }\r\n await this._sendWithProtocol(completionMessage);\r\n }\r\n else {\r\n if (res) {\r\n this._logger.log(LogLevel.Error, `Result given for '${methodName}' method but server is not expecting a result.`);\r\n }\r\n }\r\n }\r\n _connectionClosed(error) {\r\n this._logger.log(LogLevel.Debug, `HubConnection.connectionClosed(${error}) called while in state ${this._connectionState}.`);\r\n // Triggering this.handshakeRejecter is insufficient because it could already be resolved without the continuation having run yet.\r\n this._stopDuringStartError = this._stopDuringStartError || error || new AbortError(\"The underlying connection was closed before the hub handshake could complete.\");\r\n // If the handshake is in progress, start will be waiting for the handshake promise, so we complete it.\r\n // If it has already completed, this should just noop.\r\n if (this._handshakeResolver) {\r\n this._handshakeResolver();\r\n }\r\n this._cancelCallbacksWithError(error || new Error(\"Invocation canceled due to the underlying connection being closed.\"));\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._completeClose(error);\r\n }\r\n else if (this._connectionState === HubConnectionState.Connected && this._reconnectPolicy) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._reconnect(error);\r\n }\r\n else if (this._connectionState === HubConnectionState.Connected) {\r\n this._completeClose(error);\r\n }\r\n // If none of the above if conditions were true were called the HubConnection must be in either:\r\n // 1. The Connecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail it.\r\n // 2. The Reconnecting state in which case the handshakeResolver will complete it and stopDuringStartError will fail the current reconnect attempt\r\n // and potentially continue the reconnect() loop.\r\n // 3. The Disconnected state in which case we're already done.\r\n }\r\n _completeClose(error) {\r\n if (this._connectionStarted) {\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n if (Platform.isBrowser) {\r\n window.document.removeEventListener(\"freeze\", this._freezeEventListener);\r\n }\r\n try {\r\n this._closedCallbacks.forEach((c) => c.apply(this, [error]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onclose callback called with error '${error}' threw error '${e}'.`);\r\n }\r\n }\r\n }\r\n async _reconnect(error) {\r\n const reconnectStartTime = Date.now();\r\n let previousReconnectAttempts = 0;\r\n let retryError = error !== undefined ? error : new Error(\"Attempting to reconnect due to a unknown error.\");\r\n let nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, 0, retryError);\r\n if (nextRetryDelay === null) {\r\n this._logger.log(LogLevel.Debug, \"Connection not reconnecting because the IRetryPolicy returned null on the first reconnect attempt.\");\r\n this._completeClose(error);\r\n return;\r\n }\r\n this._connectionState = HubConnectionState.Reconnecting;\r\n if (error) {\r\n this._logger.log(LogLevel.Information, `Connection reconnecting because of error '${error}'.`);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Information, \"Connection reconnecting.\");\r\n }\r\n if (this._reconnectingCallbacks.length !== 0) {\r\n try {\r\n this._reconnectingCallbacks.forEach((c) => c.apply(this, [error]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onreconnecting callback called with error '${error}' threw error '${e}'.`);\r\n }\r\n // Exit early if an onreconnecting callback called connection.stop().\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, \"Connection left the reconnecting state in onreconnecting callback. Done reconnecting.\");\r\n return;\r\n }\r\n }\r\n while (nextRetryDelay !== null) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt number ${previousReconnectAttempts} will start in ${nextRetryDelay} ms.`);\r\n await new Promise((resolve) => {\r\n this._reconnectDelayHandle = setTimeout(resolve, nextRetryDelay);\r\n });\r\n this._reconnectDelayHandle = undefined;\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, \"Connection left the reconnecting state during reconnect delay. Done reconnecting.\");\r\n return;\r\n }\r\n try {\r\n await this._startInternal();\r\n this._connectionState = HubConnectionState.Connected;\r\n this._logger.log(LogLevel.Information, \"HubConnection reconnected successfully.\");\r\n if (this._reconnectedCallbacks.length !== 0) {\r\n try {\r\n this._reconnectedCallbacks.forEach((c) => c.apply(this, [this.connection.connectionId]));\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `An onreconnected callback called with connectionId '${this.connection.connectionId}; threw error '${e}'.`);\r\n }\r\n }\r\n return;\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt failed because of error '${e}'.`);\r\n if (this._connectionState !== HubConnectionState.Reconnecting) {\r\n this._logger.log(LogLevel.Debug, `Connection moved to the '${this._connectionState}' from the reconnecting state during reconnect attempt. Done reconnecting.`);\r\n // The TypeScript compiler thinks that connectionState must be Connected here. The TypeScript compiler is wrong.\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._completeClose();\r\n }\r\n return;\r\n }\r\n retryError = e instanceof Error ? e : new Error(e.toString());\r\n nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError);\r\n }\r\n }\r\n this._logger.log(LogLevel.Information, `Reconnect retries have been exhausted after ${Date.now() - reconnectStartTime} ms and ${previousReconnectAttempts} failed attempts. Connection disconnecting.`);\r\n this._completeClose();\r\n }\r\n _getNextRetryDelay(previousRetryCount, elapsedMilliseconds, retryReason) {\r\n try {\r\n return this._reconnectPolicy.nextRetryDelayInMilliseconds({\r\n elapsedMilliseconds,\r\n previousRetryCount,\r\n retryReason,\r\n });\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `IRetryPolicy.nextRetryDelayInMilliseconds(${previousRetryCount}, ${elapsedMilliseconds}) threw error '${e}'.`);\r\n return null;\r\n }\r\n }\r\n _cancelCallbacksWithError(error) {\r\n const callbacks = this._callbacks;\r\n this._callbacks = {};\r\n Object.keys(callbacks)\r\n .forEach((key) => {\r\n const callback = callbacks[key];\r\n try {\r\n callback(null, error);\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `Stream 'error' callback called with '${error}' threw error: ${getErrorString(e)}`);\r\n }\r\n });\r\n }\r\n _cleanupPingTimer() {\r\n if (this._pingServerHandle) {\r\n clearTimeout(this._pingServerHandle);\r\n this._pingServerHandle = undefined;\r\n }\r\n }\r\n _cleanupTimeout() {\r\n if (this._timeoutHandle) {\r\n clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n _createInvocation(methodName, args, nonblocking, streamIds) {\r\n if (nonblocking) {\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n }\r\n else {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n }\r\n }\r\n _launchStreams(streams, promiseQueue) {\r\n if (streams.length === 0) {\r\n return;\r\n }\r\n // Synchronize stream data so they arrive in-order on the server\r\n if (!promiseQueue) {\r\n promiseQueue = Promise.resolve();\r\n }\r\n // We want to iterate over the keys, since the keys are the stream ids\r\n // eslint-disable-next-line guard-for-in\r\n for (const streamId in streams) {\r\n streams[streamId].subscribe({\r\n complete: () => {\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createCompletionMessage(streamId)));\r\n },\r\n error: (err) => {\r\n let message;\r\n if (err instanceof Error) {\r\n message = err.message;\r\n }\r\n else if (err && err.toString) {\r\n message = err.toString();\r\n }\r\n else {\r\n message = \"Unknown error\";\r\n }\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createCompletionMessage(streamId, message)));\r\n },\r\n next: (item) => {\r\n promiseQueue = promiseQueue.then(() => this._sendWithProtocol(this._createStreamItemMessage(streamId, item)));\r\n },\r\n });\r\n }\r\n }\r\n _replaceStreamingParams(args) {\r\n const streams = [];\r\n const streamIds = [];\r\n for (let i = 0; i < args.length; i++) {\r\n const argument = args[i];\r\n if (this._isObservable(argument)) {\r\n const streamId = this._invocationId;\r\n this._invocationId++;\r\n // Store the stream for later use\r\n streams[streamId] = argument;\r\n streamIds.push(streamId.toString());\r\n // remove stream from args\r\n args.splice(i, 1);\r\n }\r\n }\r\n return [streams, streamIds];\r\n }\r\n _isObservable(arg) {\r\n // This allows other stream implementations to just work (like rxjs)\r\n return arg && arg.subscribe && typeof arg.subscribe === \"function\";\r\n }\r\n _createStreamInvocation(methodName, args, streamIds) {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n if (streamIds.length !== 0) {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n streamIds,\r\n target: methodName,\r\n type: MessageType.StreamInvocation,\r\n };\r\n }\r\n else {\r\n return {\r\n arguments: args,\r\n invocationId: invocationId.toString(),\r\n target: methodName,\r\n type: MessageType.StreamInvocation,\r\n };\r\n }\r\n }\r\n _createCancelInvocation(id) {\r\n return {\r\n invocationId: id,\r\n type: MessageType.CancelInvocation,\r\n };\r\n }\r\n _createStreamItemMessage(id, item) {\r\n return {\r\n invocationId: id,\r\n item,\r\n type: MessageType.StreamItem,\r\n };\r\n }\r\n _createCompletionMessage(id, error, result) {\r\n if (error) {\r\n return {\r\n error,\r\n invocationId: id,\r\n type: MessageType.Completion,\r\n };\r\n }\r\n return {\r\n invocationId: id,\r\n result,\r\n type: MessageType.Completion,\r\n };\r\n }\r\n}\r\n//# sourceMappingURL=HubConnection.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// 0, 2, 10, 30 second delays before reconnect attempts.\r\nconst DEFAULT_RETRY_DELAYS_IN_MILLISECONDS = [0, 2000, 10000, 30000, null];\r\n/** @private */\r\nexport class DefaultReconnectPolicy {\r\n constructor(retryDelays) {\r\n this._retryDelays = retryDelays !== undefined ? [...retryDelays, null] : DEFAULT_RETRY_DELAYS_IN_MILLISECONDS;\r\n }\r\n nextRetryDelayInMilliseconds(retryContext) {\r\n return this._retryDelays[retryContext.previousRetryCount];\r\n }\r\n}\r\n//# sourceMappingURL=DefaultReconnectPolicy.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nexport class HeaderNames {\r\n}\r\nHeaderNames.Authorization = \"Authorization\";\r\nHeaderNames.Cookie = \"Cookie\";\r\n//# sourceMappingURL=HeaderNames.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { HttpClient } from \"./HttpClient\";\r\n/** @private */\r\nexport class AccessTokenHttpClient extends HttpClient {\r\n constructor(innerClient, accessTokenFactory) {\r\n super();\r\n this._innerClient = innerClient;\r\n this._accessTokenFactory = accessTokenFactory;\r\n }\r\n async send(request) {\r\n let allowRetry = true;\r\n if (this._accessTokenFactory && (!this._accessToken || (request.url && request.url.indexOf(\"/negotiate?\") > 0))) {\r\n // don't retry if the request is a negotiate or if we just got a potentially new token from the access token factory\r\n allowRetry = false;\r\n this._accessToken = await this._accessTokenFactory();\r\n }\r\n this._setAuthorizationHeader(request);\r\n const response = await this._innerClient.send(request);\r\n if (allowRetry && response.statusCode === 401 && this._accessTokenFactory) {\r\n this._accessToken = await this._accessTokenFactory();\r\n this._setAuthorizationHeader(request);\r\n return await this._innerClient.send(request);\r\n }\r\n return response;\r\n }\r\n _setAuthorizationHeader(request) {\r\n if (!request.headers) {\r\n request.headers = {};\r\n }\r\n if (this._accessToken) {\r\n request.headers[HeaderNames.Authorization] = `Bearer ${this._accessToken}`;\r\n }\r\n // don't remove the header if there isn't an access token factory, the user manually added the header in this case\r\n else if (this._accessTokenFactory) {\r\n if (request.headers[HeaderNames.Authorization]) {\r\n delete request.headers[HeaderNames.Authorization];\r\n }\r\n }\r\n }\r\n getCookieString(url) {\r\n return this._innerClient.getCookieString(url);\r\n }\r\n}\r\n//# sourceMappingURL=AccessTokenHttpClient.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// This will be treated as a bit flag in the future, so we keep it using power-of-two values.\r\n/** Specifies a specific HTTP transport type. */\r\nexport var HttpTransportType;\r\n(function (HttpTransportType) {\r\n /** Specifies no transport preference. */\r\n HttpTransportType[HttpTransportType[\"None\"] = 0] = \"None\";\r\n /** Specifies the WebSockets transport. */\r\n HttpTransportType[HttpTransportType[\"WebSockets\"] = 1] = \"WebSockets\";\r\n /** Specifies the Server-Sent Events transport. */\r\n HttpTransportType[HttpTransportType[\"ServerSentEvents\"] = 2] = \"ServerSentEvents\";\r\n /** Specifies the Long Polling transport. */\r\n HttpTransportType[HttpTransportType[\"LongPolling\"] = 4] = \"LongPolling\";\r\n})(HttpTransportType || (HttpTransportType = {}));\r\n/** Specifies the transfer format for a connection. */\r\nexport var TransferFormat;\r\n(function (TransferFormat) {\r\n /** Specifies that only text data will be transmitted over the connection. */\r\n TransferFormat[TransferFormat[\"Text\"] = 1] = \"Text\";\r\n /** Specifies that binary data will be transmitted over the connection. */\r\n TransferFormat[TransferFormat[\"Binary\"] = 2] = \"Binary\";\r\n})(TransferFormat || (TransferFormat = {}));\r\n//# sourceMappingURL=ITransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n// Rough polyfill of https://developer.mozilla.org/en-US/docs/Web/API/AbortController\r\n// We don't actually ever use the API being polyfilled, we always use the polyfill because\r\n// it's a very new API right now.\r\n// Not exported from index.\r\n/** @private */\r\nexport class AbortController {\r\n constructor() {\r\n this._isAborted = false;\r\n this.onabort = null;\r\n }\r\n abort() {\r\n if (!this._isAborted) {\r\n this._isAborted = true;\r\n if (this.onabort) {\r\n this.onabort();\r\n }\r\n }\r\n }\r\n get signal() {\r\n return this;\r\n }\r\n get aborted() {\r\n return this._isAborted;\r\n }\r\n}\r\n//# sourceMappingURL=AbortController.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AbortController } from \"./AbortController\";\r\nimport { HttpError, TimeoutError } from \"./Errors\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, sendMessage } from \"./Utils\";\r\n// Not exported from 'index', this type is internal.\r\n/** @private */\r\nexport class LongPollingTransport {\r\n constructor(httpClient, logger, options) {\r\n this._httpClient = httpClient;\r\n this._logger = logger;\r\n this._pollAbort = new AbortController();\r\n this._options = options;\r\n this._running = false;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n // This is an internal type, not exported from 'index' so this is really just internal.\r\n get pollAborted() {\r\n return this._pollAbort.aborted;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._url = url;\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Connecting.\");\r\n // Allow binary format on Node and Browsers that support binary content (indicated by the presence of responseType property)\r\n if (transferFormat === TransferFormat.Binary &&\r\n (typeof XMLHttpRequest !== \"undefined\" && typeof new XMLHttpRequest().responseType !== \"string\")) {\r\n throw new Error(\"Binary protocols over XmlHttpRequest not implementing advanced features are not supported.\");\r\n }\r\n const [name, value] = getUserAgentHeader();\r\n const headers = { [name]: value, ...this._options.headers };\r\n const pollOptions = {\r\n abortSignal: this._pollAbort.signal,\r\n headers,\r\n timeout: 100000,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n if (transferFormat === TransferFormat.Binary) {\r\n pollOptions.responseType = \"arraybuffer\";\r\n }\r\n // Make initial long polling request\r\n // Server uses first long polling request to finish initializing connection and it returns without data\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this._httpClient.get(pollUrl, pollOptions);\r\n if (response.statusCode !== 200) {\r\n this._logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n // Mark running as false so that the poll immediately ends and runs the close logic\r\n this._closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this._running = false;\r\n }\r\n else {\r\n this._running = true;\r\n }\r\n this._receiving = this._poll(this._url, pollOptions);\r\n }\r\n async _poll(url, pollOptions) {\r\n try {\r\n while (this._running) {\r\n try {\r\n const pollUrl = `${url}&_=${Date.now()}`;\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) polling: ${pollUrl}.`);\r\n const response = await this._httpClient.get(pollUrl, pollOptions);\r\n if (response.statusCode === 204) {\r\n this._logger.log(LogLevel.Information, \"(LongPolling transport) Poll terminated by server.\");\r\n this._running = false;\r\n }\r\n else if (response.statusCode !== 200) {\r\n this._logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n // Unexpected status code\r\n this._closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this._running = false;\r\n }\r\n else {\r\n // Process the response\r\n if (response.content) {\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) data received. ${getDataDetail(response.content, this._options.logMessageContent)}.`);\r\n if (this.onreceive) {\r\n this.onreceive(response.content);\r\n }\r\n }\r\n else {\r\n // This is another way timeout manifest.\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n }\r\n }\r\n }\r\n catch (e) {\r\n if (!this._running) {\r\n // Log but disregard errors that occur after stopping\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) Poll errored after shutdown: ${e.message}`);\r\n }\r\n else {\r\n if (e instanceof TimeoutError) {\r\n // Ignore timeouts and reissue the poll.\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Poll timed out, reissuing.\");\r\n }\r\n else {\r\n // Close the connection with the error as the result.\r\n this._closeError = e;\r\n this._running = false;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Polling complete.\");\r\n // We will reach here with pollAborted==false when the server returned a response causing the transport to stop.\r\n // If pollAborted==true then client initiated the stop and the stop method will raise the close event after DELETE is sent.\r\n if (!this.pollAborted) {\r\n this._raiseOnClose();\r\n }\r\n }\r\n }\r\n async send(data) {\r\n if (!this._running) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this._logger, \"LongPolling\", this._httpClient, this._url, data, this._options);\r\n }\r\n async stop() {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stopping polling.\");\r\n // Tell receiving loop to stop, abort any current request, and then wait for it to finish\r\n this._running = false;\r\n this._pollAbort.abort();\r\n try {\r\n await this._receiving;\r\n // Send DELETE to clean up long polling on the server\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) sending DELETE request to ${this._url}.`);\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n const deleteOptions = {\r\n headers: { ...headers, ...this._options.headers },\r\n timeout: this._options.timeout,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n await this._httpClient.delete(this._url, deleteOptions);\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) DELETE request sent.\");\r\n }\r\n finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stop finished.\");\r\n // Raise close event here instead of in polling\r\n // It needs to happen after the DELETE request is sent\r\n this._raiseOnClose();\r\n }\r\n }\r\n _raiseOnClose() {\r\n if (this.onclose) {\r\n let logMessage = \"(LongPolling transport) Firing onclose event.\";\r\n if (this._closeError) {\r\n logMessage += \" Error: \" + this._closeError;\r\n }\r\n this._logger.log(LogLevel.Trace, logMessage);\r\n this.onclose(this._closeError);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=LongPollingTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform, sendMessage } from \"./Utils\";\r\n/** @private */\r\nexport class ServerSentEventsTransport {\r\n constructor(httpClient, accessToken, logger, options) {\r\n this._httpClient = httpClient;\r\n this._accessToken = accessToken;\r\n this._logger = logger;\r\n this._options = options;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Trace, \"(SSE transport) Connecting.\");\r\n // set url before accessTokenFactory because this._url is only for send and we set the auth header instead of the query string for send\r\n this._url = url;\r\n if (this._accessToken) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(this._accessToken)}`;\r\n }\r\n return new Promise((resolve, reject) => {\r\n let opened = false;\r\n if (transferFormat !== TransferFormat.Text) {\r\n reject(new Error(\"The Server-Sent Events transport only supports the 'Text' transfer format\"));\r\n return;\r\n }\r\n let eventSource;\r\n if (Platform.isBrowser || Platform.isWebWorker) {\r\n eventSource = new this._options.EventSource(url, { withCredentials: this._options.withCredentials });\r\n }\r\n else {\r\n // Non-browser passes cookies via the dictionary\r\n const cookies = this._httpClient.getCookieString(url);\r\n const headers = {};\r\n headers.Cookie = cookies;\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n eventSource = new this._options.EventSource(url, { withCredentials: this._options.withCredentials, headers: { ...headers, ...this._options.headers } });\r\n }\r\n try {\r\n eventSource.onmessage = (e) => {\r\n if (this.onreceive) {\r\n try {\r\n this._logger.log(LogLevel.Trace, `(SSE transport) data received. ${getDataDetail(e.data, this._options.logMessageContent)}.`);\r\n this.onreceive(e.data);\r\n }\r\n catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n // @ts-ignore: not using event on purpose\r\n eventSource.onerror = (e) => {\r\n // EventSource doesn't give any useful information about server side closes.\r\n if (opened) {\r\n this._close();\r\n }\r\n else {\r\n reject(new Error(\"EventSource failed to connect. The connection could not be found on the server,\"\r\n + \" either the connection ID is not present on the server, or a proxy is refusing/buffering the connection.\"\r\n + \" If you have multiple servers check that sticky sessions are enabled.\"));\r\n }\r\n };\r\n eventSource.onopen = () => {\r\n this._logger.log(LogLevel.Information, `SSE connected to ${this._url}`);\r\n this._eventSource = eventSource;\r\n opened = true;\r\n resolve();\r\n };\r\n }\r\n catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n });\r\n }\r\n async send(data) {\r\n if (!this._eventSource) {\r\n return Promise.reject(new Error(\"Cannot send until the transport is connected\"));\r\n }\r\n return sendMessage(this._logger, \"SSE\", this._httpClient, this._url, data, this._options);\r\n }\r\n stop() {\r\n this._close();\r\n return Promise.resolve();\r\n }\r\n _close(e) {\r\n if (this._eventSource) {\r\n this._eventSource.close();\r\n this._eventSource = undefined;\r\n if (this.onclose) {\r\n this.onclose(e);\r\n }\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=ServerSentEventsTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform } from \"./Utils\";\r\n/** @private */\r\nexport class WebSocketTransport {\r\n constructor(httpClient, accessTokenFactory, logger, logMessageContent, webSocketConstructor, headers) {\r\n this._logger = logger;\r\n this._accessTokenFactory = accessTokenFactory;\r\n this._logMessageContent = logMessageContent;\r\n this._webSocketConstructor = webSocketConstructor;\r\n this._httpClient = httpClient;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n this._headers = headers;\r\n }\r\n async connect(url, transferFormat) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Trace, \"(WebSockets transport) Connecting.\");\r\n let token;\r\n if (this._accessTokenFactory) {\r\n token = await this._accessTokenFactory();\r\n }\r\n return new Promise((resolve, reject) => {\r\n url = url.replace(/^http/, \"ws\");\r\n let webSocket;\r\n const cookies = this._httpClient.getCookieString(url);\r\n let opened = false;\r\n if (Platform.isNode || Platform.isReactNative) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n if (token) {\r\n headers[HeaderNames.Authorization] = `Bearer ${token}`;\r\n }\r\n if (cookies) {\r\n headers[HeaderNames.Cookie] = cookies;\r\n }\r\n // Only pass headers when in non-browser environments\r\n webSocket = new this._webSocketConstructor(url, undefined, {\r\n headers: { ...headers, ...this._headers },\r\n });\r\n }\r\n else {\r\n if (token) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(token)}`;\r\n }\r\n }\r\n if (!webSocket) {\r\n // Chrome is not happy with passing 'undefined' as protocol\r\n webSocket = new this._webSocketConstructor(url);\r\n }\r\n if (transferFormat === TransferFormat.Binary) {\r\n webSocket.binaryType = \"arraybuffer\";\r\n }\r\n webSocket.onopen = (_event) => {\r\n this._logger.log(LogLevel.Information, `WebSocket connected to ${url}.`);\r\n this._webSocket = webSocket;\r\n opened = true;\r\n resolve();\r\n };\r\n webSocket.onerror = (event) => {\r\n let error = null;\r\n // ErrorEvent is a browser only type we need to check if the type exists before using it\r\n if (typeof ErrorEvent !== \"undefined\" && event instanceof ErrorEvent) {\r\n error = event.error;\r\n }\r\n else {\r\n error = \"There was an error with the transport\";\r\n }\r\n this._logger.log(LogLevel.Information, `(WebSockets transport) ${error}.`);\r\n };\r\n webSocket.onmessage = (message) => {\r\n this._logger.log(LogLevel.Trace, `(WebSockets transport) data received. ${getDataDetail(message.data, this._logMessageContent)}.`);\r\n if (this.onreceive) {\r\n try {\r\n this.onreceive(message.data);\r\n }\r\n catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n webSocket.onclose = (event) => {\r\n // Don't call close handler if connection was never established\r\n // We'll reject the connect call instead\r\n if (opened) {\r\n this._close(event);\r\n }\r\n else {\r\n let error = null;\r\n // ErrorEvent is a browser only type we need to check if the type exists before using it\r\n if (typeof ErrorEvent !== \"undefined\" && event instanceof ErrorEvent) {\r\n error = event.error;\r\n }\r\n else {\r\n error = \"WebSocket failed to connect. The connection could not be found on the server,\"\r\n + \" either the endpoint may not be a SignalR endpoint,\"\r\n + \" the connection ID is not present on the server, or there is a proxy blocking WebSockets.\"\r\n + \" If you have multiple servers check that sticky sessions are enabled.\";\r\n }\r\n reject(new Error(error));\r\n }\r\n };\r\n });\r\n }\r\n send(data) {\r\n if (this._webSocket && this._webSocket.readyState === this._webSocketConstructor.OPEN) {\r\n this._logger.log(LogLevel.Trace, `(WebSockets transport) sending data. ${getDataDetail(data, this._logMessageContent)}.`);\r\n this._webSocket.send(data);\r\n return Promise.resolve();\r\n }\r\n return Promise.reject(\"WebSocket is not in the OPEN state\");\r\n }\r\n stop() {\r\n if (this._webSocket) {\r\n // Manually invoke onclose callback inline so we know the HttpConnection was closed properly before returning\r\n // This also solves an issue where websocket.onclose could take 18+ seconds to trigger during network disconnects\r\n this._close(undefined);\r\n }\r\n return Promise.resolve();\r\n }\r\n _close(event) {\r\n // webSocket will be null if the transport did not start successfully\r\n if (this._webSocket) {\r\n // Clear websocket handlers because we are considering the socket closed now\r\n this._webSocket.onclose = () => { };\r\n this._webSocket.onmessage = () => { };\r\n this._webSocket.onerror = () => { };\r\n this._webSocket.close();\r\n this._webSocket = undefined;\r\n }\r\n this._logger.log(LogLevel.Trace, \"(WebSockets transport) socket closed.\");\r\n if (this.onclose) {\r\n if (this._isCloseEvent(event) && (event.wasClean === false || event.code !== 1000)) {\r\n this.onclose(new Error(`WebSocket closed with status code: ${event.code} (${event.reason || \"no reason given\"}).`));\r\n }\r\n else if (event instanceof Error) {\r\n this.onclose(event);\r\n }\r\n else {\r\n this.onclose();\r\n }\r\n }\r\n }\r\n _isCloseEvent(event) {\r\n return event && typeof event.wasClean === \"boolean\" && typeof event.code === \"number\";\r\n }\r\n}\r\n//# sourceMappingURL=WebSocketTransport.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { AccessTokenHttpClient } from \"./AccessTokenHttpClient\";\r\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\nimport { AggregateErrors, DisabledTransportError, FailedToNegotiateWithServerError, FailedToStartTransportError, HttpError, UnsupportedTransportError, AbortError } from \"./Errors\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { HttpTransportType, TransferFormat } from \"./ITransport\";\r\nimport { LongPollingTransport } from \"./LongPollingTransport\";\r\nimport { ServerSentEventsTransport } from \"./ServerSentEventsTransport\";\r\nimport { Arg, createLogger, getUserAgentHeader, Platform } from \"./Utils\";\r\nimport { WebSocketTransport } from \"./WebSocketTransport\";\r\nconst MAX_REDIRECTS = 100;\r\n/** @private */\r\nexport class HttpConnection {\r\n constructor(url, options = {}) {\r\n this._stopPromiseResolver = () => { };\r\n this.features = {};\r\n this._negotiateVersion = 1;\r\n Arg.isRequired(url, \"url\");\r\n this._logger = createLogger(options.logger);\r\n this.baseUrl = this._resolveUrl(url);\r\n options = options || {};\r\n options.logMessageContent = options.logMessageContent === undefined ? false : options.logMessageContent;\r\n if (typeof options.withCredentials === \"boolean\" || options.withCredentials === undefined) {\r\n options.withCredentials = options.withCredentials === undefined ? true : options.withCredentials;\r\n }\r\n else {\r\n throw new Error(\"withCredentials option was not a 'boolean' or 'undefined' value\");\r\n }\r\n options.timeout = options.timeout === undefined ? 100 * 1000 : options.timeout;\r\n let webSocketModule = null;\r\n let eventSourceModule = null;\r\n if (Platform.isNode && typeof require !== \"undefined\") {\r\n // In order to ignore the dynamic require in webpack builds we need to do this magic\r\n // @ts-ignore: TS doesn't know about these names\r\n const requireFunc = typeof __webpack_require__ === \"function\" ? __non_webpack_require__ : require;\r\n webSocketModule = requireFunc(\"ws\");\r\n eventSourceModule = requireFunc(\"eventsource\");\r\n }\r\n if (!Platform.isNode && typeof WebSocket !== \"undefined\" && !options.WebSocket) {\r\n options.WebSocket = WebSocket;\r\n }\r\n else if (Platform.isNode && !options.WebSocket) {\r\n if (webSocketModule) {\r\n options.WebSocket = webSocketModule;\r\n }\r\n }\r\n if (!Platform.isNode && typeof EventSource !== \"undefined\" && !options.EventSource) {\r\n options.EventSource = EventSource;\r\n }\r\n else if (Platform.isNode && !options.EventSource) {\r\n if (typeof eventSourceModule !== \"undefined\") {\r\n options.EventSource = eventSourceModule;\r\n }\r\n }\r\n this._httpClient = new AccessTokenHttpClient(options.httpClient || new DefaultHttpClient(this._logger), options.accessTokenFactory);\r\n this._connectionState = \"Disconnected\" /* Disconnected */;\r\n this._connectionStarted = false;\r\n this._options = options;\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n async start(transferFormat) {\r\n transferFormat = transferFormat || TransferFormat.Binary;\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n this._logger.log(LogLevel.Debug, `Starting connection with transfer format '${TransferFormat[transferFormat]}'.`);\r\n if (this._connectionState !== \"Disconnected\" /* Disconnected */) {\r\n return Promise.reject(new Error(\"Cannot start an HttpConnection that is not in the 'Disconnected' state.\"));\r\n }\r\n this._connectionState = \"Connecting\" /* Connecting */;\r\n this._startInternalPromise = this._startInternal(transferFormat);\r\n await this._startInternalPromise;\r\n // The TypeScript compiler thinks that connectionState must be Connecting here. The TypeScript compiler is wrong.\r\n if (this._connectionState === \"Disconnecting\" /* Disconnecting */) {\r\n // stop() was called and transitioned the client into the Disconnecting state.\r\n const message = \"Failed to start the HttpConnection before stop() was called.\";\r\n this._logger.log(LogLevel.Error, message);\r\n // We cannot await stopPromise inside startInternal since stopInternal awaits the startInternalPromise.\r\n await this._stopPromise;\r\n return Promise.reject(new AbortError(message));\r\n }\r\n else if (this._connectionState !== \"Connected\" /* Connected */) {\r\n // stop() was called and transitioned the client into the Disconnecting state.\r\n const message = \"HttpConnection.startInternal completed gracefully but didn't enter the connection into the connected state!\";\r\n this._logger.log(LogLevel.Error, message);\r\n return Promise.reject(new AbortError(message));\r\n }\r\n this._connectionStarted = true;\r\n }\r\n send(data) {\r\n if (this._connectionState !== \"Connected\" /* Connected */) {\r\n return Promise.reject(new Error(\"Cannot send data if the connection is not in the 'Connected' State.\"));\r\n }\r\n if (!this._sendQueue) {\r\n this._sendQueue = new TransportSendQueue(this.transport);\r\n }\r\n // Transport will not be null if state is connected\r\n return this._sendQueue.send(data);\r\n }\r\n async stop(error) {\r\n if (this._connectionState === \"Disconnected\" /* Disconnected */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnected state.`);\r\n return Promise.resolve();\r\n }\r\n if (this._connectionState === \"Disconnecting\" /* Disconnecting */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stop(${error}) ignored because the connection is already in the disconnecting state.`);\r\n return this._stopPromise;\r\n }\r\n this._connectionState = \"Disconnecting\" /* Disconnecting */;\r\n this._stopPromise = new Promise((resolve) => {\r\n // Don't complete stop() until stopConnection() completes.\r\n this._stopPromiseResolver = resolve;\r\n });\r\n // stopInternal should never throw so just observe it.\r\n await this._stopInternal(error);\r\n await this._stopPromise;\r\n }\r\n async _stopInternal(error) {\r\n // Set error as soon as possible otherwise there is a race between\r\n // the transport closing and providing an error and the error from a close message\r\n // We would prefer the close message error.\r\n this._stopError = error;\r\n try {\r\n await this._startInternalPromise;\r\n }\r\n catch (e) {\r\n // This exception is returned to the user as a rejected Promise from the start method.\r\n }\r\n // The transport's onclose will trigger stopConnection which will run our onclose event.\r\n // The transport should always be set if currently connected. If it wasn't set, it's likely because\r\n // stop was called during start() and start() failed.\r\n if (this.transport) {\r\n try {\r\n await this.transport.stop();\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.transport.stop() threw error '${e}'.`);\r\n this._stopConnection();\r\n }\r\n this.transport = undefined;\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, \"HttpConnection.transport is undefined in HttpConnection.stop() because start() failed.\");\r\n }\r\n }\r\n async _startInternal(transferFormat) {\r\n // Store the original base url and the access token factory since they may change\r\n // as part of negotiating\r\n let url = this.baseUrl;\r\n this._accessTokenFactory = this._options.accessTokenFactory;\r\n this._httpClient._accessTokenFactory = this._accessTokenFactory;\r\n try {\r\n if (this._options.skipNegotiation) {\r\n if (this._options.transport === HttpTransportType.WebSockets) {\r\n // No need to add a connection ID in this case\r\n this.transport = this._constructTransport(HttpTransportType.WebSockets);\r\n // We should just call connect directly in this case.\r\n // No fallback or negotiate in this case.\r\n await this._startTransport(url, transferFormat);\r\n }\r\n else {\r\n throw new Error(\"Negotiation can only be skipped when using the WebSocket transport directly.\");\r\n }\r\n }\r\n else {\r\n let negotiateResponse = null;\r\n let redirects = 0;\r\n do {\r\n negotiateResponse = await this._getNegotiationResponse(url);\r\n // the user tries to stop the connection when it is being started\r\n if (this._connectionState === \"Disconnecting\" /* Disconnecting */ || this._connectionState === \"Disconnected\" /* Disconnected */) {\r\n throw new AbortError(\"The connection was stopped during negotiation.\");\r\n }\r\n if (negotiateResponse.error) {\r\n throw new Error(negotiateResponse.error);\r\n }\r\n if (negotiateResponse.ProtocolVersion) {\r\n 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.\");\r\n }\r\n if (negotiateResponse.url) {\r\n url = negotiateResponse.url;\r\n }\r\n if (negotiateResponse.accessToken) {\r\n // Replace the current access token factory with one that uses\r\n // the returned access token\r\n const accessToken = negotiateResponse.accessToken;\r\n this._accessTokenFactory = () => accessToken;\r\n // set the factory to undefined so the AccessTokenHttpClient won't retry with the same token, since we know it won't change until a connection restart\r\n this._httpClient._accessToken = accessToken;\r\n this._httpClient._accessTokenFactory = undefined;\r\n }\r\n redirects++;\r\n } while (negotiateResponse.url && redirects < MAX_REDIRECTS);\r\n if (redirects === MAX_REDIRECTS && negotiateResponse.url) {\r\n throw new Error(\"Negotiate redirection limit exceeded.\");\r\n }\r\n await this._createTransport(url, this._options.transport, negotiateResponse, transferFormat);\r\n }\r\n if (this.transport instanceof LongPollingTransport) {\r\n this.features.inherentKeepAlive = true;\r\n }\r\n if (this._connectionState === \"Connecting\" /* Connecting */) {\r\n // Ensure the connection transitions to the connected state prior to completing this.startInternalPromise.\r\n // start() will handle the case when stop was called and startInternal exits still in the disconnecting state.\r\n this._logger.log(LogLevel.Debug, \"The HttpConnection connected successfully.\");\r\n this._connectionState = \"Connected\" /* Connected */;\r\n }\r\n // stop() is waiting on us via this.startInternalPromise so keep this.transport around so it can clean up.\r\n // This is the only case startInternal can exit in neither the connected nor disconnected state because stopConnection()\r\n // will transition to the disconnected state. start() will wait for the transition using the stopPromise.\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, \"Failed to start the connection: \" + e);\r\n this._connectionState = \"Disconnected\" /* Disconnected */;\r\n this.transport = undefined;\r\n // if start fails, any active calls to stop assume that start will complete the stop promise\r\n this._stopPromiseResolver();\r\n return Promise.reject(e);\r\n }\r\n }\r\n async _getNegotiationResponse(url) {\r\n const headers = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n const negotiateUrl = this._resolveNegotiateUrl(url);\r\n this._logger.log(LogLevel.Debug, `Sending negotiation request: ${negotiateUrl}.`);\r\n try {\r\n const response = await this._httpClient.post(negotiateUrl, {\r\n content: \"\",\r\n headers: { ...headers, ...this._options.headers },\r\n timeout: this._options.timeout,\r\n withCredentials: this._options.withCredentials,\r\n });\r\n if (response.statusCode !== 200) {\r\n return Promise.reject(new Error(`Unexpected status code returned from negotiate '${response.statusCode}'`));\r\n }\r\n const negotiateResponse = JSON.parse(response.content);\r\n if (!negotiateResponse.negotiateVersion || negotiateResponse.negotiateVersion < 1) {\r\n // Negotiate version 0 doesn't use connectionToken\r\n // So we set it equal to connectionId so all our logic can use connectionToken without being aware of the negotiate version\r\n negotiateResponse.connectionToken = negotiateResponse.connectionId;\r\n }\r\n return negotiateResponse;\r\n }\r\n catch (e) {\r\n let errorMessage = \"Failed to complete negotiation with the server: \" + e;\r\n if (e instanceof HttpError) {\r\n if (e.statusCode === 404) {\r\n errorMessage = errorMessage + \" Either this is not a SignalR endpoint or there is a proxy blocking the connection.\";\r\n }\r\n }\r\n this._logger.log(LogLevel.Error, errorMessage);\r\n return Promise.reject(new FailedToNegotiateWithServerError(errorMessage));\r\n }\r\n }\r\n _createConnectUrl(url, connectionToken) {\r\n if (!connectionToken) {\r\n return url;\r\n }\r\n return url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + `id=${connectionToken}`;\r\n }\r\n async _createTransport(url, requestedTransport, negotiateResponse, requestedTransferFormat) {\r\n let connectUrl = this._createConnectUrl(url, negotiateResponse.connectionToken);\r\n if (this._isITransport(requestedTransport)) {\r\n this._logger.log(LogLevel.Debug, \"Connection was provided an instance of ITransport, using that directly.\");\r\n this.transport = requestedTransport;\r\n await this._startTransport(connectUrl, requestedTransferFormat);\r\n this.connectionId = negotiateResponse.connectionId;\r\n return;\r\n }\r\n const transportExceptions = [];\r\n const transports = negotiateResponse.availableTransports || [];\r\n let negotiate = negotiateResponse;\r\n for (const endpoint of transports) {\r\n const transportOrError = this._resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat);\r\n if (transportOrError instanceof Error) {\r\n // Store the error and continue, we don't want to cause a re-negotiate in these cases\r\n transportExceptions.push(`${endpoint.transport} failed:`);\r\n transportExceptions.push(transportOrError);\r\n }\r\n else if (this._isITransport(transportOrError)) {\r\n this.transport = transportOrError;\r\n if (!negotiate) {\r\n try {\r\n negotiate = await this._getNegotiationResponse(url);\r\n }\r\n catch (ex) {\r\n return Promise.reject(ex);\r\n }\r\n connectUrl = this._createConnectUrl(url, negotiate.connectionToken);\r\n }\r\n try {\r\n await this._startTransport(connectUrl, requestedTransferFormat);\r\n this.connectionId = negotiate.connectionId;\r\n return;\r\n }\r\n catch (ex) {\r\n this._logger.log(LogLevel.Error, `Failed to start the transport '${endpoint.transport}': ${ex}`);\r\n negotiate = undefined;\r\n transportExceptions.push(new FailedToStartTransportError(`${endpoint.transport} failed: ${ex}`, HttpTransportType[endpoint.transport]));\r\n if (this._connectionState !== \"Connecting\" /* Connecting */) {\r\n const message = \"Failed to select transport before stop() was called.\";\r\n this._logger.log(LogLevel.Debug, message);\r\n return Promise.reject(new AbortError(message));\r\n }\r\n }\r\n }\r\n }\r\n if (transportExceptions.length > 0) {\r\n return Promise.reject(new AggregateErrors(`Unable to connect to the server with any of the available transports. ${transportExceptions.join(\" \")}`, transportExceptions));\r\n }\r\n return Promise.reject(new Error(\"None of the transports supported by the client are supported by the server.\"));\r\n }\r\n _constructTransport(transport) {\r\n switch (transport) {\r\n case HttpTransportType.WebSockets:\r\n if (!this._options.WebSocket) {\r\n throw new Error(\"'WebSocket' is not supported in your environment.\");\r\n }\r\n return new WebSocketTransport(this._httpClient, this._accessTokenFactory, this._logger, this._options.logMessageContent, this._options.WebSocket, this._options.headers || {});\r\n case HttpTransportType.ServerSentEvents:\r\n if (!this._options.EventSource) {\r\n throw new Error(\"'EventSource' is not supported in your environment.\");\r\n }\r\n return new ServerSentEventsTransport(this._httpClient, this._httpClient._accessToken, this._logger, this._options);\r\n case HttpTransportType.LongPolling:\r\n return new LongPollingTransport(this._httpClient, this._logger, this._options);\r\n default:\r\n throw new Error(`Unknown transport: ${transport}.`);\r\n }\r\n }\r\n _startTransport(url, transferFormat) {\r\n this.transport.onreceive = this.onreceive;\r\n this.transport.onclose = (e) => this._stopConnection(e);\r\n return this.transport.connect(url, transferFormat);\r\n }\r\n _resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat) {\r\n const transport = HttpTransportType[endpoint.transport];\r\n if (transport === null || transport === undefined) {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${endpoint.transport}' because it is not supported by this client.`);\r\n return new Error(`Skipping transport '${endpoint.transport}' because it is not supported by this client.`);\r\n }\r\n else {\r\n if (transportMatches(requestedTransport, transport)) {\r\n const transferFormats = endpoint.transferFormats.map((s) => TransferFormat[s]);\r\n if (transferFormats.indexOf(requestedTransferFormat) >= 0) {\r\n if ((transport === HttpTransportType.WebSockets && !this._options.WebSocket) ||\r\n (transport === HttpTransportType.ServerSentEvents && !this._options.EventSource)) {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it is not supported in your environment.'`);\r\n return new UnsupportedTransportError(`'${HttpTransportType[transport]}' is not supported in your environment.`, transport);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Selecting transport '${HttpTransportType[transport]}'.`);\r\n try {\r\n return this._constructTransport(transport);\r\n }\r\n catch (ex) {\r\n return ex;\r\n }\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it does not support the requested transfer format '${TransferFormat[requestedTransferFormat]}'.`);\r\n return new Error(`'${HttpTransportType[transport]}' does not support ${TransferFormat[requestedTransferFormat]}.`);\r\n }\r\n }\r\n else {\r\n this._logger.log(LogLevel.Debug, `Skipping transport '${HttpTransportType[transport]}' because it was disabled by the client.`);\r\n return new DisabledTransportError(`'${HttpTransportType[transport]}' is disabled by the client.`, transport);\r\n }\r\n }\r\n }\r\n _isITransport(transport) {\r\n return transport && typeof (transport) === \"object\" && \"connect\" in transport;\r\n }\r\n _stopConnection(error) {\r\n this._logger.log(LogLevel.Debug, `HttpConnection.stopConnection(${error}) called while in state ${this._connectionState}.`);\r\n this.transport = undefined;\r\n // If we have a stopError, it takes precedence over the error from the transport\r\n error = this._stopError || error;\r\n this._stopError = undefined;\r\n if (this._connectionState === \"Disconnected\" /* Disconnected */) {\r\n this._logger.log(LogLevel.Debug, `Call to HttpConnection.stopConnection(${error}) was ignored because the connection is already in the disconnected state.`);\r\n return;\r\n }\r\n if (this._connectionState === \"Connecting\" /* Connecting */) {\r\n this._logger.log(LogLevel.Warning, `Call to HttpConnection.stopConnection(${error}) was ignored because the connection is still in the connecting state.`);\r\n throw new Error(`HttpConnection.stopConnection(${error}) was called while the connection is still in the connecting state.`);\r\n }\r\n if (this._connectionState === \"Disconnecting\" /* Disconnecting */) {\r\n // A call to stop() induced this call to stopConnection and needs to be completed.\r\n // Any stop() awaiters will be scheduled to continue after the onclose callback fires.\r\n this._stopPromiseResolver();\r\n }\r\n if (error) {\r\n this._logger.log(LogLevel.Error, `Connection disconnected with error '${error}'.`);\r\n }\r\n else {\r\n this._logger.log(LogLevel.Information, \"Connection disconnected.\");\r\n }\r\n if (this._sendQueue) {\r\n this._sendQueue.stop().catch((e) => {\r\n this._logger.log(LogLevel.Error, `TransportSendQueue.stop() threw error '${e}'.`);\r\n });\r\n this._sendQueue = undefined;\r\n }\r\n this.connectionId = undefined;\r\n this._connectionState = \"Disconnected\" /* Disconnected */;\r\n if (this._connectionStarted) {\r\n this._connectionStarted = false;\r\n try {\r\n if (this.onclose) {\r\n this.onclose(error);\r\n }\r\n }\r\n catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.onclose(${error}) threw error '${e}'.`);\r\n }\r\n }\r\n }\r\n _resolveUrl(url) {\r\n // startsWith is not supported in IE\r\n if (url.lastIndexOf(\"https://\", 0) === 0 || url.lastIndexOf(\"http://\", 0) === 0) {\r\n return url;\r\n }\r\n if (!Platform.isBrowser) {\r\n throw new Error(`Cannot resolve '${url}'.`);\r\n }\r\n // Setting the url to the href propery of an anchor tag handles normalization\r\n // for us. There are 3 main cases.\r\n // 1. Relative path normalization e.g \"b\" -> \"http://localhost:5000/a/b\"\r\n // 2. Absolute path normalization e.g \"/a/b\" -> \"http://localhost:5000/a/b\"\r\n // 3. Networkpath reference normalization e.g \"//localhost:5000/a/b\" -> \"http://localhost:5000/a/b\"\r\n const aTag = window.document.createElement(\"a\");\r\n aTag.href = url;\r\n this._logger.log(LogLevel.Information, `Normalizing '${url}' to '${aTag.href}'.`);\r\n return aTag.href;\r\n }\r\n _resolveNegotiateUrl(url) {\r\n const index = url.indexOf(\"?\");\r\n let negotiateUrl = url.substring(0, index === -1 ? url.length : index);\r\n if (negotiateUrl[negotiateUrl.length - 1] !== \"/\") {\r\n negotiateUrl += \"/\";\r\n }\r\n negotiateUrl += \"negotiate\";\r\n negotiateUrl += index === -1 ? \"\" : url.substring(index);\r\n if (negotiateUrl.indexOf(\"negotiateVersion\") === -1) {\r\n negotiateUrl += index === -1 ? \"?\" : \"&\";\r\n negotiateUrl += \"negotiateVersion=\" + this._negotiateVersion;\r\n }\r\n return negotiateUrl;\r\n }\r\n}\r\nfunction transportMatches(requestedTransport, actualTransport) {\r\n return !requestedTransport || ((actualTransport & requestedTransport) !== 0);\r\n}\r\n/** @private */\r\nexport class TransportSendQueue {\r\n constructor(_transport) {\r\n this._transport = _transport;\r\n this._buffer = [];\r\n this._executing = true;\r\n this._sendBufferedData = new PromiseSource();\r\n this._transportResult = new PromiseSource();\r\n this._sendLoopPromise = this._sendLoop();\r\n }\r\n send(data) {\r\n this._bufferData(data);\r\n if (!this._transportResult) {\r\n this._transportResult = new PromiseSource();\r\n }\r\n return this._transportResult.promise;\r\n }\r\n stop() {\r\n this._executing = false;\r\n this._sendBufferedData.resolve();\r\n return this._sendLoopPromise;\r\n }\r\n _bufferData(data) {\r\n if (this._buffer.length && typeof (this._buffer[0]) !== typeof (data)) {\r\n throw new Error(`Expected data to be of type ${typeof (this._buffer)} but was of type ${typeof (data)}`);\r\n }\r\n this._buffer.push(data);\r\n this._sendBufferedData.resolve();\r\n }\r\n async _sendLoop() {\r\n while (true) {\r\n await this._sendBufferedData.promise;\r\n if (!this._executing) {\r\n if (this._transportResult) {\r\n this._transportResult.reject(\"Connection stopped.\");\r\n }\r\n break;\r\n }\r\n this._sendBufferedData = new PromiseSource();\r\n const transportResult = this._transportResult;\r\n this._transportResult = undefined;\r\n const data = typeof (this._buffer[0]) === \"string\" ?\r\n this._buffer.join(\"\") :\r\n TransportSendQueue._concatBuffers(this._buffer);\r\n this._buffer.length = 0;\r\n try {\r\n await this._transport.send(data);\r\n transportResult.resolve();\r\n }\r\n catch (error) {\r\n transportResult.reject(error);\r\n }\r\n }\r\n }\r\n static _concatBuffers(arrayBuffers) {\r\n const totalLength = arrayBuffers.map((b) => b.byteLength).reduce((a, b) => a + b);\r\n const result = new Uint8Array(totalLength);\r\n let offset = 0;\r\n for (const item of arrayBuffers) {\r\n result.set(new Uint8Array(item), offset);\r\n offset += item.byteLength;\r\n }\r\n return result.buffer;\r\n }\r\n}\r\nclass PromiseSource {\r\n constructor() {\r\n this.promise = new Promise((resolve, reject) => [this._resolver, this._rejecter] = [resolve, reject]);\r\n }\r\n resolve() {\r\n this._resolver();\r\n }\r\n reject(reason) {\r\n this._rejecter(reason);\r\n }\r\n}\r\n//# sourceMappingURL=HttpConnection.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { MessageType } from \"./IHubProtocol\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nconst JSON_HUB_PROTOCOL_NAME = \"json\";\r\n/** Implements the JSON Hub Protocol. */\r\nexport class JsonHubProtocol {\r\n constructor() {\r\n /** @inheritDoc */\r\n this.name = JSON_HUB_PROTOCOL_NAME;\r\n /** @inheritDoc */\r\n this.version = 1;\r\n /** @inheritDoc */\r\n this.transferFormat = TransferFormat.Text;\r\n }\r\n /** Creates an array of {@link @microsoft/signalr.HubMessage} objects from the specified serialized representation.\r\n *\r\n * @param {string} input A string containing the serialized representation.\r\n * @param {ILogger} logger A logger that will be used to log messages that occur during parsing.\r\n */\r\n parseMessages(input, logger) {\r\n // The interface does allow \"ArrayBuffer\" to be passed in, but this implementation does not. So let's throw a useful error.\r\n if (typeof input !== \"string\") {\r\n throw new Error(\"Invalid input for JSON hub protocol. Expected a string.\");\r\n }\r\n if (!input) {\r\n return [];\r\n }\r\n if (logger === null) {\r\n logger = NullLogger.instance;\r\n }\r\n // Parse the messages\r\n const messages = TextMessageFormat.parse(input);\r\n const hubMessages = [];\r\n for (const message of messages) {\r\n const parsedMessage = JSON.parse(message);\r\n if (typeof parsedMessage.type !== \"number\") {\r\n throw new Error(\"Invalid payload.\");\r\n }\r\n switch (parsedMessage.type) {\r\n case MessageType.Invocation:\r\n this._isInvocationMessage(parsedMessage);\r\n break;\r\n case MessageType.StreamItem:\r\n this._isStreamItemMessage(parsedMessage);\r\n break;\r\n case MessageType.Completion:\r\n this._isCompletionMessage(parsedMessage);\r\n break;\r\n case MessageType.Ping:\r\n // Single value, no need to validate\r\n break;\r\n case MessageType.Close:\r\n // All optional values, no need to validate\r\n break;\r\n default:\r\n // Future protocol changes can add message types, old clients can ignore them\r\n logger.log(LogLevel.Information, \"Unknown message type '\" + parsedMessage.type + \"' ignored.\");\r\n continue;\r\n }\r\n hubMessages.push(parsedMessage);\r\n }\r\n return hubMessages;\r\n }\r\n /** Writes the specified {@link @microsoft/signalr.HubMessage} to a string and returns it.\r\n *\r\n * @param {HubMessage} message The message to write.\r\n * @returns {string} A string containing the serialized representation of the message.\r\n */\r\n writeMessage(message) {\r\n return TextMessageFormat.write(JSON.stringify(message));\r\n }\r\n _isInvocationMessage(message) {\r\n this._assertNotEmptyString(message.target, \"Invalid payload for Invocation message.\");\r\n if (message.invocationId !== undefined) {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Invocation message.\");\r\n }\r\n }\r\n _isStreamItemMessage(message) {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for StreamItem message.\");\r\n if (message.item === undefined) {\r\n throw new Error(\"Invalid payload for StreamItem message.\");\r\n }\r\n }\r\n _isCompletionMessage(message) {\r\n if (message.result && message.error) {\r\n throw new Error(\"Invalid payload for Completion message.\");\r\n }\r\n if (!message.result && message.error) {\r\n this._assertNotEmptyString(message.error, \"Invalid payload for Completion message.\");\r\n }\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Completion message.\");\r\n }\r\n _assertNotEmptyString(value, errorMessage) {\r\n if (typeof value !== \"string\" || value === \"\") {\r\n throw new Error(errorMessage);\r\n }\r\n }\r\n}\r\n//# sourceMappingURL=JsonHubProtocol.js.map","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\nimport { DefaultReconnectPolicy } from \"./DefaultReconnectPolicy\";\r\nimport { HttpConnection } from \"./HttpConnection\";\r\nimport { HubConnection } from \"./HubConnection\";\r\nimport { LogLevel } from \"./ILogger\";\r\nimport { JsonHubProtocol } from \"./JsonHubProtocol\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { Arg, ConsoleLogger } from \"./Utils\";\r\nconst LogLevelNameMapping = {\r\n trace: LogLevel.Trace,\r\n debug: LogLevel.Debug,\r\n info: LogLevel.Information,\r\n information: LogLevel.Information,\r\n warn: LogLevel.Warning,\r\n warning: LogLevel.Warning,\r\n error: LogLevel.Error,\r\n critical: LogLevel.Critical,\r\n none: LogLevel.None,\r\n};\r\nfunction parseLogLevel(name) {\r\n // Case-insensitive matching via lower-casing\r\n // Yes, I know case-folding is a complicated problem in Unicode, but we only support\r\n // the ASCII strings defined in LogLevelNameMapping anyway, so it's fine -anurse.\r\n const mapping = LogLevelNameMapping[name.toLowerCase()];\r\n if (typeof mapping !== \"undefined\") {\r\n return mapping;\r\n }\r\n else {\r\n throw new Error(`Unknown log level: ${name}`);\r\n }\r\n}\r\n/** A builder for configuring {@link @microsoft/signalr.HubConnection} instances. */\r\nexport class HubConnectionBuilder {\r\n configureLogging(logging) {\r\n Arg.isRequired(logging, \"logging\");\r\n if (isLogger(logging)) {\r\n this.logger = logging;\r\n }\r\n else if (typeof logging === \"string\") {\r\n const logLevel = parseLogLevel(logging);\r\n this.logger = new ConsoleLogger(logLevel);\r\n }\r\n else {\r\n this.logger = new ConsoleLogger(logging);\r\n }\r\n return this;\r\n }\r\n withUrl(url, transportTypeOrOptions) {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isNotEmpty(url, \"url\");\r\n this.url = url;\r\n // Flow-typing knows where it's at. Since HttpTransportType is a number and IHttpConnectionOptions is guaranteed\r\n // to be an object, we know (as does TypeScript) this comparison is all we need to figure out which overload was called.\r\n if (typeof transportTypeOrOptions === \"object\") {\r\n this.httpConnectionOptions = { ...this.httpConnectionOptions, ...transportTypeOrOptions };\r\n }\r\n else {\r\n this.httpConnectionOptions = {\r\n ...this.httpConnectionOptions,\r\n transport: transportTypeOrOptions,\r\n };\r\n }\r\n return this;\r\n }\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to use the specified Hub Protocol.\r\n *\r\n * @param {IHubProtocol} protocol The {@link @microsoft/signalr.IHubProtocol} implementation to use.\r\n */\r\n withHubProtocol(protocol) {\r\n Arg.isRequired(protocol, \"protocol\");\r\n this.protocol = protocol;\r\n return this;\r\n }\r\n withAutomaticReconnect(retryDelaysOrReconnectPolicy) {\r\n if (this.reconnectPolicy) {\r\n throw new Error(\"A reconnectPolicy has already been set.\");\r\n }\r\n if (!retryDelaysOrReconnectPolicy) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy();\r\n }\r\n else if (Array.isArray(retryDelaysOrReconnectPolicy)) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy(retryDelaysOrReconnectPolicy);\r\n }\r\n else {\r\n this.reconnectPolicy = retryDelaysOrReconnectPolicy;\r\n }\r\n return this;\r\n }\r\n /** Creates a {@link @microsoft/signalr.HubConnection} from the configuration options specified in this builder.\r\n *\r\n * @returns {HubConnection} The configured {@link @microsoft/signalr.HubConnection}.\r\n */\r\n build() {\r\n // If httpConnectionOptions has a logger, use it. Otherwise, override it with the one\r\n // provided to configureLogger\r\n const httpConnectionOptions = this.httpConnectionOptions || {};\r\n // If it's 'null', the user **explicitly** asked for null, don't mess with it.\r\n if (httpConnectionOptions.logger === undefined) {\r\n // If our logger is undefined or null, that's OK, the HttpConnection constructor will handle it.\r\n httpConnectionOptions.logger = this.logger;\r\n }\r\n // Now create the connection\r\n if (!this.url) {\r\n throw new Error(\"The 'HubConnectionBuilder.withUrl' method must be called before building the connection.\");\r\n }\r\n const connection = new HttpConnection(this.url, httpConnectionOptions);\r\n return HubConnection.create(connection, this.logger || NullLogger.instance, this.protocol || new JsonHubProtocol(), this.reconnectPolicy);\r\n }\r\n}\r\nfunction isLogger(logger) {\r\n return logger.log !== undefined;\r\n}\r\n//# sourceMappingURL=HubConnectionBuilder.js.map"],"sourceRoot":""}