pause method
Transitions the service into ServiceState.PAUSE_SUCCESS by running listeners from providePauseListeners.
Contract:
- Calling pause before init (state is
NOT_INITIALIZED) resolves to Err. Pausing an uninitialized service is a lifecycle bug; without this guard a caller could reachPAUSE_SUCCESSwithout ever running init listeners. - Calling pause after dispose resolves to Err — disposed is terminal.
- Calling pause while already paused is a no-op Ok (idempotent).
- Otherwise: listeners run; state transitions to
PAUSE_ATTEMPTthenPAUSE_SUCCESS/PAUSE_ERROR. WitheagerErrorfalse(default), all listeners run even if earlier ones error.
Implementation
@nonVirtual
Resolvable<Unit> pause({bool eagerError = false}) {
return _sequencer.then((prev) {
assert(
!state.didDispose(),
'$runtimeType.pause: cannot be called after dispose; state is $state.',
);
if (state.didDispose()) {
return Sync<Option>.err(
Err('pause: cannot be called after dispose; state is $state.'),
);
}
assert(
state != ServiceState.NOT_INITIALIZED,
'$runtimeType.pause: service has not been initialized. '
'Call init() first.',
);
if (state == ServiceState.NOT_INITIALIZED) {
return Sync<Option>.err(
Err('pause: service has not been initialized. '
'Call init() first.'),
);
}
if (state.didPause()) {
return Sync<Option>.okValue(const None());
}
return _updateState(
providerFunction: providePauseListeners,
eagerError: eagerError,
attemptState: ServiceState.PAUSE_ATTEMPT,
successState: ServiceState.PAUSE_SUCCESS,
errorState: ServiceState.PAUSE_ERROR,
phaseName: 'pause',
);
}).toUnit();
}