]> git.mar77i.info Git - hublib/blob - webroot/first/master.js
big cleanup and refactoring #2: scramble master ws uri again
[hublib] / webroot / first / master.js
1 (function () {
2 "use strict";
3 var input_div = null;
4 var clients_list = null;
5
6 function write(msg) {
7 common.write(input_div.previousSibling, msg);
8 }
9
10 function master_send(hub, client_ids, client_id, obj) {
11 obj.client_ids = client_ids;
12 obj.client_id = client_id;
13 hub.send(JSON.stringify(obj));
14 }
15
16 function ClientsList() {
17 function Client(clients_list, client_id, name) {
18 var client_label;
19
20 this.clients_list = clients_list;
21 this.id = client_id;
22 this.get_label = function () {
23 return "client-" + this.id.toString();
24 };
25 client_label = this.get_label();
26 this.name = name || client_label;
27
28 this.li = common.tag("li")
29 this.checkbox = common.tag(
30 "input",
31 {
32 "type": "checkbox",
33 "id": "checkbox-" + client_label,
34 "checked": "",
35 },
36 );
37 this.li.append(this.checkbox);
38 clients_list.ul.append(this.li);
39 this.set_name = function (new_name) {
40 var old_name = this.name;
41 this.name = new_name;
42 while (this.checkbox.nextSibling)
43 this.checkbox.nextSibling.remove();
44 this.checkbox.parentNode.append(document.createTextNode(new_name));
45 return old_name;
46 };
47 this.set_name(client_label);
48 }
49 this.clients = {};
50 this.ul = common.tag("ul");
51 document.body.append(this.ul);
52
53 this.append = function (client_id) {
54 var client = new Client(this, client_id);
55 this.clients[client_id.toString()] = client;
56 return client;
57 };
58 this.remove = function (client_id) {
59 var client = this.clients[client_id];
60 if (client) {
61 client.li.remove();
62 delete this.clients[client_id];
63 }
64 return client;
65 };
66 this.all = function () {
67 var key;
68 var result = [];
69 for (key in this.clients) {
70 result.push(this.clients[key].id);
71 }
72 return result;
73 };
74 this.selected = function () {
75 var key;
76 var client;
77 var result = [];
78 for (key in this.clients) {
79 client = this.clients[key];
80 if (client.checkbox.checked) {
81 result.push(client.id);
82 }
83 }
84 return result;
85 };
86 }
87
88 function open() {
89 var hub = this;
90 clients_list = new ClientsList();
91 input_div = common.tag("div");
92 input_div.append(document.createTextNode("MASTER "));
93 input_div.append(
94 common.input_with_keydown_event(
95 function (event, target, keycode) {
96 if (keycode !== "Enter" && keycode !== "NumpadEnter") {
97 return;
98 }
99 hub.send(JSON.stringify({
100 "client_ids": clients_list.selected(),
101 "name": "MASTER",
102 "data": target.value,
103 }));
104 write("MASTER: " + target.value);
105 target.value = "";
106 }
107 )
108 );
109
110 document.body.append(common.tag("div")); // output
111 document.body.append(input_div);
112 write("connected to ws_master");
113 }
114
115 function close() {
116 write("connection lost");
117 input_div.remove();
118 }
119
120 function join_leave_broadcast(hub, client, action) {
121 if (!client) {
122 return;
123 }
124 write("[action]: " + client.name + " " + action + "s");
125 master_send(hub, clients_list.all(), client.id, {
126 "action": action,
127 "name": client.name,
128 });
129 }
130
131 function message(msg) {
132 var obj = JSON.parse(msg.data);
133 var client;
134 if (obj.action === "join") {
135 join_leave_broadcast(this, clients_list.append(obj.client_id), obj.action);
136 return;
137 } else if (obj.action === "leave") {
138 join_leave_broadcast(this, clients_list.remove(obj.client_id), obj.action);
139 return;
140 }
141 client = clients_list.clients[obj.client_id.toString()];
142
143 if (obj.action == "set_name") {
144 write(
145 "[action]: " +
146 client.name +
147 " changes name to " +
148 obj.name
149 );
150 master_send(this, clients_list.all(), client.id, {
151 "action": "set_name",
152 "old_name": client.name,
153 "name": obj.name,
154 });
155 client.set_name(obj.name);
156 } else if (obj.hasOwnProperty("data")) {
157 write(client.name + " [" + client.id + "]: " + obj.data);
158 master_send(this, clients_list.all(), client.id, {
159 "name": client.name,
160 "data": obj.data,
161 });
162 }
163 }
164
165 common.setup(function () { new common.HubClient(ws_uri, open, close, message); });
166 })();