Skip to content

feat(adapter-s3): optional serverSideEncryption on putObject - #33

Closed
filipeforattini wants to merge 1 commit into
mainfrom
feat/adapter-s3-server-side-encryption
Closed

filipeforattini wants to merge 1 commit into
mainfrom
feat/adapter-s3-server-side-encryption

Conversation

@filipeforattini

Copy link
Copy Markdown
Member

Contexto

Consumidores do @baldim/adapter-s3 que precisam pedir criptografia at-rest ao S3 (ServerSideEncryption) hoje precisam registrar middleware no client do AWS SDK por fora do adapter — caso do svc-cron (stone-payments/closer PR #4291), que injeta o header via middlewareStack porque o putObject do adapter não expõe o parâmetro. Este PR fecha o primeiro dos dois gaps levantados na migração do closer para o baldim.

Gap 1 — SSE param (implementado aqui)

StoragePutObjectParams ganha serverSideEncryption?: 'AES256' | 'aws:kms', repassado pelo S3Client.putObject como ServerSideEncryption no PutObjectCommand. Opcional e aditivo: nenhum write path existente muda de comportamento.

Verificação: teste novo (server-side-encryption.test.ts) sobe um S3 falso em 127.0.0.1 e inspeciona o que sai na rede — PUT com o header x-amz-server-side-encryption: AES256 quando o param é passado, sem header no default e em GET. typecheck e suite do adapter verdes (6 passed; contrato S3 real permanece gated por BALDIM_S3_CONTRACT_URL).

Gap 2 — multipart upload (documentado, não implementado)

putObject usa PutObjectCommand, então objetos acima de 5 GB (ou uploads instáveis de alto volume) não têm multipart. É o que segura o svc-worker do closer (Parquet grande via @aws-sdk/lib-storage Upload, partSize 16 MB) migrando para o baldim. Desenho proposto para um PR futuro:

  • Novo método opcional no contrato: uploadObject(params: StorageUploadObjectParams): Promise<...> com partSize?: number e queueSize?: number, implementado no adapter-s3 com @aws-sdk/lib-storage (new Upload({ client, params })) e mapeado para putObject nos adapters que não suportam multipart (memory/filesystem) — mesma estratégia do driver de backup, que já trata uploadObject como capacidade opcional (s3-backup-driver.class.ts).
  • StorageUploadObjectParams estende StoragePutObjectParams (herdando serverSideEncryption de graça — Upload aceita os mesmos inputs).
  • Não usar o nome putObject com multipart implícito: mudaria a semântica de single-shot que o contrato público e tests/storage-adapter-contract.ts já estabelecem.

Mudanças

  • core/src/clients/types.ts: serverSideEncryption?: 'AES256' | 'aws:kms' em StoragePutObjectParams
  • adapters/s3/src/s3-client.class.ts: forward para options.ServerSideEncryption
  • adapters/s3/tests/server-side-encryption.test.ts: prova de rede com S3 falso
  • .changeset/adapter-s3-server-side-encryption.md: minor de @baldim/core e @baldim/adapter-s3

StoragePutObjectParams gains serverSideEncryption ('AES256' | 'aws:kms'),
forwarded by the S3 adapter as ServerSideEncryption on PutObjectCommand.
Consumers that had to register SDK middleware to keep at-rest encryption
requests (svc-cron's S3WebhookSubscriptionStore) can pass the param instead.
Covered by a local fake-S3 test asserting the header on PUT and its absence
by default and on reads. Changeset: minor for @baldim/core and @baldim/adapter-s3.
@filipeforattini
filipeforattini deleted the feat/adapter-s3-server-side-encryption branch September 16, 2026 07:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant