Skip to content

Realtime

Supabase allows the client to subscribe, listen, and broadcast messages to channels, send the user's presence, and listen changes in database. To learn more about it, read Supabase Realtime.

Raiden already provide the realtime endpoints by default. When you run the Raiden server, you can access the /realtime endpoints.

raiden.router: =========== Registered Route ===========
raiden.router:  GET
raiden.router: - /realtime/v1/websocket
raiden.router:  POST
raiden.router: - /realtime/v1/api/broadcast

You can use Supabase Client to interact with realtime endpoints.

WebSocket

The /realtime/v1/websocket endpoint proxies WebSocket connections to the upstream Supabase Realtime server. This enables clients to use Supabase's Phoenix-based realtime protocol (channels, presence, broadcast) through Raiden.

Features:

  • Automatic reconnection (up to 5 attempts)
  • Heartbeat/ping-pong keep-alive (every 30 seconds)
  • Bidirectional message proxying between client and server

Broadcast

The /realtime/v1/api/broadcast endpoint proxies broadcast messages to the Supabase Realtime API. Clients can send broadcast messages via HTTP POST.

Subscribers (PubSub)

Raiden includes a built-in PubSub system for subscribing to external message queues. Subscribers are background workers that consume messages from topics and process them asynchronously.

Currently supported providers:

  • Google Cloud Pub/Sub (PubSubProviderGoogle)

Defining a Subscriber

Create subscriber files in the internal/subscribers/ directory. Each subscriber embeds raiden.SubscriberBase and implements the SubscriberHandler interface.

go
package subscribers

import (
    "encoding/json"
    "fmt"

    "github.com/sev-2/raiden"
)

type OrderCreatedSubscriber struct {
    raiden.SubscriberBase
}

func (s *OrderCreatedSubscriber) Name() string {
    return "order-created"
}

func (s *OrderCreatedSubscriber) Provider() raiden.PubSubProviderType {
    return raiden.PubSubProviderGoogle
}

func (s *OrderCreatedSubscriber) Topic() string {
    return "order-events"
}

func (s *OrderCreatedSubscriber) Subscription() string {
    return "order-created-sub"
}

func (s *OrderCreatedSubscriber) Consume(ctx raiden.SubscriberContext, message any) error {
    fmt.Printf("Received message: %v\n", message)
    // Process the message
    return nil
}

Registering Subscribers

Register subscribers in the internal/bootstrap/subscribers.go file. This file is typically code-generated by raiden-cli:

go
package bootstrap

import (
    "app/internal/subscribers"
    "github.com/sev-2/raiden"
)

func RegisterSubscribers(server *raiden.Server) {
    server.RegisterSubscribers(
        &subscribers.OrderCreatedSubscriber{},
    )
}

SubscriberHandler Interface

MethodDefaultDescription
Name() string"unknown"Unique name for this subscriber.
Provider() PubSubProviderTypePubSubProviderUnknownThe PubSub provider to use.
Topic() string""The topic to subscribe to.
Subscription() string""The subscription ID.
SubscriptionType() SubscriptionTypeSubscriptionTypePullSubscriptionTypePull or SubscriptionTypePush.
PushEndpoint() string""Endpoint path for push subscriptions.
AutoAck() booltrueWhether to automatically acknowledge messages after processing.
Consume(ctx SubscriberContext, message any) errorErrorThe message handler. Must be implemented.

Subscription Types

TypeConstantDescription
PullSubscriptionTypePullRaiden actively pulls messages from the provider (default).
PushSubscriptionTypePushThe provider pushes messages to a Raiden HTTP endpoint.

For push subscriptions, Raiden automatically registers an HTTP endpoint at /pubsub-endpoint/{push-endpoint} and creates the subscription on the provider.

SubscriberContext

The Consume method receives a SubscriberContext with these methods:

MethodDescription
Config() *ConfigAccess the application configuration.
Span() trace.SpanGet the current OpenTelemetry trace span.
SetSpan(span trace.Span)Set a trace span.
HttpRequest(method, url string, body []byte, headers map[string]string, timeout time.Duration, response any) errorMake an HTTP request from within the subscriber. The response parameter must be a pointer.

Publishing Messages

You can publish messages to a topic using the PubSub manager:

go
err := server.PubSub.Publish(ctx, raiden.PubSubProviderGoogle, "topic-name", []byte(`{"key": "value"}`))

Google Cloud Pub/Sub Configuration

To use Google Cloud Pub/Sub, set the following environment variables:

VariableDescription
GOOGLE_PROJECT_IDYour Google Cloud project ID.
GOOGLE_SA_PATHPath to the Google Cloud service account JSON key file.
SERVER_DNS(Required for push subscriptions) The public DNS/URL of your server.

Released under the MIT License.