dev.js 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. const debug = require('debug')('crowi:crowi:dev');
  2. const path = require('path');
  3. const webpack = require('webpack');
  4. const helpers = require('./helpers');
  5. const LRWebSocketServer = require('livereload-server/lib/server');
  6. class CrowiDev {
  7. /**
  8. * Creates an instance of CrowiDev.
  9. * @param {Crowi} crowi
  10. *
  11. * @memberOf CrowiDev
  12. */
  13. constructor(crowi) {
  14. this.crowi = crowi;
  15. }
  16. init() {
  17. this.hackLRWebSocketServer();
  18. }
  19. /**
  20. * prevent to crash socket with:
  21. * -------------------------------------------------
  22. * Error: read ECONNRESET
  23. * at exports._errnoException (util.js:1022:11)
  24. * at TCP.onread (net.js:569:26)
  25. * -------------------------------------------------
  26. *
  27. * @see https://github.com/napcs/node-livereload/pull/15
  28. *
  29. * @memberOf CrowiDev
  30. */
  31. hackLRWebSocketServer() {
  32. const orgCreateConnection = LRWebSocketServer.prototype._createConnection;
  33. // replace https://github.com/livereload/livereload-server/blob/v0.2.3/lib/server.coffee#L74
  34. LRWebSocketServer.prototype._createConnection = function(socket) {
  35. // call original method with substituting 'this' obj
  36. orgCreateConnection.call(this, socket);
  37. socket.on('error', (err) => {
  38. console.warn(`[WARN] Worthless error in client socket: '${err}'`);
  39. });
  40. }
  41. }
  42. /**
  43. *
  44. *
  45. * @param {any} server http server
  46. * @param {any} app express
  47. *
  48. * @memberOf CrowiDev
  49. */
  50. setup(server, app) {
  51. this.setupEasyLiveReload(app);
  52. }
  53. setupEasyLiveReload(app) {
  54. if (!helpers.hasProcessFlag('watch')) {
  55. return;
  56. }
  57. const livereload = require('easy-livereload');
  58. app.use(livereload({
  59. watchDirs: [
  60. path.join(this.crowi.viewsDir),
  61. path.join(this.crowi.publicDir),
  62. ],
  63. checkFunc: function(x) {
  64. return /\.(html|css|js)$/.test(x);
  65. },
  66. }));
  67. }
  68. loadPlugins(app) {
  69. if (process.env.PLUGIN_NAMES_TOBE_LOADED !== undefined
  70. && process.env.PLUGIN_NAMES_TOBE_LOADED.length > 0) {
  71. const pluginNames = process.env.PLUGIN_NAMES_TOBE_LOADED.split(',');
  72. // merge and remove duplicates
  73. if (pluginNames.length > 0) {
  74. var PluginService = require('../plugins/plugin.service');
  75. var pluginService = new PluginService(this.crowi, app);
  76. pluginService.loadPlugins(pluginNames);
  77. }
  78. }
  79. }
  80. }
  81. module.exports = CrowiDev