start method
Start provisioning using request
Provisioning will not stop automatically. It needs to be stopped manually by calling stop method
Implementation
Future<void> start(ProvisioningRequest request) async {
if (running) {
throw ProvisioningException("Provisioning already runing");
}
final completer = Completer<void>();
final rPort = ReceivePort();
final worker =
_EspWorker(request: request, logger: _logger, protocol: _protocol);
rPort.listen((event) {
if (event is _EspWorkerEvent) {
switch (event.type) {
case _EspWorkerEventType.init:
(event.data as SendPort).send(worker);
break;
case _EspWorkerEventType.exception:
_logger.error(event.data);
if (!completer.isCompleted) {
// failed to start provisioner
completer.completeError(event.data);
} else {
_streamCtrl.sink.addError(event.data);
// stop provisioning on any runtime error
stop();
}
break;
case _EspWorkerEventType.started:
_logger.info("Provisioning started");
completer.complete();
break;
case _EspWorkerEventType.response:
_logger.info("Received response (${event.data}");
if (!_streamCtrl.isClosed) _streamCtrl.sink.add(event.data);
break;
}
} else {
_logger.warning("Unhandled message from isolate: $event");
}
});
_isolate = await Isolate.spawn(_provisioningIsolate, rPort.sendPort);
return completer.future;
}