routePres method
Process presence change message
Implementation
void routePres(PresMessage pres) {
TopicSubscription? user;
switch (pres.what) {
case 'del':
// Delete cached messages.
processDelMessages(pres.clear!, pres.delseq!);
break;
case 'on':
case 'off':
// Update online status of a subscription.
user = _users[pres.src];
if (user != null) {
user.online = pres.what == 'on';
} else {
_loggerService.warn('Presence update for an unknown user' +
(name ?? '') +
' ' +
(pres.src ?? ''));
}
break;
case 'term':
// Attachment to topic is terminated probably due to cluster rehashing.
resetSubscription();
break;
case 'acs':
var userId = pres.src ?? _authService.userId;
user = _users[userId];
if (user == null) {
// Update for an unknown user: notification of a new subscription.
AccessMode? acs = AccessMode(null).updateAll(pres.dacs);
if (acs.mode != NONE) {
user = _cacheManager.getUser(userId ?? '');
// ignore: unnecessary_null_comparison
if (user == null) {
user = TopicSubscription(user: userId, acs: acs);
getMeta(startMetaQuery().withOneSub(null, userId).build());
} else {
user.acs = acs;
}
user.updated = DateTime.now();
processMetaSub([user]);
}
} else {
// Known user
user.acs!.updateAll(pres.dacs);
// Update user's access mode.
processMetaSub([
TopicSubscription(
user: userId, updated: DateTime.now(), acs: user.acs)
]);
}
break;
default:
_loggerService.log('Ignored presence update ' + (pres.what ?? ''));
}
onPres.add(pres);
}