index.js 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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
  18. .channel(context.name).channel('cmd')
  19. .emit(cmd,req,res)
  20. .done((evt)=> {
  21. if(evt.count == 0) {
  22. context
  23. .channel(context.name)
  24. .emit("cmd",req,res).done(() => { this.cli.prompt() });
  25. }
  26. this.cli.prompt();
  27. });
  28. });
  29. this.cli.prompt();
  30. },
  31. stop(context) {
  32. log.info("Closing cli");
  33. this.cli.close();
  34. },
  35. completer(str) {
  36. var hits = this.manager.listeners
  37. .filter((v)=> {
  38. var re = new RegExp("^"+ this.context.name + ":cmd:" +str + ".*");
  39. if(re.test(v.name)) {
  40. return v;
  41. }
  42. }).map((v) => v.name.split(":")[2] + " ");
  43. return [hits,str];
  44. },
  45. output(str) {
  46. this.stdout.write(str + "\n");
  47. },
  48. registerCommands(context) {
  49. }
  50. }
  51. module.exports.bundleActivator = shellActivator;