@twin.org/node-core 0.9.2-next.15 → 0.9.2-next.17

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.
Files changed (26) hide show
  1. package/dist/es/builders/engineEnvBuilder.js +129 -83
  2. package/dist/es/builders/engineEnvBuilder.js.map +1 -1
  3. package/dist/es/builders/engineServerEnvBuilder.js +6 -5
  4. package/dist/es/builders/engineServerEnvBuilder.js.map +1 -1
  5. package/dist/es/builders/helper/envHelpers.js +57 -72
  6. package/dist/es/builders/helper/envHelpers.js.map +1 -1
  7. package/dist/es/models/IEngineEnvironmentVariables.js.map +1 -1
  8. package/dist/es/models/IEngineServerEnvironmentVariables.js.map +1 -1
  9. package/dist/es/models/engineEnvironmentVariableKeys.js +2 -0
  10. package/dist/es/models/engineEnvironmentVariableKeys.js.map +1 -1
  11. package/dist/es/models/engineServerEnvironmentVariableKeys.js +1 -0
  12. package/dist/es/models/engineServerEnvironmentVariableKeys.js.map +1 -1
  13. package/dist/es/node.js +1 -1
  14. package/dist/es/node.js.map +1 -1
  15. package/dist/types/builders/engineEnvBuilder.d.ts +4 -4
  16. package/dist/types/builders/helper/envHelpers.d.ts +79 -20
  17. package/dist/types/models/IEngineEnvironmentVariables.d.ts +12 -2
  18. package/dist/types/models/IEngineServerEnvironmentVariables.d.ts +4 -0
  19. package/docs/changelog.md +15 -0
  20. package/docs/reference/functions/{isTelemetryRequired.md → isTelemetryEnabled.md} +3 -3
  21. package/docs/reference/functions/{isTracingRequired.md → isTracingEnabled.md} +3 -3
  22. package/docs/reference/index.md +2 -2
  23. package/docs/reference/interfaces/IEngineEnvironmentVariables.md +30 -2
  24. package/docs/reference/interfaces/IEngineServerEnvironmentVariables.md +8 -0
  25. package/locales/en.json +1 -0
  26. package/package.json +1 -1
@@ -2,13 +2,14 @@
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
3
  import path from "node:path";
4
4
  import { Is, Mutex } from "@twin.org/core";
5
+ import { EngineCloneMode } from "@twin.org/engine-models";
5
6
  import { AttestationComponentType, AttestationConnectorType, AuditableItemGraphComponentType, AuditableItemStreamComponentType, AutomationComponentType, BackgroundTaskComponentType, BlobStorageComponentType, BlobStorageConnectorType, ContextIdHandlerComponentType, DataProcessingComponentType, DataspaceControlPlaneComponentType, DataspaceDataPlaneComponentType, DltConfigType, DocumentManagementComponentType, EngineTypeHelper, EntityStorageConnectorType, EventBusComponentType, EventBusConnectorType, FaucetConnectorType, FederatedCatalogueComponentType, HealthComponentType, IdentityComponentType, IdentityConnectorType, IdentityProfileComponentType, IdentityProfileConnectorType, IdentityResolverComponentType, IdentityResolverConnectorType, ImmutableProofComponentType, LoggingComponentType, LoggingConnectorType, MessagingAdminComponentType, MessagingComponentType, MessagingEmailConnectorType, MessagingPushNotificationConnectorType, MessagingSmsConnectorType, MetricsCollectorComponentType, MetricsProducerComponentType, NftComponentType, NftConnectorType, NotarizationComponentType, NotarizationConnectorType, PlatformComponentType, RightsManagementPapComponentType, RightsManagementPdpComponentType, RightsManagementPepComponentType, RightsManagementPipComponentType, RightsManagementPmpComponentType, RightsManagementPnapComponentType, RightsManagementPnpComponentType, RightsManagementPxpComponentType, SchemaVersionMigrationComponentType, TaskSchedulerComponentType, TelemetryComponentType, TelemetryConnectorType, TenantAdminComponentType, TracingComponentType, TracingConnectorType, TrustComponentType, TrustVerifierComponentType, VaultConnectorType, WalletConnectorType } from "@twin.org/engine-types";
6
7
  import { OpenTelemetryExporterTypes } from "@twin.org/logging-connector-opentelemetry";
7
8
  import { OpenTelemetryReaderTypes } from "@twin.org/telemetry-connector-opentelemetry";
8
9
  import { OpenTelemetryProcessorTypes } from "@twin.org/tracing-connector-opentelemetry";
9
10
  import { CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT } from "../defaults.js";
10
11
  import { isAuthEntityStorageRequired } from "./engineServerEnvBuilder.js";
11
- import { commaSeparatedListToArray, envBoolean, envCount, envDateTime, envInteger, envMinToMs, envMinutes, envMs, envSecToMs, envSeconds } from "./helper/envHelpers.js";
12
+ import { commaSeparatedListToArray, envArray, envBoolean, envCount, envDateTime, envInteger, envMinToMs, envMinutes, envMs, envSecToMs, envSeconds } from "./helper/envHelpers.js";
12
13
  /**
13
14
  * Build the engine core configuration from environment variables.
14
15
  * @param envVars The environment variables.
@@ -525,45 +526,71 @@ async function configureEventBus(coreConfig, envVars) {
525
526
  */
526
527
  async function configureTelemetry(coreConfig, envVars) {
527
528
  coreConfig.types.telemetryConnector ??= [];
528
- if (envVars.telemetryConnector === TelemetryConnectorType.EntityStorage) {
529
- coreConfig.types.telemetryConnector.push({
530
- type: TelemetryConnectorType.EntityStorage,
531
- options: {
532
- config: {
533
- batchSize: envCount(envVars, "telemetryBatchSize"),
534
- batchIntervalMs: envSecToMs(envVars, "telemetryBatchFlushInterval"),
535
- maxCacheSize: envCount(envVars, "telemetryMaxCacheSize"),
536
- mutexTimeoutMs: envMs(envVars, "telemetryMutexTimeout")
529
+ const telemetryConnectorTypes = commaSeparatedListToArray(envVars.telemetryConnector);
530
+ let additionalConnectorCount = 0;
531
+ for (const telemetryConnector of telemetryConnectorTypes) {
532
+ if (telemetryConnector === TelemetryConnectorType.Silent) {
533
+ coreConfig.types.telemetryConnector.push({
534
+ type: TelemetryConnectorType.Silent
535
+ });
536
+ additionalConnectorCount++;
537
+ }
538
+ else if (telemetryConnector === TelemetryConnectorType.EntityStorage) {
539
+ coreConfig.types.telemetryConnector.push({
540
+ type: TelemetryConnectorType.EntityStorage,
541
+ options: {
542
+ config: {
543
+ batchSize: envCount(envVars, "telemetryBatchSize"),
544
+ batchIntervalMs: envSecToMs(envVars, "telemetryBatchFlushInterval"),
545
+ maxCacheSize: envCount(envVars, "telemetryMaxCacheSize"),
546
+ mutexTimeoutMs: envMs(envVars, "telemetryMutexTimeout"),
547
+ metricDefinitionCacheCapacity: envCount(envVars, "telemetryMetricDefinitionCacheCapacity"),
548
+ metricDefinitionCacheTtiMs: envMs(envVars, "telemetryMetricDefinitionCacheTtiMs")
549
+ }
537
550
  }
551
+ });
552
+ additionalConnectorCount++;
553
+ }
554
+ else if (telemetryConnector === TelemetryConnectorType.OpenTelemetry) {
555
+ let readers;
556
+ if (envVars.openTelemetryReader === OpenTelemetryReaderTypes.Prometheus) {
557
+ readers = {
558
+ prometheus: {
559
+ type: OpenTelemetryReaderTypes.Prometheus,
560
+ port: envCount(envVars, "openTelemetryPrometheusPort")
561
+ }
562
+ };
538
563
  }
539
- });
540
- }
541
- else if (envVars.telemetryConnector === TelemetryConnectorType.OpenTelemetry) {
542
- let readers;
543
- if (envVars.openTelemetryReader === OpenTelemetryReaderTypes.Prometheus) {
544
- readers = {
545
- prometheus: {
546
- type: OpenTelemetryReaderTypes.Prometheus,
547
- port: envCount(envVars, "openTelemetryPrometheusPort")
564
+ coreConfig.types.telemetryConnector.push({
565
+ type: TelemetryConnectorType.OpenTelemetry,
566
+ options: {
567
+ config: {
568
+ meterName: envVars.openTelemetryMeterName,
569
+ meterVersion: envVars.openTelemetryMeterVersion,
570
+ readers
571
+ }
548
572
  }
549
- };
573
+ });
574
+ additionalConnectorCount++;
550
575
  }
576
+ }
577
+ // If more than one telemetry connector, then we need to add a multi connector
578
+ // and set it as the default one
579
+ if (additionalConnectorCount > 1) {
551
580
  coreConfig.types.telemetryConnector.push({
552
- type: TelemetryConnectorType.OpenTelemetry,
581
+ type: TelemetryConnectorType.Multi,
553
582
  options: {
554
- config: {
555
- batchSize: envCount(envVars, "telemetryBatchSize"),
556
- batchIntervalMs: envSecToMs(envVars, "telemetryBatchFlushInterval"),
557
- maxCacheSize: envCount(envVars, "telemetryMaxCacheSize"),
558
- mutexTimeoutMs: envMs(envVars, "telemetryMutexTimeout"),
559
- meterName: envVars.openTelemetryMeterName,
560
- meterVersion: envVars.openTelemetryMeterVersion,
561
- readers
562
- }
563
- }
583
+ telemetryConnectorTypes
584
+ },
585
+ isDefault: true
564
586
  });
565
587
  }
566
- if (coreConfig.types.telemetryConnector.length > 0) {
588
+ else if (additionalConnectorCount > 0) {
589
+ // If only one connector, then we set it as the default one
590
+ coreConfig.types.telemetryConnector[coreConfig.types.telemetryConnector.length - 1].isDefault =
591
+ true;
592
+ }
593
+ if (additionalConnectorCount > 0) {
567
594
  coreConfig.types.telemetryComponent ??= [];
568
595
  coreConfig.types.telemetryComponent.push({ type: TelemetryComponentType.Service });
569
596
  }
@@ -575,7 +602,7 @@ async function configureTelemetry(coreConfig, envVars) {
575
602
  * @returns A promise that resolves when the metrics collector configuration has been applied.
576
603
  */
577
604
  async function configureMetricsCollector(coreConfig, envVars) {
578
- if (isTelemetryRequired(envVars)) {
605
+ if (isTelemetryEnabled(envVars)) {
579
606
  coreConfig.types.metricsCollectorComponent ??= [];
580
607
  coreConfig.types.metricsCollectorComponent.push({
581
608
  type: MetricsCollectorComponentType.Service,
@@ -584,7 +611,7 @@ async function configureMetricsCollector(coreConfig, envVars) {
584
611
  intervalMs: envSecToMs(envVars, "telemetryMetricsCollectorInterval")
585
612
  }
586
613
  },
587
- isCloneable: false
614
+ cloneMode: EngineCloneMode.Never
588
615
  });
589
616
  coreConfig.types.metricsProducerComponent ??= [];
590
617
  const metricsProducers = commaSeparatedListToArray(envVars.telemetryMetricsProducers ??
@@ -593,7 +620,7 @@ async function configureMetricsCollector(coreConfig, envVars) {
593
620
  coreConfig.types.metricsProducerComponent.push({
594
621
  type: producerType,
595
622
  options: { maxHistory: envCount(envVars, "telemetryMetricsProducerMaxHistory") },
596
- isCloneable: false
623
+ cloneMode: EngineCloneMode.Never
597
624
  });
598
625
  }
599
626
  }
@@ -606,38 +633,66 @@ async function configureMetricsCollector(coreConfig, envVars) {
606
633
  */
607
634
  async function configureTracing(coreConfig, envVars) {
608
635
  coreConfig.types.tracingConnector ??= [];
609
- if (envVars.tracingConnector === TracingConnectorType.EntityStorage) {
610
- coreConfig.types.tracingConnector.push({
611
- type: TracingConnectorType.EntityStorage,
612
- options: {
613
- config: {
614
- mutexTimeoutMs: envMs(envVars, "tracingMutexTimeout")
636
+ const tracingConnectorTypes = commaSeparatedListToArray(envVars.tracingConnector);
637
+ let additionalConnectorCount = 0;
638
+ for (const tracingConnector of tracingConnectorTypes) {
639
+ if (tracingConnector === TracingConnectorType.Silent) {
640
+ coreConfig.types.tracingConnector.push({
641
+ type: TracingConnectorType.Silent
642
+ });
643
+ additionalConnectorCount++;
644
+ }
645
+ else if (tracingConnector === TracingConnectorType.EntityStorage) {
646
+ coreConfig.types.tracingConnector.push({
647
+ type: TracingConnectorType.EntityStorage,
648
+ options: {
649
+ config: {
650
+ mutexTimeoutMs: envMs(envVars, "tracingMutexTimeout")
651
+ }
615
652
  }
653
+ });
654
+ additionalConnectorCount++;
655
+ }
656
+ else if (tracingConnector === TracingConnectorType.OpenTelemetry) {
657
+ const otelTracingConfig = {
658
+ tracerName: envVars.openTelemetryTracingTracerName,
659
+ tracerVersion: envVars.openTelemetryTracingTracerVersion
660
+ };
661
+ if (Is.stringValue(envVars.openTelemetryTracingEndpoint)) {
662
+ otelTracingConfig.exporters = {
663
+ otlp: {
664
+ endpoint: envVars.openTelemetryTracingEndpoint,
665
+ processor: envVars.openTelemetryTracingProcessor ??
666
+ OpenTelemetryProcessorTypes.Batch
667
+ }
668
+ };
616
669
  }
617
- });
618
- }
619
- else if (envVars.tracingConnector === TracingConnectorType.OpenTelemetry) {
620
- const otelTracingConfig = {
621
- tracerName: envVars.openTelemetryTracingTracerName,
622
- tracerVersion: envVars.openTelemetryTracingTracerVersion
623
- };
624
- if (Is.stringValue(envVars.openTelemetryTracingEndpoint)) {
625
- otelTracingConfig.exporters = {
626
- otlp: {
627
- endpoint: envVars.openTelemetryTracingEndpoint,
628
- processor: envVars.openTelemetryTracingProcessor ??
629
- OpenTelemetryProcessorTypes.Batch
670
+ coreConfig.types.tracingConnector.push({
671
+ type: TracingConnectorType.OpenTelemetry,
672
+ options: {
673
+ config: otelTracingConfig
630
674
  }
631
- };
675
+ });
676
+ additionalConnectorCount++;
632
677
  }
678
+ }
679
+ // If more than one tracing connector, then we need to add a multi connector
680
+ // and set it as the default one
681
+ if (additionalConnectorCount > 1) {
633
682
  coreConfig.types.tracingConnector.push({
634
- type: TracingConnectorType.OpenTelemetry,
683
+ type: TracingConnectorType.Multi,
635
684
  options: {
636
- config: otelTracingConfig
637
- }
685
+ tracingConnectorTypes
686
+ },
687
+ isDefault: true
638
688
  });
639
689
  }
640
- if (coreConfig.types.tracingConnector.length > 0) {
690
+ else if (additionalConnectorCount > 0) {
691
+ // If only one connector, then we set it as the default one
692
+ coreConfig.types.tracingConnector[coreConfig.types.tracingConnector.length - 1].isDefault =
693
+ true;
694
+ }
695
+ if (additionalConnectorCount > 0) {
641
696
  coreConfig.types.tracingComponent ??= [];
642
697
  coreConfig.types.tracingComponent.push({ type: TracingComponentType.Service });
643
698
  }
@@ -684,7 +739,7 @@ async function configureHealth(coreConfig, envVars) {
684
739
  initialInterval: envSecToMs(envVars, "healthStartupInterval")
685
740
  }
686
741
  },
687
- isCloneable: false
742
+ cloneMode: EngineCloneMode.Never
688
743
  });
689
744
  }
690
745
  }
@@ -700,7 +755,7 @@ async function configureSchemaMigration(coreConfig, envVars) {
700
755
  coreConfig.types.schemaVersionMigrationComponent.push({
701
756
  type: SchemaVersionMigrationComponentType.Service,
702
757
  options: { config: { enabled: isSchemaMigrationEnabled } },
703
- isCloneable: false
758
+ cloneMode: EngineCloneMode.Never
704
759
  });
705
760
  }
706
761
  /**
@@ -718,7 +773,8 @@ async function configurePlatform(coreConfig, envVars) {
718
773
  config: {
719
774
  isMultiTenant: isTenantEnabled
720
775
  }
721
- }
776
+ },
777
+ cloneMode: EngineCloneMode.Always
722
778
  });
723
779
  }
724
780
  /**
@@ -746,12 +802,14 @@ async function configureContextIdHandlers(coreConfig, envVars) {
746
802
  coreConfig.types.contextIdHandlerComponent ??= [];
747
803
  coreConfig.types.contextIdHandlerComponent.push({
748
804
  type: ContextIdHandlerComponentType.Did,
749
- features: [CONTEXT_ID_HANDLER_FEATURE_DID]
805
+ features: [CONTEXT_ID_HANDLER_FEATURE_DID],
806
+ cloneMode: EngineCloneMode.Always
750
807
  });
751
808
  if (envBoolean(envVars, "tenantEnabled", false)) {
752
809
  coreConfig.types.contextIdHandlerComponent.push({
753
810
  type: ContextIdHandlerComponentType.Tenant,
754
- features: [CONTEXT_ID_HANDLER_FEATURE_TENANT]
811
+ features: [CONTEXT_ID_HANDLER_FEATURE_TENANT],
812
+ cloneMode: EngineCloneMode.Always
755
813
  });
756
814
  }
757
815
  }
@@ -811,16 +869,6 @@ async function configureMessaging(coreConfig, envVars) {
811
869
  });
812
870
  }
813
871
  else if (envVars.messagingPushNotificationConnector === MessagingPushNotificationConnectorType.Aws) {
814
- let messagingApps;
815
- if (Is.stringValue(envVars.awsMessagingPushNotificationApplications)) {
816
- try {
817
- messagingApps = JSON.parse(envVars.awsMessagingPushNotificationApplications);
818
- }
819
- catch { }
820
- }
821
- else if (Is.array(envVars.awsMessagingPushNotificationApplications)) {
822
- messagingApps = envVars.awsMessagingPushNotificationApplications;
823
- }
824
872
  coreConfig.types.messagingPushNotificationConnector.push({
825
873
  type: MessagingPushNotificationConnectorType.Aws,
826
874
  options: {
@@ -830,7 +878,7 @@ async function configureMessaging(coreConfig, envVars) {
830
878
  accessKeyId: envVars.awsSesAccessKeyId,
831
879
  secretAccessKey: envVars.awsSesSecretAccessKey,
832
880
  endpoint: envVars.awsSesEndpoint,
833
- applicationsSettings: messagingApps ?? []
881
+ applicationsSettings: envArray(envVars, "awsMessagingPushNotificationApplications", [])
834
882
  }
835
883
  }
836
884
  });
@@ -1583,23 +1631,21 @@ export function isAutomationRequired(envVars) {
1583
1631
  return isRightsManagementRequired(envVars);
1584
1632
  }
1585
1633
  /**
1586
- * Checks if the telemetry subsystem is required.
1634
+ * Checks if the telemetry subsystem is enabled.
1587
1635
  * Returns true when any component that depends on the telemetry subsystem is enabled.
1588
1636
  * @param envVars The environment variables.
1589
1637
  * @returns True if telemetry is enabled.
1590
1638
  */
1591
- export function isTelemetryRequired(envVars) {
1592
- return (envVars.telemetryConnector === TelemetryConnectorType.EntityStorage ||
1593
- envVars.telemetryConnector === TelemetryConnectorType.OpenTelemetry);
1639
+ export function isTelemetryEnabled(envVars) {
1640
+ return commaSeparatedListToArray(envVars.telemetryConnector).some(t => t === TelemetryConnectorType.EntityStorage || t === TelemetryConnectorType.OpenTelemetry);
1594
1641
  }
1595
1642
  /**
1596
- * Checks if the tracing subsystem is required.
1643
+ * Checks if the tracing subsystem is enabled.
1597
1644
  * Returns true when any component that depends on the tracing subsystem is enabled.
1598
1645
  * @param envVars The environment variables.
1599
1646
  * @returns True if tracing is enabled.
1600
1647
  */
1601
- export function isTracingRequired(envVars) {
1602
- return (envVars.tracingConnector === TracingConnectorType.EntityStorage ||
1603
- envVars.tracingConnector === TracingConnectorType.OpenTelemetry);
1648
+ export function isTracingEnabled(envVars) {
1649
+ return commaSeparatedListToArray(envVars.tracingConnector).some(t => t === TracingConnectorType.EntityStorage || t === TracingConnectorType.OpenTelemetry);
1604
1650
  }
1605
1651
  //# sourceMappingURL=engineEnvBuilder.js.map