UNPKG

2.96 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 = -1;
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 }
26 try {
27 if (!predicate(chunk, ++index)) {
28 cb(); // signal that we've finished processing, but emit no output here
29 return;
30 }
31 // map and pass through
32 const v = mapper(chunk, index);
33 if (flattenArrayOutput && Array.isArray(v)) {
34 // Pass each item individually
35 v.forEach(item => this.push(item));
36 }
37 else {
38 cb(null, v);
39 }
40 }
41 catch (err) {
42 console.error(err);
43 errors++;
44 logErrorStats();
45 if (onError) {
46 try {
47 onError(err, chunk);
48 }
49 catch { }
50 }
51 if (errorMode === js_lib_1.ErrorMode.THROW_IMMEDIATELY) {
52 isRejected = true;
53 // Emit error immediately
54 return cb(err);
55 }
56 if (errorMode === js_lib_1.ErrorMode.THROW_AGGREGATED) {
57 collectedErrors.push(err);
58 }
59 cb();
60 }
61 },
62 final(cb) {
63 // console.log('transformMap final')
64 logErrorStats(true);
65 if (collectedErrors.length) {
66 // emit Aggregated error
67 cb(new js_lib_1.AggregatedError(collectedErrors));
68 }
69 else {
70 // emit no error
71 cb();
72 }
73 },
74 });
75 function logErrorStats(final = false) {
76 if (!errors)
77 return;
78 console.log(`${metric} ${final ? 'final ' : ''}errors: ${(0, colors_1.yellow)(errors)}`);
79 }
80}
81exports.transformMapSync = transformMapSync;