api/js_export.go

68 lines
1.4 KiB
Go
Raw Permalink Normal View History

package api
import (
"context"
"apigo.cc/go/cast"
"apigo.cc/go/jsmod"
)
func init() {
jsmod.Register("api", map[string]any{
"call": call,
"addConfig": AddConfig,
})
}
// call 提供给 JS 的私有入口,避免污染 Go 公开 API
func call(ctx context.Context, actionName string, payload any, options ...map[string]any) (any, error) {
var opt map[string]any
if len(options) > 0 {
opt = options[0]
}
if payload == nil {
payload = make(map[string]any)
}
// 1. 预填 Payload (JS 传来的 map 需要手动触发一次 fill 以获取全局配置)
actionConfig, safeBufs := GetActionConfig(actionName)
defer func() {
for _, sb := range safeBufs {
sb.Close()
}
}()
fill(payload, actionConfig)
// 2. 构造符合 Action 接口的私有包装器
ja := &jsAction{
name: actionName,
payload: payload,
options: opt,
}
return Call[any](ja)
}
type jsAction struct {
name string
payload any
options map[string]any
}
func (a *jsAction) ActionName() string { return a.name }
func (a *jsAction) SignerName() string {
if a.options != nil {
return cast.String(a.options["signer"])
}
return ""
}
func (a *jsAction) GetURL() string { return cast.String(a.options["url"]) }
func (a *jsAction) GetMethod() string { return cast.String(a.options["method"]) }
func (a *jsAction) Config() map[string]any {
return a.options
}
func (a *jsAction) MarshalJSON() ([]byte, error) {
return cast.ToJSONBytes(a.payload)
}