expiring_lock.rb
1# frozen_string_literal: true
2
3class ExpiringLock
4 def initialize(name, expiry: 60 * 60 * 24)
5 @name = name
6 @expiry = expiry
7 end
8
9 def with(els=nil)
10 REDIS.exists(@name).then do |exists|
11 next els&.call if exists == 1
12
13 EMPromise.resolve(yield).then do |rval|
14 REDIS.setex(@name, @expiry, Time.now).then { rval }
15 end
16 end
17 end
18end