@sdkwork/sdk-common 1.0.0 → 1.0.2
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 +3 -4
- package/dist/auth/token-manager.cjs +8 -16
- package/dist/auth/token-manager.cjs.map +1 -1
- package/dist/auth/token-manager.js +8 -16
- package/dist/auth/token-manager.js.map +1 -1
- package/dist/errors.cjs +15 -18
- package/dist/errors.cjs.map +1 -1
- package/dist/errors.js +15 -18
- package/dist/errors.js.map +1 -1
- package/dist/http/base-client.cjs +23 -33
- package/dist/http/base-client.cjs.map +1 -1
- package/dist/http/base-client.js +23 -33
- package/dist/http/base-client.js.map +1 -1
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/utils/cache.cjs +3 -6
- package/dist/utils/cache.cjs.map +1 -1
- package/dist/utils/cache.js +3 -6
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/logger.cjs +5 -8
- package/dist/utils/logger.cjs.map +1 -1
- package/dist/utils/logger.js +5 -8
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/string.cjs +57 -60
- package/dist/utils/string.cjs.map +1 -1
- package/dist/utils/string.js +57 -60
- package/dist/utils/string.js.map +1 -1
- package/package.json +21 -21
|
@@ -1,7 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
6
3
|
const types = require("../core/types.cjs");
|
|
7
4
|
const errors = require("../errors.cjs");
|
|
@@ -10,16 +7,16 @@ const logger = require("../utils/logger.cjs");
|
|
|
10
7
|
const cache = require("../utils/cache.cjs");
|
|
11
8
|
const retry = require("../utils/retry.cjs");
|
|
12
9
|
class BaseHttpClient {
|
|
10
|
+
config;
|
|
11
|
+
authConfig;
|
|
12
|
+
logger;
|
|
13
|
+
cache;
|
|
14
|
+
interceptors;
|
|
15
|
+
tenantId;
|
|
16
|
+
organizationId;
|
|
17
|
+
platform;
|
|
18
|
+
userId;
|
|
13
19
|
constructor(config) {
|
|
14
|
-
__publicField(this, "config");
|
|
15
|
-
__publicField(this, "authConfig");
|
|
16
|
-
__publicField(this, "logger");
|
|
17
|
-
__publicField(this, "cache");
|
|
18
|
-
__publicField(this, "interceptors");
|
|
19
|
-
__publicField(this, "tenantId");
|
|
20
|
-
__publicField(this, "organizationId");
|
|
21
|
-
__publicField(this, "platform");
|
|
22
|
-
__publicField(this, "userId");
|
|
23
20
|
this.config = {
|
|
24
21
|
baseUrl: config.baseUrl,
|
|
25
22
|
timeout: config.timeout ?? types.DEFAULT_TIMEOUT,
|
|
@@ -81,22 +78,19 @@ class BaseHttpClient {
|
|
|
81
78
|
this.authConfig.tokenManager = manager;
|
|
82
79
|
}
|
|
83
80
|
setApiKey(apiKey) {
|
|
84
|
-
var _a;
|
|
85
81
|
this.authConfig.apiKey = apiKey;
|
|
86
82
|
this.authConfig.authMode = "apikey";
|
|
87
|
-
|
|
83
|
+
this.authConfig.tokenManager?.clearTokens();
|
|
88
84
|
}
|
|
89
85
|
setAuthToken(token) {
|
|
90
|
-
|
|
91
|
-
(_a = this.authConfig.tokenManager) == null ? void 0 : _a.setAuthToken(token);
|
|
86
|
+
this.authConfig.tokenManager?.setAuthToken(token);
|
|
92
87
|
if (this.authConfig.authMode === "apikey") {
|
|
93
88
|
this.authConfig.authMode = "dual-token";
|
|
94
89
|
this.authConfig.apiKey = void 0;
|
|
95
90
|
}
|
|
96
91
|
}
|
|
97
92
|
setAccessToken(token) {
|
|
98
|
-
|
|
99
|
-
(_a = this.authConfig.tokenManager) == null ? void 0 : _a.setAccessToken(token);
|
|
93
|
+
this.authConfig.tokenManager?.setAccessToken(token);
|
|
100
94
|
if (this.authConfig.authMode === "apikey") {
|
|
101
95
|
this.authConfig.authMode = "dual-token";
|
|
102
96
|
this.authConfig.apiKey = void 0;
|
|
@@ -115,8 +109,7 @@ class BaseHttpClient {
|
|
|
115
109
|
this.userId = userId;
|
|
116
110
|
}
|
|
117
111
|
clearAuthToken() {
|
|
118
|
-
|
|
119
|
-
(_a = this.authConfig.tokenManager) == null ? void 0 : _a.clearTokens();
|
|
112
|
+
this.authConfig.tokenManager?.clearTokens();
|
|
120
113
|
}
|
|
121
114
|
addRequestInterceptor(interceptor) {
|
|
122
115
|
this.interceptors.request.push(interceptor);
|
|
@@ -149,14 +142,13 @@ class BaseHttpClient {
|
|
|
149
142
|
this.cache.clear();
|
|
150
143
|
}
|
|
151
144
|
getConfig() {
|
|
152
|
-
var _a, _b;
|
|
153
145
|
return {
|
|
154
146
|
baseUrl: this.config.baseUrl,
|
|
155
147
|
timeout: this.config.timeout,
|
|
156
148
|
authMode: this.authConfig.authMode,
|
|
157
149
|
apiKey: this.authConfig.apiKey,
|
|
158
|
-
accessToken:
|
|
159
|
-
authToken:
|
|
150
|
+
accessToken: this.authConfig.tokenManager?.getAccessToken(),
|
|
151
|
+
authToken: this.authConfig.tokenManager?.getAuthToken(),
|
|
160
152
|
tenantId: this.tenantId,
|
|
161
153
|
organizationId: this.organizationId,
|
|
162
154
|
platform: this.platform,
|
|
@@ -164,8 +156,7 @@ class BaseHttpClient {
|
|
|
164
156
|
};
|
|
165
157
|
}
|
|
166
158
|
isAuthenticated() {
|
|
167
|
-
|
|
168
|
-
return ((_a = this.authConfig.tokenManager) == null ? void 0 : _a.isValid()) ?? false;
|
|
159
|
+
return this.authConfig.tokenManager?.isValid() ?? false;
|
|
169
160
|
}
|
|
170
161
|
buildBaseUrl(path, params) {
|
|
171
162
|
const baseUrl = this.config.baseUrl.replace(/\/$/, "");
|
|
@@ -280,14 +271,14 @@ class BaseHttpClient {
|
|
|
280
271
|
await this.handleErrorResponse(response, config);
|
|
281
272
|
}
|
|
282
273
|
const contentType = response.headers.get("content-type");
|
|
283
|
-
if (contentType
|
|
274
|
+
if (contentType?.includes(types.MIME_TYPES.JSON)) {
|
|
284
275
|
const result = await response.json();
|
|
285
276
|
if (!types.SUCCESS_CODES.includes(result.code) && !types.SUCCESS_CODES.includes(String(result.code))) {
|
|
286
277
|
throw errors.SdkError.fromApiResult(result, response.status);
|
|
287
278
|
}
|
|
288
279
|
return result.data;
|
|
289
280
|
}
|
|
290
|
-
if (contentType
|
|
281
|
+
if (contentType?.includes("text/")) {
|
|
291
282
|
return await response.text();
|
|
292
283
|
}
|
|
293
284
|
return await response.json();
|
|
@@ -396,13 +387,12 @@ class BaseHttpClient {
|
|
|
396
387
|
return response.blob();
|
|
397
388
|
}
|
|
398
389
|
async *stream(path, options) {
|
|
399
|
-
var _a;
|
|
400
390
|
const config = {
|
|
401
391
|
url: path,
|
|
402
|
-
method:
|
|
403
|
-
body: options
|
|
404
|
-
headers: options
|
|
405
|
-
skipAuth: options
|
|
392
|
+
method: options?.method ?? "POST",
|
|
393
|
+
body: options?.body,
|
|
394
|
+
headers: options?.headers,
|
|
395
|
+
skipAuth: options?.skipAuth
|
|
406
396
|
};
|
|
407
397
|
const processedConfig = await this.applyRequestInterceptors(config);
|
|
408
398
|
const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);
|
|
@@ -417,7 +407,7 @@ class BaseHttpClient {
|
|
|
417
407
|
if (!response.ok) {
|
|
418
408
|
await this.handleErrorResponse(response, processedConfig);
|
|
419
409
|
}
|
|
420
|
-
const reader =
|
|
410
|
+
const reader = response.body?.getReader();
|
|
421
411
|
if (!reader) {
|
|
422
412
|
throw new errors.NetworkError("No response body");
|
|
423
413
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-client.cjs","sources":["../../src/http/base-client.ts"],"sourcesContent":["import type {\n HttpClientConfig,\n RequestConfig,\n RequestOptions,\n QueryParams,\n HttpHeaders,\n ApiResult,\n Interceptors,\n UploadOptions,\n DownloadOptions,\n} from '../core/types';\nimport { DEFAULT_TIMEOUT, SUCCESS_CODES, MIME_TYPES } from '../core/types';\nimport {\n SdkError,\n NetworkError,\n TimeoutError,\n CancelledError,\n} from '../errors';\nimport type { AuthTokenManager, AuthMode } from '../auth';\nimport { DefaultAuthTokenManager, buildAuthHeaders } from '../auth';\nimport { createLogger, type Logger } from '../utils/logger';\nimport { createCacheStore, type CacheStore } from '../utils/cache';\nimport { withRetry } from '../utils/retry';\n\nexport interface HttpClientOptions extends HttpClientConfig {\n apiKey?: string;\n accessToken?: string;\n authToken?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface HttpClientAuthConfig {\n authMode: AuthMode;\n apiKey?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface RequestExecutor {\n execute<T>(config: RequestConfig): Promise<T>;\n}\n\nexport interface ResponseProcessor {\n process<T>(response: Response, config: RequestConfig): Promise<T>;\n}\n\nexport interface UrlBuilder {\n build(path: string, params?: QueryParams): string;\n}\n\nexport interface HeaderBuilder {\n build(config: RequestConfig, skipAuth?: boolean): HttpHeaders;\n}\n\nexport abstract class BaseHttpClient implements RequestExecutor {\n protected config: Required<Omit<HttpClientConfig, 'interceptors'>> & { baseUrl: string };\n protected authConfig: HttpClientAuthConfig;\n protected logger: Logger;\n protected cache: CacheStore;\n protected interceptors: Interceptors;\n protected tenantId?: string;\n protected organizationId?: string;\n protected platform?: string;\n protected userId?: string | number;\n\n constructor(config: HttpClientOptions) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n headers: config.headers ?? {},\n retry: {\n maxRetries: 3,\n retryDelay: 1000,\n retryBackoff: 'exponential',\n maxRetryDelay: 30000,\n ...config.retry,\n },\n cache: {\n enabled: false,\n ttl: 5 * 60 * 1000,\n maxSize: 100,\n ...config.cache,\n },\n logger: {\n level: 'info',\n prefix: '[SDK]',\n timestamp: true,\n colors: true,\n ...config.logger,\n },\n };\n\n this.logger = createLogger(this.config.logger);\n this.cache = createCacheStore(this.config.cache);\n \n this.interceptors = config.interceptors ?? {\n request: [],\n response: [],\n error: [],\n };\n\n const authMode = this.determineAuthMode(config);\n this.authConfig = {\n authMode,\n apiKey: config.apiKey,\n tokenManager: config.tokenManager ?? new DefaultAuthTokenManager({\n accessToken: config.accessToken,\n authToken: config.authToken,\n }),\n };\n }\n\n protected determineAuthMode(config: HttpClientOptions): AuthMode {\n if (config.apiKey) {\n return 'apikey';\n }\n return 'dual-token';\n }\n\n getAuthMode(): AuthMode {\n return this.authConfig.authMode;\n }\n\n setAuthMode(mode: AuthMode): void {\n this.authConfig.authMode = mode;\n }\n\n getTokenManager(): AuthTokenManager | undefined {\n return this.authConfig.tokenManager;\n }\n\n setTokenManager(manager: AuthTokenManager): void {\n this.authConfig.tokenManager = manager;\n }\n\n setApiKey(apiKey: string): void {\n this.authConfig.apiKey = apiKey;\n this.authConfig.authMode = 'apikey';\n this.authConfig.tokenManager?.clearTokens();\n }\n\n setAuthToken(token: string): void {\n this.authConfig.tokenManager?.setAuthToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setAccessToken(token: string): void {\n this.authConfig.tokenManager?.setAccessToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n setOrganizationId(organizationId: string): void {\n this.organizationId = organizationId;\n }\n\n setPlatform(platform: string): void {\n this.platform = platform;\n }\n\n setUserId(userId: string | number): void {\n this.userId = userId;\n }\n\n clearAuthToken(): void {\n this.authConfig.tokenManager?.clearTokens();\n }\n\n addRequestInterceptor(interceptor: (config: RequestConfig) => RequestConfig | Promise<RequestConfig>): () => void {\n this.interceptors.request.push(interceptor);\n return () => {\n const index = this.interceptors.request.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.request.splice(index, 1);\n }\n };\n }\n\n addResponseInterceptor(interceptor: (response: unknown, config: RequestConfig) => unknown | Promise<unknown>): () => void {\n this.interceptors.response.push(interceptor);\n return () => {\n const index = this.interceptors.response.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.response.splice(index, 1);\n }\n };\n }\n\n addErrorInterceptor(interceptor: (error: Error, config: RequestConfig) => void | Promise<void>): () => void {\n this.interceptors.error.push(interceptor);\n return () => {\n const index = this.interceptors.error.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.error.splice(index, 1);\n }\n };\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n getConfig() {\n return {\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n authMode: this.authConfig.authMode,\n apiKey: this.authConfig.apiKey,\n accessToken: this.authConfig.tokenManager?.getAccessToken(),\n authToken: this.authConfig.tokenManager?.getAuthToken(),\n tenantId: this.tenantId,\n organizationId: this.organizationId,\n platform: this.platform,\n userId: this.userId,\n };\n }\n\n isAuthenticated(): boolean {\n return this.authConfig.tokenManager?.isValid() ?? false;\n }\n\n protected buildBaseUrl(path: string, params?: QueryParams): string {\n const baseUrl = this.config.baseUrl.replace(/\\/$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n let url = `${baseUrl}${normalizedPath}`;\n\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n return url;\n }\n\n protected buildHeaders(config: RequestConfig, skipAuth: boolean = false): HttpHeaders {\n const headers: HttpHeaders = {\n 'Content-Type': MIME_TYPES.JSON,\n ...this.config.headers,\n ...config.headers,\n };\n\n if (!skipAuth && !config.skipAuth) {\n const authHeaders = buildAuthHeaders(\n this.authConfig.authMode,\n this.authConfig.apiKey,\n this.authConfig.tokenManager\n );\n Object.assign(headers, authHeaders);\n }\n\n if (this.tenantId) {\n headers['X-Tenant-Id'] = this.tenantId;\n }\n\n if (this.organizationId) {\n headers['X-Organization-Id'] = this.organizationId;\n }\n\n if (this.platform) {\n headers['X-Platform'] = this.platform;\n }\n\n if (this.userId !== undefined) {\n headers['X-User-Id'] = String(this.userId);\n }\n\n return headers;\n }\n\n protected serializeRequestBody(body: unknown, headers: HttpHeaders): BodyInit | string | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';\n return body.toString();\n }\n\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof ArrayBuffer !== 'undefined') {\n if (body instanceof ArrayBuffer) {\n delete headers['Content-Type'];\n return body;\n }\n if (ArrayBuffer.isView(body)) {\n delete headers['Content-Type'];\n return body as unknown as BodyInit;\n }\n }\n\n if (typeof body === 'string') {\n headers['Content-Type'] = headers['Content-Type'] || 'text/plain;charset=UTF-8';\n return body;\n }\n\n return JSON.stringify(body);\n }\n\n protected async applyRequestInterceptors(config: RequestConfig): Promise<RequestConfig> {\n let processedConfig = config;\n for (const interceptor of this.interceptors.request) {\n processedConfig = await interceptor(processedConfig);\n }\n return processedConfig;\n }\n\n protected async applyResponseInterceptors<T>(response: T, config: RequestConfig): Promise<T> {\n let processedResponse: T = response;\n for (const interceptor of this.interceptors.response) {\n processedResponse = (await interceptor(processedResponse, config)) as T;\n }\n return processedResponse;\n }\n\n protected async applyErrorInterceptors(error: Error, config: RequestConfig): Promise<void> {\n for (const interceptor of this.interceptors.error) {\n await interceptor(error, config);\n }\n }\n\n protected async handleErrorResponse(response: Response, config: RequestConfig): Promise<never> {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const result = await response.json();\n errorMessage = result.msg || result.message || errorMessage;\n } catch {\n // Ignore JSON parse errors\n }\n\n const error = SdkError.fromHttpStatus(response.status, errorMessage);\n\n await this.applyErrorInterceptors(error, config);\n throw error;\n }\n\n protected async processResponse<T>(response: Response, config: RequestConfig): Promise<T> {\n if (!response.ok) {\n await this.handleErrorResponse(response, config);\n }\n\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes(MIME_TYPES.JSON)) {\n const result: ApiResult<T> = await response.json();\n\n if (!SUCCESS_CODES.includes(result.code) && !SUCCESS_CODES.includes(String(result.code))) {\n throw SdkError.fromApiResult(result, response.status);\n }\n\n return result.data;\n }\n\n if (contentType?.includes('text/')) {\n return (await response.text()) as unknown as T;\n }\n\n return await response.json() as T;\n }\n\n protected async executeFetch(\n url: string,\n options: {\n method: string;\n headers: HttpHeaders;\n body?: string | BodyInit | null;\n timeout: number;\n signal?: AbortSignal;\n }\n ): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, options.timeout);\n\n const abortHandler = () => controller.abort();\n\n if (options.signal) {\n if (options.signal.aborted) {\n controller.abort();\n } else {\n options.signal.addEventListener('abort', abortHandler, { once: true });\n }\n }\n\n try {\n this.logger.debug(`${options.method} ${url}`);\n\n const response = await fetch(url, {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (timedOut) {\n throw new TimeoutError(`Request timeout after ${options.timeout}ms`, options.timeout);\n }\n throw new CancelledError('Request was cancelled');\n }\n throw new NetworkError(error.message);\n }\n\n throw new NetworkError('Unknown network error');\n } finally {\n clearTimeout(timeoutId);\n if (options.signal) {\n options.signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n async execute<T>(config: RequestConfig): Promise<T> {\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n const serializedBody = this.serializeRequestBody(processedConfig.body, headers);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: serializedBody,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n abstract request<T>(path: string, options?: RequestOptions): Promise<T>;\n abstract get<T>(path: string, params?: QueryParams): Promise<T>;\n abstract post<T>(path: string, body?: unknown): Promise<T>;\n abstract put<T>(path: string, body?: unknown): Promise<T>;\n abstract delete<T>(path: string, body?: unknown): Promise<T>;\n abstract patch<T>(path: string, body?: unknown): Promise<T>;\n\n async upload<T>(path: string, options: UploadOptions): Promise<T> {\n const formData = new FormData();\n formData.append(options.fieldName ?? 'file', options.file);\n\n if (options.additionalData) {\n Object.entries(options.additionalData).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n\n const config: RequestConfig = {\n url: path,\n method: 'POST',\n body: formData,\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n delete headers['Content-Type'];\n\n const response = await this.executeFetch(url, {\n method: 'POST',\n headers,\n body: formData,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n async download(path: string, _options?: DownloadOptions): Promise<Blob> {\n const config: RequestConfig = {\n url: path,\n method: 'GET',\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: 'GET',\n headers,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n return response.blob();\n }\n\n async *stream(path: string, options?: RequestOptions): AsyncIterable<string> {\n const config: RequestConfig = {\n url: path,\n method: options?.method ?? 'POST',\n body: options?.body,\n headers: options?.headers,\n skipAuth: options?.skipAuth,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: processedConfig.body ? JSON.stringify(processedConfig.body) : undefined,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new NetworkError('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine === '' || trimmedLine === 'data: [DONE]') continue;\n if (trimmedLine.startsWith('data: ')) {\n yield trimmedLine.slice(6);\n } else {\n yield trimmedLine;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nexport function createBaseHttpClient(config: HttpClientOptions): BaseHttpClient {\n return new (class extends BaseHttpClient {\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const config: RequestConfig = {\n url: path,\n method: options.method ?? 'GET',\n headers: options.headers,\n params: options.params,\n body: options.body,\n timeout: options.timeout,\n signal: options.signal,\n skipAuth: options.skipAuth,\n };\n\n return withRetry(\n () => this.execute<T>(config),\n { ...this.config.retry, ...options.retry }\n );\n }\n\n async get<T>(path: string, params?: QueryParams): Promise<T> {\n return this.request<T>(path, { method: 'GET', params });\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PUT', body });\n }\n\n async delete<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'DELETE', body });\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body });\n }\n })(config);\n}\n"],"names":["DEFAULT_TIMEOUT","createLogger","createCacheStore","DefaultAuthTokenManager","MIME_TYPES","buildAuthHeaders","SdkError","SUCCESS_CODES","TimeoutError","CancelledError","NetworkError","config","withRetry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base-client.cjs","sources":["../../src/http/base-client.ts"],"sourcesContent":["import type {\n HttpClientConfig,\n RequestConfig,\n RequestOptions,\n QueryParams,\n HttpHeaders,\n ApiResult,\n Interceptors,\n UploadOptions,\n DownloadOptions,\n} from '../core/types';\nimport { DEFAULT_TIMEOUT, SUCCESS_CODES, MIME_TYPES } from '../core/types';\nimport {\n SdkError,\n NetworkError,\n TimeoutError,\n CancelledError,\n} from '../errors';\nimport type { AuthTokenManager, AuthMode } from '../auth';\nimport { DefaultAuthTokenManager, buildAuthHeaders } from '../auth';\nimport { createLogger, type Logger } from '../utils/logger';\nimport { createCacheStore, type CacheStore } from '../utils/cache';\nimport { withRetry } from '../utils/retry';\n\nexport interface HttpClientOptions extends HttpClientConfig {\n apiKey?: string;\n accessToken?: string;\n authToken?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface HttpClientAuthConfig {\n authMode: AuthMode;\n apiKey?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface RequestExecutor {\n execute<T>(config: RequestConfig): Promise<T>;\n}\n\nexport interface ResponseProcessor {\n process<T>(response: Response, config: RequestConfig): Promise<T>;\n}\n\nexport interface UrlBuilder {\n build(path: string, params?: QueryParams): string;\n}\n\nexport interface HeaderBuilder {\n build(config: RequestConfig, skipAuth?: boolean): HttpHeaders;\n}\n\nexport abstract class BaseHttpClient implements RequestExecutor {\n protected config: Required<Omit<HttpClientConfig, 'interceptors'>> & { baseUrl: string };\n protected authConfig: HttpClientAuthConfig;\n protected logger: Logger;\n protected cache: CacheStore;\n protected interceptors: Interceptors;\n protected tenantId?: string;\n protected organizationId?: string;\n protected platform?: string;\n protected userId?: string | number;\n\n constructor(config: HttpClientOptions) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n headers: config.headers ?? {},\n retry: {\n maxRetries: 3,\n retryDelay: 1000,\n retryBackoff: 'exponential',\n maxRetryDelay: 30000,\n ...config.retry,\n },\n cache: {\n enabled: false,\n ttl: 5 * 60 * 1000,\n maxSize: 100,\n ...config.cache,\n },\n logger: {\n level: 'info',\n prefix: '[SDK]',\n timestamp: true,\n colors: true,\n ...config.logger,\n },\n };\n\n this.logger = createLogger(this.config.logger);\n this.cache = createCacheStore(this.config.cache);\n \n this.interceptors = config.interceptors ?? {\n request: [],\n response: [],\n error: [],\n };\n\n const authMode = this.determineAuthMode(config);\n this.authConfig = {\n authMode,\n apiKey: config.apiKey,\n tokenManager: config.tokenManager ?? new DefaultAuthTokenManager({\n accessToken: config.accessToken,\n authToken: config.authToken,\n }),\n };\n }\n\n protected determineAuthMode(config: HttpClientOptions): AuthMode {\n if (config.apiKey) {\n return 'apikey';\n }\n return 'dual-token';\n }\n\n getAuthMode(): AuthMode {\n return this.authConfig.authMode;\n }\n\n setAuthMode(mode: AuthMode): void {\n this.authConfig.authMode = mode;\n }\n\n getTokenManager(): AuthTokenManager | undefined {\n return this.authConfig.tokenManager;\n }\n\n setTokenManager(manager: AuthTokenManager): void {\n this.authConfig.tokenManager = manager;\n }\n\n setApiKey(apiKey: string): void {\n this.authConfig.apiKey = apiKey;\n this.authConfig.authMode = 'apikey';\n this.authConfig.tokenManager?.clearTokens();\n }\n\n setAuthToken(token: string): void {\n this.authConfig.tokenManager?.setAuthToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setAccessToken(token: string): void {\n this.authConfig.tokenManager?.setAccessToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n setOrganizationId(organizationId: string): void {\n this.organizationId = organizationId;\n }\n\n setPlatform(platform: string): void {\n this.platform = platform;\n }\n\n setUserId(userId: string | number): void {\n this.userId = userId;\n }\n\n clearAuthToken(): void {\n this.authConfig.tokenManager?.clearTokens();\n }\n\n addRequestInterceptor(interceptor: (config: RequestConfig) => RequestConfig | Promise<RequestConfig>): () => void {\n this.interceptors.request.push(interceptor);\n return () => {\n const index = this.interceptors.request.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.request.splice(index, 1);\n }\n };\n }\n\n addResponseInterceptor(interceptor: (response: unknown, config: RequestConfig) => unknown | Promise<unknown>): () => void {\n this.interceptors.response.push(interceptor);\n return () => {\n const index = this.interceptors.response.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.response.splice(index, 1);\n }\n };\n }\n\n addErrorInterceptor(interceptor: (error: Error, config: RequestConfig) => void | Promise<void>): () => void {\n this.interceptors.error.push(interceptor);\n return () => {\n const index = this.interceptors.error.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.error.splice(index, 1);\n }\n };\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n getConfig() {\n return {\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n authMode: this.authConfig.authMode,\n apiKey: this.authConfig.apiKey,\n accessToken: this.authConfig.tokenManager?.getAccessToken(),\n authToken: this.authConfig.tokenManager?.getAuthToken(),\n tenantId: this.tenantId,\n organizationId: this.organizationId,\n platform: this.platform,\n userId: this.userId,\n };\n }\n\n isAuthenticated(): boolean {\n return this.authConfig.tokenManager?.isValid() ?? false;\n }\n\n protected buildBaseUrl(path: string, params?: QueryParams): string {\n const baseUrl = this.config.baseUrl.replace(/\\/$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n let url = `${baseUrl}${normalizedPath}`;\n\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n return url;\n }\n\n protected buildHeaders(config: RequestConfig, skipAuth: boolean = false): HttpHeaders {\n const headers: HttpHeaders = {\n 'Content-Type': MIME_TYPES.JSON,\n ...this.config.headers,\n ...config.headers,\n };\n\n if (!skipAuth && !config.skipAuth) {\n const authHeaders = buildAuthHeaders(\n this.authConfig.authMode,\n this.authConfig.apiKey,\n this.authConfig.tokenManager\n );\n Object.assign(headers, authHeaders);\n }\n\n if (this.tenantId) {\n headers['X-Tenant-Id'] = this.tenantId;\n }\n\n if (this.organizationId) {\n headers['X-Organization-Id'] = this.organizationId;\n }\n\n if (this.platform) {\n headers['X-Platform'] = this.platform;\n }\n\n if (this.userId !== undefined) {\n headers['X-User-Id'] = String(this.userId);\n }\n\n return headers;\n }\n\n protected serializeRequestBody(body: unknown, headers: HttpHeaders): BodyInit | string | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';\n return body.toString();\n }\n\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof ArrayBuffer !== 'undefined') {\n if (body instanceof ArrayBuffer) {\n delete headers['Content-Type'];\n return body;\n }\n if (ArrayBuffer.isView(body)) {\n delete headers['Content-Type'];\n return body as unknown as BodyInit;\n }\n }\n\n if (typeof body === 'string') {\n headers['Content-Type'] = headers['Content-Type'] || 'text/plain;charset=UTF-8';\n return body;\n }\n\n return JSON.stringify(body);\n }\n\n protected async applyRequestInterceptors(config: RequestConfig): Promise<RequestConfig> {\n let processedConfig = config;\n for (const interceptor of this.interceptors.request) {\n processedConfig = await interceptor(processedConfig);\n }\n return processedConfig;\n }\n\n protected async applyResponseInterceptors<T>(response: T, config: RequestConfig): Promise<T> {\n let processedResponse: T = response;\n for (const interceptor of this.interceptors.response) {\n processedResponse = (await interceptor(processedResponse, config)) as T;\n }\n return processedResponse;\n }\n\n protected async applyErrorInterceptors(error: Error, config: RequestConfig): Promise<void> {\n for (const interceptor of this.interceptors.error) {\n await interceptor(error, config);\n }\n }\n\n protected async handleErrorResponse(response: Response, config: RequestConfig): Promise<never> {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const result = await response.json();\n errorMessage = result.msg || result.message || errorMessage;\n } catch {\n // Ignore JSON parse errors\n }\n\n const error = SdkError.fromHttpStatus(response.status, errorMessage);\n\n await this.applyErrorInterceptors(error, config);\n throw error;\n }\n\n protected async processResponse<T>(response: Response, config: RequestConfig): Promise<T> {\n if (!response.ok) {\n await this.handleErrorResponse(response, config);\n }\n\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes(MIME_TYPES.JSON)) {\n const result: ApiResult<T> = await response.json();\n\n if (!SUCCESS_CODES.includes(result.code) && !SUCCESS_CODES.includes(String(result.code))) {\n throw SdkError.fromApiResult(result, response.status);\n }\n\n return result.data;\n }\n\n if (contentType?.includes('text/')) {\n return (await response.text()) as unknown as T;\n }\n\n return await response.json() as T;\n }\n\n protected async executeFetch(\n url: string,\n options: {\n method: string;\n headers: HttpHeaders;\n body?: string | BodyInit | null;\n timeout: number;\n signal?: AbortSignal;\n }\n ): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, options.timeout);\n\n const abortHandler = () => controller.abort();\n\n if (options.signal) {\n if (options.signal.aborted) {\n controller.abort();\n } else {\n options.signal.addEventListener('abort', abortHandler, { once: true });\n }\n }\n\n try {\n this.logger.debug(`${options.method} ${url}`);\n\n const response = await fetch(url, {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (timedOut) {\n throw new TimeoutError(`Request timeout after ${options.timeout}ms`, options.timeout);\n }\n throw new CancelledError('Request was cancelled');\n }\n throw new NetworkError(error.message);\n }\n\n throw new NetworkError('Unknown network error');\n } finally {\n clearTimeout(timeoutId);\n if (options.signal) {\n options.signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n async execute<T>(config: RequestConfig): Promise<T> {\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n const serializedBody = this.serializeRequestBody(processedConfig.body, headers);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: serializedBody,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n abstract request<T>(path: string, options?: RequestOptions): Promise<T>;\n abstract get<T>(path: string, params?: QueryParams): Promise<T>;\n abstract post<T>(path: string, body?: unknown): Promise<T>;\n abstract put<T>(path: string, body?: unknown): Promise<T>;\n abstract delete<T>(path: string, body?: unknown): Promise<T>;\n abstract patch<T>(path: string, body?: unknown): Promise<T>;\n\n async upload<T>(path: string, options: UploadOptions): Promise<T> {\n const formData = new FormData();\n formData.append(options.fieldName ?? 'file', options.file);\n\n if (options.additionalData) {\n Object.entries(options.additionalData).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n\n const config: RequestConfig = {\n url: path,\n method: 'POST',\n body: formData,\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n delete headers['Content-Type'];\n\n const response = await this.executeFetch(url, {\n method: 'POST',\n headers,\n body: formData,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n async download(path: string, _options?: DownloadOptions): Promise<Blob> {\n const config: RequestConfig = {\n url: path,\n method: 'GET',\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: 'GET',\n headers,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n return response.blob();\n }\n\n async *stream(path: string, options?: RequestOptions): AsyncIterable<string> {\n const config: RequestConfig = {\n url: path,\n method: options?.method ?? 'POST',\n body: options?.body,\n headers: options?.headers,\n skipAuth: options?.skipAuth,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: processedConfig.body ? JSON.stringify(processedConfig.body) : undefined,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new NetworkError('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine === '' || trimmedLine === 'data: [DONE]') continue;\n if (trimmedLine.startsWith('data: ')) {\n yield trimmedLine.slice(6);\n } else {\n yield trimmedLine;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nexport function createBaseHttpClient(config: HttpClientOptions): BaseHttpClient {\n return new (class extends BaseHttpClient {\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const config: RequestConfig = {\n url: path,\n method: options.method ?? 'GET',\n headers: options.headers,\n params: options.params,\n body: options.body,\n timeout: options.timeout,\n signal: options.signal,\n skipAuth: options.skipAuth,\n };\n\n return withRetry(\n () => this.execute<T>(config),\n { ...this.config.retry, ...options.retry }\n );\n }\n\n async get<T>(path: string, params?: QueryParams): Promise<T> {\n return this.request<T>(path, { method: 'GET', params });\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PUT', body });\n }\n\n async delete<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'DELETE', body });\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body });\n }\n })(config);\n}\n"],"names":["DEFAULT_TIMEOUT","createLogger","createCacheStore","DefaultAuthTokenManager","MIME_TYPES","buildAuthHeaders","SdkError","SUCCESS_CODES","TimeoutError","CancelledError","NetworkError","config","withRetry"],"mappings":"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"}
|
package/dist/http/base-client.js
CHANGED
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
1
|
import { DEFAULT_TIMEOUT, MIME_TYPES, SUCCESS_CODES } from "../core/types.js";
|
|
5
2
|
import { SdkError, TimeoutError, CancelledError, NetworkError } from "../errors.js";
|
|
6
3
|
import { DefaultAuthTokenManager, buildAuthHeaders } from "../auth/token-manager.js";
|
|
@@ -8,16 +5,16 @@ import { createLogger } from "../utils/logger.js";
|
|
|
8
5
|
import { createCacheStore } from "../utils/cache.js";
|
|
9
6
|
import { withRetry } from "../utils/retry.js";
|
|
10
7
|
class BaseHttpClient {
|
|
8
|
+
config;
|
|
9
|
+
authConfig;
|
|
10
|
+
logger;
|
|
11
|
+
cache;
|
|
12
|
+
interceptors;
|
|
13
|
+
tenantId;
|
|
14
|
+
organizationId;
|
|
15
|
+
platform;
|
|
16
|
+
userId;
|
|
11
17
|
constructor(config) {
|
|
12
|
-
__publicField(this, "config");
|
|
13
|
-
__publicField(this, "authConfig");
|
|
14
|
-
__publicField(this, "logger");
|
|
15
|
-
__publicField(this, "cache");
|
|
16
|
-
__publicField(this, "interceptors");
|
|
17
|
-
__publicField(this, "tenantId");
|
|
18
|
-
__publicField(this, "organizationId");
|
|
19
|
-
__publicField(this, "platform");
|
|
20
|
-
__publicField(this, "userId");
|
|
21
18
|
this.config = {
|
|
22
19
|
baseUrl: config.baseUrl,
|
|
23
20
|
timeout: config.timeout ?? DEFAULT_TIMEOUT,
|
|
@@ -79,22 +76,19 @@ class BaseHttpClient {
|
|
|
79
76
|
this.authConfig.tokenManager = manager;
|
|
80
77
|
}
|
|
81
78
|
setApiKey(apiKey) {
|
|
82
|
-
var _a;
|
|
83
79
|
this.authConfig.apiKey = apiKey;
|
|
84
80
|
this.authConfig.authMode = "apikey";
|
|
85
|
-
|
|
81
|
+
this.authConfig.tokenManager?.clearTokens();
|
|
86
82
|
}
|
|
87
83
|
setAuthToken(token) {
|
|
88
|
-
|
|
89
|
-
(_a = this.authConfig.tokenManager) == null ? void 0 : _a.setAuthToken(token);
|
|
84
|
+
this.authConfig.tokenManager?.setAuthToken(token);
|
|
90
85
|
if (this.authConfig.authMode === "apikey") {
|
|
91
86
|
this.authConfig.authMode = "dual-token";
|
|
92
87
|
this.authConfig.apiKey = void 0;
|
|
93
88
|
}
|
|
94
89
|
}
|
|
95
90
|
setAccessToken(token) {
|
|
96
|
-
|
|
97
|
-
(_a = this.authConfig.tokenManager) == null ? void 0 : _a.setAccessToken(token);
|
|
91
|
+
this.authConfig.tokenManager?.setAccessToken(token);
|
|
98
92
|
if (this.authConfig.authMode === "apikey") {
|
|
99
93
|
this.authConfig.authMode = "dual-token";
|
|
100
94
|
this.authConfig.apiKey = void 0;
|
|
@@ -113,8 +107,7 @@ class BaseHttpClient {
|
|
|
113
107
|
this.userId = userId;
|
|
114
108
|
}
|
|
115
109
|
clearAuthToken() {
|
|
116
|
-
|
|
117
|
-
(_a = this.authConfig.tokenManager) == null ? void 0 : _a.clearTokens();
|
|
110
|
+
this.authConfig.tokenManager?.clearTokens();
|
|
118
111
|
}
|
|
119
112
|
addRequestInterceptor(interceptor) {
|
|
120
113
|
this.interceptors.request.push(interceptor);
|
|
@@ -147,14 +140,13 @@ class BaseHttpClient {
|
|
|
147
140
|
this.cache.clear();
|
|
148
141
|
}
|
|
149
142
|
getConfig() {
|
|
150
|
-
var _a, _b;
|
|
151
143
|
return {
|
|
152
144
|
baseUrl: this.config.baseUrl,
|
|
153
145
|
timeout: this.config.timeout,
|
|
154
146
|
authMode: this.authConfig.authMode,
|
|
155
147
|
apiKey: this.authConfig.apiKey,
|
|
156
|
-
accessToken:
|
|
157
|
-
authToken:
|
|
148
|
+
accessToken: this.authConfig.tokenManager?.getAccessToken(),
|
|
149
|
+
authToken: this.authConfig.tokenManager?.getAuthToken(),
|
|
158
150
|
tenantId: this.tenantId,
|
|
159
151
|
organizationId: this.organizationId,
|
|
160
152
|
platform: this.platform,
|
|
@@ -162,8 +154,7 @@ class BaseHttpClient {
|
|
|
162
154
|
};
|
|
163
155
|
}
|
|
164
156
|
isAuthenticated() {
|
|
165
|
-
|
|
166
|
-
return ((_a = this.authConfig.tokenManager) == null ? void 0 : _a.isValid()) ?? false;
|
|
157
|
+
return this.authConfig.tokenManager?.isValid() ?? false;
|
|
167
158
|
}
|
|
168
159
|
buildBaseUrl(path, params) {
|
|
169
160
|
const baseUrl = this.config.baseUrl.replace(/\/$/, "");
|
|
@@ -278,14 +269,14 @@ class BaseHttpClient {
|
|
|
278
269
|
await this.handleErrorResponse(response, config);
|
|
279
270
|
}
|
|
280
271
|
const contentType = response.headers.get("content-type");
|
|
281
|
-
if (contentType
|
|
272
|
+
if (contentType?.includes(MIME_TYPES.JSON)) {
|
|
282
273
|
const result = await response.json();
|
|
283
274
|
if (!SUCCESS_CODES.includes(result.code) && !SUCCESS_CODES.includes(String(result.code))) {
|
|
284
275
|
throw SdkError.fromApiResult(result, response.status);
|
|
285
276
|
}
|
|
286
277
|
return result.data;
|
|
287
278
|
}
|
|
288
|
-
if (contentType
|
|
279
|
+
if (contentType?.includes("text/")) {
|
|
289
280
|
return await response.text();
|
|
290
281
|
}
|
|
291
282
|
return await response.json();
|
|
@@ -394,13 +385,12 @@ class BaseHttpClient {
|
|
|
394
385
|
return response.blob();
|
|
395
386
|
}
|
|
396
387
|
async *stream(path, options) {
|
|
397
|
-
var _a;
|
|
398
388
|
const config = {
|
|
399
389
|
url: path,
|
|
400
|
-
method:
|
|
401
|
-
body: options
|
|
402
|
-
headers: options
|
|
403
|
-
skipAuth: options
|
|
390
|
+
method: options?.method ?? "POST",
|
|
391
|
+
body: options?.body,
|
|
392
|
+
headers: options?.headers,
|
|
393
|
+
skipAuth: options?.skipAuth
|
|
404
394
|
};
|
|
405
395
|
const processedConfig = await this.applyRequestInterceptors(config);
|
|
406
396
|
const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);
|
|
@@ -415,7 +405,7 @@ class BaseHttpClient {
|
|
|
415
405
|
if (!response.ok) {
|
|
416
406
|
await this.handleErrorResponse(response, processedConfig);
|
|
417
407
|
}
|
|
418
|
-
const reader =
|
|
408
|
+
const reader = response.body?.getReader();
|
|
419
409
|
if (!reader) {
|
|
420
410
|
throw new NetworkError("No response body");
|
|
421
411
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-client.js","sources":["../../src/http/base-client.ts"],"sourcesContent":["import type {\n HttpClientConfig,\n RequestConfig,\n RequestOptions,\n QueryParams,\n HttpHeaders,\n ApiResult,\n Interceptors,\n UploadOptions,\n DownloadOptions,\n} from '../core/types';\nimport { DEFAULT_TIMEOUT, SUCCESS_CODES, MIME_TYPES } from '../core/types';\nimport {\n SdkError,\n NetworkError,\n TimeoutError,\n CancelledError,\n} from '../errors';\nimport type { AuthTokenManager, AuthMode } from '../auth';\nimport { DefaultAuthTokenManager, buildAuthHeaders } from '../auth';\nimport { createLogger, type Logger } from '../utils/logger';\nimport { createCacheStore, type CacheStore } from '../utils/cache';\nimport { withRetry } from '../utils/retry';\n\nexport interface HttpClientOptions extends HttpClientConfig {\n apiKey?: string;\n accessToken?: string;\n authToken?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface HttpClientAuthConfig {\n authMode: AuthMode;\n apiKey?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface RequestExecutor {\n execute<T>(config: RequestConfig): Promise<T>;\n}\n\nexport interface ResponseProcessor {\n process<T>(response: Response, config: RequestConfig): Promise<T>;\n}\n\nexport interface UrlBuilder {\n build(path: string, params?: QueryParams): string;\n}\n\nexport interface HeaderBuilder {\n build(config: RequestConfig, skipAuth?: boolean): HttpHeaders;\n}\n\nexport abstract class BaseHttpClient implements RequestExecutor {\n protected config: Required<Omit<HttpClientConfig, 'interceptors'>> & { baseUrl: string };\n protected authConfig: HttpClientAuthConfig;\n protected logger: Logger;\n protected cache: CacheStore;\n protected interceptors: Interceptors;\n protected tenantId?: string;\n protected organizationId?: string;\n protected platform?: string;\n protected userId?: string | number;\n\n constructor(config: HttpClientOptions) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n headers: config.headers ?? {},\n retry: {\n maxRetries: 3,\n retryDelay: 1000,\n retryBackoff: 'exponential',\n maxRetryDelay: 30000,\n ...config.retry,\n },\n cache: {\n enabled: false,\n ttl: 5 * 60 * 1000,\n maxSize: 100,\n ...config.cache,\n },\n logger: {\n level: 'info',\n prefix: '[SDK]',\n timestamp: true,\n colors: true,\n ...config.logger,\n },\n };\n\n this.logger = createLogger(this.config.logger);\n this.cache = createCacheStore(this.config.cache);\n \n this.interceptors = config.interceptors ?? {\n request: [],\n response: [],\n error: [],\n };\n\n const authMode = this.determineAuthMode(config);\n this.authConfig = {\n authMode,\n apiKey: config.apiKey,\n tokenManager: config.tokenManager ?? new DefaultAuthTokenManager({\n accessToken: config.accessToken,\n authToken: config.authToken,\n }),\n };\n }\n\n protected determineAuthMode(config: HttpClientOptions): AuthMode {\n if (config.apiKey) {\n return 'apikey';\n }\n return 'dual-token';\n }\n\n getAuthMode(): AuthMode {\n return this.authConfig.authMode;\n }\n\n setAuthMode(mode: AuthMode): void {\n this.authConfig.authMode = mode;\n }\n\n getTokenManager(): AuthTokenManager | undefined {\n return this.authConfig.tokenManager;\n }\n\n setTokenManager(manager: AuthTokenManager): void {\n this.authConfig.tokenManager = manager;\n }\n\n setApiKey(apiKey: string): void {\n this.authConfig.apiKey = apiKey;\n this.authConfig.authMode = 'apikey';\n this.authConfig.tokenManager?.clearTokens();\n }\n\n setAuthToken(token: string): void {\n this.authConfig.tokenManager?.setAuthToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setAccessToken(token: string): void {\n this.authConfig.tokenManager?.setAccessToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n setOrganizationId(organizationId: string): void {\n this.organizationId = organizationId;\n }\n\n setPlatform(platform: string): void {\n this.platform = platform;\n }\n\n setUserId(userId: string | number): void {\n this.userId = userId;\n }\n\n clearAuthToken(): void {\n this.authConfig.tokenManager?.clearTokens();\n }\n\n addRequestInterceptor(interceptor: (config: RequestConfig) => RequestConfig | Promise<RequestConfig>): () => void {\n this.interceptors.request.push(interceptor);\n return () => {\n const index = this.interceptors.request.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.request.splice(index, 1);\n }\n };\n }\n\n addResponseInterceptor(interceptor: (response: unknown, config: RequestConfig) => unknown | Promise<unknown>): () => void {\n this.interceptors.response.push(interceptor);\n return () => {\n const index = this.interceptors.response.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.response.splice(index, 1);\n }\n };\n }\n\n addErrorInterceptor(interceptor: (error: Error, config: RequestConfig) => void | Promise<void>): () => void {\n this.interceptors.error.push(interceptor);\n return () => {\n const index = this.interceptors.error.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.error.splice(index, 1);\n }\n };\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n getConfig() {\n return {\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n authMode: this.authConfig.authMode,\n apiKey: this.authConfig.apiKey,\n accessToken: this.authConfig.tokenManager?.getAccessToken(),\n authToken: this.authConfig.tokenManager?.getAuthToken(),\n tenantId: this.tenantId,\n organizationId: this.organizationId,\n platform: this.platform,\n userId: this.userId,\n };\n }\n\n isAuthenticated(): boolean {\n return this.authConfig.tokenManager?.isValid() ?? false;\n }\n\n protected buildBaseUrl(path: string, params?: QueryParams): string {\n const baseUrl = this.config.baseUrl.replace(/\\/$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n let url = `${baseUrl}${normalizedPath}`;\n\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n return url;\n }\n\n protected buildHeaders(config: RequestConfig, skipAuth: boolean = false): HttpHeaders {\n const headers: HttpHeaders = {\n 'Content-Type': MIME_TYPES.JSON,\n ...this.config.headers,\n ...config.headers,\n };\n\n if (!skipAuth && !config.skipAuth) {\n const authHeaders = buildAuthHeaders(\n this.authConfig.authMode,\n this.authConfig.apiKey,\n this.authConfig.tokenManager\n );\n Object.assign(headers, authHeaders);\n }\n\n if (this.tenantId) {\n headers['X-Tenant-Id'] = this.tenantId;\n }\n\n if (this.organizationId) {\n headers['X-Organization-Id'] = this.organizationId;\n }\n\n if (this.platform) {\n headers['X-Platform'] = this.platform;\n }\n\n if (this.userId !== undefined) {\n headers['X-User-Id'] = String(this.userId);\n }\n\n return headers;\n }\n\n protected serializeRequestBody(body: unknown, headers: HttpHeaders): BodyInit | string | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';\n return body.toString();\n }\n\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof ArrayBuffer !== 'undefined') {\n if (body instanceof ArrayBuffer) {\n delete headers['Content-Type'];\n return body;\n }\n if (ArrayBuffer.isView(body)) {\n delete headers['Content-Type'];\n return body as unknown as BodyInit;\n }\n }\n\n if (typeof body === 'string') {\n headers['Content-Type'] = headers['Content-Type'] || 'text/plain;charset=UTF-8';\n return body;\n }\n\n return JSON.stringify(body);\n }\n\n protected async applyRequestInterceptors(config: RequestConfig): Promise<RequestConfig> {\n let processedConfig = config;\n for (const interceptor of this.interceptors.request) {\n processedConfig = await interceptor(processedConfig);\n }\n return processedConfig;\n }\n\n protected async applyResponseInterceptors<T>(response: T, config: RequestConfig): Promise<T> {\n let processedResponse: T = response;\n for (const interceptor of this.interceptors.response) {\n processedResponse = (await interceptor(processedResponse, config)) as T;\n }\n return processedResponse;\n }\n\n protected async applyErrorInterceptors(error: Error, config: RequestConfig): Promise<void> {\n for (const interceptor of this.interceptors.error) {\n await interceptor(error, config);\n }\n }\n\n protected async handleErrorResponse(response: Response, config: RequestConfig): Promise<never> {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const result = await response.json();\n errorMessage = result.msg || result.message || errorMessage;\n } catch {\n // Ignore JSON parse errors\n }\n\n const error = SdkError.fromHttpStatus(response.status, errorMessage);\n\n await this.applyErrorInterceptors(error, config);\n throw error;\n }\n\n protected async processResponse<T>(response: Response, config: RequestConfig): Promise<T> {\n if (!response.ok) {\n await this.handleErrorResponse(response, config);\n }\n\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes(MIME_TYPES.JSON)) {\n const result: ApiResult<T> = await response.json();\n\n if (!SUCCESS_CODES.includes(result.code) && !SUCCESS_CODES.includes(String(result.code))) {\n throw SdkError.fromApiResult(result, response.status);\n }\n\n return result.data;\n }\n\n if (contentType?.includes('text/')) {\n return (await response.text()) as unknown as T;\n }\n\n return await response.json() as T;\n }\n\n protected async executeFetch(\n url: string,\n options: {\n method: string;\n headers: HttpHeaders;\n body?: string | BodyInit | null;\n timeout: number;\n signal?: AbortSignal;\n }\n ): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, options.timeout);\n\n const abortHandler = () => controller.abort();\n\n if (options.signal) {\n if (options.signal.aborted) {\n controller.abort();\n } else {\n options.signal.addEventListener('abort', abortHandler, { once: true });\n }\n }\n\n try {\n this.logger.debug(`${options.method} ${url}`);\n\n const response = await fetch(url, {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (timedOut) {\n throw new TimeoutError(`Request timeout after ${options.timeout}ms`, options.timeout);\n }\n throw new CancelledError('Request was cancelled');\n }\n throw new NetworkError(error.message);\n }\n\n throw new NetworkError('Unknown network error');\n } finally {\n clearTimeout(timeoutId);\n if (options.signal) {\n options.signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n async execute<T>(config: RequestConfig): Promise<T> {\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n const serializedBody = this.serializeRequestBody(processedConfig.body, headers);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: serializedBody,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n abstract request<T>(path: string, options?: RequestOptions): Promise<T>;\n abstract get<T>(path: string, params?: QueryParams): Promise<T>;\n abstract post<T>(path: string, body?: unknown): Promise<T>;\n abstract put<T>(path: string, body?: unknown): Promise<T>;\n abstract delete<T>(path: string, body?: unknown): Promise<T>;\n abstract patch<T>(path: string, body?: unknown): Promise<T>;\n\n async upload<T>(path: string, options: UploadOptions): Promise<T> {\n const formData = new FormData();\n formData.append(options.fieldName ?? 'file', options.file);\n\n if (options.additionalData) {\n Object.entries(options.additionalData).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n\n const config: RequestConfig = {\n url: path,\n method: 'POST',\n body: formData,\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n delete headers['Content-Type'];\n\n const response = await this.executeFetch(url, {\n method: 'POST',\n headers,\n body: formData,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n async download(path: string, _options?: DownloadOptions): Promise<Blob> {\n const config: RequestConfig = {\n url: path,\n method: 'GET',\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: 'GET',\n headers,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n return response.blob();\n }\n\n async *stream(path: string, options?: RequestOptions): AsyncIterable<string> {\n const config: RequestConfig = {\n url: path,\n method: options?.method ?? 'POST',\n body: options?.body,\n headers: options?.headers,\n skipAuth: options?.skipAuth,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: processedConfig.body ? JSON.stringify(processedConfig.body) : undefined,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new NetworkError('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine === '' || trimmedLine === 'data: [DONE]') continue;\n if (trimmedLine.startsWith('data: ')) {\n yield trimmedLine.slice(6);\n } else {\n yield trimmedLine;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nexport function createBaseHttpClient(config: HttpClientOptions): BaseHttpClient {\n return new (class extends BaseHttpClient {\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const config: RequestConfig = {\n url: path,\n method: options.method ?? 'GET',\n headers: options.headers,\n params: options.params,\n body: options.body,\n timeout: options.timeout,\n signal: options.signal,\n skipAuth: options.skipAuth,\n };\n\n return withRetry(\n () => this.execute<T>(config),\n { ...this.config.retry, ...options.retry }\n );\n }\n\n async get<T>(path: string, params?: QueryParams): Promise<T> {\n return this.request<T>(path, { method: 'GET', params });\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PUT', body });\n }\n\n async delete<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'DELETE', body });\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body });\n }\n })(config);\n}\n"],"names":["config"],"mappings":";;;;;;;;;AAqDO,MAAe,eAA0C;AAAA,EAW9D,YAAY,QAA2B;AAV7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAGR,SAAK,SAAS;AAAA,MACZ,SAAS,OAAO;AAAA,MAChB,SAAS,OAAO,WAAW;AAAA,MAC3B,SAAS,OAAO,WAAW,CAAA;AAAA,MAC3B,OAAO;AAAA,QACL,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,cAAc;AAAA,QACd,eAAe;AAAA,QACf,GAAG,OAAO;AAAA,MAAA;AAAA,MAEZ,OAAO;AAAA,QACL,SAAS;AAAA,QACT,KAAK,IAAI,KAAK;AAAA,QACd,SAAS;AAAA,QACT,GAAG,OAAO;AAAA,MAAA;AAAA,MAEZ,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,GAAG,OAAO;AAAA,MAAA;AAAA,IACZ;AAGF,SAAK,SAAS,aAAa,KAAK,OAAO,MAAM;AAC7C,SAAK,QAAQ,iBAAiB,KAAK,OAAO,KAAK;AAE/C,SAAK,eAAe,OAAO,gBAAgB;AAAA,MACzC,SAAS,CAAA;AAAA,MACT,UAAU,CAAA;AAAA,MACV,OAAO,CAAA;AAAA,IAAC;AAGV,UAAM,WAAW,KAAK,kBAAkB,MAAM;AAC9C,SAAK,aAAa;AAAA,MAChB;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,cAAc,OAAO,gBAAgB,IAAI,wBAAwB;AAAA,QAC/D,aAAa,OAAO;AAAA,QACpB,WAAW,OAAO;AAAA,MAAA,CACnB;AAAA,IAAA;AAAA,EAEL;AAAA,EAEU,kBAAkB,QAAqC;AAC/D,QAAI,OAAO,QAAQ;AACjB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,cAAwB;AACtB,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,YAAY,MAAsB;AAChC,SAAK,WAAW,WAAW;AAAA,EAC7B;AAAA,EAEA,kBAAgD;AAC9C,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA,EAEA,gBAAgB,SAAiC;AAC/C,SAAK,WAAW,eAAe;AAAA,EACjC;AAAA,EAEA,UAAU,QAAsB;;AAC9B,SAAK,WAAW,SAAS;AACzB,SAAK,WAAW,WAAW;AAC3B,eAAK,WAAW,iBAAhB,mBAA8B;AAAA,EAChC;AAAA,EAEA,aAAa,OAAqB;;AAChC,eAAK,WAAW,iBAAhB,mBAA8B,aAAa;AAC3C,QAAI,KAAK,WAAW,aAAa,UAAU;AACzC,WAAK,WAAW,WAAW;AAC3B,WAAK,WAAW,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,eAAe,OAAqB;;AAClC,eAAK,WAAW,iBAAhB,mBAA8B,eAAe;AAC7C,QAAI,KAAK,WAAW,aAAa,UAAU;AACzC,WAAK,WAAW,WAAW;AAC3B,WAAK,WAAW,SAAS;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,YAAY,UAAwB;AAClC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,kBAAkB,gBAA8B;AAC9C,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,YAAY,UAAwB;AAClC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,UAAU,QAA+B;AACvC,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,iBAAuB;;AACrB,eAAK,WAAW,iBAAhB,mBAA8B;AAAA,EAChC;AAAA,EAEA,sBAAsB,aAA4F;AAChH,SAAK,aAAa,QAAQ,KAAK,WAAW;AAC1C,WAAO,MAAM;AACX,YAAM,QAAQ,KAAK,aAAa,QAAQ,QAAQ,WAAW;AAC3D,UAAI,QAAQ,IAAI;AACd,aAAK,aAAa,QAAQ,OAAO,OAAO,CAAC;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,uBAAuB,aAAmG;AACxH,SAAK,aAAa,SAAS,KAAK,WAAW;AAC3C,WAAO,MAAM;AACX,YAAM,QAAQ,KAAK,aAAa,SAAS,QAAQ,WAAW;AAC5D,UAAI,QAAQ,IAAI;AACd,aAAK,aAAa,SAAS,OAAO,OAAO,CAAC;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAAoB,aAAwF;AAC1G,SAAK,aAAa,MAAM,KAAK,WAAW;AACxC,WAAO,MAAM;AACX,YAAM,QAAQ,KAAK,aAAa,MAAM,QAAQ,WAAW;AACzD,UAAI,QAAQ,IAAI;AACd,aAAK,aAAa,MAAM,OAAO,OAAO,CAAC;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAmB;AACjB,SAAK,MAAM,MAAA;AAAA,EACb;AAAA,EAEA,YAAY;;AACV,WAAO;AAAA,MACL,SAAS,KAAK,OAAO;AAAA,MACrB,SAAS,KAAK,OAAO;AAAA,MACrB,UAAU,KAAK,WAAW;AAAA,MAC1B,QAAQ,KAAK,WAAW;AAAA,MACxB,cAAa,UAAK,WAAW,iBAAhB,mBAA8B;AAAA,MAC3C,YAAW,UAAK,WAAW,iBAAhB,mBAA8B;AAAA,MACzC,UAAU,KAAK;AAAA,MACf,gBAAgB,KAAK;AAAA,MACrB,UAAU,KAAK;AAAA,MACf,QAAQ,KAAK;AAAA,IAAA;AAAA,EAEjB;AAAA,EAEA,kBAA2B;;AACzB,aAAO,UAAK,WAAW,iBAAhB,mBAA8B,cAAa;AAAA,EACpD;AAAA,EAEU,aAAa,MAAc,QAA8B;AACjE,UAAM,UAAU,KAAK,OAAO,QAAQ,QAAQ,OAAO,EAAE;AACrD,UAAM,iBAAiB,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAC7D,QAAI,MAAM,GAAG,OAAO,GAAG,cAAc;AAErC,QAAI,QAAQ;AACV,YAAM,eAAe,IAAI,gBAAA;AACzB,aAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/C,YAAI,UAAU,UAAa,UAAU,MAAM;AACzC,uBAAa,OAAO,KAAK,OAAO,KAAK,CAAC;AAAA,QACxC;AAAA,MACF,CAAC;AACD,YAAM,cAAc,aAAa,SAAA;AACjC,UAAI,aAAa;AACf,eAAO,IAAI,WAAW;AAAA,MACxB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,aAAa,QAAuB,WAAoB,OAAoB;AACpF,UAAM,UAAuB;AAAA,MAC3B,gBAAgB,WAAW;AAAA,MAC3B,GAAG,KAAK,OAAO;AAAA,MACf,GAAG,OAAO;AAAA,IAAA;AAGZ,QAAI,CAAC,YAAY,CAAC,OAAO,UAAU;AACjC,YAAM,cAAc;AAAA,QAClB,KAAK,WAAW;AAAA,QAChB,KAAK,WAAW;AAAA,QAChB,KAAK,WAAW;AAAA,MAAA;AAElB,aAAO,OAAO,SAAS,WAAW;AAAA,IACpC;AAEA,QAAI,KAAK,UAAU;AACjB,cAAQ,aAAa,IAAI,KAAK;AAAA,IAChC;AAEA,QAAI,KAAK,gBAAgB;AACvB,cAAQ,mBAAmB,IAAI,KAAK;AAAA,IACtC;AAEA,QAAI,KAAK,UAAU;AACjB,cAAQ,YAAY,IAAI,KAAK;AAAA,IAC/B;AAEA,QAAI,KAAK,WAAW,QAAW;AAC7B,cAAQ,WAAW,IAAI,OAAO,KAAK,MAAM;AAAA,IAC3C;AAEA,WAAO;AAAA,EACT;AAAA,EAEU,qBAAqB,MAAe,SAAqD;AACjG,QAAI,SAAS,UAAa,SAAS,MAAM;AACvC,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,aAAa,eAAe,gBAAgB,UAAU;AAC/D,aAAO,QAAQ,cAAc;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,oBAAoB,eAAe,gBAAgB,iBAAiB;AAC7E,cAAQ,cAAc,IAAI;AAC1B,aAAO,KAAK,SAAA;AAAA,IACd;AAEA,QAAI,OAAO,SAAS,eAAe,gBAAgB,MAAM;AACvD,aAAO,QAAQ,cAAc;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,gBAAgB,aAAa;AACtC,UAAI,gBAAgB,aAAa;AAC/B,eAAO,QAAQ,cAAc;AAC7B,eAAO;AAAA,MACT;AACA,UAAI,YAAY,OAAO,IAAI,GAAG;AAC5B,eAAO,QAAQ,cAAc;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAEA,QAAI,OAAO,SAAS,UAAU;AAC5B,cAAQ,cAAc,IAAI,QAAQ,cAAc,KAAK;AACrD,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,UAAU,IAAI;AAAA,EAC5B;AAAA,EAEA,MAAgB,yBAAyB,QAA+C;AACtF,QAAI,kBAAkB;AACtB,eAAW,eAAe,KAAK,aAAa,SAAS;AACnD,wBAAkB,MAAM,YAAY,eAAe;AAAA,IACrD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,0BAA6B,UAAa,QAAmC;AAC3F,QAAI,oBAAuB;AAC3B,eAAW,eAAe,KAAK,aAAa,UAAU;AACpD,0BAAqB,MAAM,YAAY,mBAAmB,MAAM;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAgB,uBAAuB,OAAc,QAAsC;AACzF,eAAW,eAAe,KAAK,aAAa,OAAO;AACjD,YAAM,YAAY,OAAO,MAAM;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAgB,oBAAoB,UAAoB,QAAuC;AAC7F,QAAI,eAAe,QAAQ,SAAS,MAAM,KAAK,SAAS,UAAU;AAElE,QAAI;AACF,YAAM,SAAS,MAAM,SAAS,KAAA;AAC9B,qBAAe,OAAO,OAAO,OAAO,WAAW;AAAA,IACjD,QAAQ;AAAA,IAER;AAEA,UAAM,QAAQ,SAAS,eAAe,SAAS,QAAQ,YAAY;AAEnE,UAAM,KAAK,uBAAuB,OAAO,MAAM;AAC/C,UAAM;AAAA,EACR;AAAA,EAEA,MAAgB,gBAAmB,UAAoB,QAAmC;AACxF,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,KAAK,oBAAoB,UAAU,MAAM;AAAA,IACjD;AAEA,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AAEvD,QAAI,2CAAa,SAAS,WAAW,OAAO;AAC1C,YAAM,SAAuB,MAAM,SAAS,KAAA;AAE5C,UAAI,CAAC,cAAc,SAAS,OAAO,IAAI,KAAK,CAAC,cAAc,SAAS,OAAO,OAAO,IAAI,CAAC,GAAG;AACxF,cAAM,SAAS,cAAc,QAAQ,SAAS,MAAM;AAAA,MACtD;AAEA,aAAO,OAAO;AAAA,IAChB;AAEA,QAAI,2CAAa,SAAS,UAAU;AAClC,aAAQ,MAAM,SAAS,KAAA;AAAA,IACzB;AAEA,WAAO,MAAM,SAAS,KAAA;AAAA,EACxB;AAAA,EAEA,MAAgB,aACd,KACA,SAOmB;AACnB,UAAM,aAAa,IAAI,gBAAA;AACvB,QAAI,WAAW;AACf,UAAM,YAAY,WAAW,MAAM;AACjC,iBAAW;AACX,iBAAW,MAAA;AAAA,IACb,GAAG,QAAQ,OAAO;AAElB,UAAM,eAAe,MAAM,WAAW,MAAA;AAEtC,QAAI,QAAQ,QAAQ;AAClB,UAAI,QAAQ,OAAO,SAAS;AAC1B,mBAAW,MAAA;AAAA,MACb,OAAO;AACL,gBAAQ,OAAO,iBAAiB,SAAS,cAAc,EAAE,MAAM,MAAM;AAAA,MACvE;AAAA,IACF;AAEA,QAAI;AACF,WAAK,OAAO,MAAM,GAAG,QAAQ,MAAM,IAAI,GAAG,EAAE;AAE5C,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,MAAM,QAAQ;AAAA,QACd,QAAQ,WAAW;AAAA,MAAA,CACpB;AAED,aAAO;AAAA,IACT,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAC1B,YAAI,MAAM,SAAS,cAAc;AAC/B,cAAI,UAAU;AACZ,kBAAM,IAAI,aAAa,yBAAyB,QAAQ,OAAO,MAAM,QAAQ,OAAO;AAAA,UACtF;AACA,gBAAM,IAAI,eAAe,uBAAuB;AAAA,QAClD;AACA,cAAM,IAAI,aAAa,MAAM,OAAO;AAAA,MACtC;AAEA,YAAM,IAAI,aAAa,uBAAuB;AAAA,IAChD,UAAA;AACE,mBAAa,SAAS;AACtB,UAAI,QAAQ,QAAQ;AAClB,gBAAQ,OAAO,oBAAoB,SAAS,YAAY;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAW,QAAmC;AAClD,UAAM,kBAAkB,MAAM,KAAK,yBAAyB,MAAM;AAClE,UAAM,MAAM,KAAK,aAAa,gBAAgB,KAAK,gBAAgB,MAAM;AACzE,UAAM,UAAU,KAAK,aAAa,eAAe;AACjD,UAAM,iBAAiB,KAAK,qBAAqB,gBAAgB,MAAM,OAAO;AAE9E,UAAM,WAAW,MAAM,KAAK,aAAa,KAAK;AAAA,MAC5C,QAAQ,gBAAgB;AAAA,MACxB;AAAA,MACA,MAAM;AAAA,MACN,SAAS,gBAAgB,WAAW,KAAK,OAAO;AAAA,MAChD,QAAQ,gBAAgB;AAAA,IAAA,CACzB;AAED,WAAO,KAAK,gBAAmB,UAAU,eAAe;AAAA,EAC1D;AAAA,EASA,MAAM,OAAU,MAAc,SAAoC;AAChE,UAAM,WAAW,IAAI,SAAA;AACrB,aAAS,OAAO,QAAQ,aAAa,QAAQ,QAAQ,IAAI;AAEzD,QAAI,QAAQ,gBAAgB;AAC1B,aAAO,QAAQ,QAAQ,cAAc,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC/D,iBAAS,OAAO,KAAK,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH;AAEA,UAAM,SAAwB;AAAA,MAC5B,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,IAAA;AAGZ,UAAM,kBAAkB,MAAM,KAAK,yBAAyB,MAAM;AAClE,UAAM,MAAM,KAAK,aAAa,gBAAgB,KAAK,gBAAgB,MAAM;AACzE,UAAM,UAAU,KAAK,aAAa,eAAe;AACjD,WAAO,QAAQ,cAAc;AAE7B,UAAM,WAAW,MAAM,KAAK,aAAa,KAAK;AAAA,MAC5C,QAAQ;AAAA,MACR;AAAA,MACA,MAAM;AAAA,MACN,SAAS,gBAAgB,WAAW,KAAK,OAAO;AAAA,MAChD,QAAQ,gBAAgB;AAAA,IAAA,CACzB;AAED,WAAO,KAAK,gBAAmB,UAAU,eAAe;AAAA,EAC1D;AAAA,EAEA,MAAM,SAAS,MAAc,UAA2C;AACtE,UAAM,SAAwB;AAAA,MAC5B,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,UAAU;AAAA,IAAA;AAGZ,UAAM,kBAAkB,MAAM,KAAK,yBAAyB,MAAM;AAClE,UAAM,MAAM,KAAK,aAAa,gBAAgB,KAAK,gBAAgB,MAAM;AACzE,UAAM,UAAU,KAAK,aAAa,eAAe;AAEjD,UAAM,WAAW,MAAM,KAAK,aAAa,KAAK;AAAA,MAC5C,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,gBAAgB,WAAW,KAAK,OAAO;AAAA,MAChD,QAAQ,gBAAgB;AAAA,IAAA,CACzB;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,KAAK,oBAAoB,UAAU,eAAe;AAAA,IAC1D;AAEA,WAAO,SAAS,KAAA;AAAA,EAClB;AAAA,EAEA,OAAO,OAAO,MAAc,SAAiD;;AAC3E,UAAM,SAAwB;AAAA,MAC5B,KAAK;AAAA,MACL,SAAQ,mCAAS,WAAU;AAAA,MAC3B,MAAM,mCAAS;AAAA,MACf,SAAS,mCAAS;AAAA,MAClB,UAAU,mCAAS;AAAA,IAAA;AAGrB,UAAM,kBAAkB,MAAM,KAAK,yBAAyB,MAAM;AAClE,UAAM,MAAM,KAAK,aAAa,gBAAgB,KAAK,gBAAgB,MAAM;AACzE,UAAM,UAAU,KAAK,aAAa,eAAe;AAEjD,UAAM,WAAW,MAAM,KAAK,aAAa,KAAK;AAAA,MAC5C,QAAQ,gBAAgB;AAAA,MACxB;AAAA,MACA,MAAM,gBAAgB,OAAO,KAAK,UAAU,gBAAgB,IAAI,IAAI;AAAA,MACpE,SAAS,gBAAgB,WAAW,KAAK,OAAO;AAAA,MAChD,QAAQ,gBAAgB;AAAA,IAAA,CACzB;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,KAAK,oBAAoB,UAAU,eAAe;AAAA,IAC1D;AAEA,UAAM,UAAS,cAAS,SAAT,mBAAe;AAC9B,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,aAAa,kBAAkB;AAAA,IAC3C;AAEA,UAAM,UAAU,IAAI,YAAA;AACpB,QAAI,SAAS;AAEb,QAAI;AACF,aAAO,MAAM;AACX,cAAM,EAAE,MAAM,MAAA,IAAU,MAAM,OAAO,KAAA;AACrC,YAAI,KAAM;AAEV,kBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,MAAM;AAChD,cAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,iBAAS,MAAM,SAAS;AAExB,mBAAW,QAAQ,OAAO;AACxB,gBAAM,cAAc,KAAK,KAAA;AACzB,cAAI,gBAAgB,MAAM,gBAAgB,eAAgB;AAC1D,cAAI,YAAY,WAAW,QAAQ,GAAG;AACpC,kBAAM,YAAY,MAAM,CAAC;AAAA,UAC3B,OAAO;AACL,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF,UAAA;AACE,aAAO,YAAA;AAAA,IACT;AAAA,EACF;AACF;AAEO,SAAS,qBAAqB,QAA2C;AAC9E,SAAO,IAAK,cAAc,eAAe;AAAA,IACvC,MAAM,QAAW,MAAc,UAA0B,IAAgB;AACvE,YAAMA,UAAwB;AAAA,QAC5B,KAAK;AAAA,QACL,QAAQ,QAAQ,UAAU;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,QACjB,QAAQ,QAAQ;AAAA,QAChB,UAAU,QAAQ;AAAA,MAAA;AAGpB,aAAO;AAAA,QACL,MAAM,KAAK,QAAWA,OAAM;AAAA,QAC5B,EAAE,GAAG,KAAK,OAAO,OAAO,GAAG,QAAQ,MAAA;AAAA,MAAM;AAAA,IAE7C;AAAA,IAEA,MAAM,IAAO,MAAc,QAAkC;AAC3D,aAAO,KAAK,QAAW,MAAM,EAAE,QAAQ,OAAO,QAAQ;AAAA,IACxD;AAAA,IAEA,MAAM,KAAQ,MAAc,MAA4B;AACtD,aAAO,KAAK,QAAW,MAAM,EAAE,QAAQ,QAAQ,MAAM;AAAA,IACvD;AAAA,IAEA,MAAM,IAAO,MAAc,MAA4B;AACrD,aAAO,KAAK,QAAW,MAAM,EAAE,QAAQ,OAAO,MAAM;AAAA,IACtD;AAAA,IAEA,MAAM,OAAU,MAAc,MAA4B;AACxD,aAAO,KAAK,QAAW,MAAM,EAAE,QAAQ,UAAU,MAAM;AAAA,IACzD;AAAA,IAEA,MAAM,MAAS,MAAc,MAA4B;AACvD,aAAO,KAAK,QAAW,MAAM,EAAE,QAAQ,SAAS,MAAM;AAAA,IACxD;AAAA,EAAA,EACC,MAAM;AACX;"}
|
|
1
|
+
{"version":3,"file":"base-client.js","sources":["../../src/http/base-client.ts"],"sourcesContent":["import type {\n HttpClientConfig,\n RequestConfig,\n RequestOptions,\n QueryParams,\n HttpHeaders,\n ApiResult,\n Interceptors,\n UploadOptions,\n DownloadOptions,\n} from '../core/types';\nimport { DEFAULT_TIMEOUT, SUCCESS_CODES, MIME_TYPES } from '../core/types';\nimport {\n SdkError,\n NetworkError,\n TimeoutError,\n CancelledError,\n} from '../errors';\nimport type { AuthTokenManager, AuthMode } from '../auth';\nimport { DefaultAuthTokenManager, buildAuthHeaders } from '../auth';\nimport { createLogger, type Logger } from '../utils/logger';\nimport { createCacheStore, type CacheStore } from '../utils/cache';\nimport { withRetry } from '../utils/retry';\n\nexport interface HttpClientOptions extends HttpClientConfig {\n apiKey?: string;\n accessToken?: string;\n authToken?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface HttpClientAuthConfig {\n authMode: AuthMode;\n apiKey?: string;\n tokenManager?: AuthTokenManager;\n}\n\nexport interface RequestExecutor {\n execute<T>(config: RequestConfig): Promise<T>;\n}\n\nexport interface ResponseProcessor {\n process<T>(response: Response, config: RequestConfig): Promise<T>;\n}\n\nexport interface UrlBuilder {\n build(path: string, params?: QueryParams): string;\n}\n\nexport interface HeaderBuilder {\n build(config: RequestConfig, skipAuth?: boolean): HttpHeaders;\n}\n\nexport abstract class BaseHttpClient implements RequestExecutor {\n protected config: Required<Omit<HttpClientConfig, 'interceptors'>> & { baseUrl: string };\n protected authConfig: HttpClientAuthConfig;\n protected logger: Logger;\n protected cache: CacheStore;\n protected interceptors: Interceptors;\n protected tenantId?: string;\n protected organizationId?: string;\n protected platform?: string;\n protected userId?: string | number;\n\n constructor(config: HttpClientOptions) {\n this.config = {\n baseUrl: config.baseUrl,\n timeout: config.timeout ?? DEFAULT_TIMEOUT,\n headers: config.headers ?? {},\n retry: {\n maxRetries: 3,\n retryDelay: 1000,\n retryBackoff: 'exponential',\n maxRetryDelay: 30000,\n ...config.retry,\n },\n cache: {\n enabled: false,\n ttl: 5 * 60 * 1000,\n maxSize: 100,\n ...config.cache,\n },\n logger: {\n level: 'info',\n prefix: '[SDK]',\n timestamp: true,\n colors: true,\n ...config.logger,\n },\n };\n\n this.logger = createLogger(this.config.logger);\n this.cache = createCacheStore(this.config.cache);\n \n this.interceptors = config.interceptors ?? {\n request: [],\n response: [],\n error: [],\n };\n\n const authMode = this.determineAuthMode(config);\n this.authConfig = {\n authMode,\n apiKey: config.apiKey,\n tokenManager: config.tokenManager ?? new DefaultAuthTokenManager({\n accessToken: config.accessToken,\n authToken: config.authToken,\n }),\n };\n }\n\n protected determineAuthMode(config: HttpClientOptions): AuthMode {\n if (config.apiKey) {\n return 'apikey';\n }\n return 'dual-token';\n }\n\n getAuthMode(): AuthMode {\n return this.authConfig.authMode;\n }\n\n setAuthMode(mode: AuthMode): void {\n this.authConfig.authMode = mode;\n }\n\n getTokenManager(): AuthTokenManager | undefined {\n return this.authConfig.tokenManager;\n }\n\n setTokenManager(manager: AuthTokenManager): void {\n this.authConfig.tokenManager = manager;\n }\n\n setApiKey(apiKey: string): void {\n this.authConfig.apiKey = apiKey;\n this.authConfig.authMode = 'apikey';\n this.authConfig.tokenManager?.clearTokens();\n }\n\n setAuthToken(token: string): void {\n this.authConfig.tokenManager?.setAuthToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setAccessToken(token: string): void {\n this.authConfig.tokenManager?.setAccessToken(token);\n if (this.authConfig.authMode === 'apikey') {\n this.authConfig.authMode = 'dual-token';\n this.authConfig.apiKey = undefined;\n }\n }\n\n setTenantId(tenantId: string): void {\n this.tenantId = tenantId;\n }\n\n setOrganizationId(organizationId: string): void {\n this.organizationId = organizationId;\n }\n\n setPlatform(platform: string): void {\n this.platform = platform;\n }\n\n setUserId(userId: string | number): void {\n this.userId = userId;\n }\n\n clearAuthToken(): void {\n this.authConfig.tokenManager?.clearTokens();\n }\n\n addRequestInterceptor(interceptor: (config: RequestConfig) => RequestConfig | Promise<RequestConfig>): () => void {\n this.interceptors.request.push(interceptor);\n return () => {\n const index = this.interceptors.request.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.request.splice(index, 1);\n }\n };\n }\n\n addResponseInterceptor(interceptor: (response: unknown, config: RequestConfig) => unknown | Promise<unknown>): () => void {\n this.interceptors.response.push(interceptor);\n return () => {\n const index = this.interceptors.response.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.response.splice(index, 1);\n }\n };\n }\n\n addErrorInterceptor(interceptor: (error: Error, config: RequestConfig) => void | Promise<void>): () => void {\n this.interceptors.error.push(interceptor);\n return () => {\n const index = this.interceptors.error.indexOf(interceptor);\n if (index > -1) {\n this.interceptors.error.splice(index, 1);\n }\n };\n }\n\n clearCache(): void {\n this.cache.clear();\n }\n\n getConfig() {\n return {\n baseUrl: this.config.baseUrl,\n timeout: this.config.timeout,\n authMode: this.authConfig.authMode,\n apiKey: this.authConfig.apiKey,\n accessToken: this.authConfig.tokenManager?.getAccessToken(),\n authToken: this.authConfig.tokenManager?.getAuthToken(),\n tenantId: this.tenantId,\n organizationId: this.organizationId,\n platform: this.platform,\n userId: this.userId,\n };\n }\n\n isAuthenticated(): boolean {\n return this.authConfig.tokenManager?.isValid() ?? false;\n }\n\n protected buildBaseUrl(path: string, params?: QueryParams): string {\n const baseUrl = this.config.baseUrl.replace(/\\/$/, '');\n const normalizedPath = path.startsWith('/') ? path : `/${path}`;\n let url = `${baseUrl}${normalizedPath}`;\n\n if (params) {\n const searchParams = new URLSearchParams();\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n searchParams.append(key, String(value));\n }\n });\n const queryString = searchParams.toString();\n if (queryString) {\n url += `?${queryString}`;\n }\n }\n\n return url;\n }\n\n protected buildHeaders(config: RequestConfig, skipAuth: boolean = false): HttpHeaders {\n const headers: HttpHeaders = {\n 'Content-Type': MIME_TYPES.JSON,\n ...this.config.headers,\n ...config.headers,\n };\n\n if (!skipAuth && !config.skipAuth) {\n const authHeaders = buildAuthHeaders(\n this.authConfig.authMode,\n this.authConfig.apiKey,\n this.authConfig.tokenManager\n );\n Object.assign(headers, authHeaders);\n }\n\n if (this.tenantId) {\n headers['X-Tenant-Id'] = this.tenantId;\n }\n\n if (this.organizationId) {\n headers['X-Organization-Id'] = this.organizationId;\n }\n\n if (this.platform) {\n headers['X-Platform'] = this.platform;\n }\n\n if (this.userId !== undefined) {\n headers['X-User-Id'] = String(this.userId);\n }\n\n return headers;\n }\n\n protected serializeRequestBody(body: unknown, headers: HttpHeaders): BodyInit | string | undefined {\n if (body === undefined || body === null) {\n return undefined;\n }\n\n if (typeof FormData !== 'undefined' && body instanceof FormData) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof URLSearchParams !== 'undefined' && body instanceof URLSearchParams) {\n headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';\n return body.toString();\n }\n\n if (typeof Blob !== 'undefined' && body instanceof Blob) {\n delete headers['Content-Type'];\n return body;\n }\n\n if (typeof ArrayBuffer !== 'undefined') {\n if (body instanceof ArrayBuffer) {\n delete headers['Content-Type'];\n return body;\n }\n if (ArrayBuffer.isView(body)) {\n delete headers['Content-Type'];\n return body as unknown as BodyInit;\n }\n }\n\n if (typeof body === 'string') {\n headers['Content-Type'] = headers['Content-Type'] || 'text/plain;charset=UTF-8';\n return body;\n }\n\n return JSON.stringify(body);\n }\n\n protected async applyRequestInterceptors(config: RequestConfig): Promise<RequestConfig> {\n let processedConfig = config;\n for (const interceptor of this.interceptors.request) {\n processedConfig = await interceptor(processedConfig);\n }\n return processedConfig;\n }\n\n protected async applyResponseInterceptors<T>(response: T, config: RequestConfig): Promise<T> {\n let processedResponse: T = response;\n for (const interceptor of this.interceptors.response) {\n processedResponse = (await interceptor(processedResponse, config)) as T;\n }\n return processedResponse;\n }\n\n protected async applyErrorInterceptors(error: Error, config: RequestConfig): Promise<void> {\n for (const interceptor of this.interceptors.error) {\n await interceptor(error, config);\n }\n }\n\n protected async handleErrorResponse(response: Response, config: RequestConfig): Promise<never> {\n let errorMessage = `HTTP ${response.status}: ${response.statusText}`;\n\n try {\n const result = await response.json();\n errorMessage = result.msg || result.message || errorMessage;\n } catch {\n // Ignore JSON parse errors\n }\n\n const error = SdkError.fromHttpStatus(response.status, errorMessage);\n\n await this.applyErrorInterceptors(error, config);\n throw error;\n }\n\n protected async processResponse<T>(response: Response, config: RequestConfig): Promise<T> {\n if (!response.ok) {\n await this.handleErrorResponse(response, config);\n }\n\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes(MIME_TYPES.JSON)) {\n const result: ApiResult<T> = await response.json();\n\n if (!SUCCESS_CODES.includes(result.code) && !SUCCESS_CODES.includes(String(result.code))) {\n throw SdkError.fromApiResult(result, response.status);\n }\n\n return result.data;\n }\n\n if (contentType?.includes('text/')) {\n return (await response.text()) as unknown as T;\n }\n\n return await response.json() as T;\n }\n\n protected async executeFetch(\n url: string,\n options: {\n method: string;\n headers: HttpHeaders;\n body?: string | BodyInit | null;\n timeout: number;\n signal?: AbortSignal;\n }\n ): Promise<Response> {\n const controller = new AbortController();\n let timedOut = false;\n const timeoutId = setTimeout(() => {\n timedOut = true;\n controller.abort();\n }, options.timeout);\n\n const abortHandler = () => controller.abort();\n\n if (options.signal) {\n if (options.signal.aborted) {\n controller.abort();\n } else {\n options.signal.addEventListener('abort', abortHandler, { once: true });\n }\n }\n\n try {\n this.logger.debug(`${options.method} ${url}`);\n\n const response = await fetch(url, {\n method: options.method,\n headers: options.headers,\n body: options.body,\n signal: controller.signal,\n });\n\n return response;\n } catch (error) {\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n if (timedOut) {\n throw new TimeoutError(`Request timeout after ${options.timeout}ms`, options.timeout);\n }\n throw new CancelledError('Request was cancelled');\n }\n throw new NetworkError(error.message);\n }\n\n throw new NetworkError('Unknown network error');\n } finally {\n clearTimeout(timeoutId);\n if (options.signal) {\n options.signal.removeEventListener('abort', abortHandler);\n }\n }\n }\n\n async execute<T>(config: RequestConfig): Promise<T> {\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n const serializedBody = this.serializeRequestBody(processedConfig.body, headers);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: serializedBody,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n abstract request<T>(path: string, options?: RequestOptions): Promise<T>;\n abstract get<T>(path: string, params?: QueryParams): Promise<T>;\n abstract post<T>(path: string, body?: unknown): Promise<T>;\n abstract put<T>(path: string, body?: unknown): Promise<T>;\n abstract delete<T>(path: string, body?: unknown): Promise<T>;\n abstract patch<T>(path: string, body?: unknown): Promise<T>;\n\n async upload<T>(path: string, options: UploadOptions): Promise<T> {\n const formData = new FormData();\n formData.append(options.fieldName ?? 'file', options.file);\n\n if (options.additionalData) {\n Object.entries(options.additionalData).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n\n const config: RequestConfig = {\n url: path,\n method: 'POST',\n body: formData,\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n delete headers['Content-Type'];\n\n const response = await this.executeFetch(url, {\n method: 'POST',\n headers,\n body: formData,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n return this.processResponse<T>(response, processedConfig);\n }\n\n async download(path: string, _options?: DownloadOptions): Promise<Blob> {\n const config: RequestConfig = {\n url: path,\n method: 'GET',\n skipAuth: false,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: 'GET',\n headers,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n return response.blob();\n }\n\n async *stream(path: string, options?: RequestOptions): AsyncIterable<string> {\n const config: RequestConfig = {\n url: path,\n method: options?.method ?? 'POST',\n body: options?.body,\n headers: options?.headers,\n skipAuth: options?.skipAuth,\n };\n\n const processedConfig = await this.applyRequestInterceptors(config);\n const url = this.buildBaseUrl(processedConfig.url, processedConfig.params);\n const headers = this.buildHeaders(processedConfig);\n\n const response = await this.executeFetch(url, {\n method: processedConfig.method,\n headers,\n body: processedConfig.body ? JSON.stringify(processedConfig.body) : undefined,\n timeout: processedConfig.timeout ?? this.config.timeout,\n signal: processedConfig.signal,\n });\n\n if (!response.ok) {\n await this.handleErrorResponse(response, processedConfig);\n }\n\n const reader = response.body?.getReader();\n if (!reader) {\n throw new NetworkError('No response body');\n }\n\n const decoder = new TextDecoder();\n let buffer = '';\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmedLine = line.trim();\n if (trimmedLine === '' || trimmedLine === 'data: [DONE]') continue;\n if (trimmedLine.startsWith('data: ')) {\n yield trimmedLine.slice(6);\n } else {\n yield trimmedLine;\n }\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n}\n\nexport function createBaseHttpClient(config: HttpClientOptions): BaseHttpClient {\n return new (class extends BaseHttpClient {\n async request<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const config: RequestConfig = {\n url: path,\n method: options.method ?? 'GET',\n headers: options.headers,\n params: options.params,\n body: options.body,\n timeout: options.timeout,\n signal: options.signal,\n skipAuth: options.skipAuth,\n };\n\n return withRetry(\n () => this.execute<T>(config),\n { ...this.config.retry, ...options.retry }\n );\n }\n\n async get<T>(path: string, params?: QueryParams): Promise<T> {\n return this.request<T>(path, { method: 'GET', params });\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'POST', body });\n }\n\n async put<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PUT', body });\n }\n\n async delete<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'DELETE', body });\n }\n\n async patch<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>(path, { method: 'PATCH', body });\n }\n })(config);\n}\n"],"names":["config"],"mappings":"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"}
|
package/dist/index.cjs
CHANGED
|
@@ -45,4 +45,5 @@ exports.isNetworkError = errors.isNetworkError;
|
|
|
45
45
|
exports.isRetryableError = errors.isRetryableError;
|
|
46
46
|
exports.isSdkError = errors.isSdkError;
|
|
47
47
|
exports.BaseHttpClient = baseClient.BaseHttpClient;
|
|
48
|
+
exports.createBaseHttpClient = baseClient.createBaseHttpClient;
|
|
48
49
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,6 +6,6 @@ export { createLogger, noopLogger, createCacheStore, generateCacheKey, withRetry
|
|
|
6
6
|
export type { Logger, CacheStore, } from './utils';
|
|
7
7
|
export { SdkError, NetworkError, TimeoutError, AuthenticationError, TokenExpiredError, ForbiddenError, NotFoundError, ValidationError, RateLimitError, ServerError, CancelledError, isSdkError, isNetworkError, isAuthError, isRetryableError, } from './errors';
|
|
8
8
|
export type { ErrorCode, ErrorDetail } from './errors';
|
|
9
|
-
export { BaseHttpClient } from './http';
|
|
10
|
-
export type { HttpClientOptions } from './http';
|
|
9
|
+
export { BaseHttpClient, createBaseHttpClient } from './http';
|
|
10
|
+
export type { HttpClientOptions, HttpClientAuthConfig, RequestExecutor, ResponseProcessor, UrlBuilder, HeaderBuilder, } from './http';
|
|
11
11
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,GACV,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,MAAM,EACN,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,UAAU,EACV,QAAQ,EACR,WAAW,EACX,WAAW,EACX,SAAS,EACT,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,WAAW,EACX,UAAU,EACV,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,GACV,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,WAAW,EACX,UAAU,GACX,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,gBAAgB,EAChB,YAAY,EACZ,eAAe,GAChB,MAAM,QAAQ,CAAC;AAEhB,YAAY,EACV,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,WAAW,GACZ,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,KAAK,EACL,cAAc,EACd,iBAAiB,GAClB,MAAM,SAAS,CAAC;AAEjB,YAAY,EACV,MAAM,EACN,UAAU,GACX,MAAM,SAAS,CAAC;AAEjB,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,aAAa,EACb,eAAe,EACf,cAAc,EACd,WAAW,EACX,cAAc,EACd,UAAU,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvD,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC9D,YAAY,EACV,iBAAiB,EACjB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,QAAQ,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@ import { calculateDelay, createRetryConfig, sleep, withRetry } from "./utils/ret
|
|
|
6
6
|
import "./utils/string.js";
|
|
7
7
|
import "./utils/encoding.js";
|
|
8
8
|
import { AuthenticationError, CancelledError, ForbiddenError, NetworkError, NotFoundError, RateLimitError, SdkError, ServerError, TimeoutError, TokenExpiredError, ValidationError, isAuthError, isNetworkError, isRetryableError, isSdkError } from "./errors.js";
|
|
9
|
-
import { BaseHttpClient } from "./http/base-client.js";
|
|
9
|
+
import { BaseHttpClient, createBaseHttpClient } from "./http/base-client.js";
|
|
10
10
|
export {
|
|
11
11
|
AuthenticationError,
|
|
12
12
|
BaseHttpClient,
|
|
@@ -30,6 +30,7 @@ export {
|
|
|
30
30
|
ValidationError,
|
|
31
31
|
buildAuthHeaders,
|
|
32
32
|
calculateDelay,
|
|
33
|
+
createBaseHttpClient,
|
|
33
34
|
createCacheStore,
|
|
34
35
|
createLogger,
|
|
35
36
|
createRetryConfig,
|
package/dist/utils/cache.cjs
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
5
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
6
3
|
const types = require("../core/types.cjs");
|
|
7
4
|
class MemoryCacheStore {
|
|
5
|
+
cache = /* @__PURE__ */ new Map();
|
|
6
|
+
maxSize;
|
|
7
|
+
defaultTtl;
|
|
8
8
|
constructor(config = {}) {
|
|
9
|
-
__publicField(this, "cache", /* @__PURE__ */ new Map());
|
|
10
|
-
__publicField(this, "maxSize");
|
|
11
|
-
__publicField(this, "defaultTtl");
|
|
12
9
|
this.maxSize = config.maxSize ?? types.DEFAULT_CACHE_CONFIG.maxSize;
|
|
13
10
|
this.defaultTtl = config.ttl ?? types.DEFAULT_CACHE_CONFIG.ttl;
|
|
14
11
|
}
|