messages property Null safety

Stream<GWMessage> messages

A stream of GWMessage

Implementation

Stream<GWMessage> get messages {
  late StreamController<GWMessage> 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') {
          quota = encodedData['quota'];
          used = encodedData['used'];
          isDisabled = encodedData['isDisabled'];
          isDeleted = encodedData['isDeleted'];
          updatedAt = DateTime.parse(encodedData['updatedAt']);
          return;
        }
        Map<String, dynamic> data = await Requests.get<Map>(
          '/messages/${encodedData['id']}',
          auth,
        ) 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<GWMessage>(
    onListen: listen,
    onPause: pause,
    onResume: listen,
    onCancel: cancel,
  );

  return controller.stream;
}