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.set(@name, Time.now, "EX", @expiry, "NX").then do |result|
11 next els&.call if result.nil?
12
13 EMPromise.resolve(yield).catch do |err|
14 REDIS.del(@name)
15 EMPromise.reject(err)
16 end
17 end
18 end
19end