@numends/abap-client 0.0.1

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.
@@ -0,0 +1,461 @@
1
+ /**
2
+ * WebSocket Client
3
+ * Connects to MCP Cloud and executes SAP operations locally
4
+ */
5
+ import WebSocket from 'ws';
6
+ import { CONFIG, switchSystem, getAvailableSystems, getActiveSystem, fetchSapSystems, } from './config.js';
7
+ import { SAPClient } from './sap-client.js';
8
+ import { LockManager } from './lock-manager.js';
9
+ import { extractObjectInfoFromUrl, isLockOperation } from './abap-object-utils.js';
10
+ export class WebSocketClient {
11
+ config;
12
+ ws = null;
13
+ sapClient;
14
+ reconnectTimer = null;
15
+ keepAliveTimer = null;
16
+ isReconnecting = false;
17
+ lockManager;
18
+ constructor(config = CONFIG) {
19
+ this.config = config;
20
+ this.sapClient = new SAPClient(config.SAP);
21
+ this.lockManager = new LockManager();
22
+ }
23
+ connect() {
24
+ if (this.ws) {
25
+ if (this.ws.readyState === WebSocket.CONNECTING) {
26
+ console.log('⚠️ Already connecting, skipping duplicate connection attempt');
27
+ return;
28
+ }
29
+ if (this.ws.readyState === WebSocket.OPEN) {
30
+ console.log('⚠️ Already connected, skipping duplicate connection attempt');
31
+ return;
32
+ }
33
+ }
34
+ if (this.isReconnecting) {
35
+ console.log('⚠️ Reconnection already scheduled, skipping duplicate attempt');
36
+ return;
37
+ }
38
+ console.log('\n🔌 Connecting to MCP Cloud...');
39
+ console.log(` URL: ${this.config.WS_URL}`);
40
+ console.log(` API_KEY: ${this.config.API_KEY.substring(0, 15)}...`);
41
+ this.ws = new WebSocket(this.config.WS_URL, {
42
+ headers: {
43
+ 'Authorization': `Bearer ${this.config.API_KEY}`
44
+ }
45
+ });
46
+ this.ws.on('open', () => this.onOpen());
47
+ this.ws.on('message', (data) => this.onMessage(data));
48
+ this.ws.on('error', (error) => this.onError(error));
49
+ this.ws.on('close', () => this.onClose());
50
+ }
51
+ onOpen() {
52
+ console.log('✅ Connected to MCP Cloud!\n');
53
+ if (this.reconnectTimer) {
54
+ clearTimeout(this.reconnectTimer);
55
+ this.reconnectTimer = null;
56
+ }
57
+ this.isReconnecting = false;
58
+ this.startKeepAlive();
59
+ }
60
+ startKeepAlive() {
61
+ if (this.keepAliveTimer) {
62
+ clearInterval(this.keepAliveTimer);
63
+ }
64
+ const intervalMs = this.config.KEEPALIVE?.intervalMs || 300000;
65
+ this.keepAliveTimer = setInterval(async () => {
66
+ console.log(' 💓 Pinging SAP to keep session alive...');
67
+ const result = await this.sapClient.ping();
68
+ if (result.success) {
69
+ console.log(` ✅ SAP ping successful (status: ${result.status})`);
70
+ }
71
+ else {
72
+ console.error(` ⚠️ SAP ping failed: ${result.error}`);
73
+ }
74
+ }, intervalMs);
75
+ const minutes = Math.floor(intervalMs / 60000);
76
+ console.log(` 💓 SAP keep-alive started (ping every ${minutes} min)`);
77
+ }
78
+ stopKeepAlive() {
79
+ if (this.keepAliveTimer) {
80
+ clearInterval(this.keepAliveTimer);
81
+ this.keepAliveTimer = null;
82
+ console.log(' 💓 SAP keep-alive stopped');
83
+ }
84
+ }
85
+ async onMessage(data) {
86
+ try {
87
+ const message = JSON.parse(data.toString());
88
+ if (message.type === 'welcome') {
89
+ console.log('👋 Welcome message:', message.message);
90
+ return;
91
+ }
92
+ if (message.action && ['switch_system', 'reset_session', 'get_status', 'list_systems', 'refresh_systems'].includes(message.action)) {
93
+ message.type = 'command';
94
+ message.command = message.action;
95
+ if (Array.isArray(message.callspecs) && message.callspecs.length > 0) {
96
+ const params = message.callspecs[0];
97
+ if (params.system)
98
+ message.system = params.system;
99
+ }
100
+ }
101
+ if (message.type === 'command') {
102
+ await this.handleCommand(message);
103
+ return;
104
+ }
105
+ const { requestId, action, callspecs } = message;
106
+ if (!requestId || !action) {
107
+ console.error('❌ Invalid message format (missing requestId or action)');
108
+ return;
109
+ }
110
+ console.log(`\n📥 Received command: ${action} (request: ${requestId})`);
111
+ const executionResult = await this.executeCallspecs(action, callspecs || []);
112
+ if (Array.isArray(callspecs) && Array.isArray(executionResult.results)) {
113
+ for (let i = 0; i < callspecs.length; i++) {
114
+ const spec = callspecs[i];
115
+ const result = executionResult.results[i];
116
+ const isUnlockStep = spec.method === 'POST' && spec.url?.includes('?_action=UNLOCK');
117
+ const isActivateAction = action === 'activate';
118
+ const stepSucceeded = result?.success;
119
+ if ((isUnlockStep || isActivateAction) && stepSucceeded && spec.url) {
120
+ const { objectName, objectType } = extractObjectInfoFromUrl(spec.url);
121
+ if (objectName && objectType) {
122
+ this.lockManager.clearLock(objectName, objectType);
123
+ this.lockManager.clearLock(objectName, objectType, 'TESTCLASSES');
124
+ console.log(` 🧹 Lock cache cleared for ${objectName} (UNLOCK succeeded)`);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ this.sendResponse(requestId, executionResult.allSuccessful, executionResult.results);
130
+ console.log(`✅ Command completed: ${action}\n`);
131
+ }
132
+ catch (error) {
133
+ console.error(`❌ Error processing message: ${error.message}`);
134
+ console.error(` Stack: ${error.stack}`);
135
+ try {
136
+ const parsedMessage = JSON.parse(data.toString());
137
+ if (parsedMessage?.requestId) {
138
+ this.sendResponse(parsedMessage.requestId, false, { error: error.message });
139
+ }
140
+ }
141
+ catch (ignoreParseError) {
142
+ console.error(' ⚠️ Could not send error response');
143
+ }
144
+ }
145
+ }
146
+ async handleCommand(message) {
147
+ if (message.command === 'clear_locks') {
148
+ console.log('\n🧹 Clearing all locks...');
149
+ this.lockManager.clearAll();
150
+ return;
151
+ }
152
+ if (message.command === 'lock_stats') {
153
+ const stats = this.lockManager.getStats();
154
+ console.log('\n📊 Lock Statistics:');
155
+ console.log(` Active locks: ${stats.activeLocks}`);
156
+ console.log(` Locks: ${stats.locks.join(', ') || 'none'}`);
157
+ return;
158
+ }
159
+ if (message.command === 'switch_system') {
160
+ console.log(`\n🔄 Switching SAP system to: ${message.system}`);
161
+ try {
162
+ const result = switchSystem(message.system);
163
+ this.sapClient = new SAPClient(CONFIG.SAP);
164
+ this.lockManager.clearAll();
165
+ console.log(` ✅ Switched to ${result.config.name}`);
166
+ console.log(` 🔍 URL: ${result.config.baseUrl}`);
167
+ console.log(` 🏢 Client: ${result.config.client}`);
168
+ if (message.requestId) {
169
+ this.sendResponse(message.requestId, true, {
170
+ success: true,
171
+ system: message.system,
172
+ config: result.config,
173
+ message: `Switched to ${result.config.name}`
174
+ });
175
+ }
176
+ }
177
+ catch (error) {
178
+ console.error(` ❌ Switch failed: ${error.message}`);
179
+ if (message.requestId) {
180
+ this.sendResponse(message.requestId, false, {
181
+ success: false,
182
+ error: error.message
183
+ });
184
+ }
185
+ }
186
+ return;
187
+ }
188
+ if (message.command === 'reset_session') {
189
+ console.log('\n🔄 Resetting SAP session...');
190
+ this.sapClient.clearSession();
191
+ this.lockManager.clearAll();
192
+ console.log(' ✅ Session reset complete');
193
+ if (message.requestId) {
194
+ this.sendResponse(message.requestId, true, {
195
+ success: true,
196
+ message: 'SAP session reset successfully'
197
+ });
198
+ }
199
+ return;
200
+ }
201
+ if (message.command === 'get_status') {
202
+ console.log('\n📊 Getting system status...');
203
+ const currentSystem = getActiveSystem();
204
+ const lockStats = this.lockManager.getStats();
205
+ const status = {
206
+ activeSystem: currentSystem,
207
+ systemName: CONFIG.SAP.name,
208
+ baseUrl: CONFIG.SAP.baseUrl,
209
+ client: CONFIG.SAP.client,
210
+ language: CONFIG.SAP.language,
211
+ hasSession: !!this.sapClient.csrfToken,
212
+ activeLocks: lockStats.activeLocks,
213
+ locks: lockStats.locks,
214
+ connected: this.ws?.readyState === WebSocket.OPEN
215
+ };
216
+ console.log(` System: ${status.activeSystem} (${status.systemName})`);
217
+ console.log(` Session: ${status.hasSession ? 'Active' : 'Not established'}`);
218
+ console.log(` Locks: ${status.activeLocks}`);
219
+ if (message.requestId) {
220
+ this.sendResponse(message.requestId, true, status);
221
+ }
222
+ return;
223
+ }
224
+ if (message.command === 'list_systems') {
225
+ console.log('\n📋 Listing available systems...');
226
+ const systems = getAvailableSystems();
227
+ const currentSystem = getActiveSystem();
228
+ systems.forEach(sys => {
229
+ const marker = sys.key === currentSystem ? ' ← active' : '';
230
+ console.log(` ${sys.key}: ${sys.name} (${sys.baseUrl})${marker}`);
231
+ });
232
+ if (message.requestId) {
233
+ this.sendResponse(message.requestId, true, {
234
+ systems,
235
+ activeSystem: currentSystem
236
+ });
237
+ }
238
+ return;
239
+ }
240
+ if (message.command === 'refresh_systems') {
241
+ console.log('\n🔄 Refreshing SAP environments from admin...');
242
+ try {
243
+ await fetchSapSystems();
244
+ this.sapClient = new SAPClient(CONFIG.SAP);
245
+ this.lockManager.clearAll();
246
+ const systems = getAvailableSystems();
247
+ const currentSystem = getActiveSystem();
248
+ console.log(` ✅ Refreshed ${systems.length} system(s)`);
249
+ if (message.requestId) {
250
+ this.sendResponse(message.requestId, true, {
251
+ success: true,
252
+ systems,
253
+ activeSystem: currentSystem,
254
+ message: `Refreshed ${systems.length} SAP system(s) from admin`
255
+ });
256
+ }
257
+ }
258
+ catch (error) {
259
+ console.error(` ❌ Refresh failed: ${error.message}`);
260
+ if (message.requestId) {
261
+ this.sendResponse(message.requestId, false, {
262
+ success: false,
263
+ error: error.message
264
+ });
265
+ }
266
+ }
267
+ return;
268
+ }
269
+ }
270
+ async executeCallspecs(action, callspecs) {
271
+ console.log(` Executing ${action} on SAP...`);
272
+ if (Array.isArray(callspecs)) {
273
+ const results = [];
274
+ const extractedValues = {};
275
+ let allSuccessful = true;
276
+ let objectName = null;
277
+ let objectType = null;
278
+ let lockSuffix = '';
279
+ for (const spec of callspecs) {
280
+ if (spec.url) {
281
+ if (!objectName) {
282
+ const extracted = extractObjectInfoFromUrl(spec.url);
283
+ if (extracted.objectName && extracted.objectType) {
284
+ objectName = extracted.objectName;
285
+ objectType = extracted.objectType;
286
+ }
287
+ }
288
+ if (spec.url.includes('/includes/testclasses')) {
289
+ lockSuffix = 'TESTCLASSES';
290
+ }
291
+ }
292
+ }
293
+ if (objectName && objectType) {
294
+ if (lockSuffix) {
295
+ console.log(` 🏷️ Detected: ${objectName} (${objectType}:${lockSuffix})`);
296
+ }
297
+ else {
298
+ console.log(` 🏷️ Detected: ${objectName} (${objectType})`);
299
+ }
300
+ }
301
+ for (let i = 0; i < callspecs.length; i++) {
302
+ const callspec = callspecs[i];
303
+ console.log(`\n 📋 Processing callspec: ${callspec.name || callspec.step}`);
304
+ console.log(' 🔍 DEBUG - Full callspec received:', JSON.stringify(callspec, null, 2));
305
+ console.log(` Original URL: ${callspec.url}`);
306
+ const isLock = isLockOperation(callspec);
307
+ if (isLock && objectName && objectType) {
308
+ const cachedLock = this.lockManager.getLock(objectName, objectType, lockSuffix);
309
+ if (cachedLock) {
310
+ console.log(' ⚡ SKIPPING LOCK - Using cached lock!');
311
+ extractedValues.lockHandle = cachedLock.lockHandle;
312
+ extractedValues.transportRequest = cachedLock.transportRequest;
313
+ results.push({
314
+ success: true,
315
+ status: 200,
316
+ statusText: 'OK (cached)',
317
+ data: {
318
+ raw: null,
319
+ lockHandle: cachedLock.lockHandle,
320
+ transportRequest: cachedLock.transportRequest,
321
+ }
322
+ });
323
+ console.log(' ✅ Using cached lock (skip HTTP request)');
324
+ continue;
325
+ }
326
+ }
327
+ const processedCallspec = { ...callspec };
328
+ if (processedCallspec.url) {
329
+ const originalUrl = processedCallspec.url;
330
+ if (extractedValues.lockHandle) {
331
+ console.log(` 🔑 Substituting <LOCK_HANDLE> with: ${extractedValues.lockHandle}`);
332
+ processedCallspec.url = processedCallspec.url.replace(/<LOCK_HANDLE>/g, extractedValues.lockHandle);
333
+ }
334
+ else if (processedCallspec.url.includes('<LOCK_HANDLE>')) {
335
+ console.log(' ⚠️ URL contains <LOCK_HANDLE> but no value available!');
336
+ }
337
+ if (extractedValues.transportRequest) {
338
+ console.log(` 🔑 Substituting <TRANSPORT_REQUEST> with: ${extractedValues.transportRequest}`);
339
+ processedCallspec.url = processedCallspec.url.replace(/<TRANSPORT_REQUEST>/g, extractedValues.transportRequest);
340
+ }
341
+ else if (processedCallspec.url.includes('<TRANSPORT_REQUEST>')) {
342
+ console.log(' ⚠️ URL contains <TRANSPORT_REQUEST> but no value available!');
343
+ }
344
+ if (originalUrl !== processedCallspec.url) {
345
+ console.log(` ✅ URL after substitution: ${processedCallspec.url}`);
346
+ }
347
+ else {
348
+ console.log(' ℹ️ URL unchanged (no placeholders or no values)');
349
+ }
350
+ }
351
+ if (processedCallspec.body === '<NAMING_JSON>' && extractedValues.namingJson) {
352
+ console.log(' 📦 Substituting <NAMING_JSON> with naming JSON from Step 1');
353
+ const namingWithPackage = { ...extractedValues.namingJson };
354
+ if (processedCallspec.package) {
355
+ namingWithPackage.metadata = namingWithPackage.metadata || {};
356
+ namingWithPackage.metadata.package = processedCallspec.package;
357
+ console.log(` 📦 Injected package: ${processedCallspec.package}`);
358
+ }
359
+ processedCallspec.body = JSON.stringify(namingWithPackage);
360
+ }
361
+ else if (processedCallspec.body === '<NAMING_JSON>' && !extractedValues.namingJson) {
362
+ console.log(' ⚠️ Body contains <NAMING_JSON> but no naming JSON available!');
363
+ }
364
+ const result = await this.sapClient.executeCallspec(processedCallspec);
365
+ if (result.success && result.data?.raw && typeof result.data.raw === 'string') {
366
+ if (result.data.raw.includes('<SEVERITY>ERROR</SEVERITY>')) {
367
+ console.log(' ⚠️ Validation returned SEVERITY=ERROR');
368
+ const shortTextMatch = result.data.raw.match(/<SHORT_TEXT>([^<]*)<\/SHORT_TEXT>/);
369
+ if (shortTextMatch) {
370
+ console.log(` ❌ Error: ${shortTextMatch[1]}`);
371
+ }
372
+ result.success = false;
373
+ result.validationError = true;
374
+ }
375
+ }
376
+ results.push(result);
377
+ console.log(` 📊 Result: success=${result.success}, status=${result.status}`);
378
+ if (result.success && result.data) {
379
+ console.log(' 🔍 Checking for extractable values...');
380
+ if (result.data.lockHandle) {
381
+ extractedValues.lockHandle = result.data.lockHandle;
382
+ console.log(` 🔑 Extracted lock_handle: ${extractedValues.lockHandle}`);
383
+ if (isLock && objectName && objectType) {
384
+ this.lockManager.saveLock(objectName, objectType, result.data.lockHandle, result.data.transportRequest || '', lockSuffix);
385
+ }
386
+ }
387
+ if (result.data.transportRequest) {
388
+ extractedValues.transportRequest = result.data.transportRequest;
389
+ console.log(` 🔑 Extracted transport_request: ${extractedValues.transportRequest}`);
390
+ }
391
+ if (result.data.raw && typeof result.data.raw === 'object') {
392
+ extractedValues.namingJson = result.data.raw;
393
+ console.log(' 📦 Saved naming JSON for RAP UI workflow');
394
+ }
395
+ if (!result.data.lockHandle && !result.data.transportRequest && !(result.data.raw && typeof result.data.raw === 'object')) {
396
+ console.log(' ℹ️ No extractable values in this response');
397
+ }
398
+ }
399
+ if (!result.success) {
400
+ console.error(' ⚠️ Callspec failed, stopping execution');
401
+ allSuccessful = false;
402
+ break;
403
+ }
404
+ }
405
+ return { results, allSuccessful };
406
+ }
407
+ else {
408
+ const result = await this.sapClient.executeCallspec(callspecs);
409
+ return { results: [result], allSuccessful: result.success };
410
+ }
411
+ }
412
+ sendResponse(requestId, success, data) {
413
+ if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {
414
+ console.error('❌ Cannot send response: WebSocket not connected');
415
+ return;
416
+ }
417
+ this.ws.send(JSON.stringify({
418
+ type: 'response',
419
+ requestId,
420
+ success,
421
+ data,
422
+ timestamp: new Date().toISOString()
423
+ }));
424
+ console.log(` 📤 Response sent (success: ${success})`);
425
+ }
426
+ onError(error) {
427
+ console.error(`❌ WebSocket error: ${error.message}`);
428
+ }
429
+ onClose() {
430
+ console.log('\n⚠️ Disconnected from MCP Cloud');
431
+ this.ws = null;
432
+ this.stopKeepAlive();
433
+ this.sapClient.clearSession();
434
+ this.lockManager.clearAll();
435
+ const reconnectDelay = this.config.RETRY?.delayMs || 5000;
436
+ if (!this.isReconnecting && !this.reconnectTimer) {
437
+ console.log(` Reconnecting in ${reconnectDelay / 1000}s...`);
438
+ this.isReconnecting = true;
439
+ this.reconnectTimer = setTimeout(() => {
440
+ this.isReconnecting = false;
441
+ this.connect();
442
+ }, reconnectDelay);
443
+ }
444
+ else {
445
+ console.log(' ⚠️ Reconnection already scheduled, skipping');
446
+ }
447
+ }
448
+ disconnect() {
449
+ if (this.reconnectTimer) {
450
+ clearTimeout(this.reconnectTimer);
451
+ this.reconnectTimer = null;
452
+ }
453
+ this.isReconnecting = false;
454
+ this.stopKeepAlive();
455
+ if (this.ws) {
456
+ this.ws.close();
457
+ this.ws = null;
458
+ }
459
+ }
460
+ }
461
+ //# sourceMappingURL=websocket-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-client.js","sourceRoot":"","sources":["../src/websocket-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * XML Utilities
3
+ * Functions for parsing SAP XML responses and extracting error messages
4
+ */
5
+ export interface SAPParseResult {
6
+ hasErrors: boolean;
7
+ errorMessages: string[];
8
+ parsedData: Record<string, unknown> | null;
9
+ }
10
+ export declare function parseSAPResponse(xmlString: unknown): SAPParseResult;
11
+ export declare function extractXmlValue(xmlString: unknown, tagName: string): string | null;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * XML Utilities
3
+ * Functions for parsing SAP XML responses and extracting error messages
4
+ */
5
+ import { XMLParser } from 'fast-xml-parser';
6
+ const xmlParser = new XMLParser({
7
+ ignoreAttributes: false,
8
+ attributeNamePrefix: '@_'
9
+ });
10
+ export function parseSAPResponse(xmlString) {
11
+ if (typeof xmlString !== 'string' || !xmlString.includes('<?xml')) {
12
+ return { hasErrors: false, errorMessages: [], parsedData: null };
13
+ }
14
+ try {
15
+ const parsed = xmlParser.parse(xmlString); // eslint-disable-line @typescript-eslint/no-explicit-any
16
+ // Check for syntax check errors (chkrun:checkMessage with type="E")
17
+ if (parsed['chkrun:checkRunReports']) {
18
+ const report = parsed['chkrun:checkRunReports']['chkrun:checkReport'];
19
+ const messageList = report?.['chkrun:checkMessageList'];
20
+ if (messageList?.['chkrun:checkMessage']) {
21
+ const messages = Array.isArray(messageList['chkrun:checkMessage'])
22
+ ? messageList['chkrun:checkMessage']
23
+ : [messageList['chkrun:checkMessage']];
24
+ const errorMessages = [];
25
+ for (const msg of messages) {
26
+ if (msg['@_chkrun:type'] === 'E') {
27
+ let line = null;
28
+ if (msg['@_chkrun:uri']?.includes('#start=')) {
29
+ const match = msg['@_chkrun:uri'].match(/#start=(\d+),(\d+)/);
30
+ if (match) {
31
+ line = parseInt(match[1]);
32
+ }
33
+ }
34
+ const text = msg['@_chkrun:shortText'] || 'Unknown error';
35
+ const lineInfo = line ? ` (line ${line})` : '';
36
+ errorMessages.push(`${text}${lineInfo}`);
37
+ }
38
+ }
39
+ if (errorMessages.length > 0) {
40
+ return { hasErrors: true, errorMessages, parsedData: parsed };
41
+ }
42
+ }
43
+ }
44
+ // Check for ACTIVATION errors (chkl:messages with msg type="E")
45
+ if (parsed['chkl:messages']) {
46
+ const chklMessages = parsed['chkl:messages'];
47
+ const msgList = chklMessages['msg'];
48
+ if (msgList) {
49
+ const messages = Array.isArray(msgList) ? msgList : [msgList];
50
+ const errorMessages = [];
51
+ for (const msg of messages) {
52
+ const msgType = msg['@_type'];
53
+ if (msgType === 'E') {
54
+ const shortText = msg['shortText'];
55
+ if (shortText) {
56
+ const txtList = shortText['txt'];
57
+ if (txtList) {
58
+ const texts = Array.isArray(txtList) ? txtList : [txtList];
59
+ for (const txt of texts) {
60
+ if (typeof txt === 'string' && txt.trim()) {
61
+ errorMessages.push(txt.trim());
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ if (errorMessages.length > 0) {
69
+ return { hasErrors: true, errorMessages, parsedData: parsed };
70
+ }
71
+ }
72
+ }
73
+ // Check for exception errors (exc:exception)
74
+ if (parsed['exc:exception']) {
75
+ const exception = parsed['exc:exception'];
76
+ const message = exception['message'] ||
77
+ exception['localizedMessage'] ||
78
+ 'Unknown SAP exception';
79
+ return { hasErrors: true, errorMessages: [message], parsedData: parsed };
80
+ }
81
+ // Check for atom error feed
82
+ if (parsed['atom:feed']?.['atom:entry']?.['atom:content']?.['exc:exception']) {
83
+ const exception = parsed['atom:feed']['atom:entry']['atom:content']['exc:exception'];
84
+ const message = exception['localizedMessage'] || 'Unknown error';
85
+ return { hasErrors: true, errorMessages: [message], parsedData: parsed };
86
+ }
87
+ return { hasErrors: false, errorMessages: [], parsedData: parsed };
88
+ }
89
+ catch (error) {
90
+ console.error(' [ERR] XML parsing failed:', error.message);
91
+ return { hasErrors: false, errorMessages: [], parsedData: null };
92
+ }
93
+ }
94
+ export function extractXmlValue(xmlString, tagName) {
95
+ if (typeof xmlString !== 'string')
96
+ return null;
97
+ const patterns = [
98
+ new RegExp(`<(?:[a-z]+:)?${tagName}>(.*?)<\\/(?:[a-z]+:)?${tagName}>`, 'i'),
99
+ new RegExp(`<${tagName}>(.*?)<\\/${tagName}>`, 'i')
100
+ ];
101
+ for (const pattern of patterns) {
102
+ const match = xmlString.match(pattern);
103
+ if (match) {
104
+ return match[1];
105
+ }
106
+ }
107
+ return null;
108
+ }
109
+ //# sourceMappingURL=xml-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml-utils.js","sourceRoot":"","sources":["../src/xml-utils.ts"],"names":[],"mappings":"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"}