Skip to content

Go SDK

Install

Terminal window
go get github.com/RenzyArmstrong/calvery-sdks/go

Requires Go 1.21+.

Quick start

package main
import (
"context"
"log"
"os"
calvery "github.com/RenzyArmstrong/calvery-sdks/go"
)
func main() {
c, err := calvery.New(os.Getenv("CVSM_TOKEN"), "acme-corp")
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
dbURL, err := c.Get(ctx, "DATABASE_URL")
if err != nil {
log.Fatal(err)
}
log.Println(dbURL)
}

Constructor

func New(token, team string, opts ...Option) (*Client, error)

Options

OptionDefault
WithBaseURL(url string)https://api.calvery.xyz
WithEnvironment(env string)"production"
WithCacheTTL(d time.Duration)30 * time.Second
WithMaxRetries(n int)3
WithHTTPClient(h *http.Client)http.Client{Timeout: 10s}

Example with options

c, _ := calvery.New(
os.Getenv("CVSM_TOKEN"),
"acme-corp",
calvery.WithEnvironment("staging"),
calvery.WithCacheTTL(time.Minute),
calvery.WithMaxRetries(5),
)

Methods

Get(ctx, name, opts ...GetOption) (string, error)

val, err := c.Get(ctx, "STRIPE_KEY")
staging, err := c.Get(ctx, "STRIPE_KEY", calvery.WithEnv("staging"))

GetAll(ctx, opts ...GetOption) (map[string]string, error)

secrets, err := c.GetAll(ctx)
for k, v := range secrets {
fmt.Println(k, "=", v)
}

Inject(ctx, overwrite bool, opts ...GetOption) ([]string, error)

injected, err := c.Inject(ctx, false) // skip existing
log.Printf("Loaded %d secrets", len(injected))

ClearCache()

Error handling

Idiomatic Go: pakai helper Is* untuk cek kind:

val, err := c.Get(ctx, "STRIPE_KEY")
if calvery.IsAuthError(err) {
// 401/403 — token invalid
}
if calvery.IsNotFound(err) {
// Secret belum dibuat
}

Atau pattern errors.As:

var cErr *calvery.Error
if errors.As(err, &cErr) {
switch cErr.Kind {
case "auth":
// handle
case "not_found":
// handle
case "network", "server":
// retry / log
}
}

Patterns

Main bootstrap

func main() {
ctx := context.Background()
c, err := calvery.New(os.Getenv("CVSM_TOKEN"), "acme")
if err != nil {
log.Fatal(err)
}
if _, err := c.Inject(ctx, false); err != nil {
log.Fatal(err)
}
// os.Getenv("DATABASE_URL") sekarang tersedia
runServer()
}

Global client untuk Lambda / serverless

Cold start pertama fetch, subsequent invocations pakai cache:

var cvsm *calvery.Client
func init() {
c, err := calvery.New(os.Getenv("CVSM_TOKEN"), "acme")
if err != nil {
log.Fatal(err)
}
cvsm = c
}
func handler(ctx context.Context, event Event) error {
apiKey, err := cvsm.Get(ctx, "STRIPE_KEY")
// ...
}

Custom HTTP client (proxy, custom transport)

httpClient := &http.Client{
Timeout: 30 * time.Second,
Transport: &http.Transport{
Proxy: http.ProxyFromEnvironment,
},
}
c, _ := calvery.New(
token, team,
calvery.WithHTTPClient(httpClient),
)

Thread safety

*Client aman dipakai concurrent dari banyak goroutine. Methods Get, GetAll, Inject semua thread-safe (internal mutex untuk cache).

Self-host

c, _ := calvery.New(
os.Getenv("CVSM_TOKEN"),
"internal",
calvery.WithBaseURL("https://vault.mycompany.internal"),
)

Source + versioning

  • Source: github.com/RenzyArmstrong/calvery-sdks
  • Module path: github.com/RenzyArmstrong/calvery-sdks/go
  • Latest tag: go/v0.1.0
  • Versioning: semantic, tag format go/vX.Y.Z (subdirectory module)