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/a1O a1SignaturesLayer recebe os bytes do .pfx e a senha em Redacted, valida o certificado e fornece o serviço Signatures.
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".
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: booleanO 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/pdfimport { 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:
signature-kit.WRONG_PASSWORD— "Senha do certificado incorreta."signature-kit.NO_PRIVATE_KEY— "O arquivo não contém uma chave privada."signature-kit.INVALID_FORMAT— o arquivo não é um PKCS#12 (.pfx/.p12).
Próximos passos
Introdução
Assinatura nativa de Effect para TypeScript — A1 primeiro, uma fronteira Signatures, formatos XML/PDF ao redor e UI de navegador na borda da app.
Primeiro Uso
Carregue um certificado A1, inspecione a identidade e assine seus primeiros bytes — depois um XML e um PDF — em um único programa Effect.