Files
message-pusher/client/main.go
T

93 lines
1.8 KiB
Go
Raw Normal View History

2021-06-13 17:52:41 +08:00
package main
import (
"flag"
"github.com/gorilla/websocket"
"log"
"net/url"
2022-07-28 23:08:15 +08:00
"os"
2022-07-29 23:53:06 +08:00
"time"
2021-06-13 17:52:41 +08:00
)
var (
2022-07-28 23:08:15 +08:00
conn = flag.String("url", "", "connection url")
token = flag.String("token", "", "the access token")
2021-06-13 17:52:41 +08:00
)
type Verification struct {
Prefix string `json:"prefix"`
Token string `json:"token"`
}
2022-07-29 23:53:06 +08:00
type Ping struct {
}
2021-06-13 17:52:41 +08:00
func main() {
flag.Parse()
2022-07-28 23:08:15 +08:00
connString := *conn
if connString == "" {
connString = os.Getenv("MESSAGE_PUSHER_URL")
}
if *token == "" {
*token = os.Getenv("MESSAGE_PUSHER_TOKEN")
}
connUrl, err := url.Parse(connString)
2021-06-13 17:52:41 +08:00
if err != nil {
2022-07-28 23:08:15 +08:00
log.Fatal("Failed to parse connection url", err)
2021-06-13 17:52:41 +08:00
return
}
2022-07-28 23:08:15 +08:00
scheme := "ws"
if connUrl.Scheme == "https" {
scheme = "wss"
2021-06-13 17:52:41 +08:00
}
2022-07-28 23:08:15 +08:00
u := url.URL{Scheme: scheme, Host: connUrl.Host, Path: "/"}
2022-07-29 23:53:06 +08:00
verification := &Verification{
Prefix: connUrl.Path[1:],
Token: *token,
}
ping := &Ping{}
ticker := time.NewTicker(60 * time.Second)
2021-06-13 17:52:41 +08:00
for {
2022-07-28 23:08:15 +08:00
log.Printf("Connecting to %s...\n", u.String())
c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
2021-06-13 17:52:41 +08:00
if err != nil {
2022-07-28 23:08:15 +08:00
log.Fatal("Failed to connect to server:", err)
return
}
log.Printf("Server connected.\n")
2022-07-29 23:53:06 +08:00
2022-07-28 23:08:15 +08:00
err = c.WriteJSON(verification)
if err != nil {
log.Fatal(err.Error())
}
2022-07-29 23:53:06 +08:00
go func() {
for {
select {
case <-ticker.C:
if err := c.WriteJSON(ping); err != nil {
log.Println("Error occurred when send ping message:", err)
log.Println("Connection lost, retrying...")
_ = c.Close()
break
} else {
log.Println("Ping message sent.")
}
}
}
}()
2022-07-28 23:08:15 +08:00
for {
var message = new(Message)
err = c.ReadJSON(message)
if err != nil {
log.Println("Error occurred when read message:", err)
log.Println("Connection lost, retrying...")
2022-07-29 23:53:06 +08:00
_ = c.Close()
2022-07-28 23:08:15 +08:00
break
} else {
log.Println("New message arrived.")
Notify(message)
}
2021-06-13 17:52:41 +08:00
}
}
}