{"version":3,"file":"microsoft-914f5c4f.js","sources":["../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/Errors.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/HttpClient.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/ILogger.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/Loggers.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/Utils.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/Subject.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/HubConnection.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/ITransport.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/AbortController.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js","../../../../web/tnt-mate-api/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.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/** 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// 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","// 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\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.12\";\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\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\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 { 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"],"names":["HttpError","errorMessage","statusCode","trueProto","TimeoutError","AbortError","UnsupportedTransportError","message","transport","DisabledTransportError","FailedToStartTransportError","FailedToNegotiateWithServerError","AggregateErrors","innerErrors","HttpResponse","statusText","content","HttpClient","url","options","LogLevel","NullLogger","_logLevel","_message","VERSION","Arg","val","name","values","Platform","getDataDetail","data","includeContent","detail","isArrayBuffer","formatArrayBuffer","view","str","num","pad","sendMessage","logger","transportName","httpClient","headers","value","getUserAgentHeader","responseType","response","createLogger","ConsoleLogger","SubjectSubscription","subject","observer","index","_","minimumLogLevel","logLevel","msg","userAgentHeaderName","constructUserAgent","getOsName","getRuntime","getRuntimeVersion","version","os","runtime","runtimeVersion","userAgent","majorAndMinor","getErrorString","e","getGlobalThis","FetchHttpClient","requireFunc","request","abortController","error","timeoutId","msTimeout","deserializeContent","payload","cookies","c","XhrHttpClient","resolve","reject","xhr","header","DefaultHttpClient","TextMessageFormat","output","input","messages","HandshakeProtocol","handshakeRequest","messageData","remainingData","binaryData","separatorIndex","responseLength","textData","MessageType","Subject","item","err","DEFAULT_TIMEOUT_IN_MS","DEFAULT_PING_INTERVAL_IN_MS","HubConnectionState","HubConnection","connection","protocol","reconnectPolicy","handshakePromise","startPromise","methodName","args","streams","streamIds","invocationDescriptor","promiseQueue","cancelInvocation","invocationEvent","sendPromise","newMethod","method","handlers","removeIdx","callback","responseMessage","nextPing","invocationMessage","methods","methodsCopy","expectsResponse","res","exception","completionMessage","m","prevRes","reconnectStartTime","previousReconnectAttempts","retryError","nextRetryDelay","previousRetryCount","elapsedMilliseconds","retryReason","callbacks","key","nonblocking","invocationId","streamId","i","argument","arg","id","result","DEFAULT_RETRY_DELAYS_IN_MILLISECONDS","DefaultReconnectPolicy","retryDelays","retryContext","HeaderNames","AccessTokenHttpClient","innerClient","accessTokenFactory","allowRetry","HttpTransportType","TransferFormat","AbortController","LongPollingTransport","transferFormat","pollOptions","pollUrl","deleteOptions","logMessage","ServerSentEventsTransport","accessToken","opened","eventSource","WebSocketTransport","logMessageContent","webSocketConstructor","token","webSocket","_event","event","MAX_REDIRECTS","HttpConnection","webSocketModule","eventSourceModule","TransportSendQueue","negotiateResponse","redirects","negotiateUrl","connectionToken","requestedTransport","requestedTransferFormat","connectUrl","transportExceptions","transports","negotiate","endpoint","transportOrError","ex","transportMatches","s","aTag","actualTransport","_transport","PromiseSource","transportResult","arrayBuffers","totalLength","b","a","offset","reason","JSON_HUB_PROTOCOL_NAME","JsonHubProtocol","hubMessages","parsedMessage","LogLevelNameMapping","parseLogLevel","mapping","HubConnectionBuilder","logging","isLogger","transportTypeOrOptions","retryDelaysOrReconnectPolicy","httpConnectionOptions"],"mappings":"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"}