@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.
- package/dist/connection/AbapConnection.d.ts +2 -0
- package/dist/connection/AbapConnection.d.ts.map +1 -1
- package/dist/connection/AbstractAbapConnection.d.ts +15 -5
- package/dist/connection/AbstractAbapConnection.d.ts.map +1 -1
- package/dist/connection/AbstractAbapConnection.js +42 -23
- package/package.json +1 -1
|
@@ -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
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
-
|
|
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":"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;
|
|
1
|
+
{"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,30 +53,38 @@ class AbstractAbapConnection {
|
|
|
53
53
|
this.config = config;
|
|
54
54
|
this.logger = logger;
|
|
55
55
|
this.sessionStorage = sessionStorage || null;
|
|
56
|
-
//
|
|
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
|
-
|
|
59
|
-
this.
|
|
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
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
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
|
-
|
|
67
|
-
this.
|
|
68
|
-
this.
|
|
69
|
-
|
|
70
|
-
|
|
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.
|
|
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.
|
|
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) {
|