-- ARGV = [current time in seconds, ttl in seconds, services ...]
local current_time = ARGV[1]
local ttl = ARGV[2]
local changed = false

-- update the service list
for i = 3, #ARGV, 1 do
    redis.call('HSET', KEYS[1], ARGV[i], current_time + ttl)
    changed = true
end

-- retrieve all the services, removing any that have expired
local svcs = {}
local kvs = redis.call('HGETALL', KEYS[1])
for i = 1, #kvs, 2 do
    if kvs[i + 1] < current_time then
        redis.call('HDEL', KEYS[1], kvs[i])
        changed = true
    else
        table.insert(svcs, kvs[i])
    end
end

if changed then
    redis.call('PUBLISH', KEYS[2], current_time)
end

return svcs