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