customer/internal/interface/sse/producer.go
2025-06-25 17:06:25 +03:00

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