# frozen_string_literal: true require 'redis' module Pears module Provider # Config using redis subscription. This updates automatically upon Redis # channel updates. class Subscription < Base attr_reader :subscription def initialize(channel, redis_host: Pears.config.redis_host, &fetcher) @channel = channel @fetcher = fetcher establish_connection(redis_host) subscribe reload end def reload @data = @fetcher.call(Pears::Providers::Builder.new(self)) .data end # This seems a bit "rough" of an approach. we should check if # unsubscribing can be done more gracefully. def unsubscribe @subscription.terminate end private def subscribe @subscription = Thread.new do connection.subscribe(@channel) do |on| on.message do |channel, message| reload end end end end def connection @connection ||= establish_connection end def establish_connection(host='redis') @connection = ::Redis.new(host: host, reconnect_attempts: 10, reconnect_delay: 5) end end end end