@quakejs/master 1.0.15 → 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
@@ -36,8 +36,6 @@ class MasterServer extends MasterBase {
36
36
  this.#removeServer(id);
37
37
  }
38
38
  }
39
-
40
- console.log(`pruning complete, ${Object.keys(this.#servers).length} servers and ${this.#clients.length} clients remaining`);
41
39
  }
42
40
 
43
41
  #sendServers (session, servers) {
@@ -137,93 +135,98 @@ class MasterServer extends MasterBase {
137
135
  return;
138
136
  }
139
137
 
140
- this.#h3.ready.then(async () => {
141
- const sessionStream = await this.#h3.sessionStream('/');
142
- const sessionReader = sessionStream.getReader();
143
-
144
- console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
145
-
146
- while (true) {
147
- const { done, value } = await sessionReader.read();
148
- const session = value;
149
-
150
- if (done) {
151
- break;
152
- }
153
-
154
- session.ready.then(async () => {
155
- const writer = session.datagrams.createWritable().getWriter();
156
- const reader = session.datagrams.readable.getReader();
157
- const [addr, port] = session.peerAddress.split(':');
158
- let first = true;
138
+ this.#listening = true;
159
139
 
160
- session.addr = addr;
161
- session.port = port;
140
+ this.#h3.startServer();
162
141
 
163
- session.write = (data) => {
164
- writer.write(data);
165
- };
142
+ this.#pruneInterval = setInterval(this.#pruneServers.bind(this), MasterServer.#SERVER_PRUNE_INTERVAL);
166
143
 
167
- while (true) {
168
- const { done, value } = await reader.read();
144
+ (async () => {
145
+ try {
146
+ await this.#h3.ready;
169
147
 
170
- if (done) {
171
- return;
172
- }
148
+ const sessionStream = await this.#h3.sessionStream('/');
149
+ const sessionReader = sessionStream.getReader();
173
150
 
174
- console.log(`${session.addr}:${session.port} ---> ${this.pretty(value)}`);
151
+ console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
175
152
 
176
- if (first) {
177
- const str = String.fromCharCode.apply(null, value);
153
+ while (true) {
154
+ const { done, value } = await sessionReader.read();
155
+ const session = value;
178
156
 
179
- first = false;
157
+ if (done) {
158
+ break;
159
+ }
180
160
 
181
- if (str.startsWith('\xff\xff\xff\xffport')) {
182
- this.#handleEmscriptenPort(session, str.substr(9));
183
- 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
+ }
184
216
  }
185
- }
186
217
 
187
- const msg = this.decode(value);
188
-
189
- switch (msg?.type) {
190
- case 'heartbeat':
191
- this.#handleHeartbeat(session, msg);
192
- break;
193
- case 'subscribe':
194
- this.#handleSubscribe(session, msg);
195
- break;
196
- case 'getservers':
197
- this.#handleGetServers(session, msg);
198
- break;
199
- case 'infoResponse':
200
- this.#handleInfoResponse(session, msg);
201
- break;
202
- default:
203
- console.error('Invalid message');
204
- 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);
205
223
  }
206
- }
207
- }).catch((e) => {
208
- console.error(`Stream error, peer ${session.addr}:${session.port}`, e);
209
- });
210
-
211
- session.closed.catch((e) => {
212
- console.error(`Stream error, peer ${session.addr}:${session.port}`, e);
213
- }).finally(() => {
214
- console.log(`client ${session.addr}:${session.port} disconnected`);
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.15",
3
+ "version": "1.0.16",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "bin": {