Files
2025-04-01 11:00:41 +11:00

94 lines
2.0 KiB
Go

package utils
import (
"encoding/json"
"fmt"
"io"
"net/http"
. "github.com/mickael-kerjean/filestash/server/common"
. "github.com/mickael-kerjean/filestash/server/plugin/plg_handler_mcp/types"
)
func SendMessage(w io.Writer, requestID uint64, response any) {
b, err := json.Marshal(JSONRPCResponse{
JSONRPC: "2.0",
ID: requestID,
Result: &response,
})
if err != nil {
SendError(w, requestID, JSONRPCError{
Code: http.StatusInternalServerError,
Message: err.Error(),
})
}
fmt.Fprintf(w, "event: message\ndata: %s\n\n", string(b))
w.(http.Flusher).Flush()
}
func SendPing(w io.Writer, requestID uint64) {
b, err := json.Marshal(JSONRPCRequest{
JSONRPC: "2.0",
ID: requestID,
Method: "ping",
})
if err != nil {
SendError(w, requestID, JSONRPCError{
Code: http.StatusInternalServerError,
Message: err.Error(),
})
}
fmt.Fprintf(w, "event: message\ndata: %s\n\n", string(b))
w.(http.Flusher).Flush()
}
func SendMethod(w io.Writer, requestID uint64, method string, args ...map[string]any) {
var params map[string]any
if len(args) == 1 {
params = args[0]
}
b, err := json.Marshal(JSONRPCMethod{
JSONRPC: "2.0",
Method: method,
Params: params,
})
if err != nil {
SendError(w, requestID, JSONRPCError{
Code: http.StatusInternalServerError,
Message: err.Error(),
})
}
fmt.Fprintf(w, "event: message\ndata: %s\n\n", string(b))
w.(http.Flusher).Flush()
}
func SendError(w io.Writer, requestID uint64, d error) {
var rpcErr JSONRPCError
switch v := d.(type) {
case JSONRPCError:
rpcErr = v
case AppError:
rpcErr = JSONRPCError{
Code: v.Status(),
Message: v.Error(),
}
default:
rpcErr = JSONRPCError{
Code: http.StatusInternalServerError,
Message: d.Error(),
}
}
b, err := json.Marshal(JSONRPCResponse{
JSONRPC: "2.0",
ID: requestID,
Error: &rpcErr,
})
if err != nil {
fmt.Fprintf(w, "event: message\ndata: %s\n\n", string(`nil`))
} else {
fmt.Fprintf(w, "event: message\ndata: %s\n\n", string(b))
}
w.(http.Flusher).Flush()
}