Implementation of Server Sent Events by QUIC. A faster replacement for traditional SSE over HTTP/2.
go get github.com/snapp-incubator/qsse// Server
package main
import "github.com/snapp-incubator/qsse"
var (
people = []Person{...}
accounts = []Account{...}
)
func main() {
topics := []string{"people", "account"}
server, err := qsse.NewServer("localhost:4242", topics, nil)
if err != nil {
panic(err)
}
// publish events
server.Publish("people", people[0])
server.Publish("accounts", accounts[0])
// ...
// some blocking code to keep the server up
}package main
import "github.com/snapp-incubator/qsse"
func main() {
topics := []string{"people", "account"}
client, err := qsse.NewClient("localhost:4242", topics, nil)
if err != nil {
panic(err)
}
client.SetEventHandler("people", func(data []byte) {
// handle data on topic
})
client.SetErrorHandler(func(code int, data map[string]any) {
// handle different error
})
// some blocking code to keep the client up for receiving the events
}By default, all the clients are accepted. Use Authentication to check is new clients are valid and use Authorization to check client access on each topic.
// authentication
// func
server.SetAuthenticatorFunc(func(token string) bool {
})
// interface
server.SetAuthenticator()
// authorization on each topic
// func
server.SetAuthorizerFunc(func(token, topic string) bool {
})
// interface
server.SetAuthorizer()topics can be separated by . logically. also * can be used as wildcard placeholder. for example these are valid topics
rideride.*.startride.passenger.*
Note: Putting * at the end of topic will publish or subscribe to every topic that start with * prefix. For example ride.passenger.* is equivalent of subscribing to ride.passenger.start, ride.passenger.account.name, and so on.
| config | description | default |
|---|---|---|
| Metric.namespace, Metric.subsystem |
namespace and subsystem parameters of the Prometheus metrics | "qsse", "qsse" |
| TLSConfig | TLS config of server | qsse.GetDefaultTLSConfig () |
| Worker.CleaningInterval | interval between cleaning idle clients | 10 sec |
| Worker.ClientAcceptorCount | number of Goroutine accepting new clients | 1 |
| Worker.ClientAcceptorQueueSize | queue size of client acceptors. (this is usually equal to clientAcceptorCount) |
1 |
| Worker.EventDistributorCount | number of concurrent goroutine distributing events to subscribers for each EventSource[topic] | 1 |
| Worker.EventDistributorQueueSize | queue size of event distribution work | 10 |
| config | description | default |
|---|---|---|
| token | token that will be send to server on the initial connection to verify the client. | "" |
| TLSConfig | TLS config of client | qsse.GetSimpleTLS () |
| ReconnectPolicy.Retry | bool that indicate if client should retry connection if couldn't connect to server on the first try. | false |
| ReconnectPolicy.RetryTimes | number of reconnect times to connect. | 5 |
| ReconnectPolicy.RetryInterval | interval between reconnecting to server | 5 sec |