UNPKG

botframework-streaming

Version:

Streaming library for the Microsoft Bot Framework

88 lines 3.97 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.HeaderSerializer = void 0; const payloadConstants_1 = require("./payloadConstants"); /** * Streaming header serializer */ class HeaderSerializer { /** * Serializes the header into a buffer * * @param header The header to serialize. * @param buffer The buffer into which to serialize the header. */ static serialize(header, buffer) { buffer.write(header.payloadType, this.TypeOffset, 1, this.Encoding); buffer.write(this.Delimiter, this.TypeDelimiterOffset, 1, this.Encoding); buffer.write(this.headerLengthPadder(header.payloadLength, this.LengthLength, '0'), this.LengthOffset, this.LengthLength, this.Encoding); buffer.write(this.Delimiter, this.LengthDelimeterOffset, 1, this.Encoding); buffer.write(header.id, this.IdOffset); buffer.write(this.Delimiter, this.IdDelimeterOffset, 1, this.Encoding); buffer.write(header.end ? this.End : this.NotEnd, this.EndOffset); buffer.write(this.Terminator, this.TerminatorOffset); } /** * Deserializes a buffer containing header information. * * @param buffer The buffer from which to obtain the data to deserialize. * @returns The deserialized header from the buffer. */ static deserialize(buffer) { const jsonBuffer = buffer.toString(this.Encoding); const headerArray = jsonBuffer.split(this.Delimiter); if (headerArray.length !== 4) { throw Error(`Cannot parse header, header is malformed. Header: ${jsonBuffer}`); } const [payloadType, length, id, headerEnd] = headerArray; const end = headerEnd === '1\n'; const payloadLength = Number(length); const header = { end, payloadLength, payloadType, id }; if (!(header.payloadLength <= payloadConstants_1.PayloadConstants.MaxPayloadLength && header.payloadLength >= payloadConstants_1.PayloadConstants.MinLength)) { throw Error(`Header length of ${header.payloadLength} is missing or malformed`); } if (header.payloadType.length !== this.TypeDelimiterOffset) { throw Error(`Header type '${header.payloadType.length}' is missing or malformed.`); } if (!header.id || !header.id.match(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i) || header.id.length !== this.IdLength) { throw Error(`Header ID '${header.id}' is missing or malformed.`); } if (!(headerEnd === '0\n' || headerEnd === '1\n')) { throw Error(`Header End is missing or not a valid value. Header end: '${headerEnd}'`); } return header; } /** * Creates a padded string based on a length and character to be padded to. * * @param lengthValue The value to be assingned on the result. * @param totalLength The length of the padded string result. * @param padChar The character value to use as filling. * @returns The padded string. */ static headerLengthPadder(lengthValue, totalLength, padChar) { const result = Array(totalLength + 1).join(padChar); const lengthString = lengthValue.toString(); return (result + lengthString).slice(lengthString.length); } } exports.HeaderSerializer = HeaderSerializer; HeaderSerializer.Delimiter = '.'; HeaderSerializer.Terminator = '\n'; HeaderSerializer.End = '1'; HeaderSerializer.NotEnd = '0'; HeaderSerializer.TypeOffset = 0; HeaderSerializer.TypeDelimiterOffset = 1; HeaderSerializer.LengthOffset = 2; HeaderSerializer.LengthLength = 6; HeaderSerializer.LengthDelimeterOffset = 8; HeaderSerializer.IdOffset = 9; HeaderSerializer.IdLength = 36; HeaderSerializer.IdDelimeterOffset = 45; HeaderSerializer.EndOffset = 46; HeaderSerializer.TerminatorOffset = 47; HeaderSerializer.Encoding = 'utf8'; //# sourceMappingURL=headerSerializer.js.map