main.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package main
  2. import (
  3. "flag"
  4. "github.com/gorilla/websocket"
  5. "log"
  6. "net/url"
  7. "os"
  8. "time"
  9. )
  10. var (
  11. conn = flag.String("url", "", "connection url")
  12. token = flag.String("token", "", "the access token")
  13. )
  14. type Verification struct {
  15. Prefix string `json:"prefix"`
  16. Token string `json:"token"`
  17. }
  18. type Ping struct {
  19. }
  20. func main() {
  21. flag.Parse()
  22. connString := *conn
  23. if connString == "" {
  24. connString = os.Getenv("MESSAGE_PUSHER_URL")
  25. }
  26. if *token == "" {
  27. *token = os.Getenv("MESSAGE_PUSHER_TOKEN")
  28. }
  29. connUrl, err := url.Parse(connString)
  30. if err != nil {
  31. log.Fatal("Failed to parse connection url", err)
  32. return
  33. }
  34. scheme := "ws"
  35. if connUrl.Scheme == "https" {
  36. scheme = "wss"
  37. }
  38. u := url.URL{Scheme: scheme, Host: connUrl.Host, Path: "/"}
  39. verification := &Verification{
  40. Prefix: connUrl.Path[1:],
  41. Token: *token,
  42. }
  43. ping := &Ping{}
  44. ticker := time.NewTicker(60 * time.Second)
  45. for {
  46. log.Printf("Connecting to %s...\n", u.String())
  47. c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
  48. if err != nil {
  49. log.Fatal("Failed to connect to server:", err)
  50. return
  51. }
  52. log.Printf("Server connected.\n")
  53. err = c.WriteJSON(verification)
  54. if err != nil {
  55. log.Fatal(err.Error())
  56. }
  57. go func() {
  58. for {
  59. select {
  60. case <-ticker.C:
  61. if err := c.WriteJSON(ping); err != nil {
  62. log.Println("Error occurred when send ping message:", err)
  63. log.Println("Connection lost, retrying...")
  64. _ = c.Close()
  65. break
  66. } else {
  67. log.Println("Ping message sent.")
  68. }
  69. }
  70. }
  71. }()
  72. for {
  73. var message = new(Message)
  74. err = c.ReadJSON(message)
  75. if err != nil {
  76. log.Println("Error occurred when read message:", err)
  77. log.Println("Connection lost, retrying...")
  78. _ = c.Close()
  79. break
  80. } else {
  81. log.Println("New message arrived.")
  82. Notify(message)
  83. }
  84. }
  85. }
  86. }