processAndEmitData function

Future<void> processAndEmitData(
  1. StreamController controller,
  2. List<String> dataLines,
  3. dynamic onSuccess(
    1. ChatStreamResponse
    ),
  4. dynamic onError(
    1. String
    ),
)

Implementation

Future<void> processAndEmitData(
    StreamController controller,
    List<String> dataLines,
    Function(ChatStreamResponse) onSuccess,
    Function(String) onError) async {
  for (String line in dataLines) {
    if (line.isEmpty || !line.startsWith(streamResponseStart)) {
      continue;
    }

    final String jsonData = line.substring(streamResponseStart.length);
    if (jsonData.contains('statusCode')) {
      controller.add(onError(jsonData));
      continue;
    }
    if (jsonData.contains(streamResponseEnd)) {
      debugPrint('Stream done');
      controller.close();
      return;
    }

    try {
      final Map<String, dynamic> decoded = jsonDecode(jsonData);
      final chatResponse = ChatStreamResponse.fromJson(decoded);
      controller.add(onSuccess(chatResponse));
    } catch (e) {
      debugPrint('processAndEmitData $e');
    }
  }
}