mirror of
https://github.com/ehang-io/nps.git
synced 2025-07-02 04:00:42 +00:00
72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
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)
|
|
}
|