@twin.org/node-core 0.0.3-next.44 → 0.0.3-next.46

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.
@@ -1367,6 +1367,9 @@ export function isFederatedCatalogueRequired(envVars) {
1367
1367
  /**
1368
1368
  * Checks if the rights management subsystem is required.
1369
1369
  * Returns true when any component that depends on the rights management subsystem is enabled.
1370
+ * Note: rights management has no standalone enable flag — it is gated entirely on
1371
+ * `dataspaceEnabled`. Setting `TWIN_RIGHTS_MANAGEMENT_*` env var in isolation does not
1372
+ * enable the subsystem; `TWIN_DATASPACE_ENABLED` must also be true.
1370
1373
  * @param envVars The environment variables.
1371
1374
  * @returns True if rights management is enabled.
1372
1375
  */
@@ -1 +1 @@
1
- {"version":3,"file":"engineEnvBuilder.js","sourceRoot":"","sources":["../../../src/builders/engineEnvBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport { Coerce, Is } from \"@twin.org/core\";\nimport type { IIotaConfig } from \"@twin.org/dlt-iota\";\nimport {\n\tAttestationComponentType,\n\tAttestationConnectorType,\n\tAuditableItemGraphComponentType,\n\tAuditableItemStreamComponentType,\n\ttype AutomationActionConfig,\n\ttype AutomationActionType,\n\tAutomationComponentType,\n\tBackgroundTaskComponentType,\n\tBlobStorageComponentType,\n\tBlobStorageConnectorType,\n\tContextIdHandlerComponentType,\n\ttype DataConverterConnectorType,\n\ttype DataExtractorConnectorType,\n\tDataProcessingComponentType,\n\tDataspaceControlPlaneComponentType,\n\tDataspaceDataPlaneComponentType,\n\ttype DltConfig,\n\tDltConfigType,\n\tDocumentManagementComponentType,\n\tEngineTypeHelper,\n\tEntityStorageConnectorType,\n\tEventBusComponentType,\n\tEventBusConnectorType,\n\tFaucetConnectorType,\n\tFederatedCatalogueComponentType,\n\ttype FederatedCatalogueFilterComponentType,\n\tHealthComponentType,\n\tIdentityComponentType,\n\tIdentityConnectorType,\n\tIdentityProfileComponentType,\n\tIdentityProfileConnectorType,\n\tIdentityResolverComponentType,\n\tIdentityResolverConnectorType,\n\ttype IEngineConfig,\n\tImmutableProofComponentType,\n\tLoggingComponentType,\n\tLoggingConnectorType,\n\tMessagingAdminComponentType,\n\tMessagingComponentType,\n\tMessagingEmailConnectorType,\n\tMessagingPushNotificationConnectorType,\n\tMessagingSmsConnectorType,\n\tMetricsCollectorComponentType,\n\tMetricsProducerComponentType,\n\tNftComponentType,\n\tNftConnectorType,\n\tNotarizationComponentType,\n\tNotarizationConnectorType,\n\tRightsManagementPapComponentType,\n\tRightsManagementPdpComponentType,\n\tRightsManagementPepComponentType,\n\tRightsManagementPipComponentType,\n\tRightsManagementPmpComponentType,\n\tRightsManagementPnapComponentType,\n\tRightsManagementPnpComponentType,\n\ttype RightsManagementPolicyArbiterComponentType,\n\ttype RightsManagementPolicyEnforcementProcessorComponentType,\n\ttype RightsManagementPolicyExecutionActionComponentType,\n\ttype RightsManagementPolicyInformationSourceComponentType,\n\ttype RightsManagementPolicyNegotiatorComponentType,\n\ttype RightsManagementPolicyObligationEnforcerComponentType,\n\ttype RightsManagementPolicyRequesterComponentType,\n\tRightsManagementPxpComponentType,\n\tSynchronisedStorageComponentType,\n\tTaskSchedulerComponentType,\n\tTelemetryComponentType,\n\tTelemetryConnectorType,\n\tTenantAdminComponentType,\n\tTrustComponentType,\n\ttype TrustGeneratorComponentType,\n\ttype TrustVerifierComponentType,\n\tUrlTransformerComponentType,\n\tVaultConnectorType,\n\tVerifiableStorageComponentType,\n\tVerifiableStorageConnectorType,\n\tWalletConnectorType\n} from \"@twin.org/engine-types\";\nimport {\n\ttype IOpenTelemetryTelemetryConnectorConfig,\n\tOpenTelemetryReaderTypes\n} from \"@twin.org/telemetry-connector-opentelemetry\";\nimport { CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT } from \"../defaults.js\";\nimport { isAuthEntityStorageRequired } from \"./engineServerEnvBuilder.js\";\nimport type { IEngineEnvironmentVariables } from \"../models/IEngineEnvironmentVariables.js\";\n\n/**\n * Build the engine core configuration from environment variables.\n * @param envVars The environment variables.\n * @param contextIdKeys The context ID keys.\n * @returns The config for the core.\n */\nexport async function buildEngineConfiguration(\n\tenvVars: IEngineEnvironmentVariables,\n\tcontextIdKeys: { key: string; requiredHandlerFeatures: string[] }[]\n): Promise<IEngineConfig> {\n\tif (Is.stringValue(envVars.storageFileRoot)) {\n\t\tenvVars.stateFilename ??= \"engine-state.json\";\n\t\tenvVars.storageFileRoot = path.resolve(envVars.storageFileRoot);\n\t\tenvVars.stateFilename = path.join(envVars.storageFileRoot, envVars.stateFilename);\n\t}\n\n\tconst coreConfig: IEngineConfig = {\n\t\tdebug: Coerce.boolean(envVars.debug) ?? false,\n\t\tsilent: Coerce.boolean(envVars.silent) ?? false,\n\t\ttypes: {}\n\t};\n\n\tawait configureTenant(coreConfig, envVars);\n\tawait configureContextIdHandlers(coreConfig, envVars);\n\n\tawait configureEntityStorage(coreConfig, envVars);\n\tawait configureBlobStorage(coreConfig, envVars);\n\tawait configureVault(coreConfig, envVars);\n\tawait configureDlt(coreConfig, envVars);\n\n\tawait configureLogging(coreConfig, envVars);\n\tawait configureBackgroundTask(coreConfig, envVars);\n\tawait configureTaskScheduler(coreConfig, envVars);\n\tawait configureEventBus(coreConfig, envVars);\n\tawait configureTelemetry(coreConfig, envVars);\n\tawait configureMetricsCollector(coreConfig, envVars);\n\tawait configureMessaging(coreConfig, envVars);\n\tawait configureAutomation(coreConfig, envVars);\n\tawait configureHealth(coreConfig, envVars);\n\tawait configureUrlTransformer(coreConfig, envVars);\n\n\tawait configureFaucet(coreConfig, envVars);\n\tawait configureWallet(coreConfig, envVars);\n\tawait configureNft(coreConfig, envVars);\n\tawait configureNotarization(coreConfig, envVars);\n\tawait configureVerifiableStorage(coreConfig, envVars);\n\tawait configureImmutableProof(coreConfig, envVars);\n\tawait configureIdentity(coreConfig, envVars);\n\tawait configureIdentityResolver(coreConfig, envVars);\n\tawait configureIdentityProfile(coreConfig, envVars);\n\tawait configureAttestation(coreConfig, envVars);\n\tawait configureDataProcessing(coreConfig, envVars);\n\n\tawait configureAuditableItemGraph(coreConfig, envVars);\n\tawait configureAuditableItemStream(coreConfig, envVars);\n\tawait configureDocumentManagement(coreConfig, envVars);\n\tawait configureTrust(coreConfig, envVars);\n\tawait configureRightsManagement(coreConfig, envVars);\n\tawait configureSynchronisedStorage(coreConfig, envVars);\n\tawait configureFederatedCatalogue(coreConfig, envVars);\n\tawait configureDataspace(coreConfig, envVars);\n\n\treturn coreConfig;\n}\n\n/**\n * Configures the entity storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureEntityStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types ??= {};\n\tcoreConfig.types.entityStorageConnector ??= [];\n\n\tconst entityStorageConnectorTypes = commaSeparatedListToArray<\n\t\tOmit<EntityStorageConnectorType, typeof EntityStorageConnectorType.Synchronised>\n\t>(envVars.entityStorageConnectorType);\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.Memory)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.Memory\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.File)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.File,\n\t\t\toptions: {\n\t\t\t\tconfig: { directory: envVars.storageFileRoot ?? \"\" },\n\t\t\t\tfolderPrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.AwsDynamoDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.AwsDynamoDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tregion: envVars.awsDynamodbRegion ?? \"\",\n\t\t\t\t\tauthMode: envVars.awsDynamodbAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\taccessKeyId: envVars.awsDynamodbAccessKeyId,\n\t\t\t\t\tsecretAccessKey: envVars.awsDynamodbSecretAccessKey,\n\t\t\t\t\tendpoint: envVars.awsDynamodbEndpoint,\n\t\t\t\t\tconnectionTimeoutMs: Coerce.integer(envVars.awsDynamodbConnectionTimeoutMs)\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.AzureCosmosDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.AzureCosmosDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.azureCosmosdbEndpoint ?? \"\",\n\t\t\t\t\tkey: envVars.azureCosmosdbKey ?? \"\",\n\t\t\t\t\tdatabaseId: envVars.azureCosmosdbDatabaseId ?? \"\",\n\t\t\t\t\tcontainerId: envVars.azureCosmosdbContainerId ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.GcpFirestoreDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.GcpFirestoreDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tprojectId: envVars.gcpFirestoreProjectId ?? \"\",\n\t\t\t\t\tcredentials: envVars.gcpFirestoreCredentials ?? \"\",\n\t\t\t\t\tdatabaseId: envVars.gcpFirestoreDatabaseId ?? \"\",\n\t\t\t\t\tcollectionName: envVars.gcpFirestoreCollectionName ?? \"\",\n\t\t\t\t\tendpoint: envVars.gcpFirestoreApiEndpoint ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.ScyllaDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.ScyllaDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thosts: commaSeparatedListToArray(envVars.scylladbHosts),\n\t\t\t\t\tlocalDataCenter: envVars.scylladbLocalDataCenter ?? \"\",\n\t\t\t\t\tkeyspace: envVars.scylladbKeyspace ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.scylladbPort)\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.MySqlDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.MySqlDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thost: envVars.mySqlHost ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.mySqlPort),\n\t\t\t\t\tuser: envVars.mySqlUser ?? \"\",\n\t\t\t\t\tpassword: envVars.mySqlPassword ?? \"\",\n\t\t\t\t\tdatabase: envVars.mySqlDatabase ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.MongoDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.MongoDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thost: envVars.mongoDbHost ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.mongoDbPort),\n\t\t\t\t\tuser: envVars.mongoDbUser ?? \"\",\n\t\t\t\t\tpassword: envVars.mongoDbPassword ?? \"\",\n\t\t\t\t\tdatabase: envVars.mongoDbDatabase ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.PostgreSql)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.PostgreSql,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thost: envVars.postgreSqlHost ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.postgreSqlPort),\n\t\t\t\t\tuser: envVars.postgreSqlUser ?? \"\",\n\t\t\t\t\tpassword: envVars.postgreSqlPassword ?? \"\",\n\t\t\t\t\tdatabase: envVars.postgreSqlDatabase ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tconst defaultEntityStorageConnectorType =\n\t\tenvVars.entityStorageConnectorDefault ?? entityStorageConnectorTypes[0];\n\n\tif (Is.arrayValue(entityStorageConnectorTypes)) {\n\t\tfor (const config of coreConfig.types.entityStorageConnector) {\n\t\t\tif (config.type === defaultEntityStorageConnectorType) {\n\t\t\t\tconfig.isDefault = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Configures the blob storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureBlobStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.blobStorageConnector ??= [];\n\n\tconst blobStorageConnectorTypes = commaSeparatedListToArray(envVars.blobStorageConnectorType);\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.Memory)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.Memory\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.File)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.File,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tdirectory: Is.stringValue(envVars.storageFileRoot)\n\t\t\t\t\t\t? path.join(envVars.storageFileRoot, \"blob-storage\")\n\t\t\t\t\t\t: \"\"\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.Ipfs)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.Ipfs,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tapiUrl: envVars.ipfsApiUrl ?? \"\",\n\t\t\t\t\tbearerToken: envVars.ipfsBearerToken\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.AwsS3)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.AwsS3,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tregion: envVars.awsS3Region ?? \"\",\n\t\t\t\t\tbucketName: envVars.awsS3BucketName ?? \"\",\n\t\t\t\t\tauthMode: envVars.awsS3AuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\taccessKeyId: envVars.awsS3AccessKeyId,\n\t\t\t\t\tsecretAccessKey: envVars.awsS3SecretAccessKey,\n\t\t\t\t\tendpoint: envVars.awsS3Endpoint\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.AzureStorage)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.AzureStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\taccountName: envVars.azureStorageAccountName ?? \"\",\n\t\t\t\t\taccountKey: envVars.azureStorageAccountKey ?? \"\",\n\t\t\t\t\tcontainerName: envVars.azureStorageContainerName ?? \"\",\n\t\t\t\t\tendpoint: envVars.azureStorageEndpoint ?? \"\"\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.GcpStorage)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.GcpStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tprojectId: envVars.gcpStorageProjectId ?? \"\",\n\t\t\t\t\tcredentials: envVars.gcpStorageCredentials ?? \"\",\n\t\t\t\t\tbucketName: envVars.gcpStorageBucketName ?? \"\",\n\t\t\t\t\tapiEndpoint: envVars.gcpFirestoreApiEndpoint\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (Is.arrayValue(blobStorageConnectorTypes)) {\n\t\tconst defaultStorageConnectorType =\n\t\t\tenvVars.blobStorageConnectorDefault ?? blobStorageConnectorTypes[0];\n\t\tfor (const config of coreConfig.types.blobStorageConnector) {\n\t\t\tif (config.type === defaultStorageConnectorType) {\n\t\t\t\tconfig.isDefault = true;\n\t\t\t}\n\t\t\t// If this blob storage connector is the one to use for public access\n\t\t\t// then add it as a feature\n\t\t\tif (\n\t\t\t\tIs.stringValue(envVars.blobStorageConnectorPublic) &&\n\t\t\t\tconfig.type === envVars.blobStorageConnectorPublic\n\t\t\t) {\n\t\t\t\tconfig.features ??= [];\n\t\t\t\tconfig.features.push(\"public\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (coreConfig.types.blobStorageConnector.length > 0) {\n\t\tcoreConfig.types.blobStorageComponent ??= [];\n\t\tcoreConfig.types.blobStorageComponent.push({\n\t\t\ttype: BlobStorageComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tvaultKeyId:\n\t\t\t\t\t\t(envVars.blobStorageEnableEncryption ?? false)\n\t\t\t\t\t\t\t? envVars.blobStorageEncryptionKeyId\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the logging.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureLogging(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.loggingConnector ??= [];\n\n\tconst loggingConnectorTypes = commaSeparatedListToArray<LoggingConnectorType>(\n\t\tenvVars.loggingConnector\n\t);\n\tlet additionalConnectorCount = 0;\n\n\tfor (const loggingConnector of loggingConnectorTypes) {\n\t\tif (loggingConnector === LoggingConnectorType.Console) {\n\t\t\tcoreConfig.types.loggingConnector.push({\n\t\t\t\ttype: LoggingConnectorType.Console,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\ttranslateMessages: true,\n\t\t\t\t\t\thideGroups: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tadditionalConnectorCount++;\n\t\t} else if (loggingConnector === LoggingConnectorType.EntityStorage) {\n\t\t\tcoreConfig.types.loggingConnector.push({\n\t\t\t\ttype: LoggingConnectorType.EntityStorage\n\t\t\t});\n\t\t\tadditionalConnectorCount++;\n\t\t}\n\t}\n\n\t// If more than one logging connector, then we need to add a multi connector\n\t// and set it as the default one\n\tif (additionalConnectorCount > 1) {\n\t\tcoreConfig.types.loggingConnector.push({\n\t\t\ttype: LoggingConnectorType.Multi,\n\t\t\toptions: {\n\t\t\t\tloggingConnectorTypes\n\t\t\t},\n\t\t\tisDefault: true\n\t\t});\n\t} else if (additionalConnectorCount > 0) {\n\t\t// If only one connector, then we set it as the default one\n\t\tcoreConfig.types.loggingConnector[coreConfig.types.loggingConnector.length - 1].isDefault =\n\t\t\ttrue;\n\t}\n\n\tif (additionalConnectorCount > 0) {\n\t\tcoreConfig.types.loggingComponent ??= [];\n\t\t// We set the isDefault flag so that other components will get this service by default\n\t\t// and not the generic one from the engine core\n\t\tcoreConfig.types.loggingComponent.push({ type: LoggingComponentType.Service, isDefault: true });\n\t}\n}\n\n/**\n * Configures the vault.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureVault(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.vaultConnector ??= [];\n\n\tif (envVars.vaultConnector === VaultConnectorType.EntityStorage) {\n\t\tcoreConfig.types.vaultConnector.push({\n\t\t\ttype: VaultConnectorType.EntityStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tprefix: envVars.vaultPrefix\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else if (envVars.vaultConnector === VaultConnectorType.Hashicorp) {\n\t\tcoreConfig.types.vaultConnector.push({\n\t\t\ttype: VaultConnectorType.Hashicorp,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.hashicorpVaultEndpoint ?? \"\",\n\t\t\t\t\ttoken: envVars.hashicorpVaultToken ?? \"\",\n\t\t\t\t\tprefix: envVars.vaultPrefix\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the background task.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureBackgroundTask(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.backgroundTaskComponent ??= [];\n\n\tif (isBackgroundTasksRequired(envVars)) {\n\t\tcoreConfig.types.backgroundTaskComponent.push({\n\t\t\ttype: BackgroundTaskComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the event bud.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureEventBus(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.eventBusConnector ??= [];\n\n\tif (envVars.eventBusConnector === EventBusConnectorType.Local) {\n\t\tcoreConfig.types.eventBusConnector.push({\n\t\t\ttype: EventBusConnectorType.Local\n\t\t});\n\t}\n\n\tif (coreConfig.types.eventBusConnector.length > 0) {\n\t\tcoreConfig.types.eventBusComponent ??= [];\n\t\tcoreConfig.types.eventBusComponent.push({ type: EventBusComponentType.Service });\n\t}\n}\n\n/**\n * Configures the telemetry.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTelemetry(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.telemetryConnector ??= [];\n\n\tif (envVars.telemetryConnector === TelemetryConnectorType.EntityStorage) {\n\t\tcoreConfig.types.telemetryConnector.push({\n\t\t\ttype: TelemetryConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.telemetryConnector === TelemetryConnectorType.OpenTelemetry) {\n\t\tlet readers: IOpenTelemetryTelemetryConnectorConfig[\"readers\"];\n\t\tif (envVars.openTelemetryReader === \"prometheus\") {\n\t\t\treaders = {\n\t\t\t\tprometheus: {\n\t\t\t\t\ttype: OpenTelemetryReaderTypes.Prometheus,\n\t\t\t\t\tport: Coerce.integer(envVars.openTelemetryPrometheusPort)\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tcoreConfig.types.telemetryConnector.push({\n\t\t\ttype: TelemetryConnectorType.OpenTelemetry,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tmeterName: envVars.openTelemetryMeterName,\n\t\t\t\t\tmeterVersion: envVars.openTelemetryMeterVersion,\n\t\t\t\t\treaders\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.telemetryConnector.length > 0) {\n\t\tcoreConfig.types.telemetryComponent ??= [];\n\t\tcoreConfig.types.telemetryComponent.push({ type: TelemetryComponentType.Service });\n\t}\n}\n\n/**\n * Configures the metrics producers and orchestrator service.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureMetricsCollector(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isTelemetryRequired(envVars)) {\n\t\tconst intervalSec = Coerce.integer(envVars.telemetryMetricsCollectorIntervalSeconds) ?? 60;\n\n\t\tcoreConfig.types.metricsCollectorComponent ??= [];\n\t\tcoreConfig.types.metricsCollectorComponent.push({\n\t\t\ttype: MetricsCollectorComponentType.Service,\n\t\t\toptions: { config: { intervalMs: intervalSec * 1000 } }\n\t\t});\n\n\t\tconst maxHistory = Coerce.integer(envVars.telemetryMetricsProducerMaxHistory) ?? 1440;\n\t\tcoreConfig.types.metricsProducerComponent ??= [];\n\n\t\tconst metricsProducers = commaSeparatedListToArray(\n\t\t\tenvVars.telemetryMetricsProducers ??\n\t\t\t\t[MetricsProducerComponentType.System, MetricsProducerComponentType.Process].join(\",\")\n\t\t);\n\n\t\tfor (const producerType of metricsProducers) {\n\t\t\tcoreConfig.types.metricsProducerComponent.push({\n\t\t\t\ttype: producerType as MetricsProducerComponentType,\n\t\t\t\toptions: { maxHistory }\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the automation.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAutomation(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.automationComponent ??= [];\n\n\tif (isAutomationRequired(envVars)) {\n\t\tcoreConfig.types.automationComponent.push({\n\t\t\ttype: AutomationComponentType.Service\n\t\t});\n\n\t\tconst automationActionTypes = commaSeparatedListToArray(envVars.automationActionTypes);\n\n\t\tif (Is.arrayValue(automationActionTypes)) {\n\t\t\tcoreConfig.types.automationAction ??= [];\n\n\t\t\tfor (const actionType of automationActionTypes) {\n\t\t\t\tcoreConfig.types.automationAction.push({\n\t\t\t\t\ttype: actionType as AutomationActionType,\n\t\t\t\t\tisMultiInstance: true\n\t\t\t\t} as unknown as AutomationActionConfig);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Configures the health.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureHealth(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.healthComponent ??= [];\n\n\tif (Coerce.boolean(envVars.healthEnabled) ?? false) {\n\t\tcoreConfig.types.healthComponent.push({\n\t\t\ttype: HealthComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thealthCheckInterval: (Coerce.integer(envVars.healthIntervalSeconds) ?? 60) * 1000,\n\t\t\t\t\tinitialInterval: (Coerce.integer(envVars.healthStartupIntervalSeconds) ?? 2) * 1000\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the url transformer.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureUrlTransformer(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.urlTransformerComponent ??= [];\n\n\tif (isUrlTransformerRequired(envVars) ?? false) {\n\t\tcoreConfig.types.urlTransformerComponent.push({\n\t\t\ttype: UrlTransformerComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tparamEncryptionKeyName: envVars.urlTransformerEncryptionKeyId,\n\t\t\t\t\tqueryParamNames: {\n\t\t\t\t\t\ttenant: \"tenant-token\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the tenant.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTenant(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.tenantEnabled) ?? false) {\n\t\tcoreConfig.types.tenantAdminComponent ??= [];\n\t\tcoreConfig.types.tenantAdminComponent.push({\n\t\t\ttype: TenantAdminComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.tenantComponent ??= [];\n\t\tcoreConfig.types.tenantComponent.push({ type: TenantAdminComponentType.Service });\n\t}\n}\n\n/**\n * Configures the context id handlers.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureContextIdHandlers(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.contextIdHandlerComponent ??= [];\n\tcoreConfig.types.contextIdHandlerComponent.push({\n\t\ttype: ContextIdHandlerComponentType.Did,\n\t\tfeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t});\n\tif (Coerce.boolean(envVars.tenantEnabled) ?? false) {\n\t\tcoreConfig.types.contextIdHandlerComponent.push({\n\t\t\ttype: ContextIdHandlerComponentType.Tenant,\n\t\t\tfeatures: [CONTEXT_ID_HANDLER_FEATURE_TENANT]\n\t\t});\n\t}\n}\n\n/**\n * Configures the messaging.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureMessaging(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.messagingEnabled) ?? false) {\n\t\tcoreConfig.types.messagingEmailConnector ??= [];\n\t\tcoreConfig.types.messagingSmsConnector ??= [];\n\t\tcoreConfig.types.messagingPushNotificationConnector ??= [];\n\n\t\tif (envVars.messagingEmailConnector === MessagingEmailConnectorType.EntityStorage) {\n\t\t\tcoreConfig.types.messagingEmailConnector.push({\n\t\t\t\ttype: MessagingEmailConnectorType.EntityStorage\n\t\t\t});\n\t\t} else if (envVars.messagingEmailConnector === MessagingEmailConnectorType.Aws) {\n\t\t\tcoreConfig.types.messagingEmailConnector.push({\n\t\t\t\ttype: MessagingEmailConnectorType.Aws,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tregion: envVars.awsSesRegion ?? \"\",\n\t\t\t\t\t\tauthMode: envVars.awsSesAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\t\taccessKeyId: envVars.awsSesAccessKeyId,\n\t\t\t\t\t\tsecretAccessKey: envVars.awsSesSecretAccessKey,\n\t\t\t\t\t\tendpoint: envVars.awsSesEndpoint\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (envVars.messagingSmsConnector === MessagingSmsConnectorType.EntityStorage) {\n\t\t\tcoreConfig.types.messagingSmsConnector.push({\n\t\t\t\ttype: MessagingSmsConnectorType.EntityStorage\n\t\t\t});\n\t\t} else if (envVars.messagingSmsConnector === MessagingSmsConnectorType.Aws) {\n\t\t\tcoreConfig.types.messagingSmsConnector.push({\n\t\t\t\ttype: MessagingSmsConnectorType.Aws,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tregion: envVars.awsSesRegion ?? \"\",\n\t\t\t\t\t\tauthMode: envVars.awsSesAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\t\taccessKeyId: envVars.awsSesAccessKeyId,\n\t\t\t\t\t\tsecretAccessKey: envVars.awsSesSecretAccessKey,\n\t\t\t\t\t\tendpoint: envVars.awsSesEndpoint\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tenvVars.messagingPushNotificationConnector ===\n\t\t\tMessagingPushNotificationConnectorType.EntityStorage\n\t\t) {\n\t\t\tcoreConfig.types.messagingPushNotificationConnector.push({\n\t\t\t\ttype: MessagingPushNotificationConnectorType.EntityStorage\n\t\t\t});\n\t\t} else if (\n\t\t\tenvVars.messagingPushNotificationConnector === MessagingPushNotificationConnectorType.Aws\n\t\t) {\n\t\t\tcoreConfig.types.messagingPushNotificationConnector.push({\n\t\t\t\ttype: MessagingPushNotificationConnectorType.Aws,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tregion: envVars.awsSesRegion ?? \"\",\n\t\t\t\t\t\tauthMode: envVars.awsSesAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\t\taccessKeyId: envVars.awsSesAccessKeyId,\n\t\t\t\t\t\tsecretAccessKey: envVars.awsSesSecretAccessKey,\n\t\t\t\t\t\tendpoint: envVars.awsSesEndpoint,\n\t\t\t\t\t\tapplicationsSettings: Is.array(envVars.awsMessagingPushNotificationApplications)\n\t\t\t\t\t\t\t? JSON.parse(envVars.awsMessagingPushNotificationApplications)\n\t\t\t\t\t\t\t: []\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.messagingAdminComponent ??= [];\n\t\tcoreConfig.types.messagingAdminComponent.push({\n\t\t\ttype: MessagingAdminComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.messagingComponent ??= [];\n\t\tcoreConfig.types.messagingComponent.push({ type: MessagingComponentType.Service });\n\t}\n}\n\n/**\n * Configures the faucet.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureFaucet(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.faucetConnector ??= [];\n\n\tif (envVars.faucetConnector === FaucetConnectorType.EntityStorage) {\n\t\tcoreConfig.types.faucetConnector.push({\n\t\t\ttype: FaucetConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.faucetConnector === FaucetConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.faucetConnector.push({\n\t\t\ttype: FaucetConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.iotaFaucetEndpoint ?? \"\",\n\t\t\t\t\tclientOptions: dltConfig?.options?.config?.clientOptions ?? { url: \"\" },\n\t\t\t\t\tnetwork: dltConfig?.options?.config?.network ?? \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the wallet.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureWallet(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.walletConnector ??= [];\n\n\tif (envVars.walletConnector === WalletConnectorType.EntityStorage) {\n\t\tcoreConfig.types.walletConnector.push({\n\t\t\ttype: WalletConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.walletConnector === WalletConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.walletConnector.push({\n\t\t\ttype: WalletConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: dltConfig?.options?.config ?? ({} as IIotaConfig)\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the NFT.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureNft(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.nftConnector ??= [];\n\n\tif (envVars.nftConnector === NftConnectorType.EntityStorage) {\n\t\tcoreConfig.types.nftConnector.push({\n\t\t\ttype: NftConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.nftConnector === NftConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tconst config = {\n\t\t\t...(dltConfig?.options?.config as IIotaConfig),\n\t\t\tdeploymentPkgId: Is.stringValue(envVars.nftPackageId) ? envVars.nftPackageId : undefined\n\t\t};\n\t\tcoreConfig.types.nftConnector.push({\n\t\t\ttype: NftConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.nftConnector.length > 0) {\n\t\tcoreConfig.types.nftComponent ??= [];\n\t\tcoreConfig.types.nftComponent.push({ type: NftComponentType.Service });\n\t}\n}\n\n/**\n * Configures the notarization.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureNotarization(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.notarizationConnector ??= [];\n\n\tif (envVars.notarizationConnector === NotarizationConnectorType.EntityStorage) {\n\t\tcoreConfig.types.notarizationConnector.push({\n\t\t\ttype: NotarizationConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.notarizationConnector === NotarizationConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.notarizationConnector.push({\n\t\t\ttype: NotarizationConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: dltConfig?.options?.config ?? ({} as IIotaConfig)\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.notarizationConnector.length > 0) {\n\t\tcoreConfig.types.notarizationComponent ??= [];\n\t\tcoreConfig.types.notarizationComponent.push({ type: NotarizationComponentType.Service });\n\t}\n}\n\n/**\n * Configures the verifiable storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureVerifiableStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.verifiableStorageConnector ??= [];\n\n\tif (envVars.verifiableStorageConnector === VerifiableStorageConnectorType.EntityStorage) {\n\t\tcoreConfig.types.verifiableStorageConnector.push({\n\t\t\ttype: VerifiableStorageConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.verifiableStorageConnector === VerifiableStorageConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\n\t\tconst config = {\n\t\t\t...(dltConfig?.options?.config as IIotaConfig),\n\t\t\tdeploymentPkgId: Is.stringValue(envVars.verifiableStoragePackageId)\n\t\t\t\t? envVars.verifiableStoragePackageId\n\t\t\t\t: undefined\n\t\t};\n\t\tcoreConfig.types.verifiableStorageConnector.push({\n\t\t\ttype: VerifiableStorageConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.verifiableStorageConnector.length > 0) {\n\t\tcoreConfig.types.verifiableStorageComponent ??= [];\n\t\tcoreConfig.types.verifiableStorageComponent.push({\n\t\t\ttype: VerifiableStorageComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the immutable proof.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureImmutableProof(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isImmutableProofRequired(envVars)) {\n\t\tcoreConfig.types.immutableProofComponent ??= [];\n\t\tcoreConfig.types.immutableProofComponent.push({\n\t\t\ttype: ImmutableProofComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tverificationMethodId: envVars.immutableProofVerificationMethodId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the identity.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureIdentity(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.identityConnector ??= [];\n\n\tif (envVars.identityConnector === IdentityConnectorType.EntityStorage) {\n\t\tcoreConfig.types.identityConnector.push({\n\t\t\ttype: IdentityConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.identityConnector === IdentityConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.identityConnector.push({\n\t\t\ttype: IdentityConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\t...(dltConfig?.options?.config ?? ({} as IIotaConfig)),\n\t\t\t\t\tidentityPkgId: Is.stringValue(envVars.iotaIdentityPackageId)\n\t\t\t\t\t\t? envVars.iotaIdentityPackageId\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\twalletAddressIndex: Coerce.integer(envVars.identityWalletAddressIndex) ?? 0\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.identityConnector.length > 0) {\n\t\tcoreConfig.types.identityComponent ??= [];\n\t\tcoreConfig.types.identityComponent.push({ type: IdentityComponentType.Service });\n\t}\n}\n\n/**\n * Configures the identity resolver.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureIdentityResolver(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.identityResolverConnector ??= [];\n\n\tif (envVars.identityResolverConnector === IdentityResolverConnectorType.EntityStorage) {\n\t\tcoreConfig.types.identityResolverConnector.push({\n\t\t\ttype: IdentityResolverConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.identityResolverConnector === IdentityResolverConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.identityResolverConnector.push({\n\t\t\ttype: IdentityResolverConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\t...(dltConfig?.options?.config as IIotaConfig),\n\t\t\t\t\tidentityPkgId: Is.stringValue(envVars.iotaIdentityPackageId)\n\t\t\t\t\t\t? envVars.iotaIdentityPackageId\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else if (envVars.identityResolverConnector === IdentityResolverConnectorType.Universal) {\n\t\tcoreConfig.types.identityResolverConnector.push({\n\t\t\ttype: IdentityResolverConnectorType.Universal,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.universalResolverEndpoint ?? \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.identityResolverConnector.length > 0) {\n\t\tcoreConfig.types.identityResolverComponent ??= [];\n\t\tcoreConfig.types.identityResolverComponent.push({\n\t\t\ttype: IdentityResolverComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the identity profile.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureIdentityProfile(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.identityProfileConnector ??= [];\n\n\tif (envVars.identityProfileConnector === IdentityConnectorType.EntityStorage) {\n\t\tcoreConfig.types.identityProfileConnector.push({\n\t\t\ttype: IdentityProfileConnectorType.EntityStorage\n\t\t});\n\t}\n\n\tif (coreConfig.types.identityProfileConnector.length > 0) {\n\t\tcoreConfig.types.identityProfileComponent ??= [];\n\t\tcoreConfig.types.identityProfileComponent.push({ type: IdentityProfileComponentType.Service });\n\t}\n}\n\n/**\n * Configures the attestation.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAttestation(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.attestationConnector ??= [];\n\n\tif (envVars.attestationConnector === AttestationConnectorType.Nft) {\n\t\tcoreConfig.types.attestationConnector.push({\n\t\t\ttype: AttestationConnectorType.Nft\n\t\t});\n\t}\n\n\tif (coreConfig.types.attestationConnector.length > 0) {\n\t\tcoreConfig.types.attestationComponent ??= [];\n\t\tcoreConfig.types.attestationComponent.push({\n\t\t\ttype: AttestationComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tverificationMethodId: envVars.attestationVerificationMethodId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the auditable item graph.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAuditableItemGraph(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.auditableItemGraphEnabled) ?? false) {\n\t\tcoreConfig.types.auditableItemGraphComponent ??= [];\n\t\tcoreConfig.types.auditableItemGraphComponent.push({\n\t\t\ttype: AuditableItemGraphComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the auditable item stream.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAuditableItemStream(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.auditableItemStreamEnabled) ?? false) {\n\t\tcoreConfig.types.auditableItemStreamComponent ??= [];\n\t\tcoreConfig.types.auditableItemStreamComponent.push({\n\t\t\ttype: AuditableItemStreamComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the data processing.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDataProcessing(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.dataProcessingEnabled) ?? false) {\n\t\tcoreConfig.types.dataProcessingComponent ??= [];\n\t\tcoreConfig.types.dataProcessingComponent.push({ type: DataProcessingComponentType.Service });\n\n\t\tcoreConfig.types.dataConverterConnector ??= [];\n\n\t\tconst converterConnectors = commaSeparatedListToArray(envVars.dataConverterConnectors);\n\t\tfor (const converterConnector of converterConnectors) {\n\t\t\tcoreConfig.types.dataConverterConnector.push({\n\t\t\t\ttype: converterConnector as DataConverterConnectorType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.dataExtractorConnector ??= [];\n\t\tconst extractorConnectors = commaSeparatedListToArray(envVars.dataExtractorConnectors);\n\t\tfor (const extractorConnector of extractorConnectors) {\n\t\t\tcoreConfig.types.dataExtractorConnector.push({\n\t\t\t\ttype: extractorConnector as DataExtractorConnectorType\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the document management.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDocumentManagement(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.documentManagementEnabled) ?? false) {\n\t\tcoreConfig.types.documentManagementComponent ??= [];\n\t\tcoreConfig.types.documentManagementComponent.push({\n\t\t\ttype: DocumentManagementComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the trust components.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTrust(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isTrustRequired(envVars)) {\n\t\tcoreConfig.types.trustComponent ??= [];\n\t\tcoreConfig.types.trustComponent.push({\n\t\t\ttype: TrustComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.trustGeneratorComponent ??= [];\n\t\tconst trustGeneratorTypes = commaSeparatedListToArray(envVars.trustGenerators);\n\t\tfor (const trustGeneratorType of trustGeneratorTypes) {\n\t\t\tcoreConfig.types.trustGeneratorComponent.push({\n\t\t\t\ttype: trustGeneratorType as TrustGeneratorComponentType,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tverificationMethodId: envVars.trustVerificationMethodId ?? \"\",\n\t\t\t\t\t\ttokenTtlInSeconds: Coerce.integer(envVars.trustJwtTtlSeconds)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.trustVerifierComponent ??= [];\n\t\tconst trustVerifierTypes = commaSeparatedListToArray(envVars.trustVerifiers);\n\t\tfor (const trustVerifierType of trustVerifierTypes) {\n\t\t\tcoreConfig.types.trustVerifierComponent.push({\n\t\t\t\ttype: trustVerifierType as TrustVerifierComponentType\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the rights management.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureRightsManagement(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isRightsManagementRequired(envVars)) {\n\t\tcoreConfig.types.rightsManagementPapComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPapComponent.push({\n\t\t\ttype: RightsManagementPapComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPmpComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPmpComponent.push({\n\t\t\ttype: RightsManagementPmpComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPipComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPipComponent.push({\n\t\t\ttype: RightsManagementPipComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPxpComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPxpComponent.push({\n\t\t\ttype: RightsManagementPxpComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPdpComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPdpComponent.push({\n\t\t\ttype: RightsManagementPdpComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPepComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPepComponent.push({\n\t\t\ttype: RightsManagementPepComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPnpComponent ??= [];\n\n\t\t// Single source of truth for the rights-management mount path.\n\t\tconst rightsManagementPath = envVars.rightsManagementCallbackPath ?? \"rights-management\";\n\n\t\t// We add a multi instance REST client for the remote negotiations\n\t\t// use a dummy endpoint for now as the actual endpoint will be provided in the config\n\t\t// of the policy negotiator when it is used for remote negotiations\n\t\t// We must add it before the service as the service needs to be able to request\n\t\t// the REST client type from the engine core to be able to support remote negotiations\n\t\tcoreConfig.types.rightsManagementPnpComponent.push({\n\t\t\ttype: RightsManagementPnpComponentType.RestClient,\n\t\t\toptions: {\n\t\t\t\tendpoint: \"http://localhost\",\n\t\t\t\tpathPrefix: rightsManagementPath\n\t\t\t},\n\t\t\tisMultiInstance: true,\n\t\t\tfeatures: [\"remote\"]\n\t\t});\n\t\tcoreConfig.types.rightsManagementPnpComponent.push({\n\t\t\ttype: RightsManagementPnpComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tcallbackPath: rightsManagementPath,\n\t\t\t\t\tincludeErrorDetails: coreConfig.debug ?? false\n\t\t\t\t}\n\t\t\t},\n\t\t\tisDefault: true\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPnapComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPnapComponent.push({\n\t\t\ttype: RightsManagementPnapComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPolicyArbiterComponent ??= [];\n\t\tconst policyArbiterTypes = commaSeparatedListToArray(envVars.rightsManagementPolicyArbiters);\n\t\tfor (const policyArbiterType of policyArbiterTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyArbiterComponent.push({\n\t\t\t\ttype: policyArbiterType as RightsManagementPolicyArbiterComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyObligationEnforcerComponent ??= [];\n\t\tconst policyObligationEnforcerTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyObligationEnforcers\n\t\t);\n\t\tfor (const policyObligationEnforcerType of policyObligationEnforcerTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyObligationEnforcerComponent.push({\n\t\t\t\ttype: policyObligationEnforcerType as RightsManagementPolicyObligationEnforcerComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyEnforcementProcessorComponent ??= [];\n\t\tconst policyEnforcementProcessTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyEnforcementProcessors\n\t\t);\n\t\tfor (const policyEnforcementProcessorType of policyEnforcementProcessTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyEnforcementProcessorComponent.push({\n\t\t\t\ttype: policyEnforcementProcessorType as RightsManagementPolicyEnforcementProcessorComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyExecutionActionComponent ??= [];\n\t\tconst policyExecutionActionTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyExecutionActions\n\t\t);\n\t\tfor (const policyExecutionActionType of policyExecutionActionTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyExecutionActionComponent.push({\n\t\t\t\ttype: policyExecutionActionType as RightsManagementPolicyExecutionActionComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyInformationSourceComponent ??= [];\n\t\tconst policyInformationSourceTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyInformationSources\n\t\t);\n\t\tfor (const policyInformationSourceType of policyInformationSourceTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyInformationSourceComponent.push({\n\t\t\t\ttype: policyInformationSourceType as RightsManagementPolicyInformationSourceComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyRequesterComponent ??= [];\n\t\tconst policyRequesterTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyRequesters\n\t\t);\n\t\tfor (const policyRequesterType of policyRequesterTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyRequesterComponent.push({\n\t\t\t\ttype: policyRequesterType as RightsManagementPolicyRequesterComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyNegotiatorComponent ??= [];\n\t\tconst policyNegotiatorTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyNegotiators\n\t\t);\n\t\tfor (const policyNegotiatorType of policyNegotiatorTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyNegotiatorComponent.push({\n\t\t\t\ttype: policyNegotiatorType as RightsManagementPolicyNegotiatorComponentType\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the task scheduler.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTaskScheduler(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isTaskSchedulerRequired(envVars)) {\n\t\tcoreConfig.types.taskSchedulerComponent ??= [];\n\t\tcoreConfig.types.taskSchedulerComponent.push({\n\t\t\ttype: TaskSchedulerComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the synchronised storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureSynchronisedStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (\n\t\tIs.arrayValue(coreConfig.types.identityResolverComponent) &&\n\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false)\n\t) {\n\t\t// Check if the config provides a custom verifiable storage key id\n\t\tlet verifiableStorageKeyId = Coerce.string(envVars.synchronisedStorageVerifiableStorageKeyId);\n\n\t\tif (!Is.stringValue(verifiableStorageKeyId)) {\n\t\t\t// No custom key so default to the network setting\n\t\t\tverifiableStorageKeyId = envVars.iotaNetwork;\n\t\t}\n\t\tcoreConfig.types.synchronisedStorageComponent ??= [];\n\t\tcoreConfig.types.synchronisedStorageComponent.push({\n\t\t\ttype: SynchronisedStorageComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tverifiableStorageKeyId: verifiableStorageKeyId ?? \"\",\n\t\t\t\t\tblobStorageEncryptionKeyId: envVars.synchronisedStorageBlobStorageEncryptionKeyId,\n\t\t\t\t\tentityUpdateIntervalMinutes: Coerce.number(\n\t\t\t\t\t\tenvVars.synchronisedStorageEntityUpdateIntervalMinutes\n\t\t\t\t\t),\n\t\t\t\t\tconsolidationIntervalMinutes: Coerce.number(\n\t\t\t\t\t\tenvVars.synchronisedStorageConsolidationIntervalMinutes\n\t\t\t\t\t),\n\t\t\t\t\tconsolidationBatchSize: Coerce.number(envVars.synchronisedStorageConsolidationBatchSize),\n\t\t\t\t\tmaxConsolidations: Coerce.number(envVars.synchronisedStorageMaxConsolidations)\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// If there is a trusted url set, we need to add a client\n\t\t// and give it a feature of trusted so that when the synchronised\n\t\t// storage is created it can pickup the correct component\n\t\tif (Is.stringValue(envVars.synchronisedStorageTrustedUrl)) {\n\t\t\tcoreConfig.types.synchronisedStorageComponent.push({\n\t\t\t\ttype: SynchronisedStorageComponentType.RestClient,\n\t\t\t\toptions: {\n\t\t\t\t\tendpoint: envVars.synchronisedStorageTrustedUrl\n\t\t\t\t},\n\t\t\t\tfeatures: [\"trusted\"]\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the federated catalogue.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureFederatedCatalogue(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isFederatedCatalogueRequired(envVars)) {\n\t\t// If synchronised storage is enabled, then we need to add an entity storage connector\n\t\t// using synchronised storage for the federated catalogue component\n\t\t// as it relies on the synchronised storage to sync the data between the different instances of the federated catalogue\n\t\tlet overrideEntityStorageType;\n\t\tif (\n\t\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false) &&\n\t\t\tIs.arrayValue(coreConfig.types.entityStorageConnector)\n\t\t) {\n\t\t\tlet defaultConnector = coreConfig.types.entityStorageConnector.find(\n\t\t\t\tconnector => connector.isDefault\n\t\t\t);\n\t\t\tif (Is.empty(defaultConnector)) {\n\t\t\t\t// If there is no default connector, we set the first one as the default one\n\t\t\t\tdefaultConnector = coreConfig.types.entityStorageConnector[0];\n\t\t\t}\n\n\t\t\toverrideEntityStorageType = \"federated-catalogue-dataset\";\n\t\t\tcoreConfig.types.entityStorageConnector ??= [];\n\t\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\t\ttype: EntityStorageConnectorType.Synchronised,\n\t\t\t\toverrideInstanceType: overrideEntityStorageType,\n\t\t\t\toptions: {\n\t\t\t\t\tentityStorageConnectorType: defaultConnector.type\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.federatedCatalogueComponent ??= [];\n\t\tcoreConfig.types.federatedCatalogueComponent.push({\n\t\t\ttype: FederatedCatalogueComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tdatasetEntityStorageType: overrideEntityStorageType\n\t\t\t}\n\t\t});\n\n\t\tcoreConfig.types.federatedCatalogueFilterComponent ??= [];\n\t\tconst filters = commaSeparatedListToArray(envVars.federatedCatalogueFilters);\n\n\t\tfor (const filter of filters) {\n\t\t\tcoreConfig.types.federatedCatalogueFilterComponent.push({\n\t\t\t\ttype: filter as FederatedCatalogueFilterComponentType,\n\t\t\t\toptions: {}\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the dataspace control plane and data plane.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDataspace(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.dataspaceEnabled) ?? false) {\n\t\tcoreConfig.types.dataspaceControlPlaneComponent ??= [];\n\t\tcoreConfig.types.dataspaceControlPlaneComponent.push({\n\t\t\ttype: DataspaceControlPlaneComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tdataPlanePath: envVars.dataspaceDataPlanePath\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tcoreConfig.types.dataspaceDataPlaneComponent ??= [];\n\t\tcoreConfig.types.dataspaceDataPlaneComponent.push({\n\t\t\ttype: DataspaceDataPlaneComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tretainActivityLogsFor: Coerce.number(envVars.dataspaceRetainActivityLogsFor),\n\t\t\t\t\tactivityLogsCleanUpInterval: Coerce.number(envVars.dataspaceActivityLogsCleanUpInterval)\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the DLT.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDlt(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\t// Create centralized DLT configuration for IOTA if essential IOTA variables are set\n\tif (Is.stringValue(envVars.iotaNodeEndpoint) && Is.stringValue(envVars.iotaNetwork)) {\n\t\tcoreConfig.types.dltConfig ??= [];\n\n\t\tconst gasStationConfig =\n\t\t\tIs.stringValue(envVars.iotaGasStationEndpoint) &&\n\t\t\tIs.stringValue(envVars.iotaGasStationAuthToken)\n\t\t\t\t? {\n\t\t\t\t\t\tgasStationUrl: envVars.iotaGasStationEndpoint,\n\t\t\t\t\t\tgasStationAuthToken: envVars.iotaGasStationAuthToken\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\tcoreConfig.types.dltConfig.push({\n\t\t\ttype: DltConfigType.Iota,\n\t\t\tisDefault: true,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tclientOptions: {\n\t\t\t\t\t\turl: envVars.iotaNodeEndpoint ?? \"\"\n\t\t\t\t\t},\n\t\t\t\t\tnetwork: envVars.iotaNetwork ?? \"\",\n\t\t\t\t\tcoinType: Coerce.number(envVars.iotaCoinType),\n\t\t\t\t\tgasStation: gasStationConfig\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Converts a comma separated list to an array.\n * @param value The comma separated list.\n * @returns The array.\n */\nfunction commaSeparatedListToArray<T>(value: string | undefined): T[] {\n\treturn (value ?? \"\")\n\t\t.split(\",\")\n\t\t.map(item => item.trim())\n\t\t.filter(item => item.length > 0) as T[];\n}\n\n/**\n * Checks if the trust subsystem is required.\n * Returns true when any component that depends on the trust subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if rights-management, synchronised-storage, or dataspace is enabled.\n */\nexport function isTrustRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\tisRightsManagementRequired(envVars) ||\n\t\t(Coerce.boolean(envVars.dataspaceEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false)\n\t);\n}\n\n/**\n * Checks if the URL transformer subsystem is required.\n * Returns true when any component that depends on the URL transformer subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if rights-management, dataspace, federated-catalogue, tenant, or auth entity storage is enabled.\n */\nexport function isUrlTransformerRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\tisRightsManagementRequired(envVars) ||\n\t\t(Coerce.boolean(envVars.dataspaceEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.tenantEnabled) ?? false) ||\n\t\tisFederatedCatalogueRequired(envVars) ||\n\t\tisAuthEntityStorageRequired(envVars)\n\t);\n}\n\n/**\n * Checks if the background tasks subsystem is required.\n * Returns true when any component that depends on the background tasks subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if dataspace or verifiable storage is enabled.\n */\nexport function isBackgroundTasksRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (Coerce.boolean(envVars.dataspaceEnabled) ?? false) || isImmutableProofRequired(envVars);\n}\n\n/**\n * Checks if the immutable proof subsystem is required.\n * Returns true when any component that depends on the immutable proof subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if verifiable storage is enabled.\n */\nexport function isImmutableProofRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\t(Coerce.boolean(envVars.auditableItemGraphEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.auditableItemStreamEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.documentManagementEnabled) ?? false)\n\t);\n}\n\n/**\n * Checks if the immutable proof subsystem is required.\n * Returns true when any component that depends on the immutable proof subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if verifiable storage is enabled.\n */\nexport function isFederatedCatalogueRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn Coerce.boolean(envVars.dataspaceEnabled) ?? false;\n}\n\n/**\n * Checks if the rights management subsystem is required.\n * Returns true when any component that depends on the rights management subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if rights management is enabled.\n */\nexport function isRightsManagementRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn Coerce.boolean(envVars.dataspaceEnabled) ?? false;\n}\n\n/**\n * Checks if the task scheduler subsystem is required.\n * Returns true when any component that depends on the task scheduler subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if task scheduler is enabled.\n */\nexport function isTaskSchedulerRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\t(Coerce.boolean(envVars.dataspaceEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false) ||\n\t\tisRightsManagementRequired(envVars) ||\n\t\tisAuthEntityStorageRequired(envVars)\n\t);\n}\n\n/**\n * Checks if the automation subsystem is required.\n * Returns true when any component that depends on the automation subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if automation is enabled.\n */\nexport function isAutomationRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn isRightsManagementRequired(envVars);\n}\n\n/**\n * Checks if the telemetry subsystem is required.\n * Returns true when any component that depends on the telemetry subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if telemetry is enabled.\n */\nexport function isTelemetryRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\tenvVars.telemetryConnector === TelemetryConnectorType.EntityStorage ||\n\t\tenvVars.telemetryConnector === TelemetryConnectorType.OpenTelemetry\n\t);\n}\n"]}
1
+ {"version":3,"file":"engineEnvBuilder.js","sourceRoot":"","sources":["../../../src/builders/engineEnvBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport path from \"node:path\";\nimport { Coerce, Is } from \"@twin.org/core\";\nimport type { IIotaConfig } from \"@twin.org/dlt-iota\";\nimport {\n\tAttestationComponentType,\n\tAttestationConnectorType,\n\tAuditableItemGraphComponentType,\n\tAuditableItemStreamComponentType,\n\ttype AutomationActionConfig,\n\ttype AutomationActionType,\n\tAutomationComponentType,\n\tBackgroundTaskComponentType,\n\tBlobStorageComponentType,\n\tBlobStorageConnectorType,\n\tContextIdHandlerComponentType,\n\ttype DataConverterConnectorType,\n\ttype DataExtractorConnectorType,\n\tDataProcessingComponentType,\n\tDataspaceControlPlaneComponentType,\n\tDataspaceDataPlaneComponentType,\n\ttype DltConfig,\n\tDltConfigType,\n\tDocumentManagementComponentType,\n\tEngineTypeHelper,\n\tEntityStorageConnectorType,\n\tEventBusComponentType,\n\tEventBusConnectorType,\n\tFaucetConnectorType,\n\tFederatedCatalogueComponentType,\n\ttype FederatedCatalogueFilterComponentType,\n\tHealthComponentType,\n\tIdentityComponentType,\n\tIdentityConnectorType,\n\tIdentityProfileComponentType,\n\tIdentityProfileConnectorType,\n\tIdentityResolverComponentType,\n\tIdentityResolverConnectorType,\n\ttype IEngineConfig,\n\tImmutableProofComponentType,\n\tLoggingComponentType,\n\tLoggingConnectorType,\n\tMessagingAdminComponentType,\n\tMessagingComponentType,\n\tMessagingEmailConnectorType,\n\tMessagingPushNotificationConnectorType,\n\tMessagingSmsConnectorType,\n\tMetricsCollectorComponentType,\n\tMetricsProducerComponentType,\n\tNftComponentType,\n\tNftConnectorType,\n\tNotarizationComponentType,\n\tNotarizationConnectorType,\n\tRightsManagementPapComponentType,\n\tRightsManagementPdpComponentType,\n\tRightsManagementPepComponentType,\n\tRightsManagementPipComponentType,\n\tRightsManagementPmpComponentType,\n\tRightsManagementPnapComponentType,\n\tRightsManagementPnpComponentType,\n\ttype RightsManagementPolicyArbiterComponentType,\n\ttype RightsManagementPolicyEnforcementProcessorComponentType,\n\ttype RightsManagementPolicyExecutionActionComponentType,\n\ttype RightsManagementPolicyInformationSourceComponentType,\n\ttype RightsManagementPolicyNegotiatorComponentType,\n\ttype RightsManagementPolicyObligationEnforcerComponentType,\n\ttype RightsManagementPolicyRequesterComponentType,\n\tRightsManagementPxpComponentType,\n\tSynchronisedStorageComponentType,\n\tTaskSchedulerComponentType,\n\tTelemetryComponentType,\n\tTelemetryConnectorType,\n\tTenantAdminComponentType,\n\tTrustComponentType,\n\ttype TrustGeneratorComponentType,\n\ttype TrustVerifierComponentType,\n\tUrlTransformerComponentType,\n\tVaultConnectorType,\n\tVerifiableStorageComponentType,\n\tVerifiableStorageConnectorType,\n\tWalletConnectorType\n} from \"@twin.org/engine-types\";\nimport {\n\ttype IOpenTelemetryTelemetryConnectorConfig,\n\tOpenTelemetryReaderTypes\n} from \"@twin.org/telemetry-connector-opentelemetry\";\nimport { CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT } from \"../defaults.js\";\nimport { isAuthEntityStorageRequired } from \"./engineServerEnvBuilder.js\";\nimport type { IEngineEnvironmentVariables } from \"../models/IEngineEnvironmentVariables.js\";\n\n/**\n * Build the engine core configuration from environment variables.\n * @param envVars The environment variables.\n * @param contextIdKeys The context ID keys.\n * @returns The config for the core.\n */\nexport async function buildEngineConfiguration(\n\tenvVars: IEngineEnvironmentVariables,\n\tcontextIdKeys: { key: string; requiredHandlerFeatures: string[] }[]\n): Promise<IEngineConfig> {\n\tif (Is.stringValue(envVars.storageFileRoot)) {\n\t\tenvVars.stateFilename ??= \"engine-state.json\";\n\t\tenvVars.storageFileRoot = path.resolve(envVars.storageFileRoot);\n\t\tenvVars.stateFilename = path.join(envVars.storageFileRoot, envVars.stateFilename);\n\t}\n\n\tconst coreConfig: IEngineConfig = {\n\t\tdebug: Coerce.boolean(envVars.debug) ?? false,\n\t\tsilent: Coerce.boolean(envVars.silent) ?? false,\n\t\ttypes: {}\n\t};\n\n\tawait configureTenant(coreConfig, envVars);\n\tawait configureContextIdHandlers(coreConfig, envVars);\n\n\tawait configureEntityStorage(coreConfig, envVars);\n\tawait configureBlobStorage(coreConfig, envVars);\n\tawait configureVault(coreConfig, envVars);\n\tawait configureDlt(coreConfig, envVars);\n\n\tawait configureLogging(coreConfig, envVars);\n\tawait configureBackgroundTask(coreConfig, envVars);\n\tawait configureTaskScheduler(coreConfig, envVars);\n\tawait configureEventBus(coreConfig, envVars);\n\tawait configureTelemetry(coreConfig, envVars);\n\tawait configureMetricsCollector(coreConfig, envVars);\n\tawait configureMessaging(coreConfig, envVars);\n\tawait configureAutomation(coreConfig, envVars);\n\tawait configureHealth(coreConfig, envVars);\n\tawait configureUrlTransformer(coreConfig, envVars);\n\n\tawait configureFaucet(coreConfig, envVars);\n\tawait configureWallet(coreConfig, envVars);\n\tawait configureNft(coreConfig, envVars);\n\tawait configureNotarization(coreConfig, envVars);\n\tawait configureVerifiableStorage(coreConfig, envVars);\n\tawait configureImmutableProof(coreConfig, envVars);\n\tawait configureIdentity(coreConfig, envVars);\n\tawait configureIdentityResolver(coreConfig, envVars);\n\tawait configureIdentityProfile(coreConfig, envVars);\n\tawait configureAttestation(coreConfig, envVars);\n\tawait configureDataProcessing(coreConfig, envVars);\n\n\tawait configureAuditableItemGraph(coreConfig, envVars);\n\tawait configureAuditableItemStream(coreConfig, envVars);\n\tawait configureDocumentManagement(coreConfig, envVars);\n\tawait configureTrust(coreConfig, envVars);\n\tawait configureRightsManagement(coreConfig, envVars);\n\tawait configureSynchronisedStorage(coreConfig, envVars);\n\tawait configureFederatedCatalogue(coreConfig, envVars);\n\tawait configureDataspace(coreConfig, envVars);\n\n\treturn coreConfig;\n}\n\n/**\n * Configures the entity storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureEntityStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types ??= {};\n\tcoreConfig.types.entityStorageConnector ??= [];\n\n\tconst entityStorageConnectorTypes = commaSeparatedListToArray<\n\t\tOmit<EntityStorageConnectorType, typeof EntityStorageConnectorType.Synchronised>\n\t>(envVars.entityStorageConnectorType);\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.Memory)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.Memory\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.File)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.File,\n\t\t\toptions: {\n\t\t\t\tconfig: { directory: envVars.storageFileRoot ?? \"\" },\n\t\t\t\tfolderPrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.AwsDynamoDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.AwsDynamoDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tregion: envVars.awsDynamodbRegion ?? \"\",\n\t\t\t\t\tauthMode: envVars.awsDynamodbAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\taccessKeyId: envVars.awsDynamodbAccessKeyId,\n\t\t\t\t\tsecretAccessKey: envVars.awsDynamodbSecretAccessKey,\n\t\t\t\t\tendpoint: envVars.awsDynamodbEndpoint,\n\t\t\t\t\tconnectionTimeoutMs: Coerce.integer(envVars.awsDynamodbConnectionTimeoutMs)\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.AzureCosmosDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.AzureCosmosDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.azureCosmosdbEndpoint ?? \"\",\n\t\t\t\t\tkey: envVars.azureCosmosdbKey ?? \"\",\n\t\t\t\t\tdatabaseId: envVars.azureCosmosdbDatabaseId ?? \"\",\n\t\t\t\t\tcontainerId: envVars.azureCosmosdbContainerId ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.GcpFirestoreDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.GcpFirestoreDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tprojectId: envVars.gcpFirestoreProjectId ?? \"\",\n\t\t\t\t\tcredentials: envVars.gcpFirestoreCredentials ?? \"\",\n\t\t\t\t\tdatabaseId: envVars.gcpFirestoreDatabaseId ?? \"\",\n\t\t\t\t\tcollectionName: envVars.gcpFirestoreCollectionName ?? \"\",\n\t\t\t\t\tendpoint: envVars.gcpFirestoreApiEndpoint ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.ScyllaDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.ScyllaDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thosts: commaSeparatedListToArray(envVars.scylladbHosts),\n\t\t\t\t\tlocalDataCenter: envVars.scylladbLocalDataCenter ?? \"\",\n\t\t\t\t\tkeyspace: envVars.scylladbKeyspace ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.scylladbPort)\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.MySqlDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.MySqlDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thost: envVars.mySqlHost ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.mySqlPort),\n\t\t\t\t\tuser: envVars.mySqlUser ?? \"\",\n\t\t\t\t\tpassword: envVars.mySqlPassword ?? \"\",\n\t\t\t\t\tdatabase: envVars.mySqlDatabase ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.MongoDb)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.MongoDb,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thost: envVars.mongoDbHost ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.mongoDbPort),\n\t\t\t\t\tuser: envVars.mongoDbUser ?? \"\",\n\t\t\t\t\tpassword: envVars.mongoDbPassword ?? \"\",\n\t\t\t\t\tdatabase: envVars.mongoDbDatabase ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (entityStorageConnectorTypes.includes(EntityStorageConnectorType.PostgreSql)) {\n\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\ttype: EntityStorageConnectorType.PostgreSql,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thost: envVars.postgreSqlHost ?? \"\",\n\t\t\t\t\tport: Coerce.integer(envVars.postgreSqlPort),\n\t\t\t\t\tuser: envVars.postgreSqlUser ?? \"\",\n\t\t\t\t\tpassword: envVars.postgreSqlPassword ?? \"\",\n\t\t\t\t\tdatabase: envVars.postgreSqlDatabase ?? \"\"\n\t\t\t\t},\n\t\t\t\ttablePrefix: envVars.entityStorageTablePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tconst defaultEntityStorageConnectorType =\n\t\tenvVars.entityStorageConnectorDefault ?? entityStorageConnectorTypes[0];\n\n\tif (Is.arrayValue(entityStorageConnectorTypes)) {\n\t\tfor (const config of coreConfig.types.entityStorageConnector) {\n\t\t\tif (config.type === defaultEntityStorageConnectorType) {\n\t\t\t\tconfig.isDefault = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Configures the blob storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureBlobStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.blobStorageConnector ??= [];\n\n\tconst blobStorageConnectorTypes = commaSeparatedListToArray(envVars.blobStorageConnectorType);\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.Memory)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.Memory\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.File)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.File,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tdirectory: Is.stringValue(envVars.storageFileRoot)\n\t\t\t\t\t\t? path.join(envVars.storageFileRoot, \"blob-storage\")\n\t\t\t\t\t\t: \"\"\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.Ipfs)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.Ipfs,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tapiUrl: envVars.ipfsApiUrl ?? \"\",\n\t\t\t\t\tbearerToken: envVars.ipfsBearerToken\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.AwsS3)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.AwsS3,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tregion: envVars.awsS3Region ?? \"\",\n\t\t\t\t\tbucketName: envVars.awsS3BucketName ?? \"\",\n\t\t\t\t\tauthMode: envVars.awsS3AuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\taccessKeyId: envVars.awsS3AccessKeyId,\n\t\t\t\t\tsecretAccessKey: envVars.awsS3SecretAccessKey,\n\t\t\t\t\tendpoint: envVars.awsS3Endpoint\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.AzureStorage)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.AzureStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\taccountName: envVars.azureStorageAccountName ?? \"\",\n\t\t\t\t\taccountKey: envVars.azureStorageAccountKey ?? \"\",\n\t\t\t\t\tcontainerName: envVars.azureStorageContainerName ?? \"\",\n\t\t\t\t\tendpoint: envVars.azureStorageEndpoint ?? \"\"\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (blobStorageConnectorTypes.includes(BlobStorageConnectorType.GcpStorage)) {\n\t\tcoreConfig.types.blobStorageConnector.push({\n\t\t\ttype: BlobStorageConnectorType.GcpStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tprojectId: envVars.gcpStorageProjectId ?? \"\",\n\t\t\t\t\tcredentials: envVars.gcpStorageCredentials ?? \"\",\n\t\t\t\t\tbucketName: envVars.gcpStorageBucketName ?? \"\",\n\t\t\t\t\tapiEndpoint: envVars.gcpFirestoreApiEndpoint\n\t\t\t\t},\n\t\t\t\tstoragePrefix: envVars.blobStoragePrefix\n\t\t\t}\n\t\t});\n\t}\n\n\tif (Is.arrayValue(blobStorageConnectorTypes)) {\n\t\tconst defaultStorageConnectorType =\n\t\t\tenvVars.blobStorageConnectorDefault ?? blobStorageConnectorTypes[0];\n\t\tfor (const config of coreConfig.types.blobStorageConnector) {\n\t\t\tif (config.type === defaultStorageConnectorType) {\n\t\t\t\tconfig.isDefault = true;\n\t\t\t}\n\t\t\t// If this blob storage connector is the one to use for public access\n\t\t\t// then add it as a feature\n\t\t\tif (\n\t\t\t\tIs.stringValue(envVars.blobStorageConnectorPublic) &&\n\t\t\t\tconfig.type === envVars.blobStorageConnectorPublic\n\t\t\t) {\n\t\t\t\tconfig.features ??= [];\n\t\t\t\tconfig.features.push(\"public\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (coreConfig.types.blobStorageConnector.length > 0) {\n\t\tcoreConfig.types.blobStorageComponent ??= [];\n\t\tcoreConfig.types.blobStorageComponent.push({\n\t\t\ttype: BlobStorageComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tvaultKeyId:\n\t\t\t\t\t\t(envVars.blobStorageEnableEncryption ?? false)\n\t\t\t\t\t\t\t? envVars.blobStorageEncryptionKeyId\n\t\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the logging.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureLogging(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.loggingConnector ??= [];\n\n\tconst loggingConnectorTypes = commaSeparatedListToArray<LoggingConnectorType>(\n\t\tenvVars.loggingConnector\n\t);\n\tlet additionalConnectorCount = 0;\n\n\tfor (const loggingConnector of loggingConnectorTypes) {\n\t\tif (loggingConnector === LoggingConnectorType.Console) {\n\t\t\tcoreConfig.types.loggingConnector.push({\n\t\t\t\ttype: LoggingConnectorType.Console,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\ttranslateMessages: true,\n\t\t\t\t\t\thideGroups: true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tadditionalConnectorCount++;\n\t\t} else if (loggingConnector === LoggingConnectorType.EntityStorage) {\n\t\t\tcoreConfig.types.loggingConnector.push({\n\t\t\t\ttype: LoggingConnectorType.EntityStorage\n\t\t\t});\n\t\t\tadditionalConnectorCount++;\n\t\t}\n\t}\n\n\t// If more than one logging connector, then we need to add a multi connector\n\t// and set it as the default one\n\tif (additionalConnectorCount > 1) {\n\t\tcoreConfig.types.loggingConnector.push({\n\t\t\ttype: LoggingConnectorType.Multi,\n\t\t\toptions: {\n\t\t\t\tloggingConnectorTypes\n\t\t\t},\n\t\t\tisDefault: true\n\t\t});\n\t} else if (additionalConnectorCount > 0) {\n\t\t// If only one connector, then we set it as the default one\n\t\tcoreConfig.types.loggingConnector[coreConfig.types.loggingConnector.length - 1].isDefault =\n\t\t\ttrue;\n\t}\n\n\tif (additionalConnectorCount > 0) {\n\t\tcoreConfig.types.loggingComponent ??= [];\n\t\t// We set the isDefault flag so that other components will get this service by default\n\t\t// and not the generic one from the engine core\n\t\tcoreConfig.types.loggingComponent.push({ type: LoggingComponentType.Service, isDefault: true });\n\t}\n}\n\n/**\n * Configures the vault.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureVault(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.vaultConnector ??= [];\n\n\tif (envVars.vaultConnector === VaultConnectorType.EntityStorage) {\n\t\tcoreConfig.types.vaultConnector.push({\n\t\t\ttype: VaultConnectorType.EntityStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tprefix: envVars.vaultPrefix\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else if (envVars.vaultConnector === VaultConnectorType.Hashicorp) {\n\t\tcoreConfig.types.vaultConnector.push({\n\t\t\ttype: VaultConnectorType.Hashicorp,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.hashicorpVaultEndpoint ?? \"\",\n\t\t\t\t\ttoken: envVars.hashicorpVaultToken ?? \"\",\n\t\t\t\t\tprefix: envVars.vaultPrefix\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the background task.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureBackgroundTask(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.backgroundTaskComponent ??= [];\n\n\tif (isBackgroundTasksRequired(envVars)) {\n\t\tcoreConfig.types.backgroundTaskComponent.push({\n\t\t\ttype: BackgroundTaskComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the event bud.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureEventBus(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.eventBusConnector ??= [];\n\n\tif (envVars.eventBusConnector === EventBusConnectorType.Local) {\n\t\tcoreConfig.types.eventBusConnector.push({\n\t\t\ttype: EventBusConnectorType.Local\n\t\t});\n\t}\n\n\tif (coreConfig.types.eventBusConnector.length > 0) {\n\t\tcoreConfig.types.eventBusComponent ??= [];\n\t\tcoreConfig.types.eventBusComponent.push({ type: EventBusComponentType.Service });\n\t}\n}\n\n/**\n * Configures the telemetry.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTelemetry(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.telemetryConnector ??= [];\n\n\tif (envVars.telemetryConnector === TelemetryConnectorType.EntityStorage) {\n\t\tcoreConfig.types.telemetryConnector.push({\n\t\t\ttype: TelemetryConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.telemetryConnector === TelemetryConnectorType.OpenTelemetry) {\n\t\tlet readers: IOpenTelemetryTelemetryConnectorConfig[\"readers\"];\n\t\tif (envVars.openTelemetryReader === \"prometheus\") {\n\t\t\treaders = {\n\t\t\t\tprometheus: {\n\t\t\t\t\ttype: OpenTelemetryReaderTypes.Prometheus,\n\t\t\t\t\tport: Coerce.integer(envVars.openTelemetryPrometheusPort)\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tcoreConfig.types.telemetryConnector.push({\n\t\t\ttype: TelemetryConnectorType.OpenTelemetry,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tmeterName: envVars.openTelemetryMeterName,\n\t\t\t\t\tmeterVersion: envVars.openTelemetryMeterVersion,\n\t\t\t\t\treaders\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.telemetryConnector.length > 0) {\n\t\tcoreConfig.types.telemetryComponent ??= [];\n\t\tcoreConfig.types.telemetryComponent.push({ type: TelemetryComponentType.Service });\n\t}\n}\n\n/**\n * Configures the metrics producers and orchestrator service.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureMetricsCollector(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isTelemetryRequired(envVars)) {\n\t\tconst intervalSec = Coerce.integer(envVars.telemetryMetricsCollectorIntervalSeconds) ?? 60;\n\n\t\tcoreConfig.types.metricsCollectorComponent ??= [];\n\t\tcoreConfig.types.metricsCollectorComponent.push({\n\t\t\ttype: MetricsCollectorComponentType.Service,\n\t\t\toptions: { config: { intervalMs: intervalSec * 1000 } }\n\t\t});\n\n\t\tconst maxHistory = Coerce.integer(envVars.telemetryMetricsProducerMaxHistory) ?? 1440;\n\t\tcoreConfig.types.metricsProducerComponent ??= [];\n\n\t\tconst metricsProducers = commaSeparatedListToArray(\n\t\t\tenvVars.telemetryMetricsProducers ??\n\t\t\t\t[MetricsProducerComponentType.System, MetricsProducerComponentType.Process].join(\",\")\n\t\t);\n\n\t\tfor (const producerType of metricsProducers) {\n\t\t\tcoreConfig.types.metricsProducerComponent.push({\n\t\t\t\ttype: producerType as MetricsProducerComponentType,\n\t\t\t\toptions: { maxHistory }\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the automation.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAutomation(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.automationComponent ??= [];\n\n\tif (isAutomationRequired(envVars)) {\n\t\tcoreConfig.types.automationComponent.push({\n\t\t\ttype: AutomationComponentType.Service\n\t\t});\n\n\t\tconst automationActionTypes = commaSeparatedListToArray(envVars.automationActionTypes);\n\n\t\tif (Is.arrayValue(automationActionTypes)) {\n\t\t\tcoreConfig.types.automationAction ??= [];\n\n\t\t\tfor (const actionType of automationActionTypes) {\n\t\t\t\tcoreConfig.types.automationAction.push({\n\t\t\t\t\ttype: actionType as AutomationActionType,\n\t\t\t\t\tisMultiInstance: true\n\t\t\t\t} as unknown as AutomationActionConfig);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Configures the health.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureHealth(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.healthComponent ??= [];\n\n\tif (Coerce.boolean(envVars.healthEnabled) ?? false) {\n\t\tcoreConfig.types.healthComponent.push({\n\t\t\ttype: HealthComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\thealthCheckInterval: (Coerce.integer(envVars.healthIntervalSeconds) ?? 60) * 1000,\n\t\t\t\t\tinitialInterval: (Coerce.integer(envVars.healthStartupIntervalSeconds) ?? 2) * 1000\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the url transformer.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureUrlTransformer(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.urlTransformerComponent ??= [];\n\n\tif (isUrlTransformerRequired(envVars) ?? false) {\n\t\tcoreConfig.types.urlTransformerComponent.push({\n\t\t\ttype: UrlTransformerComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tparamEncryptionKeyName: envVars.urlTransformerEncryptionKeyId,\n\t\t\t\t\tqueryParamNames: {\n\t\t\t\t\t\ttenant: \"tenant-token\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the tenant.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTenant(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.tenantEnabled) ?? false) {\n\t\tcoreConfig.types.tenantAdminComponent ??= [];\n\t\tcoreConfig.types.tenantAdminComponent.push({\n\t\t\ttype: TenantAdminComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.tenantComponent ??= [];\n\t\tcoreConfig.types.tenantComponent.push({ type: TenantAdminComponentType.Service });\n\t}\n}\n\n/**\n * Configures the context id handlers.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureContextIdHandlers(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.contextIdHandlerComponent ??= [];\n\tcoreConfig.types.contextIdHandlerComponent.push({\n\t\ttype: ContextIdHandlerComponentType.Did,\n\t\tfeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t});\n\tif (Coerce.boolean(envVars.tenantEnabled) ?? false) {\n\t\tcoreConfig.types.contextIdHandlerComponent.push({\n\t\t\ttype: ContextIdHandlerComponentType.Tenant,\n\t\t\tfeatures: [CONTEXT_ID_HANDLER_FEATURE_TENANT]\n\t\t});\n\t}\n}\n\n/**\n * Configures the messaging.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureMessaging(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.messagingEnabled) ?? false) {\n\t\tcoreConfig.types.messagingEmailConnector ??= [];\n\t\tcoreConfig.types.messagingSmsConnector ??= [];\n\t\tcoreConfig.types.messagingPushNotificationConnector ??= [];\n\n\t\tif (envVars.messagingEmailConnector === MessagingEmailConnectorType.EntityStorage) {\n\t\t\tcoreConfig.types.messagingEmailConnector.push({\n\t\t\t\ttype: MessagingEmailConnectorType.EntityStorage\n\t\t\t});\n\t\t} else if (envVars.messagingEmailConnector === MessagingEmailConnectorType.Aws) {\n\t\t\tcoreConfig.types.messagingEmailConnector.push({\n\t\t\t\ttype: MessagingEmailConnectorType.Aws,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tregion: envVars.awsSesRegion ?? \"\",\n\t\t\t\t\t\tauthMode: envVars.awsSesAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\t\taccessKeyId: envVars.awsSesAccessKeyId,\n\t\t\t\t\t\tsecretAccessKey: envVars.awsSesSecretAccessKey,\n\t\t\t\t\t\tendpoint: envVars.awsSesEndpoint\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (envVars.messagingSmsConnector === MessagingSmsConnectorType.EntityStorage) {\n\t\t\tcoreConfig.types.messagingSmsConnector.push({\n\t\t\t\ttype: MessagingSmsConnectorType.EntityStorage\n\t\t\t});\n\t\t} else if (envVars.messagingSmsConnector === MessagingSmsConnectorType.Aws) {\n\t\t\tcoreConfig.types.messagingSmsConnector.push({\n\t\t\t\ttype: MessagingSmsConnectorType.Aws,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tregion: envVars.awsSesRegion ?? \"\",\n\t\t\t\t\t\tauthMode: envVars.awsSesAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\t\taccessKeyId: envVars.awsSesAccessKeyId,\n\t\t\t\t\t\tsecretAccessKey: envVars.awsSesSecretAccessKey,\n\t\t\t\t\t\tendpoint: envVars.awsSesEndpoint\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tif (\n\t\t\tenvVars.messagingPushNotificationConnector ===\n\t\t\tMessagingPushNotificationConnectorType.EntityStorage\n\t\t) {\n\t\t\tcoreConfig.types.messagingPushNotificationConnector.push({\n\t\t\t\ttype: MessagingPushNotificationConnectorType.EntityStorage\n\t\t\t});\n\t\t} else if (\n\t\t\tenvVars.messagingPushNotificationConnector === MessagingPushNotificationConnectorType.Aws\n\t\t) {\n\t\t\tcoreConfig.types.messagingPushNotificationConnector.push({\n\t\t\t\ttype: MessagingPushNotificationConnectorType.Aws,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tregion: envVars.awsSesRegion ?? \"\",\n\t\t\t\t\t\tauthMode: envVars.awsSesAuthMode as \"credentials\" | \"pod\",\n\t\t\t\t\t\taccessKeyId: envVars.awsSesAccessKeyId,\n\t\t\t\t\t\tsecretAccessKey: envVars.awsSesSecretAccessKey,\n\t\t\t\t\t\tendpoint: envVars.awsSesEndpoint,\n\t\t\t\t\t\tapplicationsSettings: Is.array(envVars.awsMessagingPushNotificationApplications)\n\t\t\t\t\t\t\t? JSON.parse(envVars.awsMessagingPushNotificationApplications)\n\t\t\t\t\t\t\t: []\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.messagingAdminComponent ??= [];\n\t\tcoreConfig.types.messagingAdminComponent.push({\n\t\t\ttype: MessagingAdminComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.messagingComponent ??= [];\n\t\tcoreConfig.types.messagingComponent.push({ type: MessagingComponentType.Service });\n\t}\n}\n\n/**\n * Configures the faucet.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureFaucet(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.faucetConnector ??= [];\n\n\tif (envVars.faucetConnector === FaucetConnectorType.EntityStorage) {\n\t\tcoreConfig.types.faucetConnector.push({\n\t\t\ttype: FaucetConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.faucetConnector === FaucetConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.faucetConnector.push({\n\t\t\ttype: FaucetConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.iotaFaucetEndpoint ?? \"\",\n\t\t\t\t\tclientOptions: dltConfig?.options?.config?.clientOptions ?? { url: \"\" },\n\t\t\t\t\tnetwork: dltConfig?.options?.config?.network ?? \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the wallet.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureWallet(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.walletConnector ??= [];\n\n\tif (envVars.walletConnector === WalletConnectorType.EntityStorage) {\n\t\tcoreConfig.types.walletConnector.push({\n\t\t\ttype: WalletConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.walletConnector === WalletConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.walletConnector.push({\n\t\t\ttype: WalletConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: dltConfig?.options?.config ?? ({} as IIotaConfig)\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the NFT.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureNft(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.nftConnector ??= [];\n\n\tif (envVars.nftConnector === NftConnectorType.EntityStorage) {\n\t\tcoreConfig.types.nftConnector.push({\n\t\t\ttype: NftConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.nftConnector === NftConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tconst config = {\n\t\t\t...(dltConfig?.options?.config as IIotaConfig),\n\t\t\tdeploymentPkgId: Is.stringValue(envVars.nftPackageId) ? envVars.nftPackageId : undefined\n\t\t};\n\t\tcoreConfig.types.nftConnector.push({\n\t\t\ttype: NftConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.nftConnector.length > 0) {\n\t\tcoreConfig.types.nftComponent ??= [];\n\t\tcoreConfig.types.nftComponent.push({ type: NftComponentType.Service });\n\t}\n}\n\n/**\n * Configures the notarization.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureNotarization(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.notarizationConnector ??= [];\n\n\tif (envVars.notarizationConnector === NotarizationConnectorType.EntityStorage) {\n\t\tcoreConfig.types.notarizationConnector.push({\n\t\t\ttype: NotarizationConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.notarizationConnector === NotarizationConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.notarizationConnector.push({\n\t\t\ttype: NotarizationConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: dltConfig?.options?.config ?? ({} as IIotaConfig)\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.notarizationConnector.length > 0) {\n\t\tcoreConfig.types.notarizationComponent ??= [];\n\t\tcoreConfig.types.notarizationComponent.push({ type: NotarizationComponentType.Service });\n\t}\n}\n\n/**\n * Configures the verifiable storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureVerifiableStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.verifiableStorageConnector ??= [];\n\n\tif (envVars.verifiableStorageConnector === VerifiableStorageConnectorType.EntityStorage) {\n\t\tcoreConfig.types.verifiableStorageConnector.push({\n\t\t\ttype: VerifiableStorageConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.verifiableStorageConnector === VerifiableStorageConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\n\t\tconst config = {\n\t\t\t...(dltConfig?.options?.config as IIotaConfig),\n\t\t\tdeploymentPkgId: Is.stringValue(envVars.verifiableStoragePackageId)\n\t\t\t\t? envVars.verifiableStoragePackageId\n\t\t\t\t: undefined\n\t\t};\n\t\tcoreConfig.types.verifiableStorageConnector.push({\n\t\t\ttype: VerifiableStorageConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.verifiableStorageConnector.length > 0) {\n\t\tcoreConfig.types.verifiableStorageComponent ??= [];\n\t\tcoreConfig.types.verifiableStorageComponent.push({\n\t\t\ttype: VerifiableStorageComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the immutable proof.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureImmutableProof(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isImmutableProofRequired(envVars)) {\n\t\tcoreConfig.types.immutableProofComponent ??= [];\n\t\tcoreConfig.types.immutableProofComponent.push({\n\t\t\ttype: ImmutableProofComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tverificationMethodId: envVars.immutableProofVerificationMethodId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the identity.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureIdentity(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.identityConnector ??= [];\n\n\tif (envVars.identityConnector === IdentityConnectorType.EntityStorage) {\n\t\tcoreConfig.types.identityConnector.push({\n\t\t\ttype: IdentityConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.identityConnector === IdentityConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.identityConnector.push({\n\t\t\ttype: IdentityConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\t...(dltConfig?.options?.config ?? ({} as IIotaConfig)),\n\t\t\t\t\tidentityPkgId: Is.stringValue(envVars.iotaIdentityPackageId)\n\t\t\t\t\t\t? envVars.iotaIdentityPackageId\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\twalletAddressIndex: Coerce.integer(envVars.identityWalletAddressIndex) ?? 0\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.identityConnector.length > 0) {\n\t\tcoreConfig.types.identityComponent ??= [];\n\t\tcoreConfig.types.identityComponent.push({ type: IdentityComponentType.Service });\n\t}\n}\n\n/**\n * Configures the identity resolver.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureIdentityResolver(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.identityResolverConnector ??= [];\n\n\tif (envVars.identityResolverConnector === IdentityResolverConnectorType.EntityStorage) {\n\t\tcoreConfig.types.identityResolverConnector.push({\n\t\t\ttype: IdentityResolverConnectorType.EntityStorage\n\t\t});\n\t} else if (envVars.identityResolverConnector === IdentityResolverConnectorType.Iota) {\n\t\tconst dltConfig = EngineTypeHelper.getConfigOfType<DltConfig>(\n\t\t\tcoreConfig,\n\t\t\t\"dltConfig\",\n\t\t\tDltConfigType.Iota\n\t\t);\n\t\tcoreConfig.types.identityResolverConnector.push({\n\t\t\ttype: IdentityResolverConnectorType.Iota,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\t...(dltConfig?.options?.config as IIotaConfig),\n\t\t\t\t\tidentityPkgId: Is.stringValue(envVars.iotaIdentityPackageId)\n\t\t\t\t\t\t? envVars.iotaIdentityPackageId\n\t\t\t\t\t\t: undefined\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else if (envVars.identityResolverConnector === IdentityResolverConnectorType.Universal) {\n\t\tcoreConfig.types.identityResolverConnector.push({\n\t\t\ttype: IdentityResolverConnectorType.Universal,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tendpoint: envVars.universalResolverEndpoint ?? \"\"\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (coreConfig.types.identityResolverConnector.length > 0) {\n\t\tcoreConfig.types.identityResolverComponent ??= [];\n\t\tcoreConfig.types.identityResolverComponent.push({\n\t\t\ttype: IdentityResolverComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the identity profile.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureIdentityProfile(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.identityProfileConnector ??= [];\n\n\tif (envVars.identityProfileConnector === IdentityConnectorType.EntityStorage) {\n\t\tcoreConfig.types.identityProfileConnector.push({\n\t\t\ttype: IdentityProfileConnectorType.EntityStorage\n\t\t});\n\t}\n\n\tif (coreConfig.types.identityProfileConnector.length > 0) {\n\t\tcoreConfig.types.identityProfileComponent ??= [];\n\t\tcoreConfig.types.identityProfileComponent.push({ type: IdentityProfileComponentType.Service });\n\t}\n}\n\n/**\n * Configures the attestation.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAttestation(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tcoreConfig.types.attestationConnector ??= [];\n\n\tif (envVars.attestationConnector === AttestationConnectorType.Nft) {\n\t\tcoreConfig.types.attestationConnector.push({\n\t\t\ttype: AttestationConnectorType.Nft\n\t\t});\n\t}\n\n\tif (coreConfig.types.attestationConnector.length > 0) {\n\t\tcoreConfig.types.attestationComponent ??= [];\n\t\tcoreConfig.types.attestationComponent.push({\n\t\t\ttype: AttestationComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tverificationMethodId: envVars.attestationVerificationMethodId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the auditable item graph.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAuditableItemGraph(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.auditableItemGraphEnabled) ?? false) {\n\t\tcoreConfig.types.auditableItemGraphComponent ??= [];\n\t\tcoreConfig.types.auditableItemGraphComponent.push({\n\t\t\ttype: AuditableItemGraphComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the auditable item stream.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureAuditableItemStream(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.auditableItemStreamEnabled) ?? false) {\n\t\tcoreConfig.types.auditableItemStreamComponent ??= [];\n\t\tcoreConfig.types.auditableItemStreamComponent.push({\n\t\t\ttype: AuditableItemStreamComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the data processing.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDataProcessing(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.dataProcessingEnabled) ?? false) {\n\t\tcoreConfig.types.dataProcessingComponent ??= [];\n\t\tcoreConfig.types.dataProcessingComponent.push({ type: DataProcessingComponentType.Service });\n\n\t\tcoreConfig.types.dataConverterConnector ??= [];\n\n\t\tconst converterConnectors = commaSeparatedListToArray(envVars.dataConverterConnectors);\n\t\tfor (const converterConnector of converterConnectors) {\n\t\t\tcoreConfig.types.dataConverterConnector.push({\n\t\t\t\ttype: converterConnector as DataConverterConnectorType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.dataExtractorConnector ??= [];\n\t\tconst extractorConnectors = commaSeparatedListToArray(envVars.dataExtractorConnectors);\n\t\tfor (const extractorConnector of extractorConnectors) {\n\t\t\tcoreConfig.types.dataExtractorConnector.push({\n\t\t\t\ttype: extractorConnector as DataExtractorConnectorType\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the document management.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDocumentManagement(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.documentManagementEnabled) ?? false) {\n\t\tcoreConfig.types.documentManagementComponent ??= [];\n\t\tcoreConfig.types.documentManagementComponent.push({\n\t\t\ttype: DocumentManagementComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the trust components.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTrust(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isTrustRequired(envVars)) {\n\t\tcoreConfig.types.trustComponent ??= [];\n\t\tcoreConfig.types.trustComponent.push({\n\t\t\ttype: TrustComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.trustGeneratorComponent ??= [];\n\t\tconst trustGeneratorTypes = commaSeparatedListToArray(envVars.trustGenerators);\n\t\tfor (const trustGeneratorType of trustGeneratorTypes) {\n\t\t\tcoreConfig.types.trustGeneratorComponent.push({\n\t\t\t\ttype: trustGeneratorType as TrustGeneratorComponentType,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {\n\t\t\t\t\t\tverificationMethodId: envVars.trustVerificationMethodId ?? \"\",\n\t\t\t\t\t\ttokenTtlInSeconds: Coerce.integer(envVars.trustJwtTtlSeconds)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.trustVerifierComponent ??= [];\n\t\tconst trustVerifierTypes = commaSeparatedListToArray(envVars.trustVerifiers);\n\t\tfor (const trustVerifierType of trustVerifierTypes) {\n\t\t\tcoreConfig.types.trustVerifierComponent.push({\n\t\t\t\ttype: trustVerifierType as TrustVerifierComponentType\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the rights management.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureRightsManagement(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isRightsManagementRequired(envVars)) {\n\t\tcoreConfig.types.rightsManagementPapComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPapComponent.push({\n\t\t\ttype: RightsManagementPapComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPmpComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPmpComponent.push({\n\t\t\ttype: RightsManagementPmpComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPipComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPipComponent.push({\n\t\t\ttype: RightsManagementPipComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPxpComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPxpComponent.push({\n\t\t\ttype: RightsManagementPxpComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPdpComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPdpComponent.push({\n\t\t\ttype: RightsManagementPdpComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPepComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPepComponent.push({\n\t\t\ttype: RightsManagementPepComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPnpComponent ??= [];\n\n\t\t// Single source of truth for the rights-management mount path.\n\t\tconst rightsManagementPath = envVars.rightsManagementCallbackPath ?? \"rights-management\";\n\n\t\t// We add a multi instance REST client for the remote negotiations\n\t\t// use a dummy endpoint for now as the actual endpoint will be provided in the config\n\t\t// of the policy negotiator when it is used for remote negotiations\n\t\t// We must add it before the service as the service needs to be able to request\n\t\t// the REST client type from the engine core to be able to support remote negotiations\n\t\tcoreConfig.types.rightsManagementPnpComponent.push({\n\t\t\ttype: RightsManagementPnpComponentType.RestClient,\n\t\t\toptions: {\n\t\t\t\tendpoint: \"http://localhost\",\n\t\t\t\tpathPrefix: rightsManagementPath\n\t\t\t},\n\t\t\tisMultiInstance: true,\n\t\t\tfeatures: [\"remote\"]\n\t\t});\n\t\tcoreConfig.types.rightsManagementPnpComponent.push({\n\t\t\ttype: RightsManagementPnpComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tcallbackPath: rightsManagementPath,\n\t\t\t\t\tincludeErrorDetails: coreConfig.debug ?? false\n\t\t\t\t}\n\t\t\t},\n\t\t\tisDefault: true\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPnapComponent ??= [];\n\t\tcoreConfig.types.rightsManagementPnapComponent.push({\n\t\t\ttype: RightsManagementPnapComponentType.Service\n\t\t});\n\n\t\tcoreConfig.types.rightsManagementPolicyArbiterComponent ??= [];\n\t\tconst policyArbiterTypes = commaSeparatedListToArray(envVars.rightsManagementPolicyArbiters);\n\t\tfor (const policyArbiterType of policyArbiterTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyArbiterComponent.push({\n\t\t\t\ttype: policyArbiterType as RightsManagementPolicyArbiterComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyObligationEnforcerComponent ??= [];\n\t\tconst policyObligationEnforcerTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyObligationEnforcers\n\t\t);\n\t\tfor (const policyObligationEnforcerType of policyObligationEnforcerTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyObligationEnforcerComponent.push({\n\t\t\t\ttype: policyObligationEnforcerType as RightsManagementPolicyObligationEnforcerComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyEnforcementProcessorComponent ??= [];\n\t\tconst policyEnforcementProcessTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyEnforcementProcessors\n\t\t);\n\t\tfor (const policyEnforcementProcessorType of policyEnforcementProcessTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyEnforcementProcessorComponent.push({\n\t\t\t\ttype: policyEnforcementProcessorType as RightsManagementPolicyEnforcementProcessorComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyExecutionActionComponent ??= [];\n\t\tconst policyExecutionActionTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyExecutionActions\n\t\t);\n\t\tfor (const policyExecutionActionType of policyExecutionActionTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyExecutionActionComponent.push({\n\t\t\t\ttype: policyExecutionActionType as RightsManagementPolicyExecutionActionComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyInformationSourceComponent ??= [];\n\t\tconst policyInformationSourceTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyInformationSources\n\t\t);\n\t\tfor (const policyInformationSourceType of policyInformationSourceTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyInformationSourceComponent.push({\n\t\t\t\ttype: policyInformationSourceType as RightsManagementPolicyInformationSourceComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyRequesterComponent ??= [];\n\t\tconst policyRequesterTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyRequesters\n\t\t);\n\t\tfor (const policyRequesterType of policyRequesterTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyRequesterComponent.push({\n\t\t\t\ttype: policyRequesterType as RightsManagementPolicyRequesterComponentType\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.rightsManagementPolicyNegotiatorComponent ??= [];\n\t\tconst policyNegotiatorTypes = commaSeparatedListToArray(\n\t\t\tenvVars.rightsManagementPolicyNegotiators\n\t\t);\n\t\tfor (const policyNegotiatorType of policyNegotiatorTypes) {\n\t\t\tcoreConfig.types.rightsManagementPolicyNegotiatorComponent.push({\n\t\t\t\ttype: policyNegotiatorType as RightsManagementPolicyNegotiatorComponentType\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the task scheduler.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureTaskScheduler(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isTaskSchedulerRequired(envVars)) {\n\t\tcoreConfig.types.taskSchedulerComponent ??= [];\n\t\tcoreConfig.types.taskSchedulerComponent.push({\n\t\t\ttype: TaskSchedulerComponentType.Service\n\t\t});\n\t}\n}\n\n/**\n * Configures the synchronised storage.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureSynchronisedStorage(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (\n\t\tIs.arrayValue(coreConfig.types.identityResolverComponent) &&\n\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false)\n\t) {\n\t\t// Check if the config provides a custom verifiable storage key id\n\t\tlet verifiableStorageKeyId = Coerce.string(envVars.synchronisedStorageVerifiableStorageKeyId);\n\n\t\tif (!Is.stringValue(verifiableStorageKeyId)) {\n\t\t\t// No custom key so default to the network setting\n\t\t\tverifiableStorageKeyId = envVars.iotaNetwork;\n\t\t}\n\t\tcoreConfig.types.synchronisedStorageComponent ??= [];\n\t\tcoreConfig.types.synchronisedStorageComponent.push({\n\t\t\ttype: SynchronisedStorageComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tverifiableStorageKeyId: verifiableStorageKeyId ?? \"\",\n\t\t\t\t\tblobStorageEncryptionKeyId: envVars.synchronisedStorageBlobStorageEncryptionKeyId,\n\t\t\t\t\tentityUpdateIntervalMinutes: Coerce.number(\n\t\t\t\t\t\tenvVars.synchronisedStorageEntityUpdateIntervalMinutes\n\t\t\t\t\t),\n\t\t\t\t\tconsolidationIntervalMinutes: Coerce.number(\n\t\t\t\t\t\tenvVars.synchronisedStorageConsolidationIntervalMinutes\n\t\t\t\t\t),\n\t\t\t\t\tconsolidationBatchSize: Coerce.number(envVars.synchronisedStorageConsolidationBatchSize),\n\t\t\t\t\tmaxConsolidations: Coerce.number(envVars.synchronisedStorageMaxConsolidations)\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// If there is a trusted url set, we need to add a client\n\t\t// and give it a feature of trusted so that when the synchronised\n\t\t// storage is created it can pickup the correct component\n\t\tif (Is.stringValue(envVars.synchronisedStorageTrustedUrl)) {\n\t\t\tcoreConfig.types.synchronisedStorageComponent.push({\n\t\t\t\ttype: SynchronisedStorageComponentType.RestClient,\n\t\t\t\toptions: {\n\t\t\t\t\tendpoint: envVars.synchronisedStorageTrustedUrl\n\t\t\t\t},\n\t\t\t\tfeatures: [\"trusted\"]\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the federated catalogue.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureFederatedCatalogue(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (isFederatedCatalogueRequired(envVars)) {\n\t\t// If synchronised storage is enabled, then we need to add an entity storage connector\n\t\t// using synchronised storage for the federated catalogue component\n\t\t// as it relies on the synchronised storage to sync the data between the different instances of the federated catalogue\n\t\tlet overrideEntityStorageType;\n\t\tif (\n\t\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false) &&\n\t\t\tIs.arrayValue(coreConfig.types.entityStorageConnector)\n\t\t) {\n\t\t\tlet defaultConnector = coreConfig.types.entityStorageConnector.find(\n\t\t\t\tconnector => connector.isDefault\n\t\t\t);\n\t\t\tif (Is.empty(defaultConnector)) {\n\t\t\t\t// If there is no default connector, we set the first one as the default one\n\t\t\t\tdefaultConnector = coreConfig.types.entityStorageConnector[0];\n\t\t\t}\n\n\t\t\toverrideEntityStorageType = \"federated-catalogue-dataset\";\n\t\t\tcoreConfig.types.entityStorageConnector ??= [];\n\t\t\tcoreConfig.types.entityStorageConnector.push({\n\t\t\t\ttype: EntityStorageConnectorType.Synchronised,\n\t\t\t\toverrideInstanceType: overrideEntityStorageType,\n\t\t\t\toptions: {\n\t\t\t\t\tentityStorageConnectorType: defaultConnector.type\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tcoreConfig.types.federatedCatalogueComponent ??= [];\n\t\tcoreConfig.types.federatedCatalogueComponent.push({\n\t\t\ttype: FederatedCatalogueComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tdatasetEntityStorageType: overrideEntityStorageType\n\t\t\t}\n\t\t});\n\n\t\tcoreConfig.types.federatedCatalogueFilterComponent ??= [];\n\t\tconst filters = commaSeparatedListToArray(envVars.federatedCatalogueFilters);\n\n\t\tfor (const filter of filters) {\n\t\t\tcoreConfig.types.federatedCatalogueFilterComponent.push({\n\t\t\t\ttype: filter as FederatedCatalogueFilterComponentType,\n\t\t\t\toptions: {}\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * Configures the dataspace control plane and data plane.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDataspace(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\tif (Coerce.boolean(envVars.dataspaceEnabled) ?? false) {\n\t\tcoreConfig.types.dataspaceControlPlaneComponent ??= [];\n\t\tcoreConfig.types.dataspaceControlPlaneComponent.push({\n\t\t\ttype: DataspaceControlPlaneComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tdataPlanePath: envVars.dataspaceDataPlanePath\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tcoreConfig.types.dataspaceDataPlaneComponent ??= [];\n\t\tcoreConfig.types.dataspaceDataPlaneComponent.push({\n\t\t\ttype: DataspaceDataPlaneComponentType.Service,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tretainActivityLogsFor: Coerce.number(envVars.dataspaceRetainActivityLogsFor),\n\t\t\t\t\tactivityLogsCleanUpInterval: Coerce.number(envVars.dataspaceActivityLogsCleanUpInterval)\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Configures the DLT.\n * @param coreConfig The core config.\n * @param envVars The environment variables.\n */\nasync function configureDlt(\n\tcoreConfig: IEngineConfig,\n\tenvVars: IEngineEnvironmentVariables\n): Promise<void> {\n\t// Create centralized DLT configuration for IOTA if essential IOTA variables are set\n\tif (Is.stringValue(envVars.iotaNodeEndpoint) && Is.stringValue(envVars.iotaNetwork)) {\n\t\tcoreConfig.types.dltConfig ??= [];\n\n\t\tconst gasStationConfig =\n\t\t\tIs.stringValue(envVars.iotaGasStationEndpoint) &&\n\t\t\tIs.stringValue(envVars.iotaGasStationAuthToken)\n\t\t\t\t? {\n\t\t\t\t\t\tgasStationUrl: envVars.iotaGasStationEndpoint,\n\t\t\t\t\t\tgasStationAuthToken: envVars.iotaGasStationAuthToken\n\t\t\t\t\t}\n\t\t\t\t: undefined;\n\n\t\tcoreConfig.types.dltConfig.push({\n\t\t\ttype: DltConfigType.Iota,\n\t\t\tisDefault: true,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tclientOptions: {\n\t\t\t\t\t\turl: envVars.iotaNodeEndpoint ?? \"\"\n\t\t\t\t\t},\n\t\t\t\t\tnetwork: envVars.iotaNetwork ?? \"\",\n\t\t\t\t\tcoinType: Coerce.number(envVars.iotaCoinType),\n\t\t\t\t\tgasStation: gasStationConfig\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n\n/**\n * Converts a comma separated list to an array.\n * @param value The comma separated list.\n * @returns The array.\n */\nfunction commaSeparatedListToArray<T>(value: string | undefined): T[] {\n\treturn (value ?? \"\")\n\t\t.split(\",\")\n\t\t.map(item => item.trim())\n\t\t.filter(item => item.length > 0) as T[];\n}\n\n/**\n * Checks if the trust subsystem is required.\n * Returns true when any component that depends on the trust subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if rights-management, synchronised-storage, or dataspace is enabled.\n */\nexport function isTrustRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\tisRightsManagementRequired(envVars) ||\n\t\t(Coerce.boolean(envVars.dataspaceEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false)\n\t);\n}\n\n/**\n * Checks if the URL transformer subsystem is required.\n * Returns true when any component that depends on the URL transformer subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if rights-management, dataspace, federated-catalogue, tenant, or auth entity storage is enabled.\n */\nexport function isUrlTransformerRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\tisRightsManagementRequired(envVars) ||\n\t\t(Coerce.boolean(envVars.dataspaceEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.tenantEnabled) ?? false) ||\n\t\tisFederatedCatalogueRequired(envVars) ||\n\t\tisAuthEntityStorageRequired(envVars)\n\t);\n}\n\n/**\n * Checks if the background tasks subsystem is required.\n * Returns true when any component that depends on the background tasks subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if dataspace or verifiable storage is enabled.\n */\nexport function isBackgroundTasksRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (Coerce.boolean(envVars.dataspaceEnabled) ?? false) || isImmutableProofRequired(envVars);\n}\n\n/**\n * Checks if the immutable proof subsystem is required.\n * Returns true when any component that depends on the immutable proof subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if verifiable storage is enabled.\n */\nexport function isImmutableProofRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\t(Coerce.boolean(envVars.auditableItemGraphEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.auditableItemStreamEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.documentManagementEnabled) ?? false)\n\t);\n}\n\n/**\n * Checks if the immutable proof subsystem is required.\n * Returns true when any component that depends on the immutable proof subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if verifiable storage is enabled.\n */\nexport function isFederatedCatalogueRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn Coerce.boolean(envVars.dataspaceEnabled) ?? false;\n}\n\n/**\n * Checks if the rights management subsystem is required.\n * Returns true when any component that depends on the rights management subsystem is enabled.\n * Note: rights management has no standalone enable flag — it is gated entirely on\n * `dataspaceEnabled`. Setting `TWIN_RIGHTS_MANAGEMENT_*` env var in isolation does not\n * enable the subsystem; `TWIN_DATASPACE_ENABLED` must also be true.\n * @param envVars The environment variables.\n * @returns True if rights management is enabled.\n */\nexport function isRightsManagementRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn Coerce.boolean(envVars.dataspaceEnabled) ?? false;\n}\n\n/**\n * Checks if the task scheduler subsystem is required.\n * Returns true when any component that depends on the task scheduler subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if task scheduler is enabled.\n */\nexport function isTaskSchedulerRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\t(Coerce.boolean(envVars.dataspaceEnabled) ?? false) ||\n\t\t(Coerce.boolean(envVars.synchronisedStorageEnabled) ?? false) ||\n\t\tisRightsManagementRequired(envVars) ||\n\t\tisAuthEntityStorageRequired(envVars)\n\t);\n}\n\n/**\n * Checks if the automation subsystem is required.\n * Returns true when any component that depends on the automation subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if automation is enabled.\n */\nexport function isAutomationRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn isRightsManagementRequired(envVars);\n}\n\n/**\n * Checks if the telemetry subsystem is required.\n * Returns true when any component that depends on the telemetry subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if telemetry is enabled.\n */\nexport function isTelemetryRequired(envVars: IEngineEnvironmentVariables): boolean {\n\treturn (\n\t\tenvVars.telemetryConnector === TelemetryConnectorType.EntityStorage ||\n\t\tenvVars.telemetryConnector === TelemetryConnectorType.OpenTelemetry\n\t);\n}\n"]}
package/dist/es/cli.js CHANGED
@@ -15,6 +15,7 @@ import { getCommandDefinitionNodeSetIdentity } from "./commands/nodeSetIdentity.
15
15
  import { getCommandDefinitionNodeSetTenant } from "./commands/nodeSetTenant.js";
16
16
  import { getCommandDefinitionTenantCreate } from "./commands/tenantCreate.js";
17
17
  import { getCommandDefinitionTenantImport } from "./commands/tenantImport.js";
18
+ import { getCommandDefinitionTenantToken } from "./commands/tenantToken.js";
18
19
  import { getCommandDefinitionTenantUpdate } from "./commands/tenantUpdate.js";
19
20
  import { getCommandDefinitionUserCreate } from "./commands/userCreate.js";
20
21
  import { getCommandDefinitionUserUpdate } from "./commands/userUpdate.js";
@@ -238,6 +239,7 @@ export function registerCommands() {
238
239
  getCommandDefinitionNodeSetTenant(commandDefinitions);
239
240
  getCommandDefinitionTenantCreate(commandDefinitions);
240
241
  getCommandDefinitionTenantImport(commandDefinitions);
242
+ getCommandDefinitionTenantToken(commandDefinitions);
241
243
  getCommandDefinitionTenantUpdate(commandDefinitions);
242
244
  getCommandDefinitionUserCreate(commandDefinitions);
243
245
  getCommandDefinitionUserUpdate(commandDefinitions);
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { ContextIdStore } from \"@twin.org/context\";\nimport { Coerce, GeneralError, I18n, Is, StringHelper } from \"@twin.org/core\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport * as dotenv from \"dotenv\";\nimport { getCommandDefinitionBootstrapLegacy } from \"./commands/bootstrapLegacy.js\";\nimport { getCommandDefinitionHelp } from \"./commands/help.js\";\nimport { getCommandDefinitionIdentityCreate } from \"./commands/identityCreate.js\";\nimport { getCommandDefinitionIdentityImport } from \"./commands/identityImports.js\";\nimport { getCommandDefinitionIdentityVerifiableCredentialCreate } from \"./commands/identityVerifiableCredentialCreate.js\";\nimport { getCommandDefinitionIdentityVerificationMethodCreate } from \"./commands/identityVerificationMethodCreate.js\";\nimport { getCommandDefinitionIdentityVerificationMethodImport } from \"./commands/identityVerificationMethodImport.js\";\nimport { getCommandDefinitionNodeSetIdentity } from \"./commands/nodeSetIdentity.js\";\nimport { getCommandDefinitionNodeSetTenant } from \"./commands/nodeSetTenant.js\";\nimport { getCommandDefinitionTenantCreate } from \"./commands/tenantCreate.js\";\nimport { getCommandDefinitionTenantImport } from \"./commands/tenantImport.js\";\nimport { getCommandDefinitionTenantUpdate } from \"./commands/tenantUpdate.js\";\nimport { getCommandDefinitionUserCreate } from \"./commands/userCreate.js\";\nimport { getCommandDefinitionUserUpdate } from \"./commands/userUpdate.js\";\nimport { getCommandDefinitionVaultKeyCreate } from \"./commands/vaultKeyCreate.js\";\nimport { getCommandDefinitionVaultKeyImport } from \"./commands/vaultKeyImport.js\";\nimport type { CliCommandParamType } from \"./models/cliCommandParamType.js\";\nimport type { ICliArgs } from \"./models/ICliArgs.js\";\nimport type { ICliCommand } from \"./models/ICliCommand.js\";\nimport type { ICliCommandDefinition } from \"./models/ICliCommandDefinition.js\";\nimport type { INodeEnvironmentVariables } from \"./models/INodeEnvironmentVariables.js\";\n\nconst commandDefinitions: { [id: string]: ICliCommandDefinition } = {};\n\n/**\n * Parse command line arguments.\n * @param args The command line arguments.\n * @returns The parsed command line arguments.\n */\nexport function parseCommandLineArgs(args?: string[]): ICliArgs {\n\tlet nodePath;\n\tlet scriptPath;\n\tlet options:\n\t\t| {\n\t\t\t\tkey: string;\n\t\t\t\tvalue: string;\n\t\t }[]\n\t\t| undefined;\n\n\tif (Is.arrayValue(args)) {\n\t\tif (args.length > 0) {\n\t\t\tnodePath = args[0];\n\t\t}\n\t\tif (args.length > 1) {\n\t\t\tscriptPath = args[1];\n\t\t}\n\t\tif (args.length > 2) {\n\t\t\toptions = [];\n\n\t\t\tfor (let i = 2; i < args.length; i++) {\n\t\t\t\tconst arg = args[i];\n\t\t\t\tconst equalIndex = arg.indexOf(\"=\");\n\t\t\t\tif (equalIndex > 0) {\n\t\t\t\t\tconst key = arg.slice(0, equalIndex).trim();\n\t\t\t\t\tconst value = arg.slice(equalIndex + 1).trim();\n\t\t\t\t\tif (key.startsWith(\"--\")) {\n\t\t\t\t\t\toptions.push({ key: key.slice(2), value });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.push({ key: arg, value: \"\" });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodePath,\n\t\tscriptPath,\n\t\toptions\n\t};\n}\n\n/**\n * Construct the CLI command from the parsed arguments.\n * @param processEnv The environment variables from the process.\n * @param cliArgs The parsed CLI arguments.\n * @returns The constructed CLI command.\n * @throws GeneralError if the command is missing.\n */\nexport function constructCliCommand(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\tcliArgs: ICliArgs\n): ICliCommand | undefined {\n\tif (Is.arrayValue(cliArgs.options)) {\n\t\tconst command = cliArgs.options[0];\n\n\t\t// If the first option is --help, we can display help for all commands\n\t\tif (command.key === \"--help\") {\n\t\t\treturn {\n\t\t\t\tdefinition: commandDefinitions.help,\n\t\t\t\tparams: {}\n\t\t\t};\n\t\t}\n\n\t\t// In cases where no command but env-prefix is provided, we just return\n\t\tif (command.key === \"env-prefix\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!commandDefinitions[command.key]) {\n\t\t\tthrow new GeneralError(\"node\", \"cliCommandMissing\", { command: command.key });\n\t\t}\n\n\t\t// We have a valid command, check for --help for that command\n\t\tconst hasHelp = cliArgs.options.find(option => option.key === \"--help\");\n\t\tif (hasHelp) {\n\t\t\treturn {\n\t\t\t\tdefinition: commandDefinitions.help,\n\t\t\t\tparams: {\n\t\t\t\t\tcommand: command.key\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tprocessEnvOptions(processEnv, cliArgs.options);\n\n\t\tconst cliParams: { [id: string]: CliCommandParamType } = {};\n\t\tconst allParamKeys = cliArgs.options\n\t\t\t.map(option => option.key)\n\t\t\t.filter(key => key !== command.key);\n\n\t\tfor (const commandDefParam of commandDefinitions[command.key].params) {\n\t\t\tconst foundParamIndex =\n\t\t\t\tcliArgs.options?.findIndex(option => option.key === commandDefParam.key) ?? -1;\n\t\t\tconst foundParam = foundParamIndex >= 0 ? cliArgs.options?.[foundParamIndex] : undefined;\n\n\t\t\tlet paramValue;\n\t\t\tif (commandDefParam.type === \"number\") {\n\t\t\t\tparamValue = Coerce.number(foundParam?.value ?? commandDefParam.defaultValue);\n\t\t\t} else if (commandDefParam.type === \"boolean\") {\n\t\t\t\tparamValue = Coerce.boolean(foundParam?.value ?? commandDefParam.defaultValue);\n\t\t\t} else {\n\t\t\t\tparamValue = Coerce.string(foundParam?.value ?? commandDefParam.defaultValue);\n\t\t\t}\n\n\t\t\tconst required = commandDefParam.required ?? true;\n\t\t\tif (Is.empty(paramValue) && required) {\n\t\t\t\tthrow new GeneralError(\"node\", \"cliCommandParamMissing\", {\n\t\t\t\t\tcommand: command.key,\n\t\t\t\t\tparam: commandDefParam.key\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!Is.empty(paramValue)) {\n\t\t\t\tcliParams[StringHelper.camelCase(commandDefParam.key)] = paramValue;\n\t\t\t}\n\n\t\t\tif (foundParamIndex >= 0) {\n\t\t\t\tallParamKeys.splice(allParamKeys.indexOf(commandDefParam.key), 1);\n\t\t\t}\n\t\t}\n\n\t\tif (allParamKeys.length > 0) {\n\t\t\tthrow new GeneralError(\"node\", \"cliCommandParamExtra\", {\n\t\t\t\tcommand: command.key,\n\t\t\t\tparams: allParamKeys.join(\", \")\n\t\t\t});\n\t\t}\n\n\t\tif (commandDefinitions[command.key].params.find(param => param.key === \"output-env-prefix\")) {\n\t\t\tcliParams.outputEnvPrefix = (Coerce.string(cliParams.outputEnvPrefix) ?? \"\").toUpperCase();\n\t\t\tcliParams.outputEnvPrefix =\n\t\t\t\tcliParams.outputEnvPrefix.length > 0 && !cliParams.outputEnvPrefix.endsWith(\"_\")\n\t\t\t\t\t? `${cliParams.outputEnvPrefix}_`\n\t\t\t\t\t: cliParams.outputEnvPrefix;\n\t\t}\n\n\t\treturn {\n\t\t\tdefinition: commandDefinitions[command.key],\n\t\t\tparams: cliParams\n\t\t};\n\t}\n}\n\n/**\n * Execute the CLI command.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param cliCommand The CLI command to execute.\n */\nexport async function executeCommand(\n\tengineCore: IEngineCore,\n\tenvVars: INodeEnvironmentVariables,\n\tcliCommand: ICliCommand\n): Promise<void> {\n\tconst requiresEngineStarted = cliCommand.definition.requiresEngineStarted ?? true;\n\n\ttry {\n\t\tif (requiresEngineStarted) {\n\t\t\tawait engineCore.start(true);\n\t\t}\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"node.cli.commands.command\"),\n\t\t\tcliCommand.definition.command\n\t\t);\n\t\tfor (const paramKey in cliCommand.params) {\n\t\t\tCLIDisplay.value(paramKey, Coerce.string(cliCommand.params[paramKey]), 1);\n\t\t}\n\t\tCLIDisplay.break();\n\n\t\tawait ContextIdStore.run(engineCore.getContextIds() ?? {}, async () => {\n\t\t\tawait cliCommand.definition.action(engineCore, envVars, cliCommand.params);\n\t\t});\n\t} catch (error) {\n\t\tCLIDisplay.spinnerStop();\n\n\t\tthrow error;\n\t} finally {\n\t\tif (requiresEngineStarted) {\n\t\t\tCLIDisplay.break();\n\t\t\tawait engineCore.stop();\n\t\t}\n\t}\n}\n\n/**\n * Load the env files and process the options.\n * @param processEnv The environment variables from the process.\n * @param options The options.\n * @returns The processed parameters.\n * @throws GeneralError if an env file has errors.\n */\nexport function processEnvOptions(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\toptions: {\n\t\tkey: string;\n\t\tvalue: string;\n\t}[]\n): void {\n\tconst inputEnv = options.find(option => option.key === \"load-env\")?.value;\n\n\tif (Is.stringValue(inputEnv)) {\n\t\tconst envFiles = inputEnv.split(\",\").map(f => f.trim());\n\t\tfor (const envFile of envFiles) {\n\t\t\tconst output = dotenv.config({\n\t\t\t\tpath: envFile,\n\t\t\t\tquiet: true\n\t\t\t});\n\n\t\t\tif (output.error) {\n\t\t\t\tthrow output.error;\n\t\t\t}\n\n\t\t\tif (Is.objectValue(output.parsed)) {\n\t\t\t\tfor (const key in output.parsed) {\n\t\t\t\t\tprocessEnv[key] = output.parsed[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn substituteEnvOptions(processEnv, options);\n}\n\n/**\n * Process options and replace any env variables with their values.\n * @param processEnv The environment variables from the process.\n * @param options The options.\n * @throws GeneralError if an env variable is missing.\n */\nexport function substituteEnvOptions(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\toptions: {\n\t\tkey: string;\n\t\tvalue: string;\n\t}[]\n): void {\n\tfor (const option of options) {\n\t\tif (option.value.startsWith(\"!\")) {\n\t\t\tconst envVar = processEnv[option.value.slice(1)];\n\t\t\tif (!Is.stringValue(envVar)) {\n\t\t\t\tthrow new GeneralError(\"node\", \"cliEnvVarMissing\", { envVar: option.value.slice(1) });\n\t\t\t}\n\t\t\toption.value = envVar;\n\t\t}\n\t}\n}\n\n/**\n * Register available CLI commands.\n */\nexport function registerCommands(): void {\n\tgetCommandDefinitionHelp(commandDefinitions);\n\tgetCommandDefinitionBootstrapLegacy(commandDefinitions);\n\tgetCommandDefinitionIdentityCreate(commandDefinitions);\n\tgetCommandDefinitionIdentityImport(commandDefinitions);\n\tgetCommandDefinitionIdentityVerificationMethodCreate(commandDefinitions);\n\tgetCommandDefinitionIdentityVerificationMethodImport(commandDefinitions);\n\tgetCommandDefinitionIdentityVerifiableCredentialCreate(commandDefinitions);\n\tgetCommandDefinitionNodeSetIdentity(commandDefinitions);\n\tgetCommandDefinitionNodeSetTenant(commandDefinitions);\n\tgetCommandDefinitionTenantCreate(commandDefinitions);\n\tgetCommandDefinitionTenantImport(commandDefinitions);\n\tgetCommandDefinitionTenantUpdate(commandDefinitions);\n\tgetCommandDefinitionUserCreate(commandDefinitions);\n\tgetCommandDefinitionUserUpdate(commandDefinitions);\n\tgetCommandDefinitionVaultKeyCreate(commandDefinitions);\n\tgetCommandDefinitionVaultKeyImport(commandDefinitions);\n}\n"]}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { ContextIdStore } from \"@twin.org/context\";\nimport { Coerce, GeneralError, I18n, Is, StringHelper } from \"@twin.org/core\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport * as dotenv from \"dotenv\";\nimport { getCommandDefinitionBootstrapLegacy } from \"./commands/bootstrapLegacy.js\";\nimport { getCommandDefinitionHelp } from \"./commands/help.js\";\nimport { getCommandDefinitionIdentityCreate } from \"./commands/identityCreate.js\";\nimport { getCommandDefinitionIdentityImport } from \"./commands/identityImports.js\";\nimport { getCommandDefinitionIdentityVerifiableCredentialCreate } from \"./commands/identityVerifiableCredentialCreate.js\";\nimport { getCommandDefinitionIdentityVerificationMethodCreate } from \"./commands/identityVerificationMethodCreate.js\";\nimport { getCommandDefinitionIdentityVerificationMethodImport } from \"./commands/identityVerificationMethodImport.js\";\nimport { getCommandDefinitionNodeSetIdentity } from \"./commands/nodeSetIdentity.js\";\nimport { getCommandDefinitionNodeSetTenant } from \"./commands/nodeSetTenant.js\";\nimport { getCommandDefinitionTenantCreate } from \"./commands/tenantCreate.js\";\nimport { getCommandDefinitionTenantImport } from \"./commands/tenantImport.js\";\nimport { getCommandDefinitionTenantToken } from \"./commands/tenantToken.js\";\nimport { getCommandDefinitionTenantUpdate } from \"./commands/tenantUpdate.js\";\nimport { getCommandDefinitionUserCreate } from \"./commands/userCreate.js\";\nimport { getCommandDefinitionUserUpdate } from \"./commands/userUpdate.js\";\nimport { getCommandDefinitionVaultKeyCreate } from \"./commands/vaultKeyCreate.js\";\nimport { getCommandDefinitionVaultKeyImport } from \"./commands/vaultKeyImport.js\";\nimport type { CliCommandParamType } from \"./models/cliCommandParamType.js\";\nimport type { ICliArgs } from \"./models/ICliArgs.js\";\nimport type { ICliCommand } from \"./models/ICliCommand.js\";\nimport type { ICliCommandDefinition } from \"./models/ICliCommandDefinition.js\";\nimport type { INodeEnvironmentVariables } from \"./models/INodeEnvironmentVariables.js\";\n\nconst commandDefinitions: { [id: string]: ICliCommandDefinition } = {};\n\n/**\n * Parse command line arguments.\n * @param args The command line arguments.\n * @returns The parsed command line arguments.\n */\nexport function parseCommandLineArgs(args?: string[]): ICliArgs {\n\tlet nodePath;\n\tlet scriptPath;\n\tlet options:\n\t\t| {\n\t\t\t\tkey: string;\n\t\t\t\tvalue: string;\n\t\t }[]\n\t\t| undefined;\n\n\tif (Is.arrayValue(args)) {\n\t\tif (args.length > 0) {\n\t\t\tnodePath = args[0];\n\t\t}\n\t\tif (args.length > 1) {\n\t\t\tscriptPath = args[1];\n\t\t}\n\t\tif (args.length > 2) {\n\t\t\toptions = [];\n\n\t\t\tfor (let i = 2; i < args.length; i++) {\n\t\t\t\tconst arg = args[i];\n\t\t\t\tconst equalIndex = arg.indexOf(\"=\");\n\t\t\t\tif (equalIndex > 0) {\n\t\t\t\t\tconst key = arg.slice(0, equalIndex).trim();\n\t\t\t\t\tconst value = arg.slice(equalIndex + 1).trim();\n\t\t\t\t\tif (key.startsWith(\"--\")) {\n\t\t\t\t\t\toptions.push({ key: key.slice(2), value });\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\toptions.push({ key: arg, value: \"\" });\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tnodePath,\n\t\tscriptPath,\n\t\toptions\n\t};\n}\n\n/**\n * Construct the CLI command from the parsed arguments.\n * @param processEnv The environment variables from the process.\n * @param cliArgs The parsed CLI arguments.\n * @returns The constructed CLI command.\n * @throws GeneralError if the command is missing.\n */\nexport function constructCliCommand(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\tcliArgs: ICliArgs\n): ICliCommand | undefined {\n\tif (Is.arrayValue(cliArgs.options)) {\n\t\tconst command = cliArgs.options[0];\n\n\t\t// If the first option is --help, we can display help for all commands\n\t\tif (command.key === \"--help\") {\n\t\t\treturn {\n\t\t\t\tdefinition: commandDefinitions.help,\n\t\t\t\tparams: {}\n\t\t\t};\n\t\t}\n\n\t\t// In cases where no command but env-prefix is provided, we just return\n\t\tif (command.key === \"env-prefix\") {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!commandDefinitions[command.key]) {\n\t\t\tthrow new GeneralError(\"node\", \"cliCommandMissing\", { command: command.key });\n\t\t}\n\n\t\t// We have a valid command, check for --help for that command\n\t\tconst hasHelp = cliArgs.options.find(option => option.key === \"--help\");\n\t\tif (hasHelp) {\n\t\t\treturn {\n\t\t\t\tdefinition: commandDefinitions.help,\n\t\t\t\tparams: {\n\t\t\t\t\tcommand: command.key\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\tprocessEnvOptions(processEnv, cliArgs.options);\n\n\t\tconst cliParams: { [id: string]: CliCommandParamType } = {};\n\t\tconst allParamKeys = cliArgs.options\n\t\t\t.map(option => option.key)\n\t\t\t.filter(key => key !== command.key);\n\n\t\tfor (const commandDefParam of commandDefinitions[command.key].params) {\n\t\t\tconst foundParamIndex =\n\t\t\t\tcliArgs.options?.findIndex(option => option.key === commandDefParam.key) ?? -1;\n\t\t\tconst foundParam = foundParamIndex >= 0 ? cliArgs.options?.[foundParamIndex] : undefined;\n\n\t\t\tlet paramValue;\n\t\t\tif (commandDefParam.type === \"number\") {\n\t\t\t\tparamValue = Coerce.number(foundParam?.value ?? commandDefParam.defaultValue);\n\t\t\t} else if (commandDefParam.type === \"boolean\") {\n\t\t\t\tparamValue = Coerce.boolean(foundParam?.value ?? commandDefParam.defaultValue);\n\t\t\t} else {\n\t\t\t\tparamValue = Coerce.string(foundParam?.value ?? commandDefParam.defaultValue);\n\t\t\t}\n\n\t\t\tconst required = commandDefParam.required ?? true;\n\t\t\tif (Is.empty(paramValue) && required) {\n\t\t\t\tthrow new GeneralError(\"node\", \"cliCommandParamMissing\", {\n\t\t\t\t\tcommand: command.key,\n\t\t\t\t\tparam: commandDefParam.key\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (!Is.empty(paramValue)) {\n\t\t\t\tcliParams[StringHelper.camelCase(commandDefParam.key)] = paramValue;\n\t\t\t}\n\n\t\t\tif (foundParamIndex >= 0) {\n\t\t\t\tallParamKeys.splice(allParamKeys.indexOf(commandDefParam.key), 1);\n\t\t\t}\n\t\t}\n\n\t\tif (allParamKeys.length > 0) {\n\t\t\tthrow new GeneralError(\"node\", \"cliCommandParamExtra\", {\n\t\t\t\tcommand: command.key,\n\t\t\t\tparams: allParamKeys.join(\", \")\n\t\t\t});\n\t\t}\n\n\t\tif (commandDefinitions[command.key].params.find(param => param.key === \"output-env-prefix\")) {\n\t\t\tcliParams.outputEnvPrefix = (Coerce.string(cliParams.outputEnvPrefix) ?? \"\").toUpperCase();\n\t\t\tcliParams.outputEnvPrefix =\n\t\t\t\tcliParams.outputEnvPrefix.length > 0 && !cliParams.outputEnvPrefix.endsWith(\"_\")\n\t\t\t\t\t? `${cliParams.outputEnvPrefix}_`\n\t\t\t\t\t: cliParams.outputEnvPrefix;\n\t\t}\n\n\t\treturn {\n\t\t\tdefinition: commandDefinitions[command.key],\n\t\t\tparams: cliParams\n\t\t};\n\t}\n}\n\n/**\n * Execute the CLI command.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param cliCommand The CLI command to execute.\n */\nexport async function executeCommand(\n\tengineCore: IEngineCore,\n\tenvVars: INodeEnvironmentVariables,\n\tcliCommand: ICliCommand\n): Promise<void> {\n\tconst requiresEngineStarted = cliCommand.definition.requiresEngineStarted ?? true;\n\n\ttry {\n\t\tif (requiresEngineStarted) {\n\t\t\tawait engineCore.start(true);\n\t\t}\n\n\t\tCLIDisplay.value(\n\t\t\tI18n.formatMessage(\"node.cli.commands.command\"),\n\t\t\tcliCommand.definition.command\n\t\t);\n\t\tfor (const paramKey in cliCommand.params) {\n\t\t\tCLIDisplay.value(paramKey, Coerce.string(cliCommand.params[paramKey]), 1);\n\t\t}\n\t\tCLIDisplay.break();\n\n\t\tawait ContextIdStore.run(engineCore.getContextIds() ?? {}, async () => {\n\t\t\tawait cliCommand.definition.action(engineCore, envVars, cliCommand.params);\n\t\t});\n\t} catch (error) {\n\t\tCLIDisplay.spinnerStop();\n\n\t\tthrow error;\n\t} finally {\n\t\tif (requiresEngineStarted) {\n\t\t\tCLIDisplay.break();\n\t\t\tawait engineCore.stop();\n\t\t}\n\t}\n}\n\n/**\n * Load the env files and process the options.\n * @param processEnv The environment variables from the process.\n * @param options The options.\n * @returns The processed parameters.\n * @throws GeneralError if an env file has errors.\n */\nexport function processEnvOptions(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\toptions: {\n\t\tkey: string;\n\t\tvalue: string;\n\t}[]\n): void {\n\tconst inputEnv = options.find(option => option.key === \"load-env\")?.value;\n\n\tif (Is.stringValue(inputEnv)) {\n\t\tconst envFiles = inputEnv.split(\",\").map(f => f.trim());\n\t\tfor (const envFile of envFiles) {\n\t\t\tconst output = dotenv.config({\n\t\t\t\tpath: envFile,\n\t\t\t\tquiet: true\n\t\t\t});\n\n\t\t\tif (output.error) {\n\t\t\t\tthrow output.error;\n\t\t\t}\n\n\t\t\tif (Is.objectValue(output.parsed)) {\n\t\t\t\tfor (const key in output.parsed) {\n\t\t\t\t\tprocessEnv[key] = output.parsed[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn substituteEnvOptions(processEnv, options);\n}\n\n/**\n * Process options and replace any env variables with their values.\n * @param processEnv The environment variables from the process.\n * @param options The options.\n * @throws GeneralError if an env variable is missing.\n */\nexport function substituteEnvOptions(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\toptions: {\n\t\tkey: string;\n\t\tvalue: string;\n\t}[]\n): void {\n\tfor (const option of options) {\n\t\tif (option.value.startsWith(\"!\")) {\n\t\t\tconst envVar = processEnv[option.value.slice(1)];\n\t\t\tif (!Is.stringValue(envVar)) {\n\t\t\t\tthrow new GeneralError(\"node\", \"cliEnvVarMissing\", { envVar: option.value.slice(1) });\n\t\t\t}\n\t\t\toption.value = envVar;\n\t\t}\n\t}\n}\n\n/**\n * Register available CLI commands.\n */\nexport function registerCommands(): void {\n\tgetCommandDefinitionHelp(commandDefinitions);\n\tgetCommandDefinitionBootstrapLegacy(commandDefinitions);\n\tgetCommandDefinitionIdentityCreate(commandDefinitions);\n\tgetCommandDefinitionIdentityImport(commandDefinitions);\n\tgetCommandDefinitionIdentityVerificationMethodCreate(commandDefinitions);\n\tgetCommandDefinitionIdentityVerificationMethodImport(commandDefinitions);\n\tgetCommandDefinitionIdentityVerifiableCredentialCreate(commandDefinitions);\n\tgetCommandDefinitionNodeSetIdentity(commandDefinitions);\n\tgetCommandDefinitionNodeSetTenant(commandDefinitions);\n\tgetCommandDefinitionTenantCreate(commandDefinitions);\n\tgetCommandDefinitionTenantImport(commandDefinitions);\n\tgetCommandDefinitionTenantToken(commandDefinitions);\n\tgetCommandDefinitionTenantUpdate(commandDefinitions);\n\tgetCommandDefinitionUserCreate(commandDefinitions);\n\tgetCommandDefinitionUserUpdate(commandDefinitions);\n\tgetCommandDefinitionVaultKeyCreate(commandDefinitions);\n\tgetCommandDefinitionVaultKeyImport(commandDefinitions);\n}\n"]}
@@ -0,0 +1,92 @@
1
+ import { CLIDisplay, CLIUtils } from "@twin.org/cli-core";
2
+ import { ComponentFactory, GeneralError, Guards, I18n, Is } from "@twin.org/core";
3
+ const COMMAND_NAME = "tenant-token";
4
+ /**
5
+ * Get the command definition parameters.
6
+ * @param commandDefinitions The registered command definitions.
7
+ */
8
+ export function getCommandDefinitionTenantToken(commandDefinitions) {
9
+ commandDefinitions[COMMAND_NAME] = {
10
+ command: COMMAND_NAME,
11
+ description: I18n.formatMessage("node.cli.commands.tenant-token.description"),
12
+ example: I18n.formatMessage("node.cli.commands.tenant-token.example"),
13
+ requiresTenantId: false,
14
+ params: [
15
+ {
16
+ key: "tenant-id",
17
+ type: "string",
18
+ extendedType: "hex(32)",
19
+ description: I18n.formatMessage("node.cli.commands.tenant-token.params.tenant-id.description"),
20
+ required: false
21
+ },
22
+ {
23
+ key: "api-key",
24
+ type: "string",
25
+ extendedType: "hex(32)",
26
+ description: I18n.formatMessage("node.cli.commands.tenant-token.params.api-key.description"),
27
+ required: false
28
+ },
29
+ {
30
+ key: "output-json",
31
+ type: "string",
32
+ description: I18n.formatMessage("node.cli.commands.tenant-token.params.output-json.description"),
33
+ required: false
34
+ }
35
+ ],
36
+ action: async (engineCore, envVars, params) => tenantToken(engineCore, envVars, params)
37
+ };
38
+ }
39
+ /**
40
+ * Command for generating the x-enc-tenant-id token value for a tenant.
41
+ * @param engineCore The engine core.
42
+ * @param envVars The environment variables for the node.
43
+ * @param params The parameters for the command.
44
+ * @param params.tenantId The tenant ID to generate the token for.
45
+ * @param params.apiKey The API key to look up the tenant ID from.
46
+ * @param params.outputJson The output .json file to store the command output.
47
+ * @returns The tenant ID and generated encrypted token.
48
+ */
49
+ export async function tenantToken(engineCore, envVars, params) {
50
+ if (!Is.stringValue(params.tenantId) && !Is.stringValue(params.apiKey)) {
51
+ throw new GeneralError("tenantToken", "tenantIdOrApiKeyRequired");
52
+ }
53
+ if (Is.stringValue(params.tenantId)) {
54
+ Guards.stringHexLength("tenantToken", "tenant-id", params.tenantId, 32);
55
+ }
56
+ if (Is.stringValue(params.apiKey)) {
57
+ Guards.stringHexLength("tenantToken", "api-key", params.apiKey, 32);
58
+ }
59
+ const urlTransformerComponentType = engineCore.getRegisteredInstanceTypeOptional("urlTransformerComponent");
60
+ if (!Is.stringValue(urlTransformerComponentType)) {
61
+ throw new GeneralError("tenantToken", "urlTransformerComponentNotRegistered");
62
+ }
63
+ const urlTransformer = ComponentFactory.get(urlTransformerComponentType);
64
+ // CLI commands skip component starts (engineCore.start(true)), so the URL transformer
65
+ // service's _nodeId is never initialized. Starting it here within the ContextIdStore
66
+ // context (set by executeCommand) lets it pick up the nodeId correctly.
67
+ await urlTransformer.start?.();
68
+ let tenantId = params.tenantId;
69
+ if (!Is.stringValue(tenantId)) {
70
+ const tenantAdminServiceComponentType = engineCore.getRegisteredInstanceTypeOptional("tenantAdminComponent");
71
+ if (!Is.stringValue(tenantAdminServiceComponentType)) {
72
+ throw new GeneralError("tenantToken", "tenantAdminComponentNotRegistered");
73
+ }
74
+ const tenantAdminService = ComponentFactory.get(tenantAdminServiceComponentType);
75
+ CLIDisplay.task(I18n.formatMessage("node.cli.commands.tenant-token.labels.lookingUp"));
76
+ const tenant = await tenantAdminService.getByApiKey(params.apiKey);
77
+ tenantId = tenant.id;
78
+ }
79
+ CLIDisplay.task(I18n.formatMessage("node.cli.commands.tenant-token.labels.generating"));
80
+ const token = await urlTransformer.encryptParam(tenantId);
81
+ CLIDisplay.break();
82
+ CLIDisplay.value(I18n.formatMessage("node.cli.commands.tenant-token.labels.tenantId"), tenantId);
83
+ CLIDisplay.value(I18n.formatMessage("node.cli.commands.tenant-token.labels.token"), token);
84
+ CLIDisplay.break();
85
+ const json = { tenantId, token };
86
+ if (Is.stringValue(params.outputJson)) {
87
+ await CLIUtils.writeJsonFile(params.outputJson, json, false);
88
+ }
89
+ CLIDisplay.done();
90
+ return json;
91
+ }
92
+ //# sourceMappingURL=tenantToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenantToken.js","sourceRoot":"","sources":["../../../src/commands/tenantToken.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { ITenantAdminComponent, IUrlTransformerComponent } from \"@twin.org/api-models\";\nimport { CLIDisplay, CLIUtils } from \"@twin.org/cli-core\";\nimport { ComponentFactory, GeneralError, Guards, I18n, Is } from \"@twin.org/core\";\nimport type { IEngineCore } from \"@twin.org/engine-models\";\nimport type { ICliCommandDefinition } from \"../models/ICliCommandDefinition.js\";\nimport type { INodeEnvironmentVariables } from \"../models/INodeEnvironmentVariables.js\";\n\nconst COMMAND_NAME = \"tenant-token\";\n\n/**\n * Get the command definition parameters.\n * @param commandDefinitions The registered command definitions.\n */\nexport function getCommandDefinitionTenantToken(commandDefinitions: {\n\t[id: string]: ICliCommandDefinition;\n}): void {\n\tcommandDefinitions[COMMAND_NAME] = {\n\t\tcommand: COMMAND_NAME,\n\t\tdescription: I18n.formatMessage(\"node.cli.commands.tenant-token.description\"),\n\t\texample: I18n.formatMessage(\"node.cli.commands.tenant-token.example\"),\n\t\trequiresTenantId: false,\n\t\tparams: [\n\t\t\t{\n\t\t\t\tkey: \"tenant-id\",\n\t\t\t\ttype: \"string\",\n\t\t\t\textendedType: \"hex(32)\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.tenant-token.params.tenant-id.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"api-key\",\n\t\t\t\ttype: \"string\",\n\t\t\t\textendedType: \"hex(32)\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.tenant-token.params.api-key.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t},\n\t\t\t{\n\t\t\t\tkey: \"output-json\",\n\t\t\t\ttype: \"string\",\n\t\t\t\tdescription: I18n.formatMessage(\n\t\t\t\t\t\"node.cli.commands.tenant-token.params.output-json.description\"\n\t\t\t\t),\n\t\t\t\trequired: false\n\t\t\t}\n\t\t],\n\t\taction: async (engineCore, envVars, params) => tenantToken(engineCore, envVars, params)\n\t};\n}\n\n/**\n * Command for generating the x-enc-tenant-id token value for a tenant.\n * @param engineCore The engine core.\n * @param envVars The environment variables for the node.\n * @param params The parameters for the command.\n * @param params.tenantId The tenant ID to generate the token for.\n * @param params.apiKey The API key to look up the tenant ID from.\n * @param params.outputJson The output .json file to store the command output.\n * @returns The tenant ID and generated encrypted token.\n */\nexport async function tenantToken(\n\tengineCore: IEngineCore,\n\tenvVars: INodeEnvironmentVariables,\n\tparams: {\n\t\ttenantId?: string;\n\t\tapiKey?: string;\n\t\toutputJson?: string;\n\t}\n): Promise<{ tenantId: string; token: string }> {\n\tif (!Is.stringValue(params.tenantId) && !Is.stringValue(params.apiKey)) {\n\t\tthrow new GeneralError(\"tenantToken\", \"tenantIdOrApiKeyRequired\");\n\t}\n\n\tif (Is.stringValue(params.tenantId)) {\n\t\tGuards.stringHexLength(\"tenantToken\", \"tenant-id\", params.tenantId, 32);\n\t}\n\n\tif (Is.stringValue(params.apiKey)) {\n\t\tGuards.stringHexLength(\"tenantToken\", \"api-key\", params.apiKey, 32);\n\t}\n\n\tconst urlTransformerComponentType =\n\t\tengineCore.getRegisteredInstanceTypeOptional(\"urlTransformerComponent\");\n\n\tif (!Is.stringValue(urlTransformerComponentType)) {\n\t\tthrow new GeneralError(\"tenantToken\", \"urlTransformerComponentNotRegistered\");\n\t}\n\n\tconst urlTransformer = ComponentFactory.get<IUrlTransformerComponent>(\n\t\turlTransformerComponentType\n\t);\n\n\t// CLI commands skip component starts (engineCore.start(true)), so the URL transformer\n\t// service's _nodeId is never initialized. Starting it here within the ContextIdStore\n\t// context (set by executeCommand) lets it pick up the nodeId correctly.\n\tawait urlTransformer.start?.();\n\n\tlet tenantId = params.tenantId;\n\n\tif (!Is.stringValue(tenantId)) {\n\t\tconst tenantAdminServiceComponentType =\n\t\t\tengineCore.getRegisteredInstanceTypeOptional(\"tenantAdminComponent\");\n\n\t\tif (!Is.stringValue(tenantAdminServiceComponentType)) {\n\t\t\tthrow new GeneralError(\"tenantToken\", \"tenantAdminComponentNotRegistered\");\n\t\t}\n\n\t\tconst tenantAdminService = ComponentFactory.get<ITenantAdminComponent>(\n\t\t\ttenantAdminServiceComponentType\n\t\t);\n\n\t\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.tenant-token.labels.lookingUp\"));\n\n\t\tconst tenant = await tenantAdminService.getByApiKey(params.apiKey as string);\n\t\ttenantId = tenant.id;\n\t}\n\n\tCLIDisplay.task(I18n.formatMessage(\"node.cli.commands.tenant-token.labels.generating\"));\n\n\tconst token = await urlTransformer.encryptParam(tenantId);\n\n\tCLIDisplay.break();\n\tCLIDisplay.value(I18n.formatMessage(\"node.cli.commands.tenant-token.labels.tenantId\"), tenantId);\n\tCLIDisplay.value(I18n.formatMessage(\"node.cli.commands.tenant-token.labels.token\"), token);\n\tCLIDisplay.break();\n\n\tconst json = { tenantId, token };\n\tif (Is.stringValue(params.outputJson)) {\n\t\tawait CLIUtils.writeJsonFile(params.outputJson, json, false);\n\t}\n\n\tCLIDisplay.done();\n\n\treturn json;\n}\n"]}
package/dist/es/node.js CHANGED
@@ -29,7 +29,7 @@ export async function run(nodeOptions, args) {
29
29
  nodeOptions ??= {};
30
30
  const serverInfo = {
31
31
  name: nodeOptions?.serverName ?? "TWIN Node",
32
- version: nodeOptions?.serverVersion ?? "0.0.3-next.44" // x-release-please-version
32
+ version: nodeOptions?.serverVersion ?? "0.0.3-next.46" // x-release-please-version
33
33
  };
34
34
  CLIDisplay.header(serverInfo.name, serverInfo.version, "🌩️ ");
35
35
  if (!Is.stringValue(nodeOptions?.executionDirectory)) {
@@ -1 +1 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { IServerInfo } from \"@twin.org/api-models\";\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { Coerce, EnvHelper, GeneralError, Is } from \"@twin.org/core\";\nimport type { Engine } from \"@twin.org/engine\";\nimport type { EngineServer } from \"@twin.org/engine-server\";\nimport type { IEngineServerConfig } from \"@twin.org/engine-server-types\";\nimport { ModuleHelper } from \"@twin.org/modules\";\nimport * as dotenv from \"dotenv\";\nimport { buildEngineConfiguration } from \"./builders/engineEnvBuilder.js\";\nimport { buildEngineServerConfiguration } from \"./builders/engineServerEnvBuilder.js\";\nimport { extensionsConfiguration } from \"./builders/extensionsBuilder.js\";\nimport { constructCliCommand, parseCommandLineArgs, registerCommands } from \"./cli.js\";\nimport { getEnvDefaults } from \"./defaults.js\";\nimport type { INodeEngineConfig } from \"./models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"./models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"./models/INodeEnvironmentVariables.js\";\nimport type { INodeOptions } from \"./models/INodeOptions.js\";\nimport { ModuleProtocol } from \"./models/moduleProtocol.js\";\nimport { start } from \"./start.js\";\nimport {\n\tcreateModuleImportUrl,\n\tfileExists,\n\tgetExecutionDirectory,\n\tgetExtensionsCacheDir,\n\tgetScriptDirectory,\n\thandleHttpsProtocol,\n\thandleNpmProtocol,\n\tinitialiseLocales,\n\tloadJsonFile,\n\tloadTextFile,\n\tparseModuleProtocol,\n\tresolvePackageEntryPoint\n} from \"./utils.js\";\n\nconst moduleCache: { [id: string]: unknown } = {};\nlet npmRootCache: string | undefined;\n\n/**\n * Run the TWIN Node.\n * @param nodeOptions Optional configuration options for running the server.\n * @param args Optional command line arguments.\n * @returns A promise that resolves when the server is started containing a shutdown method.\n */\nexport async function run(\n\tnodeOptions?: INodeOptions,\n\targs?: string[]\n): Promise<\n\t| {\n\t\t\tengine: Engine<IEngineServerConfig, INodeEngineState>;\n\t\t\tserver: EngineServer;\n\t\t\tshutdown: () => Promise<void>;\n\t }\n\t| undefined\n> {\n\tlet showErrorDetails = true;\n\tlet debugEnabled = true;\n\ttry {\n\t\tnodeOptions ??= {};\n\n\t\tconst serverInfo: IServerInfo = {\n\t\t\tname: nodeOptions?.serverName ?? \"TWIN Node\",\n\t\t\tversion: nodeOptions?.serverVersion ?? \"0.0.3-next.44\" // x-release-please-version\n\t\t};\n\n\t\tCLIDisplay.header(serverInfo.name, serverInfo.version, \"🌩️ \");\n\n\t\tif (!Is.stringValue(nodeOptions?.executionDirectory)) {\n\t\t\tnodeOptions.executionDirectory = getExecutionDirectory();\n\t\t}\n\t\tCLIDisplay.value(\"Execution Directory\", nodeOptions.executionDirectory);\n\n\t\tif (!Is.stringValue(nodeOptions?.scriptDirectory)) {\n\t\t\tnodeOptions.scriptDirectory = getScriptDirectory(args);\n\t\t}\n\t\tCLIDisplay.value(\"Script Directory\", nodeOptions.scriptDirectory);\n\n\t\tnodeOptions.localesDirectory =\n\t\t\tnodeOptions?.localesDirectory ??\n\t\t\tpath.resolve(path.join(nodeOptions.scriptDirectory, \"dist\", \"locales\"));\n\n\t\tCLIDisplay.value(\"Locales Directory\", nodeOptions.localesDirectory);\n\t\tawait initialiseLocales(nodeOptions.localesDirectory);\n\n\t\tnodeOptions.envPrefix ??= \"TWIN_\";\n\n\t\toverrideModuleImport(nodeOptions.executionDirectory ?? \"\");\n\n\t\tconst commandLineArgs = parseCommandLineArgs(args);\n\n\t\tconst hasEnvPrefix = commandLineArgs.options?.find(option => option.key === \"env-prefix\");\n\t\tif (hasEnvPrefix) {\n\t\t\tnodeOptions.envPrefix = Coerce.string(hasEnvPrefix.value) ?? nodeOptions.envPrefix;\n\t\t}\n\n\t\tCLIDisplay.value(\"Environment Variable Prefix\", nodeOptions.envPrefix);\n\n\t\t// This is the only location in the code base that should access process.env directly\n\t\t// So we can safely disable the linting rule here.\n\t\tlet finalEnvVars =\n\t\t\t// eslint-disable-next-line no-restricted-syntax\n\t\t\tprocess.env as {\n\t\t\t\t[id: string]: string;\n\t\t\t};\n\n\t\tif (Is.objectValue(nodeOptions?.envVars)) {\n\t\t\tfinalEnvVars = {\n\t\t\t\t...finalEnvVars,\n\t\t\t\t...nodeOptions.envVars\n\t\t\t};\n\t\t}\n\n\t\tfinalEnvVars = {\n\t\t\t...getEnvDefaults(nodeOptions.envPrefix),\n\t\t\t...finalEnvVars\n\t\t};\n\n\t\tlet cliCommand;\n\t\tif (Is.arrayValue(commandLineArgs.options)) {\n\t\t\tregisterCommands();\n\t\t\tcliCommand = constructCliCommand(finalEnvVars, commandLineArgs);\n\t\t}\n\n\t\tif (Is.object(cliCommand)) {\n\t\t\tfinalEnvVars[`${nodeOptions.envPrefix}SILENT`] ??= \"true\";\n\t\t} else {\n\t\t\tif (Is.empty(nodeOptions?.openApiSpecFile)) {\n\t\t\t\tconst specFile = path.resolve(\n\t\t\t\t\tpath.join(nodeOptions.scriptDirectory ?? \"\", \"docs\", \"open-api\", \"spec.json\")\n\t\t\t\t);\n\t\t\t\tif (await fileExists(specFile)) {\n\t\t\t\t\tnodeOptions ??= {};\n\t\t\t\t\tnodeOptions.openApiSpecFile = specFile;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Is.stringValue(nodeOptions.openApiSpecFile)) {\n\t\t\t\tCLIDisplay.value(\"OpenAPI Spec File\", nodeOptions.openApiSpecFile);\n\t\t\t}\n\n\t\t\tif (Is.empty(nodeOptions?.favIconFile)) {\n\t\t\t\tconst favIconFile = path.resolve(\n\t\t\t\t\tpath.join(nodeOptions.scriptDirectory ?? \"\", \"static\", \"favicon.png\")\n\t\t\t\t);\n\t\t\t\tif (await fileExists(favIconFile)) {\n\t\t\t\t\tnodeOptions ??= {};\n\t\t\t\t\tnodeOptions.favIconFile = favIconFile;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Is.stringValue(nodeOptions.favIconFile)) {\n\t\t\t\tCLIDisplay.value(\"Favicon File\", nodeOptions.favIconFile);\n\t\t\t}\n\t\t}\n\n\t\tconst { nodeEngineConfig, nodeEnvVars, availableContextIdKeys } = await buildConfiguration(\n\t\t\tfinalEnvVars,\n\t\t\tnodeOptions,\n\t\t\tserverInfo\n\t\t);\n\n\t\tdebugEnabled = Coerce.boolean(nodeEnvVars.debug) ?? debugEnabled;\n\n\t\tCLIDisplay.break();\n\n\t\tconst startResult = await start(\n\t\t\tnodeOptions,\n\t\t\tnodeEngineConfig,\n\t\t\tnodeEnvVars,\n\t\t\tcliCommand,\n\t\t\tavailableContextIdKeys\n\t\t);\n\n\t\tif (!Is.empty(startResult)) {\n\t\t\tshowErrorDetails = false;\n\n\t\t\tlet isShuttingDown = false;\n\t\t\tfor (const signal of [\"SIGHUP\", \"SIGINT\", \"SIGTERM\"]) {\n\t\t\t\tprocess.on(signal, async () => {\n\t\t\t\t\tif (!isShuttingDown) {\n\t\t\t\t\t\tisShuttingDown = true;\n\t\t\t\t\t\tCLIDisplay.value(\"Terminate Signal\", signal);\n\t\t\t\t\t\tawait startResult.shutdown();\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn startResult;\n\t} catch (err) {\n\t\tif (nodeOptions?.disableProcessExitOnFailure ?? false) {\n\t\t\tthrow err;\n\t\t}\n\n\t\tif (showErrorDetails) {\n\t\t\tCLIDisplay.error(err, true, { includeAdditional: true, includeStack: debugEnabled });\n\t\t}\n\n\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\tprocess.exit(1);\n\t}\n}\n\n/**\n * Build the configuration for the TWIN Node.\n * @param processEnv The environment variables from the process.\n * @param options The options for running the server.\n * @param serverInfo The server information.\n * @returns A promise that resolves to the engine server configuration, environment prefix, environment variables,\n * and options.\n */\nexport async function buildConfiguration(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\toptions: INodeOptions,\n\tserverInfo: IServerInfo\n): Promise<{\n\tnodeEnvVars: INodeEnvironmentVariables & { [id: string]: string | unknown };\n\tnodeEngineConfig: INodeEngineConfig;\n\tavailableContextIdKeys: { key: string; requiredHandlerFeatures: string[] }[];\n}> {\n\tconst availableContextIdKeys: { key: string; requiredHandlerFeatures: string[] }[] = [];\n\n\tlet defaultEnvOnly = false;\n\tif (Is.empty(options?.envFilenames)) {\n\t\tconst envFile = path.resolve(path.join(options.executionDirectory ?? \"\", \".env\"));\n\t\tCLIDisplay.value(\"Default Environment File\", envFile);\n\t\toptions ??= {};\n\t\toptions.envFilenames = [envFile];\n\t\tdefaultEnvOnly = true;\n\t}\n\n\tif (Is.arrayValue(options?.envFilenames)) {\n\t\tconst output = dotenv.config({\n\t\t\tpath: options?.envFilenames,\n\t\t\tquiet: true\n\t\t});\n\n\t\t// We don't want to throw an error if the default environment file is not found.\n\t\t// Only if we have custom environment files.\n\t\tif (!defaultEnvOnly && output.error) {\n\t\t\tthrow output.error;\n\t\t}\n\n\t\tif (Is.objectValue(output.parsed)) {\n\t\t\tfor (const [key, value] of Object.entries(output.parsed)) {\n\t\t\t\t// Only set environment variables that are not already set in\n\t\t\t\t// the process environment or provided via options.envVars\n\t\t\t\tprocessEnv[key] ??= value;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst envVars = EnvHelper.envToJson<{ [id: string]: string | unknown }>(\n\t\tprocessEnv,\n\t\toptions.envPrefix ?? \"\"\n\t);\n\n\t// Expand any environment variables that use the @file: syntax\n\tconst keys = Object.keys(envVars);\n\tfor (const key of keys) {\n\t\tif (\n\t\t\tIs.stringValue(envVars[key]) &&\n\t\t\t(envVars[key].startsWith(\"@text:\") || envVars[key].startsWith(\"@json:\"))\n\t\t) {\n\t\t\tconst filePath = envVars[key].slice(6).trim();\n\t\t\tconst embeddedFile = path.resolve(path.join(options.executionDirectory ?? \"\", filePath));\n\n\t\t\tif (envVars[key].startsWith(\"@text:\")) {\n\t\t\t\tCLIDisplay.value(`Expanding Environment Variable: ${key} from text file`, embeddedFile);\n\t\t\t\tenvVars[key] = await loadTextFile(embeddedFile);\n\t\t\t} else if (envVars[key].startsWith(\"@json:\")) {\n\t\t\t\tCLIDisplay.value(`Expanding Environment Variable: ${key} from JSON file`, embeddedFile);\n\t\t\t\tenvVars[key] = await loadJsonFile(embeddedFile);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Extend the environment variables with any additional custom configuration.\n\tif (Is.function(options?.extendEnvVars)) {\n\t\tCLIDisplay.task(\"Extending Environment Variables\");\n\t\tawait options.extendEnvVars(envVars);\n\t}\n\n\t// Build the engine configuration from the environment variables.\n\tconst coreConfig = await buildEngineConfiguration(envVars, availableContextIdKeys);\n\tconst engineServerConfig = await buildEngineServerConfiguration(\n\t\tenvVars,\n\t\tavailableContextIdKeys,\n\t\tcoreConfig,\n\t\tserverInfo,\n\t\toptions?.openApiSpecFile,\n\t\toptions?.favIconFile\n\t);\n\n\t// Merge any custom configuration provided in the options.\n\tif (Is.arrayValue(options?.configFilenames)) {\n\t\tfor (const configFile of options.configFilenames) {\n\t\t\tCLIDisplay.value(\"Loading Configuration File\", configFile);\n\t\t\tconst configFilePath = path.resolve(path.join(options.executionDirectory ?? \"\", configFile));\n\t\t\tconst config = await loadJsonFile(configFilePath);\n\t\t\tObject.assign(engineServerConfig, config);\n\t\t}\n\t}\n\n\tif (Is.objectValue(options?.config)) {\n\t\tCLIDisplay.task(\"Merging Custom Configuration\");\n\t\tObject.assign(engineServerConfig, options.config);\n\t}\n\n\t// Merge any custom configuration provided in the options.\n\tif (Is.function(options?.extendConfig)) {\n\t\tCLIDisplay.task(\"Extending Configuration\");\n\t\tawait options.extendConfig(envVars, engineServerConfig);\n\t}\n\n\tconst nodeEngineConfig = await extensionsConfiguration(envVars, engineServerConfig);\n\n\treturn { nodeEngineConfig, nodeEnvVars: envVars, availableContextIdKeys };\n}\n\n/**\n * Override module imports to support protocol-based loading (npm:, https:) and local files.\n * @param executionDirectory The execution directory for resolving local module paths.\n * @param envVars The environment variables containing extension configuration (optional, uses defaults if not provided).\n */\nexport function overrideModuleImport(\n\texecutionDirectory: string,\n\tenvVars?: INodeEnvironmentVariables\n): void {\n\tconst maxSizeMb = Coerce.number(envVars?.extensionsMaxSizeMb) ?? 10;\n\tconst cacheDirectory = envVars?.extensionsCacheDirectory;\n\n\tModuleHelper.overrideImport(async moduleName => {\n\t\tif (moduleCache[moduleName]) {\n\t\t\treturn {\n\t\t\t\tmodule: moduleCache[moduleName],\n\t\t\t\tuseDefault: false\n\t\t\t};\n\t\t}\n\n\t\tconst parsed = parseModuleProtocol(moduleName);\n\t\tlet resolvedPath: string | undefined;\n\n\t\tswitch (parsed.protocol) {\n\t\t\tcase ModuleProtocol.Npm: {\n\t\t\t\tconst result = await handleNpmProtocol(\n\t\t\t\t\tparsed.identifier,\n\t\t\t\t\texecutionDirectory,\n\t\t\t\t\tcacheDirectory\n\t\t\t\t);\n\t\t\t\tresolvedPath = result.resolvedPath;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Https: {\n\t\t\t\tconst result = await handleHttpsProtocol(\n\t\t\t\t\tparsed.identifier,\n\t\t\t\t\texecutionDirectory,\n\t\t\t\t\tmaxSizeMb,\n\t\t\t\t\tcacheDirectory,\n\t\t\t\t\tenvVars?.extensionsCacheTtlHours,\n\t\t\t\t\tenvVars?.extensionsForceRefresh\n\t\t\t\t);\n\t\t\t\tresolvedPath = result.resolvedPath;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Http: {\n\t\t\t\tthrow new GeneralError(\"node\", \"insecureProtocol\", { protocol: ModuleProtocol.Http });\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Local: {\n\t\t\t\tlet localFilename = path.resolve(moduleName);\n\n\t\t\t\tlet exists = await fileExists(localFilename);\n\t\t\t\tif (!exists) {\n\t\t\t\t\tlocalFilename = path.resolve(executionDirectory, moduleName);\n\t\t\t\t\texists = await fileExists(localFilename);\n\t\t\t\t}\n\n\t\t\t\tif (exists) {\n\t\t\t\t\tresolvedPath = localFilename;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Default: {\n\t\t\t\ttry {\n\t\t\t\t\tconst packagePath = path.resolve(getNpmRootPath(), moduleName);\n\t\t\t\t\tconst mainFile = await resolvePackageEntryPoint(packagePath, moduleName);\n\t\t\t\t\tconst modulePath = path.resolve(packagePath, mainFile);\n\t\t\t\t\tconst exists = await fileExists(modulePath);\n\t\t\t\t\tif (exists) {\n\t\t\t\t\t\tresolvedPath = modulePath;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Continue to fallback resolution\n\t\t\t\t}\n\n\t\t\t\t// Fallback: resolve from npm protocol cache directory (installed via handleNpmProtocol)\n\t\t\t\ttry {\n\t\t\t\t\tconst cacheNpmRoot = path.resolve(\n\t\t\t\t\t\tgetExtensionsCacheDir(executionDirectory, ModuleProtocol.Npm, cacheDirectory),\n\t\t\t\t\t\t\"node_modules\"\n\t\t\t\t\t);\n\n\t\t\t\t\tconst packagePath = path.resolve(cacheNpmRoot, moduleName);\n\t\t\t\t\tconst mainFile = await resolvePackageEntryPoint(packagePath, moduleName);\n\t\t\t\t\tconst modulePath = path.resolve(packagePath, mainFile);\n\t\t\t\t\tconst exists = await fileExists(modulePath);\n\t\t\t\t\tif (exists) {\n\t\t\t\t\t\tresolvedPath = modulePath;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// No cached resolution either; fall through\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Common module loading and caching logic\n\t\tif (resolvedPath) {\n\t\t\tconst module = await import(createModuleImportUrl(resolvedPath));\n\t\t\tmoduleCache[moduleName] = module;\n\t\t\treturn {\n\t\t\t\tmodule,\n\t\t\t\tuseDefault: false\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmodule: undefined,\n\t\t\tuseDefault: true\n\t\t};\n\t});\n}\n\n/**\n * Get the root path for npm modules by executing \"npm root\" command and cache it.\n * @returns The root path for npm modules.\n */\nfunction getNpmRootPath(): string {\n\tnpmRootCache ??= execSync(\"npm root\").toString().trim().replace(/\\\\/g, \"/\");\n\treturn npmRootCache;\n}\n"]}
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/node.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { execSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport type { IServerInfo } from \"@twin.org/api-models\";\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { Coerce, EnvHelper, GeneralError, Is } from \"@twin.org/core\";\nimport type { Engine } from \"@twin.org/engine\";\nimport type { EngineServer } from \"@twin.org/engine-server\";\nimport type { IEngineServerConfig } from \"@twin.org/engine-server-types\";\nimport { ModuleHelper } from \"@twin.org/modules\";\nimport * as dotenv from \"dotenv\";\nimport { buildEngineConfiguration } from \"./builders/engineEnvBuilder.js\";\nimport { buildEngineServerConfiguration } from \"./builders/engineServerEnvBuilder.js\";\nimport { extensionsConfiguration } from \"./builders/extensionsBuilder.js\";\nimport { constructCliCommand, parseCommandLineArgs, registerCommands } from \"./cli.js\";\nimport { getEnvDefaults } from \"./defaults.js\";\nimport type { INodeEngineConfig } from \"./models/INodeEngineConfig.js\";\nimport type { INodeEngineState } from \"./models/INodeEngineState.js\";\nimport type { INodeEnvironmentVariables } from \"./models/INodeEnvironmentVariables.js\";\nimport type { INodeOptions } from \"./models/INodeOptions.js\";\nimport { ModuleProtocol } from \"./models/moduleProtocol.js\";\nimport { start } from \"./start.js\";\nimport {\n\tcreateModuleImportUrl,\n\tfileExists,\n\tgetExecutionDirectory,\n\tgetExtensionsCacheDir,\n\tgetScriptDirectory,\n\thandleHttpsProtocol,\n\thandleNpmProtocol,\n\tinitialiseLocales,\n\tloadJsonFile,\n\tloadTextFile,\n\tparseModuleProtocol,\n\tresolvePackageEntryPoint\n} from \"./utils.js\";\n\nconst moduleCache: { [id: string]: unknown } = {};\nlet npmRootCache: string | undefined;\n\n/**\n * Run the TWIN Node.\n * @param nodeOptions Optional configuration options for running the server.\n * @param args Optional command line arguments.\n * @returns A promise that resolves when the server is started containing a shutdown method.\n */\nexport async function run(\n\tnodeOptions?: INodeOptions,\n\targs?: string[]\n): Promise<\n\t| {\n\t\t\tengine: Engine<IEngineServerConfig, INodeEngineState>;\n\t\t\tserver: EngineServer;\n\t\t\tshutdown: () => Promise<void>;\n\t }\n\t| undefined\n> {\n\tlet showErrorDetails = true;\n\tlet debugEnabled = true;\n\ttry {\n\t\tnodeOptions ??= {};\n\n\t\tconst serverInfo: IServerInfo = {\n\t\t\tname: nodeOptions?.serverName ?? \"TWIN Node\",\n\t\t\tversion: nodeOptions?.serverVersion ?? \"0.0.3-next.46\" // x-release-please-version\n\t\t};\n\n\t\tCLIDisplay.header(serverInfo.name, serverInfo.version, \"🌩️ \");\n\n\t\tif (!Is.stringValue(nodeOptions?.executionDirectory)) {\n\t\t\tnodeOptions.executionDirectory = getExecutionDirectory();\n\t\t}\n\t\tCLIDisplay.value(\"Execution Directory\", nodeOptions.executionDirectory);\n\n\t\tif (!Is.stringValue(nodeOptions?.scriptDirectory)) {\n\t\t\tnodeOptions.scriptDirectory = getScriptDirectory(args);\n\t\t}\n\t\tCLIDisplay.value(\"Script Directory\", nodeOptions.scriptDirectory);\n\n\t\tnodeOptions.localesDirectory =\n\t\t\tnodeOptions?.localesDirectory ??\n\t\t\tpath.resolve(path.join(nodeOptions.scriptDirectory, \"dist\", \"locales\"));\n\n\t\tCLIDisplay.value(\"Locales Directory\", nodeOptions.localesDirectory);\n\t\tawait initialiseLocales(nodeOptions.localesDirectory);\n\n\t\tnodeOptions.envPrefix ??= \"TWIN_\";\n\n\t\toverrideModuleImport(nodeOptions.executionDirectory ?? \"\");\n\n\t\tconst commandLineArgs = parseCommandLineArgs(args);\n\n\t\tconst hasEnvPrefix = commandLineArgs.options?.find(option => option.key === \"env-prefix\");\n\t\tif (hasEnvPrefix) {\n\t\t\tnodeOptions.envPrefix = Coerce.string(hasEnvPrefix.value) ?? nodeOptions.envPrefix;\n\t\t}\n\n\t\tCLIDisplay.value(\"Environment Variable Prefix\", nodeOptions.envPrefix);\n\n\t\t// This is the only location in the code base that should access process.env directly\n\t\t// So we can safely disable the linting rule here.\n\t\tlet finalEnvVars =\n\t\t\t// eslint-disable-next-line no-restricted-syntax\n\t\t\tprocess.env as {\n\t\t\t\t[id: string]: string;\n\t\t\t};\n\n\t\tif (Is.objectValue(nodeOptions?.envVars)) {\n\t\t\tfinalEnvVars = {\n\t\t\t\t...finalEnvVars,\n\t\t\t\t...nodeOptions.envVars\n\t\t\t};\n\t\t}\n\n\t\tfinalEnvVars = {\n\t\t\t...getEnvDefaults(nodeOptions.envPrefix),\n\t\t\t...finalEnvVars\n\t\t};\n\n\t\tlet cliCommand;\n\t\tif (Is.arrayValue(commandLineArgs.options)) {\n\t\t\tregisterCommands();\n\t\t\tcliCommand = constructCliCommand(finalEnvVars, commandLineArgs);\n\t\t}\n\n\t\tif (Is.object(cliCommand)) {\n\t\t\tfinalEnvVars[`${nodeOptions.envPrefix}SILENT`] ??= \"true\";\n\t\t} else {\n\t\t\tif (Is.empty(nodeOptions?.openApiSpecFile)) {\n\t\t\t\tconst specFile = path.resolve(\n\t\t\t\t\tpath.join(nodeOptions.scriptDirectory ?? \"\", \"docs\", \"open-api\", \"spec.json\")\n\t\t\t\t);\n\t\t\t\tif (await fileExists(specFile)) {\n\t\t\t\t\tnodeOptions ??= {};\n\t\t\t\t\tnodeOptions.openApiSpecFile = specFile;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Is.stringValue(nodeOptions.openApiSpecFile)) {\n\t\t\t\tCLIDisplay.value(\"OpenAPI Spec File\", nodeOptions.openApiSpecFile);\n\t\t\t}\n\n\t\t\tif (Is.empty(nodeOptions?.favIconFile)) {\n\t\t\t\tconst favIconFile = path.resolve(\n\t\t\t\t\tpath.join(nodeOptions.scriptDirectory ?? \"\", \"static\", \"favicon.png\")\n\t\t\t\t);\n\t\t\t\tif (await fileExists(favIconFile)) {\n\t\t\t\t\tnodeOptions ??= {};\n\t\t\t\t\tnodeOptions.favIconFile = favIconFile;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (Is.stringValue(nodeOptions.favIconFile)) {\n\t\t\t\tCLIDisplay.value(\"Favicon File\", nodeOptions.favIconFile);\n\t\t\t}\n\t\t}\n\n\t\tconst { nodeEngineConfig, nodeEnvVars, availableContextIdKeys } = await buildConfiguration(\n\t\t\tfinalEnvVars,\n\t\t\tnodeOptions,\n\t\t\tserverInfo\n\t\t);\n\n\t\tdebugEnabled = Coerce.boolean(nodeEnvVars.debug) ?? debugEnabled;\n\n\t\tCLIDisplay.break();\n\n\t\tconst startResult = await start(\n\t\t\tnodeOptions,\n\t\t\tnodeEngineConfig,\n\t\t\tnodeEnvVars,\n\t\t\tcliCommand,\n\t\t\tavailableContextIdKeys\n\t\t);\n\n\t\tif (!Is.empty(startResult)) {\n\t\t\tshowErrorDetails = false;\n\n\t\t\tlet isShuttingDown = false;\n\t\t\tfor (const signal of [\"SIGHUP\", \"SIGINT\", \"SIGTERM\"]) {\n\t\t\t\tprocess.on(signal, async () => {\n\t\t\t\t\tif (!isShuttingDown) {\n\t\t\t\t\t\tisShuttingDown = true;\n\t\t\t\t\t\tCLIDisplay.value(\"Terminate Signal\", signal);\n\t\t\t\t\t\tawait startResult.shutdown();\n\t\t\t\t\t\tprocess.exit(0);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn startResult;\n\t} catch (err) {\n\t\tif (nodeOptions?.disableProcessExitOnFailure ?? false) {\n\t\t\tthrow err;\n\t\t}\n\n\t\tif (showErrorDetails) {\n\t\t\tCLIDisplay.error(err, true, { includeAdditional: true, includeStack: debugEnabled });\n\t\t}\n\n\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\tprocess.exit(1);\n\t}\n}\n\n/**\n * Build the configuration for the TWIN Node.\n * @param processEnv The environment variables from the process.\n * @param options The options for running the server.\n * @param serverInfo The server information.\n * @returns A promise that resolves to the engine server configuration, environment prefix, environment variables,\n * and options.\n */\nexport async function buildConfiguration(\n\tprocessEnv: {\n\t\t[id: string]: string;\n\t},\n\toptions: INodeOptions,\n\tserverInfo: IServerInfo\n): Promise<{\n\tnodeEnvVars: INodeEnvironmentVariables & { [id: string]: string | unknown };\n\tnodeEngineConfig: INodeEngineConfig;\n\tavailableContextIdKeys: { key: string; requiredHandlerFeatures: string[] }[];\n}> {\n\tconst availableContextIdKeys: { key: string; requiredHandlerFeatures: string[] }[] = [];\n\n\tlet defaultEnvOnly = false;\n\tif (Is.empty(options?.envFilenames)) {\n\t\tconst envFile = path.resolve(path.join(options.executionDirectory ?? \"\", \".env\"));\n\t\tCLIDisplay.value(\"Default Environment File\", envFile);\n\t\toptions ??= {};\n\t\toptions.envFilenames = [envFile];\n\t\tdefaultEnvOnly = true;\n\t}\n\n\tif (Is.arrayValue(options?.envFilenames)) {\n\t\tconst output = dotenv.config({\n\t\t\tpath: options?.envFilenames,\n\t\t\tquiet: true\n\t\t});\n\n\t\t// We don't want to throw an error if the default environment file is not found.\n\t\t// Only if we have custom environment files.\n\t\tif (!defaultEnvOnly && output.error) {\n\t\t\tthrow output.error;\n\t\t}\n\n\t\tif (Is.objectValue(output.parsed)) {\n\t\t\tfor (const [key, value] of Object.entries(output.parsed)) {\n\t\t\t\t// Only set environment variables that are not already set in\n\t\t\t\t// the process environment or provided via options.envVars\n\t\t\t\tprocessEnv[key] ??= value;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst envVars = EnvHelper.envToJson<{ [id: string]: string | unknown }>(\n\t\tprocessEnv,\n\t\toptions.envPrefix ?? \"\"\n\t);\n\n\t// Expand any environment variables that use the @file: syntax\n\tconst keys = Object.keys(envVars);\n\tfor (const key of keys) {\n\t\tif (\n\t\t\tIs.stringValue(envVars[key]) &&\n\t\t\t(envVars[key].startsWith(\"@text:\") || envVars[key].startsWith(\"@json:\"))\n\t\t) {\n\t\t\tconst filePath = envVars[key].slice(6).trim();\n\t\t\tconst embeddedFile = path.resolve(path.join(options.executionDirectory ?? \"\", filePath));\n\n\t\t\tif (envVars[key].startsWith(\"@text:\")) {\n\t\t\t\tCLIDisplay.value(`Expanding Environment Variable: ${key} from text file`, embeddedFile);\n\t\t\t\tenvVars[key] = await loadTextFile(embeddedFile);\n\t\t\t} else if (envVars[key].startsWith(\"@json:\")) {\n\t\t\t\tCLIDisplay.value(`Expanding Environment Variable: ${key} from JSON file`, embeddedFile);\n\t\t\t\tenvVars[key] = await loadJsonFile(embeddedFile);\n\t\t\t}\n\t\t}\n\t}\n\n\t// Extend the environment variables with any additional custom configuration.\n\tif (Is.function(options?.extendEnvVars)) {\n\t\tCLIDisplay.task(\"Extending Environment Variables\");\n\t\tawait options.extendEnvVars(envVars);\n\t}\n\n\t// Build the engine configuration from the environment variables.\n\tconst coreConfig = await buildEngineConfiguration(envVars, availableContextIdKeys);\n\tconst engineServerConfig = await buildEngineServerConfiguration(\n\t\tenvVars,\n\t\tavailableContextIdKeys,\n\t\tcoreConfig,\n\t\tserverInfo,\n\t\toptions?.openApiSpecFile,\n\t\toptions?.favIconFile\n\t);\n\n\t// Merge any custom configuration provided in the options.\n\tif (Is.arrayValue(options?.configFilenames)) {\n\t\tfor (const configFile of options.configFilenames) {\n\t\t\tCLIDisplay.value(\"Loading Configuration File\", configFile);\n\t\t\tconst configFilePath = path.resolve(path.join(options.executionDirectory ?? \"\", configFile));\n\t\t\tconst config = await loadJsonFile(configFilePath);\n\t\t\tObject.assign(engineServerConfig, config);\n\t\t}\n\t}\n\n\tif (Is.objectValue(options?.config)) {\n\t\tCLIDisplay.task(\"Merging Custom Configuration\");\n\t\tObject.assign(engineServerConfig, options.config);\n\t}\n\n\t// Merge any custom configuration provided in the options.\n\tif (Is.function(options?.extendConfig)) {\n\t\tCLIDisplay.task(\"Extending Configuration\");\n\t\tawait options.extendConfig(envVars, engineServerConfig);\n\t}\n\n\tconst nodeEngineConfig = await extensionsConfiguration(envVars, engineServerConfig);\n\n\treturn { nodeEngineConfig, nodeEnvVars: envVars, availableContextIdKeys };\n}\n\n/**\n * Override module imports to support protocol-based loading (npm:, https:) and local files.\n * @param executionDirectory The execution directory for resolving local module paths.\n * @param envVars The environment variables containing extension configuration (optional, uses defaults if not provided).\n */\nexport function overrideModuleImport(\n\texecutionDirectory: string,\n\tenvVars?: INodeEnvironmentVariables\n): void {\n\tconst maxSizeMb = Coerce.number(envVars?.extensionsMaxSizeMb) ?? 10;\n\tconst cacheDirectory = envVars?.extensionsCacheDirectory;\n\n\tModuleHelper.overrideImport(async moduleName => {\n\t\tif (moduleCache[moduleName]) {\n\t\t\treturn {\n\t\t\t\tmodule: moduleCache[moduleName],\n\t\t\t\tuseDefault: false\n\t\t\t};\n\t\t}\n\n\t\tconst parsed = parseModuleProtocol(moduleName);\n\t\tlet resolvedPath: string | undefined;\n\n\t\tswitch (parsed.protocol) {\n\t\t\tcase ModuleProtocol.Npm: {\n\t\t\t\tconst result = await handleNpmProtocol(\n\t\t\t\t\tparsed.identifier,\n\t\t\t\t\texecutionDirectory,\n\t\t\t\t\tcacheDirectory\n\t\t\t\t);\n\t\t\t\tresolvedPath = result.resolvedPath;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Https: {\n\t\t\t\tconst result = await handleHttpsProtocol(\n\t\t\t\t\tparsed.identifier,\n\t\t\t\t\texecutionDirectory,\n\t\t\t\t\tmaxSizeMb,\n\t\t\t\t\tcacheDirectory,\n\t\t\t\t\tenvVars?.extensionsCacheTtlHours,\n\t\t\t\t\tenvVars?.extensionsForceRefresh\n\t\t\t\t);\n\t\t\t\tresolvedPath = result.resolvedPath;\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Http: {\n\t\t\t\tthrow new GeneralError(\"node\", \"insecureProtocol\", { protocol: ModuleProtocol.Http });\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Local: {\n\t\t\t\tlet localFilename = path.resolve(moduleName);\n\n\t\t\t\tlet exists = await fileExists(localFilename);\n\t\t\t\tif (!exists) {\n\t\t\t\t\tlocalFilename = path.resolve(executionDirectory, moduleName);\n\t\t\t\t\texists = await fileExists(localFilename);\n\t\t\t\t}\n\n\t\t\t\tif (exists) {\n\t\t\t\t\tresolvedPath = localFilename;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase ModuleProtocol.Default: {\n\t\t\t\ttry {\n\t\t\t\t\tconst packagePath = path.resolve(getNpmRootPath(), moduleName);\n\t\t\t\t\tconst mainFile = await resolvePackageEntryPoint(packagePath, moduleName);\n\t\t\t\t\tconst modulePath = path.resolve(packagePath, mainFile);\n\t\t\t\t\tconst exists = await fileExists(modulePath);\n\t\t\t\t\tif (exists) {\n\t\t\t\t\t\tresolvedPath = modulePath;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// Continue to fallback resolution\n\t\t\t\t}\n\n\t\t\t\t// Fallback: resolve from npm protocol cache directory (installed via handleNpmProtocol)\n\t\t\t\ttry {\n\t\t\t\t\tconst cacheNpmRoot = path.resolve(\n\t\t\t\t\t\tgetExtensionsCacheDir(executionDirectory, ModuleProtocol.Npm, cacheDirectory),\n\t\t\t\t\t\t\"node_modules\"\n\t\t\t\t\t);\n\n\t\t\t\t\tconst packagePath = path.resolve(cacheNpmRoot, moduleName);\n\t\t\t\t\tconst mainFile = await resolvePackageEntryPoint(packagePath, moduleName);\n\t\t\t\t\tconst modulePath = path.resolve(packagePath, mainFile);\n\t\t\t\t\tconst exists = await fileExists(modulePath);\n\t\t\t\t\tif (exists) {\n\t\t\t\t\t\tresolvedPath = modulePath;\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\t// No cached resolution either; fall through\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Common module loading and caching logic\n\t\tif (resolvedPath) {\n\t\t\tconst module = await import(createModuleImportUrl(resolvedPath));\n\t\t\tmoduleCache[moduleName] = module;\n\t\t\treturn {\n\t\t\t\tmodule,\n\t\t\t\tuseDefault: false\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tmodule: undefined,\n\t\t\tuseDefault: true\n\t\t};\n\t});\n}\n\n/**\n * Get the root path for npm modules by executing \"npm root\" command and cache it.\n * @returns The root path for npm modules.\n */\nfunction getNpmRootPath(): string {\n\tnpmRootCache ??= execSync(\"npm root\").toString().trim().replace(/\\\\/g, \"/\");\n\treturn npmRootCache;\n}\n"]}
package/dist/es/utils.js CHANGED
@@ -213,9 +213,15 @@ export function getExtensionsCacheDir(executionDirectory, protocol, cacheDirecto
213
213
  */
214
214
  export async function handleNpmProtocol(packageName, executionDirectory, cacheDirectory) {
215
215
  const cacheDir = getExtensionsCacheDir(executionDirectory, ModuleProtocol.Npm, cacheDirectory);
216
- // Extract just the package name (without version) for the directory
217
- // e.g. "picocolors@1.0.0" becomes "picocolors"
218
- // e.g. "@scope/package@1.0.0" becomes "@scope/package"
216
+ // Strip the version suffix to get the bare package name. We use lastIndexOf
217
+ // (not indexOf) so the leading "@" of a scoped package is preserved — for
218
+ // "@scope/pkg@1.0.0" the last "@" is the version separator at the end, not
219
+ // the scope prefix at position 0. The `> 0` (not `>= 0`) check then leaves
220
+ // unversioned scoped names like "@scope/pkg" untouched, since their only "@"
221
+ // sits at index 0.
222
+ // e.g. "picocolors@1.0.0" → "picocolors"
223
+ // e.g. "@scope/pkg@1.0.0" → "@scope/pkg"
224
+ // e.g. "@scope/pkg" → "@scope/pkg" (unchanged)
219
225
  const lastAtIndex = packageName.lastIndexOf("@");
220
226
  const packageNameOnly = lastAtIndex > 0 ? packageName.slice(0, lastAtIndex) : packageName;
221
227
  const packageDir = path.join(cacheDir, "node_modules", packageNameOnly);
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { execSync } from \"node:child_process\";\nimport { mkdir, readdir, readFile, rename, stat, writeFile } from \"node:fs/promises\";\nimport { get as httpsGet } from \"node:https\";\nimport path from \"node:path\";\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport {\n\tBaseError,\n\tConverter,\n\tGeneralError,\n\tI18n,\n\tIs,\n\ttype ILocaleDictionary\n} from \"@twin.org/core\";\nimport { Sha256 } from \"@twin.org/crypto\";\nimport { ModuleHelper } from \"@twin.org/modules\";\nimport type { ICacheMetadata } from \"./models/ICacheMetadata.js\";\nimport type { IModuleProtocol } from \"./models/IModuleProtocol.js\";\nimport type { IProtocolHandlerResult } from \"./models/IProtocolHandlerResult.js\";\nimport { ModuleProtocol } from \"./models/moduleProtocol.js\";\n\n/**\n * Initialise the locales for the application.\n * @param localesDirectory The directory containing the locales.\n */\nexport async function initialiseLocales(localesDirectory: string): Promise<void> {\n\tconst localesFile = path.resolve(path.join(localesDirectory, \"en.json\"));\n\tCLIDisplay.value(\"Locales File\", localesFile);\n\tif (await fileExists(localesFile)) {\n\t\tconst enLangContent = await readFile(localesFile, \"utf8\");\n\t\tI18n.addDictionary(\"en\", JSON.parse(enLangContent) as ILocaleDictionary);\n\t} else {\n\t\tCLIDisplay.error(`Locales file not found: ${localesFile}`);\n\t}\n}\n\n/**\n * Get the directory where the application is being executed.\n * @returns The execution directory.\n */\nexport function getExecutionDirectory(): string {\n\treturn process.cwd();\n}\n\n/**\n * Get the directory where the script is located.\n * @param args The command line arguments.\n * @returns The execution directory.\n */\nexport function getScriptDirectory(args?: string[]): string {\n\tif (Is.array<string>(args) && args.length >= 2 && args[1].includes(\"index.js\")) {\n\t\treturn path.resolve(path.join(path.dirname(args[1]), \"..\"));\n\t}\n\treturn process.cwd();\n}\n\n/**\n * Does the specified file exist.\n * @param filename The filename to check for existence.\n * @returns True if the file exists.\n */\nexport async function fileExists(filename: string): Promise<boolean> {\n\ttry {\n\t\tconst stats = await stat(filename);\n\t\treturn stats.isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Does the specified directory exist.\n * @param directory The directory to check for existence.\n * @returns True if the directory exists.\n */\nexport async function directoryExists(directory: string): Promise<boolean> {\n\ttry {\n\t\tconst stats = await stat(directory);\n\t\treturn stats.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the sub folders for the folder.\n * @param directory The directory to get the sub folders.\n * @returns The list of sub folders.\n */\nexport async function getSubFolders(directory: string): Promise<string[]> {\n\ttry {\n\t\tconst dir = await readdir(directory);\n\t\tconst folders: string[] = [];\n\t\tfor (const dirEntry of dir) {\n\t\t\tconst fullPath = path.join(directory, dirEntry);\n\t\t\tconst stats = await stat(fullPath);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\tfolders.push(fullPath);\n\t\t\t}\n\t\t}\n\t\treturn folders;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/**\n * Get the files in the directory.\n * @param directory The directory to get the files from.\n * @returns The list of files in the directory.\n */\nexport async function getFiles(directory: string): Promise<string[]> {\n\ttry {\n\t\tconst dir = await readdir(directory);\n\t\tconst files: string[] = [];\n\t\tfor (const dirEntry of dir) {\n\t\t\tconst fullPath = path.join(directory, dirEntry);\n\t\t\tconst stats = await stat(fullPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tfiles.push(fullPath);\n\t\t\t}\n\t\t}\n\t\treturn files;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/**\n * Load the text file.\n * @param filename The filename of the text file to load.\n * @returns The contents of the text file if it could not be loaded.\n */\nexport async function loadTextFile(filename: string): Promise<string> {\n\treturn readFile(filename, \"utf8\");\n}\n\n/**\n * Load the JSON file.\n * @param filename The filename of the JSON file to load.\n * @returns The contents of the JSON file or null if it could not be loaded.\n */\nexport async function loadJsonFile<T>(filename: string): Promise<T> {\n\tconst content = await loadTextFile(filename);\n\treturn JSON.parse(content) as T;\n}\n\n/**\n * Parse the protocol from a module name.\n * @param moduleName The module name to parse.\n * @returns The parsed protocol information.\n */\nexport function parseModuleProtocol(moduleName: string): IModuleProtocol {\n\tconst trimmed = moduleName.trim();\n\n\tif (trimmed.startsWith(\"npm:\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Npm,\n\t\t\tidentifier: trimmed.slice(4),\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (trimmed.startsWith(\"https://\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Https,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (trimmed.startsWith(\"http://\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Http,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (trimmed.startsWith(\"file://\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Local,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (ModuleHelper.isLocalModule(trimmed)) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Local,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\treturn {\n\t\tprotocol: ModuleProtocol.Default,\n\t\tidentifier: trimmed,\n\t\toriginal: trimmed\n\t};\n}\n\n/**\n * Hash a URL to create a safe filename.\n * @param url The URL to hash.\n * @returns A hashed filename safe for the filesystem.\n */\nexport function hashUrl(url: string): string {\n\tconst urlBytes = Converter.utf8ToBytes(url);\n\tconst hashBytes = Sha256.sum256(urlBytes);\n\tconst hash = Converter.bytesToHex(hashBytes);\n\tconst ext = path.extname(new URL(url).pathname);\n\treturn `${hash}${ext}`;\n}\n\n/**\n * Get the extensions cache directory.\n * @param executionDirectory The execution directory.\n * @param protocol The protocol type for subdirectory organization.\n * @param cacheDirectory The cache directory base path.\n * @returns The cache directory path.\n */\nexport function getExtensionsCacheDir(\n\texecutionDirectory: string,\n\tprotocol: ModuleProtocol,\n\tcacheDirectory?: string\n): string {\n\t// Resolve to absolute path to ensure consistent behavior\n\tconst absoluteDir = path.resolve(executionDirectory);\n\tconst baseDir = cacheDirectory ?? \".tmp\";\n\treturn path.join(absoluteDir, baseDir, \"extensions\", protocol);\n}\n\n/**\n * Handle the npm: protocol by installing the package if needed.\n * @param packageName The npm package name (without npm: prefix).\n * @param executionDirectory The execution directory.\n * @param cacheDirectory The cache directory base path.\n * @returns The resolved path to the installed module.\n */\nexport async function handleNpmProtocol(\n\tpackageName: string,\n\texecutionDirectory: string,\n\tcacheDirectory?: string\n): Promise<IProtocolHandlerResult> {\n\tconst cacheDir = getExtensionsCacheDir(executionDirectory, ModuleProtocol.Npm, cacheDirectory);\n\t// Extract just the package name (without version) for the directory\n\t// e.g. \"picocolors@1.0.0\" becomes \"picocolors\"\n\t// e.g. \"@scope/package@1.0.0\" becomes \"@scope/package\"\n\tconst lastAtIndex = packageName.lastIndexOf(\"@\");\n\tconst packageNameOnly = lastAtIndex > 0 ? packageName.slice(0, lastAtIndex) : packageName;\n\tconst packageDir = path.join(cacheDir, \"node_modules\", packageNameOnly);\n\tconst packageJsonPath = path.join(packageDir, \"package.json\");\n\n\tconst exists = await fileExists(packageJsonPath);\n\tif (exists) {\n\t\tconst mainFile = await resolvePackageEntryPoint(packageDir, packageNameOnly);\n\t\tconst modulePath = path.join(packageDir, mainFile);\n\n\t\treturn {\n\t\t\tresolvedPath: modulePath,\n\t\t\tcached: true\n\t\t};\n\t}\n\n\tawait mkdir(cacheDir, { recursive: true });\n\n\tCLIDisplay.task(I18n.formatMessage(\"node.extensionNpmInstalling\"), packageName);\n\n\ttry {\n\t\t// Always pipe stdio to comply with env access restrictions in tests/lint\n\t\tconst stdio: \"pipe\" | \"inherit\" | \"ignore\" = \"pipe\";\n\t\texecSync(\n\t\t\t`npm install ${packageName} --prefix \"${cacheDir}\" --omit=dev --no-save --no-package-lock`,\n\t\t\t{\n\t\t\t\tcwd: cacheDir,\n\t\t\t\tstdio\n\t\t\t}\n\t\t);\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"node\",\n\t\t\t\"extensionNpmInstallFailed\",\n\t\t\t{\n\t\t\t\tpackage: packageName\n\t\t\t},\n\t\t\tBaseError.fromError(err)\n\t\t);\n\t}\n\n\tconst mainFile = await resolvePackageEntryPoint(packageDir, packageNameOnly);\n\tconst modulePath = path.join(packageDir, mainFile);\n\n\treturn {\n\t\tresolvedPath: modulePath,\n\t\tcached: false\n\t};\n}\n\n/**\n * Check if a cached file has expired based on TTL and force refresh settings.\n * @param metadataPath Path to the cache metadata file.\n * @param ttlHours Time to live in hours.\n * @param forceRefresh Whether to force refresh regardless of TTL.\n * @returns True if the cache is expired or should be refreshed.\n */\nexport async function isCacheExpired(\n\tmetadataPath: string,\n\tttlHours: number,\n\tforceRefresh: boolean\n): Promise<boolean> {\n\tif (forceRefresh) {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst metadata = await loadJsonFile<ICacheMetadata>(metadataPath);\n\t\tconst ttlMillis = ttlHours * 60 * 60 * 1000;\n\t\tconst expireTime = metadata.downloadedAt + ttlMillis;\n\t\treturn Date.now() > expireTime;\n\t} catch {\n\t\t// If metadata doesn't exist or is corrupted, consider expired\n\t\treturn true;\n\t}\n}\n\n/**\n * Handle the https: protocol by downloading the module if needed.\n * @param url The HTTPS URL to download from.\n * @param executionDirectory The execution directory.\n * @param maxSizeMb The maximum size in MB for the download.\n * @param cacheDirectory The cache directory base path.\n * @param ttlHours TTL in hours for cache expiration.\n * @param forceRefresh Whether to force refresh the cache.\n * @returns The resolved path to the downloaded module.\n */\nexport async function handleHttpsProtocol(\n\turl: string,\n\texecutionDirectory: string,\n\tmaxSizeMb: number,\n\tcacheDirectory?: string,\n\tttlHours?: number,\n\tforceRefresh?: boolean\n): Promise<IProtocolHandlerResult> {\n\tconst effectiveTtlHours = ttlHours ?? 24;\n\tconst effectiveForceRefresh = forceRefresh ?? false;\n\tconst cacheDir = getExtensionsCacheDir(executionDirectory, ModuleProtocol.Https, cacheDirectory);\n\tconst filename = hashUrl(url);\n\tconst cachedPath = path.join(cacheDir, filename);\n\tconst metadataPath = `${cachedPath}.meta`;\n\n\tconst exists = await fileExists(cachedPath);\n\tif (exists) {\n\t\tconst expired = await isCacheExpired(metadataPath, effectiveTtlHours, effectiveForceRefresh);\n\t\tif (!expired) {\n\t\t\treturn {\n\t\t\t\tresolvedPath: cachedPath,\n\t\t\t\tcached: true\n\t\t\t};\n\t\t}\n\n\t\tif (effectiveForceRefresh) {\n\t\t\tCLIDisplay.warning(I18n.formatMessage(\"node.extensionForceRefresh\", { url }));\n\t\t} else {\n\t\t\tCLIDisplay.task(I18n.formatMessage(\"node.extensionCacheExpired\", { url }));\n\t\t}\n\t}\n\n\tCLIDisplay.warning(I18n.formatMessage(\"node.extensionSecurityWarning\", { url }));\n\tCLIDisplay.task(I18n.formatMessage(\"node.extensionHttpsDownloading\"), url);\n\n\tawait mkdir(cacheDir, { recursive: true });\n\n\tconst maxSizeBytes = maxSizeMb * 1024 * 1024;\n\tlet downloadedSize = 0;\n\tconst chunks: Buffer[] = [];\n\n\ttry {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\thttpsGet(url, response => {\n\t\t\t\tif (response.statusCode !== 200) {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew GeneralError(\"node\", \"extensionDownloadFailed\", {\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\tstatus: response.statusCode ?? 0\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresponse.on(\"data\", (chunk: Buffer) => {\n\t\t\t\t\tdownloadedSize += chunk.length;\n\n\t\t\t\t\tif (downloadedSize > maxSizeBytes) {\n\t\t\t\t\t\tresponse.destroy();\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tnew GeneralError(\"node\", \"extensionSizeLimitExceeded\", {\n\t\t\t\t\t\t\t\tsize: downloadedSize,\n\t\t\t\t\t\t\t\tlimit: maxSizeBytes\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tchunks.push(chunk);\n\t\t\t\t});\n\n\t\t\t\tresponse.on(\"end\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\tresponse.on(\"error\", err => {\n\t\t\t\t\treject(BaseError.fromError(err));\n\t\t\t\t});\n\t\t\t}).on(\"error\", err => {\n\t\t\t\treject(BaseError.fromError(err));\n\t\t\t});\n\t\t});\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"node\",\n\t\t\t\"extensionDownloadFailed\",\n\t\t\t{\n\t\t\t\turl\n\t\t\t},\n\t\t\tBaseError.fromError(err)\n\t\t);\n\t}\n\n\tconst tempPath = `${cachedPath}.tmp`;\n\tawait writeFile(tempPath, Buffer.concat(chunks));\n\n\t// Atomic move from temp to final location\n\tawait rename(tempPath, cachedPath);\n\n\t// Save metadata for TTL tracking\n\tconst metadata: ICacheMetadata = {\n\t\tdownloadedAt: Date.now(),\n\t\turl,\n\t\tsize: Buffer.concat(chunks).length\n\t};\n\tawait writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n\n\treturn {\n\t\tresolvedPath: cachedPath,\n\t\tcached: false\n\t};\n}\n\n/**\n * Resolve the main entry point from a package directory using Node.js resolution with fallback.\n * Uses require.resolve() when possible for standard Node.js behavior, with manual fallback.\n * @param packagePath The absolute path to the package directory.\n * @param packageName The package name for require.resolve().\n * @param fallback The fallback file name if no entry point is found.\n * @returns The resolved entry point file name (relative to package directory).\n */\nexport async function resolvePackageEntryPoint(\n\tpackagePath: string,\n\tpackageName: string,\n\tfallback = \"index.js\"\n): Promise<string> {\n\ttry {\n\t\t// Try require.resolve() first - handles exports, main, module automatically\n\t\tconst resolvedPath = require.resolve(packageName, { paths: [path.dirname(packagePath)] });\n\t\t// Convert absolute path back to relative filename within package\n\t\tconst relativePath = path.relative(packagePath, resolvedPath);\n\t\treturn relativePath ?? fallback;\n\t} catch {\n\t\t// Fallback to manual package.json parsing if require.resolve fails\n\t\ttry {\n\t\t\tconst packageJsonPath = path.join(packagePath, \"package.json\");\n\t\t\tconst packageJsonContent = await loadJsonFile<{\n\t\t\t\tmodule?: string;\n\t\t\t\tmain?: string;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\texports?: any;\n\t\t\t}>(packageJsonPath);\n\n\t\t\t// Future: Could expand exports field support here\n\t\t\treturn packageJsonContent.module ?? packageJsonContent.main ?? fallback;\n\t\t} catch {\n\t\t\treturn fallback;\n\t\t}\n\t}\n}\n\n/**\n * Convert a file path to an import-compatible URL for cross-platform module loading.\n * On Windows, adds the 'file://' protocol prefix required for dynamic imports.\n * On other platforms, returns the path unchanged.\n * @param filePath The absolute file path to convert.\n * @returns A URL string compatible with dynamic import().\n */\nexport function createModuleImportUrl(filePath: string): string {\n\treturn process.platform === \"win32\" ? `file://${filePath}` : filePath;\n}\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { execSync } from \"node:child_process\";\nimport { mkdir, readdir, readFile, rename, stat, writeFile } from \"node:fs/promises\";\nimport { get as httpsGet } from \"node:https\";\nimport path from \"node:path\";\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport {\n\tBaseError,\n\tConverter,\n\tGeneralError,\n\tI18n,\n\tIs,\n\ttype ILocaleDictionary\n} from \"@twin.org/core\";\nimport { Sha256 } from \"@twin.org/crypto\";\nimport { ModuleHelper } from \"@twin.org/modules\";\nimport type { ICacheMetadata } from \"./models/ICacheMetadata.js\";\nimport type { IModuleProtocol } from \"./models/IModuleProtocol.js\";\nimport type { IProtocolHandlerResult } from \"./models/IProtocolHandlerResult.js\";\nimport { ModuleProtocol } from \"./models/moduleProtocol.js\";\n\n/**\n * Initialise the locales for the application.\n * @param localesDirectory The directory containing the locales.\n */\nexport async function initialiseLocales(localesDirectory: string): Promise<void> {\n\tconst localesFile = path.resolve(path.join(localesDirectory, \"en.json\"));\n\tCLIDisplay.value(\"Locales File\", localesFile);\n\tif (await fileExists(localesFile)) {\n\t\tconst enLangContent = await readFile(localesFile, \"utf8\");\n\t\tI18n.addDictionary(\"en\", JSON.parse(enLangContent) as ILocaleDictionary);\n\t} else {\n\t\tCLIDisplay.error(`Locales file not found: ${localesFile}`);\n\t}\n}\n\n/**\n * Get the directory where the application is being executed.\n * @returns The execution directory.\n */\nexport function getExecutionDirectory(): string {\n\treturn process.cwd();\n}\n\n/**\n * Get the directory where the script is located.\n * @param args The command line arguments.\n * @returns The execution directory.\n */\nexport function getScriptDirectory(args?: string[]): string {\n\tif (Is.array<string>(args) && args.length >= 2 && args[1].includes(\"index.js\")) {\n\t\treturn path.resolve(path.join(path.dirname(args[1]), \"..\"));\n\t}\n\treturn process.cwd();\n}\n\n/**\n * Does the specified file exist.\n * @param filename The filename to check for existence.\n * @returns True if the file exists.\n */\nexport async function fileExists(filename: string): Promise<boolean> {\n\ttry {\n\t\tconst stats = await stat(filename);\n\t\treturn stats.isFile();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Does the specified directory exist.\n * @param directory The directory to check for existence.\n * @returns True if the directory exists.\n */\nexport async function directoryExists(directory: string): Promise<boolean> {\n\ttry {\n\t\tconst stats = await stat(directory);\n\t\treturn stats.isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\n/**\n * Get the sub folders for the folder.\n * @param directory The directory to get the sub folders.\n * @returns The list of sub folders.\n */\nexport async function getSubFolders(directory: string): Promise<string[]> {\n\ttry {\n\t\tconst dir = await readdir(directory);\n\t\tconst folders: string[] = [];\n\t\tfor (const dirEntry of dir) {\n\t\t\tconst fullPath = path.join(directory, dirEntry);\n\t\t\tconst stats = await stat(fullPath);\n\t\t\tif (stats.isDirectory()) {\n\t\t\t\tfolders.push(fullPath);\n\t\t\t}\n\t\t}\n\t\treturn folders;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/**\n * Get the files in the directory.\n * @param directory The directory to get the files from.\n * @returns The list of files in the directory.\n */\nexport async function getFiles(directory: string): Promise<string[]> {\n\ttry {\n\t\tconst dir = await readdir(directory);\n\t\tconst files: string[] = [];\n\t\tfor (const dirEntry of dir) {\n\t\t\tconst fullPath = path.join(directory, dirEntry);\n\t\t\tconst stats = await stat(fullPath);\n\t\t\tif (stats.isFile()) {\n\t\t\t\tfiles.push(fullPath);\n\t\t\t}\n\t\t}\n\t\treturn files;\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/**\n * Load the text file.\n * @param filename The filename of the text file to load.\n * @returns The contents of the text file if it could not be loaded.\n */\nexport async function loadTextFile(filename: string): Promise<string> {\n\treturn readFile(filename, \"utf8\");\n}\n\n/**\n * Load the JSON file.\n * @param filename The filename of the JSON file to load.\n * @returns The contents of the JSON file or null if it could not be loaded.\n */\nexport async function loadJsonFile<T>(filename: string): Promise<T> {\n\tconst content = await loadTextFile(filename);\n\treturn JSON.parse(content) as T;\n}\n\n/**\n * Parse the protocol from a module name.\n * @param moduleName The module name to parse.\n * @returns The parsed protocol information.\n */\nexport function parseModuleProtocol(moduleName: string): IModuleProtocol {\n\tconst trimmed = moduleName.trim();\n\n\tif (trimmed.startsWith(\"npm:\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Npm,\n\t\t\tidentifier: trimmed.slice(4),\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (trimmed.startsWith(\"https://\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Https,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (trimmed.startsWith(\"http://\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Http,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (trimmed.startsWith(\"file://\")) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Local,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\tif (ModuleHelper.isLocalModule(trimmed)) {\n\t\treturn {\n\t\t\tprotocol: ModuleProtocol.Local,\n\t\t\tidentifier: trimmed,\n\t\t\toriginal: trimmed\n\t\t};\n\t}\n\n\treturn {\n\t\tprotocol: ModuleProtocol.Default,\n\t\tidentifier: trimmed,\n\t\toriginal: trimmed\n\t};\n}\n\n/**\n * Hash a URL to create a safe filename.\n * @param url The URL to hash.\n * @returns A hashed filename safe for the filesystem.\n */\nexport function hashUrl(url: string): string {\n\tconst urlBytes = Converter.utf8ToBytes(url);\n\tconst hashBytes = Sha256.sum256(urlBytes);\n\tconst hash = Converter.bytesToHex(hashBytes);\n\tconst ext = path.extname(new URL(url).pathname);\n\treturn `${hash}${ext}`;\n}\n\n/**\n * Get the extensions cache directory.\n * @param executionDirectory The execution directory.\n * @param protocol The protocol type for subdirectory organization.\n * @param cacheDirectory The cache directory base path.\n * @returns The cache directory path.\n */\nexport function getExtensionsCacheDir(\n\texecutionDirectory: string,\n\tprotocol: ModuleProtocol,\n\tcacheDirectory?: string\n): string {\n\t// Resolve to absolute path to ensure consistent behavior\n\tconst absoluteDir = path.resolve(executionDirectory);\n\tconst baseDir = cacheDirectory ?? \".tmp\";\n\treturn path.join(absoluteDir, baseDir, \"extensions\", protocol);\n}\n\n/**\n * Handle the npm: protocol by installing the package if needed.\n * @param packageName The npm package name (without npm: prefix).\n * @param executionDirectory The execution directory.\n * @param cacheDirectory The cache directory base path.\n * @returns The resolved path to the installed module.\n */\nexport async function handleNpmProtocol(\n\tpackageName: string,\n\texecutionDirectory: string,\n\tcacheDirectory?: string\n): Promise<IProtocolHandlerResult> {\n\tconst cacheDir = getExtensionsCacheDir(executionDirectory, ModuleProtocol.Npm, cacheDirectory);\n\t// Strip the version suffix to get the bare package name. We use lastIndexOf\n\t// (not indexOf) so the leading \"@\" of a scoped package is preserved — for\n\t// \"@scope/pkg@1.0.0\" the last \"@\" is the version separator at the end, not\n\t// the scope prefix at position 0. The `> 0` (not `>= 0`) check then leaves\n\t// unversioned scoped names like \"@scope/pkg\" untouched, since their only \"@\"\n\t// sits at index 0.\n\t// e.g. \"picocolors@1.0.0\" → \"picocolors\"\n\t// e.g. \"@scope/pkg@1.0.0\" → \"@scope/pkg\"\n\t// e.g. \"@scope/pkg\" → \"@scope/pkg\" (unchanged)\n\tconst lastAtIndex = packageName.lastIndexOf(\"@\");\n\tconst packageNameOnly = lastAtIndex > 0 ? packageName.slice(0, lastAtIndex) : packageName;\n\tconst packageDir = path.join(cacheDir, \"node_modules\", packageNameOnly);\n\tconst packageJsonPath = path.join(packageDir, \"package.json\");\n\n\tconst exists = await fileExists(packageJsonPath);\n\tif (exists) {\n\t\tconst mainFile = await resolvePackageEntryPoint(packageDir, packageNameOnly);\n\t\tconst modulePath = path.join(packageDir, mainFile);\n\n\t\treturn {\n\t\t\tresolvedPath: modulePath,\n\t\t\tcached: true\n\t\t};\n\t}\n\n\tawait mkdir(cacheDir, { recursive: true });\n\n\tCLIDisplay.task(I18n.formatMessage(\"node.extensionNpmInstalling\"), packageName);\n\n\ttry {\n\t\t// Always pipe stdio to comply with env access restrictions in tests/lint\n\t\tconst stdio: \"pipe\" | \"inherit\" | \"ignore\" = \"pipe\";\n\t\texecSync(\n\t\t\t`npm install ${packageName} --prefix \"${cacheDir}\" --omit=dev --no-save --no-package-lock`,\n\t\t\t{\n\t\t\t\tcwd: cacheDir,\n\t\t\t\tstdio\n\t\t\t}\n\t\t);\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"node\",\n\t\t\t\"extensionNpmInstallFailed\",\n\t\t\t{\n\t\t\t\tpackage: packageName\n\t\t\t},\n\t\t\tBaseError.fromError(err)\n\t\t);\n\t}\n\n\tconst mainFile = await resolvePackageEntryPoint(packageDir, packageNameOnly);\n\tconst modulePath = path.join(packageDir, mainFile);\n\n\treturn {\n\t\tresolvedPath: modulePath,\n\t\tcached: false\n\t};\n}\n\n/**\n * Check if a cached file has expired based on TTL and force refresh settings.\n * @param metadataPath Path to the cache metadata file.\n * @param ttlHours Time to live in hours.\n * @param forceRefresh Whether to force refresh regardless of TTL.\n * @returns True if the cache is expired or should be refreshed.\n */\nexport async function isCacheExpired(\n\tmetadataPath: string,\n\tttlHours: number,\n\tforceRefresh: boolean\n): Promise<boolean> {\n\tif (forceRefresh) {\n\t\treturn true;\n\t}\n\n\ttry {\n\t\tconst metadata = await loadJsonFile<ICacheMetadata>(metadataPath);\n\t\tconst ttlMillis = ttlHours * 60 * 60 * 1000;\n\t\tconst expireTime = metadata.downloadedAt + ttlMillis;\n\t\treturn Date.now() > expireTime;\n\t} catch {\n\t\t// If metadata doesn't exist or is corrupted, consider expired\n\t\treturn true;\n\t}\n}\n\n/**\n * Handle the https: protocol by downloading the module if needed.\n * @param url The HTTPS URL to download from.\n * @param executionDirectory The execution directory.\n * @param maxSizeMb The maximum size in MB for the download.\n * @param cacheDirectory The cache directory base path.\n * @param ttlHours TTL in hours for cache expiration.\n * @param forceRefresh Whether to force refresh the cache.\n * @returns The resolved path to the downloaded module.\n */\nexport async function handleHttpsProtocol(\n\turl: string,\n\texecutionDirectory: string,\n\tmaxSizeMb: number,\n\tcacheDirectory?: string,\n\tttlHours?: number,\n\tforceRefresh?: boolean\n): Promise<IProtocolHandlerResult> {\n\tconst effectiveTtlHours = ttlHours ?? 24;\n\tconst effectiveForceRefresh = forceRefresh ?? false;\n\tconst cacheDir = getExtensionsCacheDir(executionDirectory, ModuleProtocol.Https, cacheDirectory);\n\tconst filename = hashUrl(url);\n\tconst cachedPath = path.join(cacheDir, filename);\n\tconst metadataPath = `${cachedPath}.meta`;\n\n\tconst exists = await fileExists(cachedPath);\n\tif (exists) {\n\t\tconst expired = await isCacheExpired(metadataPath, effectiveTtlHours, effectiveForceRefresh);\n\t\tif (!expired) {\n\t\t\treturn {\n\t\t\t\tresolvedPath: cachedPath,\n\t\t\t\tcached: true\n\t\t\t};\n\t\t}\n\n\t\tif (effectiveForceRefresh) {\n\t\t\tCLIDisplay.warning(I18n.formatMessage(\"node.extensionForceRefresh\", { url }));\n\t\t} else {\n\t\t\tCLIDisplay.task(I18n.formatMessage(\"node.extensionCacheExpired\", { url }));\n\t\t}\n\t}\n\n\tCLIDisplay.warning(I18n.formatMessage(\"node.extensionSecurityWarning\", { url }));\n\tCLIDisplay.task(I18n.formatMessage(\"node.extensionHttpsDownloading\"), url);\n\n\tawait mkdir(cacheDir, { recursive: true });\n\n\tconst maxSizeBytes = maxSizeMb * 1024 * 1024;\n\tlet downloadedSize = 0;\n\tconst chunks: Buffer[] = [];\n\n\ttry {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\thttpsGet(url, response => {\n\t\t\t\tif (response.statusCode !== 200) {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew GeneralError(\"node\", \"extensionDownloadFailed\", {\n\t\t\t\t\t\t\turl,\n\t\t\t\t\t\t\tstatus: response.statusCode ?? 0\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tresponse.on(\"data\", (chunk: Buffer) => {\n\t\t\t\t\tdownloadedSize += chunk.length;\n\n\t\t\t\t\tif (downloadedSize > maxSizeBytes) {\n\t\t\t\t\t\tresponse.destroy();\n\t\t\t\t\t\treject(\n\t\t\t\t\t\t\tnew GeneralError(\"node\", \"extensionSizeLimitExceeded\", {\n\t\t\t\t\t\t\t\tsize: downloadedSize,\n\t\t\t\t\t\t\t\tlimit: maxSizeBytes\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tchunks.push(chunk);\n\t\t\t\t});\n\n\t\t\t\tresponse.on(\"end\", () => {\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\n\t\t\t\tresponse.on(\"error\", err => {\n\t\t\t\t\treject(BaseError.fromError(err));\n\t\t\t\t});\n\t\t\t}).on(\"error\", err => {\n\t\t\t\treject(BaseError.fromError(err));\n\t\t\t});\n\t\t});\n\t} catch (err) {\n\t\tthrow new GeneralError(\n\t\t\t\"node\",\n\t\t\t\"extensionDownloadFailed\",\n\t\t\t{\n\t\t\t\turl\n\t\t\t},\n\t\t\tBaseError.fromError(err)\n\t\t);\n\t}\n\n\tconst tempPath = `${cachedPath}.tmp`;\n\tawait writeFile(tempPath, Buffer.concat(chunks));\n\n\t// Atomic move from temp to final location\n\tawait rename(tempPath, cachedPath);\n\n\t// Save metadata for TTL tracking\n\tconst metadata: ICacheMetadata = {\n\t\tdownloadedAt: Date.now(),\n\t\turl,\n\t\tsize: Buffer.concat(chunks).length\n\t};\n\tawait writeFile(metadataPath, JSON.stringify(metadata, null, 2));\n\n\treturn {\n\t\tresolvedPath: cachedPath,\n\t\tcached: false\n\t};\n}\n\n/**\n * Resolve the main entry point from a package directory using Node.js resolution with fallback.\n * Uses require.resolve() when possible for standard Node.js behavior, with manual fallback.\n * @param packagePath The absolute path to the package directory.\n * @param packageName The package name for require.resolve().\n * @param fallback The fallback file name if no entry point is found.\n * @returns The resolved entry point file name (relative to package directory).\n */\nexport async function resolvePackageEntryPoint(\n\tpackagePath: string,\n\tpackageName: string,\n\tfallback = \"index.js\"\n): Promise<string> {\n\ttry {\n\t\t// Try require.resolve() first - handles exports, main, module automatically\n\t\tconst resolvedPath = require.resolve(packageName, { paths: [path.dirname(packagePath)] });\n\t\t// Convert absolute path back to relative filename within package\n\t\tconst relativePath = path.relative(packagePath, resolvedPath);\n\t\treturn relativePath ?? fallback;\n\t} catch {\n\t\t// Fallback to manual package.json parsing if require.resolve fails\n\t\ttry {\n\t\t\tconst packageJsonPath = path.join(packagePath, \"package.json\");\n\t\t\tconst packageJsonContent = await loadJsonFile<{\n\t\t\t\tmodule?: string;\n\t\t\t\tmain?: string;\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\t\texports?: any;\n\t\t\t}>(packageJsonPath);\n\n\t\t\t// Future: Could expand exports field support here\n\t\t\treturn packageJsonContent.module ?? packageJsonContent.main ?? fallback;\n\t\t} catch {\n\t\t\treturn fallback;\n\t\t}\n\t}\n}\n\n/**\n * Convert a file path to an import-compatible URL for cross-platform module loading.\n * On Windows, adds the 'file://' protocol prefix required for dynamic imports.\n * On other platforms, returns the path unchanged.\n * @param filePath The absolute file path to convert.\n * @returns A URL string compatible with dynamic import().\n */\nexport function createModuleImportUrl(filePath: string): string {\n\treturn process.platform === \"win32\" ? `file://${filePath}` : filePath;\n}\n"]}
@@ -48,6 +48,9 @@ export declare function isFederatedCatalogueRequired(envVars: IEngineEnvironment
48
48
  /**
49
49
  * Checks if the rights management subsystem is required.
50
50
  * Returns true when any component that depends on the rights management subsystem is enabled.
51
+ * Note: rights management has no standalone enable flag — it is gated entirely on
52
+ * `dataspaceEnabled`. Setting `TWIN_RIGHTS_MANAGEMENT_*` env var in isolation does not
53
+ * enable the subsystem; `TWIN_DATASPACE_ENABLED` must also be true.
51
54
  * @param envVars The environment variables.
52
55
  * @returns True if rights management is enabled.
53
56
  */
@@ -0,0 +1,28 @@
1
+ import type { IEngineCore } from "@twin.org/engine-models";
2
+ import type { ICliCommandDefinition } from "../models/ICliCommandDefinition.js";
3
+ import type { INodeEnvironmentVariables } from "../models/INodeEnvironmentVariables.js";
4
+ /**
5
+ * Get the command definition parameters.
6
+ * @param commandDefinitions The registered command definitions.
7
+ */
8
+ export declare function getCommandDefinitionTenantToken(commandDefinitions: {
9
+ [id: string]: ICliCommandDefinition;
10
+ }): void;
11
+ /**
12
+ * Command for generating the x-enc-tenant-id token value for a tenant.
13
+ * @param engineCore The engine core.
14
+ * @param envVars The environment variables for the node.
15
+ * @param params The parameters for the command.
16
+ * @param params.tenantId The tenant ID to generate the token for.
17
+ * @param params.apiKey The API key to look up the tenant ID from.
18
+ * @param params.outputJson The output .json file to store the command output.
19
+ * @returns The tenant ID and generated encrypted token.
20
+ */
21
+ export declare function tenantToken(engineCore: IEngineCore, envVars: INodeEnvironmentVariables, params: {
22
+ tenantId?: string;
23
+ apiKey?: string;
24
+ outputJson?: string;
25
+ }): Promise<{
26
+ tenantId: string;
27
+ token: string;
28
+ }>;
package/docs/changelog.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.0.3-next.46](https://github.com/iotaledger/twin-node/compare/node-core-v0.0.3-next.45...node-core-v0.0.3-next.46) (2026-06-03)
4
+
5
+
6
+ ### Features
7
+
8
+ * cli tenant-token command ([#177](https://github.com/iotaledger/twin-node/issues/177)) ([b3f68a4](https://github.com/iotaledger/twin-node/commit/b3f68a4972d065e865372230c078b4657dfabc1a))
9
+ * update dependencies ([#178](https://github.com/iotaledger/twin-node/issues/178)) ([0d346ec](https://github.com/iotaledger/twin-node/commit/0d346ec57f43f418b73fe71fcd2b187d769a53e9))
10
+
11
+ ## [0.0.3-next.45](https://github.com/iotaledger/twin-node/compare/node-core-v0.0.3-next.44...node-core-v0.0.3-next.45) (2026-06-02)
12
+
13
+
14
+ ### Features
15
+
16
+ * bump [@twin](https://github.com/twin).org/* to latest next ([#172](https://github.com/iotaledger/twin-node/issues/172)) ([45862d5](https://github.com/iotaledger/twin-node/commit/45862d555e4958f1c12da357817b7b87642d7aba))
17
+
3
18
  ## [0.0.3-next.44](https://github.com/iotaledger/twin-node/compare/node-core-v0.0.3-next.43...node-core-v0.0.3-next.44) (2026-06-02)
4
19
 
5
20
 
@@ -4,6 +4,9 @@
4
4
 
5
5
  Checks if the rights management subsystem is required.
6
6
  Returns true when any component that depends on the rights management subsystem is enabled.
7
+ Note: rights management has no standalone enable flag — it is gated entirely on
8
+ `dataspaceEnabled`. Setting `TWIN_RIGHTS_MANAGEMENT_*` env var in isolation does not
9
+ enable the subsystem; `TWIN_DATASPACE_ENABLED` must also be true.
7
10
 
8
11
  ## Parameters
9
12
 
package/locales/en.json CHANGED
@@ -34,6 +34,11 @@
34
34
  "tenantCreate": {
35
35
  "tenantAdminComponentNotRegistered": "Multi-tenant support must be enabled to use this command."
36
36
  },
37
+ "tenantToken": {
38
+ "tenantIdOrApiKeyRequired": "Either a tenant ID or an API key must be provided.",
39
+ "urlTransformerComponentNotRegistered": "The URL transformer component is not registered, ensure the node is configured correctly.",
40
+ "tenantAdminComponentNotRegistered": "Multi-tenant support must be enabled to use this command."
41
+ },
37
42
  "tenantImport": {
38
43
  "tenantAdminComponentNotRegistered": "Multi-tenant support must be enabled to use this command."
39
44
  },
@@ -430,6 +435,27 @@
430
435
  "updated": "Updated tenant"
431
436
  }
432
437
  },
438
+ "tenant-token": {
439
+ "description": "Generate the x-enc-tenant-id token value for a tenant",
440
+ "example": "tenant-token --tenant-id=\"0011..aabb\"",
441
+ "params": {
442
+ "tenant-id": {
443
+ "description": "The tenant ID to generate the token for."
444
+ },
445
+ "api-key": {
446
+ "description": "The API key to look up the tenant ID from."
447
+ },
448
+ "output-json": {
449
+ "description": "Path to a .json file to store the command output."
450
+ }
451
+ },
452
+ "labels": {
453
+ "lookingUp": "Looking up tenant",
454
+ "generating": "Generating tenant token",
455
+ "tenantId": "Tenant ID",
456
+ "token": "Token"
457
+ }
458
+ },
433
459
  "node-set-tenant": {
434
460
  "description": "Set the node tenant",
435
461
  "example": "node-set-tenant --tenant-id=\"0011..aabb\"",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twin.org/node-core",
3
- "version": "0.0.3-next.44",
3
+ "version": "0.0.3-next.46",
4
4
  "description": "TWIN Node Core for serving APIs using the specified configuration",
5
5
  "repository": {
6
6
  "type": "git",