class SidekiqUniqueJobs::LockDigest

@author Mikael Henriksson <mikael@mhenrixon.com>
Handles uniqueness of sidekiq arguments

def self.call(item)

Returns:
  • (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

Returns:
  • (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

Returns:
  • (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)

Parameters:
  • 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

Returns:
  • (String) - a unique digest
def lock_digest
  @lock_digest ||= create_digest
end

def unique_across_queues?

Returns:
  • (true, false) -
def unique_across_queues?
  item[UNIQUE_ACROSS_QUEUES] || job_options[UNIQUE_ACROSS_QUEUES]
end

def unique_across_workers?

Returns:
  • (true, false) -
def unique_across_workers?
  item[UNIQUE_ACROSS_WORKERS] || job_options[UNIQUE_ACROSS_WORKERS]
end