lives<R> method

  1. @override
Stream<Response<T>> lives<R>({
  1. bool onlyUpdatedData = false,
  2. Map<String, dynamic>? extra,
  3. R? source(
    1. R parent
    )?,
})
override

Implementation

@override
Stream<Response<T>> lives<R>({
  bool onlyUpdatedData = false,
  Map<String, dynamic>? extra,
  R? Function(R parent)? source,
}) async* {
  final controller = StreamController<Response<T>>();
  final response = Response<T>();
  try {
    if (extra != null && extra.isNotEmpty) {
      final value = await input(extra);
      if (value.isNotEmpty) {
        final url = currentSource(source);
        Timer.periodic(const Duration(milliseconds: 3000), (timer) async {
          final reference = encryptor.type == ApiRequest.get
              ? await database.get(url, data: value)
              : await database.post(url, data: value);
          final data = reference.data;
          final code = reference.statusCode;
          if ((code == 200 || code == encryptor.status.ok) &&
              data is List<dynamic>) {
            List<T> result = data.map((item) {
              return build(item);
            }).toList();
            controller.add(
              response.copy(result: result),
            );
          } else {
            final error = "Data unmodified [${reference.statusCode}]";
            controller.addError(
              response.copy(snapshot: reference, error: error),
            );
          }
        });
      } else {
        const error = "Unacceptable request!";
        controller.addError(
          response.copy(error: error),
        );
      }
    } else {
      const error = "Undefined request!";
      controller.addError(
        response.copy(error: error),
      );
    }
  } catch (_) {
    controller.addError(_);
  }

  controller.stream;
}