@geek-fun/serverlessinsight 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (160) hide show
  1. package/.gitattributes +1 -0
  2. package/README.md +108 -8
  3. package/README.zh-CN.md +52 -8
  4. package/dist/package.json +37 -35
  5. package/dist/src/commands/deploy.js +17 -7
  6. package/dist/src/commands/destroy.js +27 -4
  7. package/dist/src/commands/forceUnlock.js +61 -0
  8. package/dist/src/commands/index.js +86 -14
  9. package/dist/src/commands/local.js +10 -1
  10. package/dist/src/commands/plan.js +33 -0
  11. package/dist/src/commands/template.js +3 -1
  12. package/dist/src/commands/validate.js +2 -1
  13. package/dist/src/common/aliyunClient/apigwOperations.js +652 -0
  14. package/dist/src/common/aliyunClient/dnsOperations.js +90 -0
  15. package/dist/src/common/aliyunClient/ecsOperations.js +141 -0
  16. package/dist/src/common/aliyunClient/esOperations.js +219 -0
  17. package/dist/src/common/aliyunClient/fc3Operations.js +270 -0
  18. package/dist/src/common/aliyunClient/index.js +141 -0
  19. package/dist/src/common/aliyunClient/nasOperations.js +233 -0
  20. package/dist/src/common/aliyunClient/ossOperations.js +237 -0
  21. package/dist/src/common/aliyunClient/ramOperations.js +205 -0
  22. package/dist/src/common/aliyunClient/rdsOperations.js +206 -0
  23. package/dist/src/common/aliyunClient/slsOperations.js +218 -0
  24. package/dist/src/common/aliyunClient/tablestoreOperations.js +199 -0
  25. package/dist/src/common/aliyunClient/types.js +2 -0
  26. package/dist/src/common/constants.js +7 -1
  27. package/dist/src/common/context.js +32 -14
  28. package/dist/src/common/credentials.js +39 -0
  29. package/dist/src/common/dependencyGraph/graph.js +280 -0
  30. package/dist/src/common/dependencyGraph/index.js +18 -0
  31. package/dist/src/common/dependencyGraph/types.js +2 -0
  32. package/dist/src/common/fileUtils.js +16 -0
  33. package/dist/src/common/hashUtils.js +121 -0
  34. package/dist/src/common/iacHelper.js +25 -97
  35. package/dist/src/common/imsClient.js +4 -0
  36. package/dist/src/common/index.js +7 -2
  37. package/dist/src/common/lockManager.js +212 -0
  38. package/dist/src/common/logger.js +89 -6
  39. package/dist/src/common/providerEnum.js +2 -3
  40. package/dist/src/common/runtimeMapper.js +160 -0
  41. package/dist/src/common/scfClient.js +84 -0
  42. package/dist/src/common/stateManager.js +107 -0
  43. package/dist/src/common/tencentClient/cosOperations.js +287 -0
  44. package/dist/src/common/tencentClient/esOperations.js +156 -0
  45. package/dist/src/common/tencentClient/index.js +116 -0
  46. package/dist/src/common/tencentClient/scfOperations.js +141 -0
  47. package/dist/src/common/tencentClient/tdsqlcOperations.js +211 -0
  48. package/dist/src/common/tencentClient/types.js +17 -0
  49. package/dist/src/lang/en.js +254 -0
  50. package/dist/src/lang/index.js +28 -8
  51. package/dist/src/lang/zh-CN.js +229 -0
  52. package/dist/src/parser/bucketParser.js +25 -12
  53. package/dist/src/parser/databaseParser.js +14 -10
  54. package/dist/src/parser/functionParser.js +19 -6
  55. package/dist/src/parser/parseUtils.js +74 -0
  56. package/dist/src/parser/tableParser.js +19 -17
  57. package/dist/src/stack/aliyunStack/apigwExecutor.js +84 -0
  58. package/dist/src/stack/aliyunStack/apigwPlanner.js +118 -0
  59. package/dist/src/stack/aliyunStack/apigwResource.js +339 -0
  60. package/dist/src/stack/aliyunStack/apigwTypes.js +125 -0
  61. package/dist/src/stack/aliyunStack/databaseExecutor.js +112 -0
  62. package/dist/src/stack/aliyunStack/databasePlanner.js +128 -0
  63. package/dist/src/stack/aliyunStack/databaseResource.js +228 -0
  64. package/dist/src/stack/aliyunStack/deployer.js +133 -0
  65. package/dist/src/stack/aliyunStack/destroyer.js +114 -0
  66. package/dist/src/stack/aliyunStack/esServerlessTypes.js +141 -0
  67. package/dist/src/stack/aliyunStack/fc3Executor.js +91 -0
  68. package/dist/src/stack/aliyunStack/fc3Planner.js +77 -0
  69. package/dist/src/stack/aliyunStack/fc3Resource.js +511 -0
  70. package/dist/src/stack/aliyunStack/fc3Types.js +76 -0
  71. package/dist/src/stack/aliyunStack/index.js +40 -0
  72. package/dist/src/stack/aliyunStack/ossExecutor.js +91 -0
  73. package/dist/src/stack/aliyunStack/ossPlanner.js +76 -0
  74. package/dist/src/stack/aliyunStack/ossResource.js +196 -0
  75. package/dist/src/stack/aliyunStack/ossTypes.js +50 -0
  76. package/dist/src/stack/aliyunStack/planner.js +37 -0
  77. package/dist/src/stack/aliyunStack/rdsTypes.js +217 -0
  78. package/dist/src/stack/aliyunStack/tablestoreExecutor.js +92 -0
  79. package/dist/src/stack/aliyunStack/tablestorePlanner.js +94 -0
  80. package/dist/src/stack/aliyunStack/tablestoreResource.js +120 -0
  81. package/dist/src/stack/aliyunStack/tablestoreTypes.js +77 -0
  82. package/dist/src/stack/bucketTypes.js +17 -0
  83. package/dist/src/stack/deploy.js +24 -77
  84. package/dist/src/stack/localStack/bucket.js +11 -6
  85. package/dist/src/stack/localStack/event.js +10 -5
  86. package/dist/src/stack/localStack/function.js +13 -7
  87. package/dist/src/stack/localStack/functionRunner.js +1 -1
  88. package/dist/src/stack/localStack/localServer.js +7 -6
  89. package/dist/src/stack/scfStack/cosExecutor.js +91 -0
  90. package/dist/src/stack/scfStack/cosPlanner.js +76 -0
  91. package/dist/src/stack/scfStack/cosResource.js +126 -0
  92. package/dist/src/stack/scfStack/cosTypes.js +46 -0
  93. package/dist/src/stack/scfStack/deployer.js +91 -0
  94. package/dist/src/stack/scfStack/destroyer.js +88 -0
  95. package/dist/src/stack/scfStack/esServerlessExecutor.js +105 -0
  96. package/dist/src/stack/scfStack/esServerlessPlanner.js +86 -0
  97. package/dist/src/stack/scfStack/esServerlessResource.js +94 -0
  98. package/dist/src/stack/scfStack/esServerlessTypes.js +48 -0
  99. package/dist/src/stack/scfStack/index.js +35 -0
  100. package/dist/src/stack/scfStack/planner.js +91 -0
  101. package/dist/src/stack/scfStack/scfExecutor.js +91 -0
  102. package/dist/src/stack/scfStack/scfPlanner.js +78 -0
  103. package/dist/src/stack/scfStack/scfResource.js +216 -0
  104. package/dist/src/stack/scfStack/scfTypes.js +41 -0
  105. package/dist/src/stack/scfStack/tdsqlcExecutor.js +105 -0
  106. package/dist/src/stack/scfStack/tdsqlcPlanner.js +90 -0
  107. package/dist/src/stack/scfStack/tdsqlcResource.js +146 -0
  108. package/dist/src/stack/scfStack/tdsqlcTypes.js +59 -0
  109. package/dist/src/types/domains/lock.js +2 -0
  110. package/dist/src/types/domains/resolvable.js +2 -0
  111. package/dist/src/types/domains/state.js +19 -0
  112. package/dist/src/types/index.js +4 -0
  113. package/dist/src/validator/bucketSchema.js +4 -10
  114. package/dist/src/validator/databaseSchema.js +36 -36
  115. package/dist/src/validator/eventSchema.js +3 -2
  116. package/dist/src/validator/functionSchema.js +51 -46
  117. package/dist/src/validator/iacSchema.js +52 -3
  118. package/dist/src/validator/rootSchema.js +47 -1
  119. package/dist/src/validator/tableschema.js +9 -8
  120. package/dist/src/validator/templateRefSchema.js +23 -0
  121. package/dist/tsconfig.tsbuildinfo +1 -1
  122. package/package.json +37 -35
  123. package/samples/README_TENCENT_COS.md +486 -0
  124. package/samples/README_TENCENT_SCF.md +272 -0
  125. package/samples/aliyun-poc-api.yml +1 -1
  126. package/samples/aliyun-poc-bucket.yml +0 -1
  127. package/samples/aliyun-poc-domain.yml +0 -1
  128. package/samples/aliyun-poc-es.yml +14 -13
  129. package/samples/aliyun-poc-rds.yml +0 -2
  130. package/samples/aliyun-poc-table.yml +1 -3
  131. package/samples/tencent-poc-cos.yml +20 -0
  132. package/samples/tencent-poc-scf.yml +36 -0
  133. package/dist/src/commands/index.d.ts +0 -2
  134. package/dist/src/common/index.d.ts +0 -11
  135. package/dist/src/common/rosAssets.js +0 -178
  136. package/dist/src/common/rosClient.js +0 -198
  137. package/dist/src/index.d.ts +0 -1
  138. package/dist/src/lang/index.d.ts +0 -3
  139. package/dist/src/parser/index.d.ts +0 -3
  140. package/dist/src/stack/index.d.ts +0 -1
  141. package/dist/src/stack/localStack/index.d.ts +0 -5
  142. package/dist/src/stack/rfsStack/index.d.ts +0 -9
  143. package/dist/src/stack/rosStack/bootstrap.js +0 -187
  144. package/dist/src/stack/rosStack/bucket.js +0 -127
  145. package/dist/src/stack/rosStack/database.js +0 -313
  146. package/dist/src/stack/rosStack/event.js +0 -143
  147. package/dist/src/stack/rosStack/function.js +0 -259
  148. package/dist/src/stack/rosStack/index.d.ts +0 -7
  149. package/dist/src/stack/rosStack/index.js +0 -75
  150. package/dist/src/stack/rosStack/stage.js +0 -46
  151. package/dist/src/stack/rosStack/table.js +0 -95
  152. package/dist/src/stack/rosStack/tag.js +0 -11
  153. package/dist/src/stack/rosStack/vars.js +0 -49
  154. package/dist/src/types/index.d.ts +0 -55
  155. package/dist/src/types/localStack/index.d.ts +0 -81
  156. package/dist/src/validator/index.d.ts +0 -1
  157. package/layers/si-bootstrap-sdk/Dockerfile-aliyuncli +0 -12
  158. package/layers/si-bootstrap-sdk/README.md +0 -1
  159. package/layers/si-bootstrap-sdk/package-lock.json +0 -875
  160. package/layers/si-bootstrap-sdk/package.json +0 -33
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createDnsOperations = void 0;
37
+ const dns = __importStar(require("@alicloud/alidns20150109"));
38
+ const addDomainRecord = (dnsClient) => async (config) => {
39
+ const request = new dns.AddDomainRecordRequest({
40
+ domainName: config.domainName,
41
+ RR: config.rr,
42
+ type: config.type,
43
+ value: config.value,
44
+ TTL: config.ttl || 600,
45
+ });
46
+ const response = await dnsClient.addDomainRecord(request);
47
+ return response.body?.recordId || '';
48
+ };
49
+ const deleteDomainRecord = (dnsClient) => async (recordId) => {
50
+ const request = new dns.DeleteDomainRecordRequest({
51
+ recordId,
52
+ });
53
+ await dnsClient.deleteDomainRecord(request);
54
+ };
55
+ const describeDomainRecords = (dnsClient) => async (domainName, rrKeyWord) => {
56
+ const request = new dns.DescribeDomainRecordsRequest({
57
+ domainName,
58
+ RRKeyWord: rrKeyWord,
59
+ });
60
+ const response = await dnsClient.describeDomainRecords(request);
61
+ const records = response.body?.domainRecords?.record || [];
62
+ return records.map((record) => ({
63
+ recordId: record.recordId,
64
+ domainName: record.domainName,
65
+ rr: record.RR,
66
+ type: record.type,
67
+ value: record.value,
68
+ ttl: record.TTL,
69
+ status: record.status,
70
+ }));
71
+ };
72
+ const checkDomainRecordExists = (describeFn) => async (domainName, rr) => {
73
+ try {
74
+ const records = await describeFn(domainName, rr);
75
+ return records.some((record) => record.rr === rr);
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ };
81
+ const createDnsOperations = (dnsClient) => {
82
+ const describe = describeDomainRecords(dnsClient);
83
+ return {
84
+ addDomainRecord: addDomainRecord(dnsClient),
85
+ deleteDomainRecord: deleteDomainRecord(dnsClient),
86
+ describeDomainRecords: describe,
87
+ checkDomainRecordExists: checkDomainRecordExists(describe),
88
+ };
89
+ };
90
+ exports.createDnsOperations = createDnsOperations;
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createEcsOperations = exports.securityGroupRangeMap = void 0;
37
+ const ecs = __importStar(require("@alicloud/ecs20140526"));
38
+ const logger_1 = require("../logger");
39
+ exports.securityGroupRangeMap = {
40
+ TCP: '1/65535',
41
+ UDP: '1/65535',
42
+ ICMP: '-1/-1',
43
+ GRE: '-1/-1',
44
+ ALL: '-1/-1',
45
+ };
46
+ const transformPortRange = (protocol, portRange) => {
47
+ if (portRange.toUpperCase() === 'ALL') {
48
+ return exports.securityGroupRangeMap[protocol.toUpperCase()];
49
+ }
50
+ return portRange.includes('/') ? portRange : `${portRange}/${portRange}`;
51
+ };
52
+ const createEcsOperations = (ecsClient, context) => ({
53
+ createSecurityGroup: async (securityGroupName, vpcId, ingressRules, egressRules, description) => {
54
+ const createRequest = new ecs.CreateSecurityGroupRequest({
55
+ regionId: context.region,
56
+ securityGroupName,
57
+ vpcId,
58
+ description: description ?? `ServerlessInsight security group for ${securityGroupName}`,
59
+ });
60
+ const response = await ecsClient.createSecurityGroup(createRequest);
61
+ const securityGroupId = response.body?.securityGroupId;
62
+ if (!securityGroupId) {
63
+ throw new Error('Failed to create security group');
64
+ }
65
+ // Add ingress rules
66
+ for (const rule of ingressRules) {
67
+ const [protocol, cidrIp, portRange] = rule.split(':');
68
+ const ingressRequest = new ecs.AuthorizeSecurityGroupRequest({
69
+ regionId: context.region,
70
+ securityGroupId,
71
+ ipProtocol: protocol.toLowerCase(),
72
+ sourceCidrIp: cidrIp,
73
+ portRange: transformPortRange(protocol, portRange),
74
+ });
75
+ try {
76
+ await ecsClient.authorizeSecurityGroup(ingressRequest);
77
+ }
78
+ catch {
79
+ logger_1.logger.warn(`Failed to add ingress rule: ${rule}`);
80
+ }
81
+ }
82
+ // Add egress rules
83
+ for (const rule of egressRules) {
84
+ const [protocol, cidrIp, portRange] = rule.split(':');
85
+ const egressRequest = new ecs.AuthorizeSecurityGroupEgressRequest({
86
+ regionId: context.region,
87
+ securityGroupId,
88
+ ipProtocol: protocol.toLowerCase(),
89
+ destCidrIp: cidrIp,
90
+ portRange: transformPortRange(protocol, portRange),
91
+ });
92
+ try {
93
+ await ecsClient.authorizeSecurityGroupEgress(egressRequest);
94
+ }
95
+ catch {
96
+ logger_1.logger.warn(`Failed to add egress rule: ${rule}`);
97
+ }
98
+ }
99
+ return {
100
+ securityGroupId,
101
+ securityGroupName,
102
+ vpcId,
103
+ description,
104
+ };
105
+ },
106
+ getSecurityGroup: async (securityGroupId) => {
107
+ try {
108
+ const request = new ecs.DescribeSecurityGroupsRequest({
109
+ regionId: context.region,
110
+ securityGroupId,
111
+ });
112
+ const response = await ecsClient.describeSecurityGroups(request);
113
+ if (!response ||
114
+ !response.body ||
115
+ !response.body.securityGroups ||
116
+ !response.body.securityGroups.securityGroup ||
117
+ response.body.securityGroups.securityGroup.length === 0) {
118
+ return null;
119
+ }
120
+ const sg = response.body.securityGroups.securityGroup[0];
121
+ return {
122
+ securityGroupId: sg.securityGroupId ?? securityGroupId,
123
+ securityGroupName: sg.securityGroupName,
124
+ vpcId: sg.vpcId,
125
+ description: sg.description,
126
+ createTime: sg.creationTime,
127
+ };
128
+ }
129
+ catch {
130
+ return null;
131
+ }
132
+ },
133
+ deleteSecurityGroup: async (securityGroupId) => {
134
+ const request = new ecs.DeleteSecurityGroupRequest({
135
+ regionId: context.region,
136
+ securityGroupId,
137
+ });
138
+ await ecsClient.deleteSecurityGroup(request);
139
+ },
140
+ });
141
+ exports.createEcsOperations = createEcsOperations;
@@ -0,0 +1,219 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createEsOperations = exports.EsAppStatus = void 0;
37
+ const EsModels = __importStar(require("@alicloud/es-serverless20230627"));
38
+ const logger_1 = require("../logger");
39
+ const lang_1 = require("../../lang");
40
+ var EsAppStatus;
41
+ (function (EsAppStatus) {
42
+ EsAppStatus["ACTIVE"] = "ACTIVE";
43
+ EsAppStatus["CREATING"] = "CREATING";
44
+ EsAppStatus["DELETING"] = "DELETING";
45
+ EsAppStatus["DELETED"] = "DELETED";
46
+ EsAppStatus["FAILED"] = "FAILED";
47
+ })(EsAppStatus || (exports.EsAppStatus = EsAppStatus = {}));
48
+ const waitForEsAppReady = async (getApp, appId) => {
49
+ const maxAttempts = 60;
50
+ let attempts = 0;
51
+ while (attempts < maxAttempts) {
52
+ const app = await getApp(appId);
53
+ if (!app) {
54
+ throw new Error(lang_1.lang.__('ES_APP_NOT_FOUND', { appId }));
55
+ }
56
+ if (app.status === EsAppStatus.ACTIVE) {
57
+ logger_1.logger.info(lang_1.lang.__('ES_APP_READY', { appId }));
58
+ return;
59
+ }
60
+ if (app.status === EsAppStatus.DELETED || app.status === EsAppStatus.FAILED) {
61
+ throw new Error(lang_1.lang.__('ES_APP_ERROR_STATE', { status: app.status }));
62
+ }
63
+ logger_1.logger.info(lang_1.lang.__('ES_APP_WAITING', { appId, status: app.status ?? 'unknown' }));
64
+ await new Promise((resolve) => setTimeout(resolve, 10000));
65
+ attempts++;
66
+ }
67
+ throw new Error(lang_1.lang.__('ES_APP_TIMEOUT_READY', { appId }));
68
+ };
69
+ const createEsOperations = (esClient, context) => {
70
+ const operations = {
71
+ createApp: async (config) => {
72
+ const params = new EsModels.CreateAppRequest({
73
+ appName: config.appName,
74
+ version: config.appVersion,
75
+ authentication: config.authentication,
76
+ quotaInfo: config.quotaInfo,
77
+ description: config.description,
78
+ network: config.network,
79
+ privateNetwork: config.privateNetwork,
80
+ chargeType: config.chargeType || 'POSTPAY',
81
+ regionId: config.regionId || context.region,
82
+ scenario: config.scenario,
83
+ tags: config.tags,
84
+ });
85
+ try {
86
+ const response = await esClient.createApp(params);
87
+ logger_1.logger.info(lang_1.lang.__('ES_APP_CREATION_INITIATED'));
88
+ if (!response.body?.result?.appId) {
89
+ throw new Error(lang_1.lang.__('ES_APP_NO_ID_RETURNED'));
90
+ }
91
+ const appId = response.body.result.appId;
92
+ // Wait for app to be ready
93
+ await waitForEsAppReady(operations.getApp, appId);
94
+ return appId;
95
+ }
96
+ catch (error) {
97
+ logger_1.logger.error(lang_1.lang.__('ES_APP_CREATION_FAILED', { error: String(error) }));
98
+ throw error;
99
+ }
100
+ },
101
+ getApp: async (appName) => {
102
+ const params = new EsModels.GetAppRequest({
103
+ detailed: true,
104
+ });
105
+ try {
106
+ const response = await esClient.getApp(appName, params);
107
+ if (!response.body?.result) {
108
+ return null;
109
+ }
110
+ const app = response.body.result;
111
+ return {
112
+ appId: app.appId,
113
+ appName: app.appName,
114
+ appType: app.appType,
115
+ status: app.status,
116
+ description: app.description,
117
+ createTime: app.createTime,
118
+ modifiedTime: app.modifiedTime,
119
+ regionId: app.regionId,
120
+ version: app.version,
121
+ ownerId: app.ownerId,
122
+ instanceId: app.instanceId,
123
+ chargeType: app.chargeType,
124
+ scenario: app.scenario,
125
+ network: app.network
126
+ ? app.network.map((n) => ({
127
+ type: n.type,
128
+ enabled: n.enabled,
129
+ domain: n.domain,
130
+ port: n.port,
131
+ whiteIpGroup: n.whiteIpGroup
132
+ ? n.whiteIpGroup.map((w) => ({
133
+ groupName: w.groupName,
134
+ ips: w.ips,
135
+ }))
136
+ : undefined,
137
+ }))
138
+ : undefined,
139
+ privateNetwork: app.privateNetwork
140
+ ? app.privateNetwork.map((n) => ({
141
+ type: n.type,
142
+ enabled: n.enabled,
143
+ domain: n.domain,
144
+ port: n.port,
145
+ vpcId: n.vpcId,
146
+ pvlEndpointId: n.pvlEndpointId,
147
+ whiteIpGroup: n.whiteIpGroup
148
+ ? n.whiteIpGroup.map((w) => ({
149
+ groupName: w.groupName,
150
+ ips: w.ips,
151
+ }))
152
+ : undefined,
153
+ }))
154
+ : undefined,
155
+ tags: app.tags
156
+ ? app.tags.map((t) => ({
157
+ key: t.key,
158
+ value: t.value,
159
+ }))
160
+ : undefined,
161
+ };
162
+ }
163
+ catch (error) {
164
+ logger_1.logger.error(lang_1.lang.__('ES_APP_GET_FAILED', { error: String(error) }));
165
+ return null;
166
+ }
167
+ },
168
+ updateApp: async (appName, config) => {
169
+ const params = new EsModels.UpdateAppRequest({
170
+ description: config.description,
171
+ authentication: config.authentication,
172
+ });
173
+ try {
174
+ await esClient.updateApp(appName, params);
175
+ logger_1.logger.info(lang_1.lang.__('ES_APP_UPDATED', { appName }));
176
+ // Wait for app to be ready
177
+ await waitForEsAppReady(operations.getApp, appName);
178
+ }
179
+ catch (error) {
180
+ logger_1.logger.error(lang_1.lang.__('ES_APP_UPDATE_FAILED', { error: String(error) }));
181
+ throw error;
182
+ }
183
+ },
184
+ deleteApp: async (appName) => {
185
+ try {
186
+ await esClient.deleteApp(appName);
187
+ logger_1.logger.info(lang_1.lang.__('ES_APP_DELETION_INITIATED', { appName }));
188
+ // Wait for app to be deleted
189
+ const maxAttempts = 60;
190
+ let attempts = 0;
191
+ while (attempts < maxAttempts) {
192
+ const app = await operations.getApp(appName);
193
+ if (!app) {
194
+ logger_1.logger.info(lang_1.lang.__('ES_APP_DELETED', { appName }));
195
+ return;
196
+ }
197
+ logger_1.logger.info(lang_1.lang.__('ES_APP_WAITING_DELETE', { appName }));
198
+ await new Promise((resolve) => setTimeout(resolve, 10000));
199
+ attempts++;
200
+ }
201
+ throw new Error(lang_1.lang.__('ES_APP_TIMEOUT_DELETE', { appName }));
202
+ }
203
+ catch (error) {
204
+ // If app is not found, consider it deleted
205
+ if (error &&
206
+ typeof error === 'object' &&
207
+ 'code' in error &&
208
+ (error.code === 'AppNotFound' || error.code === 'NotFound')) {
209
+ logger_1.logger.info(lang_1.lang.__('ES_APP_DELETED', { appName }));
210
+ return;
211
+ }
212
+ logger_1.logger.error(lang_1.lang.__('ES_APP_DELETE_FAILED', { error: String(error) }));
213
+ throw error;
214
+ }
215
+ },
216
+ };
217
+ return operations;
218
+ };
219
+ exports.createEsOperations = createEsOperations;