55 lines
2.8 KiB
JavaScript
55 lines
2.8 KiB
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.HandshakeProtocol = void 0;
|
|
const TextMessageFormat_1 = require("./TextMessageFormat");
|
|
const Utils_1 = require("./Utils");
|
|
/** @private */
|
|
class HandshakeProtocol {
|
|
// Handshake request is always JSON
|
|
writeHandshakeRequest(handshakeRequest) {
|
|
return TextMessageFormat_1.TextMessageFormat.write(JSON.stringify(handshakeRequest));
|
|
}
|
|
parseHandshakeResponse(data) {
|
|
let messageData;
|
|
let remainingData;
|
|
if ((0, Utils_1.isArrayBuffer)(data)) {
|
|
// Format is binary but still need to read JSON text from handshake response
|
|
const binaryData = new Uint8Array(data);
|
|
const separatorIndex = binaryData.indexOf(TextMessageFormat_1.TextMessageFormat.RecordSeparatorCode);
|
|
if (separatorIndex === -1) {
|
|
throw new Error("Message is incomplete.");
|
|
}
|
|
// content before separator is handshake response
|
|
// optional content after is additional messages
|
|
const responseLength = separatorIndex + 1;
|
|
messageData = String.fromCharCode.apply(null, Array.prototype.slice.call(binaryData.slice(0, responseLength)));
|
|
remainingData = (binaryData.byteLength > responseLength) ? binaryData.slice(responseLength).buffer : null;
|
|
}
|
|
else {
|
|
const textData = data;
|
|
const separatorIndex = textData.indexOf(TextMessageFormat_1.TextMessageFormat.RecordSeparator);
|
|
if (separatorIndex === -1) {
|
|
throw new Error("Message is incomplete.");
|
|
}
|
|
// content before separator is handshake response
|
|
// optional content after is additional messages
|
|
const responseLength = separatorIndex + 1;
|
|
messageData = textData.substring(0, responseLength);
|
|
remainingData = (textData.length > responseLength) ? textData.substring(responseLength) : null;
|
|
}
|
|
// At this point we should have just the single handshake message
|
|
const messages = TextMessageFormat_1.TextMessageFormat.parse(messageData);
|
|
const response = JSON.parse(messages[0]);
|
|
if (response.type) {
|
|
throw new Error("Expected a handshake response from the server.");
|
|
}
|
|
const responseMessage = response;
|
|
// multiple messages could have arrived with handshake
|
|
// return additional data to be parsed as usual, or null if all parsed
|
|
return [remainingData, responseMessage];
|
|
}
|
|
}
|
|
exports.HandshakeProtocol = HandshakeProtocol;
|
|
//# sourceMappingURL=HandshakeProtocol.js.map
|