PageRenderTime 49ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/lib/utils/error-handler.js

https://github.com/lsean/fh-fhc
JavaScript | 99 lines | 84 code | 10 blank | 5 comment | 20 complexity | 36003b3033b38168a3ae107d0bb6eeee MD5 | raw file
  1. module.exports = errorHandler;
  2. var cbCalled = false;
  3. var log = require("./log");
  4. var fhc = require("../fhc");
  5. var rm = require("./rm-rf");
  6. var constants = require("constants");
  7. var itWorked = false;
  8. var path = require("path");
  9. process.on("exit", function (code) {
  10. if (code) itWorked = false;
  11. if (itWorked) log("ok");
  12. else {
  13. if (!cbCalled) {
  14. log.error("cb() never called!\n ");
  15. }/*
  16. log.error([""
  17. ,"Additional logging details can be found in:"
  18. ," " + path.resolve("fhc-debug.log")
  19. ].join("\n"));
  20. */
  21. log.win("not ok");
  22. }
  23. itWorked = false; // ready for next exit
  24. });
  25. function errorHandler (er) {
  26. if (cbCalled) throw new Error("Callback called more than once.");
  27. cbCalled = true;
  28. if (!er) return exit(0);
  29. if (!(er instanceof Error)) {
  30. log.error(er);
  31. return exit(1);
  32. }
  33. if (!er.errno) {
  34. var m = er.message.match(/^(?:Error: )?(E[A-Z]+)/);
  35. if (m) {
  36. m = m[1];
  37. if (!constants[m] && !fhc[m]) constants[m] = {};
  38. er.errno = fhc[m] || constants[m];
  39. }
  40. }
  41. switch (er.errno) {
  42. case constants.ECONNREFUSED:
  43. log.error(er);
  44. log.error(["Connection refused!",
  45. "Check the server is running ok"
  46. ].join("\n"));
  47. break;
  48. default:
  49. log.error(er);
  50. break;
  51. }
  52. var os = require("os");
  53. log.error("");
  54. log.error(os.type() + " " + os.release(), "System");
  55. log.error(process.argv
  56. .map(JSON.stringify).join(" "), "command");
  57. exit(typeof er.errno === "number" ? er.errno : 1);
  58. }
  59. function exit (code) {
  60. var doExit = fhc.config.get("_exit");
  61. log.verbose([code, doExit], "exit");
  62. if (code) writeLogFile(reallyExit);
  63. else {
  64. rm("fhc-debug.log", function () { rm(fhc.tmp, reallyExit); });
  65. }
  66. function reallyExit() {
  67. itWorked = !code;
  68. if (doExit) process.exit(code || 0);
  69. else process.emit("exit", code || 0);
  70. }
  71. }
  72. function writeLogFile (cb) {
  73. var fs = require("fs")
  74. , fstr = fs.createWriteStream("fhc-debug.log")
  75. , sys = require("util");
  76. log.history.forEach(function (m) {
  77. var lvl = log.LEVEL[m.level]
  78. , pref = m.pref ? " " + m.pref : ""
  79. , b = lvl + pref + " "
  80. , msg = typeof m.msg === "string" ? m.msg
  81. : msg instanceof Error ? msg.stack || msg.message
  82. : sys.inspect(m.msg, 0, 4);
  83. fstr.write(new Buffer(b
  84. +(msg.split(/\n+/).join("\n"+b))
  85. + "\n"));
  86. });
  87. fstr.end();
  88. fstr.on("close", cb);
  89. }