Last active
January 11, 2019 21:57
-
-
Save netroy/6fd098aa56635e8f1adf to your computer and use it in GitHub Desktop.
Redis subscribe over websockets in golang
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
go channels aren't broadcasted .. so only one websocket consumer gets the message :/