applyCall method
应用快照,返回是否有变化:只应用版本号比本地大的(每个都是完整快照,版本号跳了也直接应用);给出 self 时总是应用。
Implementation
bool applyCall(JsonMap rawCall, {Object? self = absentArg, JsonMap? inviter, Object? group = absentArg, JsonMap? change}) {
final call = Call(freezeMap(rawCall));
final snap = snapshot;
final newer = call.version > snap.call.version || snap.self == null;
if (!newer && identical(self, absentArg)) return false;
final effective = newer ? call : snap.call;
final me = _me;
final member = me == null ? null : effective.member(me);
final given = self is Map ? self.cast<String, Object?>() : null;
var selfJson = given ?? snap.self?.raw;
if (member != null) {
final joined = member.state == 'joined';
selfJson = {
...?selfJson,
'state': member.state,
'joined_on_this_device': joined && (selfJson?['joined_on_this_device'] == true || _session != null || _holding),
};
}
// 振铃:本人为 ringing 且没到 ring_expires_at;已在其他设备接听、被取消、结束的停止
final expires = member?.ringExpiresAt;
final ringing = effective.status != 'ended' &&
member?.state == 'ringing' &&
change?['kind'] != 'answered_elsewhere' &&
(expires == null || expires.millisecondsSinceEpoch > _core.serverNow());
_set(
call: effective,
self: selfJson == null ? null : (identical(selfJson, snap.self?.raw) ? snap.self : CallSelf(freezeMap(selfJson))),
inviter: inviter == null ? null : CallInviter(freezeMap(inviter)),
group: identical(group, absentArg) ? absentArg : (group is Map ? CallGroup(freezeMap(group.cast<String, Object?>())) : null),
ringing: ringing,
);
_scheduleRingStop(member);
if (effective.status == 'ended') {
unawaited(teardown(false));
} else if (_session != null && member != null && member.state != 'joined') {
unawaited(teardown(false));
}
return true;
}