mcpField
E
encore-go-pubsub

encore-go-pubsub

github.com/encoredevDevelopment30319 installsUpdated 2d ago
Repository

About encore-go-pubsub

A Pub/Sub skill for Encore Go developers, covering topic and subscription declarations, event publishing, and delivery semantics. It also explains typed topic references for passing publish access into library code.

Key features

  1. 01Declare topics and subscriptions
  2. 02Publish asynchronous events
  3. 03Configure delivery guarantees
  4. 04Use typed topic references

Use cases

  1. 01Send asynchronous events between services
  2. 02Build event subscription handlers
  3. 03Pass scoped publish access to libraries

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/encoredev/skills --skill encore-go-pubsub

After installing, type/encore-go-pubsubin Claude Code to confirm it loaded.

Details

From the project README

Encore Go Pub/Sub

Instructions

Pub/Sub is for asynchronous messaging between services. Producers publish events to a Topic; consumers attach Subscriptions to react. Resources must be declared as package-level variables — never inside functions.

Topics

package events

import "encore.dev/pubsub"

type OrderCreatedEvent struct {
    OrderID string `json:"order_id"`
    UserID  string `json:"user_id"`
    Total   int    `json:"total"`
}

// Package level declaration
var OrderCreated = pubsub.NewTopic[*OrderCreatedEvent]("order-created", pubsub.TopicConfig{
    DeliveryGuarantee: pubsub.AtLeastOnce,
})
Publishing
msgID, err := events.OrderCreated.Publish(ctx, &events.OrderCreatedEvent{
    OrderID: "123",
    UserID:  "user-456",
    Total:   9999,
})
Subscriptions
package notifications

import (
    "context"
    "myapp/events"
    "encore.dev/pubsub"
)

var _ = pubsub.NewSubscription(events.OrderCreated, "send-confirmation-email",
    pubsub.SubscriptionConfig[*events.OrderCreatedEvent]{
        Handler: sendConfirmationEmail,
    },
)

func sendConfirmationEmail(ctx context.Context, event *events.OrderCreatedEvent) error {
    // Send email...
    return nil
}
Topic References

Pass topic access to library code while maintaining static analysis:

// Create a reference with publish permission
ref := pubsub.TopicRef[pubsub.Publisher[*OrderCreatedEvent]](OrderCreated)

// Use the reference in library code
func publishEvent(ref pubsub.Publisher[*OrderCreatedEvent], event *OrderCreatedEvent) error {
    _, err := ref.Publish(ctx, event)
    return err
}

Delivery Guarantees

  • pubsub.AtLeastOnce (default): may deliver duplicates → handlers must be idempotent.
  • pubsub.ExactlyOnce: stricter, capped throughput (AWS 300 msg/s/topic, GCP 3000+ msg/s/region). Does not deduplicate on the publish side.

Guidelines

  • Topics and subscriptions must be declared as package-level variables.
  • Subscription handlers must be idempotent (at-least-once delivery is the default).
  • Subscription handlers receive a context.Context and the event pointer; return an error to retry per the topic's retry policy.
  • Don't do heavy synchronous work in Publish callers — Publish returns once the message is queued.

Comments

Markdown supported