Skip to content

Commit b36d085

Browse files
committed
fix: fix hanging forever server ping and weboscket connections
1 parent a4e7076 commit b36d085

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

src/mineflayer/minecraft-protocol-extra.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ import clientAutoVersion from 'minecraft-protocol/src/client/autoVersion'
33

44
export const pingServerVersion = async (ip: string, port?: number, mergeOptions: Record<string, any> = {}) => {
55
const fakeClient = new EventEmitter() as any
6-
fakeClient.on('error', (err) => {
7-
throw new Error(err.message ?? err)
8-
})
96
const options = {
107
host: ip,
118
port,
12-
noPongTimeout: Infinity, // disable timeout
9+
noPongTimeout: 10_000,
10+
closeTimeout: 20_000,
1311
...mergeOptions,
1412
}
1513
let latency = 0
@@ -19,12 +17,26 @@ export const pingServerVersion = async (ip: string, port?: number, mergeOptions:
1917
fullInfo = res
2018
}]
2119

22-
// TODO! use client.socket.destroy() instead of client.end() for faster cleanup
23-
await clientAutoVersion(fakeClient, options)
20+
// TODO use client.socket.destroy() instead of client.end() for faster cleanup
21+
clientAutoVersion(fakeClient, options)
22+
await Promise.race([
23+
new Promise<void>((resolve, reject) => {
24+
fakeClient.once('connect_allowed', () => {
25+
resolve()
26+
})
27+
}),
28+
new Promise<void>((resolve, reject) => {
29+
fakeClient.on('error', (err) => {
30+
reject(new Error(err.message ?? err))
31+
})
32+
if (mergeOptions.stream) {
33+
mergeOptions.stream.on('end', (err) => {
34+
reject(new Error('Connection closed'))
35+
})
36+
}
37+
})
38+
])
2439

25-
await new Promise<void>((resolve, reject) => {
26-
fakeClient.once('connect_allowed', resolve)
27-
})
2840
return {
2941
version: fakeClient.version,
3042
latency,

src/mineflayer/websocket-core.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,14 @@ export const getWebsocketStream = async (host: string) => {
3333
ws.addEventListener('close', () => {
3434
console.log('ws closed')
3535
clientDuplex.end()
36+
setTimeout(() => {
37+
clientDuplex.emit('end', 'Connection lost')
38+
}, 500)
3639
})
3740

3841
ws.addEventListener('error', err => {
3942
console.log('ws error', err)
43+
clientDuplex.emit('error', err)
4044
})
4145

4246
await new Promise((resolve, reject) => {

0 commit comments

Comments
 (0)