@forzalabs/remora 1.1.9 → 1.1.10
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.
- package/index.js +25 -11
- package/package.json +1 -1
- package/workers/ExecutorWorker.js +17 -8
package/index.js
CHANGED
|
@@ -13259,6 +13259,13 @@ ${stack}` : base;
|
|
|
13259
13259
|
stack: extra
|
|
13260
13260
|
});
|
|
13261
13261
|
};
|
|
13262
|
+
this.flush = () => {
|
|
13263
|
+
if (!this._enabled || !this._logger) return Promise.resolve();
|
|
13264
|
+
return new Promise((resolve) => {
|
|
13265
|
+
this._logger.on("finish", resolve);
|
|
13266
|
+
this._logger.end();
|
|
13267
|
+
});
|
|
13268
|
+
};
|
|
13262
13269
|
}
|
|
13263
13270
|
};
|
|
13264
13271
|
var FileLogService = new FileLogServiceClass();
|
|
@@ -13309,7 +13316,6 @@ var Logger = class {
|
|
|
13309
13316
|
this._fileLoggingFolder = folder;
|
|
13310
13317
|
this._fileLoggingFile = file;
|
|
13311
13318
|
FileLogService_default.enable(folder, file);
|
|
13312
|
-
console.log(`Enabled file logger.`);
|
|
13313
13319
|
};
|
|
13314
13320
|
this.getConfig = () => ({
|
|
13315
13321
|
level: this._level,
|
|
@@ -13332,6 +13338,7 @@ var Logger = class {
|
|
|
13332
13338
|
console.info(message);
|
|
13333
13339
|
FileLogService_default.write("INFO", String(message));
|
|
13334
13340
|
};
|
|
13341
|
+
this.flush = () => FileLogService_default.flush();
|
|
13335
13342
|
this.error = (error) => {
|
|
13336
13343
|
let message;
|
|
13337
13344
|
let stack;
|
|
@@ -13473,7 +13480,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
|
|
|
13473
13480
|
|
|
13474
13481
|
// ../../packages/constants/src/Constants.ts
|
|
13475
13482
|
var CONSTANTS = {
|
|
13476
|
-
cliVersion: "1.1.
|
|
13483
|
+
cliVersion: "1.1.10",
|
|
13477
13484
|
backendVersion: 1,
|
|
13478
13485
|
backendPort: 5088,
|
|
13479
13486
|
workerVersion: 2,
|
|
@@ -13842,9 +13849,10 @@ var ValidatorClass = class {
|
|
|
13842
13849
|
const validAggregations = ["sum", "count", "avg", "min", "max"];
|
|
13843
13850
|
if (pivot.aggregation && !validAggregations.includes(pivot.aggregation))
|
|
13844
13851
|
errors.push(`Invalid pivot aggregation "${pivot.aggregation}" in consumer "${consumer.name}". Valid values: ${validAggregations.join(", ")}`);
|
|
13852
|
+
const hasWildcardField = consumer.fields.some((x) => x.key === "*");
|
|
13845
13853
|
const allFieldKeys = consumer.fields.map((x) => x.alias ?? x.key);
|
|
13846
13854
|
const pivotFields = [...pivot.rowKeys ?? [], pivot.pivotColumn, pivot.valueColumn].filter(Boolean);
|
|
13847
|
-
const missingFields = pivotFields.filter((f) => !allFieldKeys.includes(f));
|
|
13855
|
+
const missingFields = hasWildcardField ? [] : pivotFields.filter((f) => !allFieldKeys.includes(f));
|
|
13848
13856
|
if (missingFields.length > 0)
|
|
13849
13857
|
errors.push(`Pivot references field(s) "${missingFields.join(", ")}" that are not present in the consumer "${consumer.name}".`);
|
|
13850
13858
|
}
|
|
@@ -20859,6 +20867,7 @@ var ExecutorOrchestratorClass = class {
|
|
|
20859
20867
|
finalResult.outputCount = postOperation.totalOutputCount;
|
|
20860
20868
|
UsageManager_default.endUsage(usageId, finalResult.outputCount, finalResult);
|
|
20861
20869
|
Logger_default.log(`[${usageId}] Consumer "${consumer.name}" completed: ${finalResult.outputCount} rows, ${finalResult.workerCount} worker(s), ${Math.round(finalResult.elapsedMS)}ms`);
|
|
20870
|
+
await Logger_default.flush();
|
|
20862
20871
|
return finalResult;
|
|
20863
20872
|
} catch (error) {
|
|
20864
20873
|
Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
|
|
@@ -20867,6 +20876,7 @@ var ExecutorOrchestratorClass = class {
|
|
|
20867
20876
|
Logger_default.log(`[${usageId}] Running cleanup after failure`);
|
|
20868
20877
|
await this.performCleanupOperations(scope, tracker);
|
|
20869
20878
|
UsageManager_default.failUsage(usageId, Helper_default.asError(error).message);
|
|
20879
|
+
await Logger_default.flush();
|
|
20870
20880
|
throw error;
|
|
20871
20881
|
}
|
|
20872
20882
|
};
|
|
@@ -20960,13 +20970,12 @@ var ExecutorOrchestratorClass = class {
|
|
|
20960
20970
|
if (executorResults.length > 1) {
|
|
20961
20971
|
Logger_default.log(`[${scope.id}] Merging ${executorResults.length} worker output files into ${mainPath}`);
|
|
20962
20972
|
const perf = performance.now();
|
|
20963
|
-
const output = import_fs14.default.createWriteStream(mainPath);
|
|
20964
|
-
output.setMaxListeners(executorResults.length + 1);
|
|
20965
20973
|
for (const workerResult of executorResults) {
|
|
20966
|
-
await (0, import_promises10.pipeline)(
|
|
20974
|
+
await (0, import_promises10.pipeline)(
|
|
20975
|
+
import_fs14.default.createReadStream(workerResult.resultUri),
|
|
20976
|
+
import_fs14.default.createWriteStream(mainPath, { flags: "a" })
|
|
20977
|
+
);
|
|
20967
20978
|
}
|
|
20968
|
-
output.end();
|
|
20969
|
-
output.close();
|
|
20970
20979
|
tracker.measure("merge-workers", performance.now() - perf);
|
|
20971
20980
|
Logger_default.log(`[${scope.id}] Merge complete in ${Math.round(performance.now() - perf)}ms`);
|
|
20972
20981
|
} else if (executorResults.length === 1) {
|
|
@@ -21123,15 +21132,18 @@ var run = async (consumerName, options) => {
|
|
|
21123
21132
|
return sum + (result.response?.elapsedMS || 0);
|
|
21124
21133
|
}, 0);
|
|
21125
21134
|
const totalsInfo = import_chalk6.default.gray(` (${totalRows} rows, ${Helper_default.formatDuration(totalDuration)})`);
|
|
21126
|
-
|
|
21135
|
+
const hasFailures = results.some((x) => !x.success);
|
|
21136
|
+
if (hasFailures)
|
|
21127
21137
|
console.log(import_chalk6.default.blueBright("\n\u2139\uFE0F Run completed with errors") + totalsInfo);
|
|
21128
21138
|
else
|
|
21129
21139
|
console.log(import_chalk6.default.green("\n\u2705 Run complete!") + totalsInfo);
|
|
21130
|
-
|
|
21140
|
+
await Logger_default.flush();
|
|
21141
|
+
process.exit(hasFailures ? 1 : 0);
|
|
21131
21142
|
} catch (err) {
|
|
21132
21143
|
const myErr = Helper_default.asError(err);
|
|
21133
21144
|
console.error(import_chalk6.default.red.bold("\n\u274C Unexpected error during run:"), myErr.message);
|
|
21134
21145
|
Logger_default.error(myErr);
|
|
21146
|
+
await Logger_default.flush();
|
|
21135
21147
|
process.exit(1);
|
|
21136
21148
|
}
|
|
21137
21149
|
};
|
|
@@ -21452,8 +21464,10 @@ var mock = async (producerName, records) => {
|
|
|
21452
21464
|
|
|
21453
21465
|
// src/index.ts
|
|
21454
21466
|
import_dotenv.default.configDotenv();
|
|
21455
|
-
if (process.env.NODE_ENV !== "development" && process.env.REMORA_DEBUG_MODE === "true")
|
|
21467
|
+
if (process.env.NODE_ENV !== "development" && process.env.REMORA_DEBUG_MODE === "true") {
|
|
21456
21468
|
Logger_default.enableFileLogging("./remora/logs");
|
|
21469
|
+
console.log(`Enabled file logger.`);
|
|
21470
|
+
}
|
|
21457
21471
|
if (!process.env.REMORA_WORKERS_PATH)
|
|
21458
21472
|
process.env.REMORA_WORKERS_PATH = "./workers";
|
|
21459
21473
|
var program = new import_commander.Command();
|
package/package.json
CHANGED
|
@@ -13253,6 +13253,13 @@ ${stack}` : base;
|
|
|
13253
13253
|
stack: extra
|
|
13254
13254
|
});
|
|
13255
13255
|
};
|
|
13256
|
+
this.flush = () => {
|
|
13257
|
+
if (!this._enabled || !this._logger) return Promise.resolve();
|
|
13258
|
+
return new Promise((resolve) => {
|
|
13259
|
+
this._logger.on("finish", resolve);
|
|
13260
|
+
this._logger.end();
|
|
13261
|
+
});
|
|
13262
|
+
};
|
|
13256
13263
|
}
|
|
13257
13264
|
};
|
|
13258
13265
|
var FileLogService = new FileLogServiceClass();
|
|
@@ -13303,7 +13310,6 @@ var Logger = class {
|
|
|
13303
13310
|
this._fileLoggingFolder = folder;
|
|
13304
13311
|
this._fileLoggingFile = file;
|
|
13305
13312
|
FileLogService_default.enable(folder, file);
|
|
13306
|
-
console.log(`Enabled file logger.`);
|
|
13307
13313
|
};
|
|
13308
13314
|
this.getConfig = () => ({
|
|
13309
13315
|
level: this._level,
|
|
@@ -13326,6 +13332,7 @@ var Logger = class {
|
|
|
13326
13332
|
console.info(message);
|
|
13327
13333
|
FileLogService_default.write("INFO", String(message));
|
|
13328
13334
|
};
|
|
13335
|
+
this.flush = () => FileLogService_default.flush();
|
|
13329
13336
|
this.error = (error) => {
|
|
13330
13337
|
let message;
|
|
13331
13338
|
let stack;
|
|
@@ -13467,7 +13474,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
|
|
|
13467
13474
|
|
|
13468
13475
|
// ../../packages/constants/src/Constants.ts
|
|
13469
13476
|
var CONSTANTS = {
|
|
13470
|
-
cliVersion: "1.1.
|
|
13477
|
+
cliVersion: "1.1.10",
|
|
13471
13478
|
backendVersion: 1,
|
|
13472
13479
|
backendPort: 5088,
|
|
13473
13480
|
workerVersion: 2,
|
|
@@ -13836,9 +13843,10 @@ var ValidatorClass = class {
|
|
|
13836
13843
|
const validAggregations = ["sum", "count", "avg", "min", "max"];
|
|
13837
13844
|
if (pivot.aggregation && !validAggregations.includes(pivot.aggregation))
|
|
13838
13845
|
errors.push(`Invalid pivot aggregation "${pivot.aggregation}" in consumer "${consumer.name}". Valid values: ${validAggregations.join(", ")}`);
|
|
13846
|
+
const hasWildcardField = consumer.fields.some((x) => x.key === "*");
|
|
13839
13847
|
const allFieldKeys = consumer.fields.map((x) => x.alias ?? x.key);
|
|
13840
13848
|
const pivotFields = [...pivot.rowKeys ?? [], pivot.pivotColumn, pivot.valueColumn].filter(Boolean);
|
|
13841
|
-
const missingFields = pivotFields.filter((f) => !allFieldKeys.includes(f));
|
|
13849
|
+
const missingFields = hasWildcardField ? [] : pivotFields.filter((f) => !allFieldKeys.includes(f));
|
|
13842
13850
|
if (missingFields.length > 0)
|
|
13843
13851
|
errors.push(`Pivot references field(s) "${missingFields.join(", ")}" that are not present in the consumer "${consumer.name}".`);
|
|
13844
13852
|
}
|
|
@@ -20618,6 +20626,7 @@ var ExecutorOrchestratorClass = class {
|
|
|
20618
20626
|
finalResult.outputCount = postOperation.totalOutputCount;
|
|
20619
20627
|
UsageManager_default.endUsage(usageId, finalResult.outputCount, finalResult);
|
|
20620
20628
|
Logger_default.log(`[${usageId}] Consumer "${consumer.name}" completed: ${finalResult.outputCount} rows, ${finalResult.workerCount} worker(s), ${Math.round(finalResult.elapsedMS)}ms`);
|
|
20629
|
+
await Logger_default.flush();
|
|
20621
20630
|
return finalResult;
|
|
20622
20631
|
} catch (error) {
|
|
20623
20632
|
Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
|
|
@@ -20626,6 +20635,7 @@ var ExecutorOrchestratorClass = class {
|
|
|
20626
20635
|
Logger_default.log(`[${usageId}] Running cleanup after failure`);
|
|
20627
20636
|
await this.performCleanupOperations(scope, tracker);
|
|
20628
20637
|
UsageManager_default.failUsage(usageId, Helper_default.asError(error).message);
|
|
20638
|
+
await Logger_default.flush();
|
|
20629
20639
|
throw error;
|
|
20630
20640
|
}
|
|
20631
20641
|
};
|
|
@@ -20719,13 +20729,12 @@ var ExecutorOrchestratorClass = class {
|
|
|
20719
20729
|
if (executorResults.length > 1) {
|
|
20720
20730
|
Logger_default.log(`[${scope.id}] Merging ${executorResults.length} worker output files into ${mainPath}`);
|
|
20721
20731
|
const perf = performance.now();
|
|
20722
|
-
const output = import_fs13.default.createWriteStream(mainPath);
|
|
20723
|
-
output.setMaxListeners(executorResults.length + 1);
|
|
20724
20732
|
for (const workerResult of executorResults) {
|
|
20725
|
-
await (0, import_promises10.pipeline)(
|
|
20733
|
+
await (0, import_promises10.pipeline)(
|
|
20734
|
+
import_fs13.default.createReadStream(workerResult.resultUri),
|
|
20735
|
+
import_fs13.default.createWriteStream(mainPath, { flags: "a" })
|
|
20736
|
+
);
|
|
20726
20737
|
}
|
|
20727
|
-
output.end();
|
|
20728
|
-
output.close();
|
|
20729
20738
|
tracker.measure("merge-workers", performance.now() - perf);
|
|
20730
20739
|
Logger_default.log(`[${scope.id}] Merge complete in ${Math.round(performance.now() - perf)}ms`);
|
|
20731
20740
|
} else if (executorResults.length === 1) {
|