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() }