@quakejs/master 1.0.17 → 1.0.19

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
@@ -2,40 +2,30 @@ import MasterBase from './master-base.js';
2
2
 
3
3
  class MasterClient extends MasterBase {
4
4
  #onserver;
5
- #master;
6
5
 
7
6
  constructor (onserver) {
8
7
  super();
9
8
 
10
9
  this.#onserver = onserver;
11
- this.#master = null;
12
10
  }
13
11
 
14
12
  subscribe (host, port) {
15
- let resendTimeout;
16
-
17
- if (this.#master) {
18
- try {
19
- this.#master.close();
20
- } catch (e) {
21
- console.error(e);
22
- } finally {
23
- this.#master = null;
24
- }
25
- }
13
+ const session = new WebTransport(`${host}:${port}`);
26
14
 
27
- this.#master = new WebTransport(`${host}:${port}`);
15
+ /* prevent unhandled rejections before main loop */
16
+ session.ready.catch(() => {});
17
+ session.closed.catch(() => {});
28
18
 
29
19
  (async () => {
30
20
  try {
31
- await this.#master.ready;
21
+ await session.ready;
32
22
 
33
- const writer = this.#master.datagrams.writable.getWriter();
34
- const reader = this.#master.datagrams.readable.getReader();
23
+ const writer = session.datagrams.writable.getWriter();
24
+ let resendTimeout;
35
25
 
36
26
  /* send until a response is received */
37
27
  const send = () => {
38
- writer.write(this.encode('subscribe'));
28
+ writer.write(this.encode('subscribe')).catch(() => {});
39
29
 
40
30
  resendTimeout = setTimeout(send, 1000);
41
31
  };
@@ -43,15 +33,9 @@ class MasterClient extends MasterBase {
43
33
  send();
44
34
 
45
35
  /* read responses */
46
- while (true) {
47
- const { done, value } = await reader.read();
48
-
36
+ for await (const value of session.datagrams.readable) {
49
37
  clearTimeout(resendTimeout);
50
38
 
51
- if (done) {
52
- break;
53
- }
54
-
55
39
  console.log(`${host}:${port} ---> ${this.pretty(value)}`);
56
40
 
57
41
  const msg = this.decode(value);
@@ -62,100 +46,124 @@ class MasterClient extends MasterBase {
62
46
  }
63
47
  }
64
48
  }
49
+
50
+ console.log(`Disconnected from master server`);
65
51
  } catch (e) {
66
- console.error(`Stream error, connection to ${host}:${port} lost`, e);
52
+ console.error('Disconnected from master server due to error', e);
67
53
  } finally {
68
- this.#master = null;
54
+ clearTimeout(resendTimeout);
69
55
  }
70
56
  })();
71
57
  }
72
58
 
73
59
  async getinfo (addr, port) {
74
60
  const session = new WebTransport(`https://${addr}:${port}`);
75
- const writer = session.datagrams.writable.getWriter();
76
- const reader = session.datagrams.readable.getReader();
77
61
  let resendTimeout;
78
- let begin;
62
+ let res;
79
63
 
80
- await session.ready;
64
+ session.ready.catch(() => {});
65
+ session.closed.catch(() => {});
81
66
 
82
- /* send request multiple times until something is read back */
83
- const send = () => {
84
- begin = performance.now();
67
+ try {
68
+ let begin;
85
69
 
86
- writer.write(this.encode('getinfo'));
70
+ await session.ready;
87
71
 
88
- resendTimeout = setTimeout(send, 3000);
89
- };
72
+ /* send request multiple times until something is read back */
73
+ const send = () => {
74
+ begin = performance.now();
90
75
 
91
- send();
76
+ const writer = session.datagrams.writable.getWriter();
77
+ writer.write(this.encode('getinfo')).catch(() => {});
92
78
 
93
- /* read response */
94
- const { done, value } = await reader.read();
79
+ resendTimeout = setTimeout(send, 3000);
80
+ };
95
81
 
96
- clearTimeout(resendTimeout);
82
+ send();
97
83
 
98
- if (done) {
99
- throw new Error('getinfo failed, no response received');
100
- }
84
+ /* read response */
85
+ for await (const value of session.datagrams.readable) {
86
+ clearTimeout(resendTimeout);
101
87
 
102
- console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
88
+ console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
103
89
 
104
- const msg = this.decode(value);
90
+ const msg = this.decode(value);
105
91
 
106
- if (!msg || msg.type !== 'infoResponse') {
107
- throw new Error('getinfo failed, didn\'t receive infoResponse');
108
- }
92
+ if (!msg || msg.type !== 'infoResponse') {
93
+ throw new Error('invalid response type');
94
+ }
95
+
96
+ msg.info.ping = Math.min((performance.now() - begin) >>> 0, 999);
97
+
98
+ res = msg.info;
109
99
 
110
- msg.info.ping = Math.min((performance.now() - begin) >>> 0, 999);
100
+ break;
101
+ }
102
+ } catch (e) {
103
+ console.error('getinfo failed', e);
104
+ throw e;
105
+ } finally {
106
+ clearTimeout(resendTimeout);
111
107
 
112
- session.close();
108
+ session.close();
109
+ }
113
110
 
114
- return msg.info;
111
+ return res;
115
112
  }
116
113
 
117
114
  async getstatus (addr, port) {
118
115
  const session = new WebTransport(`https://${addr}:${port}`);
119
- const writer = session.datagrams.writable.getWriter();
120
- const reader = session.datagrams.readable.getReader();
121
116
  let resendTimeout;
122
- let begin;
117
+ let res;
123
118
 
124
- await session.ready;
119
+ session.ready.catch(() => {});
120
+ session.closed.catch(() => {});
125
121
 
126
- /* send request multiple times until something is read back */
127
- const send = () => {
128
- begin = performance.now();
122
+ try {
123
+ let begin;
129
124
 
130
- writer.write(this.encode('getstatus'));
125
+ await session.ready;
131
126
 
132
- resendTimeout = setTimeout(send, 3000);
133
- };
127
+ /* send request multiple times until something is read back */
128
+ const send = () => {
129
+ begin = performance.now();
134
130
 
135
- send();
131
+ const writer = session.datagrams.writable.getWriter();
132
+ writer.write(this.encode('getstatus')).catch(() => {});
136
133
 
137
- /* read response */
138
- const { done, value } = await reader.read();
134
+ resendTimeout = setTimeout(send, 3000);
135
+ };
139
136
 
140
- clearTimeout(resendTimeout);
137
+ send();
141
138
 
142
- if (done) {
143
- throw new Error('getstatus failed, no response received');
144
- }
139
+ /* read response */
140
+ for await (const value of session.datagrams.readable) {
141
+ clearTimeout(resendTimeout);
145
142
 
146
- console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
143
+ console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
147
144
 
148
- const msg = this.decode(value);
145
+ const msg = this.decode(value);
149
146
 
150
- if (!msg || msg.type !== 'statusResponse') {
151
- throw new Error('getstatus failed, didn\'t receive statusResponse');
152
- }
147
+ if (!msg || msg.type !== 'statusResponse') {
148
+ throw new Error('invalid response type');
149
+ }
150
+
151
+ msg.info.ping = Math.min((performance.now() - begin) >>> 0, 999);
153
152
 
154
- msg.info.ping = Math.min((performance.now() - begin) >>> 0, 999);
153
+ res = { info: msg.info, players: msg.players };
155
154
 
156
- session.close();
155
+ break;
156
+ }
157
+ } catch (e) {
158
+ console.error('getstatus failed', e);
159
+ throw e;
160
+ } finally {
161
+ clearTimeout(resendTimeout);
162
+
163
+ session.close();
164
+ }
157
165
 
158
- return { info: msg.info, players: msg.players };
166
+ return res;
159
167
  }
160
168
  }
161
169
 
package/master-server.js CHANGED
@@ -146,24 +146,19 @@ class MasterServer extends MasterBase {
146
146
  await this.#h3.ready;
147
147
 
148
148
  const sessionStream = await this.#h3.sessionStream('/');
149
- const sessionReader = sessionStream.getReader();
150
149
 
151
150
  console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
152
151
 
153
- while (true) {
154
- const { done, value } = await sessionReader.read();
155
- const session = value;
156
-
157
- if (done) {
158
- break;
159
- }
152
+ for await (const session of sessionStream) {
153
+ /* prevent unhandled rejections before main loop */
154
+ session.ready.catch(() => {});
155
+ session.closed.catch(() => {});
160
156
 
161
157
  (async () => {
162
158
  try {
163
159
  await session.ready;
164
160
 
165
- const writer = session.datagrams.createWritable().getWriter();
166
- const reader = session.datagrams.readable.getReader();
161
+ const writer = session.datagrams.writable.getWriter();
167
162
  const [addr, port] = session.peerAddress.split(':');
168
163
  let first = true;
169
164
 
@@ -171,16 +166,10 @@ class MasterServer extends MasterBase {
171
166
  session.port = port;
172
167
 
173
168
  session.write = (data) => {
174
- writer.write(data);
169
+ writer.write(data).catch(e => {});
175
170
  };
176
171
 
177
- while (true) {
178
- const { done, value } = await reader.read();
179
-
180
- if (done) {
181
- break;
182
- }
183
-
172
+ for await (const value of session.datagrams.readable) {
184
173
  console.log(`${session.addr}:${session.port} ---> ${this.pretty(value)}`);
185
174
 
186
175
  if (first) {
@@ -214,11 +203,10 @@ class MasterServer extends MasterBase {
214
203
  break;
215
204
  }
216
205
  }
217
-
218
- console.log(`Client ${session.addr}:${session.port} disconnected`);
219
206
  } catch (e) {
220
- console.error(`Client ${session.addr}:${session.port} disconnected due to error`, e);
207
+ console.error(`Session ${session.addr}:${session.port} terminated`, e);
221
208
  } finally {
209
+ console.log(`Removing client ${session.addr}:${session.port}`);
222
210
  this.#removeClient(session);
223
211
  }
224
212
  })();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quakejs/master",
3
- "version": "1.0.17",
3
+ "version": "1.0.19",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "bin": {