@crava/sdk
SDK TypeScript pra integrar consent, DSAR e logs de PII no seu Next.js/Express/Hono/Fastify.
Instalação
npm i @crava/sdk
# ou: pnpm add @crava/sdk
# ou: bun add @crava/sdkTamanho: <25 KB gzipped. Zero deps externas pesadas. Tree-shakeable. Funciona em Node 20+, Edge Runtime, Bun.
Setup
// lib/crava.ts
import { Cravar } from '@crava/sdk';
export const crava = new Cravar({
apiKey: process.env.CRAVA_API_KEY!,
projectId: process.env.CRAVA_PROJECT_ID!,
// mode: 'local' pra rodar offline (CI, air-gapped)
});API pública (v0.1)
trackConsent
await crava.trackConsent({
userExternalId: user.id,
preferences: { essential: true, analytics: false, marketing: false },
meta: { ip: req.ip, ua: req.headers['user-agent'] },
});Registra consent server-side. IP e UA são hasheados antes de armazenar.
getConsent
const consent = await crava.getConsent(user.id);
if (consent?.preferences.analytics) {
// dispara analytics
}requestDataAccess / requestDataDeletion / requestDataPortability
await crava.requestDataDeletion({
userExternalId: user.id,
reason: 'subject-initiated',
});Cria um DSAR. O Cravar chama de volta seu webhook (ou usa handlers que você registrou via SDK) com dry_run=true primeiro, pra você listar o que será deletado/anonimizado.
registerDSARHandlers
crava.registerDSARHandlers({
onAccess: async (req) => {
const data = await db.query.users.findFirst({ where: eq(users.id, req.subjectId) });
return { data };
},
onErasure: async (req, { dryRun }) => {
if (dryRun) {
// só lista o que será apagado
return { willDelete: [{ table: 'users', count: 1 }, { table: 'sessions', count: 12 }] };
}
await db.delete(users).where(eq(users.id, req.subjectId));
return { deleted: { users: 1, sessions: 12 } };
},
onPortability: async (req) => {
const exported = await exportUser(req.subjectId);
return { format: 'application/json', data: exported };
},
});redactPII
import { redactPII } from '@crava/sdk';
logger.info(redactPII({ email: user.email, cpf: user.cpf, name: user.name }));
// → { email: '[REDACTED]', cpf: '[REDACTED]', name: '[REDACTED]' }logCollection
await crava.logCollection({
field: 'cpf',
basis: 'contract',
basisArticle: '7-V',
purpose: 'Emissão de nota fiscal',
retentionDays: 1825, // 5 anos (obrigação fiscal)
});Mais usado pelo CLI durante scan. Pode também ser chamado manualmente.
Tipos TypeScript
Tudo com tipo. Sem any. Cobertura 100%.
Roadmap
- v0.1 (em construção) — APIs acima
- v0.2 — verifyDSAR helper (validação de OTP no servidor)
- v0.3 — middleware Next.js + Express + Hono
- v1.0 — após beta privado fechado, API estável
Status atual: em construção. O SDK ainda não está publicado no npm. Cadastra na waitlist que avisa quando soltar.