-
Notifications
You must be signed in to change notification settings - Fork 698
/
web_client.js
153 lines (132 loc) · 4.08 KB
/
web_client.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
/* Log.io WebClient application logic
* Sends enable/disable stream & log history requests to LogServer
* Listens for ping & log messages from enabled Nodes
*/
// In browser context, models & underscore already exist in global scope.
// For unit tests, they must be explicitly imported.
// TODO: Use browserify (https://github.com/substack/node-browserify)
if (typeof _node === 'undefined') {
var _node = require('./node.js');
var _stream = require('./stream.js');
var _history = require('./history.js');
var _cm = require('./color_manager.js');
var _ = require('underscore');
}
// WebClient is instantiated by a browser. It contains the socket connection,
// as well as Node, Stream, and Histories pools.
var WebClient = function(io) {
this.nodes = {};
this.streams = {};
this.histories = {};
this.stats = {
messages: 0,
nodes: 0,
log_files: 0,
start: new Date()
};
this.colors = new _cm.ColorManager();
this.connected = false;
var wc = this;
// Create socket
this.socket = io.connect();
// Register connect callback
this.socket.on('connect', function() {
wc.connected = true;
wc.socket.emit('announce_web_client');
});
// Add a new Node to pool
this.socket.on('add_node', function(message) {
wc.add_node(message.node, message.logs);
});
// Remove Node from pool
this.socket.on('remove_node', function(message) {
wc.remove_node(message.node);
});
// Render new log message to screen
this.socket.on('log', function(message) {
var log_file = wc.nodes[message.node].log_files[message.log_file];
log_file.log(message.msg);
});
// LogFile ping
this.socket.on('ping', function(message) {
var log_file = wc.nodes[message.node].log_files[message.log_file];
log_file.ping();
wc.stats.messages++;
});
// Render history response to screen
this.socket.on('history_response', function(message) {
var history = wc.histories[message.history_id];
history.add_lines(message.lines);
});
// Update total message count stats
this.socket.on('stats', function(message) {
if (!wc.stats.message_offset) {
wc.stats.message_offset = message.message_count;
}
wc.stats.messages = message.message_count - wc.stats.message_offset;
});
}
WebClient.prototype = {
// Add a new Node to pool
add_node: function(nlabel, logs) {
var node = new _node.Node(nlabel, logs, this);
node.render();
this.nodes[nlabel] = node;
this.stats.nodes++;
this.stats.log_files += _(node.log_files).size();
},
// Remove Node from pool
remove_node: function(nlabel) {
var node = this.nodes[nlabel];
node.destroy();
this.stats.nodes--;
this.stats.log_files -= _(node.log_files).size();
delete this.nodes[node.label];
},
// Render all LogFiles & Stream/History screens
// Useful for screen open/closing
rerender: function() {
_(this.nodes).each(function(node, nlabel) {
_(node.log_files).each(function(log_file, llabel) {
log_file.render();
});
});
_([this.streams, this.histories]).each(function(screens, num) {
_(screens).each(function(screen, slabel) {
if (screen.num-1 > num) { screen.num -= 1; }
});
});
},
// Resize screens, defined in web_client.jquery.js
resize: function() { throw Error("WebClient.resize() not defined"); },
// Create & render new Stream screen
add_stream: function() {
var stream = new _stream.Stream(this);
this.streams[stream._id] = stream;
stream.render();
this.rerender();
},
// Close & destroy Stream screen
remove_stream: function(stream) {
stream.destroy();
delete this.streams[stream._id];
this.rerender();
},
// Create & render new History screen
add_history: function() {
var history = new _history.History(this);
this.histories[history._id] = history;
history.render();
this.rerender();
},
// Close & destroy History screen
remove_history: function(history) {
history.destroy();
delete this.histories[history._id];
this.rerender();
}
}
// Export for nodeunit tests
try {
exports.WebClient = WebClient;
} catch(err) {}