acquire method

Future<UniqueTaskClaim> acquire({
  1. required Envelope envelope,
  2. required TaskOptions options,
})

Attempts to claim uniqueness for envelope using options.

Implementation

Future<UniqueTaskClaim> acquire({
  required Envelope envelope,
  required TaskOptions options,
}) async {
  final ttl = _resolveTtl(options, envelope);
  final uniqueKey = _resolveUniqueKey(envelope);
  final owner = envelope.id;
  final lockKey = _lockKey(uniqueKey);

  final lock = await lockStore.acquire(lockKey, ttl: ttl, owner: owner);
  if (lock != null) {
    return UniqueTaskClaim._(
      uniqueKey: uniqueKey,
      owner: owner,
      ttl: ttl,
      status: UniqueTaskClaimStatus.acquired,
    );
  }

  final existingOwner = await lockStore.ownerOf(lockKey);
  if (existingOwner == null) {
    // Retry once in case the previous owner expired between calls.
    final retryLock = await lockStore.acquire(
      lockKey,
      ttl: ttl,
      owner: owner,
    );
    if (retryLock != null) {
      return UniqueTaskClaim._(
        uniqueKey: uniqueKey,
        owner: owner,
        ttl: ttl,
        status: UniqueTaskClaimStatus.acquired,
      );
    }
    final retryOwner = await lockStore.ownerOf(lockKey);
    return UniqueTaskClaim._(
      uniqueKey: uniqueKey,
      owner: owner,
      ttl: ttl,
      status: UniqueTaskClaimStatus.duplicate,
      existingTaskId: retryOwner,
    );
  }

  return UniqueTaskClaim._(
    uniqueKey: uniqueKey,
    owner: owner,
    ttl: ttl,
    status: UniqueTaskClaimStatus.duplicate,
    existingTaskId: existingOwner,
  );
}