@mcp-abap-adt/adt-clients 7.3.1 → 7.4.2

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 (85) hide show
  1. package/dist/clients/AdtClient.d.ts +32 -0
  2. package/dist/clients/AdtClient.d.ts.map +1 -1
  3. package/dist/clients/AdtClient.js +75 -30
  4. package/dist/core/accessControl/AdtAccessControl.d.ts +3 -1
  5. package/dist/core/accessControl/AdtAccessControl.d.ts.map +1 -1
  6. package/dist/core/accessControl/AdtAccessControl.js +11 -2
  7. package/dist/core/appendStructure/AdtAppendStructure.d.ts +3 -1
  8. package/dist/core/appendStructure/AdtAppendStructure.d.ts.map +1 -1
  9. package/dist/core/appendStructure/AdtAppendStructure.js +11 -2
  10. package/dist/core/authorizationField/AdtAuthorizationField.d.ts +3 -1
  11. package/dist/core/authorizationField/AdtAuthorizationField.d.ts.map +1 -1
  12. package/dist/core/authorizationField/AdtAuthorizationField.js +14 -3
  13. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts +3 -1
  14. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.d.ts.map +1 -1
  15. package/dist/core/behaviorDefinition/AdtBehaviorDefinition.js +11 -2
  16. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts +2 -1
  17. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.d.ts.map +1 -1
  18. package/dist/core/behaviorImplementation/AdtBehaviorImplementation.js +6 -3
  19. package/dist/core/class/AdtClass.d.ts +3 -1
  20. package/dist/core/class/AdtClass.d.ts.map +1 -1
  21. package/dist/core/class/AdtClass.js +16 -3
  22. package/dist/core/dataElement/AdtDataElement.d.ts +3 -1
  23. package/dist/core/dataElement/AdtDataElement.d.ts.map +1 -1
  24. package/dist/core/dataElement/AdtDataElement.js +9 -1
  25. package/dist/core/ddl/AdtDdl.d.ts +3 -1
  26. package/dist/core/ddl/AdtDdl.d.ts.map +1 -1
  27. package/dist/core/ddl/AdtDdl.js +11 -2
  28. package/dist/core/domain/AdtDomain.d.ts +3 -1
  29. package/dist/core/domain/AdtDomain.d.ts.map +1 -1
  30. package/dist/core/domain/AdtDomain.js +11 -1
  31. package/dist/core/enhancement/AdtEnhancement.d.ts +12 -1
  32. package/dist/core/enhancement/AdtEnhancement.d.ts.map +1 -1
  33. package/dist/core/enhancement/AdtEnhancement.js +35 -4
  34. package/dist/core/featureToggle/AdtFeatureToggle.d.ts +3 -1
  35. package/dist/core/featureToggle/AdtFeatureToggle.d.ts.map +1 -1
  36. package/dist/core/featureToggle/AdtFeatureToggle.js +14 -2
  37. package/dist/core/functionGroup/AdtFunctionGroup.d.ts +3 -1
  38. package/dist/core/functionGroup/AdtFunctionGroup.d.ts.map +1 -1
  39. package/dist/core/functionGroup/AdtFunctionGroup.js +9 -1
  40. package/dist/core/functionInclude/AdtFunctionInclude.d.ts +9 -1
  41. package/dist/core/functionInclude/AdtFunctionInclude.d.ts.map +1 -1
  42. package/dist/core/functionInclude/AdtFunctionInclude.js +33 -3
  43. package/dist/core/functionModule/AdtFunctionModule.d.ts +9 -1
  44. package/dist/core/functionModule/AdtFunctionModule.d.ts.map +1 -1
  45. package/dist/core/functionModule/AdtFunctionModule.js +27 -2
  46. package/dist/core/interface/AdtInterface.d.ts +3 -1
  47. package/dist/core/interface/AdtInterface.d.ts.map +1 -1
  48. package/dist/core/interface/AdtInterface.js +11 -2
  49. package/dist/core/messageClass/AdtMessageClass.d.ts +3 -1
  50. package/dist/core/messageClass/AdtMessageClass.d.ts.map +1 -1
  51. package/dist/core/messageClass/AdtMessageClass.js +11 -2
  52. package/dist/core/metadataExtension/AdtMetadataExtension.d.ts +3 -1
  53. package/dist/core/metadataExtension/AdtMetadataExtension.d.ts.map +1 -1
  54. package/dist/core/metadataExtension/AdtMetadataExtension.js +9 -1
  55. package/dist/core/package/AdtPackage.d.ts +3 -1
  56. package/dist/core/package/AdtPackage.d.ts.map +1 -1
  57. package/dist/core/package/AdtPackage.js +11 -2
  58. package/dist/core/program/AdtProgram.d.ts +3 -1
  59. package/dist/core/program/AdtProgram.d.ts.map +1 -1
  60. package/dist/core/program/AdtProgram.js +11 -2
  61. package/dist/core/scalarFunction/AdtScalarFunction.d.ts +3 -1
  62. package/dist/core/scalarFunction/AdtScalarFunction.d.ts.map +1 -1
  63. package/dist/core/scalarFunction/AdtScalarFunction.js +11 -2
  64. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts +3 -1
  65. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.d.ts.map +1 -1
  66. package/dist/core/scalarFunctionImplementation/AdtScalarFunctionImplementation.js +14 -2
  67. package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts +6 -3
  68. package/dist/core/serviceDefinition/AdtServiceDefinition.d.ts.map +1 -1
  69. package/dist/core/serviceDefinition/AdtServiceDefinition.js +14 -4
  70. package/dist/core/shared/LockRegistry.d.ts +77 -0
  71. package/dist/core/shared/LockRegistry.d.ts.map +1 -0
  72. package/dist/core/shared/LockRegistry.js +91 -0
  73. package/dist/core/structure/AdtStructure.d.ts +3 -1
  74. package/dist/core/structure/AdtStructure.d.ts.map +1 -1
  75. package/dist/core/structure/AdtStructure.js +11 -2
  76. package/dist/core/table/AdtTable.d.ts +3 -1
  77. package/dist/core/table/AdtTable.d.ts.map +1 -1
  78. package/dist/core/table/AdtTable.js +11 -2
  79. package/dist/core/tabletype/AdtDdicTableType.d.ts +3 -1
  80. package/dist/core/tabletype/AdtDdicTableType.d.ts.map +1 -1
  81. package/dist/core/tabletype/AdtDdicTableType.js +9 -1
  82. package/dist/core/transformation/AdtTransformation.d.ts +3 -1
  83. package/dist/core/transformation/AdtTransformation.d.ts.map +1 -1
  84. package/dist/core/transformation/AdtTransformation.js +11 -2
  85. package/package.json +1 -1
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.AdtTable = void 0;
23
23
  const internalUtils_1 = require("../../utils/internalUtils");
24
+ const LockRegistry_1 = require("../shared/LockRegistry");
24
25
  const activation_1 = require("./activation");
25
26
  const check_1 = require("./check");
26
27
  const create_1 = require("./create");
@@ -35,11 +36,13 @@ class AdtTable {
35
36
  connection;
36
37
  logger;
37
38
  systemContext;
39
+ lockTracker;
38
40
  objectType = 'Table';
39
- constructor(connection, logger, systemContext) {
41
+ constructor(connection, logger, systemContext, lockRegistry) {
40
42
  this.connection = connection;
41
43
  this.logger = logger;
42
44
  this.systemContext = systemContext ?? {};
45
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockTable)(this.connection, name, lockHandle));
43
46
  }
44
47
  /**
45
48
  * Validate table configuration before creation
@@ -217,6 +220,7 @@ class AdtTable {
217
220
  this.logger?.info?.('Step 1: Locking table');
218
221
  this.connection.setSessionType('stateful');
219
222
  lockHandle = await (0, lock_1.acquireTableLockHandle)(this.connection, config.tableName);
223
+ this.lockTracker.track(config.tableName, lockHandle);
220
224
  this.logger?.info?.('Table locked, handle:', lockHandle);
221
225
  // 2. Check inactive with code for update (from options or config)
222
226
  const codeToCheck = options?.sourceCode || config.ddlCode;
@@ -234,10 +238,11 @@ class AdtTable {
234
238
  transport_request: config.transportRequest,
235
239
  }, lockHandle);
236
240
  this.logger?.info?.('Table updated');
241
+ // Poll the inactive version: the write above produced it; the active version may not exist yet.
237
242
  // 3.5. Read with long polling to ensure object is ready after update
238
243
  this.logger?.info?.('read (wait for object ready after update)');
239
244
  try {
240
- await this.read({ tableName: config.tableName }, 'active', {
245
+ await this.read({ tableName: config.tableName }, 'inactive', {
241
246
  withLongPolling: true,
242
247
  });
243
248
  this.logger?.info?.('object is ready after update');
@@ -253,6 +258,7 @@ class AdtTable {
253
258
  this.connection.setSessionType('stateful');
254
259
  await (0, unlock_1.unlockTable)(this.connection, config.tableName, lockHandle);
255
260
  this.connection.setSessionType('stateless');
261
+ this.lockTracker.untrack(config.tableName);
256
262
  lockHandle = undefined;
257
263
  this.logger?.info?.('Table unlocked');
258
264
  }
@@ -302,6 +308,7 @@ class AdtTable {
302
308
  this.connection.setSessionType('stateful');
303
309
  await (0, unlock_1.unlockTable)(this.connection, config.tableName, lockHandle);
304
310
  this.connection.setSessionType('stateless');
311
+ this.lockTracker.untrack(config.tableName);
305
312
  }
306
313
  catch (unlockError) {
307
314
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -397,6 +404,7 @@ class AdtTable {
397
404
  }
398
405
  this.connection.setSessionType('stateful');
399
406
  const lockHandle = await (0, lock_1.acquireTableLockHandle)(this.connection, config.tableName);
407
+ this.lockTracker.track(config.tableName, lockHandle);
400
408
  return lockHandle;
401
409
  }
402
410
  /**
@@ -409,6 +417,7 @@ class AdtTable {
409
417
  this.connection.setSessionType('stateful');
410
418
  const result = await (0, unlock_1.unlockTable)(this.connection, config.tableName, lockHandle);
411
419
  this.connection.setSessionType('stateless');
420
+ this.lockTracker.untrack(config.tableName);
412
421
  return {
413
422
  unlockResult: result,
414
423
  errors: [],
@@ -19,14 +19,16 @@
19
19
  */
20
20
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
21
21
  import type { IAdtSystemContext } from '../../clients/AdtClient';
22
+ import { type LockRegistry } from '../shared/LockRegistry';
22
23
  import type { IReadOptions } from '../shared/types';
23
24
  import type { ITableTypeConfig, ITableTypeState } from './types';
24
25
  export declare class AdtDdicTableType implements IAdtObject<ITableTypeConfig, ITableTypeState> {
25
26
  private readonly connection;
26
27
  private readonly logger?;
27
28
  private readonly systemContext;
29
+ private readonly lockTracker;
28
30
  readonly objectType: string;
29
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
31
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
30
32
  /**
31
33
  * Validate table type configuration before creation
32
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtDdicTableType.d.ts","sourceRoot":"","sources":["../../../src/core/tabletype/AdtDdicTableType.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAMjE,qBAAa,gBACX,YAAW,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAe;gBAG/C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAa3E;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;IAwD3B;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,eAAe,CAAC;IAwB3B;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,eAAe,CAAC;IAiC3B;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,eAAe,CAAC;IAkC3B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;IA8O3B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IA6BzE;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB3E;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC;IAmB3B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAa9D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC;IAkB3B,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAI7C,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
1
+ {"version":3,"file":"AdtDdicTableType.d.ts","sourceRoot":"","sources":["../../../src/core/tabletype/AdtDdicTableType.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAMjE,qBAAa,gBACX,YAAW,UAAU,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAe;gBAG/C,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAY7B;;OAEG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAa3E;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,gBAAgB,EACxB,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;IAwD3B;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,QAAQ,CAAC,EAAE,QAAQ,GAAG,UAAU,EAChC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,eAAe,CAAC;IAwB3B;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,eAAe,CAAC;IAiC3B;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,eAAe,CAAC;IAkC3B;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,eAAe,CAAC;IAiP3B;;OAEG;IACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IA6BzE;;;OAGG;IACG,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC;IAiB3E;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,CAAC;IAmB3B;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAc9D;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,EACjC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC;IAmB3B,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC;IAI7C,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.AdtDdicTableType = void 0;
23
23
  const internalUtils_1 = require("../../utils/internalUtils");
24
+ const LockRegistry_1 = require("../shared/LockRegistry");
24
25
  const activation_1 = require("./activation");
25
26
  const check_1 = require("./check");
26
27
  const create_1 = require("./create");
@@ -35,11 +36,13 @@ class AdtDdicTableType {
35
36
  connection;
36
37
  logger;
37
38
  systemContext;
39
+ lockTracker;
38
40
  objectType = 'TableType';
39
- constructor(connection, logger, systemContext) {
41
+ constructor(connection, logger, systemContext, lockRegistry) {
40
42
  this.connection = connection;
41
43
  this.logger = logger;
42
44
  this.systemContext = systemContext ?? {};
45
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (name, lockHandle) => (0, unlock_1.unlockTableType)(this.connection, name, lockHandle));
43
46
  }
44
47
  /**
45
48
  * Validate table type configuration before creation
@@ -225,6 +228,7 @@ class AdtDdicTableType {
225
228
  this.logger?.info?.('Step 1: Locking table type');
226
229
  this.connection.setSessionType('stateful');
227
230
  lockHandle = await (0, lock_1.acquireTableTypeLockHandle)(this.connection, config.tableTypeName);
231
+ this.lockTracker.track(config.tableTypeName, lockHandle);
228
232
  this.logger?.info?.('Table type locked, handle:', lockHandle);
229
233
  // 2. Check inactive (TableType is XML-based, no source code check needed)
230
234
  // Skip check step for XML-based TableType
@@ -274,6 +278,7 @@ class AdtDdicTableType {
274
278
  this.connection.setSessionType('stateful');
275
279
  await (0, unlock_1.unlockTableType)(this.connection, config.tableTypeName, lockHandle);
276
280
  this.connection.setSessionType('stateless');
281
+ this.lockTracker.untrack(config.tableTypeName);
277
282
  lockHandle = undefined;
278
283
  this.logger?.info?.('Table type unlocked');
279
284
  }
@@ -337,6 +342,7 @@ class AdtDdicTableType {
337
342
  this.connection.setSessionType('stateful');
338
343
  await (0, unlock_1.unlockTableType)(this.connection, config.tableTypeName, lockHandle);
339
344
  this.connection.setSessionType('stateless');
345
+ this.lockTracker.untrack(config.tableTypeName);
340
346
  }
341
347
  catch (unlockError) {
342
348
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -432,6 +438,7 @@ class AdtDdicTableType {
432
438
  }
433
439
  this.connection.setSessionType('stateful');
434
440
  const lockHandle = await (0, lock_1.acquireTableTypeLockHandle)(this.connection, config.tableTypeName);
441
+ this.lockTracker.track(config.tableTypeName, lockHandle);
435
442
  return lockHandle;
436
443
  }
437
444
  /**
@@ -444,6 +451,7 @@ class AdtDdicTableType {
444
451
  this.connection.setSessionType('stateful');
445
452
  const result = await (0, unlock_1.unlockTableType)(this.connection, config.tableTypeName, lockHandle);
446
453
  this.connection.setSessionType('stateless');
454
+ this.lockTracker.untrack(config.tableTypeName);
447
455
  return {
448
456
  unlockResult: result,
449
457
  errors: [],
@@ -19,14 +19,16 @@
19
19
  */
20
20
  import type { IAbapConnection, IAdtObject, IAdtOperationOptions, ILogger } from '@mcp-abap-adt/interfaces';
21
21
  import type { IAdtSystemContext } from '../../clients/AdtClient';
22
+ import { type LockRegistry } from '../shared/LockRegistry';
22
23
  import type { IReadOptions } from '../shared/types';
23
24
  import type { ITransformationConfig, ITransformationState } from './types';
24
25
  export declare class AdtTransformation implements IAdtObject<ITransformationConfig, ITransformationState> {
25
26
  private readonly connection;
26
27
  private readonly logger?;
27
28
  private readonly systemContext;
29
+ private readonly lockTracker;
28
30
  readonly objectType: string;
29
- constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext);
31
+ constructor(connection: IAbapConnection, logger?: ILogger, systemContext?: IAdtSystemContext, lockRegistry?: LockRegistry);
30
32
  /**
31
33
  * Validate transformation configuration before creation
32
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AdtTransformation.d.ts","sourceRoot":"","sources":["../../../src/core/transformation/AdtTransformation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAS3E,qBAAa,iBACX,YAAW,UAAU,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;IAElE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,SAAgB,UAAU,EAAE,MAAM,CAAoB;gBAGpD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB;IAOnC;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAsChC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAyChC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IA2B5C;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,oBAAoB,CAAC;IAkChC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,oBAAoB,CAAC;IAkChC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IA6MhC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAmChC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAqBhC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC;IAkBhC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAanE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC;IAkBhC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAIlD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
1
+ {"version":3,"file":"AdtTransformation.d.ts","sourceRoot":"","sources":["../../../src/core/transformation/AdtTransformation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAEV,eAAe,EACf,UAAU,EACV,oBAAoB,EACpB,OAAO,EACR,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAWpD,OAAO,KAAK,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAS3E,qBAAa,iBACX,YAAW,UAAU,CAAC,qBAAqB,EAAE,oBAAoB,CAAC;IAElE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkB;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAoB;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,SAAgB,UAAU,EAAE,MAAM,CAAoB;gBAGpD,UAAU,EAAE,eAAe,EAC3B,MAAM,CAAC,EAAE,OAAO,EAChB,aAAa,CAAC,EAAE,iBAAiB,EACjC,YAAY,CAAC,EAAE,YAAY;IAa7B;;OAEG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAsChC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,qBAAqB,EAC7B,QAAQ,CAAC,EAAE,oBAAoB,GAC9B,OAAO,CAAC,oBAAoB,CAAC;IAyChC;;OAEG;IACG,IAAI,CACR,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,EAC/B,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IA2B5C;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,oBAAoB,CAAC;IAkChC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE,GACtC,OAAO,CAAC,oBAAoB,CAAC;IAkChC;;;;OAIG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAiNhC;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAmChC;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACrC,OAAO,CAAC,oBAAoB,CAAC;IAqBhC;;OAEG;IACG,KAAK,CACT,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,oBAAoB,CAAC;IAkBhC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAcnE;;OAEG;IACG,MAAM,CACV,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,EACtC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,oBAAoB,CAAC;IAmBhC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC;IAIlD,gBAAgB,CAAC,UAAU,EAAE,MAAM;CAGpC"}
@@ -21,6 +21,7 @@
21
21
  Object.defineProperty(exports, "__esModule", { value: true });
22
22
  exports.AdtTransformation = void 0;
23
23
  const internalUtils_1 = require("../../utils/internalUtils");
24
+ const LockRegistry_1 = require("../shared/LockRegistry");
24
25
  const activation_1 = require("./activation");
25
26
  const check_1 = require("./check");
26
27
  const create_1 = require("./create");
@@ -35,11 +36,13 @@ class AdtTransformation {
35
36
  connection;
36
37
  logger;
37
38
  systemContext;
39
+ lockTracker;
38
40
  objectType = 'Transformation';
39
- constructor(connection, logger, systemContext) {
41
+ constructor(connection, logger, systemContext, lockRegistry) {
40
42
  this.connection = connection;
41
43
  this.logger = logger;
42
44
  this.systemContext = systemContext ?? {};
45
+ this.lockTracker = (0, LockRegistry_1.createLockTracker)(lockRegistry, this.objectType, (transformationName, lockHandle) => (0, unlock_1.unlockTransformation)(this.connection, transformationName, lockHandle));
43
46
  }
44
47
  /**
45
48
  * Validate transformation configuration before creation
@@ -238,6 +241,7 @@ class AdtTransformation {
238
241
  this.logger?.info?.('Step 1: Locking transformation');
239
242
  this.connection.setSessionType('stateful');
240
243
  lockHandle = await (0, lock_1.lockTransformation)(this.connection, config.transformationName);
244
+ this.lockTracker.track(config.transformationName, lockHandle);
241
245
  this.logger?.info?.('Transformation locked, handle:', lockHandle);
242
246
  // 2. Check inactive with code for update (from options or config)
243
247
  const codeToCheck = options?.sourceCode || config.sourceCode;
@@ -255,10 +259,11 @@ class AdtTransformation {
255
259
  transport_request: config.transportRequest,
256
260
  }, lockHandle);
257
261
  this.logger?.info?.('Transformation updated');
262
+ // Poll the inactive version: the write above produced it; the active version may not exist yet.
258
263
  // 3.5. Read with long polling (wait for object to be ready after update)
259
264
  this.logger?.info?.('read (wait for object ready after update)');
260
265
  try {
261
- await this.read({ transformationName: config.transformationName }, 'active', { withLongPolling: true });
266
+ await this.read({ transformationName: config.transformationName }, 'inactive', { withLongPolling: true });
262
267
  this.logger?.info?.('object is ready after update');
263
268
  }
264
269
  catch (readError) {
@@ -272,6 +277,7 @@ class AdtTransformation {
272
277
  this.connection.setSessionType('stateful');
273
278
  await (0, unlock_1.unlockTransformation)(this.connection, config.transformationName, lockHandle);
274
279
  this.connection.setSessionType('stateless');
280
+ this.lockTracker.untrack(config.transformationName);
275
281
  lockHandle = undefined;
276
282
  this.logger?.info?.('Transformation unlocked');
277
283
  }
@@ -314,6 +320,7 @@ class AdtTransformation {
314
320
  this.connection.setSessionType('stateful');
315
321
  await (0, unlock_1.unlockTransformation)(this.connection, config.transformationName, lockHandle);
316
322
  this.connection.setSessionType('stateless');
323
+ this.lockTracker.untrack(config.transformationName);
317
324
  }
318
325
  catch (unlockError) {
319
326
  this.logger?.warn?.('Failed to unlock during cleanup:', (0, internalUtils_1.safeErrorMessage)(unlockError));
@@ -420,6 +427,7 @@ class AdtTransformation {
420
427
  }
421
428
  this.connection.setSessionType('stateful');
422
429
  const lockHandle = await (0, lock_1.lockTransformation)(this.connection, config.transformationName);
430
+ this.lockTracker.track(config.transformationName, lockHandle);
423
431
  return lockHandle;
424
432
  }
425
433
  /**
@@ -432,6 +440,7 @@ class AdtTransformation {
432
440
  this.connection.setSessionType('stateful');
433
441
  const result = await (0, unlock_1.unlockTransformation)(this.connection, config.transformationName, lockHandle);
434
442
  this.connection.setSessionType('stateless');
443
+ this.lockTracker.untrack(config.transformationName);
435
444
  return {
436
445
  unlockResult: result,
437
446
  errors: [],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/adt-clients",
3
- "version": "7.3.1",
3
+ "version": "7.4.2",
4
4
  "description": "ADT clients for SAP ABAP systems - AdtClient and AdtRuntimeClient",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",