{"version":3,"file":"static/js/6402.b11cc235.js","mappings":"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","sources":["../node_modules/@microsoft/signalr/src/Errors.ts","../node_modules/@microsoft/signalr/src/HubConnection.ts","../node_modules/@microsoft/signalr/src/HandshakeProtocol.ts","../node_modules/@microsoft/signalr/src/Subject.ts","../node_modules/@microsoft/signalr/src/MessageBuffer.ts","../node_modules/@microsoft/signalr/src/DefaultReconnectPolicy.ts","../node_modules/@microsoft/signalr/src/HeaderNames.ts","../node_modules/@microsoft/signalr/src/HttpClient.ts","../node_modules/@microsoft/signalr/src/AccessTokenHttpClient.ts","../node_modules/@microsoft/signalr/src/FetchHttpClient.ts","../node_modules/@microsoft/signalr/src/DynamicImports.ts","../node_modules/@microsoft/signalr/src/XhrHttpClient.ts","../node_modules/@microsoft/signalr/src/ITransport.ts","../node_modules/@microsoft/signalr/src/DefaultHttpClient.ts","../node_modules/@microsoft/signalr/src/AbortController.ts","../node_modules/@microsoft/signalr/src/LongPollingTransport.ts","../node_modules/@microsoft/signalr/src/ServerSentEventsTransport.ts","../node_modules/@microsoft/signalr/src/WebSocketTransport.ts","../node_modules/@microsoft/signalr/src/HttpConnection.ts","../node_modules/@microsoft/signalr/src/JsonHubProtocol.ts","../node_modules/@microsoft/signalr/src/HubConnectionBuilder.ts","../node_modules/@microsoft/signalr/src/IHubProtocol.ts","../node_modules/@microsoft/signalr/src/ILogger.ts","../node_modules/@microsoft/signalr/src/Loggers.ts","../node_modules/@microsoft/signalr/src/TextMessageFormat.ts","../node_modules/@microsoft/signalr/src/Utils.ts"],"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\r\nimport { HttpTransportType } from \"./ITransport\";\r\n\r\n/** Error thrown when an HTTP request fails. */\r\nexport class HttpError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\r\n /** The HTTP status code represented by this error. */\r\n public statusCode: number;\r\n\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: string, statusCode: number) {\r\n const trueProto = new.target.prototype;\r\n super(`${errorMessage}: Status code '${statusCode}'`);\r\n this.statusCode = statusCode;\r\n\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\r\n/** Error thrown when a timeout elapses. */\r\nexport class TimeoutError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\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: string = \"A timeout occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n\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\r\n/** Error thrown when an action is aborted. */\r\nexport class AbortError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\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: string = \"An abort occurred.\") {\r\n const trueProto = new.target.prototype;\r\n super(errorMessage);\r\n\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\r\n/** Error thrown when the selected transport is unsupported by the browser. */\r\n/** @private */\r\nexport class UnsupportedTransportError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\r\n /** The {@link @microsoft/signalr.HttpTransportType} this error occurred on. */\r\n public transport: HttpTransportType;\r\n\r\n /** The type name of this error. */\r\n public errorType: string;\r\n\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: string, transport: HttpTransportType) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'UnsupportedTransportError';\r\n\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\r\n/** Error thrown when the selected transport is disabled by the browser. */\r\n/** @private */\r\nexport class DisabledTransportError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\r\n /** The {@link @microsoft/signalr.HttpTransportType} this error occurred on. */\r\n public transport: HttpTransportType;\r\n\r\n /** The type name of this error. */\r\n public errorType: string;\r\n\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: string, transport: HttpTransportType) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'DisabledTransportError';\r\n\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\r\n/** Error thrown when the selected transport cannot be started. */\r\n/** @private */\r\nexport class FailedToStartTransportError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\r\n /** The {@link @microsoft/signalr.HttpTransportType} this error occurred on. */\r\n public transport: HttpTransportType;\r\n\r\n /** The type name of this error. */\r\n public errorType: string;\r\n\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: string, transport: HttpTransportType) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.transport = transport;\r\n this.errorType = 'FailedToStartTransportError';\r\n\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\r\n/** Error thrown when the negotiation with the server failed to complete. */\r\n/** @private */\r\nexport class FailedToNegotiateWithServerError extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\r\n /** The type name of this error. */\r\n public errorType: string;\r\n\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: string) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n this.errorType = 'FailedToNegotiateWithServerError';\r\n\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\r\n/** Error thrown when multiple errors have occurred. */\r\n/** @private */\r\nexport class AggregateErrors extends Error {\r\n // @ts-ignore: Intentionally unused.\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private __proto__: Error;\r\n\r\n /** The collection of errors this error is aggregating. */\r\n public innerErrors: Error[];\r\n\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: string, innerErrors: Error[]) {\r\n const trueProto = new.target.prototype;\r\n super(message);\r\n\r\n this.innerErrors = innerErrors;\r\n\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","// 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\r\nimport { HandshakeProtocol, HandshakeRequestMessage, HandshakeResponseMessage } from \"./HandshakeProtocol\";\r\nimport { IConnection } from \"./IConnection\";\r\nimport { AbortError } from \"./Errors\";\r\nimport { CancelInvocationMessage, CloseMessage, CompletionMessage, IHubProtocol, InvocationMessage, MessageType, StreamInvocationMessage, StreamItemMessage } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { IRetryPolicy } from \"./IRetryPolicy\";\r\nimport { IStreamResult } from \"./Stream\";\r\nimport { Subject } from \"./Subject\";\r\nimport { Arg, getErrorString, Platform } from \"./Utils\";\r\nimport { MessageBuffer } from \"./MessageBuffer\";\r\n\r\nconst DEFAULT_TIMEOUT_IN_MS: number = 30 * 1000;\r\nconst DEFAULT_PING_INTERVAL_IN_MS: number = 15 * 1000;\r\nconst DEFAULT_STATEFUL_RECONNECT_BUFFER_SIZE = 100_000;\r\n\r\n/** Describes the current state of the {@link HubConnection} to the server. */\r\nexport enum HubConnectionState {\r\n /** The hub connection is disconnected. */\r\n Disconnected = \"Disconnected\",\r\n /** The hub connection is connecting. */\r\n Connecting = \"Connecting\",\r\n /** The hub connection is connected. */\r\n Connected = \"Connected\",\r\n /** The hub connection is disconnecting. */\r\n Disconnecting = \"Disconnecting\",\r\n /** The hub connection is reconnecting. */\r\n Reconnecting = \"Reconnecting\",\r\n}\r\n\r\n/** Represents a connection to a SignalR Hub. */\r\nexport class HubConnection {\r\n private readonly _cachedPingMessage: string | ArrayBuffer;\r\n // Needs to not start with _ for tests\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private readonly connection: IConnection;\r\n private readonly _logger: ILogger;\r\n private readonly _reconnectPolicy?: IRetryPolicy;\r\n private readonly _statefulReconnectBufferSize: number;\r\n private _protocol: IHubProtocol;\r\n private _handshakeProtocol: HandshakeProtocol;\r\n private _callbacks: { [invocationId: string]: (invocationEvent: StreamItemMessage | CompletionMessage | null, error?: Error) => void };\r\n private _methods: { [name: string]: (((...args: any[]) => void) | ((...args: any[]) => any))[] };\r\n private _invocationId: number;\r\n private _messageBuffer?: MessageBuffer;\r\n\r\n private _closedCallbacks: ((error?: Error) => void)[];\r\n private _reconnectingCallbacks: ((error?: Error) => void)[];\r\n private _reconnectedCallbacks: ((connectionId?: string) => void)[];\r\n\r\n private _receivedHandshakeResponse: boolean;\r\n private _handshakeResolver!: (value?: PromiseLike<{}>) => void;\r\n private _handshakeRejecter!: (reason?: any) => void;\r\n private _stopDuringStartError?: Error;\r\n\r\n private _connectionState: HubConnectionState;\r\n // connectionStarted is tracked independently from connectionState, so we can check if the\r\n // connection ever did successfully transition from connecting to connected before disconnecting.\r\n private _connectionStarted: boolean;\r\n private _startPromise?: Promise;\r\n private _stopPromise?: Promise;\r\n private _nextKeepAlive: number = 0;\r\n\r\n // The type of these a) doesn't matter and b) varies when building in browser and node contexts\r\n // Since we're building the WebPack bundle directly from the TypeScript, this matters (previously\r\n // we built the bundle from the compiled JavaScript).\r\n private _reconnectDelayHandle?: any;\r\n private _timeoutHandle?: any;\r\n private _pingServerHandle?: any;\r\n\r\n private _freezeEventListener = () =>\r\n {\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://learn.microsoft.com/aspnet/core/signalr/javascript-client#bsleep\");\r\n };\r\n\r\n /** The server timeout in milliseconds.\r\n *\r\n * If this timeout elapses without receiving any messages from the server, the connection will be terminated with an error.\r\n * The default timeout value is 30,000 milliseconds (30 seconds).\r\n */\r\n public serverTimeoutInMilliseconds: number;\r\n\r\n /** Default interval at which to ping the server.\r\n *\r\n * The default value is 15,000 milliseconds (15 seconds).\r\n * Allows the server to detect hard disconnects (like when a client unplugs their computer).\r\n * The ping will happen at most as often as the server pings.\r\n * If the server pings every 5 seconds, a value lower than 5 will ping every 5 seconds.\r\n */\r\n public keepAliveIntervalInMilliseconds: number;\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 public static create(\r\n connection: IConnection,\r\n logger: ILogger,\r\n protocol: IHubProtocol,\r\n reconnectPolicy?: IRetryPolicy,\r\n serverTimeoutInMilliseconds?: number,\r\n keepAliveIntervalInMilliseconds?: number,\r\n statefulReconnectBufferSize?: number): HubConnection {\r\n return new HubConnection(connection, logger, protocol, reconnectPolicy,\r\n serverTimeoutInMilliseconds, keepAliveIntervalInMilliseconds, statefulReconnectBufferSize);\r\n }\r\n\r\n private constructor(\r\n connection: IConnection,\r\n logger: ILogger,\r\n protocol: IHubProtocol,\r\n reconnectPolicy?: IRetryPolicy,\r\n serverTimeoutInMilliseconds?: number,\r\n keepAliveIntervalInMilliseconds?: number,\r\n statefulReconnectBufferSize?: number) {\r\n Arg.isRequired(connection, \"connection\");\r\n Arg.isRequired(logger, \"logger\");\r\n Arg.isRequired(protocol, \"protocol\");\r\n\r\n this.serverTimeoutInMilliseconds = serverTimeoutInMilliseconds ?? DEFAULT_TIMEOUT_IN_MS;\r\n this.keepAliveIntervalInMilliseconds = keepAliveIntervalInMilliseconds ?? DEFAULT_PING_INTERVAL_IN_MS;\r\n\r\n this._statefulReconnectBufferSize = statefulReconnectBufferSize ?? DEFAULT_STATEFUL_RECONNECT_BUFFER_SIZE;\r\n\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\r\n this.connection.onreceive = (data: any) => this._processIncomingData(data);\r\n this.connection.onclose = (error?: Error) => this._connectionClosed(error);\r\n\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\r\n this._cachedPingMessage = this._protocol.writeMessage({ type: MessageType.Ping });\r\n }\r\n\r\n /** Indicates the state of the {@link HubConnection} to the server. */\r\n get state(): HubConnectionState {\r\n return this._connectionState;\r\n }\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(): string | null {\r\n return this.connection ? (this.connection.connectionId || null) : null;\r\n }\r\n\r\n /** Indicates the url of the {@link HubConnection} to the server. */\r\n get baseUrl(): string {\r\n return this.connection.baseUrl || \"\";\r\n }\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: string) {\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\r\n if (!url) {\r\n throw new Error(\"The HubConnection url must be a valid url.\");\r\n }\r\n\r\n this.connection.baseUrl = url;\r\n }\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 public start(): Promise {\r\n this._startPromise = this._startWithStateTransitions();\r\n return this._startPromise;\r\n }\r\n\r\n private async _startWithStateTransitions(): Promise {\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\r\n this._connectionState = HubConnectionState.Connecting;\r\n this._logger.log(LogLevel.Debug, \"Starting HubConnection.\");\r\n\r\n try {\r\n await this._startInternal();\r\n\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\r\n this._connectionState = HubConnectionState.Connected;\r\n this._connectionStarted = true;\r\n this._logger.log(LogLevel.Debug, \"HubConnection connected successfully.\");\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\r\n private 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\r\n await this.connection.start(this._protocol.transferFormat);\r\n\r\n try {\r\n let version = this._protocol.version;\r\n if (!this.connection.features.reconnect) {\r\n // Stateful Reconnect starts with HubProtocol version 2, newer clients connecting to older servers will fail to connect due to\r\n // the handshake only supporting version 1, so we will try to send version 1 during the handshake to keep old servers working.\r\n version = 1;\r\n }\r\n\r\n const handshakeRequest: HandshakeRequestMessage = {\r\n protocol: this._protocol.name,\r\n version,\r\n };\r\n\r\n this._logger.log(LogLevel.Debug, \"Sending handshake request.\");\r\n\r\n await this._sendMessage(this._handshakeProtocol.writeHandshakeRequest(handshakeRequest));\r\n\r\n this._logger.log(LogLevel.Information, `Using HubProtocol '${this._protocol.name}'.`);\r\n\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\r\n await handshakePromise;\r\n\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\r\n const useStatefulReconnect = this.connection.features.reconnect || false;\r\n if (useStatefulReconnect) {\r\n this._messageBuffer = new MessageBuffer(this._protocol, this.connection, this._statefulReconnectBufferSize);\r\n this.connection.features.disconnected = this._messageBuffer._disconnected.bind(this._messageBuffer);\r\n this.connection.features.resend = () => {\r\n if (this._messageBuffer) {\r\n return this._messageBuffer._resend();\r\n }\r\n }\r\n }\r\n\r\n if (!this.connection.features.inherentKeepAlive) {\r\n await this._sendMessage(this._cachedPingMessage);\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\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n\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\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 public async stop(): Promise {\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.connection.features.reconnect = false;\r\n\r\n this._stopPromise = this._stopInternal();\r\n await this._stopPromise;\r\n\r\n try {\r\n // Awaiting undefined continues immediately\r\n await startPromise;\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\r\n private _stopInternal(error?: Error): Promise {\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\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\r\n const state = this._connectionState;\r\n this._connectionState = HubConnectionState.Disconnecting;\r\n\r\n this._logger.log(LogLevel.Debug, \"Stopping HubConnection.\");\r\n\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\r\n clearTimeout(this._reconnectDelayHandle);\r\n this._reconnectDelayHandle = undefined;\r\n\r\n this._completeClose();\r\n return Promise.resolve();\r\n }\r\n\r\n if (state === HubConnectionState.Connected) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._sendCloseMessage();\r\n }\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\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\r\n private async _sendCloseMessage() {\r\n try {\r\n await this._sendWithProtocol(this._createCloseMessage());\r\n } catch {\r\n // Ignore, this is a best effort attempt to let the server know the client closed gracefully.\r\n }\r\n }\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 public stream(methodName: string, ...args: any[]): IStreamResult {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createStreamInvocation(methodName, args, streamIds);\r\n\r\n // eslint-disable-next-line prefer-const\r\n let promiseQueue: Promise;\r\n\r\n const subject = new Subject();\r\n subject.cancelCallback = () => {\r\n const cancelInvocation: CancelInvocationMessage = this._createCancelInvocation(invocationDescriptor.invocationId);\r\n\r\n delete this._callbacks[invocationDescriptor.invocationId];\r\n\r\n return promiseQueue.then(() => {\r\n return this._sendWithProtocol(cancelInvocation);\r\n });\r\n };\r\n\r\n this._callbacks[invocationDescriptor.invocationId] = (invocationEvent: CompletionMessage | StreamItemMessage | null, error?: Error) => {\r\n if (error) {\r\n subject.error(error);\r\n return;\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 } else {\r\n subject.complete();\r\n }\r\n } else {\r\n subject.next((invocationEvent.item) as T);\r\n }\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\r\n this._launchStreams(streams, promiseQueue);\r\n\r\n return subject;\r\n }\r\n\r\n private _sendMessage(message: any) {\r\n this._resetKeepAliveInterval();\r\n return this.connection.send(message);\r\n }\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 private _sendWithProtocol(message: any) {\r\n if (this._messageBuffer) {\r\n return this._messageBuffer._send(message);\r\n } else {\r\n return this._sendMessage(this._protocol.writeMessage(message));\r\n }\r\n }\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 public send(methodName: string, ...args: any[]): Promise {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const sendPromise = this._sendWithProtocol(this._createInvocation(methodName, args, true, streamIds));\r\n\r\n this._launchStreams(streams, sendPromise);\r\n\r\n return sendPromise;\r\n }\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 public invoke(methodName: string, ...args: any[]): Promise {\r\n const [streams, streamIds] = this._replaceStreamingParams(args);\r\n const invocationDescriptor = this._createInvocation(methodName, args, false, streamIds);\r\n\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: StreamItemMessage | CompletionMessage | null, error?: Error) => {\r\n if (error) {\r\n reject(error);\r\n return;\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 } else {\r\n resolve(invocationEvent.result);\r\n }\r\n } else {\r\n reject(new Error(`Unexpected message type: ${invocationEvent.type}`));\r\n }\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\r\n this._launchStreams(streams, promiseQueue);\r\n });\r\n\r\n return p;\r\n }\r\n\r\n /** Registers a handler that will be invoked when the hub method with the specified method name is invoked.\r\n *\r\n * @param {string} methodName The name of the hub method to define.\r\n * @param {Function} newMethod The handler that will be raised when the hub method is invoked.\r\n */\r\n public on(methodName: string, newMethod: (...args: any[]) => any): void\r\n public on(methodName: string, newMethod: (...args: any[]) => void): void {\r\n if (!methodName || !newMethod) {\r\n return;\r\n }\r\n\r\n methodName = methodName.toLowerCase();\r\n if (!this._methods[methodName]) {\r\n this._methods[methodName] = [];\r\n }\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\r\n this._methods[methodName].push(newMethod);\r\n }\r\n\r\n /** Removes all handlers for the specified hub method.\r\n *\r\n * @param {string} methodName The name of the method to remove handlers for.\r\n */\r\n public off(methodName: string): void;\r\n\r\n /** Removes the specified handler for the specified hub method.\r\n *\r\n * You must pass the exact same Function instance as was previously passed to {@link @microsoft/signalr.HubConnection.on}. Passing a different instance (even if the function\r\n * body is the same) will not remove the handler.\r\n *\r\n * @param {string} methodName The name of the method to remove handlers for.\r\n * @param {Function} method The handler to remove. This must be the same Function instance as the one passed to {@link @microsoft/signalr.HubConnection.on}.\r\n */\r\n public off(methodName: string, method: (...args: any[]) => void): void;\r\n public off(methodName: string, method?: (...args: any[]) => void): void {\r\n if (!methodName) {\r\n return;\r\n }\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 } else {\r\n delete this._methods[methodName];\r\n }\r\n\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 public onclose(callback: (error?: Error) => void): void {\r\n if (callback) {\r\n this._closedCallbacks.push(callback);\r\n }\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 public onreconnecting(callback: (error?: Error) => void): void {\r\n if (callback) {\r\n this._reconnectingCallbacks.push(callback);\r\n }\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 public onreconnected(callback: (connectionId?: string) => void): void {\r\n if (callback) {\r\n this._reconnectedCallbacks.push(callback);\r\n }\r\n }\r\n\r\n private _processIncomingData(data: any) {\r\n this._cleanupTimeout();\r\n\r\n if (!this._receivedHandshakeResponse) {\r\n data = this._processHandshakeResponse(data);\r\n this._receivedHandshakeResponse = true;\r\n }\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\r\n for (const message of messages) {\r\n if (this._messageBuffer && !this._messageBuffer._shouldProcessMessage(message)) {\r\n // Don't process the message, we are either waiting for a SequenceMessage or received a duplicate message\r\n continue;\r\n }\r\n\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 } 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\r\n const error = message.error ? new Error(\"Server returned an error on close: \" + message.error) : undefined;\r\n\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\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this.connection.stop(error);\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\r\n break;\r\n }\r\n case MessageType.Ack:\r\n if (this._messageBuffer) {\r\n this._messageBuffer._ack(message);\r\n }\r\n break;\r\n case MessageType.Sequence:\r\n if (this._messageBuffer) {\r\n this._messageBuffer._resetSequence(message);\r\n }\r\n break;\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\r\n this._resetTimeoutPeriod();\r\n }\r\n\r\n private _processHandshakeResponse(data: any): any {\r\n let responseMessage: HandshakeResponseMessage;\r\n let remainingData: any;\r\n\r\n try {\r\n [remainingData, responseMessage] = this._handshakeProtocol.parseHandshakeResponse(data);\r\n } catch (e) {\r\n const message = \"Error parsing handshake response: \" + e;\r\n this._logger.log(LogLevel.Error, message);\r\n\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\r\n const error = new Error(message);\r\n this._handshakeRejecter(error);\r\n throw error;\r\n } else {\r\n this._logger.log(LogLevel.Debug, \"Server handshake complete.\");\r\n }\r\n\r\n this._handshakeResolver();\r\n return remainingData;\r\n }\r\n\r\n private _resetKeepAliveInterval() {\r\n if (this.connection.features.inherentKeepAlive) {\r\n return;\r\n }\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\r\n this._cleanupPingTimer();\r\n }\r\n\r\n private _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\r\n // Set keepAlive timer if there isn't one\r\n if (this._pingServerHandle === undefined)\r\n {\r\n let nextPing = this._nextKeepAlive - new Date().getTime();\r\n if (nextPing < 0) {\r\n nextPing = 0;\r\n }\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 } 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\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private 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\r\n private async _invokeClientMethod(invocationMessage: 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\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\r\n // Avoid issues with handlers removing themselves thus modifying the list while iterating through it\r\n const methodsCopy = methods.slice();\r\n\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 } 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 } 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 } else if (res !== undefined) {\r\n completionMessage = this._createCompletionMessage(invocationMessage.invocationId!, null, res);\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 } 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\r\n private _connectionClosed(error?: Error) {\r\n this._logger.log(LogLevel.Debug, `HubConnection.connectionClosed(${error}) called while in state ${this._connectionState}.`);\r\n\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\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\r\n this._cancelCallbacksWithError(error || new Error(\"Invocation canceled due to the underlying connection being closed.\"));\r\n\r\n this._cleanupTimeout();\r\n this._cleanupPingTimer();\r\n\r\n if (this._connectionState === HubConnectionState.Disconnecting) {\r\n this._completeClose(error);\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 } else if (this._connectionState === HubConnectionState.Connected) {\r\n this._completeClose(error);\r\n }\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\r\n private _completeClose(error?: Error) {\r\n if (this._connectionStarted) {\r\n this._connectionState = HubConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n if (this._messageBuffer) {\r\n this._messageBuffer._dispose(error ?? new Error(\"Connection closed.\"));\r\n this._messageBuffer = undefined;\r\n }\r\n\r\n if (Platform.isBrowser) {\r\n window.document.removeEventListener(\"freeze\", this._freezeEventListener);\r\n }\r\n\r\n try {\r\n this._closedCallbacks.forEach((c) => c.apply(this, [error]));\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\r\n private async _reconnect(error?: 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\r\n let nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, 0, retryError);\r\n\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\r\n this._connectionState = HubConnectionState.Reconnecting;\r\n\r\n if (error) {\r\n this._logger.log(LogLevel.Information, `Connection reconnecting because of error '${error}'.`);\r\n } else {\r\n this._logger.log(LogLevel.Information, \"Connection reconnecting.\");\r\n }\r\n\r\n if (this._reconnectingCallbacks.length !== 0) {\r\n try {\r\n this._reconnectingCallbacks.forEach((c) => c.apply(this, [error]));\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\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\r\n while (nextRetryDelay !== null) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt number ${previousReconnectAttempts} will start in ${nextRetryDelay} ms.`);\r\n\r\n await new Promise((resolve) => {\r\n this._reconnectDelayHandle = setTimeout(resolve, nextRetryDelay!);\r\n });\r\n this._reconnectDelayHandle = undefined;\r\n\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\r\n try {\r\n await this._startInternal();\r\n\r\n this._connectionState = HubConnectionState.Connected;\r\n this._logger.log(LogLevel.Information, \"HubConnection reconnected successfully.\");\r\n\r\n if (this._reconnectedCallbacks.length !== 0) {\r\n try {\r\n this._reconnectedCallbacks.forEach((c) => c.apply(this, [this.connection.connectionId]));\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\r\n return;\r\n } catch (e) {\r\n this._logger.log(LogLevel.Information, `Reconnect attempt failed because of error '${e}'.`);\r\n\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 as any === HubConnectionState.Disconnecting) {\r\n this._completeClose();\r\n }\r\n return;\r\n }\r\n\r\n retryError = e instanceof Error ? e : new Error((e as any).toString());\r\n nextRetryDelay = this._getNextRetryDelay(previousReconnectAttempts++, Date.now() - reconnectStartTime, retryError);\r\n }\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\r\n this._completeClose();\r\n }\r\n\r\n private _getNextRetryDelay(previousRetryCount: number, elapsedMilliseconds: number, retryReason: Error) {\r\n try {\r\n return this._reconnectPolicy!.nextRetryDelayInMilliseconds({\r\n elapsedMilliseconds,\r\n previousRetryCount,\r\n retryReason,\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\r\n private _cancelCallbacksWithError(error: Error) {\r\n const callbacks = this._callbacks;\r\n this._callbacks = {};\r\n\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 } 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\r\n private _cleanupPingTimer(): void {\r\n if (this._pingServerHandle) {\r\n clearTimeout(this._pingServerHandle);\r\n this._pingServerHandle = undefined;\r\n }\r\n }\r\n\r\n private _cleanupTimeout(): void {\r\n if (this._timeoutHandle) {\r\n clearTimeout(this._timeoutHandle);\r\n }\r\n }\r\n\r\n private _createInvocation(methodName: string, args: any[], nonblocking: boolean, streamIds: string[]): InvocationMessage {\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 } else {\r\n return {\r\n arguments: args,\r\n target: methodName,\r\n type: MessageType.Invocation,\r\n };\r\n }\r\n } else {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n\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 } 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\r\n private _launchStreams(streams: IStreamResult[], promiseQueue: Promise): void {\r\n if (streams.length === 0) {\r\n return;\r\n }\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\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: string;\r\n if (err instanceof Error) {\r\n message = err.message;\r\n } else if (err && err.toString) {\r\n message = err.toString();\r\n } else {\r\n message = \"Unknown error\";\r\n }\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\r\n private _replaceStreamingParams(args: any[]): [IStreamResult[], string[]] {\r\n const streams: IStreamResult[] = [];\r\n const streamIds: string[] = [];\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\r\n // remove stream from args\r\n args.splice(i, 1);\r\n }\r\n }\r\n\r\n return [streams, streamIds];\r\n }\r\n\r\n private _isObservable(arg: any): arg is IStreamResult {\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\r\n private _createStreamInvocation(methodName: string, args: any[], streamIds: string[]): StreamInvocationMessage {\r\n const invocationId = this._invocationId;\r\n this._invocationId++;\r\n\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 } 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\r\n private _createCancelInvocation(id: string): CancelInvocationMessage {\r\n return {\r\n invocationId: id,\r\n type: MessageType.CancelInvocation,\r\n };\r\n }\r\n\r\n private _createStreamItemMessage(id: string, item: any): StreamItemMessage {\r\n return {\r\n invocationId: id,\r\n item,\r\n type: MessageType.StreamItem,\r\n };\r\n }\r\n\r\n private _createCompletionMessage(id: string, error?: any, result?: any): CompletionMessage {\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\r\n return {\r\n invocationId: id,\r\n result,\r\n type: MessageType.Completion,\r\n };\r\n }\r\n\r\n private _createCloseMessage(): CloseMessage {\r\n return { type: MessageType.Close };\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n\r\n/** @private */\r\nexport interface HandshakeRequestMessage {\r\n readonly protocol: string;\r\n readonly version: number;\r\n}\r\n\r\n/** @private */\r\nexport interface HandshakeResponseMessage {\r\n readonly error: string;\r\n readonly minorVersion: number;\r\n}\r\n\r\n/** @private */\r\nexport class HandshakeProtocol {\r\n // Handshake request is always JSON\r\n public writeHandshakeRequest(handshakeRequest: HandshakeRequestMessage): string {\r\n return TextMessageFormat.write(JSON.stringify(handshakeRequest));\r\n }\r\n\r\n public parseHandshakeResponse(data: any): [any, HandshakeResponseMessage] {\r\n let messageData: string;\r\n let remainingData: any;\r\n\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\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 } else {\r\n const textData: string = 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\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\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: HandshakeResponseMessage = response;\r\n\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","// 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\r\nimport { IStreamResult, IStreamSubscriber, ISubscription } from \"./Stream\";\r\nimport { SubjectSubscription } from \"./Utils\";\r\n\r\n/** Stream implementation to stream items to the server. */\r\nexport class Subject implements IStreamResult {\r\n /** @internal */\r\n public observers: IStreamSubscriber[];\r\n\r\n /** @internal */\r\n public cancelCallback?: () => Promise;\r\n\r\n constructor() {\r\n this.observers = [];\r\n }\r\n\r\n public next(item: T): void {\r\n for (const observer of this.observers) {\r\n observer.next(item);\r\n }\r\n }\r\n\r\n public error(err: any): void {\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\r\n public complete(): void {\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\r\n public subscribe(observer: IStreamSubscriber): ISubscription {\r\n this.observers.push(observer);\r\n return new SubjectSubscription(this, observer);\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { IConnection } from \"./IConnection\";\r\nimport { AckMessage, HubMessage, IHubProtocol, MessageType, SequenceMessage } from \"./IHubProtocol\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n\r\n/** @private */\r\nexport class MessageBuffer {\r\n private readonly _protocol: IHubProtocol;\r\n private readonly _connection: IConnection;\r\n\r\n private readonly _bufferSize: number = 100_000;\r\n\r\n private _messages: BufferedItem[] = [];\r\n private _totalMessageCount: number = 0;\r\n private _waitForSequenceMessage: boolean = false;\r\n\r\n // Message IDs start at 1 and always increment by 1\r\n private _nextReceivingSequenceId = 1;\r\n private _latestReceivedSequenceId = 0;\r\n private _bufferedByteCount: number = 0;\r\n private _reconnectInProgress: boolean = false;\r\n\r\n private _ackTimerHandle?: any;\r\n\r\n constructor(protocol: IHubProtocol, connection: IConnection, bufferSize: number) {\r\n this._protocol = protocol;\r\n this._connection = connection;\r\n this._bufferSize = bufferSize;\r\n }\r\n\r\n public async _send(message: HubMessage): Promise {\r\n const serializedMessage = this._protocol.writeMessage(message);\r\n\r\n let backpressurePromise: Promise = Promise.resolve();\r\n\r\n // Only count invocation messages. Acks, pings, etc. don't need to be resent on reconnect\r\n if (this._isInvocationMessage(message)) {\r\n this._totalMessageCount++;\r\n let backpressurePromiseResolver: (value: void) => void = () => {};\r\n let backpressurePromiseRejector: (value?: void) => void = () => {};\r\n\r\n if (isArrayBuffer(serializedMessage)) {\r\n this._bufferedByteCount += serializedMessage.byteLength;\r\n } else {\r\n this._bufferedByteCount += serializedMessage.length;\r\n }\r\n\r\n if (this._bufferedByteCount >= this._bufferSize) {\r\n backpressurePromise = new Promise((resolve, reject) => {\r\n backpressurePromiseResolver = resolve;\r\n backpressurePromiseRejector = reject;\r\n });\r\n }\r\n\r\n this._messages.push(new BufferedItem(serializedMessage, this._totalMessageCount,\r\n backpressurePromiseResolver, backpressurePromiseRejector));\r\n }\r\n\r\n try {\r\n // If this is set it means we are reconnecting or resending\r\n // We don't want to send on a disconnected connection\r\n // And we don't want to send if resend is running since that would mean sending\r\n // this message twice\r\n if (!this._reconnectInProgress) {\r\n await this._connection.send(serializedMessage);\r\n }\r\n } catch {\r\n this._disconnected();\r\n }\r\n await backpressurePromise;\r\n }\r\n\r\n public _ack(ackMessage: AckMessage): void {\r\n let newestAckedMessage = -1;\r\n\r\n // Find index of newest message being acked\r\n for (let index = 0; index < this._messages.length; index++) {\r\n const element = this._messages[index];\r\n if (element._id <= ackMessage.sequenceId) {\r\n newestAckedMessage = index;\r\n if (isArrayBuffer(element._message)) {\r\n this._bufferedByteCount -= element._message.byteLength;\r\n } else {\r\n this._bufferedByteCount -= element._message.length;\r\n }\r\n // resolve items that have already been sent and acked\r\n element._resolver();\r\n } else if (this._bufferedByteCount < this._bufferSize) {\r\n // resolve items that now fall under the buffer limit but haven't been acked\r\n element._resolver();\r\n } else {\r\n break;\r\n }\r\n }\r\n\r\n if (newestAckedMessage !== -1) {\r\n // We're removing everything including the message pointed to, so add 1\r\n this._messages = this._messages.slice(newestAckedMessage + 1);\r\n }\r\n }\r\n\r\n public _shouldProcessMessage(message: HubMessage): boolean {\r\n if (this._waitForSequenceMessage) {\r\n if (message.type !== MessageType.Sequence) {\r\n return false;\r\n } else {\r\n this._waitForSequenceMessage = false;\r\n return true;\r\n }\r\n }\r\n\r\n // No special processing for acks, pings, etc.\r\n if (!this._isInvocationMessage(message)) {\r\n return true;\r\n }\r\n\r\n const currentId = this._nextReceivingSequenceId;\r\n this._nextReceivingSequenceId++;\r\n if (currentId <= this._latestReceivedSequenceId) {\r\n if (currentId === this._latestReceivedSequenceId) {\r\n // Should only hit this if we just reconnected and the server is sending\r\n // Messages it has buffered, which would mean it hasn't seen an Ack for these messages\r\n this._ackTimer();\r\n }\r\n // Ignore, this is a duplicate message\r\n return false;\r\n }\r\n\r\n this._latestReceivedSequenceId = currentId;\r\n\r\n // Only start the timer for sending an Ack message when we have a message to ack. This also conveniently solves\r\n // timer throttling by not having a recursive timer, and by starting the timer via a network call (recv)\r\n this._ackTimer();\r\n return true;\r\n }\r\n\r\n public _resetSequence(message: SequenceMessage): void {\r\n if (message.sequenceId > this._nextReceivingSequenceId) {\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n this._connection.stop(new Error(\"Sequence ID greater than amount of messages we've received.\"));\r\n return;\r\n }\r\n\r\n this._nextReceivingSequenceId = message.sequenceId;\r\n }\r\n\r\n public _disconnected(): void {\r\n this._reconnectInProgress = true;\r\n this._waitForSequenceMessage = true;\r\n }\r\n\r\n public async _resend(): Promise {\r\n const sequenceId = this._messages.length !== 0\r\n ? this._messages[0]._id\r\n : this._totalMessageCount + 1;\r\n await this._connection.send(this._protocol.writeMessage({ type: MessageType.Sequence, sequenceId }));\r\n\r\n // Get a local variable to the _messages, just in case messages are acked while resending\r\n // Which would slice the _messages array (which creates a new copy)\r\n const messages = this._messages;\r\n for (const element of messages) {\r\n await this._connection.send(element._message);\r\n }\r\n\r\n this._reconnectInProgress = false;\r\n }\r\n\r\n public _dispose(error?: Error): void {\r\n error ??= new Error(\"Unable to reconnect to server.\")\r\n\r\n // Unblock backpressure if any\r\n for (const element of this._messages) {\r\n element._rejector(error);\r\n }\r\n }\r\n\r\n private _isInvocationMessage(message: HubMessage): boolean {\r\n // There is no way to check if something implements an interface.\r\n // So we individually check the messages in a switch statement.\r\n // To make sure we don't miss any message types we rely on the compiler\r\n // seeing the function returns a value and it will do the\r\n // exhaustive check for us on the switch statement, since we don't use 'case default'\r\n switch (message.type) {\r\n case MessageType.Invocation:\r\n case MessageType.StreamItem:\r\n case MessageType.Completion:\r\n case MessageType.StreamInvocation:\r\n case MessageType.CancelInvocation:\r\n return true;\r\n case MessageType.Close:\r\n case MessageType.Sequence:\r\n case MessageType.Ping:\r\n case MessageType.Ack:\r\n return false;\r\n }\r\n }\r\n\r\n private _ackTimer(): void {\r\n if (this._ackTimerHandle === undefined) {\r\n this._ackTimerHandle = setTimeout(async () => {\r\n try {\r\n if (!this._reconnectInProgress) {\r\n await this._connection.send(this._protocol.writeMessage({ type: MessageType.Ack, sequenceId: this._latestReceivedSequenceId }))\r\n }\r\n // Ignore errors, that means the connection is closed and we don't care about the Ack message anymore.\r\n } catch { }\r\n\r\n clearTimeout(this._ackTimerHandle);\r\n this._ackTimerHandle = undefined;\r\n // 1 second delay so we don't spam Ack messages if there are many messages being received at once.\r\n }, 1000);\r\n }\r\n }\r\n}\r\n\r\nclass BufferedItem {\r\n constructor(message: string | ArrayBuffer, id: number, resolver: (value: void) => void, rejector: (value?: any) => void) {\r\n this._message = message;\r\n this._id = id;\r\n this._resolver = resolver;\r\n this._rejector = rejector;\r\n }\r\n\r\n _message: string | ArrayBuffer;\r\n _id: number;\r\n _resolver: (value: void) => void;\r\n _rejector: (value?: any) => void;\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { IRetryPolicy, RetryContext } from \"./IRetryPolicy\";\r\n\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\r\n/** @private */\r\nexport class DefaultReconnectPolicy implements IRetryPolicy {\r\n private readonly _retryDelays: (number | null)[];\r\n\r\n constructor(retryDelays?: number[]) {\r\n this._retryDelays = retryDelays !== undefined ? [...retryDelays, null] : DEFAULT_RETRY_DELAYS_IN_MILLISECONDS;\r\n }\r\n\r\n public nextRetryDelayInMilliseconds(retryContext: RetryContext): number | null {\r\n return this._retryDelays[retryContext.previousRetryCount];\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nexport abstract class HeaderNames {\r\n static readonly Authorization = \"Authorization\";\r\n static readonly Cookie = \"Cookie\";\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { AbortSignal } from \"./AbortController\";\r\nimport { MessageHeaders } from \"./IHubProtocol\";\r\n\r\n/** Represents an HTTP request. */\r\nexport interface HttpRequest {\r\n /** The HTTP method to use for the request. */\r\n method?: string;\r\n\r\n /** The URL for the request. */\r\n url?: string;\r\n\r\n /** The body content for the request. May be a string or an ArrayBuffer (for binary data). */\r\n content?: string | ArrayBuffer;\r\n\r\n /** An object describing headers to apply to the request. */\r\n headers?: MessageHeaders;\r\n\r\n /** The XMLHttpRequestResponseType to apply to the request. */\r\n responseType?: XMLHttpRequestResponseType;\r\n\r\n /** An AbortSignal that can be monitored for cancellation. */\r\n abortSignal?: AbortSignal;\r\n\r\n /** The time to wait for the request to complete before throwing a TimeoutError. Measured in milliseconds. */\r\n timeout?: number;\r\n\r\n /** This controls whether credentials such as cookies are sent in cross-site requests. */\r\n withCredentials?: boolean;\r\n}\r\n\r\n/** Represents an HTTP response. */\r\nexport class HttpResponse {\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpResponse} with the specified status code.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n */\r\n constructor(statusCode: number);\r\n\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpResponse} with the specified status code and message.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n * @param {string} statusText The status message of the response.\r\n */\r\n constructor(statusCode: number, statusText: string);\r\n\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpResponse} with the specified status code, message and string content.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n * @param {string} statusText The status message of the response.\r\n * @param {string} content The content of the response.\r\n */\r\n constructor(statusCode: number, statusText: string, content: string);\r\n\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpResponse} with the specified status code, message and binary content.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n * @param {string} statusText The status message of the response.\r\n * @param {ArrayBuffer} content The content of the response.\r\n */\r\n constructor(statusCode: number, statusText: string, content: ArrayBuffer);\r\n\r\n /** Constructs a new instance of {@link @microsoft/signalr.HttpResponse} with the specified status code, message and binary content.\r\n *\r\n * @param {number} statusCode The status code of the response.\r\n * @param {string} statusText The status message of the response.\r\n * @param {string | ArrayBuffer} content The content of the response.\r\n */\r\n constructor(statusCode: number, statusText: string, content: string | ArrayBuffer);\r\n constructor(\r\n public readonly statusCode: number,\r\n public readonly statusText?: string,\r\n public readonly content?: string | ArrayBuffer) {\r\n }\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 abstract class HttpClient {\r\n /** Issues an HTTP GET request to the specified URL, returning a Promise that resolves with an {@link @microsoft/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @returns {Promise} A Promise that resolves with an {@link @microsoft/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public get(url: string): Promise;\r\n\r\n /** Issues an HTTP GET request to the specified URL, returning a Promise that resolves with an {@link @microsoft/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @param {HttpRequest} options Additional options to configure the request. The 'url' field in this object will be overridden by the url parameter.\r\n * @returns {Promise} A Promise that resolves with an {@link @microsoft/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public get(url: string, options: HttpRequest): Promise;\r\n public get(url: string, options?: HttpRequest): Promise {\r\n return this.send({\r\n ...options,\r\n method: \"GET\",\r\n url,\r\n });\r\n }\r\n\r\n /** Issues an HTTP POST request to the specified URL, returning a Promise that resolves with an {@link @microsoft/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @returns {Promise} A Promise that resolves with an {@link @microsoft/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public post(url: string): Promise;\r\n\r\n /** Issues an HTTP POST request to the specified URL, returning a Promise that resolves with an {@link @microsoft/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @param {HttpRequest} options Additional options to configure the request. The 'url' field in this object will be overridden by the url parameter.\r\n * @returns {Promise} A Promise that resolves with an {@link @microsoft/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public post(url: string, options: HttpRequest): Promise;\r\n public post(url: string, options?: HttpRequest): Promise {\r\n return this.send({\r\n ...options,\r\n method: \"POST\",\r\n url,\r\n });\r\n }\r\n\r\n /** Issues an HTTP DELETE request to the specified URL, returning a Promise that resolves with an {@link @microsoft/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @returns {Promise} A Promise that resolves with an {@link @microsoft/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public delete(url: string): Promise;\r\n\r\n /** Issues an HTTP DELETE request to the specified URL, returning a Promise that resolves with an {@link @microsoft/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {string} url The URL for the request.\r\n * @param {HttpRequest} options Additional options to configure the request. The 'url' field in this object will be overridden by the url parameter.\r\n * @returns {Promise} A Promise that resolves with an {@link @microsoft/signalr.HttpResponse} describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public delete(url: string, options: HttpRequest): Promise;\r\n public delete(url: string, options?: HttpRequest): Promise {\r\n return this.send({\r\n ...options,\r\n method: \"DELETE\",\r\n url,\r\n });\r\n }\r\n\r\n /** Issues an HTTP request to the specified URL, returning a {@link Promise} that resolves with an {@link @microsoft/signalr.HttpResponse} representing the result.\r\n *\r\n * @param {HttpRequest} request An {@link @microsoft/signalr.HttpRequest} describing the request to send.\r\n * @returns {Promise} A Promise that resolves with an HttpResponse describing the response, or rejects with an Error indicating a failure.\r\n */\r\n public abstract send(request: HttpRequest): Promise;\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 public getCookieString(url: string): string {\r\n return \"\";\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\n\r\n/** @private */\r\nexport class AccessTokenHttpClient extends HttpClient {\r\n private _innerClient: HttpClient;\r\n _accessToken: string | undefined;\r\n _accessTokenFactory: (() => string | Promise) | undefined;\r\n\r\n constructor(innerClient: HttpClient, accessTokenFactory: (() => string | Promise) | undefined) {\r\n super();\r\n\r\n this._innerClient = innerClient;\r\n this._accessTokenFactory = accessTokenFactory;\r\n }\r\n\r\n public async send(request: HttpRequest): Promise {\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\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\r\n private _setAuthorizationHeader(request: HttpRequest) {\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\r\n public getCookieString(url: string): string {\r\n return this._innerClient.getCookieString(url);\r\n }\r\n}","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\n// @ts-ignore: This will be removed from built files and is here to make the types available during dev work\r\nimport { CookieJar } from \"@types/tough-cookie\";\r\n\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { Platform, getGlobalThis, isArrayBuffer } from \"./Utils\";\r\nimport { configureAbortController, configureFetch } from \"./DynamicImports\";\r\n\r\nexport class FetchHttpClient extends HttpClient {\r\n private readonly _abortControllerType: { prototype: AbortController, new(): AbortController };\r\n private readonly _fetchType: (input: RequestInfo, init?: RequestInit) => Promise;\r\n private readonly _jar?: CookieJar;\r\n\r\n private readonly _logger: ILogger;\r\n\r\n public constructor(logger: ILogger) {\r\n super();\r\n this._logger = logger;\r\n\r\n // This is how you do \"reference\" arguments\r\n const fetchObj = { _fetchType: undefined, _jar: undefined };\r\n if (configureFetch(fetchObj)) {\r\n this._fetchType = fetchObj._fetchType!;\r\n this._jar = fetchObj._jar;\r\n } else {\r\n this._fetchType = fetch.bind(getGlobalThis());\r\n }\r\n\r\n this._abortControllerType = AbortController;\r\n const abortObj = { _abortControllerType: this._abortControllerType };\r\n if (configureAbortController(abortObj)) {\r\n this._abortControllerType = abortObj._abortControllerType;\r\n }\r\n }\r\n\r\n /** @inheritDoc */\r\n public async send(request: HttpRequest): Promise {\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\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\r\n const abortController = new this._abortControllerType();\r\n\r\n let error: any;\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\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: any = 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\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 } else {\r\n request.headers[\"Content-Type\"] = \"text/plain;charset=UTF-8\";\r\n }\r\n }\r\n\r\n let response: 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 } catch (e) {\r\n if (error) {\r\n throw error;\r\n }\r\n this._logger.log(\r\n LogLevel.Warning,\r\n `Error from HTTP request. ${e}.`,\r\n );\r\n throw e;\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\r\n if (!response.ok) {\r\n const errorMessage = await deserializeContent(response, \"text\") as string;\r\n throw new HttpError(errorMessage || response.statusText, response.status);\r\n }\r\n\r\n const content = deserializeContent(response, request.responseType);\r\n const payload = await content;\r\n\r\n return new HttpResponse(\r\n response.status,\r\n response.statusText,\r\n payload,\r\n );\r\n }\r\n\r\n public getCookieString(url: string): string {\r\n let cookies: string = \"\";\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\n\r\nfunction deserializeContent(response: Response, responseType?: XMLHttpRequestResponseType): Promise {\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\r\n return content;\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\n// @ts-ignore: This will be removed from built files and is here to make the types available during dev work\r\nimport { CookieJar } from \"@types/tough-cookie\";\r\nimport { Platform } from \"./Utils\";\r\n\r\n/** @private */\r\nexport function configureFetch(obj: { _fetchType?: (input: RequestInfo, init?: RequestInit) => Promise,\r\n _jar?: CookieJar }): boolean\r\n{\r\n // Node added a fetch implementation to the global scope starting in v18.\r\n // We need to add a cookie jar in node to be able to share cookies with WebSocket\r\n if (typeof fetch === \"undefined\" || Platform.isNode) {\r\n // Cookies aren't automatically handled in Node so we need to add a CookieJar to preserve cookies across requests\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n obj._jar = new (require(\"tough-cookie\")).CookieJar();\r\n\r\n if (typeof fetch === \"undefined\") {\r\n // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n obj._fetchType = require(\"node-fetch\");\r\n } else {\r\n // Use fetch from Node if available\r\n obj._fetchType = fetch;\r\n }\r\n\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 // eslint-disable-next-line @typescript-eslint/no-var-requires\r\n obj._fetchType = require(\"fetch-cookie\")(obj._fetchType, obj._jar);\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** @private */\r\nexport function configureAbortController(obj: { _abortControllerType: { prototype: AbortController, new(): AbortController } }): boolean {\r\n if (typeof AbortController === \"undefined\") {\r\n // Node needs EventListener methods on AbortController which our custom polyfill doesn't provide\r\n obj._abortControllerType = require(\"abort-controller\");\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/** @private */\r\nexport function getWS(): any {\r\n return require(\"ws\");\r\n}\r\n\r\n/** @private */\r\nexport function getEventSource(): any {\r\n return require(\"eventsource\");\r\n}","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { AbortError, HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { isArrayBuffer } from \"./Utils\";\r\n\r\nexport class XhrHttpClient extends HttpClient {\r\n private readonly _logger: ILogger;\r\n\r\n public constructor(logger: ILogger) {\r\n super();\r\n this._logger = logger;\r\n }\r\n\r\n /** @inheritDoc */\r\n public send(request: HttpRequest): Promise {\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\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\r\n return new Promise((resolve, reject) => {\r\n const xhr = new XMLHttpRequest();\r\n\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 } else {\r\n xhr.setRequestHeader(\"Content-Type\", \"text/plain;charset=UTF-8\");\r\n }\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\r\n if (request.responseType) {\r\n xhr.responseType = request.responseType;\r\n }\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\r\n if (request.timeout) {\r\n xhr.timeout = request.timeout;\r\n }\r\n\r\n xhr.onload = () => {\r\n if (request.abortSignal) {\r\n request.abortSignal.onabort = null;\r\n }\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 } else {\r\n reject(new HttpError(xhr.response || xhr.responseText || xhr.statusText, xhr.status));\r\n }\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\r\n xhr.ontimeout = () => {\r\n this._logger.log(LogLevel.Warning, `Timeout from HTTP request.`);\r\n reject(new TimeoutError());\r\n };\r\n\r\n xhr.send(request.content);\r\n });\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\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 enum HttpTransportType {\r\n /** Specifies no transport preference. */\r\n None = 0,\r\n /** Specifies the WebSockets transport. */\r\n WebSockets = 1,\r\n /** Specifies the Server-Sent Events transport. */\r\n ServerSentEvents = 2,\r\n /** Specifies the Long Polling transport. */\r\n LongPolling = 4,\r\n}\r\n\r\n/** Specifies the transfer format for a connection. */\r\nexport enum TransferFormat {\r\n /** Specifies that only text data will be transmitted over the connection. */\r\n Text = 1,\r\n /** Specifies that binary data will be transmitted over the connection. */\r\n Binary = 2,\r\n}\r\n\r\n/** An abstraction over the behavior of transports. This is designed to support the framework and not intended for use by applications. */\r\nexport interface ITransport {\r\n connect(url: string, transferFormat: TransferFormat): Promise;\r\n send(data: any): Promise;\r\n stop(): Promise;\r\n onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n onclose: ((error?: Error) => void) | null;\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { AbortError } from \"./Errors\";\r\nimport { FetchHttpClient } from \"./FetchHttpClient\";\r\nimport { HttpClient, HttpRequest, HttpResponse } from \"./HttpClient\";\r\nimport { ILogger } from \"./ILogger\";\r\nimport { Platform } from \"./Utils\";\r\nimport { XhrHttpClient } from \"./XhrHttpClient\";\r\n\r\n/** Default implementation of {@link @microsoft/signalr.HttpClient}. */\r\nexport class DefaultHttpClient extends HttpClient {\r\n private readonly _httpClient: HttpClient;\r\n\r\n /** Creates a new instance of the {@link @microsoft/signalr.DefaultHttpClient}, using the provided {@link @microsoft/signalr.ILogger} to log messages. */\r\n public constructor(logger: ILogger) {\r\n super();\r\n\r\n if (typeof fetch !== \"undefined\" || Platform.isNode) {\r\n this._httpClient = new FetchHttpClient(logger);\r\n } else if (typeof XMLHttpRequest !== \"undefined\") {\r\n this._httpClient = new XhrHttpClient(logger);\r\n } else {\r\n throw new Error(\"No usable HttpClient found.\");\r\n }\r\n }\r\n\r\n /** @inheritDoc */\r\n public send(request: HttpRequest): Promise {\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\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\r\n return this._httpClient.send(request);\r\n }\r\n\r\n public getCookieString(url: string): string {\r\n return this._httpClient.getCookieString(url);\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\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\r\n// Not exported from index.\r\n/** @private */\r\nexport class AbortController implements AbortSignal {\r\n private _isAborted: boolean = false;\r\n public onabort: (() => void) | null = null;\r\n\r\n public abort(): void {\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\r\n get signal(): AbortSignal {\r\n return this;\r\n }\r\n\r\n get aborted(): boolean {\r\n return this._isAborted;\r\n }\r\n}\r\n\r\n/** Represents a signal that can be monitored to determine if a request has been aborted. */\r\nexport interface AbortSignal {\r\n /** Indicates if the request has been aborted. */\r\n aborted: boolean;\r\n /** Set this to a handler that will be invoked when the request is aborted. */\r\n onabort: (() => void) | null;\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { AbortController } from \"./AbortController\";\r\nimport { HttpError, TimeoutError } from \"./Errors\";\r\nimport { HttpClient, HttpRequest } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { ITransport, TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, sendMessage } from \"./Utils\";\r\nimport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\n\r\n// Not exported from 'index', this type is internal.\r\n/** @private */\r\nexport class LongPollingTransport implements ITransport {\r\n private readonly _httpClient: HttpClient;\r\n private readonly _logger: ILogger;\r\n private readonly _options: IHttpConnectionOptions;\r\n private readonly _pollAbort: AbortController;\r\n\r\n private _url?: string;\r\n private _running: boolean;\r\n private _receiving?: Promise;\r\n private _closeError?: Error | unknown;\r\n\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((error?: Error | unknown) => void) | null;\r\n\r\n // This is an internal type, not exported from 'index' so this is really just internal.\r\n public get pollAborted(): boolean {\r\n return this._pollAbort.aborted;\r\n }\r\n\r\n constructor(httpClient: HttpClient, logger: ILogger, options: IHttpConnectionOptions) {\r\n this._httpClient = httpClient;\r\n this._logger = logger;\r\n this._pollAbort = new AbortController();\r\n this._options = options;\r\n\r\n this._running = false;\r\n\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n\r\n public async connect(url: string, transferFormat: TransferFormat): Promise {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n\r\n this._url = url;\r\n\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Connecting.\");\r\n\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\r\n const [name, value] = getUserAgentHeader();\r\n const headers = { [name]: value, ...this._options.headers };\r\n\r\n const pollOptions: HttpRequest = {\r\n abortSignal: this._pollAbort.signal,\r\n headers,\r\n timeout: 100000,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n\r\n if (transferFormat === TransferFormat.Binary) {\r\n pollOptions.responseType = \"arraybuffer\";\r\n }\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\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 } else {\r\n this._running = true;\r\n }\r\n\r\n this._receiving = this._poll(this._url, pollOptions);\r\n }\r\n\r\n private async _poll(url: string, pollOptions: HttpRequest): Promise {\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\r\n if (response.statusCode === 204) {\r\n this._logger.log(LogLevel.Information, \"(LongPolling transport) Poll terminated by server.\");\r\n\r\n this._running = false;\r\n } else if (response.statusCode !== 200) {\r\n this._logger.log(LogLevel.Error, `(LongPolling transport) Unexpected response code: ${response.statusCode}.`);\r\n\r\n // Unexpected status code\r\n this._closeError = new HttpError(response.statusText || \"\", response.statusCode);\r\n this._running = false;\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 } 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 } 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 as any).message}`);\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 } 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 } finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Polling complete.\");\r\n\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\r\n public async send(data: any): Promise {\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\r\n public async stop(): Promise {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stopping polling.\");\r\n\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\r\n try {\r\n await this._receiving;\r\n\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\r\n const headers: {[k: string]: string} = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n\r\n const deleteOptions: HttpRequest = {\r\n headers: { ...headers, ...this._options.headers },\r\n timeout: this._options.timeout,\r\n withCredentials: this._options.withCredentials,\r\n };\r\n\r\n let error;\r\n try {\r\n await this._httpClient.delete(this._url!, deleteOptions);\r\n } catch (err) {\r\n error = err;\r\n }\r\n\r\n if (error) {\r\n if (error instanceof HttpError) {\r\n if (error.statusCode === 404) {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) A 404 response was returned from sending a DELETE request.\");\r\n } else {\r\n this._logger.log(LogLevel.Trace, `(LongPolling transport) Error sending a DELETE request: ${error}`);\r\n }\r\n }\r\n } else {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) DELETE request accepted.\");\r\n }\r\n\r\n } finally {\r\n this._logger.log(LogLevel.Trace, \"(LongPolling transport) Stop finished.\");\r\n\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\r\n private _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","// 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\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { MessageHeaders } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { ITransport, TransferFormat } from \"./ITransport\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform, sendMessage } from \"./Utils\";\r\nimport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\n\r\n/** @private */\r\nexport class ServerSentEventsTransport implements ITransport {\r\n private readonly _httpClient: HttpClient;\r\n private readonly _accessToken: string | undefined;\r\n private readonly _logger: ILogger;\r\n private readonly _options: IHttpConnectionOptions;\r\n private _eventSource?: EventSource;\r\n private _url?: string;\r\n\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((error?: Error | unknown) => void) | null;\r\n\r\n constructor(httpClient: HttpClient, accessToken: string | undefined, logger: ILogger,\r\n options: IHttpConnectionOptions) {\r\n this._httpClient = httpClient;\r\n this._accessToken = accessToken;\r\n this._logger = logger;\r\n this._options = options;\r\n\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n\r\n public async connect(url: string, transferFormat: TransferFormat): Promise {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isRequired(transferFormat, \"transferFormat\");\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n\r\n this._logger.log(LogLevel.Trace, \"(SSE transport) Connecting.\");\r\n\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\r\n if (this._accessToken) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(this._accessToken)}`;\r\n }\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\r\n let eventSource: EventSource;\r\n if (Platform.isBrowser || Platform.isWebWorker) {\r\n eventSource = new this._options.EventSource!(url, { withCredentials: this._options.withCredentials });\r\n } else {\r\n // Non-browser passes cookies via the dictionary\r\n const cookies = this._httpClient.getCookieString(url);\r\n const headers: MessageHeaders = {};\r\n headers.Cookie = cookies;\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n\r\n eventSource = new this._options.EventSource!(url, { withCredentials: this._options.withCredentials, headers: { ...headers, ...this._options.headers} } as EventSourceInit);\r\n }\r\n\r\n try {\r\n eventSource.onmessage = (e: MessageEvent) => {\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 } catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n // @ts-ignore: not using event on purpose\r\n eventSource.onerror = (e: Event) => {\r\n // EventSource doesn't give any useful information about server side closes.\r\n if (opened) {\r\n this._close();\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\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 } catch (e) {\r\n reject(e);\r\n return;\r\n }\r\n });\r\n }\r\n\r\n public async send(data: any): Promise {\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\r\n public stop(): Promise {\r\n this._close();\r\n return Promise.resolve();\r\n }\r\n\r\n private _close(e?: Error | unknown) {\r\n if (this._eventSource) {\r\n this._eventSource.close();\r\n this._eventSource = undefined;\r\n\r\n if (this.onclose) {\r\n this.onclose(e);\r\n }\r\n }\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { HeaderNames } from \"./HeaderNames\";\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { MessageHeaders } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { ITransport, TransferFormat } from \"./ITransport\";\r\nimport { WebSocketConstructor } from \"./Polyfills\";\r\nimport { Arg, getDataDetail, getUserAgentHeader, Platform } from \"./Utils\";\r\n\r\n/** @private */\r\nexport class WebSocketTransport implements ITransport {\r\n private readonly _logger: ILogger;\r\n private readonly _accessTokenFactory: (() => string | Promise) | undefined;\r\n private readonly _logMessageContent: boolean;\r\n private readonly _webSocketConstructor: WebSocketConstructor;\r\n private readonly _httpClient: HttpClient;\r\n private _webSocket?: WebSocket;\r\n private _headers: MessageHeaders;\r\n\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((error?: Error) => void) | null;\r\n\r\n constructor(httpClient: HttpClient, accessTokenFactory: (() => string | Promise) | undefined, logger: ILogger,\r\n logMessageContent: boolean, webSocketConstructor: WebSocketConstructor, headers: MessageHeaders) {\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\r\n this.onreceive = null;\r\n this.onclose = null;\r\n this._headers = headers;\r\n }\r\n\r\n public async connect(url: string, transferFormat: TransferFormat): Promise {\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\r\n let token: string;\r\n if (this._accessTokenFactory) {\r\n token = await this._accessTokenFactory();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n url = url.replace(/^http/, \"ws\");\r\n let webSocket: WebSocket | undefined;\r\n const cookies = this._httpClient.getCookieString(url);\r\n let opened = false;\r\n\r\n if (Platform.isNode || Platform.isReactNative) {\r\n const headers: {[k: string]: string} = {};\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\r\n if (cookies) {\r\n headers[HeaderNames.Cookie] = cookies;\r\n }\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 {\r\n if (token) {\r\n url += (url.indexOf(\"?\") < 0 ? \"?\" : \"&\") + `access_token=${encodeURIComponent(token)}`;\r\n }\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\r\n if (transferFormat === TransferFormat.Binary) {\r\n webSocket.binaryType = \"arraybuffer\";\r\n }\r\n\r\n webSocket.onopen = (_event: 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\r\n webSocket.onerror = (event: Event) => {\r\n let error: any = 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 } else {\r\n error = \"There was an error with the transport\";\r\n }\r\n\r\n this._logger.log(LogLevel.Information, `(WebSockets transport) ${error}.`);\r\n };\r\n\r\n webSocket.onmessage = (message: MessageEvent) => {\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 } catch (error) {\r\n this._close(error);\r\n return;\r\n }\r\n }\r\n };\r\n\r\n webSocket.onclose = (event: CloseEvent) => {\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 } else {\r\n let error: any = 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 } 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\r\n reject(new Error(error));\r\n }\r\n };\r\n });\r\n }\r\n\r\n public send(data: any): Promise {\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\r\n return Promise.reject(\"WebSocket is not in the OPEN state\");\r\n }\r\n\r\n public stop(): Promise {\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\r\n return Promise.resolve();\r\n }\r\n\r\n private _close(event: CloseEvent | Error | unknown): void {\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\r\n this._logger.log(LogLevel.Trace, \"(WebSockets transport) socket closed.\");\r\n\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 } else if (event instanceof Error) {\r\n this.onclose(event);\r\n } else {\r\n this.onclose();\r\n }\r\n }\r\n }\r\n\r\n private _isCloseEvent(event?: any): event is CloseEvent {\r\n return event && typeof event.wasClean === \"boolean\" && typeof event.code === \"number\";\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { AccessTokenHttpClient } from \"./AccessTokenHttpClient\";\r\nimport { DefaultHttpClient } from \"./DefaultHttpClient\";\r\nimport { getEventSource, getWS } from \"./DynamicImports\";\r\nimport { AggregateErrors, DisabledTransportError, FailedToNegotiateWithServerError, FailedToStartTransportError, HttpError, UnsupportedTransportError, AbortError } from \"./Errors\";\r\nimport { IConnection } from \"./IConnection\";\r\nimport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { HttpTransportType, ITransport, 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\n\r\n/** @private */\r\nconst enum ConnectionState {\r\n Connecting = \"Connecting\",\r\n Connected = \"Connected\",\r\n Disconnected = \"Disconnected\",\r\n Disconnecting = \"Disconnecting\",\r\n}\r\n\r\n/** @private */\r\nexport interface INegotiateResponse {\r\n connectionId?: string;\r\n connectionToken?: string;\r\n negotiateVersion?: number;\r\n availableTransports?: IAvailableTransport[];\r\n url?: string;\r\n accessToken?: string;\r\n error?: string;\r\n useStatefulReconnect?: boolean;\r\n}\r\n\r\n/** @private */\r\nexport interface IAvailableTransport {\r\n transport: keyof typeof HttpTransportType;\r\n transferFormats: (keyof typeof TransferFormat)[];\r\n}\r\n\r\nconst MAX_REDIRECTS = 100;\r\n\r\n/** @private */\r\nexport class HttpConnection implements IConnection {\r\n private _connectionState: ConnectionState;\r\n // connectionStarted is tracked independently from connectionState, so we can check if the\r\n // connection ever did successfully transition from connecting to connected before disconnecting.\r\n private _connectionStarted: boolean;\r\n private readonly _httpClient: AccessTokenHttpClient;\r\n private readonly _logger: ILogger;\r\n private readonly _options: IHttpConnectionOptions;\r\n // Needs to not start with _ to be available for tests\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n private transport?: ITransport;\r\n private _startInternalPromise?: Promise;\r\n private _stopPromise?: Promise;\r\n private _stopPromiseResolver: (value?: PromiseLike) => void = () => {};\r\n private _stopError?: Error;\r\n private _accessTokenFactory?: () => string | Promise;\r\n private _sendQueue?: TransportSendQueue;\r\n\r\n public readonly features: any = {};\r\n public baseUrl: string;\r\n public connectionId?: string;\r\n public onreceive: ((data: string | ArrayBuffer) => void) | null;\r\n public onclose: ((e?: Error) => void) | null;\r\n\r\n private readonly _negotiateVersion: number = 1;\r\n\r\n constructor(url: string, options: IHttpConnectionOptions = {}) {\r\n Arg.isRequired(url, \"url\");\r\n\r\n this._logger = createLogger(options.logger);\r\n this.baseUrl = this._resolveUrl(url);\r\n\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 } 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\r\n let webSocketModule: any = null;\r\n let eventSourceModule: any = null;\r\n\r\n if (Platform.isNode && typeof require !== \"undefined\") {\r\n webSocketModule = getWS();\r\n eventSourceModule = getEventSource();\r\n }\r\n\r\n if (!Platform.isNode && typeof WebSocket !== \"undefined\" && !options.WebSocket) {\r\n options.WebSocket = WebSocket;\r\n } else if (Platform.isNode && !options.WebSocket) {\r\n if (webSocketModule) {\r\n options.WebSocket = webSocketModule;\r\n }\r\n }\r\n\r\n if (!Platform.isNode && typeof EventSource !== \"undefined\" && !options.EventSource) {\r\n options.EventSource = EventSource;\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\r\n this._httpClient = new AccessTokenHttpClient(options.httpClient || new DefaultHttpClient(this._logger), options.accessTokenFactory);\r\n this._connectionState = ConnectionState.Disconnected;\r\n this._connectionStarted = false;\r\n this._options = options;\r\n\r\n this.onreceive = null;\r\n this.onclose = null;\r\n }\r\n\r\n public start(): Promise;\r\n public start(transferFormat: TransferFormat): Promise;\r\n public async start(transferFormat?: TransferFormat): Promise {\r\n transferFormat = transferFormat || TransferFormat.Binary;\r\n\r\n Arg.isIn(transferFormat, TransferFormat, \"transferFormat\");\r\n\r\n this._logger.log(LogLevel.Debug, `Starting connection with transfer format '${TransferFormat[transferFormat]}'.`);\r\n\r\n if (this._connectionState !== ConnectionState.Disconnected) {\r\n return Promise.reject(new Error(\"Cannot start an HttpConnection that is not in the 'Disconnected' state.\"));\r\n }\r\n\r\n this._connectionState = ConnectionState.Connecting;\r\n\r\n this._startInternalPromise = this._startInternal(transferFormat);\r\n await this._startInternalPromise;\r\n\r\n // The TypeScript compiler thinks that connectionState must be Connecting here. The TypeScript compiler is wrong.\r\n if (this._connectionState as any === ConnectionState.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\r\n // We cannot await stopPromise inside startInternal since stopInternal awaits the startInternalPromise.\r\n await this._stopPromise;\r\n\r\n return Promise.reject(new AbortError(message));\r\n } else if (this._connectionState as any !== ConnectionState.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\r\n this._connectionStarted = true;\r\n }\r\n\r\n public send(data: string | ArrayBuffer): Promise {\r\n if (this._connectionState !== ConnectionState.Connected) {\r\n return Promise.reject(new Error(\"Cannot send data if the connection is not in the 'Connected' State.\"));\r\n }\r\n\r\n if (!this._sendQueue) {\r\n this._sendQueue = new TransportSendQueue(this.transport!);\r\n }\r\n\r\n // Transport will not be null if state is connected\r\n return this._sendQueue.send(data);\r\n }\r\n\r\n public async stop(error?: Error): Promise {\r\n if (this._connectionState === ConnectionState.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\r\n if (this._connectionState === ConnectionState.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\r\n this._connectionState = ConnectionState.Disconnecting;\r\n\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\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\r\n private async _stopInternal(error?: Error): Promise {\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\r\n try {\r\n await this._startInternalPromise;\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 // 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 } catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.transport.stop() threw error '${e}'.`);\r\n this._stopConnection();\r\n }\r\n\r\n this.transport = undefined;\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\r\n private async _startInternal(transferFormat: TransferFormat): Promise {\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\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 } else {\r\n throw new Error(\"Negotiation can only be skipped when using the WebSocket transport directly.\");\r\n }\r\n } else {\r\n let negotiateResponse: INegotiateResponse | null = null;\r\n let redirects = 0;\r\n\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 === ConnectionState.Disconnecting || this._connectionState === ConnectionState.Disconnected) {\r\n throw new AbortError(\"The connection was stopped during negotiation.\");\r\n }\r\n\r\n if (negotiateResponse.error) {\r\n throw new Error(negotiateResponse.error);\r\n }\r\n\r\n if ((negotiateResponse as any).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\r\n if (negotiateResponse.url) {\r\n url = negotiateResponse.url;\r\n }\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\r\n redirects++;\r\n }\r\n while (negotiateResponse.url && redirects < MAX_REDIRECTS);\r\n\r\n if (redirects === MAX_REDIRECTS && negotiateResponse.url) {\r\n throw new Error(\"Negotiate redirection limit exceeded.\");\r\n }\r\n\r\n await this._createTransport(url, this._options.transport, negotiateResponse, transferFormat);\r\n }\r\n\r\n if (this.transport instanceof LongPollingTransport) {\r\n this.features.inherentKeepAlive = true;\r\n }\r\n\r\n if (this._connectionState === ConnectionState.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 = ConnectionState.Connected;\r\n }\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 } catch (e) {\r\n this._logger.log(LogLevel.Error, \"Failed to start the connection: \" + e);\r\n this._connectionState = ConnectionState.Disconnected;\r\n this.transport = undefined;\r\n\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\r\n private async _getNegotiationResponse(url: string): Promise {\r\n const headers: {[k: string]: string} = {};\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n\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\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\r\n const negotiateResponse = JSON.parse(response.content as string) as INegotiateResponse;\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\r\n if (negotiateResponse.useStatefulReconnect && this._options._useStatefulReconnect !== true) {\r\n return Promise.reject(new FailedToNegotiateWithServerError(\"Client didn't negotiate Stateful Reconnect but the server did.\"));\r\n }\r\n\r\n return negotiateResponse;\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\r\n return Promise.reject(new FailedToNegotiateWithServerError(errorMessage));\r\n }\r\n }\r\n\r\n private _createConnectUrl(url: string, connectionToken: string | null | undefined) {\r\n if (!connectionToken) {\r\n return url;\r\n }\r\n\r\n return url + (url.indexOf(\"?\") === -1 ? \"?\" : \"&\") + `id=${connectionToken}`;\r\n }\r\n\r\n private async _createTransport(url: string, requestedTransport: HttpTransportType | ITransport | undefined, negotiateResponse: INegotiateResponse, requestedTransferFormat: TransferFormat): Promise {\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\r\n this.connectionId = negotiateResponse.connectionId;\r\n return;\r\n }\r\n\r\n const transportExceptions: any[] = [];\r\n const transports = negotiateResponse.availableTransports || [];\r\n let negotiate: INegotiateResponse | undefined = negotiateResponse;\r\n for (const endpoint of transports) {\r\n const transportOrError = this._resolveTransportOrError(endpoint, requestedTransport, requestedTransferFormat,\r\n negotiate?.useStatefulReconnect === true);\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 } 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 } 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 } 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\r\n if (this._connectionState !== ConnectionState.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\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\r\n private _constructTransport(transport: HttpTransportType): ITransport {\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!,\r\n 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\r\n private _startTransport(url: string, transferFormat: TransferFormat): Promise {\r\n this.transport!.onreceive = this.onreceive;\r\n if (this.features.reconnect) {\r\n this.transport!.onclose = async (e) => {\r\n let callStop = false;\r\n if (this.features.reconnect) {\r\n try {\r\n this.features.disconnected();\r\n await this.transport!.connect(url, transferFormat);\r\n await this.features.resend();\r\n } catch {\r\n callStop = true;\r\n }\r\n } else {\r\n this._stopConnection(e);\r\n return;\r\n }\r\n\r\n if (callStop) {\r\n this._stopConnection(e);\r\n }\r\n };\r\n } else {\r\n this.transport!.onclose = (e) => this._stopConnection(e);\r\n }\r\n return this.transport!.connect(url, transferFormat);\r\n }\r\n\r\n private _resolveTransportOrError(endpoint: IAvailableTransport, requestedTransport: HttpTransportType | undefined,\r\n requestedTransferFormat: TransferFormat, useStatefulReconnect: boolean): ITransport | Error | unknown {\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 } 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 } else {\r\n this._logger.log(LogLevel.Debug, `Selecting transport '${HttpTransportType[transport]}'.`);\r\n try {\r\n this.features.reconnect = transport === HttpTransportType.WebSockets ? useStatefulReconnect : undefined;\r\n return this._constructTransport(transport);\r\n } catch (ex) {\r\n return ex;\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 } 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\r\n private _isITransport(transport: any): transport is ITransport {\r\n return transport && typeof (transport) === \"object\" && \"connect\" in transport;\r\n }\r\n\r\n private _stopConnection(error?: Error): void {\r\n this._logger.log(LogLevel.Debug, `HttpConnection.stopConnection(${error}) called while in state ${this._connectionState}.`);\r\n\r\n this.transport = undefined;\r\n\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\r\n if (this._connectionState === ConnectionState.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\r\n if (this._connectionState === ConnectionState.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\r\n if (this._connectionState === ConnectionState.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\r\n if (error) {\r\n this._logger.log(LogLevel.Error, `Connection disconnected with error '${error}'.`);\r\n } else {\r\n this._logger.log(LogLevel.Information, \"Connection disconnected.\");\r\n }\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\r\n this.connectionId = undefined;\r\n this._connectionState = ConnectionState.Disconnected;\r\n\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 } catch (e) {\r\n this._logger.log(LogLevel.Error, `HttpConnection.onclose(${error}) threw error '${e}'.`);\r\n }\r\n }\r\n }\r\n\r\n private _resolveUrl(url: string): string {\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\r\n if (!Platform.isBrowser) {\r\n throw new Error(`Cannot resolve '${url}'.`);\r\n }\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\r\n this._logger.log(LogLevel.Information, `Normalizing '${url}' to '${aTag.href}'.`);\r\n return aTag.href;\r\n }\r\n\r\n private _resolveNegotiateUrl(url: string): string {\r\n const negotiateUrl = new URL(url);\r\n\r\n if (negotiateUrl.pathname.endsWith('/')) {\r\n negotiateUrl.pathname += \"negotiate\";\r\n } else {\r\n negotiateUrl.pathname += \"/negotiate\";\r\n }\r\n const searchParams = new URLSearchParams(negotiateUrl.searchParams);\r\n\r\n if (!searchParams.has(\"negotiateVersion\")) {\r\n searchParams.append(\"negotiateVersion\", this._negotiateVersion.toString());\r\n }\r\n\r\n if (searchParams.has(\"useStatefulReconnect\")) {\r\n if (searchParams.get(\"useStatefulReconnect\") === \"true\") {\r\n this._options._useStatefulReconnect = true;\r\n }\r\n } else if (this._options._useStatefulReconnect === true) {\r\n searchParams.append(\"useStatefulReconnect\", \"true\");\r\n }\r\n\r\n negotiateUrl.search = searchParams.toString();\r\n\r\n return negotiateUrl.toString();\r\n }\r\n}\r\n\r\nfunction transportMatches(requestedTransport: HttpTransportType | undefined, actualTransport: HttpTransportType) {\r\n return !requestedTransport || ((actualTransport & requestedTransport) !== 0);\r\n}\r\n\r\n/** @private */\r\nexport class TransportSendQueue {\r\n private _buffer: any[] = [];\r\n private _sendBufferedData: PromiseSource;\r\n private _executing: boolean = true;\r\n private _transportResult?: PromiseSource;\r\n private _sendLoopPromise: Promise;\r\n\r\n constructor(private readonly _transport: ITransport) {\r\n this._sendBufferedData = new PromiseSource();\r\n this._transportResult = new PromiseSource();\r\n\r\n this._sendLoopPromise = this._sendLoop();\r\n }\r\n\r\n public send(data: string | ArrayBuffer): Promise {\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\r\n public stop(): Promise {\r\n this._executing = false;\r\n this._sendBufferedData.resolve();\r\n return this._sendLoopPromise;\r\n }\r\n\r\n private _bufferData(data: string | ArrayBuffer): void {\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\r\n this._buffer.push(data);\r\n this._sendBufferedData.resolve();\r\n }\r\n\r\n private async _sendLoop(): Promise {\r\n while (true) {\r\n await this._sendBufferedData.promise;\r\n\r\n if (!this._executing) {\r\n if (this._transportResult) {\r\n this._transportResult.reject(\"Connection stopped.\");\r\n }\r\n\r\n break;\r\n }\r\n\r\n this._sendBufferedData = new PromiseSource();\r\n\r\n const transportResult = this._transportResult!;\r\n this._transportResult = undefined;\r\n\r\n const data = typeof(this._buffer[0]) === \"string\" ?\r\n this._buffer.join(\"\") :\r\n TransportSendQueue._concatBuffers(this._buffer);\r\n\r\n this._buffer.length = 0;\r\n\r\n try {\r\n await this._transport.send(data);\r\n transportResult.resolve();\r\n } catch (error) {\r\n transportResult.reject(error);\r\n }\r\n }\r\n }\r\n\r\n private static _concatBuffers(arrayBuffers: ArrayBuffer[]): ArrayBuffer {\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\r\n return result.buffer;\r\n }\r\n}\r\n\r\nclass PromiseSource {\r\n private _resolver?: () => void;\r\n private _rejecter!: (reason?: any) => void;\r\n public promise: Promise;\r\n\r\n constructor() {\r\n this.promise = new Promise((resolve, reject) => [this._resolver, this._rejecter] = [resolve, reject]);\r\n }\r\n\r\n public resolve(): void {\r\n this._resolver!();\r\n }\r\n\r\n public reject(reason?: any): void {\r\n this._rejecter!(reason);\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { AckMessage, CompletionMessage, HubMessage, IHubProtocol, InvocationMessage, MessageType, SequenceMessage, StreamItemMessage } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { TextMessageFormat } from \"./TextMessageFormat\";\r\n\r\nconst JSON_HUB_PROTOCOL_NAME: string = \"json\";\r\n\r\n/** Implements the JSON Hub Protocol. */\r\nexport class JsonHubProtocol implements IHubProtocol {\r\n\r\n /** @inheritDoc */\r\n public readonly name: string = JSON_HUB_PROTOCOL_NAME;\r\n /** @inheritDoc */\r\n public readonly version: number = 2;\r\n\r\n /** @inheritDoc */\r\n public readonly transferFormat: 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 public parseMessages(input: string, logger: ILogger): HubMessage[] {\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\r\n if (!input) {\r\n return [];\r\n }\r\n\r\n if (logger === null) {\r\n logger = NullLogger.instance;\r\n }\r\n\r\n // Parse the messages\r\n const messages = TextMessageFormat.parse(input);\r\n\r\n const hubMessages = [];\r\n for (const message of messages) {\r\n const parsedMessage = JSON.parse(message) as HubMessage;\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 case MessageType.Ack:\r\n this._isAckMessage(parsedMessage);\r\n break;\r\n case MessageType.Sequence:\r\n this._isSequenceMessage(parsedMessage);\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\r\n return hubMessages;\r\n }\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 public writeMessage(message: HubMessage): string {\r\n return TextMessageFormat.write(JSON.stringify(message));\r\n }\r\n\r\n private _isInvocationMessage(message: InvocationMessage): void {\r\n this._assertNotEmptyString(message.target, \"Invalid payload for Invocation message.\");\r\n\r\n if (message.invocationId !== undefined) {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Invocation message.\");\r\n }\r\n }\r\n\r\n private _isStreamItemMessage(message: StreamItemMessage): void {\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for StreamItem message.\");\r\n\r\n if (message.item === undefined) {\r\n throw new Error(\"Invalid payload for StreamItem message.\");\r\n }\r\n }\r\n\r\n private _isCompletionMessage(message: CompletionMessage): void {\r\n if (message.result && message.error) {\r\n throw new Error(\"Invalid payload for Completion message.\");\r\n }\r\n\r\n if (!message.result && message.error) {\r\n this._assertNotEmptyString(message.error, \"Invalid payload for Completion message.\");\r\n }\r\n\r\n this._assertNotEmptyString(message.invocationId, \"Invalid payload for Completion message.\");\r\n }\r\n\r\n private _isAckMessage(message: AckMessage): void {\r\n if (typeof message.sequenceId !== 'number') {\r\n throw new Error(\"Invalid SequenceId for Ack message.\");\r\n }\r\n }\r\n\r\n private _isSequenceMessage(message: SequenceMessage): void {\r\n if (typeof message.sequenceId !== 'number') {\r\n throw new Error(\"Invalid SequenceId for Sequence message.\");\r\n }\r\n }\r\n\r\n private _assertNotEmptyString(value: any, errorMessage: string): void {\r\n if (typeof value !== \"string\" || value === \"\") {\r\n throw new Error(errorMessage);\r\n }\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { DefaultReconnectPolicy } from \"./DefaultReconnectPolicy\";\r\nimport { HttpConnection } from \"./HttpConnection\";\r\nimport { HubConnection } from \"./HubConnection\";\r\nimport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\nimport { IHubProtocol } from \"./IHubProtocol\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { IRetryPolicy } from \"./IRetryPolicy\";\r\nimport { IStatefulReconnectOptions } from \"./IStatefulReconnectOptions\";\r\nimport { HttpTransportType } from \"./ITransport\";\r\nimport { JsonHubProtocol } from \"./JsonHubProtocol\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { Arg, ConsoleLogger } from \"./Utils\";\r\n\r\nconst LogLevelNameMapping: {[k: string]: LogLevel} = {\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\n\r\nfunction parseLogLevel(name: string): LogLevel {\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 } else {\r\n throw new Error(`Unknown log level: ${name}`);\r\n }\r\n}\r\n\r\n/** A builder for configuring {@link @microsoft/signalr.HubConnection} instances. */\r\nexport class HubConnectionBuilder {\r\n private _serverTimeoutInMilliseconds?: number;\r\n private _keepAliveIntervalInMilliseconds ?: number;\r\n\r\n /** @internal */\r\n public protocol?: IHubProtocol;\r\n /** @internal */\r\n public httpConnectionOptions?: IHttpConnectionOptions;\r\n /** @internal */\r\n public url?: string;\r\n /** @internal */\r\n public logger?: ILogger;\r\n\r\n /** If defined, this indicates the client should automatically attempt to reconnect if the connection is lost. */\r\n /** @internal */\r\n public reconnectPolicy?: IRetryPolicy;\r\n\r\n private _statefulReconnectBufferSize?: number;\r\n\r\n /** Configures console logging for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @param {LogLevel} logLevel The minimum level of messages to log. Anything at this level, or a more severe level, will be logged.\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public configureLogging(logLevel: LogLevel): HubConnectionBuilder;\r\n\r\n /** Configures custom logging for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @param {ILogger} logger An object implementing the {@link @microsoft/signalr.ILogger} interface, which will be used to write all log messages.\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public configureLogging(logger: ILogger): HubConnectionBuilder;\r\n\r\n /** Configures custom logging for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @param {string} logLevel A string representing a LogLevel setting a minimum level of messages to log.\r\n * See {@link https://learn.microsoft.com/aspnet/core/signalr/configuration#configure-logging|the documentation for client logging configuration} for more details.\r\n */\r\n public configureLogging(logLevel: string): HubConnectionBuilder;\r\n\r\n /** Configures custom logging for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @param {LogLevel | string | ILogger} logging A {@link @microsoft/signalr.LogLevel}, a string representing a LogLevel, or an object implementing the {@link @microsoft/signalr.ILogger} interface.\r\n * See {@link https://learn.microsoft.com/aspnet/core/signalr/configuration#configure-logging|the documentation for client logging configuration} for more details.\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public configureLogging(logging: LogLevel | string | ILogger): HubConnectionBuilder;\r\n public configureLogging(logging: LogLevel | string | ILogger): HubConnectionBuilder {\r\n Arg.isRequired(logging, \"logging\");\r\n\r\n if (isLogger(logging)) {\r\n this.logger = logging;\r\n } else if (typeof logging === \"string\") {\r\n const logLevel = parseLogLevel(logging);\r\n this.logger = new ConsoleLogger(logLevel);\r\n } else {\r\n this.logger = new ConsoleLogger(logging);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to use HTTP-based transports to connect to the specified URL.\r\n *\r\n * The transport will be selected automatically based on what the server and client support.\r\n *\r\n * @param {string} url The URL the connection will use.\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withUrl(url: string): HubConnectionBuilder;\r\n\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to use the specified HTTP-based transport to connect to the specified URL.\r\n *\r\n * @param {string} url The URL the connection will use.\r\n * @param {HttpTransportType} transportType The specific transport to use.\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withUrl(url: string, transportType: HttpTransportType): HubConnectionBuilder;\r\n\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to use HTTP-based transports to connect to the specified URL.\r\n *\r\n * @param {string} url The URL the connection will use.\r\n * @param {IHttpConnectionOptions} options An options object used to configure the connection.\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withUrl(url: string, options: IHttpConnectionOptions): HubConnectionBuilder;\r\n public withUrl(url: string, transportTypeOrOptions?: IHttpConnectionOptions | HttpTransportType): HubConnectionBuilder {\r\n Arg.isRequired(url, \"url\");\r\n Arg.isNotEmpty(url, \"url\");\r\n\r\n this.url = url;\r\n\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 } else {\r\n this.httpConnectionOptions = {\r\n ...this.httpConnectionOptions,\r\n transport: transportTypeOrOptions,\r\n };\r\n }\r\n\r\n return this;\r\n }\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 public withHubProtocol(protocol: IHubProtocol): HubConnectionBuilder {\r\n Arg.isRequired(protocol, \"protocol\");\r\n\r\n this.protocol = protocol;\r\n return this;\r\n }\r\n\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to automatically attempt to reconnect if the connection is lost.\r\n * By default, the client will wait 0, 2, 10 and 30 seconds respectively before trying up to 4 reconnect attempts.\r\n */\r\n public withAutomaticReconnect(): HubConnectionBuilder;\r\n\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to automatically attempt to reconnect if the connection is lost.\r\n *\r\n * @param {number[]} retryDelays An array containing the delays in milliseconds before trying each reconnect attempt.\r\n * The length of the array represents how many failed reconnect attempts it takes before the client will stop attempting to reconnect.\r\n */\r\n public withAutomaticReconnect(retryDelays: number[]): HubConnectionBuilder;\r\n\r\n /** Configures the {@link @microsoft/signalr.HubConnection} to automatically attempt to reconnect if the connection is lost.\r\n *\r\n * @param {IRetryPolicy} reconnectPolicy An {@link @microsoft/signalR.IRetryPolicy} that controls the timing and number of reconnect attempts.\r\n */\r\n public withAutomaticReconnect(reconnectPolicy: IRetryPolicy): HubConnectionBuilder;\r\n public withAutomaticReconnect(retryDelaysOrReconnectPolicy?: number[] | IRetryPolicy): HubConnectionBuilder {\r\n if (this.reconnectPolicy) {\r\n throw new Error(\"A reconnectPolicy has already been set.\");\r\n }\r\n\r\n if (!retryDelaysOrReconnectPolicy) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy();\r\n } else if (Array.isArray(retryDelaysOrReconnectPolicy)) {\r\n this.reconnectPolicy = new DefaultReconnectPolicy(retryDelaysOrReconnectPolicy);\r\n } else {\r\n this.reconnectPolicy = retryDelaysOrReconnectPolicy;\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /** Configures {@link @microsoft/signalr.HubConnection.serverTimeoutInMilliseconds} for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withServerTimeout(milliseconds: number): HubConnectionBuilder {\r\n Arg.isRequired(milliseconds, \"milliseconds\");\r\n\r\n this._serverTimeoutInMilliseconds = milliseconds;\r\n\r\n return this;\r\n }\r\n\r\n /** Configures {@link @microsoft/signalr.HubConnection.keepAliveIntervalInMilliseconds} for the {@link @microsoft/signalr.HubConnection}.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withKeepAliveInterval(milliseconds: number): HubConnectionBuilder {\r\n Arg.isRequired(milliseconds, \"milliseconds\");\r\n\r\n this._keepAliveIntervalInMilliseconds = milliseconds;\r\n\r\n return this;\r\n }\r\n\r\n /** Enables and configures options for the Stateful Reconnect feature.\r\n *\r\n * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining.\r\n */\r\n public withStatefulReconnect(options?: IStatefulReconnectOptions): HubConnectionBuilder {\r\n if (this.httpConnectionOptions === undefined) {\r\n this.httpConnectionOptions = {};\r\n }\r\n this.httpConnectionOptions._useStatefulReconnect = true;\r\n\r\n this._statefulReconnectBufferSize = options?.bufferSize;\r\n\r\n return this;\r\n }\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 public build(): HubConnection {\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\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\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\r\n return HubConnection.create(\r\n connection,\r\n this.logger || NullLogger.instance,\r\n this.protocol || new JsonHubProtocol(),\r\n this.reconnectPolicy,\r\n this._serverTimeoutInMilliseconds,\r\n this._keepAliveIntervalInMilliseconds,\r\n this._statefulReconnectBufferSize);\r\n }\r\n}\r\n\r\nfunction isLogger(logger: any): logger is ILogger {\r\n return logger.log !== undefined;\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { ILogger } from \"./ILogger\";\r\nimport { TransferFormat } from \"./ITransport\";\r\n\r\n/** Defines the type of a Hub Message. */\r\nexport enum MessageType {\r\n /** Indicates the message is an Invocation message and implements the {@link @microsoft/signalr.InvocationMessage} interface. */\r\n Invocation = 1,\r\n /** Indicates the message is a StreamItem message and implements the {@link @microsoft/signalr.StreamItemMessage} interface. */\r\n StreamItem = 2,\r\n /** Indicates the message is a Completion message and implements the {@link @microsoft/signalr.CompletionMessage} interface. */\r\n Completion = 3,\r\n /** Indicates the message is a Stream Invocation message and implements the {@link @microsoft/signalr.StreamInvocationMessage} interface. */\r\n StreamInvocation = 4,\r\n /** Indicates the message is a Cancel Invocation message and implements the {@link @microsoft/signalr.CancelInvocationMessage} interface. */\r\n CancelInvocation = 5,\r\n /** Indicates the message is a Ping message and implements the {@link @microsoft/signalr.PingMessage} interface. */\r\n Ping = 6,\r\n /** Indicates the message is a Close message and implements the {@link @microsoft/signalr.CloseMessage} interface. */\r\n Close = 7,\r\n Ack = 8,\r\n Sequence = 9\r\n}\r\n\r\n/** Defines a dictionary of string keys and string values representing headers attached to a Hub message. */\r\nexport interface MessageHeaders {\r\n /** Gets or sets the header with the specified key. */\r\n [key: string]: string;\r\n}\r\n\r\n/** Union type of all known Hub messages. */\r\nexport type HubMessage =\r\n InvocationMessage |\r\n StreamInvocationMessage |\r\n StreamItemMessage |\r\n CompletionMessage |\r\n CancelInvocationMessage |\r\n PingMessage |\r\n CloseMessage |\r\n AckMessage |\r\n SequenceMessage;\r\n\r\n/** Defines properties common to all Hub messages. */\r\nexport interface HubMessageBase {\r\n /** A {@link @microsoft/signalr.MessageType} value indicating the type of this message. */\r\n readonly type: MessageType;\r\n}\r\n\r\n/** Defines properties common to all Hub messages relating to a specific invocation. */\r\nexport interface HubInvocationMessage extends HubMessageBase {\r\n /** A {@link @microsoft/signalr.MessageHeaders} dictionary containing headers attached to the message. */\r\n readonly headers?: MessageHeaders;\r\n /** The ID of the invocation relating to this message.\r\n *\r\n * This is expected to be present for {@link @microsoft/signalr.StreamInvocationMessage} and {@link @microsoft/signalr.CompletionMessage}. It may\r\n * be 'undefined' for an {@link @microsoft/signalr.InvocationMessage} if the sender does not expect a response.\r\n */\r\n readonly invocationId?: string;\r\n}\r\n\r\n/** A hub message representing a non-streaming invocation. */\r\nexport interface InvocationMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Invocation;\r\n /** The target method name. */\r\n readonly target: string;\r\n /** The target method arguments. */\r\n readonly arguments: any[];\r\n /** The target methods stream IDs. */\r\n readonly streamIds?: string[];\r\n}\r\n\r\n/** A hub message representing a streaming invocation. */\r\nexport interface StreamInvocationMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.StreamInvocation;\r\n\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n /** The target method name. */\r\n readonly target: string;\r\n /** The target method arguments. */\r\n readonly arguments: any[];\r\n /** The target methods stream IDs. */\r\n readonly streamIds?: string[];\r\n}\r\n\r\n/** A hub message representing a single item produced as part of a result stream. */\r\nexport interface StreamItemMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.StreamItem;\r\n\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n\r\n /** The item produced by the server. */\r\n readonly item?: any;\r\n}\r\n\r\n/** A hub message representing the result of an invocation. */\r\nexport interface CompletionMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Completion;\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n /** The error produced by the invocation, if any.\r\n *\r\n * Either {@link @microsoft/signalr.CompletionMessage.error} or {@link @microsoft/signalr.CompletionMessage.result} must be defined, but not both.\r\n */\r\n readonly error?: string;\r\n /** The result produced by the invocation, if any.\r\n *\r\n * Either {@link @microsoft/signalr.CompletionMessage.error} or {@link @microsoft/signalr.CompletionMessage.result} must be defined, but not both.\r\n */\r\n readonly result?: any;\r\n}\r\n\r\n/** A hub message indicating that the sender is still active. */\r\nexport interface PingMessage extends HubMessageBase {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Ping;\r\n}\r\n\r\n/** A hub message indicating that the sender is closing the connection.\r\n *\r\n * If {@link @microsoft/signalr.CloseMessage.error} is defined, the sender is closing the connection due to an error.\r\n */\r\nexport interface CloseMessage extends HubMessageBase {\r\n /** @inheritDoc */\r\n readonly type: MessageType.Close;\r\n /** The error that triggered the close, if any.\r\n *\r\n * If this property is undefined, the connection was closed normally and without error.\r\n */\r\n readonly error?: string;\r\n\r\n /** If true, clients with automatic reconnects enabled should attempt to reconnect after receiving the CloseMessage. Otherwise, they should not. */\r\n readonly allowReconnect?: boolean;\r\n}\r\n\r\n/** A hub message sent to request that a streaming invocation be canceled. */\r\nexport interface CancelInvocationMessage extends HubInvocationMessage {\r\n /** @inheritDoc */\r\n readonly type: MessageType.CancelInvocation;\r\n /** The invocation ID. */\r\n readonly invocationId: string;\r\n}\r\n\r\nexport interface AckMessage extends HubMessageBase\r\n{\r\n readonly type: MessageType.Ack;\r\n\r\n readonly sequenceId: number;\r\n}\r\n\r\nexport interface SequenceMessage extends HubMessageBase\r\n{\r\n readonly type: MessageType.Sequence;\r\n\r\n readonly sequenceId: number;\r\n}\r\n\r\n/** A protocol abstraction for communicating with SignalR Hubs. */\r\nexport interface IHubProtocol {\r\n /** The name of the protocol. This is used by SignalR to resolve the protocol between the client and server. */\r\n readonly name: string;\r\n /** The version of the protocol. */\r\n readonly version: number;\r\n /** The {@link @microsoft/signalr.TransferFormat} of the protocol. */\r\n readonly transferFormat: TransferFormat;\r\n\r\n /** Creates an array of {@link @microsoft/signalr.HubMessage} objects from the specified serialized representation.\r\n *\r\n * If {@link @microsoft/signalr.IHubProtocol.transferFormat} is 'Text', the `input` parameter must be a string, otherwise it must be an ArrayBuffer.\r\n *\r\n * @param {string | ArrayBuffer} input A string or ArrayBuffer 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: string | ArrayBuffer, logger: ILogger): HubMessage[];\r\n\r\n /** Writes the specified {@link @microsoft/signalr.HubMessage} to a string or ArrayBuffer and returns it.\r\n *\r\n * If {@link @microsoft/signalr.IHubProtocol.transferFormat} is 'Text', the result of this method will be a string, otherwise it will be an ArrayBuffer.\r\n *\r\n * @param {HubMessage} message The message to write.\r\n * @returns {string | ArrayBuffer} A string or ArrayBuffer containing the serialized representation of the message.\r\n */\r\n writeMessage(message: HubMessage): string | ArrayBuffer;\r\n}","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\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 enum LogLevel {\r\n /** Log level for very low severity diagnostic messages. */\r\n Trace = 0,\r\n /** Log level for low severity diagnostic messages. */\r\n Debug = 1,\r\n /** Log level for informational diagnostic messages. */\r\n Information = 2,\r\n /** Log level for diagnostic messages that indicate a non-fatal problem. */\r\n Warning = 3,\r\n /** Log level for diagnostic messages that indicate a failure in the current operation. */\r\n Error = 4,\r\n /** Log level for diagnostic messages that indicate a failure that will terminate the entire application. */\r\n Critical = 5,\r\n /** The highest possible log level. Used when configuring logging to indicate that no log messages should be emitted. */\r\n None = 6,\r\n}\r\n\r\n/** An abstraction that provides a sink for diagnostic messages. */\r\nexport interface ILogger {\r\n /** Called by the framework to emit a diagnostic message.\r\n *\r\n * @param {LogLevel} logLevel The severity level of the message.\r\n * @param {string} message The message.\r\n */\r\n log(logLevel: LogLevel, message: string): void;\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\n\r\n/** A logger that does nothing when log messages are sent to it. */\r\nexport class NullLogger implements ILogger {\r\n /** The singleton instance of the {@link @microsoft/signalr.NullLogger}. */\r\n public static instance: ILogger = new NullLogger();\r\n\r\n private constructor() {}\r\n\r\n /** @inheritDoc */\r\n // eslint-disable-next-line\r\n public log(_logLevel: LogLevel, _message: string): void {\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\n// Not exported from index\r\n/** @private */\r\nexport class TextMessageFormat {\r\n public static RecordSeparatorCode = 0x1e;\r\n public static RecordSeparator = String.fromCharCode(TextMessageFormat.RecordSeparatorCode);\r\n\r\n public static write(output: string): string {\r\n return `${output}${TextMessageFormat.RecordSeparator}`;\r\n }\r\n\r\n public static parse(input: string): string[] {\r\n if (input[input.length - 1] !== TextMessageFormat.RecordSeparator) {\r\n throw new Error(\"Message is incomplete.\");\r\n }\r\n\r\n const messages = input.split(TextMessageFormat.RecordSeparator);\r\n messages.pop();\r\n return messages;\r\n }\r\n}\r\n","// Licensed to the .NET Foundation under one or more agreements.\r\n// The .NET Foundation licenses this file to you under the MIT license.\r\n\r\nimport { HttpClient } from \"./HttpClient\";\r\nimport { ILogger, LogLevel } from \"./ILogger\";\r\nimport { NullLogger } from \"./Loggers\";\r\nimport { IStreamSubscriber, ISubscription } from \"./Stream\";\r\nimport { Subject } from \"./Subject\";\r\nimport { IHttpConnectionOptions } from \"./IHttpConnectionOptions\";\r\n\r\n// Version token that will be replaced by the prepack command\r\n/** The version of the SignalR client. */\r\n\r\nexport const VERSION: string = \"0.0.0-DEV_BUILD\";\r\n/** @private */\r\nexport class Arg {\r\n public static isRequired(val: any, name: string): void {\r\n if (val === null || val === undefined) {\r\n throw new Error(`The '${name}' argument is required.`);\r\n }\r\n }\r\n public static isNotEmpty(val: string, name: string): void {\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\r\n public static isIn(val: any, values: any, name: string): void {\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\r\n/** @private */\r\nexport class Platform {\r\n // react-native has a window but no document so we should check both\r\n public static get isBrowser(): boolean {\r\n return !Platform.isNode && typeof window === \"object\" && typeof window.document === \"object\";\r\n }\r\n\r\n // WebWorkers don't have a window object so the isBrowser check would fail\r\n public static get isWebWorker(): boolean {\r\n return !Platform.isNode && typeof self === \"object\" && \"importScripts\" in self;\r\n }\r\n\r\n // react-native has a window but no document\r\n static get isReactNative(): boolean {\r\n return !Platform.isNode && typeof window === \"object\" && typeof window.document === \"undefined\";\r\n }\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 public static get isNode(): boolean {\r\n return typeof process !== \"undefined\" && process.release && process.release.name === \"node\";\r\n }\r\n}\r\n\r\n/** @private */\r\nexport function getDataDetail(data: any, includeContent: boolean): string {\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 } 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\r\n/** @private */\r\nexport function formatArrayBuffer(data: ArrayBuffer): string {\r\n const view = new Uint8Array(data);\r\n\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\r\n // Trim of trailing space.\r\n return str.substr(0, str.length - 1);\r\n}\r\n\r\n// Also in signalr-protocol-msgpack/Utils.ts\r\n/** @private */\r\nexport function isArrayBuffer(val: any): val is ArrayBuffer {\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\r\n/** @private */\r\nexport async function sendMessage(logger: ILogger, transportName: string, httpClient: HttpClient, url: string,\r\n content: string | ArrayBuffer, options: IHttpConnectionOptions): Promise {\r\n const headers: {[k: string]: string} = {};\r\n\r\n const [name, value] = getUserAgentHeader();\r\n headers[name] = value;\r\n\r\n logger.log(LogLevel.Trace, `(${transportName} transport) sending data. ${getDataDetail(content, options.logMessageContent!)}.`);\r\n\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\r\n logger.log(LogLevel.Trace, `(${transportName} transport) request complete. Response status: ${response.statusCode}.`);\r\n}\r\n\r\n/** @private */\r\nexport function createLogger(logger?: ILogger | LogLevel): ILogger {\r\n if (logger === undefined) {\r\n return new ConsoleLogger(LogLevel.Information);\r\n }\r\n\r\n if (logger === null) {\r\n return NullLogger.instance;\r\n }\r\n\r\n if ((logger as ILogger).log !== undefined) {\r\n return logger as ILogger;\r\n }\r\n\r\n return new ConsoleLogger(logger as LogLevel);\r\n}\r\n\r\n/** @private */\r\nexport class SubjectSubscription implements ISubscription {\r\n private _subject: Subject;\r\n private _observer: IStreamSubscriber;\r\n\r\n constructor(subject: Subject, observer: IStreamSubscriber) {\r\n this._subject = subject;\r\n this._observer = observer;\r\n }\r\n\r\n public dispose(): void {\r\n const index: number = this._subject.observers.indexOf(this._observer);\r\n if (index > -1) {\r\n this._subject.observers.splice(index, 1);\r\n }\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\r\n/** @private */\r\nexport class ConsoleLogger implements ILogger {\r\n private readonly _minLevel: LogLevel;\r\n\r\n // Public for testing purposes.\r\n public out: {\r\n error(message: any): void,\r\n warn(message: any): void,\r\n info(message: any): void,\r\n log(message: any): void,\r\n };\r\n\r\n constructor(minimumLogLevel: LogLevel) {\r\n this._minLevel = minimumLogLevel;\r\n this.out = console;\r\n }\r\n\r\n public log(logLevel: LogLevel, message: string): void {\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\r\n/** @private */\r\nexport function getUserAgentHeader(): [string, string] {\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\r\n/** @private */\r\nexport function constructUserAgent(version: string, os: string, runtime: string, runtimeVersion: string | undefined): string {\r\n // Microsoft SignalR/[Version] ([Detailed Version]; [Operating System]; [Runtime]; [Runtime Version])\r\n let userAgent: string = \"Microsoft SignalR/\";\r\n\r\n const majorAndMinor = version.split(\".\");\r\n userAgent += `${majorAndMinor[0]}.${majorAndMinor[1]}`;\r\n userAgent += ` (${version}; `;\r\n\r\n if (os && os !== \"\") {\r\n userAgent += `${os}; `;\r\n } else {\r\n userAgent += \"Unknown OS; \";\r\n }\r\n\r\n userAgent += `${runtime}`;\r\n\r\n if (runtimeVersion) {\r\n userAgent += `; ${runtimeVersion}`;\r\n } else {\r\n userAgent += \"; Unknown Runtime Version\";\r\n }\r\n\r\n userAgent += \")\";\r\n return userAgent;\r\n}\r\n\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getOsName(): string {\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 } else {\r\n return \"\";\r\n }\r\n}\r\n\r\n// eslint-disable-next-line spaced-comment\r\n/*#__PURE__*/ function getRuntimeVersion(): string | undefined {\r\n if (Platform.isNode) {\r\n return process.versions.node;\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction getRuntime(): string {\r\n if (Platform.isNode) {\r\n return \"NodeJS\";\r\n } else {\r\n return \"Browser\";\r\n }\r\n}\r\n\r\n/** @private */\r\nexport function getErrorString(e: any): string {\r\n if (e.stack) {\r\n return e.stack;\r\n } else if (e.message) {\r\n return e.message;\r\n }\r\n return `${e}`;\r\n}\r\n\r\n/** @private */\r\nexport function getGlobalThis(): unknown {\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"],"names":["HttpError","_Error","errorMessage","statusCode","_this","_classCallCheck","trueProto","constructor","prototype","_callSuper","concat","__proto__","_inherits","_createClass","_wrapNativeSuper","Error","TimeoutError","_Error2","_this2","arguments","length","undefined","AbortError","_Error3","_this3","UnsupportedTransportError","_Error4","message","transport","_this4","errorType","DisabledTransportError","_Error5","_this5","FailedToStartTransportError","_Error6","_this6","FailedToNegotiateWithServerError","_Error7","_this7","AggregateErrors","_Error8","innerErrors","_this8","HubConnectionState","HandshakeProtocol","key","value","handshakeRequest","TextMessageFormat","write","JSON","stringify","data","messageData","remainingData","isArrayBuffer","binaryData","Uint8Array","separatorIndex","indexOf","RecordSeparatorCode","responseLength","String","fromCharCode","apply","Array","slice","call","byteLength","buffer","textData","RecordSeparator","substring","messages","parse","response","type","Subject","this","observers","item","_step","_iterator","_createForOfIteratorHelper","s","n","done","next","err","e","f","_step2","_iterator2","observer","error","_step3","_iterator3","complete","push","SubjectSubscription","MessageBuffer","protocol","connection","bufferSize","_bufferSize","_messages","_totalMessageCount","_waitForSequenceMessage","_nextReceivingSequenceId","_latestReceivedSequenceId","_bufferedByteCount","_reconnectInProgress","_protocol","_connection","_send2","_asyncToGenerator","_regeneratorRuntime","mark","_callee","serializedMessage","backpressurePromise","backpressurePromiseResolver","backpressurePromiseRejector","wrap","_context","prev","writeMessage","Promise","resolve","_isInvocationMessage","reject","BufferedItem","send","t0","_disconnected","stop","_x","ackMessage","newestAckedMessage","index","element","_id","sequenceId","_message","_resolver","MessageType","Sequence","currentId","_ackTimer","_resend2","_callee2","_context2","finish","_rejector","Invocation","StreamItem","Completion","StreamInvocation","CancelInvocation","Close","Ping","Ack","_ackTimerHandle","setTimeout","_callee3","_context3","clearTimeout","id","resolver","rejector","HubConnection","logger","reconnectPolicy","serverTimeoutInMilliseconds","keepAliveIntervalInMilliseconds","statefulReconnectBufferSize","_nextKeepAlive","_freezeEventListener","_logger","log","LogLevel","Warning","Arg","isRequired","_statefulReconnectBufferSize","_reconnectPolicy","_handshakeProtocol","onreceive","_processIncomingData","onclose","_connectionClosed","_callbacks","_methods","_closedCallbacks","_reconnectingCallbacks","_reconnectedCallbacks","_invocationId","_receivedHandshakeResponse","_connectionState","Disconnected","_connectionStarted","_cachedPingMessage","get","connectionId","baseUrl","set","url","Reconnecting","_startPromise","_startWithStateTransitions","_startWithStateTransitions2","abrupt","Connecting","Debug","_startInternal","Platform","isBrowser","window","document","addEventListener","Connected","_startInternal2","handshakePromise","version","_stopDuringStartError","_handshakeResolver","_handshakeRejecter","start","transferFormat","features","reconnect","name","_sendMessage","writeHandshakeRequest","Information","_cleanupTimeout","_resetTimeoutPeriod","_resetKeepAliveInterval","_messageBuffer","disconnected","bind","resend","_resend","inherentKeepAlive","_cleanupPingTimer","_stop","startPromise","_stopPromise","_stopInternal","Disconnecting","state","_reconnectDelayHandle","_completeClose","_sendCloseMessage","_sendCloseMessage2","_callee4","_context4","_sendWithProtocol","_createCloseMessage","methodName","_len","args","_key","promiseQueue","_this$_replaceStreami","_replaceStreamingParams","_this$_replaceStreami2","_slicedToArray","streams","streamIds","invocationDescriptor","_createStreamInvocation","subject","cancelCallback","cancelInvocation","_createCancelInvocation","invocationId","then","invocationEvent","catch","_launchStreams","_send","_len2","_key2","_this$_replaceStreami3","_this$_replaceStreami4","sendPromise","_createInvocation","_len3","_key3","_this$_replaceStreami5","_this$_replaceStreami6","result","newMethod","toLowerCase","method","handlers","removeIdx","splice","callback","_processHandshakeResponse","parseMessages","_shouldProcessMessage","_invokeClientMethod","getErrorString","allowReconnect","_ack","_resetSequence","responseMessage","_this$_handshakeProto","parseHandshakeResponse","_this$_handshakeProto2","Date","getTime","_timeoutHandle","serverTimeout","_pingServerHandle","nextPing","_callee5","_context5","_invokeClientMethod2","_callee6","invocationMessage","methods","methodsCopy","expectsResponse","res","exception","completionMessage","m","prevRes","_context6","target","_createCompletionMessage","sent","t1","_cancelCallbacksWithError","_reconnect","_dispose","removeEventListener","forEach","c","_reconnect2","_callee7","reconnectStartTime","previousReconnectAttempts","retryError","nextRetryDelay","_context7","now","_getNextRetryDelay","toString","_x2","previousRetryCount","elapsedMilliseconds","retryReason","nextRetryDelayInMilliseconds","callbacks","Object","keys","nonblocking","_this9","_loop","streamId","subscribe","_createStreamItemMessage","i","argument","_isObservable","arg","DEFAULT_RETRY_DELAYS_IN_MILLISECONDS","DefaultReconnectPolicy","retryDelays","_retryDelays","_toConsumableArray","retryContext","HeaderNames","Authorization","Cookie","HttpResponse","statusText","content","HttpClient","options","_objectSpread","AccessTokenHttpClient","_HttpClient","innerClient","accessTokenFactory","_innerClient","_accessTokenFactory","request","allowRetry","_accessToken","_setAuthorizationHeader","headers","getCookieString","FetchHttpClient","obj","fetchObj","_fetchType","_jar","fetch","isNode","require","getGlobalThis","_abortControllerType","AbortController","abortObj","configureAbortController","abortController","timeoutId","msTimeout","payload","abortSignal","aborted","onabort","abort","timeout","body","cache","credentials","withCredentials","mode","redirect","signal","ok","deserializeContent","status","responseType","cookies","getCookies","join","arrayBuffer","text","HttpTransportType","TransferFormat","XhrHttpClient","xhr","XMLHttpRequest","open","setRequestHeader","header","onload","responseText","onerror","ontimeout","DefaultHttpClient","_httpClient","_isAborted","LongPollingTransport","httpClient","_pollAbort","_options","_running","_connect","_getUserAgentHeader","_getUserAgentHeader2","pollOptions","pollUrl","isIn","_url","Trace","Binary","getUserAgentHeader","_defineProperty","_closeError","_receiving","_poll","_poll2","getDataDetail","logMessageContent","pollAborted","_raiseOnClose","_x3","_x4","sendMessage","_x5","_getUserAgentHeader3","_getUserAgentHeader4","deleteOptions","delete","logMessage","ServerSentEventsTransport","accessToken","encodeURIComponent","opened","Text","eventSource","isWebWorker","EventSource","onmessage","_close","onopen","_eventSource","close","WebSocketTransport","webSocketConstructor","_logMessageContent","_webSocketConstructor","_headers","token","webSocket","replace","isReactNative","binaryType","_event","_webSocket","event","ErrorEvent","readyState","OPEN","_isCloseEvent","wasClean","code","reason","HttpConnection","_stopPromiseResolver","_negotiateVersion","createLogger","_resolveUrl","webSocketModule","eventSourceModule","WebSocket","_start","_startInternalPromise","_sendQueue","TransportSendQueue","_stopInternal2","_stopError","_stopConnection","negotiateResponse","redirects","skipNegotiation","WebSockets","_constructTransport","_startTransport","_getNegotiationResponse","ProtocolVersion","delegateYield","_createTransport","_getNegotiationResponse2","negotiateUrl","_resolveNegotiateUrl","post","negotiateVersion","connectionToken","useStatefulReconnect","_useStatefulReconnect","_createTransport2","requestedTransport","requestedTransferFormat","connectUrl","transportExceptions","transports","negotiate","endpoint","transportOrError","_createConnectUrl","_isITransport","availableTransports","_resolveTransportOrError","t2","_x6","_x7","_x8","_x9","ServerSentEvents","LongPolling","_ref","callStop","_context8","connect","_x10","actualTransport","transportMatches","transferFormats","map","ex","lastIndexOf","aTag","createElement","href","URL","pathname","endsWith","searchParams","URLSearchParams","has","append","search","_transport","_buffer","_executing","_sendBufferedData","PromiseSource","_transportResult","_sendLoopPromise","_sendLoop","_bufferData","promise","_sendLoop2","_callee8","transportResult","_context9","_concatBuffers","arrayBuffers","totalLength","b","reduce","a","offset","_ref2","_rejecter","JsonHubProtocol","input","NullLogger","instance","hubMessages","parsedMessage","_isStreamItemMessage","_isCompletionMessage","_isAckMessage","_isSequenceMessage","_assertNotEmptyString","LogLevelNameMapping","trace","debug","info","information","warn","warning","critical","Critical","none","None","HubConnectionBuilder","logging","logLevel","mapping","parseLogLevel","ConsoleLogger","transportTypeOrOptions","isNotEmpty","httpConnectionOptions","retryDelaysOrReconnectPolicy","isArray","milliseconds","_serverTimeoutInMilliseconds","_keepAliveIntervalInMilliseconds","create","_logLevel","output","split","pop","VERSION","val","match","values","self","process","release","includeContent","detail","view","str","num","substr","formatArrayBuffer","ArrayBuffer","transportName","_subject","_observer","_","minimumLogLevel","_minLevel","out","console","msg","toISOString","userAgentHeaderName","constructUserAgent","getOsName","getRuntime","getRuntimeVersion","os","runtime","runtimeVersion","userAgent","majorAndMinor","platform","versions","node","stack","globalThis","global"],"sourceRoot":""}