118 lines
3.7 KiB
Go
118 lines
3.7 KiB
Go
|
|
package discover
|
||
|
|
|
||
|
|
import (
|
||
|
|
"net/http"
|
||
|
|
|
||
|
|
gohttp "apigo.cc/go/http"
|
||
|
|
"apigo.cc/go/jsmod"
|
||
|
|
)
|
||
|
|
|
||
|
|
func init() {
|
||
|
|
jsmod.Register("discover", map[string]any{
|
||
|
|
// RPC 调用 (默认实例)
|
||
|
|
"get": func(app, path string, headers ...string) *jsResult {
|
||
|
|
return wrapResult(Get(app, path, headers...))
|
||
|
|
},
|
||
|
|
"post": func(app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(Post(app, path, data, headers...))
|
||
|
|
},
|
||
|
|
"put": func(app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(DefaultDiscoverer.Put(app, path, data, headers...))
|
||
|
|
},
|
||
|
|
"delete": func(app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(DefaultDiscoverer.Delete(app, path, data, headers...))
|
||
|
|
},
|
||
|
|
"head": func(app, path string, headers ...string) *jsResult {
|
||
|
|
return wrapResult(DefaultDiscoverer.Head(app, path, headers...))
|
||
|
|
},
|
||
|
|
"do": func(method, app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(DefaultDiscoverer.Do(method, app, path, data, headers...))
|
||
|
|
},
|
||
|
|
"open": func(app, path string, headers ...string) any {
|
||
|
|
return DefaultDiscoverer.Open(app, path, headers...)
|
||
|
|
},
|
||
|
|
|
||
|
|
// 链路透传
|
||
|
|
"from": func(r *http.Request) *jsCaller {
|
||
|
|
return &jsCaller{c: DefaultDiscoverer.From(r)}
|
||
|
|
},
|
||
|
|
|
||
|
|
// 状态获取
|
||
|
|
"getAppNodes": func(app string) map[string]*NodeInfo {
|
||
|
|
return DefaultDiscoverer.GetAppNodes(app)
|
||
|
|
},
|
||
|
|
|
||
|
|
// Header 常量
|
||
|
|
"headerFromApp": HeaderFromApp,
|
||
|
|
"headerFromNode": HeaderFromNode,
|
||
|
|
"headerClientIP": HeaderClientIP,
|
||
|
|
"headerForwardedFor": HeaderForwardedFor,
|
||
|
|
"headerUserID": HeaderUserID,
|
||
|
|
"headerDeviceID": HeaderDeviceID,
|
||
|
|
"headerClientAppName": HeaderClientAppName,
|
||
|
|
"headerClientAppVersion": HeaderClientAppVersion,
|
||
|
|
"headerSessionID": HeaderSessionID,
|
||
|
|
"headerRequestID": HeaderRequestID,
|
||
|
|
"headerHost": HeaderHost,
|
||
|
|
"headerScheme": HeaderScheme,
|
||
|
|
"headerUserAgent": HeaderUserAgent,
|
||
|
|
}, "setNode", "setLoadBalancer", "setRoute", "addExternalApp")
|
||
|
|
}
|
||
|
|
|
||
|
|
// jsResult 包装 *gohttp.Result 以隐藏 Save() 等危险方法
|
||
|
|
type jsResult struct {
|
||
|
|
r *gohttp.Result
|
||
|
|
}
|
||
|
|
|
||
|
|
func wrapResult(r *gohttp.Result) *jsResult {
|
||
|
|
return &jsResult{r: r}
|
||
|
|
}
|
||
|
|
|
||
|
|
func (jr *jsResult) String() string { return jr.r.String() }
|
||
|
|
func (jr *jsResult) Bytes() []byte { return jr.r.Bytes() }
|
||
|
|
func (jr *jsResult) Map() map[string]any {
|
||
|
|
return jr.r.Map()
|
||
|
|
}
|
||
|
|
func (jr *jsResult) Slice() []any {
|
||
|
|
return jr.r.Slice()
|
||
|
|
}
|
||
|
|
func (jr *jsResult) Status() int {
|
||
|
|
if jr.r.Response != nil {
|
||
|
|
return jr.r.Response.StatusCode
|
||
|
|
}
|
||
|
|
return 0
|
||
|
|
}
|
||
|
|
func (jr *jsResult) Error() string {
|
||
|
|
if jr.r.Error != nil {
|
||
|
|
return jr.r.Error.Error()
|
||
|
|
}
|
||
|
|
return ""
|
||
|
|
}
|
||
|
|
|
||
|
|
// jsCaller 包装 *Caller 以确保返回包装后的结果
|
||
|
|
type jsCaller struct {
|
||
|
|
c *Caller
|
||
|
|
}
|
||
|
|
|
||
|
|
func (jc *jsCaller) Get(app, path string, headers ...string) *jsResult {
|
||
|
|
return wrapResult(jc.c.Get(app, path, headers...))
|
||
|
|
}
|
||
|
|
func (jc *jsCaller) Post(app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(jc.c.Post(app, path, data, headers...))
|
||
|
|
}
|
||
|
|
func (jc *jsCaller) Put(app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(jc.c.Put(app, path, data, headers...))
|
||
|
|
}
|
||
|
|
func (jc *jsCaller) Delete(app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(jc.c.Delete(app, path, data, headers...))
|
||
|
|
}
|
||
|
|
func (jc *jsCaller) Head(app, path string, headers ...string) *jsResult {
|
||
|
|
return wrapResult(jc.c.Head(app, path, headers...))
|
||
|
|
}
|
||
|
|
func (jc *jsCaller) Do(method, app, path string, data any, headers ...string) *jsResult {
|
||
|
|
return wrapResult(jc.c.Do(method, app, path, data, headers...))
|
||
|
|
}
|
||
|
|
func (jc *jsCaller) Open(app, path string, headers ...string) any {
|
||
|
|
return jc.c.Open(app, path, headers...)
|
||
|
|
}
|