package main import ( "encoding/binary" "encoding/json" "errors" "fmt" "io" "os" "strings" "github.com/pkg/browser" "github.com/shirou/gopsutil/v4/process" ) const identifier = "gopeed" type Message struct { Method string `json:"method"` Params json.RawMessage `json:"params"` } type Response struct { Code int `json:"code"` Data any `json:"data,omitempty"` Message string `json:"message,omitempty"` } var apiMap = map[string]func(params json.RawMessage) (data any, err error){ "ping": func(params json.RawMessage) (data any, err error) { processes, err := process.Processes() if err != nil { return false, err } for _, p := range processes { name, err := p.Name() if err != nil { continue } if strings.Contains(strings.ToLower(name), strings.ToLower(identifier)) { return true, nil } } return false, nil }, "create": func(params json.RawMessage) (data any, err error) { var strParams string if err = json.Unmarshal(params, &strParams); err != nil { return } err = browser.OpenURL(fmt.Sprintf("%s:///create?params=%s", identifier, strParams)) return }, } func main() { for { // Read message length (first 4 bytes) var length uint32 if err := binary.Read(os.Stdin, binary.NativeEndian, &length); err != nil { if err == io.EOF { // Connection closed by Chrome return } sendError("Failed to read message length: " + err.Error()) return } // Read the message input := make([]byte, length) if _, err := io.ReadFull(os.Stdin, input); err != nil { sendError("Failed to read message: " + err.Error()) return } // Parse message var message Message if err := json.Unmarshal(input, &message); err != nil { sendError("Failed to parse message: " + err.Error()) return } // Handle request var data any var err error if handler, ok := apiMap[message.Method]; ok { data, err = handler(message.Params) } else { err = errors.New("Unknown method: " + message.Method) } if err != nil { sendError(err.Error()) continue } sendResponse(0, data, "") } } func sendResponse(code int, data interface{}, message string) { response := Response{ Code: code, Data: data, Message: message, } // Encode response responseBytes, err := json.Marshal(response) if err != nil { sendError("Failed to encode response: " + err.Error()) return } // Write message length binary.Write(os.Stdout, binary.NativeEndian, uint32(len(responseBytes))) // Write message os.Stdout.Write(responseBytes) } func sendError(msg string) { sendResponse(1, nil, msg) }