@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 +5 -0
- package/es/index.js +1 -0
- package/es/streams.js +129 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +18 -0
- package/lib/streams.d.ts +22 -0
- package/lib/streams.d.ts.map +1 -0
- package/lib/streams.js +171 -0
- package/package.json +49 -0
package/README.md
ADDED
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 @@
|
|
|
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
|
+
});
|
package/lib/streams.d.ts
ADDED
|
@@ -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
|
+
}
|