Advertisement
Guest User

Untitled

a guest
Jan 17th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Swift 2.38 KB | None | 0 0
  1. public func sync(with remoteState: CallState) {
  2.         guard
  3.             !self.isFinished &&
  4.             remoteState.revision >= self.revision &&
  5.             (remoteState.localStreamEnabled != nil || remoteState.remoteStreamEnabled != nil)
  6.         else {
  7.             return
  8.         }
  9.  
  10.         self.revision = remoteState.revision
  11.  
  12.         var lastRemote = self.remote ?? State(local: false, remote: false)
  13.         if let localEnabled = remoteState.localStreamEnabled {
  14.             lastRemote.local = localEnabled
  15.             self.sync(remote: localEnabled, direction: .local)
  16.         }
  17.         if let remoteEnabled = remoteState.remoteStreamEnabled {
  18.             lastRemote.remote = remoteEnabled
  19.             self.sync(remote: remoteEnabled, direction: .remote)
  20.         }
  21.         self.remote = lastRemote
  22.  
  23.         self.updateState()
  24.         self.updateStatus(localUpdate: false)
  25.     }
  26.  
  27.     private func sync(remote state: Bool, direction: Direction) {
  28.         self.transition[direction.opposite] = state && !self.synced[direction.opposite] && !self.pending[direction.opposite]
  29.         self.synced[direction.opposite] = state && (self.synced[direction.opposite] || self.pending[direction.opposite])
  30.         self.pending[direction.opposite] = false
  31.     }
  32.  
  33.     public func set(localStreamEnabled: Bool?, remoteStreamEnabled: Bool?, increaseRevision: Bool) {
  34.         guard !self.isFinished && (localStreamEnabled != nil || remoteStreamEnabled != nil) else { return }
  35.         guard self.statusSubject.value == nil ||
  36.             (self.stateSubject.value.localStreamEnabled != localStreamEnabled ||
  37.             self.stateSubject.value.remoteStreamEnabled != remoteStreamEnabled)
  38.         else {
  39.             return
  40.         }
  41.  
  42.         if increaseRevision {
  43.             self.revision += 1
  44.         }
  45.  
  46.         if let localEnabled = localStreamEnabled {
  47.             self.set(local: localEnabled, direction: .local)
  48.         }
  49.         if let remoteEnabled = remoteStreamEnabled {
  50.             self.set(local: remoteEnabled, direction: .remote)
  51.         }
  52.  
  53.         self.updateState()
  54.         self.updateStatus(localUpdate: true)
  55.     }
  56.  
  57.     private func set(local state: Bool, direction: Direction) {
  58.         self.synced[direction] = state && self.remote?[direction.opposite] == true
  59.         self.pending[direction] = state && !self.synced[direction]
  60.         self.transition[direction] = false
  61.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement