start method

Future<void> start()

Connect to the specified uri, parses the chunks, and add jpeg frame to stream to view.

Implementation

Future<void> start() async {
  if (_controller.isClosed) {
    logDebug('Stream controller closed.');

    return;
  }

  /// reset status, and cancel existing subscription
  _resetState();
  _subscription?.cancel();

  logDebug('Starting connection to [$uri].');

  try {
    final request = Request('GET', Uri.parse(uri));
    final response = await _client.send(request).timeout(timeout);

    if (response.statusCode >= 200 && response.statusCode < 300) {
      logDebug('Connected $uri - (status code: ${response.statusCode})');

      _subscription = response.stream.listen(
        _handleChunk,
        onDone: () {
          logDebug('Done received.');

          stop(closeController: true);
        },
        onError: (e, s) {
          logDebug('Error received - (error: $e)');

          _controller.addError(e, s);
          stop(closeController: true);
        },
        cancelOnError: true, // auto cancel on error
      );
    } else {
      logDebug(
        'Connection failed $uri - (status code: ${response.statusCode})',
      );

      if (!_controller.isClosed) {
        final error = Exception(
          'Connection failed $uri - (status code: ${response.statusCode})',
        );

        _controller.addError(error, StackTrace.current);
      }

      stop(closeController: true);
    }
  } catch (e, s) {
    logDebug('Exception during connection - $e');

    if (!_controller.isClosed) {
      _controller.addError(e, s);
    }

    stop(closeController: true);
  }
}