mirror of https://github.com/jetkvm/kvm.git
re-add old signaling for when upgrading
This commit is contained in:
parent
652e845d83
commit
84b35d5deb
48
web.go
48
web.go
|
@ -99,6 +99,23 @@ func setupRouter() *gin.Engine {
|
|||
protected := r.Group("/")
|
||||
protected.Use(protectedMiddleware())
|
||||
{
|
||||
|
||||
/*
|
||||
* Legacy WebRTC session endpoint
|
||||
*
|
||||
* This endpoint is maintained for backward compatibility when users upgrade from a version
|
||||
* using the legacy HTTP-based signaling method to the new WebSocket-based signaling method.
|
||||
*
|
||||
* During the upgrade process, when the "Rebooting device after update..." message appears,
|
||||
* the browser still runs the previous JavaScript code which polls this endpoint to establish
|
||||
* a new WebRTC session. Once the session is established, the page will automatically reload
|
||||
* with the updated code.
|
||||
*
|
||||
* Without this endpoint, the stale JavaScript would fail to establish a connection,
|
||||
* causing users to see the "Rebooting device after update..." message indefinitely
|
||||
* until they manually refresh the page, leading to a confusing user experience.
|
||||
*/
|
||||
protected.POST("/webrtc/session", handleWebRTCSession)
|
||||
protected.GET("/webrtc/signaling/client", handleLocalWebRTCSignal)
|
||||
protected.POST("/cloud/register", handleCloudRegister)
|
||||
protected.GET("/cloud/state", handleCloudState)
|
||||
|
@ -126,6 +143,37 @@ func setupRouter() *gin.Engine {
|
|||
// TODO: support multiple sessions?
|
||||
var currentSession *Session
|
||||
|
||||
func handleWebRTCSession(c *gin.Context) {
|
||||
var req WebRTCSessionRequest
|
||||
|
||||
if err := c.ShouldBindJSON(&req); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
||||
return
|
||||
}
|
||||
|
||||
session, err := newSession(SessionConfig{})
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err})
|
||||
return
|
||||
}
|
||||
|
||||
sd, err := session.ExchangeOffer(req.Sd)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusInternalServerError, gin.H{"error": err})
|
||||
return
|
||||
}
|
||||
if currentSession != nil {
|
||||
writeJSONRPCEvent("otherSessionConnected", nil, currentSession)
|
||||
peerConn := currentSession.peerConnection
|
||||
go func() {
|
||||
time.Sleep(1 * time.Second)
|
||||
_ = peerConn.Close()
|
||||
}()
|
||||
}
|
||||
currentSession = session
|
||||
c.JSON(http.StatusOK, gin.H{"sd": sd})
|
||||
}
|
||||
|
||||
func handleLocalWebRTCSignal(c *gin.Context) {
|
||||
cloudLogger.Infof("new websocket connection established")
|
||||
// Create WebSocket options with InsecureSkipVerify to bypass origin check
|
||||
|
|
Loading…
Reference in New Issue