@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
|
}
|
package/dist/stream/pipeline.js
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
40
|
-
|
|
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() -
|
|
146
|
+
const elapsed = Date.now() - started;
|
|
147
147
|
if (elapsed >= warmupMs) {
|
|
148
148
|
warmupComplete = true;
|
|
149
|
-
logger.
|
|
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
package/src/stream/pipeline.ts
CHANGED
|
@@ -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
|
-
|
|
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 (
|
|
138
|
-
|
|
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() -
|
|
259
|
+
const elapsed = Date.now() - started
|
|
260
260
|
if (elapsed >= warmupMs) {
|
|
261
261
|
warmupComplete = true
|
|
262
|
-
logger.
|
|
262
|
+
logger.log(`transformMap2: warmup complete in ${_since(started)}`)
|
|
263
263
|
return concurrency
|
|
264
264
|
}
|
|
265
265
|
|