Files
sub2api/backend/internal/plugin/wire.go
T
shaw 8ba2fbd786 feat(plugin): Phase-1/1.5 进程内插件内核 + 开发套件后端
Caddy 式进程内模块系统(详见 docs/plugin-architecture/MODULE-AUTHOR-GUIDE.md):
- internal/plugin:命名空间注册表(init 注册/重复 panic)、Provision→Validate→Start→Stop
  生命周期(Start 半途逆序回滚、Stop 逆序+ctx deadline)、Host 四项 ports 能力面、
  modules: 配置子树(enabled 三态;viper 含点 key 手工提取)、Runtime 状态机
- internal/plugin/plugintest:模块测试夹具(NewHost Options + RunLifecycle)
- internal/modules:standard/imports.go 唯一插装清单 + job.hello 示例模块(默认 disabled)
- Wire/main 接入:Build+Start 失败 fail-fast(显式 Cleanup 防 leader 锁泄漏)、
  runtime.Stop 在 cleanup 并行组首位(先于 Redis/Ent)
- admin 可观测:GET /api/v1/admin/modules(只读,错误文本脱敏)
- 默认配置零行为变更(Phase-0 安全网 + bench allocs 零漂移验证)

含两轮对抗式审计修复(1×P1 启动失败泄漏 leader 锁 + 11×P2)与回归测试。
2026-06-11 22:58:51 +08:00

53 lines
1.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package plugin
import (
"github.com/google/wire"
"github.com/redis/go-redis/v9"
ent "github.com/Wei-Shaw/sub2api/ent"
"github.com/Wei-Shaw/sub2api/internal/config"
"github.com/Wei-Shaw/sub2api/internal/pkg/logger"
)
// ProviderSet 提供插件内核的依赖:modules: 配置子树、宿主能力面 Host
// 与模块生命周期驱动器 Runtime。
//
// 边界约定(见 Phase-1 计划):Wire 只负责装配 Host 与 Runtime,
// 模块目录由注册表(插装清单 internal/modules/standard)负责,
// 模块内部依赖一律经 Host 获取,不进入 Wire graph。
var ProviderSet = wire.NewSet(
ProvideModuleConfig,
ProvideHost,
ProvideModuleRuntime,
)
// ProvideModuleConfig 解析全局配置中 `modules:` 子树为插件模块配置。
//
// 解析失败(模块 ID 格式非法、enabled 类型错误)返回错误,
// 使应用启动 fail-fast,配置笔误在启动时即暴露。
func ProvideModuleConfig(cfg *config.Config) (Config, error) {
return ParseConfig(cfg.Modules)
}
// ProvideHost 装配模块宿主能力面:聚合全局结构化日志器、模块私有配置
// 解码能力(ConfigOf 绑定为 modules: 配置子树的 Config.Of)、
// Ent 客户端与 Redis 客户端。
//
// 日志器复用项目全局 logger(main 在依赖装配前已完成 logger.Init)。
func ProvideHost(moduleCfg Config, entClient *ent.Client, rdb *redis.Client) *Host {
return &Host{
Logger: logger.L(),
ConfigOf: moduleCfg.Of,
DB: entClient,
Redis: rdb,
}
}
// ProvideModuleRuntime 创建基于包级默认注册表的模块生命周期驱动器。
//
// 生命周期驱动由 main 负责:HTTP server 启动前 Build + Start,
// 关闭时 Stop 接入 cleanup 序列(先于 Redis/Ent 等基础设施关闭)。
func ProvideModuleRuntime(host *Host, moduleCfg Config) *Runtime {
return NewRuntime(host, moduleCfg)
}