SDK Overview
Calvery menyediakan SDK resmi dengan API surface yang konsisten lintas bahasa:
Node.js / TypeScript npm install @calvery/sdk
Python pip install calvery
Go go get github.com/RenzyArmstrong/calvery-sdks/go
Rust cargo add calvery
PHP composer require calvery/sdk
Ruby gem install calvery
Shell (bash) curl + jq — CI/Docker friendly
API mapping
Semua SDK punya operasi yang sama, cuma syntax beda. Operasi per-bahasa:
Init client
import { Calvery } from '@calvery/sdk'const c = new Calvery({ token: 'cvsm_...', team: 'acme-corp' })from calvery import Calveryc = Calvery('cvsm_...', 'acme-corp')c, _ := calvery.New("cvsm_...", "acme-corp")let c = calvery::Client::new("cvsm_...", "acme-corp")?;$c = new \Calvery\Client('cvsm_...', 'acme-corp');c = Calvery::Client.new('cvsm_...', 'acme-corp')export CVSM_TOKEN=cvsm_... CVSM_TEAM=acme-corpGet single secret
const db = await c.get('DATABASE_URL')db = c.get('DATABASE_URL')db, _ := c.Get(ctx, "DATABASE_URL")let db = c.get("DATABASE_URL").await?;$db = $c->get('DATABASE_URL');db = c.get('DATABASE_URL')calvery get DATABASE_URLInject semua ke env
await c.inject()c.inject()c.Inject(ctx, false) // overwrite=falsec.inject(false).await?;$c->inject(overwrite: false);c.inject!(overwrite: false)calvery inject -- node server.jsOverride environment
c.get('KEY', { environment: 'staging' })c.get('KEY', environment='staging')c.Get(ctx, "KEY", calvery.WithEnv("staging"))c.get_env("KEY", "staging").await?$c->get('KEY', environment: 'staging');c.get('KEY', environment: 'staging')calvery get KEY --env stagingSelf-host base URL
new Calvery({ token, team, baseUrl: 'https://vault.internal' })Calvery(token, team, base_url='https://vault.internal')calvery.New(token, team, calvery.WithBaseURL("https://vault.internal"))Client::builder(token, team).base_url("https://vault.internal").build()?new \Calvery\Client($token, $team, ['base_url' => 'https://vault.internal'])Calvery::Client.new(token, team, base_url: 'https://vault.internal')export CVSM_API_URL=https://vault.internalFitur 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
baseUrlke 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
await new Calvery({ token, team: 'acme' }).inject()// process.env sekarang terisi — langsung pakaiCI/CD (GitHub Actions)
- name: Load secrets dari Calvery run: | CVSM_TOKEN=${{ secrets.CVSM_TOKEN }} \ npx -y @calvery/sdk inject --env production >> $GITHUB_ENVSelf-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:
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.