class SidekiqUniqueJobs::LockDigest
@author Mikael Henriksson <mikael@mhenrixon.com>
Handles uniqueness of sidekiq arguments
def self.call(item)
-
(String)
- a unique digest for the given arguments
Parameters:
-
item
(Hash
) -- a sidekiq job hash
def self.call(item) new(item).lock_digest end
def create_digest
-
(String)
- a unique digest
def create_digest digest = if SidekiqUniqueJobs.config.digest_algorithm == :legacy OpenSSL::Digest::MD5.hexdigest(dump_json(digestable_hash.sort)) else OpenSSL::Digest.new("SHA3-256", dump_json(digestable_hash.sort)).hexdigest end "#{lock_prefix}:#{digest}" end
def digestable_hash
-
(Hash)
- to use for digest
def digestable_hash @item.slice(CLASS, QUEUE, LOCK_ARGS, APARTMENT).tap do |hash| hash.delete(QUEUE) if unique_across_queues? hash.delete(CLASS) if unique_across_workers? end end
def initialize(item)
-
item
(Hash
) -- a Sidekiq job hash
def initialize(item) @item = item @lock_args = item[LOCK_ARGS] || item[UNIQUE_ARGS] # TODO: Deprecate UNIQUE_ARGS @lock_prefix = item[LOCK_PREFIX] || item[UNIQUE_PREFIX] # TODO: Deprecate UNIQUE_PREFIX self.job_class = item[CLASS] end
def lock_digest
-
(String)
- a unique digest
def lock_digest @lock_digest ||= create_digest end
def unique_across_queues?
-
(true, false)
-
def unique_across_queues? item[UNIQUE_ACROSS_QUEUES] || job_options[UNIQUE_ACROSS_QUEUES] end
def unique_across_workers?
-
(true, false)
-
def unique_across_workers? item[UNIQUE_ACROSS_WORKERS] || job_options[UNIQUE_ACROSS_WORKERS] end