--- /dev/null
+var http = require('http')
+
+var constant = require('./constants')
+var helper = require('./helper')
+var cfg = require('./config')
+
+var parseExitCode = function (buffer, defaultCode) {
+ var tailPos = buffer.length - Buffer.byteLength(constant.EXIT_CODE) - 1
+
+ if (tailPos < 0) {
+ return defaultCode
+ }
+
+ // tail buffer which might contain the message
+ var tail = buffer.slice(tailPos)
+ var tailStr = tail.toString()
+ if (tailStr.substr(0, tailStr.length - 1) === constant.EXIT_CODE) {
+ tail.fill('\x00')
+ return parseInt(tailStr.substr(-1), 10)
+ }
+
+ return defaultCode
+}
+
+// TODO(vojta): read config file (port, host, urlRoot)
+exports.run = function (config, done) {
+ done = helper.isFunction(done) ? done : process.exit
+ config = cfg.parseConfig(config.configFile, config)
+
+ var exitCode = 1
+ var options = {
+ hostname: config.hostname,
+ path: config.urlRoot + 'run',
+ port: config.port,
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ }
+
+ var request = http.request(options, function (response) {
+ response.on('data', function (buffer) {
+ exitCode = parseExitCode(buffer, exitCode)
+ process.stdout.write(buffer)
+ })
+
+ response.on('end', function () {
+ done(exitCode)
+ })
+ })
+
+ request.on('error', function (e) {
+ if (e.code === 'ECONNREFUSED') {
+ console.error('There is no server listening on port %d', options.port)
+ done(1)
+ } else {
+ throw e
+ }
+ })
+
+ request.end(JSON.stringify({
+ args: config.clientArgs,
+ removedFiles: config.removedFiles,
+ changedFiles: config.changedFiles,
+ addedFiles: config.addedFiles,
+ refresh: config.refresh
+ }))
+}