UNPKG

esa-cli

Version:

A CLI for operating Alibaba Cloud ESA Functions and Pages.

1,105 lines (1,104 loc) 41 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import * as $OpenApi from '@alicloud/openapi-client'; import FormData from 'form-data'; import fetch from 'node-fetch'; import t from '../i18n/index.js'; import { getApiConfig } from '../utils/fileUtils/index.js'; import { Environment } from './interface.js'; import { CLI_USER_AGENT } from './constants.js'; export class ApiService { constructor(cliConfig) { var _a, _b; let apiConfig = new $OpenApi.Config({ accessKeyId: (_a = cliConfig.auth) === null || _a === void 0 ? void 0 : _a.accessKeyId, accessKeySecret: (_b = cliConfig.auth) === null || _b === void 0 ? void 0 : _b.accessKeySecret, endpoint: cliConfig.endpoint, userAgent: CLI_USER_AGENT }); this.client = new $OpenApi.default.default(apiConfig); } static getInstance() { return __awaiter(this, void 0, void 0, function* () { if (!ApiService.instance) { const config = getApiConfig(); ApiService.instance = new ApiService(config); } return ApiService.instance; }); } updateConfig(newConfig) { var _a, _b; let apiConfig = new $OpenApi.Config({ accessKeyId: (_a = newConfig.auth) === null || _a === void 0 ? void 0 : _a.accessKeyId, accessKeySecret: (_b = newConfig.auth) === null || _b === void 0 ? void 0 : _b.accessKeySecret, endpoint: newConfig.endpoint, userAgent: CLI_USER_AGENT }); this.client = new $OpenApi.default.default(apiConfig); } /** * Checks if the user is logged in. * @returns A promise that resolves to an object with the following properties: * - success: A boolean indicating if the login check was successful. * - message: (Optional) A string providing additional information in case of failure. */ checkLogin() { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'GetErService', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: {} }); let runtime = { toMap: function () { return this; } }; const response = yield this.client.callApi(params, request, runtime); if (response.statusCode === 200) { if (response.body.Status === 'Running') { return { success: true }; } else { return { success: false, message: t('not_active').d('Functions and Pages is not active, please activate it first. Visit: https://esa.console.aliyun.com/edge/pages to activate.') }; } } else if (response.statusCode === 403) { return { success: false, message: t('login_permission_denied').d('Permission denied: Access key or secret is incorrect, or does not have the necessary permissions.') }; } else { return { success: false, message: `${t('common_error_occurred').d('An error occurred')}: ${response.statusCode}` }; } } catch (error) { return { success: false, message: t('login_failed').d('An error occurred while trying to log in.') }; } }); } quickDeployRoutine(edgeRoutine) { return __awaiter(this, void 0, void 0, function* () { try { // Upload code to unstable version const stagingRes = yield this.getRoutineStagingCodeUploadInfo(edgeRoutine); if (stagingRes) { // Production version const commitRes = yield this.commitRoutineStagingCode({ Name: edgeRoutine.name, CodeDescription: edgeRoutine.description }); // Deploy to production environment if (commitRes) { const deployRes = yield this.publishRoutineCodeVersion({ Name: edgeRoutine.name, CodeVersion: commitRes.data.CodeVersion, Env: Environment.Production }); return deployRes && Number(deployRes.code) === 200; } } return false; } catch (error) { console.log(error); } return false; }); } publishRoutineCodeVersion(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'PublishRoutineCodeVersion', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Env: requestParams.Env, Name: requestParams.Name, CodeVersion: requestParams.CodeVersion } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { CodeVersion: res.body.CodeVersion, RequestId: res.body.RequestId } }; return ret; } } catch (error) { console.log(error); } return null; }); } getMatchSite(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'GetMatchSite', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { RecordName: requestParams.RecordName } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { SiteId: res.body.SiteId, SiteName: res.body.SiteName } }; return ret; } } catch (error) { console.log(error); } return null; }); } listUserRoutines(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'ListUserRoutines', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: requestParams || {} }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { return res; } } catch (error) { console.log(error); } return null; }); } deleteRoutine(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'DeleteRoutine', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: requestParams.Name } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { Status: res.body.Status }; return ret; } } catch (error) { console.log(error); } return null; }); } deleteRoutineCodeVersion(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'DeleteRoutineCodeVersion', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: requestParams.Name, CodeVersion: requestParams.CodeVersion } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { Status: res.body.Status }; return ret; } } catch (error) { console.log(error); } return null; }); } createRoutineRelatedRoute(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'CreateRoutineRelatedRoute', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Route: requestParams.Route, SiteId: requestParams.SiteId, SiteName: requestParams.SiteName, Name: requestParams.Name } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { RequestId: res.body.RequestId, Status: res.body.Status } }; return ret; } } catch (error) { console.log(error); } return null; }); } deleteRoutineRelatedRoute(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'DeleteRoutineRelatedRoute', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Route: requestParams.Route, RouteId: requestParams.RouteId, SiteId: requestParams.SiteId, SiteName: requestParams.SiteName, Name: requestParams.Name } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { RequestId: res.body.RequestId, Status: res.body.Status } }; return ret; } } catch (error) { console.log(error); } return null; }); } listSites(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'ListSites', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: requestParams }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200) { const response = { code: res.statusCode, data: { TotalCount: res.body.TotalCount, RequestId: res.body.RequestId, PageSize: res.body.PageSize, PageNumber: res.body.PageNumber, Sites: res.body.Sites } }; return response; } } catch (error) { console.log(error); } return null; }); } getRoutineStagingEnvIp() { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'GetRoutineStagingEnvIp', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({}); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200) { const response = { code: res.statusCode, data: { IPV4: res.body.IPV4, RequestId: res.body.RequestId } }; return response; } } catch (error) { console.log(error); } return null; }); } getRoutine(requestParams_1) { return __awaiter(this, arguments, void 0, function* (requestParams, isShowError = true) { try { let params = { action: 'GetRoutine', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: requestParams.Name } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const routineResponse = { code: res.statusCode, data: res.body }; return routineResponse; } } catch (error) { if (isShowError) { console.log(error); } } return null; }); } createRoutine(edgeRoutine) { return __awaiter(this, void 0, void 0, function* () { let params = { action: 'CreateRoutine', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: edgeRoutine.name, Description: edgeRoutine.description, HasAssets: edgeRoutine.hasAssets } }); let runtime = { toMap: function () { return this; } }; try { const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { RequestId: res.body.RequestId, Status: res.body.Status } }; return ret; } } catch (error) { console.log(error); } return null; }); } getRoutineStagingCodeUploadInfo(edgeRoutine) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'GetRoutineStagingCodeUploadInfo', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: edgeRoutine.name } }); let runtime = { toMap: function () { return this; } }; const uploadResult = yield this.client.callApi(params, request, runtime); const ossConfig = uploadResult.body.OssPostConfig; if (uploadResult.statusCode !== 200 || !ossConfig) { return false; } const { OSSAccessKeyId, Signature, callback, Url, key, policy } = ossConfig; const formData = new FormData(); formData.append('OSSAccessKeyId', OSSAccessKeyId); formData.append('Signature', Signature); formData.append('callback', callback); formData.append('x:codeDescription', ossConfig['x:codeDescription']); formData.append('policy', policy); formData.append('key', key); formData.append('file', edgeRoutine.code); const ossRes = yield fetch(Url, { method: 'POST', body: formData, headers: formData.getHeaders() }); if (ossRes && ossRes.status === 200) { return true; } return false; } catch (error) { console.log(error); return false; } }); } commitRoutineStagingCode(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'CommitRoutineStagingCode', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: requestParams.Name, CodeDescription: requestParams.CodeDescription } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { RequestId: res.body.RequestId, CodeVersion: res.body.CodeVersion } }; return ret; } } catch (error) { console.log(error); } return null; }); } createRoutineRelatedRecord(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'CreateRoutineRelatedRecord', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { RecordName: requestParams.RecordName, SiteId: requestParams.SiteId, SiteName: requestParams.SiteName, Name: requestParams.Name } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { Status: res.body.Status, RequestId: res.body.RequestId } }; return ret; } } catch (error) { console.log(error); } return null; }); } deleteRoutineRelatedRecord(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'DeleteRoutineRelatedRecord', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { RecordName: requestParams.RecordName, SiteId: requestParams.SiteId, SiteName: requestParams.SiteName, Name: requestParams.Name, RecordId: requestParams.RecordId } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { Status: res.body.Status, RequestId: res.body.RequestId } }; return ret; } } catch (error) { console.log(error); } return null; }); } listRoutineRelatedRecords(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'ListRoutineRelatedRecords', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: requestParams.Name, PageNumber: requestParams.PageNumber, PageSize: requestParams.PageSize, SearchKeyWord: requestParams.SearchKeyWord } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { PageNumber: res.body.PageNumber, PageSize: res.body.PageSize, TotalCount: res.body.TotalCount, RelatedRecords: res.body.RelatedRecords } }; return ret; } } catch (error) { console.log(error); } return null; }); } createRoutineRoute(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'CreateRoutineRoute', version: '2024-09-10', protocol: 'https', method: 'POST', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { SiteId: requestParams.SiteId, RoutineName: requestParams.RoutineName, RouteName: requestParams.RouteName, RouteEnable: 'on', Rule: requestParams.Rule, Bypass: requestParams.Bypass, Mode: 'simple' } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { RequestId: res.body.RequestId, ConfigId: res.body.ConfigId } }; return ret; } } catch (error) { console.log(error); } return null; }); } /** * 调用 CreateRoutineWithAssetsCodeVersion API 获取 OSS 上传配置 */ CreateRoutineWithAssetsCodeVersion(requestParams) { return __awaiter(this, void 0, void 0, function* () { var _a; try { let params = { action: 'CreateRoutineWithAssetsCodeVersion', version: '2024-09-10', protocol: 'https', method: 'POST', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ body: { Name: requestParams.Name, CodeDescription: requestParams.CodeDescription, ExtraInfo: requestParams.ExtraInfo, ConfOptions: { NotFoundStrategy: (_a = requestParams.ConfOptions) === null || _a === void 0 ? void 0 : _a.NotFoundStrategy } } }); let runtime = { toMap: function () { return this; } }; const result = yield this.client.callApi(params, request, runtime); if (result.statusCode === 200 && result.body) { return { code: result.statusCode.toString(), data: { RequestId: result.body.RequestId, CodeVersion: result.body.CodeVersion, Status: result.body.Status, OssPostConfig: result.body.OssPostConfig } }; } return null; } catch (error) { console.error('Error calling CreateRoutineWithAssetsCodeVersion:', error); return null; } }); } /** * 上传文件到 OSS */ uploadToOss(ossConfig, zipBuffer) { return __awaiter(this, void 0, void 0, function* () { try { const { OSSAccessKeyId, Signature, Url, Key, Policy, XOssSecurityToken } = ossConfig; const formData = new FormData(); formData.append('OSSAccessKeyId', OSSAccessKeyId); formData.append('Signature', Signature); formData.append('x-oss-security-token', XOssSecurityToken); formData.append('policy', Policy); formData.append('key', Key); formData.append('file', zipBuffer); const ossRes = yield fetch(Url, { method: 'POST', body: formData, headers: formData.getHeaders() }); return ossRes && (ossRes.status === 200 || ossRes.status === 204); } catch (error) { console.error('Error uploading to OSS:', error); return false; } }); } createRoutineCodeDeployment(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'CreateRoutineCodeDeployment', version: '2024-09-10', protocol: 'https', method: 'POST', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: requestParams.Name, Env: requestParams.Env, Strategy: requestParams.Strategy, CodeVersions: JSON.stringify(requestParams.CodeVersions) } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: { RequestId: res.body.RequestId, Strategy: res.body.Strategy, DeploymentId: res.body.DeploymentId, CodeVersions: res.body.CodeVersions } }; return ret; } } catch (error) { console.log(error); } return null; }); } getRoutineCodeVersionInfo(requestParams) { return __awaiter(this, void 0, void 0, function* () { try { let params = { action: 'GetRoutineCodeVersionInfo', version: '2024-09-10', protocol: 'https', method: 'GET', authType: 'AK', bodyType: 'json', reqBodyType: 'json', style: 'RPC', pathname: '/', toMap: function () { return this; } }; let request = new $OpenApi.OpenApiRequest({ query: { Name: requestParams.Name, CodeVersion: requestParams.CodeVersion } }); let runtime = { toMap: function () { return this; } }; const res = yield this.client.callApi(params, request, runtime); if (res.statusCode === 200 && res.body) { const ret = { code: res.statusCode, data: res.body }; return ret; } } catch (error) { console.log(error); } return null; }); } } ApiService.instance = null;