UNPKG

youzanyun-devtool-worker

Version:

- web - ws - proxy

485 lines (484 loc) 18 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DEPLOY_TYPE = void 0; const tslib_1 = require("tslib"); const spring4js_nodejs_1 = require("spring4js-nodejs"); const fs_extra_1 = tslib_1.__importDefault(require("fs-extra")); const path_1 = tslib_1.__importDefault(require("path")); exports.DEPLOY_TYPE = { SERVER: 'general', CONFIG: 'ruleConfig', MP_SELF: 'mp', MP_TOOL: 'mp-tool' }; const TIME = 4000; let DeployPollService = class DeployPollService { constructor() { this._deploy = new spring4js_nodejs_1.Emitter(); this.onDeploy = this._deploy.registerEvent; this._pollError = new spring4js_nodejs_1.Emitter(); this.onPollError = this._pollError.registerEvent; this.isPolling = false; this.isGeneralDeploy = false; this.generalReleaseId = null; this.isMpDeploy = false; this.mpReleaseId = null; this.isRuleConfigDeploy = false; this.ruleConfigReleaseId = null; this.clearRelease = (type) => { if (type === 'mp') { this.isMpDeploy = false; this.mpReleaseId = null; } else if (type === 'general') { this.isGeneralDeploy = false; this.generalReleaseId = null; } else if (type === exports.DEPLOY_TYPE.CONFIG) { this.isRuleConfigDeploy = false; this.ruleConfigReleaseId = null; } }; } get ecloudAuthHeader() { return { cookie: `app_env=dev; sid=${this.sid}; appid=${this.appDetail.appId}; apptype=${this.appDetail.appType}; user_name=${encodeURI(this.userName)}`, }; } async start() { } async initData(projectId) { const { proName } = await this.projectService.getProjectById(projectId); const { appDetail } = await this.applicationService.getAppDetail(proName); const { userName } = await this.userService.getUserInfo(); this.sid = await this.userService.getSid(); this.appDetail = appDetail; this.userName = userName; } async startLoop(projectId) { await this.initData(projectId); if (this.isPolling) { return { success: false, message: '轮询中,请勿重复操作' }; } this.isPolling = true; this.isMpDeploy = false; this.isGeneralDeploy = false; this.isRuleConfigDeploy = false; this.loop.call(this); return { success: true }; } async stopLoop() { if (this.isPolling) { this.isPolling = false; this.isMpDeploy = false; this.isGeneralDeploy = false; this.isRuleConfigDeploy = false; this.generalReleaseId = null; this.mpReleaseId = null; this.ruleConfigReleaseId = null; return { success: true }; } else { return { success: false, message: '轮询未开始' }; } } async loop() { if (!this.isPolling) { return; } if (this.isGeneralDeploy && this.isMpDeploy && this.isRuleConfigDeploy) { setTimeout(this.loop.bind(this), TIME); return; } try { const res = await this.requestService.get('https://diy.youzanyun.com/api/apps/deploy/get-deploy-records', { params: { region: this.appDetail.appRegion, zone: 'dev', appId: this.appDetail.appId, pageSize: 30, pageIndex: 1, }, headers: this.ecloudAuthHeader, }); if (res.code !== 200) { throw new Error(res.message); } const deployList = res.data.items || []; const deployingList = deployList.filter((item) => item.releaseStatus === 'releasing'); const releaseingMp = deployingList.filter(item => item.type === 'mp')[0]; const releaseingRuleConfig = deployingList.filter(item => item.type === exports.DEPLOY_TYPE.CONFIG)[0]; const releaseingGeneral = deployingList.filter(item => item.type === 'general')[0]; const recentMpReleaseId = (deployList.find((item) => (item.type === 'mp') && (item.releaseStatus === 'success')) || {}).releaseId; const localReleaseList = deployList.filter((item) => item.releaseStatus === 'success'); const recentSuccessGeneral = localReleaseList.find((item) => item.type === 'general'); const recentSuccessRuleConfig = localReleaseList.find((item) => item.type === exports.DEPLOY_TYPE.CONFIG); const recentSuccessMp = localReleaseList.find((item) => item.type === 'mp'); const fireData = {}; if (recentSuccessGeneral) { fireData.isLocalSuccessGeneral = true; fireData.recentSuccessGeneral = recentSuccessGeneral; } if (recentSuccessMp) { fireData.isLocalSuccessMp = true; fireData.recentSuccessMp = recentSuccessMp; } if (recentSuccessRuleConfig) { fireData.isLocalSuccessRuleConfig = true; fireData.recentSuccessRuleConfig = recentSuccessRuleConfig; } if (recentMpReleaseId) { fireData.isRecentMpReleaseId = true; fireData.recentMpReleaseId = recentMpReleaseId; } if (fireData.isRecentMpReleaseId || fireData.isLocalSuccessGeneral || fireData.isLocalSuccessMp || fireData.recentSuccessRuleConfig) { this._deploy.fire({ type: 'merge-message', code: 200, data: fireData, }); } if (releaseingMp && !this.isMpDeploy) { this.loopMp.call(this, releaseingMp); } if (releaseingGeneral && !this.isGeneralDeploy) { this.loopGeneral.call(this, releaseingGeneral); } if (releaseingRuleConfig && !this.isRuleConfigDeploy) { this.loopRuleConfig.call(this, releaseingRuleConfig); } } catch (err) { console.error(err); this._pollError.fire({ message: err.message || err, type: 'loop-catch-error', data: err.message, code: 500, }); } setTimeout(this.loop.bind(this), TIME); } async getMpLog(releaseId) { return this.requestService.get('https://diy.youzanyun.com/api/apps/business/deploy-mp/log', { params: { releaseId, }, headers: this.ecloudAuthHeader, }); } async getGeneralLog(releaseId) { return this.requestService.get('https://diy.youzanyun.com/api/apps/deploy/fetch-deploy-error-log', { params: { releaseId, appId: this.appDetail.appId, zone: 'dev', }, headers: this.ecloudAuthHeader, }); } loopMp(releaseingMp) { if (releaseingMp) { this.isMpDeploy = true; this.mpReleaseId = releaseingMp.releaseId; } if (!this.mpReleaseId) { return; } this.requestService.get('https://diy.youzanyun.com/api/apps/deploy/get-deploy-status', { params: { zone: 'dev', appId: this.appDetail.appId, releaseId: this.mpReleaseId, }, headers: this.ecloudAuthHeader, }) .then(res => { if (+res.code === 200) { let fireData = {}; if (res.data === 'releasing') { setTimeout(this.loopMp.bind(this, releaseingMp), TIME); fireData = { type: 'releaseing-mp', data: { releaseingMp }, }; } else { this.clearRelease('mp'); } if (res.data === 'success') { fireData = { type: 'success-mp', data: { releaseingMp }, }; } if (res.data === 'failed') { fireData = { type: 'failed-mp', data: { releaseingMp }, }; } this._deploy.fire(fireData); } else { throw new Error(res.message); } }) .catch(err => { console.error(err); this._pollError.fire({ type: 'loop-mp-error', message: err.message || err, data: err, code: 500, }); }); } loopGeneral(releaseingGeneral) { if (releaseingGeneral) { this.isGeneralDeploy = true; this.generalReleaseId = releaseingGeneral.releaseId; } if (!this.generalReleaseId) { return; } this.requestService.get('https://diy.youzanyun.com/api/apps/deploy/get-deploy-status', { params: { zone: 'dev', appId: this.appDetail.appId, releaseId: this.generalReleaseId, }, headers: this.ecloudAuthHeader, }) .then(res => { if (+res.code === 200) { let fireData = {}; if (res.data === 'releasing') { setTimeout(this.loopGeneral.bind(this, releaseingGeneral), TIME); fireData = { type: 'releaseing-general', data: { releaseingGeneral }, }; } else { this.clearRelease('general'); } if (res.data === 'success') { fireData = { type: 'success-general', data: { releaseingGeneral }, }; } if (res.data === 'failed') { fireData = { type: 'failed-general', data: { releaseingGeneral }, }; this.clearRelease('general'); } this._deploy.fire(fireData); } else { throw new Error(res.message); } }) .catch(err => { console.error(err); this._pollError.fire({ message: err.message || err, type: 'loop-general-error', data: err, code: 500, }); }); } loopRuleConfig(releaseingRuleConfig) { if (releaseingRuleConfig) { this.isRuleConfigDeploy = true; this.ruleConfigReleaseId = releaseingRuleConfig.releaseId; } if (!this.ruleConfigReleaseId) { return; } this.requestService.get('https://diy.youzanyun.com/api/apps/deploy/get-deploy-status', { params: { zone: 'dev', appId: this.appDetail.appId, releaseId: this.ruleConfigReleaseId, }, headers: this.ecloudAuthHeader, }) .then(res => { if (+res.code === 200) { let fireData = {}; if (res.data === 'releasing') { setTimeout(this.loopRuleConfig.bind(this, releaseingRuleConfig), TIME); fireData = { type: 'releaseing-ruleConfig', data: { releaseingRuleConfig }, }; } else { this.clearRelease('ruleConfig'); } if (res.data === 'success') { fireData = { type: 'success-ruleConfig', data: { releaseingRuleConfig }, }; } if (res.data === 'failed') { fireData = { type: 'failed-ruleConfig', data: { releaseingRuleConfig }, }; this.clearRelease('ruleConfig'); } this._deploy.fire(fireData); } else { throw new Error(res.message); } }) .catch(err => { console.error(err); this._pollError.fire({ message: err.message || err, type: 'loop-ruleConfig-error', data: err, code: 500, }); }); } async openGeneralConfig(param) { const { extPointId, uuid } = param; const result = await this.requestService.post('https://diy.youzanyun.com/api/apps/business/impl/router/add', { appId: this.appDetail.appId, extPointId, env: "dev", customRuleMap: {}, isDefaultConfig: true, ruleMap: {}, createBy: '', uuid, }, { headers: this.ecloudAuthHeader, }); return result; } async closeGeneralConfig(param) { const { uuid } = param; const result = await this.requestService.del(`https://diy.youzanyun.com/api/apps/business/impl/router/delete?env=dev&uuid=${uuid}`, { headers: this.ecloudAuthHeader, }); return result; } async changeRuleConfigStatus(data) { const result = await this.requestService.post(`https://diy.youzanyun.com/api/business/uiv3/configTemplate/enable`, data, { headers: this.ecloudAuthHeader }); return result; } async getShopList(shopType) { const params = { appType: 0, pageSize: 100, page: 1, authStatus: 1, shopType, }; const result = await this.requestService.get('https://diy.youzanyun.com/api/apps/shop/multi', { params, headers: this.ecloudAuthHeader, }).catch(err => { console.error('err', err); }); return result; } async getShopListV2(projectId, shopType, env) { const params = { appType: 0, pageSize: 100, page: 1, authStatus: 1, shopType, env, }; const { proName } = await this.projectService.getProjectById(projectId); const { appDetail } = await this.applicationService.getAppDetail(proName); const { userName } = await this.userService.getUserInfo(); const sid = await this.userService.getSid(); const result = await this.requestService.get('https://diy.youzanyun.com/api/apps/shop/multi', { params, headers: { cookie: `app_env=dev; sid=${sid}; appid=${appDetail.appId}; apptype=${appDetail.appType}; user_name=${encodeURI(userName)}`, }, }).catch(err => { console.error('err', err); }); return result; } async saveMpConfig(config) { let dataDir = this.configService.getDataDir(); let mpConfigFile = path_1.default.resolve(dataDir, `mp-deploy-config.${this.appDetail.appId}.json`); await fs_extra_1.default.writeJson(mpConfigFile, config, { spaces: 2 }); return { code: 200 }; } async getMpConfig() { let dataDir = this.configService.getDataDir(); let mpConfigFIle = path_1.default.resolve(dataDir, `mp-deploy-config.${this.appDetail.appId}.json`); let exists = await fs_extra_1.default.pathExists(mpConfigFIle); if (exists) { const config = await fs_extra_1.default.readJson(mpConfigFIle); return { code: 200, data: config }; } return { code: 404, message: '暂无配置' }; } async deploy(type) { let context = null; if (type === 'mp') { const mpConfig = await this.getMpConfig(); if (mpConfig.code === 200) { context = JSON.stringify(mpConfig.data); } else { return mpConfig; } } else if (type === 'general' || type === 'ruleConfig') { context = "{}"; } else { return { code: 400, message: '未知的发布类型' }; } const result = await this.requestService.post('https://diy.youzanyun.com/api/apps/deploy/deploy-new-app', { appId: this.appDetail.appId, comment: "开发者工具一键发布", region: this.appDetail.region, requestType: "normal", isLocalPublish: 1, zone: "dev", context, type }, { headers: this.ecloudAuthHeader, }); return result; } }; tslib_1.__decorate([ spring4js_nodejs_1.Resource() ], DeployPollService.prototype, "configService", void 0); tslib_1.__decorate([ spring4js_nodejs_1.Resource() ], DeployPollService.prototype, "userService", void 0); tslib_1.__decorate([ spring4js_nodejs_1.Resource() ], DeployPollService.prototype, "requestService", void 0); tslib_1.__decorate([ spring4js_nodejs_1.Resource() ], DeployPollService.prototype, "projectService", void 0); tslib_1.__decorate([ spring4js_nodejs_1.Resource() ], DeployPollService.prototype, "applicationService", void 0); DeployPollService = tslib_1.__decorate([ spring4js_nodejs_1.Service() ], DeployPollService); exports.default = DeployPollService;