103 lines
4.7 KiB
Lua
103 lines
4.7 KiB
Lua
--[[
|
|
Function to debounce a job.
|
|
]]
|
|
-- Includes
|
|
--- @include "removeJobKeys"
|
|
|
|
local function removeDelayedJob(delayedKey, deduplicationKey, eventsKey, maxEvents, currentDeduplicatedJobId,
|
|
jobId, deduplicationId, prefix)
|
|
if rcall("ZREM", delayedKey, currentDeduplicatedJobId) > 0 then
|
|
removeJobKeys(prefix .. currentDeduplicatedJobId)
|
|
rcall("XADD", eventsKey, "*", "event", "removed", "jobId", currentDeduplicatedJobId,
|
|
"prev", "delayed")
|
|
|
|
-- TODO remove debounced event in next breaking change
|
|
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "debounced", "jobId",
|
|
jobId, "debounceId", deduplicationId)
|
|
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "deduplicated", "jobId",
|
|
jobId, "deduplicationId", deduplicationId, "deduplicatedJobId", currentDeduplicatedJobId)
|
|
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
local function deduplicateJob(deduplicationOpts, jobId, delayedKey, deduplicationKey, eventsKey, maxEvents,
|
|
prefix)
|
|
local deduplicationId = deduplicationOpts and deduplicationOpts['id']
|
|
if deduplicationId then
|
|
local ttl = deduplicationOpts['ttl']
|
|
if deduplicationOpts['replace'] then
|
|
if ttl and ttl > 0 then
|
|
local currentDebounceJobId = rcall('GET', deduplicationKey)
|
|
if currentDebounceJobId then
|
|
local isRemoved = removeDelayedJob(delayedKey, deduplicationKey, eventsKey, maxEvents,
|
|
currentDebounceJobId, jobId, deduplicationId, prefix)
|
|
if isRemoved then
|
|
if deduplicationOpts['extend'] then
|
|
rcall('SET', deduplicationKey, jobId, 'PX', ttl)
|
|
else
|
|
rcall('SET', deduplicationKey, jobId, 'KEEPTTL')
|
|
end
|
|
return
|
|
else
|
|
return currentDebounceJobId
|
|
end
|
|
else
|
|
rcall('SET', deduplicationKey, jobId, 'PX', ttl)
|
|
return
|
|
end
|
|
else
|
|
local currentDebounceJobId = rcall('GET', deduplicationKey)
|
|
if currentDebounceJobId then
|
|
local isRemoved = removeDelayedJob(delayedKey, deduplicationKey, eventsKey, maxEvents,
|
|
currentDebounceJobId, jobId, deduplicationId, prefix)
|
|
|
|
if isRemoved then
|
|
rcall('SET', deduplicationKey, jobId)
|
|
return
|
|
else
|
|
return currentDebounceJobId
|
|
end
|
|
else
|
|
rcall('SET', deduplicationKey, jobId)
|
|
return
|
|
end
|
|
end
|
|
else
|
|
local deduplicationKeyExists
|
|
if ttl and ttl > 0 then
|
|
if deduplicationOpts['extend'] then
|
|
local currentDebounceJobId = rcall('GET', deduplicationKey)
|
|
if currentDebounceJobId then
|
|
rcall('SET', deduplicationKey, currentDebounceJobId, 'PX', ttl)
|
|
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "debounced",
|
|
"jobId", currentDebounceJobId, "debounceId", deduplicationId)
|
|
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "deduplicated", "jobId",
|
|
currentDebounceJobId, "deduplicationId", deduplicationId, "deduplicatedJobId", jobId)
|
|
return currentDebounceJobId
|
|
else
|
|
rcall('SET', deduplicationKey, jobId, 'PX', ttl)
|
|
return
|
|
end
|
|
else
|
|
deduplicationKeyExists = not rcall('SET', deduplicationKey, jobId, 'PX', ttl, 'NX')
|
|
end
|
|
else
|
|
deduplicationKeyExists = not rcall('SET', deduplicationKey, jobId, 'NX')
|
|
end
|
|
|
|
if deduplicationKeyExists then
|
|
local currentDebounceJobId = rcall('GET', deduplicationKey)
|
|
-- TODO remove debounced event in next breaking change
|
|
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "debounced", "jobId",
|
|
currentDebounceJobId, "debounceId", deduplicationId)
|
|
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", "deduplicated", "jobId",
|
|
currentDebounceJobId, "deduplicationId", deduplicationId, "deduplicatedJobId", jobId)
|
|
return currentDebounceJobId
|
|
end
|
|
end
|
|
end
|
|
end
|