@microsoft/signalr
Version:
ASP.NET Core SignalR Client
123 lines • 5.49 kB
JavaScript
// 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.JsonHubProtocol = void 0;
const IHubProtocol_1 = require("./IHubProtocol");
const ILogger_1 = require("./ILogger");
const ITransport_1 = require("./ITransport");
const Loggers_1 = require("./Loggers");
const TextMessageFormat_1 = require("./TextMessageFormat");
const JSON_HUB_PROTOCOL_NAME = "json";
/** Implements the JSON Hub Protocol. */
class JsonHubProtocol {
constructor() {
/** @inheritDoc */
this.name = JSON_HUB_PROTOCOL_NAME;
/** @inheritDoc */
this.version = 2;
/** @inheritDoc */
this.transferFormat = ITransport_1.TransferFormat.Text;
}
/** Creates an array of {@link @microsoft/signalr.HubMessage} objects from the specified serialized representation.
*
* @param {string} input A string containing the serialized representation.
* @param {ILogger} logger A logger that will be used to log messages that occur during parsing.
*/
parseMessages(input, logger) {
// The interface does allow "ArrayBuffer" to be passed in, but this implementation does not. So let's throw a useful error.
if (typeof input !== "string") {
throw new Error("Invalid input for JSON hub protocol. Expected a string.");
}
if (!input) {
return [];
}
if (logger === null) {
logger = Loggers_1.NullLogger.instance;
}
// Parse the messages
const messages = TextMessageFormat_1.TextMessageFormat.parse(input);
const hubMessages = [];
for (const message of messages) {
const parsedMessage = JSON.parse(message);
if (typeof parsedMessage.type !== "number") {
throw new Error("Invalid payload.");
}
switch (parsedMessage.type) {
case IHubProtocol_1.MessageType.Invocation:
this._isInvocationMessage(parsedMessage);
break;
case IHubProtocol_1.MessageType.StreamItem:
this._isStreamItemMessage(parsedMessage);
break;
case IHubProtocol_1.MessageType.Completion:
this._isCompletionMessage(parsedMessage);
break;
case IHubProtocol_1.MessageType.Ping:
// Single value, no need to validate
break;
case IHubProtocol_1.MessageType.Close:
// All optional values, no need to validate
break;
case IHubProtocol_1.MessageType.Ack:
this._isAckMessage(parsedMessage);
break;
case IHubProtocol_1.MessageType.Sequence:
this._isSequenceMessage(parsedMessage);
break;
default:
// Future protocol changes can add message types, old clients can ignore them
logger.log(ILogger_1.LogLevel.Information, "Unknown message type '" + parsedMessage.type + "' ignored.");
continue;
}
hubMessages.push(parsedMessage);
}
return hubMessages;
}
/** Writes the specified {@link @microsoft/signalr.HubMessage} to a string and returns it.
*
* @param {HubMessage} message The message to write.
* @returns {string} A string containing the serialized representation of the message.
*/
writeMessage(message) {
return TextMessageFormat_1.TextMessageFormat.write(JSON.stringify(message));
}
_isInvocationMessage(message) {
this._assertNotEmptyString(message.target, "Invalid payload for Invocation message.");
if (message.invocationId !== undefined) {
this._assertNotEmptyString(message.invocationId, "Invalid payload for Invocation message.");
}
}
_isStreamItemMessage(message) {
this._assertNotEmptyString(message.invocationId, "Invalid payload for StreamItem message.");
if (message.item === undefined) {
throw new Error("Invalid payload for StreamItem message.");
}
}
_isCompletionMessage(message) {
if (message.result && message.error) {
throw new Error("Invalid payload for Completion message.");
}
if (!message.result && message.error) {
this._assertNotEmptyString(message.error, "Invalid payload for Completion message.");
}
this._assertNotEmptyString(message.invocationId, "Invalid payload for Completion message.");
}
_isAckMessage(message) {
if (typeof message.sequenceId !== 'number') {
throw new Error("Invalid SequenceId for Ack message.");
}
}
_isSequenceMessage(message) {
if (typeof message.sequenceId !== 'number') {
throw new Error("Invalid SequenceId for Sequence message.");
}
}
_assertNotEmptyString(value, errorMessage) {
if (typeof value !== "string" || value === "") {
throw new Error(errorMessage);
}
}
}
exports.JsonHubProtocol = JsonHubProtocol;
//# sourceMappingURL=JsonHubProtocol.js.map
;