events: add event manager
This commit is contained in:
parent
3c002e993d
commit
ef9ed26d8f
|
@ -15,6 +15,7 @@ import (
|
|||
|
||||
"github.com/emersion/hydroxide/auth"
|
||||
"github.com/emersion/hydroxide/carddav"
|
||||
"github.com/emersion/hydroxide/events"
|
||||
"github.com/emersion/hydroxide/protonmail"
|
||||
smtpbackend "github.com/emersion/hydroxide/smtp"
|
||||
)
|
||||
|
@ -155,6 +156,8 @@ func main() {
|
|||
port = "8080"
|
||||
}
|
||||
|
||||
eventsManager := events.NewManager()
|
||||
|
||||
sessions := auth.NewManager(newClient)
|
||||
handlers := make(map[string]http.Handler)
|
||||
|
||||
|
@ -183,9 +186,9 @@ func main() {
|
|||
|
||||
h, ok := handlers[username]
|
||||
if !ok {
|
||||
events := make(chan *protonmail.Event)
|
||||
go receiveEvents(c, "", events)
|
||||
h = carddav.NewHandler(c, privateKeys, events)
|
||||
ch := make(chan *protonmail.Event)
|
||||
eventsManager.Register(c, username, ch)
|
||||
h = carddav.NewHandler(c, privateKeys, ch)
|
||||
|
||||
handlers[username] = h
|
||||
}
|
||||
|
|
|
@ -0,0 +1,68 @@
|
|||
package events
|
||||
|
||||
import (
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/emersion/hydroxide/protonmail"
|
||||
)
|
||||
|
||||
const pollInterval = time.Minute
|
||||
|
||||
type receiver struct {
|
||||
channels []chan<- *protonmail.Event
|
||||
locker sync.Mutex
|
||||
}
|
||||
|
||||
func (r *receiver) receiveEvents(c *protonmail.Client, last string) {
|
||||
t := time.NewTicker(pollInterval)
|
||||
defer t.Stop()
|
||||
|
||||
for range t.C {
|
||||
event, err := c.GetEvent(last)
|
||||
if err != nil {
|
||||
log.Println("cannot receive event:", err)
|
||||
continue
|
||||
}
|
||||
|
||||
if event.ID == last {
|
||||
continue
|
||||
}
|
||||
last = event.ID
|
||||
|
||||
r.locker.Lock()
|
||||
for _, ch := range r.channels {
|
||||
ch <- event
|
||||
}
|
||||
r.locker.Unlock()
|
||||
}
|
||||
}
|
||||
|
||||
type Manager struct {
|
||||
receivers map[string]*receiver
|
||||
locker sync.Mutex
|
||||
}
|
||||
|
||||
func NewManager() *Manager {
|
||||
return &Manager{
|
||||
receivers: make(map[string]*receiver),
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Manager) Register(c *protonmail.Client, username string, ch chan<- *protonmail.Event) {
|
||||
m.locker.Lock()
|
||||
defer m.locker.Unlock()
|
||||
|
||||
if r, ok := m.receivers[username]; ok {
|
||||
r.locker.Lock()
|
||||
r.channels = append(r.channels, ch)
|
||||
r.locker.Unlock()
|
||||
} else {
|
||||
r = &receiver{
|
||||
channels: []chan<- *protonmail.Event{ch},
|
||||
}
|
||||
go r.receiveEvents(c, "")
|
||||
m.receivers[username] = r
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue