UNPKG

2.94 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.transformMapSync = void 0;
4const js_lib_1 = require("@naturalcycles/js-lib");
5const stream_1 = require("stream");
6const colors_1 = require("../../colors");
7const transformMap_1 = require("./transformMap");
8/**
9 * Sync (not async) version of transformMap.
10 * Supposedly faster, for cases when async is not needed.
11 */
12function transformMapSync(mapper, opt = {}) {
13 let index = 0;
14 const { predicate = transformMap_1.notNullishPredicate, errorMode = js_lib_1.ErrorMode.THROW_IMMEDIATELY, flattenArrayOutput = false, onError, metric = 'stream', objectMode = true, } = opt;
15 let isRejected = false;
16 let errors = 0;
17 const collectedErrors = []; // only used if errorMode == THROW_AGGREGATED
18 return new stream_1.Transform({
19 objectMode,
20 ...opt,
21 transform(chunk, _encoding, cb) {
22 // Stop processing if THROW_IMMEDIATELY mode is used
23 if (isRejected && errorMode === js_lib_1.ErrorMode.THROW_IMMEDIATELY)
24 return cb();
25 try {
26 if (!predicate(chunk, index++)) {
27 cb(); // signal that we've finished processing, but emit no output here
28 return;
29 }
30 // map and pass through
31 const v = mapper(chunk, index);
32 if (flattenArrayOutput && Array.isArray(v)) {
33 // Pass each item individually
34 v.forEach(item => this.push(item));
35 }
36 else {
37 cb(null, v);
38 }
39 }
40 catch (err) {
41 console.error(err);
42 errors++;
43 logErrorStats();
44 if (onError) {
45 try {
46 onError(err, chunk);
47 }
48 catch { }
49 }
50 if (errorMode === js_lib_1.ErrorMode.THROW_IMMEDIATELY) {
51 isRejected = true;
52 // Emit error immediately
53 return cb(err);
54 }
55 if (errorMode === js_lib_1.ErrorMode.THROW_AGGREGATED) {
56 collectedErrors.push(err);
57 }
58 cb();
59 }
60 },
61 final(cb) {
62 // console.log('transformMap final')
63 logErrorStats(true);
64 if (collectedErrors.length) {
65 // emit Aggregated error
66 cb(new js_lib_1.AggregatedError(collectedErrors));
67 }
68 else {
69 // emit no error
70 cb();
71 }
72 },
73 });
74 function logErrorStats(final = false) {
75 if (!errors)
76 return;
77 console.log(`${metric} ${final ? 'final ' : ''}errors: ${colors_1.yellow(errors)}`);
78 }
79}
80exports.transformMapSync = transformMapSync;