@mcp-abap-adt/connection 9.2.2 → 9.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.
- package/CHANGELOG.md +23 -1
- package/README.md +4 -4
- package/dist/connection/AbapConnection.d.ts +1 -1
- package/dist/connection/AbapConnection.d.ts.map +1 -1
- package/dist/connection/AbstractAbapConnection.d.ts +1 -1
- package/dist/connection/AbstractAbapConnection.d.ts.map +1 -1
- package/dist/connection/AbstractAbapConnection.js +9 -9
- package/dist/connection/CredentialAbapConnection.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/session/SessionLifecycle.d.ts +1 -1
- package/dist/session/SessionLifecycle.d.ts.map +1 -1
- package/dist/session/SessionLifecycle.js +2 -2
- package/dist/utils/timeouts.d.ts +1 -1
- package/dist/utils/timeouts.d.ts.map +1 -1
- package/docs/INSTALLATION.md +1 -1
- package/docs/SCOPE.md +1 -1
- package/docs/STATEFUL_SESSION_GUIDE.md +1 -1
- package/docs/USAGE.md +3 -3
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [9.3.0] - 2026-09-26
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
|
|
14
|
+
- **The connection contract comes from `@mcp-abap-adt/interfaces-adt-connection`
|
|
15
|
+
`^1.0.0`, and `@mcp-abap-adt/interfaces-adt` is no longer a dependency.** Every
|
|
16
|
+
name this package takes from the contract — `IAbapConnection`,
|
|
17
|
+
`IAbapRequestOptions`, `IAdtWireResponse`, `ISessionLifecycleAware`,
|
|
18
|
+
`ICriticalSection`, `IRequestProfiling`, `ITimeoutConfig`, `ADT_SESSION_ERROR`
|
|
19
|
+
— moved there unchanged in `interfaces-adt` 11.0.0. The object contracts that
|
|
20
|
+
stayed behind released three majors in one day, and each one used to reach
|
|
21
|
+
this package as a range to raise or a second copy of the contract in the tree;
|
|
22
|
+
none of them touched a name this package uses. (One import, `IAdtResponse`,
|
|
23
|
+
was never used and is gone.)
|
|
24
|
+
|
|
25
|
+
**What a consumer does:** import the connection types from
|
|
26
|
+
`@mcp-abap-adt/interfaces-adt-connection` instead of
|
|
27
|
+
`@mcp-abap-adt/interfaces-adt`. The names and shapes are the same, so code that
|
|
28
|
+
still imports them from `interfaces-adt` 10 keeps compiling against this
|
|
29
|
+
release; it just carries that package for nothing.
|
|
30
|
+
|
|
10
31
|
## [9.2.2] - 2026-09-26
|
|
11
32
|
|
|
12
33
|
### Changed
|
|
@@ -1762,7 +1783,8 @@ const connection = createAbapConnection(config, logger);
|
|
|
1762
1783
|
- JWT token refresh now properly handles connection errors (401/403 during initial connect)
|
|
1763
1784
|
- Permission errors (403 with "ExceptionResourceNoAccess") no longer trigger JWT refresh loops
|
|
1764
1785
|
- Proper separation: base class handles HTTP/session, concrete classes handle auth-specific errors
|
|
1765
|
-
[Unreleased]: https://github.com/fr0ster/mcp-abap-connection/compare/v9.
|
|
1786
|
+
[Unreleased]: https://github.com/fr0ster/mcp-abap-connection/compare/v9.3.0...HEAD
|
|
1787
|
+
[9.3.0]: https://github.com/fr0ster/mcp-abap-connection/compare/v9.2.2...v9.3.0
|
|
1766
1788
|
[9.2.2]: https://github.com/fr0ster/mcp-abap-connection/compare/v9.2.1...v9.2.2
|
|
1767
1789
|
[9.2.1]: https://github.com/fr0ster/mcp-abap-connection/compare/v9.2.0...v9.2.1
|
|
1768
1790
|
[9.2.0]: https://github.com/fr0ster/mcp-abap-connection/compare/v9.1.0...v9.2.0
|
package/README.md
CHANGED
|
@@ -136,7 +136,7 @@ dependencies of this one besides `axios`, `commander` and `open`:
|
|
|
136
136
|
|
|
137
137
|
| Package | What this package takes from it |
|
|
138
138
|
|---|---|
|
|
139
|
-
| `@mcp-abap-adt/interfaces-adt` | `IAbapConnection`, `IAbapRequestOptions`, `
|
|
139
|
+
| `@mcp-abap-adt/interfaces-adt-connection` | `IAbapConnection`, `IAbapRequestOptions`, `IAdtWireResponse`, `ITimeoutConfig`, the capability atoms, `ADT_SESSION_ERROR` |
|
|
140
140
|
| `@mcp-abap-adt/interfaces-auth` | `IAuthProvider`, `IRenewableCredential`, `ICertificateMaterial`, `ITokenRefresher`, `ITokenRefreshResult` |
|
|
141
141
|
| `@mcp-abap-adt/interfaces-auth-sap` | `ISapConfig`, `SapAuthType`, `SapConnectionType`, `ICertificateMaterialLoader` |
|
|
142
142
|
| `@mcp-abap-adt/interfaces-network` | `NETWORK_ERROR_CODES`, the WebSocket contracts |
|
|
@@ -180,7 +180,7 @@ config you build — install the package it lives in as well, because this one n
|
|
|
180
180
|
longer brings them along:
|
|
181
181
|
|
|
182
182
|
```bash
|
|
183
|
-
npm install @mcp-abap-adt/interfaces-adt @mcp-abap-adt/interfaces-auth @mcp-abap-adt/interfaces-auth-sap
|
|
183
|
+
npm install @mcp-abap-adt/interfaces-adt-connection @mcp-abap-adt/interfaces-auth @mcp-abap-adt/interfaces-auth-sap
|
|
184
184
|
```
|
|
185
185
|
|
|
186
186
|
For detailed installation instructions, see [Installation Guide](./docs/INSTALLATION.md).
|
|
@@ -607,7 +607,7 @@ interface AbapConnection {
|
|
|
607
607
|
```
|
|
608
608
|
|
|
609
609
|
The connectors carry the rest of the session lifecycle. It is on the shared
|
|
610
|
-
contract as a **capability atom** in `@mcp-abap-adt/interfaces-adt` rather than as
|
|
610
|
+
contract as a **capability atom** in `@mcp-abap-adt/interfaces-adt-connection` rather than as
|
|
611
611
|
methods on `IAbapConnection`, so a consumer that only carries requests is
|
|
612
612
|
unaffected by its existence. Note that a connection over RFC has the whole of it
|
|
613
613
|
— what an RFC conversation has none of is a session RESOURCE to open and close
|
|
@@ -620,7 +620,7 @@ isConnected(): boolean;
|
|
|
620
620
|
getSessionIdentity(): string | null; // WHICH SAP session; null is not "disconnected"
|
|
621
621
|
```
|
|
622
622
|
|
|
623
|
-
Import those names from `@mcp-abap-adt/interfaces-adt`, not from this package: a
|
|
623
|
+
Import those names from `@mcp-abap-adt/interfaces-adt-connection`, not from this package: a
|
|
624
624
|
contract type re-exported under a second name is a contract type that can drift.
|
|
625
625
|
|
|
626
626
|
**The connection does not track locks.** Deciding when to disconnect, and
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IAbapConnection, IAbapRequestOptions } from '@mcp-abap-adt/interfaces-adt';
|
|
1
|
+
import type { IAbapConnection, IAbapRequestOptions } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
2
2
|
export type AbapRequestOptions = IAbapRequestOptions;
|
|
3
3
|
export type AbapConnection = IAbapConnection;
|
|
4
4
|
//# sourceMappingURL=AbapConnection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbapConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,
|
|
1
|
+
{"version":3,"file":"AbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbapConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACpB,MAAM,yCAAyC,CAAC;AAGjD,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACrD,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IAdtWireResponse, ICriticalSection, IRequestProfiling, ISessionLifecycleAware } from '@mcp-abap-adt/interfaces-adt';
|
|
1
|
+
import type { IAdtWireResponse, ICriticalSection, IRequestProfiling, ISessionLifecycleAware } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
2
2
|
import type { SapConfig } from '../config/sapConfig.js';
|
|
3
3
|
import type { ILogger } from '../logger.js';
|
|
4
4
|
import { SessionLifecycle } from '../session/SessionLifecycle.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,
|
|
1
|
+
{"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AbstractAbapConnection = void 0;
|
|
4
4
|
const node_crypto_1 = require("node:crypto");
|
|
5
|
-
const
|
|
5
|
+
const interfaces_adt_connection_1 = require("@mcp-abap-adt/interfaces-adt-connection");
|
|
6
6
|
const SessionLifecycle_js_1 = require("../session/SessionLifecycle.js");
|
|
7
7
|
const networkErrors_js_1 = require("../utils/networkErrors.js");
|
|
8
8
|
const timeouts_js_1 = require("../utils/timeouts.js");
|
|
@@ -481,7 +481,7 @@ class AbstractAbapConnection {
|
|
|
481
481
|
}
|
|
482
482
|
async establishAndCommit(baselineEpoch) {
|
|
483
483
|
if (this.lifecycle.teardownEpoch !== baselineEpoch) {
|
|
484
|
-
throw (0, SessionLifecycle_js_1.sessionError)(
|
|
484
|
+
throw (0, SessionLifecycle_js_1.sessionError)(interfaces_adt_connection_1.ADT_SESSION_ERROR.NOT_CONNECTED, 'Establishment abandoned: a teardown was requested for this connection');
|
|
485
485
|
}
|
|
486
486
|
// Whatever session arrives from here is one we are deliberately
|
|
487
487
|
// establishing, so it must not read as a replacement: the identity policy
|
|
@@ -556,7 +556,7 @@ class AbstractAbapConnection {
|
|
|
556
556
|
// the CSRF token and the axios instance out from under a request that is
|
|
557
557
|
// still in flight — breaking the guarantee this whole change rests on,
|
|
558
558
|
// from inside the guard meant to protect it.
|
|
559
|
-
throw (0, SessionLifecycle_js_1.sessionError)(
|
|
559
|
+
throw (0, SessionLifecycle_js_1.sessionError)(interfaces_adt_connection_1.ADT_SESSION_ERROR.NOT_CONNECTED, 'Establishment abandoned: a teardown was requested while it was in flight');
|
|
560
560
|
}
|
|
561
561
|
// The session IS the SAP_SESSIONID the server issued; our own session id is
|
|
562
562
|
// a conversation label we generate and says nothing about what exists on
|
|
@@ -607,7 +607,7 @@ class AbstractAbapConnection {
|
|
|
607
607
|
this.invalidateSession();
|
|
608
608
|
this.lifecycle.forgetIdentity();
|
|
609
609
|
this.lifecycle.markDisconnected();
|
|
610
|
-
throw (0, SessionLifecycle_js_1.sessionError)(
|
|
610
|
+
throw (0, SessionLifecycle_js_1.sessionError)(interfaces_adt_connection_1.ADT_SESSION_ERROR.NOT_CONNECTED, `The server authenticated the request but opened no ABAP session: the ${this.transport.kind} wire reports it is on none, so there is nothing for a lock to be bound to. The wire itself is fine — the request was carried and answered — which is why this is not a transport failure and does not look like one. ` +
|
|
611
611
|
'Stateless reads would still work over it, but a lock, and any write under that lock, is dead the moment it is issued. ' +
|
|
612
612
|
'The usual cause is the system declining to open another session for this user: they are limited per user, shared with every other tool logged on as them, and released either by disconnecting or by their own idle timeout. ' +
|
|
613
613
|
'Whether to wait, retry, or release sessions this user still holds is yours to decide — this library does not retry on your behalf.');
|
|
@@ -670,9 +670,9 @@ class AbstractAbapConnection {
|
|
|
670
670
|
*/
|
|
671
671
|
isSessionVerdict(error) {
|
|
672
672
|
const code = error?.code;
|
|
673
|
-
return (code ===
|
|
674
|
-
code ===
|
|
675
|
-
code ===
|
|
673
|
+
return (code === interfaces_adt_connection_1.ADT_SESSION_ERROR.SESSION_REPLACED ||
|
|
674
|
+
code === interfaces_adt_connection_1.ADT_SESSION_ERROR.NOT_CONNECTED ||
|
|
675
|
+
code === interfaces_adt_connection_1.ADT_SESSION_ERROR.RELEASE_PENDING);
|
|
676
676
|
}
|
|
677
677
|
/**
|
|
678
678
|
* Folds a response into the session state AND acts on what it means, in one
|
|
@@ -723,7 +723,7 @@ class AbstractAbapConnection {
|
|
|
723
723
|
if (classification !== 'replaced')
|
|
724
724
|
return;
|
|
725
725
|
this.raiseSessionLost('the session cookie changed under us');
|
|
726
|
-
throw (0, SessionLifecycle_js_1.sessionError)(
|
|
726
|
+
throw (0, SessionLifecycle_js_1.sessionError)(interfaces_adt_connection_1.ADT_SESSION_ERROR.SESSION_REPLACED, 'The SAP session this connection was using is gone and the requests are now on a different one; anything held against the old session — a lock and any write under it — is dead. ' +
|
|
727
727
|
'The server does not swap sessions on a whim: the usual causes are the session idling out (the timeout is idle-based, so a quiet connection loses it while a busy one does not) or a request landing on a different application server. ' +
|
|
728
728
|
'What to do about it is yours: re-establish and redo the work, or fail the operation. Nothing is retried here.');
|
|
729
729
|
}
|
|
@@ -970,7 +970,7 @@ class AbstractAbapConnection {
|
|
|
970
970
|
this.raiseSessionLost('the server reports the session no longer exists');
|
|
971
971
|
// No internal retry: a blind retry here is what produced further locks
|
|
972
972
|
// in the field. The caller decides.
|
|
973
|
-
throw (0, SessionLifecycle_js_1.sessionError)(
|
|
973
|
+
throw (0, SessionLifecycle_js_1.sessionError)(interfaces_adt_connection_1.ADT_SESSION_ERROR.SESSION_REPLACED, 'The SAP session no longer exists; any lock handle from it is dead');
|
|
974
974
|
}
|
|
975
975
|
// Check if this is a network error (connection refused, timeout, DNS, etc.)
|
|
976
976
|
// Don't retry for network errors - these indicate infrastructure/VPN issues
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CredentialAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/CredentialAbapConnection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"CredentialAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/CredentialAbapConnection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,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;AACrE,OAAO,EAAE,KAAK,aAAa,EAAa,MAAM,oBAAoB,CAAC;AASnE,8BAAsB,wBAAwB,CAC5C,WAAW,SAAS,aAAa,GAAG,aAAa,CACjD,SAAQ,sBAAsB;IAG5B,6EAA6E;IAC7E,QAAQ,CAAC,UAAU,EAAE,WAAW;gBAFhC,MAAM,EAAE,SAAS;IACjB,6EAA6E;IACpE,UAAU,EAAE,WAAW,EAChC,SAAS,EAAE,aAAa,EACxB,MAAM,GAAE,OAAO,GAAG,IAAW,EAC7B,SAAS,CAAC,EAAE,MAAM;IAKpB;;;;;;;OAOG;IACH,gEAAgE;cAEvC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3D;;;;;OAKG;IACH,SAAS,CAAC,wBAAwB,IAAI,MAAM;IAI5C;;;;;;OAMG;IACY,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;cAiB7C,oBAAoB,IAAI,YAAY;cAIvC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;CAoDlD"}
|
package/dist/index.js
CHANGED
|
@@ -24,7 +24,7 @@ Object.defineProperty(exports, "AdtOnPremConnector", { enumerable: true, get: fu
|
|
|
24
24
|
var CloudHttpTransport_js_1 = require("./connection/CloudHttpTransport.js");
|
|
25
25
|
Object.defineProperty(exports, "CloudHttpTransport", { enumerable: true, get: function () { return CloudHttpTransport_js_1.CloudHttpTransport; } });
|
|
26
26
|
// The session lifecycle vocabulary — ISessionLifecycleAware, ADT_SESSION_ERROR —
|
|
27
|
-
// is deliberately NOT exported here. It lives in @mcp-abap-adt/interfaces-adt, and a
|
|
27
|
+
// is deliberately NOT exported here. It lives in @mcp-abap-adt/interfaces-adt-connection, and a
|
|
28
28
|
// consumer imports it from there: re-exporting a contract type gives it two
|
|
29
29
|
// names and lets the two drift.
|
|
30
30
|
// Connection classes - only final implementations
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
* anything held against the old one;
|
|
26
26
|
* an unchanged one says nothing about whether the server still has it.
|
|
27
27
|
*/
|
|
28
|
-
import type { AdtSessionErrorCode } from '@mcp-abap-adt/interfaces-adt';
|
|
28
|
+
import type { AdtSessionErrorCode } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
29
29
|
export type TransitionKind = 'connect' | 'disconnect' | 'recover' | 'cleanup';
|
|
30
30
|
export interface RequestLease {
|
|
31
31
|
/** Teardown epoch at admission — the baseline a recovery compares against. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionLifecycle.d.ts","sourceRoot":"","sources":["../../src/session/SessionLifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"SessionLifecycle.d.ts","sourceRoot":"","sources":["../../src/session/SessionLifecycle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yCAAyC,CAAC;AAGnF,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,SAAS,CAAC;AAE9E,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,0FAA0F;IAC1F,MAAM,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC9B,iFAAiF;IACjF,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,mBAAmB,EACzB,OAAO,CAAC,EAAE,MAAM,GACf,KAAK,GAAG;IAAE,IAAI,EAAE,mBAAmB,CAAA;CAAE,CAMvC;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAgD;IAC7D,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,UAAU,CAAK;IAEvB,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAK;IAErB,OAAO,CAAC,IAAI,CAAuC;IACnD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,WAAW,CAAiC;IAIpD,4EAA4E;IAC5E,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED,0EAA0E;IAC1E,IAAI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAM5B;IAED,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED;;;;;;;;;;;;;OAaG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAE9B;IAED;;;;;OAKG;IACH,aAAa,CAAC,WAAW,GAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAa,GAAG,IAAI;IAOzE;;;;;;OAMG;IACH,cAAc,IAAI,IAAI;IAItB,gBAAgB,IAAI,IAAI;IAKxB;;;;;;OAMG;IACH,OAAO,CACL,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACvC,WAAW,GAAG,aAAa,GAAG,UAAU;IAiB3C,YAAY,IAAI,IAAI;IAMpB,4EAA4E;IAC5E,YAAY,IAAI,YAAY;IAiB5B,2FAA2F;IAC3F,IAAI,gBAAgB,IAAI,MAAM,CAE7B;IAED;;;;;;;OAOG;IACH,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,GAAG,OAAO;IAM3D,aAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,oBAAoB,GAAG,IAAI;IAelE,IAAI,iBAAiB,IAAI,OAAO,CAE/B;IAID;;;;;;;;;OASG;IACH,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAuBvE"}
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
30
|
exports.SessionLifecycle = void 0;
|
|
31
31
|
exports.sessionError = sessionError;
|
|
32
|
-
const
|
|
32
|
+
const interfaces_adt_connection_1 = require("@mcp-abap-adt/interfaces-adt-connection");
|
|
33
33
|
function sessionError(code, message) {
|
|
34
34
|
const error = new Error(message ?? code);
|
|
35
35
|
error.code = code;
|
|
@@ -130,7 +130,7 @@ class SessionLifecycle {
|
|
|
130
130
|
// ------------------------------------------------------------ admission ---
|
|
131
131
|
assertUsable() {
|
|
132
132
|
if (this.state !== 'connected' || this.teardownPending) {
|
|
133
|
-
throw sessionError(
|
|
133
|
+
throw sessionError(interfaces_adt_connection_1.ADT_SESSION_ERROR.NOT_CONNECTED);
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
/** Asserts usability and counts the request in, in one synchronous step. */
|
package/dist/utils/timeouts.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ITimeoutConfig } from '@mcp-abap-adt/interfaces-adt';
|
|
1
|
+
import type { ITimeoutConfig } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
2
2
|
export type TimeoutConfig = ITimeoutConfig;
|
|
3
3
|
export declare function getTimeoutConfig(): ITimeoutConfig;
|
|
4
4
|
export declare function getTimeout(type?: 'default' | 'csrf' | 'long' | number): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeouts.d.ts","sourceRoot":"","sources":["../../src/utils/timeouts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"timeouts.d.ts","sourceRoot":"","sources":["../../src/utils/timeouts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAG9E,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC;AAE3C,wBAAgB,gBAAgB,IAAI,cAAc,CAajD;AAED,wBAAgB,UAAU,CACxB,IAAI,GAAE,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,MAAkB,GACrD,MAAM,CAOR;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAElD"}
|
package/docs/INSTALLATION.md
CHANGED
|
@@ -205,7 +205,7 @@ anything your own signatures name has to be installed. Install the ones you
|
|
|
205
205
|
actually use:
|
|
206
206
|
|
|
207
207
|
```bash
|
|
208
|
-
npm install @mcp-abap-adt/interfaces-adt
|
|
208
|
+
npm install @mcp-abap-adt/interfaces-adt-connection # IAbapConnection, ITimeoutConfig, ADT_SESSION_ERROR
|
|
209
209
|
npm install @mcp-abap-adt/interfaces-auth # IAuthProvider, IRenewableCredential, ITokenRefresher
|
|
210
210
|
npm install @mcp-abap-adt/interfaces-auth-sap # ISapConfig, SapAuthType, ICertificateMaterialLoader
|
|
211
211
|
npm install @mcp-abap-adt/interfaces-network # NETWORK_ERROR_CODES, the WebSocket contracts
|
package/docs/SCOPE.md
CHANGED
|
@@ -41,4 +41,4 @@ It forwards every `(name, value)` pair from the JS `Client(params)` object to `R
|
|
|
41
41
|
|
|
42
42
|
- [`INSTALLATION.md`](./INSTALLATION.md)
|
|
43
43
|
- [`USAGE.md`](./USAGE.md)
|
|
44
|
-
- Sibling packages: `@mcp-abap-adt/interfaces-adt`, `@mcp-abap-adt/interfaces-auth`, `@mcp-abap-adt/interfaces-auth-sap`, `@mcp-abap-adt/interfaces-network`, `@mcp-abap-adt/interfaces-utils`, `@mcp-abap-adt/sap-rfc-lite`, `@mcp-abap-adt/auth-broker`
|
|
44
|
+
- Sibling packages: `@mcp-abap-adt/interfaces-adt-connection`, `@mcp-abap-adt/interfaces-auth`, `@mcp-abap-adt/interfaces-auth-sap`, `@mcp-abap-adt/interfaces-network`, `@mcp-abap-adt/interfaces-utils`, `@mcp-abap-adt/sap-rfc-lite`, `@mcp-abap-adt/auth-broker`
|
|
@@ -206,7 +206,7 @@ lock is still very much held. That — not any teardown — is why
|
|
|
206
206
|
duration of a `lock → modify → unlock` chain.
|
|
207
207
|
|
|
208
208
|
Since 8.0.0 you reach it through the contract rather than the class: it is
|
|
209
|
-
`ICriticalSection` in `@mcp-abap-adt/interfaces-adt`, which this connection declares.
|
|
209
|
+
`ICriticalSection` in `@mcp-abap-adt/interfaces-adt-connection`, which this connection declares.
|
|
210
210
|
What it promises is narrow and worth stating exactly — inside a section the
|
|
211
211
|
*ordinary* per-request deadline does not apply. Not that no request can be cut
|
|
212
212
|
short: the ceiling is `SAP_TIMEOUT_CRITICAL`, ten minutes by default, and a
|
package/docs/USAGE.md
CHANGED
|
@@ -292,7 +292,7 @@ implied. Four things follow from it.
|
|
|
292
292
|
|
|
293
293
|
> **Availability.** `connect()` is on the shared `IAbapConnection` contract and
|
|
294
294
|
> works on every connection. The rest of this section is on the contract too, but
|
|
295
|
-
> as a **capability atom** in `@mcp-abap-adt/interfaces-adt` rather than as methods on
|
|
295
|
+
> as a **capability atom** in `@mcp-abap-adt/interfaces-adt-connection` rather than as methods on
|
|
296
296
|
> `IAbapConnection`: `ISessionLifecycleAware` — `disconnect()`, `isConnected()`,
|
|
297
297
|
> `getSessionIdentity()`.
|
|
298
298
|
>
|
|
@@ -397,10 +397,10 @@ establishment rather than opening a session each.
|
|
|
397
397
|
|
|
398
398
|
Match on the code rather than the message, so a rename is a compile error on your
|
|
399
399
|
side instead of a condition that silently stops matching. The codes live in
|
|
400
|
-
`@mcp-abap-adt/interfaces-adt` — import them from there, not from this package:
|
|
400
|
+
`@mcp-abap-adt/interfaces-adt-connection` — import them from there, not from this package:
|
|
401
401
|
|
|
402
402
|
```typescript
|
|
403
|
-
import { ADT_SESSION_ERROR } from '@mcp-abap-adt/interfaces-adt';
|
|
403
|
+
import { ADT_SESSION_ERROR } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
404
404
|
import { getTimeout } from '@mcp-abap-adt/connection';
|
|
405
405
|
|
|
406
406
|
const options = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mcp-abap-adt/connection",
|
|
3
|
-
"version": "9.
|
|
3
|
+
"version": "9.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",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"node": ">=18.0.0"
|
|
54
54
|
},
|
|
55
55
|
"dependencies": {
|
|
56
|
-
"@mcp-abap-adt/interfaces-adt": "^
|
|
56
|
+
"@mcp-abap-adt/interfaces-adt-connection": "^1.0.0",
|
|
57
57
|
"@mcp-abap-adt/interfaces-auth": "^2.0.1",
|
|
58
58
|
"@mcp-abap-adt/interfaces-auth-sap": "^1.0.1",
|
|
59
59
|
"@mcp-abap-adt/interfaces-network": "^2.0.0",
|