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