diff --git a/bin/doctor.ts b/bin/doctor.ts index 9739b4ea932d42c0673d8d058c25907a1aba1648..05f021598f4b11d2bc504983c135d6ef388bb001 100755 --- a/bin/doctor.ts +++ b/bin/doctor.ts @@ -14,14 +14,36 @@ import { } from '../src/config' import { Wechaty } from '../src/wechaty' +import { Doctor } from '../src/doctor' + const wechaty = Wechaty.instance() +const doctor = new Doctor() + +async function main() { + let ipcTestResult: string + try { + await doctor.testTcp() + ipcTestResult = 'PASS' + } catch (err) { + console.log(err) + ipcTestResult = 'FAIL. Please check your tcp network, Wechaty need to listen on localhost and connect to it.' + } + + console.log(` + #### Wechaty Doctor + + 1. Wechaty version: ${wechaty.version()} + 2. ${os.type()} ${os.arch()} version ${os.release()} memory ${Math.floor(os.freemem() / 1024 / 1024)}/${Math.floor(os.totalmem() / 1024 / 1024)} MB + 3. Docker: ${Config.isDocker} + 4. Node version: ${process.version} + 5. Tcp IPC TEST: ${ipcTestResult} -console.log(` -#### Wechaty Doctor + `) -1. Wechaty version: ${wechaty.version()} -2. ${os.type()} ${os.arch()} version ${os.release()} memory ${Math.floor(os.freemem() / 1024 / 1024)}/${Math.floor(os.totalmem() / 1024 / 1024)} MB -3. Docker: ${Config.isDocker} -4. Node version: ${process.version} +} -`) +try { + main() +} catch (err) { + console.error('main() exception: %s', err.message || err) +} diff --git a/src/doctor.ts b/src/doctor.ts new file mode 100644 index 0000000000000000000000000000000000000000..6d8c66bd75be04bd85437fed27b5ce2300a6aabd --- /dev/null +++ b/src/doctor.ts @@ -0,0 +1,64 @@ +/** + * + * wechaty: Wechat for Bot. and for human who talk to bot/robot + * + * Licenst: ISC + * https://github.com/zixia/wechaty + * + */ +import { createServer, Socket } from 'net' + +import { + log, +} from './config' + +export class Doctor { + constructor() { + log.verbose('Doctor', 'constructor()') + } + + /** + * https://gist.github.com/tedmiston/5935757 + */ + testTcp(): Promise { + log.verbose('Doctor', 'testTcp()') + + return new Promise(async (resolve, reject) => { + /** + * Server + */ + const server = createServer(socket => socket.pipe(socket)) + /** + * Promise Reject + */ + server.on('error', reject) + server.on('close', () => log.silly('Doctor', 'testTcp() server closed')) + + server.listen(8788, 'localhost', () => { + /** + * Client + */ + const client = new Socket() + client.connect(8788, 'localhost', () => { + log.silly('Doctor', 'testTcp() client connected') + client.write('ding') + }) + + client.on('data', function(data) { + /** + * Promise Resolve + */ + resolve(true) + + client.destroy() // kill client after server's response + }) + /** + * Promise Reject + */ + client.on('error', reject) + + client.on('close', err => server.close()) + }) + }) + } +}