112:f4a4878c99a3
Anton Shestakov <av6@dwimlabs.net>, Thu, 07 Apr 2016 22:56:16 +0800
index: check if roster has the item before removing it Sometimes we get events from contacts that are not in user's roster, trying to remove such contacts used to fail before this patch.

next change 142:d702edce24b7
previous change 58:7326ef07b362

coffee/calls.coffee

Permissions: -rw-r--r--

Other formats: Feeds:
class Tram.Call extends Backbone.Model
idAttribute: 'jid'
initialize: ->
@on('change:local/stream', @updateLocalStreamURL)
@on('change:remote/stream', @updateRemoteStreamURL)
updateStreamURL: (sattr, uattr) ->
if @has(uattr)
URL.revokeObjectURL(@get(uattr))
stream = @get(sattr)
if stream
@set(uattr, URL.createObjectURL(stream))
else
@unset(uattr)
updateLocalStreamURL: ->
@updateStreamURL('local/stream', 'local/stream/url')
updateRemoteStreamURL: ->
@updateStreamURL('remote/stream', 'remote/stream/url')
class Tram.Calls extends Backbone.Collection
model: Tram.Call
class Tram.CallView extends Backbone.View
tagName: 'div'
className: 'video-block'
template: $('#video-block-template').html()
events:
'click [data-mute-cam]': -> @model.set('local/video/muted', true)
'click [data-unmute-cam]': -> @model.set('local/video/muted', false)
'click [data-mute-mic]': -> @model.set('local/audio/muted', true)
'click [data-unmute-mic]': -> @model.set('local/audio/muted', false)
'click [data-mute-audio]': -> @model.set('remote/audio/muted', true)
'click [data-unmute-audio]': -> @model.set('remote/audio/muted', false)
initialize: ->
@$el.html(@template)
@$local = @$('video.local')
@$remote = @$('video.remote')
@bind()
bind: ->
@listenTo(@model, 'change:local/stream/url', @updateLocal)
@listenTo(@model, 'change:remote/stream/url', @updateRemote)
@listenTo(@model, 'change:local/video/muted', @muteCam)
@listenTo(@model, 'change:local/audio/muted', @muteMic)
@listenTo(@model, 'change:remote/audio/muted', @muteAudio)
updateLocal: ->
if @model.has('local/stream/url')
@updateVideo(@$local, @model.get('local/stream/url'))
else
@removeVideo(@$local)
updateRemote: ->
if @model.has('remote/stream/url')
@updateVideo(@$remote, @model.get('remote/stream/url'))
else
@removeVideo(@$remote)
updateVideo: ($video, url) ->
$video.each ->
@src = url
@play()
removeVideo: ($video) ->
$video.each ->
@pause()
@removeAttribute('src')
enableTracks: (tracks, state) ->
if tracks?
for track in tracks
track.enabled = state
muteCam: ->
muted = @model.get('local/video/muted')
@enableTracks(@model.get('local/stream')?.getVideoTracks?(), not muted)
muteMic: ->
muted = @model.get('local/audio/muted')
@enableTracks(@model.get('local/stream')?.getAudioTracks?(), not muted)
muteAudio: ->
muted = @model.get('remote/audio/muted')
@enableTracks(@model.get('remote/stream')?.getAudioTracks?(), not muted)
render: ->
@rivet = rivets.bind(@el, model: @model, view: this)
@
remove: ->
@rivet.unbind()
super
class Tram.CallsApp extends Backbone.View
initialize: ->
@listenTo(@collection, 'add', @onAdd)
@listenTo(@collection, 'remove', @onRemove)
onAdd: (model) ->
model.view = new Tram.CallView(model: model)
@$el.append model.view.render().el
onRemove: (model) ->
model.view.remove()