messages property Null safety

Stream<Message> messages

A stream of Message

Implementation

Stream<Message> get messages {
  late StreamController<Message> controller;
  bool canYield = true;

  void tick() async {
    var subscription = _mercure.listen((event) async {
      if (controller.isClosed) {
        return;
      }
      try {
        if (!canYield) return;
        var encodedData = jsonDecode(event.data);
        if (encodedData['@type'] == 'Account') {
          return;
        }
        Map<String, dynamic> data = await Requests.get<Map>(
          '/messages/${encodedData['id']}',
          auths[id]!.headers,
        ) as Map<String, dynamic>;
        data['intro'] = encodedData['intro'];
        controller.add(messageFromJson(data));
      } catch (e) {
        controller.addError(e);
      }
    });
    Timer.periodic(Duration(seconds: 3), (timer) async {
      if (controller.isClosed) {
        timer.cancel();
        await subscription.cancel();
      }
    });
  }

  tick();
  void listen() {
    canYield = true;
  }

  void pause() {
    canYield = false;
  }

  Future<void> cancel() async {
    canYield = false;
    await controller.close();
    return;
  }

  controller = StreamController<Message>(
    onListen: listen,
    onPause: pause,
    onResume: listen,
    onCancel: cancel,
  );

  return controller.stream;
}