1package main
2
3import (
4	"context"
5	"encoding/json"
6	"fmt"
7	"log"
8	"net/http"
9	"os"
10	"os/signal"
11	"syscall"
12
13	"github.com/centrifugal/centrifuge"
14)
15
16type event struct {
17	Name    string          `json:"name"`
18	Payload json.RawMessage `json:"payload"`
19}
20
21func handleLog(e centrifuge.LogEntry) {
22	log.Printf("[centrifuge %s] %s: %v", centrifuge.LogLevelToString(e.Level), e.Message, e.Fields)
23}
24
25func authMiddleware(h http.Handler) http.Handler {
26	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
27		ctx := r.Context()
28		ctx = centrifuge.SetCredentials(ctx, &centrifuge.Credentials{
29			UserID: "",
30		})
31		r = r.WithContext(ctx)
32		h.ServeHTTP(w, r)
33	})
34}
35
36func waitExitSignal(n *centrifuge.Node) {
37	sigCh := make(chan os.Signal, 1)
38	done := make(chan bool, 1)
39	signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
40	go func() {
41		<-sigCh
42		_ = n.Shutdown(context.Background())
43		done <- true
44	}()
45	<-done
46}
47
48func main() {
49	cfg := centrifuge.DefaultConfig
50	cfg.LogLevel = centrifuge.LogLevelDebug
51	cfg.LogHandler = handleLog
52
53	node, _ := centrifuge.New(cfg)
54
55	node.OnConnecting(func(ctx context.Context, e centrifuge.ConnectEvent) (centrifuge.ConnectReply, error) {
56		return centrifuge.ConnectReply{
57			Credentials: &centrifuge.Credentials{
58				UserID: "",
59			},
60		}, nil
61	})
62
63	node.OnConnect(func(client *centrifuge.Client) {
64		log.Printf("worm connected via %s", client.Transport().Name())
65
66		client.OnMessage(func(e centrifuge.MessageEvent) {
67			var ev event
68			_ = json.Unmarshal(e.Data, &ev)
69			_, _ = node.Publish("moving", ev.Payload)
70		})
71
72		client.OnSubscribe(func(e centrifuge.SubscribeEvent, cb centrifuge.SubscribeCallback) {
73			log.Printf("worm subscribed on %s", e.Channel)
74			cb(centrifuge.SubscribeReply{}, nil)
75		})
76
77		client.OnUnsubscribe(func(e centrifuge.UnsubscribeEvent) {
78			log.Printf("worm unsubscribed from %s", e.Channel)
79		})
80
81		client.OnDisconnect(func(e centrifuge.DisconnectEvent) {
82			log.Printf("worm disconnected, disconnect: %s", e.Disconnect)
83		})
84	})
85
86	if err := node.Run(); err != nil {
87		panic(err)
88	}
89
90	http.Handle("/connection/websocket", authMiddleware(centrifuge.NewWebsocketHandler(node, centrifuge.WebsocketConfig{})))
91	http.Handle("/", http.FileServer(http.Dir("./")))
92
93	go func() {
94		if err := http.ListenAndServe(":8000", nil); err != nil {
95			panic(err)
96		}
97	}()
98
99	waitExitSignal(node)
100	fmt.Println("exiting")
101}
102