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 |
|
12 | function queueMessageSend(msg) {
|
13 | msgToClient.push(msg);
|
14 | drainMessageQueue({
|
15 | broadcast: true
|
16 | });
|
17 | }
|
18 |
|
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 |
|
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 |
|
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 |
|
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 |
|
74 | wsServer = ws;
|
75 | wsServer.on('message', function (incomingMessage) {
|
76 |
|
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 |
|
86 |
|
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;
|