| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.changeDelay = void 0;
- const content = `--[[
- Change job delay when it is in delayed set.
- Input:
- KEYS[1] delayed key
- KEYS[2] meta key
- KEYS[3] marker key
- KEYS[4] events stream
- ARGV[1] delay
- ARGV[2] timestamp
- ARGV[3] the id of the job
- ARGV[4] job key
- Output:
- 0 - OK
- -1 - Missing job.
- -3 - Job not in delayed set.
- Events:
- - delayed key.
- ]]
- local rcall = redis.call
- -- Includes
- --[[
- Add delay marker if needed.
- ]]
- -- Includes
- --[[
- Function to return the next delayed job timestamp.
- ]]
- local function getNextDelayedTimestamp(delayedKey)
- local result = rcall("ZRANGE", delayedKey, 0, 0, "WITHSCORES")
- if #result then
- local nextTimestamp = tonumber(result[2])
- if nextTimestamp ~= nil then
- return nextTimestamp / 0x1000
- end
- end
- end
- local function addDelayMarkerIfNeeded(markerKey, delayedKey)
- local nextTimestamp = getNextDelayedTimestamp(delayedKey)
- if nextTimestamp ~= nil then
- -- Replace the score of the marker with the newest known
- -- next timestamp.
- rcall("ZADD", markerKey, nextTimestamp, "1")
- end
- end
- --[[
- Bake in the job id first 12 bits into the timestamp
- to guarantee correct execution order of delayed jobs
- (up to 4096 jobs per given timestamp or 4096 jobs apart per timestamp)
- WARNING: Jobs that are so far apart that they wrap around will cause FIFO to fail
- ]]
- local function getDelayedScore(delayedKey, timestamp, delay)
- local delayedTimestamp = (delay > 0 and (tonumber(timestamp) + delay)) or tonumber(timestamp)
- local minScore = delayedTimestamp * 0x1000
- local maxScore = (delayedTimestamp + 1 ) * 0x1000 - 1
- local result = rcall("ZREVRANGEBYSCORE", delayedKey, maxScore,
- minScore, "WITHSCORES","LIMIT", 0, 1)
- if #result then
- local currentMaxScore = tonumber(result[2])
- if currentMaxScore ~= nil then
- if currentMaxScore >= maxScore then
- return maxScore, delayedTimestamp
- else
- return currentMaxScore + 1, delayedTimestamp
- end
- end
- end
- return minScore, delayedTimestamp
- end
- --[[
- Function to get max events value or set by default 10000.
- ]]
- local function getOrSetMaxEvents(metaKey)
- local maxEvents = rcall("HGET", metaKey, "opts.maxLenEvents")
- if not maxEvents then
- maxEvents = 10000
- rcall("HSET", metaKey, "opts.maxLenEvents", maxEvents)
- end
- return maxEvents
- end
- if rcall("EXISTS", ARGV[4]) == 1 then
- local jobId = ARGV[3]
- local delay = tonumber(ARGV[1])
- local score, delayedTimestamp = getDelayedScore(KEYS[1], ARGV[2], delay)
- local numRemovedElements = rcall("ZREM", KEYS[1], jobId)
- if numRemovedElements < 1 then
- return -3
- end
- rcall("HSET", ARGV[4], "delay", delay)
- rcall("ZADD", KEYS[1], score, jobId)
- local maxEvents = getOrSetMaxEvents(KEYS[2])
- rcall("XADD", KEYS[4], "MAXLEN", "~", maxEvents, "*", "event", "delayed",
- "jobId", jobId, "delay", delayedTimestamp)
- -- mark that a delayed job is available
- addDelayMarkerIfNeeded(KEYS[3], KEYS[1])
- return 0
- else
- return -1
- end`;
- exports.changeDelay = {
- name: 'changeDelay',
- content,
- keys: 4,
- };
- //# sourceMappingURL=changeDelay-4.js.map
|