applyCall method

bool applyCall(
  1. JsonMap rawCall, {
  2. Object? self = absentArg,
  3. JsonMap? inviter,
  4. Object? group = absentArg,
  5. JsonMap? change,
})

应用快照,返回是否有变化:只应用版本号比本地大的(每个都是完整快照,版本号跳了也直接应用);给出 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;
}