73 lines
1.7 KiB
JavaScript
73 lines
1.7 KiB
JavaScript
var http = require("http")
|
|
, shoe = require("shoe")
|
|
, path = require("path")
|
|
, watchr = require("watchr")
|
|
, bundle = require("browserify-server")
|
|
, openStreams = []
|
|
|
|
module.exports = LiveReloadServer
|
|
|
|
function LiveReloadServer(options) {
|
|
var server = http.createServer(serveText)
|
|
, sock = shoe(handleStream)
|
|
, uri = options.uri || process.cwd()
|
|
, filterIgnored = options.ignore || noop
|
|
, delay = options.delay || 1000
|
|
, port = options.port || 9090
|
|
, timer
|
|
, source = bundle(path.join(__dirname, "reload.js"), {
|
|
body: "require('./browser.js')(" + port + ")"
|
|
})
|
|
|
|
watchr.watch({
|
|
path: uri
|
|
, listener: reload
|
|
, ignoreHiddenFiles: true
|
|
, ignorePatterns: true
|
|
})
|
|
|
|
sock.install(server, "/shoe")
|
|
|
|
server.listen(port)
|
|
|
|
console.log("live reload server listening on port", port
|
|
, "reloading on files", uri)
|
|
|
|
|
|
function serveText(req, res) {
|
|
res.setHeader("content-type", "application/javascript")
|
|
res.end(source)
|
|
}
|
|
|
|
function handleStream(stream) {
|
|
openStreams.push(stream)
|
|
|
|
stream.on("end", remove)
|
|
|
|
function remove() {
|
|
var index = openStreams.indexOf(stream)
|
|
if (index !== -1) {
|
|
openStreams.splice(index, 1)
|
|
}
|
|
}
|
|
}
|
|
|
|
function reload(fileName) {
|
|
if (timer) {
|
|
clearTimeout(timer)
|
|
}
|
|
|
|
timer = setTimeout(function () {
|
|
if (!filterIgnored(fileName)) {
|
|
openStreams.forEach(sendMessage)
|
|
}
|
|
}, delay)
|
|
}
|
|
|
|
function sendMessage(stream) {
|
|
stream && stream.write("reload")
|
|
}
|
|
}
|
|
|
|
function noop() {}
|