notification-server.js 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. var logger_1 = require("../logger/logger");
  4. var logger_runtime_1 = require("../logger/logger-runtime");
  5. var logger_diagnostics_1 = require("../logger/logger-diagnostics");
  6. var events_1 = require("../util/events");
  7. var ws_1 = require("ws");
  8. function createNotificationServer(config) {
  9. var wsServer;
  10. var msgToClient = [];
  11. // queue up all messages to the client
  12. function queueMessageSend(msg) {
  13. msgToClient.push(msg);
  14. drainMessageQueue({
  15. broadcast: true
  16. });
  17. }
  18. // drain the queue messages when the server is ready
  19. function drainMessageQueue(options) {
  20. if (options === void 0) { options = { broadcast: false }; }
  21. var sendMethod = wsServer && wsServer.send;
  22. if (options.hasOwnProperty('broadcast') && options.broadcast) {
  23. sendMethod = wss.broadcast;
  24. }
  25. if (sendMethod && wss.clients.size > 0) {
  26. var msg = void 0;
  27. while (msg = msgToClient.shift()) {
  28. try {
  29. sendMethod(JSON.stringify(msg));
  30. }
  31. catch (e) {
  32. if (e.message !== 'not opened' && e.message !== "Cannot read property 'readyState' of undefined") {
  33. logger_1.Logger.error("error sending client ws - " + e.message);
  34. }
  35. }
  36. }
  37. }
  38. }
  39. // a build update has started, notify the client
  40. events_1.on(events_1.EventType.BuildUpdateStarted, function (buildUpdateMsg) {
  41. var msg = {
  42. category: 'buildUpdate',
  43. type: 'started',
  44. data: {
  45. buildId: buildUpdateMsg.buildId,
  46. reloadApp: buildUpdateMsg.reloadApp,
  47. diagnosticsHtml: null
  48. }
  49. };
  50. queueMessageSend(msg);
  51. });
  52. // a build update has completed, notify the client
  53. events_1.on(events_1.EventType.BuildUpdateCompleted, function (buildUpdateMsg) {
  54. var msg = {
  55. category: 'buildUpdate',
  56. type: 'completed',
  57. data: {
  58. buildId: buildUpdateMsg.buildId,
  59. reloadApp: buildUpdateMsg.reloadApp,
  60. diagnosticsHtml: logger_diagnostics_1.hasDiagnostics(config.buildDir) ? logger_diagnostics_1.getDiagnosticsHtmlContent(config.buildDir) : null
  61. }
  62. };
  63. queueMessageSend(msg);
  64. });
  65. // create web socket server
  66. var wss = new ws_1.Server({ port: config.notificationPort });
  67. wss.broadcast = function broadcast(data) {
  68. wss.clients.forEach(function each(client) {
  69. client.send(data);
  70. });
  71. };
  72. wss.on('connection', function (ws) {
  73. // we've successfully connected
  74. wsServer = ws;
  75. wsServer.on('message', function (incomingMessage) {
  76. // incoming message from the client
  77. try {
  78. printMessageFromClient(JSON.parse(incomingMessage));
  79. }
  80. catch (e) {
  81. logger_1.Logger.error("error opening ws message: " + incomingMessage);
  82. logger_1.Logger.error(e.stack ? e.stack : e);
  83. }
  84. });
  85. // now that we're connected, send off any messages
  86. // we might has already queued up
  87. drainMessageQueue();
  88. });
  89. function printMessageFromClient(msg) {
  90. if (msg && msg.data) {
  91. switch (msg.category) {
  92. case 'console':
  93. printConsole(msg);
  94. break;
  95. case 'runtimeError':
  96. handleRuntimeError(msg);
  97. break;
  98. }
  99. }
  100. }
  101. function printConsole(msg) {
  102. var args = msg.data;
  103. args[0] = "console." + msg.type + ": " + args[0];
  104. var log = args.join(' ');
  105. switch (msg.type) {
  106. case 'error':
  107. logger_1.Logger.error(log);
  108. break;
  109. case 'warn':
  110. logger_1.Logger.warn(log);
  111. break;
  112. case 'debug':
  113. logger_1.Logger.debug(log);
  114. break;
  115. default:
  116. logger_1.Logger.info(log);
  117. break;
  118. }
  119. }
  120. function handleRuntimeError(clientMsg) {
  121. var msg = {
  122. category: 'buildUpdate',
  123. type: 'completed',
  124. data: {
  125. diagnosticsHtml: logger_runtime_1.generateRuntimeDiagnosticContent(config.rootDir, config.buildDir, clientMsg.data.message, clientMsg.data.stack)
  126. }
  127. };
  128. queueMessageSend(msg);
  129. }
  130. }
  131. exports.createNotificationServer = createNotificationServer;