@decaf-ts/integrations 0.11.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -0
- package/dist/integrations.cjs +1 -1
- package/dist/integrations.cjs.map +1 -1
- package/dist/integrations.js +1 -1
- package/dist/integrations.js.map +1 -1
- package/docker/mailpit-compose.yml +17 -0
- package/docker/postgres-compose.yml +26 -0
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs +12 -23
- package/lib/cjs/blob/azure/AzureBlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/core/BlobStoreService.cjs +26 -25
- package/lib/cjs/blob/core/BlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs +12 -23
- package/lib/cjs/blob/gcp/GcsBlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs +11 -16
- package/lib/cjs/blob/s3/S3BlobStoreService.cjs.map +1 -1
- package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs +14 -16
- package/lib/cjs/blob/s3/S3CompatibleBlobStoreService.cjs.map +1 -1
- package/lib/cjs/comms/email/EmailService.cjs +376 -0
- package/lib/cjs/comms/email/EmailService.cjs.map +1 -0
- package/lib/cjs/comms/email/index.cjs +29 -0
- package/lib/cjs/comms/email/index.cjs.map +1 -0
- package/lib/cjs/comms/email/mime.cjs +225 -0
- package/lib/cjs/comms/email/mime.cjs.map +1 -0
- package/lib/cjs/comms/email/smtp.cjs +204 -0
- package/lib/cjs/comms/email/smtp.cjs.map +1 -0
- package/lib/cjs/comms/environment.cjs +63 -0
- package/lib/cjs/comms/environment.cjs.map +1 -0
- package/lib/cjs/comms/gmail/GmailService.cjs +235 -0
- package/lib/cjs/comms/gmail/GmailService.cjs.map +1 -0
- package/lib/cjs/comms/gmail/index.cjs +24 -0
- package/lib/cjs/comms/gmail/index.cjs.map +1 -0
- package/lib/cjs/comms/index.cjs +31 -0
- package/lib/cjs/comms/index.cjs.map +1 -0
- package/lib/cjs/comms/slack/SlackService.cjs +264 -0
- package/lib/cjs/comms/slack/SlackService.cjs.map +1 -0
- package/lib/cjs/comms/slack/index.cjs +24 -0
- package/lib/cjs/comms/slack/index.cjs.map +1 -0
- package/lib/cjs/comms/teams/TeamsService.cjs +212 -0
- package/lib/cjs/comms/teams/TeamsService.cjs.map +1 -0
- package/lib/cjs/comms/teams/index.cjs +24 -0
- package/lib/cjs/comms/teams/index.cjs.map +1 -0
- package/lib/cjs/comms/telegram/TelegramService.cjs +196 -0
- package/lib/cjs/comms/telegram/TelegramService.cjs.map +1 -0
- package/lib/cjs/comms/telegram/index.cjs +24 -0
- package/lib/cjs/comms/telegram/index.cjs.map +1 -0
- package/lib/cjs/devops/environment.cjs +43 -0
- package/lib/cjs/devops/environment.cjs.map +1 -0
- package/lib/cjs/devops/github/GithubService.cjs +302 -0
- package/lib/cjs/devops/github/GithubService.cjs.map +1 -0
- package/lib/cjs/devops/github/index.cjs +24 -0
- package/lib/cjs/devops/github/index.cjs.map +1 -0
- package/lib/cjs/devops/gitlab/GitlabService.cjs +282 -0
- package/lib/cjs/devops/gitlab/GitlabService.cjs.map +1 -0
- package/lib/cjs/devops/gitlab/index.cjs +24 -0
- package/lib/cjs/devops/gitlab/index.cjs.map +1 -0
- package/lib/cjs/devops/index.cjs +28 -0
- package/lib/cjs/devops/index.cjs.map +1 -0
- package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +2 -0
- package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs.map +1 -1
- package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +2 -0
- package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs.map +1 -1
- package/lib/cjs/index.cjs +3 -3
- package/lib/cjs/io/airtable/AirtableService.cjs +266 -0
- package/lib/cjs/io/airtable/AirtableService.cjs.map +1 -0
- package/lib/cjs/io/airtable/index.cjs +24 -0
- package/lib/cjs/io/airtable/index.cjs.map +1 -0
- package/lib/cjs/io/environment.cjs +46 -0
- package/lib/cjs/io/environment.cjs.map +1 -0
- package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs +288 -0
- package/lib/cjs/io/google-sheets/GoogleSheetsService.cjs.map +1 -0
- package/lib/cjs/io/google-sheets/index.cjs +24 -0
- package/lib/cjs/io/google-sheets/index.cjs.map +1 -0
- package/lib/cjs/io/graphql/GraphqlService.cjs +143 -0
- package/lib/cjs/io/graphql/GraphqlService.cjs.map +1 -0
- package/lib/cjs/io/graphql/index.cjs +24 -0
- package/lib/cjs/io/graphql/index.cjs.map +1 -0
- package/lib/cjs/io/index.cjs +30 -0
- package/lib/cjs/io/index.cjs.map +1 -0
- package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs +205 -0
- package/lib/cjs/io/spreadsheet/SpreadsheetService.cjs.map +1 -0
- package/lib/cjs/io/spreadsheet/index.cjs +25 -0
- package/lib/cjs/io/spreadsheet/index.cjs.map +1 -0
- package/lib/cjs/namespaces/index.cjs +1 -0
- package/lib/cjs/namespaces/index.cjs.map +1 -1
- package/lib/cjs/namespaces/models/credential.model.cjs +115 -0
- package/lib/cjs/namespaces/models/credential.model.cjs.map +1 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs +2 -0
- package/lib/cjs/namespaces/models/effective-permission.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/group-membership.model.cjs +2 -0
- package/lib/cjs/namespaces/models/group-membership.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/group.model.cjs +2 -0
- package/lib/cjs/namespaces/models/group.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/index.cjs +1 -0
- package/lib/cjs/namespaces/models/index.cjs.map +1 -1
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs +2 -0
- package/lib/cjs/namespaces/models/inheritance-block.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit-closure.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit-membership.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit-profile.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/org-unit.model.cjs +2 -0
- package/lib/cjs/namespaces/models/org-unit.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/permission.model.cjs +2 -0
- package/lib/cjs/namespaces/models/permission.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/principal.model.cjs +2 -0
- package/lib/cjs/namespaces/models/principal.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/protected-resource.model.cjs +2 -0
- package/lib/cjs/namespaces/models/protected-resource.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/resource-grant.model.cjs +2 -0
- package/lib/cjs/namespaces/models/resource-grant.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/role-assignment.model.cjs +2 -0
- package/lib/cjs/namespaces/models/role-assignment.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/role-permission.model.cjs +2 -0
- package/lib/cjs/namespaces/models/role-permission.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/role.model.cjs +2 -0
- package/lib/cjs/namespaces/models/role.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/storage-binding.model.cjs +2 -0
- package/lib/cjs/namespaces/models/storage-binding.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs +2 -0
- package/lib/cjs/namespaces/models/tenant-membership.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs +2 -0
- package/lib/cjs/namespaces/models/tenant-profile.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/tenant.model.cjs +2 -0
- package/lib/cjs/namespaces/models/tenant.model.cjs.map +1 -1
- package/lib/cjs/namespaces/models/user.model.cjs +2 -0
- package/lib/cjs/namespaces/models/user.model.cjs.map +1 -1
- package/lib/cjs/namespaces/rls/index.cjs +28 -0
- package/lib/cjs/namespaces/rls/index.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/principal-resolver.cjs +66 -0
- package/lib/cjs/namespaces/rls/principal-resolver.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs +269 -0
- package/lib/cjs/namespaces/rls/rls-bootstrap.service.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls.constants.cjs +79 -0
- package/lib/cjs/namespaces/rls/rls.constants.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls.template.cjs +719 -0
- package/lib/cjs/namespaces/rls/rls.template.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/rls.types.cjs +4 -0
- package/lib/cjs/namespaces/rls/rls.types.cjs.map +1 -0
- package/lib/cjs/namespaces/rls/session-binding.cjs +70 -0
- package/lib/cjs/namespaces/rls/session-binding.cjs.map +1 -0
- package/lib/cjs/namespaces/services/credential.service.cjs +327 -0
- package/lib/cjs/namespaces/services/credential.service.cjs.map +1 -0
- package/lib/cjs/namespaces/services/index.cjs +1 -0
- package/lib/cjs/namespaces/services/index.cjs.map +1 -1
- package/lib/cjs/namespaces/types.cjs +6 -1
- package/lib/cjs/namespaces/types.cjs.map +1 -1
- package/lib/cjs/redis/adapter.cjs +7 -1
- package/lib/cjs/redis/adapter.cjs.map +1 -1
- package/lib/cjs/secrets/InfraCredentialBootstrap.cjs +80 -0
- package/lib/cjs/secrets/InfraCredentialBootstrap.cjs.map +1 -0
- package/lib/cjs/secrets/aws/AwsSecretService.cjs +2 -15
- package/lib/cjs/secrets/aws/AwsSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs +2 -16
- package/lib/cjs/secrets/azure/AzureKeyVaultSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/core/SecretReference.cjs +1 -0
- package/lib/cjs/secrets/core/SecretReference.cjs.map +1 -1
- package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs +28 -0
- package/lib/cjs/secrets/fs/FsSecretEnvironment.cjs.map +1 -0
- package/lib/cjs/secrets/fs/FsSecretService.cjs +420 -0
- package/lib/cjs/secrets/fs/FsSecretService.cjs.map +1 -0
- package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs +25 -0
- package/lib/cjs/secrets/fs/FsSecretServiceConfig.cjs.map +1 -0
- package/lib/cjs/secrets/fs/index.cjs +27 -0
- package/lib/cjs/secrets/fs/index.cjs.map +1 -0
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs +2 -16
- package/lib/cjs/secrets/gcp/GcpSecretManagerService.cjs.map +1 -1
- package/lib/cjs/secrets/index.cjs +2 -0
- package/lib/cjs/secrets/index.cjs.map +1 -1
- package/lib/cjs/secrets/model/ModelSecretService.cjs +335 -43
- package/lib/cjs/secrets/model/ModelSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/model/Secret.cjs +83 -5
- package/lib/cjs/secrets/model/Secret.cjs.map +1 -1
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs +2 -16
- package/lib/cjs/secrets/onepassword/OnePasswordSecretService.cjs.map +1 -1
- package/lib/cjs/secrets/vault/VaultSecretService.cjs +2 -16
- package/lib/cjs/secrets/vault/VaultSecretService.cjs.map +1 -1
- package/lib/cjs/shared/environmentValue.cjs +24 -0
- package/lib/cjs/shared/environmentValue.cjs.map +1 -1
- package/lib/cjs/shared/http/HttpApiService.cjs +190 -0
- package/lib/cjs/shared/http/HttpApiService.cjs.map +1 -0
- package/lib/cjs/shared/http/hermeticBoot.cjs +150 -0
- package/lib/cjs/shared/http/hermeticBoot.cjs.map +1 -0
- package/lib/cjs/shared/http/index.cjs +28 -0
- package/lib/cjs/shared/http/index.cjs.map +1 -0
- package/lib/esm/blob/azure/AzureBlobStoreService.js +13 -21
- package/lib/esm/blob/azure/AzureBlobStoreService.js.map +1 -1
- package/lib/esm/blob/core/BlobStoreService.js +26 -25
- package/lib/esm/blob/core/BlobStoreService.js.map +1 -1
- package/lib/esm/blob/gcp/GcsBlobStoreService.js +13 -21
- package/lib/esm/blob/gcp/GcsBlobStoreService.js.map +1 -1
- package/lib/esm/blob/s3/S3BlobStoreService.js +12 -14
- package/lib/esm/blob/s3/S3BlobStoreService.js.map +1 -1
- package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js +14 -16
- package/lib/esm/blob/s3/S3CompatibleBlobStoreService.js.map +1 -1
- package/lib/esm/comms/email/EmailService.js +338 -0
- package/lib/esm/comms/email/EmailService.js.map +1 -0
- package/lib/esm/comms/email/index.js +12 -0
- package/lib/esm/comms/email/index.js.map +1 -0
- package/lib/esm/comms/email/mime.js +218 -0
- package/lib/esm/comms/email/mime.js.map +1 -0
- package/lib/esm/comms/email/smtp.js +166 -0
- package/lib/esm/comms/email/smtp.js.map +1 -0
- package/lib/esm/comms/environment.js +59 -0
- package/lib/esm/comms/environment.js.map +1 -0
- package/lib/esm/comms/gmail/GmailService.js +230 -0
- package/lib/esm/comms/gmail/GmailService.js.map +1 -0
- package/lib/esm/comms/gmail/index.js +7 -0
- package/lib/esm/comms/gmail/index.js.map +1 -0
- package/lib/esm/comms/index.js +14 -0
- package/lib/esm/comms/index.js.map +1 -0
- package/lib/esm/comms/slack/SlackService.js +259 -0
- package/lib/esm/comms/slack/SlackService.js.map +1 -0
- package/lib/esm/comms/slack/index.js +7 -0
- package/lib/esm/comms/slack/index.js.map +1 -0
- package/lib/esm/comms/teams/TeamsService.js +204 -0
- package/lib/esm/comms/teams/TeamsService.js.map +1 -0
- package/lib/esm/comms/teams/index.js +7 -0
- package/lib/esm/comms/teams/index.js.map +1 -0
- package/lib/esm/comms/telegram/TelegramService.js +191 -0
- package/lib/esm/comms/telegram/TelegramService.js.map +1 -0
- package/lib/esm/comms/telegram/index.js +7 -0
- package/lib/esm/comms/telegram/index.js.map +1 -0
- package/lib/esm/devops/environment.js +39 -0
- package/lib/esm/devops/environment.js.map +1 -0
- package/lib/esm/devops/github/GithubService.js +297 -0
- package/lib/esm/devops/github/GithubService.js.map +1 -0
- package/lib/esm/devops/github/index.js +7 -0
- package/lib/esm/devops/github/index.js.map +1 -0
- package/lib/esm/devops/gitlab/GitlabService.js +277 -0
- package/lib/esm/devops/gitlab/GitlabService.js.map +1 -0
- package/lib/esm/devops/gitlab/index.js +7 -0
- package/lib/esm/devops/gitlab/index.js.map +1 -0
- package/lib/esm/devops/index.js +11 -0
- package/lib/esm/devops/index.js.map +1 -0
- package/lib/esm/feature-flags/models/FeatureFlag.model.js +2 -0
- package/lib/esm/feature-flags/models/FeatureFlag.model.js.map +1 -1
- package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +2 -0
- package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js.map +1 -1
- package/lib/esm/index.js +3 -3
- package/lib/esm/io/airtable/AirtableService.js +261 -0
- package/lib/esm/io/airtable/AirtableService.js.map +1 -0
- package/lib/esm/io/airtable/index.js +7 -0
- package/lib/esm/io/airtable/index.js.map +1 -0
- package/lib/esm/io/environment.js +42 -0
- package/lib/esm/io/environment.js.map +1 -0
- package/lib/esm/io/google-sheets/GoogleSheetsService.js +283 -0
- package/lib/esm/io/google-sheets/GoogleSheetsService.js.map +1 -0
- package/lib/esm/io/google-sheets/index.js +7 -0
- package/lib/esm/io/google-sheets/index.js.map +1 -0
- package/lib/esm/io/graphql/GraphqlService.js +138 -0
- package/lib/esm/io/graphql/GraphqlService.js.map +1 -0
- package/lib/esm/io/graphql/index.js +7 -0
- package/lib/esm/io/graphql/index.js.map +1 -0
- package/lib/esm/io/index.js +13 -0
- package/lib/esm/io/index.js.map +1 -0
- package/lib/esm/io/spreadsheet/SpreadsheetService.js +200 -0
- package/lib/esm/io/spreadsheet/SpreadsheetService.js.map +1 -0
- package/lib/esm/io/spreadsheet/index.js +8 -0
- package/lib/esm/io/spreadsheet/index.js.map +1 -0
- package/lib/esm/namespaces/index.js +1 -0
- package/lib/esm/namespaces/index.js.map +1 -1
- package/lib/esm/namespaces/models/credential.model.js +106 -0
- package/lib/esm/namespaces/models/credential.model.js.map +1 -0
- package/lib/esm/namespaces/models/effective-permission.model.js +2 -0
- package/lib/esm/namespaces/models/effective-permission.model.js.map +1 -1
- package/lib/esm/namespaces/models/group-membership.model.js +2 -0
- package/lib/esm/namespaces/models/group-membership.model.js.map +1 -1
- package/lib/esm/namespaces/models/group.model.js +2 -0
- package/lib/esm/namespaces/models/group.model.js.map +1 -1
- package/lib/esm/namespaces/models/index.js +1 -0
- package/lib/esm/namespaces/models/index.js.map +1 -1
- package/lib/esm/namespaces/models/inheritance-block.model.js +2 -0
- package/lib/esm/namespaces/models/inheritance-block.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit-closure.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit-closure.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit-membership.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit-membership.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit-profile.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit-profile.model.js.map +1 -1
- package/lib/esm/namespaces/models/org-unit.model.js +2 -0
- package/lib/esm/namespaces/models/org-unit.model.js.map +1 -1
- package/lib/esm/namespaces/models/permission.model.js +2 -0
- package/lib/esm/namespaces/models/permission.model.js.map +1 -1
- package/lib/esm/namespaces/models/principal.model.js +2 -0
- package/lib/esm/namespaces/models/principal.model.js.map +1 -1
- package/lib/esm/namespaces/models/protected-resource.model.js +2 -0
- package/lib/esm/namespaces/models/protected-resource.model.js.map +1 -1
- package/lib/esm/namespaces/models/resource-grant.model.js +2 -0
- package/lib/esm/namespaces/models/resource-grant.model.js.map +1 -1
- package/lib/esm/namespaces/models/role-assignment.model.js +2 -0
- package/lib/esm/namespaces/models/role-assignment.model.js.map +1 -1
- package/lib/esm/namespaces/models/role-permission.model.js +2 -0
- package/lib/esm/namespaces/models/role-permission.model.js.map +1 -1
- package/lib/esm/namespaces/models/role.model.js +2 -0
- package/lib/esm/namespaces/models/role.model.js.map +1 -1
- package/lib/esm/namespaces/models/storage-binding.model.js +2 -0
- package/lib/esm/namespaces/models/storage-binding.model.js.map +1 -1
- package/lib/esm/namespaces/models/tenant-membership.model.js +2 -0
- package/lib/esm/namespaces/models/tenant-membership.model.js.map +1 -1
- package/lib/esm/namespaces/models/tenant-profile.model.js +2 -0
- package/lib/esm/namespaces/models/tenant-profile.model.js.map +1 -1
- package/lib/esm/namespaces/models/tenant.model.js +2 -0
- package/lib/esm/namespaces/models/tenant.model.js.map +1 -1
- package/lib/esm/namespaces/models/user.model.js +2 -0
- package/lib/esm/namespaces/models/user.model.js.map +1 -1
- package/lib/esm/namespaces/rls/index.js +11 -0
- package/lib/esm/namespaces/rls/index.js.map +1 -0
- package/lib/esm/namespaces/rls/principal-resolver.js +61 -0
- package/lib/esm/namespaces/rls/principal-resolver.js.map +1 -0
- package/lib/esm/namespaces/rls/rls-bootstrap.service.js +261 -0
- package/lib/esm/namespaces/rls/rls-bootstrap.service.js.map +1 -0
- package/lib/esm/namespaces/rls/rls.constants.js +75 -0
- package/lib/esm/namespaces/rls/rls.constants.js.map +1 -0
- package/lib/esm/namespaces/rls/rls.template.js +711 -0
- package/lib/esm/namespaces/rls/rls.template.js.map +1 -0
- package/lib/esm/namespaces/rls/rls.types.js +9 -0
- package/lib/esm/namespaces/rls/rls.types.js.map +1 -0
- package/lib/esm/namespaces/rls/session-binding.js +65 -0
- package/lib/esm/namespaces/rls/session-binding.js.map +1 -0
- package/lib/esm/namespaces/services/credential.service.js +322 -0
- package/lib/esm/namespaces/services/credential.service.js.map +1 -0
- package/lib/esm/namespaces/services/index.js +1 -0
- package/lib/esm/namespaces/services/index.js.map +1 -1
- package/lib/esm/namespaces/types.js +6 -0
- package/lib/esm/namespaces/types.js.map +1 -1
- package/lib/esm/redis/adapter.js +7 -1
- package/lib/esm/redis/adapter.js.map +1 -1
- package/lib/esm/secrets/InfraCredentialBootstrap.js +74 -0
- package/lib/esm/secrets/InfraCredentialBootstrap.js.map +1 -0
- package/lib/esm/secrets/aws/AwsSecretService.js +3 -13
- package/lib/esm/secrets/aws/AwsSecretService.js.map +1 -1
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js +2 -13
- package/lib/esm/secrets/azure/AzureKeyVaultSecretService.js.map +1 -1
- package/lib/esm/secrets/core/SecretReference.js +1 -0
- package/lib/esm/secrets/core/SecretReference.js.map +1 -1
- package/lib/esm/secrets/fs/FsSecretEnvironment.js +24 -0
- package/lib/esm/secrets/fs/FsSecretEnvironment.js.map +1 -0
- package/lib/esm/secrets/fs/FsSecretService.js +412 -0
- package/lib/esm/secrets/fs/FsSecretService.js.map +1 -0
- package/lib/esm/secrets/fs/FsSecretServiceConfig.js +21 -0
- package/lib/esm/secrets/fs/FsSecretServiceConfig.js.map +1 -0
- package/lib/esm/secrets/fs/index.js +10 -0
- package/lib/esm/secrets/fs/index.js.map +1 -0
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js +2 -13
- package/lib/esm/secrets/gcp/GcpSecretManagerService.js.map +1 -1
- package/lib/esm/secrets/index.js +2 -0
- package/lib/esm/secrets/index.js.map +1 -1
- package/lib/esm/secrets/model/ModelSecretService.js +337 -42
- package/lib/esm/secrets/model/ModelSecretService.js.map +1 -1
- package/lib/esm/secrets/model/Secret.js +86 -7
- package/lib/esm/secrets/model/Secret.js.map +1 -1
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js +2 -13
- package/lib/esm/secrets/onepassword/OnePasswordSecretService.js.map +1 -1
- package/lib/esm/secrets/vault/VaultSecretService.js +2 -13
- package/lib/esm/secrets/vault/VaultSecretService.js.map +1 -1
- package/lib/esm/shared/environmentValue.js +24 -0
- package/lib/esm/shared/environmentValue.js.map +1 -1
- package/lib/esm/shared/http/HttpApiService.js +181 -0
- package/lib/esm/shared/http/HttpApiService.js.map +1 -0
- package/lib/esm/shared/http/hermeticBoot.js +146 -0
- package/lib/esm/shared/http/hermeticBoot.js.map +1 -0
- package/lib/esm/shared/http/index.js +11 -0
- package/lib/esm/shared/http/index.js.map +1 -0
- package/lib/types/blob/azure/AzureBlobStoreService.d.cts +7 -7
- package/lib/types/blob/azure/AzureBlobStoreService.d.mts +7 -7
- package/lib/types/blob/core/BlobStoreService.d.cts +28 -27
- package/lib/types/blob/core/BlobStoreService.d.mts +28 -27
- package/lib/types/blob/gcp/GcsBlobStoreService.d.cts +7 -7
- package/lib/types/blob/gcp/GcsBlobStoreService.d.mts +7 -7
- package/lib/types/blob/s3/S3BlobStoreService.d.cts +9 -1
- package/lib/types/blob/s3/S3BlobStoreService.d.mts +9 -1
- package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.cts +11 -15
- package/lib/types/blob/s3/S3CompatibleBlobStoreService.d.mts +11 -15
- package/lib/types/comms/email/EmailService.d.cts +184 -0
- package/lib/types/comms/email/EmailService.d.mts +184 -0
- package/lib/types/comms/email/index.d.cts +11 -0
- package/lib/types/comms/email/index.d.mts +11 -0
- package/lib/types/comms/email/mime.d.cts +84 -0
- package/lib/types/comms/email/mime.d.mts +84 -0
- package/lib/types/comms/email/smtp.d.cts +107 -0
- package/lib/types/comms/email/smtp.d.mts +107 -0
- package/lib/types/comms/environment.d.cts +84 -0
- package/lib/types/comms/environment.d.mts +84 -0
- package/lib/types/comms/gmail/GmailService.d.cts +190 -0
- package/lib/types/comms/gmail/GmailService.d.mts +190 -0
- package/lib/types/comms/gmail/index.d.cts +6 -0
- package/lib/types/comms/gmail/index.d.mts +6 -0
- package/lib/types/comms/index.d.cts +13 -0
- package/lib/types/comms/index.d.mts +13 -0
- package/lib/types/comms/slack/SlackService.d.cts +259 -0
- package/lib/types/comms/slack/SlackService.d.mts +259 -0
- package/lib/types/comms/slack/index.d.cts +6 -0
- package/lib/types/comms/slack/index.d.mts +6 -0
- package/lib/types/comms/teams/TeamsService.d.cts +172 -0
- package/lib/types/comms/teams/TeamsService.d.mts +172 -0
- package/lib/types/comms/teams/index.d.cts +6 -0
- package/lib/types/comms/teams/index.d.mts +6 -0
- package/lib/types/comms/telegram/TelegramService.d.cts +202 -0
- package/lib/types/comms/telegram/TelegramService.d.mts +202 -0
- package/lib/types/comms/telegram/index.d.cts +6 -0
- package/lib/types/comms/telegram/index.d.mts +6 -0
- package/lib/types/devops/environment.d.cts +62 -0
- package/lib/types/devops/environment.d.mts +62 -0
- package/lib/types/devops/github/GithubService.d.cts +287 -0
- package/lib/types/devops/github/GithubService.d.mts +287 -0
- package/lib/types/devops/github/index.d.cts +6 -0
- package/lib/types/devops/github/index.d.mts +6 -0
- package/lib/types/devops/gitlab/GitlabService.d.cts +277 -0
- package/lib/types/devops/gitlab/GitlabService.d.mts +277 -0
- package/lib/types/devops/gitlab/index.d.cts +6 -0
- package/lib/types/devops/gitlab/index.d.mts +6 -0
- package/lib/types/devops/index.d.cts +10 -0
- package/lib/types/devops/index.d.mts +10 -0
- package/lib/types/index.d.cts +2 -2
- package/lib/types/index.d.mts +2 -2
- package/lib/types/io/airtable/AirtableService.d.cts +268 -0
- package/lib/types/io/airtable/AirtableService.d.mts +268 -0
- package/lib/types/io/airtable/index.d.cts +6 -0
- package/lib/types/io/airtable/index.d.mts +6 -0
- package/lib/types/io/environment.d.cts +67 -0
- package/lib/types/io/environment.d.mts +67 -0
- package/lib/types/io/google-sheets/GoogleSheetsService.d.cts +204 -0
- package/lib/types/io/google-sheets/GoogleSheetsService.d.mts +204 -0
- package/lib/types/io/google-sheets/index.d.cts +6 -0
- package/lib/types/io/google-sheets/index.d.mts +6 -0
- package/lib/types/io/graphql/GraphqlService.d.cts +173 -0
- package/lib/types/io/graphql/GraphqlService.d.mts +173 -0
- package/lib/types/io/graphql/index.d.cts +6 -0
- package/lib/types/io/graphql/index.d.mts +6 -0
- package/lib/types/io/index.d.cts +12 -0
- package/lib/types/io/index.d.mts +12 -0
- package/lib/types/io/spreadsheet/SpreadsheetService.d.cts +144 -0
- package/lib/types/io/spreadsheet/SpreadsheetService.d.mts +144 -0
- package/lib/types/io/spreadsheet/index.d.cts +7 -0
- package/lib/types/io/spreadsheet/index.d.mts +7 -0
- package/lib/types/namespaces/index.d.cts +1 -0
- package/lib/types/namespaces/index.d.mts +1 -0
- package/lib/types/namespaces/models/credential.model.d.cts +23 -0
- package/lib/types/namespaces/models/credential.model.d.mts +23 -0
- package/lib/types/namespaces/models/index.d.cts +1 -0
- package/lib/types/namespaces/models/index.d.mts +1 -0
- package/lib/types/namespaces/rls/index.d.cts +10 -0
- package/lib/types/namespaces/rls/index.d.mts +10 -0
- package/lib/types/namespaces/rls/principal-resolver.d.cts +47 -0
- package/lib/types/namespaces/rls/principal-resolver.d.mts +47 -0
- package/lib/types/namespaces/rls/rls-bootstrap.service.d.cts +157 -0
- package/lib/types/namespaces/rls/rls-bootstrap.service.d.mts +157 -0
- package/lib/types/namespaces/rls/rls.constants.d.cts +52 -0
- package/lib/types/namespaces/rls/rls.constants.d.mts +52 -0
- package/lib/types/namespaces/rls/rls.template.d.cts +42 -0
- package/lib/types/namespaces/rls/rls.template.d.mts +42 -0
- package/lib/types/namespaces/rls/rls.types.d.cts +77 -0
- package/lib/types/namespaces/rls/rls.types.d.mts +77 -0
- package/lib/types/namespaces/rls/session-binding.d.cts +87 -0
- package/lib/types/namespaces/rls/session-binding.d.mts +87 -0
- package/lib/types/namespaces/services/credential.service.d.cts +175 -0
- package/lib/types/namespaces/services/credential.service.d.mts +175 -0
- package/lib/types/namespaces/services/index.d.cts +1 -0
- package/lib/types/namespaces/services/index.d.mts +1 -0
- package/lib/types/namespaces/types.d.cts +37 -0
- package/lib/types/namespaces/types.d.mts +37 -0
- package/lib/types/redis/adapter.d.cts +2 -0
- package/lib/types/redis/adapter.d.mts +2 -0
- package/lib/types/redis/types.d.cts +27 -2
- package/lib/types/redis/types.d.mts +27 -2
- package/lib/types/secrets/InfraCredentialBootstrap.d.cts +100 -0
- package/lib/types/secrets/InfraCredentialBootstrap.d.mts +100 -0
- package/lib/types/secrets/core/SecretTypes.d.cts +15 -1
- package/lib/types/secrets/core/SecretTypes.d.mts +15 -1
- package/lib/types/secrets/fs/FsSecretEnvironment.d.cts +42 -0
- package/lib/types/secrets/fs/FsSecretEnvironment.d.mts +42 -0
- package/lib/types/secrets/fs/FsSecretService.d.cts +207 -0
- package/lib/types/secrets/fs/FsSecretService.d.mts +207 -0
- package/lib/types/secrets/fs/FsSecretServiceConfig.d.cts +37 -0
- package/lib/types/secrets/fs/FsSecretServiceConfig.d.mts +37 -0
- package/lib/types/secrets/fs/index.d.cts +9 -0
- package/lib/types/secrets/fs/index.d.mts +9 -0
- package/lib/types/secrets/index.d.cts +2 -0
- package/lib/types/secrets/index.d.mts +2 -0
- package/lib/types/secrets/model/ModelSecretService.d.cts +190 -1
- package/lib/types/secrets/model/ModelSecretService.d.mts +190 -1
- package/lib/types/secrets/model/Secret.d.cts +44 -3
- package/lib/types/secrets/model/Secret.d.mts +44 -3
- package/lib/types/shared/environmentValue.d.cts +24 -0
- package/lib/types/shared/environmentValue.d.mts +24 -0
- package/lib/types/shared/http/HttpApiService.d.cts +193 -0
- package/lib/types/shared/http/HttpApiService.d.mts +193 -0
- package/lib/types/shared/http/hermeticBoot.d.cts +84 -0
- package/lib/types/shared/http/hermeticBoot.d.mts +84 -0
- package/lib/types/shared/http/index.d.cts +10 -0
- package/lib/types/shared/http/index.d.mts +10 -0
- package/package.json +180 -3
- package/sql/002_rls.sql +660 -15
- package/sql/004_credentials.sql +46 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @summary Secret core types.
|
|
4
4
|
* @description Shared payload, metadata, option, and configuration types for secret service implementations.
|
|
5
5
|
*/
|
|
6
|
-
export type SecretProvider = "model" | "memory" | "hashicorp-vault" | "aws-secrets-manager" | "azure-key-vault" | "gcp-secret-manager" | "1password";
|
|
6
|
+
export type SecretProvider = "model" | "memory" | "filesystem" | "hashicorp-vault" | "aws-secrets-manager" | "azure-key-vault" | "gcp-secret-manager" | "1password";
|
|
7
7
|
export type SecretName = string;
|
|
8
8
|
export type SecretPayload = string | Record<string, unknown> | Uint8Array;
|
|
9
9
|
export interface SerializedSecretPayload {
|
|
@@ -47,6 +47,20 @@ export interface StoreSecretOptions {
|
|
|
47
47
|
tags?: Record<string, string>;
|
|
48
48
|
version?: string;
|
|
49
49
|
ttl?: number;
|
|
50
|
+
/**
|
|
51
|
+
* @description Namespace tenant that owns the secret.
|
|
52
|
+
* @summary Stamped onto model-backed secrets so the namespace RLS policies
|
|
53
|
+
* can scope reads and writes without joining the credential row.
|
|
54
|
+
*/
|
|
55
|
+
tenantId?: string;
|
|
56
|
+
/**
|
|
57
|
+
* @description Organizational unit that owns the secret.
|
|
58
|
+
*/
|
|
59
|
+
orgUnitId?: string;
|
|
60
|
+
/**
|
|
61
|
+
* @description Principal that owns the secret.
|
|
62
|
+
*/
|
|
63
|
+
ownerPrincipalId?: string;
|
|
50
64
|
}
|
|
51
65
|
export interface RetrieveSecretOptions {
|
|
52
66
|
version?: string;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/fs/environment
|
|
3
|
+
* @summary Environment configuration slice for the filesystem secret service.
|
|
4
|
+
* @description Accumulates the `secrets.fs` slice into the shared
|
|
5
|
+
* `SecretEnvironment` so `{@link FsSecretService}` can resolve its
|
|
6
|
+
* `rootPath`, `keySecret`, and `keyId` from the process Environment without
|
|
7
|
+
* explicit boot arguments. A missing `keySecret` disables the
|
|
8
|
+
* Environment-derived configuration path.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @description Environment-backed configuration for the filesystem secret service
|
|
12
|
+
* @summary Mirrors {@link FsSecretServiceConfig} with every field optional:
|
|
13
|
+
* `rootPath` and `keyId` fall back to their defaults, while an empty
|
|
14
|
+
* `keySecret` means the slice is not configured.
|
|
15
|
+
*/
|
|
16
|
+
export interface FsSecretEnvironmentConfig {
|
|
17
|
+
/** @description Directory holding the secret envelopes; defaults to `.decaf/secrets`. */
|
|
18
|
+
rootPath?: string;
|
|
19
|
+
/** @description Master secret used to derive per-secret encryption keys. */
|
|
20
|
+
keySecret?: string;
|
|
21
|
+
/** @description Encryption key id recorded in envelopes; defaults to `fs-default-key`. */
|
|
22
|
+
keyId?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @description Shape of the accumulated Environment containing the `secrets.fs` slice
|
|
26
|
+
* @summary Used to type the `SecretEnvironment.accumulate` call below so the
|
|
27
|
+
* `secrets.fs` accessor is fully typed.
|
|
28
|
+
*/
|
|
29
|
+
export interface FsSecretEnvironmentShape {
|
|
30
|
+
secrets: {
|
|
31
|
+
fs: FsSecretEnvironmentConfig;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @description The accumulated Environment exposing the `secrets.fs` slice
|
|
36
|
+
* @summary Access it as `FsSecretEnvironment.secrets.fs.{rootPath,keySecret,keyId}`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const FsSecretEnvironment: import("@decaf-ts/logging").AccumulatedEnvironment<{
|
|
39
|
+
app: string | undefined;
|
|
40
|
+
} & import("@decaf-ts/logging").LoggingConfig<object> & {
|
|
41
|
+
env: any;
|
|
42
|
+
} & import("..").SecretCommonEnvironmentShape & FsSecretEnvironmentShape>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/fs/environment
|
|
3
|
+
* @summary Environment configuration slice for the filesystem secret service.
|
|
4
|
+
* @description Accumulates the `secrets.fs` slice into the shared
|
|
5
|
+
* `SecretEnvironment` so `{@link FsSecretService}` can resolve its
|
|
6
|
+
* `rootPath`, `keySecret`, and `keyId` from the process Environment without
|
|
7
|
+
* explicit boot arguments. A missing `keySecret` disables the
|
|
8
|
+
* Environment-derived configuration path.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* @description Environment-backed configuration for the filesystem secret service
|
|
12
|
+
* @summary Mirrors {@link FsSecretServiceConfig} with every field optional:
|
|
13
|
+
* `rootPath` and `keyId` fall back to their defaults, while an empty
|
|
14
|
+
* `keySecret` means the slice is not configured.
|
|
15
|
+
*/
|
|
16
|
+
export interface FsSecretEnvironmentConfig {
|
|
17
|
+
/** @description Directory holding the secret envelopes; defaults to `.decaf/secrets`. */
|
|
18
|
+
rootPath?: string;
|
|
19
|
+
/** @description Master secret used to derive per-secret encryption keys. */
|
|
20
|
+
keySecret?: string;
|
|
21
|
+
/** @description Encryption key id recorded in envelopes; defaults to `fs-default-key`. */
|
|
22
|
+
keyId?: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @description Shape of the accumulated Environment containing the `secrets.fs` slice
|
|
26
|
+
* @summary Used to type the `SecretEnvironment.accumulate` call below so the
|
|
27
|
+
* `secrets.fs` accessor is fully typed.
|
|
28
|
+
*/
|
|
29
|
+
export interface FsSecretEnvironmentShape {
|
|
30
|
+
secrets: {
|
|
31
|
+
fs: FsSecretEnvironmentConfig;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* @description The accumulated Environment exposing the `secrets.fs` slice
|
|
36
|
+
* @summary Access it as `FsSecretEnvironment.secrets.fs.{rootPath,keySecret,keyId}`.
|
|
37
|
+
*/
|
|
38
|
+
export declare const FsSecretEnvironment: import("@decaf-ts/logging").AccumulatedEnvironment<{
|
|
39
|
+
app: string | undefined;
|
|
40
|
+
} & import("@decaf-ts/logging").LoggingConfig<object> & {
|
|
41
|
+
env: any;
|
|
42
|
+
} & import("..").SecretCommonEnvironmentShape & FsSecretEnvironmentShape>;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { ContextualArgs, MaybeContextualArg } from "@decaf-ts/core";
|
|
2
|
+
import { ClientBasedSecretService, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, RetrieveSecretOptions, RotateSecretOptions, SecretMetadata, SecretMetadataOptions, SecretName, SecretPayload, SecretProvider, SecretReference, StoreSecretOptions } from "../core/index.d.cts";
|
|
3
|
+
import { FsSecretServiceConfig } from "./FsSecretServiceConfig.d.cts";
|
|
4
|
+
/**
|
|
5
|
+
* @description Filesystem-backed encrypted secret service
|
|
6
|
+
* @summary Stores each secret as an isolated JSON envelope file
|
|
7
|
+
* (`<normalizedName>.json`) inside a private root directory (default
|
|
8
|
+
* `.decaf/secrets`, mode `0o700`; envelope files are written with mode
|
|
9
|
+
* `0o600` through a temp-file-then-rename cycle). The master `keySecret` is
|
|
10
|
+
* required — boot fails with a {@link ValidationError} when neither the
|
|
11
|
+
* `secrets.fs.keySecret` Environment slice nor an explicit config supplies
|
|
12
|
+
* it. Listing and per-secret metadata are intentionally unsupported and
|
|
13
|
+
* throw a `SECRET_UNSUPPORTED_OPERATION` {@link SecretError}, because the
|
|
14
|
+
* filesystem store is designed as a minimal bootstrap sink (see
|
|
15
|
+
* {@link InfraCredentialBootstrap}).
|
|
16
|
+
*
|
|
17
|
+
* Configuration is resolved from the `secrets.fs` slice or an explicit boot
|
|
18
|
+
* config.
|
|
19
|
+
* @class FsSecretService
|
|
20
|
+
* @category Secrets
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { FsSecretService } from "@decaf-ts/integrations/secrets";
|
|
24
|
+
*
|
|
25
|
+
* const fsSecrets = await new FsSecretService().boot({
|
|
26
|
+
* keySecret: "master-key",
|
|
27
|
+
* });
|
|
28
|
+
* await fsSecrets.store("my-secret", { value: "s3cr3t" });
|
|
29
|
+
* const payload = await fsSecrets.retrieve<{ value: string }>("my-secret");
|
|
30
|
+
* ```
|
|
31
|
+
* @mermaid
|
|
32
|
+
* sequenceDiagram
|
|
33
|
+
* autonumber
|
|
34
|
+
* participant Caller
|
|
35
|
+
* participant FS as FsSecretService
|
|
36
|
+
* participant Disk as rootPath/*.json
|
|
37
|
+
* Caller->>FS: store(name, value)
|
|
38
|
+
* activate FS
|
|
39
|
+
* FS->>FS: normalize + serialize + encrypt
|
|
40
|
+
* FS->>Disk: writeEnvelope (temp + rename, 0o600)
|
|
41
|
+
* FS-->>Caller: SecretReference
|
|
42
|
+
* Caller->>FS: retrieve(nameOrRef)
|
|
43
|
+
* FS->>Disk: readEnvelope
|
|
44
|
+
* alt missing file
|
|
45
|
+
* FS--xCaller: NotFoundError
|
|
46
|
+
* else version mismatch
|
|
47
|
+
* FS--xCaller: NotFoundError
|
|
48
|
+
* else decrypt/parse failure
|
|
49
|
+
* FS--xCaller: SecretError
|
|
50
|
+
* else success
|
|
51
|
+
* FS-->>Caller: SecretPayload
|
|
52
|
+
* end
|
|
53
|
+
* deactivate FS
|
|
54
|
+
*/
|
|
55
|
+
export declare class FsSecretService extends ClientBasedSecretService<void, FsSecretServiceConfig> {
|
|
56
|
+
readonly provider: SecretProvider;
|
|
57
|
+
private cryptoService?;
|
|
58
|
+
constructor();
|
|
59
|
+
/**
|
|
60
|
+
* @description Builds the filesystem secret configuration from the Environment
|
|
61
|
+
* @summary Reads the `secrets.fs` Environment slice and returns a
|
|
62
|
+
* {@link FsSecretServiceConfig} when a `keySecret` is configured, applying the
|
|
63
|
+
* default root path and key id otherwise; returns `undefined` when the slice
|
|
64
|
+
* carries no `keySecret`, letting boot fall back to explicit arguments.
|
|
65
|
+
* @returns {FsSecretServiceConfig | undefined} The Environment-derived configuration, or `undefined`.
|
|
66
|
+
* @override
|
|
67
|
+
*/
|
|
68
|
+
protected configFromEnvironment(): FsSecretServiceConfig | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* @description Creates the private store directory and the crypto service
|
|
71
|
+
* @summary Resolves the configuration (Environment slice merged with explicit
|
|
72
|
+
* args), requires a `keySecret`, resolves and creates `rootPath` with mode
|
|
73
|
+
* `0o700`, and boots a fresh `CryptoService`. Returns the resolved config with
|
|
74
|
+
* a `void` client (no external connection is needed).
|
|
75
|
+
* @param {ContextualArgs} args - Optional decaf `Context`/configuration arguments.
|
|
76
|
+
* @returns {Promise<{config: FsSecretServiceConfig, client: void}>} The resolved configuration and a `void` client.
|
|
77
|
+
* @throws {ValidationError} When no `keySecret` is available from Environment or arguments.
|
|
78
|
+
*/
|
|
79
|
+
initialize(...args: ContextualArgs<any>): Promise<{
|
|
80
|
+
config: FsSecretServiceConfig;
|
|
81
|
+
client: void;
|
|
82
|
+
}>;
|
|
83
|
+
/**
|
|
84
|
+
* @description Encrypts and writes a secret envelope to the store
|
|
85
|
+
* @summary Normalizes the name, serializes the payload, derives the
|
|
86
|
+
* encryption key from the master `keySecret`, encrypts with the configured
|
|
87
|
+
* key id, and atomically writes the envelope file. Versioning is expressed
|
|
88
|
+
* through the envelope's `version` field.
|
|
89
|
+
* @template T - The secret payload type.
|
|
90
|
+
* @param {SecretName} name - The secret name (normalized before use).
|
|
91
|
+
* @param {T} value - The payload to encrypt and store.
|
|
92
|
+
* @param {StoreSecretOptions} [options] - Optional content type, tags, and version.
|
|
93
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
94
|
+
* @returns {Promise<SecretReference>} A reference pointing at the envelope file.
|
|
95
|
+
*/
|
|
96
|
+
store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
97
|
+
/**
|
|
98
|
+
* @description Reads, decrypts, and deserializes a stored secret
|
|
99
|
+
* @summary Loads the envelope, validates the requested version when one is
|
|
100
|
+
* supplied (either via options or the reference), re-derives the key using the
|
|
101
|
+
* envelope salt, and decrypts the payload. Failures surface as
|
|
102
|
+
* `SECRET_DECRYPTION_FAILED`/`SECRET_DESERIALIZATION_FAILED`
|
|
103
|
+
* {@link SecretError}s; a missing envelope throws {@link NotFoundError}.
|
|
104
|
+
* @template T - The secret payload type.
|
|
105
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
106
|
+
* @param {RetrieveSecretOptions} [options] - Optional version filter.
|
|
107
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
108
|
+
* @returns {Promise<T>} The decrypted payload.
|
|
109
|
+
* @throws {NotFoundError} When the secret (or requested version) does not exist.
|
|
110
|
+
* @throws {SecretError} On decryption or deserialization failures.
|
|
111
|
+
*/
|
|
112
|
+
retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: MaybeContextualArg<any>): Promise<T>;
|
|
113
|
+
/**
|
|
114
|
+
* @description Removes the envelope file for a secret
|
|
115
|
+
* @summary Deletes `<name>.json` from the root path (`force: true`, so a
|
|
116
|
+
* missing file is not an error); a filesystem failure surfaces as a
|
|
117
|
+
* `SECRET_PROVIDER_UNAVAILABLE` {@link SecretError}.
|
|
118
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
119
|
+
* @param {DeleteSecretOptions} [options] - Unused; accepted for interface parity.
|
|
120
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
121
|
+
* @returns {Promise<void>} Resolves once the file is removed.
|
|
122
|
+
* @throws {SecretError} When the file cannot be deleted.
|
|
123
|
+
*/
|
|
124
|
+
delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: MaybeContextualArg<any>): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* @description Checks whether a secret exists (optionally at a specific version)
|
|
127
|
+
* @summary Reads the envelope and compares the requested version, if any,
|
|
128
|
+
* against the stored one; a {@link NotFoundError} from the read maps to
|
|
129
|
+
* `false`.
|
|
130
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
131
|
+
* @param {ExistsSecretOptions} [options] - Optional version filter.
|
|
132
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
133
|
+
* @returns {Promise<boolean>} `true` when the secret exists and matches the version, if given.
|
|
134
|
+
*/
|
|
135
|
+
exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: MaybeContextualArg<any>): Promise<boolean>;
|
|
136
|
+
/**
|
|
137
|
+
* @description Unsupported: the filesystem store does not expose listings
|
|
138
|
+
* @summary Always throws to keep the filesystem sink minimal; use
|
|
139
|
+
* {@link InfraCredentialBootstrap} to track seeded references instead.
|
|
140
|
+
* @param {ListSecretsOptions} [options] - Unused.
|
|
141
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
142
|
+
* @returns {Promise<SecretMetadata[]>} Never resolves.
|
|
143
|
+
* @throws {SecretError} Always, with `SECRET_UNSUPPORTED_OPERATION`.
|
|
144
|
+
*/
|
|
145
|
+
list(options?: ListSecretsOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata[]>;
|
|
146
|
+
/**
|
|
147
|
+
* @description Unsupported: the filesystem store does not expose metadata
|
|
148
|
+
* @summary Always throws; metadata is embedded in the envelope, which callers
|
|
149
|
+
* are not expected to read directly.
|
|
150
|
+
* @param {SecretName | SecretReference} nameOrRef - Unused.
|
|
151
|
+
* @param {SecretMetadataOptions} [options] - Unused.
|
|
152
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
153
|
+
* @returns {Promise<SecretMetadata | undefined>} Never resolves.
|
|
154
|
+
* @throws {SecretError} Always, with `SECRET_UNSUPPORTED_OPERATION`.
|
|
155
|
+
*/
|
|
156
|
+
metadata(nameOrRef: SecretName | SecretReference, options?: SecretMetadataOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata | undefined>;
|
|
157
|
+
/**
|
|
158
|
+
* @description Overwrites a secret with a new payload and version
|
|
159
|
+
* @summary Re-stores the secret under the same normalized name, tagging the
|
|
160
|
+
* new envelope with `options.newVersion` (the old envelope file is replaced).
|
|
161
|
+
* @template T - The secret payload type.
|
|
162
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
163
|
+
* @param {T} value - The new payload.
|
|
164
|
+
* @param {RotateSecretOptions} [options] - Optional `newVersion` tag.
|
|
165
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
166
|
+
* @returns {Promise<SecretReference>} A reference to the rewritten envelope.
|
|
167
|
+
*/
|
|
168
|
+
rotate<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, value: T, options?: RotateSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
169
|
+
/**
|
|
170
|
+
* @description Lazily resolves the booted `CryptoService`
|
|
171
|
+
* @summary Throws an {@link InternalError} when accessed before
|
|
172
|
+
* `initialize()`/`boot()`, which is the only way the crypto service is
|
|
173
|
+
* created.
|
|
174
|
+
* @returns {CryptoService} The booted crypto service.
|
|
175
|
+
* @throws {InternalError} When the service is not initialized.
|
|
176
|
+
*/
|
|
177
|
+
private get crypto();
|
|
178
|
+
/**
|
|
179
|
+
* @description Resolves the envelope file path for a normalized secret name
|
|
180
|
+
* @param {string} name - The normalized secret name.
|
|
181
|
+
* @returns {string} The absolute envelope path inside the configured root.
|
|
182
|
+
*/
|
|
183
|
+
private fileFor;
|
|
184
|
+
/**
|
|
185
|
+
* @description Reads and parses an envelope file
|
|
186
|
+
* @summary A missing file maps to {@link NotFoundError}; filesystem failures
|
|
187
|
+
* surface as `SECRET_PROVIDER_UNAVAILABLE` and JSON parse failures as
|
|
188
|
+
* `SECRET_DESERIALIZATION_FAILED` {@link SecretError}s.
|
|
189
|
+
* @param {string} name - The normalized secret name.
|
|
190
|
+
* @returns {Promise<FsSecretEnvelope>} The parsed envelope.
|
|
191
|
+
* @throws {NotFoundError} When the envelope file does not exist.
|
|
192
|
+
* @throws {SecretError} On read or parse failures.
|
|
193
|
+
*/
|
|
194
|
+
private readEnvelope;
|
|
195
|
+
/**
|
|
196
|
+
* @description Atomically writes an envelope file with private permissions
|
|
197
|
+
* @summary Writes to a UUID-suffixed temp file with mode `0o600`, then
|
|
198
|
+
* renames it over the target and re-applies the mode; on failure the temp
|
|
199
|
+
* file is removed and a `SECRET_PROVIDER_UNAVAILABLE` {@link SecretError} is
|
|
200
|
+
* thrown.
|
|
201
|
+
* @param {string} name - The normalized secret name.
|
|
202
|
+
* @param {FsSecretEnvelope} envelope - The envelope to persist.
|
|
203
|
+
* @returns {Promise<void>} Resolves once the envelope is durably written.
|
|
204
|
+
* @throws {SecretError} When the write/rename cycle fails.
|
|
205
|
+
*/
|
|
206
|
+
private writeEnvelope;
|
|
207
|
+
}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { ContextualArgs, MaybeContextualArg } from "@decaf-ts/core";
|
|
2
|
+
import { ClientBasedSecretService, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, RetrieveSecretOptions, RotateSecretOptions, SecretMetadata, SecretMetadataOptions, SecretName, SecretPayload, SecretProvider, SecretReference, StoreSecretOptions } from "../core/index.d.mts";
|
|
3
|
+
import { FsSecretServiceConfig } from "./FsSecretServiceConfig.d.mts";
|
|
4
|
+
/**
|
|
5
|
+
* @description Filesystem-backed encrypted secret service
|
|
6
|
+
* @summary Stores each secret as an isolated JSON envelope file
|
|
7
|
+
* (`<normalizedName>.json`) inside a private root directory (default
|
|
8
|
+
* `.decaf/secrets`, mode `0o700`; envelope files are written with mode
|
|
9
|
+
* `0o600` through a temp-file-then-rename cycle). The master `keySecret` is
|
|
10
|
+
* required — boot fails with a {@link ValidationError} when neither the
|
|
11
|
+
* `secrets.fs.keySecret` Environment slice nor an explicit config supplies
|
|
12
|
+
* it. Listing and per-secret metadata are intentionally unsupported and
|
|
13
|
+
* throw a `SECRET_UNSUPPORTED_OPERATION` {@link SecretError}, because the
|
|
14
|
+
* filesystem store is designed as a minimal bootstrap sink (see
|
|
15
|
+
* {@link InfraCredentialBootstrap}).
|
|
16
|
+
*
|
|
17
|
+
* Configuration is resolved from the `secrets.fs` slice or an explicit boot
|
|
18
|
+
* config.
|
|
19
|
+
* @class FsSecretService
|
|
20
|
+
* @category Secrets
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* import { FsSecretService } from "@decaf-ts/integrations/secrets";
|
|
24
|
+
*
|
|
25
|
+
* const fsSecrets = await new FsSecretService().boot({
|
|
26
|
+
* keySecret: "master-key",
|
|
27
|
+
* });
|
|
28
|
+
* await fsSecrets.store("my-secret", { value: "s3cr3t" });
|
|
29
|
+
* const payload = await fsSecrets.retrieve<{ value: string }>("my-secret");
|
|
30
|
+
* ```
|
|
31
|
+
* @mermaid
|
|
32
|
+
* sequenceDiagram
|
|
33
|
+
* autonumber
|
|
34
|
+
* participant Caller
|
|
35
|
+
* participant FS as FsSecretService
|
|
36
|
+
* participant Disk as rootPath/*.json
|
|
37
|
+
* Caller->>FS: store(name, value)
|
|
38
|
+
* activate FS
|
|
39
|
+
* FS->>FS: normalize + serialize + encrypt
|
|
40
|
+
* FS->>Disk: writeEnvelope (temp + rename, 0o600)
|
|
41
|
+
* FS-->>Caller: SecretReference
|
|
42
|
+
* Caller->>FS: retrieve(nameOrRef)
|
|
43
|
+
* FS->>Disk: readEnvelope
|
|
44
|
+
* alt missing file
|
|
45
|
+
* FS--xCaller: NotFoundError
|
|
46
|
+
* else version mismatch
|
|
47
|
+
* FS--xCaller: NotFoundError
|
|
48
|
+
* else decrypt/parse failure
|
|
49
|
+
* FS--xCaller: SecretError
|
|
50
|
+
* else success
|
|
51
|
+
* FS-->>Caller: SecretPayload
|
|
52
|
+
* end
|
|
53
|
+
* deactivate FS
|
|
54
|
+
*/
|
|
55
|
+
export declare class FsSecretService extends ClientBasedSecretService<void, FsSecretServiceConfig> {
|
|
56
|
+
readonly provider: SecretProvider;
|
|
57
|
+
private cryptoService?;
|
|
58
|
+
constructor();
|
|
59
|
+
/**
|
|
60
|
+
* @description Builds the filesystem secret configuration from the Environment
|
|
61
|
+
* @summary Reads the `secrets.fs` Environment slice and returns a
|
|
62
|
+
* {@link FsSecretServiceConfig} when a `keySecret` is configured, applying the
|
|
63
|
+
* default root path and key id otherwise; returns `undefined` when the slice
|
|
64
|
+
* carries no `keySecret`, letting boot fall back to explicit arguments.
|
|
65
|
+
* @returns {FsSecretServiceConfig | undefined} The Environment-derived configuration, or `undefined`.
|
|
66
|
+
* @override
|
|
67
|
+
*/
|
|
68
|
+
protected configFromEnvironment(): FsSecretServiceConfig | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* @description Creates the private store directory and the crypto service
|
|
71
|
+
* @summary Resolves the configuration (Environment slice merged with explicit
|
|
72
|
+
* args), requires a `keySecret`, resolves and creates `rootPath` with mode
|
|
73
|
+
* `0o700`, and boots a fresh `CryptoService`. Returns the resolved config with
|
|
74
|
+
* a `void` client (no external connection is needed).
|
|
75
|
+
* @param {ContextualArgs} args - Optional decaf `Context`/configuration arguments.
|
|
76
|
+
* @returns {Promise<{config: FsSecretServiceConfig, client: void}>} The resolved configuration and a `void` client.
|
|
77
|
+
* @throws {ValidationError} When no `keySecret` is available from Environment or arguments.
|
|
78
|
+
*/
|
|
79
|
+
initialize(...args: ContextualArgs<any>): Promise<{
|
|
80
|
+
config: FsSecretServiceConfig;
|
|
81
|
+
client: void;
|
|
82
|
+
}>;
|
|
83
|
+
/**
|
|
84
|
+
* @description Encrypts and writes a secret envelope to the store
|
|
85
|
+
* @summary Normalizes the name, serializes the payload, derives the
|
|
86
|
+
* encryption key from the master `keySecret`, encrypts with the configured
|
|
87
|
+
* key id, and atomically writes the envelope file. Versioning is expressed
|
|
88
|
+
* through the envelope's `version` field.
|
|
89
|
+
* @template T - The secret payload type.
|
|
90
|
+
* @param {SecretName} name - The secret name (normalized before use).
|
|
91
|
+
* @param {T} value - The payload to encrypt and store.
|
|
92
|
+
* @param {StoreSecretOptions} [options] - Optional content type, tags, and version.
|
|
93
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
94
|
+
* @returns {Promise<SecretReference>} A reference pointing at the envelope file.
|
|
95
|
+
*/
|
|
96
|
+
store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
97
|
+
/**
|
|
98
|
+
* @description Reads, decrypts, and deserializes a stored secret
|
|
99
|
+
* @summary Loads the envelope, validates the requested version when one is
|
|
100
|
+
* supplied (either via options or the reference), re-derives the key using the
|
|
101
|
+
* envelope salt, and decrypts the payload. Failures surface as
|
|
102
|
+
* `SECRET_DECRYPTION_FAILED`/`SECRET_DESERIALIZATION_FAILED`
|
|
103
|
+
* {@link SecretError}s; a missing envelope throws {@link NotFoundError}.
|
|
104
|
+
* @template T - The secret payload type.
|
|
105
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
106
|
+
* @param {RetrieveSecretOptions} [options] - Optional version filter.
|
|
107
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
108
|
+
* @returns {Promise<T>} The decrypted payload.
|
|
109
|
+
* @throws {NotFoundError} When the secret (or requested version) does not exist.
|
|
110
|
+
* @throws {SecretError} On decryption or deserialization failures.
|
|
111
|
+
*/
|
|
112
|
+
retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: MaybeContextualArg<any>): Promise<T>;
|
|
113
|
+
/**
|
|
114
|
+
* @description Removes the envelope file for a secret
|
|
115
|
+
* @summary Deletes `<name>.json` from the root path (`force: true`, so a
|
|
116
|
+
* missing file is not an error); a filesystem failure surfaces as a
|
|
117
|
+
* `SECRET_PROVIDER_UNAVAILABLE` {@link SecretError}.
|
|
118
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
119
|
+
* @param {DeleteSecretOptions} [options] - Unused; accepted for interface parity.
|
|
120
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
121
|
+
* @returns {Promise<void>} Resolves once the file is removed.
|
|
122
|
+
* @throws {SecretError} When the file cannot be deleted.
|
|
123
|
+
*/
|
|
124
|
+
delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: MaybeContextualArg<any>): Promise<void>;
|
|
125
|
+
/**
|
|
126
|
+
* @description Checks whether a secret exists (optionally at a specific version)
|
|
127
|
+
* @summary Reads the envelope and compares the requested version, if any,
|
|
128
|
+
* against the stored one; a {@link NotFoundError} from the read maps to
|
|
129
|
+
* `false`.
|
|
130
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
131
|
+
* @param {ExistsSecretOptions} [options] - Optional version filter.
|
|
132
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
133
|
+
* @returns {Promise<boolean>} `true` when the secret exists and matches the version, if given.
|
|
134
|
+
*/
|
|
135
|
+
exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: MaybeContextualArg<any>): Promise<boolean>;
|
|
136
|
+
/**
|
|
137
|
+
* @description Unsupported: the filesystem store does not expose listings
|
|
138
|
+
* @summary Always throws to keep the filesystem sink minimal; use
|
|
139
|
+
* {@link InfraCredentialBootstrap} to track seeded references instead.
|
|
140
|
+
* @param {ListSecretsOptions} [options] - Unused.
|
|
141
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
142
|
+
* @returns {Promise<SecretMetadata[]>} Never resolves.
|
|
143
|
+
* @throws {SecretError} Always, with `SECRET_UNSUPPORTED_OPERATION`.
|
|
144
|
+
*/
|
|
145
|
+
list(options?: ListSecretsOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata[]>;
|
|
146
|
+
/**
|
|
147
|
+
* @description Unsupported: the filesystem store does not expose metadata
|
|
148
|
+
* @summary Always throws; metadata is embedded in the envelope, which callers
|
|
149
|
+
* are not expected to read directly.
|
|
150
|
+
* @param {SecretName | SecretReference} nameOrRef - Unused.
|
|
151
|
+
* @param {SecretMetadataOptions} [options] - Unused.
|
|
152
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
153
|
+
* @returns {Promise<SecretMetadata | undefined>} Never resolves.
|
|
154
|
+
* @throws {SecretError} Always, with `SECRET_UNSUPPORTED_OPERATION`.
|
|
155
|
+
*/
|
|
156
|
+
metadata(nameOrRef: SecretName | SecretReference, options?: SecretMetadataOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata | undefined>;
|
|
157
|
+
/**
|
|
158
|
+
* @description Overwrites a secret with a new payload and version
|
|
159
|
+
* @summary Re-stores the secret under the same normalized name, tagging the
|
|
160
|
+
* new envelope with `options.newVersion` (the old envelope file is replaced).
|
|
161
|
+
* @template T - The secret payload type.
|
|
162
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
163
|
+
* @param {T} value - The new payload.
|
|
164
|
+
* @param {RotateSecretOptions} [options] - Optional `newVersion` tag.
|
|
165
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context`.
|
|
166
|
+
* @returns {Promise<SecretReference>} A reference to the rewritten envelope.
|
|
167
|
+
*/
|
|
168
|
+
rotate<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, value: T, options?: RotateSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
169
|
+
/**
|
|
170
|
+
* @description Lazily resolves the booted `CryptoService`
|
|
171
|
+
* @summary Throws an {@link InternalError} when accessed before
|
|
172
|
+
* `initialize()`/`boot()`, which is the only way the crypto service is
|
|
173
|
+
* created.
|
|
174
|
+
* @returns {CryptoService} The booted crypto service.
|
|
175
|
+
* @throws {InternalError} When the service is not initialized.
|
|
176
|
+
*/
|
|
177
|
+
private get crypto();
|
|
178
|
+
/**
|
|
179
|
+
* @description Resolves the envelope file path for a normalized secret name
|
|
180
|
+
* @param {string} name - The normalized secret name.
|
|
181
|
+
* @returns {string} The absolute envelope path inside the configured root.
|
|
182
|
+
*/
|
|
183
|
+
private fileFor;
|
|
184
|
+
/**
|
|
185
|
+
* @description Reads and parses an envelope file
|
|
186
|
+
* @summary A missing file maps to {@link NotFoundError}; filesystem failures
|
|
187
|
+
* surface as `SECRET_PROVIDER_UNAVAILABLE` and JSON parse failures as
|
|
188
|
+
* `SECRET_DESERIALIZATION_FAILED` {@link SecretError}s.
|
|
189
|
+
* @param {string} name - The normalized secret name.
|
|
190
|
+
* @returns {Promise<FsSecretEnvelope>} The parsed envelope.
|
|
191
|
+
* @throws {NotFoundError} When the envelope file does not exist.
|
|
192
|
+
* @throws {SecretError} On read or parse failures.
|
|
193
|
+
*/
|
|
194
|
+
private readEnvelope;
|
|
195
|
+
/**
|
|
196
|
+
* @description Atomically writes an envelope file with private permissions
|
|
197
|
+
* @summary Writes to a UUID-suffixed temp file with mode `0o600`, then
|
|
198
|
+
* renames it over the target and re-applies the mode; on failure the temp
|
|
199
|
+
* file is removed and a `SECRET_PROVIDER_UNAVAILABLE` {@link SecretError} is
|
|
200
|
+
* thrown.
|
|
201
|
+
* @param {string} name - The normalized secret name.
|
|
202
|
+
* @param {FsSecretEnvelope} envelope - The envelope to persist.
|
|
203
|
+
* @returns {Promise<void>} Resolves once the envelope is durably written.
|
|
204
|
+
* @throws {SecretError} When the write/rename cycle fails.
|
|
205
|
+
*/
|
|
206
|
+
private writeEnvelope;
|
|
207
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/fs/config
|
|
3
|
+
* @summary Configuration contract for the filesystem secret service.
|
|
4
|
+
* @description Defines {@link FsSecretServiceConfig} — the boot configuration
|
|
5
|
+
* accepted by `{@link FsSecretService}` and its node counterpart — plus the
|
|
6
|
+
* `DEFAULT_FS_SECRET_ROOT` and `DEFAULT_FS_SECRET_KEY_ID` fallbacks applied
|
|
7
|
+
* when the `secrets.fs` Environment slice or explicit arguments omit them.
|
|
8
|
+
*/
|
|
9
|
+
import type { SecretServiceConfig } from "../core/index.d.cts";
|
|
10
|
+
/**
|
|
11
|
+
* @description Default root directory for the filesystem secret store
|
|
12
|
+
* @summary Relative paths are resolved against the process working directory
|
|
13
|
+
* during `FsSecretService.initialize`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_FS_SECRET_ROOT = ".decaf/secrets";
|
|
16
|
+
/**
|
|
17
|
+
* @description Default encryption key id for filesystem secret envelopes
|
|
18
|
+
* @summary Recorded in each envelope's `encryption.keyId` when the
|
|
19
|
+
* configuration does not name a key explicitly.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_FS_SECRET_KEY_ID = "fs-default-key";
|
|
22
|
+
/**
|
|
23
|
+
* @description Boot configuration for the filesystem secret service
|
|
24
|
+
* @summary The `keySecret` is mandatory — it is the master secret from which
|
|
25
|
+
* per-secret encryption keys are derived; `rootPath` and `keyId` fall back to
|
|
26
|
+
* {@link DEFAULT_FS_SECRET_ROOT} and {@link DEFAULT_FS_SECRET_KEY_ID}.
|
|
27
|
+
*/
|
|
28
|
+
export interface FsSecretServiceConfig extends SecretServiceConfig {
|
|
29
|
+
/** @description Fixed provider discriminator for the filesystem backend. */
|
|
30
|
+
provider: "filesystem";
|
|
31
|
+
/** @description Directory holding the `<name>.json` secret envelopes (created with mode `0o700`). */
|
|
32
|
+
rootPath: string;
|
|
33
|
+
/** @description Master secret used to derive per-secret encryption keys. */
|
|
34
|
+
keySecret: string;
|
|
35
|
+
/** @description Optional encryption key id recorded in envelopes; defaults to `fs-default-key`. */
|
|
36
|
+
keyId?: string;
|
|
37
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/fs/config
|
|
3
|
+
* @summary Configuration contract for the filesystem secret service.
|
|
4
|
+
* @description Defines {@link FsSecretServiceConfig} — the boot configuration
|
|
5
|
+
* accepted by `{@link FsSecretService}` and its node counterpart — plus the
|
|
6
|
+
* `DEFAULT_FS_SECRET_ROOT` and `DEFAULT_FS_SECRET_KEY_ID` fallbacks applied
|
|
7
|
+
* when the `secrets.fs` Environment slice or explicit arguments omit them.
|
|
8
|
+
*/
|
|
9
|
+
import type { SecretServiceConfig } from "../core/index.d.mts";
|
|
10
|
+
/**
|
|
11
|
+
* @description Default root directory for the filesystem secret store
|
|
12
|
+
* @summary Relative paths are resolved against the process working directory
|
|
13
|
+
* during `FsSecretService.initialize`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_FS_SECRET_ROOT = ".decaf/secrets";
|
|
16
|
+
/**
|
|
17
|
+
* @description Default encryption key id for filesystem secret envelopes
|
|
18
|
+
* @summary Recorded in each envelope's `encryption.keyId` when the
|
|
19
|
+
* configuration does not name a key explicitly.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_FS_SECRET_KEY_ID = "fs-default-key";
|
|
22
|
+
/**
|
|
23
|
+
* @description Boot configuration for the filesystem secret service
|
|
24
|
+
* @summary The `keySecret` is mandatory — it is the master secret from which
|
|
25
|
+
* per-secret encryption keys are derived; `rootPath` and `keyId` fall back to
|
|
26
|
+
* {@link DEFAULT_FS_SECRET_ROOT} and {@link DEFAULT_FS_SECRET_KEY_ID}.
|
|
27
|
+
*/
|
|
28
|
+
export interface FsSecretServiceConfig extends SecretServiceConfig {
|
|
29
|
+
/** @description Fixed provider discriminator for the filesystem backend. */
|
|
30
|
+
provider: "filesystem";
|
|
31
|
+
/** @description Directory holding the `<name>.json` secret envelopes (created with mode `0o700`). */
|
|
32
|
+
rootPath: string;
|
|
33
|
+
/** @description Master secret used to derive per-secret encryption keys. */
|
|
34
|
+
keySecret: string;
|
|
35
|
+
/** @description Optional encryption key id recorded in envelopes; defaults to `fs-default-key`. */
|
|
36
|
+
keyId?: string;
|
|
37
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/fs
|
|
3
|
+
* @summary Filesystem secret service exports.
|
|
4
|
+
* @description Re-exports the filesystem secret service, its node variant,
|
|
5
|
+
* configuration contract, and Environment slice.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./FsSecretServiceConfig.d.cts";
|
|
8
|
+
export * from "./FsSecretEnvironment.d.cts";
|
|
9
|
+
export * from "./FsSecretService.d.cts";
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/fs
|
|
3
|
+
* @summary Filesystem secret service exports.
|
|
4
|
+
* @description Re-exports the filesystem secret service, its node variant,
|
|
5
|
+
* configuration contract, and Environment slice.
|
|
6
|
+
*/
|
|
7
|
+
export * from "./FsSecretServiceConfig.d.mts";
|
|
8
|
+
export * from "./FsSecretEnvironment.d.mts";
|
|
9
|
+
export * from "./FsSecretService.d.mts";
|