@mcp-abap-adt/connection 1.1.1 → 1.3.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.
@@ -12,25 +12,23 @@ declare abstract class AbstractAbapConnection implements AbapConnection {
12
12
  private baseUrl;
13
13
  private sessionId;
14
14
  private sessionMode;
15
- protected constructor(config: SapConfig, logger: ILogger | null, sessionId?: string);
15
+ private skipSessionType;
16
+ protected constructor(config: SapConfig, logger: ILogger | null, sessionId?: string, options?: {
17
+ skipSessionType?: boolean;
18
+ });
16
19
  /**
17
20
  * Set session type (stateful or stateless)
18
21
  * Controls whether x-sap-adt-sessiontype: stateful header is added to requests
19
22
  * - stateful: SAP maintains session state between requests (locks, transactions)
20
23
  * - stateless: Each request is independent
24
+ *
25
+ * When skipSessionType is enabled (via constructor options), this is a no-op:
26
+ * the x-sap-adt-sessiontype header will never be sent. This is needed for
27
+ * older BASIS versions (e.g. 7.40) where the stateful header causes locks
28
+ * to be stored in ABAP session memory instead of the global enqueue table,
29
+ * resulting in HTTP 423 on subsequent PUT requests.
21
30
  */
22
31
  setSessionType(type: 'stateful' | 'stateless'): void;
23
- /**
24
- * Enable stateful session mode (tells SAP to maintain stateful session)
25
- * This controls whether x-sap-adt-sessiontype: stateful header is used
26
- * @deprecated Use setSessionType("stateful") instead
27
- */
28
- enableStatefulSession(): void;
29
- /**
30
- * Disable stateful session mode (switch to stateless)
31
- * @deprecated Use setSessionType("stateless") instead
32
- */
33
- disableStatefulSession(): void;
34
32
  /**
35
33
  * Get current session mode
36
34
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,0BAA0B,CAAC;AAM7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,uBAAe,sBAAuB,YAAW,cAAc;IAU3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAV3C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAyC;IAE5D,SAAS,aACU,MAAM,EAAE,SAAS,EACf,MAAM,EAAE,OAAO,GAAG,IAAI,EACzC,SAAS,CAAC,EAAE,MAAM;IAoBpB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;IAOpD;;;;OAIG;IACH,qBAAqB,IAAI,IAAI;IAI7B;;;OAGG;IACH,sBAAsB,IAAI,IAAI;IAU9B;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,UAAU;IAI1C;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKrC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,SAAS,IAAI,SAAS;IAItB,KAAK,IAAI,IAAI;IAYP,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAevD;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACnC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IA4P9B,SAAS,CAAC,QAAQ,CAAC,wBAAwB,IAAI,MAAM;IAErD;;;OAGG;cACa,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,MAAgC,EAC5C,UAAU,GAAE,MAAgC,GAC3C,OAAO,CAAC,MAAM,CAAC;IAgLlB;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvC;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM,GAAG,IAAI;IAIrC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlD,OAAO,CAAC,yBAAyB;IAkEjC,OAAO,CAAC,gBAAgB;YAqBV,oBAAoB;IAiClC,OAAO,CAAC,eAAe;CA+BxB;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
1
+ {"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,YAAY,EAAkB,MAAM,0BAA0B,CAAC;AAM7E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAG9E,uBAAe,sBAAuB,YAAW,cAAc;IAW3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAX3C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,eAAe,CAAU;IAEjC,SAAS,aACU,MAAM,EAAE,SAAS,EACf,MAAM,EAAE,OAAO,GAAG,IAAI,EACzC,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAqBzC;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;IAUpD;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,UAAU;IAI1C;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKrC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,SAAS,IAAI,SAAS;IAItB,KAAK,IAAI,IAAI;IAYP,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAevD;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,cAAc,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EACnC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IA4P9B,SAAS,CAAC,QAAQ,CAAC,wBAAwB,IAAI,MAAM;IAErD;;;OAGG;cACa,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,MAAgC,EAC5C,UAAU,GAAE,MAAgC,GAC3C,OAAO,CAAC,MAAM,CAAC;IAgLlB;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvC;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM,GAAG,IAAI;IAIrC,SAAS,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIlD,OAAO,CAAC,yBAAyB;IAkEjC,OAAO,CAAC,gBAAgB;YAqBV,oBAAoB;IAiClC,OAAO,CAAC,eAAe;CA+BxB;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
@@ -50,9 +50,11 @@ class AbstractAbapConnection {
50
50
  baseUrl;
51
51
  sessionId = null;
52
52
  sessionMode = 'stateless';
53
- constructor(config, logger, sessionId) {
53
+ skipSessionType;
54
+ constructor(config, logger, sessionId, options) {
54
55
  this.config = config;
55
56
  this.logger = logger;
57
+ this.skipSessionType = options?.skipSessionType ?? false;
56
58
  // Generate sessionId (used for sap-adt-connection-id header)
57
59
  this.sessionId = sessionId || (0, node_crypto_1.randomUUID)();
58
60
  // Initialize baseUrl from config (required, will throw if invalid)
@@ -70,32 +72,22 @@ class AbstractAbapConnection {
70
72
  * Controls whether x-sap-adt-sessiontype: stateful header is added to requests
71
73
  * - stateful: SAP maintains session state between requests (locks, transactions)
72
74
  * - stateless: Each request is independent
75
+ *
76
+ * When skipSessionType is enabled (via constructor options), this is a no-op:
77
+ * the x-sap-adt-sessiontype header will never be sent. This is needed for
78
+ * older BASIS versions (e.g. 7.40) where the stateful header causes locks
79
+ * to be stored in ABAP session memory instead of the global enqueue table,
80
+ * resulting in HTTP 423 on subsequent PUT requests.
73
81
  */
74
82
  setSessionType(type) {
83
+ if (this.skipSessionType) {
84
+ return;
85
+ }
75
86
  this.sessionMode = type;
76
87
  this.logger?.debug(`Session type set to: ${type}`, {
77
88
  sessionId: this.sessionId?.substring(0, 8),
78
89
  });
79
90
  }
80
- /**
81
- * Enable stateful session mode (tells SAP to maintain stateful session)
82
- * This controls whether x-sap-adt-sessiontype: stateful header is used
83
- * @deprecated Use setSessionType("stateful") instead
84
- */
85
- enableStatefulSession() {
86
- this.setSessionType('stateful');
87
- }
88
- /**
89
- * Disable stateful session mode (switch to stateless)
90
- * @deprecated Use setSessionType("stateless") instead
91
- */
92
- disableStatefulSession() {
93
- if (this.sessionMode === 'stateless') {
94
- return;
95
- }
96
- this.sessionMode = 'stateless';
97
- this.logger?.debug('Stateful session mode disabled');
98
- }
99
91
  /**
100
92
  * Get current session mode
101
93
  */
@@ -179,7 +171,7 @@ class AbstractAbapConnection {
179
171
  if (this.sessionId) {
180
172
  requestHeaders['sap-adt-connection-id'] = this.sessionId;
181
173
  }
182
- // Add stateful session headers if stateful mode enabled via enableStatefulSession()
174
+ // Add stateful session headers if stateful mode is enabled
183
175
  if (this.sessionMode === 'stateful') {
184
176
  requestHeaders['x-sap-adt-sessiontype'] = 'stateful';
185
177
  requestHeaders['sap-adt-request-id'] = (0, node_crypto_1.randomUUID)().replace(/-/g, '');
@@ -5,7 +5,9 @@ import { AbstractAbapConnection } from './AbstractAbapConnection.js';
5
5
  * Basic Authentication connection for on-premise SAP systems
6
6
  */
7
7
  export declare class BaseAbapConnection extends AbstractAbapConnection {
8
- constructor(config: SapConfig, logger?: ILogger | null, sessionId?: string);
8
+ constructor(config: SapConfig, logger?: ILogger | null, sessionId?: string, options?: {
9
+ skipSessionType?: boolean;
10
+ });
9
11
  /**
10
12
  * Connect to SAP system with Basic Auth
11
13
  * Fetches CSRF token which also establishes session cookies
@@ -1 +1 @@
1
- {"version":3,"file":"BaseAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/BaseAbapConnection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,sBAAsB;gBAChD,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM;IAK1E;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC9B,SAAS,CAAC,wBAAwB,IAAI,MAAM;IAU5C,OAAO,CAAC,MAAM,CAAC,cAAc;CAmB9B"}
1
+ {"version":3,"file":"BaseAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/BaseAbapConnection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,sBAAsB;gBAE1D,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,EACvB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAMzC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC9B,SAAS,CAAC,wBAAwB,IAAI,MAAM;IAU5C,OAAO,CAAC,MAAM,CAAC,cAAc;CAmB9B"}
@@ -7,9 +7,9 @@ const AbstractAbapConnection_js_1 = require("./AbstractAbapConnection.js");
7
7
  * Basic Authentication connection for on-premise SAP systems
8
8
  */
9
9
  class BaseAbapConnection extends AbstractAbapConnection_js_1.AbstractAbapConnection {
10
- constructor(config, logger, sessionId) {
10
+ constructor(config, logger, sessionId, options) {
11
11
  BaseAbapConnection.validateConfig(config);
12
- super(config, logger || null, sessionId);
12
+ super(config, logger || null, sessionId, options);
13
13
  }
14
14
  /**
15
15
  * Connect to SAP system with Basic Auth
@@ -6,7 +6,9 @@ import { AbstractAbapConnection } from './AbstractAbapConnection.js';
6
6
  */
7
7
  export declare class SamlAbapConnection extends AbstractAbapConnection {
8
8
  private sessionCookies;
9
- constructor(config: SapConfig, logger?: ILogger | null, sessionId?: string);
9
+ constructor(config: SapConfig, logger?: ILogger | null, sessionId?: string, options?: {
10
+ skipSessionType?: boolean;
11
+ });
10
12
  /**
11
13
  * Connect to SAP system using existing session cookies
12
14
  * Fetches CSRF token to establish session context
@@ -1 +1 @@
1
- {"version":3,"file":"SamlAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/SamlAbapConnection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,OAAO,CAAC,cAAc,CAAS;gBAEnB,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,SAAS,CAAC,EAAE,MAAM;IAS1E;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC9B,SAAS,CAAC,wBAAwB,IAAI,MAAM;IAItC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAQvD,OAAO,CAAC,MAAM,CAAC,cAAc;CAW9B"}
1
+ {"version":3,"file":"SamlAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/SamlAbapConnection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,sBAAsB;IAC5D,OAAO,CAAC,cAAc,CAAS;gBAG7B,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,EACvB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,OAAO,CAAA;KAAE;IAUzC;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC9B,SAAS,CAAC,wBAAwB,IAAI,MAAM;IAItC,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAQvD,OAAO,CAAC,MAAM,CAAC,cAAc;CAW9B"}
@@ -8,9 +8,9 @@ const AbstractAbapConnection_js_1 = require("./AbstractAbapConnection.js");
8
8
  */
9
9
  class SamlAbapConnection extends AbstractAbapConnection_js_1.AbstractAbapConnection {
10
10
  sessionCookies;
11
- constructor(config, logger, sessionId) {
11
+ constructor(config, logger, sessionId, options) {
12
12
  SamlAbapConnection.validateConfig(config);
13
- super(config, logger || null, sessionId);
13
+ super(config, logger || null, sessionId, options);
14
14
  this.sessionCookies = config.sessionCookies || '';
15
15
  if (this.sessionCookies) {
16
16
  this.setInitialCookies(this.sessionCookies);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/connection",
3
- "version": "1.1.1",
3
+ "version": "1.3.0",
4
4
  "description": "ABAP connection layer for MCP ABAP ADT server",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",