Skip to content

Commit af9d86d

Browse files
authored
refactor: refactored all handlers into a callback map (#144)
* refactor: refactored all handlers into a callback map * fix: simplified code by removing dedicated boot code
1 parent bb55e3f commit af9d86d

File tree

2 files changed

+74
-49
lines changed

2 files changed

+74
-49
lines changed

server/dispatch.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package server
2+
3+
import (
4+
"encoding/json"
5+
"fmt"
6+
)
7+
8+
// HandlerFunc is the signature for non-streaming JSON-RPC method handlers
9+
type HandlerFunc func(params json.RawMessage) (interface{}, error)
10+
11+
// GetMethodRegistry returns a map of method names to handler functions
12+
// This is used by both the HTTP server and embedded clients
13+
func GetMethodRegistry() map[string]HandlerFunc {
14+
return map[string]HandlerFunc{
15+
"devices": handleDevicesList,
16+
"screenshot": handleScreenshot,
17+
"io_tap": handleIoTap,
18+
"io_longpress": handleIoLongPress,
19+
"io_text": handleIoText,
20+
"io_button": handleIoButton,
21+
"io_swipe": handleIoSwipe,
22+
"io_gesture": handleIoGesture,
23+
"url": handleURL,
24+
"device_info": handleDeviceInfo,
25+
"io_orientation_get": handleIoOrientationGet,
26+
"io_orientation_set": handleIoOrientationSet,
27+
"device_boot": handleDeviceBoot,
28+
"device_shutdown": handleDeviceShutdown,
29+
"device_reboot": handleDeviceReboot,
30+
"dump_ui": handleDumpUI,
31+
"apps_launch": handleAppsLaunch,
32+
"apps_terminate": handleAppsTerminate,
33+
"apps_list": handleAppsList,
34+
}
35+
}
36+
37+
// Execute dispatches a method call using the registry
38+
// This is the main entry point for embedded clients
39+
func Execute(method string, params json.RawMessage) (interface{}, error) {
40+
registry := GetMethodRegistry()
41+
42+
handler, exists := registry[method]
43+
if !exists {
44+
return nil, fmt.Errorf("method not found: %s", method)
45+
}
46+
47+
return handler(params)
48+
}

server/server.go

Lines changed: 26 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -151,55 +151,35 @@ func handleJSONRPC(w http.ResponseWriter, r *http.Request) {
151151
var result interface{}
152152
var err error
153153

154-
switch req.Method {
155-
case "devices":
156-
result, err = handleDevicesList(req.Params)
157-
case "screenshot":
158-
result, err = handleScreenshot(req.Params)
159-
case "screencapture":
154+
// Special case: screencapture is streaming and has different signature
155+
if req.Method == "screencapture" {
160156
err = handleScreenCapture(w, req.Params)
161-
case "io_tap":
162-
result, err = handleIoTap(req.Params)
163-
case "io_longpress":
164-
result, err = handleIoLongPress(req.Params)
165-
case "io_text":
166-
result, err = handleIoText(req.Params)
167-
case "io_button":
168-
result, err = handleIoButton(req.Params)
169-
case "io_swipe":
170-
result, err = handleIoSwipe(req.Params)
171-
case "io_gesture":
172-
result, err = handleIoGesture(req.Params)
173-
case "url":
174-
result, err = handleURL(req.Params)
175-
case "device_info":
176-
result, err = handleDeviceInfo(req.Params)
177-
case "io_orientation_get":
178-
result, err = handleIoOrientationGet(req.Params)
179-
case "io_orientation_set":
180-
result, err = handleIoOrientationSet(req.Params)
181-
case "device_boot":
182-
result, err = handleDeviceBoot(w, req.Params)
183-
case "device_shutdown":
184-
result, err = handleDeviceShutdown(req.Params)
185-
case "device_reboot":
186-
result, err = handleDeviceReboot(req.Params)
187-
case "dump_ui":
188-
result, err = handleDumpUI(req.Params)
189-
case "apps_launch":
190-
result, err = handleAppsLaunch(req.Params)
191-
case "apps_terminate":
192-
result, err = handleAppsTerminate(req.Params)
193-
case "apps_list":
194-
result, err = handleAppsList(req.Params)
195-
case "":
196-
err = fmt.Errorf("'method' is required")
197-
198-
default:
199-
sendJSONRPCError(w, req.ID, ErrCodeMethodNotFound, "Method not found", fmt.Sprintf("Method '%s' not found", req.Method))
157+
if err != nil {
158+
log.Printf("Error in screen capture: %v", err)
159+
sendJSONRPCError(w, req.ID, ErrCodeServerError, "Server error", err.Error())
160+
}
200161
return
201162
}
202163

164+
// HTTP-specific: device_boot needs extended timeout (can take up to 2 minutes)
165+
if req.Method == "device_boot" {
166+
_ = http.NewResponseController(w).SetWriteDeadline(time.Now().Add(3 * time.Minute))
167+
}
168+
169+
// Use registry for all methods
170+
if req.Method == "" {
171+
err = fmt.Errorf("'method' is required")
172+
} else {
173+
registry := GetMethodRegistry()
174+
handler, exists := registry[req.Method]
175+
if exists {
176+
result, err = handler(req.Params)
177+
} else {
178+
sendJSONRPCError(w, req.ID, ErrCodeMethodNotFound, "Method not found", fmt.Sprintf("Method '%s' not found", req.Method))
179+
return
180+
}
181+
}
182+
203183
if err != nil {
204184
log.Printf("Error decoding JSON-RPC request: %v", err)
205185
sendJSONRPCError(w, req.ID, ErrCodeServerError, "Server error", err.Error())
@@ -624,10 +604,7 @@ func handleIoOrientationSet(params json.RawMessage) (interface{}, error) {
624604
return okResponse, nil
625605
}
626606

627-
func handleDeviceBoot(w http.ResponseWriter, params json.RawMessage) (interface{}, error) {
628-
// extend write deadline for boot operations (can take up to 2 minutes)
629-
_ = http.NewResponseController(w).SetWriteDeadline(time.Now().Add(3 * time.Minute))
630-
607+
func handleDeviceBoot(params json.RawMessage) (interface{}, error) {
631608
if len(params) == 0 {
632609
return nil, fmt.Errorf("'params' is required with fields: deviceId")
633610
}

0 commit comments

Comments
 (0)