first commit of files
This commit is contained in:
18
server/allBuses.go
Normal file
18
server/allBuses.go
Normal file
@@ -0,0 +1,18 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func (s *Server) AllBuses(c *gin.Context) {
|
||||
var data any
|
||||
if s.Driver.Bus == nil {
|
||||
data = "no buses avaiable"
|
||||
} else {
|
||||
data = s.Driver.Bus
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"buses": data,
|
||||
})
|
||||
}
|
25
server/jsonRequest.go
Normal file
25
server/jsonRequest.go
Normal file
@@ -0,0 +1,25 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"artNet/models"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func (s *Server) JsonRequest(c *gin.Context) {
|
||||
var payload models.JsonData
|
||||
|
||||
if err := c.BindJSON(&payload); err != nil {
|
||||
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(200, gin.H{
|
||||
"name": payload,
|
||||
})
|
||||
return
|
||||
|
||||
}
|
7
server/models/response.go
Normal file
7
server/models/response.go
Normal file
@@ -0,0 +1,7 @@
|
||||
package models
|
||||
|
||||
type Response struct {
|
||||
StatusCode int `json:"statusCode"`
|
||||
Message string `json:"message,omitempty"`
|
||||
Data string `json:"dat,omitempty"`
|
||||
}
|
26
server/models/subscribers.go
Normal file
26
server/models/subscribers.go
Normal file
@@ -0,0 +1,26 @@
|
||||
package models
|
||||
|
||||
import "github.com/coder/websocket"
|
||||
|
||||
type Subscribers map[*websocket.Conn]*bool
|
||||
|
||||
func InitSubsrcibers() Subscribers {
|
||||
return make(Subscribers)
|
||||
}
|
||||
|
||||
func (s *Subscribers) Connect(conn *websocket.Conn) {
|
||||
b := true
|
||||
(*s)[conn] = &b
|
||||
}
|
||||
|
||||
func (s *Subscribers) DeleteSubsrcibers(conn *websocket.Conn) {
|
||||
delete(*s, conn)
|
||||
}
|
||||
|
||||
func (s *Subscribers) GetPointer(conn *websocket.Conn) *bool {
|
||||
return (*s)[conn]
|
||||
}
|
||||
|
||||
func (s *Subscribers) Disconnect(conn *websocket.Conn) {
|
||||
*(*s)[conn] = false
|
||||
}
|
16
server/routes.go
Normal file
16
server/routes.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
func (s *Server) AddRoutes() {
|
||||
|
||||
s.engine.GET("/ws", s.handleWebSocket)
|
||||
|
||||
s.engine.GET("/allBuses", s.AllBuses)
|
||||
|
||||
s.engine.GET("/", func(c *gin.Context) {
|
||||
c.String(200, "WebSocket Broadcast Server is running!")
|
||||
})
|
||||
}
|
48
server/server.go
Normal file
48
server/server.go
Normal file
@@ -0,0 +1,48 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"artNet/cert"
|
||||
"artNet/driver"
|
||||
serverModels "artNet/server/models"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/tecamino/tecamino-logger/logging"
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
engine *gin.Engine
|
||||
sync.RWMutex
|
||||
Subscribers serverModels.Subscribers
|
||||
Logger *logging.Logger
|
||||
Driver *driver.ArtNetDriver
|
||||
}
|
||||
|
||||
func NewServer() *Server {
|
||||
s := Server{
|
||||
engine: gin.Default(),
|
||||
Subscribers: serverModels.InitSubsrcibers(),
|
||||
}
|
||||
s.AddRoutes()
|
||||
|
||||
s.Driver = driver.NewDriver()
|
||||
|
||||
return &s
|
||||
}
|
||||
|
||||
func (s *Server) ServeHttp(port uint) error {
|
||||
if err := s.engine.Run(fmt.Sprintf(":%d", port)); err != nil {
|
||||
return fmt.Errorf("failed to run http server: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) ServeHttps(port uint, cert cert.Cert) error {
|
||||
cert.GenerateSelfSignedCert()
|
||||
if err := s.engine.RunTLS(fmt.Sprintf(":%d", port), cert.CertFile, cert.KeyFile); err != nil {
|
||||
return fmt.Errorf("failed to run https server: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
13
server/set.go
Normal file
13
server/set.go
Normal file
@@ -0,0 +1,13 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"artNet/models"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
func (s *Server) Set(get models.Get) error {
|
||||
if len(s.Driver.Bus) <= int(get.Bus) {
|
||||
return fmt.Errorf("no bus number '%d' found", get.Bus)
|
||||
}
|
||||
return nil
|
||||
}
|
65
server/webSocket.go
Normal file
65
server/webSocket.go
Normal file
@@ -0,0 +1,65 @@
|
||||
package server
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"artNet/models"
|
||||
|
||||
"github.com/coder/websocket"
|
||||
"github.com/coder/websocket/wsjson"
|
||||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
const (
|
||||
OnCreate = "onCreate"
|
||||
OnChange = "onChange"
|
||||
OnDelete = "onDelete"
|
||||
)
|
||||
|
||||
func (s *Server) handleWebSocket(c *gin.Context) {
|
||||
conn, err := websocket.Accept(c.Writer, c.Request, &websocket.AcceptOptions{
|
||||
OriginPatterns: []string{"*"},
|
||||
})
|
||||
if err != nil {
|
||||
log.Println("Upgrade error:", err)
|
||||
return
|
||||
}
|
||||
|
||||
defer conn.Close(websocket.StatusInternalError, "Internal error")
|
||||
|
||||
ctx, cancel := context.WithTimeout(c.Request.Context(), 10*time.Minute)
|
||||
defer cancel()
|
||||
|
||||
s.Subscribers.Connect(conn)
|
||||
|
||||
//Read loop
|
||||
for {
|
||||
var request models.JsonData
|
||||
err := wsjson.Read(ctx, conn, &request)
|
||||
if err != nil {
|
||||
fmt.Println(s.Subscribers[conn])
|
||||
log.Println("WebSocket read error:", err)
|
||||
s.Subscribers.Disconnect(conn)
|
||||
fmt.Println(s.Subscribers[conn])
|
||||
break
|
||||
}
|
||||
|
||||
// Set
|
||||
// if request.Set != nil {
|
||||
// for _, set := range *request.Set {
|
||||
// err = s.Unsubscribe(unsub, conn)
|
||||
// if err != nil {
|
||||
// fmt.Println(err)
|
||||
// break
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user