Latest lints, test wasm on dev channel (#81)
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 23167a3..d833956 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -62,3 +62,6 @@
- name: Run Chrome tests
run: dart test --platform chrome
if: always() && steps.install.outcome == 'success'
+ - name: Run Chrome tests - wasm
+ run: dart test --platform chrome -c dart2wasm
+ if: always() && steps.install.outcome == 'success' && matrix.sdk == 'dev'
diff --git a/lib/pool.dart b/lib/pool.dart
index 20ab8f1..70e9df1 100644
--- a/lib/pool.dart
+++ b/lib/pool.dart
@@ -239,23 +239,26 @@
/// an error, the returned future completes with that error.
///
/// This may be called more than once; it returns the same [Future] each time.
- Future close() => _closeMemo.runOnce(() {
- if (_closeGroup != null) return _closeGroup!.future;
+ Future close() => _closeMemo.runOnce(_close);
- _resetTimer();
+ Future<void> _close() {
+ if (_closeGroup != null) return _closeGroup!.future;
- _closeGroup = FutureGroup();
- for (var callback in _onReleaseCallbacks) {
- _closeGroup!.add(Future.sync(callback));
- }
+ _resetTimer();
- _allocatedResources -= _onReleaseCallbacks.length;
- _onReleaseCallbacks.clear();
+ _closeGroup = FutureGroup();
+ for (var callback in _onReleaseCallbacks) {
+ _closeGroup!.add(Future.sync(callback));
+ }
- if (_allocatedResources == 0) _closeGroup!.close();
- return _closeGroup!.future;
- });
- final _closeMemo = AsyncMemoizer();
+ _allocatedResources -= _onReleaseCallbacks.length;
+ _onReleaseCallbacks.clear();
+
+ if (_allocatedResources == 0) _closeGroup!.close();
+ return _closeGroup!.future;
+ }
+
+ final _closeMemo = AsyncMemoizer<void>();
/// If there are any pending requests, this will fire the oldest one.
void _onResourceReleased() {
@@ -272,7 +275,7 @@
/// If there are any pending requests, this will fire the oldest one after
/// running [onRelease].
- void _onResourceReleaseAllowed(Function() onRelease) {
+ void _onResourceReleaseAllowed(void Function() onRelease) {
_resetTimer();
if (_requestedResources.isNotEmpty) {
@@ -294,7 +297,7 @@
///
/// Futures returned by [_runOnRelease] always complete in the order they were
/// created, even if earlier [onRelease] callbacks take longer to run.
- Future<PoolResource> _runOnRelease(Function() onRelease) {
+ Future<PoolResource> _runOnRelease(void Function() onRelease) {
Future.sync(onRelease).then((value) {
_onReleaseCompleters.removeFirst().complete(PoolResource._(this));
}).catchError((Object error, StackTrace stackTrace) {
@@ -367,7 +370,7 @@
/// This is useful when a resource's main function is complete, but it may
/// produce additional information later on. For example, an isolate's task
/// may be complete, but it could still emit asynchronous errors.
- void allowRelease(Function() onRelease) {
+ void allowRelease(FutureOr<void> Function() onRelease) {
if (_released) {
throw StateError('A PoolResource may only be released once.');
}
diff --git a/pubspec.yaml b/pubspec.yaml
index 08e4027..7fb5021 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -13,6 +13,6 @@
stack_trace: ^1.10.0
dev_dependencies:
- dart_flutter_team_lints: ^1.0.0
+ dart_flutter_team_lints: ^2.0.0
fake_async: ^1.2.0
test: ^1.16.0
diff --git a/test/pool_test.dart b/test/pool_test.dart
index 2dd90f4..6334a8a 100644
--- a/test/pool_test.dart
+++ b/test/pool_test.dart
@@ -41,7 +41,7 @@
// This will only complete once [lastAllocatedResource] is released.
expect(pool.request(), completes);
- Future.delayed(const Duration(microseconds: 1)).then((_) {
+ Future<void>.delayed(const Duration(microseconds: 1)).then((_) {
lastAllocatedResource.release();
});
});
@@ -55,7 +55,7 @@
test('can be called freely up to the limit', () {
var pool = Pool(50);
for (var i = 0; i < 50; i++) {
- pool.withResource(expectAsync0(() => Completer().future));
+ pool.withResource(expectAsync0(() => Completer<void>().future));
}
});
@@ -63,7 +63,7 @@
FakeAsync().run((async) {
var pool = Pool(50);
for (var i = 0; i < 50; i++) {
- pool.withResource(expectAsync0(() => Completer().future));
+ pool.withResource(expectAsync0(() => Completer<void>().future));
}
pool.withResource(expectNoAsync());
@@ -75,20 +75,20 @@
FakeAsync().run((async) {
var pool = Pool(50);
for (var i = 0; i < 49; i++) {
- pool.withResource(expectAsync0(() => Completer().future));
+ pool.withResource(expectAsync0(() => Completer<void>().future));
}
- var completer = Completer();
+ var completer = Completer<void>();
pool.withResource(() => completer.future);
var blockedResourceAllocated = false;
pool.withResource(() {
blockedResourceAllocated = true;
});
- Future.delayed(const Duration(microseconds: 1)).then((_) {
+ Future<void>.delayed(const Duration(microseconds: 1)).then((_) {
expect(blockedResourceAllocated, isFalse);
completer.complete();
- return Future.delayed(const Duration(microseconds: 1));
+ return Future<void>.delayed(const Duration(microseconds: 1));
}).then((_) {
expect(blockedResourceAllocated, isTrue);
});
@@ -128,7 +128,7 @@
// This will only complete once [lastAllocatedResource] is released.
expect(pool.request(), completes);
- Future.delayed(const Duration(seconds: 3)).then((_) {
+ Future<void>.delayed(const Duration(seconds: 3)).then((_) {
lastAllocatedResource.release();
expect(pool.request(), doesNotComplete);
});
@@ -146,7 +146,7 @@
}
expect(pool.request(), doesNotComplete);
- Future.delayed(const Duration(seconds: 3)).then((_) {
+ Future<void>.delayed(const Duration(seconds: 3)).then((_) {
expect(pool.request(), doesNotComplete);
});
@@ -177,11 +177,11 @@
var resource = await pool.request();
var onReleaseCalled = false;
resource.allowRelease(() => onReleaseCalled = true);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(onReleaseCalled, isFalse);
expect(pool.request(), completes);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(onReleaseCalled, isTrue);
});
@@ -195,7 +195,7 @@
var onReleaseCalled = false;
resource.allowRelease(() => onReleaseCalled = true);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(onReleaseCalled, isTrue);
});
@@ -206,13 +206,13 @@
var requestComplete = false;
unawaited(pool.request().then((_) => requestComplete = true));
- var completer = Completer();
+ var completer = Completer<void>();
resource.allowRelease(() => completer.future);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(requestComplete, isFalse);
completer.complete();
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(requestComplete, isTrue);
});
@@ -228,21 +228,21 @@
unawaited(pool.request().then((_) => request2Complete = true));
var onRelease1Called = false;
- var completer1 = Completer();
+ var completer1 = Completer<void>();
resource1.allowRelease(() {
onRelease1Called = true;
return completer1.future;
});
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(onRelease1Called, isTrue);
var onRelease2Called = false;
- var completer2 = Completer();
+ var completer2 = Completer<void>();
resource2.allowRelease(() {
onRelease2Called = true;
return completer2.future;
});
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(onRelease2Called, isTrue);
expect(request1Complete, isFalse);
expect(request2Complete, isFalse);
@@ -251,12 +251,12 @@
// was triggered by the second blocking request, it should complete the
// first one to preserve ordering.
completer2.complete();
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(request1Complete, isTrue);
expect(request2Complete, isFalse);
completer1.complete();
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
expect(request1Complete, isTrue);
expect(request2Complete, isTrue);
});
@@ -286,7 +286,7 @@
var resource = await pool.request();
resource.release();
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
});
group('close()', () {
@@ -313,7 +313,7 @@
var pool = Pool(1);
var resource1 = await pool.request();
- var completer = Completer();
+ var completer = Completer<void>();
expect(
pool.request().then((resource2) {
expect(completer.isCompleted, isTrue);
@@ -323,7 +323,7 @@
expect(pool.close(), completes);
resource1.allowRelease(() => completer.future);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
completer.complete();
});
@@ -347,11 +347,11 @@
resource1Released = true;
resource1.release();
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
resource2Released = true;
resource2.release();
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
var resource3 = await resource3Future;
resource3Released = true;
@@ -364,7 +364,7 @@
// Set up an onRelease callback whose completion is controlled by
// [completer].
- var completer = Completer();
+ var completer = Completer<void>();
resource.allowRelease(() => completer.future);
expect(
pool.request().then((_) {
@@ -372,10 +372,10 @@
}),
completes);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
unawaited(pool.close());
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
completer.complete();
});
@@ -384,9 +384,9 @@
var resource1 = await pool.request();
var resource2 = await pool.request();
- var completer1 = Completer();
+ var completer1 = Completer<void>();
resource1.allowRelease(() => completer1.future);
- var completer2 = Completer();
+ var completer2 = Completer<void>();
resource2.allowRelease(() => completer2.future);
expect(
@@ -396,10 +396,10 @@
}),
completes);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
completer1.complete();
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
completer2.complete();
});
@@ -407,17 +407,17 @@
var pool = Pool(1);
var resource = await pool.request();
- var completer = Completer();
+ var completer = Completer<void>();
expect(
pool.close().then((_) {
expect(completer.isCompleted, isTrue);
}),
completes);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
resource.allowRelease(() => completer.future);
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
completer.complete();
});
@@ -425,13 +425,13 @@
var pool = Pool(1);
var resource = await pool.request();
- var completer = Completer();
+ var completer = Completer<void>();
resource.allowRelease(() => completer.future);
expect(pool.done, throwsA('oh no!'));
expect(pool.close(), throwsA('oh no!'));
- await Future.delayed(Duration.zero);
+ await Future<void>.delayed(Duration.zero);
completer.completeError('oh no!');
});
});
@@ -446,7 +446,7 @@
const delayedToStringDuration = Duration(milliseconds: 10);
Future<String> delayedToString(int i) =>
- Future.delayed(delayedToStringDuration, () => i.toString());
+ Future<String>.delayed(delayedToStringDuration, () => i.toString());
for (var itemCount in [0, 5]) {
for (var poolSize in [1, 5, 6]) {
@@ -505,7 +505,7 @@
'before the entire iterable is iterated.');
return i;
}), (i) async {
- await Future.delayed(Duration(milliseconds: i));
+ await Future<void>.delayed(Duration(milliseconds: i));
return i;
});
@@ -585,7 +585,7 @@
pool.close();
});
- await subscription.asFuture();
+ await subscription.asFuture<void>();
expect(dataCount, 100);
await subscription.cancel();
});
@@ -616,7 +616,7 @@
if (int.parse(data) % 3 == 1) {
subscription.pause(Future(() async {
- await Future.delayed(const Duration(milliseconds: 100));
+ await Future<void>.delayed(const Duration(milliseconds: 100));
}));
}
},
@@ -690,7 +690,7 @@
pool = Pool(20);
var listFuture = pool.forEach(Iterable<int>.generate(100), (i) async {
- await Future.delayed(const Duration(milliseconds: 10));
+ await Future<void>.delayed(const Duration(milliseconds: 10));
if (i == 10) {
throw UnsupportedError('10 is not supported');
}
@@ -705,7 +705,7 @@
var list = await pool.forEach(Iterable<int>.generate(100),
(int i) async {
- await Future.delayed(const Duration(milliseconds: 10));
+ await Future<void>.delayed(const Duration(milliseconds: 10));
if (i % 10 == 0) {
throw UnsupportedError('Multiples of 10 not supported');
}