@takeshape/streams 7.194.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # Streams
2
+
3
+ ## Summary
4
+
5
+ A set of utility functions for working with Node.js streams v3
package/es/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from './streams';
package/es/streams.js ADDED
@@ -0,0 +1,129 @@
1
+ import { PassThrough, Readable, Writable } from 'stream';
2
+ import BBPromise from 'bluebird';
3
+ import PQueue from 'p-queue';
4
+ import isStream from 'is-stream';
5
+ import through2 from 'through2';
6
+ import basePump from 'pump';
7
+ export const pump = BBPromise.promisify(basePump);
8
+ export async function streamToPromise(stream) {
9
+ return new Promise((resolve, reject) => {
10
+ const doneEvent = isStream.writable(stream) ? 'finish' : 'end';
11
+ stream.on('error', reject).on(doneEvent, resolve);
12
+ });
13
+ }
14
+ export function createTransform(transform) {
15
+ return through2.obj(function (content, _, callback) {
16
+ try {
17
+ this.push(transform(content));
18
+ callback();
19
+ } catch (e) {
20
+ callback(e);
21
+ }
22
+ });
23
+ }
24
+ export function createAsyncTransform(transform) {
25
+ return through2.obj(function (content, _, callback) {
26
+ try {
27
+ transform(content).then(result => {
28
+ this.push(result);
29
+ callback();
30
+ }, callback);
31
+ } catch (e) {
32
+ callback(e);
33
+ }
34
+ });
35
+ }
36
+ export function createFilter(predicate) {
37
+ return through2.obj(function (content, _, callback) {
38
+ try {
39
+ if (predicate(content)) {
40
+ this.push(content);
41
+ }
42
+
43
+ callback();
44
+ } catch (e) {
45
+ callback(e);
46
+ }
47
+ });
48
+ }
49
+ export const createAccumulator = accumulator => through2.obj(function (item, _, cb) {
50
+ accumulator(item);
51
+ cb(null, item);
52
+ });
53
+ export const createAsyncWritable = (write, concurrency = 16) => {
54
+ const queue = new PQueue({
55
+ concurrency
56
+ });
57
+ return new Writable({
58
+ objectMode: true,
59
+
60
+ write(data, _, cb) {
61
+ queue.add(async () => write(data)).catch(error => this.emit('error', error));
62
+ cb();
63
+ },
64
+
65
+ final(cb) {
66
+ void queue.onIdle().then(() => {
67
+ cb();
68
+ });
69
+ }
70
+
71
+ });
72
+ };
73
+ export const tee = (...args) => {
74
+ const first = args[0];
75
+ const streams = Array.isArray(first) ? first : args;
76
+ const donePromises = streams.map(streamToPromise);
77
+ return new Writable({
78
+ objectMode: true,
79
+
80
+ write(data, _, callback) {
81
+ void Promise.all(streams.map(stream => stream.write(data) || BBPromise.fromCallback(cb => stream.once('drain', cb)) // if .write() => false buffer is full, start promise to wait for drain event
82
+ )).then(() => {
83
+ callback();
84
+ });
85
+ },
86
+
87
+ final(callback) {
88
+ streams.forEach(stream => {
89
+ stream.end();
90
+ });
91
+ void Promise.all(donePromises).then(() => {
92
+ callback();
93
+ });
94
+ }
95
+
96
+ });
97
+ };
98
+ export const readableFromArray = (array, options) => {
99
+ let index = 0;
100
+ return new Readable({
101
+ objectMode: true,
102
+
103
+ read() {
104
+ this.push(index < array.length ? array[index] : null);
105
+ index++;
106
+ },
107
+
108
+ ...options
109
+ });
110
+ };
111
+ export const collectStreamIntoArray = (array = [], options = {}) => new Writable({
112
+ objectMode: true,
113
+
114
+ writev(chunks, cb) {
115
+ chunks.forEach(({
116
+ chunk
117
+ }) => array.push(chunk));
118
+ cb(null);
119
+ },
120
+
121
+ ...options
122
+ });
123
+ export async function readStreamToBuffer(stream) {
124
+ const chunks = [];
125
+ const writeStream = new PassThrough();
126
+ writeStream.on('data', chunk => chunks.push(chunk));
127
+ await pump(stream, writeStream);
128
+ return Buffer.concat(chunks);
129
+ }
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './streams';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _streams = require("./streams");
8
+
9
+ Object.keys(_streams).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _streams[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _streams[key];
16
+ }
17
+ });
18
+ });
@@ -0,0 +1,22 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="styled-components" />
3
+ /// <reference types="webpack-env" />
4
+ import { Readable, ReadableOptions, Transform, Writable, WritableOptions } from 'stream';
5
+ declare type Stream = NodeJS.ReadableStream | NodeJS.WritableStream;
6
+ export interface Pump {
7
+ (streams: Stream[]): Promise<any>;
8
+ (...streams: Stream[]): Promise<any>;
9
+ }
10
+ export declare const pump: Pump;
11
+ export declare function streamToPromise(stream: NodeJS.ReadableStream | NodeJS.WritableStream): Promise<void>;
12
+ export declare function createTransform(transform: (data: any) => any): Transform;
13
+ export declare function createAsyncTransform(transform: (data: any) => Promise<any>): Transform;
14
+ export declare function createFilter(predicate: (data: any) => boolean): Transform;
15
+ export declare const createAccumulator: (accumulator: (data: any) => void) => Transform;
16
+ export declare const createAsyncWritable: (write: (data: any) => Promise<void>, concurrency?: number) => Writable;
17
+ export declare const tee: (...args: NodeJS.WritableStream[] | [NodeJS.WritableStream[]]) => Writable;
18
+ export declare const readableFromArray: (array: any[], options?: Partial<ReadableOptions> | undefined) => Readable;
19
+ export declare const collectStreamIntoArray: (array?: any[], options?: Partial<WritableOptions>) => Writable;
20
+ export declare function readStreamToBuffer(stream: NodeJS.ReadableStream): Promise<Buffer>;
21
+ export {};
22
+ //# sourceMappingURL=streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../src/streams.ts"],"names":[],"mappings":";;;AAAA,OAAO,EAAc,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAC,MAAM,QAAQ,CAAC;AAOpG,aAAK,MAAM,GAAG,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AAE5D,MAAM,WAAW,IAAI;IACnB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC,GAAG,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CACtC;AAED,eAAO,MAAM,IAAI,EAAE,IAAoC,CAAC;AAExD,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAK1G;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,GAAG,SAAS,CASxE;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,CAWtF;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,GAAG,SAAS,CAWzE;AAED,eAAO,MAAM,iBAAiB,uBAAwB,GAAG,KAAK,IAAI,KAAG,SAIjE,CAAC;AAEL,eAAO,MAAM,mBAAmB,iBAAkB,GAAG,KAAK,QAAQ,IAAI,CAAC,2BAAqB,QAc3F,CAAC;AAEF,eAAO,MAAM,GAAG,YAAa,OAAO,cAAc,EAAE,GAAG,CAAC,OAAO,cAAc,EAAE,CAAC,KAAG,QAyBlF,CAAC;AAEF,eAAO,MAAM,iBAAiB,UAAW,GAAG,EAAE,qDAAuC,QAUpF,CAAC;AAEF,eAAO,MAAM,sBAAsB,WAAW,GAAG,EAAE,YAAgB,QAAQ,eAAe,CAAC,KAAQ,QAQ/F,CAAC;AAEL,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAMvF"}
package/lib/streams.js ADDED
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.streamToPromise = streamToPromise;
7
+ exports.createTransform = createTransform;
8
+ exports.createAsyncTransform = createAsyncTransform;
9
+ exports.createFilter = createFilter;
10
+ exports.readStreamToBuffer = readStreamToBuffer;
11
+ exports.collectStreamIntoArray = exports.readableFromArray = exports.tee = exports.createAsyncWritable = exports.createAccumulator = exports.pump = void 0;
12
+
13
+ var _stream = require("stream");
14
+
15
+ var _bluebird = _interopRequireDefault(require("bluebird"));
16
+
17
+ var _pQueue = _interopRequireDefault(require("p-queue"));
18
+
19
+ var _isStream = _interopRequireDefault(require("is-stream"));
20
+
21
+ var _through = _interopRequireDefault(require("through2"));
22
+
23
+ var _pump = _interopRequireDefault(require("pump"));
24
+
25
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
26
+
27
+ const pump = _bluebird.default.promisify(_pump.default);
28
+
29
+ exports.pump = pump;
30
+
31
+ async function streamToPromise(stream) {
32
+ return new Promise((resolve, reject) => {
33
+ const doneEvent = _isStream.default.writable(stream) ? 'finish' : 'end';
34
+ stream.on('error', reject).on(doneEvent, resolve);
35
+ });
36
+ }
37
+
38
+ function createTransform(transform) {
39
+ return _through.default.obj(function (content, _, callback) {
40
+ try {
41
+ this.push(transform(content));
42
+ callback();
43
+ } catch (e) {
44
+ callback(e);
45
+ }
46
+ });
47
+ }
48
+
49
+ function createAsyncTransform(transform) {
50
+ return _through.default.obj(function (content, _, callback) {
51
+ try {
52
+ transform(content).then(result => {
53
+ this.push(result);
54
+ callback();
55
+ }, callback);
56
+ } catch (e) {
57
+ callback(e);
58
+ }
59
+ });
60
+ }
61
+
62
+ function createFilter(predicate) {
63
+ return _through.default.obj(function (content, _, callback) {
64
+ try {
65
+ if (predicate(content)) {
66
+ this.push(content);
67
+ }
68
+
69
+ callback();
70
+ } catch (e) {
71
+ callback(e);
72
+ }
73
+ });
74
+ }
75
+
76
+ const createAccumulator = accumulator => _through.default.obj(function (item, _, cb) {
77
+ accumulator(item);
78
+ cb(null, item);
79
+ });
80
+
81
+ exports.createAccumulator = createAccumulator;
82
+
83
+ const createAsyncWritable = (write, concurrency = 16) => {
84
+ const queue = new _pQueue.default({
85
+ concurrency
86
+ });
87
+ return new _stream.Writable({
88
+ objectMode: true,
89
+
90
+ write(data, _, cb) {
91
+ queue.add(async () => write(data)).catch(error => this.emit('error', error));
92
+ cb();
93
+ },
94
+
95
+ final(cb) {
96
+ void queue.onIdle().then(() => {
97
+ cb();
98
+ });
99
+ }
100
+
101
+ });
102
+ };
103
+
104
+ exports.createAsyncWritable = createAsyncWritable;
105
+
106
+ const tee = (...args) => {
107
+ const first = args[0];
108
+ const streams = Array.isArray(first) ? first : args;
109
+ const donePromises = streams.map(streamToPromise);
110
+ return new _stream.Writable({
111
+ objectMode: true,
112
+
113
+ write(data, _, callback) {
114
+ void Promise.all(streams.map(stream => stream.write(data) || _bluebird.default.fromCallback(cb => stream.once('drain', cb)) // if .write() => false buffer is full, start promise to wait for drain event
115
+ )).then(() => {
116
+ callback();
117
+ });
118
+ },
119
+
120
+ final(callback) {
121
+ streams.forEach(stream => {
122
+ stream.end();
123
+ });
124
+ void Promise.all(donePromises).then(() => {
125
+ callback();
126
+ });
127
+ }
128
+
129
+ });
130
+ };
131
+
132
+ exports.tee = tee;
133
+
134
+ const readableFromArray = (array, options) => {
135
+ let index = 0;
136
+ return new _stream.Readable({
137
+ objectMode: true,
138
+
139
+ read() {
140
+ this.push(index < array.length ? array[index] : null);
141
+ index++;
142
+ },
143
+
144
+ ...options
145
+ });
146
+ };
147
+
148
+ exports.readableFromArray = readableFromArray;
149
+
150
+ const collectStreamIntoArray = (array = [], options = {}) => new _stream.Writable({
151
+ objectMode: true,
152
+
153
+ writev(chunks, cb) {
154
+ chunks.forEach(({
155
+ chunk
156
+ }) => array.push(chunk));
157
+ cb(null);
158
+ },
159
+
160
+ ...options
161
+ });
162
+
163
+ exports.collectStreamIntoArray = collectStreamIntoArray;
164
+
165
+ async function readStreamToBuffer(stream) {
166
+ const chunks = [];
167
+ const writeStream = new _stream.PassThrough();
168
+ writeStream.on('data', chunk => chunks.push(chunk));
169
+ await pump(stream, writeStream);
170
+ return Buffer.concat(chunks);
171
+ }
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@takeshape/streams",
3
+ "version": "7.194.0",
4
+ "description": "Stream helpers",
5
+ "homepage": "https://www.takeshape.io",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "github.com:takeshape/takeshape.git"
9
+ },
10
+ "author": "asprouse",
11
+ "license": "UNLICENSED",
12
+ "engines": {
13
+ "node": ">=12"
14
+ },
15
+ "main": "lib/index.js",
16
+ "module": "es/index.js",
17
+ "types": "lib/index.d.ts",
18
+ "files": [
19
+ "lib",
20
+ "es"
21
+ ],
22
+ "dependencies": {
23
+ "bluebird": "^3.7.2",
24
+ "is-stream": "^2.0.0",
25
+ "p-queue": "^6.4.0",
26
+ "pump": "^3.0.0",
27
+ "through2": "^3.0.2"
28
+ },
29
+ "devDependencies": {
30
+ "@types/bluebird": "^3.5.32",
31
+ "@types/pump": "^1.1.0",
32
+ "@types/through2": "^2.0.36"
33
+ },
34
+ "scripts": {
35
+ "lint": "eslint . --ext .js,.ts",
36
+ "lint:code:ci": "eslint . --ext .js,.ts --format junit -o \"${HOME}/test-results/${npm_package_name#*\\/}/eslint-results.xml\"",
37
+ "test": "jest",
38
+ "test-changed": "pnpm run test -- --changedSince=master",
39
+ "test:ci": "JEST_JUNIT_OUTPUT_DIR=\"${HOME}/test-results/${npm_package_name#*\\/}\" JEST_JUNIT_OUTPUT_NAME=jest-results.xml jest --ci --reporters=default --reporters=jest-junit",
40
+ "typecheck": "tsc --noEmit",
41
+ "clean": "rimraf build lib es *.tsbuildinfo",
42
+ "build": "pnpm clean && pnpm build:types && pnpm build:js && pnpm build:es && pnpm build:copy",
43
+ "build:types": "tsc --emitDeclarationOnly --project tsconfig.build.json",
44
+ "build:js": "cross-env BABEL_MODULES=commonjs babel src --out-dir lib --extensions \".js,.ts\" --ignore '**/__tests__'",
45
+ "build:es": "cross-env BABEL_MODULES=es babel src --out-dir es --extensions \".js,.ts\" --ignore '**/__tests__'",
46
+ "build:copy": "cp -rf build/src/* lib/",
47
+ "will-it-blend": "pnpm typecheck && pnpm lint -- --quiet && pnpm test -- --silent --coverage false"
48
+ }
49
+ }