package nnet import ( "git.noahlan.cn/noahlan/nnet/connection" "git.noahlan.cn/noahlan/nnet/lifetime" "git.noahlan.cn/noahlan/nnet/packet" rt "git.noahlan.cn/noahlan/nnet/router" "git.noahlan.cn/noahlan/nnet/serialize" "git.noahlan.cn/noahlan/ntools-go/core/pool" "github.com/panjf2000/ants/v2" "time" ) type ( // RunOption defines the method to customize an Engine. RunOption func(ngin *Engine) ) // Pipeline returns inner pipeline func (ngin *Engine) Pipeline() connection.Pipeline { return ngin.pipeline } // Lifetime returns lifetime interface. func (ngin *Engine) Lifetime() lifetime.Lifetime { return ngin.lifetime } // ConnManager returns connection manager func (ngin *Engine) ConnManager() *connection.Manager { return ngin.connManager } //////////////////////// Options func WithMiddleware(middleware ...rt.Middleware) RunOption { return func(ngin *Engine) { ngin.Use(middleware...) } } // WithRouter 设置消息路由 func WithRouter(router rt.Router) RunOption { return func(ngin *Engine) { ngin.router = router } } // WithNotFoundHandler returns a RunOption with not found handler set to given handler. func WithNotFoundHandler(handler rt.Handler) RunOption { return func(ngin *Engine) { ngin.router.SetNotFoundHandler(rt.NotFoundHandler(handler)) } } // WithTimerPrecision 设置Timer精度,需在 Start 或 Dial 之前执行 // 注:精度需大于1ms, 并且不能在运行时更改 // 默认精度是 time.Second func WithTimerPrecision(precision time.Duration) RunOption { if precision < time.Millisecond { panic("time precision can not less than a Millisecond") } return func(ngin *Engine) { ngin.TaskTimerPrecision = precision } } // WithPackerBuilder 设置 消息的封包/解包构造器 func WithPackerBuilder(fn packet.PackerBuilder) RunOption { return func(ngin *Engine) { ngin.packerBuilder = fn } } // WithSerializer 设置消息的 序列化/反序列化 方式 func WithSerializer(s serialize.Serializer) RunOption { return func(ngin *Engine) { ngin.serializer = s } } // WithPool 设置使用自定义的工作池 func WithPool(pl *ants.Pool) RunOption { return func(ngin *Engine) { ngin.goPool = pl } } // WithPoolCfg 设置工作池配置 func WithPoolCfg(cfg pool.Config) RunOption { return func(ngin *Engine) { ngin.goPool, _ = ants.NewPool(cfg.PoolSize, ants.WithOptions(cfg.Options())) } } //////////////////// Pipeline // WithPipeline 使用自定义 pipeline func WithPipeline(pipeline connection.Pipeline) RunOption { return func(ngin *Engine) { ngin.pipeline = pipeline } } type PipelineOption func(opts connection.Pipeline) // WithPipelineOpt 使用默认Pipeline并设置其配置 func WithPipelineOpt(opts ...func(connection.Pipeline)) RunOption { return func(ngin *Engine) { for _, opt := range opts { opt(ngin.pipeline) } } }