mirror of
https://github.com/krishpranav/remote-desktop.git
synced 2025-09-26 20:21:10 +08:00
86 lines
1.6 KiB
Go
86 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/krishpranav/remote-desktop/rdisplay"
|
|
"github.com/krishpranav/remote-desktop/rtc"
|
|
)
|
|
|
|
func handleError(w http.ResponseWriter, err error) {
|
|
fmt.Printf("Error: %v", err)
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
}
|
|
|
|
func MakeHandler(webrtc rtc.Service, display rdisplay.Service) http.Handler {
|
|
mux := http.NewServeMux()
|
|
mux.HandleFunc("/session", func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodPost {
|
|
w.WriteHeader(http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
dec := json.NewDecoder(r.Body)
|
|
req := newSessionRequest{}
|
|
|
|
if err := dec.Decode(&req); err != nil {
|
|
handleError(w, err)
|
|
return
|
|
}
|
|
|
|
peer, err := webrtc.CreateRemoteScreenConnection(req.Screen, 20)
|
|
if err != nil {
|
|
handleError(w, err)
|
|
return
|
|
}
|
|
|
|
answer, err := peer.ProcessOffer(req.Offer)
|
|
|
|
if err != nil {
|
|
handleError(w, err)
|
|
return
|
|
}
|
|
|
|
payload, err := json.Marshal(newSessionResponse{
|
|
Answer: answer,
|
|
})
|
|
if err != nil {
|
|
handleError(w, err)
|
|
return
|
|
}
|
|
|
|
w.Write(payload)
|
|
})
|
|
|
|
mux.HandleFunc("/screens", func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
w.WriteHeader(http.StatusMethodNotAllowed)
|
|
return
|
|
}
|
|
|
|
screens, err := display.Screens()
|
|
|
|
if err != nil {
|
|
handleError(w, err)
|
|
return
|
|
}
|
|
|
|
screensPayload := make([]screenPayload, len(screens))
|
|
|
|
for i, s := range screens {
|
|
screensPayload[i].Index = s.Index
|
|
}
|
|
payload, err := json.Marshal(screensResponse{
|
|
Screens: screensPayload,
|
|
})
|
|
if err != nil {
|
|
handleError(w, err)
|
|
return
|
|
}
|
|
|
|
w.Write(payload)
|
|
})
|
|
return mux
|
|
}
|