@mcp-abap-adt/connection 0.1.5 → 0.1.7

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.
@@ -13,6 +13,8 @@ export interface AbapConnection {
13
13
  getConfig(): SapConfig;
14
14
  getBaseUrl(): Promise<string>;
15
15
  getAuthHeaders(): Promise<Record<string, string>>;
16
+ getSessionId(): string | null;
17
+ setSessionType(type: "stateful" | "stateless"): void;
16
18
  makeAdtRequest(options: AbapRequestOptions): Promise<AxiosResponse>;
17
19
  connect(): Promise<void>;
18
20
  reset(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"AbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbapConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,IAAI,SAAS,CAAC;IACvB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACpE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,eAAe,IAAI,YAAY,GAAG,IAAI,CAAC;IACvC,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5C"}
1
+ {"version":3,"file":"AbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbapConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,IAAI,SAAS,CAAC;IACvB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAC9B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,YAAY,IAAI,MAAM,GAAG,IAAI,CAAC;IAC9B,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAAC;IACrD,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACpE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;IACd,eAAe,IAAI,YAAY,GAAG,IAAI,CAAC;IACvC,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAAC;CAC5C"}
@@ -15,14 +15,23 @@ declare abstract class AbstractAbapConnection implements AbapConnection {
15
15
  private sessionMode;
16
16
  protected constructor(config: SapConfig, logger: ILogger, sessionStorage?: ISessionStorage, sessionId?: string);
17
17
  /**
18
- * Enable stateful session mode with storage
19
- * @param sessionId - Unique session identifier
20
- * @param storage - Storage implementation for persisting session state
18
+ * Set session type (stateful or stateless)
19
+ * Controls whether x-sap-adt-sessiontype: stateful header is added to requests
20
+ * - stateful: SAP maintains session state between requests (locks, transactions)
21
+ * - stateless: Each request is independent
21
22
  */
22
- enableStatefulSession(sessionId: string, storage: ISessionStorage): Promise<void>;
23
+ setSessionType(type: "stateful" | "stateless"): void;
24
+ /**
25
+ * Enable stateful session mode (tells SAP to maintain stateful session)
26
+ * This controls whether x-sap-adt-sessiontype: stateful header is used
27
+ * Storage is controlled separately via setSessionStorage()
28
+ * @deprecated Use setSessionType("stateful") instead
29
+ */
30
+ enableStatefulSession(): void;
23
31
  /**
24
32
  * Disable stateful session mode (switch to stateless)
25
33
  * Optionally saves current state before switching
34
+ * @deprecated Use setSessionType("stateless") instead
26
35
  */
27
36
  disableStatefulSession(saveBeforeDisable?: boolean): Promise<void>;
28
37
  /**
@@ -41,8 +50,9 @@ declare abstract class AbstractAbapConnection implements AbapConnection {
41
50
  getSessionId(): string | null;
42
51
  /**
43
52
  * Set session storage (can be changed at runtime)
53
+ * This controls whether session state (cookies, CSRF token) is persisted to disk/storage
44
54
  */
45
- setSessionStorage(storage: ISessionStorage | null): void;
55
+ setSessionStorage(storage: ISessionStorage | null): Promise<void>;
46
56
  /**
47
57
  * Get current session storage
48
58
  */
@@ -1 +1 @@
1
- {"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiD,aAAa,EAAE,MAAM,OAAO,CAAC;AAG5F,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEtE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,uBAAe,sBAAuB,YAAW,cAAc;IAW3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO;IAXpC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,cAAc,CAAgC;IACtD,OAAO,CAAC,WAAW,CAAyC;IAE5D,SAAS,aACU,MAAM,EAAE,SAAS,EACf,MAAM,EAAE,OAAO,EAClC,cAAc,CAAC,EAAE,eAAe,EAChC,SAAS,CAAC,EAAE,MAAM;IAWpB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;IAQpD;;;;;OAKG;IACH,qBAAqB,IAAI,IAAI;IAI7B;;;;OAIG;IACG,sBAAsB,CAAC,iBAAiB,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/E;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,UAAU;IAI1C;;;;OAIG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IASrC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B;;;OAGG;IACG,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE;;OAEG;IACH,iBAAiB,IAAI,eAAe,GAAG,IAAI;IAI3C;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBvC;;;OAGG;IACG,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAyBvC;;;;OAIG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAYtC;;;;OAIG;IACH,eAAe,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI;IAY1C;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAkBxC,SAAS,IAAI,SAAS;IAItB,KAAK,IAAI,IAAI;IAYP,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAkB7B,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,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IAoNzE,SAAS,CAAC,QAAQ,CAAC,wBAAwB,IAAI,MAAM;IAErD;;;OAGG;cACa,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,SAAI,EAAE,UAAU,SAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAgL/F;;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,OAAO,CAAC,yBAAyB;IAuDjC,OAAO,CAAC,gBAAgB;IAqBxB,OAAO,CAAC,mBAAmB;YAOb,oBAAoB;IAwBlC,OAAO,CAAC,eAAe;CAyBxB;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
@@ -53,30 +53,38 @@ class AbstractAbapConnection {
53
53
  this.config = config;
54
54
  this.logger = logger;
55
55
  this.sessionStorage = sessionStorage || null;
56
- // Generate sessionId if not provided (like Eclipse ADT does on connect)
56
+ // Always generate sessionId (used for sap-adt-connection-id header in all session types)
57
57
  this.sessionId = sessionId || (0, crypto_1.randomUUID)();
58
- this.sessionMode = this.sessionId && sessionStorage ? "stateful" : "stateless";
59
- this.logger.debug(`AbstractAbapConnection - Session ID: ${this.sessionId.substring(0, 8)}...`);
58
+ // Session mode depends only on storage availability (sessionId exists for both modes)
59
+ this.sessionMode = sessionStorage ? "stateful" : "stateless";
60
+ this.logger.debug(`AbstractAbapConnection - Session ID: ${this.sessionId.substring(0, 8)}..., mode: ${this.sessionMode}`);
60
61
  }
61
62
  /**
62
- * Enable stateful session mode with storage
63
- * @param sessionId - Unique session identifier
64
- * @param storage - Storage implementation for persisting session state
63
+ * Set session type (stateful or stateless)
64
+ * Controls whether x-sap-adt-sessiontype: stateful header is added to requests
65
+ * - stateful: SAP maintains session state between requests (locks, transactions)
66
+ * - stateless: Each request is independent
65
67
  */
66
- async enableStatefulSession(sessionId, storage) {
67
- this.sessionId = sessionId;
68
- this.sessionStorage = storage;
69
- this.sessionMode = "stateful";
70
- // Try to load existing session state
71
- await this.loadSessionState();
72
- this.logger.debug("Stateful session enabled", {
73
- sessionId,
74
- hasExistingState: !!this.csrfToken || !!this.cookies
68
+ setSessionType(type) {
69
+ this.sessionMode = type;
70
+ this.logger.debug(`Session type set to: ${type}`, {
71
+ sessionId: this.sessionId?.substring(0, 8),
72
+ hasStorage: !!this.sessionStorage
75
73
  });
76
74
  }
75
+ /**
76
+ * Enable stateful session mode (tells SAP to maintain stateful session)
77
+ * This controls whether x-sap-adt-sessiontype: stateful header is used
78
+ * Storage is controlled separately via setSessionStorage()
79
+ * @deprecated Use setSessionType("stateful") instead
80
+ */
81
+ enableStatefulSession() {
82
+ this.setSessionType("stateful");
83
+ }
77
84
  /**
78
85
  * Disable stateful session mode (switch to stateless)
79
86
  * Optionally saves current state before switching
87
+ * @deprecated Use setSessionType("stateless") instead
80
88
  */
81
89
  async disableStatefulSession(saveBeforeDisable = false) {
82
90
  if (this.sessionMode === "stateless") {
@@ -86,9 +94,7 @@ class AbstractAbapConnection {
86
94
  await this.saveSessionState();
87
95
  }
88
96
  this.sessionMode = "stateless";
89
- this.sessionId = null;
90
- this.sessionStorage = null;
91
- this.logger.debug("Stateful session disabled", {
97
+ this.logger.debug("Stateful session mode disabled", {
92
98
  savedBeforeDisable: saveBeforeDisable
93
99
  });
94
100
  }
@@ -120,15 +126,18 @@ class AbstractAbapConnection {
120
126
  }
121
127
  /**
122
128
  * Set session storage (can be changed at runtime)
129
+ * This controls whether session state (cookies, CSRF token) is persisted to disk/storage
123
130
  */
124
- setSessionStorage(storage) {
131
+ async setSessionStorage(storage) {
125
132
  this.sessionStorage = storage;
133
+ // Load existing session state if storage is provided
126
134
  if (storage && this.sessionId) {
127
- this.sessionMode = "stateful";
128
- }
129
- else if (!storage) {
130
- this.sessionMode = "stateless";
135
+ await this.loadSessionState();
131
136
  }
137
+ this.logger.debug("Session storage configured", {
138
+ hasStorage: !!storage,
139
+ sessionMode: this.sessionMode
140
+ });
132
141
  }
133
142
  /**
134
143
  * Get current session storage
@@ -308,6 +317,16 @@ class AbstractAbapConnection {
308
317
  if (customHeaders) {
309
318
  Object.assign(requestHeaders, customHeaders);
310
319
  }
320
+ // ALWAYS add sap-adt-connection-id header (connectionId is sent for ALL session types)
321
+ if (this.sessionId) {
322
+ requestHeaders["sap-adt-connection-id"] = this.sessionId;
323
+ }
324
+ // Add stateful session headers if stateful mode enabled via enableStatefulSession()
325
+ if (this.sessionMode === "stateful") {
326
+ requestHeaders["x-sap-adt-sessiontype"] = "stateful";
327
+ requestHeaders["sap-adt-request-id"] = (0, crypto_1.randomUUID)().replace(/-/g, '');
328
+ requestHeaders["X-sap-adt-profiling"] = "server-time";
329
+ }
311
330
  // Add auth headers (these MUST NOT be overridden)
312
331
  Object.assign(requestHeaders, await this.getAuthHeaders());
313
332
  if ((normalizedMethod === "POST" || normalizedMethod === "PUT" || normalizedMethod === "DELETE") && this.csrfToken) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/connection",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "ABAP connection layer for MCP ABAP ADT server",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",