rule.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package rule
  2. import (
  3. "ehang.io/nps/core/action"
  4. "ehang.io/nps/core/handler"
  5. "ehang.io/nps/core/limiter"
  6. "ehang.io/nps/core/process"
  7. "ehang.io/nps/core/server"
  8. "ehang.io/nps/lib/enet"
  9. "github.com/pkg/errors"
  10. )
  11. type Rule struct {
  12. Server server.Server `json:"server"`
  13. Handler handler.Handler `json:"handler"`
  14. Process process.Process `json:"process"`
  15. Action action.Action `json:"action"`
  16. Limiters []limiter.Limiter `json:"limiters"`
  17. }
  18. var servers map[string]server.Server
  19. func init() {
  20. servers = make(map[string]server.Server, 0)
  21. }
  22. func (r *Rule) GetHandler() handler.Handler {
  23. return r.Handler
  24. }
  25. func (r *Rule) Init() error {
  26. s := r.Server
  27. var ok bool
  28. if s, ok = servers[r.Server.GetName()+":"+r.Server.GetServerAddr()]; !ok {
  29. s = r.Server
  30. err := s.Init()
  31. servers[r.Server.GetName()+":"+r.Server.GetServerAddr()] = s
  32. if err != nil {
  33. return err
  34. }
  35. go s.Serve()
  36. }
  37. s.RegisterHandle(r)
  38. r.Handler.AddRule(r)
  39. if err := r.Action.Init(); err != nil {
  40. return err
  41. }
  42. for _, l := range r.Limiters {
  43. if err := l.Init(); err != nil {
  44. return err
  45. }
  46. }
  47. return r.Process.Init(r.Action)
  48. }
  49. func (r *Rule) RunConn(c enet.Conn) (bool, error) {
  50. var err error
  51. for _, lm := range r.Limiters {
  52. if c, err = lm.DoLimit(c); err != nil {
  53. return true, errors.Wrap(err, "rule run")
  54. }
  55. }
  56. if err = c.Reset(0); err != nil {
  57. return false, err
  58. }
  59. return r.Process.ProcessConn(c)
  60. }
  61. func (r *Rule) RunPacketConn(pc enet.PacketConn) (bool, error) {
  62. return r.Process.ProcessPacketConn(pc)
  63. }