UNPKG

@microsoft/signalr

Version:
148 lines 6.88 kB
"use strict"; // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. Object.defineProperty(exports, "__esModule", { value: true }); exports.HubConnectionBuilder = void 0; const DefaultReconnectPolicy_1 = require("./DefaultReconnectPolicy"); const HttpConnection_1 = require("./HttpConnection"); const HubConnection_1 = require("./HubConnection"); const ILogger_1 = require("./ILogger"); const JsonHubProtocol_1 = require("./JsonHubProtocol"); const Loggers_1 = require("./Loggers"); const Utils_1 = require("./Utils"); const LogLevelNameMapping = { trace: ILogger_1.LogLevel.Trace, debug: ILogger_1.LogLevel.Debug, info: ILogger_1.LogLevel.Information, information: ILogger_1.LogLevel.Information, warn: ILogger_1.LogLevel.Warning, warning: ILogger_1.LogLevel.Warning, error: ILogger_1.LogLevel.Error, critical: ILogger_1.LogLevel.Critical, none: ILogger_1.LogLevel.None, }; function parseLogLevel(name) { // Case-insensitive matching via lower-casing // Yes, I know case-folding is a complicated problem in Unicode, but we only support // the ASCII strings defined in LogLevelNameMapping anyway, so it's fine -anurse. const mapping = LogLevelNameMapping[name.toLowerCase()]; if (typeof mapping !== "undefined") { return mapping; } else { throw new Error(`Unknown log level: ${name}`); } } /** A builder for configuring {@link @microsoft/signalr.HubConnection} instances. */ class HubConnectionBuilder { configureLogging(logging) { Utils_1.Arg.isRequired(logging, "logging"); if (isLogger(logging)) { this.logger = logging; } else if (typeof logging === "string") { const logLevel = parseLogLevel(logging); this.logger = new Utils_1.ConsoleLogger(logLevel); } else { this.logger = new Utils_1.ConsoleLogger(logging); } return this; } withUrl(url, transportTypeOrOptions) { Utils_1.Arg.isRequired(url, "url"); Utils_1.Arg.isNotEmpty(url, "url"); this.url = url; // Flow-typing knows where it's at. Since HttpTransportType is a number and IHttpConnectionOptions is guaranteed // to be an object, we know (as does TypeScript) this comparison is all we need to figure out which overload was called. if (typeof transportTypeOrOptions === "object") { this.httpConnectionOptions = { ...this.httpConnectionOptions, ...transportTypeOrOptions }; } else { this.httpConnectionOptions = { ...this.httpConnectionOptions, transport: transportTypeOrOptions, }; } return this; } /** Configures the {@link @microsoft/signalr.HubConnection} to use the specified Hub Protocol. * * @param {IHubProtocol} protocol The {@link @microsoft/signalr.IHubProtocol} implementation to use. */ withHubProtocol(protocol) { Utils_1.Arg.isRequired(protocol, "protocol"); this.protocol = protocol; return this; } withAutomaticReconnect(retryDelaysOrReconnectPolicy) { if (this.reconnectPolicy) { throw new Error("A reconnectPolicy has already been set."); } if (!retryDelaysOrReconnectPolicy) { this.reconnectPolicy = new DefaultReconnectPolicy_1.DefaultReconnectPolicy(); } else if (Array.isArray(retryDelaysOrReconnectPolicy)) { this.reconnectPolicy = new DefaultReconnectPolicy_1.DefaultReconnectPolicy(retryDelaysOrReconnectPolicy); } else { this.reconnectPolicy = retryDelaysOrReconnectPolicy; } return this; } /** Configures {@link @microsoft/signalr.HubConnection.serverTimeoutInMilliseconds} for the {@link @microsoft/signalr.HubConnection}. * * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining. */ withServerTimeout(milliseconds) { Utils_1.Arg.isRequired(milliseconds, "milliseconds"); this._serverTimeoutInMilliseconds = milliseconds; return this; } /** Configures {@link @microsoft/signalr.HubConnection.keepAliveIntervalInMilliseconds} for the {@link @microsoft/signalr.HubConnection}. * * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining. */ withKeepAliveInterval(milliseconds) { Utils_1.Arg.isRequired(milliseconds, "milliseconds"); this._keepAliveIntervalInMilliseconds = milliseconds; return this; } /** Enables and configures options for the Stateful Reconnect feature. * * @returns The {@link @microsoft/signalr.HubConnectionBuilder} instance, for chaining. */ withStatefulReconnect(options) { if (this.httpConnectionOptions === undefined) { this.httpConnectionOptions = {}; } this.httpConnectionOptions._useStatefulReconnect = true; this._statefulReconnectBufferSize = options === null || options === void 0 ? void 0 : options.bufferSize; return this; } /** Creates a {@link @microsoft/signalr.HubConnection} from the configuration options specified in this builder. * * @returns {HubConnection} The configured {@link @microsoft/signalr.HubConnection}. */ build() { // If httpConnectionOptions has a logger, use it. Otherwise, override it with the one // provided to configureLogger const httpConnectionOptions = this.httpConnectionOptions || {}; // If it's 'null', the user **explicitly** asked for null, don't mess with it. if (httpConnectionOptions.logger === undefined) { // If our logger is undefined or null, that's OK, the HttpConnection constructor will handle it. httpConnectionOptions.logger = this.logger; } // Now create the connection if (!this.url) { throw new Error("The 'HubConnectionBuilder.withUrl' method must be called before building the connection."); } const connection = new HttpConnection_1.HttpConnection(this.url, httpConnectionOptions); return HubConnection_1.HubConnection.create(connection, this.logger || Loggers_1.NullLogger.instance, this.protocol || new JsonHubProtocol_1.JsonHubProtocol(), this.reconnectPolicy, this._serverTimeoutInMilliseconds, this._keepAliveIntervalInMilliseconds, this._statefulReconnectBufferSize); } } exports.HubConnectionBuilder = HubConnectionBuilder; function isLogger(logger) { return logger.log !== undefined; } //# sourceMappingURL=HubConnectionBuilder.js.map