Saltar al contenido principal
api.ApplicationRealtime(appID) abre un stream de Server-Sent Events y devuelve un *rest.RealtimeStream. Itéralo con stream.Next() hasta io.EOF.
client := rest.NewClient(os.Getenv("SQUARECLOUD_API_KEY"))
defer client.Close()

api := rest.New(client)

Consumo del stream

stream, err := api.ApplicationRealtime("abc123def456abc123def456")
if err != nil {
	panic(err)
}
defer stream.Close()

for {
	event, err := stream.Next()
	if err == io.EOF {
		break // el stream terminó (e.g. se alcanzó el TTL de 10 minutos)
	}
	if err != nil {
		panic(err)
	}

	fmt.Println(event.Name, string(event.Data))
}
Usa siempre defer stream.Close() — un stream sin cerrar mantiene ocupado uno de los slots de conexión de tu cuenta.

Forma de los eventos

El stream emite dos tipos de frames:
  • Eventos de sistema — mensajes del ciclo de vida de la conexión: REALTIME_CONNECTING, REALTIME_TIMEOUT, REALTIME_DISCONNECTED, REALTIME_RECONNECT y REALTIME_ERROR.
  • Eventos message — el payload de la aplicación. Data es opaco para el SDK, normalmente JSON — deserialízalo tú mismo:
if event.Name == "message" {
	var payload map[string]any
	if err := json.Unmarshal(event.Data, &payload); err == nil {
		fmt.Println(payload)
	}
}

Límites de conexión

Una sola cuenta puede mantener como máximo 5 conexiones simultáneas abiertas, y cada conexión dura hasta 10 minutos (su TTL). Cuando se alcanza el TTL, el stream termina con io.EOF — reconecta en un bucle para mantenerte suscrito.
for {
	stream, err := api.ApplicationRealtime("abc123def456abc123def456")
	if err != nil {
		panic(err)
	}

	for {
		event, err := stream.Next()
		if err != nil {
			break // io.EOF al alcanzar el TTL — reconectar
		}
		fmt.Println(event.Name, string(event.Data))
	}

	stream.Close()
}

Cancelación

Adjunta un context.Context con rest.WithContext para detener el stream desde fuera:
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

stream, err := api.ApplicationRealtime("abc123def456abc123def456", rest.WithContext(ctx))
if err != nil {
	panic(err)
}
defer stream.Close()

// cancel() desde otra goroutine termina el stream