@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.
@@ -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: `${instanceConfig.options.storagePrefix ?? ""}${instanceConfig.options.config.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 Nothing.
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
- if (await this.stateLoad()) {
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
- const canContinue = await this.bootstrap();
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
- this.logInfo(core.I18n.formatMessage("engineCore.started"));
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
- if (core.Is.arrayValue(this._context.state?.bootstrappedComponents)) {
1451
- for (const instance of this._context.componentInstances) {
1452
- if (core.Is.function(instance.component.bootstrap)) {
1453
- const bootstrapName = `component-${instance.component.CLASS_NAME}-${instance.instanceType}`;
1454
- if (!this._context.state.bootstrappedComponents.includes(bootstrapName)) {
1455
- this.logInfo(core.I18n.formatMessage("engineCore.bootstrapping", {
1456
- element: bootstrapName
1457
- }));
1458
- const bootstrapSuccess = await instance.component.bootstrap(EngineCore.LOGGER_TYPE_NAME);
1459
- // If the bootstrap method failed then throw an error
1460
- if (!bootstrapSuccess) {
1461
- throw new core.GeneralError(this.CLASS_NAME, "bootstrapFailed", {
1462
- component: `${instance.component.CLASS_NAME}:${instance.instanceType}`
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
- // Now perform any custom bootstrap operations
1472
- if (canContinue && core.Is.function(this._customBootstrap)) {
1473
- await this._customBootstrap(this, this._context);
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
- await promises.writeFile(this._filename, JSON.stringify(state), "utf8");
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;