@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
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Repository } from "@decaf-ts/core";
|
|
2
|
+
import { DeleteSecretOptions, ExistsSecretOptions, RotateSecretOptions, SecretName, SecretPayload, SecretProvider, SecretReference, StoreSecretOptions } from "../../secrets/core/index.d.mts";
|
|
3
|
+
import { CreateCredentialInput, CredentialSummary, RotateCredentialInput } from "../types.d.mts";
|
|
4
|
+
import { BaseModelService } from "../utils.d.mts";
|
|
5
|
+
import { Credential } from "../models/credential.model.d.mts";
|
|
6
|
+
/**
|
|
7
|
+
* @description Minimal secret-store contract required by the credential service
|
|
8
|
+
* @summary Structural subset of the secret service API used for credential
|
|
9
|
+
* values; `rotate` is optional — when absent, rotation falls back to a
|
|
10
|
+
* re-store under the same secret name.
|
|
11
|
+
*/
|
|
12
|
+
export interface CredentialSecretStore {
|
|
13
|
+
/** @description Fixed provider discriminator of the backing implementation. */
|
|
14
|
+
readonly provider: SecretProvider;
|
|
15
|
+
/** @description Stores (or overwrites) a named secret payload. */
|
|
16
|
+
store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: any[]): Promise<SecretReference>;
|
|
17
|
+
/** @description Deletes a stored secret. */
|
|
18
|
+
delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: any[]): Promise<void>;
|
|
19
|
+
/** @description Checks whether a secret exists. */
|
|
20
|
+
exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: any[]): Promise<boolean>;
|
|
21
|
+
/** @description Optional in-place rotation of a stored secret value. */
|
|
22
|
+
rotate?(nameOrRef: SecretName | SecretReference, value: SecretPayload, options?: RotateSecretOptions, ...args: any[]): Promise<SecretReference>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @description Injection configuration for the credential service
|
|
26
|
+
* @summary When `secretService` is omitted, the service lazily boots a
|
|
27
|
+
* `{@link ModelSecretService}` on first use; when `repository` is omitted,
|
|
28
|
+
* the base `BaseModelService` repository for `{@link Credential}` is used.
|
|
29
|
+
*/
|
|
30
|
+
export interface CredentialServiceConfig {
|
|
31
|
+
/** @description Secret store for credential values (must have `provider: "model"`). */
|
|
32
|
+
secretService?: CredentialSecretStore;
|
|
33
|
+
/** @description Repository backing the `Credential` metadata rows. */
|
|
34
|
+
repository?: Repository<Credential, any>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* @description Manages namespaced credentials and their encrypted secret values
|
|
38
|
+
* @summary Extends `BaseModelService<Credential>` to create, rotate, read,
|
|
39
|
+
* list, use-mark, and delete credentials. On create, the secret value is
|
|
40
|
+
* stored under a generated name first and the metadata row second; if the
|
|
41
|
+
* row insert fails, the stored secret is force-deleted so no orphaned secret
|
|
42
|
+
* remains. Deletion mirrors that: the row is removed, then the secret value.
|
|
43
|
+
* The secret store must resolve to `provider: "model"` — user/runtime
|
|
44
|
+
* credentials always live in the model-backed secret service.
|
|
45
|
+
* @category Namespaces
|
|
46
|
+
* @example
|
|
47
|
+
* ```ts
|
|
48
|
+
* import { CredentialService } from "@decaf-ts/integrations/namespaces";
|
|
49
|
+
*
|
|
50
|
+
* const credentials = new CredentialService();
|
|
51
|
+
* const credential = await credentials.createCredential({
|
|
52
|
+
* tenantId: "tenant-1",
|
|
53
|
+
* name: "deploy-token",
|
|
54
|
+
* credentialType: "token",
|
|
55
|
+
* secret: { value: "s3cr3t" },
|
|
56
|
+
* });
|
|
57
|
+
* await credentials.rotateCredential({
|
|
58
|
+
* credentialId: credential.id,
|
|
59
|
+
* secret: { value: "n3w-s3cr3t" },
|
|
60
|
+
* });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare class CredentialService extends BaseModelService<Credential> {
|
|
64
|
+
private secretServiceInstance?;
|
|
65
|
+
/**
|
|
66
|
+
* @description Creates the credential service
|
|
67
|
+
* @param {CredentialServiceConfig} [config] - Optional secret store and repository overrides.
|
|
68
|
+
*/
|
|
69
|
+
constructor(config?: CredentialServiceConfig);
|
|
70
|
+
/**
|
|
71
|
+
* @description Resolves the model-backed secret store, booting one lazily
|
|
72
|
+
* @summary Returns the injected secret service or lazily boots a fresh
|
|
73
|
+
* `{@link ModelSecretService}`; rejects with a {@link ValidationError} when
|
|
74
|
+
* the resolved store's provider is not `"model"`.
|
|
75
|
+
* @returns {Promise<CredentialSecretStore>} The model-backed secret store.
|
|
76
|
+
* @throws {ValidationError} When the injected store is not model-backed.
|
|
77
|
+
*/
|
|
78
|
+
protected secretService(): Promise<CredentialSecretStore>;
|
|
79
|
+
/**
|
|
80
|
+
* @description Creates a credential row and stores its secret value
|
|
81
|
+
* @summary Validates the name (trimmed, ≤255 chars, `[A-Za-z0-9][A-Za-z0-9._-]*`),
|
|
82
|
+
* stores the secret under a generated `credential-<uuid>` name scoped to the
|
|
83
|
+
* supplied tenant/org-unit/owner, then inserts the metadata row. If the row
|
|
84
|
+
* insert fails, the just-stored secret is force-deleted before rethrowing.
|
|
85
|
+
* @param {CreateCredentialInput} input - Credential definition (name, type, secret value, scoping, metadata).
|
|
86
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the store and repository.
|
|
87
|
+
* @returns {Promise<Credential>} The persisted credential row.
|
|
88
|
+
* @throws {ValidationError} When the name is invalid.
|
|
89
|
+
*/
|
|
90
|
+
createCredential(input: CreateCredentialInput, ...args: any[]): Promise<Credential>;
|
|
91
|
+
/**
|
|
92
|
+
* @description Replaces a credential's secret value
|
|
93
|
+
* @summary Uses the backing store's `rotate` when available; otherwise
|
|
94
|
+
* re-stores the value under the existing secret name with the supplied
|
|
95
|
+
* version and the credential's tenant/org-unit/owner scoping. The
|
|
96
|
+
* credential row's `updatedAt` is refreshed afterwards.
|
|
97
|
+
* @param {RotateCredentialInput} input - Credential id, new secret value, and optional version.
|
|
98
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the store and repository.
|
|
99
|
+
* @returns {Promise<Credential>} The updated credential row.
|
|
100
|
+
*/
|
|
101
|
+
rotateCredential(input: RotateCredentialInput, ...args: any[]): Promise<Credential>;
|
|
102
|
+
/**
|
|
103
|
+
* @description Reads a credential row by id
|
|
104
|
+
* @summary Runs the read inside the explicit `withinTransaction` boundary
|
|
105
|
+
* instead of `@transactional()`: a missing trailing `Context` is synthesized
|
|
106
|
+
* via `logCtx(args, ..., true)`, then the helper reuses an in-flight
|
|
107
|
+
* `ContextLock` or opens a new one (`resolveTransactionLock` + `begin`),
|
|
108
|
+
* rolling back on error and committing when this is the outermost frame. On
|
|
109
|
+
* a TypeORM-backed repository this binds the context's principal to
|
|
110
|
+
* `app.principal_id` for the duration of the transaction so namespace RLS
|
|
111
|
+
* applies to the read.
|
|
112
|
+
* @param {string} credentialId - The credential id.
|
|
113
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
114
|
+
* @returns {Promise<Credential>} The credential row.
|
|
115
|
+
*/
|
|
116
|
+
getCredential(credentialId: string, ...args: any[]): Promise<Credential>;
|
|
117
|
+
/**
|
|
118
|
+
* @description Lists all credentials as summaries (no secret material)
|
|
119
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
120
|
+
* @returns {Promise<CredentialSummary[]>} Summary records for every credential.
|
|
121
|
+
*/
|
|
122
|
+
listCredentials(...args: any[]): Promise<CredentialSummary[]>;
|
|
123
|
+
/**
|
|
124
|
+
* @description Stamps a credential's `lastUsedAt` timestamp
|
|
125
|
+
* @summary Runs the read and the update inside one explicit
|
|
126
|
+
* `withinTransaction` boundary instead of `@transactional()`: a missing
|
|
127
|
+
* trailing `Context` is synthesized via `logCtx(args, ..., true)`, then the
|
|
128
|
+
* helper reuses an in-flight `ContextLock` or opens a new one
|
|
129
|
+
* (`resolveTransactionLock` + `begin`), rolling back on error and committing
|
|
130
|
+
* when this is the outermost frame. On a TypeORM-backed repository this
|
|
131
|
+
* binds the context's principal to `app.principal_id` for the duration of
|
|
132
|
+
* the transaction so namespace RLS applies to both statements.
|
|
133
|
+
* @param {string} credentialId - The credential id.
|
|
134
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the repository.
|
|
135
|
+
* @returns {Promise<Credential>} The updated credential row.
|
|
136
|
+
*/
|
|
137
|
+
markCredentialUsed(credentialId: string, ...args: any[]): Promise<Credential>;
|
|
138
|
+
/**
|
|
139
|
+
* @description Deletes a credential row and its stored secret value
|
|
140
|
+
* @summary Removes the metadata row first, then force-deletes the
|
|
141
|
+
* referenced secret from the backing store.
|
|
142
|
+
* @param {string} credentialId - The credential id.
|
|
143
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the repository and store.
|
|
144
|
+
* @returns {Promise<void>} Resolves once the row and secret are removed.
|
|
145
|
+
*/
|
|
146
|
+
deleteCredential(credentialId: string, ...args: any[]): Promise<void>;
|
|
147
|
+
/**
|
|
148
|
+
* @description Runs an operation inside an explicit adapter transaction boundary
|
|
149
|
+
* @summary Mirrors core's `@transactional()` proxy without the decorator:
|
|
150
|
+
* reuses the `ContextLock` already cached on the context (`transactionLock`)
|
|
151
|
+
* when a transaction is in flight, otherwise resolves a fresh lock via
|
|
152
|
+
* `resolveTransactionLock` and `begin`s it, caching it on the context so
|
|
153
|
+
* nested frames share it. Depth is tracked so nested calls only decrement;
|
|
154
|
+
* the outermost frame commits. On error the frame rolls back — unless an
|
|
155
|
+
* inner frame already ended the transaction — and rethrows the original
|
|
156
|
+
* error. When the repository exposes no adapter `transactionLock` (e.g.
|
|
157
|
+
* non-transactional adapters or repository doubles), the operation runs
|
|
158
|
+
* directly with no transaction. If `ctx` is `undefined`, a standalone
|
|
159
|
+
* context is synthesized via `this.context`.
|
|
160
|
+
* @template R - The operation's result type.
|
|
161
|
+
* @param {Context<any> | undefined} ctx - The caller's decaf `Context`, if one was resolved or synthesized.
|
|
162
|
+
* @param {() => Promise<R>} operation - The repository work to run inside the transaction.
|
|
163
|
+
* @returns {Promise<R>} The operation's result, committed when outermost.
|
|
164
|
+
* @throws {InternalError} When the outermost commit fails.
|
|
165
|
+
*/
|
|
166
|
+
private withinTransaction;
|
|
167
|
+
/**
|
|
168
|
+
* @description Maps a credential row to its API summary shape
|
|
169
|
+
* @summary Resolves tenant/org-unit/owner relations to their ids and strips
|
|
170
|
+
* all secret material (the secret value is never exposed).
|
|
171
|
+
* @param {Credential} credential - The credential row.
|
|
172
|
+
* @returns {CredentialSummary} The summary record.
|
|
173
|
+
*/
|
|
174
|
+
private toSummary;
|
|
175
|
+
}
|
|
@@ -52,6 +52,10 @@ export declare enum StorageBindingKind {
|
|
|
52
52
|
Shared = "shared",
|
|
53
53
|
Dedicated = "dedicated"
|
|
54
54
|
}
|
|
55
|
+
export declare enum CredentialProvider {
|
|
56
|
+
Model = "model",
|
|
57
|
+
Filesystem = "filesystem"
|
|
58
|
+
}
|
|
55
59
|
export declare const IsolationTierOptions: IsolationTier[];
|
|
56
60
|
export declare const MembershipStatusOptions: MembershipStatus[];
|
|
57
61
|
export declare const PrincipalKindOptions: PrincipalKind[];
|
|
@@ -60,6 +64,7 @@ export declare const PermissionCategoryOptions: PermissionCategory[];
|
|
|
60
64
|
export declare const ResourceVisibilityOptions: ResourceVisibility[];
|
|
61
65
|
export declare const StorageKindOptions: StorageKind[];
|
|
62
66
|
export declare const StorageBindingKindOptions: StorageBindingKind[];
|
|
67
|
+
export declare const CredentialProviderOptions: CredentialProvider[];
|
|
63
68
|
export type TxArgs = any[];
|
|
64
69
|
export interface CreateTenantInput {
|
|
65
70
|
slug: string;
|
|
@@ -162,6 +167,38 @@ export interface CreateStorageBindingInput {
|
|
|
162
167
|
region: string;
|
|
163
168
|
config?: Record<string, unknown>;
|
|
164
169
|
}
|
|
170
|
+
export interface CreateCredentialInput {
|
|
171
|
+
tenantId: string;
|
|
172
|
+
orgUnitId?: string;
|
|
173
|
+
ownerPrincipalId?: string;
|
|
174
|
+
name: string;
|
|
175
|
+
credentialType: string;
|
|
176
|
+
secret: string | Record<string, unknown> | Uint8Array;
|
|
177
|
+
description?: string;
|
|
178
|
+
metadata?: Record<string, unknown>;
|
|
179
|
+
expiresAt?: Date;
|
|
180
|
+
}
|
|
181
|
+
export interface RotateCredentialInput {
|
|
182
|
+
credentialId: string;
|
|
183
|
+
secret: string | Record<string, unknown> | Uint8Array;
|
|
184
|
+
version?: string;
|
|
185
|
+
}
|
|
186
|
+
export interface CredentialSummary {
|
|
187
|
+
id: string;
|
|
188
|
+
tenantId: string;
|
|
189
|
+
orgUnitId?: string;
|
|
190
|
+
ownerPrincipalId?: string;
|
|
191
|
+
name: string;
|
|
192
|
+
credentialType: string;
|
|
193
|
+
provider: CredentialProvider;
|
|
194
|
+
description?: string;
|
|
195
|
+
enabled: boolean;
|
|
196
|
+
metadata?: Record<string, unknown>;
|
|
197
|
+
expiresAt?: Date;
|
|
198
|
+
lastUsedAt?: Date;
|
|
199
|
+
createdAt?: Date;
|
|
200
|
+
updatedAt?: Date;
|
|
201
|
+
}
|
|
165
202
|
export interface BootstrapPermission {
|
|
166
203
|
key: string;
|
|
167
204
|
category: PermissionCategory;
|
|
@@ -52,6 +52,10 @@ export declare enum StorageBindingKind {
|
|
|
52
52
|
Shared = "shared",
|
|
53
53
|
Dedicated = "dedicated"
|
|
54
54
|
}
|
|
55
|
+
export declare enum CredentialProvider {
|
|
56
|
+
Model = "model",
|
|
57
|
+
Filesystem = "filesystem"
|
|
58
|
+
}
|
|
55
59
|
export declare const IsolationTierOptions: IsolationTier[];
|
|
56
60
|
export declare const MembershipStatusOptions: MembershipStatus[];
|
|
57
61
|
export declare const PrincipalKindOptions: PrincipalKind[];
|
|
@@ -60,6 +64,7 @@ export declare const PermissionCategoryOptions: PermissionCategory[];
|
|
|
60
64
|
export declare const ResourceVisibilityOptions: ResourceVisibility[];
|
|
61
65
|
export declare const StorageKindOptions: StorageKind[];
|
|
62
66
|
export declare const StorageBindingKindOptions: StorageBindingKind[];
|
|
67
|
+
export declare const CredentialProviderOptions: CredentialProvider[];
|
|
63
68
|
export type TxArgs = any[];
|
|
64
69
|
export interface CreateTenantInput {
|
|
65
70
|
slug: string;
|
|
@@ -162,6 +167,38 @@ export interface CreateStorageBindingInput {
|
|
|
162
167
|
region: string;
|
|
163
168
|
config?: Record<string, unknown>;
|
|
164
169
|
}
|
|
170
|
+
export interface CreateCredentialInput {
|
|
171
|
+
tenantId: string;
|
|
172
|
+
orgUnitId?: string;
|
|
173
|
+
ownerPrincipalId?: string;
|
|
174
|
+
name: string;
|
|
175
|
+
credentialType: string;
|
|
176
|
+
secret: string | Record<string, unknown> | Uint8Array;
|
|
177
|
+
description?: string;
|
|
178
|
+
metadata?: Record<string, unknown>;
|
|
179
|
+
expiresAt?: Date;
|
|
180
|
+
}
|
|
181
|
+
export interface RotateCredentialInput {
|
|
182
|
+
credentialId: string;
|
|
183
|
+
secret: string | Record<string, unknown> | Uint8Array;
|
|
184
|
+
version?: string;
|
|
185
|
+
}
|
|
186
|
+
export interface CredentialSummary {
|
|
187
|
+
id: string;
|
|
188
|
+
tenantId: string;
|
|
189
|
+
orgUnitId?: string;
|
|
190
|
+
ownerPrincipalId?: string;
|
|
191
|
+
name: string;
|
|
192
|
+
credentialType: string;
|
|
193
|
+
provider: CredentialProvider;
|
|
194
|
+
description?: string;
|
|
195
|
+
enabled: boolean;
|
|
196
|
+
metadata?: Record<string, unknown>;
|
|
197
|
+
expiresAt?: Date;
|
|
198
|
+
lastUsedAt?: Date;
|
|
199
|
+
createdAt?: Date;
|
|
200
|
+
updatedAt?: Date;
|
|
201
|
+
}
|
|
165
202
|
export interface BootstrapPermission {
|
|
166
203
|
key: string;
|
|
167
204
|
category: PermissionCategory;
|
|
@@ -274,6 +274,8 @@ export declare class RedisAdapter extends Adapter<RedisConfig, RedisClientType,
|
|
|
274
274
|
* through a `for()` configuration-scoped proxy, whose own `_client` slot would
|
|
275
275
|
* otherwise be empty and build a fresh unconnected client). Otherwise builds a
|
|
276
276
|
* node-redis client from the configured URL or discrete host/port/credentials.
|
|
277
|
+
* When `tls` is set, `tls: true` plus any supplied `tls.connect` options are
|
|
278
|
+
* merged into the socket options (a `rediss://` URL is passed through as-is).
|
|
277
279
|
* The client is created lazily and connected by {@link initialize}.
|
|
278
280
|
* @return {RedisClientType} The Redis client
|
|
279
281
|
*/
|
|
@@ -274,6 +274,8 @@ export declare class RedisAdapter extends Adapter<RedisConfig, RedisClientType,
|
|
|
274
274
|
* through a `for()` configuration-scoped proxy, whose own `_client` slot would
|
|
275
275
|
* otherwise be empty and build a fresh unconnected client). Otherwise builds a
|
|
276
276
|
* node-redis client from the configured URL or discrete host/port/credentials.
|
|
277
|
+
* When `tls` is set, `tls: true` plus any supplied `tls.connect` options are
|
|
278
|
+
* merged into the socket options (a `rediss://` URL is passed through as-is).
|
|
277
279
|
* The client is created lazily and connected by {@link initialize}.
|
|
278
280
|
* @return {RedisClientType} The Redis client
|
|
279
281
|
*/
|
|
@@ -1,13 +1,36 @@
|
|
|
1
1
|
import { Model } from "@decaf-ts/decorator-validation";
|
|
2
2
|
import { Constructor } from "@decaf-ts/decoration";
|
|
3
3
|
import { AdapterFlags, Context } from "@decaf-ts/core";
|
|
4
|
+
/**
|
|
5
|
+
* @description TLS settings accepted by {@link RedisAdapter}
|
|
6
|
+
* @summary `true` enables TLS with Node's default verification (server
|
|
7
|
+
* certificate checked). An object enables TLS and forwards the standard Node
|
|
8
|
+
* `tls.connect` options (`rejectUnauthorized`, `ca`, `cert`, `key`,
|
|
9
|
+
* `servername`); set `rejectUnauthorized: false` only for a known development
|
|
10
|
+
* server with a self-signed certificate.
|
|
11
|
+
* @typedef {boolean | object} RedisTlsConfig
|
|
12
|
+
* @memberOf module:redis
|
|
13
|
+
*/
|
|
14
|
+
export type RedisTlsConfig = boolean | {
|
|
15
|
+
rejectUnauthorized?: boolean;
|
|
16
|
+
ca?: string | Buffer;
|
|
17
|
+
cert?: string | Buffer;
|
|
18
|
+
key?: string | Buffer;
|
|
19
|
+
servername?: string;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
};
|
|
4
22
|
/**
|
|
5
23
|
* @description Connection configuration accepted by {@link RedisAdapter}
|
|
6
24
|
* @summary Supports both a full connection URL and the individual host/port/
|
|
7
25
|
* credential fields. When `url` is provided it takes precedence over the
|
|
8
|
-
* discrete fields.
|
|
26
|
+
* discrete fields. Set `tls` (or use a `rediss://` URL) to encrypt the
|
|
27
|
+
* connection.
|
|
28
|
+
*
|
|
29
|
+
* Note on `KEYS`: Redis `KEYS` walks the whole keyspace and blocks the server
|
|
30
|
+
* while it runs. Prefer `SCAN`/`scanIterator` (or a maintained index) in
|
|
31
|
+
* production; the adapter's key listing is intended for small namespaces.
|
|
9
32
|
* @typedef {object} RedisConfig
|
|
10
|
-
* @property {string} [url] Full redis:// connection string
|
|
33
|
+
* @property {string} [url] Full redis:// (or rediss://) connection string
|
|
11
34
|
* @property {string} [host] Server host (defaults to localhost)
|
|
12
35
|
* @property {number} [port] Server port (defaults to 6379)
|
|
13
36
|
* @property {string} [username] ACL username
|
|
@@ -15,6 +38,7 @@ import { AdapterFlags, Context } from "@decaf-ts/core";
|
|
|
15
38
|
* @property {number} [database] Logical database index
|
|
16
39
|
* @property {string} [prefix] Key namespace (defaults to decaf:redis)
|
|
17
40
|
* @property {string} [user] Identity reported on created/updated records
|
|
41
|
+
* @property {RedisTlsConfig} [tls] Enable TLS and optionally supply verification options
|
|
18
42
|
* @memberOf module:redis
|
|
19
43
|
*/
|
|
20
44
|
export type RedisConfig = {
|
|
@@ -26,6 +50,7 @@ export type RedisConfig = {
|
|
|
26
50
|
database?: number;
|
|
27
51
|
prefix?: string;
|
|
28
52
|
user?: string;
|
|
53
|
+
tls?: RedisTlsConfig;
|
|
29
54
|
};
|
|
30
55
|
/**
|
|
31
56
|
* @description Adapter flags enriched with the acting user identity
|
|
@@ -1,13 +1,36 @@
|
|
|
1
1
|
import { Model } from "@decaf-ts/decorator-validation";
|
|
2
2
|
import { Constructor } from "@decaf-ts/decoration";
|
|
3
3
|
import { AdapterFlags, Context } from "@decaf-ts/core";
|
|
4
|
+
/**
|
|
5
|
+
* @description TLS settings accepted by {@link RedisAdapter}
|
|
6
|
+
* @summary `true` enables TLS with Node's default verification (server
|
|
7
|
+
* certificate checked). An object enables TLS and forwards the standard Node
|
|
8
|
+
* `tls.connect` options (`rejectUnauthorized`, `ca`, `cert`, `key`,
|
|
9
|
+
* `servername`); set `rejectUnauthorized: false` only for a known development
|
|
10
|
+
* server with a self-signed certificate.
|
|
11
|
+
* @typedef {boolean | object} RedisTlsConfig
|
|
12
|
+
* @memberOf module:redis
|
|
13
|
+
*/
|
|
14
|
+
export type RedisTlsConfig = boolean | {
|
|
15
|
+
rejectUnauthorized?: boolean;
|
|
16
|
+
ca?: string | Buffer;
|
|
17
|
+
cert?: string | Buffer;
|
|
18
|
+
key?: string | Buffer;
|
|
19
|
+
servername?: string;
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
};
|
|
4
22
|
/**
|
|
5
23
|
* @description Connection configuration accepted by {@link RedisAdapter}
|
|
6
24
|
* @summary Supports both a full connection URL and the individual host/port/
|
|
7
25
|
* credential fields. When `url` is provided it takes precedence over the
|
|
8
|
-
* discrete fields.
|
|
26
|
+
* discrete fields. Set `tls` (or use a `rediss://` URL) to encrypt the
|
|
27
|
+
* connection.
|
|
28
|
+
*
|
|
29
|
+
* Note on `KEYS`: Redis `KEYS` walks the whole keyspace and blocks the server
|
|
30
|
+
* while it runs. Prefer `SCAN`/`scanIterator` (or a maintained index) in
|
|
31
|
+
* production; the adapter's key listing is intended for small namespaces.
|
|
9
32
|
* @typedef {object} RedisConfig
|
|
10
|
-
* @property {string} [url] Full redis:// connection string
|
|
33
|
+
* @property {string} [url] Full redis:// (or rediss://) connection string
|
|
11
34
|
* @property {string} [host] Server host (defaults to localhost)
|
|
12
35
|
* @property {number} [port] Server port (defaults to 6379)
|
|
13
36
|
* @property {string} [username] ACL username
|
|
@@ -15,6 +38,7 @@ import { AdapterFlags, Context } from "@decaf-ts/core";
|
|
|
15
38
|
* @property {number} [database] Logical database index
|
|
16
39
|
* @property {string} [prefix] Key namespace (defaults to decaf:redis)
|
|
17
40
|
* @property {string} [user] Identity reported on created/updated records
|
|
41
|
+
* @property {RedisTlsConfig} [tls] Enable TLS and optionally supply verification options
|
|
18
42
|
* @memberOf module:redis
|
|
19
43
|
*/
|
|
20
44
|
export type RedisConfig = {
|
|
@@ -26,6 +50,7 @@ export type RedisConfig = {
|
|
|
26
50
|
database?: number;
|
|
27
51
|
prefix?: string;
|
|
28
52
|
user?: string;
|
|
53
|
+
tls?: RedisTlsConfig;
|
|
29
54
|
};
|
|
30
55
|
/**
|
|
31
56
|
* @description Adapter flags enriched with the acting user identity
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/infra-credential-bootstrap
|
|
3
|
+
* @summary Idempotent seeding of infrastructure credentials into a secret store.
|
|
4
|
+
* @description Provides the minimal {@link InfraSecretStore} contract consumed
|
|
5
|
+
* by {@link InfraCredentialBootstrap}, the {@link InfraCredentialSeed} input
|
|
6
|
+
* shape, and the `createInfraCredentialBootstrap` factory that wires the
|
|
7
|
+
* bootstrap to a booted `{@link FsSecretService}`. Intended for startup
|
|
8
|
+
* routines that must guarantee a known set of credentials (for example the
|
|
9
|
+
* Mailpit SMTP credentials) exists before services boot against them.
|
|
10
|
+
*/
|
|
11
|
+
import type { DeleteSecretOptions, ExistsSecretOptions, RetrieveSecretOptions, SecretName, SecretPayload, SecretReference, StoreSecretOptions } from "./core/index.d.cts";
|
|
12
|
+
/**
|
|
13
|
+
* @description Minimal secret-store contract required by the credential bootstrap
|
|
14
|
+
* @summary Structural subset of the secret service API (`store`, `retrieve`,
|
|
15
|
+
* `delete`, `exists`) so any backend — including test doubles — can back the
|
|
16
|
+
* bootstrap without importing the full service hierarchy.
|
|
17
|
+
*/
|
|
18
|
+
export interface InfraSecretStore {
|
|
19
|
+
/** @description Stores (or overwrites) a named secret payload. */
|
|
20
|
+
store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: any[]): Promise<SecretReference>;
|
|
21
|
+
/** @description Reads and decrypts a stored secret payload. */
|
|
22
|
+
retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: any[]): Promise<T>;
|
|
23
|
+
/** @description Deletes a stored secret. */
|
|
24
|
+
delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: any[]): Promise<void>;
|
|
25
|
+
/** @description Checks whether a secret exists. */
|
|
26
|
+
exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: any[]): Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @description One credential to guarantee existence of in the secret store
|
|
30
|
+
* @summary `overwrite: false` (the default) makes `ensure` skip seeds whose
|
|
31
|
+
* name already exists, keeping stored values stable across restarts.
|
|
32
|
+
*/
|
|
33
|
+
export interface InfraCredentialSeed {
|
|
34
|
+
/** @description Secret name to seed (normalized by the backing store). */
|
|
35
|
+
name: SecretName;
|
|
36
|
+
/** @description Payload to store. */
|
|
37
|
+
value: SecretPayload;
|
|
38
|
+
/** @description Optional content type recorded with the secret. */
|
|
39
|
+
contentType?: string;
|
|
40
|
+
/** @description Optional tags recorded with the secret. */
|
|
41
|
+
tags?: Record<string, string>;
|
|
42
|
+
/** @description When `true`, re-store (overwrite) even if the secret already exists. */
|
|
43
|
+
overwrite?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @description Idempotent infrastructure credential seeder
|
|
47
|
+
* @summary Wraps an {@link InfraSecretStore} and guarantees a set of named
|
|
48
|
+
* credentials exists: `ensure` stores each missing seed (skipping existing
|
|
49
|
+
* ones unless `overwrite` is set), `retrieve` reads one back. References
|
|
50
|
+
* returned by `ensure` identify the stored secrets for later cleanup.
|
|
51
|
+
* @category Secrets
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { createInfraCredentialBootstrap } from "@decaf-ts/integrations/secrets";
|
|
55
|
+
*
|
|
56
|
+
* const bootstrap = await createInfraCredentialBootstrap({
|
|
57
|
+
* keySecret: "master-key",
|
|
58
|
+
* });
|
|
59
|
+
* await bootstrap.ensure([
|
|
60
|
+
* { name: "smtp-user", value: { value: "mailpit" } },
|
|
61
|
+
* ]);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare class InfraCredentialBootstrap {
|
|
65
|
+
readonly service: InfraSecretStore;
|
|
66
|
+
/**
|
|
67
|
+
* @description Creates a bootstrap bound to the given secret store
|
|
68
|
+
* @param {InfraSecretStore} service - The backing secret store (typically an `FsSecretService`).
|
|
69
|
+
*/
|
|
70
|
+
constructor(service: InfraSecretStore);
|
|
71
|
+
/**
|
|
72
|
+
* @description Ensures every seed exists in the backing store
|
|
73
|
+
* @summary For each seed, skips when the secret already exists and
|
|
74
|
+
* `overwrite` is not set; otherwise stores it and collects the returned
|
|
75
|
+
* references. Existing-but-skipped seeds contribute no reference.
|
|
76
|
+
* @param {readonly InfraCredentialSeed[]} seeds - The credentials to guarantee.
|
|
77
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the store.
|
|
78
|
+
* @returns {Promise<SecretReference[]>} References for the seeds actually stored during this call.
|
|
79
|
+
*/
|
|
80
|
+
ensure(seeds: readonly InfraCredentialSeed[], ...args: any[]): Promise<SecretReference[]>;
|
|
81
|
+
/**
|
|
82
|
+
* @description Retrieves a previously seeded credential payload
|
|
83
|
+
* @summary Thin wrapper over the backing store's `retrieve`, resolving
|
|
84
|
+
* through the bootstrap's store so callers do not need the service instance.
|
|
85
|
+
* @template T - The expected payload type.
|
|
86
|
+
* @param {SecretName} name - The secret name to read.
|
|
87
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the store.
|
|
88
|
+
* @returns {Promise<T>} The decrypted payload.
|
|
89
|
+
*/
|
|
90
|
+
retrieve<T extends SecretPayload = SecretPayload>(name: SecretName, ...args: any[]): Promise<T>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @description Creates a bootstrap wired to a freshly booted filesystem secret service
|
|
94
|
+
* @summary Constructs an `{@link FsSecretService}`, boots it with the supplied
|
|
95
|
+
* arguments (explicit config or the `secrets.fs` Environment slice), and wraps
|
|
96
|
+
* it in an {@link InfraCredentialBootstrap}.
|
|
97
|
+
* @param {any[]} args - `boot()` arguments forwarded to the `FsSecretService` (config and optional `Context`).
|
|
98
|
+
* @returns {Promise<InfraCredentialBootstrap>} The bootstrap backed by the booted service.
|
|
99
|
+
*/
|
|
100
|
+
export declare function createInfraCredentialBootstrap(...args: any[]): Promise<InfraCredentialBootstrap>;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module integrations/secrets/infra-credential-bootstrap
|
|
3
|
+
* @summary Idempotent seeding of infrastructure credentials into a secret store.
|
|
4
|
+
* @description Provides the minimal {@link InfraSecretStore} contract consumed
|
|
5
|
+
* by {@link InfraCredentialBootstrap}, the {@link InfraCredentialSeed} input
|
|
6
|
+
* shape, and the `createInfraCredentialBootstrap` factory that wires the
|
|
7
|
+
* bootstrap to a booted `{@link FsSecretService}`. Intended for startup
|
|
8
|
+
* routines that must guarantee a known set of credentials (for example the
|
|
9
|
+
* Mailpit SMTP credentials) exists before services boot against them.
|
|
10
|
+
*/
|
|
11
|
+
import type { DeleteSecretOptions, ExistsSecretOptions, RetrieveSecretOptions, SecretName, SecretPayload, SecretReference, StoreSecretOptions } from "./core/index.d.mts";
|
|
12
|
+
/**
|
|
13
|
+
* @description Minimal secret-store contract required by the credential bootstrap
|
|
14
|
+
* @summary Structural subset of the secret service API (`store`, `retrieve`,
|
|
15
|
+
* `delete`, `exists`) so any backend — including test doubles — can back the
|
|
16
|
+
* bootstrap without importing the full service hierarchy.
|
|
17
|
+
*/
|
|
18
|
+
export interface InfraSecretStore {
|
|
19
|
+
/** @description Stores (or overwrites) a named secret payload. */
|
|
20
|
+
store<T extends SecretPayload = SecretPayload>(name: SecretName, value: T, options?: StoreSecretOptions, ...args: any[]): Promise<SecretReference>;
|
|
21
|
+
/** @description Reads and decrypts a stored secret payload. */
|
|
22
|
+
retrieve<T extends SecretPayload = SecretPayload>(nameOrRef: SecretName | SecretReference, options?: RetrieveSecretOptions, ...args: any[]): Promise<T>;
|
|
23
|
+
/** @description Deletes a stored secret. */
|
|
24
|
+
delete(nameOrRef: SecretName | SecretReference, options?: DeleteSecretOptions, ...args: any[]): Promise<void>;
|
|
25
|
+
/** @description Checks whether a secret exists. */
|
|
26
|
+
exists(nameOrRef: SecretName | SecretReference, options?: ExistsSecretOptions, ...args: any[]): Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* @description One credential to guarantee existence of in the secret store
|
|
30
|
+
* @summary `overwrite: false` (the default) makes `ensure` skip seeds whose
|
|
31
|
+
* name already exists, keeping stored values stable across restarts.
|
|
32
|
+
*/
|
|
33
|
+
export interface InfraCredentialSeed {
|
|
34
|
+
/** @description Secret name to seed (normalized by the backing store). */
|
|
35
|
+
name: SecretName;
|
|
36
|
+
/** @description Payload to store. */
|
|
37
|
+
value: SecretPayload;
|
|
38
|
+
/** @description Optional content type recorded with the secret. */
|
|
39
|
+
contentType?: string;
|
|
40
|
+
/** @description Optional tags recorded with the secret. */
|
|
41
|
+
tags?: Record<string, string>;
|
|
42
|
+
/** @description When `true`, re-store (overwrite) even if the secret already exists. */
|
|
43
|
+
overwrite?: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* @description Idempotent infrastructure credential seeder
|
|
47
|
+
* @summary Wraps an {@link InfraSecretStore} and guarantees a set of named
|
|
48
|
+
* credentials exists: `ensure` stores each missing seed (skipping existing
|
|
49
|
+
* ones unless `overwrite` is set), `retrieve` reads one back. References
|
|
50
|
+
* returned by `ensure` identify the stored secrets for later cleanup.
|
|
51
|
+
* @category Secrets
|
|
52
|
+
* @example
|
|
53
|
+
* ```ts
|
|
54
|
+
* import { createInfraCredentialBootstrap } from "@decaf-ts/integrations/secrets";
|
|
55
|
+
*
|
|
56
|
+
* const bootstrap = await createInfraCredentialBootstrap({
|
|
57
|
+
* keySecret: "master-key",
|
|
58
|
+
* });
|
|
59
|
+
* await bootstrap.ensure([
|
|
60
|
+
* { name: "smtp-user", value: { value: "mailpit" } },
|
|
61
|
+
* ]);
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare class InfraCredentialBootstrap {
|
|
65
|
+
readonly service: InfraSecretStore;
|
|
66
|
+
/**
|
|
67
|
+
* @description Creates a bootstrap bound to the given secret store
|
|
68
|
+
* @param {InfraSecretStore} service - The backing secret store (typically an `FsSecretService`).
|
|
69
|
+
*/
|
|
70
|
+
constructor(service: InfraSecretStore);
|
|
71
|
+
/**
|
|
72
|
+
* @description Ensures every seed exists in the backing store
|
|
73
|
+
* @summary For each seed, skips when the secret already exists and
|
|
74
|
+
* `overwrite` is not set; otherwise stores it and collects the returned
|
|
75
|
+
* references. Existing-but-skipped seeds contribute no reference.
|
|
76
|
+
* @param {readonly InfraCredentialSeed[]} seeds - The credentials to guarantee.
|
|
77
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the store.
|
|
78
|
+
* @returns {Promise<SecretReference[]>} References for the seeds actually stored during this call.
|
|
79
|
+
*/
|
|
80
|
+
ensure(seeds: readonly InfraCredentialSeed[], ...args: any[]): Promise<SecretReference[]>;
|
|
81
|
+
/**
|
|
82
|
+
* @description Retrieves a previously seeded credential payload
|
|
83
|
+
* @summary Thin wrapper over the backing store's `retrieve`, resolving
|
|
84
|
+
* through the bootstrap's store so callers do not need the service instance.
|
|
85
|
+
* @template T - The expected payload type.
|
|
86
|
+
* @param {SecretName} name - The secret name to read.
|
|
87
|
+
* @param {any[]} args - Optional trailing decaf `Context` forwarded to the store.
|
|
88
|
+
* @returns {Promise<T>} The decrypted payload.
|
|
89
|
+
*/
|
|
90
|
+
retrieve<T extends SecretPayload = SecretPayload>(name: SecretName, ...args: any[]): Promise<T>;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @description Creates a bootstrap wired to a freshly booted filesystem secret service
|
|
94
|
+
* @summary Constructs an `{@link FsSecretService}`, boots it with the supplied
|
|
95
|
+
* arguments (explicit config or the `secrets.fs` Environment slice), and wraps
|
|
96
|
+
* it in an {@link InfraCredentialBootstrap}.
|
|
97
|
+
* @param {any[]} args - `boot()` arguments forwarded to the `FsSecretService` (config and optional `Context`).
|
|
98
|
+
* @returns {Promise<InfraCredentialBootstrap>} The bootstrap backed by the booted service.
|
|
99
|
+
*/
|
|
100
|
+
export declare function createInfraCredentialBootstrap(...args: any[]): Promise<InfraCredentialBootstrap>;
|
|
@@ -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;
|