From 64f0d5a08872797f9587c48ff35ca9bc3d3d9a2c Mon Sep 17 00:00:00 2001 From: leandrofars Date: Fri, 27 Oct 2023 01:47:53 -0300 Subject: [PATCH] feat(mtp): stomp server --- .../controller/internal/stomp/stomp.go | 65 ++++++++++++++++++ backend/services/stomp/.env | 3 + backend/services/stomp/.gitignore | 1 + backend/services/stomp/cmd/main.go | 66 +++++++++++++++++++ backend/services/stomp/go.mod | 8 +++ backend/services/stomp/go.sum | 4 ++ 6 files changed, 147 insertions(+) create mode 100644 backend/services/controller/internal/stomp/stomp.go create mode 100644 backend/services/stomp/.env create mode 100644 backend/services/stomp/.gitignore create mode 100644 backend/services/stomp/cmd/main.go create mode 100644 backend/services/stomp/go.mod create mode 100644 backend/services/stomp/go.sum diff --git a/backend/services/controller/internal/stomp/stomp.go b/backend/services/controller/internal/stomp/stomp.go new file mode 100644 index 0000000..51fe5d6 --- /dev/null +++ b/backend/services/controller/internal/stomp/stomp.go @@ -0,0 +1,65 @@ +package stomp + +import ( + "log" + "os" + "time" + + "github.com/go-stomp/stomp" +) + +type Stomp struct { + Addr string + Conn *stomp.Conn + StopConn os.Signal + Connected bool + Username string + Password string +} + +func (s *Stomp) Connect() { + + log.Println("STOMP username:", s.Username) + log.Println("STOMP password:", s.Password) + + var options []func(*stomp.Conn) error = []func(*stomp.Conn) error{ + stomp.ConnOpt.Login(s.Username, s.Password), + stomp.ConnOpt.Host("/"), + } + + const MAX_TRIES = 3 + + for i := 0; i < MAX_TRIES; i++ { + log.Println("Starting new STOMP client") + stompConn, err := stomp.Dial("tcp", s.Addr, options...) + if err != nil { + log.Println("Error connecting to STOMP server:", err.Error()) + if i == MAX_TRIES-1 { + log.Printf("Reached max tries count: %d, stop trying to connect", MAX_TRIES) + return + } + time.Sleep(1 * time.Second) + continue + } + s.Conn = stompConn + s.Connected = true + break + } + + log.Println("Connected to STOMP broker-->", s.Addr) +} + +func (s *Stomp) Disconnect() { + if s.Connected { + s.Conn.Disconnect() + } + return +} + +func (s *Stomp) Publish(msg []byte, topic, respTopic string, retain bool) { + //s.Conn.Send() +} + +func (s *Stomp) Subscribe() { + //s.Conn.Subscribe() +} diff --git a/backend/services/stomp/.env b/backend/services/stomp/.env new file mode 100644 index 0000000..7b05929 --- /dev/null +++ b/backend/services/stomp/.env @@ -0,0 +1,3 @@ +STOMP_USERNAME="" +STOMP_PASSWORD="" +# if both variables above are empty, the STOMP server will run without auth \ No newline at end of file diff --git a/backend/services/stomp/.gitignore b/backend/services/stomp/.gitignore new file mode 100644 index 0000000..3a8fe5e --- /dev/null +++ b/backend/services/stomp/.gitignore @@ -0,0 +1 @@ +.env.local \ No newline at end of file diff --git a/backend/services/stomp/cmd/main.go b/backend/services/stomp/cmd/main.go new file mode 100644 index 0000000..f634f86 --- /dev/null +++ b/backend/services/stomp/cmd/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "log" + "net" + "os" + + stomp_server "github.com/go-stomp/stomp/server" + "github.com/joho/godotenv" +) + +type Credentials struct { + Login string + Passwd string +} + +func (c *Credentials) Authenticate(login, passwd string) bool { + + if c.Login == "" && c.Passwd == "" { + log.Println("NEW CLIENT AUTH: Server is running with no auth") + return true + } + + if login != c.Login || passwd != c.Passwd { + log.Println("NEW CLIENT AUTH: Invalid Credentials") + return false + } + log.Println("NEW CLIENT AUTH: OK") + return true +} + +func main() { + + err := godotenv.Load() + localEnv := ".env.local" + if _, err := os.Stat(localEnv); err == nil { + _ = godotenv.Overload(localEnv) + log.Println("Loaded variables from '.env.local'") + } else { + log.Println("Loaded variables from '.env'") + } + + log.SetFlags(log.LstdFlags | log.Lshortfile) + + creds := Credentials{ + Login: os.Getenv("STOMP_USERNAME"), + Passwd: os.Getenv("STOMP_PASSWORD"), + } + + l, err := net.Listen("tcp", stomp_server.DefaultAddr) + if err != nil { + log.Println("Error to open tcp port: ", err) + } + + s := stomp_server.Server{ + Addr: stomp_server.DefaultAddr, + HeartBeat: stomp_server.DefaultHeartBeat, + Authenticator: &creds, + } + + log.Println("Started STOMP server at port", s.Addr) + err = s.Serve(l) + if err != nil { + log.Println("Error to start stomp server: ", err) + } +} diff --git a/backend/services/stomp/go.mod b/backend/services/stomp/go.mod new file mode 100644 index 0000000..6c5dc46 --- /dev/null +++ b/backend/services/stomp/go.mod @@ -0,0 +1,8 @@ +module github.com/leandrofars/stomp + +go 1.21.3 + +require ( + github.com/go-stomp/stomp v2.1.4+incompatible // indirect + github.com/joho/godotenv v1.5.1 // indirect +) diff --git a/backend/services/stomp/go.sum b/backend/services/stomp/go.sum new file mode 100644 index 0000000..0df3975 --- /dev/null +++ b/backend/services/stomp/go.sum @@ -0,0 +1,4 @@ +github.com/go-stomp/stomp v2.1.4+incompatible h1:D3SheUVDOz9RsjVWkoh/1iCOwD0qWjyeTZMUZ0EXg2Y= +github.com/go-stomp/stomp v2.1.4+incompatible/go.mod h1:VqCtqNZv1226A1/79yh+rMiFUcfY3R109np+7ke4n0c= +github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0= +github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=