transitionTo method

Future<void> transitionTo(
  1. IpfsPowerMode targetMode
)

Explicitly transitions the coordinator and underlying IPFS node to targetMode.

Implementation

Future<void> transitionTo(IpfsPowerMode targetMode) async {
  while (_transitionLock != null) {
    await _transitionLock!.future;
  }

  if (_currentPowerMode == targetMode) return;

  _transitionLock = Completer<void>();
  try {
    _logger.info(
      'Transitioning power mode: $_currentPowerMode -> $targetMode',
    );

    switch (targetMode) {
      case IpfsPowerMode.fullActive:
        reprovider?.resume();
        break;

      case IpfsPowerMode.lowPower:
        if (autoScaleSwarm && networkManager != null) {
          try {
            await networkManager!.trimConnections(
              maxConnections: maxLowPowerConnections,
            );
          } catch (e) {
            _logger.warning(
              'Failed to trim connections in lowPower mode: $e',
            );
          }
        }
        break;

      case IpfsPowerMode.suspendedMesh:
        if (pauseReproviderOnBackground) {
          reprovider?.pause();
        }
        if (flushBlockStoreOnBackground && blockStore != null) {
          try {
            await blockStore!.flush();
          } catch (e) {
            _logger.warning('Failed to flush blockstore on pause: $e');
          }
        }
        if (autoScaleSwarm && networkManager != null) {
          try {
            await networkManager!.trimConnections(
              maxConnections: maxBackgroundConnections,
            );
          } catch (e) {
            _logger.warning(
              'Failed to trim connections in suspendedMesh mode: $e',
            );
          }
        }
        break;
    }

    _currentPowerMode = targetMode;
    if (!_powerModeController.isClosed) {
      _powerModeController.add(targetMode);
    }
    _logger.debug('Power mode transition to $targetMode complete');
  } finally {
    final lock = _transitionLock;
    _transitionLock = null;
    lock?.complete();
  }
}