SubscribeProviderReload refreshes once, then on AI provider changes.
( ctx context.Context, ps dbpubsub.Pubsub, reloader ProviderReloader, logger slog.Logger, )
| 17 | |
| 18 | // SubscribeProviderReload refreshes once, then on AI provider changes. |
| 19 | func SubscribeProviderReload( |
| 20 | ctx context.Context, |
| 21 | ps dbpubsub.Pubsub, |
| 22 | reloader ProviderReloader, |
| 23 | logger slog.Logger, |
| 24 | ) (func(), error) { |
| 25 | if ps == nil { |
| 26 | return nil, xerrors.New("pubsub is required") |
| 27 | } |
| 28 | if reloader == nil { |
| 29 | return nil, xerrors.New("reloader is required") |
| 30 | } |
| 31 | |
| 32 | unsubscribe, err := ps.SubscribeWithErr(pubsub.AIProvidersChangedChannel, func(cbCtx context.Context, _ []byte, err error) { |
| 33 | if err != nil { |
| 34 | logger.Warn(cbCtx, "ai providers changed event delivered with error", slog.Error(err)) |
| 35 | return |
| 36 | } |
| 37 | if err := reloader.Reload(cbCtx); err != nil { |
| 38 | logger.Warn(cbCtx, "reload ai provider snapshot from pubsub event", slog.Error(err)) |
| 39 | return |
| 40 | } |
| 41 | logger.Debug(cbCtx, "reloaded ai provider snapshot from pubsub event") |
| 42 | }) |
| 43 | if err != nil { |
| 44 | return nil, xerrors.Errorf("subscribe to %s: %w", pubsub.AIProvidersChangedChannel, err) |
| 45 | } |
| 46 | if err := reloader.Reload(ctx); err != nil { |
| 47 | logger.Warn(ctx, "initial ai provider reload", slog.Error(err)) |
| 48 | } |
| 49 | return unsubscribe, nil |
| 50 | } |