travis-web/assets/scripts/lib/travis/chunk_buffer.coffee
Piotr Sarnacki f1adbf8f20 Improve log handling
* don't fetch log content on Travis.Log init
* use timeout in ChunkBuffer instead of Ember.run.later
* remove timeout when log is finalized
2013-03-22 01:25:23 +01:00

97 lines
2.2 KiB
CoffeeScript

get = Ember.get
Travis.ChunkBuffer = Em.ArrayProxy.extend
timeout: 5000
checkTimeoutFrequency: 5000
start: 1
next: 1
init: ->
@_super.apply this, arguments
@lastInsert = 0
@set('next', @get('start'))
@checkTimeout()
if @get('content.length')
@get('queue.content').pushObjects @get('content').toArray()
arrangedContent: (->
[]
).property('content')
addObject: (obj) ->
@get('content').pushObject(obj)
removeObject: (obj) ->
@get('content').removeObject(obj)
replaceContent: (idx, amt, objects) ->
@get('content').replace(idx, amt, objects)
queue: (->
Em.ArrayProxy.extend(Em.SortableMixin, {
content: []
sortProperties: ['number']
sortAscending: true
}).create()
).property()
contentArrayDidChange: (array, index, removedCount, addedCount) ->
@_super.apply this, arguments
if addedCount
queue = @get('queue')
addedObjects = array.slice(index, index + addedCount)
console.log 'Added log parts with numbers:', addedObjects.map( (element) -> get(element, 'number') )+'', 'current', @get('next')
queue.pushObjects addedObjects
@check()
check: ->
queue = @get('queue')
next = @get('next')
arrangedContent = @get('arrangedContent')
toPush = []
while queue.get('firstObject.number') <= next
element = queue.shiftObject()
if get(element, 'number') == next
@finalize() if get(element, 'final')
toPush.pushObject get(element, 'content')
next += 1
if toPush.length
arrangedContent.pushObjects toPush
@inserted()
@set('next', next)
inserted: ->
now = @now()
@lastInsert = now
finalize: ->
clearTimeout @get('runLaterId')
checkTimeout: ->
now = @now()
if now - @lastInsert > @get('timeout')
@giveUpOnMissingParts()
@set 'runLaterId', setTimeout((=> @checkTimeout()), @get('checkTimeoutFrequency'))
willDestroy: ->
@finalize()
@_super.apply this, arguments
now: ->
(new Date()).getTime()
giveUpOnMissingParts: ->
if number = @get('queue.firstObject.number')
console.log 'Giving up on missing parts in the buffer, switching to:', number
@set('next', number)
@check()