Skip to content

SDK Overview

Calvery menyediakan SDK resmi dengan API surface yang konsisten lintas bahasa:

API mapping

Semua SDK punya operasi yang sama, cuma syntax beda. Operasi per-bahasa:

Init client

Node.js
import { Calvery } from '@calvery/sdk'
const c = new Calvery({ token: 'cvsm_...', team: 'acme-corp' })
Python
from calvery import Calvery
c = Calvery('cvsm_...', 'acme-corp')
Go
c, _ := calvery.New("cvsm_...", "acme-corp")
Rust
let c = calvery::Client::new("cvsm_...", "acme-corp")?;
PHP
$c = new \Calvery\Client('cvsm_...', 'acme-corp');
Ruby
c = Calvery::Client.new('cvsm_...', 'acme-corp')
Shell
export CVSM_TOKEN=cvsm_... CVSM_TEAM=acme-corp

Get single secret

Node.js
const db = await c.get('DATABASE_URL')
Python
db = c.get('DATABASE_URL')
Go
db, _ := c.Get(ctx, "DATABASE_URL")
Rust
let db = c.get("DATABASE_URL").await?;
PHP
$db = $c->get('DATABASE_URL');
Ruby
db = c.get('DATABASE_URL')
Shell
calvery get DATABASE_URL

Inject semua ke env

Node.js
await c.inject()
Python
c.inject()
Go
c.Inject(ctx, false) // overwrite=false
Rust
c.inject(false).await?;
PHP
$c->inject(overwrite: false);
Ruby
c.inject!(overwrite: false)
Shell
calvery inject -- node server.js

Override environment

Node.js
c.get('KEY', { environment: 'staging' })
Python
c.get('KEY', environment='staging')
Go
c.Get(ctx, "KEY", calvery.WithEnv("staging"))
Rust
c.get_env("KEY", "staging").await?
PHP
$c->get('KEY', environment: 'staging');
Ruby
c.get('KEY', environment: 'staging')
Shell
calvery get KEY --env staging

Self-host base URL

Node.js
new Calvery({ token, team, baseUrl: 'https://vault.internal' })
Python
Calvery(token, team, base_url='https://vault.internal')
Go
calvery.New(token, team, calvery.WithBaseURL("https://vault.internal"))
Rust
Client::builder(token, team).base_url("https://vault.internal").build()?
PHP
new \Calvery\Client($token, $team, ['base_url' => 'https://vault.internal'])
Ruby
Calvery::Client.new(token, team, base_url: 'https://vault.internal')
Shell
export CVSM_API_URL=https://vault.internal

Fitur shared

Semua SDK punya:

  • Slug-based team lookup — passing "acme-corp" (slug) atau UUID langsung sama valid
  • In-memory cache default 30 detik — .get() 10x = 1 request ke server
  • Exponential backoff retry dengan jitter untuk 5xx + network error
  • Typed errors — bedakan auth, not_found, network, server
  • Self-host friendly — override baseUrl ke deployment internal kamu
  • Zero/minimal deps — Node/Python/Go/Ruby stdlib-only. Rust pakai reqwest+tokio. PHP pakai stdlib curl. Shell cuma curl + jq

Common patterns

Bootstrap di app start

Node.js
await new Calvery({ token, team: 'acme' }).inject()
// process.env sekarang terisi — langsung pakai

CI/CD (GitHub Actions)

- name: Load secrets dari Calvery
run: |
CVSM_TOKEN=${{ secrets.CVSM_TOKEN }} \
npx -y @calvery/sdk inject --env production >> $GITHUB_ENV

Self-host override

const calvery = new Calvery({
token: process.env.CVSM_TOKEN!,
team: 'internal',
baseUrl: 'https://vault.company.internal',
})

Error handling

Semua SDK expose typed errors yang bisa di-catch per-kind:

Node.js
try {
const val = await calvery.get('STRIPE_KEY')
} catch (err) {
if (err instanceof CalveryAuthError) {
// Token expired/revoked — refresh
} else if (err instanceof CalverySecretNotFoundError) {
// Secret belum dibuat di dashboard
} else {
throw err
}
}
try:
val = c.get("STRIPE_KEY")
except CalveryAuthError:
# Token expired
...
except CalverySecretNotFoundError:
# Secret belum dibuat
...
val, err := c.Get(ctx, "STRIPE_KEY")
if calvery.IsAuthError(err) { ... }
if calvery.IsNotFound(err) { ... }

Pilih bahasa kamu di sidebar untuk detail lengkap.