63 lines
1.4 KiB
Go
63 lines
1.4 KiB
Go
|
|
package email
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
"errors"
|
||
|
|
"fmt"
|
||
|
|
"time"
|
||
|
|
|
||
|
|
"github.com/gorilla/websocket"
|
||
|
|
"github.com/rs/zerolog/log"
|
||
|
|
)
|
||
|
|
|
||
|
|
var FORWARDEMAIL_WS_API = "wss://api.forwardemail.net/v1/ws"
|
||
|
|
|
||
|
|
func StartWebsocket(ctx context.Context, api_token string) {
|
||
|
|
|
||
|
|
var conn *websocket.Conn
|
||
|
|
for {
|
||
|
|
err := ensureConnected(conn, api_token)
|
||
|
|
if err != nil {
|
||
|
|
log.Error().Err(err).Msg("Bailing on email websocket")
|
||
|
|
return
|
||
|
|
}
|
||
|
|
select {
|
||
|
|
case <-ctx.Done():
|
||
|
|
return
|
||
|
|
default:
|
||
|
|
// Read message
|
||
|
|
message_type, message, err := conn.ReadMessage()
|
||
|
|
if err != nil {
|
||
|
|
if !websocket.IsCloseError(err, websocket.CloseNormalClosure) {
|
||
|
|
conn = nil
|
||
|
|
}
|
||
|
|
log.Error().Err(err).Msg("Error reading message")
|
||
|
|
}
|
||
|
|
|
||
|
|
// Process and log the message
|
||
|
|
log.Info().Int("message_type", message_type).Bytes("message", message).Msg("Got email notification")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func ensureConnected(conn *websocket.Conn, api_token string) error {
|
||
|
|
if conn != nil {
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
url := FORWARDEMAIL_WS_API + "?token=" + api_token
|
||
|
|
for {
|
||
|
|
new_conn, _, err := websocket.DefaultDialer.Dial(url, nil)
|
||
|
|
if err == nil {
|
||
|
|
log.Info().Msg("Connected to mail websocket")
|
||
|
|
*conn = *new_conn
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
if errors.Is(err, websocket.ErrBadHandshake) {
|
||
|
|
return fmt.Errorf("Bad handshake connecting to email websocket, bailing.")
|
||
|
|
}
|
||
|
|
log.Error().Err(err).Str("url", url).Msg("Error connecting to WebSocket")
|
||
|
|
time.Sleep(3 * time.Second)
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|