refactor(openflare): unify protocol API responses to Wavelet format

Migrate Agent/Relay/Tunnel handlers from compat {success,message,data}
to response.OK and response.Abort* with real HTTP status codes. Remove
the compat package and update openflare-agent, openflare-relay, and
openflared clients to parse {error_msg,data}.
This commit is contained in:
ryan
2026-06-19 11:23:12 +08:00
parent 42ca0ec642
commit 33b4123444
18 changed files with 230 additions and 358 deletions
@@ -8,7 +8,7 @@ import (
"errors"
"strings"
"github.com/Rain-kl/Wavelet/internal/apps/openflare/compat"
"github.com/Rain-kl/Wavelet/internal/common/response"
"github.com/Rain-kl/Wavelet/internal/model"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
@@ -22,13 +22,11 @@ func TunnelAuth() gin.HandlerFunc {
token := strings.TrimSpace(c.GetHeader("X-Tunnel-Token"))
node, err := authenticateAccessToken(c.Request.Context(), token)
if err != nil {
compat.Unauthorized(c, errTunnelTokenInvalid)
c.Abort()
response.AbortUnauthorized(c, errTunnelTokenInvalid)
return
}
if node.NodeType != "tunnel_client" {
compat.Forbidden(c, errTunnelNodeTypeMismatch)
c.Abort()
response.AbortForbidden(c, errTunnelNodeTypeMismatch)
return
}
c.Set(ctxFlaredNodeKey, node)
@@ -48,4 +46,4 @@ func authenticateAccessToken(ctx context.Context, token string) (*model.OpenFlar
return nil, err
}
return node, nil
}
}
@@ -4,56 +4,56 @@
package flared
import (
"github.com/Rain-kl/Wavelet/internal/apps/openflare/compat"
"net/http"
"github.com/Rain-kl/Wavelet/internal/apps/openflare/apiutil"
ofws "github.com/Rain-kl/Wavelet/internal/apps/openflare/websocket"
"github.com/Rain-kl/Wavelet/internal/common/response"
"github.com/Rain-kl/Wavelet/internal/model"
"github.com/gin-gonic/gin"
)
// PostHeartbeat handles POST /flared/heartbeat.
// PostHeartbeat handles POST /tunnel/heartbeat.
func PostHeartbeat(c *gin.Context) {
var payload HeartbeatPayload
if !compat.BindJSON(c, &payload) {
if !apiutil.BindJSON(c, &payload) {
return
}
authNode, ok := c.Get(ctxFlaredNodeKey)
if !ok {
compat.Unauthorized(c, errTunnelTokenInvalid)
response.AbortUnauthorized(c, errTunnelTokenInvalid)
return
}
node := authNode.(*model.OpenFlareNode)
result, err := Heartbeat(c.Request.Context(), node, payload)
if err != nil {
compat.Fail(c, err.Error())
if apiutil.AbortBadRequestOnError(c, err) {
return
}
compat.OK(c, result)
c.JSON(http.StatusOK, response.OK(result))
}
// GetActiveConfig handles GET /flared/config/active.
// GetActiveConfig handles GET /tunnel/config/active.
func GetActiveConfig(c *gin.Context) {
authNode, ok := c.Get(ctxFlaredNodeKey)
if !ok {
compat.Unauthorized(c, errTunnelTokenInvalid)
response.AbortUnauthorized(c, errTunnelTokenInvalid)
return
}
node := authNode.(*model.OpenFlareNode)
config, err := GetTunnelConfig(c.Request.Context(), node)
if err != nil {
compat.Fail(c, "无法生成隧道配置: "+err.Error())
if apiutil.AbortBadRequestOnError(c, err) {
return
}
compat.OK(c, config)
c.JSON(http.StatusOK, response.OK(config))
}
// PostApplyLog handles POST /flared/apply-log.
// PostApplyLog handles POST /tunnel/apply-log.
func PostApplyLog(c *gin.Context) {
var payload ApplyLogPayload
if !compat.BindJSON(c, &payload) {
if !apiutil.BindJSON(c, &payload) {
return
}
if authNode, ok := c.Get(ctxFlaredNodeKey); ok {
@@ -61,20 +61,19 @@ func PostApplyLog(c *gin.Context) {
}
log, err := ReportApplyLog(c.Request.Context(), payload)
if err != nil {
compat.Fail(c, err.Error())
if apiutil.AbortBadRequestOnError(c, err) {
return
}
compat.OK(c, log)
c.JSON(http.StatusOK, response.OK(log))
}
// GetWebSocket handles GET /flared/ws.
// GetWebSocket handles GET /tunnel/ws.
func GetWebSocket(c *gin.Context) {
authNode, ok := c.Get(ctxFlaredNodeKey)
if !ok {
compat.Unauthorized(c, errTunnelTokenInvalid)
response.AbortUnauthorized(c, errTunnelTokenInvalid)
return
}
node := authNode.(*model.OpenFlareNode)
ofws.ServeFlared(c, node.NodeID)
}
}