emitAndWaitSideEffect<V> method

Future<V> emitAndWaitSideEffect<V>(
  1. JEffect<V> effect, {
  2. Duration? timeout,
})

Emits a JEffect and waits for its completion or timeout. Missing listeners and disposal fail with StateError. This does not cancel UI handlers or external operations that have already started.

Implementation

Future<V> emitAndWaitSideEffect<V>(
  JEffect<V> effect, {
  Duration? timeout,
}) async {
  // An explicitly awaited fire-and-forget effect also needs a listener.
  if (mounted &&
      _effectBufferSize == 0 &&
      !_sideEffectController.hasListener) {
    _failEffect(effect, _missingListenerError(effect));
    return effect.result;
  }
  // Emit the effect
  emitSideEffect(effect);
  if (effect is JFireAndForgetEffect) _trackEffect(effect);

  // Apply timeout if configured
  final appliedTimeout = timeout ?? JEffectsConfig().defaultTimeout;

  // If no timeout is set, return the effect's result immediately
  if (appliedTimeout == null) return effect.result;

  // Apply timeout logic
  return effect.result.timeout(
    appliedTimeout,
    onTimeout: () {
      final error = TimeoutException(
        'Effect ${effect.runtimeType} (id=${effect.id}) timed out after $appliedTimeout',
        appliedTimeout,
      );
      if (!effect.isCompleted) {
        effect.completeError(error);
      }
      throw error;
    },
  );
}