@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
|
@@ -1,22 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/model/service
|
|
3
|
+
* @summary Model-backed encrypted secret service.
|
|
4
|
+
* @description Implements the `{@link ModelSecretService}`, an undecorated
|
|
5
|
+
* `ClientBasedSecretService` that
|
|
6
|
+
* persists AES-encrypted payloads as `{@link Secret}` rows through a
|
|
7
|
+
* decaf `Repository` (tenant/org-unit/owner scoping included). Encryption
|
|
8
|
+
* keys derive from a master `keySecret` via `CryptoService`; configuration
|
|
9
|
+
* comes from the `secrets.model` Environment slice or an explicit boot
|
|
10
|
+
* config (see `ModelSecretServiceConfig`).
|
|
11
|
+
*/
|
|
1
12
|
import { ClientBasedSecretService, SecretError, SecretProvider } from "../core/index.d.cts";
|
|
2
13
|
import { SecretName, SecretPayload, SecretReference, SecretMetadata } from "../core/index.d.cts";
|
|
3
|
-
import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions } from "../core/index.d.cts";
|
|
14
|
+
import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions, RotateSecretOptions } from "../core/index.d.cts";
|
|
4
15
|
import { Secret } from "./Secret.d.cts";
|
|
5
16
|
import { ContextualArgs, MaybeContextualArg, Repository } from "@decaf-ts/core";
|
|
6
17
|
import { ModelSecretServiceConfig } from "./ModelSecretServiceConfig.d.cts";
|
|
18
|
+
/**
|
|
19
|
+
* @description Model-backed encrypted secret service
|
|
20
|
+
* @summary Stores each secret as a `{@link Secret}` row (encrypted payload,
|
|
21
|
+
* key id/iv/salt metadata, version, enablement flag, and optional
|
|
22
|
+
* tenant/org-unit/owner scope) through the repository booted as the service
|
|
23
|
+
* client. Names are validated and normalized before persistence;
|
|
24
|
+
* `(name, version)` is unique (enforced by a `SECRET_ALREADY_EXISTS`
|
|
25
|
+
* conflict in `store`/`rotate` and backed by the `uq_secrets_name_version`
|
|
26
|
+
* database index); retrieval only considers enabled rows, supports version
|
|
27
|
+
* pinning, and resolves multiple matches deterministically by `updatedAt
|
|
28
|
+
* DESC`. Delete is soft by default (sets `enabled: false`) unless
|
|
29
|
+
* `options.force` is set. Errors from the repository are translated into
|
|
30
|
+
* typed {@link SecretError}s by `parseError`.
|
|
31
|
+
*
|
|
32
|
+
* Undecorated and Environment-configurable
|
|
33
|
+
* through the `secrets.model` slice; the credential service
|
|
34
|
+
* (`CredentialService`) delegates user/runtime credential storage to this
|
|
35
|
+
* service.
|
|
36
|
+
* @class ModelSecretService
|
|
37
|
+
* @category Secrets
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { ModelSecretService } from "@decaf-ts/integrations/secrets";
|
|
41
|
+
*
|
|
42
|
+
* const modelSecrets = await new ModelSecretService().boot({
|
|
43
|
+
* keySecret: "model-master-key",
|
|
44
|
+
* });
|
|
45
|
+
* await modelSecrets.store("my-secret", { value: "s3cr3t" });
|
|
46
|
+
* const payload = await modelSecrets.retrieve<{ value: string }>("my-secret");
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
7
49
|
export declare class ModelSecretService extends ClientBasedSecretService<Repository<Secret, any>, ModelSecretServiceConfig> {
|
|
8
50
|
readonly provider: SecretProvider;
|
|
9
51
|
private cryptoService;
|
|
52
|
+
constructor();
|
|
53
|
+
/**
|
|
54
|
+
* @description Builds the model secret configuration from the Environment
|
|
55
|
+
* @summary Reads the `secrets.model` Environment slice and returns a
|
|
56
|
+
* `ModelSecretServiceConfig` when a `keySecret` is configured; returns
|
|
57
|
+
* `undefined` otherwise, letting boot fall back to explicit arguments.
|
|
58
|
+
* @returns {ModelSecretServiceConfig | undefined} The Environment-derived configuration, or `undefined`.
|
|
59
|
+
* @override
|
|
60
|
+
*/
|
|
10
61
|
protected configFromEnvironment(): ModelSecretServiceConfig | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* @description Boots the crypto service and resolves the backing repository
|
|
64
|
+
* @summary Accepts the configuration (explicit args, merged with the
|
|
65
|
+
* Environment slice by the base) and an optional `Repository<Secret>` as the
|
|
66
|
+
* second argument; when absent, creates one via `Repository.forModel(Secret)`.
|
|
67
|
+
* Returns the config and repository as the service client.
|
|
68
|
+
* @param {ContextualArgs} args - Configuration and optional `Repository`/`Context` arguments.
|
|
69
|
+
* @returns {Promise<{config: ModelSecretServiceConfig, client: Repository<Secret, any>}>} The resolved config and repository client.
|
|
70
|
+
*/
|
|
11
71
|
initialize(...args: ContextualArgs<any>): Promise<{
|
|
12
72
|
config: ModelSecretServiceConfig;
|
|
13
73
|
client: Repository<Secret, any>;
|
|
14
74
|
}>;
|
|
75
|
+
/**
|
|
76
|
+
* @description Encrypts and persists a secret row
|
|
77
|
+
* @summary Validates and normalizes the name, serializes the payload, and
|
|
78
|
+
* encrypts it with a key derived from the master `keySecret`, embedding the
|
|
79
|
+
* key id/iv/salt in the row's `encryption` metadata. The row carries the
|
|
80
|
+
* optional tenant/org-unit/owner scoping and version. `(name, version)` is
|
|
81
|
+
* unique: an application-level pre-check rejects a duplicate combination
|
|
82
|
+
* with a `SECRET_ALREADY_EXISTS` {@link SecretError} before the insert, and
|
|
83
|
+
* the `uq_secrets_name_version` database index (which treats `NULL`
|
|
84
|
+
* versions as `''`) backstops the same rule against concurrent writers.
|
|
85
|
+
* @template T - The secret payload type.
|
|
86
|
+
* @param {SecretName} name - The secret name (validated and normalized).
|
|
87
|
+
* @param {T} value - The payload to encrypt and store.
|
|
88
|
+
* @param {StoreSecretOptions} [options] - Optional content type, tags, version, and tenant/org/owner scoping.
|
|
89
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
90
|
+
* @returns {Promise<SecretReference>} A reference to the persisted secret.
|
|
91
|
+
* @throws {SecretError} `SECRET_ALREADY_EXISTS` when a row with the same normalized name and version already exists, or `SECRET_NOT_FOUND`/`SECRET_PROVIDER_CONFLICT` when the name is invalid or the repository insert fails.
|
|
92
|
+
*/
|
|
15
93
|
store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
94
|
+
/**
|
|
95
|
+
* @description Reads, decrypts, and deserializes an enabled secret row
|
|
96
|
+
* @summary Queries the newest matching enabled row (by normalized name and,
|
|
97
|
+
* optionally, version), re-derives the key using the row's salt, and decrypts
|
|
98
|
+
* the payload. Rows are ordered by `updatedAt DESC`, so when several rows
|
|
99
|
+
* share a name the most recently updated enabled row is resolved
|
|
100
|
+
* deterministically. The repository SELECT runs inside a principal-bound
|
|
101
|
+
* transaction (see {@link ModelSecretService.withinPrincipalTransaction}):
|
|
102
|
+
* it joins an in-flight `transactionLock` on the context or begins one,
|
|
103
|
+
* binding the context's principal to `app.principal_id` on TypeORM adapters
|
|
104
|
+
* so namespace RLS applies to the read. Missing rows throw
|
|
105
|
+
* {@link NotFoundError}; decryption and JSON parse failures throw
|
|
106
|
+
* `InternalError`.
|
|
107
|
+
* @template T - The secret payload type.
|
|
108
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
109
|
+
* @param {RetrieveSecretOptions} [options] - Optional version filter.
|
|
110
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
111
|
+
* @returns {Promise<T>} The decrypted payload.
|
|
112
|
+
* @throws {NotFoundError} When no enabled secret matches the name/version.
|
|
113
|
+
*/
|
|
16
114
|
retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: MaybeContextualArg<any>): Promise<T>;
|
|
115
|
+
/**
|
|
116
|
+
* @description Runs a repository operation inside a principal-bound transaction
|
|
117
|
+
* @summary Mirrors core's `@transactional()` proxy for single reads: reuses
|
|
118
|
+
* the `transactionLock` already cached on the context (nested call), or
|
|
119
|
+
* resolves a fresh lock for the service client via `resolveTransactionLock`
|
|
120
|
+
* and calls `begin(context)` - which, on a TypeORM adapter, binds the
|
|
121
|
+
* context's principal to `app.principal_id` for the new transaction.
|
|
122
|
+
* Increments the lock depth for the duration of the operation; on failure,
|
|
123
|
+
* rolls back and zeroes the depth (skipping a redundant rollback when an
|
|
124
|
+
* inner frame already ended the transaction) and rethrows the original
|
|
125
|
+
* error; on success, commits when the outermost frame completes.
|
|
126
|
+
* @template R - The operation result type.
|
|
127
|
+
* @param {Context} context - The request context, carrying any in-flight transaction lock.
|
|
128
|
+
* @param {function(ContextLock): Promise<R>} operation - The repository operation to run, receiving the active lock.
|
|
129
|
+
* @returns {Promise<R>} The operation result.
|
|
130
|
+
* @throws {InternalError} When the final commit fails; operation errors are rethrown after rollback.
|
|
131
|
+
*/
|
|
132
|
+
private withinPrincipalTransaction;
|
|
133
|
+
/**
|
|
134
|
+
* @description Deletes (or disables) a secret row
|
|
135
|
+
* @summary Soft-deletes by default: the row is disabled and stamped with a
|
|
136
|
+
* new `updatedAt`. With `options.force`, the row is hard-deleted from the
|
|
137
|
+
* repository. Rows are ordered by `updatedAt DESC`, so the most recently
|
|
138
|
+
* updated matching row is resolved deterministically. A missing secret
|
|
139
|
+
* resolves silently.
|
|
140
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
141
|
+
* @param {DeleteSecretOptions} [options] - Optional version filter and `force` hard-delete flag.
|
|
142
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
143
|
+
* @returns {Promise<void>} Resolves once the row is deleted or disabled.
|
|
144
|
+
*/
|
|
17
145
|
delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: MaybeContextualArg<any>): Promise<void>;
|
|
146
|
+
/**
|
|
147
|
+
* @description Checks whether an enabled secret exists (optionally at a version)
|
|
148
|
+
* @summary Counts enabled rows matching the normalized name (plus any
|
|
149
|
+
* requested version) and returns whether the count is positive.
|
|
150
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
151
|
+
* @param {ExistsSecretOptions} [options] - Optional version filter.
|
|
152
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
153
|
+
* @returns {Promise<boolean>} `true` when at least one enabled row matches.
|
|
154
|
+
*/
|
|
18
155
|
exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: MaybeContextualArg<any>): Promise<boolean>;
|
|
156
|
+
/**
|
|
157
|
+
* @description Lists secret metadata across stored rows
|
|
158
|
+
* @summary Selects rows filtered by the `enabled` flag (when supplied) and
|
|
159
|
+
* maps them to `SecretMetadata` records (no payloads).
|
|
160
|
+
* @param {ListSecretsOptions} [options] - Optional `enabled` filter.
|
|
161
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
162
|
+
* @returns {Promise<SecretMetadata[]>} Metadata for every matching secret.
|
|
163
|
+
*/
|
|
19
164
|
list(options?: ListSecretsOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata[]>;
|
|
165
|
+
/**
|
|
166
|
+
* @description Reads one secret's metadata without its payload
|
|
167
|
+
* @summary Selects the row matching the normalized name (and optional
|
|
168
|
+
* version) and maps it to `SecretMetadata`; tags are included only when
|
|
169
|
+
* `options.includeTags` is set. Rows are ordered by `updatedAt DESC`, so
|
|
170
|
+
* the most recently updated matching row is resolved deterministically.
|
|
171
|
+
* Returns `undefined` when no row matches.
|
|
172
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
173
|
+
* @param {SecretMetadataOptions} [options] - Optional version filter and `includeTags` flag.
|
|
174
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
175
|
+
* @returns {Promise<SecretMetadata | undefined>} The metadata, or `undefined` when absent.
|
|
176
|
+
*/
|
|
20
177
|
metadata(nameOrRef: SecretName | SecretReference, options?: SecretMetadataOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata | undefined>;
|
|
178
|
+
/**
|
|
179
|
+
* @description Re-encrypts an enabled secret row with a new payload
|
|
180
|
+
* @summary Locates the enabled row (optionally pinned to
|
|
181
|
+
* `options.oldVersion`), encrypts the new payload with a freshly derived
|
|
182
|
+
* key (optionally tagged with `options.keyId`), and updates the row's
|
|
183
|
+
* payload, encryption metadata, version (`options.newVersion`), and
|
|
184
|
+
* `updatedAt`. When `options.newVersion` differs from the row's current
|
|
185
|
+
* version, a `(name, version)` duplicate check rejects the rotation with a
|
|
186
|
+
* `SECRET_ALREADY_EXISTS` {@link SecretError}; otherwise the target version
|
|
187
|
+
* is reused and the row is updated in place. Matching rows are ordered by
|
|
188
|
+
* `updatedAt DESC`, so the most recently updated enabled row is resolved
|
|
189
|
+
* deterministically.
|
|
190
|
+
* @template T - The secret payload type.
|
|
191
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
192
|
+
* @param {T} value - The new payload.
|
|
193
|
+
* @param {RotateSecretOptions} [options] - Optional `newVersion`, `oldVersion`, and `keyId`.
|
|
194
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
195
|
+
* @returns {Promise<SecretReference>} A reference reflecting the updated row.
|
|
196
|
+
* @throws {NotFoundError} When no enabled secret matches the name/version.
|
|
197
|
+
* @throws {SecretError} `SECRET_ALREADY_EXISTS` when the target `newVersion` is already held by another row with the same normalized name, or `SECRET_PROVIDER_CONFLICT` when the repository update fails.
|
|
198
|
+
*/
|
|
199
|
+
rotate<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, value: T, options?: RotateSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
200
|
+
/**
|
|
201
|
+
* @description Translates repository errors into typed secret errors
|
|
202
|
+
* @summary Inspects the error message for "not found"/404, "already
|
|
203
|
+
* exists"/conflict/409, and decryption-related markers and maps them to
|
|
204
|
+
* `SECRET_NOT_FOUND`, `SECRET_ALREADY_EXISTS`,
|
|
205
|
+
* `SECRET_DECRYPTION_FAILED`, or a generic `SECRET_PROVIDER_CONFLICT`
|
|
206
|
+
* {@link SecretError}.
|
|
207
|
+
* @param {unknown} error - The raw error thrown by the repository.
|
|
208
|
+
* @returns {SecretError} The typed secret error.
|
|
209
|
+
*/
|
|
21
210
|
protected parseError(error: unknown): SecretError;
|
|
22
211
|
}
|
|
@@ -1,22 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/model/service
|
|
3
|
+
* @summary Model-backed encrypted secret service.
|
|
4
|
+
* @description Implements the `{@link ModelSecretService}`, an undecorated
|
|
5
|
+
* `ClientBasedSecretService` that
|
|
6
|
+
* persists AES-encrypted payloads as `{@link Secret}` rows through a
|
|
7
|
+
* decaf `Repository` (tenant/org-unit/owner scoping included). Encryption
|
|
8
|
+
* keys derive from a master `keySecret` via `CryptoService`; configuration
|
|
9
|
+
* comes from the `secrets.model` Environment slice or an explicit boot
|
|
10
|
+
* config (see `ModelSecretServiceConfig`).
|
|
11
|
+
*/
|
|
1
12
|
import { ClientBasedSecretService, SecretError, SecretProvider } from "../core/index.d.mts";
|
|
2
13
|
import { SecretName, SecretPayload, SecretReference, SecretMetadata } from "../core/index.d.mts";
|
|
3
|
-
import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions } from "../core/index.d.mts";
|
|
14
|
+
import { StoreSecretOptions, RetrieveSecretOptions, DeleteSecretOptions, ExistsSecretOptions, ListSecretsOptions, SecretMetadataOptions, RotateSecretOptions } from "../core/index.d.mts";
|
|
4
15
|
import { Secret } from "./Secret.d.mts";
|
|
5
16
|
import { ContextualArgs, MaybeContextualArg, Repository } from "@decaf-ts/core";
|
|
6
17
|
import { ModelSecretServiceConfig } from "./ModelSecretServiceConfig.d.mts";
|
|
18
|
+
/**
|
|
19
|
+
* @description Model-backed encrypted secret service
|
|
20
|
+
* @summary Stores each secret as a `{@link Secret}` row (encrypted payload,
|
|
21
|
+
* key id/iv/salt metadata, version, enablement flag, and optional
|
|
22
|
+
* tenant/org-unit/owner scope) through the repository booted as the service
|
|
23
|
+
* client. Names are validated and normalized before persistence;
|
|
24
|
+
* `(name, version)` is unique (enforced by a `SECRET_ALREADY_EXISTS`
|
|
25
|
+
* conflict in `store`/`rotate` and backed by the `uq_secrets_name_version`
|
|
26
|
+
* database index); retrieval only considers enabled rows, supports version
|
|
27
|
+
* pinning, and resolves multiple matches deterministically by `updatedAt
|
|
28
|
+
* DESC`. Delete is soft by default (sets `enabled: false`) unless
|
|
29
|
+
* `options.force` is set. Errors from the repository are translated into
|
|
30
|
+
* typed {@link SecretError}s by `parseError`.
|
|
31
|
+
*
|
|
32
|
+
* Undecorated and Environment-configurable
|
|
33
|
+
* through the `secrets.model` slice; the credential service
|
|
34
|
+
* (`CredentialService`) delegates user/runtime credential storage to this
|
|
35
|
+
* service.
|
|
36
|
+
* @class ModelSecretService
|
|
37
|
+
* @category Secrets
|
|
38
|
+
* @example
|
|
39
|
+
* ```ts
|
|
40
|
+
* import { ModelSecretService } from "@decaf-ts/integrations/secrets";
|
|
41
|
+
*
|
|
42
|
+
* const modelSecrets = await new ModelSecretService().boot({
|
|
43
|
+
* keySecret: "model-master-key",
|
|
44
|
+
* });
|
|
45
|
+
* await modelSecrets.store("my-secret", { value: "s3cr3t" });
|
|
46
|
+
* const payload = await modelSecrets.retrieve<{ value: string }>("my-secret");
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
7
49
|
export declare class ModelSecretService extends ClientBasedSecretService<Repository<Secret, any>, ModelSecretServiceConfig> {
|
|
8
50
|
readonly provider: SecretProvider;
|
|
9
51
|
private cryptoService;
|
|
52
|
+
constructor();
|
|
53
|
+
/**
|
|
54
|
+
* @description Builds the model secret configuration from the Environment
|
|
55
|
+
* @summary Reads the `secrets.model` Environment slice and returns a
|
|
56
|
+
* `ModelSecretServiceConfig` when a `keySecret` is configured; returns
|
|
57
|
+
* `undefined` otherwise, letting boot fall back to explicit arguments.
|
|
58
|
+
* @returns {ModelSecretServiceConfig | undefined} The Environment-derived configuration, or `undefined`.
|
|
59
|
+
* @override
|
|
60
|
+
*/
|
|
10
61
|
protected configFromEnvironment(): ModelSecretServiceConfig | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* @description Boots the crypto service and resolves the backing repository
|
|
64
|
+
* @summary Accepts the configuration (explicit args, merged with the
|
|
65
|
+
* Environment slice by the base) and an optional `Repository<Secret>` as the
|
|
66
|
+
* second argument; when absent, creates one via `Repository.forModel(Secret)`.
|
|
67
|
+
* Returns the config and repository as the service client.
|
|
68
|
+
* @param {ContextualArgs} args - Configuration and optional `Repository`/`Context` arguments.
|
|
69
|
+
* @returns {Promise<{config: ModelSecretServiceConfig, client: Repository<Secret, any>}>} The resolved config and repository client.
|
|
70
|
+
*/
|
|
11
71
|
initialize(...args: ContextualArgs<any>): Promise<{
|
|
12
72
|
config: ModelSecretServiceConfig;
|
|
13
73
|
client: Repository<Secret, any>;
|
|
14
74
|
}>;
|
|
75
|
+
/**
|
|
76
|
+
* @description Encrypts and persists a secret row
|
|
77
|
+
* @summary Validates and normalizes the name, serializes the payload, and
|
|
78
|
+
* encrypts it with a key derived from the master `keySecret`, embedding the
|
|
79
|
+
* key id/iv/salt in the row's `encryption` metadata. The row carries the
|
|
80
|
+
* optional tenant/org-unit/owner scoping and version. `(name, version)` is
|
|
81
|
+
* unique: an application-level pre-check rejects a duplicate combination
|
|
82
|
+
* with a `SECRET_ALREADY_EXISTS` {@link SecretError} before the insert, and
|
|
83
|
+
* the `uq_secrets_name_version` database index (which treats `NULL`
|
|
84
|
+
* versions as `''`) backstops the same rule against concurrent writers.
|
|
85
|
+
* @template T - The secret payload type.
|
|
86
|
+
* @param {SecretName} name - The secret name (validated and normalized).
|
|
87
|
+
* @param {T} value - The payload to encrypt and store.
|
|
88
|
+
* @param {StoreSecretOptions} [options] - Optional content type, tags, version, and tenant/org/owner scoping.
|
|
89
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
90
|
+
* @returns {Promise<SecretReference>} A reference to the persisted secret.
|
|
91
|
+
* @throws {SecretError} `SECRET_ALREADY_EXISTS` when a row with the same normalized name and version already exists, or `SECRET_NOT_FOUND`/`SECRET_PROVIDER_CONFLICT` when the name is invalid or the repository insert fails.
|
|
92
|
+
*/
|
|
15
93
|
store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
94
|
+
/**
|
|
95
|
+
* @description Reads, decrypts, and deserializes an enabled secret row
|
|
96
|
+
* @summary Queries the newest matching enabled row (by normalized name and,
|
|
97
|
+
* optionally, version), re-derives the key using the row's salt, and decrypts
|
|
98
|
+
* the payload. Rows are ordered by `updatedAt DESC`, so when several rows
|
|
99
|
+
* share a name the most recently updated enabled row is resolved
|
|
100
|
+
* deterministically. The repository SELECT runs inside a principal-bound
|
|
101
|
+
* transaction (see {@link ModelSecretService.withinPrincipalTransaction}):
|
|
102
|
+
* it joins an in-flight `transactionLock` on the context or begins one,
|
|
103
|
+
* binding the context's principal to `app.principal_id` on TypeORM adapters
|
|
104
|
+
* so namespace RLS applies to the read. Missing rows throw
|
|
105
|
+
* {@link NotFoundError}; decryption and JSON parse failures throw
|
|
106
|
+
* `InternalError`.
|
|
107
|
+
* @template T - The secret payload type.
|
|
108
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
109
|
+
* @param {RetrieveSecretOptions} [options] - Optional version filter.
|
|
110
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
111
|
+
* @returns {Promise<T>} The decrypted payload.
|
|
112
|
+
* @throws {NotFoundError} When no enabled secret matches the name/version.
|
|
113
|
+
*/
|
|
16
114
|
retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: MaybeContextualArg<any>): Promise<T>;
|
|
115
|
+
/**
|
|
116
|
+
* @description Runs a repository operation inside a principal-bound transaction
|
|
117
|
+
* @summary Mirrors core's `@transactional()` proxy for single reads: reuses
|
|
118
|
+
* the `transactionLock` already cached on the context (nested call), or
|
|
119
|
+
* resolves a fresh lock for the service client via `resolveTransactionLock`
|
|
120
|
+
* and calls `begin(context)` - which, on a TypeORM adapter, binds the
|
|
121
|
+
* context's principal to `app.principal_id` for the new transaction.
|
|
122
|
+
* Increments the lock depth for the duration of the operation; on failure,
|
|
123
|
+
* rolls back and zeroes the depth (skipping a redundant rollback when an
|
|
124
|
+
* inner frame already ended the transaction) and rethrows the original
|
|
125
|
+
* error; on success, commits when the outermost frame completes.
|
|
126
|
+
* @template R - The operation result type.
|
|
127
|
+
* @param {Context} context - The request context, carrying any in-flight transaction lock.
|
|
128
|
+
* @param {function(ContextLock): Promise<R>} operation - The repository operation to run, receiving the active lock.
|
|
129
|
+
* @returns {Promise<R>} The operation result.
|
|
130
|
+
* @throws {InternalError} When the final commit fails; operation errors are rethrown after rollback.
|
|
131
|
+
*/
|
|
132
|
+
private withinPrincipalTransaction;
|
|
133
|
+
/**
|
|
134
|
+
* @description Deletes (or disables) a secret row
|
|
135
|
+
* @summary Soft-deletes by default: the row is disabled and stamped with a
|
|
136
|
+
* new `updatedAt`. With `options.force`, the row is hard-deleted from the
|
|
137
|
+
* repository. Rows are ordered by `updatedAt DESC`, so the most recently
|
|
138
|
+
* updated matching row is resolved deterministically. A missing secret
|
|
139
|
+
* resolves silently.
|
|
140
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
141
|
+
* @param {DeleteSecretOptions} [options] - Optional version filter and `force` hard-delete flag.
|
|
142
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
143
|
+
* @returns {Promise<void>} Resolves once the row is deleted or disabled.
|
|
144
|
+
*/
|
|
17
145
|
delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: MaybeContextualArg<any>): Promise<void>;
|
|
146
|
+
/**
|
|
147
|
+
* @description Checks whether an enabled secret exists (optionally at a version)
|
|
148
|
+
* @summary Counts enabled rows matching the normalized name (plus any
|
|
149
|
+
* requested version) and returns whether the count is positive.
|
|
150
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
151
|
+
* @param {ExistsSecretOptions} [options] - Optional version filter.
|
|
152
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
153
|
+
* @returns {Promise<boolean>} `true` when at least one enabled row matches.
|
|
154
|
+
*/
|
|
18
155
|
exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: MaybeContextualArg<any>): Promise<boolean>;
|
|
156
|
+
/**
|
|
157
|
+
* @description Lists secret metadata across stored rows
|
|
158
|
+
* @summary Selects rows filtered by the `enabled` flag (when supplied) and
|
|
159
|
+
* maps them to `SecretMetadata` records (no payloads).
|
|
160
|
+
* @param {ListSecretsOptions} [options] - Optional `enabled` filter.
|
|
161
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
162
|
+
* @returns {Promise<SecretMetadata[]>} Metadata for every matching secret.
|
|
163
|
+
*/
|
|
19
164
|
list(options?: ListSecretsOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata[]>;
|
|
165
|
+
/**
|
|
166
|
+
* @description Reads one secret's metadata without its payload
|
|
167
|
+
* @summary Selects the row matching the normalized name (and optional
|
|
168
|
+
* version) and maps it to `SecretMetadata`; tags are included only when
|
|
169
|
+
* `options.includeTags` is set. Rows are ordered by `updatedAt DESC`, so
|
|
170
|
+
* the most recently updated matching row is resolved deterministically.
|
|
171
|
+
* Returns `undefined` when no row matches.
|
|
172
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
173
|
+
* @param {SecretMetadataOptions} [options] - Optional version filter and `includeTags` flag.
|
|
174
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
175
|
+
* @returns {Promise<SecretMetadata | undefined>} The metadata, or `undefined` when absent.
|
|
176
|
+
*/
|
|
20
177
|
metadata(nameOrRef: SecretName | SecretReference, options?: SecretMetadataOptions, ...args: MaybeContextualArg<any>): Promise<SecretMetadata | undefined>;
|
|
178
|
+
/**
|
|
179
|
+
* @description Re-encrypts an enabled secret row with a new payload
|
|
180
|
+
* @summary Locates the enabled row (optionally pinned to
|
|
181
|
+
* `options.oldVersion`), encrypts the new payload with a freshly derived
|
|
182
|
+
* key (optionally tagged with `options.keyId`), and updates the row's
|
|
183
|
+
* payload, encryption metadata, version (`options.newVersion`), and
|
|
184
|
+
* `updatedAt`. When `options.newVersion` differs from the row's current
|
|
185
|
+
* version, a `(name, version)` duplicate check rejects the rotation with a
|
|
186
|
+
* `SECRET_ALREADY_EXISTS` {@link SecretError}; otherwise the target version
|
|
187
|
+
* is reused and the row is updated in place. Matching rows are ordered by
|
|
188
|
+
* `updatedAt DESC`, so the most recently updated enabled row is resolved
|
|
189
|
+
* deterministically.
|
|
190
|
+
* @template T - The secret payload type.
|
|
191
|
+
* @param {SecretName | SecretReference} nameOrRef - The secret name or reference.
|
|
192
|
+
* @param {T} value - The new payload.
|
|
193
|
+
* @param {RotateSecretOptions} [options] - Optional `newVersion`, `oldVersion`, and `keyId`.
|
|
194
|
+
* @param {MaybeContextualArg} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
195
|
+
* @returns {Promise<SecretReference>} A reference reflecting the updated row.
|
|
196
|
+
* @throws {NotFoundError} When no enabled secret matches the name/version.
|
|
197
|
+
* @throws {SecretError} `SECRET_ALREADY_EXISTS` when the target `newVersion` is already held by another row with the same normalized name, or `SECRET_PROVIDER_CONFLICT` when the repository update fails.
|
|
198
|
+
*/
|
|
199
|
+
rotate<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, value: T, options?: RotateSecretOptions, ...args: MaybeContextualArg<any>): Promise<SecretReference>;
|
|
200
|
+
/**
|
|
201
|
+
* @description Translates repository errors into typed secret errors
|
|
202
|
+
* @summary Inspects the error message for "not found"/404, "already
|
|
203
|
+
* exists"/conflict/409, and decryption-related markers and maps them to
|
|
204
|
+
* `SECRET_NOT_FOUND`, `SECRET_ALREADY_EXISTS`,
|
|
205
|
+
* `SECRET_DECRYPTION_FAILED`, or a generic `SECRET_PROVIDER_CONFLICT`
|
|
206
|
+
* {@link SecretError}.
|
|
207
|
+
* @param {unknown} error - The raw error thrown by the repository.
|
|
208
|
+
* @returns {SecretError} The typed secret error.
|
|
209
|
+
*/
|
|
21
210
|
protected parseError(error: unknown): SecretError;
|
|
22
211
|
}
|
|
@@ -1,24 +1,65 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module integrations/secrets/model/
|
|
3
|
-
* @summary Encrypted secret model
|
|
4
|
-
* @description
|
|
2
|
+
* @module integrations/secrets/model/model
|
|
3
|
+
* @summary Encrypted-at-rest secret persistence model.
|
|
4
|
+
* @description Defines the `{@link Secret}` model (`secrets` table) persisted
|
|
5
|
+
* by the `{@link ModelSecretService}`: one row per secret, holding the
|
|
6
|
+
* encrypted payload, `keyId`/`iv`/`salt` encryption metadata, versioning and
|
|
7
|
+
* enablement fields, and optional tenant/org-unit/owner scoping columns.
|
|
5
8
|
*/
|
|
6
9
|
import { BaseModel } from "@decaf-ts/core";
|
|
10
|
+
/**
|
|
11
|
+
* @description Encryption metadata embedded in a secret row
|
|
12
|
+
* @summary `keyId` identifies the key used to encrypt the payload; `iv` and
|
|
13
|
+
* the optional `aad`/`salt` carry the cipher parameters needed to re-derive
|
|
14
|
+
* the key and decrypt the payload.
|
|
15
|
+
*/
|
|
7
16
|
export interface SecretEncryptionMetadata {
|
|
17
|
+
/** @description Identifier of the encryption key used for the payload. */
|
|
8
18
|
keyId: string;
|
|
19
|
+
/** @description Initialization vector used for the payload encryption. */
|
|
9
20
|
iv: string;
|
|
21
|
+
/** @description Optional additional authenticated data bound to the cipher. */
|
|
10
22
|
aad?: string;
|
|
23
|
+
/** @description Optional salt used when deriving the key from the master secret. */
|
|
24
|
+
salt?: string;
|
|
11
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* @description Encrypted secret record stored through the model-backed secret service
|
|
28
|
+
* @summary Persisted in the `secrets` table. The `encryptedPayload` column is
|
|
29
|
+
* written only by `{@link ModelSecretService}` (which also fills
|
|
30
|
+
* `encryption`, `version`, and the optional `tenantId`/`orgUnitId`/
|
|
31
|
+
* `ownerPrincipalId` scoping columns); `enabled: false` marks soft-deleted
|
|
32
|
+
* secrets that retrieval filters out.
|
|
33
|
+
* @category Secrets
|
|
34
|
+
*/
|
|
12
35
|
export declare class Secret extends BaseModel {
|
|
36
|
+
/** @description Primary key (UUID). */
|
|
37
|
+
id: string;
|
|
38
|
+
/** @description Normalized secret name. */
|
|
13
39
|
name: string;
|
|
40
|
+
/** @description Secret provider discriminator that wrote the row. */
|
|
14
41
|
provider: string;
|
|
42
|
+
/** @description Encrypted, serialized payload. */
|
|
15
43
|
encryptedPayload: string;
|
|
44
|
+
/** @description Cipher parameters required to decrypt the payload. */
|
|
16
45
|
encryption: SecretEncryptionMetadata;
|
|
46
|
+
/** @description Optional content type describing the payload. */
|
|
17
47
|
contentType?: string;
|
|
48
|
+
/** @description Optional free-form tags. */
|
|
18
49
|
tags?: Record<string, string>;
|
|
50
|
+
/** @description When `false`, the secret is soft-deleted and filtered from retrieval. */
|
|
19
51
|
enabled: boolean;
|
|
52
|
+
/** @description Optional version label. */
|
|
20
53
|
version?: string;
|
|
54
|
+
/** @description Optional external identifier linking the secret to a provider record. */
|
|
21
55
|
externalId?: string;
|
|
56
|
+
/** @description Optional provider URI for externally stored secrets. */
|
|
22
57
|
uri?: string;
|
|
58
|
+
/** @description Optional tenant scope id. */
|
|
59
|
+
tenantId?: string;
|
|
60
|
+
/** @description Optional organizational unit scope id. */
|
|
61
|
+
orgUnitId?: string;
|
|
62
|
+
/** @description Optional owning principal id. */
|
|
63
|
+
ownerPrincipalId?: string;
|
|
23
64
|
constructor(data?: Partial<Secret>);
|
|
24
65
|
}
|
|
@@ -1,24 +1,65 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @module integrations/secrets/model/
|
|
3
|
-
* @summary Encrypted secret model
|
|
4
|
-
* @description
|
|
2
|
+
* @module integrations/secrets/model/model
|
|
3
|
+
* @summary Encrypted-at-rest secret persistence model.
|
|
4
|
+
* @description Defines the `{@link Secret}` model (`secrets` table) persisted
|
|
5
|
+
* by the `{@link ModelSecretService}`: one row per secret, holding the
|
|
6
|
+
* encrypted payload, `keyId`/`iv`/`salt` encryption metadata, versioning and
|
|
7
|
+
* enablement fields, and optional tenant/org-unit/owner scoping columns.
|
|
5
8
|
*/
|
|
6
9
|
import { BaseModel } from "@decaf-ts/core";
|
|
10
|
+
/**
|
|
11
|
+
* @description Encryption metadata embedded in a secret row
|
|
12
|
+
* @summary `keyId` identifies the key used to encrypt the payload; `iv` and
|
|
13
|
+
* the optional `aad`/`salt` carry the cipher parameters needed to re-derive
|
|
14
|
+
* the key and decrypt the payload.
|
|
15
|
+
*/
|
|
7
16
|
export interface SecretEncryptionMetadata {
|
|
17
|
+
/** @description Identifier of the encryption key used for the payload. */
|
|
8
18
|
keyId: string;
|
|
19
|
+
/** @description Initialization vector used for the payload encryption. */
|
|
9
20
|
iv: string;
|
|
21
|
+
/** @description Optional additional authenticated data bound to the cipher. */
|
|
10
22
|
aad?: string;
|
|
23
|
+
/** @description Optional salt used when deriving the key from the master secret. */
|
|
24
|
+
salt?: string;
|
|
11
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* @description Encrypted secret record stored through the model-backed secret service
|
|
28
|
+
* @summary Persisted in the `secrets` table. The `encryptedPayload` column is
|
|
29
|
+
* written only by `{@link ModelSecretService}` (which also fills
|
|
30
|
+
* `encryption`, `version`, and the optional `tenantId`/`orgUnitId`/
|
|
31
|
+
* `ownerPrincipalId` scoping columns); `enabled: false` marks soft-deleted
|
|
32
|
+
* secrets that retrieval filters out.
|
|
33
|
+
* @category Secrets
|
|
34
|
+
*/
|
|
12
35
|
export declare class Secret extends BaseModel {
|
|
36
|
+
/** @description Primary key (UUID). */
|
|
37
|
+
id: string;
|
|
38
|
+
/** @description Normalized secret name. */
|
|
13
39
|
name: string;
|
|
40
|
+
/** @description Secret provider discriminator that wrote the row. */
|
|
14
41
|
provider: string;
|
|
42
|
+
/** @description Encrypted, serialized payload. */
|
|
15
43
|
encryptedPayload: string;
|
|
44
|
+
/** @description Cipher parameters required to decrypt the payload. */
|
|
16
45
|
encryption: SecretEncryptionMetadata;
|
|
46
|
+
/** @description Optional content type describing the payload. */
|
|
17
47
|
contentType?: string;
|
|
48
|
+
/** @description Optional free-form tags. */
|
|
18
49
|
tags?: Record<string, string>;
|
|
50
|
+
/** @description When `false`, the secret is soft-deleted and filtered from retrieval. */
|
|
19
51
|
enabled: boolean;
|
|
52
|
+
/** @description Optional version label. */
|
|
20
53
|
version?: string;
|
|
54
|
+
/** @description Optional external identifier linking the secret to a provider record. */
|
|
21
55
|
externalId?: string;
|
|
56
|
+
/** @description Optional provider URI for externally stored secrets. */
|
|
22
57
|
uri?: string;
|
|
58
|
+
/** @description Optional tenant scope id. */
|
|
59
|
+
tenantId?: string;
|
|
60
|
+
/** @description Optional organizational unit scope id. */
|
|
61
|
+
orgUnitId?: string;
|
|
62
|
+
/** @description Optional owning principal id. */
|
|
63
|
+
ownerPrincipalId?: string;
|
|
23
64
|
constructor(data?: Partial<Secret>);
|
|
24
65
|
}
|
|
@@ -11,6 +11,30 @@
|
|
|
11
11
|
* must use these helpers instead of a raw truthiness check, both to decide whether a
|
|
12
12
|
* field was really configured and to build the config object it returns.
|
|
13
13
|
*/
|
|
14
|
+
/**
|
|
15
|
+
* @description Returns a non-empty string when the value is a usable string
|
|
16
|
+
* @summary Guards against `LoggedEnvironment` unset-leaf proxies: a value is
|
|
17
|
+
* accepted only when it is actually a `string` with positive length, so proxy
|
|
18
|
+
* placeholders and empty strings yield `undefined` instead of leaking into
|
|
19
|
+
* config objects.
|
|
20
|
+
* @param {unknown} value - The raw environment value to test.
|
|
21
|
+
* @returns {string | undefined} The string value, or `undefined` when the value is not a non-empty string.
|
|
22
|
+
*/
|
|
14
23
|
export declare function envString(value: unknown): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* @description Returns a finite number when the value is a usable number
|
|
26
|
+
* @summary Accepts only real finite numbers, rejecting proxy placeholders,
|
|
27
|
+
* `NaN`, and `Infinity` so numeric environment leaves produce `undefined`
|
|
28
|
+
* rather than invalid config values.
|
|
29
|
+
* @param {unknown} value - The raw environment value to test.
|
|
30
|
+
* @returns {number | undefined} The numeric value, or `undefined` when the value is not a finite number.
|
|
31
|
+
*/
|
|
15
32
|
export declare function envNumber(value: unknown): number | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* @description Returns a boolean when the value is actually a boolean
|
|
35
|
+
* @summary Accepts only `true`/`false`; any other value (including proxy
|
|
36
|
+
* placeholders and string-encoded flags) yields `undefined`.
|
|
37
|
+
* @param {unknown} value - The raw environment value to test.
|
|
38
|
+
* @returns {boolean | undefined} The boolean value, or `undefined` when the value is not a boolean.
|
|
39
|
+
*/
|
|
16
40
|
export declare function envBoolean(value: unknown): boolean | undefined;
|
|
@@ -11,6 +11,30 @@
|
|
|
11
11
|
* must use these helpers instead of a raw truthiness check, both to decide whether a
|
|
12
12
|
* field was really configured and to build the config object it returns.
|
|
13
13
|
*/
|
|
14
|
+
/**
|
|
15
|
+
* @description Returns a non-empty string when the value is a usable string
|
|
16
|
+
* @summary Guards against `LoggedEnvironment` unset-leaf proxies: a value is
|
|
17
|
+
* accepted only when it is actually a `string` with positive length, so proxy
|
|
18
|
+
* placeholders and empty strings yield `undefined` instead of leaking into
|
|
19
|
+
* config objects.
|
|
20
|
+
* @param {unknown} value - The raw environment value to test.
|
|
21
|
+
* @returns {string | undefined} The string value, or `undefined` when the value is not a non-empty string.
|
|
22
|
+
*/
|
|
14
23
|
export declare function envString(value: unknown): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* @description Returns a finite number when the value is a usable number
|
|
26
|
+
* @summary Accepts only real finite numbers, rejecting proxy placeholders,
|
|
27
|
+
* `NaN`, and `Infinity` so numeric environment leaves produce `undefined`
|
|
28
|
+
* rather than invalid config values.
|
|
29
|
+
* @param {unknown} value - The raw environment value to test.
|
|
30
|
+
* @returns {number | undefined} The numeric value, or `undefined` when the value is not a finite number.
|
|
31
|
+
*/
|
|
15
32
|
export declare function envNumber(value: unknown): number | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* @description Returns a boolean when the value is actually a boolean
|
|
35
|
+
* @summary Accepts only `true`/`false`; any other value (including proxy
|
|
36
|
+
* placeholders and string-encoded flags) yields `undefined`.
|
|
37
|
+
* @param {unknown} value - The raw environment value to test.
|
|
38
|
+
* @returns {boolean | undefined} The boolean value, or `undefined` when the value is not a boolean.
|
|
39
|
+
*/
|
|
16
40
|
export declare function envBoolean(value: unknown): boolean | undefined;
|