Go SDK
Install
go get github.com/RenzyArmstrong/calvery-sdks/goRequires 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
| Option | Default |
|---|---|
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 existinglog.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.Errorif 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)