feat: use sse to fetch new messages (close #70)

This commit is contained in:
JustSong
2023-05-12 18:28:54 +08:00
parent 024fc97ced
commit 8f7e5456e5
6 changed files with 97 additions and 11 deletions
+56
View File
@@ -0,0 +1,56 @@
package controller
import (
"github.com/gin-gonic/gin"
"io"
"message-pusher/model"
"sync"
)
var messageChanBufferSize = 10
var messageChanStore struct {
Map map[int]*chan *model.Message
Mutex sync.RWMutex
}
func messageChanStoreAdd(messageChan *chan *model.Message, userId int) {
messageChanStore.Mutex.Lock()
defer messageChanStore.Mutex.Unlock()
messageChanStore.Map[userId] = messageChan
}
func messageChanStoreRemove(userId int) {
messageChanStore.Mutex.Lock()
defer messageChanStore.Mutex.Unlock()
delete(messageChanStore.Map, userId)
}
func init() {
messageChanStore.Map = make(map[int]*chan *model.Message)
}
func syncMessageToUser(message *model.Message, userId int) {
messageChanStore.Mutex.RLock()
defer messageChanStore.Mutex.RUnlock()
messageChan, ok := messageChanStore.Map[userId]
if !ok {
return
}
*messageChan <- message
}
func GetNewMessages(c *gin.Context) {
userId := c.GetInt("id")
messageChan := make(chan *model.Message, messageChanBufferSize)
messageChanStoreAdd(&messageChan, userId)
c.Stream(func(w io.Writer) bool {
if msg, ok := <-messageChan; ok {
c.SSEvent("message", *msg)
return true
}
return false
})
messageChanStoreRemove(userId)
close(messageChan)
}
+2
View File
@@ -185,11 +185,13 @@ func saveAndSendMessage(user *model.User, message *model.Message, channel_ *mode
if err != nil {
return err
}
go syncMessageToUser(message, user.Id)
} else {
if message.Async {
return errors.New("异步发送消息需要用户具备消息持久化的权限")
}
message.Link = "unsaved" // This is for user to identify whether the message is saved
go syncMessageToUser(message, user.Id)
}
if !message.Async {
err := channel.SendMessage(message, user, channel_)