@quakejs/master 1.0.15 → 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 +80 -77
- 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
|
@@ -36,8 +36,6 @@ class MasterServer extends MasterBase {
|
|
|
36
36
|
this.#removeServer(id);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
console.log(`pruning complete, ${Object.keys(this.#servers).length} servers and ${this.#clients.length} clients remaining`);
|
|
41
39
|
}
|
|
42
40
|
|
|
43
41
|
#sendServers (session, servers) {
|
|
@@ -137,93 +135,98 @@ class MasterServer extends MasterBase {
|
|
|
137
135
|
return;
|
|
138
136
|
}
|
|
139
137
|
|
|
140
|
-
this.#
|
|
141
|
-
const sessionStream = await this.#h3.sessionStream('/');
|
|
142
|
-
const sessionReader = sessionStream.getReader();
|
|
143
|
-
|
|
144
|
-
console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
|
|
145
|
-
|
|
146
|
-
while (true) {
|
|
147
|
-
const { done, value } = await sessionReader.read();
|
|
148
|
-
const session = value;
|
|
149
|
-
|
|
150
|
-
if (done) {
|
|
151
|
-
break;
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
session.ready.then(async () => {
|
|
155
|
-
const writer = session.datagrams.createWritable().getWriter();
|
|
156
|
-
const reader = session.datagrams.readable.getReader();
|
|
157
|
-
const [addr, port] = session.peerAddress.split(':');
|
|
158
|
-
let first = true;
|
|
138
|
+
this.#listening = true;
|
|
159
139
|
|
|
160
|
-
|
|
161
|
-
session.port = port;
|
|
140
|
+
this.#h3.startServer();
|
|
162
141
|
|
|
163
|
-
|
|
164
|
-
writer.write(data);
|
|
165
|
-
};
|
|
142
|
+
this.#pruneInterval = setInterval(this.#pruneServers.bind(this), MasterServer.#SERVER_PRUNE_INTERVAL);
|
|
166
143
|
|
|
167
|
-
|
|
168
|
-
|
|
144
|
+
(async () => {
|
|
145
|
+
try {
|
|
146
|
+
await this.#h3.ready;
|
|
169
147
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
}
|
|
148
|
+
const sessionStream = await this.#h3.sessionStream('/');
|
|
149
|
+
const sessionReader = sessionStream.getReader();
|
|
173
150
|
|
|
174
|
-
|
|
151
|
+
console.log(`listening on ${this.#h3.host}:${this.#h3.port}`);
|
|
175
152
|
|
|
176
|
-
|
|
177
|
-
|
|
153
|
+
while (true) {
|
|
154
|
+
const { done, value } = await sessionReader.read();
|
|
155
|
+
const session = value;
|
|
178
156
|
|
|
179
|
-
|
|
157
|
+
if (done) {
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
180
160
|
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
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
|
+
}
|
|
184
216
|
}
|
|
185
|
-
}
|
|
186
217
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
break;
|
|
193
|
-
case 'subscribe':
|
|
194
|
-
this.#handleSubscribe(session, msg);
|
|
195
|
-
break;
|
|
196
|
-
case 'getservers':
|
|
197
|
-
this.#handleGetServers(session, msg);
|
|
198
|
-
break;
|
|
199
|
-
case 'infoResponse':
|
|
200
|
-
this.#handleInfoResponse(session, msg);
|
|
201
|
-
break;
|
|
202
|
-
default:
|
|
203
|
-
console.error('Invalid message');
|
|
204
|
-
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);
|
|
205
223
|
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
session.closed.catch((e) => {
|
|
212
|
-
console.error(`Stream error, peer ${session.addr}:${session.port}`, e);
|
|
213
|
-
}).finally(() => {
|
|
214
|
-
console.log(`client ${session.addr}:${session.port} disconnected`);
|
|
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
|
|