summaryrefslogtreecommitdiff
path: root/src/helsinki.at/rhrdtime
diff options
context:
space:
mode:
Diffstat (limited to 'src/helsinki.at/rhrdtime')
-rw-r--r--src/helsinki.at/rhrdtime/rhrdtime.go57
1 files changed, 55 insertions, 2 deletions
diff --git a/src/helsinki.at/rhrdtime/rhrdtime.go b/src/helsinki.at/rhrdtime/rhrdtime.go
index 21f0efc..9ad4048 100644
--- a/src/helsinki.at/rhrdtime/rhrdtime.go
+++ b/src/helsinki.at/rhrdtime/rhrdtime.go
@@ -24,8 +24,61 @@
package main
-import "fmt"
+import (
+ "fmt"
+ "net/http"
+ "time"
+
+ "github.com/codegangsta/martini"
+ "github.com/gorilla/websocket"
+ "github.com/tuxychandru/pubsub"
+)
+
+func goTalkWithClient(w http.ResponseWriter, r *http.Request, ps *pubsub.PubSub) {
+ ws, err := websocket.Upgrade(w, r, nil, 1024, 1024)
+ if _, ok := err.(websocket.HandshakeError); ok {
+ http.Error(w, "Not a websocket handshake", 400)
+ return
+ } else if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println("Client connected", ws.RemoteAddr())
+
+ publish_to_all_chan := ps.Sub("timeupdate")
+
+ for jsonupdate := range publish_to_all_chan {
+ if err := ws.WriteMessage(websocket.TextMessage, jsonupdate.([]byte)); err != nil {
+ ps.Unsub(publish_to_all_chan, "timeupdate")
+ return
+ }
+ }
+}
+
+func RunMartini(ps *pubsub.PubSub) {
+ m := martini.Classic()
+ m.Get("/time", func(w http.ResponseWriter, r *http.Request) {
+ goTalkWithClient(w, r, ps)
+ })
+
+ m.Run()
+}
func main() {
- fmt.Println("Hello world!")
+ ps := pubsub.New(1)
+
+ ticker := time.NewTicker(time.Second * 1)
+ go func() {
+ for t := range ticker.C {
+ tj, err := t.MarshalJSON()
+ if err != nil {
+ fmt.Println(err)
+ return
+ }
+ fmt.Println("Tick at: ", t)
+ ps.Pub(tj, "timeupdate");
+ }
+ }()
+
+ RunMartini(ps)
}