@qwe8652591/abap-recursive-query 1.1.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 (210) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +223 -0
  3. package/dist/cli/consumer-cli.d.ts +8 -0
  4. package/dist/cli/consumer-cli.d.ts.map +1 -0
  5. package/dist/cli/consumer-cli.js +180 -0
  6. package/dist/cli/producer-cli.d.ts +8 -0
  7. package/dist/cli/producer-cli.d.ts.map +1 -0
  8. package/dist/cli/producer-cli.js +249 -0
  9. package/dist/cli/query-object.d.ts +3 -0
  10. package/dist/cli/query-object.d.ts.map +1 -0
  11. package/dist/cli/query-object.js +486 -0
  12. package/dist/common/FilterCache.d.ts +62 -0
  13. package/dist/common/FilterCache.d.ts.map +1 -0
  14. package/dist/common/FilterCache.js +119 -0
  15. package/dist/common/RedisQueueManager.d.ts +170 -0
  16. package/dist/common/RedisQueueManager.d.ts.map +1 -0
  17. package/dist/common/RedisQueueManager.js +663 -0
  18. package/dist/common/abapStructures.d.ts +391 -0
  19. package/dist/common/abapStructures.d.ts.map +1 -0
  20. package/dist/common/abapStructures.js +2 -0
  21. package/dist/common/config.d.ts +66 -0
  22. package/dist/common/config.d.ts.map +1 -0
  23. package/dist/common/config.js +56 -0
  24. package/dist/common/index.d.ts +13 -0
  25. package/dist/common/index.d.ts.map +1 -0
  26. package/dist/common/index.js +38 -0
  27. package/dist/common/recursiveQueryConfig.d.ts +77 -0
  28. package/dist/common/recursiveQueryConfig.d.ts.map +1 -0
  29. package/dist/common/recursiveQueryConfig.js +129 -0
  30. package/dist/common/tableStructures.d.ts +176 -0
  31. package/dist/common/tableStructures.d.ts.map +1 -0
  32. package/dist/common/tableStructures.js +10 -0
  33. package/dist/common/types.d.ts +104 -0
  34. package/dist/common/types.d.ts.map +1 -0
  35. package/dist/common/types.js +31 -0
  36. package/dist/common/utils.d.ts +57 -0
  37. package/dist/common/utils.d.ts.map +1 -0
  38. package/dist/common/utils.js +300 -0
  39. package/dist/consumer/FileDownloadConsumer.d.ts +127 -0
  40. package/dist/consumer/FileDownloadConsumer.d.ts.map +1 -0
  41. package/dist/consumer/FileDownloadConsumer.js +1003 -0
  42. package/dist/consumer/generators/baseGenerator.d.ts +38 -0
  43. package/dist/consumer/generators/baseGenerator.d.ts.map +1 -0
  44. package/dist/consumer/generators/baseGenerator.js +103 -0
  45. package/dist/consumer/generators/domainGenerator.d.ts +78 -0
  46. package/dist/consumer/generators/domainGenerator.d.ts.map +1 -0
  47. package/dist/consumer/generators/domainGenerator.js +241 -0
  48. package/dist/consumer/generators/guiStatusGenerator.d.ts +16 -0
  49. package/dist/consumer/generators/guiStatusGenerator.d.ts.map +1 -0
  50. package/dist/consumer/generators/guiStatusGenerator.js +48 -0
  51. package/dist/consumer/generators/guiTitleGenerator.d.ts +16 -0
  52. package/dist/consumer/generators/guiTitleGenerator.d.ts.map +1 -0
  53. package/dist/consumer/generators/guiTitleGenerator.js +48 -0
  54. package/dist/consumer/generators/index.d.ts +14 -0
  55. package/dist/consumer/generators/index.d.ts.map +1 -0
  56. package/dist/consumer/generators/index.js +38 -0
  57. package/dist/consumer/generators/messageGenerator.d.ts +16 -0
  58. package/dist/consumer/generators/messageGenerator.d.ts.map +1 -0
  59. package/dist/consumer/generators/messageGenerator.js +73 -0
  60. package/dist/consumer/generators/metadataGenerator.d.ts +29 -0
  61. package/dist/consumer/generators/metadataGenerator.d.ts.map +1 -0
  62. package/dist/consumer/generators/metadataGenerator.js +135 -0
  63. package/dist/consumer/generators/screenGenerator.d.ts +173 -0
  64. package/dist/consumer/generators/screenGenerator.d.ts.map +1 -0
  65. package/dist/consumer/generators/screenGenerator.js +859 -0
  66. package/dist/consumer/generators/structureGenerator.d.ts +36 -0
  67. package/dist/consumer/generators/structureGenerator.d.ts.map +1 -0
  68. package/dist/consumer/generators/structureGenerator.js +131 -0
  69. package/dist/consumer/generators/textElementGenerator.d.ts +16 -0
  70. package/dist/consumer/generators/textElementGenerator.d.ts.map +1 -0
  71. package/dist/consumer/generators/textElementGenerator.js +70 -0
  72. package/dist/consumer/handlers/handleGetClass.d.ts +8 -0
  73. package/dist/consumer/handlers/handleGetClass.d.ts.map +1 -0
  74. package/dist/consumer/handlers/handleGetClass.js +18 -0
  75. package/dist/consumer/handlers/handleGetFunction.d.ts +8 -0
  76. package/dist/consumer/handlers/handleGetFunction.d.ts.map +1 -0
  77. package/dist/consumer/handlers/handleGetFunction.js +19 -0
  78. package/dist/consumer/handlers/handleGetFunctionGroup.d.ts +8 -0
  79. package/dist/consumer/handlers/handleGetFunctionGroup.d.ts.map +1 -0
  80. package/dist/consumer/handlers/handleGetFunctionGroup.js +19 -0
  81. package/dist/consumer/handlers/handleGetInclude.d.ts +8 -0
  82. package/dist/consumer/handlers/handleGetInclude.d.ts.map +1 -0
  83. package/dist/consumer/handlers/handleGetInclude.js +18 -0
  84. package/dist/consumer/handlers/handleGetProgram.d.ts +8 -0
  85. package/dist/consumer/handlers/handleGetProgram.d.ts.map +1 -0
  86. package/dist/consumer/handlers/handleGetProgram.js +27 -0
  87. package/dist/consumer/handlers/handleZTableQuery.d.ts +8 -0
  88. package/dist/consumer/handlers/handleZTableQuery.d.ts.map +1 -0
  89. package/dist/consumer/handlers/handleZTableQuery.js +20 -0
  90. package/dist/consumer/handlers/index.d.ts +10 -0
  91. package/dist/consumer/handlers/index.d.ts.map +1 -0
  92. package/dist/consumer/handlers/index.js +27 -0
  93. package/dist/consumer/index.d.ts +9 -0
  94. package/dist/consumer/index.d.ts.map +1 -0
  95. package/dist/consumer/index.js +24 -0
  96. package/dist/consumer/utils/download.d.ts +13 -0
  97. package/dist/consumer/utils/download.d.ts.map +1 -0
  98. package/dist/consumer/utils/download.js +38 -0
  99. package/dist/consumer/utils/index.d.ts +5 -0
  100. package/dist/consumer/utils/index.d.ts.map +1 -0
  101. package/dist/consumer/utils/index.js +20 -0
  102. package/dist/handlers/handleGetClass.d.ts +8 -0
  103. package/dist/handlers/handleGetClass.d.ts.map +1 -0
  104. package/dist/handlers/handleGetClass.js +19 -0
  105. package/dist/handlers/handleGetFunction.d.ts +8 -0
  106. package/dist/handlers/handleGetFunction.d.ts.map +1 -0
  107. package/dist/handlers/handleGetFunction.js +20 -0
  108. package/dist/handlers/handleGetFunctionGroup.d.ts +8 -0
  109. package/dist/handlers/handleGetFunctionGroup.d.ts.map +1 -0
  110. package/dist/handlers/handleGetFunctionGroup.js +19 -0
  111. package/dist/handlers/handleGetInclude.d.ts +8 -0
  112. package/dist/handlers/handleGetInclude.d.ts.map +1 -0
  113. package/dist/handlers/handleGetInclude.js +19 -0
  114. package/dist/handlers/handleGetInterface.d.ts +8 -0
  115. package/dist/handlers/handleGetInterface.d.ts.map +1 -0
  116. package/dist/handlers/handleGetInterface.js +19 -0
  117. package/dist/handlers/handleGetPackage.d.ts +8 -0
  118. package/dist/handlers/handleGetPackage.d.ts.map +1 -0
  119. package/dist/handlers/handleGetPackage.js +42 -0
  120. package/dist/handlers/handleGetProgram.d.ts +8 -0
  121. package/dist/handlers/handleGetProgram.d.ts.map +1 -0
  122. package/dist/handlers/handleGetProgram.js +19 -0
  123. package/dist/handlers/handleGetStructure.d.ts +8 -0
  124. package/dist/handlers/handleGetStructure.d.ts.map +1 -0
  125. package/dist/handlers/handleGetStructure.js +19 -0
  126. package/dist/handlers/handleGetTable.d.ts +8 -0
  127. package/dist/handlers/handleGetTable.d.ts.map +1 -0
  128. package/dist/handlers/handleGetTable.js +19 -0
  129. package/dist/handlers/handleGetTableContents.d.ts +8 -0
  130. package/dist/handlers/handleGetTableContents.d.ts.map +1 -0
  131. package/dist/handlers/handleGetTableContents.js +22 -0
  132. package/dist/handlers/handleGetTransaction.d.ts +8 -0
  133. package/dist/handlers/handleGetTransaction.d.ts.map +1 -0
  134. package/dist/handlers/handleGetTransaction.js +19 -0
  135. package/dist/handlers/handleGetTypeInfo.d.ts +8 -0
  136. package/dist/handlers/handleGetTypeInfo.d.ts.map +1 -0
  137. package/dist/handlers/handleGetTypeInfo.js +32 -0
  138. package/dist/handlers/handleSearchObject.d.ts +8 -0
  139. package/dist/handlers/handleSearchObject.d.ts.map +1 -0
  140. package/dist/handlers/handleSearchObject.js +20 -0
  141. package/dist/handlers/handleZObjectQuery.d.ts +8 -0
  142. package/dist/handlers/handleZObjectQuery.d.ts.map +1 -0
  143. package/dist/handlers/handleZObjectQuery.js +25 -0
  144. package/dist/handlers/handleZTableQuery.d.ts +8 -0
  145. package/dist/handlers/handleZTableQuery.d.ts.map +1 -0
  146. package/dist/handlers/handleZTableQuery.js +20 -0
  147. package/dist/index.d.ts +17 -0
  148. package/dist/index.d.ts.map +1 -0
  149. package/dist/index.js +45 -0
  150. package/dist/lib/download.d.ts +49 -0
  151. package/dist/lib/download.d.ts.map +1 -0
  152. package/dist/lib/download.js +78 -0
  153. package/dist/lib/index.d.ts +9 -0
  154. package/dist/lib/index.d.ts.map +1 -0
  155. package/dist/lib/index.js +23 -0
  156. package/dist/lib/utils.d.ts +31 -0
  157. package/dist/lib/utils.d.ts.map +1 -0
  158. package/dist/lib/utils.js +272 -0
  159. package/dist/producer/RecursiveQueryProducer.d.ts +92 -0
  160. package/dist/producer/RecursiveQueryProducer.d.ts.map +1 -0
  161. package/dist/producer/RecursiveQueryProducer.js +496 -0
  162. package/dist/producer/handlers/handleZObjectQuery.d.ts +8 -0
  163. package/dist/producer/handlers/handleZObjectQuery.d.ts.map +1 -0
  164. package/dist/producer/handlers/handleZObjectQuery.js +24 -0
  165. package/dist/producer/handlers/index.d.ts +6 -0
  166. package/dist/producer/handlers/index.d.ts.map +1 -0
  167. package/dist/producer/handlers/index.js +21 -0
  168. package/dist/producer/index.d.ts +7 -0
  169. package/dist/producer/index.d.ts.map +1 -0
  170. package/dist/producer/index.js +22 -0
  171. package/dist/recursive/abapStructures.d.ts +377 -0
  172. package/dist/recursive/abapStructures.d.ts.map +1 -0
  173. package/dist/recursive/abapStructures.js +2 -0
  174. package/dist/recursive/generate/baseGenerator.d.ts +34 -0
  175. package/dist/recursive/generate/baseGenerator.d.ts.map +1 -0
  176. package/dist/recursive/generate/baseGenerator.js +112 -0
  177. package/dist/recursive/generate/domainGenerator.d.ts +26 -0
  178. package/dist/recursive/generate/domainGenerator.d.ts.map +1 -0
  179. package/dist/recursive/generate/domainGenerator.js +128 -0
  180. package/dist/recursive/generate/functionGroupGenerator.d.ts +30 -0
  181. package/dist/recursive/generate/functionGroupGenerator.d.ts.map +1 -0
  182. package/dist/recursive/generate/functionGroupGenerator.js +90 -0
  183. package/dist/recursive/generate/index.d.ts +12 -0
  184. package/dist/recursive/generate/index.d.ts.map +1 -0
  185. package/dist/recursive/generate/index.js +34 -0
  186. package/dist/recursive/generate/messageGenerator.d.ts +16 -0
  187. package/dist/recursive/generate/messageGenerator.d.ts.map +1 -0
  188. package/dist/recursive/generate/messageGenerator.js +73 -0
  189. package/dist/recursive/generate/screenGenerator.d.ts +173 -0
  190. package/dist/recursive/generate/screenGenerator.d.ts.map +1 -0
  191. package/dist/recursive/generate/screenGenerator.js +858 -0
  192. package/dist/recursive/generate/structureGenerator.d.ts +22 -0
  193. package/dist/recursive/generate/structureGenerator.d.ts.map +1 -0
  194. package/dist/recursive/generate/structureGenerator.js +88 -0
  195. package/dist/recursive/generate/textElementGenerator.d.ts +16 -0
  196. package/dist/recursive/generate/textElementGenerator.d.ts.map +1 -0
  197. package/dist/recursive/generate/textElementGenerator.js +68 -0
  198. package/dist/recursive/handleRecursiveObjectQuery.d.ts +94 -0
  199. package/dist/recursive/handleRecursiveObjectQuery.d.ts.map +1 -0
  200. package/dist/recursive/handleRecursiveObjectQuery.js +219 -0
  201. package/dist/recursive/recursiveObjectQuery.d.ts +159 -0
  202. package/dist/recursive/recursiveObjectQuery.d.ts.map +1 -0
  203. package/dist/recursive/recursiveObjectQuery.js +1358 -0
  204. package/dist/recursive/recursiveQueryConfig.d.ts +129 -0
  205. package/dist/recursive/recursiveQueryConfig.d.ts.map +1 -0
  206. package/dist/recursive/recursiveQueryConfig.js +133 -0
  207. package/dist/recursive/tableStructures.d.ts +196 -0
  208. package/dist/recursive/tableStructures.d.ts.map +1 -0
  209. package/dist/recursive/tableStructures.js +10 -0
  210. package/package.json +47 -0
@@ -0,0 +1,300 @@
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.ErrorCode = exports.McpError = void 0;
37
+ exports.getConfig = getConfig;
38
+ exports.return_response = return_response;
39
+ exports.return_error = return_error;
40
+ exports.createAxiosInstance = createAxiosInstance;
41
+ exports.getBaseUrl = getBaseUrl;
42
+ exports.getAuthHeaders = getAuthHeaders;
43
+ exports.escapeXml = escapeXml;
44
+ exports.sanitizeObjectName = sanitizeObjectName;
45
+ exports.makeAdtRequest = makeAdtRequest;
46
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
47
+ Object.defineProperty(exports, "McpError", { enumerable: true, get: function () { return types_js_1.McpError; } });
48
+ Object.defineProperty(exports, "ErrorCode", { enumerable: true, get: function () { return types_js_1.ErrorCode; } });
49
+ const axios_1 = __importStar(require("axios"));
50
+ const https_1 = require("https");
51
+ /**
52
+ * 从环境变量获取 SAP 配置
53
+ */
54
+ function getConfig() {
55
+ const url = process.env.SAP_URL;
56
+ const username = process.env.SAP_USERNAME;
57
+ const password = process.env.SAP_PASSWORD;
58
+ const client = process.env.SAP_CLIENT;
59
+ if (!url || !username || !password || !client) {
60
+ throw new Error(`缺少必需的环境变量。需要的变量:
61
+ - SAP_URL
62
+ - SAP_USERNAME
63
+ - SAP_PASSWORD
64
+ - SAP_CLIENT`);
65
+ }
66
+ return { url, username, password, client };
67
+ }
68
+ function return_response(response) {
69
+ return {
70
+ isError: false,
71
+ content: [{
72
+ type: 'text',
73
+ text: response.data
74
+ }]
75
+ };
76
+ }
77
+ function return_error(error) {
78
+ return {
79
+ isError: true,
80
+ content: [{
81
+ type: 'text',
82
+ text: `Error: ${error instanceof axios_1.AxiosError ? String(error.response?.data)
83
+ : error instanceof Error ? error.message
84
+ : String(error)}`
85
+ }]
86
+ };
87
+ }
88
+ let axiosInstance = null;
89
+ function createAxiosInstance() {
90
+ if (!axiosInstance) {
91
+ axiosInstance = axios_1.default.create({
92
+ httpsAgent: new https_1.Agent({
93
+ rejectUnauthorized: false // Allow self-signed certificates
94
+ })
95
+ });
96
+ }
97
+ return axiosInstance;
98
+ }
99
+ let config;
100
+ let csrfToken = null;
101
+ let cookies = null; // Variable to store cookies
102
+ async function getBaseUrl() {
103
+ if (!config) {
104
+ config = getConfig();
105
+ }
106
+ const { url } = config;
107
+ try {
108
+ const urlObj = new URL(url);
109
+ const baseUrl = Buffer.from(`${urlObj.origin}`);
110
+ return baseUrl;
111
+ }
112
+ catch (error) {
113
+ const errorMessage = `Invalid URL in configuration: ${error instanceof Error ? error.message : error}`;
114
+ throw new Error(errorMessage);
115
+ }
116
+ }
117
+ async function getAuthHeaders() {
118
+ if (!config) {
119
+ config = getConfig();
120
+ }
121
+ const { username, password, client } = config;
122
+ const auth = Buffer.from(`${username}:${password}`).toString('base64'); // Create Basic Auth string
123
+ return {
124
+ 'Authorization': `Basic ${auth}`, // Basic Authentication header
125
+ 'SAP-Client': client // SAP client header
126
+ };
127
+ }
128
+ async function fetchCsrfToken(url) {
129
+ try {
130
+ const response = await createAxiosInstance()({
131
+ method: 'GET',
132
+ url,
133
+ headers: {
134
+ ...(await getAuthHeaders()),
135
+ 'x-csrf-token': 'fetch'
136
+ }
137
+ });
138
+ const token = response.headers['x-csrf-token'];
139
+ if (!token) {
140
+ throw new Error('No CSRF token in response headers');
141
+ }
142
+ // Extract and store cookies
143
+ if (response.headers['set-cookie']) {
144
+ cookies = response.headers['set-cookie'].join('; ');
145
+ }
146
+ return token;
147
+ }
148
+ catch (error) {
149
+ // Even if the request fails, try to get token from error response
150
+ if (error instanceof axios_1.AxiosError && error.response?.headers['x-csrf-token']) {
151
+ const token = error.response.headers['x-csrf-token'];
152
+ if (token) {
153
+ // Extract and store cookies from the error response as well
154
+ if (error.response.headers['set-cookie']) {
155
+ cookies = error.response.headers['set-cookie'].join('; ');
156
+ }
157
+ return token;
158
+ }
159
+ }
160
+ // If we couldn't get token from error response either, throw the original error
161
+ throw new Error(`Failed to fetch CSRF token: ${error instanceof Error ? error.message : String(error)}`);
162
+ }
163
+ }
164
+ /**
165
+ * XML转义函数 - 将特殊字符转换为XML实体
166
+ */
167
+ function escapeXml(text) {
168
+ if (text == null) {
169
+ return '';
170
+ }
171
+ return String(text)
172
+ .replace(/&/g, '&amp;')
173
+ .replace(/</g, '&lt;')
174
+ .replace(/>/g, '&gt;')
175
+ .replace(/"/g, '&quot;')
176
+ .replace(/'/g, '&apos;');
177
+ }
178
+ /**
179
+ * 对象名称转义函数 - 将特殊字符转换为文件系统安全的字符
180
+ *
181
+ * 转义规则:
182
+ * - 斜杠 (/, \) -> 下划线 (_)
183
+ * - 尖括号 (<, >) -> 井号 (#)
184
+ * - 其他非字母数字字符 -> 下划线 (_)
185
+ *
186
+ * @param name - 原始对象名称
187
+ * @returns 转义后的安全名称
188
+ *
189
+ * @example
190
+ * sanitizeObjectName('SAPLMEGUI') // 'SAPLMEGUI'
191
+ * sanitizeObjectName('OBJECT/NAME') // 'OBJECT_NAME'
192
+ * sanitizeObjectName('OBJECT<TYPE>') // 'OBJECT#TYPE#'
193
+ */
194
+ function sanitizeObjectName(name) {
195
+ if (!name) {
196
+ return '';
197
+ }
198
+ return String(name)
199
+ .replace(/[/\\]/g, '_')
200
+ .replace(/[<>]/g, '#')
201
+ .replace(/[^a-zA-Z0-9_#]/g, '_');
202
+ }
203
+ async function makeAdtRequest(url, method, timeout, data, params) {
204
+ // For POST/PUT requests, ensure we have a CSRF token
205
+ if ((method === 'POST' || method === 'PUT') && !csrfToken) {
206
+ try {
207
+ csrfToken = await fetchCsrfToken(url);
208
+ }
209
+ catch (error) {
210
+ throw new Error('CSRF token is required for POST/PUT requests but could not be fetched');
211
+ }
212
+ }
213
+ const requestHeaders = {
214
+ ...(await getAuthHeaders())
215
+ };
216
+ // Add CSRF token for POST/PUT requests
217
+ if ((method === 'POST' || method === 'PUT') && csrfToken) {
218
+ requestHeaders['x-csrf-token'] = csrfToken;
219
+ }
220
+ // Add cookies if available
221
+ if (cookies) {
222
+ requestHeaders['Cookie'] = cookies;
223
+ }
224
+ const config = {
225
+ method,
226
+ url,
227
+ headers: requestHeaders,
228
+ timeout,
229
+ params: params
230
+ };
231
+ // Include data in the request configuration if provided
232
+ if (data) {
233
+ config.data = data;
234
+ }
235
+ const requestStartTime = Date.now();
236
+ const urlPath = new URL(url).pathname + (config.params ? '?' + new URLSearchParams(config.params).toString() : '');
237
+ const paramsInfo = config.params ? ` | 参数: ${JSON.stringify(config.params)}` : '';
238
+ try {
239
+ console.error(`[HTTP请求] 开始请求: ${method} ${url} (超时: ${timeout}ms)${paramsInfo}`);
240
+ // 添加请求进度监控
241
+ const progressInterval = setInterval(() => {
242
+ const elapsed = Date.now() - requestStartTime;
243
+ const elapsedSeconds = Math.floor(elapsed / 1000);
244
+ if (elapsedSeconds > 10) { // 超过10秒才输出警告
245
+ console.warn(`[HTTP请求-等待中] ${method} ${url} - 已等待 ${elapsedSeconds}秒,可能网络较慢或服务器无响应${paramsInfo}`);
246
+ }
247
+ }, 10000); // 每10秒检查一次
248
+ let response;
249
+ try {
250
+ response = await createAxiosInstance()(config);
251
+ }
252
+ finally {
253
+ clearInterval(progressInterval);
254
+ }
255
+ const requestDuration = Date.now() - requestStartTime;
256
+ console.error(`[HTTP请求] 请求完成: ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`);
257
+ return response;
258
+ }
259
+ catch (error) {
260
+ const requestDuration = Date.now() - requestStartTime;
261
+ // If we get a 403 with "CSRF token validation failed", try to fetch a new token and retry
262
+ if (error instanceof axios_1.AxiosError && error.response?.status === 403 &&
263
+ error.response.data?.includes('CSRF')) {
264
+ console.error(`[HTTP请求] CSRF token 失效,重新获取token并重试: ${url}${paramsInfo}`);
265
+ csrfToken = await fetchCsrfToken(url);
266
+ config.headers['x-csrf-token'] = csrfToken;
267
+ console.error(`[HTTP请求] 重试请求: ${method} ${url}${paramsInfo}`);
268
+ const retryResponse = await createAxiosInstance()(config);
269
+ const retryDuration = Date.now() - requestStartTime;
270
+ console.error(`[HTTP请求] 重试完成: ${method} ${url} (总耗时: ${retryDuration}ms)${paramsInfo}`);
271
+ return retryResponse;
272
+ }
273
+ // 构造详细的错误信息并抛出
274
+ let errorMessage;
275
+ if (error instanceof axios_1.AxiosError) {
276
+ if (error.code === 'ECONNABORTED') {
277
+ errorMessage = `请求超时 - ${method} ${url} (耗时: ${requestDuration}ms, 超时设置: ${timeout}ms)${paramsInfo}`;
278
+ console.error(`[HTTP请求-超时] ${errorMessage}`);
279
+ }
280
+ else if (error.response) {
281
+ errorMessage = `服务器返回错误 - ${method} ${url} (状态: ${error.response.status}, 耗时: ${requestDuration}ms)${paramsInfo}`;
282
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
283
+ }
284
+ else if (error.request) {
285
+ errorMessage = `无响应 - ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`;
286
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
287
+ }
288
+ else {
289
+ errorMessage = `${error.message} - ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`;
290
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
291
+ }
292
+ }
293
+ else {
294
+ errorMessage = `${error instanceof Error ? error.message : String(error)} - ${method} ${url} (耗时: ${requestDuration}ms)${paramsInfo}`;
295
+ console.error(`[HTTP请求-错误] ${errorMessage}`);
296
+ }
297
+ // 抛出包含详细信息的新错误
298
+ throw new Error(errorMessage);
299
+ }
300
+ }
@@ -0,0 +1,127 @@
1
+ /**
2
+ * 文件下载消费者
3
+ * 负责从队列拉取任务并下载文件
4
+ */
5
+ import { RedisQueueManager } from '../common';
6
+ /**
7
+ * 下载结果
8
+ */
9
+ interface DownloadResult {
10
+ objectName: string;
11
+ objectType: string;
12
+ filePath: string;
13
+ success: boolean;
14
+ error?: string;
15
+ }
16
+ /**
17
+ * 文件下载消费者
18
+ */
19
+ export declare class FileDownloadConsumer {
20
+ private workerId;
21
+ private queueManager;
22
+ private isRunning;
23
+ private activeJobIds;
24
+ private downloadedFiles;
25
+ private downloadRootPath;
26
+ private organizeByProgram;
27
+ private abaplintRegistry;
28
+ constructor(queueManager: RedisQueueManager, downloadRootPath: string, jobIds?: string[], organizeByProgram?: boolean);
29
+ /**
30
+ * 启动消费者
31
+ */
32
+ start(jobIds?: string[]): Promise<void>;
33
+ /**
34
+ * 停止消费者
35
+ */
36
+ stop(): Promise<void>;
37
+ /**
38
+ * 获取下载的文件列表
39
+ */
40
+ getDownloadedFiles(): DownloadResult[];
41
+ /**
42
+ * 处理任务
43
+ */
44
+ private processTask;
45
+ /**
46
+ * 生成进度条
47
+ */
48
+ private generateProgressBar;
49
+ /**
50
+ * 下载对象源代码
51
+ */
52
+ private downloadObjectSource;
53
+ /**
54
+ * 处理附加数据
55
+ */
56
+ private processAdditionalData;
57
+ /**
58
+ * 处理对象元数据
59
+ */
60
+ private processObjectMetadata;
61
+ /**
62
+ * 处理函数的附加数据
63
+ */
64
+ private processFunctionData;
65
+ /**
66
+ * 处理程序的附加数据
67
+ */
68
+ private processProgramData;
69
+ /**
70
+ * 处理类的附加数据
71
+ */
72
+ private processClassData;
73
+ /**
74
+ * 下载 Include 文件并根据内容自动检测类型,添加符合 abaplint 规范的后缀
75
+ */
76
+ private downloadInclude;
77
+ /**
78
+ * ✅ 分析 include 文件内容,返回类型和真实名称
79
+ * 使用 abaplint 进行精确的语法分析
80
+ * - 只对 FUNCTION 类型提取真实函数名
81
+ * - 其他类型(类、表单等)保持使用原始 include 名称
82
+ * - 遵循零硬编码原则:所有信息从源代码中动态提取
83
+ */
84
+ private analyzeIncludeContent;
85
+ /**
86
+ * 根据 include 类型生成符合 abaplint 规范的文件路径
87
+ */
88
+ private generateIncludeFilePath;
89
+ /**
90
+ * 提取函数组名称
91
+ */
92
+ private extractFunctionGroup;
93
+ /**
94
+ * 生成文件路径
95
+ */
96
+ private generateFilePath;
97
+ /**
98
+ * 获取默认文件扩展名
99
+ */
100
+ private getDefaultExtension;
101
+ /**
102
+ * 获取对象目录
103
+ */
104
+ private getObjectDirectory;
105
+ /**
106
+ * 获取活跃的 Job 列表
107
+ */
108
+ private getActiveJobs;
109
+ /**
110
+ * 延迟函数
111
+ */
112
+ private sleep;
113
+ /**
114
+ * 处理结构体列表
115
+ */
116
+ private processStructures;
117
+ /**
118
+ * 处理单个结构体
119
+ */
120
+ private processSingleStructure;
121
+ /**
122
+ * 处理屏幕数据
123
+ */
124
+ private processScreens;
125
+ }
126
+ export {};
127
+ //# sourceMappingURL=FileDownloadConsumer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileDownloadConsumer.d.ts","sourceRoot":"","sources":["../../src/consumer/FileDownloadConsumer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,iBAAiB,EAAyC,MAAM,WAAW,CAAC;AAyBrF;;GAEG;AACH,UAAU,cAAc;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,YAAY,CAAgB;IACpC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,iBAAiB,CAAU;IACnC,OAAO,CAAC,gBAAgB,CAAW;gBAG/B,YAAY,EAAE,iBAAiB,EAC/B,gBAAgB,EAAE,MAAM,EACxB,MAAM,CAAC,EAAE,MAAM,EAAE,EACjB,iBAAiB,GAAE,OAAc;IAiBrC;;OAEG;IACG,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqD7C;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B;;OAEG;IACH,kBAAkB,IAAI,cAAc,EAAE;IAItC;;OAEG;YACW,WAAW;IA+EzB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;YACW,oBAAoB;IAuGlC;;OAEG;YACW,qBAAqB;IAuBnC;;OAEG;YACW,qBAAqB;IA4BnC;;OAEG;YACW,mBAAmB;IA6IjC;;OAEG;YACW,kBAAkB;IAuIhC;;OAEG;YACW,gBAAgB;IA6D9B;;OAEG;YACW,eAAe;IA8D7B;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAkH7B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmC/B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAQ5B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAU3B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;YACW,aAAa;IAI3B;;OAEG;IACH,OAAO,CAAC,KAAK;IAIb;;OAEG;YACW,iBAAiB;IAc/B;;OAEG;YACW,sBAAsB;IA6DpC;;OAEG;YACW,cAAc;CA2G/B"}