Skip to content

Instantly share code, notes, and snippets.

@netroy
Last active January 11, 2019 21:57
  • Star 3 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save netroy/6fd098aa56635e8f1adf to your computer and use it in GitHub Desktop.
Redis subscribe over websockets in golang
package main
import (
"github.com/chuckpreslar/emission"
"github.com/garyburd/redigo/redis"
"github.com/gorilla/websocket"
"log"
"net/http"
)
const CHANNEL_NAME = "i_dont_know"
func subscribe(emitter *emission.Emitter) {
conn, _ := redis.Dial("tcp", ":6379")
channel := redis.PubSubConn{conn}
channel.Subscribe(CHANNEL_NAME)
for {
reply := channel.Receive()
switch parsed := reply.(type) {
case redis.Message:
message := string(parsed.Data)
emitter.Emit("message", message)
}
}
}
var upgrader = &websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool {
return true
},
}
func socketHandler(emitter *emission.Emitter) http.HandlerFunc {
return func(response http.ResponseWriter, request *http.Request) {
socket, err := upgrader.Upgrade(response, request, nil)
if err != nil {
log.Println(err)
return
}
channel := make(chan string)
handler := func(message string) {
channel <- message
}
emitter.AddListener("message", handler)
for message := range channel {
err := socket.WriteMessage(websocket.TextMessage, []byte(message))
if err != nil {
break
}
}
emitter.RemoveListener("message", handler)
socket.Close()
}
}
func main() {
emitter := emission.NewEmitter()
emitter.SetMaxListeners(-1)
go subscribe(emitter)
handler := socketHandler(emitter)
http.Handle("/", handler)
http.ListenAndServe(":4000", nil)
}
@netroy
Copy link
Author

netroy commented May 14, 2014

go channels aren't broadcasted .. so only one websocket consumer gets the message :/

@netroy
Copy link
Author

netroy commented May 14, 2014

go get && go run sub.go

@netroy
Copy link
Author

netroy commented May 19, 2014

broadcast works now.. thanks to emission

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment