|
|
@@ -5,6 +5,7 @@ import (
|
|
|
"goseg/structs"
|
|
|
"log/slog"
|
|
|
"os"
|
|
|
+ "reflect"
|
|
|
"sync"
|
|
|
|
|
|
"github.com/gorilla/websocket"
|
|
|
@@ -17,6 +18,11 @@ var (
|
|
|
mu sync.RWMutex // synchronize access to broadcastState
|
|
|
)
|
|
|
|
|
|
+func init(){
|
|
|
+ // initialize broadcastState global var
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
// adds ws client
|
|
|
func RegisterClient(conn *websocket.Conn) {
|
|
|
clients[conn] = true
|
|
|
@@ -27,18 +33,28 @@ func UnregisterClient(conn *websocket.Conn) {
|
|
|
delete(clients, conn)
|
|
|
}
|
|
|
|
|
|
-// update the state and broadcast it to all clients
|
|
|
-// ex:
|
|
|
-// newState := structs.AuthBroadcast{ /* ... */ }
|
|
|
-// broadcast.UpdateState(newState)
|
|
|
-func UpdateState(newState structs.AuthBroadcast) {
|
|
|
+// update broadcastState with a map of items
|
|
|
+func UpdateStateWithMap(values map[string]interface{}) error {
|
|
|
mu.Lock()
|
|
|
defer mu.Unlock()
|
|
|
- broadcastState = newState
|
|
|
+ v := reflect.ValueOf(&broadcastState).Elem()
|
|
|
+ for key, value := range values {
|
|
|
+ // we are matching the map key with the broadcastState item
|
|
|
+ field := v.FieldByName(key)
|
|
|
+ if !field.IsValid() || !field.CanSet() {
|
|
|
+ return fmt.Errorf("field %s does not exist or is not settable", key)
|
|
|
+ }
|
|
|
+ val := reflect.ValueOf(value)
|
|
|
+ if field.Type() != val.Type() {
|
|
|
+ return fmt.Errorf("type mismatch for field %s: expected %s, got %s", key, field.Type(), val.Type())
|
|
|
+ }
|
|
|
+ field.Set(val)
|
|
|
+ }
|
|
|
broadcastToClients()
|
|
|
+ return nil
|
|
|
}
|
|
|
|
|
|
-// mutex return broadcast state
|
|
|
+// return broadcast state
|
|
|
func GetState() structs.AuthBroadcast {
|
|
|
mu.Lock()
|
|
|
defer mu.Unlock()
|