1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package rule
- import (
- "ehang.io/nps/core/action"
- "ehang.io/nps/core/handler"
- "ehang.io/nps/core/limiter"
- "ehang.io/nps/core/process"
- "ehang.io/nps/core/server"
- "ehang.io/nps/lib/enet"
- "github.com/pkg/errors"
- )
- type Rule struct {
- Server server.Server `json:"server"`
- Handler handler.Handler `json:"handler"`
- Process process.Process `json:"process"`
- Action action.Action `json:"action"`
- Limiters []limiter.Limiter `json:"limiters"`
- }
- var servers map[string]server.Server
- func init() {
- servers = make(map[string]server.Server, 0)
- }
- func (r *Rule) GetHandler() handler.Handler {
- return r.Handler
- }
- func (r *Rule) Init() error {
- s := r.Server
- var ok bool
- if s, ok = servers[r.Server.GetName()+":"+r.Server.GetServerAddr()]; !ok {
- s = r.Server
- err := s.Init()
- servers[r.Server.GetName()+":"+r.Server.GetServerAddr()] = s
- if err != nil {
- return err
- }
- go s.Serve()
- }
- s.RegisterHandle(r)
- r.Handler.AddRule(r)
- if err := r.Action.Init(); err != nil {
- return err
- }
- for _, l := range r.Limiters {
- if err := l.Init(); err != nil {
- return err
- }
- }
- return r.Process.Init(r.Action)
- }
- func (r *Rule) RunConn(c enet.Conn) (bool, error) {
- var err error
- for _, lm := range r.Limiters {
- if c, err = lm.DoLimit(c); err != nil {
- return true, errors.Wrap(err, "rule run")
- }
- }
- if err = c.Reset(0); err != nil {
- return false, err
- }
- return r.Process.ProcessConn(c)
- }
- func (r *Rule) RunPacketConn(pc enet.PacketConn) (bool, error) {
- return r.Process.ProcessPacketConn(pc)
- }
|