@naturalcycles/nodejs-lib 12.56.0 → 12.59.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.
Files changed (61) hide show
  1. package/dist/index.d.ts +19 -18
  2. package/dist/index.js +19 -92
  3. package/dist/log/log.util.d.ts +4 -0
  4. package/dist/log/log.util.js +11 -0
  5. package/dist/stream/ndjson/ndjsonMap.d.ts +2 -2
  6. package/dist/stream/ndjson/ndjsonMap.js +4 -3
  7. package/dist/stream/ndjson/ndjsonStreamForEach.d.ts +2 -2
  8. package/dist/stream/pipeline/pipeline.d.ts +25 -3
  9. package/dist/stream/pipeline/pipeline.js +76 -9
  10. package/dist/stream/readable/readableCreate.d.ts +8 -0
  11. package/dist/stream/readable/readableCreate.js +9 -1
  12. package/dist/stream/readable/readableForEach.d.ts +2 -2
  13. package/dist/stream/readable/readableFromArray.d.ts +2 -2
  14. package/dist/stream/readable/readableFromArray.js +17 -13
  15. package/dist/stream/readable/readableMap.d.ts +2 -2
  16. package/dist/stream/readable/readableMap.js +22 -17
  17. package/dist/stream/stream.util.d.ts +4 -0
  18. package/dist/stream/stream.util.js +24 -0
  19. package/dist/stream/transform/transformLimit.d.ts +36 -1
  20. package/dist/stream/transform/transformLimit.js +33 -15
  21. package/dist/stream/transform/transformLogProgress.d.ts +2 -1
  22. package/dist/stream/transform/transformLogProgress.js +4 -4
  23. package/dist/stream/transform/transformMap.d.ts +2 -6
  24. package/dist/stream/transform/transformMap.js +51 -53
  25. package/dist/stream/transform/transformMapSimple.d.ts +2 -1
  26. package/dist/stream/transform/transformMapSimple.js +2 -2
  27. package/dist/stream/transform/transformMapSync.d.ts +2 -1
  28. package/dist/stream/transform/transformMapSync.js +3 -3
  29. package/dist/stream/transform/transformTap.d.ts +5 -2
  30. package/dist/stream/transform/transformTap.js +2 -1
  31. package/dist/stream/transform/worker/workerClassProxy.js +1 -0
  32. package/dist/stream/writable/writableFork.d.ts +2 -0
  33. package/dist/stream/writable/writableFork.js +2 -0
  34. package/dist/stream/writable/writableLimit.d.ts +9 -0
  35. package/dist/stream/writable/writableLimit.js +29 -0
  36. package/dist/stream/writable/writableVoid.d.ts +8 -1
  37. package/dist/stream/writable/writableVoid.js +5 -1
  38. package/package.json +1 -1
  39. package/src/index.ts +17 -156
  40. package/src/log/log.util.ts +9 -0
  41. package/src/stream/ndjson/ndjsonMap.ts +7 -5
  42. package/src/stream/ndjson/ndjsonStreamForEach.ts +2 -2
  43. package/src/stream/pipeline/pipeline.ts +102 -9
  44. package/src/stream/readable/readableCreate.ts +9 -1
  45. package/src/stream/readable/readableForEach.ts +2 -2
  46. package/src/stream/readable/readableFromArray.ts +18 -21
  47. package/src/stream/readable/readableMap.ts +24 -21
  48. package/src/stream/stream.util.ts +29 -0
  49. package/src/stream/transform/transformLimit.ts +71 -19
  50. package/src/stream/transform/transformLogProgress.ts +7 -4
  51. package/src/stream/transform/transformMap.ts +74 -82
  52. package/src/stream/transform/transformMapSimple.ts +5 -3
  53. package/src/stream/transform/transformMapSync.ts +6 -3
  54. package/src/stream/transform/transformTap.ts +8 -3
  55. package/src/stream/transform/worker/workerClassProxy.js +1 -0
  56. package/src/stream/writable/writableFork.ts +2 -0
  57. package/src/stream/writable/writableLimit.ts +28 -0
  58. package/src/stream/writable/writableVoid.ts +13 -1
  59. package/dist/stream/transform/legacy/transformMap.d.ts +0 -17
  60. package/dist/stream/transform/legacy/transformMap.js +0 -94
  61. package/src/stream/transform/legacy/transformMap.ts +0 -133
@@ -1,133 +0,0 @@
1
- import { Transform } from 'stream'
2
- import {
3
- AggregatedError,
4
- AsyncMapper,
5
- CommonLogger,
6
- ErrorMode,
7
- pFilter,
8
- } from '@naturalcycles/js-lib'
9
- import through2Concurrent = require('through2-concurrent')
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 transformMapLegacy<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
- return through2Concurrent.obj(
51
- {
52
- maxConcurrency: concurrency,
53
- // autoDestroy: true,
54
- async final(cb) {
55
- // console.log('transformMap final')
56
-
57
- logErrorStats(logger, true)
58
-
59
- await beforeFinal?.() // call beforeFinal if defined
60
-
61
- if (collectedErrors.length) {
62
- // emit Aggregated error
63
- cb(new AggregatedError(collectedErrors))
64
- } else {
65
- // emit no error
66
- cb()
67
- }
68
- },
69
- },
70
- async function transformMapFn(
71
- this: Transform,
72
- chunk: IN,
73
- _encoding: any,
74
- cb: (...args: any[]) => any,
75
- ) {
76
- index++
77
- // console.log({chunk, _encoding})
78
-
79
- // Stop processing if THROW_IMMEDIATELY mode is used
80
- if (isRejected && errorMode === ErrorMode.THROW_IMMEDIATELY) return cb()
81
-
82
- try {
83
- 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)
84
- const res = await mapper(chunk, currentIndex)
85
- const passedResults = await pFilter(
86
- flattenArrayOutput && Array.isArray(res) ? res : [res],
87
- async r => await predicate(r, currentIndex),
88
- )
89
-
90
- if (passedResults.length === 0) {
91
- cb() // 0 results
92
- } else {
93
- passedResults.forEach(r => {
94
- this.push(r)
95
- // cb(null, r)
96
- })
97
- cb() // done processing
98
- }
99
- } catch (err) {
100
- logger.error(err)
101
-
102
- errors++
103
-
104
- logErrorStats(logger)
105
-
106
- if (onError) {
107
- try {
108
- onError(err, chunk)
109
- } catch {}
110
- }
111
-
112
- if (errorMode === ErrorMode.THROW_IMMEDIATELY) {
113
- isRejected = true
114
- // Emit error immediately
115
- return cb(err)
116
- }
117
-
118
- if (errorMode === ErrorMode.THROW_AGGREGATED) {
119
- collectedErrors.push(err as Error)
120
- }
121
-
122
- // Tell input stream that we're done processing, but emit nothing to output - not error nor result
123
- cb()
124
- }
125
- },
126
- )
127
-
128
- function logErrorStats(logger: CommonLogger, final = false): void {
129
- if (!errors) return
130
-
131
- logger.log(`${metric} ${final ? 'final ' : ''}errors: ${yellow(errors)}`)
132
- }
133
- }