Giter VIP home page Giter VIP logo

vantage's Introduction

vantage

Build Status Gitter NPM Version


Vantage = CLI + SSH + REPL for your live node app. In one line:

require("vantage")().listen(4000);


vantage.js demo

Contents

Introduction

Vantage gives you a new perspective into your live node application not previously available.

An extension of Vorpal, Vantage turns your live Node app into a immersive CLI. Accessible remotely or locally, Vantage lets you build your own API for your application and import community extensions, introducing a new means of live diagnostics and activity for your dev and prod environments.

  • First-class CLI: tab completion, history, you name it.
  • Build your own API with the familiar syntax of commander.js.
  • SSH-like client / server setup for remote access to your live Node app.
  • Production-ready, with authentication middleware and a basic firewall.
  • Built-in REPL.

Unlike any other REPL or CLI module, Vantage allows you to remotely connect to your live app and access the CLI transparently, exactly as you would in an SSH session. Vantage can connect through an unlimited number of live Node instances across multiple machines, piping commands and information to and from your local terminal.

Made with ❤️ by @dthree.

Notice

This is now an OPEN Open Source project. I am not able to invest a significant amount of time into maintaining Vantage and so am looking for volunteers who would like to be active maintainers of the project. If you are interested, shoot me a note.

Getting Started

Tour

This Vantage tour will give you a live walk-through of vantage's features.

$ npm install -g vantage
$ vantage tour
Examples
Community
Quick Start

First, install vantage globally:

$ npm install -g vantage

Now, add the following to a file named server.js.

// Create a new instance of vantage.
var vantage = require("vantage")();

// Add the command "foo", which logs "bar".
vantage
  .command("foo")
  .description("Outputs 'bar'.")
  .action(function(args, callback) {
    this.log("bar");
    callback();
  });
  
// Name your prompt delimiter 
// "websvr~$", listen on port 80 
// and show the Vantage prompt.
vantage
  .delimiter("websvr~$")
  .listen(80)
  .show();

Run server.js. You Node app has become a CLI.

$ node server.js
websvr~$ 

Open another terminal. Because Vantage is listening on port 80, you can remotely connect to it:

$ vantage 80
$ Connecting to 127.0.0.1:80 using http...
websvr~$ 

Try out your "foo" command.

websvr~$ foo
bar
websvr~$

Now type "help" to see Vantage's built in commands in addition to "foo":

websvr~$ help

  Commands
  
    help [command]    Provides help for a given command.
    exit [options]    Exits instance of Vantage.
    use <module>      Installs a vantage extension in realtime.
    vantage [server]  Connects to another application running vantage.
    foo               Outputs "bar".

websvr~$

That's the basic idea. Once you get the hang of it, read on to learn some of the fancier things Vantage can do.

API

Vantage is an extension of Vorpal, and so inherits all of its properties and methods. For all command creation and CLI syntax, refer to Vorpal's API.

.listen(app, [options or callback], [callback])

Starts Vantage as a server.

Vantage as a standalone web server

If you just want it to listen on a port independent of your web application, simply pass in the port and Vantage will spawn a new HTTP server. Every time a client connects to Vantage, the connection callback will be thrown and include the socket.io connection object.

var vantage = new Vantage();
vantage.listen(80, function(socket){
  this.log("Accepted a connection.")
});

Vantage with an existing web server

If you want Vantage to listen on the same port as your web application, you can use Vantage's listen function in place of your existing web server's listen function.

This is useful when running clustered instances of your server, such as behind a reverse proxy, where every instance has a separate port that can only be accessed internally. In this way, you can hop into any running instance without having to remember a separate set of ports.

With Koa.js
var koa = require('koa');
var Vantage = require('vantage');

var vantage = new Vantage();
var app = koa();

vantage.listen(app, 80);
With Express.js
var express = require('express');
var Vantage = require('vantage');

var vantage = new Vantage();
var app = express();

vantage.listen(app, 80);
With Hapi.js
var Hapi = require('hapi');
var Vantage = require('vantage');

var vantage = new Vantage();
var server = new Hapi.Server();

vantage.listen(server, 80);

server.start();
With SSL / advanced options

You can pass detailed options to your web server with the second argument in place of the port. These options are the same options you would pass into your web server, with a few exceptions:

  • options.port: Tells vantage what port to listen on.
  • options.ssl: A boolean that tells Vantage whether to spawn an HTTP or HTTPs server.
  • options.logActivity: When true, a TTY acting as a Vantage server that receives a connection will log when clients log in and out of the server. Defaults to false.

Default HTTPs server example:

var vantage = new Vantage();
vantage.listen(someMiddleware, {
  port: 443,
  ssl: true,
  key: fs.readFileSync('./../../server.key'),
  cert: fs.readFileSync('./../../server.crt'),
  ca: fs.readFileSync('./../../ca.crt'),
  requestCert: true,
  rejectUnauthorized: false,
});

.banner(string)

Sets a banner for display when logging into a given Vantage server.

var banner = 
"######################################################################" + 
"#                    Welcome to joescrabshack.com                    #" + 
"#                                                                    #" +
"#              All connections are monitored and recorded            #" + 
"#      Disconnect IMMEDIATELY if you are not an authorized user      #" + 
"######################################################################";
vantage
  .delimiter('appsvr:3000~$')
  .banner(banner)
  .listen(3000);
$ vantage 3000
$ Connecting to 127.0.0.1:3000...
$ Connected successfully.
######################################################################
#                    Welcome to joescrabshack.com                    # 
#                                                                    #
#              All connections are monitored and recorded            # 
#      Disconnect IMMEDIATELY if you are not an authorized user      # 
######################################################################
? user: 

Note: See authentication section for auth details.

Firewall

If your Vantage server is listening on a public-facing web port such as 80 or 443, your organization's firewall is not going to help you. This is a barebones IP firewall for limiting connections down to your internal subnets. For sensitive applications, this obviously does not replace authentication.

.firewall.policy(string)

Sets the default policy for the firewall to either ACCEPT or REJECT. Any request that does not match a rule will fall back to this policy. Returns vantage.firewall.

Defaults to ACCEPT.

// This will reject all remote connections.
vantage.firewall.policy("REJECT");

.firewall.accept(address, [subnet])

Allows a particular address / subnet to connect to Vantage. Returns vantage.firewall. If no arguments are passed, returns the currently-applied policy.

vantage.firewall
  .policy("REJECT")
  .accept("10.0.0.0/8")
  .accept("192.168.0.0", 24);

console.log(vantage.firewall.policy()) // -> REJECT  

.firewall.reject(address, [subnet])

Denies access to a particular address / subnet. Returns vantage.firewall.

vantage.firewall
  .policy("ACCEPT")
  .reject("64.0.0.0", 8)
  .reject("192.168.0.0/16");

.firewall.rules()

Returns an array of applied rules.

console.log(vantage.firewall.rules());
// -> [{ ip: "64.0.0.0", subnet: 8, rule: "REJECT" }]

.firewall.reset()

Reverts vantage.firewall to an ACCEPT policy and erases all rules.

Authentication

Vantage supports authentication strategies as middleware. It comes with a default Basic Authentication module.

vantage.auth(middleware, options)

Uses a given authentication strategy. Pass the required middleware into the first variable, and any options / configuration for that middleware as given in that module's documentation into the options parameter.

var pam = require("vantage-auth-pam");
vantage.auth(pam, options);

Vantage Basic Auth is built in, and so can be used with the "basic" string instead of requiring a module.

var users = [
    { user: "admin", pass: "4k#842jx!%s" },
    { user: "user", pass: "Unicorn11" }
];

var vantage = require("vantage")();

vantage.auth("basic", {
  "users": users,
  "retry": 3,
  "retryTime": 500,
  "deny": 1,
  "unlockTime": 3000
});
Security Note

If no vantage.auth function is declared, your app will not require authentication. As a security measure, if your NODE_ENV environment variable is not set to "development" and there is no authentication, Vantage will disallow remote connections. To permit remote connections without authentication, simply set your NODE_ENV to "development".

Building Authentication Strategies

You can publish your own custom authentication strategies for Vantage.js as its own Node module.

I am currently looking to team up with a rocket scientist like you to build a pam-based authentication strategy for Vantage. If you are interested, send me a note!

The format for publishing a strategy is simple:

module.exports = function(vantage, options) {

  // The Vantage instance is exposed through
  // the `vantage` parameter. `options` exposes
  // options passed in by the strategy's user, and
  // is defined by you.

  // This is where you can persist the log on state of 
  // the users attempting to log in, etc.

  // You return a function, which executes
  // in the same context as a vantage command.
  // Every time the user attempts to connect,
  // this function runs. In it you can prompt
  // the user, etc.
  return function(args, callback) {

    /** 
     * Args exposes several pieces of data
     * you can use:
     * {
     *   // If the user pre-passes auth data, it will be
     *   // available here. Otherwise, prompt him for it.
     *   user: "admin", 
     *   pass: "Unicorn11",
     *   // This is based on socket.io's connection handshake,
     *   // and has a lot more data than this.
     *   handshake: { 
     *     host: "192.168.0.1",
     *     port: "800"
     *   }
     * }
     */

    // Prompt user / look up credentials, etc.

    // Authentication is determined by your
    // callback: `callback(message, authenticated)`.

    // Example of rejected auth.
    callback("Invalid credentials.", false);

    // Example of accepted auth.
    // callback(void 0, true);
  }

}

Events

Vantage extends EventEmitter.prototype. Simply use vantage.on('event', fn) and vantage.emit('event', data). The following events are supported:

Socket.io client / server events

Vantage uses socket.io to handle all communication between instances. The following events map to the default socket.io events:

  • client_connect: Maps to connect for socket.io-client.

  • client_connect_error: Maps to connect_error for socket.io-client.

  • client_error: Maps to error for socket.io-client.

  • client_disconnect: Maps to disconnect for socket.io-client.

  • server_connection: Maps to connection for socket.io.

  • server_disconnect: Maps to disconnect for socket.io.

Vantage client / server events
  • client_keypress: Fires on keypress on local client terminal.

  • client_prompt_submit: Fires when the CLI prompt has been submitted with a command, including ''.

  • client_command_executed: Fires at the client once the command has been received back as executed.

  • client_command_error: Fires at the client if a command comes back with an error thrown.

  • server_command_received: Fires at the end-server actually executing a command receives the command.

  • server_command_executed: Fires at the end-server once the command has successfully executed.

  • server_command_error: Fires at the end-server if the command has thrown an error.

Automation

Vantage allows you execute your API commands from javascript synchronously, using either callbacks or promises.

.connect(server, port, [options or callback], [callback])

Connects to another instance of Vantage. Returns callback or promise.

// With a promise
vantage.connect('127.0.0.1', 8001).then(function(data){
  // ... 
}).catch(function(err){
  console.log('Error connecting: ' + err);
});

// With a callback
vantage.connect('127.0.0.1', 8001, function(err) {
  if (!err) {
    // ... connected
  }
});
Options
  • ssl: Set to true if server you are connecting to uses HTTPS.

.exec(command, [callback])

Executes an API command string. Returns a callback or Promise.

// Using Promises:
vantage.exec("vantage 8001").then(function(data){
  return vantage.exec("roll dough");
}).then(function(data){
  return vantage.exec("add cheese");
}).then(function(data){
  return vantage.exec("add pepperoni");
}).then(function(data){
  return vantage.exec("shape crust");
}).then(function(data){
  return vantage.exec("insert into oven");
}).then(function(data){
  return vantage.exec("wait 480000");
}).then(function(data){
  return vantage.exec("remove from oven");
}).then(function(data){
  return vantage.exec("enjoy");
}).catch(function(err){
  console.log("Error baking pizza: " + err);
  app.orderOut();
});

// Using callbacks:
vantage.exec("vantage 8001", function(err, data) {
  if (!err) {
    vantage.exec("bake pizza", function(err, pizza){
      if (!err) {
        app.eat(pizza);
      }
    });
  }
});

Extensions

Just like Vorpal, Vantage supports extensions. Creating extensions is simple and is covered in Vorpal's documentation.

License

MIT

Footnotes

Er, that GIF... I'm so confused...

That's okay. Here's what happened:

  1. In my terminal, I started a local Node web server:
$ node websvr.js

Normally, you would simply see what you logged, and would have no interaction with Node. Instead, Vantage gave us a prompt:

websvr~$ 
  1. I typed help, which gave me a list of all of Vantage's built-in commands as well as commands I added.

  2. In my websvr.js, I gave Vantage a command that would turn on logging only for web requests. By logging domains of activity, this assists productivity in debugging. To run this, I typed debug web, and it started logging all web requests.

  3. I then typed debug off, which disabled log output.

  4. By then entering the repl command, I entered a special REPL "mode" where I can access the raw javascript and objects in my application, while it's running. This is the equivalent of running $ node in your terminal, except it is in the context of your live application!

  5. Satisfied with repl mode, I exited out of it with the exit command.

  6. So that's nice, you can access the local Node instance in your terminal. But what about remote or daemonized applications? By using the built-in vantage command, I remotely connect to my Node database API listening on port 5001, by running vantage 127.0.0.1:5001.

  7. Just like SSH, I'm now "in" the new instance, and my prompt changed to dbsvr~$.

  8. This server supports another Vantage mode. By typing sql, I enter "sql mode". Using this, I typed an arbitrary SQL command and it connected to my database and executed it. When done, I entered exit.

  9. I felt like checking out the latest trend on Hacker News. I typed help and was disappointed to find there was no hacker-news API command.

  10. Fortunately, someone made an extension for that - an NPM module called vantage-hacker-news. To download it and import the commands into Vantage in realtime, I typed use vantage-hacker-news.

  11. With this command, vantage did a temporary npm install on the module and loaded it into the application's memory. By typing help again, I can see I now have a new Vantage command registered: hacker-news!

  12. I used the command: hacker-news --length 3, and this showed me the top 3 items trending on Hacker News. One of them was obviously an article on the Node event loop, because Node is awesome.

  13. Satisfied, I typed exit, which brought me back to my web server.

  14. I then typed exit -f (for --force) to actually quit the web server, which was running locally in my terminal.




vantage.js

Bitdeli Badge

vantage's People

Contributors

bradenoguinn avatar brollb avatar davemackintosh avatar dthree avatar e-jigsaw avatar eiriksm avatar emgee3 avatar emilkje avatar enykeev avatar fiznool avatar joe-adams avatar ryan-mcbride avatar thaumant avatar zakhenry avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vantage's Issues

Allow banner to be a function so banner can change depending on app state, or environment state

Currently, the banner is assigned on boot:

var banner = 
"######################################################################" + 
"#                    Welcome to joescrabshack.com                    #" + 
"#                                                                    #" +
"#              All connections are monitored and recorded            #" + 
"#      Disconnect IMMEDIATELY if you are not an authorized user      #" + 
"######################################################################";
vantage
  .delimiter('appsvr:3000~$')
  .banner(banner)
  .listen(3000);

However this means that the context can only be when the banner was registered.

Instead, if the api could accept a banner, ie

vantage
  .delimiter('appsvr:3000~$')
  .banner(() => {
    if (process.stdout.columns < 70){
      return;
    }
    return banner;
  })
  .listen(3000);

Then the banner could be changed depending on the app state, or environment state. Some benefiting examples

  • process.stdout.columns could be inspected to hide/resize wide banners (this currently only works if the same size shell as what booted the app in the first place is used)
  • status of the running application could be returned, maybe a list of the last X exceptions
  • Notifications that migrations need to be run
    etc

Vantage Command Missing Number Data

in vantage i input the following command:

$ start test 1111111112312345425
{ options: {}, platform: 'test', uid: 1111111112312345500 }

1111111112312345425 missing the ending data 1111111112312345500 ???

1111111112312345425
1111111112312345500

i have tried the newest version "commander". it hasn't this bug. is this vantage bug?

Unnecessary dependency: npm

It seems to me that having "npm" in the package as a dependency is not needed, and adds about 20Megs to the node_modules folder.

Two arguments to command() produces "vantage.command(...).option is not a function"

If you supply a second argument to .command(), it returns the vantage instance rather than the command instance.

The following example from the readme produces an error:

TypeError: vantage.command(...).option is not a function

const Vantage = require('vantage')
const vantage = new Vantage()

vantage
  .command('order pizza [type]', 'Orders a type of food.')
  .option('-s, --size <size>', 'Size of pizza.')
  .option('-a, --anchovies', 'Include anchovies.')
  .option('-p, --pineapple', 'Include pineapples.')
  .option('-o', 'Include olives.')
  .option('-d, --delivery', 'Pizza should be delivered')
  .action(function(args, cb){
    console.log(args);
    cb();
  });

It seems this is done intentionally:

if (desc) return this;

vantage.command = function(name, desc, opts) {
  ...
  if (desc) return this;
  return cmd;
};

As this came in with the initial commit, I can't deduce as to why.

Update to latest vorpal

I may be missing something, but it seems that the version of vorpal that vantage depends on is way out of date (389 commits?! dthree/vorpal@31e079c...c987b51).

Is this really the case? And if so can the upgrade be made as there is a lot of missing functionality (autocomplete, validation etc)

Loving both projects but need to use vantage to be able to drop into runtime shell.

SyntaxError with strict mode

Hi, I'm trying to use vantage but when I require the lib in my code I get this error :

[...]/node_modules/vantage/lib/vantage.js:766
    function parseArgsByType(arg, cmdArg) {
    ^^^^^^^^
SyntaxError: In strict mode code, functions can only be declared at top level or immediately within another function.
    at exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:443:25)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object.<anonymous> (/home/halfman/beam.io/server.js:6:15)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)

Here is my environment :

$ uname -srvo
Linux 3.19.0-25-generic #26-Ubuntu SMP Fri Jul 24 21:17:31 UTC 2015 GNU/Linux

$ npm --versions
{ 'beam.io': '0.0.0',
  npm: '2.11.3',
  http_parser: '2.3',
  modules: '14',
  node: '0.12.7',
  openssl: '1.0.1p',
  uv: '1.6.1',
  v8: '3.28.71.19',
  zlib: '1.2.8' }

Note : I also get the same error if I type "vantage" in console.

Thanks for your help.

Support multiple HapiJS connections

Hapi has support for multiple connections and no connections at all (like examples/hapi/hapi.js), I see three branches of operation here.

  1. Create a connection for Socket.IO to hook onto if no connections are present
  2. use Hapi labels to label connections and select an appropriate one when creating the Socket.IO server.
  3. Use a single connection if only one is present.

Duplicate client connections on server restart (resulting in duplicate console output)

Hi,

If the vantage server restarts while client sessions are connected, the client(s) reconnect and then display duplicate output in response to any commands. E.g:

Webapp~$ help

Commands:

    help [command]              Provides help for a given command.
    exit [options]              Exists instance of Vantage.
    vantage [options] [server]  Connects to another instance of Node running Vantage.
    use [options] <module>      Installs a vantage extension in realtime.

*** SERVER RESTART HERE ***
Webapp~$ help

Commands:

    help [command]              Provides help for a given command.
    exit [options]              Exists instance of Vantage.
    vantage [options] [server]  Connects to another instance of Node running Vantage.
    use [options] <module>      Installs a vantage extension in realtime.


  Commands:

    help [command]              Provides help for a given command.
    exit [options]              Exists instance of Vantage.
    vantage [options] [server]  Connects to another instance of Node running Vantage.
    use [options] <module>      Installs a vantage extension in realtime.

Webapp~$

Further restarts result in additional duplication.
Any suggestions on how to resolve this? Thanks.

listen should take a callback

.listen should take a callback as optional last argument, in the same way net/http server.listen(port, cb) does so you know if and when the server bound to the port.

Listen callback does not fire until first connection

When using vantage in standalone mode, the listen callback does not fire until I connect to it with the command line client.

var Vantage = require('vantage');
var vantageServer = new Vantage();

vantageServer
  .delimiter('$')
  .listen(2001, function() {
    console.log('Started vantage server at http://localhost:2001');
  });

several build errors

Getting these when installing vantage,

utf-8-validate

$ if not defined npm_config_node_gyp (node "C:\Users\loote\AppData\Roaming\npm\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild )  else (node  rebuild )
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
  bufferutil.cc
C:\projects\vantage-test\node_modules\nan\nan.h(263): error C2995: 'v8::Local<T> _NanEnsureLocal(v8::Local<T>)': function template has already been defined [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\projects\vantage-test\node_modules\nan\nan.h(256): note: see declaration of '_NanEnsureLocal'
C:\projects\vantage-test\node_modules\nan\nan.h(661): error C3083: 'smalloc': the symbol to the left of a '::' must be a type [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(661): error C2039: 'FreeCallback': is not a member of 'node' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_object_wrap.h(8): note: see declaration of 'node'
C:\projects\vantage-test\node_modules\nan\nan.h(661): error C2061: syntax error: identifier 'FreeCallback' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(665): error C2065: 'callback': undeclared identifier [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(665): error C2065: 'hint': undeclared identifier [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(672): error C2665: 'node::Buffer::New': none of the 4 overloads could convert all the argument types [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_buffer.h(43): note: could be 'v8::MaybeLocal<v8::Object> node::Buffer::New(v8::Isolate *,char *,size_t)'
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_buffer.h(31): note: or       'v8::MaybeLocal<v8::Object> node::Buffer::New(v8::Isolate *,v8::Local<v8::String>,node::encoding)'
  C:\projects\vantage-test\node_modules\nan\nan.h(672): note: while trying to match the argument list '(v8::Isolate *, const char *, uint32_t)'
C:\projects\vantage-test\node_modules\nan\nan.h(676): error C2440: 'return': cannot convert from 'v8::MaybeLocal<v8::Object>' to 'v8::Local<v8::Object>' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\projects\vantage-test\node_modules\nan\nan.h(676): note: No constructor could take the source type, or constructor overload resolution was ambiguous
C:\projects\vantage-test\node_modules\nan\nan.h(683): error C2039: 'Use': is not a member of 'node::Buffer' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_buffer.h(8): note: see declaration of 'node::Buffer'
C:\projects\vantage-test\node_modules\nan\nan.h(683): error C3861: 'Use': identifier not found [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
gyp ERR! build error

bufferutil

$ if not defined npm_config_node_gyp (node "C:\Users\loote\AppData\Roaming\npm\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild )  else (node  rebuild )
Building the projects in this solution one at a time. To enable parallel build, please add the "/m" switch.
  bufferutil.cc
C:\projects\vantage-test\node_modules\nan\nan.h(263): error C2995: 'v8::Local<T> _NanEnsureLocal(v8::Local<T>)': function template has already been defined [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\projects\vantage-test\node_modules\nan\nan.h(256): note: see declaration of '_NanEnsureLocal'
C:\projects\vantage-test\node_modules\nan\nan.h(661): error C3083: 'smalloc': the symbol to the left of a '::' must be a type [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(661): error C2039: 'FreeCallback': is not a member of 'node' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_object_wrap.h(8): note: see declaration of 'node'
C:\projects\vantage-test\node_modules\nan\nan.h(661): error C2061: syntax error: identifier 'FreeCallback' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(665): error C2065: 'callback': undeclared identifier [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(665): error C2065: 'hint': undeclared identifier [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
C:\projects\vantage-test\node_modules\nan\nan.h(672): error C2665: 'node::Buffer::New': none of the 4 overloads could convert all the argument types [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_buffer.h(43): note: could be 'v8::MaybeLocal<v8::Object> node::Buffer::New(v8::Isolate *,char *,size_t)'
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_buffer.h(31): note: or       'v8::MaybeLocal<v8::Object> node::Buffer::New(v8::Isolate *,v8::Local<v8::String>,node::encoding)'
  C:\projects\vantage-test\node_modules\nan\nan.h(672): note: while trying to match the argument list '(v8::Isolate *, const char *, uint32_t)'
C:\projects\vantage-test\node_modules\nan\nan.h(676): error C2440: 'return': cannot convert from 'v8::MaybeLocal<v8::Object>' to 'v8::Local<v8::Object>' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\projects\vantage-test\node_modules\nan\nan.h(676): note: No constructor could take the source type, or constructor overload resolution was ambiguous
C:\projects\vantage-test\node_modules\nan\nan.h(683): error C2039: 'Use': is not a member of 'node::Buffer' [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
  C:\Users\loote\.node-gyp\5.7.0\include\node\node_buffer.h(8): note: see declaration of 'node::Buffer'
C:\projects\vantage-test\node_modules\nan\nan.h(683): error C3861: 'Use': identifier not found [C:\projects\vantage-test\node_modules\bufferutil\build\bufferutil.vcxproj]
gyp ERR! build error

Info

Windows 10
node v5.7.0
npm 3.3.3
vantage @1.5.2

Can't execute tour after 1.4.0 release

On OSX with node 0.12.7 and vantage 1.5.0 I get this:

$ npm install -g vantage
    $ vantage tour
tour~$

/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/node_modules/vorpal/lib/ui.js:236
    this._activePrompt.clean();
                       ^
TypeError: undefined is not a function
    at Object.ui.pause (/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/node_modules/vorpal/lib/ui.js:236:24)
    at Object.ui.log (/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/node_modules/vorpal/lib/ui.js:335:23)
    at Vorpal.vorpal.log (/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/node_modules/vorpal/lib/vorpal.js:274:15)
    at Function.Logger.log.br (/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/lib/logger.js:136:12)
    at Object.steps.step1 (/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/examples/tour/tour.js:67:9)
    at Object.<anonymous> (/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/examples/tour/tour.js:281:7)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)

With version 1.4.0:

$ vantage tour
module.js:338
    throw err;
          ^
Error: Cannot find module './../../lib/util'
    at Function.Module._resolveFilename (module.js:336:15)
    at Function.Module._load (module.js:278:25)
    at Module.require (module.js:365:17)
    at require (module.js:384:17)
    at Object.<anonymous> (/Users/zmarouf/.nvm/versions/node/v0.12.7/lib/node_modules/vantage/examples/tour/tour.js:15:12)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Module.require (module.js:365:17)

With version 1.3.12

$ vantage tour

  ## 1. To start, press [enter] 3 times.

tour~$

So I looked into things a little and it seems that vorpal 1.0.3 breaks things.
Setting the dependency to 1.0.2 fixes things as far as the tour is concerned except for your hacker-news-example.
I get this:

use vantage-hacker-news
Installing vantage-hacker-news from the NPM registry:
runTopLevelLifecycles     ▀ ╢█████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░╟
Error downloading module:

and the option is not visible in the 'help' menu.

I hope that helps with your investigations.

1.4.0 remote connection seem to be broken

Had a code work fine 1.3.5

Deploy and pull vantage 1.4.0 connect don't fail and do get events for connection but don't get prompt and cannot send commands.

Downgrade to 1.3.5 fixed the problem.

Best way to asynchronously logs to Vantage?

Hi,

I wanted to make a debug as we can see in the Gif.
So, using express, I started by making a middleware to get all requests information but now I'm asking myself on how to properly send theses logs to my vantage instance.

I thought that I can send the log function of my debug command to the global scope (then the middleware can use it to log everything he has to) but I find this very crappy.

Thanks for your councils.

Connect by domain name

Hi,

I tried to connect remote server with vantage

$ vantage some.domain.com:3000

then vantage showed Invalid server/port passed error. I checked code https://github.com/dthree/vantage/blob/master/bin/vantage.js#L46 . This only passed x.x.x.x style ip. So I changed code below

  var valid = (isNaN(connection.port))
    ? ("\n  Invalid server/port passed: " + connection.server + ":" + connection.port + "\n")
    : true;
  return valid;

And re-run

$ vantage some.domain.com:3000
Connecting to some.domain.com:3000 using http...
$ 

It works.

Could you remove that validator? or do you have any reason about that validator?

Thanks

Release a new package

Currently the latest version on npm & in package.json is 1.7.0, however there has been a few merges into master since then. I would suggest next version should be 1.8.0 as it will include the bump to the latest vorpal, however I haven't encountered any breaking changes

tutorial not working on windows

Step 5: start server 3001
Successfully spawned server

Step 6: vantage 3001
Error connecting. 503 service unavailable

You're in. Notice the prompt changed.

(Prompt does not change)

Step 7: port
undefined

An extrenal process is spawned but it does not repond. Any idea what's causing this?

Repeated output

when you run the simple example like
var vantage = require("vantage")();

// Add the command "foo", which logs "bar".
vantage
.command("foo")
.description("Outputs 'bar'.")
.action(function(args, callback) {
this.log("bar");
callback();
});

vantage
.delimiter("websvr~$")
.listen(5003)
.show();

and you type foo, you get foo repeated then bar. Why is foo repeating?
websvr~$ foo
websvr~$ foo (this is the repeated output)
bar

Doesn't work with Node 4 yet

I'd probably just say it on the chat if I could get on from work, but I accidentally found that it doesn't work with Node 4. There are node-gyp problems.

Expose delimiter to commander?

Allows for later change delimiter in the process of a command. Similarly, it'd good to expose all other run-time related system variables for more featured plugins.

Say, it would be awesome to replace the delimiter after a login?

Improve/correct project description

The readme/description of the project could/should be described better. In particular, all of the references to SSH should be replaced with something else as this project does not actually use SSH at all and IMHO can cause confusion. Perhaps "interactive shell" or "interactive session" or "command prompt" or "shell prompt" or similar would be more accurate descriptions of what the project provides.

Command arguments

The documentation for command arguments seems to be severely lacking,

It took a while for me to realize that the .command() function takes some sort of DSL to manage arguments.

And on top of that they don't support quoted strings or something, or perhaps that's more lack of documentation.

In any event it might be helpful to include command argument processing in the simple basic example that's plastered in the readme and pops up everywhere I do a google search

Frozen caret/pointer/cursor.

With:

  • Node v4.0.0
  • Vantage 1.5.1

Below I typed foo with everything going fine...
type_text
...I then click the left arrow three times, all the while the caret/pointer/cursor remained still. Whenever I press a key, the input appears where I'd expect but the caret/pointer/cursor remains at the end.

type_text2

I hope the development with this and Vorpal is working out!

connections should be transparent

Piping stdout downstream.

Perhaps there's a good use-case for this but by default it would be nice if connecting from a remote did nothing but connect up the repl. If someone wants to suck the stdout into their connected client, then they could make a command for that (or you could make it a standard built-in command).

In addition, it probably shouldn't redirect output totally, rather it should just duplicate the output.

start boot

hi,
i want start my app when my raspi boot, i use this https://github.com/chovy/node-startup

but this doesn't work and i don't understand why, no error message, no log.

Boot PI, connect to ssh, and launch vantage 8080, and error 503

Thanks

Command arg parsing producing wierd results

Not sure if I misunderstood the command arguments - I would like a command with one mandatory arg and one optional. And another command with 2 optional args.

Using

.command('load <must> [maybe]')

The command becomes:

load <must>

and the args passed to parseExpectedArgs are:

[ '[maybe]' ]

In the second instance

.command(load [maybe] [maybe2])

The command becomes

load

and the args passed to parseExpectedArgs are:

[ '[maybe] ', 'maybe2]' ]

notice the missing bracket.

Matt

Problem with exit command

When I set a simple standalone server, and try to connect to it with the vantage command line, the exit command breaks. It prints exit twice, but I only typed it once.

// Code
var vantageServer = vantage()
vantageServer.banner('Hello World');
vantageServer.listen(5111);
console.log('Vantage server started on port 5111');

// Error
Connecting to 127.0.0.1:5111 using http...
local@makawao~$ exit
local@makawao~$ exit
local@makawao~$ Prompt called when mid prompt...

/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/ui.js:130
      throw new Error('UI Prompt called when already mid prompt.');
      ^

Error: UI Prompt called when already mid prompt.
    at Object.ui.prompt (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/ui.js:130:13)
    at EventEmitter.vorpal.prompt (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/vorpal.js:457:8)
    at EventEmitter.vorpal.exit (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/vorpal.js:1032:12)
    at CommandInstance.<anonymous> (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/vorpal-commons.js:48:19)
    at EventEmitter.session.execCommandSet (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/session.js:412:24)
    at EventEmitter.vorpal._exec (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/vorpal.js:767:18)
    at EventEmitter.vorpal._execQueueItem (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/vorpal.js:607:10)
    at EventEmitter.vorpal._queueHandler (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/vorpal/lib/vorpal.js:591:10)
    at Socket.<anonymous> (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/lib/client.js:236:37)
    at Socket.Emitter.emit (/home/giodamelio/.nvm/versions/node/v4.0.0/lib/node_modules/vantage/node_modules/socket.io-client/node_modules/component-emitter/index.js:134:20)

Web client

Hi,
congratulations for this very nice project !
I would like to know if a web client was planned. If not, have you any recommandations to start making one ?

Can’t use `.types`

The Readme says:

Vantage is an extension of Vorpal, and so inherits all of its properties and methods.

However, I don’t seem to be able to use vorpal’s types method as specified here:

TypeError: vantage.command(...).description(...).types is not a function

TypeError: vantage._pause is not a function

After I've fixed the #67 error when I connect to a server via vantage client, I get an error printed to the client console :

(node:19581) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: vantage._pause is not a function

I've not found the actual code that causes this error.

Vantage version: 1.7.0
Node: 6.8.0

Persistent history

Command history is handy, but it doesn't live beyond a session. It would be awesome if vantage had persistent history. As of now, this can only be achieved by loading entries into vagrant.session._hist.

History could be kept server-side on a per-user basis, or client-side on a per-host basis.

For a server-side implementation, instead of bundling this functionality with vantage itself, a public history API could be exposed for extensions to manage and provide history, with session history as the default implementation.

A client-side implementation could provide a vantage command-line flag to pick a history file, defaulting to something like ~/.vantage/history/<host> (for system-wide, per-host history) or ./vantage/history (for directory-based history).

Can't get auth to work

No matter what I did, including trying out the builtin basic auth mechanism, vantage seems to bypass the authentication every time. For example, the following code results in a successful connection:

const Vantage = require('vantage');

Vantage()
  .delimiter('demo~$')
  .auth(function(vantage, options) {
    return function(args, cb) {
      cb('Nope', false);
    }
  })
  .listen(3001);
$ vantage 3001

I tried both on local machine, and on another machine on the same network.
I am currently using version 1.5.2

SyntaxError: Unexpected strict mode reserved word

vantage 1.3.6
running app from .bin I get:

node_modules/vantage/lib/util.js:62
let arrClone = _.clone(arr);
^^^
SyntaxError: Unexpected strict mode reserved word
at exports.runInThisContext (vm.js:73:16)
at Module._compile (module.js:443:25)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)

any hints?

vantage-auth-basic missing

It looks like the repository no longer exists, and the pam repository is abandoned. I plan on implementing public / private-key authentication of my own, would you be interested in a repository link once it's done to add to the readme?

Maximum of 2 arguments?

I've just spent an hour trying to figure out why the 3rd argument of my command was not reaching the action function.

Eventually found this line:

vantage.j:787    var supportedArgs = 2;

Changed it, and voilá.

Is there a reason for this? The Command custructor will happily take more arguments, and the help command lists them, even though they are ignored.

It's limiting and very confusing

Suppress internal logs

Need a way to disable these types of messages:

User entering session.
Piping stdout downstream.
Stdout returned to console.
User exited session.

More explanation?

I'm intrigued... but I don't get it. What exactly is this for? I get comander.js, but this lib somehow exposes a cli to my existing app in production? I'm not sure I get it. :(

Express + socket.io

Hi, Is there any way to make vantage work with express + socket.io?

Thanks in advance.

support more than one parameter

I've tried to create a command with more than one parameters however the library seems not to support it.

code:

vantage
  .command('dbs create <name> <username> <password>', 'creates database')
  .action(require('./cmds/dbs-create'));

help output:

    dbs create <name>>  creates database

action args:

[{ options: {}, 'name>': 'a' }]

ReferenceError: Promise is not defined on Windows 8.1

After create a simple js

var Vantage = require('vantage');
var server = new Vantage();

server
  .command('foo')
  .description('Outputs "bar".')
  .action(function(args, cb) {
    console.log('bar');
    cb();
  });

server
  .delimiter('webapp~$')
  .listen(80)
  .show();

And try to execute: node .\countdownSet.js

an error is display:

  Error: Cannot find module 'vantage'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (C:\Users\ridermanb\Projects\countdownSet\countdownSet.js:1:81)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)

So I try to execute a simple vantage, and again, a new error is display:

ReferenceError: Promise is not defined
    at VantageClient.vantageClient.connect (C:\Program Files\nodejs\node_modules\vantage\lib\client.js:49:14)
    at Vantage.vantage.connect (C:\Program Files\nodejs\node_modules\vantage\lib\vantage.js:253:30)
    at Object.<anonymous> (C:\Program Files\nodejs\node_modules\vantage\bin\vantage.js:66:26)
    at Module._compile (module.js:456:26)
    at Object.Module._extensions..js (module.js:474:10)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Function.Module.runMain (module.js:497:10)
    at startup (node.js:119:16)
    at node.js:906:3

Yes, I install it using npm install -g vantage

child process

What is the right way to start another process from within vantage and return to the vantage prompt when the process is terminated via ^C?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.