@microsoft/signalr
Version:
ASP.NET Core SignalR Client
148 lines • 6.88 kB
JavaScript
"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