messages property Null safety
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;
}