Skip to content
File

Blob: src/node/stream/consumers.js

javascript66 lines
1// Copyright (c) 2017-2022 Cloudflare, Inc.
2// Licensed under the Apache 2.0 license found in the LICENSE file or at:
3// https://opensource.org/licenses/Apache-2.0
4//
5// Copyright Joyent, Inc. and other Node contributors.
6//
7// Permission is hereby granted, free of charge, to any person obtaining a
8// copy of this software and associated documentation files (the
9// "Software"), to deal in the Software without restriction, including
10// without limitation the rights to use, copy, modify, merge, publish,
11// distribute, sublicense, and/or sell copies of the Software, and to permit
12// persons to whom the Software is furnished to do so, subject to the
13// following conditions:
14//
15// The above copyright notice and this permission notice shall be included
16// in all copies or substantial portions of the Software.
17//
18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
21// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
22// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24// USE OR OTHER DEALINGS IN THE SOFTWARE.
25 
26import { Buffer } from 'node-internal:internal_buffer';
27 
28export async function blob(stream) {
29 return new Blob(await Array.fromAsync(stream));
30}
31 
32export async function arrayBuffer(stream) {
33 const ret = await blob(stream);
34 return ret.arrayBuffer();
35}
36 
37export async function buffer(stream) {
38 return Buffer.from(await arrayBuffer(stream));
39}
40 
41export async function text(stream) {
42 const dec = new TextDecoder();
43 let str = '';
44 for await (const chunk of stream) {
45 if (typeof chunk === 'string') str += chunk;
46 else str += dec.decode(chunk, { stream: true });
47 }
48 // Flush the streaming TextDecoder so that any pending
49 // incomplete multibyte characters are handled.
50 str += dec.decode(undefined, { stream: false });
51 return str;
52}
53 
54export async function json(stream) {
55 const str = await text(stream);
56 return JSON.parse(str);
57}
58 
59export default {
60 arrayBuffer,
61 blob,
62 buffer,
63 text,
64 json,
65};