Source: modules/domain.js

/*global require, exports, Buffer */

/**
 * Brackets node domain
 * @module domain
 * @author Martin Zagora
 * @license MIT
 * @modified for use here
 */


(function () {
    "use strict";

    var ChildProcess = require("child_process"),
        domainName = "brackets-cardboard";

    function fixEOL(str) {
        if (str[str.length - 1] === "\n") {
            str = str.slice(0, -1);
        }
        return str;
    }

    // handler with ChildProcess.exec
    /**
     * Execute command with ChildProcess.exec
     * @param  {String}   directory Directory to execute command from
     * @param  {String}   command   Command
     * @param  {Array}    args      Command arguments
     * @param  {Function} callback  [description]
     */
    function execute(directory, command, args, callback) {
        // http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback
        ChildProcess.exec(command + " " + args.join(" "), {
            cwd: directory
        }, function (err, stdout, stderr) {
            callback(err ? fixEOL(stderr) : undefined, err ? undefined : fixEOL(stdout));
        });
    }

    // handler with ChildProcess.spawn
    function join(arr) {
        var result, index = 0, length;
        length = arr.reduce(function (l, b) {
            return l + b.length;
        }, 0);
        result = new Buffer(length);
        arr.forEach(function (b) {
            b.copy(result, index);
            index += b.length;
        });
        return fixEOL(result.toString("utf8"));
    }

    function spawn(directory, command, args, callback) {
        // https://github.com/creationix/node-git
        var child = ChildProcess.spawn(command, args, {
            cwd: directory
        });
        var exitCode, stdout = [], stderr = [];
        child.stdout.addListener("data", function (text) {
            stdout[stdout.length] = text;
        });
        child.stderr.addListener("data", function (text) {
            stderr[stderr.length] = text;
        });
        child.addListener("exit", function (code) {
            exitCode = code;
        });
        child.addListener("close", function () {
            callback(exitCode > 0 ? join(stderr) : undefined,
                     exitCode > 0 ? undefined : join(stdout));
        });
        child.stdin.end();
    }

    /**
     * Initializes the domain.
     * @param {DomainManager} DomainManager for the server
     */
    exports.init = function (DomainManager) {
        if (!DomainManager.hasDomain(domainName)) {
            DomainManager.registerDomain(domainName, {
                major: 0,
                minor: 1
            });
        }

        DomainManager.registerCommand(
            domainName,
            "execute", // command name
            execute, // command handler function
            true, // this command is async
            "Runs a command in a shell and buffers the output.",
            [
                {
                    name: "directory",
                    type: "string"
                },
                {
                    name: "command",
                    type: "string"
                },
                {
                    name: "args",
                    type: "array"
                }
            ],
            [{
                name: "stdout",
                type: "string"
            }]
        );

        DomainManager.registerCommand(
            domainName,
            "spawn", // command name
            spawn, // command handler function
            true, // this command is async
            "Launches a new process with the given command.",
            [
                {
                    name: "directory",
                    type: "string"
                },
                {
                    name: "command",
                    type: "string"
                },
                {
                    name: "args",
                    type: "array"
                }
            ],
            [{
                name: "stdout",
                type: "string"
            }]
        );
    };

}());
Copyright © Kyle Hornberg 2014
Documentation generated by JSDoc 3.2.2 on Thu Apr 03 2014 13:07:00 GMT-0500 (CDT) using the DocStrap template.