UNPKG

the-shepherd

Version:

Control a herd of wild processes.

108 lines (94 loc) 2.7 kB
// Generated by CoffeeScript 1.8.0 (function() { var $, Fs, HJson, Helpers, Os, Process, Shell, log, pid, port; $ = require('bling'); Fs = require('fs'); Os = require('os'); Shell = require('shelljs'); HJson = require('hjson'); Process = require('./process'); Helpers = module.exports; log = $.logger("[helper]"); Helpers.readJson = function(file, p) { if (p == null) { p = $.Promise(); } p.wait(function(err, obj) { if (err) { return log("readJson(" + file + ") failed:", err); } }); Fs.readFile(file, function(err, data) { var _err; if (err) { return p.reject(err); } try { p.resolve(HJson.parse(String(data))); } catch (_error) { _err = _error; p.reject(_err); } return null; }); return p; }; Helpers.delay = function(ms) { var p; p = $.Promise(); $.delay(ms, p.resolve); return p; }; Helpers.portIsOwned = function(pid, port, timeout, verbose) { var p, poll_port, started; try { return p = $.Promise(); } finally { started = $.now; (poll_port = function() { var target_pids; if ($.now - started > timeout) { return p.reject("Waiting failed after a timeout of: " + timeout + "ms"); } target_pids = []; return Process.clearCache().findOne({ pid: pid }).then(function(proc) { if (!proc) { return p.reject("no such pid: " + pid); } else { return Process.tree(proc).then(function(tree) { Process.walk(tree, function(node) { return target_pids.push(node.pid); }); if (verbose) { log("Waiting for targets:", target_pids); } return Process.findOne({ ports: port }).then((function(owner) { if (verbose) { log("Port", port, "currently owned by", owner != null ? owner.pid : void 0); } if ((!owner) || (!$.matches(owner.pid, target_pids))) { return setTimeout(poll_port, 300); } else { return p.resolve(owner); } }), p.reject); }); } }); })(); } }; if (require.main === module) { if (process.argv.length < 4) { return; } port = parseInt(process.argv[2], 10); pid = parseInt(process.argv[3], 10); Process = require("./process"); Helpers.portIsOwned(pid, port, 3000).then($.log, console.error.bind(console)); } }).call(this);