92 lines
2.2 KiB
Go
92 lines
2.2 KiB
Go
package server
|
|
|
|
import (
|
|
"github.com/kercylan98/minotaur/server/internal/v2/queue"
|
|
"github.com/kercylan98/minotaur/utils/log/v2"
|
|
"github.com/kercylan98/minotaur/utils/super"
|
|
"runtime/debug"
|
|
)
|
|
|
|
type Message interface {
|
|
Execute()
|
|
}
|
|
|
|
func SyncMessage(srv *server, handler func(srv *server)) Message {
|
|
return &syncMessage{srv: srv, handler: handler}
|
|
}
|
|
|
|
type syncMessage struct {
|
|
srv *server
|
|
handler func(srv *server)
|
|
}
|
|
|
|
func (s *syncMessage) Execute() {
|
|
s.handler(s.srv)
|
|
}
|
|
|
|
func AsyncMessage(srv *server, ident string, handler func(srv *server) error, callback func(srv *server, err error)) Message {
|
|
return &asyncMessage{
|
|
ident: ident,
|
|
srv: srv,
|
|
handler: handler,
|
|
callback: callback,
|
|
}
|
|
}
|
|
|
|
type asyncMessage struct {
|
|
ident string
|
|
srv *server
|
|
handler func(srv *server) error
|
|
callback func(srv *server, err error)
|
|
}
|
|
|
|
func (s *asyncMessage) Execute() {
|
|
var q *queue.Queue[int, string, Message]
|
|
var dispatch = func(ident string, message Message, beforeHandler ...func(queue *queue.Queue[int, string, Message], msg Message)) {
|
|
_ = s.srv.reactor.AutoDispatch(ident, message, beforeHandler...)
|
|
}
|
|
|
|
dispatch(
|
|
s.ident,
|
|
SyncMessage(s.srv, func(srv *server) {
|
|
_ = srv.ants.Submit(func() {
|
|
defer func(srv *server, msg *asyncMessage) {
|
|
if err := super.RecoverTransform(recover()); err != nil {
|
|
if errHandler := srv.GetMessageErrorHandler(); errHandler != nil {
|
|
errHandler(srv, msg, err)
|
|
} else {
|
|
srv.GetLogger().Error("Message", log.Err(err))
|
|
debug.PrintStack()
|
|
}
|
|
}
|
|
}(s.srv, s)
|
|
|
|
err := s.handler(srv)
|
|
var msg Message
|
|
msg = SyncMessage(srv, func(srv *server) {
|
|
defer func() {
|
|
q.WaitAdd(s.ident, -1)
|
|
if err := super.RecoverTransform(recover()); err != nil {
|
|
if errHandler := srv.GetMessageErrorHandler(); errHandler != nil {
|
|
errHandler(srv, msg, err)
|
|
} else {
|
|
srv.GetLogger().Error("Message", log.Err(err))
|
|
debug.PrintStack()
|
|
}
|
|
}
|
|
}()
|
|
if s.callback != nil {
|
|
s.callback(srv, err)
|
|
}
|
|
})
|
|
dispatch(s.ident, msg)
|
|
|
|
})
|
|
}),
|
|
func(queue *queue.Queue[int, string, Message], msg Message) {
|
|
queue.WaitAdd(s.ident, 1)
|
|
q = queue
|
|
},
|
|
)
|
|
}
|