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...) }