start method

Future<void> start(
  1. ProvisioningRequest request
)

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;
}