Add chunk buffer
This commit is contained in:
parent
df02b714ec
commit
d549831c22
43
assets/scripts/lib/travis/chunk_buffer.coffee
Normal file
43
assets/scripts/lib/travis/chunk_buffer.coffee
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
Travis.ChunkBuffer = Em.ArrayProxy.extend
|
||||||
|
timeout: 15000
|
||||||
|
start: 0
|
||||||
|
next: 0
|
||||||
|
|
||||||
|
init: ->
|
||||||
|
@_super.apply this, arguments
|
||||||
|
|
||||||
|
if @get('content.length')
|
||||||
|
@get('queue.content').pushObjects @get('content').toArray()
|
||||||
|
|
||||||
|
arrangedContent: (->
|
||||||
|
[]
|
||||||
|
).property('content')
|
||||||
|
|
||||||
|
queue: (->
|
||||||
|
Em.ArrayProxy.create(Em.SortableMixin,
|
||||||
|
content: []
|
||||||
|
sortProperties: ['number']
|
||||||
|
sortAscending: true
|
||||||
|
)
|
||||||
|
).property()
|
||||||
|
|
||||||
|
contentArrayDidChange: (array, index, removedCount, addedCount) ->
|
||||||
|
console.log 'content array did change'
|
||||||
|
@_super.apply this, arguments
|
||||||
|
|
||||||
|
if addedCount
|
||||||
|
queue = @get('queue.content')
|
||||||
|
queue.pushObjects array.slice(index, index + addedCount)
|
||||||
|
@check()
|
||||||
|
|
||||||
|
check: ->
|
||||||
|
queue = @get('queue')
|
||||||
|
next = @get('next')
|
||||||
|
|
||||||
|
arrangedContent = @get('arrangedContent')
|
||||||
|
|
||||||
|
while queue.get('firstObject.number') == next
|
||||||
|
arrangedContent.pushObject queue.shiftObject().get('content')
|
||||||
|
next += 1
|
||||||
|
|
||||||
|
@set('next', next)
|
52
assets/scripts/spec/unit/chunk_buffer_spec.coffee
Normal file
52
assets/scripts/spec/unit/chunk_buffer_spec.coffee
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
createChunk = (number, content) ->
|
||||||
|
Em.Object.create(number: number, content: content)
|
||||||
|
|
||||||
|
describe 'Travis.ChunkBuffer', ->
|
||||||
|
it 'waits for parts to be in order before revealing them', ->
|
||||||
|
content = []
|
||||||
|
buffer = Travis.ChunkBuffer.create(content: content)
|
||||||
|
|
||||||
|
content.pushObject createChunk(2, "baz")
|
||||||
|
content.pushObject createChunk(1, "bar")
|
||||||
|
|
||||||
|
expect(buffer.get('length')).toEqual(0)
|
||||||
|
|
||||||
|
content.pushObject createChunk(0, "foo")
|
||||||
|
|
||||||
|
expect(buffer.get('length')).toEqual(3)
|
||||||
|
|
||||||
|
expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz'])
|
||||||
|
|
||||||
|
it 'ignores a part if it fails to be delivered within timeout', ->
|
||||||
|
expect 4
|
||||||
|
|
||||||
|
content = []
|
||||||
|
buffer = Travis.ChunkBuffer.create(content: content, timeout: 10)
|
||||||
|
|
||||||
|
content.pushObject createChunk(2, "baz")
|
||||||
|
|
||||||
|
expect(buffer.get('length')).toEqual(0)
|
||||||
|
|
||||||
|
content.pushObject createChunk(0, "foo")
|
||||||
|
|
||||||
|
expect(buffer.get('length')).toEqual(1)
|
||||||
|
|
||||||
|
stop()
|
||||||
|
setTimeout( (->
|
||||||
|
expect(buffer.get('length')).toEqual(2)
|
||||||
|
expect(buffer.toArray()).toEqual(['foo', 'bar', 'baz'])
|
||||||
|
), 20)
|
||||||
|
|
||||||
|
it 'works correctly when parts are passed as content', ->
|
||||||
|
content = [createChunk(1, 'bar')]
|
||||||
|
|
||||||
|
buffer = Travis.ChunkBuffer.create(content: content)
|
||||||
|
|
||||||
|
expect(buffer.get('length')).toEqual(0)
|
||||||
|
|
||||||
|
content.pushObject createChunk(0, "foo")
|
||||||
|
|
||||||
|
expect(buffer.get('length')).toEqual(2)
|
||||||
|
expect(buffer.toArray()).toEqual(['foo', 'bar'])
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user