@naturalcycles/nodejs-lib 15.68.0 → 15.69.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.
@@ -109,6 +109,7 @@ export declare class Pipeline<T = unknown> {
109
109
  toNDJsonFile(outputFilePath: string): Promise<void>;
110
110
  to(destination: WritableTyped<T>): Promise<void>;
111
111
  forEach(fn: AsyncIndexedMapper<T, void>, opt?: TransformMapOptions<T, void> & TransformLogProgressOptions<T>): Promise<void>;
112
+ forEach2(fn: AsyncIndexedMapper<T, void>, opt?: TransformMap2Options<T, void> & TransformLogProgressOptions<T>): Promise<void>;
112
113
  forEachSync(fn: IndexedMapper<T, void>, opt?: TransformMapSyncOptions<T, void> & TransformLogProgressOptions<T>): Promise<void>;
113
114
  run(): Promise<void>;
114
115
  }
@@ -324,6 +324,17 @@ export class Pipeline {
324
324
  }
325
325
  await this.run();
326
326
  }
327
+ async forEach2(fn, opt = {}) {
328
+ this.transforms.push(transformMap2(fn, {
329
+ predicate: opt.logEvery ? _passthroughPredicate : undefined, // for the logger to work
330
+ ...opt,
331
+ signal: this.abortableSignal,
332
+ }));
333
+ if (opt.logEvery) {
334
+ this.transforms.push(transformLogProgress(opt));
335
+ }
336
+ await this.run();
337
+ }
327
338
  async forEachSync(fn, opt = {}) {
328
339
  this.transforms.push(transformMapSync(fn, {
329
340
  predicate: opt.logEvery ? _passthroughPredicate : undefined, // for the logger to work
@@ -1,4 +1,5 @@
1
1
  import { Transform } from 'node:stream';
2
+ import { _since } from '@naturalcycles/js-lib/datetime';
2
3
  import { _anyToError, _assert, ErrorMode } from '@naturalcycles/js-lib/error';
3
4
  import { createCommonLoggerAtLevel } from '@naturalcycles/js-lib/log';
4
5
  import { pDefer } from '@naturalcycles/js-lib/promise/pDefer.js';
@@ -16,7 +17,7 @@ export function transformMap2(mapper, opt = {}) {
16
17
  const warmupMs = warmupSeconds * 1000;
17
18
  const logger = createCommonLoggerAtLevel(opt.logger, opt.logLevel);
18
19
  // Stats
19
- const started = Date.now();
20
+ let started = 0;
20
21
  let index = -1;
21
22
  let countOut = 0;
22
23
  let isSettled = false;
@@ -24,7 +25,6 @@ export function transformMap2(mapper, opt = {}) {
24
25
  let errors = 0;
25
26
  const collectedErrors = [];
26
27
  // Concurrency control
27
- let startTime = 0;
28
28
  let warmupComplete = warmupSeconds <= 0 || concurrency <= 1;
29
29
  let inFlight = 0;
30
30
  const waiters = [];
@@ -36,8 +36,8 @@ export function transformMap2(mapper, opt = {}) {
36
36
  writableHighWaterMark: highWaterMark,
37
37
  async transform(chunk, _, cb) {
38
38
  // Initialize start time on first item
39
- if (startTime === 0) {
40
- startTime = Date.now();
39
+ if (started === 0) {
40
+ started = Date.now();
41
41
  }
42
42
  // Stop processing if isSettled
43
43
  if (isSettled)
@@ -143,10 +143,10 @@ export function transformMap2(mapper, opt = {}) {
143
143
  function getCurrentConcurrency() {
144
144
  if (warmupComplete)
145
145
  return concurrency;
146
- const elapsed = Date.now() - startTime;
146
+ const elapsed = Date.now() - started;
147
147
  if (elapsed >= warmupMs) {
148
148
  warmupComplete = true;
149
- logger.debug('warmup complete');
149
+ logger.log(`transformMap2: warmup complete in ${_since(started)}`);
150
150
  return concurrency;
151
151
  }
152
152
  const progress = elapsed / warmupMs;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@naturalcycles/nodejs-lib",
3
3
  "type": "module",
4
- "version": "15.68.0",
4
+ "version": "15.69.1",
5
5
  "dependencies": {
6
6
  "@naturalcycles/js-lib": "^15",
7
7
  "@types/js-yaml": "^4",
@@ -445,6 +445,23 @@ export class Pipeline<T = unknown> {
445
445
  await this.run()
446
446
  }
447
447
 
448
+ async forEach2(
449
+ fn: AsyncIndexedMapper<T, void>,
450
+ opt: TransformMap2Options<T, void> & TransformLogProgressOptions<T> = {},
451
+ ): Promise<void> {
452
+ this.transforms.push(
453
+ transformMap2(fn, {
454
+ predicate: opt.logEvery ? _passthroughPredicate : undefined, // for the logger to work
455
+ ...opt,
456
+ signal: this.abortableSignal,
457
+ }),
458
+ )
459
+ if (opt.logEvery) {
460
+ this.transforms.push(transformLogProgress(opt))
461
+ }
462
+ await this.run()
463
+ }
464
+
448
465
  async forEachSync(
449
466
  fn: IndexedMapper<T, void>,
450
467
  opt: TransformMapSyncOptions<T, void> & TransformLogProgressOptions<T> = {},
@@ -1,5 +1,6 @@
1
1
  import { Transform } from 'node:stream'
2
2
  import type { AbortableSignal } from '@naturalcycles/js-lib'
3
+ import { _since } from '@naturalcycles/js-lib/datetime'
3
4
  import { _anyToError, _assert, ErrorMode } from '@naturalcycles/js-lib/error'
4
5
  import { createCommonLoggerAtLevel } from '@naturalcycles/js-lib/log'
5
6
  import type { DeferredPromise } from '@naturalcycles/js-lib/promise'
@@ -111,7 +112,7 @@ export function transformMap2<IN = any, OUT = IN>(
111
112
  const logger = createCommonLoggerAtLevel(opt.logger, opt.logLevel)
112
113
 
113
114
  // Stats
114
- const started = Date.now() as UnixTimestampMillis
115
+ let started = 0 as UnixTimestampMillis
115
116
  let index = -1
116
117
  let countOut = 0
117
118
  let isSettled = false
@@ -120,7 +121,6 @@ export function transformMap2<IN = any, OUT = IN>(
120
121
  const collectedErrors: Error[] = []
121
122
 
122
123
  // Concurrency control
123
- let startTime = 0
124
124
  let warmupComplete = warmupSeconds <= 0 || concurrency <= 1
125
125
  let inFlight = 0
126
126
  const waiters: DeferredPromise[] = []
@@ -134,8 +134,8 @@ export function transformMap2<IN = any, OUT = IN>(
134
134
  writableHighWaterMark: highWaterMark,
135
135
  async transform(this: Transform, chunk: IN, _, cb) {
136
136
  // Initialize start time on first item
137
- if (startTime === 0) {
138
- startTime = Date.now()
137
+ if (started === 0) {
138
+ started = Date.now() as UnixTimestampMillis
139
139
  }
140
140
 
141
141
  // Stop processing if isSettled
@@ -256,10 +256,10 @@ export function transformMap2<IN = any, OUT = IN>(
256
256
  function getCurrentConcurrency(): number {
257
257
  if (warmupComplete) return concurrency
258
258
 
259
- const elapsed = Date.now() - startTime
259
+ const elapsed = Date.now() - started
260
260
  if (elapsed >= warmupMs) {
261
261
  warmupComplete = true
262
- logger.debug('warmup complete')
262
+ logger.log(`transformMap2: warmup complete in ${_since(started)}`)
263
263
  return concurrency
264
264
  }
265
265