@twin.org/node-core 0.9.2-next.8 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/es/builders/engineEnvBuilder.js +182 -87
- package/dist/es/builders/engineEnvBuilder.js.map +1 -1
- package/dist/es/builders/engineServerEnvBuilder.js +50 -14
- package/dist/es/builders/engineServerEnvBuilder.js.map +1 -1
- package/dist/es/builders/extensionsBuilder.js +5 -4
- package/dist/es/builders/extensionsBuilder.js.map +1 -1
- package/dist/es/builders/helper/envHelpers.js +60 -82
- package/dist/es/builders/helper/envHelpers.js.map +1 -1
- package/dist/es/cli.js +2 -1
- package/dist/es/cli.js.map +1 -1
- package/dist/es/commands/bootstrapDev.js +5 -5
- package/dist/es/commands/bootstrapDev.js.map +1 -1
- package/dist/es/commands/userCreate.js +8 -3
- package/dist/es/commands/userCreate.js.map +1 -1
- package/dist/es/commands/userUpdate.js +5 -2
- package/dist/es/commands/userUpdate.js.map +1 -1
- package/dist/es/models/IEngineEnvironmentVariables.js.map +1 -1
- package/dist/es/models/IEngineServerEnvironmentVariables.js.map +1 -1
- package/dist/es/models/engineEnvironmentVariableKeys.js +27 -0
- package/dist/es/models/engineEnvironmentVariableKeys.js.map +1 -1
- package/dist/es/models/engineServerEnvironmentVariableKeys.js +4 -1
- package/dist/es/models/engineServerEnvironmentVariableKeys.js.map +1 -1
- package/dist/es/node.js +3 -7
- package/dist/es/node.js.map +1 -1
- package/dist/es/start.js +3 -2
- package/dist/es/start.js.map +1 -1
- package/dist/types/builders/engineEnvBuilder.d.ts +9 -2
- package/dist/types/builders/helper/envHelpers.d.ts +83 -22
- package/dist/types/models/IEngineEnvironmentVariables.d.ts +113 -2
- package/dist/types/models/IEngineServerEnvironmentVariables.d.ts +12 -0
- package/docs/changelog.md +96 -0
- package/docs/reference/functions/{isTelemetryRequired.md → isTelemetryEnabled.md} +3 -3
- package/docs/reference/functions/isTracingEnabled.md +20 -0
- package/docs/reference/index.md +2 -1
- package/docs/reference/interfaces/IEngineEnvironmentVariables.md +236 -2
- package/docs/reference/interfaces/IEngineServerEnvironmentVariables.md +24 -0
- package/locales/en.json +1 -0
- package/package.json +34 -33
|
@@ -2,7 +2,10 @@ import { ContextIdKeys } from "@twin.org/context";
|
|
|
2
2
|
import { Coerce, Is, StringHelper } from "@twin.org/core";
|
|
3
3
|
import { addDefaultRestPaths, addDefaultSocketPaths } from "@twin.org/engine-server";
|
|
4
4
|
import { AuthenticationAdminComponentType, AuthenticationAuditComponentType, AuthenticationComponentType, AuthenticationRateComponentType, InformationComponentType, RestRouteProcessorType, SocketRouteProcessorType } from "@twin.org/engine-server-types";
|
|
5
|
+
import { TraceparentHelper } from "@twin.org/tracing-models";
|
|
5
6
|
import { CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT } from "../defaults.js";
|
|
7
|
+
import { isTelemetryEnabled, isTracingEnabled } from "./engineEnvBuilder.js";
|
|
8
|
+
import { commaSeparatedListToArray, envKeyIntegerPairs } from "./helper/envHelpers.js";
|
|
6
9
|
/**
|
|
7
10
|
* Handles the configuration of the server.
|
|
8
11
|
* @param envVars The environment variables for the engine server.
|
|
@@ -17,16 +20,11 @@ export async function buildEngineServerConfiguration(envVars, availableContextId
|
|
|
17
20
|
const webServerOptions = {
|
|
18
21
|
port: Coerce.number(envVars.port),
|
|
19
22
|
host: Coerce.string(envVars.host),
|
|
20
|
-
methods:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
: undefined,
|
|
26
|
-
exposedHeaders: Is.stringValue(envVars.httpExposedHeaders)
|
|
27
|
-
? envVars.httpExposedHeaders.split(",")
|
|
28
|
-
: undefined,
|
|
29
|
-
corsOrigins: Is.stringValue(envVars.corsOrigins) ? envVars.corsOrigins.split(",") : undefined,
|
|
23
|
+
methods: commaSeparatedListToArray(envVars.httpMethods, undefined),
|
|
24
|
+
allowedHeaders: commaSeparatedListToArray(envVars.httpAllowedHeaders, undefined),
|
|
25
|
+
exposedHeaders: commaSeparatedListToArray(envVars.httpExposedHeaders, undefined),
|
|
26
|
+
corsOrigins: commaSeparatedListToArray(envVars.corsOrigins, undefined),
|
|
27
|
+
bodyLimits: envKeyIntegerPairs(envVars, "httpBodyLimits"),
|
|
30
28
|
publicOrigin: Coerce.string(envVars.publicOrigin)
|
|
31
29
|
};
|
|
32
30
|
const tenantEnabled = Coerce.boolean(envVars.tenantEnabled) ?? false;
|
|
@@ -37,6 +35,12 @@ export async function buildEngineServerConfiguration(envVars, availableContextId
|
|
|
37
35
|
webServerOptions.allowedHeaders.push(apiKeyHeader);
|
|
38
36
|
}
|
|
39
37
|
}
|
|
38
|
+
if (isTracingEnabled(envVars)) {
|
|
39
|
+
webServerOptions.allowedHeaders ??= [];
|
|
40
|
+
if (!webServerOptions.allowedHeaders.includes(TraceparentHelper.HEADER_NAME)) {
|
|
41
|
+
webServerOptions.allowedHeaders.push(TraceparentHelper.HEADER_NAME);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
40
44
|
const serverConfig = {
|
|
41
45
|
...coreEngineConfig,
|
|
42
46
|
web: webServerOptions,
|
|
@@ -57,7 +61,7 @@ export async function buildEngineServerConfiguration(envVars, availableContextId
|
|
|
57
61
|
}
|
|
58
62
|
};
|
|
59
63
|
if (Is.stringValue(envVars.mimeTypeProcessors)) {
|
|
60
|
-
const mimeTypeProcessors = envVars.mimeTypeProcessors
|
|
64
|
+
const mimeTypeProcessors = commaSeparatedListToArray(envVars.mimeTypeProcessors);
|
|
61
65
|
if (Is.arrayValue(mimeTypeProcessors)) {
|
|
62
66
|
serverConfig.types.mimeTypeProcessor ??= [];
|
|
63
67
|
for (const mimeTypeProcessor of mimeTypeProcessors) {
|
|
@@ -130,9 +134,7 @@ export async function buildEngineServerConfiguration(envVars, availableContextId
|
|
|
130
134
|
if (!coreEngineConfig.silent) {
|
|
131
135
|
const includeBody = Coerce.boolean(envVars.routeLoggingIncludeBody) ?? coreEngineConfig.debug;
|
|
132
136
|
const fullBase64 = Coerce.boolean(envVars.routeLoggingFullBase64) ?? false;
|
|
133
|
-
const obfuscateProperties =
|
|
134
|
-
? envVars.routeLoggingObfuscateProperties.split(",")
|
|
135
|
-
: undefined;
|
|
137
|
+
const obfuscateProperties = commaSeparatedListToArray(envVars.routeLoggingObfuscateProperties, undefined);
|
|
136
138
|
serverConfig.types.restRouteProcessor.push({
|
|
137
139
|
type: RestRouteProcessorType.Logging,
|
|
138
140
|
options: {
|
|
@@ -212,6 +214,40 @@ export async function buildEngineServerConfiguration(envVars, availableContextId
|
|
|
212
214
|
}
|
|
213
215
|
}
|
|
214
216
|
});
|
|
217
|
+
if (tenantEnabled) {
|
|
218
|
+
serverConfig.types.restRouteProcessor.push({
|
|
219
|
+
type: RestRouteProcessorType.TenantOverride,
|
|
220
|
+
options: {
|
|
221
|
+
config: {}
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
serverConfig.types.socketRouteProcessor.push({
|
|
225
|
+
type: SocketRouteProcessorType.TenantOverride,
|
|
226
|
+
options: {
|
|
227
|
+
config: {}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
if (isTelemetryEnabled(envVars)) {
|
|
233
|
+
serverConfig.types.restRouteProcessor.push({
|
|
234
|
+
type: RestRouteProcessorType.Metrics,
|
|
235
|
+
options: {
|
|
236
|
+
config: {
|
|
237
|
+
excludePaths: commaSeparatedListToArray(envVars.routeMetricsExcludePaths, undefined)
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
if (isTracingEnabled(envVars)) {
|
|
243
|
+
serverConfig.types.restRouteProcessor.push({
|
|
244
|
+
type: RestRouteProcessorType.Tracing,
|
|
245
|
+
options: {
|
|
246
|
+
config: {
|
|
247
|
+
excludePaths: commaSeparatedListToArray(envVars.routeTracingExcludePaths, undefined)
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
});
|
|
215
251
|
}
|
|
216
252
|
addDefaultRestPaths(serverConfig);
|
|
217
253
|
addDefaultSocketPaths(serverConfig);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engineServerEnvBuilder.js","sourceRoot":"","sources":["../../../src/builders/engineServerEnvBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IServerInfo, IWebServerOptions } from \"@twin.org/api-models\";\nimport { ContextIdKeys } from \"@twin.org/context\";\nimport { Coerce, Is, StringHelper } from \"@twin.org/core\";\nimport type { IEngineCoreConfig } from \"@twin.org/engine-models\";\nimport { addDefaultRestPaths, addDefaultSocketPaths } from \"@twin.org/engine-server\";\nimport {\n\tAuthenticationAdminComponentType,\n\tAuthenticationAuditComponentType,\n\tAuthenticationComponentType,\n\tAuthenticationRateComponentType,\n\ttype IEngineServerConfig,\n\tInformationComponentType,\n\ttype MimeTypeProcessorType,\n\tRestRouteProcessorType,\n\tSocketRouteProcessorType\n} from \"@twin.org/engine-server-types\";\nimport type { HttpMethod } from \"@twin.org/web\";\nimport { CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT } from \"../defaults.js\";\nimport type { IEnvironmentVariables } from \"../models/IEnvironmentVariables.js\";\n\n/**\n * Handles the configuration of the server.\n * @param envVars The environment variables for the engine server.\n * @param availableContextIdKeys The context ID keys.\n * @param coreEngineConfig The core engine config.\n * @param serverInfo The server information.\n * @param openApiSpecPath The path to the open api spec.\n * @param favIconPath The path to the favicon.\n * @returns The config for the core and the server.\n */\nexport async function buildEngineServerConfiguration(\n\tenvVars: IEnvironmentVariables & { [id: string]: string | unknown },\n\tavailableContextIdKeys: { key: string; requiredHandlerFeatures: string[] }[],\n\tcoreEngineConfig: IEngineCoreConfig,\n\tserverInfo: IServerInfo,\n\topenApiSpecPath?: string,\n\tfavIconPath?: string\n): Promise<IEngineServerConfig> {\n\tconst webServerOptions: IWebServerOptions = {\n\t\tport: Coerce.number(envVars.port),\n\t\thost: Coerce.string(envVars.host),\n\t\tmethods: Is.stringValue(envVars.httpMethods)\n\t\t\t? (envVars.httpMethods.split(\",\") as HttpMethod[])\n\t\t\t: undefined,\n\t\tallowedHeaders: Is.stringValue(envVars.httpAllowedHeaders)\n\t\t\t? envVars.httpAllowedHeaders.split(\",\")\n\t\t\t: undefined,\n\t\texposedHeaders: Is.stringValue(envVars.httpExposedHeaders)\n\t\t\t? envVars.httpExposedHeaders.split(\",\")\n\t\t\t: undefined,\n\t\tcorsOrigins: Is.stringValue(envVars.corsOrigins) ? envVars.corsOrigins.split(\",\") : undefined,\n\t\tpublicOrigin: Coerce.string(envVars.publicOrigin)\n\t};\n\n\tconst tenantEnabled = Coerce.boolean(envVars.tenantEnabled) ?? false;\n\tconst apiKeyHeader = envVars.authApiKeyHeader ?? \"x-api-key\";\n\tif (tenantEnabled) {\n\t\twebServerOptions.allowedHeaders ??= [];\n\t\tif (!webServerOptions.allowedHeaders.includes(apiKeyHeader)) {\n\t\t\twebServerOptions.allowedHeaders.push(apiKeyHeader);\n\t\t}\n\t}\n\n\tconst serverConfig: IEngineServerConfig = {\n\t\t...coreEngineConfig,\n\t\tweb: webServerOptions,\n\t\ttypes: {\n\t\t\t...coreEngineConfig.types,\n\t\t\tinformationComponent: [\n\t\t\t\t{\n\t\t\t\t\ttype: InformationComponentType.Service,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tserverInfo,\n\t\t\t\t\t\t\topenApiSpecPath,\n\t\t\t\t\t\t\tfavIconPath\n\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\t};\n\n\tif (Is.stringValue(envVars.mimeTypeProcessors)) {\n\t\tconst mimeTypeProcessors = envVars.mimeTypeProcessors.split(\",\");\n\n\t\tif (Is.arrayValue(mimeTypeProcessors)) {\n\t\t\tserverConfig.types.mimeTypeProcessor ??= [];\n\t\t\tfor (const mimeTypeProcessor of mimeTypeProcessors) {\n\t\t\t\tserverConfig.types.mimeTypeProcessor.push({\n\t\t\t\t\ttype: mimeTypeProcessor as MimeTypeProcessorType\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tserverConfig.types.restRouteProcessor ??= [];\n\tserverConfig.types.socketRouteProcessor ??= [];\n\n\tavailableContextIdKeys.push({\n\t\tkey: ContextIdKeys.Node,\n\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t});\n\n\tserverConfig.types.restRouteProcessor.push({\n\t\ttype: RestRouteProcessorType.ContextId,\n\t\toptions: {\n\t\t\tconfig: {\n\t\t\t\tkey: ContextIdKeys.Node\n\t\t\t}\n\t\t}\n\t});\n\tserverConfig.types.socketRouteProcessor.push({\n\t\ttype: SocketRouteProcessorType.ContextId,\n\t\toptions: {\n\t\t\tconfig: {\n\t\t\t\tkey: ContextIdKeys.Node\n\t\t\t}\n\t\t}\n\t});\n\n\tif (tenantEnabled) {\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.Organization,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t\t});\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.Tenant,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_TENANT]\n\t\t});\n\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.Tenant,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tapiKeyName: apiKeyHeader\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.Tenant,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tapiKeyName: apiKeyHeader\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.Organization,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t\t});\n\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.SingleTenant\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.SingleTenant\n\t\t});\n\t}\n\n\tif (!coreEngineConfig.silent) {\n\t\tconst includeBody = Coerce.boolean(envVars.routeLoggingIncludeBody) ?? coreEngineConfig.debug;\n\t\tconst fullBase64 = Coerce.boolean(envVars.routeLoggingFullBase64) ?? false;\n\t\tconst obfuscateProperties = Is.stringValue(envVars.routeLoggingObfuscateProperties)\n\t\t\t? envVars.routeLoggingObfuscateProperties.split(\",\")\n\t\t\t: undefined;\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.Logging,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tincludeBody,\n\t\t\t\t\tfullBase64,\n\t\t\t\t\tobfuscateProperties\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.Logging,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tincludeBody,\n\t\t\t\t\tfullBase64,\n\t\t\t\t\tobfuscateProperties\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tserverConfig.types.restRouteProcessor.push({\n\t\ttype: RestRouteProcessorType.RestRoute\n\t});\n\tserverConfig.types.socketRouteProcessor.push({\n\t\ttype: SocketRouteProcessorType.SocketRoute\n\t});\n\n\tconst authAdminProcessorType = envVars.authAdminProcessorType;\n\tconst authProcessorType = envVars.authProcessorType;\n\n\tif (\n\t\tauthAdminProcessorType === AuthenticationAdminComponentType.EntityStorage ||\n\t\tauthProcessorType === AuthenticationComponentType.EntityStorage\n\t) {\n\t\tserverConfig.types.authenticationRateComponent ??= [];\n\t\tserverConfig.types.authenticationRateComponent.push({\n\t\t\ttype: AuthenticationRateComponentType.EntityStorage\n\t\t});\n\n\t\tserverConfig.types.authenticationAuditComponent ??= [];\n\t\tserverConfig.types.authenticationAuditComponent.push({\n\t\t\ttype: AuthenticationAuditComponentType.EntityStorage\n\t\t});\n\t}\n\n\tif (authAdminProcessorType === AuthenticationAdminComponentType.EntityStorage) {\n\t\tserverConfig.types.authenticationAdminComponent ??= [];\n\t\tserverConfig.types.authenticationAdminComponent.push({\n\t\t\ttype: AuthenticationAdminComponentType.EntityStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (authProcessorType === AuthenticationComponentType.EntityStorage) {\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.User,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t\t});\n\n\t\tserverConfig.types.authenticationComponent ??= [];\n\t\tserverConfig.types.authenticationComponent.push({\n\t\t\ttype: AuthenticationComponentType.EntityStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tsigningKeyName: envVars.authSigningKeyId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.AuthHeader,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tsigningKeyName: envVars.authSigningKeyId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.AuthHeader,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tsigningKeyName: envVars.authSigningKeyId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\taddDefaultRestPaths(serverConfig);\n\taddDefaultSocketPaths(serverConfig);\n\n\t// See if any of the rest paths should be overridden by environment variables and update the config accordingly\n\t// Should be in the format TWIN_REST_PATH_<COMPONENT_TYPE> e.g. TWIN_REST_PATH_TENANT_ADMIN=my-tenants\n\tfor (const componentType in serverConfig.types) {\n\t\tconst types = serverConfig.types[componentType];\n\n\t\tif (Is.arrayValue(types)) {\n\t\t\tfor (const typeConfig of types) {\n\t\t\t\tif (Is.stringValue(typeConfig.restPath)) {\n\t\t\t\t\tconst envVarName = `restPath${StringHelper.pascalCase(componentType.replace(\"Component\", \"\"))}`;\n\t\t\t\t\tconst overrideRestPath = envVars[envVarName];\n\t\t\t\t\tif (Is.stringValue(overrideRestPath)) {\n\t\t\t\t\t\ttypeConfig.restPath = overrideRestPath;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn serverConfig;\n}\n\n/**\n * Checks if the authentication entity storage subsystem is required.\n * Returns true when any component that depends on the authentication entity storage subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if authentication entity storage is enabled.\n */\nexport function isAuthEntityStorageRequired(envVars: IEnvironmentVariables): boolean {\n\treturn (\n\t\tenvVars.authAdminProcessorType === AuthenticationAdminComponentType.EntityStorage ||\n\t\tenvVars.authProcessorType === AuthenticationComponentType.EntityStorage\n\t);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engineServerEnvBuilder.js","sourceRoot":"","sources":["../../../src/builders/engineServerEnvBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type { IServerInfo, IWebServerOptions } from \"@twin.org/api-models\";\nimport { ContextIdKeys } from \"@twin.org/context\";\nimport { Coerce, Is, StringHelper } from \"@twin.org/core\";\nimport type { IEngineCoreConfig } from \"@twin.org/engine-models\";\nimport { addDefaultRestPaths, addDefaultSocketPaths } from \"@twin.org/engine-server\";\nimport {\n\tAuthenticationAdminComponentType,\n\tAuthenticationAuditComponentType,\n\tAuthenticationComponentType,\n\tAuthenticationRateComponentType,\n\ttype IEngineServerConfig,\n\tInformationComponentType,\n\ttype MimeTypeProcessorType,\n\tRestRouteProcessorType,\n\tSocketRouteProcessorType\n} from \"@twin.org/engine-server-types\";\nimport { TraceparentHelper } from \"@twin.org/tracing-models\";\nimport { CONTEXT_ID_HANDLER_FEATURE_DID, CONTEXT_ID_HANDLER_FEATURE_TENANT } from \"../defaults.js\";\nimport { isTelemetryEnabled, isTracingEnabled } from \"./engineEnvBuilder.js\";\nimport type { IEnvironmentVariables } from \"../models/IEnvironmentVariables.js\";\nimport { commaSeparatedListToArray, envKeyIntegerPairs } from \"./helper/envHelpers.js\";\n\n/**\n * Handles the configuration of the server.\n * @param envVars The environment variables for the engine server.\n * @param availableContextIdKeys The context ID keys.\n * @param coreEngineConfig The core engine config.\n * @param serverInfo The server information.\n * @param openApiSpecPath The path to the open api spec.\n * @param favIconPath The path to the favicon.\n * @returns The config for the core and the server.\n */\nexport async function buildEngineServerConfiguration(\n\tenvVars: IEnvironmentVariables & { [id: string]: string | unknown },\n\tavailableContextIdKeys: { key: string; requiredHandlerFeatures: string[] }[],\n\tcoreEngineConfig: IEngineCoreConfig,\n\tserverInfo: IServerInfo,\n\topenApiSpecPath?: string,\n\tfavIconPath?: string\n): Promise<IEngineServerConfig> {\n\tconst webServerOptions: IWebServerOptions = {\n\t\tport: Coerce.number(envVars.port),\n\t\thost: Coerce.string(envVars.host),\n\t\tmethods: commaSeparatedListToArray(envVars.httpMethods, undefined),\n\t\tallowedHeaders: commaSeparatedListToArray(envVars.httpAllowedHeaders, undefined),\n\t\texposedHeaders: commaSeparatedListToArray(envVars.httpExposedHeaders, undefined),\n\t\tcorsOrigins: commaSeparatedListToArray(envVars.corsOrigins, undefined),\n\t\tbodyLimits: envKeyIntegerPairs(envVars, \"httpBodyLimits\"),\n\t\tpublicOrigin: Coerce.string(envVars.publicOrigin)\n\t};\n\n\tconst tenantEnabled = Coerce.boolean(envVars.tenantEnabled) ?? false;\n\tconst apiKeyHeader = envVars.authApiKeyHeader ?? \"x-api-key\";\n\tif (tenantEnabled) {\n\t\twebServerOptions.allowedHeaders ??= [];\n\t\tif (!webServerOptions.allowedHeaders.includes(apiKeyHeader)) {\n\t\t\twebServerOptions.allowedHeaders.push(apiKeyHeader);\n\t\t}\n\t}\n\n\tif (isTracingEnabled(envVars)) {\n\t\twebServerOptions.allowedHeaders ??= [];\n\t\tif (!webServerOptions.allowedHeaders.includes(TraceparentHelper.HEADER_NAME)) {\n\t\t\twebServerOptions.allowedHeaders.push(TraceparentHelper.HEADER_NAME);\n\t\t}\n\t}\n\n\tconst serverConfig: IEngineServerConfig = {\n\t\t...coreEngineConfig,\n\t\tweb: webServerOptions,\n\t\ttypes: {\n\t\t\t...coreEngineConfig.types,\n\t\t\tinformationComponent: [\n\t\t\t\t{\n\t\t\t\t\ttype: InformationComponentType.Service,\n\t\t\t\t\toptions: {\n\t\t\t\t\t\tconfig: {\n\t\t\t\t\t\t\tserverInfo,\n\t\t\t\t\t\t\topenApiSpecPath,\n\t\t\t\t\t\t\tfavIconPath\n\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\t};\n\n\tif (Is.stringValue(envVars.mimeTypeProcessors)) {\n\t\tconst mimeTypeProcessors = commaSeparatedListToArray(envVars.mimeTypeProcessors);\n\n\t\tif (Is.arrayValue(mimeTypeProcessors)) {\n\t\t\tserverConfig.types.mimeTypeProcessor ??= [];\n\t\t\tfor (const mimeTypeProcessor of mimeTypeProcessors) {\n\t\t\t\tserverConfig.types.mimeTypeProcessor.push({\n\t\t\t\t\ttype: mimeTypeProcessor as MimeTypeProcessorType\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\tserverConfig.types.restRouteProcessor ??= [];\n\tserverConfig.types.socketRouteProcessor ??= [];\n\n\tavailableContextIdKeys.push({\n\t\tkey: ContextIdKeys.Node,\n\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t});\n\n\tserverConfig.types.restRouteProcessor.push({\n\t\ttype: RestRouteProcessorType.ContextId,\n\t\toptions: {\n\t\t\tconfig: {\n\t\t\t\tkey: ContextIdKeys.Node\n\t\t\t}\n\t\t}\n\t});\n\tserverConfig.types.socketRouteProcessor.push({\n\t\ttype: SocketRouteProcessorType.ContextId,\n\t\toptions: {\n\t\t\tconfig: {\n\t\t\t\tkey: ContextIdKeys.Node\n\t\t\t}\n\t\t}\n\t});\n\n\tif (tenantEnabled) {\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.Organization,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t\t});\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.Tenant,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_TENANT]\n\t\t});\n\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.Tenant,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tapiKeyName: apiKeyHeader\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.Tenant,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tapiKeyName: apiKeyHeader\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.Organization,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t\t});\n\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.SingleTenant\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.SingleTenant\n\t\t});\n\t}\n\n\tif (!coreEngineConfig.silent) {\n\t\tconst includeBody = Coerce.boolean(envVars.routeLoggingIncludeBody) ?? coreEngineConfig.debug;\n\t\tconst fullBase64 = Coerce.boolean(envVars.routeLoggingFullBase64) ?? false;\n\t\tconst obfuscateProperties = commaSeparatedListToArray<string>(\n\t\t\tenvVars.routeLoggingObfuscateProperties,\n\t\t\tundefined\n\t\t);\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.Logging,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tincludeBody,\n\t\t\t\t\tfullBase64,\n\t\t\t\t\tobfuscateProperties\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.Logging,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tincludeBody,\n\t\t\t\t\tfullBase64,\n\t\t\t\t\tobfuscateProperties\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tserverConfig.types.restRouteProcessor.push({\n\t\ttype: RestRouteProcessorType.RestRoute\n\t});\n\tserverConfig.types.socketRouteProcessor.push({\n\t\ttype: SocketRouteProcessorType.SocketRoute\n\t});\n\n\tconst authAdminProcessorType = envVars.authAdminProcessorType;\n\tconst authProcessorType = envVars.authProcessorType;\n\n\tif (\n\t\tauthAdminProcessorType === AuthenticationAdminComponentType.EntityStorage ||\n\t\tauthProcessorType === AuthenticationComponentType.EntityStorage\n\t) {\n\t\tserverConfig.types.authenticationRateComponent ??= [];\n\t\tserverConfig.types.authenticationRateComponent.push({\n\t\t\ttype: AuthenticationRateComponentType.EntityStorage\n\t\t});\n\n\t\tserverConfig.types.authenticationAuditComponent ??= [];\n\t\tserverConfig.types.authenticationAuditComponent.push({\n\t\t\ttype: AuthenticationAuditComponentType.EntityStorage\n\t\t});\n\t}\n\n\tif (authAdminProcessorType === AuthenticationAdminComponentType.EntityStorage) {\n\t\tserverConfig.types.authenticationAdminComponent ??= [];\n\t\tserverConfig.types.authenticationAdminComponent.push({\n\t\t\ttype: AuthenticationAdminComponentType.EntityStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (authProcessorType === AuthenticationComponentType.EntityStorage) {\n\t\tavailableContextIdKeys.push({\n\t\t\tkey: ContextIdKeys.User,\n\t\t\trequiredHandlerFeatures: [CONTEXT_ID_HANDLER_FEATURE_DID]\n\t\t});\n\n\t\tserverConfig.types.authenticationComponent ??= [];\n\t\tserverConfig.types.authenticationComponent.push({\n\t\t\ttype: AuthenticationComponentType.EntityStorage,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tsigningKeyName: envVars.authSigningKeyId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.AuthHeader,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tsigningKeyName: envVars.authSigningKeyId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\ttype: SocketRouteProcessorType.AuthHeader,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\tsigningKeyName: envVars.authSigningKeyId\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tif (tenantEnabled) {\n\t\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\t\ttype: RestRouteProcessorType.TenantOverride,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {}\n\t\t\t\t}\n\t\t\t});\n\t\t\tserverConfig.types.socketRouteProcessor.push({\n\t\t\t\ttype: SocketRouteProcessorType.TenantOverride,\n\t\t\t\toptions: {\n\t\t\t\t\tconfig: {}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tif (isTelemetryEnabled(envVars)) {\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.Metrics,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\texcludePaths: commaSeparatedListToArray<string>(\n\t\t\t\t\t\tenvVars.routeMetricsExcludePaths,\n\t\t\t\t\t\tundefined\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (isTracingEnabled(envVars)) {\n\t\tserverConfig.types.restRouteProcessor.push({\n\t\t\ttype: RestRouteProcessorType.Tracing,\n\t\t\toptions: {\n\t\t\t\tconfig: {\n\t\t\t\t\texcludePaths: commaSeparatedListToArray<string>(\n\t\t\t\t\t\tenvVars.routeTracingExcludePaths,\n\t\t\t\t\t\tundefined\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\taddDefaultRestPaths(serverConfig);\n\taddDefaultSocketPaths(serverConfig);\n\n\t// See if any of the rest paths should be overridden by environment variables and update the config accordingly\n\t// Should be in the format TWIN_REST_PATH_<COMPONENT_TYPE> e.g. TWIN_REST_PATH_TENANT_ADMIN=my-tenants\n\tfor (const componentType in serverConfig.types) {\n\t\tconst types = serverConfig.types[componentType];\n\n\t\tif (Is.arrayValue(types)) {\n\t\t\tfor (const typeConfig of types) {\n\t\t\t\tif (Is.stringValue(typeConfig.restPath)) {\n\t\t\t\t\tconst envVarName = `restPath${StringHelper.pascalCase(componentType.replace(\"Component\", \"\"))}`;\n\t\t\t\t\tconst overrideRestPath = envVars[envVarName];\n\t\t\t\t\tif (Is.stringValue(overrideRestPath)) {\n\t\t\t\t\t\ttypeConfig.restPath = overrideRestPath;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn serverConfig;\n}\n\n/**\n * Checks if the authentication entity storage subsystem is required.\n * Returns true when any component that depends on the authentication entity storage subsystem is enabled.\n * @param envVars The environment variables.\n * @returns True if authentication entity storage is enabled.\n */\nexport function isAuthEntityStorageRequired(envVars: IEnvironmentVariables): boolean {\n\treturn (\n\t\tenvVars.authAdminProcessorType === AuthenticationAdminComponentType.EntityStorage ||\n\t\tenvVars.authProcessorType === AuthenticationComponentType.EntityStorage\n\t);\n}\n"]}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { CLIDisplay } from "@twin.org/cli-core";
|
|
4
4
|
import { GeneralError, I18n, Is } from "@twin.org/core";
|
|
5
5
|
import { ModuleHelper } from "@twin.org/modules";
|
|
6
|
+
import { commaSeparatedListToArray } from "./helper/envHelpers.js";
|
|
6
7
|
const extensionState = {};
|
|
7
8
|
/**
|
|
8
9
|
* Handles the configuration of the extensions.
|
|
@@ -12,7 +13,7 @@ const extensionState = {};
|
|
|
12
13
|
*/
|
|
13
14
|
export async function extensionsConfiguration(envVars, nodeEngineConfig) {
|
|
14
15
|
if (Is.stringValue(envVars.extensions)) {
|
|
15
|
-
const extensions = envVars.extensions
|
|
16
|
+
const extensions = commaSeparatedListToArray(envVars.extensions);
|
|
16
17
|
for (const extension of extensions) {
|
|
17
18
|
let initialiseConfigMethod;
|
|
18
19
|
try {
|
|
@@ -37,7 +38,7 @@ export async function extensionsConfiguration(envVars, nodeEngineConfig) {
|
|
|
37
38
|
*/
|
|
38
39
|
export async function extensionsInitialiseEngine(envVars, engineCore) {
|
|
39
40
|
if (Is.stringValue(envVars.extensions)) {
|
|
40
|
-
const extensions = envVars.extensions
|
|
41
|
+
const extensions = commaSeparatedListToArray(envVars.extensions);
|
|
41
42
|
for (const extension of extensions) {
|
|
42
43
|
extensionState[extension] ??= { initialised: false };
|
|
43
44
|
if (!extensionState[extension].initialised) {
|
|
@@ -65,7 +66,7 @@ export async function extensionsInitialiseEngine(envVars, engineCore) {
|
|
|
65
66
|
*/
|
|
66
67
|
export async function extensionsInitialiseEngineServer(envVars, engineCore, engineServer) {
|
|
67
68
|
if (Is.stringValue(envVars.extensions)) {
|
|
68
|
-
const extensions = envVars.extensions
|
|
69
|
+
const extensions = commaSeparatedListToArray(envVars.extensions);
|
|
69
70
|
for (const extension of extensions) {
|
|
70
71
|
let initialiseEngineServerMethod;
|
|
71
72
|
try {
|
|
@@ -88,7 +89,7 @@ export async function extensionsInitialiseEngineServer(envVars, engineCore, engi
|
|
|
88
89
|
*/
|
|
89
90
|
export async function shutdownExtensions(envVars, engineCore) {
|
|
90
91
|
if (Is.stringValue(envVars.extensions)) {
|
|
91
|
-
const extensions = envVars.extensions
|
|
92
|
+
const extensions = commaSeparatedListToArray(envVars.extensions);
|
|
92
93
|
for (const extension of extensions) {
|
|
93
94
|
extensionState[extension] ??= { initialised: false };
|
|
94
95
|
if (extensionState[extension].initialised) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensionsBuilder.js","sourceRoot":"","sources":["../../../src/builders/extensionsBuilder.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,uCAAuC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"extensionsBuilder.js","sourceRoot":"","sources":["../../../src/builders/extensionsBuilder.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { CLIDisplay } from \"@twin.org/cli-core\";\nimport { GeneralError, I18n, Is } from \"@twin.org/core\";\nimport type { IEngineCore, IEngineServer } from \"@twin.org/engine-models\";\nimport { ModuleHelper } from \"@twin.org/modules\";\nimport { commaSeparatedListToArray } from \"./helper/envHelpers.js\";\nimport type { IEnvironmentVariables } from \"../models/IEnvironmentVariables.js\";\nimport type { INodeEngineConfig } from \"../models/INodeEngineConfig.js\";\nimport type { NodeExtensionInitialiseEngineMethod } from \"../models/nodeExtensionInitialiseEngineMethod.js\";\nimport type { NodeExtensionInitialiseEngineServerMethod } from \"../models/nodeExtensionInitialiseEngineServerMethod.js\";\nimport type { NodeExtensionInitialiseMethod } from \"../models/nodeExtensionInitialiseMethod.js\";\nimport type { NodeExtensionShutdownMethod } from \"../models/nodeExtensionShutdownMethod.js\";\n\nconst extensionState: { [id: string]: { initialised: boolean } } = {};\n\n/**\n * Handles the configuration of the extensions.\n * @param envVars The environment variables for the node.\n * @param nodeEngineConfig The node engine config.\n * @returns The config for the core and the server.\n */\nexport async function extensionsConfiguration(\n\tenvVars: IEnvironmentVariables,\n\tnodeEngineConfig: INodeEngineConfig\n): Promise<INodeEngineConfig> {\n\tif (Is.stringValue(envVars.extensions)) {\n\t\tconst extensions = commaSeparatedListToArray<string>(envVars.extensions);\n\n\t\tfor (const extension of extensions) {\n\t\t\tlet initialiseConfigMethod: NodeExtensionInitialiseMethod | undefined;\n\t\t\ttry {\n\t\t\t\tCLIDisplay.value(I18n.formatMessage(\"node.extensionLoading\"), extension);\n\n\t\t\t\tinitialiseConfigMethod = await ModuleHelper.getModuleMethod<NodeExtensionInitialiseMethod>(\n\t\t\t\t\textension,\n\t\t\t\t\t\"extensionInitialise\"\n\t\t\t\t);\n\t\t\t} catch (err) {\n\t\t\t\tthrow new GeneralError(\"node\", \"extensionLoadingError\", { extension }, err);\n\t\t\t}\n\n\t\t\tif (Is.function(initialiseConfigMethod)) {\n\t\t\t\tawait initialiseConfigMethod(envVars, nodeEngineConfig);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn nodeEngineConfig;\n}\n\n/**\n * Handles the initialisation of the extensions when the engine has been constructed.\n * @param envVars The environment variables for the node.\n * @param engineCore The engine core instance.\n * @returns A promise that resolves when all extension engine initialisation methods have completed.\n */\nexport async function extensionsInitialiseEngine(\n\tenvVars: IEnvironmentVariables,\n\tengineCore: IEngineCore\n): Promise<void> {\n\tif (Is.stringValue(envVars.extensions)) {\n\t\tconst extensions = commaSeparatedListToArray<string>(envVars.extensions);\n\n\t\tfor (const extension of extensions) {\n\t\t\textensionState[extension] ??= { initialised: false };\n\n\t\t\tif (!extensionState[extension].initialised) {\n\t\t\t\textensionState[extension].initialised = true;\n\n\t\t\t\tlet initialiseEngineMethod: NodeExtensionInitialiseEngineMethod | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tengineCore.logInfo(I18n.formatMessage(\"node.extensionInitialisingEngine\", { extension }));\n\t\t\t\t\tinitialiseEngineMethod =\n\t\t\t\t\t\tawait ModuleHelper.getModuleMethod<NodeExtensionInitialiseEngineMethod>(\n\t\t\t\t\t\t\textension,\n\t\t\t\t\t\t\t\"extensionInitialiseEngine\"\n\t\t\t\t\t\t);\n\t\t\t\t} catch {}\n\n\t\t\t\tif (Is.function(initialiseEngineMethod)) {\n\t\t\t\t\tawait initialiseEngineMethod(engineCore);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Handles the initialisation of the extensions when the engine server has been constructed.\n * @param envVars The environment variables for the node.\n * @param engineCore The engine core instance.\n * @param engineServer The engine server instance.\n * @returns A promise that resolves when all extension engine-server initialisation methods have completed.\n */\nexport async function extensionsInitialiseEngineServer(\n\tenvVars: IEnvironmentVariables,\n\tengineCore: IEngineCore,\n\tengineServer: IEngineServer\n): Promise<void> {\n\tif (Is.stringValue(envVars.extensions)) {\n\t\tconst extensions = commaSeparatedListToArray<string>(envVars.extensions);\n\n\t\tfor (const extension of extensions) {\n\t\t\tlet initialiseEngineServerMethod: NodeExtensionInitialiseEngineServerMethod | undefined;\n\t\t\ttry {\n\t\t\t\tengineCore.logInfo(\n\t\t\t\t\tI18n.formatMessage(\"node.extensionInitialisingEngineServer\", { extension })\n\t\t\t\t);\n\t\t\t\tinitialiseEngineServerMethod =\n\t\t\t\t\tawait ModuleHelper.getModuleMethod<NodeExtensionInitialiseEngineServerMethod>(\n\t\t\t\t\t\textension,\n\t\t\t\t\t\t\"extensionInitialiseEngineServer\"\n\t\t\t\t\t);\n\t\t\t} catch {}\n\n\t\t\tif (Is.function(initialiseEngineServerMethod)) {\n\t\t\t\tawait initialiseEngineServerMethod(engineCore, engineServer);\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Handles the shutdown of the extensions.\n * @param envVars The environment variables for the node.\n * @param engineCore The engine core instance.\n * @returns A promise that resolves when all extension shutdown methods have completed.\n */\nexport async function shutdownExtensions(\n\tenvVars: IEnvironmentVariables,\n\tengineCore: IEngineCore\n): Promise<void> {\n\tif (Is.stringValue(envVars.extensions)) {\n\t\tconst extensions = commaSeparatedListToArray<string>(envVars.extensions);\n\n\t\tfor (const extension of extensions) {\n\t\t\textensionState[extension] ??= { initialised: false };\n\n\t\t\tif (extensionState[extension].initialised) {\n\t\t\t\textensionState[extension].initialised = false;\n\t\t\t\tlet shutdownMethod: NodeExtensionShutdownMethod | undefined;\n\t\t\t\ttry {\n\t\t\t\t\tengineCore.logInfo(I18n.formatMessage(\"node.extensionShutdown\", { extension }));\n\t\t\t\t\tshutdownMethod = await ModuleHelper.getModuleMethod<NodeExtensionShutdownMethod>(\n\t\t\t\t\t\textension,\n\t\t\t\t\t\t\"extensionShutdown\"\n\t\t\t\t\t);\n\t\t\t\t} catch {}\n\n\t\t\t\tif (Is.function(shutdownMethod)) {\n\t\t\t\t\tawait shutdownMethod();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
|
|
@@ -1,14 +1,6 @@
|
|
|
1
1
|
// Copyright 2026 IOTA Stiftung.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0.
|
|
3
3
|
import { Coerce, GeneralError, Is } from "@twin.org/core";
|
|
4
|
-
/**
|
|
5
|
-
* Coerces an env var to a boolean, falling back to the supplied default when not set.
|
|
6
|
-
* @param envVars The environment variables object.
|
|
7
|
-
* @param key The property name of the env var to coerce.
|
|
8
|
-
* @param defaultValue The value to return when the env var is absent.
|
|
9
|
-
* @returns The boolean value or the default.
|
|
10
|
-
* @throws GeneralError if the value is set but cannot be coerced to a boolean.
|
|
11
|
-
*/
|
|
12
4
|
export function envBoolean(envVars, key, defaultValue) {
|
|
13
5
|
const value = envVars[key];
|
|
14
6
|
if (!Is.stringValue(value)) {
|
|
@@ -20,17 +12,10 @@ export function envBoolean(envVars, key, defaultValue) {
|
|
|
20
12
|
}
|
|
21
13
|
return result;
|
|
22
14
|
}
|
|
23
|
-
|
|
24
|
-
* Coerces an env var that is already in milliseconds to an integer.
|
|
25
|
-
* @param envVars The environment variables object.
|
|
26
|
-
* @param key The property name of the env var to coerce.
|
|
27
|
-
* @returns The millisecond value, or undefined when not set.
|
|
28
|
-
* @throws GeneralError if the value is set but cannot be coerced to an integer.
|
|
29
|
-
*/
|
|
30
|
-
export function envMs(envVars, key) {
|
|
15
|
+
export function envMs(envVars, key, defaultValue) {
|
|
31
16
|
const value = envVars[key];
|
|
32
17
|
if (!Is.stringValue(value)) {
|
|
33
|
-
return
|
|
18
|
+
return defaultValue;
|
|
34
19
|
}
|
|
35
20
|
const result = Coerce.integer(value);
|
|
36
21
|
if (Is.empty(result)) {
|
|
@@ -38,17 +23,10 @@ export function envMs(envVars, key) {
|
|
|
38
23
|
}
|
|
39
24
|
return result;
|
|
40
25
|
}
|
|
41
|
-
|
|
42
|
-
* Coerces an env var that represents an integer count or size to an integer.
|
|
43
|
-
* @param envVars The environment variables object.
|
|
44
|
-
* @param key The property name of the env var to coerce.
|
|
45
|
-
* @returns The count, or undefined when not set.
|
|
46
|
-
* @throws GeneralError if the value is set but cannot be coerced to an integer.
|
|
47
|
-
*/
|
|
48
|
-
export function envCount(envVars, key) {
|
|
26
|
+
export function envCount(envVars, key, defaultValue) {
|
|
49
27
|
const value = envVars[key];
|
|
50
28
|
if (!Is.stringValue(value)) {
|
|
51
|
-
return
|
|
29
|
+
return defaultValue;
|
|
52
30
|
}
|
|
53
31
|
const result = Coerce.integer(value);
|
|
54
32
|
if (Is.empty(result)) {
|
|
@@ -56,17 +34,10 @@ export function envCount(envVars, key) {
|
|
|
56
34
|
}
|
|
57
35
|
return result;
|
|
58
36
|
}
|
|
59
|
-
|
|
60
|
-
* Coerces an env var that represents an integer to an integer.
|
|
61
|
-
* @param envVars The environment variables object.
|
|
62
|
-
* @param key The property name of the env var to coerce.
|
|
63
|
-
* @returns The integer, or undefined when not set.
|
|
64
|
-
* @throws GeneralError if the value is set but cannot be coerced to an integer.
|
|
65
|
-
*/
|
|
66
|
-
export function envInteger(envVars, key) {
|
|
37
|
+
export function envInteger(envVars, key, defaultValue) {
|
|
67
38
|
const value = envVars[key];
|
|
68
39
|
if (!Is.stringValue(value)) {
|
|
69
|
-
return
|
|
40
|
+
return defaultValue;
|
|
70
41
|
}
|
|
71
42
|
const result = Coerce.integer(value);
|
|
72
43
|
if (Is.empty(result)) {
|
|
@@ -74,17 +45,24 @@ export function envInteger(envVars, key) {
|
|
|
74
45
|
}
|
|
75
46
|
return result;
|
|
76
47
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
export function
|
|
48
|
+
export function envObject(envVars, key, defaultValue) {
|
|
49
|
+
const value = envVars[key];
|
|
50
|
+
if (Is.undefined(value)) {
|
|
51
|
+
return defaultValue;
|
|
52
|
+
}
|
|
53
|
+
return Coerce.object(value) ?? defaultValue;
|
|
54
|
+
}
|
|
55
|
+
export function envArray(envVars, key, defaultValue) {
|
|
56
|
+
const value = envVars[key];
|
|
57
|
+
if (Is.undefined(value)) {
|
|
58
|
+
return defaultValue;
|
|
59
|
+
}
|
|
60
|
+
return Coerce.array(value) ?? defaultValue;
|
|
61
|
+
}
|
|
62
|
+
export function envSeconds(envVars, key, defaultValue) {
|
|
85
63
|
const value = envVars[key];
|
|
86
64
|
if (!Is.stringValue(value)) {
|
|
87
|
-
return
|
|
65
|
+
return defaultValue;
|
|
88
66
|
}
|
|
89
67
|
const result = Coerce.integer(value);
|
|
90
68
|
if (Is.empty(result)) {
|
|
@@ -92,17 +70,10 @@ export function envSeconds(envVars, key) {
|
|
|
92
70
|
}
|
|
93
71
|
return result;
|
|
94
72
|
}
|
|
95
|
-
|
|
96
|
-
* Coerces an env var that is already in minutes to an integer.
|
|
97
|
-
* @param envVars The environment variables object.
|
|
98
|
-
* @param key The property name of the env var to coerce.
|
|
99
|
-
* @returns The minute value, or undefined when not set.
|
|
100
|
-
* @throws GeneralError if the value is set but cannot be coerced to an integer.
|
|
101
|
-
*/
|
|
102
|
-
export function envMinutes(envVars, key) {
|
|
73
|
+
export function envMinutes(envVars, key, defaultValue) {
|
|
103
74
|
const value = envVars[key];
|
|
104
75
|
if (!Is.stringValue(value)) {
|
|
105
|
-
return
|
|
76
|
+
return defaultValue;
|
|
106
77
|
}
|
|
107
78
|
const result = Coerce.integer(value);
|
|
108
79
|
if (Is.empty(result)) {
|
|
@@ -110,17 +81,10 @@ export function envMinutes(envVars, key) {
|
|
|
110
81
|
}
|
|
111
82
|
return result;
|
|
112
83
|
}
|
|
113
|
-
|
|
114
|
-
* Coerces an env var that is a datetime string, throwing when the value is set but not a valid datetime.
|
|
115
|
-
* @param envVars The environment variables object.
|
|
116
|
-
* @param key The property name of the env var to coerce.
|
|
117
|
-
* @returns The datetime string, or undefined when not set.
|
|
118
|
-
* @throws GeneralError if the value is set but cannot be coerced to a datetime.
|
|
119
|
-
*/
|
|
120
|
-
export function envDateTime(envVars, key) {
|
|
84
|
+
export function envDateTime(envVars, key, defaultValue) {
|
|
121
85
|
const value = envVars[key];
|
|
122
86
|
if (!Is.stringValue(value)) {
|
|
123
|
-
return
|
|
87
|
+
return defaultValue;
|
|
124
88
|
}
|
|
125
89
|
const result = Coerce.dateTime(value) ?? Coerce.date(value);
|
|
126
90
|
if (Is.empty(result)) {
|
|
@@ -128,17 +92,10 @@ export function envDateTime(envVars, key) {
|
|
|
128
92
|
}
|
|
129
93
|
return result.toISOString();
|
|
130
94
|
}
|
|
131
|
-
|
|
132
|
-
* Coerces an env var to an integer and converts from seconds to milliseconds.
|
|
133
|
-
* @param envVars The environment variables object.
|
|
134
|
-
* @param key The property name of the env var to coerce.
|
|
135
|
-
* @returns The value in milliseconds, or undefined when not set.
|
|
136
|
-
* @throws GeneralError if the value is set but cannot be coerced to an integer.
|
|
137
|
-
*/
|
|
138
|
-
export function envSecToMs(envVars, key) {
|
|
95
|
+
export function envSecToMs(envVars, key, defaultValue) {
|
|
139
96
|
const value = envVars[key];
|
|
140
97
|
if (!Is.stringValue(value)) {
|
|
141
|
-
return
|
|
98
|
+
return defaultValue;
|
|
142
99
|
}
|
|
143
100
|
const n = Coerce.integer(value);
|
|
144
101
|
if (Is.empty(n)) {
|
|
@@ -146,17 +103,10 @@ export function envSecToMs(envVars, key) {
|
|
|
146
103
|
}
|
|
147
104
|
return n * 1000;
|
|
148
105
|
}
|
|
149
|
-
|
|
150
|
-
* Coerces an env var to an integer and converts from minutes to milliseconds.
|
|
151
|
-
* @param envVars The environment variables object.
|
|
152
|
-
* @param key The property name of the env var to coerce.
|
|
153
|
-
* @returns The value in milliseconds, or undefined when not set.
|
|
154
|
-
* @throws GeneralError if the value is set but cannot be coerced to an integer.
|
|
155
|
-
*/
|
|
156
|
-
export function envMinToMs(envVars, key) {
|
|
106
|
+
export function envMinToMs(envVars, key, defaultValue) {
|
|
157
107
|
const value = envVars[key];
|
|
158
108
|
if (!Is.stringValue(value)) {
|
|
159
|
-
return
|
|
109
|
+
return defaultValue;
|
|
160
110
|
}
|
|
161
111
|
const n = Coerce.integer(value);
|
|
162
112
|
if (Is.empty(n)) {
|
|
@@ -167,15 +117,43 @@ export function envMinToMs(envVars, key) {
|
|
|
167
117
|
/**
|
|
168
118
|
* Converts a comma separated list to an array.
|
|
169
119
|
* @param value The comma separated list.
|
|
120
|
+
* @param defaultValue The default value to return when the list is empty or undefined.
|
|
170
121
|
* @returns The array.
|
|
171
122
|
*/
|
|
172
|
-
export function commaSeparatedListToArray(value) {
|
|
123
|
+
export function commaSeparatedListToArray(value, defaultValue = []) {
|
|
173
124
|
if (!Is.stringValue(value)) {
|
|
174
|
-
return
|
|
125
|
+
return defaultValue;
|
|
175
126
|
}
|
|
176
127
|
return value
|
|
177
128
|
.split(",")
|
|
178
129
|
.map(item => item.trim())
|
|
179
130
|
.filter(item => item.length > 0);
|
|
180
131
|
}
|
|
132
|
+
/**
|
|
133
|
+
* Gets named key integer pairs from an env var holding comma separated key=integer pairs.
|
|
134
|
+
* @param envVars The environment variables object.
|
|
135
|
+
* @param key The property name of the env var to read.
|
|
136
|
+
* @returns The named key integer pairs, or undefined when the env var is absent or empty.
|
|
137
|
+
* @throws GeneralError if an entry is not a unique name=value pair with an integer value.
|
|
138
|
+
*/
|
|
139
|
+
export function envKeyIntegerPairs(envVars, key) {
|
|
140
|
+
const entries = commaSeparatedListToArray(envVars[key], undefined);
|
|
141
|
+
if (!Is.arrayValue(entries)) {
|
|
142
|
+
return undefined;
|
|
143
|
+
}
|
|
144
|
+
const keyValues = {};
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
const parts = entry.split("=").map(part => part.trim());
|
|
147
|
+
const keyPart = parts[0];
|
|
148
|
+
const valuePart = Coerce.integer(parts[1]);
|
|
149
|
+
if (parts.length !== 2 ||
|
|
150
|
+
!Is.stringValue(keyPart) ||
|
|
151
|
+
!Is.integer(valuePart) ||
|
|
152
|
+
!Is.undefined(keyValues[keyPart])) {
|
|
153
|
+
throw new GeneralError("node", "invalidEnvVarPair", { key: keyPart, value: entry });
|
|
154
|
+
}
|
|
155
|
+
keyValues[keyPart] = valuePart;
|
|
156
|
+
}
|
|
157
|
+
return keyValues;
|
|
158
|
+
}
|
|
181
159
|
//# sourceMappingURL=envHelpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"envHelpers.js","sourceRoot":"","sources":["../../../../src/builders/helper/envHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Coerce, GeneralError, Is } from \"@twin.org/core\";\nimport type { IEngineEnvironmentVariables } from \"../../models/IEngineEnvironmentVariables.js\";\n\n/**\n * Coerces an env var to a boolean, falling back to the supplied default when not set.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent.\n * @returns The boolean value or the default.\n * @throws GeneralError if the value is set but cannot be coerced to a boolean.\n */\nexport function envBoolean(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables,\n\tdefaultValue: boolean\n): boolean {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.boolean(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"boolean\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that is already in milliseconds to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The millisecond value, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envMs(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that represents an integer count or size to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The count, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envCount(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that represents an integer to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The integer, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envInteger(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that is already in seconds to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The second value, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envSeconds(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that is already in minutes to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The minute value, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envMinutes(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that is a datetime string, throwing when the value is set but not a valid datetime.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The datetime string, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to a datetime.\n */\nexport function envDateTime(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): string | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst result = Coerce.dateTime(value) ?? Coerce.date(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"datetime\" });\n\t}\n\treturn result.toISOString();\n}\n\n/**\n * Coerces an env var to an integer and converts from seconds to milliseconds.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The value in milliseconds, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envSecToMs(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst n = Coerce.integer(value);\n\tif (Is.empty(n)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn n * 1000;\n}\n\n/**\n * Coerces an env var to an integer and converts from minutes to milliseconds.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The value in milliseconds, or undefined when not set.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envMinToMs(\n\tenvVars: IEngineEnvironmentVariables,\n\tkey: keyof IEngineEnvironmentVariables\n): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn undefined;\n\t}\n\tconst n = Coerce.integer(value);\n\tif (Is.empty(n)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn n * 60_000;\n}\n\n/**\n * Converts a comma separated list to an array.\n * @param value The comma separated list.\n * @returns The array.\n */\nexport function commaSeparatedListToArray<T>(value: string | undefined): T[] {\n\tif (!Is.stringValue(value)) {\n\t\treturn [];\n\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"]}
|
|
1
|
+
{"version":3,"file":"envHelpers.js","sourceRoot":"","sources":["../../../../src/builders/helper/envHelpers.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2026 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport { Coerce, GeneralError, Is } from \"@twin.org/core\";\n\n/**\n * Coerces an env var to a boolean, falling back to the supplied default when not set.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The boolean value, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to a boolean.\n */\nexport function envBoolean<T>(envVars: T, key: keyof T, defaultValue: boolean): boolean;\nexport function envBoolean<T>(envVars: T, key: keyof T): boolean | undefined;\nexport function envBoolean<T>(\n\tenvVars: T,\n\tkey: keyof T,\n\tdefaultValue?: boolean\n): boolean | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.boolean(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"boolean\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that is already in milliseconds to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The millisecond value, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envMs<T>(envVars: T, key: keyof T, defaultValue: number): number;\nexport function envMs<T>(envVars: T, key: keyof T): number | undefined;\nexport function envMs<T>(envVars: T, key: keyof T, defaultValue?: number): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that represents an integer count or size to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The count, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envCount<T>(envVars: T, key: keyof T, defaultValue: number): number;\nexport function envCount<T>(envVars: T, key: keyof T): number | undefined;\nexport function envCount<T>(envVars: T, key: keyof T, defaultValue?: number): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that represents an integer to an actual integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The integer, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envInteger<T>(envVars: T, key: keyof T, defaultValue: number): number;\nexport function envInteger<T>(envVars: T, key: keyof T): number | undefined;\nexport function envInteger<T>(envVars: T, key: keyof T, defaultValue?: number): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Returns an env var as a typed object. Accepts a pre-parsed object, an inline JSON object string,\n * or a value already expanded from a @json: file reference.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent or cannot be parsed.\n * @returns The parsed object, or the default when absent or the value cannot be parsed.\n */\nexport function envObject<T, U>(envVars: T, key: keyof T, defaultValue: U): U;\n/**\n * Returns an env var as a typed object. Accepts a pre-parsed object, an inline JSON object string,\n * or a value already expanded from a @json: file reference.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The parsed object, or undefined when the var is absent or the value cannot be parsed.\n */\nexport function envObject<T, U>(envVars: T, key: keyof T): U | undefined;\nexport function envObject<T, U>(envVars: T, key: keyof T, defaultValue?: U): U | undefined {\n\tconst value: unknown = envVars[key];\n\tif (Is.undefined(value)) {\n\t\treturn defaultValue;\n\t}\n\treturn Coerce.object<U>(value) ?? defaultValue;\n}\n\n/**\n * Returns an env var as a typed array. Accepts a pre-parsed array, an inline JSON array string,\n * or a value already expanded from a @json: file reference.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent or cannot be parsed.\n * @returns The parsed array, or the default when absent or the value cannot be parsed.\n */\nexport function envArray<T, U>(envVars: T, key: keyof T, defaultValue: U[]): U[];\n/**\n * Returns an env var as a typed array. Accepts a pre-parsed array, an inline JSON array string,\n * or a value already expanded from a @json: file reference.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @returns The parsed array, or undefined when the var is absent or the value cannot be parsed.\n */\nexport function envArray<T, U>(envVars: T, key: keyof T): U[] | undefined;\nexport function envArray<T, U>(envVars: T, key: keyof T, defaultValue?: U[]): U[] | undefined {\n\tconst value: unknown = envVars[key];\n\tif (Is.undefined(value)) {\n\t\treturn defaultValue;\n\t}\n\treturn Coerce.array<U>(value) ?? defaultValue;\n}\n\n/**\n * Coerces an env var that is already in seconds to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The second value, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envSeconds<T>(envVars: T, key: keyof T, defaultValue: number): number;\nexport function envSeconds<T>(envVars: T, key: keyof T): number | undefined;\nexport function envSeconds<T>(envVars: T, key: keyof T, defaultValue?: number): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that is already in minutes to an integer.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The minute value, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envMinutes<T>(envVars: T, key: keyof T, defaultValue: number): number;\nexport function envMinutes<T>(envVars: T, key: keyof T): number | undefined;\nexport function envMinutes<T>(envVars: T, key: keyof T, defaultValue?: number): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.integer(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn result;\n}\n\n/**\n * Coerces an env var that is a datetime string, throwing when the value is set but not a valid datetime.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The datetime ISO string, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to a datetime.\n */\nexport function envDateTime<T>(envVars: T, key: keyof T, defaultValue: string): string;\nexport function envDateTime<T>(envVars: T, key: keyof T): string | undefined;\nexport function envDateTime<T>(\n\tenvVars: T,\n\tkey: keyof T,\n\tdefaultValue?: string\n): string | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst result = Coerce.dateTime(value) ?? Coerce.date(value);\n\tif (Is.empty(result)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"datetime\" });\n\t}\n\treturn result.toISOString();\n}\n\n/**\n * Coerces an env var to an integer and converts from seconds to milliseconds.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The value in milliseconds, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envSecToMs<T>(envVars: T, key: keyof T, defaultValue: number): number;\nexport function envSecToMs<T>(envVars: T, key: keyof T): number | undefined;\nexport function envSecToMs<T>(envVars: T, key: keyof T, defaultValue?: number): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst n = Coerce.integer(value);\n\tif (Is.empty(n)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn n * 1000;\n}\n\n/**\n * Coerces an env var to an integer and converts from minutes to milliseconds.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to coerce.\n * @param defaultValue The value to return when the env var is absent. Omit to return undefined when absent.\n * @returns The value in milliseconds, the default, or undefined when absent and no default given.\n * @throws GeneralError if the value is set but cannot be coerced to an integer.\n */\nexport function envMinToMs<T>(envVars: T, key: keyof T, defaultValue: number): number;\nexport function envMinToMs<T>(envVars: T, key: keyof T): number | undefined;\nexport function envMinToMs<T>(envVars: T, key: keyof T, defaultValue?: number): number | undefined {\n\tconst value = envVars[key];\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\tconst n = Coerce.integer(value);\n\tif (Is.empty(n)) {\n\t\tthrow new GeneralError(\"node\", \"invalidEnvVarValue\", { key, value, type: \"integer\" });\n\t}\n\treturn n * 60_000;\n}\n\n/**\n * Converts a comma separated list to an array.\n * @param value The comma separated list.\n * @param defaultValue The default value to return when the list is empty or undefined.\n * @returns The array.\n */\nexport function commaSeparatedListToArray<U>(\n\tvalue: string | undefined,\n\tdefaultValue: U[] | undefined = []\n): U[] {\n\tif (!Is.stringValue(value)) {\n\t\treturn defaultValue;\n\t}\n\treturn value\n\t\t.split(\",\")\n\t\t.map(item => item.trim())\n\t\t.filter(item => item.length > 0) as U[];\n}\n\n/**\n * Gets named key integer pairs from an env var holding comma separated key=integer pairs.\n * @param envVars The environment variables object.\n * @param key The property name of the env var to read.\n * @returns The named key integer pairs, or undefined when the env var is absent or empty.\n * @throws GeneralError if an entry is not a unique name=value pair with an integer value.\n */\nexport function envKeyIntegerPairs<T>(\n\tenvVars: T,\n\tkey: keyof T\n): { [key: string]: number } | undefined {\n\tconst entries = commaSeparatedListToArray<string>(envVars[key] as string | undefined, undefined);\n\tif (!Is.arrayValue(entries)) {\n\t\treturn undefined;\n\t}\n\n\tconst keyValues: { [name: string]: number } = {};\n\tfor (const entry of entries) {\n\t\tconst parts = entry.split(\"=\").map(part => part.trim());\n\n\t\tconst keyPart = parts[0];\n\t\tconst valuePart = Coerce.integer(parts[1]);\n\t\tif (\n\t\t\tparts.length !== 2 ||\n\t\t\t!Is.stringValue(keyPart) ||\n\t\t\t!Is.integer(valuePart) ||\n\t\t\t!Is.undefined(keyValues[keyPart])\n\t\t) {\n\t\t\tthrow new GeneralError(\"node\", \"invalidEnvVarPair\", { key: keyPart, value: entry });\n\t\t}\n\t\tkeyValues[keyPart] = valuePart;\n\t}\n\n\treturn keyValues;\n}\n"]}
|
package/dist/es/cli.js
CHANGED
|
@@ -4,6 +4,7 @@ import { CLIDisplay } from "@twin.org/cli-core";
|
|
|
4
4
|
import { ContextIdStore } from "@twin.org/context";
|
|
5
5
|
import { Coerce, GeneralError, I18n, Is, StringHelper } from "@twin.org/core";
|
|
6
6
|
import * as dotenv from "dotenv";
|
|
7
|
+
import { commaSeparatedListToArray } from "./builders/helper/envHelpers.js";
|
|
7
8
|
import { getCommandDefinitionBootstrapDev } from "./commands/bootstrapDev.js";
|
|
8
9
|
import { getCommandDefinitionHelp } from "./commands/help.js";
|
|
9
10
|
import { getCommandDefinitionIdentityCreate } from "./commands/identityCreate.js";
|
|
@@ -213,7 +214,7 @@ export async function executeCommand(engineCore, envVars, cliCommand) {
|
|
|
213
214
|
export function processEnvOptions(processEnv, options) {
|
|
214
215
|
const inputEnv = options.find(option => option.key === "load-env")?.value;
|
|
215
216
|
if (Is.stringValue(inputEnv)) {
|
|
216
|
-
const envFiles = inputEnv
|
|
217
|
+
const envFiles = commaSeparatedListToArray(inputEnv);
|
|
217
218
|
for (const envFile of envFiles) {
|
|
218
219
|
const output = dotenv.config({
|
|
219
220
|
path: envFile,
|