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, ¢rifuge.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: ¢rifuge.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