@euirim/microsoft-cognitiveservices-speech-sdk
Version:
Microsoft Cognitive Services Speech SDK for JavaScript
132 lines (130 loc) • 6.51 kB
JavaScript
"use strict";
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license.
Object.defineProperty(exports, "__esModule", { value: true });
var Exports_1 = require("../common/Exports");
var CRLF = "\r\n";
var WebsocketMessageFormatter = /** @class */ (function () {
function WebsocketMessageFormatter() {
var _this = this;
this.toConnectionMessage = function (message) {
var deferral = new Exports_1.Deferred();
try {
if (message.messageType === Exports_1.MessageType.Text) {
var textMessage = message.textContent;
var headers = {};
var body = null;
if (textMessage) {
var headerBodySplit = textMessage.split("\r\n\r\n");
if (headerBodySplit && headerBodySplit.length > 0) {
headers = _this.parseHeaders(headerBodySplit[0]);
if (headerBodySplit.length > 1) {
body = headerBodySplit[1];
}
}
}
deferral.resolve(new Exports_1.ConnectionMessage(message.messageType, body, headers, message.id));
}
else if (message.messageType === Exports_1.MessageType.Binary) {
var binaryMessage = message.binaryContent;
var headers = {};
var body = null;
if (!binaryMessage || binaryMessage.byteLength < 2) {
throw new Error("Invalid binary message format. Header length missing.");
}
var dataView = new DataView(binaryMessage);
var headerLength = dataView.getInt16(0);
if (binaryMessage.byteLength < headerLength + 2) {
throw new Error("Invalid binary message format. Header content missing.");
}
var headersString = "";
for (var i = 0; i < headerLength; i++) {
headersString += String.fromCharCode((dataView).getInt8(i + 2));
}
headers = _this.parseHeaders(headersString);
if (binaryMessage.byteLength > headerLength + 2) {
body = binaryMessage.slice(2 + headerLength);
}
deferral.resolve(new Exports_1.ConnectionMessage(message.messageType, body, headers, message.id));
}
}
catch (e) {
deferral.reject("Error formatting the message. Error: " + e);
}
return deferral.promise();
};
this.fromConnectionMessage = function (message) {
var deferral = new Exports_1.Deferred();
try {
if (message.messageType === Exports_1.MessageType.Text) {
var payload = "" + _this.makeHeaders(message) + CRLF + (message.textBody ? message.textBody : "");
deferral.resolve(new Exports_1.RawWebsocketMessage(Exports_1.MessageType.Text, payload, message.id));
}
else if (message.messageType === Exports_1.MessageType.Binary) {
var headersString = _this.makeHeaders(message);
var content = message.binaryBody;
var headerInt8Array = new Int8Array(_this.stringToArrayBuffer(headersString));
var payload = new ArrayBuffer(2 + headerInt8Array.byteLength + (content ? content.byteLength : 0));
var dataView = new DataView(payload);
dataView.setInt16(0, headerInt8Array.length);
for (var i = 0; i < headerInt8Array.byteLength; i++) {
dataView.setInt8(2 + i, headerInt8Array[i]);
}
if (content) {
var bodyInt8Array = new Int8Array(content);
for (var i = 0; i < bodyInt8Array.byteLength; i++) {
dataView.setInt8(2 + headerInt8Array.byteLength + i, bodyInt8Array[i]);
}
}
deferral.resolve(new Exports_1.RawWebsocketMessage(Exports_1.MessageType.Binary, payload, message.id));
}
}
catch (e) {
deferral.reject("Error formatting the message. " + e);
}
return deferral.promise();
};
this.makeHeaders = function (message) {
var headersString = "";
if (message.headers) {
for (var header in message.headers) {
if (header) {
headersString += header + ": " + message.headers[header] + CRLF;
}
}
}
return headersString;
};
this.parseHeaders = function (headersString) {
var headers = {};
if (headersString) {
var headerMatches = headersString.match(/[^\r\n]+/g);
if (headers) {
for (var _i = 0, headerMatches_1 = headerMatches; _i < headerMatches_1.length; _i++) {
var header = headerMatches_1[_i];
if (header) {
var separatorIndex = header.indexOf(":");
var headerName = separatorIndex > 0 ? header.substr(0, separatorIndex).trim().toLowerCase() : header;
var headerValue = separatorIndex > 0 && header.length > (separatorIndex + 1) ?
header.substr(separatorIndex + 1).trim() :
"";
headers[headerName] = headerValue;
}
}
}
}
return headers;
};
this.stringToArrayBuffer = function (str) {
var buffer = new ArrayBuffer(str.length);
var view = new DataView(buffer);
for (var i = 0; i < str.length; i++) {
view.setUint8(i, str.charCodeAt(i));
}
return buffer;
};
}
return WebsocketMessageFormatter;
}());
exports.WebsocketMessageFormatter = WebsocketMessageFormatter;
//# sourceMappingURL=WebsocketMessageFormatter.js.map