acquireWriteLock method

  1. @override
Future<bool> acquireWriteLock(
  1. Collection<I> collection,
  2. Duration timeout
)
override

Lock writes on Sembast using an asynchronous transaction block.

Implementation

@override
Future<bool> acquireWriteLock(
  Collection<I> collection,
  Duration timeout,
) async {
  await ensureInitialized;
  final dbPath = _getCollectionDbPath(collection);

  if (_activeLocks.containsKey(dbPath)) {
    return true;
  }

  final db = await _getDb(dbPath);
  final lock = _SembastTransactionLock();
  _activeLocks[dbPath] = lock;

  unawaited(() async {
    try {
      await db.transaction((txn) async {
        lock.txnReadyCompleter.complete(txn);
        await for (final action in lock.actionStream.stream) {
          await action(txn);
        }
      });
    } catch (e, stack) {
      if (!lock.txnReadyCompleter.isCompleted) {
        lock.txnReadyCompleter.completeError(e, stack);
      }
    } finally {
      lock.releaseCompleter.complete();
    }
  }());

  try {
    await lock.txnReadyCompleter.future.timeout(timeout);
    return true;
  } catch (_) {
    _activeLocks.remove(dbPath);
    await lock.actionStream.close();
    return false;
  }
}