@quakejs/master 1.0.14 → 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 +39 -32
- package/master-server.js +81 -78
- package/package.json +1 -1
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
25
|
-
|
|
29
|
+
(async () => {
|
|
30
|
+
try {
|
|
31
|
+
await this.#master.ready;
|
|
26
32
|
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
36
|
+
/* send until a response is received */
|
|
37
|
+
const send = () => {
|
|
38
|
+
writer.write(this.encode('subscribe'));
|
|
32
39
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}
|
|
40
|
+
resendTimeout = setTimeout(send, 1000);
|
|
41
|
+
};
|
|
36
42
|
|
|
37
|
-
|
|
43
|
+
send();
|
|
38
44
|
|
|
39
|
-
|
|
45
|
+
/* read responses */
|
|
46
|
+
while (true) {
|
|
47
|
+
const { done, value } = await reader.read();
|
|
40
48
|
|
|
41
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
51
|
+
if (done) {
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
55
54
|
|
|
56
|
-
|
|
57
|
-
const send = () => {
|
|
58
|
-
writer.write(this.encode('subscribe'));
|
|
55
|
+
console.log(`${host}:${port} ---> ${this.pretty(value)}`);
|
|
59
56
|
|
|
60
|
-
|
|
61
|
-
};
|
|
57
|
+
const msg = this.decode(value);
|
|
62
58
|
|
|
63
|
-
|
|
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
|
@@ -23,8 +23,6 @@ class MasterServer extends MasterBase {
|
|
|
23
23
|
|
|
24
24
|
#removeServer (id) {
|
|
25
25
|
delete this.#servers[id];
|
|
26
|
-
|
|
27
|
-
console.log(`${id} timed out, ${Object.keys(this.#servers).length} server(s) currently registered`);
|
|
28
26
|
}
|
|
29
27
|
|
|
30
28
|
#pruneServers () {
|
|
@@ -34,11 +32,10 @@ class MasterServer extends MasterBase {
|
|
|
34
32
|
const delta = now - server.lastUpdate;
|
|
35
33
|
|
|
36
34
|
if (delta > MasterServer.#SERVER_PRUNE_INTERVAL) {
|
|
35
|
+
console.log(`server ${server.addr}:${server.port} timed out, pruning`);
|
|
37
36
|
this.#removeServer(id);
|
|
38
37
|
}
|
|
39
38
|
}
|
|
40
|
-
|
|
41
|
-
console.log(`pruning complete, ${Object.keys(this.#servers).length} servers and ${this.#clients.length} clients remaining`);
|
|
42
39
|
}
|
|
43
40
|
|
|
44
41
|
#sendServers (session, servers) {
|
|
@@ -138,92 +135,98 @@ class MasterServer extends MasterBase {
|
|
|
138
135
|
return;
|
|
139
136
|
}
|
|
140
137
|
|
|
141
|
-
this.#
|
|
142
|
-
const sessionStream = await this.#h3.sessionStream('/');
|
|
143
|
-
const sessionReader = sessionStream.getReader();
|
|
144
|
-
|
|
145
|
-
console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
|
|
146
|
-
|
|
147
|
-
while (true) {
|
|
148
|
-
const { done, value } = await sessionReader.read();
|
|
149
|
-
const session = value;
|
|
150
|
-
|
|
151
|
-
if (done) {
|
|
152
|
-
break;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
session.ready.then(async () => {
|
|
156
|
-
const writer = session.datagrams.createWritable().getWriter();
|
|
157
|
-
const reader = session.datagrams.readable.getReader();
|
|
158
|
-
const [addr, port] = session.peerAddress.split(':');
|
|
159
|
-
let first = true;
|
|
138
|
+
this.#listening = true;
|
|
160
139
|
|
|
161
|
-
|
|
162
|
-
session.port = port;
|
|
140
|
+
this.#h3.startServer();
|
|
163
141
|
|
|
164
|
-
|
|
165
|
-
writer.write(data);
|
|
166
|
-
};
|
|
142
|
+
this.#pruneInterval = setInterval(this.#pruneServers.bind(this), MasterServer.#SERVER_PRUNE_INTERVAL);
|
|
167
143
|
|
|
168
|
-
|
|
169
|
-
|
|
144
|
+
(async () => {
|
|
145
|
+
try {
|
|
146
|
+
await this.#h3.ready;
|
|
170
147
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
}
|
|
148
|
+
const sessionStream = await this.#h3.sessionStream('/');
|
|
149
|
+
const sessionReader = sessionStream.getReader();
|
|
174
150
|
|
|
175
|
-
|
|
151
|
+
console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
|
|
176
152
|
|
|
177
|
-
|
|
178
|
-
|
|
153
|
+
while (true) {
|
|
154
|
+
const { done, value } = await sessionReader.read();
|
|
155
|
+
const session = value;
|
|
179
156
|
|
|
180
|
-
|
|
157
|
+
if (done) {
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
181
160
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
+
}
|
|
185
216
|
}
|
|
186
|
-
}
|
|
187
217
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
break;
|
|
194
|
-
case 'subscribe':
|
|
195
|
-
this.#handleSubscribe(session, msg);
|
|
196
|
-
break;
|
|
197
|
-
case 'getservers':
|
|
198
|
-
this.#handleGetServers(session, msg);
|
|
199
|
-
break;
|
|
200
|
-
case 'infoResponse':
|
|
201
|
-
this.#handleInfoResponse(session, msg);
|
|
202
|
-
break;
|
|
203
|
-
default:
|
|
204
|
-
console.error('Invalid message');
|
|
205
|
-
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);
|
|
206
223
|
}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
session.closed.catch((e) => {
|
|
213
|
-
console.error(`Stream error, peer ${session.addr}:${session.port}`, e);
|
|
214
|
-
}).finally(() => {
|
|
215
|
-
this.#removeClient(session);
|
|
216
|
-
});
|
|
224
|
+
})();
|
|
225
|
+
}
|
|
226
|
+
} catch (e) {
|
|
227
|
+
console.error(e);
|
|
217
228
|
}
|
|
218
|
-
})
|
|
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
|
|