generated from PenaSide/GolangTemplate
78 lines
1.4 KiB
Go
78 lines
1.4 KiB
Go
package sse
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/golang-queue/queue"
|
|
"github.com/golang-queue/queue/core"
|
|
"github.com/golang-queue/redisdb"
|
|
)
|
|
|
|
type SSEProducer struct {
|
|
queue *queue.Queue
|
|
}
|
|
|
|
type SSEMessageTask struct {
|
|
Message SSEEvent
|
|
}
|
|
|
|
// требует - github.com/golang-queue/queue
|
|
func (r *SSEMessageTask) Bytes() []byte {
|
|
b, _ := json.Marshal(r.Message)
|
|
return b
|
|
}
|
|
|
|
func NewSSEProducer(redisAddr string) (*SSEProducer, error) {
|
|
worker := redisdb.NewWorker(
|
|
redisdb.WithAddr(redisAddr),
|
|
redisdb.WithChannel(RedisKeySSEEvents),
|
|
redisdb.WithRunFunc(func(ctx context.Context, m core.TaskMessage) error {
|
|
return nil
|
|
}),
|
|
)
|
|
|
|
queue, err := queue.NewQueue(
|
|
queue.WithWorkerCount(1), // количество воркеров
|
|
queue.WithWorker(worker),
|
|
)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &SSEProducer{
|
|
queue: queue,
|
|
}, nil
|
|
}
|
|
|
|
// есть ли смысл на мульти отправку? c userid []slice по типу события
|
|
func (r *SSEProducer) SendEvent(userID, eventType string, data interface{}) error {
|
|
dataJSON, err := json.Marshal(data)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
message := SSEEvent{
|
|
UserID: userID,
|
|
EventType: eventType,
|
|
Data: dataJSON,
|
|
Timestamp: time.Now(),
|
|
}
|
|
|
|
task := &SSEMessageTask{
|
|
Message: message,
|
|
}
|
|
|
|
err = r.queue.Queue(task)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *SSEProducer) Stop() {
|
|
r.queue.Release()
|
|
}
|