Skip to content

Commit 1cb2949

Browse files
committed
+Fix potential sequncer conflict issue
1 parent dcb1126 commit 1cb2949

3 files changed

Lines changed: 58 additions & 59 deletions

File tree

lib/src/services/service.dart

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ mixin ServiceMixin {
3636
/// The current state of the service.
3737
ServiceState get state => _state;
3838

39-
@protected
40-
final sequencer = SafeSequencer();
39+
final _sequencer = SafeSequencer();
4140

4241
var _didEverInitAndSuccessfully = false;
4342
bool get didEverInitAndSuccessfully => _didEverInitAndSuccessfully;
@@ -48,7 +47,7 @@ mixin ServiceMixin {
4847

4948
@nonVirtual
5049
Resolvable<Unit> init({bool eagerError = true}) {
51-
return sequencer.addSafe((prev) {
50+
return _sequencer.addSafe((prev) {
5251
assert(!state.didDispose());
5352
if (state.didDispose()) {
5453
return Sync.value(prev);
@@ -79,7 +78,7 @@ mixin ServiceMixin {
7978

8079
@nonVirtual
8180
Resolvable<Unit> pause({bool eagerError = false}) {
82-
return sequencer.addSafe((prev) {
81+
return _sequencer.addSafe((prev) {
8382
assert(!state.didDispose());
8483
if (state.didDispose()) {
8584
return Sync.value(prev);
@@ -107,7 +106,7 @@ mixin ServiceMixin {
107106

108107
@nonVirtual
109108
Resolvable<Unit> resume({bool eagerError = false}) {
110-
return sequencer.addSafe((prev) {
109+
return _sequencer.addSafe((prev) {
111110
assert(!state.didDispose());
112111
if (state.didDispose()) {
113112
return Sync.value(prev);
@@ -135,7 +134,7 @@ mixin ServiceMixin {
135134

136135
@nonVirtual
137136
Resolvable<Unit> dispose({bool eagerError = false}) {
138-
return sequencer.addSafe((prev) {
137+
return _sequencer.addSafe((prev) {
139138
assert(!state.didDispose());
140139
if (state.didDispose()) {
141140
return Sync.value(prev);
@@ -165,10 +164,10 @@ mixin ServiceMixin {
165164
required ServiceState errorState,
166165
void Function()? onSuccessMustNotThrow,
167166
}) {
168-
sequencer.addSafe((prev1) {
167+
_sequencer.addSafe((prev1) {
169168
_state = attemptState;
170169
for (final listener in providerFunction(null)) {
171-
sequencer.addSafe((prev2) {
170+
_sequencer.addSafe((prev2) {
172171
switch (prev2) {
173172
case Err(error: final error):
174173
assert(false, error);
@@ -183,7 +182,7 @@ mixin ServiceMixin {
183182
}
184183
return Sync.value(prev1);
185184
}).end();
186-
return sequencer.addSafe((prev3) {
185+
return _sequencer.addSafe((prev3) {
187186
if (_state == attemptState) {
188187
_state = successState;
189188
onSuccessMustNotThrow?.call();
@@ -195,8 +194,7 @@ mixin ServiceMixin {
195194

196195
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
197196

198-
typedef TServiceResolvables<TParams> =
199-
List<Resolvable<Unit> Function(TParams data)>;
197+
typedef TServiceResolvables<TParams> = List<Resolvable<Unit> Function(TParams data)>;
200198

201199
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
202200

@@ -230,23 +228,23 @@ enum ServiceState {
230228
//
231229

232230
bool didRun() => [
233-
ServiceState.RUN_ATTEMPT,
234-
ServiceState.RUN_SUCCESS,
235-
ServiceState.RUN_ERROR,
236-
].contains(this);
231+
ServiceState.RUN_ATTEMPT,
232+
ServiceState.RUN_SUCCESS,
233+
ServiceState.RUN_ERROR,
234+
].contains(this);
237235
bool didPause() => [
238-
ServiceState.PAUSE_ATTEMPT,
239-
ServiceState.PAUSE_SUCCESS,
240-
ServiceState.PAUSE_ERROR,
241-
].contains(this);
236+
ServiceState.PAUSE_ATTEMPT,
237+
ServiceState.PAUSE_SUCCESS,
238+
ServiceState.PAUSE_ERROR,
239+
].contains(this);
242240
bool didResume() => [
243-
ServiceState.RESUME_ATTEMPT,
244-
ServiceState.RESUME_SUCCESS,
245-
ServiceState.RESUME_ERROR,
246-
].contains(this);
241+
ServiceState.RESUME_ATTEMPT,
242+
ServiceState.RESUME_SUCCESS,
243+
ServiceState.RESUME_ERROR,
244+
].contains(this);
247245
bool didDispose() => [
248-
ServiceState.DISPOSE_ATTEMPT,
249-
ServiceState.DISPOSE_SUCCESS,
250-
ServiceState.DISPOSE_ERROR,
251-
].contains(this);
246+
ServiceState.DISPOSE_ATTEMPT,
247+
ServiceState.DISPOSE_SUCCESS,
248+
ServiceState.DISPOSE_ERROR,
249+
].contains(this);
252250
}

lib/src/services/stream_service.dart

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ import '/_common.dart';
1414

1515
// ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
1616

17-
abstract class StreamService<TData extends Object>
18-
with ServiceMixin, StreamServiceMixin<TData> {
17+
abstract class StreamService<TData extends Object> with ServiceMixin, StreamServiceMixin<TData> {
1918
StreamService();
2019
}
2120

@@ -27,14 +26,12 @@ mixin StreamServiceMixin<TData extends Object> on ServiceMixin {
2726
//
2827

2928
Option<SafeCompleter<TData>> _initDataCompleter = const None();
30-
Option<Resolvable<TData>> get initialData =>
31-
_initDataCompleter.map((e) => e.resolvable());
29+
Option<Resolvable<TData>> get initialData => _initDataCompleter.map((e) => e.resolvable());
3230

3331
Option<StreamSubscription<Result<TData>>> _streamSubscription = const None();
3432

3533
Option<StreamController<Result<TData>>> _streamController = const None();
36-
Option<Stream<Result<TData>>> get stream =>
37-
_streamController.map((c) => c.stream);
34+
Option<Stream<Result<TData>>> get stream => _streamController.map((c) => c.stream);
3835

3936
//
4037
//
@@ -111,6 +108,7 @@ mixin StreamServiceMixin<TData extends Object> on ServiceMixin {
111108
Resolvable<Unit> stopStream() {
112109
UNSAFE:
113110
{
111+
final sequencer = SafeSequencer();
114112
final prevSubscription = _streamSubscription;
115113
_streamSubscription = const None();
116114
if (prevSubscription.isSome()) {
@@ -153,34 +151,37 @@ mixin StreamServiceMixin<TData extends Object> on ServiceMixin {
153151
bool eagerError = false,
154152
}) {
155153
UNSAFE:
156-
return sequencer.addSafe((prev1) {
157-
assert(!state.didDispose());
158-
if (state.didDispose()) {
159-
return Sync.value(prev1);
160-
}
161-
sequencer.addSafe((_) {
162-
return Resolvable(() {
163-
if (_streamController.isSome()) {
164-
_streamController.unwrap().add(data);
165-
}
166-
return _initDataCompleter.map(
167-
(e) => e.resolve(Sync.value(data)).value,
168-
);
169-
});
170-
}).end();
171-
provideOnPushToStreamListeners().map((listener) {
172-
sequencer.addSafe((prev2) {
173-
if (prev2.isErr()) {
174-
assert(prev2.isErr(), prev2.err().unwrap());
175-
if (eagerError) {
176-
return Sync.value(prev2);
154+
{
155+
final sequencer = SafeSequencer();
156+
return sequencer.addSafe((prev1) {
157+
assert(!state.didDispose());
158+
if (state.didDispose()) {
159+
return Sync.value(prev1);
160+
}
161+
sequencer.addSafe((_) {
162+
return Resolvable(() {
163+
if (_streamController.isSome()) {
164+
_streamController.unwrap().add(data);
177165
}
178-
}
179-
return listener(data).map((e) => prev2).flatten2();
166+
return _initDataCompleter.map(
167+
(e) => e.resolve(Sync.value(data)).value,
168+
);
169+
});
180170
}).end();
171+
provideOnPushToStreamListeners().map((listener) {
172+
sequencer.addSafe((prev2) {
173+
if (prev2.isErr()) {
174+
assert(prev2.isErr(), prev2.err().unwrap());
175+
if (eagerError) {
176+
return Sync.value(prev2);
177+
}
178+
}
179+
return listener(data).map((e) => prev2).flatten2();
180+
}).end();
181+
});
182+
return Sync.value(prev1);
181183
});
182-
return Sync.value(prev1);
183-
});
184+
}
184185
}
185186

186187
//

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ repository: https://github.com/robmllze/df_di
1616
funding:
1717
- https://www.buymeacoffee.com/dev_cetera
1818
description: A pragmatic dependency injection (DI) system, coupled with service classes for seamless state management in Dart.
19-
version: 0.14.3
19+
version: 0.14.4
2020
topics:
2121
- get-it
2222
- dependency-injection

0 commit comments

Comments
 (0)