@@ -8,146 +8,51 @@ import {
88 NotFoundError ,
99 RateLimitError
1010} from './exceptions' ;
11+ import { LicenseChainHttpCore } from './http-core' ;
1112
1213export class ApiClient {
13- private config : Configuration ;
14- private baseUrl : string ;
14+ private readonly core : LicenseChainHttpCore ;
1515
1616 constructor ( config : Configuration ) {
17- this . config = config ;
18- this . baseUrl = config . getBaseUrl ( ) . replace ( / \/ $ / , '' ) ;
17+ this . core = new LicenseChainHttpCore ( {
18+ apiKey : config . getApiKey ( ) ,
19+ baseUrl : config . getBaseUrl ( ) ,
20+ deserialize : jsonDeserialize ,
21+ exceptions : {
22+ authentication : ( message ) => new AuthenticationError ( message ) ,
23+ network : ( message ) => new NetworkError ( message ) ,
24+ notFound : ( message ) => new NotFoundError ( message ) ,
25+ rateLimit : ( message ) => new RateLimitError ( message ) ,
26+ server : ( message ) => new ServerError ( message ) ,
27+ validation : ( message ) => new ValidationError ( message ) ,
28+ } ,
29+ platform : 'javascript-sdk' ,
30+ retries : config . getRetries ( ) ,
31+ retryWithBackoff,
32+ serialize : jsonSerialize ,
33+ timeout : config . getTimeout ( ) ,
34+ userAgent : 'LicenseChain-JavaScript-SDK/1.0.0' ,
35+ } ) ;
1936 }
2037
2138 async get < T = any > ( endpoint : string , params ?: Record < string , any > ) : Promise < T > {
22- return this . makeRequest < T > ( 'GET' , endpoint , undefined , params ) ;
39+ return this . core . get < T > ( endpoint , params ) ;
2340 }
2441
2542 async post < T = any > ( endpoint : string , data ?: any ) : Promise < T > {
26- return this . makeRequest < T > ( 'POST' , endpoint , data ) ;
43+ return this . core . post < T > ( endpoint , data ) ;
2744 }
2845
2946 async put < T = any > ( endpoint : string , data ?: any ) : Promise < T > {
30- return this . makeRequest < T > ( 'PUT' , endpoint , data ) ;
47+ return this . core . put < T > ( endpoint , data ) ;
3148 }
3249
3350 async patch < T = any > ( endpoint : string , data ?: any ) : Promise < T > {
34- return this . makeRequest < T > ( 'PATCH' , endpoint , data ) ;
51+ return this . core . patch < T > ( endpoint , data ) ;
3552 }
3653
3754 async delete < T = any > ( endpoint : string , data ?: any ) : Promise < T > {
38- return this . makeRequest < T > ( 'DELETE' , endpoint , data ) ;
39- }
40-
41- private async makeRequest < T > (
42- method : string ,
43- endpoint : string ,
44- data ?: any ,
45- params ?: Record < string , any >
46- ) : Promise < T > {
47- const url = this . buildUrl ( endpoint , params ) ;
48- const requestOptions = this . buildRequestOptions ( method , data ) ;
49-
50- return retryWithBackoff ( async ( ) => {
51- return this . sendRequest < T > ( url , requestOptions ) ;
52- } , this . config . getRetries ( ) ) ;
53- }
54-
55- private buildUrl ( endpoint : string , params ?: Record < string , any > ) : string {
56- // Ensure endpoint starts with /v1 prefix
57- const normalizedEndpoint = endpoint . startsWith ( '/v1/' )
58- ? endpoint
59- : endpoint . startsWith ( '/' )
60- ? `/v1${ endpoint } `
61- : `/v1/${ endpoint } ` ;
62-
63- let url = `${ this . baseUrl } ${ normalizedEndpoint } ` ;
64-
65- if ( params && Object . keys ( params ) . length > 0 ) {
66- const searchParams = new URLSearchParams ( ) ;
67- for ( const [ key , value ] of Object . entries ( params ) ) {
68- if ( value !== undefined && value !== null ) {
69- searchParams . append ( key , String ( value ) ) ;
70- }
71- }
72- url += `?${ searchParams . toString ( ) } ` ;
73- }
74-
75- return url ;
76- }
77-
78- private buildRequestOptions ( method : string , data ?: any ) : RequestInit {
79- const options : RequestInit = {
80- method,
81- headers : {
82- 'Authorization' : `Bearer ${ this . config . getApiKey ( ) } ` ,
83- 'Content-Type' : 'application/json' ,
84- 'X-API-Version' : '1.0' ,
85- 'X-Platform' : 'javascript-sdk' ,
86- 'User-Agent' : 'LicenseChain-JavaScript-SDK/1.0.0'
87- }
88- } ;
89-
90- if ( data ) {
91- options . body = jsonSerialize ( data ) ;
92- }
93-
94- return options ;
95- }
96-
97- private async sendRequest < T > ( url : string , options : RequestInit ) : Promise < T > {
98- try {
99- const response = await fetch ( url , {
100- ...options ,
101- signal : AbortSignal . timeout ( this . config . getTimeout ( ) )
102- } ) ;
103-
104- if ( response . ok ) {
105- const text = await response . text ( ) ;
106- return text ? jsonDeserialize ( text ) : { } as T ;
107- }
108-
109- const errorText = await response . text ( ) ;
110- let errorMessage = 'Unknown error' ;
111-
112- try {
113- const errorData = jsonDeserialize ( errorText ) ;
114- errorMessage = errorData . error || errorData . message || errorMessage ;
115- } catch {
116- errorMessage = errorText || errorMessage ;
117- }
118-
119- this . handleHttpError ( response . status , errorMessage ) ;
120- } catch ( error ) {
121- if ( error instanceof Error ) {
122- if ( error . name === 'AbortError' ) {
123- throw new NetworkError ( 'Request timeout' ) ;
124- }
125- throw new NetworkError ( error . message ) ;
126- }
127- throw error ;
128- }
129- }
130-
131- private handleHttpError ( statusCode : number , message : string ) : never {
132- switch ( statusCode ) {
133- case 400 :
134- throw new ValidationError ( `Bad Request: ${ message } ` ) ;
135- case 401 :
136- throw new AuthenticationError ( `Unauthorized: ${ message } ` ) ;
137- case 403 :
138- throw new AuthenticationError ( `Forbidden: ${ message } ` ) ;
139- case 404 :
140- throw new NotFoundError ( `Not Found: ${ message } ` ) ;
141- case 429 :
142- throw new RateLimitError ( `Rate Limited: ${ message } ` ) ;
143- case 500 :
144- case 502 :
145- case 503 :
146- case 504 :
147- throw new ServerError ( `Server Error: ${ message } ` ) ;
148- default :
149- throw new ServerError ( `Unexpected response: ${ statusCode } ${ message } ` ) ;
150- }
55+ return this . core . delete < T > ( endpoint , data ) ;
15156 }
15257
15358 async ping ( ) : Promise < any > {
0 commit comments