@quakejs/master 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/master-client.js CHANGED
@@ -15,52 +15,59 @@ class MasterClient extends MasterBase {
15
15
  let resendTimeout;
16
16
 
17
17
  if (this.#master) {
18
- this.#master.close();
19
- this.#master = null;
18
+ try {
19
+ this.#master.close();
20
+ } catch (e) {
21
+ console.error(e);
22
+ } finally {
23
+ this.#master = null;
24
+ }
20
25
  }
21
26
 
22
27
  this.#master = new WebTransport(`${host}:${port}`);
23
28
 
24
- const writer = this.#master.datagrams.writable.getWriter();
25
- const reader = this.#master.datagrams.readable.getReader();
29
+ (async () => {
30
+ try {
31
+ await this.#master.ready;
26
32
 
27
- this.#master.ready.then(async () => {
28
- while (true) {
29
- const { done, value } = await reader.read();
33
+ const writer = this.#master.datagrams.writable.getWriter();
34
+ const reader = this.#master.datagrams.readable.getReader();
30
35
 
31
- clearTimeout(resendTimeout);
36
+ /* send until a response is received */
37
+ const send = () => {
38
+ writer.write(this.encode('subscribe'));
32
39
 
33
- if (done) {
34
- break;
35
- }
40
+ resendTimeout = setTimeout(send, 1000);
41
+ };
36
42
 
37
- console.log(`${host}:${port} ---> ${this.pretty(value)}`);
43
+ send();
38
44
 
39
- const msg = this.decode(value);
45
+ /* read responses */
46
+ while (true) {
47
+ const { done, value } = await reader.read();
40
48
 
41
- if (msg && msg.type === 'getserversResponse') {
42
- for (const server of msg.servers) {
43
- this.#onserver(server.addr, server.port);
44
- }
45
- }
46
- }
47
- }).catch((e) => {
48
- console.error(`Stream error, connection to ${host}:${port} lost`, e);
49
- });
49
+ clearTimeout(resendTimeout);
50
50
 
51
- this.#master.closed.catch((e) => {
52
- console.error(`Stream error, connection to ${host}:${port} lost`, e);
53
- this.#master = null;
54
- });
51
+ if (done) {
52
+ break;
53
+ }
55
54
 
56
- /* send until a response is received */
57
- const send = () => {
58
- writer.write(this.encode('subscribe'));
55
+ console.log(`${host}:${port} ---> ${this.pretty(value)}`);
59
56
 
60
- resendTimeout = setTimeout(send, 1000);
61
- };
57
+ const msg = this.decode(value);
62
58
 
63
- send();
59
+ if (msg && msg.type === 'getserversResponse') {
60
+ for (const server of msg.servers) {
61
+ this.#onserver(server.addr, server.port);
62
+ }
63
+ }
64
+ }
65
+ } catch (e) {
66
+ console.error(`Stream error, connection to ${host}:${port} lost`, e);
67
+ } finally {
68
+ this.#master = null;
69
+ }
70
+ })();
64
71
  }
65
72
 
66
73
  async getinfo (addr, port) {
package/master-server.js CHANGED
@@ -23,8 +23,6 @@ class MasterServer extends MasterBase {
23
23
 
24
24
  #removeServer (id) {
25
25
  delete this.#servers[id];
26
-
27
- console.log(`${id} timed out, ${Object.keys(this.#servers).length} server(s) currently registered`);
28
26
  }
29
27
 
30
28
  #pruneServers () {
@@ -34,11 +32,10 @@ class MasterServer extends MasterBase {
34
32
  const delta = now - server.lastUpdate;
35
33
 
36
34
  if (delta > MasterServer.#SERVER_PRUNE_INTERVAL) {
35
+ console.log(`server ${server.addr}:${server.port} timed out, pruning`);
37
36
  this.#removeServer(id);
38
37
  }
39
38
  }
40
-
41
- console.log(`pruning complete, ${Object.keys(this.#servers).length} servers and ${this.#clients.length} clients remaining`);
42
39
  }
43
40
 
44
41
  #sendServers (session, servers) {
@@ -138,92 +135,98 @@ class MasterServer extends MasterBase {
138
135
  return;
139
136
  }
140
137
 
141
- this.#h3.ready.then(async () => {
142
- const sessionStream = await this.#h3.sessionStream('/');
143
- const sessionReader = sessionStream.getReader();
144
-
145
- console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
146
-
147
- while (true) {
148
- const { done, value } = await sessionReader.read();
149
- const session = value;
150
-
151
- if (done) {
152
- break;
153
- }
154
-
155
- session.ready.then(async () => {
156
- const writer = session.datagrams.createWritable().getWriter();
157
- const reader = session.datagrams.readable.getReader();
158
- const [addr, port] = session.peerAddress.split(':');
159
- let first = true;
138
+ this.#listening = true;
160
139
 
161
- session.addr = addr;
162
- session.port = port;
140
+ this.#h3.startServer();
163
141
 
164
- session.write = (data) => {
165
- writer.write(data);
166
- };
142
+ this.#pruneInterval = setInterval(this.#pruneServers.bind(this), MasterServer.#SERVER_PRUNE_INTERVAL);
167
143
 
168
- while (true) {
169
- const { done, value } = await reader.read();
144
+ (async () => {
145
+ try {
146
+ await this.#h3.ready;
170
147
 
171
- if (done) {
172
- return;
173
- }
148
+ const sessionStream = await this.#h3.sessionStream('/');
149
+ const sessionReader = sessionStream.getReader();
174
150
 
175
- console.log(`${session.addr}:${session.port} ---> ${this.pretty(value)}`);
151
+ console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
176
152
 
177
- if (first) {
178
- const str = String.fromCharCode.apply(null, value);
153
+ while (true) {
154
+ const { done, value } = await sessionReader.read();
155
+ const session = value;
179
156
 
180
- first = false;
157
+ if (done) {
158
+ break;
159
+ }
181
160
 
182
- if (str.startsWith('\xff\xff\xff\xffport')) {
183
- this.#handleEmscriptenPort(session, str.substr(9));
184
- continue;
161
+ (async () => {
162
+ try {
163
+ await session.ready;
164
+
165
+ const writer = session.datagrams.createWritable().getWriter();
166
+ const reader = session.datagrams.readable.getReader();
167
+ const [addr, port] = session.peerAddress.split(':');
168
+ let first = true;
169
+
170
+ session.addr = addr;
171
+ session.port = port;
172
+
173
+ session.write = (data) => {
174
+ writer.write(data);
175
+ };
176
+
177
+ while (true) {
178
+ const { done, value } = await reader.read();
179
+
180
+ if (done) {
181
+ return;
182
+ }
183
+
184
+ console.log(`${session.addr}:${session.port} ---> ${this.pretty(value)}`);
185
+
186
+ if (first) {
187
+ const str = String.fromCharCode.apply(null, value);
188
+
189
+ first = false;
190
+
191
+ if (str.startsWith('\xff\xff\xff\xffport')) {
192
+ this.#handleEmscriptenPort(session, str.substr(9));
193
+ continue;
194
+ }
195
+ }
196
+
197
+ const msg = this.decode(value);
198
+
199
+ switch (msg?.type) {
200
+ case 'heartbeat':
201
+ this.#handleHeartbeat(session, msg);
202
+ break;
203
+ case 'subscribe':
204
+ this.#handleSubscribe(session, msg);
205
+ break;
206
+ case 'getservers':
207
+ this.#handleGetServers(session, msg);
208
+ break;
209
+ case 'infoResponse':
210
+ this.#handleInfoResponse(session, msg);
211
+ break;
212
+ default:
213
+ console.error('Invalid message');
214
+ break;
215
+ }
185
216
  }
186
- }
187
217
 
188
- const msg = this.decode(value);
189
-
190
- switch (msg?.type) {
191
- case 'heartbeat':
192
- this.#handleHeartbeat(session, msg);
193
- break;
194
- case 'subscribe':
195
- this.#handleSubscribe(session, msg);
196
- break;
197
- case 'getservers':
198
- this.#handleGetServers(session, msg);
199
- break;
200
- case 'infoResponse':
201
- this.#handleInfoResponse(session, msg);
202
- break;
203
- default:
204
- console.error('Invalid message');
205
- break;
218
+ console.log(`Client ${session.addr}:${session.port} disconnected`);
219
+ } catch (e) {
220
+ console.error(`Client ${session.addr}:${session.port} disconnected due to error`, e);
221
+ } finally {
222
+ this.#removeClient(session);
206
223
  }
207
- }
208
- }).catch((e) => {
209
- console.error(`Stream error, peer ${session.addr}:${session.port}`, e);
210
- });
211
-
212
- session.closed.catch((e) => {
213
- console.error(`Stream error, peer ${session.addr}:${session.port}`, e);
214
- }).finally(() => {
215
- this.#removeClient(session);
216
- });
224
+ })();
225
+ }
226
+ } catch (e) {
227
+ console.error(e);
217
228
  }
218
- }).catch((e) => {
219
- console.error(e);
220
- });
221
-
222
- this.#h3.startServer();
223
-
224
- this.#pruneInterval = setInterval(this.#pruneServers.bind(this), MasterServer.#SERVER_PRUNE_INTERVAL);
225
-
226
- this.#listening = true;
229
+ })();
227
230
  }
228
231
  }
229
232
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quakejs/master",
3
- "version": "1.0.14",
3
+ "version": "1.0.16",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "bin": {