@abapify/adt-client 0.4.1 → 0.4.3
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/README.md +2 -0
- package/dist/index.d.mts +120 -9
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +702 -118
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -4
package/README.md
CHANGED
|
@@ -89,6 +89,8 @@ createAdtClient(config: AdtConnectionConfig): AdtClient
|
|
|
89
89
|
- `password` - SAP password
|
|
90
90
|
- `client` - SAP client (optional, e.g., `'100'`)
|
|
91
91
|
- `language` - SAP language (optional, e.g., `'EN'`)
|
|
92
|
+
- `headersTimeoutMs` - response-header timeout for long-running SAP requests
|
|
93
|
+
(optional; otherwise the native HTTP client default applies)
|
|
92
94
|
|
|
93
95
|
### Class Operations
|
|
94
96
|
|
package/dist/index.d.mts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { exception } from "@abapify/adt-schemas";
|
|
2
2
|
import { AdtClientType, AdtContract, ClassResponse, CrudContract, CrudContractBase, CrudQueryParams, DataElementResponse, DomainResponse, FunctionGroupResponse, FunctionModuleResponse, HttpAdapter, HttpAdapter as HttpAdapter$1, IncludeResponse, IncludesContractSkeleton, InterfaceResponse, LockOptions, ObjectStructureOptions, Package as PackageResponse, ProgramResponse, RestContract, RestEndpointDescriptor, Serializable, SourceOperations, SourcesContract, StructureResponse, TableResponse, TableTypeResponse, TransportResponse as TransportGetResponse, UnlockOptions, adtContract } from "@abapify/adt-contracts";
|
|
3
3
|
import { Logger, Logger as Logger$1 } from "@abapify/logger";
|
|
4
|
-
|
|
5
4
|
//#region src/errors.d.ts
|
|
6
5
|
/**
|
|
7
6
|
* Parsed ADT exception structure - derived from ExceptionSchema
|
|
@@ -72,6 +71,8 @@ interface AdtConnectionConfig {
|
|
|
72
71
|
client?: string;
|
|
73
72
|
language?: string;
|
|
74
73
|
logger?: Logger$1;
|
|
74
|
+
/** Override Undici's response-header timeout for long-running SAP requests. */
|
|
75
|
+
headersTimeoutMs?: number;
|
|
75
76
|
}
|
|
76
77
|
interface LockHandle {
|
|
77
78
|
lockHandle: string;
|
|
@@ -132,6 +133,21 @@ interface AdtAdapterConfig extends AdtConnectionConfig {
|
|
|
132
133
|
*/
|
|
133
134
|
onSessionExpired?: () => Promise<string>;
|
|
134
135
|
}
|
|
136
|
+
/** Options for an authenticated GET that returns plain text. */
|
|
137
|
+
interface BoundedTextRequestOptions {
|
|
138
|
+
url: string;
|
|
139
|
+
headers?: Record<string, string>;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* A response exceeded an explicit byte cap before its body was retained.
|
|
143
|
+
* Deliberately carries size metadata only, never response text.
|
|
144
|
+
*/
|
|
145
|
+
declare class AdtResponseTooLargeError extends Error {
|
|
146
|
+
readonly maxBytes: number;
|
|
147
|
+
readonly receivedBytes?: number | undefined;
|
|
148
|
+
readonly code: "ADT_RESPONSE_TOO_LARGE";
|
|
149
|
+
constructor(maxBytes: number, receivedBytes?: number | undefined);
|
|
150
|
+
}
|
|
135
151
|
/**
|
|
136
152
|
* Create ADT HTTP adapter with Basic or SAML Authentication and plugin support
|
|
137
153
|
*/
|
|
@@ -139,6 +155,8 @@ interface AdtAdapterConfig extends AdtConnectionConfig {
|
|
|
139
155
|
interface AdtHttpAdapter extends HttpAdapter$1 {
|
|
140
156
|
/** Clear cached ETag for a specific URL, or all ETags if no URL given */
|
|
141
157
|
clearETag(url?: string): void;
|
|
158
|
+
/** Read an authenticated plain-text response without exceeding maxBytes. */
|
|
159
|
+
readTextBounded(options: BoundedTextRequestOptions, maxBytes: number): Promise<string>;
|
|
142
160
|
}
|
|
143
161
|
declare function createAdtAdapter(config: AdtAdapterConfig): AdtHttpAdapter;
|
|
144
162
|
//#endregion
|
|
@@ -153,12 +171,18 @@ interface Transport {
|
|
|
153
171
|
status?: string;
|
|
154
172
|
type?: string;
|
|
155
173
|
target?: string;
|
|
174
|
+
parent?: string;
|
|
175
|
+
lastChangedTimestamp?: string;
|
|
156
176
|
tasks?: TransportTask[];
|
|
157
177
|
}
|
|
158
178
|
interface TransportTask {
|
|
159
179
|
number: string;
|
|
180
|
+
desc?: string;
|
|
160
181
|
owner?: string;
|
|
161
182
|
status?: string;
|
|
183
|
+
type?: string;
|
|
184
|
+
parent?: string;
|
|
185
|
+
lastChangedTimestamp?: string;
|
|
162
186
|
}
|
|
163
187
|
/**
|
|
164
188
|
* Options for creating a transport
|
|
@@ -210,6 +234,11 @@ declare class TransportService {
|
|
|
210
234
|
* This is a placeholder for the full implementation.
|
|
211
235
|
*/
|
|
212
236
|
release(_trkorr: string): Promise<void>;
|
|
237
|
+
/**
|
|
238
|
+
* Find a request/task unit whose number matches the wanted transport id.
|
|
239
|
+
* Handles both single-object and array shapes from ts-xsd.
|
|
240
|
+
*/
|
|
241
|
+
private findUnit;
|
|
213
242
|
/**
|
|
214
243
|
* Extract requests array from various response formats
|
|
215
244
|
*/
|
|
@@ -257,6 +286,48 @@ declare class UserService {
|
|
|
257
286
|
}
|
|
258
287
|
declare function createUserService(adt: AdtClientType): UserService;
|
|
259
288
|
//#endregion
|
|
289
|
+
//#region src/services/source-history.d.ts
|
|
290
|
+
type SourceHistoryProtocolErrorCode = 'SOURCE_HISTORY_URI_UNSAFE' | 'SOURCE_VERSION_FEED_INVALID' | 'SOURCE_VERSION_ID_MISSING' | 'SOURCE_VERSION_CONTENT_LINK_MISSING';
|
|
291
|
+
declare class SourceHistoryProtocolError extends Error {
|
|
292
|
+
readonly code: SourceHistoryProtocolErrorCode;
|
|
293
|
+
readonly ordinal?: number | undefined;
|
|
294
|
+
constructor(code: SourceHistoryProtocolErrorCode, message: string, ordinal?: number | undefined);
|
|
295
|
+
}
|
|
296
|
+
interface SourceVersionRef {
|
|
297
|
+
id: string;
|
|
298
|
+
ordinal: number;
|
|
299
|
+
title?: string;
|
|
300
|
+
sourceUri: string;
|
|
301
|
+
contentType?: string;
|
|
302
|
+
etag?: string;
|
|
303
|
+
updatedAt?: string;
|
|
304
|
+
author?: string;
|
|
305
|
+
transports: string[];
|
|
306
|
+
}
|
|
307
|
+
type SourceVersionReference = SourceVersionRef;
|
|
308
|
+
type BoundedSourceReader = (sourceUri: string, maxBytes: number) => Promise<string>;
|
|
309
|
+
/**
|
|
310
|
+
* An immutable source body crossed its configured byte limit.
|
|
311
|
+
* This error intentionally does not retain the source URI or any source text.
|
|
312
|
+
*/
|
|
313
|
+
declare class SourceVersionTooLargeError extends Error {
|
|
314
|
+
readonly maxBytes: number;
|
|
315
|
+
readonly receivedBytes?: number | undefined;
|
|
316
|
+
readonly code: "SOURCE_VERSION_TOO_LARGE";
|
|
317
|
+
constructor(maxBytes: number, receivedBytes?: number | undefined);
|
|
318
|
+
}
|
|
319
|
+
declare function assertAdtUri(uri: string): string;
|
|
320
|
+
declare function normalizeSourceVersionFeed(payload: unknown, versionsUri: string): SourceVersionRef[];
|
|
321
|
+
declare class SourceHistoryService {
|
|
322
|
+
private readonly adt;
|
|
323
|
+
private readonly boundedSourceReader?;
|
|
324
|
+
constructor(adt: AdtClientType, boundedSourceReader?: BoundedSourceReader | undefined);
|
|
325
|
+
listVersions(versionsUri: string): Promise<SourceVersionRef[]>;
|
|
326
|
+
readVersionSource(sourceUri: string): Promise<string>;
|
|
327
|
+
readVersionSourceBounded(sourceUri: string, maxBytes: number): Promise<string>;
|
|
328
|
+
}
|
|
329
|
+
declare function createSourceHistoryService(adt: AdtClientType, boundedSourceReader?: BoundedSourceReader): SourceHistoryService;
|
|
330
|
+
//#endregion
|
|
260
331
|
//#region src/client.d.ts
|
|
261
332
|
/**
|
|
262
333
|
* Fetch options for generic HTTP requests
|
|
@@ -266,22 +337,36 @@ interface FetchOptions {
|
|
|
266
337
|
headers?: Record<string, string>;
|
|
267
338
|
body?: string;
|
|
268
339
|
}
|
|
340
|
+
/** Options for a bounded authenticated GET that returns plain text. */
|
|
341
|
+
interface BoundedTextFetchOptions {
|
|
342
|
+
headers?: Record<string, string>;
|
|
343
|
+
}
|
|
269
344
|
/**
|
|
270
345
|
* Services layer - business logic orchestration
|
|
271
346
|
*/
|
|
272
347
|
interface AdtServices {
|
|
273
348
|
transports: TransportService;
|
|
349
|
+
sourceHistory: SourceHistoryService;
|
|
274
350
|
}
|
|
275
351
|
interface AdtClientReturn {
|
|
276
352
|
adt: AdtClientType;
|
|
277
353
|
services: AdtServices;
|
|
278
354
|
fetch: (url: string, options?: FetchOptions) => Promise<unknown>;
|
|
355
|
+
readTextBounded: (url: string, maxBytes: number, options?: BoundedTextFetchOptions) => Promise<string>;
|
|
279
356
|
/** Clear cached ETag for a specific URL, or all ETags if no URL given */
|
|
280
357
|
clearETag: (url?: string) => void;
|
|
281
358
|
}
|
|
282
359
|
declare function createAdtClient(config: AdtAdapterConfig): AdtClientReturn;
|
|
283
360
|
type AdtClient = ReturnType<typeof createAdtClient>;
|
|
284
361
|
//#endregion
|
|
362
|
+
//#region src/cancellation.d.ts
|
|
363
|
+
/**
|
|
364
|
+
* Runs an ADT operation with an execution-scoped abort signal. Async local
|
|
365
|
+
* storage keeps concurrent clients and invocations isolated without mutating
|
|
366
|
+
* shared client state.
|
|
367
|
+
*/
|
|
368
|
+
declare function runWithAdtAbortSignal<T>(signal: AbortSignal, operation: () => Promise<T>): Promise<T>;
|
|
369
|
+
//#endregion
|
|
285
370
|
//#region src/plugins/logging.d.ts
|
|
286
371
|
type LogFunction = (message: string, data?: any) => void;
|
|
287
372
|
/**
|
|
@@ -321,6 +406,13 @@ declare class FileLoggingPlugin implements ResponsePlugin {
|
|
|
321
406
|
}
|
|
322
407
|
//#endregion
|
|
323
408
|
//#region src/utils/session.d.ts
|
|
409
|
+
/**
|
|
410
|
+
* Fetch function injected into SessionManager so the adapter can route
|
|
411
|
+
* CSRF handshake requests through the same Undici dispatcher (and
|
|
412
|
+
* headersTimeout) used for the final adapter request. Defaults to the
|
|
413
|
+
* global fetch when no dispatcher is configured.
|
|
414
|
+
*/
|
|
415
|
+
type SessionFetchFn = (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
324
416
|
/**
|
|
325
417
|
* Cookie Store - Manages HTTP cookies for stateful sessions
|
|
326
418
|
*/
|
|
@@ -396,11 +488,13 @@ declare class CsrfTokenManager {
|
|
|
396
488
|
*/
|
|
397
489
|
declare class SessionManager {
|
|
398
490
|
private readonly logger?;
|
|
491
|
+
private readonly fetchFn;
|
|
492
|
+
private static readonly SESSION_PATH_PREFIX;
|
|
399
493
|
private readonly cookieStore;
|
|
400
494
|
private readonly csrfManager;
|
|
401
495
|
private readonly etagManager;
|
|
402
496
|
private securitySessionActive;
|
|
403
|
-
constructor(logger?: Logger$1 | undefined);
|
|
497
|
+
constructor(logger?: Logger$1 | undefined, fetchFn?: SessionFetchFn);
|
|
404
498
|
/**
|
|
405
499
|
* Process response to update session state
|
|
406
500
|
* Extracts cookies, CSRF tokens, and ETags
|
|
@@ -422,6 +516,13 @@ declare class SessionManager {
|
|
|
422
516
|
* Clear cached ETag for a URL
|
|
423
517
|
*/
|
|
424
518
|
clearETag(url?: string): void;
|
|
519
|
+
/**
|
|
520
|
+
* Reject session paths that could send cleanup requests off-target.
|
|
521
|
+
* Only relative paths under the ADT sessions endpoint (or same-origin
|
|
522
|
+
* absolute URLs with that path) are accepted.
|
|
523
|
+
*/
|
|
524
|
+
private isTrustedSessionPath;
|
|
525
|
+
private extractTrustedSessionPath;
|
|
425
526
|
/**
|
|
426
527
|
* Initialize CSRF token using the Eclipse ADT security session flow:
|
|
427
528
|
*
|
|
@@ -432,13 +533,23 @@ declare class SessionManager {
|
|
|
432
533
|
* The CSRF token survives the session deletion and remains valid for
|
|
433
534
|
* all subsequent lock/unlock operations. Deleting the session frees
|
|
434
535
|
* the slot — SAP allows only one security session per user.
|
|
435
|
-
*
|
|
436
|
-
* @param baseUrl - SAP system base URL
|
|
437
|
-
* @param authHeader - Authorization header (Basic/Bearer), or undefined for cookie auth
|
|
438
|
-
* @param client - SAP client number
|
|
439
|
-
* @param language - SAP language
|
|
440
536
|
*/
|
|
441
|
-
|
|
537
|
+
private resolveInitializeCsrfArgs;
|
|
538
|
+
initializeCsrf(baseUrl: string, authHeader?: string, client?: string, language?: string, signal?: AbortSignal): Promise<boolean>;
|
|
539
|
+
initializeCsrf(baseUrl: string, options?: {
|
|
540
|
+
authHeader?: string;
|
|
541
|
+
client?: string;
|
|
542
|
+
language?: string;
|
|
543
|
+
signal?: AbortSignal;
|
|
544
|
+
}): Promise<boolean>;
|
|
545
|
+
private buildSessionsUrl;
|
|
546
|
+
private buildSessionHeaders;
|
|
547
|
+
private createSecuritySession;
|
|
548
|
+
private acquireCsrfToken;
|
|
549
|
+
private deleteSecuritySession;
|
|
550
|
+
private fetchSecuritySessionCsrfToken;
|
|
551
|
+
private deleteSecuritySessionWithFallback;
|
|
552
|
+
private handleCsrfInitializationError;
|
|
442
553
|
/**
|
|
443
554
|
* Clear all session state (cookies and CSRF)
|
|
444
555
|
*/
|
|
@@ -463,5 +574,5 @@ declare class SessionManager {
|
|
|
463
574
|
injectCookie(cookieString: string): void;
|
|
464
575
|
}
|
|
465
576
|
//#endregion
|
|
466
|
-
export { type AdtAdapterConfig, type AdtClient, type AdtConnectionConfig, type AdtContract, type AdtError, type ClassResponse, CookieStore, type CreateTransportOptions, type CrudContract, type CrudContractBase, type CrudQueryParams, CsrfTokenManager, type CurrentUserInfo, type DataElementResponse, type DomainResponse, type FileLoggingConfig, FileLoggingPlugin, type FunctionGroupResponse, type FunctionModuleResponse, type HttpAdapter, type IncludeResponse, type IncludesContractSkeleton, type InterfaceResponse, type ListTransportsOptions, type LockHandle, type LockOptions, type LogFunction, type Logger, LoggingPlugin, type ObjectStructureOptions, type OperationResult, type PackageResponse, type ProgramResponse, type ResponseContext, type ResponsePlugin, type RestContract, type RestEndpointDescriptor, type Serializable, SessionManager, type SourceOperations, type SourcesContract, type StructureResponse, type TableResponse, type TableTypeResponse, type Transport, type TransportGetResponse, TransportService, type TransportTask, type UnlockOptions, type UserInfo, UserService, adtContract, createAdtAdapter, createAdtClient, createTransportService, createUserService };
|
|
577
|
+
export { type AdtAdapterConfig, type AdtClient, type AdtConnectionConfig, type AdtContract, type AdtError, type AdtHttpAdapter, AdtResponseTooLargeError, type BoundedSourceReader, type BoundedTextFetchOptions, type BoundedTextRequestOptions, type ClassResponse, CookieStore, type CreateTransportOptions, type CrudContract, type CrudContractBase, type CrudQueryParams, CsrfTokenManager, type CurrentUserInfo, type DataElementResponse, type DomainResponse, type FileLoggingConfig, FileLoggingPlugin, type FunctionGroupResponse, type FunctionModuleResponse, type HttpAdapter, type IncludeResponse, type IncludesContractSkeleton, type InterfaceResponse, type ListTransportsOptions, type LockHandle, type LockOptions, type LogFunction, type Logger, LoggingPlugin, type ObjectStructureOptions, type OperationResult, type PackageResponse, type ProgramResponse, type ResponseContext, type ResponsePlugin, type RestContract, type RestEndpointDescriptor, type Serializable, SessionManager, SourceHistoryProtocolError, type SourceHistoryProtocolErrorCode, SourceHistoryService, type SourceOperations, type SourceVersionRef, type SourceVersionReference, SourceVersionTooLargeError, type SourcesContract, type StructureResponse, type TableResponse, type TableTypeResponse, type Transport, type TransportGetResponse, TransportService, type TransportTask, type UnlockOptions, type UserInfo, UserService, adtContract, assertAdtUri, createAdtAdapter, createAdtClient, createSourceHistoryService, createTransportService, createUserService, normalizeSourceVersionFeed, runWithAdtAbortSignal };
|
|
467
578
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/plugins/types.ts","../src/adapter.ts","../src/services/transports.ts","../src/services/users.ts","../src/client.ts","../src/plugins/logging.ts","../src/plugins/file-logging.ts","../src/utils/session.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/plugins/types.ts","../src/adapter.ts","../src/services/transports.ts","../src/services/users.ts","../src/services/source-history.ts","../src/client.ts","../src/cancellation.ts","../src/plugins/logging.ts","../src/plugins/file-logging.ts","../src/utils/session.ts"],"mappings":"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"}
|