@naturalcycles/nodejs-lib 12.59.0 → 12.62.1
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/dist/got/getGot.js +98 -28
- package/dist/got/got.model.d.ts +6 -0
- package/dist/index.d.ts +19 -19
- package/dist/index.js +19 -39
- package/dist/stream/ndjson/transformJsonParse.js +3 -3
- package/dist/stream/ndjson/transformToNDJson.js +2 -2
- package/dist/stream/sizeStack.d.ts +9 -0
- package/dist/stream/sizeStack.js +48 -0
- package/dist/stream/transform/transformBuffer.js +1 -1
- package/dist/stream/transform/transformFilter.d.ts +3 -4
- package/dist/stream/transform/transformFilter.js +5 -20
- package/dist/stream/transform/transformLogProgress.d.ts +20 -0
- package/dist/stream/transform/transformLogProgress.js +36 -18
- package/dist/stream/transform/transformMap.d.ts +2 -4
- package/dist/stream/transform/transformMap.js +6 -11
- package/dist/stream/transform/transformMapSimple.js +1 -1
- package/dist/stream/transform/transformMapSync.d.ts +5 -3
- package/dist/stream/transform/transformMapSync.js +28 -22
- package/dist/stream/transform/transformNoOp.js +1 -1
- package/dist/stream/transform/transformTap.js +3 -3
- package/dist/stream/transform/transformToArray.js +1 -1
- package/dist/stream/transform/transformToString.js +2 -2
- package/dist/stream/transform/worker/transformMultiThreaded.js +1 -1
- package/dist/stream/writable/writableFork.js +1 -1
- package/dist/stream/writable/writablePushToArray.js +1 -1
- package/dist/stream/writable/writableVoid.js +1 -1
- package/dist/util/zip.util.d.ts +15 -7
- package/dist/util/zip.util.js +27 -22
- package/package.json +2 -2
- package/src/got/getGot.ts +120 -31
- package/src/got/got.model.ts +8 -0
- package/src/index.ts +19 -38
- package/src/stream/ndjson/transformJsonParse.ts +3 -3
- package/src/stream/ndjson/transformToNDJson.ts +2 -2
- package/src/stream/sizeStack.ts +56 -0
- package/src/stream/transform/transformBuffer.ts +1 -1
- package/src/stream/transform/transformFilter.ts +6 -20
- package/src/stream/transform/transformLogProgress.ts +72 -23
- package/src/stream/transform/transformMap.ts +7 -14
- package/src/stream/transform/transformMapSimple.ts +1 -1
- package/src/stream/transform/transformMapSync.ts +40 -26
- package/src/stream/transform/transformNoOp.ts +1 -1
- package/src/stream/transform/transformTap.ts +3 -3
- package/src/stream/transform/transformToArray.ts +1 -1
- package/src/stream/transform/transformToString.ts +2 -2
- package/src/stream/transform/worker/transformMultiThreaded.ts +1 -1
- package/src/stream/writable/writableFork.ts +1 -1
- package/src/stream/writable/writablePushToArray.ts +1 -1
- package/src/stream/writable/writableVoid.ts +1 -1
- package/src/util/zip.util.ts +26 -20
|
@@ -26,9 +26,8 @@ export interface TransformMapOptions<IN = any, OUT = IN> {
|
|
|
26
26
|
* Predicate to filter outgoing results (after mapper).
|
|
27
27
|
* Allows to not emit all results.
|
|
28
28
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* @default to filter out undefined/null values, but pass anything else
|
|
29
|
+
* Defaults to "pass everything" (including null, undefined, etc).
|
|
30
|
+
* Simpler way to exclude certain cases is to return SKIP symbol from the mapper.
|
|
32
31
|
*/
|
|
33
32
|
predicate?: AsyncPredicate<OUT>
|
|
34
33
|
|
|
@@ -60,10 +59,6 @@ export interface TransformMapOptions<IN = any, OUT = IN> {
|
|
|
60
59
|
logger?: CommonLogger
|
|
61
60
|
}
|
|
62
61
|
|
|
63
|
-
export function notNullishPredicate(item: any): boolean {
|
|
64
|
-
return item !== undefined && item !== null
|
|
65
|
-
}
|
|
66
|
-
|
|
67
62
|
// doesn't work, cause here we don't construct our Transform instance ourselves
|
|
68
63
|
// export class TransformMap extends AbortableTransform {}
|
|
69
64
|
|
|
@@ -85,7 +80,7 @@ export function transformMap<IN = any, OUT = IN>(
|
|
|
85
80
|
): TransformTyped<IN, OUT> {
|
|
86
81
|
const {
|
|
87
82
|
concurrency = 16,
|
|
88
|
-
predicate
|
|
83
|
+
predicate, // we now default to "no predicate" (meaning pass-everything)
|
|
89
84
|
errorMode = ErrorMode.THROW_IMMEDIATELY,
|
|
90
85
|
flattenArrayOutput,
|
|
91
86
|
onError,
|
|
@@ -116,14 +111,12 @@ export function transformMap<IN = any, OUT = IN>(
|
|
|
116
111
|
},
|
|
117
112
|
},
|
|
118
113
|
async function transformMapFn(this: AbortableTransform, chunk: IN, _, cb) {
|
|
119
|
-
index++
|
|
120
|
-
// console.log({chunk, _encoding})
|
|
121
|
-
|
|
122
114
|
// Stop processing if isSettled (either THROW_IMMEDIATELY was fired or END received)
|
|
123
115
|
if (isSettled) return cb()
|
|
124
116
|
|
|
117
|
+
const currentIndex = ++index
|
|
118
|
+
|
|
125
119
|
try {
|
|
126
|
-
const currentIndex = index // because we need to pass it to 2 functions - mapper and predicate. Refers to INPUT index (since it may return multiple outputs)
|
|
127
120
|
const res = await mapper(chunk, currentIndex)
|
|
128
121
|
const passedResults = await pFilter(
|
|
129
122
|
flattenArrayOutput && Array.isArray(res) ? res : [res],
|
|
@@ -132,14 +125,14 @@ export function transformMap<IN = any, OUT = IN>(
|
|
|
132
125
|
isSettled = true // will be checked later
|
|
133
126
|
return false
|
|
134
127
|
}
|
|
135
|
-
return r !== SKIP && (await predicate(r, currentIndex))
|
|
128
|
+
return r !== SKIP && (!predicate || (await predicate(r, currentIndex)))
|
|
136
129
|
},
|
|
137
130
|
)
|
|
138
131
|
|
|
139
132
|
passedResults.forEach(r => this.push(r))
|
|
140
133
|
|
|
141
134
|
if (isSettled) {
|
|
142
|
-
logger.log(`transformMap END received at index ${
|
|
135
|
+
logger.log(`transformMap END received at index ${currentIndex}`)
|
|
143
136
|
pipelineClose('transformMap', this, this.sourceReadable, this.streamDone, logger)
|
|
144
137
|
}
|
|
145
138
|
|
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
AggregatedError,
|
|
3
|
+
CommonLogger,
|
|
4
|
+
END,
|
|
5
|
+
ErrorMode,
|
|
6
|
+
Mapper,
|
|
7
|
+
Predicate,
|
|
8
|
+
SKIP,
|
|
9
|
+
} from '@naturalcycles/js-lib'
|
|
3
10
|
import { yellow } from '../../colors'
|
|
11
|
+
import { AbortableTransform } from '../pipeline/pipeline'
|
|
4
12
|
import { TransformTyped } from '../stream.model'
|
|
5
|
-
import {
|
|
13
|
+
import { pipelineClose } from '../stream.util'
|
|
6
14
|
|
|
7
15
|
export interface TransformMapSyncOptions<IN = any, OUT = IN> {
|
|
8
16
|
/**
|
|
@@ -20,9 +28,8 @@ export interface TransformMapSyncOptions<IN = any, OUT = IN> {
|
|
|
20
28
|
* Predicate to filter outgoing results (after mapper).
|
|
21
29
|
* Allows to not emit all results.
|
|
22
30
|
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
* Set to `r => r` (passthrough predicate) to pass ANY value (including undefined/null)
|
|
31
|
+
* Defaults to "pass everything".
|
|
32
|
+
* Simpler way to skip individual entries is to return SKIP symbol.
|
|
26
33
|
*/
|
|
27
34
|
predicate?: Predicate<OUT>
|
|
28
35
|
|
|
@@ -47,6 +54,8 @@ export interface TransformMapSyncOptions<IN = any, OUT = IN> {
|
|
|
47
54
|
logger?: CommonLogger
|
|
48
55
|
}
|
|
49
56
|
|
|
57
|
+
export class TransformMapSync extends AbortableTransform {}
|
|
58
|
+
|
|
50
59
|
/**
|
|
51
60
|
* Sync (not async) version of transformMap.
|
|
52
61
|
* Supposedly faster, for cases when async is not needed.
|
|
@@ -58,7 +67,7 @@ export function transformMapSync<IN = any, OUT = IN>(
|
|
|
58
67
|
let index = -1
|
|
59
68
|
|
|
60
69
|
const {
|
|
61
|
-
predicate
|
|
70
|
+
predicate, // defaults to "no predicate" (pass everything)
|
|
62
71
|
errorMode = ErrorMode.THROW_IMMEDIATELY,
|
|
63
72
|
flattenArrayOutput = false,
|
|
64
73
|
onError,
|
|
@@ -66,34 +75,39 @@ export function transformMapSync<IN = any, OUT = IN>(
|
|
|
66
75
|
objectMode = true,
|
|
67
76
|
logger = console,
|
|
68
77
|
} = opt
|
|
69
|
-
let
|
|
78
|
+
let isSettled = false
|
|
70
79
|
let errors = 0
|
|
71
80
|
const collectedErrors: Error[] = [] // only used if errorMode == THROW_AGGREGATED
|
|
72
81
|
|
|
73
|
-
return new
|
|
82
|
+
return new TransformMapSync({
|
|
74
83
|
objectMode,
|
|
75
84
|
...opt,
|
|
76
|
-
transform(this:
|
|
77
|
-
// Stop processing if
|
|
78
|
-
if (
|
|
79
|
-
return cb()
|
|
80
|
-
}
|
|
85
|
+
transform(this: AbortableTransform, chunk: IN, _, cb) {
|
|
86
|
+
// Stop processing if isSettled
|
|
87
|
+
if (isSettled) return cb()
|
|
81
88
|
|
|
82
|
-
|
|
83
|
-
if (!predicate(chunk, ++index)) {
|
|
84
|
-
cb() // signal that we've finished processing, but emit no output here
|
|
85
|
-
return
|
|
86
|
-
}
|
|
89
|
+
const currentIndex = ++index
|
|
87
90
|
|
|
91
|
+
try {
|
|
88
92
|
// map and pass through
|
|
89
|
-
const v = mapper(chunk,
|
|
93
|
+
const v = mapper(chunk, currentIndex)
|
|
94
|
+
|
|
95
|
+
const passedResults = (flattenArrayOutput && Array.isArray(v) ? v : [v]).filter(r => {
|
|
96
|
+
if (r === END) {
|
|
97
|
+
isSettled = true // will be checked later
|
|
98
|
+
return false
|
|
99
|
+
}
|
|
100
|
+
return r !== SKIP && (!predicate || predicate(r, currentIndex))
|
|
101
|
+
})
|
|
90
102
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
103
|
+
passedResults.forEach(r => this.push(r))
|
|
104
|
+
|
|
105
|
+
if (isSettled) {
|
|
106
|
+
logger.log(`transformMapSync END received at index ${currentIndex}`)
|
|
107
|
+
pipelineClose('transformMapSync', this, this.sourceReadable, this.streamDone, logger)
|
|
96
108
|
}
|
|
109
|
+
|
|
110
|
+
cb() // done processing
|
|
97
111
|
} catch (err) {
|
|
98
112
|
logger.error(err)
|
|
99
113
|
errors++
|
|
@@ -107,7 +121,7 @@ export function transformMapSync<IN = any, OUT = IN>(
|
|
|
107
121
|
}
|
|
108
122
|
|
|
109
123
|
if (errorMode === ErrorMode.THROW_IMMEDIATELY) {
|
|
110
|
-
|
|
124
|
+
isSettled = true
|
|
111
125
|
// Emit error immediately
|
|
112
126
|
return cb(err as Error)
|
|
113
127
|
}
|
|
@@ -9,7 +9,7 @@ import { TransformTyped } from '../stream.model'
|
|
|
9
9
|
export function transformNoOp<T = any>(): TransformTyped<T, T> {
|
|
10
10
|
return new Transform({
|
|
11
11
|
objectMode: true,
|
|
12
|
-
transform(chunk: T,
|
|
12
|
+
transform(chunk: T, _, cb) {
|
|
13
13
|
cb(null, chunk)
|
|
14
14
|
},
|
|
15
15
|
})
|
|
@@ -17,16 +17,16 @@ export function transformTap<IN>(
|
|
|
17
17
|
opt: TransformTapOptions = {},
|
|
18
18
|
): TransformTyped<IN, IN> {
|
|
19
19
|
const { logger = console } = opt
|
|
20
|
-
let index =
|
|
20
|
+
let index = -1
|
|
21
21
|
|
|
22
22
|
return new Transform({
|
|
23
23
|
objectMode: true,
|
|
24
24
|
...opt,
|
|
25
|
-
async transform(chunk: IN,
|
|
25
|
+
async transform(chunk: IN, _, cb) {
|
|
26
26
|
// console.log('tap', chunk)
|
|
27
27
|
|
|
28
28
|
try {
|
|
29
|
-
await fn(chunk, index
|
|
29
|
+
await fn(chunk, ++index)
|
|
30
30
|
} catch (err) {
|
|
31
31
|
logger.error(err)
|
|
32
32
|
// suppressed error
|
|
@@ -10,7 +10,7 @@ export function transformToArray<IN>(opt: TransformOptions = {}): TransformTyped
|
|
|
10
10
|
return new Transform({
|
|
11
11
|
objectMode: true,
|
|
12
12
|
...opt,
|
|
13
|
-
transform(chunk: IN,
|
|
13
|
+
transform(chunk: IN, _, cb) {
|
|
14
14
|
res.push(chunk)
|
|
15
15
|
// callback to signal that we processed input, but not emitting any output
|
|
16
16
|
cb()
|
|
@@ -14,8 +14,8 @@ export function transformToString(): TransformTyped<Buffer, string> {
|
|
|
14
14
|
return new Transform({
|
|
15
15
|
objectMode: false,
|
|
16
16
|
readableObjectMode: true,
|
|
17
|
-
transform(chunk: Buffer,
|
|
18
|
-
// console.log(`enc: ${
|
|
17
|
+
transform(chunk: Buffer, _, cb) {
|
|
18
|
+
// console.log(`enc: ${_}`, chunk.toString())
|
|
19
19
|
cb(null, chunk.toString())
|
|
20
20
|
},
|
|
21
21
|
})
|
|
@@ -115,7 +115,7 @@ export function transformMultiThreaded<IN, OUT>(
|
|
|
115
115
|
}
|
|
116
116
|
},
|
|
117
117
|
},
|
|
118
|
-
async function transformMapFn(chunk: IN,
|
|
118
|
+
async function transformMapFn(chunk: IN, _, cb) {
|
|
119
119
|
// Freezing the index, because it may change due to concurrency
|
|
120
120
|
const currentIndex = ++index
|
|
121
121
|
|
|
@@ -31,7 +31,7 @@ export function writableFork<T>(
|
|
|
31
31
|
return new Writable({
|
|
32
32
|
objectMode: true,
|
|
33
33
|
...opt,
|
|
34
|
-
write(chunk: T,
|
|
34
|
+
write(chunk: T, _, cb) {
|
|
35
35
|
// Push/fork to all sub-streams
|
|
36
36
|
// No backpressure is ensured here, it'll push regardless of the
|
|
37
37
|
readables.forEach(readable => readable.push(chunk))
|
|
@@ -8,7 +8,7 @@ export function writablePushToArray<IN>(arr: IN[], opt: TransformOptions = {}):
|
|
|
8
8
|
return new Writable({
|
|
9
9
|
objectMode: true,
|
|
10
10
|
...opt,
|
|
11
|
-
write(chunk: IN,
|
|
11
|
+
write(chunk: IN, _, cb) {
|
|
12
12
|
arr.push(chunk)
|
|
13
13
|
// callback to signal that we processed input, but not emitting any output
|
|
14
14
|
cb()
|
package/src/util/zip.util.ts
CHANGED
|
@@ -7,46 +7,52 @@ const inflate = promisify(zlib.inflate.bind(zlib))
|
|
|
7
7
|
const gzip = promisify(zlib.gzip.bind(zlib))
|
|
8
8
|
const gunzip = promisify(zlib.gunzip.bind(zlib))
|
|
9
9
|
|
|
10
|
-
// string >
|
|
10
|
+
// string > compressed buffer
|
|
11
|
+
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
-
* It's 9 bytes shorter than gzip
|
|
13
|
+
* deflateBuffer uses `deflate`.
|
|
14
|
+
* It's 9 bytes shorter than `gzip`.
|
|
14
15
|
*/
|
|
15
|
-
export async function
|
|
16
|
+
export async function deflateBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
|
|
16
17
|
return await deflate(buf, options)
|
|
17
18
|
}
|
|
18
19
|
|
|
20
|
+
export async function inflateBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
|
|
21
|
+
return await inflate(buf, options)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* deflateString uses `deflate`.
|
|
26
|
+
* It's 9 bytes shorter than `gzip`.
|
|
27
|
+
*/
|
|
28
|
+
export async function deflateString(s: string, options?: ZlibOptions): Promise<Buffer> {
|
|
29
|
+
return await deflateBuffer(Buffer.from(s), options)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export async function inflateToString(buf: Buffer, options?: ZlibOptions): Promise<string> {
|
|
33
|
+
return (await inflateBuffer(buf, options)).toString()
|
|
34
|
+
}
|
|
35
|
+
|
|
19
36
|
/**
|
|
20
37
|
* gzipBuffer uses `gzip`
|
|
21
|
-
* It's 9 bytes longer than deflate
|
|
38
|
+
* It's 9 bytes longer than `deflate`.
|
|
22
39
|
*/
|
|
23
40
|
export async function gzipBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
|
|
24
41
|
return await gzip(buf, options)
|
|
25
42
|
}
|
|
26
43
|
|
|
27
|
-
// zip > buffer
|
|
28
|
-
export async function unzipBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
|
|
29
|
-
return await inflate(buf, options)
|
|
30
|
-
}
|
|
31
|
-
|
|
32
44
|
export async function gunzipBuffer(buf: Buffer, options: ZlibOptions = {}): Promise<Buffer> {
|
|
33
45
|
return await gunzip(buf, options)
|
|
34
46
|
}
|
|
35
47
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
/**
|
|
49
|
+
* gzipString uses `gzip`.
|
|
50
|
+
* It's 9 bytes longer than `deflate`.
|
|
51
|
+
*/
|
|
41
52
|
export async function gzipString(s: string, options?: ZlibOptions): Promise<Buffer> {
|
|
42
53
|
return await gzipBuffer(Buffer.from(s), options)
|
|
43
54
|
}
|
|
44
55
|
|
|
45
|
-
// convenience
|
|
46
|
-
export async function unzipToString(buf: Buffer, options?: ZlibOptions): Promise<string> {
|
|
47
|
-
return (await unzipBuffer(buf, options)).toString()
|
|
48
|
-
}
|
|
49
|
-
|
|
50
56
|
export async function gunzipToString(buf: Buffer, options?: ZlibOptions): Promise<string> {
|
|
51
57
|
return (await gunzipBuffer(buf, options)).toString()
|
|
52
58
|
}
|