@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
JavaScript
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;
}