import request from '../../utils/request'; import { sleep } from '../../utils/util'; // TS MODIFY import { TYPES_BUNDLEID } from './util'; interface MiniExperienceOptions { /** * 小程序appId */ appId: string; /** * 上传包的版本,必须大于线上版本 */ packageVersion: string; /** * 多端支持,比如高德,天猫精灵 * @default alipay */ clientType?: keyof typeof TYPES_BUNDLEID; oldVersion?: string; expPackageVersion?: string; } interface MiniExperienceResult { /** * 体验版本二维码在线地址 */ qrCodeUrl: string; expPackageVersion: string; } const MAX_COUNT = 10; async function miniExperience(options: MiniExperienceOptions): Promise { const { appId, packageVersion: version, clientType = 'alipay', oldVersion } = options; const params = { appId, version, clientType, }; if (oldVersion) { Object.assign(params, { oldVersion, }); } await request({ method: 'POST', host: 'ide', path: '/cli/miniapp/setExp.json', needSign: true, data: params, }); let result = { packageStatus: '', qrCodeUrl: '', expPackageVersion: '', }; let count = 0; /** * 轮询结果 */ while (true && count < MAX_COUNT) { await sleep(2000); count += 1; result = await request<{ packageStatus: 'failed' | 'packaging' | 'success'; qrCodeUrl: string; expPackageVersion: string; }>({ method: 'GET', host: 'ide', path: '/cli/miniapp/setExpQuery.json', needSign: true, data: { appId, version, clientType, }, }); // 支付宝客户端不存在状态,也要轮询 if (clientType === 'alipay' && !result.packageStatus) { result.packageStatus = 'packaging'; } // 继续轮询 if (result.packageStatus !== 'packaging') { break; } } // 体验版本设置成功 if (result.packageStatus === 'success') { return { qrCodeUrl: result.qrCodeUrl, expPackageVersion: result.expPackageVersion, }; } throw new Error(`小程序体验版本设置失败`); } export default miniExperience;