Sha256: d8017aa9d42d98b6b2870e28ec443f5211b8a9c5ca96c0293e75c4b91ddaa8c4

Contents?: true

Size: 1.36 KB

Versions: 2

Compression:

Stored size: 1.36 KB

Contents

class Chunk
  constructor: (@raw) ->

  rawText: ->
    @raw

  text: ->
    @_text ||= AnsiStream.strip(@raw)

  rawLines: ->
    @_rawLines ||= @raw.split(/\r?\n/)

  lines: ->
    @_lines ||= @text().split(/\r?\n/)

class Stream
  INTERVAL = 1000
  MAX_RETRIES = 15

  constructor: ->
    @url = null
    @eventListeners = {}
    @retries = 0
    @status = 'running'

  init: ({url, text, status}) ->
    @status = status
    @broadcastChunk(text)
    @start(url)

  poll: =>
    jQuery.ajax @url,
      success: @success
      error: @error

  success: (response) =>
    @retries = 0
    @broadcastChunks(response.chunks)
    @broadcastStatus(response.task)
    @start(response.url || false)

  broadcastStatus: (task) ->
    if task.status != @status
      @status = task.status
      for handler in @listeners('status')
        handler(task)

  broadcastChunk: (raw) ->
    chunk = new Chunk(raw)
    for handler in @listeners('chunk')
      handler(chunk)

  broadcastChunks: (chunks) ->
    @broadcastChunk((c.text for c in chunks).join(''))

  error: (response) =>
    @start() if 600 > response.status >= 500 && (@retries += 1) < MAX_RETRIES

  start: (url = @url) ->
    if @url = url
      setTimeout(@poll, INTERVAL)

  addEventListener: (type, handler) ->
    @listeners(type).push(handler)

  listeners: (type) ->
    @eventListeners[type] ||= []

@OutputStream = new Stream

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
shipit-engine-0.1.0 app/assets/javascripts/task/output_stream.js.coffee
shipit-engine-0.0.1.pre app/assets/javascripts/task/output_stream.js.coffee