UNPKG

4.74 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var logger_1 = require("../logger/logger");
4var logger_runtime_1 = require("../logger/logger-runtime");
5var logger_diagnostics_1 = require("../logger/logger-diagnostics");
6var events_1 = require("../util/events");
7var ws_1 = require("ws");
8function 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({ host: config.host, 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}
131exports.createNotificationServer = createNotificationServer;