@naturalcycles/nodejs-lib 12.56.1 → 12.57.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.
@@ -1,5 +1,9 @@
1
+ import { CommonLogger } from '@naturalcycles/js-lib';
1
2
  import { TransformOptions, TransformTyped } from '../stream.model';
3
+ export interface TransformLimitOptions extends TransformOptions {
4
+ logger?: CommonLogger;
5
+ }
2
6
  /**
3
7
  * 0 or falsy value means "no limit"
4
8
  */
5
- export declare function transformLimit<IN>(limit?: number, opt?: TransformOptions): TransformTyped<IN, IN>;
9
+ export declare function transformLimit<IN>(limit?: number, opt?: TransformLimitOptions): TransformTyped<IN, IN>;
@@ -6,6 +6,7 @@ const stream_1 = require("stream");
6
6
  * 0 or falsy value means "no limit"
7
7
  */
8
8
  function transformLimit(limit, opt = {}) {
9
+ const { logger = console } = opt;
9
10
  let index = 0;
10
11
  let ended = false;
11
12
  return new stream_1.Transform({
@@ -21,7 +22,7 @@ function transformLimit(limit, opt = {}) {
21
22
  }
22
23
  if (limit && index === limit) {
23
24
  ended = true;
24
- console.log(`transformLimit: limit of ${limit} reached`);
25
+ logger.log(`transformLimit: limit of ${limit} reached`);
25
26
  // this.emit('end') // this makes it "halt" on Node 14 lts
26
27
  }
27
28
  },
@@ -1,4 +1,4 @@
1
- import { AnyObject } from '@naturalcycles/js-lib';
1
+ import { AnyObject, CommonLogger } from '@naturalcycles/js-lib';
2
2
  import { TransformOptions, TransformTyped } from '../stream.model';
3
3
  export interface TransformLogProgressOptions<IN = any> extends TransformOptions {
4
4
  /**
@@ -69,6 +69,7 @@ export interface TransformLogProgressOptions<IN = any> extends TransformOptions
69
69
  * @default 1000
70
70
  */
71
71
  logEvery?: number;
72
+ logger?: CommonLogger;
72
73
  /**
73
74
  * Function to return extra properties to the "progress object".
74
75
  *
@@ -15,7 +15,7 @@ const inspectOpt = {
15
15
  * Pass-through transform that optionally logs progress.
16
16
  */
17
17
  function transformLogProgress(opt = {}) {
18
- const { metric = 'progress', heapTotal: logHeapTotal = false, heapUsed: logHeapUsed = false, rss: logRss = true, peakRSS: logPeakRSS = true, logRPS = true, logEvery = 1000, batchSize = 1, extra, } = opt;
18
+ const { metric = 'progress', heapTotal: logHeapTotal = false, heapUsed: logHeapUsed = false, rss: logRss = true, peakRSS: logPeakRSS = true, logRPS = true, logEvery = 1000, batchSize = 1, extra, logger = console, } = opt;
19
19
  const logProgress = opt.logProgress !== false && logEvery !== 0; // true by default
20
20
  const logEvery10 = logEvery * 10;
21
21
  const started = Date.now();
@@ -54,7 +54,7 @@ function transformLogProgress(opt = {}) {
54
54
  const rps10 = Math.round(sma.push(lastRPS));
55
55
  if (mem.rss > peakRSS)
56
56
  peakRSS = mem.rss;
57
- console.log((0, util_1.inspect)({
57
+ logger.log((0, util_1.inspect)({
58
58
  [final ? `${metric}_final` : metric]: batchedProgress,
59
59
  ...(extra ? extra(chunk, progress) : {}),
60
60
  ...(logHeapUsed ? { heapUsed: (0, js_lib_1._mb)(mem.heapUsed) } : {}),
@@ -76,10 +76,10 @@ function transformLogProgress(opt = {}) {
76
76
  if (perHour > 900) {
77
77
  perHour = Math.round(perHour / 1000) + 'K';
78
78
  }
79
- console.log(`${(0, colors_1.dimGrey)((0, time_lib_1.dayjs)().toPretty())} ${(0, colors_1.white)(metric)} took ${(0, colors_1.yellow)((0, js_lib_1._since)(started))} so far to process ${(0, colors_1.yellow)(batchedProgress)} rows, ~${(0, colors_1.yellow)(perHour)}/hour`);
79
+ logger.log(`${(0, colors_1.dimGrey)((0, time_lib_1.dayjs)().toPretty())} ${(0, colors_1.white)(metric)} took ${(0, colors_1.yellow)((0, js_lib_1._since)(started))} so far to process ${(0, colors_1.yellow)(batchedProgress)} rows, ~${(0, colors_1.yellow)(perHour)}/hour`);
80
80
  }
81
81
  else if (final) {
82
- console.log(`${(0, colors_1.boldWhite)(metric)} took ${(0, colors_1.yellow)((0, js_lib_1._since)(started))} to process ${(0, colors_1.yellow)(batchedProgress)} rows with total RPS of ${(0, colors_1.yellow)(rpsTotal)}`);
82
+ logger.log(`${(0, colors_1.boldWhite)(metric)} took ${(0, colors_1.yellow)((0, js_lib_1._since)(started))} to process ${(0, colors_1.yellow)(batchedProgress)} rows with total RPS of ${(0, colors_1.yellow)(rpsTotal)}`);
83
83
  }
84
84
  }
85
85
  }
@@ -1,4 +1,4 @@
1
- import { ErrorMode, Mapper } from '@naturalcycles/js-lib';
1
+ import { CommonLogger, ErrorMode, Mapper } from '@naturalcycles/js-lib';
2
2
  import { TransformTyped } from '../stream.model';
3
3
  export interface TransformMapSimpleOptions {
4
4
  /**
@@ -7,6 +7,7 @@ export interface TransformMapSimpleOptions {
7
7
  * @default ErrorMode.THROW_IMMEDIATELY
8
8
  */
9
9
  errorMode?: ErrorMode.THROW_IMMEDIATELY | ErrorMode.SUPPRESS;
10
+ logger?: CommonLogger;
10
11
  }
11
12
  /**
12
13
  * Simplest version of `transformMap`.
@@ -14,7 +14,7 @@ const js_lib_1 = require("@naturalcycles/js-lib");
14
14
  */
15
15
  function transformMapSimple(mapper, opt = {}) {
16
16
  let index = -1;
17
- const { errorMode = js_lib_1.ErrorMode.THROW_IMMEDIATELY } = opt;
17
+ const { errorMode = js_lib_1.ErrorMode.THROW_IMMEDIATELY, logger = console } = opt;
18
18
  return new stream_1.Transform({
19
19
  objectMode: true,
20
20
  transform(chunk, _encoding, cb) {
@@ -22,7 +22,7 @@ function transformMapSimple(mapper, opt = {}) {
22
22
  cb(null, mapper(chunk, ++index));
23
23
  }
24
24
  catch (err) {
25
- console.error(err);
25
+ logger.error(err);
26
26
  if (errorMode === js_lib_1.ErrorMode.SUPPRESS) {
27
27
  cb(); // suppress the error
28
28
  }
@@ -1,4 +1,4 @@
1
- import { ErrorMode, Mapper, Predicate } from '@naturalcycles/js-lib';
1
+ import { CommonLogger, ErrorMode, Mapper, Predicate } from '@naturalcycles/js-lib';
2
2
  import { TransformTyped } from '../stream.model';
3
3
  export interface TransformMapSyncOptions<IN = any, OUT = IN> {
4
4
  /**
@@ -34,6 +34,7 @@ export interface TransformMapSyncOptions<IN = any, OUT = IN> {
34
34
  * @default `stream`
35
35
  */
36
36
  metric?: string;
37
+ logger?: CommonLogger;
37
38
  }
38
39
  /**
39
40
  * Sync (not async) version of transformMap.
@@ -11,7 +11,7 @@ const transformMap_1 = require("./transformMap");
11
11
  */
12
12
  function transformMapSync(mapper, opt = {}) {
13
13
  let index = -1;
14
- const { predicate = transformMap_1.notNullishPredicate, errorMode = js_lib_1.ErrorMode.THROW_IMMEDIATELY, flattenArrayOutput = false, onError, metric = 'stream', objectMode = true, } = opt;
14
+ const { predicate = transformMap_1.notNullishPredicate, errorMode = js_lib_1.ErrorMode.THROW_IMMEDIATELY, flattenArrayOutput = false, onError, metric = 'stream', objectMode = true, logger = console, } = opt;
15
15
  let isRejected = false;
16
16
  let errors = 0;
17
17
  const collectedErrors = []; // only used if errorMode == THROW_AGGREGATED
@@ -39,7 +39,7 @@ function transformMapSync(mapper, opt = {}) {
39
39
  }
40
40
  }
41
41
  catch (err) {
42
- console.error(err);
42
+ logger.error(err);
43
43
  errors++;
44
44
  logErrorStats();
45
45
  if (onError) {
@@ -75,7 +75,7 @@ function transformMapSync(mapper, opt = {}) {
75
75
  function logErrorStats(final = false) {
76
76
  if (!errors)
77
77
  return;
78
- console.log(`${metric} ${final ? 'final ' : ''}errors: ${(0, colors_1.yellow)(errors)}`);
78
+ logger.log(`${metric} ${final ? 'final ' : ''}errors: ${(0, colors_1.yellow)(errors)}`);
79
79
  }
80
80
  }
81
81
  exports.transformMapSync = transformMapSync;
@@ -1,9 +1,12 @@
1
- import { AsyncMapper } from '@naturalcycles/js-lib';
1
+ import { AsyncMapper, CommonLogger } from '@naturalcycles/js-lib';
2
2
  import { TransformOptions, TransformTyped } from '../stream.model';
3
+ export interface TransformTapOptions extends TransformOptions {
4
+ logger?: CommonLogger;
5
+ }
3
6
  /**
4
7
  * Similar to RxJS `tap` - allows to run a function for each stream item, without affecting the result.
5
8
  * Item is passed through to the output.
6
9
  *
7
10
  * Can also act as a counter, since `index` is passed to `fn`
8
11
  */
9
- export declare function transformTap<IN>(fn: AsyncMapper<IN, any>, opt?: TransformOptions): TransformTyped<IN, IN>;
12
+ export declare function transformTap<IN>(fn: AsyncMapper<IN, any>, opt?: TransformTapOptions): TransformTyped<IN, IN>;
@@ -9,6 +9,7 @@ const stream_1 = require("stream");
9
9
  * Can also act as a counter, since `index` is passed to `fn`
10
10
  */
11
11
  function transformTap(fn, opt = {}) {
12
+ const { logger = console } = opt;
12
13
  let index = 0;
13
14
  return new stream_1.Transform({
14
15
  objectMode: true,
@@ -19,7 +20,7 @@ function transformTap(fn, opt = {}) {
19
20
  await fn(chunk, index++);
20
21
  }
21
22
  catch (err) {
22
- console.error(err);
23
+ logger.error(err);
23
24
  // suppressed error
24
25
  }
25
26
  cb(null, chunk); // pass through the item
@@ -5,5 +5,7 @@ import { TransformOptions, WritableTyped } from '../stream.model';
5
5
  * Currently does NOT (!) maintain backpressure.
6
6
  * Error in the forked pipeline will propagate up to the main pipeline (and log error, to be sure).
7
7
  * Will wait until all forked pipelines are completed before completing the stream.
8
+ *
9
+ * @experimental
8
10
  */
9
11
  export declare function writableFork<T>(chains: NodeJS.WritableStream[][], opt?: TransformOptions): WritableTyped<T>;
@@ -8,6 +8,8 @@ const __1 = require("../..");
8
8
  * Currently does NOT (!) maintain backpressure.
9
9
  * Error in the forked pipeline will propagate up to the main pipeline (and log error, to be sure).
10
10
  * Will wait until all forked pipelines are completed before completing the stream.
11
+ *
12
+ * @experimental
11
13
  */
12
14
  function writableFork(chains, opt) {
13
15
  const readables = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@naturalcycles/nodejs-lib",
3
- "version": "12.56.1",
3
+ "version": "12.57.0",
4
4
  "scripts": {
5
5
  "prepare": "husky install",
6
6
  "docs-serve": "vuepress dev docs",
@@ -1,13 +1,19 @@
1
1
  import { Transform } from 'stream'
2
+ import { CommonLogger } from '@naturalcycles/js-lib'
2
3
  import { TransformOptions, TransformTyped } from '../stream.model'
3
4
 
5
+ export interface TransformLimitOptions extends TransformOptions {
6
+ logger?: CommonLogger
7
+ }
8
+
4
9
  /**
5
10
  * 0 or falsy value means "no limit"
6
11
  */
7
12
  export function transformLimit<IN>(
8
13
  limit?: number,
9
- opt: TransformOptions = {},
14
+ opt: TransformLimitOptions = {},
10
15
  ): TransformTyped<IN, IN> {
16
+ const { logger = console } = opt
11
17
  let index = 0
12
18
  let ended = false
13
19
 
@@ -25,7 +31,7 @@ export function transformLimit<IN>(
25
31
 
26
32
  if (limit && index === limit) {
27
33
  ended = true
28
- console.log(`transformLimit: limit of ${limit} reached`)
34
+ logger.log(`transformLimit: limit of ${limit} reached`)
29
35
  // this.emit('end') // this makes it "halt" on Node 14 lts
30
36
  }
31
37
  },
@@ -1,6 +1,6 @@
1
1
  import { Transform } from 'stream'
2
2
  import { inspect, InspectOptions } from 'util'
3
- import { SimpleMovingAverage, _mb, _since, AnyObject } from '@naturalcycles/js-lib'
3
+ import { SimpleMovingAverage, _mb, _since, AnyObject, CommonLogger } from '@naturalcycles/js-lib'
4
4
  import { dayjs } from '@naturalcycles/time-lib'
5
5
  import { boldWhite, dimGrey, white, yellow } from '../../colors'
6
6
  import { hasColors } from '../../colors/colors'
@@ -86,6 +86,8 @@ export interface TransformLogProgressOptions<IN = any> extends TransformOptions
86
86
  */
87
87
  logEvery?: number
88
88
 
89
+ logger?: CommonLogger
90
+
89
91
  /**
90
92
  * Function to return extra properties to the "progress object".
91
93
  *
@@ -124,6 +126,7 @@ export function transformLogProgress<IN = any>(
124
126
  logEvery = 1000,
125
127
  batchSize = 1,
126
128
  extra,
129
+ logger = console,
127
130
  } = opt
128
131
  const logProgress = opt.logProgress !== false && logEvery !== 0 // true by default
129
132
  const logEvery10 = logEvery * 10
@@ -172,7 +175,7 @@ export function transformLogProgress<IN = any>(
172
175
  const rps10 = Math.round(sma.push(lastRPS))
173
176
  if (mem.rss > peakRSS) peakRSS = mem.rss
174
177
 
175
- console.log(
178
+ logger.log(
176
179
  inspect(
177
180
  {
178
181
  [final ? `${metric}_final` : metric]: batchedProgress,
@@ -202,13 +205,13 @@ export function transformLogProgress<IN = any>(
202
205
  perHour = Math.round(perHour / 1000) + 'K'
203
206
  }
204
207
 
205
- console.log(
208
+ logger.log(
206
209
  `${dimGrey(dayjs().toPretty())} ${white(metric)} took ${yellow(
207
210
  _since(started),
208
211
  )} so far to process ${yellow(batchedProgress)} rows, ~${yellow(perHour)}/hour`,
209
212
  )
210
213
  } else if (final) {
211
- console.log(
214
+ logger.log(
212
215
  `${boldWhite(metric)} took ${yellow(_since(started))} to process ${yellow(
213
216
  batchedProgress,
214
217
  )} rows with total RPS of ${yellow(rpsTotal)}`,
@@ -1,5 +1,5 @@
1
1
  import { Transform } from 'stream'
2
- import { ErrorMode, Mapper } from '@naturalcycles/js-lib'
2
+ import { CommonLogger, ErrorMode, Mapper } from '@naturalcycles/js-lib'
3
3
  import { TransformTyped } from '../stream.model'
4
4
 
5
5
  export interface TransformMapSimpleOptions {
@@ -9,6 +9,8 @@ export interface TransformMapSimpleOptions {
9
9
  * @default ErrorMode.THROW_IMMEDIATELY
10
10
  */
11
11
  errorMode?: ErrorMode.THROW_IMMEDIATELY | ErrorMode.SUPPRESS
12
+
13
+ logger?: CommonLogger
12
14
  }
13
15
 
14
16
  /**
@@ -25,7 +27,7 @@ export function transformMapSimple<IN = any, OUT = IN>(
25
27
  opt: TransformMapSimpleOptions = {},
26
28
  ): TransformTyped<IN, OUT> {
27
29
  let index = -1
28
- const { errorMode = ErrorMode.THROW_IMMEDIATELY } = opt
30
+ const { errorMode = ErrorMode.THROW_IMMEDIATELY, logger = console } = opt
29
31
 
30
32
  return new Transform({
31
33
  objectMode: true,
@@ -33,7 +35,7 @@ export function transformMapSimple<IN = any, OUT = IN>(
33
35
  try {
34
36
  cb(null, mapper(chunk, ++index))
35
37
  } catch (err) {
36
- console.error(err)
38
+ logger.error(err)
37
39
 
38
40
  if (errorMode === ErrorMode.SUPPRESS) {
39
41
  cb() // suppress the error
@@ -1,5 +1,5 @@
1
1
  import { Transform } from 'stream'
2
- import { AggregatedError, ErrorMode, Mapper, Predicate } from '@naturalcycles/js-lib'
2
+ import { AggregatedError, CommonLogger, ErrorMode, Mapper, Predicate } from '@naturalcycles/js-lib'
3
3
  import { yellow } from '../../colors'
4
4
  import { TransformTyped } from '../stream.model'
5
5
  import { notNullishPredicate } from './transformMap'
@@ -43,6 +43,8 @@ export interface TransformMapSyncOptions<IN = any, OUT = IN> {
43
43
  * @default `stream`
44
44
  */
45
45
  metric?: string
46
+
47
+ logger?: CommonLogger
46
48
  }
47
49
 
48
50
  /**
@@ -62,6 +64,7 @@ export function transformMapSync<IN = any, OUT = IN>(
62
64
  onError,
63
65
  metric = 'stream',
64
66
  objectMode = true,
67
+ logger = console,
65
68
  } = opt
66
69
  let isRejected = false
67
70
  let errors = 0
@@ -92,7 +95,7 @@ export function transformMapSync<IN = any, OUT = IN>(
92
95
  cb(null, v)
93
96
  }
94
97
  } catch (err) {
95
- console.error(err)
98
+ logger.error(err)
96
99
  errors++
97
100
 
98
101
  logErrorStats()
@@ -134,6 +137,6 @@ export function transformMapSync<IN = any, OUT = IN>(
134
137
  function logErrorStats(final = false): void {
135
138
  if (!errors) return
136
139
 
137
- console.log(`${metric} ${final ? 'final ' : ''}errors: ${yellow(errors)}`)
140
+ logger.log(`${metric} ${final ? 'final ' : ''}errors: ${yellow(errors)}`)
138
141
  }
139
142
  }
@@ -1,7 +1,11 @@
1
1
  import { Transform } from 'stream'
2
- import { AsyncMapper } from '@naturalcycles/js-lib'
2
+ import { AsyncMapper, CommonLogger } from '@naturalcycles/js-lib'
3
3
  import { TransformOptions, TransformTyped } from '../stream.model'
4
4
 
5
+ export interface TransformTapOptions extends TransformOptions {
6
+ logger?: CommonLogger
7
+ }
8
+
5
9
  /**
6
10
  * Similar to RxJS `tap` - allows to run a function for each stream item, without affecting the result.
7
11
  * Item is passed through to the output.
@@ -10,8 +14,9 @@ import { TransformOptions, TransformTyped } from '../stream.model'
10
14
  */
11
15
  export function transformTap<IN>(
12
16
  fn: AsyncMapper<IN, any>,
13
- opt: TransformOptions = {},
17
+ opt: TransformTapOptions = {},
14
18
  ): TransformTyped<IN, IN> {
19
+ const { logger = console } = opt
15
20
  let index = 0
16
21
 
17
22
  return new Transform({
@@ -23,7 +28,7 @@ export function transformTap<IN>(
23
28
  try {
24
29
  await fn(chunk, index++)
25
30
  } catch (err) {
26
- console.error(err)
31
+ logger.error(err)
27
32
  // suppressed error
28
33
  }
29
34
 
@@ -7,6 +7,8 @@ import { TransformOptions, WritableTyped } from '../stream.model'
7
7
  * Currently does NOT (!) maintain backpressure.
8
8
  * Error in the forked pipeline will propagate up to the main pipeline (and log error, to be sure).
9
9
  * Will wait until all forked pipelines are completed before completing the stream.
10
+ *
11
+ * @experimental
10
12
  */
11
13
  export function writableFork<T>(
12
14
  chains: NodeJS.WritableStream[][],