Skip to content

Instantly share code, notes, and snippets.

@nguyenthenguyen
Forked from netroy/sub.go
Created January 7, 2016 17:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nguyenthenguyen/e8f783c880c968bc1693 to your computer and use it in GitHub Desktop.
Save nguyenthenguyen/e8f783c880c968bc1693 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)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment