@calimero-network/mero-js 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +443 -0
- package/dist/admin-api/admin-client.d.ts +38 -0
- package/dist/admin-api/admin-client.d.ts.map +1 -0
- package/dist/admin-api/admin-client.js +104 -0
- package/dist/admin-api/admin-client.js.map +1 -0
- package/dist/admin-api/admin-factory.d.ts +8 -0
- package/dist/admin-api/admin-factory.d.ts.map +1 -0
- package/dist/admin-api/admin-factory.js +42 -0
- package/dist/admin-api/admin-factory.js.map +1 -0
- package/dist/admin-api/admin-types.d.ts +213 -0
- package/dist/admin-api/admin-types.d.ts.map +1 -0
- package/dist/admin-api/admin-types.js +3 -0
- package/dist/admin-api/admin-types.js.map +1 -0
- package/dist/admin-api/index.d.ts +4 -0
- package/dist/admin-api/index.d.ts.map +1 -0
- package/dist/admin-api/index.js +5 -0
- package/dist/admin-api/index.js.map +1 -0
- package/dist/auth-api/auth-client.d.ts +34 -0
- package/dist/auth-api/auth-client.d.ts.map +1 -0
- package/dist/auth-api/auth-client.js +112 -0
- package/dist/auth-api/auth-client.js.map +1 -0
- package/dist/auth-api/auth-factory.d.ts +8 -0
- package/dist/auth-api/auth-factory.d.ts.map +1 -0
- package/dist/auth-api/auth-factory.js +42 -0
- package/dist/auth-api/auth-factory.js.map +1 -0
- package/dist/auth-api/auth-types.d.ts +127 -0
- package/dist/auth-api/auth-types.d.ts.map +1 -0
- package/dist/auth-api/auth-types.js +3 -0
- package/dist/auth-api/auth-types.js.map +1 -0
- package/dist/auth-api/index.d.ts +4 -0
- package/dist/auth-api/index.d.ts.map +1 -0
- package/dist/auth-api/index.js +5 -0
- package/dist/auth-api/index.js.map +1 -0
- package/dist/http-client/api-response.d.ts +16 -0
- package/dist/http-client/api-response.d.ts.map +1 -0
- package/dist/http-client/api-response.js +2 -0
- package/dist/http-client/api-response.js.map +1 -0
- package/dist/http-client/http-factory.d.ts +32 -0
- package/dist/http-client/http-factory.d.ts.map +1 -0
- package/dist/http-client/http-factory.js +52 -0
- package/dist/http-client/http-factory.js.map +1 -0
- package/dist/http-client/http-types.d.ts +42 -0
- package/dist/http-client/http-types.d.ts.map +1 -0
- package/dist/http-client/http-types.js +2 -0
- package/dist/http-client/http-types.js.map +1 -0
- package/dist/http-client/index.d.ts +8 -0
- package/dist/http-client/index.d.ts.map +1 -0
- package/dist/http-client/index.js +12 -0
- package/dist/http-client/index.js.map +1 -0
- package/dist/http-client/retry.d.ts +6 -0
- package/dist/http-client/retry.d.ts.map +1 -0
- package/dist/http-client/retry.js +83 -0
- package/dist/http-client/retry.js.map +1 -0
- package/dist/http-client/signal-utils.d.ts +3 -0
- package/dist/http-client/signal-utils.d.ts.map +1 -0
- package/dist/http-client/signal-utils.js +42 -0
- package/dist/http-client/signal-utils.js.map +1 -0
- package/dist/http-client/web-client.d.ts +38 -0
- package/dist/http-client/web-client.d.ts.map +1 -0
- package/dist/http-client/web-client.js +296 -0
- package/dist/http-client/web-client.js.map +1 -0
- package/dist/index.browser.mjs +2 -0
- package/dist/index.browser.mjs.map +7 -0
- package/dist/index.cjs +995 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +973 -0
- package/dist/index.mjs.map +7 -0
- package/dist/mero-js.d.ts +77 -0
- package/dist/mero-js.d.ts.map +1 -0
- package/dist/mero-js.js +175 -0
- package/dist/mero-js.js.map +1 -0
- package/dist/types/api-response.d.ts +16 -0
- package/dist/types/api-response.d.ts.map +1 -0
- package/dist/types/api-response.js +2 -0
- package/dist/types/api-response.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Transport, HttpClient } from './http-types';
|
|
2
|
+
export declare function createHttpClient(transport: Transport): HttpClient;
|
|
3
|
+
export declare function createBrowserHttpClient(options: {
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
getAuthToken?: () => Promise<string | undefined>;
|
|
6
|
+
onTokenRefresh?: (newToken: string) => Promise<void>;
|
|
7
|
+
defaultHeaders?: Record<string, string>;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
credentials?: RequestCredentials;
|
|
10
|
+
defaultAbortSignal?: AbortSignal;
|
|
11
|
+
}): HttpClient;
|
|
12
|
+
export declare function createNodeHttpClient(options: {
|
|
13
|
+
baseUrl: string;
|
|
14
|
+
fetch?: typeof fetch;
|
|
15
|
+
getAuthToken?: () => Promise<string | undefined>;
|
|
16
|
+
onTokenRefresh?: (newToken: string) => Promise<void>;
|
|
17
|
+
defaultHeaders?: Record<string, string>;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
credentials?: RequestCredentials;
|
|
20
|
+
defaultAbortSignal?: AbortSignal;
|
|
21
|
+
}): HttpClient;
|
|
22
|
+
export declare function createUniversalHttpClient(options: {
|
|
23
|
+
baseUrl: string;
|
|
24
|
+
fetch?: typeof fetch;
|
|
25
|
+
getAuthToken?: () => Promise<string | undefined>;
|
|
26
|
+
onTokenRefresh?: (newToken: string) => Promise<void>;
|
|
27
|
+
defaultHeaders?: Record<string, string>;
|
|
28
|
+
timeoutMs?: number;
|
|
29
|
+
credentials?: RequestCredentials;
|
|
30
|
+
defaultAbortSignal?: AbortSignal;
|
|
31
|
+
}): HttpClient;
|
|
32
|
+
//# sourceMappingURL=http-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-factory.d.ts","sourceRoot":"","sources":["../../src/http-client/http-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAGrD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAEjE;AAGD,wBAAgB,uBAAuB,CAAC,OAAO,EAAE;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CAab;AAGD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CAuBb;AAGD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC,GAAG,UAAU,CASb"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { WebHttpClient } from './web-client';
|
|
2
|
+
// Factory function to create HTTP client with sensible defaults
|
|
3
|
+
export function createHttpClient(transport) {
|
|
4
|
+
return new WebHttpClient(transport);
|
|
5
|
+
}
|
|
6
|
+
// Factory function for browser environments
|
|
7
|
+
export function createBrowserHttpClient(options) {
|
|
8
|
+
const transport = {
|
|
9
|
+
fetch: globalThis.fetch,
|
|
10
|
+
baseUrl: options.baseUrl,
|
|
11
|
+
getAuthToken: options.getAuthToken,
|
|
12
|
+
onTokenRefresh: options.onTokenRefresh,
|
|
13
|
+
defaultHeaders: options.defaultHeaders,
|
|
14
|
+
timeoutMs: options.timeoutMs,
|
|
15
|
+
credentials: options.credentials,
|
|
16
|
+
defaultAbortSignal: options.defaultAbortSignal,
|
|
17
|
+
};
|
|
18
|
+
return createHttpClient(transport);
|
|
19
|
+
}
|
|
20
|
+
// Factory function for Node.js environments
|
|
21
|
+
export function createNodeHttpClient(options) {
|
|
22
|
+
// Use provided fetch or try to use global fetch (Node 18+)
|
|
23
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
24
|
+
if (!fetchImpl) {
|
|
25
|
+
throw new Error('No fetch implementation available. Please provide a fetch implementation ' +
|
|
26
|
+
'(e.g., undici.fetch) or use Node.js 18+ which has native fetch support.');
|
|
27
|
+
}
|
|
28
|
+
const transport = {
|
|
29
|
+
fetch: fetchImpl,
|
|
30
|
+
baseUrl: options.baseUrl,
|
|
31
|
+
getAuthToken: options.getAuthToken,
|
|
32
|
+
onTokenRefresh: options.onTokenRefresh,
|
|
33
|
+
defaultHeaders: options.defaultHeaders,
|
|
34
|
+
timeoutMs: options.timeoutMs,
|
|
35
|
+
credentials: options.credentials,
|
|
36
|
+
defaultAbortSignal: options.defaultAbortSignal,
|
|
37
|
+
};
|
|
38
|
+
return createHttpClient(transport);
|
|
39
|
+
}
|
|
40
|
+
// Universal factory that works in both environments
|
|
41
|
+
export function createUniversalHttpClient(options) {
|
|
42
|
+
// Try to detect environment and use appropriate factory
|
|
43
|
+
if (typeof window !== 'undefined') {
|
|
44
|
+
// Browser environment
|
|
45
|
+
return createBrowserHttpClient(options);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Node.js environment
|
|
49
|
+
return createNodeHttpClient(options);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=http-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-factory.js","sourceRoot":"","sources":["../../src/http-client/http-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAAC,SAAoB;IACnD,OAAO,IAAI,aAAa,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,uBAAuB,CAAC,OAQvC;IACC,MAAM,SAAS,GAAc;QAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KAC/C,CAAC;IAEF,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,oBAAoB,CAAC,OASpC;IACC,2DAA2D;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC;IAEpD,IAAI,CAAC,SAAS,EAAE;QACd,MAAM,IAAI,KAAK,CACb,2EAA2E;YACzE,yEAAyE,CAC5E,CAAC;KACH;IAED,MAAM,SAAS,GAAc;QAC3B,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KAC/C,CAAC;IAEF,OAAO,gBAAgB,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,yBAAyB,CAAC,OASzC;IACC,wDAAwD;IACxD,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;QACjC,sBAAsB;QACtB,OAAO,uBAAuB,CAAC,OAAO,CAAC,CAAC;KACzC;SAAM;QACL,sBAAsB;QACtB,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;KACtC;AACH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export type FetchLike = (input: RequestInfo, init?: RequestInit) => Promise<Response>;
|
|
2
|
+
export interface Transport {
|
|
3
|
+
fetch: FetchLike;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
defaultHeaders?: Record<string, string>;
|
|
6
|
+
getAuthToken?: () => Promise<string | undefined>;
|
|
7
|
+
onTokenRefresh?: (newToken: string) => Promise<void>;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
credentials?: RequestCredentials;
|
|
10
|
+
defaultAbortSignal?: AbortSignal;
|
|
11
|
+
}
|
|
12
|
+
export type ResponseParser = 'json' | 'text' | 'blob' | 'arrayBuffer' | 'response';
|
|
13
|
+
export interface RequestOptions extends RequestInit {
|
|
14
|
+
parse?: ResponseParser;
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
export interface HttpClient {
|
|
18
|
+
get<T>(path: string, init?: RequestOptions): Promise<T>;
|
|
19
|
+
post<T>(path: string, body?: unknown, init?: RequestOptions): Promise<T>;
|
|
20
|
+
put<T>(path: string, body?: unknown, init?: RequestOptions): Promise<T>;
|
|
21
|
+
delete<T>(path: string, init?: RequestOptions): Promise<T>;
|
|
22
|
+
patch<T>(path: string, body?: unknown, init?: RequestOptions): Promise<T>;
|
|
23
|
+
head(path: string, init?: RequestOptions): Promise<{
|
|
24
|
+
headers: Record<string, string>;
|
|
25
|
+
status: number;
|
|
26
|
+
}>;
|
|
27
|
+
request<T>(path: string, init?: RequestOptions): Promise<T>;
|
|
28
|
+
}
|
|
29
|
+
export interface Header {
|
|
30
|
+
[key: string]: string;
|
|
31
|
+
}
|
|
32
|
+
export interface ProgressCallback {
|
|
33
|
+
(progress: number): void;
|
|
34
|
+
}
|
|
35
|
+
export interface HeadResponse {
|
|
36
|
+
headers: Record<string, string>;
|
|
37
|
+
status: number;
|
|
38
|
+
}
|
|
39
|
+
export interface LegacyRequestOptions {
|
|
40
|
+
responseType?: 'arraybuffer' | 'blob' | 'json';
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=http-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-types.d.ts","sourceRoot":"","sources":["../../src/http-client/http-types.ts"],"names":[],"mappings":"AACA,MAAM,MAAM,SAAS,GAAG,CACtB,KAAK,EAAE,WAAW,EAClB,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC;AAEvB,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,SAAS,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACjD,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,kBAAkB,CAAC,EAAE,WAAW,CAAC;CAClC;AAGD,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,MAAM,GACN,MAAM,GACN,aAAa,GACb,UAAU,CAAC;AAEf,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzE,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3D,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1E,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAC7D;AAGD,MAAM,WAAW,MAAM;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,MAAM,CAAC;CAChD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-types.js","sourceRoot":"","sources":["../../src/http-client/http-types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './http-types';
|
|
2
|
+
export * from './api-response';
|
|
3
|
+
export { WebHttpClient, HTTPError } from './web-client';
|
|
4
|
+
export { createHttpClient, createBrowserHttpClient, createNodeHttpClient, createUniversalHttpClient, } from './http-factory';
|
|
5
|
+
export { withRetry, createRetryableMethod } from './retry';
|
|
6
|
+
export type { RetryOptions } from './retry';
|
|
7
|
+
export { combineSignals, createTimeoutSignal } from './signal-utils';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http-client/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGxD,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAC3D,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// HTTP client types and interfaces
|
|
2
|
+
export * from './http-types';
|
|
3
|
+
export * from './api-response';
|
|
4
|
+
// Web Standards HTTP client implementation
|
|
5
|
+
export { WebHttpClient, HTTPError } from './web-client';
|
|
6
|
+
// Factory functions for easy client creation
|
|
7
|
+
export { createHttpClient, createBrowserHttpClient, createNodeHttpClient, createUniversalHttpClient, } from './http-factory';
|
|
8
|
+
// Retry functionality
|
|
9
|
+
export { withRetry, createRetryableMethod } from './retry';
|
|
10
|
+
// Signal utilities
|
|
11
|
+
export { combineSignals, createTimeoutSignal } from './signal-utils';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http-client/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AACnC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAE/B,2CAA2C;AAC3C,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAExD,6CAA6C;AAC7C,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AAExB,sBAAsB;AACtB,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAG3D,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface RetryOptions {
|
|
2
|
+
attempts?: number;
|
|
3
|
+
}
|
|
4
|
+
export declare function withRetry<T>(fn: (attempt: number) => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
5
|
+
export declare function createRetryableMethod<T extends unknown[], R>(method: (...args: T) => Promise<R>, retryOptions?: RetryOptions): (...args: T) => Promise<R>;
|
|
6
|
+
//# sourceMappingURL=retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/http-client/retry.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAsDD,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACnC,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,CAAC,CAAC,CA6CZ;AAGD,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,EAAE,EAAE,CAAC,EAC1D,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAClC,YAAY,GAAE,YAAiB,aAER,CAAC,KAAG,QAAQ,CAAC,CAAC,CAGtC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Default retry condition - retry on network errors and 5xx status codes
|
|
2
|
+
function defaultRetryCondition(error, attempt) {
|
|
3
|
+
// Don't retry on the last attempt
|
|
4
|
+
if (attempt <= 0)
|
|
5
|
+
return false;
|
|
6
|
+
// Distinguish timeout vs. user abort:
|
|
7
|
+
// - Timeout: name === 'TimeoutError' (per spec/platforms)
|
|
8
|
+
// - User abort: name === 'AbortError'
|
|
9
|
+
const errorWithName = error;
|
|
10
|
+
const name = errorWithName?.name;
|
|
11
|
+
if (name === 'TimeoutError')
|
|
12
|
+
return true;
|
|
13
|
+
if (name === 'AbortError')
|
|
14
|
+
return false;
|
|
15
|
+
// HTTP 5xx and 429 (including HTTPError from web-client)
|
|
16
|
+
const errorWithStatus = error;
|
|
17
|
+
if ('status' in errorWithStatus &&
|
|
18
|
+
typeof errorWithStatus.status === 'number') {
|
|
19
|
+
const status = errorWithStatus.status;
|
|
20
|
+
return status >= 500 || status === 429;
|
|
21
|
+
}
|
|
22
|
+
// Network TypeError (DNS/reset) is reasonably retryable
|
|
23
|
+
if (name === 'TypeError')
|
|
24
|
+
return true;
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
// Calculate delay with exponential backoff and jitter
|
|
28
|
+
function calculateDelay(attempt) {
|
|
29
|
+
const baseDelayMs = 250; // Base 250ms as per spec
|
|
30
|
+
const delay = baseDelayMs * Math.pow(2, attempt - 1);
|
|
31
|
+
// Add ±20% jitter to reduce stampedes
|
|
32
|
+
const jitter = (Math.random() - 0.5) * 0.4 * delay;
|
|
33
|
+
return Math.max(0, delay + jitter);
|
|
34
|
+
}
|
|
35
|
+
// Retry helper function with new signature
|
|
36
|
+
export async function withRetry(fn, options = {}) {
|
|
37
|
+
const { attempts = 3 } = options;
|
|
38
|
+
let lastError;
|
|
39
|
+
for (let attempt = 1; attempt <= attempts; attempt++) {
|
|
40
|
+
try {
|
|
41
|
+
return await fn(attempt);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
lastError = error;
|
|
45
|
+
// Check if we should retry (this handles the last attempt check)
|
|
46
|
+
if (!defaultRetryCondition(lastError, attempts - attempt)) {
|
|
47
|
+
throw lastError;
|
|
48
|
+
}
|
|
49
|
+
// Calculate delay
|
|
50
|
+
let delayMs = calculateDelay(attempt);
|
|
51
|
+
// Check for Retry-After header if it's an HTTP error
|
|
52
|
+
const errorWithHeaders = lastError;
|
|
53
|
+
const hdrs = errorWithHeaders.headers;
|
|
54
|
+
const retryAfter = hdrs?.get?.('Retry-After');
|
|
55
|
+
if (retryAfter) {
|
|
56
|
+
// If it's a number, treat as seconds
|
|
57
|
+
const seconds = parseInt(retryAfter, 10);
|
|
58
|
+
if (!isNaN(seconds)) {
|
|
59
|
+
delayMs = Math.max(delayMs, seconds * 1000);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// If it's a date, calculate the difference
|
|
63
|
+
const date = new Date(retryAfter);
|
|
64
|
+
if (!isNaN(date.getTime())) {
|
|
65
|
+
const waitTime = Math.max(0, date.getTime() - Date.now());
|
|
66
|
+
// Cap wait at 60s per attempt as per spec
|
|
67
|
+
delayMs = Math.max(delayMs, Math.min(waitTime, 60000));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Wait before retrying
|
|
72
|
+
await new Promise((resolve) => setTimeout(resolve, delayMs));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
throw lastError || new Error('Retry failed without error');
|
|
76
|
+
}
|
|
77
|
+
// Helper to create a retry-enabled HTTP client method
|
|
78
|
+
export function createRetryableMethod(method, retryOptions = {}) {
|
|
79
|
+
return async (...args) => {
|
|
80
|
+
return withRetry(() => method(...args), retryOptions);
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/http-client/retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-utils.d.ts","sourceRoot":"","sources":["../../src/http-client/signal-utils.ts"],"names":[],"mappings":"AACA,wBAAgB,cAAc,CAC5B,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,GACtC,WAAW,GAAG,SAAS,CA4BzB;AAGD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAalE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// Utility for combining multiple AbortSignals
|
|
2
|
+
export function combineSignals(signals) {
|
|
3
|
+
const list = signals.filter(Boolean);
|
|
4
|
+
if (list.length === 0)
|
|
5
|
+
return undefined;
|
|
6
|
+
// Prefer native any(), but fall back if unavailable or it throws
|
|
7
|
+
const AbortSignalAny = AbortSignal;
|
|
8
|
+
if (typeof AbortSignalAny.any === 'function') {
|
|
9
|
+
try {
|
|
10
|
+
return AbortSignalAny.any(list);
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// Fall through to manual implementation
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
const onAbort = (evt) => {
|
|
18
|
+
controller.abort(evt.target.reason);
|
|
19
|
+
for (const s of list)
|
|
20
|
+
s.removeEventListener('abort', onAbort);
|
|
21
|
+
};
|
|
22
|
+
for (const s of list) {
|
|
23
|
+
if (s.aborted)
|
|
24
|
+
return AbortSignal.abort(s.reason);
|
|
25
|
+
s.addEventListener('abort', onAbort, { once: true });
|
|
26
|
+
}
|
|
27
|
+
return controller.signal;
|
|
28
|
+
}
|
|
29
|
+
// Helper to create a timeout signal
|
|
30
|
+
export function createTimeoutSignal(timeoutMs) {
|
|
31
|
+
// Use AbortSignal.timeout if available (Node 18.17+, modern browsers)
|
|
32
|
+
if (typeof AbortSignal.timeout === 'function') {
|
|
33
|
+
return AbortSignal.timeout(timeoutMs);
|
|
34
|
+
}
|
|
35
|
+
// Fallback for older environments
|
|
36
|
+
const controller = new AbortController();
|
|
37
|
+
setTimeout(() => {
|
|
38
|
+
controller.abort(new DOMException('Timeout', 'TimeoutError'));
|
|
39
|
+
}, timeoutMs);
|
|
40
|
+
return controller.signal;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=signal-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signal-utils.js","sourceRoot":"","sources":["../../src/http-client/signal-utils.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,MAAM,UAAU,cAAc,CAC5B,OAAuC;IAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAkB,CAAC;IACtD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAExC,iEAAiE;IACjE,MAAM,cAAc,GAAG,WAEtB,CAAC;IACF,IAAI,OAAO,cAAc,CAAC,GAAG,KAAK,UAAU,EAAE;QAC5C,IAAI;YACF,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACjC;QAAC,MAAM;YACN,wCAAwC;SACzC;KACF;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,CAAC,GAAU,EAAE,EAAE;QAC7B,UAAU,CAAC,KAAK,CAAE,GAAG,CAAC,MAAsB,CAAC,MAAM,CAAC,CAAC;QACrD,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;QACpB,IAAI,CAAC,CAAC,OAAO;YAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;KACtD;IAED,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,mBAAmB,CAAC,SAAiB;IACnD,sEAAsE;IACtE,IAAI,OAAO,WAAW,CAAC,OAAO,KAAK,UAAU,EAAE;QAC7C,OAAO,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;KACvC;IAED,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,UAAU,CAAC,GAAG,EAAE;QACd,UAAU,CAAC,KAAK,CAAC,IAAI,YAAY,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;IAChE,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,OAAO,UAAU,CAAC,MAAM,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { HttpClient, Transport, RequestOptions } from './http-types';
|
|
2
|
+
export declare class HTTPError extends Error {
|
|
3
|
+
status: number;
|
|
4
|
+
statusText: string;
|
|
5
|
+
url: string;
|
|
6
|
+
headers: Headers;
|
|
7
|
+
bodyText?: string;
|
|
8
|
+
name: "HTTPError";
|
|
9
|
+
constructor(status: number, statusText: string, url: string, headers: Headers, bodyText?: string);
|
|
10
|
+
toJSON(): {
|
|
11
|
+
status: number;
|
|
12
|
+
statusText: string;
|
|
13
|
+
url: string;
|
|
14
|
+
headers: Record<string, string>;
|
|
15
|
+
bodyText?: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export declare class WebHttpClient implements HttpClient {
|
|
19
|
+
private transport;
|
|
20
|
+
constructor(transport: Transport);
|
|
21
|
+
get<T>(path: string, init?: RequestOptions): Promise<T>;
|
|
22
|
+
post<T>(path: string, body?: unknown, init?: RequestOptions): Promise<T>;
|
|
23
|
+
put<T>(path: string, body?: unknown, init?: RequestOptions): Promise<T>;
|
|
24
|
+
delete<T>(path: string, init?: RequestOptions): Promise<T>;
|
|
25
|
+
patch<T>(path: string, body?: unknown, init?: RequestOptions): Promise<T>;
|
|
26
|
+
head(path: string, init?: RequestOptions): Promise<{
|
|
27
|
+
headers: Record<string, string>;
|
|
28
|
+
status: number;
|
|
29
|
+
}>;
|
|
30
|
+
request<T>(path: string, init?: RequestOptions): Promise<T>;
|
|
31
|
+
private makeRequest;
|
|
32
|
+
private buildUrl;
|
|
33
|
+
private createAbortSignal;
|
|
34
|
+
private buildHeaders;
|
|
35
|
+
private parseResponse;
|
|
36
|
+
private getBodyText;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=web-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web-client.d.ts","sourceRoot":"","sources":["../../src/http-client/web-client.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,SAAS,EACT,cAAc,EAEf,MAAM,cAAc,CAAC;AAItB,qBAAa,SAAU,SAAQ,KAAK;IAIzB,MAAM,EAAE,MAAM;IACd,UAAU,EAAE,MAAM;IAClB,GAAG,EAAE,MAAM;IACX,OAAO,EAAE,OAAO;IAChB,QAAQ,CAAC,EAAE,MAAM;IAP1B,IAAI,cAAwB;gBAGnB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,EAChB,QAAQ,CAAC,EAAE,MAAM;IAK1B,MAAM,IAAI;QACR,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;CASF;AAYD,qBAAa,aAAc,YAAW,UAAU;IAClC,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAElC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAIvD,IAAI,CAAC,CAAC,EACV,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,CAAC,CAAC;IAYP,GAAG,CAAC,CAAC,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,CAAC,CAAC;IAYP,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1D,KAAK,CAAC,CAAC,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC,CAAC,CAAC;IAYP,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,cAAc,GACpB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAYzD,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC;YAInD,WAAW;IAyJzB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,iBAAiB;YAyBX,YAAY;YAqCZ,aAAa;YAmBb,WAAW;CAQ1B"}
|