pause method

  1. @nonVirtual
Resolvable<Unit> pause({
  1. bool eagerError = false,
})
inherited

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 reach PAUSE_SUCCESS without 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_ATTEMPT then PAUSE_SUCCESS / PAUSE_ERROR. With eagerError false (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();
}