@hap-toolkit/server
Version:
hap server
3 lines (2 loc) • 6.87 kB
JavaScript
;Object.defineProperty(exports,"__esModule",{value:!0}),exports.remotePreview=remotePreview;var _crypto=_interopRequireDefault(require("crypto")),_chalk=_interopRequireDefault(require("chalk")),_path=_interopRequireDefault(require("path")),_inquirer=_interopRequireDefault(require("inquirer")),_cryptoJs=require("crypto-js"),_request=_interopRequireDefault(require("request")),_fsExtra=_interopRequireDefault(require("fs-extra")),_qrcodeTerminal=_interopRequireDefault(require("qrcode-terminal")),_qrImage=_interopRequireDefault(require("qr-image"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}const home=require("os").homedir(),SIGN_KEY="02D3411146BE7892BAC13E2C835B465E",PASSWORD_SIGN_KEY="lightapp@2017",apiConfig={production:"https://www.quickapp.cn",development:"http://test.so-quick.cn"};let ideToken="",cacheUserName="",qrOutputPath="",rpkUserNameHash="";const previewRpkTemp=_path.default.join(home,"/quickAppPreviewTempPath/"),tokenPath=_path.default.join(home,"/quickAppToken.json");let currentApi=apiConfig.production;async function remotePreview(e){if(e.env){if("production"!==e.env&&"development"!==e.env)return console.log(_chalk.default.red("[ERROR] 环境参数只支持production或development!"));currentApi=apiConfig[e.env]}e.qrOutput&&(qrOutputPath=e.qrOutput);if(!await takeToken()){const e=await collectUserInfo();if(!e)return console.log(_chalk.default.red("[ERROR] 🤣 登录失败或者账号密码错误"));updateToken(e.ideToken)}compilePreviewRpk(e)}async function takeToken(){if(!_fsExtra.default.pathExistsSync(tokenPath))return!1;const e=_fsExtra.default.readJsonSync(tokenPath);if(e&&e.token){ideToken=e.token,console.log(_chalk.default.green("[INFO] 用户ideToken已存在,校验合法性..."));const t=await checkUser();return 0===JSON.parse(t).code?(console.log(_chalk.default.green("用户ideToken已存在,并且token可用")),ideToken=e.token,!0):(console.log(_chalk.default.green("[INFO] 🤣 存在token但不合法,需要重新登录")),!1)}return console.log(_chalk.default.green("[INFO] 用户token不存在,需要重新登录;")),!1}function updateToken(e){_fsExtra.default.writeJsonSync(tokenPath,{token:e})&&console.log(_chalk.default.red("[ERROR] 🤣 token保存失败;"));_fsExtra.default.accessSync(tokenPath,_fsExtra.default.constants.F_OK|_fsExtra.default.constants.R_OK|_fsExtra.default.constants.W_OK)||console.log(_chalk.default.green(`[INFO] 👍 token保存成功(${tokenPath});`))}async function collectUserInfo(){console.log(_chalk.default.green("[INFO] 在命令行内使用扫码预览功能需要使用快应用联盟账号登录;")),console.log(_chalk.default.green("[INFO] 如果没有账号,请到https://www.quickapp.cn/account/register注册;"));const e=await _inquirer.default.prompt([{type:"username",message:"请键入你的用户名",name:"username"},{type:"password",message:"请键入密码",name:"password"}]),{username:t,password:r}=e,a=await login(t,r),n=JSON.parse(a);if(0===n.code){const e=n.data;return ideToken=e.ideToken,console.log(_chalk.default.green("[INFO] 👍 登录成功;")),e}console.log(_chalk.default.red(`[ERROR] ${n.msg};`))}function login(e,t){const r=dealRequestParams({userName:e,password:(0,_cryptoJs.MD5)(t+PASSWORD_SIGN_KEY).toString(),versionCode:"3.7"}),a=`${currentApi}/api/ide/account/login`,n={form:r};return new Promise((function(t,r){_request.default.post(a,n,(function(a,n,o){a&&(console.log(a),r(a)),cacheUserName=e,t(o)}))}))}function checkUser(){const e=`${currentApi}/api/ide/account/checkUser`,t={form:dealRequestParams({ideToken:ideToken})};return new Promise((function(r,a){_request.default.post(e,t,(function(e,t,a){e&&console.log(e),r(a)}))}))}function dealRequestParams(e,t){const r=Date.now();t||(e.timestamp=r);let a="";const n=Object.keys(e).sort();for(let t=0,r=n.length;t<r;t++)a+=t===r-1?[n[t]]+"="+e[n[t]]:[n[t]]+"="+e[n[t]]+"&";const o=(0,_cryptoJs.HmacSHA256)(a,SIGN_KEY);return e.sign=_cryptoJs.enc.Hex.stringify(o),e}async function compilePreviewRpk(e){console.log(_chalk.default.green("\n[INFO] 开始打预览包...")),rpkUserNameHash=getUserNameHash(cacheUserName);const{compileError:t}=await e.compile("native","prod",!1,Object.assign({originType:"ide",buildPreviewRpkOptions:{setPreviewPkgPath:previewRpkTemp,userNameHash:rpkUserNameHash}},e)),r=_fsExtra.default.readdirSync(previewRpkTemp);null===t&&0!==r.length?(console.log(_chalk.default.green(`[INFO] 👍 预览包打包成功(${previewRpkTemp});`)),updatePreviewRpk()):console.log(_chalk.default.red("[ERROR] 🤣 预览包打包失败;"))}async function updatePreviewRpk(){console.log(_chalk.default.green("\n[INFO] 开始上传预览包..."));let e="";const t=_fsExtra.default.readdirSync(previewRpkTemp);for(let r=0;r<t.length;r++){const a=t[r];if(/rpks$/.test(a)){e=a;break}/rpk$/.test(a)&&(e=a)}const r=_path.default.join(previewRpkTemp,e);if(!_fsExtra.default.existsSync(r))return console.log(_chalk.default.green(`[ERROR] 🤣 ${previewRpkTemp}下不存在预览包文件`));const a=_path.default.resolve(process.cwd(),"src/manifest.json"),n=_fsExtra.default.readJsonSync(a).package+".__preview__",o=_crypto.default.createHash("md5");o.update(_fsExtra.default.readFileSync(r));const i=o.digest("hex"),s=dealRequestParams({rpkPackage:n,ideToken:ideToken,file:i});uploadRemote({rpkPackage:n,ideToken:ideToken,sign:s.sign,timestamp:s.timestamp},r).catch((e=>{console.log(_chalk.default.red(`[ERROR] 🤣 上传预览rpk失败:${e}`))})).then((e=>{const{data:t,code:r}=JSON.parse(e);if(0===r){const{previewRpkId:e}=t;console.log(_chalk.default.green("[INFO] 👍 上传预览包成功;")),generateQrcode(e)}else console.log(_chalk.default.red(`[ERROR] 🤣 上传预览rpk失败:${JSON.stringify(e)}`))}))}function uploadRemote(e,t){return new Promise(((r,a)=>{const n=`${currentApi}/api/ide/previewRpk/upload`;_request.default.post(n,{formData:{ideToken:e.ideToken,sign:e.sign,rpkPackage:e.rpkPackage,file:_fsExtra.default.createReadStream(t),timestamp:e.timestamp}},(function(e,t,n){e&&a(e),r(n)}))}))}function generateQrcode(e){const{sign:t}=dealRequestParams({pid:e},!0),r=`${currentApi}/api/ide/_p?pid=${e}&sign=${t}`;_qrcodeTerminal.default.generate(r,{small:!0}),console.log(_chalk.default.green("[INFO] 👏👏👏请使用微信、内置浏览器或者其他扫码工具扫描上面的二维码,打开预览版快应用;")),qrOutputPath&&generateQrPicToPath(r)}function generateQrPicToPath(e){_qrImage.default.image(e,{type:"png"}).pipe(require("fs").createWriteStream(_path.default.resolve(qrOutputPath,`${rpkUserNameHash}.png`))),qrOutputPath=""}function getUserNameHash(e){const t=_crypto.default.createHash("md5");return t.update(e+(new Date).getTime()),`qid_${t.digest("hex").slice(0,8)}`}_fsExtra.default.ensureDirSync(previewRpkTemp);
//# sourceMappingURL=remote-preview.js.map