transitionTo method
- 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();
}
}