UNPKG

@softchef/cdk-iot-device-management

Version:

IoT device management is composed of things, thing types, thing groups, jobs, files API services. The constructs can be used independently, that are based on full-managed service to create an API Gateway & Lambda function.

90 lines (89 loc) 4.64 kB
import { __asyncGenerator, __await, __generator } from "tslib"; export function getChunkedStream(source) { var _a; var currentMessageTotalLength = 0; var currentMessagePendingLength = 0; var currentMessage = null; var messageLengthBuffer = null; var allocateMessage = function (size) { if (typeof size !== "number") { throw new Error("Attempted to allocate an event message where size was not a number: " + size); } currentMessageTotalLength = size; currentMessagePendingLength = 4; currentMessage = new Uint8Array(size); var currentMessageView = new DataView(currentMessage.buffer); currentMessageView.setUint32(0, size, false); }; var iterator = function () { return __asyncGenerator(this, arguments, function () { var sourceIterator, _a, value, done, chunkLength, currentOffset, bytesRemaining, numBytesForTotal, numBytesToWrite; return __generator(this, function (_b) { switch (_b.label) { case 0: sourceIterator = source[Symbol.asyncIterator](); _b.label = 1; case 1: if (!true) return [3, 16]; return [4, __await(sourceIterator.next())]; case 2: _a = _b.sent(), value = _a.value, done = _a.done; if (!done) return [3, 10]; if (!!currentMessageTotalLength) return [3, 4]; return [4, __await(void 0)]; case 3: return [2, _b.sent()]; case 4: if (!(currentMessageTotalLength === currentMessagePendingLength)) return [3, 7]; return [4, __await(currentMessage)]; case 5: return [4, _b.sent()]; case 6: _b.sent(); return [3, 8]; case 7: throw new Error("Truncated event message received."); case 8: return [4, __await(void 0)]; case 9: return [2, _b.sent()]; case 10: chunkLength = value.length; currentOffset = 0; _b.label = 11; case 11: if (!(currentOffset < chunkLength)) return [3, 15]; if (!currentMessage) { bytesRemaining = chunkLength - currentOffset; if (!messageLengthBuffer) { messageLengthBuffer = new Uint8Array(4); } numBytesForTotal = Math.min(4 - currentMessagePendingLength, bytesRemaining); messageLengthBuffer.set(value.slice(currentOffset, currentOffset + numBytesForTotal), currentMessagePendingLength); currentMessagePendingLength += numBytesForTotal; currentOffset += numBytesForTotal; if (currentMessagePendingLength < 4) { return [3, 15]; } allocateMessage(new DataView(messageLengthBuffer.buffer).getUint32(0, false)); messageLengthBuffer = null; } numBytesToWrite = Math.min(currentMessageTotalLength - currentMessagePendingLength, chunkLength - currentOffset); currentMessage.set(value.slice(currentOffset, currentOffset + numBytesToWrite), currentMessagePendingLength); currentMessagePendingLength += numBytesToWrite; currentOffset += numBytesToWrite; if (!(currentMessageTotalLength && currentMessageTotalLength === currentMessagePendingLength)) return [3, 14]; return [4, __await(currentMessage)]; case 12: return [4, _b.sent()]; case 13: _b.sent(); currentMessage = null; currentMessageTotalLength = 0; currentMessagePendingLength = 0; _b.label = 14; case 14: return [3, 11]; case 15: return [3, 1]; case 16: return [2]; } }); }); }; return _a = {}, _a[Symbol.asyncIterator] = iterator, _a; }