UNPKG

@microsoft/signalr

Version:
123 lines 5.49 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.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