go-mongo/resolvers/resolver.go

57 lines
914 B
Go

//go:generate go run generate.go
package resolvers
import (
"context"
"encoding/json"
"log"
"github.com/redis/go-redis/v9"
)
// This file will not be regenerated automatically.
//
// It serves as dependency injection for your app, add any dependencies you require here.
type Resolver struct {
Redis *redis.Client
}
func Subscribe[T any](ctx context.Context, redis *redis.Client, event string) (<-chan *T, error) {
clientChannel := make(chan *T, 1)
go func() {
sub := redis.Subscribe(ctx, event)
if _, err := sub.Receive(ctx); err != nil {
return
}
serverChannel := sub.Channel()
for {
select {
case message := <-serverChannel:
var obj *T
if err := json.Unmarshal([]byte(message.Payload), &obj); err != nil {
log.Print(err)
return
}
clientChannel <- obj
case <-ctx.Done():
sub.Close()
return
}
}
}()
return clientChannel, nil
}