mirror of
https://github.com/songquanpeng/message-pusher.git
synced 2025-10-09 01:40:41 +08:00
feat: use sse to fetch new messages (close #70)
This commit is contained in:
56
controller/message-sse.go
Normal file
56
controller/message-sse.go
Normal 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)
|
||||
}
|
Reference in New Issue
Block a user