Skip to content

Instantly share code, notes, and snippets.

@netroy
Last active January 11, 2019 21:57
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save netroy/6fd098aa56635e8f1adf to your computer and use it in GitHub Desktop.
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 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