@naturalcycles/nodejs-lib 12.55.1 → 12.58.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/dist/index.d.ts +2 -2
- package/dist/index.js +3 -3
- package/dist/stream/ndjson/ndJsonFileRead.js +1 -1
- package/dist/stream/transform/{beta/transformMap2.d.ts → legacy/transformMap.d.ts} +1 -1
- package/dist/stream/transform/legacy/transformMap.js +94 -0
- package/dist/stream/transform/transformLimit.d.ts +5 -1
- package/dist/stream/transform/transformLimit.js +2 -1
- package/dist/stream/transform/transformLogProgress.d.ts +2 -1
- package/dist/stream/transform/transformLogProgress.js +4 -4
- package/dist/stream/transform/transformMap.d.ts +6 -1
- package/dist/stream/transform/transformMap.js +62 -48
- package/dist/stream/transform/transformMapSimple.d.ts +2 -1
- package/dist/stream/transform/transformMapSimple.js +2 -2
- package/dist/stream/transform/transformMapSync.d.ts +2 -1
- package/dist/stream/transform/transformMapSync.js +3 -3
- package/dist/stream/transform/transformTap.d.ts +5 -2
- package/dist/stream/transform/transformTap.js +2 -1
- package/dist/stream/writable/writableForEach.d.ts +5 -1
- package/dist/stream/writable/writableForEach.js +8 -1
- package/dist/stream/writable/writableFork.d.ts +2 -0
- package/dist/stream/writable/writableFork.js +2 -0
- package/package.json +1 -1
- package/src/index.ts +1 -2
- package/src/stream/ndjson/ndJsonFileRead.ts +2 -2
- package/src/stream/transform/legacy/transformMap.ts +133 -0
- package/src/stream/transform/transformLimit.ts +8 -2
- package/src/stream/transform/transformLogProgress.ts +7 -4
- package/src/stream/transform/transformMap.ts +79 -67
- package/src/stream/transform/transformMapSimple.ts +5 -3
- package/src/stream/transform/transformMapSync.ts +6 -3
- package/src/stream/transform/transformTap.ts +8 -3
- package/src/stream/writable/writableForEach.ts +12 -2
- package/src/stream/writable/writableFork.ts +2 -0
- package/dist/stream/transform/beta/transformMap2.js +0 -98
- package/src/stream/transform/beta/transformMap2.ts +0 -134
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { Transform } from 'stream'
|
|
2
|
-
import {
|
|
3
|
-
AggregatedError,
|
|
4
|
-
AsyncMapper,
|
|
5
|
-
CommonLogger,
|
|
6
|
-
ErrorMode,
|
|
7
|
-
pFilter,
|
|
8
|
-
PQueue,
|
|
9
|
-
} from '@naturalcycles/js-lib'
|
|
10
|
-
import { yellow } from '../../../colors'
|
|
11
|
-
import { TransformTyped } from '../../stream.model'
|
|
12
|
-
import { TransformMapOptions } from '../transformMap'
|
|
13
|
-
|
|
14
|
-
export function notNullishPredicate(item: any): boolean {
|
|
15
|
-
return item !== undefined && item !== null
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Like pMap, but for streams.
|
|
20
|
-
* Inspired by `through2`.
|
|
21
|
-
* Main feature is concurrency control (implemented via `through2-concurrent`) and convenient options.
|
|
22
|
-
* Using this allows native stream .pipe() to work and use backpressure.
|
|
23
|
-
*
|
|
24
|
-
* Only works in objectMode (due to through2Concurrent).
|
|
25
|
-
*
|
|
26
|
-
* Concurrency defaults to 16.
|
|
27
|
-
*
|
|
28
|
-
* If an Array is returned by `mapper` - it will be flattened and multiple results will be emitted from it. Tested by Array.isArray().
|
|
29
|
-
*/
|
|
30
|
-
export function transformMap2<IN = any, OUT = IN>(
|
|
31
|
-
mapper: AsyncMapper<IN, OUT>,
|
|
32
|
-
opt: TransformMapOptions<IN, OUT> = {},
|
|
33
|
-
): TransformTyped<IN, OUT> {
|
|
34
|
-
const {
|
|
35
|
-
concurrency = 16,
|
|
36
|
-
predicate = notNullishPredicate,
|
|
37
|
-
errorMode = ErrorMode.THROW_IMMEDIATELY,
|
|
38
|
-
flattenArrayOutput,
|
|
39
|
-
onError,
|
|
40
|
-
beforeFinal,
|
|
41
|
-
metric = 'stream',
|
|
42
|
-
logger = console,
|
|
43
|
-
} = opt
|
|
44
|
-
|
|
45
|
-
let index = -1
|
|
46
|
-
let isRejected = false
|
|
47
|
-
let errors = 0
|
|
48
|
-
const collectedErrors: Error[] = [] // only used if errorMode == THROW_AGGREGATED
|
|
49
|
-
|
|
50
|
-
const q = new PQueue({
|
|
51
|
-
concurrency,
|
|
52
|
-
resolveOn: 'start',
|
|
53
|
-
// debug: true,
|
|
54
|
-
})
|
|
55
|
-
|
|
56
|
-
return new Transform({
|
|
57
|
-
objectMode: true,
|
|
58
|
-
|
|
59
|
-
async final(cb) {
|
|
60
|
-
// console.log('transformMap final', {index}, q.inFlight, q.queueSize)
|
|
61
|
-
|
|
62
|
-
// wait for the current inFlight jobs to complete and push their results
|
|
63
|
-
await q.onIdle()
|
|
64
|
-
|
|
65
|
-
logErrorStats(logger, true)
|
|
66
|
-
|
|
67
|
-
await beforeFinal?.() // call beforeFinal if defined
|
|
68
|
-
|
|
69
|
-
if (collectedErrors.length) {
|
|
70
|
-
// emit Aggregated error
|
|
71
|
-
cb(new AggregatedError(collectedErrors))
|
|
72
|
-
} else {
|
|
73
|
-
// emit no error
|
|
74
|
-
cb()
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
async transform(this: Transform, chunk: IN, _encoding, cb) {
|
|
79
|
-
index++
|
|
80
|
-
// console.log('transform', {index})
|
|
81
|
-
|
|
82
|
-
// Stop processing if THROW_IMMEDIATELY mode is used
|
|
83
|
-
if (isRejected && errorMode === ErrorMode.THROW_IMMEDIATELY) return cb()
|
|
84
|
-
|
|
85
|
-
// It resolves when it is successfully STARTED execution.
|
|
86
|
-
// If it's queued instead - it'll wait and resolve only upon START.
|
|
87
|
-
await q.push(async () => {
|
|
88
|
-
try {
|
|
89
|
-
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)
|
|
90
|
-
const res = await mapper(chunk, currentIndex)
|
|
91
|
-
const passedResults = await pFilter(
|
|
92
|
-
flattenArrayOutput && Array.isArray(res) ? res : [res],
|
|
93
|
-
async r => await predicate(r, currentIndex),
|
|
94
|
-
)
|
|
95
|
-
|
|
96
|
-
passedResults.forEach(r => this.push(r))
|
|
97
|
-
} catch (err) {
|
|
98
|
-
logger.error(err)
|
|
99
|
-
|
|
100
|
-
errors++
|
|
101
|
-
|
|
102
|
-
logErrorStats(logger)
|
|
103
|
-
|
|
104
|
-
if (onError) {
|
|
105
|
-
try {
|
|
106
|
-
onError(err, chunk)
|
|
107
|
-
} catch {}
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
if (errorMode === ErrorMode.THROW_IMMEDIATELY) {
|
|
111
|
-
isRejected = true
|
|
112
|
-
// Emit error immediately
|
|
113
|
-
// return cb(err as Error)
|
|
114
|
-
return this.emit('error', err as Error)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if (errorMode === ErrorMode.THROW_AGGREGATED) {
|
|
118
|
-
collectedErrors.push(err as Error)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
})
|
|
122
|
-
|
|
123
|
-
// Resolved, which means it STARTED processing
|
|
124
|
-
// This means we can take more load
|
|
125
|
-
cb()
|
|
126
|
-
},
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
function logErrorStats(logger: CommonLogger, final = false): void {
|
|
130
|
-
if (!errors) return
|
|
131
|
-
|
|
132
|
-
logger.log(`${metric} ${final ? 'final ' : ''}errors: ${yellow(errors)}`)
|
|
133
|
-
}
|
|
134
|
-
}
|