@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 +85 -77
- package/master-server.js +9 -21
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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
|
|
21
|
+
await session.ready;
|
|
32
22
|
|
|
33
|
-
const writer =
|
|
34
|
-
|
|
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
|
-
|
|
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(
|
|
52
|
+
console.error('Disconnected from master server due to error', e);
|
|
67
53
|
} finally {
|
|
68
|
-
|
|
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
|
|
62
|
+
let res;
|
|
79
63
|
|
|
80
|
-
|
|
64
|
+
session.ready.catch(() => {});
|
|
65
|
+
session.closed.catch(() => {});
|
|
81
66
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
begin = performance.now();
|
|
67
|
+
try {
|
|
68
|
+
let begin;
|
|
85
69
|
|
|
86
|
-
|
|
70
|
+
await session.ready;
|
|
87
71
|
|
|
88
|
-
|
|
89
|
-
|
|
72
|
+
/* send request multiple times until something is read back */
|
|
73
|
+
const send = () => {
|
|
74
|
+
begin = performance.now();
|
|
90
75
|
|
|
91
|
-
|
|
76
|
+
const writer = session.datagrams.writable.getWriter();
|
|
77
|
+
writer.write(this.encode('getinfo')).catch(() => {});
|
|
92
78
|
|
|
93
|
-
|
|
94
|
-
|
|
79
|
+
resendTimeout = setTimeout(send, 3000);
|
|
80
|
+
};
|
|
95
81
|
|
|
96
|
-
|
|
82
|
+
send();
|
|
97
83
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
84
|
+
/* read response */
|
|
85
|
+
for await (const value of session.datagrams.readable) {
|
|
86
|
+
clearTimeout(resendTimeout);
|
|
101
87
|
|
|
102
|
-
|
|
88
|
+
console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
|
|
103
89
|
|
|
104
|
-
|
|
90
|
+
const msg = this.decode(value);
|
|
105
91
|
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
} catch (e) {
|
|
103
|
+
console.error('getinfo failed', e);
|
|
104
|
+
throw e;
|
|
105
|
+
} finally {
|
|
106
|
+
clearTimeout(resendTimeout);
|
|
111
107
|
|
|
112
|
-
|
|
108
|
+
session.close();
|
|
109
|
+
}
|
|
113
110
|
|
|
114
|
-
return
|
|
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
|
|
117
|
+
let res;
|
|
123
118
|
|
|
124
|
-
|
|
119
|
+
session.ready.catch(() => {});
|
|
120
|
+
session.closed.catch(() => {});
|
|
125
121
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
begin = performance.now();
|
|
122
|
+
try {
|
|
123
|
+
let begin;
|
|
129
124
|
|
|
130
|
-
|
|
125
|
+
await session.ready;
|
|
131
126
|
|
|
132
|
-
|
|
133
|
-
|
|
127
|
+
/* send request multiple times until something is read back */
|
|
128
|
+
const send = () => {
|
|
129
|
+
begin = performance.now();
|
|
134
130
|
|
|
135
|
-
|
|
131
|
+
const writer = session.datagrams.writable.getWriter();
|
|
132
|
+
writer.write(this.encode('getstatus')).catch(() => {});
|
|
136
133
|
|
|
137
|
-
|
|
138
|
-
|
|
134
|
+
resendTimeout = setTimeout(send, 3000);
|
|
135
|
+
};
|
|
139
136
|
|
|
140
|
-
|
|
137
|
+
send();
|
|
141
138
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
139
|
+
/* read response */
|
|
140
|
+
for await (const value of session.datagrams.readable) {
|
|
141
|
+
clearTimeout(resendTimeout);
|
|
145
142
|
|
|
146
|
-
|
|
143
|
+
console.log(`${addr}:${port} ---> ${this.pretty(value)}`);
|
|
147
144
|
|
|
148
|
-
|
|
145
|
+
const msg = this.decode(value);
|
|
149
146
|
|
|
150
|
-
|
|
151
|
-
|
|
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
|
-
|
|
153
|
+
res = { info: msg.info, players: msg.players };
|
|
155
154
|
|
|
156
|
-
|
|
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
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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.
|
|
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
|
-
|
|
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(`
|
|
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
|
})();
|