mirror of https://github.com/docusealco/docuseal
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							75 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							75 lines
						
					
					
						
							1.7 KiB
						
					
					
				# frozen_string_literal: true
 | 
						|
 | 
						|
require 'puma/plugin'
 | 
						|
 | 
						|
# rubocop:disable Metrics
 | 
						|
Puma::Plugin.create do
 | 
						|
  def config(cfg)
 | 
						|
    return if cfg.instance_variable_get(:@options)[:workers] <= 0
 | 
						|
 | 
						|
    cfg.on_worker_boot { start_sidekiq! }
 | 
						|
 | 
						|
    cfg.on_worker_shutdown { @sidekiq&.stop }
 | 
						|
    cfg.on_refork { @sidekiq&.stop }
 | 
						|
  end
 | 
						|
 | 
						|
  def start(launcher)
 | 
						|
    launcher.events.on_booted do
 | 
						|
      next if Puma.stats_hash[:workers].to_i != 0
 | 
						|
 | 
						|
      start_sidekiq!
 | 
						|
    end
 | 
						|
 | 
						|
    launcher.events.on_stopped { Thread.new { @sidekiq&.stop }.join }
 | 
						|
    launcher.events.on_restart { Thread.new { @sidekiq&.stop }.join }
 | 
						|
  end
 | 
						|
 | 
						|
  def fire_event(config, event)
 | 
						|
    arr = config[:lifecycle_events][event]
 | 
						|
 | 
						|
    arr.each(&:call)
 | 
						|
 | 
						|
    arr.clear
 | 
						|
  end
 | 
						|
 | 
						|
  def start_sidekiq!
 | 
						|
    Thread.new do
 | 
						|
      wait_for_redis!
 | 
						|
 | 
						|
      configs = Sidekiq.configure_embed do |config|
 | 
						|
        config.logger.level = Logger::INFO
 | 
						|
        sidekiq_config = YAML.load_file('config/sidekiq.yml')
 | 
						|
        config.queues = sidekiq_config['queues']
 | 
						|
        config.concurrency = ENV.fetch('SIDEKIQ_THREADS', 5).to_i
 | 
						|
        config.merge!(sidekiq_config)
 | 
						|
        config[:max_retries] = 13
 | 
						|
 | 
						|
        ActiveSupport.run_load_hooks(:sidekiq_config, config)
 | 
						|
      end.instance_variable_get(:@config)
 | 
						|
 | 
						|
      fire_event(configs, :startup)
 | 
						|
 | 
						|
      @sidekiq = Sidekiq::Launcher.new(configs, embedded: true)
 | 
						|
 | 
						|
      @sidekiq.run
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  def wait_for_redis!
 | 
						|
    attempt = 0
 | 
						|
 | 
						|
    loop do
 | 
						|
      attempt += 1
 | 
						|
 | 
						|
      sleep (attempt - 1) / 10.0
 | 
						|
 | 
						|
      RedisClient.new(url: ENV.fetch('REDIS_URL', nil)).call('GET', '1')
 | 
						|
 | 
						|
      break
 | 
						|
    rescue RedisClient::CannotConnectError
 | 
						|
      raise('Unable to connect to redis') if attempt > 10
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
# rubocop:enable Metrics
 |