Skip to content
File

Blob: src/node/internal/streams_promises.ts

typescript69 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 { isIterable, isNodeStream } from 'node-internal:streams_util';
27import { finished } from 'node-internal:streams_end_of_stream';
28 
29import { pipelineImpl as pl } from 'node-internal:streams_pipeline';
30 
31export { finished };
32 
33export function pipeline(...streams: unknown[]): Promise<unknown> {
34 return new Promise((resolve, reject) => {
35 let signal: AbortSignal | undefined;
36 let end: boolean | undefined;
37 const lastArg = streams[streams.length - 1];
38 if (
39 lastArg &&
40 typeof lastArg === 'object' &&
41 !isNodeStream(lastArg) &&
42 !isIterable(lastArg)
43 ) {
44 const options = streams.pop() as { signal?: AbortSignal; end?: boolean };
45 signal = options.signal;
46 end = options.end;
47 }
48 pl(
49 streams,
50 (err: Error | null, value: unknown) => {
51 if (err) {
52 reject(err);
53 } else {
54 resolve(value);
55 }
56 },
57 {
58 signal,
59 end,
60 }
61 );
62 });
63}
64 
65export const promises = {
66 pipeline,
67 finished,
68};