go get github.com/asyncbase-dev/asyncbase-go
Minimal example
package main
import (
"context"
"log"
"os"
"time"
"github.com/asyncbase-dev/asyncbase-go/asyncbase"
)
func main() {
c := asyncbase.New(os.Getenv("ASYNCBASE_KEY"))
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
r, err := c.Send(ctx, "emails", map[string]any{
"to": "a@b.com", "subject": "hi",
}, &asyncbase.SendOptions{Delay: "30s"})
if err != nil { log.Fatal(err) }
log.Println("sent", r.ID)
}
Consumer — goroutine + context
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/asyncbase-dev/asyncbase-go/asyncbase"
)
func main() {
c := asyncbase.New(os.Getenv("ASYNCBASE_KEY"))
ctx, cancel := signal.NotifyContext(context.Background(),
syscall.SIGINT, syscall.SIGTERM)
defer cancel()
msgs, errs := c.Consume(ctx, "emails", asyncbase.PullOptions{
Group: "go-workers", VisibilitySeconds: 60,
}, time.Second)
for {
select {
case <-ctx.Done():
return
case m, ok := <-msgs:
if !ok { return }
if err := handle(m.Payload); err != nil {
m.Nack(ctx, nil)
} else {
m.Ack(ctx)
}
case err := <-errs:
log.Printf("error: %v", err); return
}
}
}
func handle(_ map[string]any) error { return nil }
Options
c := asyncbase.New(
os.Getenv("ASYNCBASE_KEY"),
asyncbase.WithBaseURL("https://api.asyncbase.dev"),
asyncbase.WithHTTPClient(&http.Client{Timeout: 10 * time.Second}),
)
Error handling
_, err := c.Send(ctx, "emails", payload, nil)
switch {
case asyncbase.IsCode(err, "RATE_LIMITED"):
time.Sleep(time.Second)
case asyncbase.IsCode(err, "PAYLOAD_TOO_LARGE"):
// don't retry — payload will never fit
default:
if err != nil { return err }
}
*asyncbase.Error exposes .Code, .Message, .Docs, .Status,
.RequestID.