Files
biomedjs/node_modules/piler/lib/livecss.coffee
2014-09-14 07:04:16 -04:00

100 lines
2.3 KiB
CoffeeScript

fs = require "fs"
try
socketio = require('socket.io')
catch e
socketio = null
incUrlSeq = (url) ->
seqRegexp = /(--([0-9]+))\..*$/
match = url.match seqRegexp
seq = parseInt match?[2] or 0, 10
if match
cleanUrl = url.replace match[1], ""
else
cleanUrl = url
cleanUrl = cleanUrl.substr(0,cleanUrl.lastIndexOf('.'))+"--#{ seq+1 }"+cleanUrl.substr(cleanUrl.lastIndexOf('.'))
# Yep, this function will be executed in the browser.
clientUpdater = ->
console.log "CSS updater is active. Waiting for connection..."
pile = io.connect('/pile')
pile.on "connect", ->
console.log "CSS updater has connected"
pile.on "disconnect", ->
console.log "CSS updater has disconnected! Refresh to reconnect"
pile.on "update", (fileId) ->
elem = document.getElementById "pile-" + fileId
if elem
console.log "updating", fileId, elem
elem.href = PILE.incUrlSeq elem.href
else
console.log "id", fileId, "not found"
class LiveUpdateMixin
installSocketIo: (userio) ->
@addUrl "/socket.io/socket.io.js"
@addOb PILE:
incUrlSeq: incUrlSeq
@addExec clientUpdater
if not userio
io = socketio.listen @app
else
io = userio
# Why does not work?
io.configure ->
io.set 'log level', 0
@io = io.of "/pile"
liveUpdate: (cssmanager, userio) ->
if @production
@logger.info "Not activating live update in production"
return
if not @app
throw new Error 'JSManager must be bind to a http server (Express app)
before it can live update CSS'
@installSocketIo userio
listener = if @server then @server else @app
listener.on "listening", =>
@logger.info "Activating CSS updater"
for k, pile of cssmanager.piles
for codeOb in pile.code
@_watch pile, codeOb
_watch: (pile, codeOb) ->
return unless codeOb.type is "file"
@logger.info "watching #{ codeOb.filePath } for changes"
fs.watch codeOb.filePath, =>
@logger.info "updated", codeOb.filePath
@io.emit "update", codeOb.getId()
# For testing
LiveUpdateMixin.incUrlSeq = incUrlSeq
if socketio?
module.exports = LiveUpdateMixin
else
module.exports = class LiveUpdateDisabled
liveUpdate: ->
@logger.error "No socket.io installed. Live update won't work."