acquireWriteLock method
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;
}
}