UNPKG

cloudworker-proxy

Version:
172 lines (159 loc) 4.2 kB
'use strict'; const util = require('util'); const http = require('http'); const os = require('os'); const uuidv4 = require('../../library/uuid'); const QRCode = require('../../library/qrcode/index'); const apiBaseUrl = 'scfdev.tencentserverless.com'; const apiShortUrl = '/login/url'; const refreshTokenUrl = '/login/info'; class Login { sleep(ms) { return new Promise((resolve) => { setTimeout(resolve, ms); }); } async getShortUrl(uuid) { const options = { host: apiBaseUrl, port: '80', path: util.format('%s?os=%s&uuid=%s', apiShortUrl, os.type(), uuid), }; return new Promise((resolve, reject) => { const req = http.get(options, (res) => { res.setEncoding('utf8'); res.on('data', (chunk) => { try { resolve(JSON.parse(chunk)); } catch (e) { reject(e.message); } }); }); req.on('error', (e) => { reject(e.message); }); req.end(); }); } async checkStatus(uuid, url) { return new Promise((done) => { const options = { host: apiBaseUrl, port: '80', path: url, }; const req = http.get(options, (res) => { res.setEncoding('utf8'); res.on('data', (chunk) => { try { const responseData = JSON.parse(chunk); if (responseData.success) { done(responseData); } else { done(false); } } catch (e) { done(false); return; } }); }); req.on('error', () => { done(false); return; }); req.end(); }); } async flush(uuid, expired, signature, appid) { return await new Promise((done) => { const options = { host: apiBaseUrl, port: '80', path: `${refreshTokenUrl}?uuid=${uuid}&os=${os.type()}&expired=${expired}&signature=${signature}&appid=${appid}`, }; const req = http.get(options, (res) => { res.setEncoding('utf8'); res.on('data', (chunk) => { try { const responseData = JSON.parse(chunk); if (responseData.success) { done(responseData); } else { done(false); } } catch (e) { done(false); return; } }); }); req.on('error', () => { done(false); return; }); req.end(); }); } async login() { try { const uuid = uuidv4(); const apiUrl = await this.getShortUrl(uuid); QRCode.toString(apiUrl.short_url, { type: 'terminal' }, (err, url) => { console.log(url); }); console.log('Please scan QR code login from wechat. '); console.log('Wait login...'); // wait 3s start check login status await this.sleep(3000); let loginFlag = false; let timeout = 600; let loginData; while (timeout > 0) { loginData = await this.checkStatus(uuid, apiUrl.login_status_url); if (loginData !== false) { loginFlag = true; break; } timeout--; await this.sleep(1000); } if (loginFlag === false && timeout === 0) { console.log('Login timeout. Please login again! '); process.exit(0); } const configure = { secret_id: loginData.secret_id, secret_key: loginData.secret_key, token: loginData.token, appid: loginData.appid, signature: loginData.signature, expired: loginData.expired, uuid, }; console.log('Login successful for TencentCloud. '); return configure; } catch (e) { console.log(e); } process.exit(0); return null; } async loginUrl() { try { const uuid = uuidv4(); const apiUrl = await this.getShortUrl(uuid); return { login_status_url: apiUrl.login_status_url, uuid, url: apiUrl.long_url, short_url: apiUrl.short_url, }; } catch (e) { console.log(e); } return null; } } module.exports = Login;