From c6da55ad65b5eb5ab59bfbf82858d51d0dd78ae3 Mon Sep 17 00:00:00 2001 From: Alexey Date: Sun, 10 Aug 2025 16:26:41 +0300 Subject: [PATCH] some changes with data field, and fix smth --- hooks/initial.go | 1 + internal/core/corestate/corestate.go | 2 + internal/server/gateway/route.go | 28 +++---------- internal/server/rpc/definition.go | 19 +++++---- internal/server/rpc/responsers.go | 63 ++++++++++++++++++---------- internal/server/rpc/writers.go | 39 +++-------------- internal/server/sv1/lua_handler.go | 5 +-- internal/server/sv1/lua_types.go | 2 +- 8 files changed, 69 insertions(+), 90 deletions(-) diff --git a/hooks/initial.go b/hooks/initial.go index 9a100d8..65b4314 100644 --- a/hooks/initial.go +++ b/hooks/initial.go @@ -80,6 +80,7 @@ func InitUUUDHook(_ context.Context, cs *corestate.CoreState, x *app.AppX) { x.Log.Fatalf("uuid load error: %s", err) } cs.UUID32 = uuid32 + corestate.NODE_UUID = uuid32 } func InitRuntimeHook(_ context.Context, cs *corestate.CoreState, x *app.AppX) { diff --git a/internal/core/corestate/corestate.go b/internal/core/corestate/corestate.go index 3b9ae2b..55b7ee8 100644 --- a/internal/core/corestate/corestate.go +++ b/internal/core/corestate/corestate.go @@ -1,5 +1,7 @@ package corestate +var NODE_UUID string + type Stage string const ( diff --git a/internal/server/gateway/route.go b/internal/server/gateway/route.go index b18d5cc..e3c7efb 100644 --- a/internal/server/gateway/route.go +++ b/internal/server/gateway/route.go @@ -20,18 +20,14 @@ func (gs *GatewayServer) Handle(w http.ResponseWriter, r *http.Request) { sessionUUID := r.Header.Get("X-Session-UUID") if sessionUUID == "" { sessionUUID = uuid.New().String() + } gs.x.SLog.Debug("new request", slog.String("session-uuid", sessionUUID), slog.Group("connection", slog.String("ip", r.RemoteAddr))) w.Header().Set("X-Session-UUID", sessionUUID) if !gs.sm.Add(sessionUUID) { gs.x.SLog.Debug("session is busy", slog.String("session-uuid", sessionUUID)) - rpc.WriteError(gs.cs.UUID32, w, &rpc.RPCResponse{ - Error: map[string]any{ - "code": rpc.ErrSessionIsBusy, - "message": rpc.ErrSessionIsBusyS, - }, - }) + rpc.WriteError(w, rpc.NewError(rpc.ErrSessionIsBusy, rpc.ErrSessionIsBusyS, nil, nil)) return } defer gs.sm.Delete(sessionUUID) @@ -40,14 +36,7 @@ func (gs *GatewayServer) Handle(w http.ResponseWriter, r *http.Request) { if err != nil { gs.x.SLog.Debug("failed to read body", slog.String("err", err.Error())) w.WriteHeader(http.StatusBadRequest) - rpc.WriteError(gs.cs.UUID32, w, &rpc.RPCResponse{ - JSONRPC: rpc.JSONRPCVersion, - ID: nil, - Error: map[string]any{ - "code": rpc.ErrInternalError, - "message": rpc.ErrInternalErrorS, - }, - }) + rpc.WriteError(w, rpc.NewError(rpc.ErrInternalError, rpc.ErrInternalErrorS, nil, nil)) gs.x.SLog.Info("invalid request received", slog.String("issue", rpc.ErrInternalErrorS)) return } @@ -60,14 +49,7 @@ func (gs *GatewayServer) Handle(w http.ResponseWriter, r *http.Request) { if err := json.Unmarshal(body, &single); err != nil { gs.x.SLog.Debug("failed to parse json", slog.String("err", err.Error())) w.WriteHeader(http.StatusBadRequest) - rpc.WriteError(gs.cs.UUID32, w, &rpc.RPCResponse{ - JSONRPC: rpc.JSONRPCVersion, - ID: nil, - Error: map[string]any{ - "code": rpc.ErrParseError, - "message": rpc.ErrParseErrorS, - }, - }) + rpc.WriteError(w, rpc.NewError(rpc.ErrParseError, rpc.ErrParseErrorS, nil, nil)) gs.x.SLog.Info("invalid request received", slog.String("issue", rpc.ErrParseErrorS)) return } @@ -76,7 +58,7 @@ func (gs *GatewayServer) Handle(w http.ResponseWriter, r *http.Request) { w.Write([]byte("")) return } - rpc.WriteResponse(gs.cs.UUID32, w, resp) + rpc.WriteResponse(w, resp) return } diff --git a/internal/server/rpc/definition.go b/internal/server/rpc/definition.go index a29b7b7..7cdae6a 100644 --- a/internal/server/rpc/definition.go +++ b/internal/server/rpc/definition.go @@ -11,13 +11,18 @@ type RPCRequest struct { } type RPCResponse struct { - JSONRPC string `json:"jsonrpc"` - ID *json.RawMessage `json:"id"` - Result any `json:"result,omitempty"` - Error any `json:"error,omitempty"` - ResponsibleNode string `json:"responsible-node,omitempty"` - Salt string `json:"salt,omitempty"` - Checksum string `json:"checksum-md5,omitempty"` + JSONRPC string `json:"jsonrpc"` + ID *json.RawMessage `json:"id"` + Result any `json:"result,omitzero"` + Error any `json:"error,omitzero"` + Data *RPCData `json:"data,omitzero"` +} + +type RPCData struct { + ResponsibleNode string `json:"responsible-node,omitempty"` + Salt string `json:"salt,omitempty"` + Checksum string `json:"checksum-md5,omitempty"` + NewSessionUUID string `json:"new-session-uuid,omitempty"` } const ( diff --git a/internal/server/rpc/responsers.go b/internal/server/rpc/responsers.go index 699cefe..a739950 100644 --- a/internal/server/rpc/responsers.go +++ b/internal/server/rpc/responsers.go @@ -1,39 +1,58 @@ package rpc -import "encoding/json" +import ( + "crypto/md5" + "encoding/json" + "fmt" + + "github.com/akyaiy/GoSally-mvp/internal/core/corestate" + "github.com/google/uuid" +) + +func generateChecksum(result any) string { + if result == nil { + return "" + } + data, err := json.Marshal(result) + if err != nil { + return "" + } + return fmt.Sprintf("%x", md5.Sum(data)) +} + +func generateSalt() string { + return uuid.NewString() +} + +func GetData(data any) *RPCData { + return &RPCData{ + Salt: generateSalt(), + ResponsibleNode: corestate.NODE_UUID, + Checksum: generateChecksum(data), + } +} func NewError(code int, message string, data any, id *json.RawMessage) *RPCResponse { - if data != nil { - return &RPCResponse{ - JSONRPC: JSONRPCVersion, - ID: id, - Error: map[string]any{ - "code": code, - "message": message, - "data": data, - }, - } + Error := make(map[string]any) + Error = map[string]any{ + "code": code, + "message": message, + "data": data, } + return &RPCResponse{ JSONRPC: JSONRPCVersion, ID: id, - Error: map[string]any{ - "code": code, - "message": message, - }, + Error: Error, + Data: GetData(Error), } } func NewResponse(result any, id *json.RawMessage) *RPCResponse { - if result == nil { - return &RPCResponse{ - JSONRPC: JSONRPCVersion, - ID: id, - } - } return &RPCResponse{ JSONRPC: JSONRPCVersion, ID: id, - Result: result, + Result: result, + Data: GetData(result), } } diff --git a/internal/server/rpc/writers.go b/internal/server/rpc/writers.go index 277011a..aa1c519 100644 --- a/internal/server/rpc/writers.go +++ b/internal/server/rpc/writers.go @@ -1,40 +1,11 @@ package rpc import ( - "crypto/md5" "encoding/json" - "fmt" "net/http" - - "github.com/google/uuid" ) -func generateChecksum(result any) string { - if result == nil { - return "" - } - data, err := json.Marshal(result) - if err != nil { - return "" - } - return fmt.Sprintf("%x", md5.Sum(data)) -} - -func generateSalt() string { - return uuid.NewString() -} - -func write(nid string, w http.ResponseWriter, msg *RPCResponse) error { - msg.Salt = generateSalt() - if msg.Result != nil { - msg.Checksum = generateChecksum(msg.Result) - } else if msg.Error != nil { - msg.Checksum = generateChecksum(msg.Error) - } - - if nid != "" { - msg.ResponsibleNode = nid - } +func write(w http.ResponseWriter, msg *RPCResponse) error { data, err := json.Marshal(msg) if err != nil { return err @@ -43,10 +14,10 @@ func write(nid string, w http.ResponseWriter, msg *RPCResponse) error { return err } -func WriteError(nid string, w http.ResponseWriter, errm *RPCResponse) error { - return write(nid, w, errm) +func WriteError(w http.ResponseWriter, errm *RPCResponse) error { + return write(w, errm) } -func WriteResponse(nid string, w http.ResponseWriter, response *RPCResponse) error { - return write(nid, w, response) +func WriteResponse(w http.ResponseWriter, response *RPCResponse) error { + return write(w, response) } diff --git a/internal/server/sv1/lua_handler.go b/internal/server/sv1/lua_handler.go index 3a615ba..92fdf7f 100644 --- a/internal/server/sv1/lua_handler.go +++ b/internal/server/sv1/lua_handler.go @@ -200,7 +200,7 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest, } else { L.SetField(scriptDataTable, "result", res) } - + __exit = 0 L.RaiseError("__successfull") return 0 @@ -584,8 +584,7 @@ func (h *HandlerV1) handleLUA(sid string, r *http.Request, req *rpc.RPCRequest, if err != nil && __exit != 0 && __exit != 1 { llog.Error("script error", slog.String("script", path), slog.String("error", err.Error())) return rpc.NewError(rpc.ErrInternalError, rpc.ErrInternalErrorS, nil, req.ID) - } - + } pkg := L.GetGlobal("package") pkgTbl, ok := pkg.(*lua.LTable) diff --git a/internal/server/sv1/lua_types.go b/internal/server/sv1/lua_types.go index 70b5eb3..d86e5a8 100644 --- a/internal/server/sv1/lua_types.go +++ b/internal/server/sv1/lua_types.go @@ -41,7 +41,7 @@ func ConvertLuaTypesToGolang(value lua.LValue) any { } isNumeric = true } - + num, err := strconv.Atoi(numKey.String()) if err != nil { isArray = false