Passer au contenu principal
api.ApplicationRealtime(appID) ouvre un flux Server-Sent Events et renvoie un *rest.RealtimeStream. Itérez-le avec stream.Next() jusqu’à io.EOF.
client := rest.NewClient(os.Getenv("SQUARECLOUD_API_KEY"))
defer client.Close()

api := rest.New(client)

Consommer le flux

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

for {
	event, err := stream.Next()
	if err == io.EOF {
		break // flux terminé (ex. TTL de 10 minutes atteint)
	}
	if err != nil {
		panic(err)
	}

	fmt.Println(event.Name, string(event.Data))
}
Faites toujours defer stream.Close() — un flux non fermé garde occupé l’un des créneaux de connexion de votre compte.

Forme des événements

Le flux émet deux types de trames :
  • Événements système — messages de cycle de vie de la connexion : REALTIME_CONNECTING, REALTIME_TIMEOUT, REALTIME_DISCONNECTED, REALTIME_RECONNECT et REALTIME_ERROR.
  • Événements message — la charge utile de l’application. Data est opaque pour le SDK, généralement du JSON — désérialisez-le vous-même :
if event.Name == "message" {
	var payload map[string]any
	if err := json.Unmarshal(event.Data, &payload); err == nil {
		fmt.Println(payload)
	}
}

Limites de connexion

Un même compte peut garder au plus 5 connexions simultanées ouvertes, et chaque connexion dure jusqu’à 10 minutes (son TTL). Lorsque le TTL est atteint, le flux se termine par io.EOF — reconnectez-vous en boucle pour rester abonné.
for {
	stream, err := api.ApplicationRealtime("abc123def456abc123def456")
	if err != nil {
		panic(err)
	}

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

	stream.Close()
}

Annulation

Attachez un context.Context avec rest.WithContext pour arrêter le flux de l’extérieur :
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() depuis une autre goroutine termine le flux