# frozen_string_literal: true class ExpiringLock def initialize(name, expiry: 60 * 60 * 24) @name = name @expiry = expiry end def with(els=nil) REDIS.set(@name, Time.now, "EX", @expiry, "NX").then do |result| next els&.call if result.nil? EMPromise.resolve(yield).catch do |err| REDIS.del(@name) EMPromise.reject(err) end end end end