easynode/server/app/utils/test-connect.js
2022-09-12 22:46:41 +08:00

47 lines
1.4 KiB
JavaScript

// based off of https://github.com/apaszke/tcp-ping
// rewritten with modern es6 syntax & promises
const { io: ClientIO } = require('socket.io-client')
const testConnectAsync = (options) => {
let connectTimes = 0
options = Object.assign({ retryTimes: 3, timeout: 5000, host: 'http://localhost', port: '80' }, options)
const { retryTimes, host, port, timeout } = options
// eslint-disable-next-line
return new Promise(async (resolve, reject) => {
while (connectTimes < retryTimes) {
try {
connectTimes++
await connect({ host, port, timeout })
break
} catch (error) {
// 重连次数达到限制仍未连接成功
if(connectTimes === retryTimes) {
reject({ message: error.message, host, port, connectTimes })
return
}
}
}
resolve({ status: 'connect_success', host, port, connectTimes })
})
}
const connect = (options) => {
const { host, port, timeout } = options
return new Promise((resolve, reject) => {
let io = ClientIO(`${ host }:${ port }`, {
path: '/client/os-info',
forceNew: false,
timeout,
reconnection: false
})
.on('connect', () => {
resolve()
io.disconnect()
})
.on('connect_error', (error) => {
reject(error)
})
})
}
module.exports = testConnectAsync