From 8cf19721efc88a90b33650573f293793fe8c56ba Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Wed, 10 Jun 2026 10:50:59 +0200 Subject: [PATCH] Include name of navigator lock on abort --- packages/sqlite_async/CHANGELOG.md | 4 +++ .../sqlite_async/lib/src/web/web_mutex.dart | 3 +- .../sqlite_async/test/web/web_mutex_test.dart | 29 +++++++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/packages/sqlite_async/CHANGELOG.md b/packages/sqlite_async/CHANGELOG.md index 0463f97..367af19 100644 --- a/packages/sqlite_async/CHANGELOG.md +++ b/packages/sqlite_async/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.14.3 (unreleased) + +- Include identifier of mutexes when a navigator lock attempt is aborted. + ## 0.14.2 - Support versions `0.8.x` of `package:sqlite3_web`. diff --git a/packages/sqlite_async/lib/src/web/web_mutex.dart b/packages/sqlite_async/lib/src/web/web_mutex.dart index e165b92..065d87e 100644 --- a/packages/sqlite_async/lib/src/web/web_mutex.dart +++ b/packages/sqlite_async/lib/src/web/web_mutex.dart @@ -72,7 +72,8 @@ class WebMutexImpl implements Mutex { if (abortTrigger != null) { abortTrigger.whenComplete(() { if (!gotLock.isCompleted) { - gotLock.completeError(AbortException('getWebLock')); + gotLock + .completeError(AbortException('getWebLock($resolvedIdentifier)')); controller.abort('aborted in Dart'.toJS); } }); diff --git a/packages/sqlite_async/test/web/web_mutex_test.dart b/packages/sqlite_async/test/web/web_mutex_test.dart index 261551e..92f8cde 100644 --- a/packages/sqlite_async/test/web/web_mutex_test.dart +++ b/packages/sqlite_async/test/web/web_mutex_test.dart @@ -1,8 +1,12 @@ @TestOn('browser') library; +import 'dart:async'; + +import 'package:sqlite_async/sqlite_async.dart'; import 'package:sqlite_async/src/web/web_mutex.dart'; import 'package:test/test.dart'; +import 'package:web/web.dart'; import '../utils/test_utils_impl.dart'; @@ -28,5 +32,30 @@ void main() { // It should be correctly ordered as if it was the same mutex expect(results, equals([1, 2])); }); + + test('can abort acquiring navigator locks', () async { + final lockName = window.crypto.randomUUID(); + final m1 = WebMutexImpl(identifier: lockName); + final m2 = WebMutexImpl(identifier: lockName); + + final hasM1 = Completer(); + final releaseM1 = Completer(); + m1.lock(() { + hasM1.complete(); + return releaseM1.future; + }); + + await hasM1.future; + expect( + m2.lock( + expectAsync0(() async {}, count: 0), + abortTrigger: Future.delayed(Duration.zero), + ), + throwsA( + isA() + .having((e) => e.toString(), 'toString()', contains(lockName)), + ), + ); + }); }); }