@quakejs/master 1.0.18 → 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 +27 -64
- package/master-server.js +4 -26
- package/package.json +1 -1
package/master-client.js
CHANGED
|
@@ -18,15 +18,9 @@ class MasterClient extends MasterBase {
|
|
|
18
18
|
|
|
19
19
|
(async () => {
|
|
20
20
|
try {
|
|
21
|
-
const sessionClosed = session.closed.then(
|
|
22
|
-
() => ({ done: true, value: null }),
|
|
23
|
-
(err) => { throw err; }
|
|
24
|
-
);
|
|
25
|
-
|
|
26
21
|
await session.ready;
|
|
27
22
|
|
|
28
23
|
const writer = session.datagrams.writable.getWriter();
|
|
29
|
-
const reader = session.datagrams.readable.getReader();
|
|
30
24
|
let resendTimeout;
|
|
31
25
|
|
|
32
26
|
/* send until a response is received */
|
|
@@ -39,18 +33,9 @@ class MasterClient extends MasterBase {
|
|
|
39
33
|
send();
|
|
40
34
|
|
|
41
35
|
/* read responses */
|
|
42
|
-
|
|
43
|
-
const { done, value } = await Promise.race([
|
|
44
|
-
reader.read(),
|
|
45
|
-
sessionClosed
|
|
46
|
-
]);
|
|
47
|
-
|
|
36
|
+
for await (const value of session.datagrams.readable) {
|
|
48
37
|
clearTimeout(resendTimeout);
|
|
49
38
|
|
|
50
|
-
if (done) {
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
39
|
console.log(`${host}:${port} ---> ${this.pretty(value)}`);
|
|
55
40
|
|
|
56
41
|
const msg = this.decode(value);
|
|
@@ -80,21 +65,15 @@ class MasterClient extends MasterBase {
|
|
|
80
65
|
session.closed.catch(() => {});
|
|
81
66
|
|
|
82
67
|
try {
|
|
83
|
-
|
|
84
|
-
() => ({ done: true, value: null }),
|
|
85
|
-
(err) => { throw err; }
|
|
86
|
-
);
|
|
68
|
+
let begin;
|
|
87
69
|
|
|
88
70
|
await session.ready;
|
|
89
71
|
|
|
90
|
-
const writer = session.datagrams.writable.getWriter();
|
|
91
|
-
const reader = session.datagrams.readable.getReader();
|
|
92
|
-
let begin;
|
|
93
|
-
|
|
94
72
|
/* send request multiple times until something is read back */
|
|
95
73
|
const send = () => {
|
|
96
74
|
begin = performance.now();
|
|
97
75
|
|
|
76
|
+
const writer = session.datagrams.writable.getWriter();
|
|
98
77
|
writer.write(this.encode('getinfo')).catch(() => {});
|
|
99
78
|
|
|
100
79
|
resendTimeout = setTimeout(send, 3000);
|
|
@@ -103,28 +82,23 @@ class MasterClient extends MasterBase {
|
|
|
103
82
|
send();
|
|
104
83
|
|
|
105
84
|
/* read response */
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
sessionClosed
|
|
109
|
-
]);
|
|
110
|
-
|
|
111
|
-
clearTimeout(resendTimeout);
|
|
85
|
+
for await (const value of session.datagrams.readable) {
|
|
86
|
+
clearTimeout(resendTimeout);
|
|
112
87
|
|
|
113
|
-
|
|
114
|
-
throw new Error('stream closed');
|
|
115
|
-
}
|
|
88
|
+
console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
|
|
116
89
|
|
|
117
|
-
|
|
90
|
+
const msg = this.decode(value);
|
|
118
91
|
|
|
119
|
-
|
|
92
|
+
if (!msg || msg.type !== 'infoResponse') {
|
|
93
|
+
throw new Error('invalid response type');
|
|
94
|
+
}
|
|
120
95
|
|
|
121
|
-
|
|
122
|
-
throw new Error('invalid response type');
|
|
123
|
-
}
|
|
96
|
+
msg.info.ping = Math.min((performance.now() - begin) >>> 0, 999);
|
|
124
97
|
|
|
125
|
-
|
|
98
|
+
res = msg.info;
|
|
126
99
|
|
|
127
|
-
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
128
102
|
} catch (e) {
|
|
129
103
|
console.error('getinfo failed', e);
|
|
130
104
|
throw e;
|
|
@@ -146,21 +120,15 @@ class MasterClient extends MasterBase {
|
|
|
146
120
|
session.closed.catch(() => {});
|
|
147
121
|
|
|
148
122
|
try {
|
|
149
|
-
|
|
150
|
-
() => ({ done: true, value: null }),
|
|
151
|
-
(err) => { throw err; }
|
|
152
|
-
);
|
|
123
|
+
let begin;
|
|
153
124
|
|
|
154
125
|
await session.ready;
|
|
155
126
|
|
|
156
|
-
const writer = session.datagrams.writable.getWriter();
|
|
157
|
-
const reader = session.datagrams.readable.getReader();
|
|
158
|
-
let begin;
|
|
159
|
-
|
|
160
127
|
/* send request multiple times until something is read back */
|
|
161
128
|
const send = () => {
|
|
162
129
|
begin = performance.now();
|
|
163
130
|
|
|
131
|
+
const writer = session.datagrams.writable.getWriter();
|
|
164
132
|
writer.write(this.encode('getstatus')).catch(() => {});
|
|
165
133
|
|
|
166
134
|
resendTimeout = setTimeout(send, 3000);
|
|
@@ -169,28 +137,23 @@ class MasterClient extends MasterBase {
|
|
|
169
137
|
send();
|
|
170
138
|
|
|
171
139
|
/* read response */
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
sessionClosed
|
|
175
|
-
]);
|
|
176
|
-
|
|
177
|
-
clearTimeout(resendTimeout);
|
|
140
|
+
for await (const value of session.datagrams.readable) {
|
|
141
|
+
clearTimeout(resendTimeout);
|
|
178
142
|
|
|
179
|
-
|
|
180
|
-
throw new Error('stream closed');
|
|
181
|
-
}
|
|
143
|
+
console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
|
|
182
144
|
|
|
183
|
-
|
|
145
|
+
const msg = this.decode(value);
|
|
184
146
|
|
|
185
|
-
|
|
147
|
+
if (!msg || msg.type !== 'statusResponse') {
|
|
148
|
+
throw new Error('invalid response type');
|
|
149
|
+
}
|
|
186
150
|
|
|
187
|
-
|
|
188
|
-
throw new Error('invalid response type');
|
|
189
|
-
}
|
|
151
|
+
msg.info.ping = Math.min((performance.now() - begin) >>> 0, 999);
|
|
190
152
|
|
|
191
|
-
|
|
153
|
+
res = { info: msg.info, players: msg.players };
|
|
192
154
|
|
|
193
|
-
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
194
157
|
} catch (e) {
|
|
195
158
|
console.error('getstatus failed', e);
|
|
196
159
|
throw e;
|
package/master-server.js
CHANGED
|
@@ -146,33 +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
|
-
|
|
154
|
-
const { done, value } = await sessionReader.read();
|
|
155
|
-
const session = value;
|
|
156
|
-
|
|
157
|
-
if (done) {
|
|
158
|
-
break;
|
|
159
|
-
}
|
|
160
|
-
|
|
152
|
+
for await (const session of sessionStream) {
|
|
161
153
|
/* prevent unhandled rejections before main loop */
|
|
162
154
|
session.ready.catch(() => {});
|
|
163
155
|
session.closed.catch(() => {});
|
|
164
156
|
|
|
165
157
|
(async () => {
|
|
166
158
|
try {
|
|
167
|
-
const sessionClosed = session.closed.then(
|
|
168
|
-
() => ({ done: true, value: null }),
|
|
169
|
-
(err) => { throw err; }
|
|
170
|
-
);
|
|
171
|
-
|
|
172
159
|
await session.ready;
|
|
173
160
|
|
|
174
161
|
const writer = session.datagrams.writable.getWriter();
|
|
175
|
-
const reader = session.datagrams.readable.getReader();
|
|
176
162
|
const [addr, port] = session.peerAddress.split(':');
|
|
177
163
|
let first = true;
|
|
178
164
|
|
|
@@ -183,16 +169,7 @@ class MasterServer extends MasterBase {
|
|
|
183
169
|
writer.write(data).catch(e => {});
|
|
184
170
|
};
|
|
185
171
|
|
|
186
|
-
|
|
187
|
-
const { done, value } = await Promise.race([
|
|
188
|
-
reader.read(),
|
|
189
|
-
sessionClosed
|
|
190
|
-
]);
|
|
191
|
-
|
|
192
|
-
if (done) {
|
|
193
|
-
break;
|
|
194
|
-
}
|
|
195
|
-
|
|
172
|
+
for await (const value of session.datagrams.readable) {
|
|
196
173
|
console.log(`${session.addr}:${session.port} ---> ${this.pretty(value)}`);
|
|
197
174
|
|
|
198
175
|
if (first) {
|
|
@@ -227,8 +204,9 @@ class MasterServer extends MasterBase {
|
|
|
227
204
|
}
|
|
228
205
|
}
|
|
229
206
|
} catch (e) {
|
|
230
|
-
console.error(`
|
|
207
|
+
console.error(`Session ${session.addr}:${session.port} terminated`, e);
|
|
231
208
|
} finally {
|
|
209
|
+
console.log(`Removing client ${session.addr}:${session.port}`);
|
|
232
210
|
this.#removeClient(session);
|
|
233
211
|
}
|
|
234
212
|
})();
|