@3sixty/vault-connector-hashicorp 0.20.0-next.1 → 0.20.0-next.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Copyright 2024 IOTA Stiftung.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0.
|
|
3
3
|
import { HealthCategory, HealthStatus } from "@3sixty/api-models";
|
|
4
|
-
import { AlreadyExistsError, BaseError, ComponentFactory, Converter, GeneralError, Guards, Is, LruCache, NotFoundError, RandomHelper, StringHelper } from "@3sixty/core";
|
|
4
|
+
import { AlreadyExistsError, BaseError, ComponentFactory, Converter, DurationConstants, GeneralError, Guards, Is, LruCache, NotFoundError, RandomHelper, StringHelper } from "@3sixty/core";
|
|
5
5
|
import { ChaCha20Poly1305, Ed25519 } from "@3sixty/crypto";
|
|
6
6
|
import { VaultEncryptionType, VaultKeyType } from "@3sixty/vault-models";
|
|
7
7
|
import { FetchHelper, HttpMethod } from "@3sixty/web";
|
|
@@ -46,7 +46,7 @@ export class HashicorpVaultConnector {
|
|
|
46
46
|
* The default TTL in milliseconds for cached key metadata.
|
|
47
47
|
* @internal
|
|
48
48
|
*/
|
|
49
|
-
static _DEFAULT_KEY_METADATA_CACHE_TTL_MS =
|
|
49
|
+
static _DEFAULT_KEY_METADATA_CACHE_TTL_MS = 30 * DurationConstants.MsPerSecond;
|
|
50
50
|
/**
|
|
51
51
|
* The configuration for the vault connector.
|
|
52
52
|
* @internal
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hashicorpVaultConnector.js","sources":["../../src/hashicorpVaultConnector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHealthCategory,\n\tHealthStatus,\n\ttype IHealth,\n\ttype IHealthProviderComponent\n} from \"@3sixty/api-models\";\nimport {\n\tAlreadyExistsError,\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tLruCache,\n\tNotFoundError,\n\tRandomHelper,\n\tStringHelper\n} from \"@3sixty/core\";\nimport { ChaCha20Poly1305, Ed25519 } from \"@3sixty/crypto\";\nimport type { ILoggingComponent } from \"@3sixty/logging-models\";\n\nimport { type IVaultConnector, VaultEncryptionType, VaultKeyType } from \"@3sixty/vault-models\";\nimport { FetchHelper, HttpMethod, type IHttpHeaders } from \"@3sixty/web\";\nimport type { IBackupKeyResponse } from \"./models/IBackupKeyResponse.js\";\nimport type { ICreateKeyRequest } from \"./models/ICreateKeyRequest.js\";\nimport type { IDataKeyEnvelope } from \"./models/IDataKeyEnvelope.js\";\nimport type { IDecryptDataRequest } from \"./models/IDecryptDataRequest.js\";\nimport type { IDecryptDataResponse } from \"./models/IDecryptDataResponse.js\";\nimport type { IEncryptDataRequest } from \"./models/IEncryptDataRequest.js\";\nimport type { IEncryptDataResponse } from \"./models/IEncryptDataResponse.js\";\nimport type { IExportKeyResponse } from \"./models/IExportKeyResponse.js\";\nimport type { IHashicorpVaultConnectorConfig } from \"./models/IHashicorpVaultConnectorConfig.js\";\nimport type { IHashicorpVaultConnectorConstructorOptions } from \"./models/IHashicorpVaultConnectorConstructorOptions.js\";\nimport type { IHashicorpVaultRequest } from \"./models/IHashicorpVaultRequest.js\";\nimport type { IHashicorpVaultResponse } from \"./models/IHashicorpVaultResponse.js\";\nimport type { IImportKeyRequest } from \"./models/IImportKeyRequest.js\";\nimport type { IKeyDeleteConfigResponse } from \"./models/IKeyDeleteConfigResponse.js\";\nimport type { IReadKeyResponse } from \"./models/IReadKeyResponse.js\";\nimport type { IRestoreKeyRequest } from \"./models/IRestoreKeyRequest.js\";\nimport type { ISecretData } from \"./models/ISecretData.js\";\nimport type { ISecretVersionResponse } from \"./models/ISecretVersionResponse.js\";\nimport type { ISignDataRequest } from \"./models/ISignDataRequest.js\";\nimport type { ISignDataResponse } from \"./models/ISignDataResponse.js\";\nimport type { IUpdateKeyConfigRequest } from \"./models/IUpdateKeyConfigRequest.js\";\nimport type { IVerifyDataRequest } from \"./models/IVerifyDataRequest.js\";\nimport type { IVerifyDataResponse } from \"./models/IVerifyDataResponse.js\";\n\n/**\n * Class for performing vault operations using HashiCorp Vault.\n */\nexport class HashicorpVaultConnector implements IVaultConnector, IHealthProviderComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = \"HashicorpVaultConnector\";\n\n\t/**\n\t * The namespace supported by the vault connector.\n\t */\n\tpublic static readonly NAMESPACE: string = \"hashicorp\";\n\n\t/**\n\t * The prefix to strip from keys and encrypted data.\n\t * @internal\n\t */\n\tprivate static readonly _DATA_PREFIX: string = \"vault:v1:\";\n\n\t/**\n\t * The prefix marking data encrypted under a wrapped data key.\n\t * @internal\n\t */\n\tprivate static readonly _ENVELOPE_PREFIX: Uint8Array = Converter.utf8ToBytes(\"twin:env:v1:\");\n\n\t/**\n\t * The length in bytes of a data key.\n\t * @internal\n\t */\n\tprivate static readonly _DATA_KEY_LENGTH: number = 32;\n\n\t/**\n\t * The length in bytes of a ChaCha20Poly1305 nonce.\n\t * @internal\n\t */\n\tprivate static readonly _NONCE_LENGTH: number = 12;\n\n\t/**\n\t * The length in bytes of a ChaCha20Poly1305 authentication tag.\n\t * @internal\n\t */\n\tprivate static readonly _TAG_LENGTH: number = 16;\n\n\t/**\n\t * The default TTL in milliseconds for cached key metadata.\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_KEY_METADATA_CACHE_TTL_MS: number = 30000;\n\n\t/**\n\t * The configuration for the vault connector.\n\t * @internal\n\t */\n\tprivate readonly _config: IHashicorpVaultConnectorConfig;\n\n\t/**\n\t * The KV mount path.\n\t * @internal\n\t */\n\tprivate readonly _kvMountPath: string;\n\n\t/**\n\t * The transit mount path.\n\t * @internal\n\t */\n\tprivate readonly _transitMountPath: string;\n\n\t/**\n\t * The base URL for the Vault API.\n\t * @internal\n\t */\n\tprivate readonly _baseUrl: string;\n\n\t/**\n\t * The request options for fetch calls.\n\t * @internal\n\t */\n\tprivate readonly _requestOptions: { headers: IHttpHeaders; timeoutMs?: number };\n\n\t/**\n\t * A prefix for the keys stored in the vault.\n\t * @internal\n\t */\n\tprivate readonly _prefix?: string;\n\n\t/**\n\t * The TTL in milliseconds for cached key metadata.\n\t * @internal\n\t */\n\tprivate readonly _keyMetadataCacheTtlMs: number;\n\n\t/**\n\t * Cache of key metadata by key name, undefined when caching is disabled.\n\t * @internal\n\t */\n\tprivate _keyMetadataCache?: LruCache<IReadKeyResponse>;\n\n\t/**\n\t * Create a new instance of HashicorpVaultConnector.\n\t * @param options The options for the vault connector.\n\t */\n\tconstructor(options: IHashicorpVaultConnectorConstructorOptions) {\n\t\tGuards.object(HashicorpVaultConnector.CLASS_NAME, \"options\", options);\n\t\tGuards.object<IHashicorpVaultConnectorConfig>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"options.config\",\n\t\t\toptions.config\n\t\t);\n\t\tGuards.stringValue(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"options.config.endpoint\",\n\t\t\toptions.config.endpoint\n\t\t);\n\t\tGuards.stringValue(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"options.config.token\",\n\t\t\toptions.config.token\n\t\t);\n\n\t\tthis._config = options.config;\n\t\tthis._kvMountPath = this._config.kvMountPath ?? \"secret\";\n\t\tthis._transitMountPath = this._config.transitMountPath ?? \"transit\";\n\t\tthis._baseUrl = `${StringHelper.trimTrailingSlashes(this._config.endpoint)}/${this._config.apiVersion ?? \"v1\"}`;\n\t\tconst headers: IHttpHeaders = {\n\t\t\t\"X-Vault-Token\": this._config.token\n\t\t};\n\t\tif (Is.stringValue(this._config.namespace)) {\n\t\t\theaders[\"X-Vault-Namespace\"] = this._config.namespace;\n\t\t}\n\t\tthis._requestOptions = {\n\t\t\theaders,\n\t\t\ttimeoutMs: this._config.timeoutMs\n\t\t};\n\t\tthis._prefix = this._config.prefix;\n\t\tthis._keyMetadataCacheTtlMs =\n\t\t\tthis._config.keyMetadataCacheTtlMs ??\n\t\t\tHashicorpVaultConnector._DEFAULT_KEY_METADATA_CACHE_TTL_MS;\n\t\tthis._keyMetadataCache =\n\t\t\tthis._keyMetadataCacheTtlMs > 0\n\t\t\t\t? new LruCache<IReadKeyResponse>({ ttiMs: this._keyMetadataCacheTtlMs })\n\t\t\t\t: undefined;\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn HashicorpVaultConnector.CLASS_NAME;\n\t}\n\n\t/**\n\t * Returns the health status of the component.\n\t * @returns The health status of the component.\n\t */\n\tpublic async health(): Promise<IHealth[]> {\n\t\tconst endpoint = `${this._baseUrl}/sys/health`;\n\t\ttry {\n\t\t\tawait FetchHelper.fetch(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\tendpoint,\n\t\t\t\tHttpMethod.GET,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Connectivity,\n\t\t\t\t\tstatus: HealthStatus.Ok,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tdata: { endpoint }\n\t\t\t\t}\n\t\t\t];\n\t\t} catch {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Connectivity,\n\t\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tmessage: \"vaultHealthCheckFailed\",\n\t\t\t\t\tdata: { endpoint }\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t}\n\n\t/**\n\t * Bootstrap the vault connector and ensure connectivity.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t * @returns True if the bootstrapping process was successful.\n\t */\n\tpublic async bootstrap(nodeLoggingComponentType?: string): Promise<boolean> {\n\t\tconst nodeLogging = ComponentFactory.getIfExists<ILoggingComponent>(nodeLoggingComponentType);\n\n\t\ttry {\n\t\t\tawait FetchHelper.fetch(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t`${this._baseUrl}/sys/health`,\n\t\t\t\tHttpMethod.GET,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\n\t\t\tawait nodeLogging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"hashicorpVaultConnected\",\n\t\t\t\tdata: {\n\t\t\t\t\taddress: this._config.endpoint\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tawait nodeLogging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"hashicorpVaultConnectionFailed\",\n\t\t\t\terror: BaseError.fromError(err),\n\t\t\t\tdata: {\n\t\t\t\t\taddress: this._config.endpoint\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Store a secret in the vault.\n\t * @param name The name of the item in the vault to set.\n\t * @param data The item to add to the vault.\n\t * @returns A promise that resolves when the secret has been stored.\n\t */\n\tpublic async setSecret<T>(name: string, data: T): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.defined(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\t\t\tconst payload = {\n\t\t\t\tdata: {\n\t\t\t\t\tsecret: data\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<IHashicorpVaultRequest<T>, unknown>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"setSecretFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the component and release the key metadata cache.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t * @returns A promise that resolves when the component has stopped.\n\t */\n\tpublic async stop(nodeLoggingComponentType?: string): Promise<void> {\n\t\tthis._keyMetadataCache?.destroy();\n\t\tthis._keyMetadataCache = undefined;\n\t}\n\n\t/**\n\t * Check if a secret exists in the vault.\n\t * @param name The name of the secret to check.\n\t * @returns True if the secret exists, false otherwise.\n\t */\n\tpublic async secretExists(name: string): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tawait this.getSecretVersions(name);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Get a secret from the vault.\n\t * @param name The name of the item in the vault to get.\n\t * @returns The item from the vault.\n\t * @throws Error if the item is not found.\n\t */\n\tpublic async getSecret<T>(name: string): Promise<T> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tawait this.getSecretVersions(name);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst response = await FetchHelper.fetchJson<never, IHashicorpVaultResponse<ISecretData<T>>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.GET,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\n\t\t\treturn response.data.data.secret;\n\t\t} catch (err) {\n\t\t\tif (\n\t\t\t\tIs.object<{ properties?: { httpStatus?: number } }>(err) &&\n\t\t\t\terr.properties?.httpStatus === 404\n\t\t\t) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\t\"secretNotFound\",\n\t\t\t\t\tname,\n\t\t\t\t\tundefined,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"setSecretFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a secret from the vault.\n\t * @param name The name of the item in the vault to remove.\n\t * @returns A promise that resolves when the secret has been removed.\n\t * @throws Error if the item is not found.\n\t */\n\tpublic async removeSecret(name: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tawait this.getSecretVersions(name);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretMetadataPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tawait FetchHelper.fetchJson<never, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.DELETE,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"removeSecretFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Generate a new key and store it in the vault.\n\t * @param name The name of the key to generate and store in the vault.\n\t * @param type The type of key to create.\n\t * @returns The public key for the key pair.\n\t */\n\tpublic async createKey(name: string, type: VaultKeyType): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultKeyType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"type\",\n\t\t\ttype,\n\t\t\tObject.values(VaultKeyType)\n\t\t);\n\n\t\tconst path = this.getTransitKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\t// Check if the key exists\n\t\t\tconst existingVaultKey = await this.readKey(name);\n\t\t\tif (existingVaultKey) {\n\t\t\t\tthrow new AlreadyExistsError(HashicorpVaultConnector.CLASS_NAME, \"keyAlreadyExists\", name);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (!BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst vaultKeyType = this.mapVaultKeyType(type);\n\n\t\t\tconst payload: ICreateKeyRequest = {\n\t\t\t\ttype: vaultKeyType,\n\t\t\t\texportable: true,\n\t\t\t\tallow_plaintext_backup: true // eslint-disable-line camelcase\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<ICreateKeyRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\n\t\t\t// If the key is asymmetric, return the public key\n\t\t\tif (this.isAsymmetricKeyType(type)) {\n\t\t\t\tconst publicKey = await this.exportKey(name, \"public-key\");\n\t\t\t\treturn publicKey.key;\n\t\t\t}\n\n\t\t\t// If the key is symmetric, return the encryption key\n\t\t\tconst symmetricKey = await this.exportKey(name, \"encryption-key\");\n\t\t\treturn symmetricKey.key;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, AlreadyExistsError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"createKeyFailed\",\n\t\t\t\t{ name, type },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add an existing key to the vault.\n\t * @param name The name of the key to add to the vault.\n\t * @param type The type of key to add.\n\t * @param privateKey The private key.\n\t * @param publicKey The public key, can be undefined if the key type is symmetric.\n\t * @returns A promise that resolves when the key has been stored.\n\t */\n\tpublic async addKey(\n\t\tname: string,\n\t\ttype: VaultKeyType,\n\t\tprivateKey: Uint8Array,\n\t\tpublicKey?: Uint8Array\n\t): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultKeyType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"type\",\n\t\t\ttype,\n\t\t\tObject.values(VaultKeyType)\n\t\t);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"privateKey\", privateKey);\n\n\t\ttry {\n\t\t\t// Check if the key exists\n\t\t\tconst existingVaultKey = await this.readKey(name);\n\t\t\tif (existingVaultKey) {\n\t\t\t\tthrow new AlreadyExistsError(HashicorpVaultConnector.CLASS_NAME, \"keyAlreadyExists\", name);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (!BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst internalType = this.mapVaultKeyTypeToIndex(type);\n\n\t\t\tlet publicKeyForPayload: string | null = null;\n\t\t\tlet privateKeyForPayload: string | null = null;\n\n\t\t\tif (type === VaultKeyType.Ed25519 || type === VaultKeyType.ChaCha20Poly1305) {\n\t\t\t\tconst combinedKey = new Uint8Array(privateKey.length + (publicKey?.length ?? 0));\n\t\t\t\tcombinedKey.set(privateKey);\n\t\t\t\tif (publicKey) {\n\t\t\t\t\tcombinedKey.set(publicKey, privateKey.length);\n\t\t\t\t}\n\t\t\t\tprivateKeyForPayload = Converter.bytesToBase64(combinedKey);\n\t\t\t\tif (!Is.undefined(publicKey)) {\n\t\t\t\t\tpublicKeyForPayload = Converter.bytesToBase64(publicKey);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst payload = {\n\t\t\t\tpolicy: {\n\t\t\t\t\tname,\n\t\t\t\t\tkeys: {\n\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\tkey: privateKeyForPayload,\n\t\t\t\t\t\t\thmac_key: Converter.bytesToBase64(RandomHelper.generate(32)), // eslint-disable-line camelcase\n\t\t\t\t\t\t\tpublic_key: publicKeyForPayload // eslint-disable-line camelcase\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\texportable: true,\n\t\t\t\t\tallow_plaintext_backup: true, // eslint-disable-line camelcase\n\t\t\t\t\tmin_decryption_version: 1, // eslint-disable-line camelcase\n\t\t\t\t\tmin_encryption_version: 0, // eslint-disable-line camelcase\n\t\t\t\t\tlatest_version: 1, // eslint-disable-line camelcase\n\t\t\t\t\ttype: internalType\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst json = JSON.stringify(payload);\n\n\t\t\tconst backup = Converter.bytesToBase64(Converter.utf8ToBytes(json));\n\n\t\t\tawait this.restoreKey(name, backup);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, AlreadyExistsError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"addKeyFailed\",\n\t\t\t\t{ name, type },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a key from the vault.\n\t * @param name The name of the key to get.\n\t * @param components Which key components to return, defaults to \"both\".\n\t * @returns The key, publicKey can be undefined if key is symmetric, privateKey can be undefined if only public was requested.\n\t * @throws GeneralError if \"private\" is requested for a symmetric key.\n\t */\n\tpublic async getKey(\n\t\tname: string,\n\t\tcomponents?: \"public\" | \"private\" | \"both\"\n\t): Promise<{\n\t\t/**\n\t\t * The type of the key e.g. Ed25519.\n\t\t */\n\t\ttype: VaultKeyType;\n\n\t\t/**\n\t\t * The private key, undefined if only public component was requested.\n\t\t */\n\t\tprivateKey?: Uint8Array;\n\n\t\t/**\n\t\t * The public key, which can be undefined if key type is symmetric or only private was requested.\n\t\t */\n\t\tpublicKey?: Uint8Array;\n\t}> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tcomponents ??= \"both\";\n\n\t\tGuards.arrayOneOf<\"public\" | \"private\" | \"both\">(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"components\",\n\t\t\tcomponents,\n\t\t\t[\"public\", \"private\", \"both\"]\n\t\t);\n\n\t\tconst keyDetails = await this.readKeyCached(name);\n\n\t\tconst type = this.mapHashicorpKeyType(keyDetails.type);\n\t\tconst isAsymmetric = this.isAsymmetricKeyType(type);\n\n\t\tif (!isAsymmetric && components === \"private\") {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"symmetricKeyHasNoPrivateKey\", {\n\t\t\t\tname\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tlet publicKey: Uint8Array | undefined;\n\t\t\tlet privateKey: Uint8Array | undefined;\n\n\t\t\tif (isAsymmetric) {\n\t\t\t\tif (components !== \"public\") {\n\t\t\t\t\tconst privateKeyData = await this.exportKey(name, \"signing-key\");\n\t\t\t\t\tprivateKey = privateKeyData.key;\n\t\t\t\t}\n\t\t\t\tif (components !== \"private\") {\n\t\t\t\t\tconst publicKeyData = await this.exportKey(name, \"public-key\");\n\t\t\t\t\tpublicKey = publicKeyData.key;\n\t\t\t\t}\n\t\t\t} else if (components !== \"public\") {\n\t\t\t\tconst privateKeyData = await this.exportKey(name, \"encryption-key\");\n\t\t\t\tprivateKey = privateKeyData.key;\n\t\t\t}\n\n\t\t\treturn { type, privateKey, publicKey };\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"getKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Check if a key exists in the vault.\n\t * @param name The name of the key to check.\n\t * @returns True if the key exists, false otherwise.\n\t */\n\tpublic async keyExists(name: string): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tawait this.readKey(name);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Get the type of a key from the vault without retrieving the key material.\n\t * @param name The name of the key.\n\t * @returns The key type.\n\t * @throws NotFoundError if the key does not exist.\n\t */\n\tpublic async getKeyType(name: string): Promise<VaultKeyType> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tconst keyDetails = await this.readKeyCached(name);\n\n\t\treturn this.mapHashicorpKeyType(keyDetails.type);\n\t}\n\n\t/**\n\t * Rename a key in the vault.\n\t * @param name The name of the key to rename.\n\t * @param newName The new name of the key.\n\t * @returns A promise that resolves when the key has been renamed.\n\t */\n\tpublic async renameKey(name: string, newName: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"newName\", newName);\n\n\t\tawait this.readKey(name);\n\n\t\tlet existingVaultKey;\n\t\ttry {\n\t\t\texistingVaultKey = await this.readKey(newName);\n\t\t} catch (err) {\n\t\t\tif (!BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t\tif (existingVaultKey) {\n\t\t\tthrow new AlreadyExistsError(HashicorpVaultConnector.CLASS_NAME, \"keyAlreadyExists\", newName);\n\t\t}\n\n\t\ttry {\n\t\t\tconst backup = await this.backupKey(name);\n\t\t\tawait this.restoreKey(newName, backup);\n\t\t\tawait this.removeKey(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"renameKeyFailed\",\n\t\t\t\t{ name, newName },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a key from the vault.\n\t * @param name The name of the key to remove.\n\t * @returns A promise that resolves when the key has been removed.\n\t */\n\tpublic async removeKey(name: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tawait this.readKey(name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitKeyPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tawait this.updateKeyConfig(name, true);\n\n\t\t\tawait FetchHelper.fetch(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.DELETE,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"removeKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Sign data.\n\t * @param name The name of the key to use.\n\t * @param data The data to sign.\n\t * @returns The signature.\n\t */\n\tpublic async sign(name: string, data: Uint8Array): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\n\t\tawait this.readKeyCached(name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitSignPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst base64Data = Converter.bytesToBase64(data);\n\n\t\t\tconst payload = {\n\t\t\t\tinput: base64Data\n\t\t\t};\n\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tISignDataRequest,\n\t\t\t\tIHashicorpVaultResponse<ISignDataResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\t\tif (response?.data?.signature) {\n\t\t\t\tconst signatureString = response.data.signature;\n\n\t\t\t\tconst cleanedSignature = signatureString.startsWith(HashicorpVaultConnector._DATA_PREFIX)\n\t\t\t\t\t? signatureString.slice(HashicorpVaultConnector._DATA_PREFIX.length)\n\t\t\t\t\t: signatureString;\n\n\t\t\t\tconst signatureBytes = Converter.base64ToBytes(cleanedSignature);\n\t\t\t\treturn signatureBytes;\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidSignResponse\", { name });\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"signDataFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a signature.\n\t * @param name The name of the key to use.\n\t * @param data The data to verify.\n\t * @param signature The signature to verify.\n\t * @returns True if the signature is valid.\n\t */\n\tpublic async verify(name: string, data: Uint8Array, signature: Uint8Array): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"signature\", signature);\n\n\t\tawait this.readKeyCached(name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitVerifyPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst base64Data = Converter.bytesToBase64(data);\n\t\t\tconst signatureBase64 = Converter.bytesToBase64(signature);\n\n\t\t\tconst prefixedSignature = `${HashicorpVaultConnector._DATA_PREFIX}${signatureBase64}`;\n\n\t\t\tconst payload = {\n\t\t\t\tinput: base64Data,\n\t\t\t\tsignature: prefixedSignature\n\t\t\t};\n\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tIVerifyDataRequest,\n\t\t\t\tIHashicorpVaultResponse<IVerifyDataResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\t\tif (response?.data?.valid) {\n\t\t\t\treturn response.data.valid;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"verifyDataFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Encrypt data locally under a data key wrapped by the transit key.\n\t * @param name The name of the key to use.\n\t * @param encryptionType The type of encryption to use.\n\t * @param data The data to encrypt.\n\t * @returns The encrypted data.\n\t */\n\tpublic async encrypt(\n\t\tname: string,\n\t\tencryptionType: VaultEncryptionType,\n\t\tdata: Uint8Array\n\t): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultEncryptionType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"encryptionType\",\n\t\t\tencryptionType,\n\t\t\tObject.values(VaultEncryptionType)\n\t\t);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\n\t\tconst keyDetails = await this.readKeyCached(name);\n\n\t\tif (\n\t\t\tencryptionType === VaultEncryptionType.ChaCha20Poly1305 &&\n\t\t\tkeyDetails.type !== this.mapVaultKeyType(VaultKeyType.ChaCha20Poly1305)\n\t\t) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"keyTypeMismatch\", {\n\t\t\t\tencryptionType,\n\t\t\t\tkeyType: keyDetails.type\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst dataKey = RandomHelper.generate(HashicorpVaultConnector._DATA_KEY_LENGTH);\n\t\t\tconst wrappedKey = await this.transitEncrypt(name, dataKey);\n\t\t\tconst header = this.buildEnvelopeHeader(wrappedKey);\n\t\t\tconst nonce = RandomHelper.generate(HashicorpVaultConnector._NONCE_LENGTH);\n\t\t\tconst payload = new ChaCha20Poly1305(dataKey, nonce, header).encrypt(data);\n\t\t\tdataKey.fill(0);\n\n\t\t\tconst envelope = new Uint8Array(header.length + nonce.length + payload.length);\n\t\t\tenvelope.set(header);\n\t\t\tenvelope.set(nonce, header.length);\n\t\t\tenvelope.set(payload, header.length + nonce.length);\n\t\t\treturn envelope;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"encryptDataFailed\",\n\t\t\t\t{ name, encryptionType },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Decrypt data, either an envelope or data encrypted directly by the transit key.\n\t * @param name The name of the key to use.\n\t * @param encryptionType The type of encryption to use.\n\t * @param encryptedData The encrypted data to decrypt.\n\t * @returns The decrypted data.\n\t */\n\tpublic async decrypt(\n\t\tname: string,\n\t\tencryptionType: VaultEncryptionType,\n\t\tencryptedData: Uint8Array\n\t): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultEncryptionType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"encryptionType\",\n\t\t\tencryptionType,\n\t\t\tObject.values(VaultEncryptionType)\n\t\t);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"encryptedData\", encryptedData);\n\n\t\tawait this.readKeyCached(name);\n\n\t\ttry {\n\t\t\tif (!this.hasEnvelopePrefix(encryptedData)) {\n\t\t\t\treturn await this.transitDecrypt(\n\t\t\t\t\tname,\n\t\t\t\t\t`${HashicorpVaultConnector._DATA_PREFIX}${Converter.bytesToBase64(encryptedData)}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst envelope = this.parseEnvelope(encryptedData);\n\t\t\tconst dataKey = await this.transitDecrypt(name, envelope.wrappedKey);\n\t\t\tconst decrypted = new ChaCha20Poly1305(dataKey, envelope.nonce, envelope.header).decrypt(\n\t\t\t\tenvelope.payload\n\t\t\t);\n\t\t\tdataKey.fill(0);\n\t\t\treturn decrypted;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"decryptDataFailed\",\n\t\t\t\t{ name, encryptionType },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the versions of a secret.\n\t * @param name The name of the secret.\n\t * @returns The versions of the secret.\n\t * @throws Error if the secret is not found.\n\t */\n\tpublic async getSecretVersions(name: string): Promise<number[]> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tconst versions = await this.fetchSecretVersions(name);\n\t\t\treturn versions;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"getSecretVersionsFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update the configuration of a key.\n\t * @param name The name of the key to update.\n\t * @param deletionAllowed Whether the key can be deleted.\n\t * @param exportable Whether the key can be exported.\n\t * @returns A promise that resolves when the key configuration has been updated.\n\t */\n\tpublic async updateKeyConfig(\n\t\tname: string,\n\t\tdeletionAllowed?: boolean,\n\t\texportable?: boolean\n\t): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitKeyConfigPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst payload = {\n\t\t\t\tdeletion_allowed: deletionAllowed, // eslint-disable-line camelcase\n\t\t\t\texportable\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<IUpdateKeyConfigRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"updateKeyConfigFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Backup a key from the vault.\n\t * @param name The name of the key to backup.\n\t * @returns The Base64-encoded backup payload.\n\t * @throws Error if the key cannot be exported or found.\n\t */\n\tpublic async backupKey(name: string): Promise<string> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tconst path = this.getTransitBackupKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IBackupKeyResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data?.backup) {\n\t\t\t\tconst backup = response.data.backup;\n\t\t\t\treturn backup;\n\t\t\t}\n\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"backupKeyNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"backupKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Restore a key to the vault.\n\t * @param name The name of the key to restore.\n\t * @param backup The Base64-encoded backup payload.\n\t * @returns A promise that resolves when the key has been restored.\n\t * @throws Error if the key cannot be restored.\n\t */\n\tpublic async restoreKey(name: string, backup: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"backup\", backup);\n\n\t\tconst path = this.getTransitRestoreKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst payload = { backup };\n\n\t\t\tawait FetchHelper.fetchJson<IRestoreKeyRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"restoreKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Import a key to the vault.\n\t * @param name The name of the key to import.\n\t * @param type The type of key to import, e.g. \"ed25519\".\n\t * @param privateKeyPem The PEM bundle of the key to import.\n\t * @returns A promise that resolves when the key has been imported.\n\t * @throws Error if the key cannot be imported.\n\t */\n\tpublic async importKey(name: string, type: string, privateKeyPem: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"privateKeyPem\", privateKeyPem);\n\n\t\tconst path = this.getTransitImportKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst payload = {\n\t\t\t\ttype,\n\t\t\t\tkey: Converter.bytesToBase58(Converter.utf8ToBytes(privateKeyPem)),\n\t\t\t\texportable: true,\n\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\tallow_plaintext_backup: true\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<IImportKeyRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"importKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Export the key from the vault.\n\t * @param name The name of the key.\n\t * @param keyPath The path of the key. Defaults to \"signing-key\".\n\t * @param version The version of the key. If omitted, all versions of the key will be returned.\n\t * @returns The key details.\n\t * @throws Error if the key cannot be exported or found.\n\t */\n\tpublic async exportKey(\n\t\tname: string,\n\t\tkeyPath: \"signing-key\" | \"encryption-key\" | \"public-key\",\n\t\tversion?: string\n\t): Promise<{\n\t\t/**\n\t\t * The type of the key e.g. Ed25519.\n\t\t */\n\t\ttype: VaultKeyType;\n\n\t\t/**\n\t\t * The key.\n\t\t */\n\t\tkey: Uint8Array;\n\n\t\t/**\n\t\t * The name of the key.\n\t\t */\n\t\tname: string;\n\t}> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tconst versionPath = version ? `${version}` : \"latest\";\n\n\t\tconst path = this.getTransitExportKeyPath(name, keyPath);\n\t\tconst url = `${this._baseUrl}/${path}/${versionPath}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IExportKeyResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data) {\n\t\t\t\tconst { keys, type } = response.data;\n\t\t\t\tconst keyVersion = Object.keys(keys)[0];\n\t\t\t\tlet key;\n\n\t\t\t\tconst keyType = this.mapHashicorpKeyType(type);\n\t\t\t\tif (keyType === VaultKeyType.Ed25519) {\n\t\t\t\t\tkey = Converter.base64ToBytes(keys[keyVersion]).slice(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tkeyPath === \"public-key\" ? Ed25519.PUBLIC_KEY_SIZE : Ed25519.PRIVATE_KEY_SIZE\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// VaultKeyType.ChaCha20Poly1305\n\t\t\t\t\tkey = Converter.base64ToBytes(keys[keyVersion]);\n\t\t\t\t}\n\n\t\t\t\tconst keyData = {\n\t\t\t\t\ttype: keyType,\n\t\t\t\t\tkey,\n\t\t\t\t\tname: response?.data?.name\n\t\t\t\t};\n\n\t\t\t\treturn keyData;\n\t\t\t}\n\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"exportKeyNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"exportKeyFailed\",\n\t\t\t\t{ name, keyPath },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the key configuration.\n\t * @param name The name of the key to get the configuration for.\n\t * @returns True if the key can be deleted.\n\t */\n\tpublic async getKeyDeleteConfiguration(name: string): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tconst path = this.getTransitKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IKeyDeleteConfigResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\treturn response.data.deletion_allowed;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"getKeyDeleteConfigurationFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Read key information from the vault.\n\t * @param name The name of the key.\n\t * @returns An object containing key information.\n\t * @internal\n\t */\n\tprivate async readKey(name: string): Promise<IReadKeyResponse> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tconst path = this.getTransitKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IReadKeyResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data?.name) {\n\t\t\t\tconst keyName = response.data.name;\n\t\t\t\treturn { name: keyName, type: response.data.type };\n\t\t\t}\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"keyNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (this.isHttpNotFoundError(err)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\t\"keyNotFound\",\n\t\t\t\t\tname,\n\t\t\t\t\tundefined,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"invalidReadKeyResponse\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Read key metadata, served from the cache when it is enabled.\n\t * @param name The name of the key.\n\t * @returns An object containing key information.\n\t * @internal\n\t */\n\tprivate async readKeyCached(name: string): Promise<IReadKeyResponse> {\n\t\tconst cached = this._keyMetadataCache?.get(name);\n\t\tif (!Is.undefined(cached)) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst keyDetails = await this.readKey(name);\n\t\tthis._keyMetadataCache?.set(name, keyDetails, Date.now() + this._keyMetadataCacheTtlMs);\n\t\treturn keyDetails;\n\t}\n\n\t/**\n\t * Encrypt bytes with the transit key.\n\t * @param name The name of the key.\n\t * @param data The bytes to encrypt.\n\t * @returns The transit ciphertext including its version prefix.\n\t * @internal\n\t */\n\tprivate async transitEncrypt(name: string, data: Uint8Array): Promise<string> {\n\t\tconst url = `${this._baseUrl}/${this.getTransitEncryptPath(name)}`;\n\t\tconst payload = { plaintext: Converter.bytesToBase64(data) };\n\n\t\tconst response = await FetchHelper.fetchJson<\n\t\t\tIEncryptDataRequest,\n\t\t\tIHashicorpVaultResponse<IEncryptDataResponse>\n\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\tif (Is.stringValue(response?.data?.ciphertext)) {\n\t\t\treturn response.data.ciphertext;\n\t\t}\n\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidEncryptResponse\", { name });\n\t}\n\n\t/**\n\t * Decrypt a transit ciphertext with the transit key.\n\t * @param name The name of the key.\n\t * @param ciphertext The transit ciphertext including its version prefix.\n\t * @returns The decrypted bytes.\n\t * @internal\n\t */\n\tprivate async transitDecrypt(name: string, ciphertext: string): Promise<Uint8Array> {\n\t\tconst url = `${this._baseUrl}/${this.getTransitDecryptPath(name)}`;\n\t\tconst payload = { ciphertext };\n\n\t\tconst response = await FetchHelper.fetchJson<\n\t\t\tIDecryptDataRequest,\n\t\t\tIHashicorpVaultResponse<IDecryptDataResponse>\n\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\tif (Is.stringValue(response?.data?.plaintext)) {\n\t\t\treturn Converter.base64ToBytes(response.data.plaintext);\n\t\t}\n\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidDecryptResponse\", { name });\n\t}\n\n\t/**\n\t * Check whether the data starts with the envelope prefix.\n\t * @param data The data to check.\n\t * @returns True if the data is an envelope.\n\t * @internal\n\t */\n\tprivate hasEnvelopePrefix(data: Uint8Array): boolean {\n\t\treturn HashicorpVaultConnector._ENVELOPE_PREFIX.every((byte, index) => data[index] === byte);\n\t}\n\n\t/**\n\t * Build the envelope header, the prefix followed by the length prefixed wrapped data key.\n\t * @param wrappedKey The transit ciphertext of the data key.\n\t * @returns The header bytes.\n\t * @internal\n\t */\n\tprivate buildEnvelopeHeader(wrappedKey: string): Uint8Array {\n\t\tconst prefix = HashicorpVaultConnector._ENVELOPE_PREFIX;\n\t\tconst wrappedBytes = Converter.utf8ToBytes(wrappedKey);\n\t\tconst header = new Uint8Array(prefix.length + 2 + wrappedBytes.length);\n\t\theader.set(prefix);\n\t\tnew DataView(header.buffer).setUint16(prefix.length, wrappedBytes.length);\n\t\theader.set(wrappedBytes, prefix.length + 2);\n\t\treturn header;\n\t}\n\n\t/**\n\t * Split an envelope into its header, wrapped data key, nonce and payload.\n\t * @param envelope The envelope bytes.\n\t * @returns The envelope parts.\n\t * @throws GeneralError if the envelope is shorter than its header declares.\n\t * @internal\n\t */\n\tprivate parseEnvelope(envelope: Uint8Array): IDataKeyEnvelope {\n\t\tconst lengthOffset = HashicorpVaultConnector._ENVELOPE_PREFIX.length;\n\t\tconst wrappedLength =\n\t\t\tenvelope.length >= lengthOffset + 2\n\t\t\t\t? new DataView(envelope.buffer, envelope.byteOffset).getUint16(lengthOffset)\n\t\t\t\t: 0;\n\t\tconst headerLength = lengthOffset + 2 + wrappedLength;\n\t\tconst payloadOffset = headerLength + HashicorpVaultConnector._NONCE_LENGTH;\n\n\t\tif (envelope.length < payloadOffset + HashicorpVaultConnector._TAG_LENGTH) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidEnvelope\", {\n\t\t\t\tlength: envelope.length\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\theader: envelope.slice(0, headerLength),\n\t\t\twrappedKey: Converter.bytesToUtf8(envelope, lengthOffset + 2, wrappedLength),\n\t\t\tnonce: envelope.slice(headerLength, payloadOffset),\n\t\t\tpayload: envelope.slice(payloadOffset)\n\t\t};\n\t}\n\n\t/**\n\t * Determine whether an error is a framework missing-key error.\n\t * @param err The error to inspect.\n\t * @returns True if the error is a NotFoundError.\n\t * @internal\n\t */\n\t/**\n\t * Determine whether a Vault request reported a missing key.\n\t * @param err The error to inspect.\n\t * @returns True if the error has an HTTP 404 status.\n\t * @internal\n\t */\n\tprivate isHttpNotFoundError(err: unknown): boolean {\n\t\treturn (\n\t\t\tIs.object<{ properties?: { httpStatus?: number } }>(err) && err.properties?.httpStatus === 404\n\t\t);\n\t}\n\n\t/**\n\t * Map the vault key type to the hashicorp type.\n\t * @param type The vault key type.\n\t * @returns The hashicorp type as a string.\n\t * @throws Error if the key type is not supported.\n\t * @internal\n\t */\n\tprivate mapVaultKeyType(type: VaultKeyType): string {\n\t\tswitch (type) {\n\t\t\tcase VaultKeyType.Ed25519:\n\t\t\t\treturn \"ed25519\";\n\t\t\tcase VaultKeyType.ChaCha20Poly1305:\n\t\t\t\treturn \"chacha20-poly1305\";\n\t\t\tdefault:\n\t\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"unsupportedKeyType\", { type });\n\t\t}\n\t}\n\n\t/**\n\t * Map the vault key type to the hashicorp type index.\n\t * @param type The vault key type.\n\t * @returns The hashicorp type as a string.\n\t * @throws Error if the key type is not supported.\n\t * @internal\n\t */\n\tprivate mapVaultKeyTypeToIndex(type: VaultKeyType): number {\n\t\t// https://github.com/hashicorp/vault/blob/7d89f7104ed6c98e06ca2c75da20c9ef1b113831/sdk/helper/keysutil/policy.go#L58\n\t\tswitch (type) {\n\t\t\tcase VaultKeyType.Ed25519:\n\t\t\t\treturn 2;\n\t\t\tcase VaultKeyType.ChaCha20Poly1305:\n\t\t\t\treturn 5;\n\t\t\tdefault:\n\t\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"unsupportedKeyType\", { type });\n\t\t}\n\t}\n\n\t/**\n\t * Map the hashicorp key type to the vault type.\n\t * @param type The hashicorp key type.\n\t * @returns The vault key type.\n\t * @throws Error if the key type is not supported.\n\t * @internal\n\t */\n\tprivate mapHashicorpKeyType(type: string): VaultKeyType {\n\t\tswitch (type) {\n\t\t\tcase \"ed25519\":\n\t\t\t\treturn VaultKeyType.Ed25519;\n\t\t\tcase \"chacha20-poly1305\":\n\t\t\t\treturn VaultKeyType.ChaCha20Poly1305;\n\t\t\tdefault:\n\t\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"unsupportedKeyType\", { type });\n\t\t}\n\t}\n\n\t/**\n\t * Check if the key type is asymmetric.\n\t * @param type The key type.\n\t * @returns True if the key type is asymmetric.\n\t * @internal\n\t */\n\tprivate isAsymmetricKeyType(type: VaultKeyType): boolean {\n\t\tswitch (type) {\n\t\t\tcase VaultKeyType.Ed25519:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Fetch the versions of a secret.\n\t * @param name The name of the secret.\n\t * @returns The versions of the secret.\n\t * @throws Error if the secret is not found.\n\t * @internal\n\t */\n\tprivate async fetchSecretVersions(name: string): Promise<number[]> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretMetadataPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<ISecretVersionResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data?.versions) {\n\t\t\t\tconst versions = Object.keys(response.data.versions).map(Number);\n\t\t\t\treturn versions;\n\t\t\t}\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"secretNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (this.isHttpNotFoundError(err)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\t\"secretNotFound\",\n\t\t\t\t\tname,\n\t\t\t\t\tundefined,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"getSecretVersionsFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Encode the name parameter.\n\t * @param name The name to encode.\n\t * @returns The encoded name.\n\t * @internal\n\t */\n\tprivate getEncodedName(name: string): string {\n\t\tconst safeName = name.replace(/[^\\dA-Za-z-]/g, \"_\").replace(/[_-]+$/, \"\");\n\n\t\treturn Is.stringValue(this._prefix)\n\t\t\t? `${encodeURIComponent(this._prefix)}_${safeName}`\n\t\t\t: safeName;\n\t}\n\n\t/**\n\t * Get the path for a secret.\n\t * @param name The name of the secret.\n\t * @returns The path for the secret.\n\t * @internal\n\t */\n\tprivate getSecretPath(name: string): string {\n\t\treturn `${this._kvMountPath}/data/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for the metadata of a secret.\n\t * @param name The name of the secret.\n\t * @returns The path for the metadata of the secret.\n\t * @internal\n\t */\n\tprivate getSecretMetadataPath(name: string): string {\n\t\treturn `${this._kvMountPath}/metadata/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the key.\n\t * @internal\n\t */\n\tprivate getTransitKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/keys/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for exporting a Transit key.\n\t * @param name The name of the key.\n\t * @param keyType The type of the key.\n\t * @returns The path for exporting the key.\n\t * @internal\n\t */\n\tprivate getTransitExportKeyPath(name: string, keyType: string): string {\n\t\treturn `${this._transitMountPath}/export/${keyType}/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for the Transit key config.\n\t * @param name The name of the key to update.\n\t * @returns The path for the key config.\n\t * @internal\n\t */\n\tprivate getTransitKeyConfigPath(name: string): string {\n\t\treturn `${this._transitMountPath}/keys/${this.getEncodedName(name)}/config`;\n\t}\n\n\t/**\n\t * Get the path to backup a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the backup key.\n\t * @internal\n\t */\n\tprivate getTransitBackupKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/backup/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for restoring a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the restore key.\n\t * @internal\n\t */\n\tprivate getTransitRestoreKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/restore/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for importing a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the import key.\n\t * @internal\n\t */\n\tprivate getTransitImportKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/keys/${this.getEncodedName(name)}/import`;\n\t}\n\n\t/**\n\t * Get the path for signing data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the sign.\n\t * @internal\n\t */\n\tprivate getTransitSignPath(name: string): string {\n\t\treturn `${this._transitMountPath}/sign/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for verifying data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the verify.\n\t * @internal\n\t */\n\tprivate getTransitVerifyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/verify/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for encrypting data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for encryption.\n\t * @internal\n\t */\n\tprivate getTransitEncryptPath(name: string): string {\n\t\treturn `${this._transitMountPath}/encrypt/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for decrypting data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for decryption.\n\t * @internal\n\t */\n\tprivate getTransitDecryptPath(name: string): string {\n\t\treturn `${this._transitMountPath}/decrypt/${this.getEncodedName(name)}`;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"hashicorpVaultConnector.js","sources":["../../src/hashicorpVaultConnector.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHealthCategory,\n\tHealthStatus,\n\ttype IHealth,\n\ttype IHealthProviderComponent\n} from \"@3sixty/api-models\";\nimport {\n\tAlreadyExistsError,\n\tBaseError,\n\tComponentFactory,\n\tConverter,\n\tDurationConstants,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tLruCache,\n\tNotFoundError,\n\tRandomHelper,\n\tStringHelper\n} from \"@3sixty/core\";\nimport { ChaCha20Poly1305, Ed25519 } from \"@3sixty/crypto\";\nimport type { ILoggingComponent } from \"@3sixty/logging-models\";\n\nimport { type IVaultConnector, VaultEncryptionType, VaultKeyType } from \"@3sixty/vault-models\";\nimport { FetchHelper, HttpMethod, type IHttpHeaders } from \"@3sixty/web\";\nimport type { IBackupKeyResponse } from \"./models/IBackupKeyResponse.js\";\nimport type { ICreateKeyRequest } from \"./models/ICreateKeyRequest.js\";\nimport type { IDataKeyEnvelope } from \"./models/IDataKeyEnvelope.js\";\nimport type { IDecryptDataRequest } from \"./models/IDecryptDataRequest.js\";\nimport type { IDecryptDataResponse } from \"./models/IDecryptDataResponse.js\";\nimport type { IEncryptDataRequest } from \"./models/IEncryptDataRequest.js\";\nimport type { IEncryptDataResponse } from \"./models/IEncryptDataResponse.js\";\nimport type { IExportKeyResponse } from \"./models/IExportKeyResponse.js\";\nimport type { IHashicorpVaultConnectorConfig } from \"./models/IHashicorpVaultConnectorConfig.js\";\nimport type { IHashicorpVaultConnectorConstructorOptions } from \"./models/IHashicorpVaultConnectorConstructorOptions.js\";\nimport type { IHashicorpVaultRequest } from \"./models/IHashicorpVaultRequest.js\";\nimport type { IHashicorpVaultResponse } from \"./models/IHashicorpVaultResponse.js\";\nimport type { IImportKeyRequest } from \"./models/IImportKeyRequest.js\";\nimport type { IKeyDeleteConfigResponse } from \"./models/IKeyDeleteConfigResponse.js\";\nimport type { IReadKeyResponse } from \"./models/IReadKeyResponse.js\";\nimport type { IRestoreKeyRequest } from \"./models/IRestoreKeyRequest.js\";\nimport type { ISecretData } from \"./models/ISecretData.js\";\nimport type { ISecretVersionResponse } from \"./models/ISecretVersionResponse.js\";\nimport type { ISignDataRequest } from \"./models/ISignDataRequest.js\";\nimport type { ISignDataResponse } from \"./models/ISignDataResponse.js\";\nimport type { IUpdateKeyConfigRequest } from \"./models/IUpdateKeyConfigRequest.js\";\nimport type { IVerifyDataRequest } from \"./models/IVerifyDataRequest.js\";\nimport type { IVerifyDataResponse } from \"./models/IVerifyDataResponse.js\";\n\n/**\n * Class for performing vault operations using HashiCorp Vault.\n */\nexport class HashicorpVaultConnector implements IVaultConnector, IHealthProviderComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = \"HashicorpVaultConnector\";\n\n\t/**\n\t * The namespace supported by the vault connector.\n\t */\n\tpublic static readonly NAMESPACE: string = \"hashicorp\";\n\n\t/**\n\t * The prefix to strip from keys and encrypted data.\n\t * @internal\n\t */\n\tprivate static readonly _DATA_PREFIX: string = \"vault:v1:\";\n\n\t/**\n\t * The prefix marking data encrypted under a wrapped data key.\n\t * @internal\n\t */\n\tprivate static readonly _ENVELOPE_PREFIX: Uint8Array = Converter.utf8ToBytes(\"twin:env:v1:\");\n\n\t/**\n\t * The length in bytes of a data key.\n\t * @internal\n\t */\n\tprivate static readonly _DATA_KEY_LENGTH: number = 32;\n\n\t/**\n\t * The length in bytes of a ChaCha20Poly1305 nonce.\n\t * @internal\n\t */\n\tprivate static readonly _NONCE_LENGTH: number = 12;\n\n\t/**\n\t * The length in bytes of a ChaCha20Poly1305 authentication tag.\n\t * @internal\n\t */\n\tprivate static readonly _TAG_LENGTH: number = 16;\n\n\t/**\n\t * The default TTL in milliseconds for cached key metadata.\n\t * @internal\n\t */\n\tprivate static readonly _DEFAULT_KEY_METADATA_CACHE_TTL_MS: number =\n\t\t30 * DurationConstants.MsPerSecond;\n\n\t/**\n\t * The configuration for the vault connector.\n\t * @internal\n\t */\n\tprivate readonly _config: IHashicorpVaultConnectorConfig;\n\n\t/**\n\t * The KV mount path.\n\t * @internal\n\t */\n\tprivate readonly _kvMountPath: string;\n\n\t/**\n\t * The transit mount path.\n\t * @internal\n\t */\n\tprivate readonly _transitMountPath: string;\n\n\t/**\n\t * The base URL for the Vault API.\n\t * @internal\n\t */\n\tprivate readonly _baseUrl: string;\n\n\t/**\n\t * The request options for fetch calls.\n\t * @internal\n\t */\n\tprivate readonly _requestOptions: { headers: IHttpHeaders; timeoutMs?: number };\n\n\t/**\n\t * A prefix for the keys stored in the vault.\n\t * @internal\n\t */\n\tprivate readonly _prefix?: string;\n\n\t/**\n\t * The TTL in milliseconds for cached key metadata.\n\t * @internal\n\t */\n\tprivate readonly _keyMetadataCacheTtlMs: number;\n\n\t/**\n\t * Cache of key metadata by key name, undefined when caching is disabled.\n\t * @internal\n\t */\n\tprivate _keyMetadataCache?: LruCache<IReadKeyResponse>;\n\n\t/**\n\t * Create a new instance of HashicorpVaultConnector.\n\t * @param options The options for the vault connector.\n\t */\n\tconstructor(options: IHashicorpVaultConnectorConstructorOptions) {\n\t\tGuards.object(HashicorpVaultConnector.CLASS_NAME, \"options\", options);\n\t\tGuards.object<IHashicorpVaultConnectorConfig>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"options.config\",\n\t\t\toptions.config\n\t\t);\n\t\tGuards.stringValue(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"options.config.endpoint\",\n\t\t\toptions.config.endpoint\n\t\t);\n\t\tGuards.stringValue(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"options.config.token\",\n\t\t\toptions.config.token\n\t\t);\n\n\t\tthis._config = options.config;\n\t\tthis._kvMountPath = this._config.kvMountPath ?? \"secret\";\n\t\tthis._transitMountPath = this._config.transitMountPath ?? \"transit\";\n\t\tthis._baseUrl = `${StringHelper.trimTrailingSlashes(this._config.endpoint)}/${this._config.apiVersion ?? \"v1\"}`;\n\t\tconst headers: IHttpHeaders = {\n\t\t\t\"X-Vault-Token\": this._config.token\n\t\t};\n\t\tif (Is.stringValue(this._config.namespace)) {\n\t\t\theaders[\"X-Vault-Namespace\"] = this._config.namespace;\n\t\t}\n\t\tthis._requestOptions = {\n\t\t\theaders,\n\t\t\ttimeoutMs: this._config.timeoutMs\n\t\t};\n\t\tthis._prefix = this._config.prefix;\n\t\tthis._keyMetadataCacheTtlMs =\n\t\t\tthis._config.keyMetadataCacheTtlMs ??\n\t\t\tHashicorpVaultConnector._DEFAULT_KEY_METADATA_CACHE_TTL_MS;\n\t\tthis._keyMetadataCache =\n\t\t\tthis._keyMetadataCacheTtlMs > 0\n\t\t\t\t? new LruCache<IReadKeyResponse>({ ttiMs: this._keyMetadataCacheTtlMs })\n\t\t\t\t: undefined;\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn HashicorpVaultConnector.CLASS_NAME;\n\t}\n\n\t/**\n\t * Returns the health status of the component.\n\t * @returns The health status of the component.\n\t */\n\tpublic async health(): Promise<IHealth[]> {\n\t\tconst endpoint = `${this._baseUrl}/sys/health`;\n\t\ttry {\n\t\t\tawait FetchHelper.fetch(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\tendpoint,\n\t\t\t\tHttpMethod.GET,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Connectivity,\n\t\t\t\t\tstatus: HealthStatus.Ok,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tdata: { endpoint }\n\t\t\t\t}\n\t\t\t];\n\t\t} catch {\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\tcategory: HealthCategory.Connectivity,\n\t\t\t\t\tstatus: HealthStatus.Error,\n\t\t\t\t\tdescription: \"healthDescription\",\n\t\t\t\t\tmessage: \"vaultHealthCheckFailed\",\n\t\t\t\t\tdata: { endpoint }\n\t\t\t\t}\n\t\t\t];\n\t\t}\n\t}\n\n\t/**\n\t * Bootstrap the vault connector and ensure connectivity.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t * @returns True if the bootstrapping process was successful.\n\t */\n\tpublic async bootstrap(nodeLoggingComponentType?: string): Promise<boolean> {\n\t\tconst nodeLogging = ComponentFactory.getIfExists<ILoggingComponent>(nodeLoggingComponentType);\n\n\t\ttry {\n\t\t\tawait FetchHelper.fetch(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t`${this._baseUrl}/sys/health`,\n\t\t\t\tHttpMethod.GET,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\n\t\t\tawait nodeLogging?.log({\n\t\t\t\tlevel: \"info\",\n\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"hashicorpVaultConnected\",\n\t\t\t\tdata: {\n\t\t\t\t\taddress: this._config.endpoint\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tawait nodeLogging?.log({\n\t\t\t\tlevel: \"error\",\n\t\t\t\tsource: HashicorpVaultConnector.CLASS_NAME,\n\t\t\t\tts: Date.now(),\n\t\t\t\tmessage: \"hashicorpVaultConnectionFailed\",\n\t\t\t\terror: BaseError.fromError(err),\n\t\t\t\tdata: {\n\t\t\t\t\taddress: this._config.endpoint\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Store a secret in the vault.\n\t * @param name The name of the item in the vault to set.\n\t * @param data The item to add to the vault.\n\t * @returns A promise that resolves when the secret has been stored.\n\t */\n\tpublic async setSecret<T>(name: string, data: T): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.defined(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\t\t\tconst payload = {\n\t\t\t\tdata: {\n\t\t\t\t\tsecret: data\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<IHashicorpVaultRequest<T>, unknown>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"setSecretFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Stop the component and release the key metadata cache.\n\t * @param nodeLoggingComponentType The node logging component type.\n\t * @returns A promise that resolves when the component has stopped.\n\t */\n\tpublic async stop(nodeLoggingComponentType?: string): Promise<void> {\n\t\tthis._keyMetadataCache?.destroy();\n\t\tthis._keyMetadataCache = undefined;\n\t}\n\n\t/**\n\t * Check if a secret exists in the vault.\n\t * @param name The name of the secret to check.\n\t * @returns True if the secret exists, false otherwise.\n\t */\n\tpublic async secretExists(name: string): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tawait this.getSecretVersions(name);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Get a secret from the vault.\n\t * @param name The name of the item in the vault to get.\n\t * @returns The item from the vault.\n\t * @throws Error if the item is not found.\n\t */\n\tpublic async getSecret<T>(name: string): Promise<T> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tawait this.getSecretVersions(name);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst response = await FetchHelper.fetchJson<never, IHashicorpVaultResponse<ISecretData<T>>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.GET,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\n\t\t\treturn response.data.data.secret;\n\t\t} catch (err) {\n\t\t\tif (\n\t\t\t\tIs.object<{ properties?: { httpStatus?: number } }>(err) &&\n\t\t\t\terr.properties?.httpStatus === 404\n\t\t\t) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\t\"secretNotFound\",\n\t\t\t\t\tname,\n\t\t\t\t\tundefined,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"setSecretFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a secret from the vault.\n\t * @param name The name of the item in the vault to remove.\n\t * @returns A promise that resolves when the secret has been removed.\n\t * @throws Error if the item is not found.\n\t */\n\tpublic async removeSecret(name: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tawait this.getSecretVersions(name);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretMetadataPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tawait FetchHelper.fetchJson<never, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.DELETE,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"removeSecretFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Generate a new key and store it in the vault.\n\t * @param name The name of the key to generate and store in the vault.\n\t * @param type The type of key to create.\n\t * @returns The public key for the key pair.\n\t */\n\tpublic async createKey(name: string, type: VaultKeyType): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultKeyType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"type\",\n\t\t\ttype,\n\t\t\tObject.values(VaultKeyType)\n\t\t);\n\n\t\tconst path = this.getTransitKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\t// Check if the key exists\n\t\t\tconst existingVaultKey = await this.readKey(name);\n\t\t\tif (existingVaultKey) {\n\t\t\t\tthrow new AlreadyExistsError(HashicorpVaultConnector.CLASS_NAME, \"keyAlreadyExists\", name);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (!BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst vaultKeyType = this.mapVaultKeyType(type);\n\n\t\t\tconst payload: ICreateKeyRequest = {\n\t\t\t\ttype: vaultKeyType,\n\t\t\t\texportable: true,\n\t\t\t\tallow_plaintext_backup: true // eslint-disable-line camelcase\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<ICreateKeyRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\n\t\t\t// If the key is asymmetric, return the public key\n\t\t\tif (this.isAsymmetricKeyType(type)) {\n\t\t\t\tconst publicKey = await this.exportKey(name, \"public-key\");\n\t\t\t\treturn publicKey.key;\n\t\t\t}\n\n\t\t\t// If the key is symmetric, return the encryption key\n\t\t\tconst symmetricKey = await this.exportKey(name, \"encryption-key\");\n\t\t\treturn symmetricKey.key;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, AlreadyExistsError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"createKeyFailed\",\n\t\t\t\t{ name, type },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Add an existing key to the vault.\n\t * @param name The name of the key to add to the vault.\n\t * @param type The type of key to add.\n\t * @param privateKey The private key.\n\t * @param publicKey The public key, can be undefined if the key type is symmetric.\n\t * @returns A promise that resolves when the key has been stored.\n\t */\n\tpublic async addKey(\n\t\tname: string,\n\t\ttype: VaultKeyType,\n\t\tprivateKey: Uint8Array,\n\t\tpublicKey?: Uint8Array\n\t): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultKeyType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"type\",\n\t\t\ttype,\n\t\t\tObject.values(VaultKeyType)\n\t\t);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"privateKey\", privateKey);\n\n\t\ttry {\n\t\t\t// Check if the key exists\n\t\t\tconst existingVaultKey = await this.readKey(name);\n\t\t\tif (existingVaultKey) {\n\t\t\t\tthrow new AlreadyExistsError(HashicorpVaultConnector.CLASS_NAME, \"keyAlreadyExists\", name);\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tif (!BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst internalType = this.mapVaultKeyTypeToIndex(type);\n\n\t\t\tlet publicKeyForPayload: string | null = null;\n\t\t\tlet privateKeyForPayload: string | null = null;\n\n\t\t\tif (type === VaultKeyType.Ed25519 || type === VaultKeyType.ChaCha20Poly1305) {\n\t\t\t\tconst combinedKey = new Uint8Array(privateKey.length + (publicKey?.length ?? 0));\n\t\t\t\tcombinedKey.set(privateKey);\n\t\t\t\tif (publicKey) {\n\t\t\t\t\tcombinedKey.set(publicKey, privateKey.length);\n\t\t\t\t}\n\t\t\t\tprivateKeyForPayload = Converter.bytesToBase64(combinedKey);\n\t\t\t\tif (!Is.undefined(publicKey)) {\n\t\t\t\t\tpublicKeyForPayload = Converter.bytesToBase64(publicKey);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst payload = {\n\t\t\t\tpolicy: {\n\t\t\t\t\tname,\n\t\t\t\t\tkeys: {\n\t\t\t\t\t\t\"1\": {\n\t\t\t\t\t\t\tkey: privateKeyForPayload,\n\t\t\t\t\t\t\thmac_key: Converter.bytesToBase64(RandomHelper.generate(32)), // eslint-disable-line camelcase\n\t\t\t\t\t\t\tpublic_key: publicKeyForPayload // eslint-disable-line camelcase\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\texportable: true,\n\t\t\t\t\tallow_plaintext_backup: true, // eslint-disable-line camelcase\n\t\t\t\t\tmin_decryption_version: 1, // eslint-disable-line camelcase\n\t\t\t\t\tmin_encryption_version: 0, // eslint-disable-line camelcase\n\t\t\t\t\tlatest_version: 1, // eslint-disable-line camelcase\n\t\t\t\t\ttype: internalType\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst json = JSON.stringify(payload);\n\n\t\t\tconst backup = Converter.bytesToBase64(Converter.utf8ToBytes(json));\n\n\t\t\tawait this.restoreKey(name, backup);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, AlreadyExistsError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"addKeyFailed\",\n\t\t\t\t{ name, type },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a key from the vault.\n\t * @param name The name of the key to get.\n\t * @param components Which key components to return, defaults to \"both\".\n\t * @returns The key, publicKey can be undefined if key is symmetric, privateKey can be undefined if only public was requested.\n\t * @throws GeneralError if \"private\" is requested for a symmetric key.\n\t */\n\tpublic async getKey(\n\t\tname: string,\n\t\tcomponents?: \"public\" | \"private\" | \"both\"\n\t): Promise<{\n\t\t/**\n\t\t * The type of the key e.g. Ed25519.\n\t\t */\n\t\ttype: VaultKeyType;\n\n\t\t/**\n\t\t * The private key, undefined if only public component was requested.\n\t\t */\n\t\tprivateKey?: Uint8Array;\n\n\t\t/**\n\t\t * The public key, which can be undefined if key type is symmetric or only private was requested.\n\t\t */\n\t\tpublicKey?: Uint8Array;\n\t}> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tcomponents ??= \"both\";\n\n\t\tGuards.arrayOneOf<\"public\" | \"private\" | \"both\">(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"components\",\n\t\t\tcomponents,\n\t\t\t[\"public\", \"private\", \"both\"]\n\t\t);\n\n\t\tconst keyDetails = await this.readKeyCached(name);\n\n\t\tconst type = this.mapHashicorpKeyType(keyDetails.type);\n\t\tconst isAsymmetric = this.isAsymmetricKeyType(type);\n\n\t\tif (!isAsymmetric && components === \"private\") {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"symmetricKeyHasNoPrivateKey\", {\n\t\t\t\tname\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tlet publicKey: Uint8Array | undefined;\n\t\t\tlet privateKey: Uint8Array | undefined;\n\n\t\t\tif (isAsymmetric) {\n\t\t\t\tif (components !== \"public\") {\n\t\t\t\t\tconst privateKeyData = await this.exportKey(name, \"signing-key\");\n\t\t\t\t\tprivateKey = privateKeyData.key;\n\t\t\t\t}\n\t\t\t\tif (components !== \"private\") {\n\t\t\t\t\tconst publicKeyData = await this.exportKey(name, \"public-key\");\n\t\t\t\t\tpublicKey = publicKeyData.key;\n\t\t\t\t}\n\t\t\t} else if (components !== \"public\") {\n\t\t\t\tconst privateKeyData = await this.exportKey(name, \"encryption-key\");\n\t\t\t\tprivateKey = privateKeyData.key;\n\t\t\t}\n\n\t\t\treturn { type, privateKey, publicKey };\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"getKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Check if a key exists in the vault.\n\t * @param name The name of the key to check.\n\t * @returns True if the key exists, false otherwise.\n\t */\n\tpublic async keyExists(name: string): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tawait this.readKey(name);\n\t\t\treturn true;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\t/**\n\t * Get the type of a key from the vault without retrieving the key material.\n\t * @param name The name of the key.\n\t * @returns The key type.\n\t * @throws NotFoundError if the key does not exist.\n\t */\n\tpublic async getKeyType(name: string): Promise<VaultKeyType> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tconst keyDetails = await this.readKeyCached(name);\n\n\t\treturn this.mapHashicorpKeyType(keyDetails.type);\n\t}\n\n\t/**\n\t * Rename a key in the vault.\n\t * @param name The name of the key to rename.\n\t * @param newName The new name of the key.\n\t * @returns A promise that resolves when the key has been renamed.\n\t */\n\tpublic async renameKey(name: string, newName: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"newName\", newName);\n\n\t\tawait this.readKey(name);\n\n\t\tlet existingVaultKey;\n\t\ttry {\n\t\t\texistingVaultKey = await this.readKey(newName);\n\t\t} catch (err) {\n\t\t\tif (!BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t}\n\t\tif (existingVaultKey) {\n\t\t\tthrow new AlreadyExistsError(HashicorpVaultConnector.CLASS_NAME, \"keyAlreadyExists\", newName);\n\t\t}\n\n\t\ttry {\n\t\t\tconst backup = await this.backupKey(name);\n\t\t\tawait this.restoreKey(newName, backup);\n\t\t\tawait this.removeKey(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"renameKeyFailed\",\n\t\t\t\t{ name, newName },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Remove a key from the vault.\n\t * @param name The name of the key to remove.\n\t * @returns A promise that resolves when the key has been removed.\n\t */\n\tpublic async removeKey(name: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tawait this.readKey(name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitKeyPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tawait this.updateKeyConfig(name, true);\n\n\t\t\tawait FetchHelper.fetch(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.DELETE,\n\t\t\t\tundefined,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"removeKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Sign data.\n\t * @param name The name of the key to use.\n\t * @param data The data to sign.\n\t * @returns The signature.\n\t */\n\tpublic async sign(name: string, data: Uint8Array): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\n\t\tawait this.readKeyCached(name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitSignPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst base64Data = Converter.bytesToBase64(data);\n\n\t\t\tconst payload = {\n\t\t\t\tinput: base64Data\n\t\t\t};\n\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tISignDataRequest,\n\t\t\t\tIHashicorpVaultResponse<ISignDataResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\t\tif (response?.data?.signature) {\n\t\t\t\tconst signatureString = response.data.signature;\n\n\t\t\t\tconst cleanedSignature = signatureString.startsWith(HashicorpVaultConnector._DATA_PREFIX)\n\t\t\t\t\t? signatureString.slice(HashicorpVaultConnector._DATA_PREFIX.length)\n\t\t\t\t\t: signatureString;\n\n\t\t\t\tconst signatureBytes = Converter.base64ToBytes(cleanedSignature);\n\t\t\t\treturn signatureBytes;\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidSignResponse\", { name });\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"signDataFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Verify a signature.\n\t * @param name The name of the key to use.\n\t * @param data The data to verify.\n\t * @param signature The signature to verify.\n\t * @returns True if the signature is valid.\n\t */\n\tpublic async verify(name: string, data: Uint8Array, signature: Uint8Array): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"signature\", signature);\n\n\t\tawait this.readKeyCached(name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitVerifyPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst base64Data = Converter.bytesToBase64(data);\n\t\t\tconst signatureBase64 = Converter.bytesToBase64(signature);\n\n\t\t\tconst prefixedSignature = `${HashicorpVaultConnector._DATA_PREFIX}${signatureBase64}`;\n\n\t\t\tconst payload = {\n\t\t\t\tinput: base64Data,\n\t\t\t\tsignature: prefixedSignature\n\t\t\t};\n\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tIVerifyDataRequest,\n\t\t\t\tIHashicorpVaultResponse<IVerifyDataResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\t\tif (response?.data?.valid) {\n\t\t\t\treturn response.data.valid;\n\t\t\t}\n\n\t\t\treturn false;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"verifyDataFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Encrypt data locally under a data key wrapped by the transit key.\n\t * @param name The name of the key to use.\n\t * @param encryptionType The type of encryption to use.\n\t * @param data The data to encrypt.\n\t * @returns The encrypted data.\n\t */\n\tpublic async encrypt(\n\t\tname: string,\n\t\tencryptionType: VaultEncryptionType,\n\t\tdata: Uint8Array\n\t): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultEncryptionType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"encryptionType\",\n\t\t\tencryptionType,\n\t\t\tObject.values(VaultEncryptionType)\n\t\t);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"data\", data);\n\n\t\tconst keyDetails = await this.readKeyCached(name);\n\n\t\tif (\n\t\t\tencryptionType === VaultEncryptionType.ChaCha20Poly1305 &&\n\t\t\tkeyDetails.type !== this.mapVaultKeyType(VaultKeyType.ChaCha20Poly1305)\n\t\t) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"keyTypeMismatch\", {\n\t\t\t\tencryptionType,\n\t\t\t\tkeyType: keyDetails.type\n\t\t\t});\n\t\t}\n\n\t\ttry {\n\t\t\tconst dataKey = RandomHelper.generate(HashicorpVaultConnector._DATA_KEY_LENGTH);\n\t\t\tconst wrappedKey = await this.transitEncrypt(name, dataKey);\n\t\t\tconst header = this.buildEnvelopeHeader(wrappedKey);\n\t\t\tconst nonce = RandomHelper.generate(HashicorpVaultConnector._NONCE_LENGTH);\n\t\t\tconst payload = new ChaCha20Poly1305(dataKey, nonce, header).encrypt(data);\n\t\t\tdataKey.fill(0);\n\n\t\t\tconst envelope = new Uint8Array(header.length + nonce.length + payload.length);\n\t\t\tenvelope.set(header);\n\t\t\tenvelope.set(nonce, header.length);\n\t\t\tenvelope.set(payload, header.length + nonce.length);\n\t\t\treturn envelope;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"encryptDataFailed\",\n\t\t\t\t{ name, encryptionType },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Decrypt data, either an envelope or data encrypted directly by the transit key.\n\t * @param name The name of the key to use.\n\t * @param encryptionType The type of encryption to use.\n\t * @param encryptedData The encrypted data to decrypt.\n\t * @returns The decrypted data.\n\t */\n\tpublic async decrypt(\n\t\tname: string,\n\t\tencryptionType: VaultEncryptionType,\n\t\tencryptedData: Uint8Array\n\t): Promise<Uint8Array> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.arrayOneOf<VaultEncryptionType>(\n\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\"encryptionType\",\n\t\t\tencryptionType,\n\t\t\tObject.values(VaultEncryptionType)\n\t\t);\n\t\tGuards.uint8Array(HashicorpVaultConnector.CLASS_NAME, \"encryptedData\", encryptedData);\n\n\t\tawait this.readKeyCached(name);\n\n\t\ttry {\n\t\t\tif (!this.hasEnvelopePrefix(encryptedData)) {\n\t\t\t\treturn await this.transitDecrypt(\n\t\t\t\t\tname,\n\t\t\t\t\t`${HashicorpVaultConnector._DATA_PREFIX}${Converter.bytesToBase64(encryptedData)}`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst envelope = this.parseEnvelope(encryptedData);\n\t\t\tconst dataKey = await this.transitDecrypt(name, envelope.wrappedKey);\n\t\t\tconst decrypted = new ChaCha20Poly1305(dataKey, envelope.nonce, envelope.header).decrypt(\n\t\t\t\tenvelope.payload\n\t\t\t);\n\t\t\tdataKey.fill(0);\n\t\t\treturn decrypted;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"decryptDataFailed\",\n\t\t\t\t{ name, encryptionType },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the versions of a secret.\n\t * @param name The name of the secret.\n\t * @returns The versions of the secret.\n\t * @throws Error if the secret is not found.\n\t */\n\tpublic async getSecretVersions(name: string): Promise<number[]> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tconst versions = await this.fetchSecretVersions(name);\n\t\t\treturn versions;\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"getSecretVersionsFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Update the configuration of a key.\n\t * @param name The name of the key to update.\n\t * @param deletionAllowed Whether the key can be deleted.\n\t * @param exportable Whether the key can be exported.\n\t * @returns A promise that resolves when the key configuration has been updated.\n\t */\n\tpublic async updateKeyConfig(\n\t\tname: string,\n\t\tdeletionAllowed?: boolean,\n\t\texportable?: boolean\n\t): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tconst path = this.getTransitKeyConfigPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst payload = {\n\t\t\t\tdeletion_allowed: deletionAllowed, // eslint-disable-line camelcase\n\t\t\t\texportable\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<IUpdateKeyConfigRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"updateKeyConfigFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Backup a key from the vault.\n\t * @param name The name of the key to backup.\n\t * @returns The Base64-encoded backup payload.\n\t * @throws Error if the key cannot be exported or found.\n\t */\n\tpublic async backupKey(name: string): Promise<string> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tconst path = this.getTransitBackupKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IBackupKeyResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data?.backup) {\n\t\t\t\tconst backup = response.data.backup;\n\t\t\t\treturn backup;\n\t\t\t}\n\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"backupKeyNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"backupKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Restore a key to the vault.\n\t * @param name The name of the key to restore.\n\t * @param backup The Base64-encoded backup payload.\n\t * @returns A promise that resolves when the key has been restored.\n\t * @throws Error if the key cannot be restored.\n\t */\n\tpublic async restoreKey(name: string, backup: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"backup\", backup);\n\n\t\tconst path = this.getTransitRestoreKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst payload = { backup };\n\n\t\t\tawait FetchHelper.fetchJson<IRestoreKeyRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"restoreKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Import a key to the vault.\n\t * @param name The name of the key to import.\n\t * @param type The type of key to import, e.g. \"ed25519\".\n\t * @param privateKeyPem The PEM bundle of the key to import.\n\t * @returns A promise that resolves when the key has been imported.\n\t * @throws Error if the key cannot be imported.\n\t */\n\tpublic async importKey(name: string, type: string, privateKeyPem: string): Promise<void> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"privateKeyPem\", privateKeyPem);\n\n\t\tconst path = this.getTransitImportKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst payload = {\n\t\t\t\ttype,\n\t\t\t\tkey: Converter.bytesToBase58(Converter.utf8ToBytes(privateKeyPem)),\n\t\t\t\texportable: true,\n\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\tallow_plaintext_backup: true\n\t\t\t};\n\n\t\t\tawait FetchHelper.fetchJson<IImportKeyRequest, IHashicorpVaultResponse<unknown>>(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\turl,\n\t\t\t\tHttpMethod.POST,\n\t\t\t\tpayload,\n\t\t\t\tthis._requestOptions\n\t\t\t);\n\t\t\tthis._keyMetadataCache?.delete(name);\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"importKeyFailed\", { name }, err);\n\t\t}\n\t}\n\n\t/**\n\t * Export the key from the vault.\n\t * @param name The name of the key.\n\t * @param keyPath The path of the key. Defaults to \"signing-key\".\n\t * @param version The version of the key. If omitted, all versions of the key will be returned.\n\t * @returns The key details.\n\t * @throws Error if the key cannot be exported or found.\n\t */\n\tpublic async exportKey(\n\t\tname: string,\n\t\tkeyPath: \"signing-key\" | \"encryption-key\" | \"public-key\",\n\t\tversion?: string\n\t): Promise<{\n\t\t/**\n\t\t * The type of the key e.g. Ed25519.\n\t\t */\n\t\ttype: VaultKeyType;\n\n\t\t/**\n\t\t * The key.\n\t\t */\n\t\tkey: Uint8Array;\n\n\t\t/**\n\t\t * The name of the key.\n\t\t */\n\t\tname: string;\n\t}> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tconst versionPath = version ? `${version}` : \"latest\";\n\n\t\tconst path = this.getTransitExportKeyPath(name, keyPath);\n\t\tconst url = `${this._baseUrl}/${path}/${versionPath}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IExportKeyResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data) {\n\t\t\t\tconst { keys, type } = response.data;\n\t\t\t\tconst keyVersion = Object.keys(keys)[0];\n\t\t\t\tlet key;\n\n\t\t\t\tconst keyType = this.mapHashicorpKeyType(type);\n\t\t\t\tif (keyType === VaultKeyType.Ed25519) {\n\t\t\t\t\tkey = Converter.base64ToBytes(keys[keyVersion]).slice(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tkeyPath === \"public-key\" ? Ed25519.PUBLIC_KEY_SIZE : Ed25519.PRIVATE_KEY_SIZE\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\t// VaultKeyType.ChaCha20Poly1305\n\t\t\t\t\tkey = Converter.base64ToBytes(keys[keyVersion]);\n\t\t\t\t}\n\n\t\t\t\tconst keyData = {\n\t\t\t\t\ttype: keyType,\n\t\t\t\t\tkey,\n\t\t\t\t\tname: response?.data?.name\n\t\t\t\t};\n\n\t\t\t\treturn keyData;\n\t\t\t}\n\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"exportKeyNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"exportKeyFailed\",\n\t\t\t\t{ name, keyPath },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get the key configuration.\n\t * @param name The name of the key to get the configuration for.\n\t * @returns True if the key can be deleted.\n\t */\n\tpublic async getKeyDeleteConfiguration(name: string): Promise<boolean> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\t\tconst path = this.getTransitKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IKeyDeleteConfigResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\treturn response.data.deletion_allowed;\n\t\t} catch (err) {\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"getKeyDeleteConfigurationFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Read key information from the vault.\n\t * @param name The name of the key.\n\t * @returns An object containing key information.\n\t * @internal\n\t */\n\tprivate async readKey(name: string): Promise<IReadKeyResponse> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\tconst path = this.getTransitKeyPath(name);\n\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\ttry {\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<IReadKeyResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data?.name) {\n\t\t\t\tconst keyName = response.data.name;\n\t\t\t\treturn { name: keyName, type: response.data.type };\n\t\t\t}\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"keyNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (this.isHttpNotFoundError(err)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\t\"keyNotFound\",\n\t\t\t\t\tname,\n\t\t\t\t\tundefined,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"invalidReadKeyResponse\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Read key metadata, served from the cache when it is enabled.\n\t * @param name The name of the key.\n\t * @returns An object containing key information.\n\t * @internal\n\t */\n\tprivate async readKeyCached(name: string): Promise<IReadKeyResponse> {\n\t\tconst cached = this._keyMetadataCache?.get(name);\n\t\tif (!Is.undefined(cached)) {\n\t\t\treturn cached;\n\t\t}\n\n\t\tconst keyDetails = await this.readKey(name);\n\t\tthis._keyMetadataCache?.set(name, keyDetails, Date.now() + this._keyMetadataCacheTtlMs);\n\t\treturn keyDetails;\n\t}\n\n\t/**\n\t * Encrypt bytes with the transit key.\n\t * @param name The name of the key.\n\t * @param data The bytes to encrypt.\n\t * @returns The transit ciphertext including its version prefix.\n\t * @internal\n\t */\n\tprivate async transitEncrypt(name: string, data: Uint8Array): Promise<string> {\n\t\tconst url = `${this._baseUrl}/${this.getTransitEncryptPath(name)}`;\n\t\tconst payload = { plaintext: Converter.bytesToBase64(data) };\n\n\t\tconst response = await FetchHelper.fetchJson<\n\t\t\tIEncryptDataRequest,\n\t\t\tIHashicorpVaultResponse<IEncryptDataResponse>\n\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\tif (Is.stringValue(response?.data?.ciphertext)) {\n\t\t\treturn response.data.ciphertext;\n\t\t}\n\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidEncryptResponse\", { name });\n\t}\n\n\t/**\n\t * Decrypt a transit ciphertext with the transit key.\n\t * @param name The name of the key.\n\t * @param ciphertext The transit ciphertext including its version prefix.\n\t * @returns The decrypted bytes.\n\t * @internal\n\t */\n\tprivate async transitDecrypt(name: string, ciphertext: string): Promise<Uint8Array> {\n\t\tconst url = `${this._baseUrl}/${this.getTransitDecryptPath(name)}`;\n\t\tconst payload = { ciphertext };\n\n\t\tconst response = await FetchHelper.fetchJson<\n\t\t\tIDecryptDataRequest,\n\t\t\tIHashicorpVaultResponse<IDecryptDataResponse>\n\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.POST, payload, this._requestOptions);\n\n\t\tif (Is.stringValue(response?.data?.plaintext)) {\n\t\t\treturn Converter.base64ToBytes(response.data.plaintext);\n\t\t}\n\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidDecryptResponse\", { name });\n\t}\n\n\t/**\n\t * Check whether the data starts with the envelope prefix.\n\t * @param data The data to check.\n\t * @returns True if the data is an envelope.\n\t * @internal\n\t */\n\tprivate hasEnvelopePrefix(data: Uint8Array): boolean {\n\t\treturn HashicorpVaultConnector._ENVELOPE_PREFIX.every((byte, index) => data[index] === byte);\n\t}\n\n\t/**\n\t * Build the envelope header, the prefix followed by the length prefixed wrapped data key.\n\t * @param wrappedKey The transit ciphertext of the data key.\n\t * @returns The header bytes.\n\t * @internal\n\t */\n\tprivate buildEnvelopeHeader(wrappedKey: string): Uint8Array {\n\t\tconst prefix = HashicorpVaultConnector._ENVELOPE_PREFIX;\n\t\tconst wrappedBytes = Converter.utf8ToBytes(wrappedKey);\n\t\tconst header = new Uint8Array(prefix.length + 2 + wrappedBytes.length);\n\t\theader.set(prefix);\n\t\tnew DataView(header.buffer).setUint16(prefix.length, wrappedBytes.length);\n\t\theader.set(wrappedBytes, prefix.length + 2);\n\t\treturn header;\n\t}\n\n\t/**\n\t * Split an envelope into its header, wrapped data key, nonce and payload.\n\t * @param envelope The envelope bytes.\n\t * @returns The envelope parts.\n\t * @throws GeneralError if the envelope is shorter than its header declares.\n\t * @internal\n\t */\n\tprivate parseEnvelope(envelope: Uint8Array): IDataKeyEnvelope {\n\t\tconst lengthOffset = HashicorpVaultConnector._ENVELOPE_PREFIX.length;\n\t\tconst wrappedLength =\n\t\t\tenvelope.length >= lengthOffset + 2\n\t\t\t\t? new DataView(envelope.buffer, envelope.byteOffset).getUint16(lengthOffset)\n\t\t\t\t: 0;\n\t\tconst headerLength = lengthOffset + 2 + wrappedLength;\n\t\tconst payloadOffset = headerLength + HashicorpVaultConnector._NONCE_LENGTH;\n\n\t\tif (envelope.length < payloadOffset + HashicorpVaultConnector._TAG_LENGTH) {\n\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"invalidEnvelope\", {\n\t\t\t\tlength: envelope.length\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\theader: envelope.slice(0, headerLength),\n\t\t\twrappedKey: Converter.bytesToUtf8(envelope, lengthOffset + 2, wrappedLength),\n\t\t\tnonce: envelope.slice(headerLength, payloadOffset),\n\t\t\tpayload: envelope.slice(payloadOffset)\n\t\t};\n\t}\n\n\t/**\n\t * Determine whether an error is a framework missing-key error.\n\t * @param err The error to inspect.\n\t * @returns True if the error is a NotFoundError.\n\t * @internal\n\t */\n\t/**\n\t * Determine whether a Vault request reported a missing key.\n\t * @param err The error to inspect.\n\t * @returns True if the error has an HTTP 404 status.\n\t * @internal\n\t */\n\tprivate isHttpNotFoundError(err: unknown): boolean {\n\t\treturn (\n\t\t\tIs.object<{ properties?: { httpStatus?: number } }>(err) && err.properties?.httpStatus === 404\n\t\t);\n\t}\n\n\t/**\n\t * Map the vault key type to the hashicorp type.\n\t * @param type The vault key type.\n\t * @returns The hashicorp type as a string.\n\t * @throws Error if the key type is not supported.\n\t * @internal\n\t */\n\tprivate mapVaultKeyType(type: VaultKeyType): string {\n\t\tswitch (type) {\n\t\t\tcase VaultKeyType.Ed25519:\n\t\t\t\treturn \"ed25519\";\n\t\t\tcase VaultKeyType.ChaCha20Poly1305:\n\t\t\t\treturn \"chacha20-poly1305\";\n\t\t\tdefault:\n\t\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"unsupportedKeyType\", { type });\n\t\t}\n\t}\n\n\t/**\n\t * Map the vault key type to the hashicorp type index.\n\t * @param type The vault key type.\n\t * @returns The hashicorp type as a string.\n\t * @throws Error if the key type is not supported.\n\t * @internal\n\t */\n\tprivate mapVaultKeyTypeToIndex(type: VaultKeyType): number {\n\t\t// https://github.com/hashicorp/vault/blob/7d89f7104ed6c98e06ca2c75da20c9ef1b113831/sdk/helper/keysutil/policy.go#L58\n\t\tswitch (type) {\n\t\t\tcase VaultKeyType.Ed25519:\n\t\t\t\treturn 2;\n\t\t\tcase VaultKeyType.ChaCha20Poly1305:\n\t\t\t\treturn 5;\n\t\t\tdefault:\n\t\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"unsupportedKeyType\", { type });\n\t\t}\n\t}\n\n\t/**\n\t * Map the hashicorp key type to the vault type.\n\t * @param type The hashicorp key type.\n\t * @returns The vault key type.\n\t * @throws Error if the key type is not supported.\n\t * @internal\n\t */\n\tprivate mapHashicorpKeyType(type: string): VaultKeyType {\n\t\tswitch (type) {\n\t\t\tcase \"ed25519\":\n\t\t\t\treturn VaultKeyType.Ed25519;\n\t\t\tcase \"chacha20-poly1305\":\n\t\t\t\treturn VaultKeyType.ChaCha20Poly1305;\n\t\t\tdefault:\n\t\t\t\tthrow new GeneralError(HashicorpVaultConnector.CLASS_NAME, \"unsupportedKeyType\", { type });\n\t\t}\n\t}\n\n\t/**\n\t * Check if the key type is asymmetric.\n\t * @param type The key type.\n\t * @returns True if the key type is asymmetric.\n\t * @internal\n\t */\n\tprivate isAsymmetricKeyType(type: VaultKeyType): boolean {\n\t\tswitch (type) {\n\t\t\tcase VaultKeyType.Ed25519:\n\t\t\t\treturn true;\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\t/**\n\t * Fetch the versions of a secret.\n\t * @param name The name of the secret.\n\t * @returns The versions of the secret.\n\t * @throws Error if the secret is not found.\n\t * @internal\n\t */\n\tprivate async fetchSecretVersions(name: string): Promise<number[]> {\n\t\tGuards.stringValue(HashicorpVaultConnector.CLASS_NAME, \"name\", name);\n\n\t\ttry {\n\t\t\tconst path = this.getSecretMetadataPath(name);\n\t\t\tconst url = `${this._baseUrl}/${path}`;\n\n\t\t\tconst response = await FetchHelper.fetchJson<\n\t\t\t\tnever,\n\t\t\t\tIHashicorpVaultResponse<ISecretVersionResponse>\n\t\t\t>(HashicorpVaultConnector.CLASS_NAME, url, HttpMethod.GET, undefined, this._requestOptions);\n\n\t\t\tif (response?.data?.versions) {\n\t\t\t\tconst versions = Object.keys(response.data.versions).map(Number);\n\t\t\t\treturn versions;\n\t\t\t}\n\t\t\tthrow new NotFoundError(HashicorpVaultConnector.CLASS_NAME, \"secretNotFound\", name);\n\t\t} catch (err) {\n\t\t\tif (this.isHttpNotFoundError(err)) {\n\t\t\t\tthrow new NotFoundError(\n\t\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\t\"secretNotFound\",\n\t\t\t\t\tname,\n\t\t\t\t\tundefined,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (BaseError.isErrorName(err, NotFoundError.CLASS_NAME)) {\n\t\t\t\tthrow err;\n\t\t\t}\n\t\t\tthrow new GeneralError(\n\t\t\t\tHashicorpVaultConnector.CLASS_NAME,\n\t\t\t\t\"getSecretVersionsFailed\",\n\t\t\t\t{ name },\n\t\t\t\terr\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Encode the name parameter.\n\t * @param name The name to encode.\n\t * @returns The encoded name.\n\t * @internal\n\t */\n\tprivate getEncodedName(name: string): string {\n\t\tconst safeName = name.replace(/[^\\dA-Za-z-]/g, \"_\").replace(/[_-]+$/, \"\");\n\n\t\treturn Is.stringValue(this._prefix)\n\t\t\t? `${encodeURIComponent(this._prefix)}_${safeName}`\n\t\t\t: safeName;\n\t}\n\n\t/**\n\t * Get the path for a secret.\n\t * @param name The name of the secret.\n\t * @returns The path for the secret.\n\t * @internal\n\t */\n\tprivate getSecretPath(name: string): string {\n\t\treturn `${this._kvMountPath}/data/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for the metadata of a secret.\n\t * @param name The name of the secret.\n\t * @returns The path for the metadata of the secret.\n\t * @internal\n\t */\n\tprivate getSecretMetadataPath(name: string): string {\n\t\treturn `${this._kvMountPath}/metadata/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the key.\n\t * @internal\n\t */\n\tprivate getTransitKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/keys/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for exporting a Transit key.\n\t * @param name The name of the key.\n\t * @param keyType The type of the key.\n\t * @returns The path for exporting the key.\n\t * @internal\n\t */\n\tprivate getTransitExportKeyPath(name: string, keyType: string): string {\n\t\treturn `${this._transitMountPath}/export/${keyType}/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for the Transit key config.\n\t * @param name The name of the key to update.\n\t * @returns The path for the key config.\n\t * @internal\n\t */\n\tprivate getTransitKeyConfigPath(name: string): string {\n\t\treturn `${this._transitMountPath}/keys/${this.getEncodedName(name)}/config`;\n\t}\n\n\t/**\n\t * Get the path to backup a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the backup key.\n\t * @internal\n\t */\n\tprivate getTransitBackupKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/backup/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for restoring a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the restore key.\n\t * @internal\n\t */\n\tprivate getTransitRestoreKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/restore/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for importing a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the import key.\n\t * @internal\n\t */\n\tprivate getTransitImportKeyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/keys/${this.getEncodedName(name)}/import`;\n\t}\n\n\t/**\n\t * Get the path for signing data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the sign.\n\t * @internal\n\t */\n\tprivate getTransitSignPath(name: string): string {\n\t\treturn `${this._transitMountPath}/sign/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for verifying data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for the verify.\n\t * @internal\n\t */\n\tprivate getTransitVerifyPath(name: string): string {\n\t\treturn `${this._transitMountPath}/verify/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for encrypting data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for encryption.\n\t * @internal\n\t */\n\tprivate getTransitEncryptPath(name: string): string {\n\t\treturn `${this._transitMountPath}/encrypt/${this.getEncodedName(name)}`;\n\t}\n\n\t/**\n\t * Get the path for decrypting data with a Transit key.\n\t * @param name The name of the key.\n\t * @returns The path for decryption.\n\t * @internal\n\t */\n\tprivate getTransitDecryptPath(name: string): string {\n\t\treturn `${this._transitMountPath}/decrypt/${this.getEncodedName(name)}`;\n\t}\n}\n"]}
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.20.0-next.3](https://github.com/3sixtyglobal/vault/compare/vault-connector-hashicorp-v0.20.0-next.2...vault-connector-hashicorp-v0.20.0-next.3) (2026-11-09)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Bug Fixes
|
|
7
|
+
|
|
8
|
+
* describe what each health check does ([#14](https://github.com/3sixtyglobal/vault/issues/14)) ([7e2f62c](https://github.com/3sixtyglobal/vault/commit/7e2f62c1174060643841d180cdb9e3f9593d4630))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @3sixty/vault-models bumped from 0.20.0-next.2 to 0.20.0-next.3
|
|
16
|
+
|
|
17
|
+
## [0.20.0-next.2](https://github.com/3sixtyglobal/vault/compare/vault-connector-hashicorp-v0.20.0-next.1...vault-connector-hashicorp-v0.20.0-next.2) (2026-10-26)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* release to next [skip ci] ([#11](https://github.com/3sixtyglobal/vault/issues/11)) ([ac3d481](https://github.com/3sixtyglobal/vault/commit/ac3d4819869724df40e2e9a8d68e28a20353525b))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
### Dependencies
|
|
26
|
+
|
|
27
|
+
* The following workspace dependencies were updated
|
|
28
|
+
* dependencies
|
|
29
|
+
* @3sixty/vault-models bumped from 0.20.0-next.1 to 0.20.0-next.2
|
|
30
|
+
|
|
3
31
|
## [0.20.0-next.1](https://github.com/3sixtyglobal/vault/compare/vault-connector-hashicorp-v0.20.0-next.0...vault-connector-hashicorp-v0.20.0-next.1) (2026-10-23)
|
|
4
32
|
|
|
5
33
|
|
package/locales/en.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"health": {
|
|
8
8
|
"hashicorpVaultConnector": {
|
|
9
|
-
"healthDescription": "
|
|
9
|
+
"healthDescription": "Requests the health status of the Hashicorp Vault server at \"{endpoint}\"",
|
|
10
10
|
"vaultHealthCheckFailed": "Failed to check Vault health status \"{endpoint}\""
|
|
11
11
|
}
|
|
12
12
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@3sixty/vault-connector-hashicorp",
|
|
3
|
-
"version": "0.20.0-next.
|
|
3
|
+
"version": "0.20.0-next.3",
|
|
4
4
|
"description": "HashiCorp Vault connector for transit cryptography and KV secret workflows",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -13,18 +13,18 @@
|
|
|
13
13
|
],
|
|
14
14
|
"license": "Apache-2.0",
|
|
15
15
|
"type": "module",
|
|
16
|
+
"sideEffects": false,
|
|
16
17
|
"engines": {
|
|
17
|
-
"node": ">=24.0.0"
|
|
18
|
+
"node": ">=24.0.0",
|
|
19
|
+
"bun": ">=1.4.4"
|
|
18
20
|
},
|
|
19
21
|
"dependencies": {
|
|
20
22
|
"@3sixty/api-models": "next",
|
|
21
23
|
"@3sixty/core": "next",
|
|
22
24
|
"@3sixty/crypto": "next",
|
|
23
|
-
"@3sixty/entity": "next",
|
|
24
|
-
"@3sixty/entity-storage-models": "next",
|
|
25
25
|
"@3sixty/logging-models": "next",
|
|
26
26
|
"@3sixty/nameof": "next",
|
|
27
|
-
"@3sixty/vault-models": "0.20.0-next.
|
|
27
|
+
"@3sixty/vault-models": "0.20.0-next.3",
|
|
28
28
|
"@3sixty/web": "next"
|
|
29
29
|
},
|
|
30
30
|
"main": "./dist/es/index.js",
|