|  |  | package nnet
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | import (
 | 
						
						
						
							|  |  | 	"git.noahlan.cn/noahlan/nnet/conn"
 | 
						
						
						
							|  |  | 	"git.noahlan.cn/noahlan/nnet/event"
 | 
						
						
						
							|  |  | 	"git.noahlan.cn/noahlan/nnet/packet"
 | 
						
						
						
							|  |  | 	rt "git.noahlan.cn/noahlan/nnet/router"
 | 
						
						
						
							|  |  | 	"git.noahlan.cn/noahlan/ntool/ndef"
 | 
						
						
						
							|  |  | 	"git.noahlan.cn/noahlan/ntool/npool"
 | 
						
						
						
							|  |  | 	"github.com/panjf2000/ants/v2"
 | 
						
						
						
							|  |  | 	"time"
 | 
						
						
						
							|  |  | )
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | type (
 | 
						
						
						
							|  |  | 	// RunOption defines the method to customize an Engine.
 | 
						
						
						
							|  |  | 	RunOption func(ngin *Engine)
 | 
						
						
						
							|  |  | )
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | // EventManager returns EventManager.
 | 
						
						
						
							|  |  | func (ngin *Engine) EventManager() event.EventManager {
 | 
						
						
						
							|  |  | 	return ngin.evtMgr
 | 
						
						
						
							|  |  | }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | // ConnManager returns connection manager
 | 
						
						
						
							|  |  | func (ngin *Engine) ConnManager() *conn.ConnManager {
 | 
						
						
						
							|  |  | 	return ngin.connMgr
 | 
						
						
						
							|  |  | }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | //////////////////////// 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 ndef.Serializer) RunOption {
 | 
						
						
						
							|  |  | 	return func(ngin *Engine) {
 | 
						
						
						
							|  |  | 		ngin.serializer = s
 | 
						
						
						
							|  |  | 	}
 | 
						
						
						
							|  |  | }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | // WithPool 设置使用自定义的工作池
 | 
						
						
						
							|  |  | func WithPool(pl *ants.Pool) RunOption {
 | 
						
						
						
							|  |  | 	return func(ngin *Engine) {
 | 
						
						
						
							|  |  | 		ngin.pool = pl
 | 
						
						
						
							|  |  | 	}
 | 
						
						
						
							|  |  | }
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | // WithPoolCfg 设置工作池配置
 | 
						
						
						
							|  |  | func WithPoolCfg(cfg npool.Config) RunOption {
 | 
						
						
						
							|  |  | 	return func(ngin *Engine) {
 | 
						
						
						
							|  |  | 		ngin.pool, _ = ants.NewPool(cfg.PoolSize, ants.WithOptions(cfg.Options()))
 | 
						
						
						
							|  |  | 	}
 | 
						
						
						
							|  |  | }
 |