Catch panics in portal message handler

This commit is contained in:
Tulir Asokan 2023-09-03 01:32:25 +03:00
parent 015cc1f19f
commit c704191e2c

View file

@ -298,7 +298,7 @@ var (
_ bridge.TypingPortal = (*Portal)(nil)
)
func (portal *Portal) handleMessageLoopItem(msg PortalMessage) {
func (portal *Portal) handleWhatsAppMessageLoopItem(msg PortalMessage) {
if len(portal.MXID) == 0 {
if msg.fake == nil && msg.undecryptable == nil && (msg.evt == nil || !containsSupportedMessage(msg.evt.Message)) {
portal.log.Debugln("Not creating portal room for incoming message: message is not a chat message")
@ -423,14 +423,31 @@ func (portal *Portal) handleReceipt(receipt *events.Receipt, source *User) {
func (portal *Portal) handleMessageLoop() {
for {
select {
case msg := <-portal.messages:
portal.handleMessageLoopItem(msg)
case msg := <-portal.matrixMessages:
portal.handleMatrixMessageLoopItem(msg)
case retry := <-portal.mediaRetries:
portal.handleMediaRetry(retry.evt, retry.source)
portal.handleOneMessageLoopItem()
}
}
func (portal *Portal) handleOneMessageLoopItem() {
defer func() {
if err := recover(); err != nil {
logEvt := portal.zlog.WithLevel(zerolog.FatalLevel).
Str(zerolog.ErrorStackFieldName, string(debug.Stack()))
actualErr, ok := err.(error)
if ok {
logEvt = logEvt.Err(actualErr)
} else {
logEvt = logEvt.Any(zerolog.ErrorFieldName, err)
}
logEvt.Msg("Portal message handler panicked")
}
}()
select {
case msg := <-portal.messages:
portal.handleWhatsAppMessageLoopItem(msg)
case msg := <-portal.matrixMessages:
portal.handleMatrixMessageLoopItem(msg)
case retry := <-portal.mediaRetries:
portal.handleMediaRetry(retry.evt, retry.source)
}
}