Skip to content

Commit 9d04d8e

Browse files
AllanZhengYPkuhe
authored andcommitted
feat(util-stream-node): use TextDecoder
1 parent 0fff4c9 commit 9d04d8e

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

packages/util-stream-node/src/sdk-stream-mixin.spec.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { SdkStreamMixin } from "@aws-sdk/types";
22
import { fromArrayBuffer } from "@aws-sdk/util-buffer-from";
33
import { PassThrough, Readable, Writable } from "stream";
4+
import util from "util";
45

56
import { sdkStreamMixin } from "./sdk-stream-mixin";
67

@@ -92,6 +93,23 @@ describe(sdkStreamMixin.name, () => {
9293
}
9394
);
9495

96+
it.each(["ibm866", "iso-8859-2", "koi8-r", "macintosh", "windows-874", "gbk", "gb18030", "euc-jp"])(
97+
"should transform the stream to string with TextDecoder config %s",
98+
async (encoding) => {
99+
jest.spyOn(util, "TextDecoder").mockImplementation(
100+
() =>
101+
({
102+
decode: jest.fn(),
103+
} as any)
104+
);
105+
(fromArrayBuffer as jest.Mock).mockReturnValue({ toString: toStringMock });
106+
const sdkStream = sdkStreamMixin(passThrough);
107+
await writeDataToStream(passThrough, [Buffer.from("foo")]);
108+
await sdkStream.transformToString(encoding);
109+
expect(util.TextDecoder).toBeCalledWith(encoding);
110+
}
111+
);
112+
95113
it("should fail any subsequent tranform calls", async () => {
96114
const sdkStream = sdkStreamMixin(passThrough);
97115
await writeDataToStream(passThrough, [Buffer.from("foo")]);

packages/util-stream-node/src/sdk-stream-mixin.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { streamCollector } from "@aws-sdk/node-http-handler";
22
import { SdkStream, SdkStreamMixin } from "@aws-sdk/types";
33
import { fromArrayBuffer } from "@aws-sdk/util-buffer-from";
44
import { Readable } from "stream";
5+
import { TextDecoder } from "util";
56

67
const ERR_MSG_STREAM_HAS_BEEN_TRANSFORMED = "The stream has already been transformed.";
78

@@ -30,7 +31,12 @@ export const sdkStreamMixin = (stream: unknown): SdkStream<Readable> => {
3031
transformToByteArray,
3132
transformToString: async (encoding?: string) => {
3233
const buf = await transformToByteArray();
33-
return fromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength).toString(encoding);
34+
if (encoding === undefined || Buffer.isEncoding(encoding)) {
35+
return fromArrayBuffer(buf.buffer, buf.byteOffset, buf.byteLength).toString(encoding);
36+
} else {
37+
const decoder = new TextDecoder(encoding);
38+
return decoder.decode(buf);
39+
}
3440
},
3541
transformToWebStream: () => {
3642
if (transformed) {

0 commit comments

Comments
 (0)