精简后的项目:仅保留 api/ui 源码、文档、构建依赖
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
package notification
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"log"
|
||||
"sync"
|
||||
|
||||
"github.com/photoview/photoview/api/graphql/models"
|
||||
)
|
||||
|
||||
type NotificationChannel = chan<- *models.Notification
|
||||
|
||||
type NotificationListener struct {
|
||||
listenerID int
|
||||
user models.User
|
||||
channel NotificationChannel
|
||||
}
|
||||
|
||||
func NewListener(user models.User, channel NotificationChannel) *NotificationListener {
|
||||
nextNotificationId++
|
||||
return &NotificationListener{
|
||||
listenerID: nextNotificationId,
|
||||
user: user,
|
||||
channel: channel,
|
||||
}
|
||||
}
|
||||
|
||||
var notificationListeners []*NotificationListener = make([]*NotificationListener, 0)
|
||||
var nextNotificationId = 0
|
||||
var notificationLock = &sync.Mutex{}
|
||||
|
||||
func RegisterListener(user *models.User, channel NotificationChannel) int {
|
||||
log.Println("Registering notification listener")
|
||||
|
||||
notificationLock.Lock()
|
||||
defer notificationLock.Unlock()
|
||||
|
||||
notificationListeners = append(notificationListeners, NewListener(*user, channel))
|
||||
return nextNotificationId
|
||||
}
|
||||
|
||||
func DeregisterListener(listenerID int) error {
|
||||
|
||||
notificationLock.Lock()
|
||||
defer notificationLock.Unlock()
|
||||
|
||||
for i, listener := range notificationListeners {
|
||||
|
||||
log.Println("Deregistering notification listener")
|
||||
|
||||
if listener.listenerID == listenerID {
|
||||
|
||||
if len(notificationListeners) > 1 {
|
||||
lastIndex := len(notificationListeners) - 1
|
||||
lastListener := notificationListeners[lastIndex]
|
||||
notificationListeners[i] = lastListener
|
||||
notificationListeners[lastIndex] = nil
|
||||
notificationListeners = notificationListeners[:lastIndex]
|
||||
} else {
|
||||
notificationListeners = make([]*NotificationListener, 0)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return errors.New("ListenerID not found, while trying to deregister it")
|
||||
}
|
||||
|
||||
func BroadcastNotification(notification *models.Notification) {
|
||||
|
||||
if notification == nil {
|
||||
return
|
||||
}
|
||||
|
||||
notificationLock.Lock()
|
||||
defer notificationLock.Unlock()
|
||||
|
||||
for _, listener := range notificationListeners {
|
||||
listener.channel <- notification
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user