--[[ 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