20 lines
637 B
Ruby
20 lines
637 B
Ruby
# Atomic dedup lock for WhatsApp incoming messages.
|
|
#
|
|
# Meta can deliver the same webhook event multiple times. This lock uses
|
|
# Redis SET NX EX to ensure only one worker processes a given source_id.
|
|
class Whatsapp::MessageDedupLock
|
|
KEY_PREFIX = Redis::RedisKeys::MESSAGE_SOURCE_KEY
|
|
DEFAULT_TTL = 1.day.to_i
|
|
|
|
def initialize(source_id, ttl: DEFAULT_TTL)
|
|
@key = format(KEY_PREFIX, id: source_id)
|
|
@ttl = ttl
|
|
end
|
|
|
|
# Returns true when the lock is acquired (caller should proceed).
|
|
# Returns false when another worker already holds the lock.
|
|
def acquire!
|
|
::Redis::Alfred.set(@key, true, nx: true, ex: @ttl)
|
|
end
|
|
end
|