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