70 lines
3.2 KiB
JavaScript
70 lines
3.2 KiB
JavaScript
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.sdkStreamMixin = void 0;
|
||
|
const fetch_http_handler_1 = require("@smithy/fetch-http-handler");
|
||
|
const util_base64_1 = require("@smithy/util-base64");
|
||
|
const util_hex_encoding_1 = require("@smithy/util-hex-encoding");
|
||
|
const util_utf8_1 = require("@smithy/util-utf8");
|
||
|
const ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = "The stream has already been transformed.";
|
||
|
const sdkStreamMixin = (stream) => {
|
||
|
var _a, _b;
|
||
|
if (!isBlobInstance(stream) && !isReadableStreamInstance(stream)) {
|
||
|
const name = ((_b = (_a = stream === null || stream === void 0 ? void 0 : stream.__proto__) === null || _a === void 0 ? void 0 : _a.constructor) === null || _b === void 0 ? void 0 : _b.name) || stream;
|
||
|
throw new Error(`Unexpected stream implementation, expect Blob or ReadableStream, got ${name}`);
|
||
|
}
|
||
|
let transformed = false;
|
||
|
const transformToByteArray = async () => {
|
||
|
if (transformed) {
|
||
|
throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);
|
||
|
}
|
||
|
transformed = true;
|
||
|
return await (0, fetch_http_handler_1.streamCollector)(stream);
|
||
|
};
|
||
|
const blobToWebStream = (blob) => {
|
||
|
if (typeof blob.stream !== "function") {
|
||
|
throw new Error("Cannot transform payload Blob to web stream. Please make sure the Blob.stream() is polyfilled.\n" +
|
||
|
"If you are using React Native, this API is not yet supported, see: https://react-native.canny.io/feature-requests/p/fetch-streaming-body");
|
||
|
}
|
||
|
return blob.stream();
|
||
|
};
|
||
|
return Object.assign(stream, {
|
||
|
transformToByteArray: transformToByteArray,
|
||
|
transformToString: async (encoding) => {
|
||
|
const buf = await transformToByteArray();
|
||
|
if (encoding === "base64") {
|
||
|
return (0, util_base64_1.toBase64)(buf);
|
||
|
}
|
||
|
else if (encoding === "hex") {
|
||
|
return (0, util_hex_encoding_1.toHex)(buf);
|
||
|
}
|
||
|
else if (encoding === undefined || encoding === "utf8" || encoding === "utf-8") {
|
||
|
return (0, util_utf8_1.toUtf8)(buf);
|
||
|
}
|
||
|
else if (typeof TextDecoder === "function") {
|
||
|
return new TextDecoder(encoding).decode(buf);
|
||
|
}
|
||
|
else {
|
||
|
throw new Error("TextDecoder is not available, please make sure polyfill is provided.");
|
||
|
}
|
||
|
},
|
||
|
transformToWebStream: () => {
|
||
|
if (transformed) {
|
||
|
throw new Error(ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED);
|
||
|
}
|
||
|
transformed = true;
|
||
|
if (isBlobInstance(stream)) {
|
||
|
return blobToWebStream(stream);
|
||
|
}
|
||
|
else if (isReadableStreamInstance(stream)) {
|
||
|
return stream;
|
||
|
}
|
||
|
else {
|
||
|
throw new Error(`Cannot transform payload to web stream, got ${stream}`);
|
||
|
}
|
||
|
},
|
||
|
});
|
||
|
};
|
||
|
exports.sdkStreamMixin = sdkStreamMixin;
|
||
|
const isBlobInstance = (stream) => typeof Blob === "function" && stream instanceof Blob;
|
||
|
const isReadableStreamInstance = (stream) => typeof ReadableStream === "function" && stream instanceof ReadableStream;
|