@whisklabs/grpc
Version:
gRPC generator and http library for typescript
83 lines • 3.07 kB
JavaScript
;
// tslint:disable: no-bitwise
Object.defineProperty(exports, "__esModule", { value: true });
exports.chunkParse = exports.ChunkType = void 0;
var typeguards_1 = require("@whisklabs/typeguards");
var utils_1 = require("./utils");
function decodeASCII(input) {
var str = '';
// eslint-disable-next-line @typescript-eslint/prefer-for-of
for (var i = 0; i < input.length; i++) {
str += String.fromCharCode(input[i]);
}
return str;
}
var parseHttpHeaders = function (str) {
var chunks = String(str !== null && str !== void 0 ? str : '')
.trim()
.split('\r\n');
var headers = {};
for (var _i = 0, chunks_1 = chunks; _i < chunks_1.length; _i++) {
var chunk = chunks_1[_i];
var pos = chunk.indexOf(':');
headers[chunk.substring(0, pos).trim()] = chunk.substring(pos + 1).trim();
}
return headers;
};
var isTrailerHeader = function (headerView) { return (headerView.getUint8(0) & 0x80) === 0x80; };
var readLengthFromHeader = function (headerView) { return headerView.getUint32(1, false); };
var hasEnoughBytes = function (buffer, position, byteCount) {
return buffer.byteLength - position >= byteCount;
};
function sliceUint8Array(buffer, from, to) {
if ((0, typeguards_1.isFunction)(buffer.slice)) {
return buffer.slice(from, to);
}
var end = buffer.length;
if (to !== undefined) {
end = to;
}
var num = end - from;
var array = new Uint8Array(num);
var arrayIndex = 0;
for (var i = from; i < end; i++) {
array[arrayIndex++] = buffer[i];
}
return array;
}
var ChunkType;
(function (ChunkType) {
ChunkType[ChunkType["MESSAGE"] = 1] = "MESSAGE";
ChunkType[ChunkType["TRAILERS"] = 2] = "TRAILERS";
})(ChunkType || (exports.ChunkType = ChunkType = {}));
function chunkParse(buffer, flush) {
if (buffer.length === 0 && flush === true) {
return [];
}
var position = 0;
var chunkData = [];
while (true) {
if (!hasEnoughBytes(buffer, position, utils_1.HEADER_SIZE)) {
return chunkData;
}
var headerBuffer = sliceUint8Array(buffer, position, position + utils_1.HEADER_SIZE);
var headerView = new DataView(headerBuffer.buffer, headerBuffer.byteOffset, headerBuffer.byteLength);
var msgLength = readLengthFromHeader(headerView);
if (!hasEnoughBytes(buffer, position, utils_1.HEADER_SIZE + msgLength)) {
return chunkData;
}
var messageData = sliceUint8Array(buffer, position + utils_1.HEADER_SIZE, position + utils_1.HEADER_SIZE + msgLength);
position += utils_1.HEADER_SIZE + msgLength;
if (isTrailerHeader(headerView)) {
chunkData.push({
chunkType: ChunkType.TRAILERS,
trailers: parseHttpHeaders(decodeASCII(messageData)),
});
}
else {
chunkData.push({ chunkType: ChunkType.MESSAGE, data: messageData });
}
}
}
exports.chunkParse = chunkParse;
//# sourceMappingURL=parser.js.map