@twin.org/engine-core 0.0.1-next.1 → 0.0.1-next.11
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/dist/cjs/index.cjs +591 -32
- package/dist/esm/index.mjs +592 -35
- package/dist/types/engineCore.d.ts +4 -4
- package/dist/types/index.d.ts +3 -0
- package/dist/types/models/IEngineCoreEnvironmentVariables.d.ts +265 -0
- package/dist/types/storage/fileStateStorage.d.ts +3 -3
- package/dist/types/storage/memoryStateStorage.d.ts +3 -3
- package/dist/types/utils/engineCoreEnvBuilder.d.ts +8 -0
- package/dist/types/utils/envHelper.d.ts +15 -0
- package/docs/changelog.md +1 -1
- package/docs/reference/classes/EngineCore.md +13 -9
- package/docs/reference/classes/EnvHelper.md +41 -0
- package/docs/reference/classes/FileStateStorage.md +13 -9
- package/docs/reference/classes/MemoryStateStorage.md +13 -9
- package/docs/reference/functions/buildEngineCoreConfiguration.md +17 -0
- package/docs/reference/functions/initialiseEntityStorageConnector.md +2 -2
- package/docs/reference/index.md +3 -0
- package/docs/reference/interfaces/IEngineCoreEnvironmentVariables.md +523 -0
- package/docs/reference/interfaces/IEngineCoreOptions.md +3 -3
- package/package.json +2 -2
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var path = require('node:path');
|
|
3
4
|
var core = require('@twin.org/core');
|
|
4
5
|
var engineModels = require('@twin.org/engine-models');
|
|
5
6
|
var entityStorageConnectorCosmosdb = require('@twin.org/entity-storage-connector-cosmosdb');
|
|
@@ -103,7 +104,11 @@ function initialiseEntityStorageConnector(engineCore, context, typeCustom, schem
|
|
|
103
104
|
else if (type === engineModels.EntityStorageConnectorType.File) {
|
|
104
105
|
entityStorageConnector = new entityStorageConnectorFile.FileEntityStorageConnector({
|
|
105
106
|
entitySchema: schema,
|
|
106
|
-
...entityStorageConfig.options
|
|
107
|
+
...entityStorageConfig.options,
|
|
108
|
+
config: {
|
|
109
|
+
...entityStorageConfig.options.config,
|
|
110
|
+
directory: path.join(entityStorageConfig.options.config.directory, instanceName)
|
|
111
|
+
}
|
|
107
112
|
});
|
|
108
113
|
}
|
|
109
114
|
else if (type === engineModels.EntityStorageConnectorType.AwsDynamoDb) {
|
|
@@ -436,7 +441,9 @@ function initialiseBlobStorageConnector(engineCore, context, instanceConfig, ove
|
|
|
436
441
|
...instanceConfig.options,
|
|
437
442
|
config: {
|
|
438
443
|
...instanceConfig.options.config,
|
|
439
|
-
directory:
|
|
444
|
+
directory: core.Is.stringValue(instanceConfig.options.storagePrefix)
|
|
445
|
+
? path.join(instanceConfig.options.config.directory, instanceConfig.options.storagePrefix)
|
|
446
|
+
: instanceConfig.options.config.directory
|
|
440
447
|
}
|
|
441
448
|
});
|
|
442
449
|
instanceType = blobStorageConnectorFile.FileBlobStorageConnector.NAMESPACE;
|
|
@@ -598,6 +605,7 @@ function initialiseIdentityConnector(engineCore, context, instanceConfig, overri
|
|
|
598
605
|
if (type === engineModels.IdentityConnectorType.Iota) {
|
|
599
606
|
const dltConfig = context.config.dltConfig?.find(dlt => dlt.type === context.defaultTypes.dltConfig);
|
|
600
607
|
connector = new identityConnectorIota.IotaIdentityConnector({
|
|
608
|
+
vaultConnectorType: context.defaultTypes.vaultConnector,
|
|
601
609
|
...instanceConfig.options,
|
|
602
610
|
config: {
|
|
603
611
|
...dltConfig?.options?.config,
|
|
@@ -800,6 +808,7 @@ function initialiseImmutableStorageConnector(engineCore, context, instanceConfig
|
|
|
800
808
|
if (type === engineModels.ImmutableStorageConnectorType.Iota) {
|
|
801
809
|
const dltConfig = context.config.dltConfig?.find(dlt => dlt.type === context.defaultTypes.dltConfig);
|
|
802
810
|
connector = new immutableStorageConnectorIota.IotaImmutableStorageConnector({
|
|
811
|
+
vaultConnectorType: context.defaultTypes.vaultConnector,
|
|
803
812
|
...instanceConfig.options,
|
|
804
813
|
config: {
|
|
805
814
|
...dltConfig?.options?.config,
|
|
@@ -933,6 +942,7 @@ function initialiseNftConnector(engineCore, context, instanceConfig, overrideIns
|
|
|
933
942
|
}
|
|
934
943
|
else if (type === engineModels.NftConnectorType.Iota) {
|
|
935
944
|
connector = new nftConnectorIota.IotaNftConnector({
|
|
945
|
+
vaultConnectorType: context.defaultTypes.vaultConnector,
|
|
936
946
|
...instanceConfig.options
|
|
937
947
|
});
|
|
938
948
|
instanceType = nftConnectorIota.IotaNftConnector.NAMESPACE;
|
|
@@ -1122,6 +1132,8 @@ function initialiseWalletConnector(engineCore, context, instanceConfig, override
|
|
|
1122
1132
|
if (type === engineModels.WalletConnectorType.Iota) {
|
|
1123
1133
|
const dltConfig = context.config.dltConfig?.find(dlt => dlt.type === context.defaultTypes.dltConfig);
|
|
1124
1134
|
connector = new walletConnectorIota.IotaWalletConnector({
|
|
1135
|
+
vaultConnectorType: context.defaultTypes.vaultConnector,
|
|
1136
|
+
faucetConnectorType: context.defaultTypes.faucetConnector,
|
|
1125
1137
|
...instanceConfig.options,
|
|
1126
1138
|
config: {
|
|
1127
1139
|
...dltConfig?.options?.config,
|
|
@@ -1216,6 +1228,11 @@ class EngineCore {
|
|
|
1216
1228
|
* @internal
|
|
1217
1229
|
*/
|
|
1218
1230
|
_typeInitialisers;
|
|
1231
|
+
/**
|
|
1232
|
+
* Is the engine started.
|
|
1233
|
+
* @internal
|
|
1234
|
+
*/
|
|
1235
|
+
_isStarted;
|
|
1219
1236
|
/**
|
|
1220
1237
|
* Method for bootstrapping any data for the engine.
|
|
1221
1238
|
* @internal
|
|
@@ -1241,6 +1258,7 @@ class EngineCore {
|
|
|
1241
1258
|
stateDirty: false
|
|
1242
1259
|
};
|
|
1243
1260
|
this._stateStorage = options.stateStorage;
|
|
1261
|
+
this._isStarted = false;
|
|
1244
1262
|
this.addCoreTypeInitialisers();
|
|
1245
1263
|
}
|
|
1246
1264
|
/**
|
|
@@ -1260,19 +1278,23 @@ class EngineCore {
|
|
|
1260
1278
|
}
|
|
1261
1279
|
/**
|
|
1262
1280
|
* Start the engine core.
|
|
1263
|
-
* @returns
|
|
1281
|
+
* @returns True if the start was successful.
|
|
1264
1282
|
*/
|
|
1265
1283
|
async start() {
|
|
1284
|
+
if (this._isStarted) {
|
|
1285
|
+
return false;
|
|
1286
|
+
}
|
|
1266
1287
|
this.setupEngineLogger();
|
|
1267
1288
|
this.logInfo(core.I18n.formatMessage("engineCore.starting"));
|
|
1268
1289
|
if (this._context.config.debug) {
|
|
1269
1290
|
this.logInfo(core.I18n.formatMessage("engineCore.debuggingEnabled"));
|
|
1270
1291
|
}
|
|
1271
|
-
|
|
1292
|
+
let canContinue = await this.stateLoad();
|
|
1293
|
+
if (canContinue) {
|
|
1272
1294
|
for (const { type, typeConfig, initialiser } of this._typeInitialisers) {
|
|
1273
1295
|
this.initialiseTypeConfig(type, typeConfig, initialiser);
|
|
1274
1296
|
}
|
|
1275
|
-
|
|
1297
|
+
canContinue = await this.bootstrap();
|
|
1276
1298
|
if (canContinue) {
|
|
1277
1299
|
this.logInfo(core.I18n.formatMessage("engineCore.componentsStarting"));
|
|
1278
1300
|
for (const instance of this._context.componentInstances) {
|
|
@@ -1284,7 +1306,11 @@ class EngineCore {
|
|
|
1284
1306
|
this.logInfo(core.I18n.formatMessage("engineCore.componentsComplete"));
|
|
1285
1307
|
}
|
|
1286
1308
|
}
|
|
1287
|
-
|
|
1309
|
+
if (canContinue) {
|
|
1310
|
+
this.logInfo(core.I18n.formatMessage("engineCore.started"));
|
|
1311
|
+
this._isStarted = true;
|
|
1312
|
+
}
|
|
1313
|
+
return canContinue;
|
|
1288
1314
|
}
|
|
1289
1315
|
/**
|
|
1290
1316
|
* Stop the engine core.
|
|
@@ -1407,9 +1433,9 @@ class EngineCore {
|
|
|
1407
1433
|
async stateLoad() {
|
|
1408
1434
|
if (this._stateStorage) {
|
|
1409
1435
|
try {
|
|
1410
|
-
this._context.state = (await this._stateStorage.load(this)) ?? {
|
|
1436
|
+
this._context.state = ((await this._stateStorage.load(this)) ?? {
|
|
1411
1437
|
bootstrappedComponents: []
|
|
1412
|
-
};
|
|
1438
|
+
});
|
|
1413
1439
|
this._context.state.bootstrappedComponents ??= [];
|
|
1414
1440
|
this._context.stateDirty = false;
|
|
1415
1441
|
return true;
|
|
@@ -1423,6 +1449,7 @@ class EngineCore {
|
|
|
1423
1449
|
}
|
|
1424
1450
|
/**
|
|
1425
1451
|
* Save the state.
|
|
1452
|
+
* @returns True if the state was saved.
|
|
1426
1453
|
* @internal
|
|
1427
1454
|
*/
|
|
1428
1455
|
async stateSave() {
|
|
@@ -1430,11 +1457,14 @@ class EngineCore {
|
|
|
1430
1457
|
try {
|
|
1431
1458
|
await this._stateStorage.save(this, this._context.state);
|
|
1432
1459
|
this._context.stateDirty = false;
|
|
1460
|
+
return true;
|
|
1433
1461
|
}
|
|
1434
1462
|
catch (err) {
|
|
1435
1463
|
this.logError(core.BaseError.fromError(err));
|
|
1436
1464
|
}
|
|
1465
|
+
return false;
|
|
1437
1466
|
}
|
|
1467
|
+
return true;
|
|
1438
1468
|
}
|
|
1439
1469
|
/**
|
|
1440
1470
|
* Bootstrap the engine.
|
|
@@ -1447,31 +1477,29 @@ class EngineCore {
|
|
|
1447
1477
|
this.logInfo(core.I18n.formatMessage("engineCore.bootstrapStarted"));
|
|
1448
1478
|
try {
|
|
1449
1479
|
// First bootstrap the components.
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
});
|
|
1464
|
-
}
|
|
1465
|
-
// Otherwise add the component to the bootstrapped list and set the state as dirty
|
|
1466
|
-
this._context.state.bootstrappedComponents.push(bootstrapName);
|
|
1467
|
-
this._context.stateDirty = true;
|
|
1480
|
+
for (const instance of this._context.componentInstances) {
|
|
1481
|
+
if (core.Is.function(instance.component.bootstrap)) {
|
|
1482
|
+
const bootstrapName = `${instance.component.CLASS_NAME}-${instance.instanceType}`;
|
|
1483
|
+
if (!this._context.state.bootstrappedComponents.includes(bootstrapName)) {
|
|
1484
|
+
this.logInfo(core.I18n.formatMessage("engineCore.bootstrapping", {
|
|
1485
|
+
element: bootstrapName
|
|
1486
|
+
}));
|
|
1487
|
+
const bootstrapSuccess = await instance.component.bootstrap(EngineCore.LOGGER_TYPE_NAME);
|
|
1488
|
+
// If the bootstrap method failed then throw an error
|
|
1489
|
+
if (!bootstrapSuccess) {
|
|
1490
|
+
throw new core.GeneralError(this.CLASS_NAME, "bootstrapFailed", {
|
|
1491
|
+
component: `${instance.component.CLASS_NAME}:${instance.instanceType}`
|
|
1492
|
+
});
|
|
1468
1493
|
}
|
|
1494
|
+
// Otherwise add the component to the bootstrapped list and set the state as dirty
|
|
1495
|
+
this._context.state.bootstrappedComponents.push(bootstrapName);
|
|
1496
|
+
this._context.stateDirty = true;
|
|
1469
1497
|
}
|
|
1470
1498
|
}
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
|
|
1499
|
+
}
|
|
1500
|
+
// Now perform any custom bootstrap operations
|
|
1501
|
+
if (canContinue && core.Is.function(this._customBootstrap)) {
|
|
1502
|
+
await this._customBootstrap(this, this._context);
|
|
1475
1503
|
}
|
|
1476
1504
|
}
|
|
1477
1505
|
catch (err) {
|
|
@@ -1479,7 +1507,7 @@ class EngineCore {
|
|
|
1479
1507
|
this.logError(core.BaseError.fromError(err));
|
|
1480
1508
|
}
|
|
1481
1509
|
finally {
|
|
1482
|
-
await this.stateSave();
|
|
1510
|
+
canContinue = await this.stateSave();
|
|
1483
1511
|
if (canContinue) {
|
|
1484
1512
|
this.logInfo(core.I18n.formatMessage("engineCore.bootstrapComplete"));
|
|
1485
1513
|
}
|
|
@@ -1580,7 +1608,11 @@ class FileStateStorage {
|
|
|
1580
1608
|
engineCore.logInfo(core.I18n.formatMessage(`${core.StringHelper.camelCase(this.CLASS_NAME)}.saving`, {
|
|
1581
1609
|
filename: this._filename
|
|
1582
1610
|
}));
|
|
1583
|
-
|
|
1611
|
+
try {
|
|
1612
|
+
await promises.mkdir(path.dirname(this._filename), { recursive: true });
|
|
1613
|
+
}
|
|
1614
|
+
catch { }
|
|
1615
|
+
await promises.writeFile(this._filename, JSON.stringify(state, undefined, "\t"), "utf8");
|
|
1584
1616
|
}
|
|
1585
1617
|
catch (err) {
|
|
1586
1618
|
throw new core.GeneralError(this.CLASS_NAME, "savingError", { filename: this._filename }, core.BaseError.fromError(err));
|
|
@@ -1656,7 +1688,534 @@ class MemoryStateStorage {
|
|
|
1656
1688
|
}
|
|
1657
1689
|
}
|
|
1658
1690
|
|
|
1691
|
+
// Copyright 2024 IOTA Stiftung.
|
|
1692
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
1693
|
+
/**
|
|
1694
|
+
* Build the engine core configuration from environment variables.
|
|
1695
|
+
* @param envVars The environment variables.
|
|
1696
|
+
* @returns The config for the core.
|
|
1697
|
+
*/
|
|
1698
|
+
function buildEngineCoreConfiguration(envVars) {
|
|
1699
|
+
envVars.stateFilename ??= "engine-state.json";
|
|
1700
|
+
envVars.storageFileRoot = path.resolve(envVars.storageFileRoot);
|
|
1701
|
+
envVars.stateFilename = path.join(envVars.storageFileRoot, envVars.stateFilename);
|
|
1702
|
+
envVars.attestationAssertionMethodId ??= "attestation-assertion";
|
|
1703
|
+
envVars.immutableProofHashKeyId ??= "immutable-proof-hash";
|
|
1704
|
+
envVars.immutableProofAssertionMethodId ??= "immutable-proof-assertion";
|
|
1705
|
+
envVars.blobStorageEnableEncryption ??= "false";
|
|
1706
|
+
envVars.blobStorageEncryptionKey ??= "blob-encryption";
|
|
1707
|
+
const coreConfig = {
|
|
1708
|
+
debug: core.Coerce.boolean(envVars.debug) ?? false,
|
|
1709
|
+
loggingConnector: [],
|
|
1710
|
+
loggingComponent: [{ type: engineModels.LoggingComponentType.Service }],
|
|
1711
|
+
entityStorageConnector: [],
|
|
1712
|
+
blobStorageConnector: [],
|
|
1713
|
+
blobStorageComponent: [
|
|
1714
|
+
{
|
|
1715
|
+
type: engineModels.BlobStorageComponentType.Service,
|
|
1716
|
+
options: {
|
|
1717
|
+
config: {
|
|
1718
|
+
vaultKeyId: envVars.blobStorageEncryptionKey
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
}
|
|
1722
|
+
],
|
|
1723
|
+
backgroundTaskConnector: [],
|
|
1724
|
+
telemetryConnector: [],
|
|
1725
|
+
telemetryComponent: [{ type: engineModels.TelemetryComponentType.Service }],
|
|
1726
|
+
vaultConnector: [],
|
|
1727
|
+
walletConnector: [],
|
|
1728
|
+
faucetConnector: [],
|
|
1729
|
+
immutableStorageConnector: [],
|
|
1730
|
+
nftConnector: [],
|
|
1731
|
+
nftComponent: [{ type: engineModels.NftComponentType.Service }],
|
|
1732
|
+
identityConnector: [],
|
|
1733
|
+
identityComponent: [{ type: engineModels.IdentityComponentType.Service }],
|
|
1734
|
+
identityProfileConnector: [],
|
|
1735
|
+
identityProfileComponent: [{ type: engineModels.IdentityProfileComponentType.Service }],
|
|
1736
|
+
immutableProofComponent: [
|
|
1737
|
+
{
|
|
1738
|
+
type: engineModels.ImmutableProofComponentType.Service,
|
|
1739
|
+
options: {
|
|
1740
|
+
config: {
|
|
1741
|
+
assertionMethodId: envVars.immutableProofAssertionMethodId,
|
|
1742
|
+
proofHashKeyId: envVars.immutableProofHashKeyId
|
|
1743
|
+
}
|
|
1744
|
+
}
|
|
1745
|
+
}
|
|
1746
|
+
],
|
|
1747
|
+
attestationConnector: [],
|
|
1748
|
+
attestationComponent: [
|
|
1749
|
+
{
|
|
1750
|
+
type: engineModels.AttestationComponentType.Service
|
|
1751
|
+
}
|
|
1752
|
+
],
|
|
1753
|
+
auditableItemGraphComponent: [{ type: engineModels.AuditableItemGraphComponentType.Service }],
|
|
1754
|
+
auditableItemStreamComponent: [{ type: engineModels.AuditableItemStreamComponentType.Service }]
|
|
1755
|
+
};
|
|
1756
|
+
configureEntityStorageConnectors(coreConfig, envVars);
|
|
1757
|
+
configureBlobStorageConnectors(coreConfig, envVars);
|
|
1758
|
+
configureVaultConnectors(coreConfig, envVars);
|
|
1759
|
+
configureLogging(coreConfig, envVars);
|
|
1760
|
+
configureBackgroundTaskConnectors(coreConfig, envVars);
|
|
1761
|
+
configureTelemetryConnectors(coreConfig, envVars);
|
|
1762
|
+
configureFaucetConnectors(coreConfig, envVars);
|
|
1763
|
+
configureWalletConnectors(coreConfig, envVars);
|
|
1764
|
+
configureNftConnectors(coreConfig, envVars);
|
|
1765
|
+
configureImmutableStorageConnectors(coreConfig, envVars);
|
|
1766
|
+
configureIdentityConnectors(coreConfig, envVars);
|
|
1767
|
+
configureIdentityProfileConnectors(coreConfig, envVars);
|
|
1768
|
+
configureAttestationConnectors(coreConfig, envVars);
|
|
1769
|
+
return coreConfig;
|
|
1770
|
+
}
|
|
1771
|
+
/**
|
|
1772
|
+
* Configures the entity storage connectors for the core.
|
|
1773
|
+
* @param coreConfig The core config.
|
|
1774
|
+
* @param envVars The environment variables.
|
|
1775
|
+
*/
|
|
1776
|
+
function configureEntityStorageConnectors(coreConfig, envVars) {
|
|
1777
|
+
coreConfig.entityStorageConnector ??= [];
|
|
1778
|
+
if ((core.Coerce.boolean(envVars.entityMemoryEnable) ?? false) ||
|
|
1779
|
+
envVars.blobStorageConnectorType === engineModels.EntityStorageConnectorType.Memory) {
|
|
1780
|
+
coreConfig.entityStorageConnector.push({
|
|
1781
|
+
type: engineModels.EntityStorageConnectorType.Memory
|
|
1782
|
+
});
|
|
1783
|
+
}
|
|
1784
|
+
if ((core.Coerce.boolean(envVars.entityFileEnable) ?? false) ||
|
|
1785
|
+
envVars.entityStorageConnectorType === engineModels.EntityStorageConnectorType.File) {
|
|
1786
|
+
coreConfig.entityStorageConnector.push({
|
|
1787
|
+
type: engineModels.EntityStorageConnectorType.File,
|
|
1788
|
+
options: { config: { directory: envVars.storageFileRoot } }
|
|
1789
|
+
});
|
|
1790
|
+
}
|
|
1791
|
+
if (core.Is.stringValue(envVars.awsDynamodbAccessKeyId)) {
|
|
1792
|
+
coreConfig.entityStorageConnector.push({
|
|
1793
|
+
type: engineModels.EntityStorageConnectorType.AwsDynamoDb,
|
|
1794
|
+
options: {
|
|
1795
|
+
config: {
|
|
1796
|
+
region: envVars.awsDynamodbRegion,
|
|
1797
|
+
accessKeyId: envVars.awsDynamodbAccessKeyId,
|
|
1798
|
+
secretAccessKey: envVars.awsDynamodbSecretAccessKey,
|
|
1799
|
+
endpoint: envVars.awsDynamodbEndpoint
|
|
1800
|
+
},
|
|
1801
|
+
tablePrefix: envVars.entityStorageTablePrefix
|
|
1802
|
+
}
|
|
1803
|
+
});
|
|
1804
|
+
}
|
|
1805
|
+
if (core.Is.stringValue(envVars.azureCosmosdbKey)) {
|
|
1806
|
+
coreConfig.entityStorageConnector.push({
|
|
1807
|
+
type: engineModels.EntityStorageConnectorType.AzureCosmosDb,
|
|
1808
|
+
options: {
|
|
1809
|
+
config: {
|
|
1810
|
+
endpoint: envVars.azureCosmosdbEndpoint,
|
|
1811
|
+
key: envVars.azureCosmosdbKey,
|
|
1812
|
+
databaseId: envVars.azureCosmosdbDatabaseId,
|
|
1813
|
+
containerId: envVars.azureCosmosdbContainerId
|
|
1814
|
+
},
|
|
1815
|
+
tablePrefix: envVars.entityStorageTablePrefix
|
|
1816
|
+
}
|
|
1817
|
+
});
|
|
1818
|
+
}
|
|
1819
|
+
if (core.Is.stringValue(envVars.gcpFirestoreCredentials)) {
|
|
1820
|
+
coreConfig.entityStorageConnector.push({
|
|
1821
|
+
type: engineModels.EntityStorageConnectorType.GcpFirestoreDb,
|
|
1822
|
+
options: {
|
|
1823
|
+
config: {
|
|
1824
|
+
projectId: envVars.gcpFirestoreProjectId,
|
|
1825
|
+
credentials: envVars.gcpFirestoreCredentials,
|
|
1826
|
+
databaseId: envVars.gcpFirestoreDatabaseId,
|
|
1827
|
+
collectionName: envVars.gcpFirestoreCollectionName,
|
|
1828
|
+
endpoint: envVars.gcpFirestoreApiEndpoint
|
|
1829
|
+
},
|
|
1830
|
+
tablePrefix: envVars.entityStorageTablePrefix
|
|
1831
|
+
}
|
|
1832
|
+
});
|
|
1833
|
+
}
|
|
1834
|
+
if (core.Is.stringValue(envVars.scylladbHosts)) {
|
|
1835
|
+
coreConfig.entityStorageConnector.push({
|
|
1836
|
+
type: engineModels.EntityStorageConnectorType.ScyllaDb,
|
|
1837
|
+
options: {
|
|
1838
|
+
config: {
|
|
1839
|
+
hosts: envVars.scylladbHosts.split(","),
|
|
1840
|
+
localDataCenter: envVars.scylladbLocalDataCenter,
|
|
1841
|
+
keyspace: envVars.scylladbKeyspace
|
|
1842
|
+
},
|
|
1843
|
+
tablePrefix: envVars.entityStorageTablePrefix
|
|
1844
|
+
}
|
|
1845
|
+
});
|
|
1846
|
+
}
|
|
1847
|
+
const defaultStorageConnector = envVars.entityStorageConnectorType;
|
|
1848
|
+
if (core.Is.stringValue(defaultStorageConnector)) {
|
|
1849
|
+
for (const config of coreConfig.entityStorageConnector) {
|
|
1850
|
+
if (config.type === defaultStorageConnector) {
|
|
1851
|
+
config.isDefault = true;
|
|
1852
|
+
}
|
|
1853
|
+
}
|
|
1854
|
+
}
|
|
1855
|
+
}
|
|
1856
|
+
/**
|
|
1857
|
+
* Configures the blob storage connectors for the core.
|
|
1858
|
+
* @param coreConfig The core config.
|
|
1859
|
+
* @param envVars The environment variables.
|
|
1860
|
+
*/
|
|
1861
|
+
function configureBlobStorageConnectors(coreConfig, envVars) {
|
|
1862
|
+
coreConfig.blobStorageConnector ??= [];
|
|
1863
|
+
if ((core.Coerce.boolean(envVars.blobMemoryEnable) ?? false) ||
|
|
1864
|
+
envVars.blobStorageConnectorType === engineModels.BlobStorageConnectorType.Memory) {
|
|
1865
|
+
coreConfig.blobStorageConnector.push({
|
|
1866
|
+
type: engineModels.BlobStorageConnectorType.Memory
|
|
1867
|
+
});
|
|
1868
|
+
}
|
|
1869
|
+
if ((core.Coerce.boolean(envVars.blobFileEnable) ?? false) ||
|
|
1870
|
+
envVars.blobStorageConnectorType === engineModels.BlobStorageConnectorType.File) {
|
|
1871
|
+
coreConfig.blobStorageConnector.push({
|
|
1872
|
+
type: engineModels.BlobStorageConnectorType.File,
|
|
1873
|
+
options: {
|
|
1874
|
+
config: { directory: path.join(envVars.storageFileRoot, "blob-storage") },
|
|
1875
|
+
storagePrefix: envVars.blobStoragePrefix
|
|
1876
|
+
}
|
|
1877
|
+
});
|
|
1878
|
+
}
|
|
1879
|
+
if (core.Is.stringValue(envVars.ipfsApiUrl)) {
|
|
1880
|
+
coreConfig.blobStorageConnector.push({
|
|
1881
|
+
type: engineModels.BlobStorageConnectorType.Ipfs,
|
|
1882
|
+
options: {
|
|
1883
|
+
config: {
|
|
1884
|
+
apiUrl: envVars.ipfsApiUrl,
|
|
1885
|
+
bearerToken: envVars.ipfsBearerToken
|
|
1886
|
+
}
|
|
1887
|
+
}
|
|
1888
|
+
});
|
|
1889
|
+
}
|
|
1890
|
+
if (core.Is.stringValue(envVars.awsS3AccessKeyId)) {
|
|
1891
|
+
coreConfig.blobStorageConnector.push({
|
|
1892
|
+
type: engineModels.BlobStorageConnectorType.AwsS3,
|
|
1893
|
+
options: {
|
|
1894
|
+
config: {
|
|
1895
|
+
region: envVars.awsS3Region,
|
|
1896
|
+
bucketName: envVars.awsS3BucketName,
|
|
1897
|
+
accessKeyId: envVars.awsS3AccessKeyId,
|
|
1898
|
+
secretAccessKey: envVars.awsS3SecretAccessKey,
|
|
1899
|
+
endpoint: envVars.awsS3Endpoint
|
|
1900
|
+
},
|
|
1901
|
+
storagePrefix: envVars.blobStoragePrefix
|
|
1902
|
+
}
|
|
1903
|
+
});
|
|
1904
|
+
}
|
|
1905
|
+
if (core.Is.stringValue(envVars.azureStorageAccountKey)) {
|
|
1906
|
+
coreConfig.blobStorageConnector.push({
|
|
1907
|
+
type: engineModels.BlobStorageConnectorType.AzureStorage,
|
|
1908
|
+
options: {
|
|
1909
|
+
config: {
|
|
1910
|
+
accountName: envVars.azureStorageAccountName,
|
|
1911
|
+
accountKey: envVars.azureStorageAccountKey,
|
|
1912
|
+
containerName: envVars.azureStorageContainerName,
|
|
1913
|
+
endpoint: envVars.azureStorageEndpoint
|
|
1914
|
+
},
|
|
1915
|
+
storagePrefix: envVars.blobStoragePrefix
|
|
1916
|
+
}
|
|
1917
|
+
});
|
|
1918
|
+
}
|
|
1919
|
+
if (core.Is.stringValue(envVars.gcpStorageCredentials)) {
|
|
1920
|
+
coreConfig.blobStorageConnector.push({
|
|
1921
|
+
type: engineModels.BlobStorageConnectorType.GcpStorage,
|
|
1922
|
+
options: {
|
|
1923
|
+
config: {
|
|
1924
|
+
projectId: envVars.gcpStorageProjectId,
|
|
1925
|
+
credentials: envVars.gcpStorageCredentials,
|
|
1926
|
+
bucketName: envVars.gcpStorageBucketName,
|
|
1927
|
+
apiEndpoint: envVars.gcpFirestoreApiEndpoint
|
|
1928
|
+
},
|
|
1929
|
+
storagePrefix: envVars.blobStoragePrefix
|
|
1930
|
+
}
|
|
1931
|
+
});
|
|
1932
|
+
}
|
|
1933
|
+
const defaultStorageConnectorType = envVars.blobStorageConnectorType;
|
|
1934
|
+
if (core.Is.stringValue(defaultStorageConnectorType)) {
|
|
1935
|
+
for (const config of coreConfig.blobStorageConnector) {
|
|
1936
|
+
if (config.type === defaultStorageConnectorType) {
|
|
1937
|
+
config.isDefault = true;
|
|
1938
|
+
}
|
|
1939
|
+
}
|
|
1940
|
+
}
|
|
1941
|
+
}
|
|
1942
|
+
/**
|
|
1943
|
+
* Configures the logging connectors for the core.
|
|
1944
|
+
* @param coreConfig The core config.
|
|
1945
|
+
* @param envVars The environment variables.
|
|
1946
|
+
*/
|
|
1947
|
+
function configureLogging(coreConfig, envVars) {
|
|
1948
|
+
const loggingConnectors = (envVars.loggingConnector ?? "").split(",");
|
|
1949
|
+
for (const loggingConnector of loggingConnectors) {
|
|
1950
|
+
if (loggingConnector === engineModels.LoggingConnectorType.Console) {
|
|
1951
|
+
coreConfig.loggingConnector?.push({
|
|
1952
|
+
type: engineModels.LoggingConnectorType.Console,
|
|
1953
|
+
options: {
|
|
1954
|
+
config: {
|
|
1955
|
+
translateMessages: true,
|
|
1956
|
+
hideGroups: true
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
});
|
|
1960
|
+
}
|
|
1961
|
+
else if (loggingConnector === engineModels.LoggingConnectorType.EntityStorage) {
|
|
1962
|
+
coreConfig.loggingConnector?.push({
|
|
1963
|
+
type: engineModels.LoggingConnectorType.EntityStorage
|
|
1964
|
+
});
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
if (loggingConnectors.length > 1) {
|
|
1968
|
+
coreConfig.loggingConnector?.push({
|
|
1969
|
+
type: engineModels.LoggingConnectorType.Multi,
|
|
1970
|
+
isDefault: true,
|
|
1971
|
+
options: {
|
|
1972
|
+
loggingConnectorTypes: loggingConnectors
|
|
1973
|
+
}
|
|
1974
|
+
});
|
|
1975
|
+
}
|
|
1976
|
+
}
|
|
1977
|
+
/**
|
|
1978
|
+
* Configures the vault connectors for the core.
|
|
1979
|
+
* @param coreConfig The core config.
|
|
1980
|
+
* @param envVars The environment variables.
|
|
1981
|
+
*/
|
|
1982
|
+
function configureVaultConnectors(coreConfig, envVars) {
|
|
1983
|
+
coreConfig.vaultConnector ??= [];
|
|
1984
|
+
if (envVars.vaultConnector === engineModels.VaultConnectorType.EntityStorage) {
|
|
1985
|
+
coreConfig.vaultConnector.push({
|
|
1986
|
+
type: engineModels.VaultConnectorType.EntityStorage
|
|
1987
|
+
});
|
|
1988
|
+
}
|
|
1989
|
+
else if (envVars.vaultConnector === engineModels.VaultConnectorType.Hashicorp) {
|
|
1990
|
+
coreConfig.vaultConnector.push({
|
|
1991
|
+
type: engineModels.VaultConnectorType.Hashicorp,
|
|
1992
|
+
options: {
|
|
1993
|
+
config: { endpoint: envVars.hashicorpVaultEndpoint, token: envVars.hashicorpVaultToken }
|
|
1994
|
+
}
|
|
1995
|
+
});
|
|
1996
|
+
}
|
|
1997
|
+
}
|
|
1998
|
+
/**
|
|
1999
|
+
* Configures the background task connectors for the core.
|
|
2000
|
+
* @param coreConfig The core config.
|
|
2001
|
+
* @param envVars The environment variables.
|
|
2002
|
+
*/
|
|
2003
|
+
function configureBackgroundTaskConnectors(coreConfig, envVars) {
|
|
2004
|
+
coreConfig.backgroundTaskConnector ??= [];
|
|
2005
|
+
if (envVars.backgroundTaskConnector === engineModels.BackgroundTaskConnectorType.EntityStorage) {
|
|
2006
|
+
coreConfig.backgroundTaskConnector.push({
|
|
2007
|
+
type: engineModels.BackgroundTaskConnectorType.EntityStorage
|
|
2008
|
+
});
|
|
2009
|
+
}
|
|
2010
|
+
}
|
|
2011
|
+
/**
|
|
2012
|
+
* Configures the telemetry connectors for the core.
|
|
2013
|
+
* @param coreConfig The core config.
|
|
2014
|
+
* @param envVars The environment variables.
|
|
2015
|
+
*/
|
|
2016
|
+
function configureTelemetryConnectors(coreConfig, envVars) {
|
|
2017
|
+
coreConfig.telemetryConnector ??= [];
|
|
2018
|
+
if (envVars.telemetryConnector === engineModels.TelemetryConnectorType.EntityStorage) {
|
|
2019
|
+
coreConfig.telemetryConnector.push({
|
|
2020
|
+
type: engineModels.TelemetryConnectorType.EntityStorage
|
|
2021
|
+
});
|
|
2022
|
+
}
|
|
2023
|
+
}
|
|
2024
|
+
/**
|
|
2025
|
+
* Configures the faucet connectors for the core.
|
|
2026
|
+
* @param coreConfig The core config.
|
|
2027
|
+
* @param envVars The environment variables.
|
|
2028
|
+
*/
|
|
2029
|
+
function configureFaucetConnectors(coreConfig, envVars) {
|
|
2030
|
+
coreConfig.faucetConnector ??= [];
|
|
2031
|
+
if (envVars.faucetConnector === engineModels.FaucetConnectorType.EntityStorage) {
|
|
2032
|
+
coreConfig.faucetConnector.push({
|
|
2033
|
+
type: engineModels.FaucetConnectorType.EntityStorage
|
|
2034
|
+
});
|
|
2035
|
+
}
|
|
2036
|
+
else if (envVars.faucetConnector === engineModels.FaucetConnectorType.Iota) {
|
|
2037
|
+
coreConfig.faucetConnector.push({
|
|
2038
|
+
type: engineModels.FaucetConnectorType.Iota,
|
|
2039
|
+
options: {
|
|
2040
|
+
config: {
|
|
2041
|
+
endpoint: envVars.iotaFaucetEndpoint,
|
|
2042
|
+
clientOptions: {
|
|
2043
|
+
nodes: [envVars.iotaNodeEndpoint]
|
|
2044
|
+
},
|
|
2045
|
+
bech32Hrp: envVars.iotaBech32Hrp,
|
|
2046
|
+
coinType: core.Coerce.number(envVars.iotaCoinType)
|
|
2047
|
+
}
|
|
2048
|
+
}
|
|
2049
|
+
});
|
|
2050
|
+
}
|
|
2051
|
+
}
|
|
2052
|
+
/**
|
|
2053
|
+
* Configures the wallet connectors for the core.
|
|
2054
|
+
* @param coreConfig The core config.
|
|
2055
|
+
* @param envVars The environment variables.
|
|
2056
|
+
*/
|
|
2057
|
+
function configureWalletConnectors(coreConfig, envVars) {
|
|
2058
|
+
coreConfig.walletConnector ??= [];
|
|
2059
|
+
if (envVars.walletConnector === engineModels.WalletConnectorType.EntityStorage) {
|
|
2060
|
+
coreConfig.walletConnector.push({
|
|
2061
|
+
type: engineModels.WalletConnectorType.EntityStorage
|
|
2062
|
+
});
|
|
2063
|
+
}
|
|
2064
|
+
else if (envVars.walletConnector === engineModels.WalletConnectorType.Iota) {
|
|
2065
|
+
coreConfig.walletConnector.push({
|
|
2066
|
+
type: engineModels.WalletConnectorType.Iota,
|
|
2067
|
+
options: {
|
|
2068
|
+
config: {
|
|
2069
|
+
clientOptions: {
|
|
2070
|
+
nodes: [envVars.iotaNodeEndpoint]
|
|
2071
|
+
},
|
|
2072
|
+
bech32Hrp: envVars.iotaBech32Hrp,
|
|
2073
|
+
coinType: core.Coerce.number(envVars.iotaCoinType)
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
});
|
|
2077
|
+
}
|
|
2078
|
+
}
|
|
2079
|
+
/**
|
|
2080
|
+
* Configures the NFT connectors for the core.
|
|
2081
|
+
* @param coreConfig The core config.
|
|
2082
|
+
* @param envVars The environment variables.
|
|
2083
|
+
*/
|
|
2084
|
+
function configureNftConnectors(coreConfig, envVars) {
|
|
2085
|
+
coreConfig.nftConnector ??= [];
|
|
2086
|
+
if (envVars.nftConnector === engineModels.NftConnectorType.EntityStorage) {
|
|
2087
|
+
coreConfig.nftConnector.push({
|
|
2088
|
+
type: engineModels.NftConnectorType.EntityStorage
|
|
2089
|
+
});
|
|
2090
|
+
}
|
|
2091
|
+
else if (envVars.nftConnector === engineModels.NftConnectorType.Iota) {
|
|
2092
|
+
coreConfig.nftConnector.push({
|
|
2093
|
+
type: engineModels.NftConnectorType.Iota,
|
|
2094
|
+
options: {
|
|
2095
|
+
config: {
|
|
2096
|
+
clientOptions: {
|
|
2097
|
+
nodes: [envVars.iotaNodeEndpoint]
|
|
2098
|
+
},
|
|
2099
|
+
bech32Hrp: envVars.iotaBech32Hrp,
|
|
2100
|
+
coinType: core.Coerce.number(envVars.iotaCoinType)
|
|
2101
|
+
}
|
|
2102
|
+
}
|
|
2103
|
+
});
|
|
2104
|
+
}
|
|
2105
|
+
}
|
|
2106
|
+
/**
|
|
2107
|
+
* Configures the immutable storage connectors for the core.
|
|
2108
|
+
* @param coreConfig The core config.
|
|
2109
|
+
* @param envVars The environment variables.
|
|
2110
|
+
*/
|
|
2111
|
+
function configureImmutableStorageConnectors(coreConfig, envVars) {
|
|
2112
|
+
coreConfig.immutableStorageConnector ??= [];
|
|
2113
|
+
if (envVars.immutableStorageConnector === engineModels.ImmutableStorageConnectorType.EntityStorage) {
|
|
2114
|
+
coreConfig.immutableStorageConnector.push({
|
|
2115
|
+
type: engineModels.ImmutableStorageConnectorType.EntityStorage
|
|
2116
|
+
});
|
|
2117
|
+
}
|
|
2118
|
+
else if (envVars.immutableStorageConnector === engineModels.ImmutableStorageConnectorType.Iota) {
|
|
2119
|
+
coreConfig.immutableStorageConnector.push({
|
|
2120
|
+
type: engineModels.ImmutableStorageConnectorType.Iota,
|
|
2121
|
+
options: {
|
|
2122
|
+
config: {
|
|
2123
|
+
clientOptions: {
|
|
2124
|
+
nodes: [envVars.iotaNodeEndpoint]
|
|
2125
|
+
},
|
|
2126
|
+
bech32Hrp: envVars.iotaBech32Hrp,
|
|
2127
|
+
coinType: core.Coerce.number(envVars.iotaCoinType)
|
|
2128
|
+
}
|
|
2129
|
+
}
|
|
2130
|
+
});
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2133
|
+
/**
|
|
2134
|
+
* Configures the identity connectors for the core.
|
|
2135
|
+
* @param coreConfig The core config.
|
|
2136
|
+
* @param envVars The environment variables.
|
|
2137
|
+
*/
|
|
2138
|
+
function configureIdentityConnectors(coreConfig, envVars) {
|
|
2139
|
+
coreConfig.identityConnector ??= [];
|
|
2140
|
+
if (envVars.identityConnector === engineModels.IdentityConnectorType.EntityStorage) {
|
|
2141
|
+
coreConfig.identityConnector.push({
|
|
2142
|
+
type: engineModels.IdentityConnectorType.EntityStorage
|
|
2143
|
+
});
|
|
2144
|
+
}
|
|
2145
|
+
else if (envVars.identityConnector === engineModels.IdentityConnectorType.Iota) {
|
|
2146
|
+
coreConfig.identityConnector.push({
|
|
2147
|
+
type: engineModels.IdentityConnectorType.Iota,
|
|
2148
|
+
options: {
|
|
2149
|
+
config: {
|
|
2150
|
+
clientOptions: {
|
|
2151
|
+
nodes: [envVars.iotaNodeEndpoint]
|
|
2152
|
+
},
|
|
2153
|
+
bech32Hrp: envVars.iotaBech32Hrp,
|
|
2154
|
+
coinType: core.Coerce.number(envVars.iotaCoinType)
|
|
2155
|
+
}
|
|
2156
|
+
}
|
|
2157
|
+
});
|
|
2158
|
+
}
|
|
2159
|
+
}
|
|
2160
|
+
/**
|
|
2161
|
+
* Configures the identity profile connectors for the core.
|
|
2162
|
+
* @param coreConfig The core config.
|
|
2163
|
+
* @param envVars The environment variables.
|
|
2164
|
+
*/
|
|
2165
|
+
function configureIdentityProfileConnectors(coreConfig, envVars) {
|
|
2166
|
+
coreConfig.identityProfileConnector ??= [];
|
|
2167
|
+
if (envVars.identityProfileConnector === engineModels.IdentityConnectorType.EntityStorage) {
|
|
2168
|
+
coreConfig.identityProfileConnector.push({
|
|
2169
|
+
type: engineModels.IdentityProfileConnectorType.EntityStorage
|
|
2170
|
+
});
|
|
2171
|
+
}
|
|
2172
|
+
}
|
|
2173
|
+
/**
|
|
2174
|
+
* Configures the attestation connectors for the core.
|
|
2175
|
+
* @param coreConfig The core config.
|
|
2176
|
+
* @param envVars The environment variables.
|
|
2177
|
+
*/
|
|
2178
|
+
function configureAttestationConnectors(coreConfig, envVars) {
|
|
2179
|
+
coreConfig.attestationConnector ??= [];
|
|
2180
|
+
if (envVars.attestationConnector === engineModels.AttestationConnectorType.EntityStorage) {
|
|
2181
|
+
coreConfig.attestationConnector.push({
|
|
2182
|
+
type: engineModels.AttestationConnectorType.EntityStorage
|
|
2183
|
+
});
|
|
2184
|
+
}
|
|
2185
|
+
else if (envVars.attestationConnector === engineModels.AttestationConnectorType.Iota) {
|
|
2186
|
+
coreConfig.attestationConnector.push({
|
|
2187
|
+
type: engineModels.AttestationConnectorType.Iota
|
|
2188
|
+
});
|
|
2189
|
+
}
|
|
2190
|
+
}
|
|
2191
|
+
|
|
2192
|
+
// Copyright 2024 IOTA Stiftung.
|
|
2193
|
+
// SPDX-License-Identifier: Apache-2.0.
|
|
2194
|
+
/**
|
|
2195
|
+
* Environment variable helper.
|
|
2196
|
+
*/
|
|
2197
|
+
class EnvHelper {
|
|
2198
|
+
/**
|
|
2199
|
+
* Get the environment variable as an object with camel cased names.
|
|
2200
|
+
* @param envVars The environment variables.
|
|
2201
|
+
* @param prefix The prefix of the environment variables.
|
|
2202
|
+
* @returns The object with camel cased names.
|
|
2203
|
+
*/
|
|
2204
|
+
static envToJson(envVars, prefix) {
|
|
2205
|
+
const result = {};
|
|
2206
|
+
for (const envVar in envVars) {
|
|
2207
|
+
if (envVar.startsWith(prefix) && core.Is.stringValue(process.env[envVar])) {
|
|
2208
|
+
const camelCaseName = core.StringHelper.camelCase(envVar.replace(prefix, "").toLowerCase());
|
|
2209
|
+
core.ObjectHelper.propertySet(result, camelCaseName, process.env[envVar]);
|
|
2210
|
+
}
|
|
2211
|
+
}
|
|
2212
|
+
return result;
|
|
2213
|
+
}
|
|
2214
|
+
}
|
|
2215
|
+
|
|
1659
2216
|
exports.EngineCore = EngineCore;
|
|
2217
|
+
exports.EnvHelper = EnvHelper;
|
|
1660
2218
|
exports.FileStateStorage = FileStateStorage;
|
|
1661
2219
|
exports.MemoryStateStorage = MemoryStateStorage;
|
|
2220
|
+
exports.buildEngineCoreConfiguration = buildEngineCoreConfiguration;
|
|
1662
2221
|
exports.initialiseEntityStorageConnector = initialiseEntityStorageConnector;
|