Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions invoke.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,9 +48,9 @@ func Invoke(requestJSON string) string {
case LibXrayMethodStopXray:
return encodeInvokeNoDataResponse(xray.StopXray())
case LibXrayMethodXrayVersion:
return encodeInvokeResponse(xray.XrayVersion(), nil)
return encodeInvokeResponse(&XrayVersionResponse{Version: xray.XrayVersion()}, nil)
case LibXrayMethodGetXrayState:
return encodeInvokeResponse(xray.GetXrayState(), nil)
return encodeInvokeResponse(&GetXrayStateResponse{Running: xray.GetXrayState()}, nil)
default:
return encodeInvokeResponse(nil, errors.New("unknown method"))
}
Expand Down Expand Up @@ -129,7 +129,7 @@ func invokeGetFreePorts(payload json.RawMessage) string {
if err != nil {
return encodeInvokeResponse(nil, err)
}
return encodeInvokeResponse(&getFreePortsResponse{Ports: ports}, nil)
return encodeInvokeResponse(&GetFreePortsResponse{Ports: ports}, nil)
}

func invokeConvertShareLinksToXrayJson(payload json.RawMessage) string {
Expand All @@ -144,10 +144,13 @@ func invokeConvertShareLinksToXrayJson(payload json.RawMessage) string {
func invokeConvertXrayJsonToShareLinks(payload json.RawMessage) string {
request, err := decodePayload[ConvertXrayJsonToShareLinksRequest](payload)
if err != nil {
return encodeInvokeResponse("", err)
return encodeInvokeResponse(nil, err)
}
links, err := share.ConvertXrayJsonToShareLinks([]byte(request.XrayJson))
return encodeInvokeResponse(links, err)
if err != nil {
return encodeInvokeResponse(nil, err)
}
return encodeInvokeResponse(&ConvertXrayJsonToShareLinksResponse{Links: links}, nil)
}

func invokeCountGeoData(payload json.RawMessage) string {
Expand All @@ -166,10 +169,13 @@ func invokeCountGeoData(payload json.RawMessage) string {
func invokePing(payload json.RawMessage) string {
request, err := decodePayload[PingRequest](payload)
if err != nil {
return encodeInvokeResponse(nodep.PingDelayError, err)
return encodeInvokeResponse(nil, err)
}
delay, err := xray.Ping(request.ConfigPath, request.Timeout, request.URL, request.Proxy)
return encodeInvokeResponse(delay, err)
if err != nil {
return encodeInvokeResponse(nil, err)
}
return encodeInvokeResponse(&PingResponse{Delay: delay}, nil)
}

func invokeTestXray(payload json.RawMessage) string {
Expand Down
18 changes: 17 additions & 1 deletion invoke_model.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ type GetFreePortsRequest struct {
Count int `json:"count,omitempty"`
}

type getFreePortsResponse struct {
type GetFreePortsResponse struct {
Ports []int `json:"ports,omitempty"`
}

Expand All @@ -59,6 +59,10 @@ type ConvertXrayJsonToShareLinksRequest struct {
XrayJson string `json:"xrayJson,omitempty"`
}

type ConvertXrayJsonToShareLinksResponse struct {
Links string `json:"links,omitempty"`
}

type CountGeoDataRequest struct {
Name string `json:"name,omitempty"`
GeoType string `json:"geoType,omitempty"`
Expand All @@ -71,10 +75,22 @@ type PingRequest struct {
Proxy string `json:"proxy,omitempty"`
}

type PingResponse struct {
Delay int64 `json:"delay,omitempty"`
}

type RunXrayRequest struct {
ConfigPath string `json:"configPath,omitempty"`
}

type RunXrayFromJSONRequest struct {
ConfigJSON string `json:"configJSON,omitempty"`
}

type XrayVersionResponse struct {
Version string `json:"version,omitempty"`
}

type GetXrayStateResponse struct {
Running bool `json:"running"`
}
56 changes: 52 additions & 4 deletions invoke_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,22 @@ func requireNoDataObject(t *testing.T, response testResponse) {
}
}

func decodeDataObject[T any](t *testing.T, response testResponse) T {
t.Helper()
if !json.Valid(response.Data) {
t.Fatalf("data is not valid JSON: %s", response.Data)
}
var object map[string]json.RawMessage
if err := json.Unmarshal(response.Data, &object); err != nil {
t.Fatalf("data is not an object: %s", response.Data)
}
var value T
if err := json.Unmarshal(response.Data, &value); err != nil {
t.Fatal(err)
}
return value
}

func writeConfigToFile(t *testing.T, config any, path string) {
t.Helper()
if err := os.MkdirAll(filepath.Dir(path), os.ModePerm); err != nil {
Expand Down Expand Up @@ -187,12 +203,44 @@ func TestInvokeXrayVersion(t *testing.T) {
if !response.Success {
t.Fatalf("XrayVersion failed: %s", response.Err)
}
var version string
if err := json.Unmarshal(response.Data, &version); err != nil {
version := decodeDataObject[XrayVersionResponse](t, response)
if version.Version == "" {
t.Fatal("Xray version should not be empty")
}
}

func TestInvokeMapResponseShape(t *testing.T) {
response := invokeForTest(t, LibXrayMethodGetFreePorts, nil, GetFreePortsRequest{Count: 1})
if !response.Success {
t.Fatalf("GetFreePorts failed: %s", response.Err)
}
ports := decodeDataObject[GetFreePortsResponse](t, response)
if len(ports.Ports) != 1 {
t.Fatalf("ports = %v", ports.Ports)
}

response = invokeForTest(t, LibXrayMethodGetXrayState, nil, nil)
if !response.Success {
t.Fatalf("GetXrayState failed: %s", response.Err)
}
_ = decodeDataObject[GetXrayStateResponse](t, response)

rawConfig, err := json.Marshal(testXrayConfig(t))
if err != nil {
t.Fatal(err)
}
if version == "" {
t.Fatal("Xray version should not be empty")
response = invokeForTest(
t,
LibXrayMethodConvertXrayJsonToShareLinks,
nil,
ConvertXrayJsonToShareLinksRequest{XrayJson: string(rawConfig)},
)
if !response.Success {
t.Fatalf("ConvertXrayJsonToShareLinks failed: %s", response.Err)
}
links := decodeDataObject[ConvertXrayJsonToShareLinksResponse](t, response)
if links.Links == "" {
t.Fatal("links should not be empty")
}
}

Expand Down