@forzalabs/remora 1.1.13 → 1.1.15
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 +71 -28
- package/package.json +1 -1
- package/workers/ExecutorWorker.js +71 -28
package/index.js
CHANGED
|
@@ -13500,7 +13500,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
|
|
|
13500
13500
|
|
|
13501
13501
|
// ../../packages/constants/src/Constants.ts
|
|
13502
13502
|
var CONSTANTS = {
|
|
13503
|
-
cliVersion: "1.1.
|
|
13503
|
+
cliVersion: "1.1.15",
|
|
13504
13504
|
backendVersion: 1,
|
|
13505
13505
|
backendPort: 5088,
|
|
13506
13506
|
workerVersion: 2,
|
|
@@ -13791,6 +13791,10 @@ var ValidatorClass = class {
|
|
|
13791
13791
|
try {
|
|
13792
13792
|
const recursionErrors = this.detectConsumerRecursion(consumer);
|
|
13793
13793
|
errors.push(...recursionErrors);
|
|
13794
|
+
for (const [i, field] of consumer.fields.entries()) {
|
|
13795
|
+
if (!field.key)
|
|
13796
|
+
errors.push(`Field at index ${i} in consumer "${consumer.name}" is missing the required "key" property`);
|
|
13797
|
+
}
|
|
13794
13798
|
const allFieldsWithNoFrom = consumer.fields.filter((x) => x.key === "*" && !x.from);
|
|
13795
13799
|
if (allFieldsWithNoFrom.length > 0 && consumer.producers.length > 1)
|
|
13796
13800
|
errors.push(`Field with key "*" was used without specifying the "from" producer and multiple producers were found.`);
|
|
@@ -18911,18 +18915,31 @@ var ConsumerExecutorClass = class {
|
|
|
18911
18915
|
for (const field of fields) {
|
|
18912
18916
|
const { cField } = field;
|
|
18913
18917
|
const fieldKey = cField.alias ?? cField.key;
|
|
18914
|
-
|
|
18915
|
-
|
|
18916
|
-
|
|
18917
|
-
|
|
18918
|
-
|
|
18919
|
-
|
|
18920
|
-
|
|
18921
|
-
|
|
18918
|
+
let dimension;
|
|
18919
|
+
try {
|
|
18920
|
+
dimension = dimensions.find((x) => x.name === cField.key);
|
|
18921
|
+
if (!dimension) {
|
|
18922
|
+
if (cField.fixed && Algo_default.hasVal(cField.default))
|
|
18923
|
+
record[fieldKey] = cField.default;
|
|
18924
|
+
else if (cField.copyFrom)
|
|
18925
|
+
record[fieldKey] = record[cField.copyFrom];
|
|
18926
|
+
else
|
|
18927
|
+
throw new Error(`The requested field "${cField.key}" from the consumer is not present in the underlying producer "${producer.name}" (${dimensions.map((x) => x.name).join(", ")})`);
|
|
18928
|
+
}
|
|
18929
|
+
} catch (error) {
|
|
18930
|
+
const err = new Error(`Resolving dimension for field "${fieldKey}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18931
|
+
Logger_default.error(err);
|
|
18932
|
+
throw err;
|
|
18922
18933
|
}
|
|
18923
|
-
|
|
18924
|
-
|
|
18925
|
-
|
|
18934
|
+
try {
|
|
18935
|
+
if (cField.alias && dimension && cField.alias !== dimension.name) {
|
|
18936
|
+
record[cField.alias] = record[dimension.name];
|
|
18937
|
+
delete record[dimension.name];
|
|
18938
|
+
}
|
|
18939
|
+
} catch (error) {
|
|
18940
|
+
const err = new Error(`Aliasing field "${cField.key}" to "${cField.alias}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18941
|
+
Logger_default.error(err);
|
|
18942
|
+
throw err;
|
|
18926
18943
|
}
|
|
18927
18944
|
}
|
|
18928
18945
|
for (const field of fields) {
|
|
@@ -18941,28 +18958,51 @@ var ConsumerExecutorClass = class {
|
|
|
18941
18958
|
case "skip":
|
|
18942
18959
|
continue;
|
|
18943
18960
|
case "fail":
|
|
18944
|
-
default:
|
|
18945
|
-
|
|
18961
|
+
default: {
|
|
18962
|
+
const err = new Error(errorMessage, { cause: error });
|
|
18963
|
+
Logger_default.error(err);
|
|
18964
|
+
throw err;
|
|
18965
|
+
}
|
|
18946
18966
|
}
|
|
18947
18967
|
} else {
|
|
18948
|
-
|
|
18968
|
+
const err = new Error(errorMessage, { cause: error });
|
|
18969
|
+
Logger_default.error(err);
|
|
18970
|
+
throw err;
|
|
18949
18971
|
}
|
|
18950
18972
|
}
|
|
18951
18973
|
}
|
|
18952
|
-
|
|
18953
|
-
const
|
|
18954
|
-
|
|
18955
|
-
|
|
18974
|
+
try {
|
|
18975
|
+
for (const dimension of dimensions) {
|
|
18976
|
+
const field = fields.find((x) => x.cField.key === dimension.name);
|
|
18977
|
+
if (!field)
|
|
18978
|
+
delete record[dimension.name];
|
|
18979
|
+
}
|
|
18980
|
+
} catch (error) {
|
|
18981
|
+
const err = new Error(`Removing unmapped dimensions failed for producer "${producer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18982
|
+
Logger_default.error(err);
|
|
18983
|
+
throw err;
|
|
18956
18984
|
}
|
|
18957
|
-
|
|
18958
|
-
|
|
18959
|
-
|
|
18960
|
-
|
|
18985
|
+
try {
|
|
18986
|
+
if (consumer.filters && consumer.filters.length > 0) {
|
|
18987
|
+
const isKept = consumer.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x.rule));
|
|
18988
|
+
if (!isKept)
|
|
18989
|
+
return null;
|
|
18990
|
+
}
|
|
18991
|
+
} catch (error) {
|
|
18992
|
+
const err = new Error(`Consumer filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18993
|
+
Logger_default.error(err);
|
|
18994
|
+
throw err;
|
|
18961
18995
|
}
|
|
18962
|
-
|
|
18963
|
-
|
|
18964
|
-
|
|
18965
|
-
|
|
18996
|
+
try {
|
|
18997
|
+
if (requestOptions && requestOptions.filters) {
|
|
18998
|
+
const isKept = requestOptions.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x));
|
|
18999
|
+
if (!isKept)
|
|
19000
|
+
return null;
|
|
19001
|
+
}
|
|
19002
|
+
} catch (error) {
|
|
19003
|
+
const err = new Error(`Request filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
19004
|
+
Logger_default.error(err);
|
|
19005
|
+
throw err;
|
|
18966
19006
|
}
|
|
18967
19007
|
return record;
|
|
18968
19008
|
};
|
|
@@ -19479,6 +19519,9 @@ var ExecutorOrchestratorClass = class {
|
|
|
19479
19519
|
Logger_default.log(`[${usageId}] Spawning worker ${workerId} for producer "${prod.name}" \u2014 chunk ${chunk.start}-${chunk.end} (${Math.round((chunk.end - chunk.start) / 1024)}KB)`);
|
|
19480
19520
|
workerThreads.push(pool.exec("executor", [workerData], {
|
|
19481
19521
|
on: (payload) => this.onWorkAdvanced(payload, currentWorkerIndex, _progress)
|
|
19522
|
+
}).catch((error) => {
|
|
19523
|
+
Logger_default.error(error);
|
|
19524
|
+
return null;
|
|
19482
19525
|
}));
|
|
19483
19526
|
}
|
|
19484
19527
|
Logger_default.log(`[${usageId}] Waiting for ${workerThreads.length} worker(s) to complete`);
|
|
@@ -19544,7 +19587,7 @@ var ExecutorOrchestratorClass = class {
|
|
|
19544
19587
|
return finalResult;
|
|
19545
19588
|
} catch (error) {
|
|
19546
19589
|
Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
|
|
19547
|
-
Logger_default.error(
|
|
19590
|
+
Logger_default.error(error);
|
|
19548
19591
|
await pool.terminate();
|
|
19549
19592
|
await ConsumerOnFinishManager_default.onConsumerError(consumer, usageId);
|
|
19550
19593
|
Logger_default.log(`[${usageId}] Running cleanup after failure`);
|
package/package.json
CHANGED
|
@@ -13494,7 +13494,7 @@ var import_promises = __toESM(require("fs/promises"), 1);
|
|
|
13494
13494
|
|
|
13495
13495
|
// ../../packages/constants/src/Constants.ts
|
|
13496
13496
|
var CONSTANTS = {
|
|
13497
|
-
cliVersion: "1.1.
|
|
13497
|
+
cliVersion: "1.1.15",
|
|
13498
13498
|
backendVersion: 1,
|
|
13499
13499
|
backendPort: 5088,
|
|
13500
13500
|
workerVersion: 2,
|
|
@@ -13785,6 +13785,10 @@ var ValidatorClass = class {
|
|
|
13785
13785
|
try {
|
|
13786
13786
|
const recursionErrors = this.detectConsumerRecursion(consumer);
|
|
13787
13787
|
errors.push(...recursionErrors);
|
|
13788
|
+
for (const [i, field] of consumer.fields.entries()) {
|
|
13789
|
+
if (!field.key)
|
|
13790
|
+
errors.push(`Field at index ${i} in consumer "${consumer.name}" is missing the required "key" property`);
|
|
13791
|
+
}
|
|
13788
13792
|
const allFieldsWithNoFrom = consumer.fields.filter((x) => x.key === "*" && !x.from);
|
|
13789
13793
|
if (allFieldsWithNoFrom.length > 0 && consumer.producers.length > 1)
|
|
13790
13794
|
errors.push(`Field with key "*" was used without specifying the "from" producer and multiple producers were found.`);
|
|
@@ -18510,18 +18514,31 @@ var ConsumerExecutorClass = class {
|
|
|
18510
18514
|
for (const field of fields) {
|
|
18511
18515
|
const { cField } = field;
|
|
18512
18516
|
const fieldKey = cField.alias ?? cField.key;
|
|
18513
|
-
|
|
18514
|
-
|
|
18515
|
-
|
|
18516
|
-
|
|
18517
|
-
|
|
18518
|
-
|
|
18519
|
-
|
|
18520
|
-
|
|
18517
|
+
let dimension;
|
|
18518
|
+
try {
|
|
18519
|
+
dimension = dimensions.find((x) => x.name === cField.key);
|
|
18520
|
+
if (!dimension) {
|
|
18521
|
+
if (cField.fixed && Algo_default.hasVal(cField.default))
|
|
18522
|
+
record[fieldKey] = cField.default;
|
|
18523
|
+
else if (cField.copyFrom)
|
|
18524
|
+
record[fieldKey] = record[cField.copyFrom];
|
|
18525
|
+
else
|
|
18526
|
+
throw new Error(`The requested field "${cField.key}" from the consumer is not present in the underlying producer "${producer.name}" (${dimensions.map((x) => x.name).join(", ")})`);
|
|
18527
|
+
}
|
|
18528
|
+
} catch (error) {
|
|
18529
|
+
const err = new Error(`Resolving dimension for field "${fieldKey}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18530
|
+
Logger_default.error(err);
|
|
18531
|
+
throw err;
|
|
18521
18532
|
}
|
|
18522
|
-
|
|
18523
|
-
|
|
18524
|
-
|
|
18533
|
+
try {
|
|
18534
|
+
if (cField.alias && dimension && cField.alias !== dimension.name) {
|
|
18535
|
+
record[cField.alias] = record[dimension.name];
|
|
18536
|
+
delete record[dimension.name];
|
|
18537
|
+
}
|
|
18538
|
+
} catch (error) {
|
|
18539
|
+
const err = new Error(`Aliasing field "${cField.key}" to "${cField.alias}" of producer "${producer.name}" failed (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18540
|
+
Logger_default.error(err);
|
|
18541
|
+
throw err;
|
|
18525
18542
|
}
|
|
18526
18543
|
}
|
|
18527
18544
|
for (const field of fields) {
|
|
@@ -18540,28 +18557,51 @@ var ConsumerExecutorClass = class {
|
|
|
18540
18557
|
case "skip":
|
|
18541
18558
|
continue;
|
|
18542
18559
|
case "fail":
|
|
18543
|
-
default:
|
|
18544
|
-
|
|
18560
|
+
default: {
|
|
18561
|
+
const err = new Error(errorMessage, { cause: error });
|
|
18562
|
+
Logger_default.error(err);
|
|
18563
|
+
throw err;
|
|
18564
|
+
}
|
|
18545
18565
|
}
|
|
18546
18566
|
} else {
|
|
18547
|
-
|
|
18567
|
+
const err = new Error(errorMessage, { cause: error });
|
|
18568
|
+
Logger_default.error(err);
|
|
18569
|
+
throw err;
|
|
18548
18570
|
}
|
|
18549
18571
|
}
|
|
18550
18572
|
}
|
|
18551
|
-
|
|
18552
|
-
const
|
|
18553
|
-
|
|
18554
|
-
|
|
18573
|
+
try {
|
|
18574
|
+
for (const dimension of dimensions) {
|
|
18575
|
+
const field = fields.find((x) => x.cField.key === dimension.name);
|
|
18576
|
+
if (!field)
|
|
18577
|
+
delete record[dimension.name];
|
|
18578
|
+
}
|
|
18579
|
+
} catch (error) {
|
|
18580
|
+
const err = new Error(`Removing unmapped dimensions failed for producer "${producer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18581
|
+
Logger_default.error(err);
|
|
18582
|
+
throw err;
|
|
18555
18583
|
}
|
|
18556
|
-
|
|
18557
|
-
|
|
18558
|
-
|
|
18559
|
-
|
|
18584
|
+
try {
|
|
18585
|
+
if (consumer.filters && consumer.filters.length > 0) {
|
|
18586
|
+
const isKept = consumer.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x.rule));
|
|
18587
|
+
if (!isKept)
|
|
18588
|
+
return null;
|
|
18589
|
+
}
|
|
18590
|
+
} catch (error) {
|
|
18591
|
+
const err = new Error(`Consumer filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18592
|
+
Logger_default.error(err);
|
|
18593
|
+
throw err;
|
|
18560
18594
|
}
|
|
18561
|
-
|
|
18562
|
-
|
|
18563
|
-
|
|
18564
|
-
|
|
18595
|
+
try {
|
|
18596
|
+
if (requestOptions && requestOptions.filters) {
|
|
18597
|
+
const isKept = requestOptions.filters.every((x) => RequestExecutor_default.evaluateFilter(record, x));
|
|
18598
|
+
if (!isKept)
|
|
18599
|
+
return null;
|
|
18600
|
+
}
|
|
18601
|
+
} catch (error) {
|
|
18602
|
+
const err = new Error(`Request filter evaluation failed for consumer "${consumer.name}" (index: ${recordIndex}): ${error.message}`, { cause: error });
|
|
18603
|
+
Logger_default.error(err);
|
|
18604
|
+
throw err;
|
|
18565
18605
|
}
|
|
18566
18606
|
return record;
|
|
18567
18607
|
};
|
|
@@ -19238,6 +19278,9 @@ var ExecutorOrchestratorClass = class {
|
|
|
19238
19278
|
Logger_default.log(`[${usageId}] Spawning worker ${workerId} for producer "${prod.name}" \u2014 chunk ${chunk.start}-${chunk.end} (${Math.round((chunk.end - chunk.start) / 1024)}KB)`);
|
|
19239
19279
|
workerThreads.push(pool.exec("executor", [workerData], {
|
|
19240
19280
|
on: (payload) => this.onWorkAdvanced(payload, currentWorkerIndex, _progress)
|
|
19281
|
+
}).catch((error) => {
|
|
19282
|
+
Logger_default.error(error);
|
|
19283
|
+
return null;
|
|
19241
19284
|
}));
|
|
19242
19285
|
}
|
|
19243
19286
|
Logger_default.log(`[${usageId}] Waiting for ${workerThreads.length} worker(s) to complete`);
|
|
@@ -19303,7 +19346,7 @@ var ExecutorOrchestratorClass = class {
|
|
|
19303
19346
|
return finalResult;
|
|
19304
19347
|
} catch (error) {
|
|
19305
19348
|
Logger_default.log(`[${usageId}] Consumer "${consumer.name}" failed: ${Helper_default.asError(error).message}`);
|
|
19306
|
-
Logger_default.error(
|
|
19349
|
+
Logger_default.error(error);
|
|
19307
19350
|
await pool.terminate();
|
|
19308
19351
|
await ConsumerOnFinishManager_default.onConsumerError(consumer, usageId);
|
|
19309
19352
|
Logger_default.log(`[${usageId}] Running cleanup after failure`);
|