feat: server.Server 新增对连接写入事件前的处理函数

This commit is contained in:
kercylan98 2023-07-27 14:44:45 +08:00
parent 471ee48644
commit 5e26467dee
2 changed files with 30 additions and 1 deletions

View File

@ -94,6 +94,11 @@ type Conn struct {
packets []*connPacket
}
// IsEmpty 是否是空连接
func (slf *Conn) IsEmpty() bool {
return slf.ws == nil && slf.gn == nil && slf.kcp == nil
}
// Reuse 重用连接
// - 重用连接时,会将当前连接的数据复制到新连接中
// - 通常在于连接断开后,重新连接时使用
@ -174,6 +179,7 @@ func (slf *Conn) IsWebsocket() bool {
// Write 向连接中写入数据
// - messageType: websocket模式中指定消息类型
func (slf *Conn) Write(packet Packet) {
packet = slf.server.OnConnectionWritePacketBeforeEvent(slf, packet)
if slf.packetPool == nil {
return
}
@ -187,7 +193,8 @@ func (slf *Conn) Write(packet Packet) {
// WriteWithCallback 与 Write 相同,但是会在写入完成后调用 callback
// - 当 callback 为 nil 时,与 Write 相同
func (slf *Conn) WriteWithCallback(packet Packet, callback func(err error), messageType ...int) {
func (slf *Conn) WriteWithCallback(packet Packet, callback func(err error)) {
packet = slf.server.OnConnectionWritePacketBeforeEvent(slf, packet)
if slf.packetPool == nil {
return
}

View File

@ -21,6 +21,7 @@ type MessageErrorEventHandle func(srv *Server, message *Message, err error)
type MessageLowExecEventHandle func(srv *Server, message *Message, cost time.Duration)
type ConsoleCommandEventHandle func(srv *Server)
type ConnectionOpenedAfterEventHandle func(srv *Server, conn *Conn)
type ConnectionWritePacketBeforeEventHandle func(srv *Server, conn *Conn, packet Packet) Packet
type event struct {
*Server
@ -34,6 +35,7 @@ type event struct {
messageErrorEventHandles []MessageErrorEventHandle
messageLowExecEventHandles []MessageLowExecEventHandle
connectionOpenedAfterEventHandles []ConnectionOpenedAfterEventHandle
connectionWritePacketBeforeHandles []ConnectionWritePacketBeforeEventHandle
consoleCommandEventHandles map[string][]ConsoleCommandEventHandle
consoleCommandEventHandleInitOnce sync.Once
@ -229,6 +231,26 @@ func (slf *event) OnConnectionOpenedAfterEvent(conn *Conn) {
}, "ConnectionOpenedAfterEvent")
}
// RegConnectionWritePacketBeforeEvent 在发送数据包前将立刻执行被注册的事件处理函数
func (slf *event) RegConnectionWritePacketBeforeEvent(handle ConnectionWritePacketBeforeEventHandle) {
if slf.network == NetworkHttp {
panic(ErrNetworkIncompatibleHttp)
}
slf.connectionWritePacketBeforeHandles = append(slf.connectionWritePacketBeforeHandles, handle)
log.Info("Server", log.String("RegEvent", runtimes.CurrentRunningFuncName()), log.String("handle", reflect.TypeOf(handle).String()))
}
func (slf *event) OnConnectionWritePacketBeforeEvent(conn *Conn, packet Packet) (newPacket Packet) {
if len(slf.connectionWritePacketBeforeHandles) == 0 {
return packet
}
newPacket = packet
for _, handle := range slf.connectionWritePacketBeforeHandles {
newPacket = handle(slf.Server, conn, packet)
}
return newPacket
}
func (slf *event) check() {
switch slf.network {
case NetworkHttp, NetworkGRPC: