Documentation
¶
Index ¶
- Variables
- func CallGuestFn[T, R proto.Message](ctx context.Context, mod api.Module, exportName string, req T, newR func() R) (R, error)
- func CallGuestStart(ctx context.Context, mod api.Module) error
- func CallGuestStop(ctx context.Context, mod api.Module) error
- func CloseModule(ctx context.Context, mod api.Module) error
- func CompilePlugin(ctx context.Context, rt wazero.Runtime, pluginPath, wasmFile string) (wazero.CompiledModule, error)
- func MakeHostFunc[T, R proto.Message](pluginName string, fn HostFunc[T, R], newT func() T) api.GoModuleFunc
- func NewModuleConfig(pluginName string) wazero.ModuleConfig
- func ResolvePluginFile(pluginPath, file string) (string, error)
- func ValidatePluginName(name string) error
- type EventBus
- type EventHandler
- type EventSubscription
- type HostEnv
- type HostFunc
- type HostFuncDef
- type InstancePool
- type Manager
- func (m *Manager) CallPlugin(ctx context.Context, pluginName, exportName string, ...) (*pluginv1.HandleResponse, error)
- func (m *Manager) CallPluginMiddleware(ctx context.Context, pluginName, exportName string, ...) (*pluginv1.MiddlewareResponse, error)
- func (m *Manager) DisablePlugin(name string) error
- func (m *Manager) EnablePlugin(name string) error
- func (m *Manager) EventBus() *EventBus
- func (m *Manager) FindMiddleware(pluginName, name string) (MiddlewareRegistration, bool)
- func (m *Manager) FindRoute(pluginName, method, path string) (RouteRegistration, bool)
- func (m *Manager) GetConfigValue(key string) string
- func (m *Manager) GetInstalledManifest(name string) (*PluginManifest, error)
- func (m *Manager) GetInstalledPluginInfo(name string) (PluginInfo, bool)
- func (m *Manager) GetPlugin(name string) *PluginInstance
- func (m *Manager) GetPluginHealth(name string) (PluginHealth, bool)
- func (m *Manager) GetRedis() RedisClient
- func (m *Manager) GetStore() StoreClient
- func (m *Manager) HasPermission(pluginName string, perm Permission) bool
- func (m *Manager) InstallPluginArchive(ctx context.Context, r io.Reader, opts PluginInstallOptions) (PluginInstallResult, error)
- func (m *Manager) ListInstalledPlugins() []PluginInfo
- func (m *Manager) ListPluginEvents(name string) []EventSubscription
- func (m *Manager) ListPluginMiddleware(name string) []MiddlewareRegistration
- func (m *Manager) ListPluginRoutes(name string) []RouteRegistration
- func (m *Manager) ListPlugins() []PluginInfo
- func (m *Manager) PendingMiddleware() []MiddlewareRegistration
- func (m *Manager) PendingRoutes() []RouteRegistration
- func (m *Manager) PluginDirectory() string
- func (m *Manager) RegisterMiddleware(mw MiddlewareRegistration) error
- func (m *Manager) RegisterRoute(route RouteRegistration) error
- func (m *Manager) ReloadAllPlugins(ctx context.Context) []PluginInfo
- func (m *Manager) ReloadPlugin(name string) error
- func (m *Manager) RequestTimeout() time.Duration
- func (m *Manager) ScheduleTask(pluginName, taskName, cronExpr, handler string) error
- func (m *Manager) Start()
- func (m *Manager) Stop()
- func (m *Manager) SubscribeEvent(pluginName, event, handler string) error
- func (m *Manager) ValidateInstalledPlugin(name string) PluginValidation
- func (m *Manager) WaitReady(ctx context.Context) error
- type ManagerStatus
- type MiddlewareRegistration
- type Permission
- type PluginHealth
- type PluginInfo
- type PluginInstallOptions
- type PluginInstallResult
- type PluginInstance
- func (p *PluginInstance) AddRoute(route RouteRegistration)
- func (p *PluginInstance) GetRoutes() []RouteRegistration
- func (p *PluginInstance) GetStatus() PluginStatus
- func (p *PluginInstance) SetError(err string)
- func (p *PluginInstance) SetStatus(s PluginStatus)
- func (p *PluginInstance) ToInfo() PluginInfo
- type PluginManifest
- type PluginStatus
- type PluginValidation
- type PluginValidationCheck
- type QueueAdapter
- type QueueClient
- type RedisAdapter
- type RedisClient
- type RouteRegistration
- type StoreAdapter
- type StoreClient
Constants ¶
This section is empty.
Variables ¶
var AllowedPermissions = map[Permission]bool{ PermHTTPRoutes: true, PermMiddleware: true, PermDatabaseRead: true, PermDatabaseWrite: true, PermRedis: true, PermLogging: true, PermConfigRead: true, PermEvents: true, PermHTTPClient: true, PermScheduler: true, PermQueue: true, }
AllowedPermissions 定义所有合法权限的集合
Functions ¶
func CallGuestFn ¶
func CallGuestFn[T, R proto.Message]( ctx context.Context, mod api.Module, exportName string, req T, newR func() R, ) (R, error)
CallGuestFn 调用 guest WASM 模块的导出函数
自动完成: proto.Marshal → allocate + 写入 WASM 内存 → 调用 guest fn → 读内存 → proto.Unmarshal
参数:
- exportName: guest 导出的函数名(如 "init", "handle_get_stats")
- req: 请求 protobuf 消息
- newR: 创建响应类型的工厂函数
func CallGuestStart ¶
CallGuestStart 调用 guest 的 start 函数(可选)
func CallGuestStop ¶
CallGuestStop 调用 guest 的 stop 函数(可选)
func CompilePlugin ¶
func CompilePlugin(ctx context.Context, rt wazero.Runtime, pluginPath, wasmFile string) (wazero.CompiledModule, error)
CompilePlugin 从文件编译 WASM 模块
func MakeHostFunc ¶
func MakeHostFunc[T, R proto.Message]( pluginName string, fn HostFunc[T, R], newT func() T, ) api.GoModuleFunc
MakeHostFunc 创建一个 wazero host function(GoModuleFunc)。
WASM 函数签名: (i32, i32) -> i64
- param 0 (i32): 指向 protobuf 请求数据的指针
- param 1 (i32): 请求数据长度
- return (i64): 打包的 (result_ptr << 32) | result_len
内部自动完成:
读内存 → proto.Unmarshal → 业务逻辑 → proto.Marshal → allocate + 写内存 → 返回打包指针
func NewModuleConfig ¶
func NewModuleConfig(pluginName string) wazero.ModuleConfig
NewModuleConfig 创建模块配置
func ResolvePluginFile ¶
ResolvePluginFile 解析插件目录内的文件路径,拒绝绝对路径和路径穿越。
func ValidatePluginName ¶
ValidatePluginName 校验管理 API 传入的插件名称,避免路径穿越。
Types ¶
type EventBus ¶
type EventBus struct {
// contains filtered or unexported fields
}
EventBus 提供插件间的事件发布/订阅
func (*EventBus) Subscriptions ¶
func (eb *EventBus) Subscriptions(pluginName string) []EventSubscription
Subscriptions 返回指定插件的事件订阅快照。pluginName 为空时返回全部订阅。
type EventHandler ¶
type EventHandler func(sub EventSubscription, event string, payload *structpb.Struct)
EventHandler 是事件处理函数的签名
type EventSubscription ¶
type EventSubscription struct {
PluginName string // 订阅者插件名
Event string // 事件名
Handler string // WASM 导出函数名,如 "on_order_paid"
}
EventSubscription 事件订阅
type HostEnv ¶
type HostEnv struct {
Config config.Config
Redis RedisClient
Store StoreClient
Queue QueueClient
}
HostEnv 封装宿主提供给插件的所有依赖 在 cmd/run.go 中由 ServiceContext 构建
type HostFunc ¶
type HostFunc[T proto.Message, R proto.Message] func( ctx context.Context, pluginName string, req T, ) (R, error)
HostFunc 是宿主函数的业务逻辑签名
type HostFuncDef ¶
type HostFuncDef struct {
Name string // WASM 导入函数名
Fn interface{} // api.GoModuleFunc
Permission Permission // 所需权限
}
HostFuncDef 定义宿主函数的元数据
type InstancePool ¶
type InstancePool struct {
// contains filtered or unexported fields
}
InstancePool 管理 WASM 模块实例池
func InstantiateWithHostFuncs ¶
func InstantiateWithHostFuncs( ctx context.Context, rt wazero.Runtime, compiled wazero.CompiledModule, pluginName string, hostFuncs map[string]api.GoModuleFunc, poolSize int, ) (*InstancePool, error)
InstantiateWithHostFuncs 注册宿主函数并实例化 WASM 模块
hostFuncs: 宿主函数名 → api.GoModuleFunc 的映射
type Manager ¶
type Manager struct {
// contains filtered or unexported fields
}
Manager 插件管理器,实现 service.Service 接口
func (*Manager) CallPlugin ¶
func (m *Manager) CallPlugin(ctx context.Context, pluginName, exportName string, req *pluginv1.HandleRequest) (*pluginv1.HandleResponse, error)
CallPlugin 调用插件的导出函数(用于路由处理)。 内部持有 WASM 互斥锁,阻塞型宿主函数安全。
func (*Manager) CallPluginMiddleware ¶
func (m *Manager) CallPluginMiddleware(ctx context.Context, pluginName, exportName string, req *pluginv1.HandleRequest) (*pluginv1.MiddlewareResponse, error)
CallPluginMiddleware 调用插件中间件
func (*Manager) DisablePlugin ¶
DisablePlugin 禁用插件(停止并卸载)
func (*Manager) EnablePlugin ¶
EnablePlugin 启用插件(加载并启动)
func (*Manager) FindMiddleware ¶
func (m *Manager) FindMiddleware(pluginName, name string) (MiddlewareRegistration, bool)
FindMiddleware 查找插件中间件。优先使用同插件注册的中间件,兼容旧的全局名称引用。
func (*Manager) FindRoute ¶
func (m *Manager) FindRoute(pluginName, method, path string) (RouteRegistration, bool)
FindRoute 查找当前已注册的插件路由。用于固定 catch-all HTTP 路由动态分发。
func (*Manager) GetConfigValue ¶
GetConfigValue 通过 dot-notation key 读取配置值
func (*Manager) GetInstalledManifest ¶
func (m *Manager) GetInstalledManifest(name string) (*PluginManifest, error)
GetInstalledManifest 返回运行中或已安装插件的 manifest。
func (*Manager) GetInstalledPluginInfo ¶
func (m *Manager) GetInstalledPluginInfo(name string) (PluginInfo, bool)
GetInstalledPluginInfo 返回运行中或已安装插件的信息。
func (*Manager) GetPlugin ¶
func (m *Manager) GetPlugin(name string) *PluginInstance
GetPlugin 根据名称获取插件实例
func (*Manager) GetPluginHealth ¶
func (m *Manager) GetPluginHealth(name string) (PluginHealth, bool)
GetPluginHealth 返回指定插件运行时健康状态。
func (*Manager) HasPermission ¶
func (m *Manager) HasPermission(pluginName string, perm Permission) bool
HasPermission 检查插件是否有特定权限
func (*Manager) InstallPluginArchive ¶
func (m *Manager) InstallPluginArchive(ctx context.Context, r io.Reader, opts PluginInstallOptions) (PluginInstallResult, error)
InstallPluginArchive installs a zip package that contains plugin.yaml and the WASM module.
func (*Manager) ListInstalledPlugins ¶
func (m *Manager) ListInstalledPlugins() []PluginInfo
ListInstalledPlugins 扫描插件目录,并合并当前运行时状态。
func (*Manager) ListPluginEvents ¶
func (m *Manager) ListPluginEvents(name string) []EventSubscription
ListPluginEvents 返回指定插件当前订阅的事件。
func (*Manager) ListPluginMiddleware ¶
func (m *Manager) ListPluginMiddleware(name string) []MiddlewareRegistration
ListPluginMiddleware 返回指定插件当前注册的 WASM 中间件。
func (*Manager) ListPluginRoutes ¶
func (m *Manager) ListPluginRoutes(name string) []RouteRegistration
ListPluginRoutes 返回指定插件当前注册的路由。
func (*Manager) PendingMiddleware ¶
func (m *Manager) PendingMiddleware() []MiddlewareRegistration
PendingMiddleware 返回待注册的中间件列表
func (*Manager) PendingRoutes ¶
func (m *Manager) PendingRoutes() []RouteRegistration
PendingRoutes 返回待注册的路由列表
func (*Manager) PluginDirectory ¶
PluginDirectory 返回当前插件目录。
func (*Manager) RegisterMiddleware ¶
func (m *Manager) RegisterMiddleware(mw MiddlewareRegistration) error
RegisterMiddleware 注册插件中间件(供 host_register_middleware 调用)
func (*Manager) RegisterRoute ¶
func (m *Manager) RegisterRoute(route RouteRegistration) error
RegisterRoute 注册插件的 HTTP 路由(供 host_register_route 调用)
func (*Manager) ReloadAllPlugins ¶
func (m *Manager) ReloadAllPlugins(ctx context.Context) []PluginInfo
ReloadAllPlugins 停止当前运行时状态并重新扫描插件目录。
func (*Manager) ReloadPlugin ¶
ReloadPlugin 重载指定插件(停止→重新加载→启动)
func (*Manager) RequestTimeout ¶
RequestTimeout 返回插件请求/初始化默认超时。
func (*Manager) ScheduleTask ¶
ScheduleTask 注册定时任务
func (*Manager) SubscribeEvent ¶
SubscribeEvent 订阅宿主事件(供 host_subscribe_event 调用)
func (*Manager) ValidateInstalledPlugin ¶
func (m *Manager) ValidateInstalledPlugin(name string) PluginValidation
ValidateInstalledPlugin 校验插件目录、manifest、权限和 WASM 文件可访问性。
type ManagerStatus ¶
type ManagerStatus int
ManagerStatus 管理器状态
const ( ManagerUninitialized ManagerStatus = iota ManagerLoading ManagerRunning ManagerStopping ManagerStopped )
type MiddlewareRegistration ¶
type MiddlewareRegistration struct {
PluginName string // 插件名
Name string // 中间件名(用于路由引用)
Handler string // WASM 导出函数名,如 "mw_rate_limit"
}
MiddlewareRegistration 插件注册的中间件
type Permission ¶
type Permission string
Permission 定义插件可以请求的能力
const ( PermHTTPRoutes Permission = "http_routes" PermMiddleware Permission = "middleware" PermDatabaseRead Permission = "database_read" PermDatabaseWrite Permission = "database_write" PermRedis Permission = "redis" PermLogging Permission = "logging" PermConfigRead Permission = "config_read" PermEvents Permission = "events" PermHTTPClient Permission = "http_client" PermScheduler Permission = "scheduler" PermQueue Permission = "queue" )
type PluginHealth ¶
type PluginHealth struct {
Name string `json:"name"`
Status PluginStatus `json:"status"`
Ready bool `json:"ready"`
PoolSize int `json:"pool_size"`
AsyncInFlight int `json:"async_in_flight"`
AsyncLimit int `json:"async_limit"`
RegisteredRoute int `json:"registered_route"`
Error string `json:"error,omitempty"`
}
PluginHealth 描述插件运行时健康状态(用于管理 API)。
type PluginInfo ¶
type PluginInfo struct {
Name string `json:"name"`
Version string `json:"version"`
Description string `json:"description"`
Author string `json:"author"`
Status PluginStatus `json:"status"`
Permissions []string `json:"permissions"`
Routes []string `json:"routes"` // 已注册的路由路径列表
Error string `json:"error,omitempty"`
}
PluginInfo 对外暴露的插件信息(用于管理 API)
type PluginInstallOptions ¶
PluginInstallOptions controls how an uploaded plugin package is installed.
type PluginInstallResult ¶
type PluginInstallResult struct {
Name string `json:"name"`
Replaced bool `json:"replaced"`
Enabled bool `json:"enabled"`
Status PluginStatus `json:"status"`
Plugin PluginInfo `json:"plugin"`
Validation PluginValidation `json:"validation"`
}
PluginInstallResult describes the result of installing an uploaded plugin.
type PluginInstance ¶
type PluginInstance struct {
Name string
Version string
Description string
Author string
Status PluginStatus
Manifest *PluginManifest
Routes []RouteRegistration
Error string
// Pool 管理该插件的 WASM 模块实例
Pool *InstancePool
// Runtime 是该插件独立的 wazero runtime,避免 env host module 跨插件冲突
Runtime wazero.Runtime
// AsyncNotify 异步任务完成通知
AsyncNotify chan uint64
// AsyncSem 限制该插件未完成的异步任务数
AsyncSem chan struct{}
// contains filtered or unexported fields
}
PluginInstance 代表一个已加载的插件实例
func (*PluginInstance) AddRoute ¶
func (p *PluginInstance) AddRoute(route RouteRegistration)
AddRoute 安全添加路由
func (*PluginInstance) GetRoutes ¶
func (p *PluginInstance) GetRoutes() []RouteRegistration
GetRoutes 安全获取路由列表
func (*PluginInstance) GetStatus ¶
func (p *PluginInstance) GetStatus() PluginStatus
GetStatus 安全获取插件状态
func (*PluginInstance) SetStatus ¶
func (p *PluginInstance) SetStatus(s PluginStatus)
SetStatus 安全设置插件状态
func (*PluginInstance) ToInfo ¶
func (p *PluginInstance) ToInfo() PluginInfo
ToInfo 转换为对外暴露的 PluginInfo
type PluginManifest ¶
type PluginManifest struct {
Name string `yaml:"name"`
Version string `yaml:"version"`
Description string `yaml:"description"`
Author string `yaml:"author"`
Main string `yaml:"main"` // .wasm 文件路径,相对于插件目录
Permissions []string `yaml:"permissions"`
Config map[string]interface{} `yaml:"config"`
}
PluginManifest 是插件描述文件 plugin.yaml 的结构
func ParseManifest ¶
func ParseManifest(pluginDir string) (*PluginManifest, error)
ParseManifest 从插件目录解析 plugin.yaml 并校验
func (*PluginManifest) HasPermission ¶
func (m *PluginManifest) HasPermission(perm Permission) bool
HasPermission 检查插件是否声明了某个权限
func (*PluginManifest) Validate ¶
func (m *PluginManifest) Validate() error
Validate 校验清单的必填字段和权限合法性
type PluginStatus ¶
type PluginStatus string
PluginStatus 表示插件的当前状态
const ( StatusUnloaded PluginStatus = "unloaded" StatusLoaded PluginStatus = "loaded" StatusInitialized PluginStatus = "initialized" StatusRunning PluginStatus = "running" StatusStopped PluginStatus = "stopped" StatusError PluginStatus = "error" )
type PluginValidation ¶
type PluginValidation struct {
Name string `json:"name"`
Valid bool `json:"valid"`
Manifest *PluginManifest `json:"manifest,omitempty"`
Checks []PluginValidationCheck `json:"checks"`
Error string `json:"error,omitempty"`
}
PluginValidation 表示插件安装包/目录的校验结果。
type PluginValidationCheck ¶
type PluginValidationCheck struct {
Name string `json:"name"`
OK bool `json:"ok"`
Message string `json:"message,omitempty"`
}
PluginValidationCheck 表示插件安装校验中的单项结果。
type QueueAdapter ¶
type QueueAdapter struct {
// contains filtered or unexported fields
}
QueueAdapter 将 *asynq.Client 适配为 QueueClient 接口
func NewQueueAdapter ¶
func NewQueueAdapter(client *asynq.Client) *QueueAdapter
NewQueueAdapter 创建 Queue 适配器
type QueueClient ¶
QueueClient 是插件访问任务队列的接口
type RedisAdapter ¶
type RedisAdapter struct {
// contains filtered or unexported fields
}
RedisAdapter 将 *redis.Client 适配为 RedisClient 接口
func NewRedisAdapter ¶
func NewRedisAdapter(client *redis.Client) *RedisAdapter
NewRedisAdapter 创建 Redis 适配器
func (*RedisAdapter) Del ¶
func (a *RedisAdapter) Del(keys ...string) error
type RedisClient ¶
type RedisClient interface {
Get(key string) (string, error)
Set(key string, value string, ttlSeconds int64) error
Del(keys ...string) error
}
RedisClient 是插件访问 Redis 的接口
type RouteRegistration ¶
type RouteRegistration struct {
PluginName string // 插件名
Method string // GET, POST, PUT, DELETE
Path string // 插件自定义路径,如 "/stats"
Handler string // WASM 导出函数名
Middleware []string // "auth", "device"
}
RouteRegistration 插件注册的路由
type StoreAdapter ¶
type StoreAdapter struct {
// contains filtered or unexported fields
}
StoreAdapter 将 *gorm.DB 适配为 StoreClient 接口
func NewStoreAdapter ¶
func NewStoreAdapter(db *gorm.DB) *StoreAdapter
NewStoreAdapter 创建数据库 Store 适配器