SignatureKit
Comece aqui

Instalação

Instale o core e o signer A1, forneça a layer Signatures e assine seus primeiros bytes com erros tipados.

O que você vai fazer: instalar o runtime, carregar um certificado A1 e assinar bytes com erros tipados. Formatos e provedores vêm depois, sem alterar o contrato da sua aplicação.

Comece pelo runtime @signature-kit/core e pelo signer @signature-kit/a1.

npm install @signature-kit/core @signature-kit/a1

O a1SignaturesLayer recebe os bytes do .pfx e a senha em Redacted, valida o certificado e fornece o serviço Signatures.

signature-kit.ts
import { a1SignaturesLayer } from "@signature-kit/a1/signer"
import { signatures } from "@signature-kit/core/signatures"
import { Effect, Redacted } from "effect"

export const layer = a1SignaturesLayer({
  pfx,                                          // Uint8Array — bytes do .pfx/.p12
  password: Redacted.make(process.env.A1_PASSWORD ?? ""),
})

a senha é Redacted.Redacted<string> — envolva-a com Redacted.make(...) para manter o segredo fora dos logs até o momento de uso.

O serviço expõe signatures.inspect, signatures.sign e signatures.verify. O algoritmo é "rsa-sha256" ou "rsa-sha512".

sign.ts
const program = Effect.gen(function* () {
  const identity = yield* signatures.inspect()  // e-CPF / e-CNPJ
  const artifact = yield* signatures.sign({
    content,
    algorithm: "rsa-sha256",
  })

  const result = yield* signatures.verify({
    content,
    signature: artifact.signature,
    algorithm: artifact.algorithm,
  })
  return { identity, result }
}).pipe(Effect.provide(layer))
// result.valid: boolean

O PDF reaproveita a mesma fronteira via Effect.provide(layer). O XML também declara o xmlRuntimeLayer, uma dependência de runtime explícita.

npm install @signature-kit/xml @signature-kit/pdf
documents.ts
import { signXml } from "@signature-kit/xml/sign"
import { xmlRuntimeLayer } from "@signature-kit/xml/runtime"
import { signPdf } from "@signature-kit/pdf/sign"
import { a1SignaturesLayer } from "@signature-kit/a1/signer"
import { Effect } from "effect"

const layer = a1SignaturesLayer({ pfx, password })

const signedXml = yield* signXml({ xml, referenceId: "nfe-1" })
  .pipe(Effect.provide(layer), Effect.provide(xmlRuntimeLayer))

const signedPdf = yield* signPdf({ pdf, policy: "pades-icp-brasil" })
  .pipe(Effect.provide(layer))

Erros que você pode encontrar

Toda falha é um SignatureKitError tipado no canal de erro. Os mais comuns durante a instalação:

Próximos passos

Nesta página