index.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. var readline = require('readline');
  2. var log = require('hlogger').createLogger("shell");
  3. var path = require('path');
  4. var shellActivator = {
  5. start(context) {
  6. this.context = context;
  7. this.manager = context.manager;
  8. this.stdout = process.stdout;
  9. this.registerCommands(context);
  10. this.cli = readline.createInterface(process.stdin,this.stdout,(str) => this.completer(str));
  11. this.cli.setPrompt("HCI> ");
  12. this.cli.on('line',(cmd) => {
  13. if(cmd.length == "") {this.cli.prompt(); return;}
  14. var [cmd,...args] = cmd.split(/\s/);
  15. var req = { cmd:cmd, args:args }
  16. var res = this.stdout;
  17. context.events
  18. .channel(context.name,'cmd')
  19. .propagate(cmd,req,res)
  20. .then((evt)=> {
  21. if(evt.count == 0) console.log("Command not found:" + cmd);
  22. // This is wrong perhaps
  23. this.cli.prompt();
  24. }).catch((err) => {
  25. console.log("Promise error: ", err);
  26. });
  27. });
  28. this.cli.prompt();
  29. },
  30. stop(context) {
  31. log.info("Closing cli");
  32. this.cli.close();
  33. },
  34. completer(str) {
  35. // Hack
  36. var re = new RegExp("^"+ this.context.name + "/cmd/(" + str + ".*)");
  37. var hits = [];
  38. this.manager.eventual._events.ctx.forEach((ctx) => {
  39. Object.keys(ctx.listeners).forEach((k) => {
  40. var res = k.match(re);
  41. if(res) {
  42. hits.push(res[1]);
  43. }
  44. });
  45. });
  46. return [hits,str];
  47. },
  48. output(str) {
  49. this.stdout.write(str + "\n");
  50. },
  51. registerCommands(context) {
  52. }
  53. }
  54. module.exports.bundleActivator = shellActivator;