universal-client 0.0.9-rc.1

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.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Kevin Bonnoron
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,70 @@
1
+ # Universal Client
2
+
3
+ A flexible and extensible universal client for web applications supporting multiple transport protocols (HTTP, WebSocket, Server-Sent Events) inspired by @ngrx/signals syntax.
4
+
5
+ ## Features
6
+
7
+ - ๐Ÿ”Œ Multiple transport protocols support (HTTP, WebSocket, SSE)
8
+ - ๐ŸŽฃ Hooks system
9
+ - ๐Ÿ› ๏ธ Extensible through features
10
+ - ๐Ÿ”ง Configurable through delegates
11
+ - ๐Ÿ“ฆ Tree-shakeable
12
+ - ๐Ÿฆพ Fully typed
13
+
14
+ ## Installation
15
+
16
+ **๐Ÿ“ฆ npm**
17
+ ```bash
18
+ npm install universal-client
19
+ ```
20
+
21
+ **๐Ÿงถ yarn**
22
+ ```bash
23
+ yarn add universal-client
24
+ ```
25
+
26
+ **๐Ÿ“Œ pnpm**
27
+ ```bash
28
+ pnpm add universal-client
29
+ ```
30
+
31
+ **๐Ÿž bun**
32
+ ```bash
33
+ bun add universal-client
34
+ ```
35
+
36
+ **๐Ÿฆ• deno & JSR**
37
+ ```bash
38
+ deno add @kevinbonnoron/universal-client
39
+ ```
40
+
41
+ > **Note**: On JSR, the package is published as `@kevinbonnoron/universal-client` (scoped), but on npm it's `universal-client` (unscoped).
42
+
43
+ ## Quick Start
44
+
45
+ ```ts
46
+ import { universalClient, withDelegate, withMethods } from 'universal-client';
47
+
48
+ const client = universalClient(
49
+ // Can use axios, fetch or better-fetch as implementation
50
+ withDelegate({ type: 'http', impl: 'axios', baseURL: 'https://jsonplaceholder.typicode.com' }),
51
+ withMethods(({ delegate }) => ({
52
+ getUser: (id: string) => delegate.get(`/users/${id}`),
53
+ })),
54
+ );
55
+
56
+ const user = await client.getUser('1');
57
+ console.log(user);
58
+ ```
59
+
60
+ ## Examples
61
+
62
+ Check out the [`examples/`](./examples) directory for comprehensive TypeScript examples:
63
+
64
+ - **[Basic Usage](./examples/basic-usage.md)** - HTTP requests, CRUD operations, error handling with complete type safety
65
+ - **[WebSocket](./examples/websocket-example.md)** - Real-time communication with typed message handling
66
+ - **[Server-Sent Events](./examples/sse-example.md)** - Receiving real-time updates with custom event types
67
+ - **[Interceptors](./examples/interceptor-example.md)** - Transform requests/responses, add auth, convert dates, handle errors
68
+ - **[Advanced Features](./examples/advanced-features.md)** - Production-ready patterns: hooks, caching, authentication, retry logic
69
+
70
+ Each example includes complete TypeScript code with detailed explanations, type definitions, and real-world usage patterns.
@@ -0,0 +1,260 @@
1
+ interface HttpRequestOptions {
2
+ headers?: Record<string, string>;
3
+ params?: Record<string, string>;
4
+ }
5
+ type HttpDelegate = {
6
+ get<T>(url: string, options?: HttpRequestOptions): Promise<T>;
7
+ post<T>(url: string, body: unknown, options?: HttpRequestOptions): Promise<T>;
8
+ patch<T>(url: string, body: unknown, options?: HttpRequestOptions): Promise<T>;
9
+ put<T>(url: string, body: unknown, options?: HttpRequestOptions): Promise<T>;
10
+ delete<T>(url: string, options?: HttpRequestOptions): Promise<T>;
11
+ };
12
+ interface WebSocketDelegate {
13
+ connect(): void;
14
+ send(message: unknown): void;
15
+ close(): void;
16
+ onOpen(callback: (event: Event) => void): () => void;
17
+ onClose(callback: (event: CloseEvent) => void): () => void;
18
+ onError(callback: (event: Event) => void): () => void;
19
+ onMessage(callback: (data: unknown) => void): () => void;
20
+ }
21
+ interface ServerSentEventDelegate {
22
+ close(): void;
23
+ onOpen(callback: (event: Event) => void): () => void;
24
+ onError(callback: (event: Event) => void): () => void;
25
+ onMessage(callback: (data: unknown) => void): () => void;
26
+ subscribe(event: string, callback: (data: unknown) => void): () => void;
27
+ }
28
+ type Delegate = HttpDelegate | WebSocketDelegate | ServerSentEventDelegate;
29
+
30
+ type Feature<Input = unknown, Output = Input> = (input: Input) => Output;
31
+
32
+ type DelegateFeature<O = {
33
+ delegate: Delegate;
34
+ }> = Feature<{
35
+ delegate: Delegate;
36
+ }, O & {
37
+ delegate: Delegate;
38
+ }>;
39
+
40
+ interface Hooks$1 {
41
+ onInit?: (...args: unknown[]) => void;
42
+ onRequest?: (...args: unknown[]) => void;
43
+ onResponse?: (...args: unknown[]) => void;
44
+ onError?: (...args: unknown[]) => void;
45
+ }
46
+ interface HooksInternal {
47
+ __hooks: {
48
+ [K in keyof Hooks$1]: Hooks$1[K][];
49
+ };
50
+ }
51
+
52
+ type CreateAxiosDelegateOptions = {
53
+ type: 'http';
54
+ impl: 'axios';
55
+ baseURL: string;
56
+ [key: string]: unknown;
57
+ };
58
+ type CreateBetterFetchDelegateOptions = {
59
+ type: 'http';
60
+ impl: 'better-fetch';
61
+ baseURL: string;
62
+ [key: string]: unknown;
63
+ };
64
+ interface CreateFetchDelegateOptions extends RequestInit {
65
+ type: 'http';
66
+ impl?: 'fetch';
67
+ baseURL: string;
68
+ format?: 'json' | 'text' | 'raw';
69
+ }
70
+
71
+ type HttpDelegateOptions = CreateFetchDelegateOptions | CreateBetterFetchDelegateOptions | CreateAxiosDelegateOptions;
72
+
73
+ interface CreateServerSentEventDelegateOptions {
74
+ baseURL: string;
75
+ }
76
+ type ServerSentEventDelegateOptions = {
77
+ type: 'server-sent-event';
78
+ } & CreateServerSentEventDelegateOptions;
79
+
80
+ interface CreateWebSocketDelegateOptions {
81
+ baseURL: string;
82
+ protocols?: string | string[];
83
+ reconnectInterval?: number;
84
+ maxReconnectAttempts?: number;
85
+ }
86
+ type WebSocketDelegateOptions = {
87
+ type: 'websocket';
88
+ } & CreateWebSocketDelegateOptions;
89
+
90
+ type DelegateOptions = HttpDelegateOptions | WebSocketDelegateOptions | ServerSentEventDelegateOptions;
91
+
92
+ /**
93
+ * Context for request interception, allows modifying request properties
94
+ */
95
+ interface RequestInterceptorContext {
96
+ method: string;
97
+ url: string;
98
+ headers?: Record<string, string>;
99
+ body?: unknown;
100
+ }
101
+ /**
102
+ * Context for response interception
103
+ */
104
+ interface ResponseInterceptorContext<T = unknown> {
105
+ method: string;
106
+ url: string;
107
+ result: T;
108
+ body?: unknown;
109
+ }
110
+ /**
111
+ * Interceptor for HTTP delegate methods
112
+ */
113
+ interface HttpInterceptor {
114
+ before?: (context: RequestInterceptorContext) => undefined | Partial<RequestInterceptorContext> | Promise<undefined | Partial<RequestInterceptorContext>>;
115
+ after?: <T>(context: ResponseInterceptorContext<T>) => T | Promise<T>;
116
+ error?: (method: string, url: string, error: Error, body?: unknown) => void | Promise<void>;
117
+ }
118
+
119
+ type DelegateFromOptions<O extends DelegateOptions> = O['type'] extends 'http' ? HttpDelegate : O['type'] extends 'websocket' ? WebSocketDelegate : O['type'] extends 'server-sent-event' ? ServerSentEventDelegate : never;
120
+ /**
121
+ * Add a delegate to the client.
122
+ *
123
+ * @param options - The options for the delegate.
124
+ * @param features - The features to apply to the delegate.
125
+ * @returns A feature that returns the delegate.
126
+ */
127
+ declare function withDelegate<const Options extends DelegateOptions & {
128
+ name: string;
129
+ }>(options: Options, ...features: DelegateFeature[]): Feature<unknown, {
130
+ [key in Options['name']]: DelegateFromOptions<Options>;
131
+ }>;
132
+ declare function withDelegate<const Options extends DelegateOptions>(options: Options, ...features: DelegateFeature[]): Feature<unknown, {
133
+ delegate: DelegateFromOptions<Options>;
134
+ }>;
135
+
136
+ interface Hooks<Input> {
137
+ onInit?: (input: Input) => void;
138
+ }
139
+ /**
140
+ * Add hooks to the client.
141
+ *
142
+ * @param hooks - The hooks to be used in the feature.
143
+ * @returns A feature that returns the hooks.
144
+ */
145
+ declare function withHooks<H extends Hooks<Input>, Input>(hooks: H): Feature<Input, Input>;
146
+
147
+ /**
148
+ * Add methods to the client.
149
+ *
150
+ * @param methodCreator - The method creator to be used in the feature.
151
+ * @returns A feature that returns the methods.
152
+ */
153
+ declare function withMethods<Methods, Input>(methodCreator: (input: Input) => Methods): Feature<Input, Methods & Input>;
154
+
155
+ type Environments = Record<string, string>;
156
+ interface EnvironmentsConfig<Input, Environment extends Environments = Environments> {
157
+ name: keyof Input;
158
+ environments: Environment;
159
+ default?: keyof Environment;
160
+ fallback?: keyof Environment;
161
+ }
162
+ interface EnvironmentManager<Environment extends Environments> {
163
+ getCurrentEnvironment(): keyof Environment;
164
+ setEnvironment(env: keyof Environment): void;
165
+ getBaseURL(): string;
166
+ }
167
+ declare function withEnvironments<Input, Environment extends Environments>(config: EnvironmentsConfig<Input, Environment>): Feature<Input, Input & {
168
+ environments: EnvironmentManager<Environment>;
169
+ }>;
170
+
171
+ interface InterceptorConfig {
172
+ name?: string;
173
+ interceptor: HttpInterceptor;
174
+ }
175
+ /**
176
+ * Add HTTP interceptor to the delegate.
177
+ *
178
+ * @param config - The interceptor configuration.
179
+ * @returns A delegate feature that wraps the HTTP delegate with the interceptor.
180
+ */
181
+ declare function withInterceptor(config: InterceptorConfig): DelegateFeature;
182
+
183
+ interface OfflineConfig {
184
+ /**
185
+ * The strategy to use for the offline manager.
186
+ * @default 'cache-first'
187
+ */
188
+ strategy?: 'cache-first' | 'network-first' | 'network-only';
189
+ /**
190
+ * The TTL for the cache in milliseconds.
191
+ * @default 300000 (5 minutes)
192
+ */
193
+ cacheTTL?: number;
194
+ }
195
+ interface OfflineManager {
196
+ isOnline(): boolean;
197
+ clearCache(): void;
198
+ getCacheSize(): number;
199
+ }
200
+ declare function withOffline(config?: OfflineConfig): DelegateFeature<{
201
+ offline: OfflineManager;
202
+ }>;
203
+
204
+ interface TelemetryEvent {
205
+ timestamp: number;
206
+ type: 'request' | 'response' | 'error';
207
+ operation: string;
208
+ duration?: number;
209
+ status?: number;
210
+ error?: Error;
211
+ traceId?: string;
212
+ }
213
+ interface TelemetryMetrics {
214
+ requests: {
215
+ total: number;
216
+ success: number;
217
+ errors: number;
218
+ };
219
+ latency: {
220
+ avg: number;
221
+ min: number;
222
+ max: number;
223
+ };
224
+ }
225
+ interface TelemetryCollector {
226
+ recordEvent: (event: TelemetryEvent) => void;
227
+ generateTraceId: () => string | undefined;
228
+ getMetrics: () => TelemetryMetrics;
229
+ }
230
+ interface TelemetryOptions {
231
+ enableMetrics?: boolean;
232
+ enableTracing?: boolean;
233
+ enableLogging?: boolean;
234
+ onEvent?: (event: TelemetryEvent) => void;
235
+ onMetrics?: (metrics: TelemetryMetrics) => void;
236
+ }
237
+ declare function withTelemetry(options?: TelemetryOptions): DelegateFeature<{
238
+ telemetry: TelemetryCollector;
239
+ }>;
240
+
241
+ type Merge<A, B> = Omit<A, keyof B> & B;
242
+ /**
243
+ * Creates a universal client that combines multiple features.
244
+ *
245
+ * @param features - The features to be used in the client.
246
+ * @returns A universal client that combines multiple features.
247
+ */
248
+ declare function universalClient<A>(featureA: Feature<unknown, A>): A;
249
+ declare function universalClient<A, B>(featureA: Feature<unknown, A>, featureB: Feature<A, B>): Merge<A, B>;
250
+ declare function universalClient<A, B, C>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>): Merge<Merge<A, B>, C>;
251
+ declare function universalClient<A, B, C, D>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>): Merge<Merge<Merge<A, B>, C>, D>;
252
+ declare function universalClient<A, B, C, D, E>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>): Merge<Merge<Merge<Merge<A, B>, C>, D>, E>;
253
+ declare function universalClient<A, B, C, D, E, F>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>): Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>;
254
+ declare function universalClient<A, B, C, D, E, F, G>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>): Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>;
255
+ declare function universalClient<A, B, C, D, E, F, G, H>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>): Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>;
256
+ declare function universalClient<A, B, C, D, E, F, G, H, I>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>;
257
+ declare function universalClient<A, B, C, D, E, F, G, H, I, J>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, featureJ: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>;
258
+ declare function universalClient(...withFeatures: Feature<unknown, unknown>[]): unknown;
259
+
260
+ export { type Delegate, type DelegateFeature, type Feature, type Hooks$1 as Hooks, type HooksInternal, type HttpDelegate, type HttpRequestOptions, type InterceptorConfig, type ServerSentEventDelegate, type WebSocketDelegate, universalClient, withDelegate, withEnvironments, withHooks, withInterceptor, withMethods, withOffline, withTelemetry };
@@ -0,0 +1,260 @@
1
+ interface HttpRequestOptions {
2
+ headers?: Record<string, string>;
3
+ params?: Record<string, string>;
4
+ }
5
+ type HttpDelegate = {
6
+ get<T>(url: string, options?: HttpRequestOptions): Promise<T>;
7
+ post<T>(url: string, body: unknown, options?: HttpRequestOptions): Promise<T>;
8
+ patch<T>(url: string, body: unknown, options?: HttpRequestOptions): Promise<T>;
9
+ put<T>(url: string, body: unknown, options?: HttpRequestOptions): Promise<T>;
10
+ delete<T>(url: string, options?: HttpRequestOptions): Promise<T>;
11
+ };
12
+ interface WebSocketDelegate {
13
+ connect(): void;
14
+ send(message: unknown): void;
15
+ close(): void;
16
+ onOpen(callback: (event: Event) => void): () => void;
17
+ onClose(callback: (event: CloseEvent) => void): () => void;
18
+ onError(callback: (event: Event) => void): () => void;
19
+ onMessage(callback: (data: unknown) => void): () => void;
20
+ }
21
+ interface ServerSentEventDelegate {
22
+ close(): void;
23
+ onOpen(callback: (event: Event) => void): () => void;
24
+ onError(callback: (event: Event) => void): () => void;
25
+ onMessage(callback: (data: unknown) => void): () => void;
26
+ subscribe(event: string, callback: (data: unknown) => void): () => void;
27
+ }
28
+ type Delegate = HttpDelegate | WebSocketDelegate | ServerSentEventDelegate;
29
+
30
+ type Feature<Input = unknown, Output = Input> = (input: Input) => Output;
31
+
32
+ type DelegateFeature<O = {
33
+ delegate: Delegate;
34
+ }> = Feature<{
35
+ delegate: Delegate;
36
+ }, O & {
37
+ delegate: Delegate;
38
+ }>;
39
+
40
+ interface Hooks$1 {
41
+ onInit?: (...args: unknown[]) => void;
42
+ onRequest?: (...args: unknown[]) => void;
43
+ onResponse?: (...args: unknown[]) => void;
44
+ onError?: (...args: unknown[]) => void;
45
+ }
46
+ interface HooksInternal {
47
+ __hooks: {
48
+ [K in keyof Hooks$1]: Hooks$1[K][];
49
+ };
50
+ }
51
+
52
+ type CreateAxiosDelegateOptions = {
53
+ type: 'http';
54
+ impl: 'axios';
55
+ baseURL: string;
56
+ [key: string]: unknown;
57
+ };
58
+ type CreateBetterFetchDelegateOptions = {
59
+ type: 'http';
60
+ impl: 'better-fetch';
61
+ baseURL: string;
62
+ [key: string]: unknown;
63
+ };
64
+ interface CreateFetchDelegateOptions extends RequestInit {
65
+ type: 'http';
66
+ impl?: 'fetch';
67
+ baseURL: string;
68
+ format?: 'json' | 'text' | 'raw';
69
+ }
70
+
71
+ type HttpDelegateOptions = CreateFetchDelegateOptions | CreateBetterFetchDelegateOptions | CreateAxiosDelegateOptions;
72
+
73
+ interface CreateServerSentEventDelegateOptions {
74
+ baseURL: string;
75
+ }
76
+ type ServerSentEventDelegateOptions = {
77
+ type: 'server-sent-event';
78
+ } & CreateServerSentEventDelegateOptions;
79
+
80
+ interface CreateWebSocketDelegateOptions {
81
+ baseURL: string;
82
+ protocols?: string | string[];
83
+ reconnectInterval?: number;
84
+ maxReconnectAttempts?: number;
85
+ }
86
+ type WebSocketDelegateOptions = {
87
+ type: 'websocket';
88
+ } & CreateWebSocketDelegateOptions;
89
+
90
+ type DelegateOptions = HttpDelegateOptions | WebSocketDelegateOptions | ServerSentEventDelegateOptions;
91
+
92
+ /**
93
+ * Context for request interception, allows modifying request properties
94
+ */
95
+ interface RequestInterceptorContext {
96
+ method: string;
97
+ url: string;
98
+ headers?: Record<string, string>;
99
+ body?: unknown;
100
+ }
101
+ /**
102
+ * Context for response interception
103
+ */
104
+ interface ResponseInterceptorContext<T = unknown> {
105
+ method: string;
106
+ url: string;
107
+ result: T;
108
+ body?: unknown;
109
+ }
110
+ /**
111
+ * Interceptor for HTTP delegate methods
112
+ */
113
+ interface HttpInterceptor {
114
+ before?: (context: RequestInterceptorContext) => undefined | Partial<RequestInterceptorContext> | Promise<undefined | Partial<RequestInterceptorContext>>;
115
+ after?: <T>(context: ResponseInterceptorContext<T>) => T | Promise<T>;
116
+ error?: (method: string, url: string, error: Error, body?: unknown) => void | Promise<void>;
117
+ }
118
+
119
+ type DelegateFromOptions<O extends DelegateOptions> = O['type'] extends 'http' ? HttpDelegate : O['type'] extends 'websocket' ? WebSocketDelegate : O['type'] extends 'server-sent-event' ? ServerSentEventDelegate : never;
120
+ /**
121
+ * Add a delegate to the client.
122
+ *
123
+ * @param options - The options for the delegate.
124
+ * @param features - The features to apply to the delegate.
125
+ * @returns A feature that returns the delegate.
126
+ */
127
+ declare function withDelegate<const Options extends DelegateOptions & {
128
+ name: string;
129
+ }>(options: Options, ...features: DelegateFeature[]): Feature<unknown, {
130
+ [key in Options['name']]: DelegateFromOptions<Options>;
131
+ }>;
132
+ declare function withDelegate<const Options extends DelegateOptions>(options: Options, ...features: DelegateFeature[]): Feature<unknown, {
133
+ delegate: DelegateFromOptions<Options>;
134
+ }>;
135
+
136
+ interface Hooks<Input> {
137
+ onInit?: (input: Input) => void;
138
+ }
139
+ /**
140
+ * Add hooks to the client.
141
+ *
142
+ * @param hooks - The hooks to be used in the feature.
143
+ * @returns A feature that returns the hooks.
144
+ */
145
+ declare function withHooks<H extends Hooks<Input>, Input>(hooks: H): Feature<Input, Input>;
146
+
147
+ /**
148
+ * Add methods to the client.
149
+ *
150
+ * @param methodCreator - The method creator to be used in the feature.
151
+ * @returns A feature that returns the methods.
152
+ */
153
+ declare function withMethods<Methods, Input>(methodCreator: (input: Input) => Methods): Feature<Input, Methods & Input>;
154
+
155
+ type Environments = Record<string, string>;
156
+ interface EnvironmentsConfig<Input, Environment extends Environments = Environments> {
157
+ name: keyof Input;
158
+ environments: Environment;
159
+ default?: keyof Environment;
160
+ fallback?: keyof Environment;
161
+ }
162
+ interface EnvironmentManager<Environment extends Environments> {
163
+ getCurrentEnvironment(): keyof Environment;
164
+ setEnvironment(env: keyof Environment): void;
165
+ getBaseURL(): string;
166
+ }
167
+ declare function withEnvironments<Input, Environment extends Environments>(config: EnvironmentsConfig<Input, Environment>): Feature<Input, Input & {
168
+ environments: EnvironmentManager<Environment>;
169
+ }>;
170
+
171
+ interface InterceptorConfig {
172
+ name?: string;
173
+ interceptor: HttpInterceptor;
174
+ }
175
+ /**
176
+ * Add HTTP interceptor to the delegate.
177
+ *
178
+ * @param config - The interceptor configuration.
179
+ * @returns A delegate feature that wraps the HTTP delegate with the interceptor.
180
+ */
181
+ declare function withInterceptor(config: InterceptorConfig): DelegateFeature;
182
+
183
+ interface OfflineConfig {
184
+ /**
185
+ * The strategy to use for the offline manager.
186
+ * @default 'cache-first'
187
+ */
188
+ strategy?: 'cache-first' | 'network-first' | 'network-only';
189
+ /**
190
+ * The TTL for the cache in milliseconds.
191
+ * @default 300000 (5 minutes)
192
+ */
193
+ cacheTTL?: number;
194
+ }
195
+ interface OfflineManager {
196
+ isOnline(): boolean;
197
+ clearCache(): void;
198
+ getCacheSize(): number;
199
+ }
200
+ declare function withOffline(config?: OfflineConfig): DelegateFeature<{
201
+ offline: OfflineManager;
202
+ }>;
203
+
204
+ interface TelemetryEvent {
205
+ timestamp: number;
206
+ type: 'request' | 'response' | 'error';
207
+ operation: string;
208
+ duration?: number;
209
+ status?: number;
210
+ error?: Error;
211
+ traceId?: string;
212
+ }
213
+ interface TelemetryMetrics {
214
+ requests: {
215
+ total: number;
216
+ success: number;
217
+ errors: number;
218
+ };
219
+ latency: {
220
+ avg: number;
221
+ min: number;
222
+ max: number;
223
+ };
224
+ }
225
+ interface TelemetryCollector {
226
+ recordEvent: (event: TelemetryEvent) => void;
227
+ generateTraceId: () => string | undefined;
228
+ getMetrics: () => TelemetryMetrics;
229
+ }
230
+ interface TelemetryOptions {
231
+ enableMetrics?: boolean;
232
+ enableTracing?: boolean;
233
+ enableLogging?: boolean;
234
+ onEvent?: (event: TelemetryEvent) => void;
235
+ onMetrics?: (metrics: TelemetryMetrics) => void;
236
+ }
237
+ declare function withTelemetry(options?: TelemetryOptions): DelegateFeature<{
238
+ telemetry: TelemetryCollector;
239
+ }>;
240
+
241
+ type Merge<A, B> = Omit<A, keyof B> & B;
242
+ /**
243
+ * Creates a universal client that combines multiple features.
244
+ *
245
+ * @param features - The features to be used in the client.
246
+ * @returns A universal client that combines multiple features.
247
+ */
248
+ declare function universalClient<A>(featureA: Feature<unknown, A>): A;
249
+ declare function universalClient<A, B>(featureA: Feature<unknown, A>, featureB: Feature<A, B>): Merge<A, B>;
250
+ declare function universalClient<A, B, C>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>): Merge<Merge<A, B>, C>;
251
+ declare function universalClient<A, B, C, D>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>): Merge<Merge<Merge<A, B>, C>, D>;
252
+ declare function universalClient<A, B, C, D, E>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>): Merge<Merge<Merge<Merge<A, B>, C>, D>, E>;
253
+ declare function universalClient<A, B, C, D, E, F>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>): Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>;
254
+ declare function universalClient<A, B, C, D, E, F, G>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>): Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>;
255
+ declare function universalClient<A, B, C, D, E, F, G, H>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>): Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>;
256
+ declare function universalClient<A, B, C, D, E, F, G, H, I>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>;
257
+ declare function universalClient<A, B, C, D, E, F, G, H, I, J>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>, featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>, featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, featureJ: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>;
258
+ declare function universalClient(...withFeatures: Feature<unknown, unknown>[]): unknown;
259
+
260
+ export { type Delegate, type DelegateFeature, type Feature, type Hooks$1 as Hooks, type HooksInternal, type HttpDelegate, type HttpRequestOptions, type InterceptorConfig, type ServerSentEventDelegate, type WebSocketDelegate, universalClient, withDelegate, withEnvironments, withHooks, withInterceptor, withMethods, withOffline, withTelemetry };
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ 'use strict';/**
2
+ * universal-client v0.0.9-rc.1
3
+ * (c) 2025 Kevin Bonnoron
4
+ * @license MIT
5
+ */
6
+ var P=Object.defineProperty;var M=(e,t)=>()=>(e&&(t=e(e=0)),t);var y=(e,t)=>{for(var a in t)P(e,a,{get:t[a],enumerable:true});};var C={};y(C,{createAxiosDelegate:()=>H});async function H(e){let t;try{t=await new Function("moduleName","return import(moduleName)")("axios");}catch{t=null;}if(!t)throw new Error("Axios is not installed. Please install axios to use the axios delegate.");let a=t.default,{baseURL:r,...o}=e,n=a.create({baseURL:r,...o});return {get(s,i){return n.get(s,{headers:i?.headers}).then(c=>c.data)},post(s,i,c){return n.post(s,i,{headers:c?.headers}).then(p=>p.data)},patch(s,i,c){return n.patch(s,i,{headers:c?.headers}).then(p=>p.data)},put(s,i,c){return n.put(s,i,{headers:c?.headers}).then(p=>p.data)},delete(s,i){return n.delete(s,{headers:i?.headers}).then(c=>c.data)}}}var F=M(()=>{});var T={};y(T,{createBetterFetchDelegate:()=>I});async function I(e){let t;try{t=await new Function("moduleName","return import(moduleName)")("@better-fetch/fetch");}catch{t=null;}if(!t)throw new Error("@better-fetch/fetch is not installed. Please install @better-fetch/fetch to use the better-fetch delegate.");let{createFetch:a}=t,{baseURL:r,...o}=e,n=a({baseURL:r,...o});return {get(s,i){return n(s,{headers:i?.headers}).then(c=>c.data)},post(s,i,c){return n(s,{method:"POST",body:i,headers:c?.headers}).then(p=>p.data)},patch(s,i,c){return n(s,{method:"PATCH",body:i,headers:c?.headers}).then(p=>p.data)},put(s,i,c){return n(s,{method:"PUT",body:i,headers:c?.headers}).then(p=>p.data)},delete(s,i){return n(s,{method:"DELETE",headers:i?.headers}).then(c=>c.data)}}}var b=M(()=>{});var h=e=>t=>e==="json"?t.json():e==="text"?t.text():t;function k({baseURL:e,format:t="json"}){return {get(a,{params:r={},headers:o={}}={}){let n=new URLSearchParams;for(let[s,i]of Object.entries(r))n.append(s,i);return fetch(`${e}${a}${n.size?`?${n}`:""}`,{headers:{...o}}).then(h(t))},post(a,r,{params:o={},headers:n={}}={}){let s=new URLSearchParams;for(let[i,c]of Object.entries(o))s.append(i,c);return fetch(`${e}${a}${s.size?`?${s}`:""}`,{method:"POST",body:JSON.stringify(r),headers:{...n}}).then(h(t))},patch(a,r,{params:o={},headers:n={}}={}){let s=new URLSearchParams;for(let[i,c]of Object.entries(o))s.append(i,c);return fetch(`${e}${a}${s.size?`?${s}`:""}`,{method:"PATCH",body:JSON.stringify(r),headers:{...n}}).then(h(t))},put(a,r,{params:o={},headers:n={}}={}){let s=new URLSearchParams;for(let[i,c]of Object.entries(o))s.append(i,c);return fetch(`${e}${a}${o}`,{method:"PUT",body:JSON.stringify(r),headers:{...n}}).then(h(t))},delete(a,{params:r={},headers:o={}}={}){let n=new URLSearchParams;for(let[s,i]of Object.entries(r))n.append(s,i);return fetch(`${e}${a}${n.size?`?${n}`:""}`,{method:"DELETE",headers:{...o}}).then(h(t))}}}async function S(e){if(e.impl==="axios"){let{createAxiosDelegate:t}=await Promise.resolve().then(()=>(F(),C));return t(e)}if(e.impl==="better-fetch"){let{createBetterFetchDelegate:t}=await Promise.resolve().then(()=>(b(),T));return t(e)}return k(e)}async function O({baseURL:e}){if(typeof EventSource>"u")throw new Error("EventSource is not available. This delegate only works in browser environments.");let t=new EventSource(e),a=new Set,r=new Set,o=new Set;return t.onmessage=n=>{for(let s of r)s(n.data);},t.addEventListener("open",n=>{for(let s of a)s(n);}),t.addEventListener("message",n=>{for(let s of r)s(n.data);}),t.addEventListener("error",n=>{for(let s of o)s(n);}),{close(){t.close();},onOpen(n){return a.add(n),()=>a.delete(n)},onError(n){return o.add(n),()=>o.delete(n)},onMessage(n){return r.add(n),()=>r.delete(n)},subscribe(n,s){let i=c=>s(c.data);return t.addEventListener(n,i),()=>t.removeEventListener(n,i)}}}function x({baseURL:e,protocols:t,reconnectInterval:a=5e3,maxReconnectAttempts:r=10}){let o=null,n=null,s=0,i=new Set,c=new Set,p=new Set,m=new Set;function f(){n!==null||s>=r||(s++,n=window.setTimeout(()=>{n=null,d.connect();},a));}let d={connect:()=>{o&&o.close(),o=new WebSocket(e,t),o.onopen=u=>{s=0;for(let g of i)g(u);},o.onclose=u=>{for(let g of p)g(u);f();},o.onerror=u=>{for(let g of m)g(u);},o.onmessage=u=>{let g;try{g=JSON.parse(u.data);}catch{g=u.data;}for(let l of c)l(g);};},close(){o&&(o.close(),o=null),n!==null&&(window.clearTimeout(n),n=null);},send(u){o&&o.readyState===WebSocket.OPEN?o.send(JSON.stringify(u)):console.warn("WebSocket is not connected. Message not sent.");},onOpen(u){return i.add(u),()=>i.delete(u)},onClose(u){return p.add(u),()=>p.delete(u)},onError(u){return m.add(u),()=>m.delete(u)},onMessage(u){return c.add(u),()=>c.delete(u)}};return d.connect(),d}function v(e){return typeof e=="object"&&e!==null&&"get"in e&&"post"in e&&"patch"in e&&"put"in e&&"delete"in e}function E(e){return typeof e=="object"&&e!==null&&"connect"in e&&"send"in e&&"close"in e}var R=e=>typeof e=="object"&&e!==null&&"type"in e;function A(e){if(R(e)){if(e.type==="http")return $(e);if(e.type==="websocket")return x(e);if(e.type==="server-sent-event")return W(e);throw new Error("Unsupported delegate type")}return e}function $(e){let t=null,a=()=>(t||(t=S(e)),t);return {async get(r,o){return (await a()).get(r,o)},async post(r,o,n){return (await a()).post(r,o,n)},async patch(r,o,n){return (await a()).patch(r,o,n)},async put(r,o,n){return (await a()).put(r,o,n)},async delete(r,o){return (await a()).delete(r,o)}}}function W(e){let t=null,a=()=>(t||(t=O(e)),t);return {close(){t&&t.then(r=>r.close()).catch(console.error);},onOpen(r){let o=null;return a().then(n=>{o=n.onOpen(r);}).catch(n=>console.error("[SSE] Failed to attach onOpen handler:",n)),()=>{o&&o();}},onError(r){let o=null;return a().then(n=>{o=n.onError(r);}).catch(n=>console.error("[SSE] Failed to attach onError handler:",n)),()=>{o&&o();}},onMessage(r){let o=null;return a().then(n=>{o=n.onMessage(r);}).catch(n=>console.error("[SSE] Failed to attach onMessage handler:",n)),()=>{o&&o();}},subscribe(r,o){let n=null;return a().then(s=>{n=s.subscribe(r,o);}).catch(s=>console.error(`[SSE] Failed to subscribe to event "${r}":`,s)),()=>{n&&n();}}}}function w(e,t){let a=r=>{let o=e[r];return async(n,s,i)=>{let c=r==="get"||r==="delete",p=c?void 0:s,f={method:r,url:n,headers:(c?s:i)?.headers,body:p};try{if(t.before){let g=await t.before(f);g&&typeof g=="object"&&(f={...f,...g});}let d=f.headers?{headers:f.headers}:void 0,u=c?await o(f.url,d):await o(f.url,f.body,d);return t.after?await t.after({method:r,url:f.url,result:u,body:f.body}):u}catch(d){throw t.error&&await t.error(r,f.url,d,f.body),d}}};return {get:a("get"),post:a("post"),patch:a("patch"),put:a("put"),delete:a("delete")}}function B(e,t){return {...e,connect:()=>{t.beforeConnect&&Promise.resolve(t.beforeConnect()).catch(console.error),e.connect(),t.afterConnect&&Promise.resolve(t.afterConnect()).catch(console.error);},send:a=>{t.beforeSend&&Promise.resolve(t.beforeSend(a)).catch(console.error),e.send(a),t.afterSend&&Promise.resolve(t.afterSend(a)).catch(console.error);},close:()=>{t.beforeClose&&Promise.resolve(t.beforeClose()).catch(console.error),e.close(),t.afterClose&&Promise.resolve(t.afterClose()).catch(console.error);}}}function me(e,...t){return a=>{let{delegate:r,...o}=t.reduce((s,i)=>{let c=i(s);return Object.assign({},s,c)},{...a,delegate:A(e)});return {[e.name??"delegate"]:r,...o}}}function we(e){return ()=>({...e})}function De(e){return t=>({...e(t),...t})}function L(e){let t=Object.keys(e.environments),a=e.default||t[0],r=a;function o(){return r}function n(i){if(e.environments[i])r=i,console.info(`[ENVIRONMENTS] Switched to environment: ${i} (${e.environments[i]})`);else {let c=e.fallback||a;console.warn(`[ENVIRONMENTS] Environment "${i}" not found, falling back to "${String(c)}"`),r=c;}}function s(){return e.environments[r]||e.environments[Object.keys(e.environments)[0]]}return {getCurrentEnvironment:o,setEnvironment:n,getBaseURL:s}}function q(e,t){let a=r=>{let o=t.getBaseURL();if(r.startsWith("http"))return r;let n=o.replace(/\/$/,""),s=r.startsWith("/")?r:`/${r}`,i=`${n}${s}`;return console.info(`[ENVIRONMENTS] Building URL: ${n} + ${s} = ${i}`),i};return w(e,{before:r=>({url:a(r.url)})})}function N(e,t){return B(e,{beforeConnect:()=>{console.info(`[ENVIRONMENTS] WebSocket connecting to: ${t.getBaseURL()}`);}})}function G(e,t){return v(e)?q(e,t):E(e)?N(e,t):e}function ye(e){return t=>{let{name:a}=e,r=L(e);return {...t,[a]:G(t[a],r),environments:r}}}function Fe(e){return ({delegate:t,...a})=>{let{interceptor:r}=e;return v(t)?{...a,delegate:w(t,r)}:{...a,delegate:t}}}function U(){return typeof navigator<"u"&&navigator.onLine!==void 0?navigator.onLine:true}function j(e){let t=new Map,a=e.cacheTTL??3e5;function r(s,i,c){let p=c?JSON.stringify(c):"";return `${s}:${i}:${p}`}function o(s){let i=t.get(s);return i?Date.now()-i.timestamp>i.ttl?(t.delete(s),null):i.data:null}function n(s,i){t.set(s,{data:i,timestamp:Date.now(),ttl:a});}return {isOnline:U,clearCache:()=>t.clear(),getCacheSize:()=>t.size,getFromCache:o,setInCache:n,generateCacheKey:r}}function J(e,t,a){let r=a.strategy??"cache-first",o=n=>{let s=e[n];return async(i,c,p)=>{let m=n==="get"||n==="delete",f=m?void 0:c,d=m?c:p,u=t.generateCacheKey(String(n),i,f);if(r==="cache-first"){let g=t.getFromCache(u);if(g)return console.info(`[OFFLINE] Cache hit for ${n} ${i}`),g;if(t.isOnline())try{let l=m?await s(i,d):await s(i,f,d);return t.setInCache(u,l),l}catch(l){throw console.error(`[OFFLINE] Network error for ${n} ${i}:`,l),l}throw new Error(`[OFFLINE] No cache available and offline for ${n} ${i}`)}if(r==="network-first"){if(t.isOnline())try{let l=m?await s(i,d):await s(i,f,d);return t.setInCache(u,l),l}catch(l){let D=t.getFromCache(u);if(D)return console.warn(`[OFFLINE] Network failed, using cache for ${n} ${i}`),D;throw l}let g=t.getFromCache(u);if(g)return g;throw new Error(`[OFFLINE] Offline and no cache for ${n} ${i}`)}if(r==="network-only"){if(!t.isOnline())throw new Error(`[OFFLINE] Network unavailable for ${n} ${i}`);return m?await s(i,d):await s(i,f,d)}throw new Error(`[OFFLINE] Unknown strategy: ${r}`)}};return {get:o("get"),post:o("post"),patch:o("patch"),put:o("put"),delete:o("delete")}}function z(e,t,a){return v(e)?J(e,t,a):e}function Se(e={}){return ({delegate:t,...a})=>{let r=j(e);return {...a,delegate:z(t,r,e),offline:r}}}function K({enableMetrics:e=false,enableTracing:t=false,enableLogging:a=false,onEvent:r=()=>{},onMetrics:o=()=>{}}){let n=[],s={requests:{total:0,success:0,errors:0},latency:{avg:0,min:Number.MAX_SAFE_INTEGER,max:Number.MIN_SAFE_INTEGER}};function i(u){n.push(u),m(u),a&&d(u),r(u);}function c(){return t?Math.random().toString(36).substring(2,15):void 0}function p(){return {requests:e?s.requests:{total:0,success:0,errors:0},latency:e?s.latency:{avg:0,min:0,max:0}}}function m(u){if(e){switch(u.type){case "request":s.requests.total++;break;case "response":s.requests.success++,u.duration&&f(u.duration);break;case "error":s.requests.errors++,u.duration&&f(u.duration);break}o(s);}}function f(u){let g=n.filter(l=>l.duration!==void 0).map(l=>l.duration).filter(l=>l>0);g.length>0&&(s.latency.avg=g.reduce((l,D)=>l+D,0)/g.length,s.latency.min=Math.min(...g),s.latency.max=Math.max(...g));}function d(u){let g=u.type==="error"?"error":"info",l=`[TELEMETRY] ${u.operation} ${u.duration?`(${u.duration}ms)`:""}`;u.type==="error"&&u.error?console[g](l,u.error):console[g](l);}return {recordEvent:i,generateTraceId:c,getMetrics:p}}function _(e){let t=new Map;return {before:a=>{let r=e.generateTraceId(),o=`${a.method.toUpperCase()} ${a.url}`,n=Date.now();t.set(o,{time:n,traceId:r}),e.recordEvent({timestamp:n,type:"request",operation:o,traceId:r});},after:a=>{let r=`${a.method.toUpperCase()} ${a.url}`,o=t.get(r);if(o){let n=Date.now()-o.time;e.recordEvent({timestamp:Date.now(),type:"response",operation:r,duration:n,status:200,traceId:o.traceId}),t.delete(r);}return a.result},error:(a,r,o)=>{let n=`${a.toUpperCase()} ${r}`,s=t.get(n);if(s){let i=Date.now()-s.time;e.recordEvent({timestamp:Date.now(),type:"error",operation:n,duration:i,error:o,traceId:s.traceId}),t.delete(n);}}}}function V(e,t){let a=r=>{let o=t.generateTraceId(),n=Date.now();return t.recordEvent({timestamp:n,type:"request",operation:r,traceId:o}),{success:()=>{let s=Date.now()-n;t.recordEvent({timestamp:Date.now(),type:"response",operation:r,duration:s,status:200,traceId:o});},error:s=>{let i=Date.now()-n;t.recordEvent({timestamp:Date.now(),type:"error",operation:r,duration:i,error:s,traceId:o});}}};return {...e,connect:()=>{let r=a("connect");try{e.connect(),r.success();}catch(o){throw r.error(o),o}},send:r=>{let o=a("send");try{e.send(r),o.success();}catch(n){throw o.error(n),n}},close:()=>{let r=a("close");try{e.close(),r.success();}catch(o){throw r.error(o),o}},onMessage:r=>{let o=a("onMessage");try{let n=e.onMessage(r);return o.success(),n}catch(n){throw o.error(n),n}},onError:r=>e.onError(o=>{a("onError").error(new Error("WebSocket error")),r(o);})}}function X(e,t){return v(e)?w(e,_(t)):E(e)?V(e,t):e}function Ae(e={}){return ({delegate:t,...a})=>{let r=K(e);return {...a,delegate:X(t,r),telemetry:r}}}function Je(...e){let t=e.reduce((o,n)=>Object.assign(o,n(o)),{}),{onInit:a,...r}=t;return typeof a=="function"&&a(r),r}exports.universalClient=Je;exports.withDelegate=me;exports.withEnvironments=ye;exports.withHooks=we;exports.withInterceptor=Fe;exports.withMethods=De;exports.withOffline=Se;exports.withTelemetry=Ae;//# sourceMappingURL=index.js.map
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/delegate/http/axios-delegate.utils.ts","../src/utils/delegate/http/better-fetch-delegate.utils.ts","../src/utils/delegate/http/fetch-delegate.utils.ts","../src/utils/delegate/http-delegate.utils.ts","../src/utils/delegate/server-sent-event-delegate.utils.ts","../src/utils/delegate/websocket-delegate.utils.ts","../src/utils/delegate.utils.ts","../src/utils/delegate-middleware.utils.ts","../src/features/core/with-delegate/with-delegate.feature.ts","../src/features/core/with-hooks/with-hooks.feature.ts","../src/features/core/with-methods/with-methods.feature.ts","../src/features/delegate/with-environments/with-environments.feature.ts","../src/features/delegate/with-interceptor/with-interceptor.feature.ts","../src/features/delegate/with-offline/with-offline.feature.ts","../src/features/delegate/with-telemetry/with-telemetry.feature.ts","../src/universal-client.ts"],"names":["axios_delegate_utils_exports","__export","createAxiosDelegate","options","axiosModule","axios","baseURL","restOptions","instance","url","requestOptions","response","body","init_axios_delegate_utils","__esmMin","better_fetch_delegate_utils_exports","createBetterFetchDelegate","betterFetchModule","createFetch","init_better_fetch_delegate_utils","parseResponse","format","createFetchDelegate","params","headers","query","key","value","createHttpDelegate","createServerSentEventDelegate","eventSource","openListeners","messageListeners","errorListeners","event","listener","callback","handler","createWebSocketDelegate","protocols","reconnectInterval","maxReconnectAttempts","socket","reconnectTimer","reconnectAttempts","closeListeners","reconnect","delegate","message","isHttpDelegate","isWebSocketDelegate","isDelegateOptions","createDelegate","delegateOrOptions","createLazyHttpDelegate","createLazyServerSentEventDelegate","delegatePromise","ensureDelegate","d","unsubscribe","error","wrapHttpDelegate","interceptor","wrapMethod","methodName","originalMethod","bodyOrOptions","optionsArg","isGetOrDelete","context","beforeResult","finalOptions","result","wrapWebSocketDelegate","withDelegate","features","input","rest","acc","feature","withHooks","hooks","withMethods","methodCreator","createEnvironmentManager","config","environmentKeys","defaultKey","currentEnv","getCurrentEnvironment","setEnvironment","env","fallback","getBaseURL","wrapHttpDelegateWithEnvironments","envManager","buildFullURL","cleanBaseURL","cleanPath","fullURL","wrapWebSocketDelegateWithEnvironments","wrapDelegateWithEnvironments","withEnvironments","name","environments","withInterceptor","isOnline","createOfflineManager","cache","cacheTTL","generateCacheKey","method","bodyStr","getFromCache","cacheKey","entry","setInCache","data","wrapHttpDelegateWithOffline","offlineManager","strategy","cached","wrapDelegateWithOffline","withOffline","createTelemetryCollector","enableMetrics","enableTracing","enableLogging","onEvent","onMetrics","events","metrics","recordEvent","updateMetrics","logEvent","generateTraceId","getMetrics","updateLatency","_duration","latencies","sum","lat","logLevel","createTelemetryHttpInterceptor","collector","startTimes","traceId","operation","startTime","startData","duration","wrapWebSocketDelegateWithTelemetry","createTimedOperation","op","wrapDelegateWithTelemetry","withTelemetry","telemetryCollector","universalClient","withFeatures","client","accumulator","onInit"],"mappings":"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","file":"index.js","sourcesContent":["import type { HttpRequestOptions } from '../../../types';\nimport type { CreateAxiosDelegateOptions } from './types';\n\nexport async function createAxiosDelegate(options: CreateAxiosDelegateOptions) {\n let axiosModule: {\n default: {\n create: (config: Record<string, unknown>) => unknown;\n get: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n post: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n patch: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n put: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n delete: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n } | null;\n try {\n axiosModule = await new Function('moduleName', 'return import(moduleName)')('axios');\n } catch {\n axiosModule = null;\n }\n\n if (!axiosModule) {\n throw new Error('Axios is not installed. Please install axios to use the axios delegate.');\n }\n\n const axios = axiosModule.default;\n const { baseURL, ...restOptions } = options;\n const instance = axios.create({ baseURL, ...restOptions }) as {\n get: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n post: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n patch: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n put: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n delete: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n\n return {\n get<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance.get(url, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n post<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance.post(url, body, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n patch<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance.patch(url, body, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n put<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance.put(url, body, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n delete<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance.delete(url, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n };\n}\n","import type { HttpRequestOptions } from '../../../types';\nimport type { CreateBetterFetchDelegateOptions } from './types';\n\nexport async function createBetterFetchDelegate(options: CreateBetterFetchDelegateOptions) {\n let betterFetchModule: { createFetch: (options: CreateBetterFetchDelegateOptions) => (url: string, options?: Record<string, unknown>) => Promise<{ data: unknown }> } | null;\n try {\n betterFetchModule = await new Function('moduleName', 'return import(moduleName)')('@better-fetch/fetch');\n } catch {\n betterFetchModule = null;\n }\n\n if (!betterFetchModule) {\n throw new Error('@better-fetch/fetch is not installed. Please install @better-fetch/fetch to use the better-fetch delegate.');\n }\n\n const { createFetch } = betterFetchModule;\n const { baseURL, ...restOptions } = options;\n const instance = createFetch({ baseURL, ...restOptions });\n\n return {\n get<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance(url, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n post<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'POST', body, headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n patch<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'PATCH', body, headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n put<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'PUT', body, headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n delete<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'DELETE', headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n };\n}\n","import type { HttpDelegate, HttpRequestOptions } from '../../../types';\nimport type { CreateFetchDelegateOptions } from './types';\n\nconst parseResponse = (format: CreateFetchDelegateOptions['format']) => (response: Response) => {\n if (format === 'json') {\n return response.json();\n }\n\n if (format === 'text') {\n return response.text();\n }\n\n return response;\n};\n\n/**\n * Creates a delegate to handle fetch requests.\n *\n * @param options - The options to be used in the delegate.\n * @returns A delegate to handle fetch requests.\n */\nexport function createFetchDelegate({ baseURL, format = 'json' }: CreateFetchDelegateOptions): HttpDelegate {\n return {\n get<T>(url: string, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n post<T>(url: string, body: unknown, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n patch<T>(url: string, body: unknown, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n put<T>(url: string, body: unknown, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${params}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n delete<T>(url: string, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n method: 'DELETE',\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n };\n}\n","import type { HttpDelegate } from '../../types';\nimport { createFetchDelegate } from './http/fetch-delegate.utils';\nimport type { CreateAxiosDelegateOptions, CreateBetterFetchDelegateOptions, CreateFetchDelegateOptions } from './http/types';\n\nexport type HttpDelegateOptions = CreateFetchDelegateOptions | CreateBetterFetchDelegateOptions | CreateAxiosDelegateOptions;\n\nexport async function createHttpDelegate(options: HttpDelegateOptions): Promise<HttpDelegate> {\n if (options.impl === 'axios') {\n const { createAxiosDelegate } = await import('./http/axios-delegate.utils');\n return createAxiosDelegate(options);\n }\n\n if (options.impl === 'better-fetch') {\n const { createBetterFetchDelegate } = await import('./http/better-fetch-delegate.utils');\n return createBetterFetchDelegate(options);\n }\n\n return createFetchDelegate(options);\n}\n","import type { ServerSentEventDelegate } from '../../types';\n\nexport interface CreateServerSentEventDelegateOptions {\n baseURL: string;\n}\n\nexport type ServerSentEventDelegateOptions = {\n type: 'server-sent-event';\n} & CreateServerSentEventDelegateOptions;\n\n/**\n * Creates a delegate to handle Server Sent Events.\n *\n * @param options - The options to be used in the delegate.\n * @returns A delegate to handle Server Sent Events.\n */\nexport async function createServerSentEventDelegate({ baseURL }: CreateServerSentEventDelegateOptions): Promise<ServerSentEventDelegate> {\n // Use native browser EventSource\n if (typeof EventSource === 'undefined') {\n throw new Error('EventSource is not available. This delegate only works in browser environments.');\n }\n\n const eventSource = new EventSource(baseURL);\n const openListeners: Set<(event: Event) => void> = new Set();\n const messageListeners: Set<(data: unknown) => void> = new Set();\n const errorListeners: Set<(event: Event) => void> = new Set();\n\n eventSource.onmessage = (event) => {\n for (const listener of messageListeners) {\n listener(event.data);\n }\n };\n\n eventSource.addEventListener('open', (event) => {\n for (const listener of openListeners) {\n listener(event);\n }\n });\n\n eventSource.addEventListener('message', (event) => {\n for (const listener of messageListeners) {\n listener(event.data);\n }\n });\n\n eventSource.addEventListener('error', (event) => {\n for (const listener of errorListeners) {\n listener(event);\n }\n });\n\n return {\n close() {\n eventSource.close();\n },\n onOpen(callback: (event: Event) => void) {\n openListeners.add(callback);\n return () => openListeners.delete(callback);\n },\n onError(callback: (event: Event) => void) {\n errorListeners.add(callback);\n return () => errorListeners.delete(callback);\n },\n onMessage(callback: (data: unknown) => void) {\n messageListeners.add(callback);\n return () => messageListeners.delete(callback);\n },\n subscribe(event: string, callback: (data: unknown) => void) {\n const handler = (event: MessageEvent) => callback(event.data);\n eventSource.addEventListener(event, handler);\n return () => eventSource.removeEventListener(event, handler);\n },\n };\n}\n","import type { WebSocketDelegate } from '../../types';\n\nexport interface CreateWebSocketDelegateOptions {\n baseURL: string;\n protocols?: string | string[];\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n}\n\nexport type WebSocketDelegateOptions = {\n type: 'websocket';\n} & CreateWebSocketDelegateOptions;\n\n/**\n * Creates a delegate to handle WebSocket requests.\n *\n * @param options - The options to be used in the delegate.\n * @returns A delegate to handle WebSocket requests.\n */\nexport function createWebSocketDelegate({ baseURL, protocols, reconnectInterval = 5000, maxReconnectAttempts = 10 }: CreateWebSocketDelegateOptions): WebSocketDelegate {\n let socket: WebSocket | null = null;\n let reconnectTimer: number | null = null;\n let reconnectAttempts = 0;\n const openListeners: Set<(event: Event) => void> = new Set();\n const messageListeners: Set<(data: unknown) => void> = new Set();\n const closeListeners: Set<(event: CloseEvent) => void> = new Set();\n const errorListeners: Set<(event: Event) => void> = new Set();\n\n function reconnect() {\n if (reconnectTimer !== null || reconnectAttempts >= maxReconnectAttempts) {\n return;\n }\n\n reconnectAttempts++;\n reconnectTimer = window.setTimeout(() => {\n reconnectTimer = null;\n delegate.connect();\n }, reconnectInterval);\n }\n\n const delegate: WebSocketDelegate = {\n connect: () => {\n if (socket) {\n socket.close();\n }\n\n socket = new WebSocket(baseURL, protocols);\n socket.onopen = (event) => {\n reconnectAttempts = 0;\n for (const listener of openListeners) {\n listener(event);\n }\n };\n\n socket.onclose = (event) => {\n for (const listener of closeListeners) {\n listener(event);\n }\n reconnect();\n };\n\n socket.onerror = (event) => {\n for (const listener of errorListeners) {\n listener(event);\n }\n };\n\n socket.onmessage = (event) => {\n let message: unknown;\n try {\n message = JSON.parse(event.data);\n } catch (_error) {\n message = event.data;\n }\n\n for (const listener of messageListeners) {\n listener(message);\n }\n };\n },\n close(): void {\n if (socket) {\n socket.close();\n socket = null;\n }\n\n if (reconnectTimer !== null) {\n window.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n },\n send(message: unknown): void {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n } else {\n console.warn('WebSocket is not connected. Message not sent.');\n }\n },\n onOpen(callback: (event: Event) => void): () => void {\n openListeners.add(callback);\n return () => openListeners.delete(callback);\n },\n onClose(callback: (event: CloseEvent) => void): () => void {\n closeListeners.add(callback);\n return () => closeListeners.delete(callback);\n },\n onError(callback: (event: Event) => void): () => void {\n errorListeners.add(callback);\n return () => errorListeners.delete(callback);\n },\n onMessage(callback: (data: unknown) => void): () => void {\n messageListeners.add(callback);\n return () => messageListeners.delete(callback);\n },\n };\n\n delegate.connect();\n return delegate;\n}\n","import type { Delegate, HttpDelegate, ServerSentEventDelegate, WebSocketDelegate } from '../types';\nimport { createHttpDelegate, createServerSentEventDelegate, createWebSocketDelegate, type HttpDelegateOptions, type ServerSentEventDelegateOptions, type WebSocketDelegateOptions } from './delegate';\n\nexport function isHttpDelegate(delegate: unknown): delegate is HttpDelegate {\n return typeof delegate === 'object' && delegate !== null && 'get' in delegate && 'post' in delegate && 'patch' in delegate && 'put' in delegate && 'delete' in delegate;\n}\n\nexport function isWebSocketDelegate(delegate: unknown): delegate is WebSocketDelegate {\n return typeof delegate === 'object' && delegate !== null && 'connect' in delegate && 'send' in delegate && 'close' in delegate;\n}\n\nexport function isServerSentEventDelegate(delegate: unknown): delegate is ServerSentEventDelegate {\n return typeof delegate === 'object' && delegate !== null && 'onMessage' in delegate && 'onError' in delegate && 'onOpen' in delegate && 'subscribe' in delegate;\n}\n\nexport function isDelegate(delegate: unknown): delegate is Delegate {\n return isHttpDelegate(delegate) || isWebSocketDelegate(delegate) || isServerSentEventDelegate(delegate);\n}\n\nexport type DelegateOptions = HttpDelegateOptions | WebSocketDelegateOptions | ServerSentEventDelegateOptions;\n\nconst isDelegateOptions = (value: unknown): value is DelegateOptions => {\n return typeof value === 'object' && value !== null && 'type' in value;\n};\n\nexport function createDelegate(delegateOrOptions: Delegate | DelegateOptions): Delegate {\n if (isDelegateOptions(delegateOrOptions)) {\n if (delegateOrOptions.type === 'http') {\n return createLazyHttpDelegate(delegateOrOptions);\n }\n\n if (delegateOrOptions.type === 'websocket') {\n return createWebSocketDelegate(delegateOrOptions);\n }\n\n if (delegateOrOptions.type === 'server-sent-event') {\n return createLazyServerSentEventDelegate(delegateOrOptions);\n }\n\n throw new Error('Unsupported delegate type');\n }\n\n return delegateOrOptions;\n}\n\nfunction createLazyHttpDelegate(options: HttpDelegateOptions): HttpDelegate {\n let delegatePromise: Promise<HttpDelegate> | null = null;\n\n const ensureDelegate = () => {\n if (!delegatePromise) {\n delegatePromise = createHttpDelegate(options);\n }\n return delegatePromise;\n };\n\n return {\n async get<T>(url: string, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.get<T>(url, requestOptions);\n },\n async post<T>(url: string, body: unknown, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.post<T>(url, body, requestOptions);\n },\n async patch<T>(url: string, body: unknown, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.patch<T>(url, body, requestOptions);\n },\n async put<T>(url: string, body: unknown, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.put<T>(url, body, requestOptions);\n },\n async delete<T>(url: string, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.delete<T>(url, requestOptions);\n },\n };\n}\n\nfunction createLazyServerSentEventDelegate(options: ServerSentEventDelegateOptions): ServerSentEventDelegate {\n let delegatePromise: Promise<ServerSentEventDelegate> | null = null;\n\n const ensureDelegate = () => {\n if (!delegatePromise) {\n delegatePromise = createServerSentEventDelegate(options);\n }\n return delegatePromise;\n };\n\n return {\n close(): void {\n if (delegatePromise) {\n delegatePromise.then((d) => d.close()).catch(console.error);\n }\n },\n onOpen(callback: (event: Event) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.onOpen(callback);\n })\n .catch((error) => console.error('[SSE] Failed to attach onOpen handler:', error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n onError(callback: (event: Event) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.onError(callback);\n })\n .catch((error) => console.error('[SSE] Failed to attach onError handler:', error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n onMessage(callback: (data: unknown) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.onMessage(callback);\n })\n .catch((error) => console.error('[SSE] Failed to attach onMessage handler:', error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n subscribe(event: string, callback: (data: unknown) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.subscribe(event, callback);\n })\n .catch((error) => console.error(`[SSE] Failed to subscribe to event \"${event}\":`, error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n };\n}\n","import type { HttpDelegate, WebSocketDelegate } from '../types';\n\n/**\n * Context for request interception, allows modifying request properties\n */\nexport interface RequestInterceptorContext {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: unknown;\n}\n\n/**\n * Context for response interception\n */\nexport interface ResponseInterceptorContext<T = unknown> {\n method: string;\n url: string;\n result: T;\n body?: unknown;\n}\n\n/**\n * Interceptor for HTTP delegate methods\n */\nexport interface HttpInterceptor {\n before?: (context: RequestInterceptorContext) => undefined | Partial<RequestInterceptorContext> | Promise<undefined | Partial<RequestInterceptorContext>>;\n after?: <T>(context: ResponseInterceptorContext<T>) => T | Promise<T>;\n error?: (method: string, url: string, error: Error, body?: unknown) => void | Promise<void>;\n}\n\n/**\n * Interceptor for WebSocket delegate methods\n */\nexport interface WebSocketInterceptor {\n beforeConnect?: () => void | Promise<void>;\n afterConnect?: () => void | Promise<void>;\n beforeSend?: (message: unknown) => void | Promise<void>;\n afterSend?: (message: unknown) => void | Promise<void>;\n beforeClose?: () => void | Promise<void>;\n afterClose?: () => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n}\n\n/**\n * Wraps an HTTP delegate with interceptors for all methods\n */\nexport function wrapHttpDelegate(delegate: HttpDelegate, interceptor: HttpInterceptor): HttpDelegate {\n const wrapMethod = (methodName: 'get' | 'post' | 'patch' | 'put' | 'delete') => {\n const originalMethod = delegate[methodName];\n\n return async <T>(url: string, bodyOrOptions?: unknown, optionsArg?: unknown): Promise<T> => {\n // Handle overloaded signatures: (url) or (url, body) or (url, options) or (url, body, options)\n const isGetOrDelete = methodName === 'get' || methodName === 'delete';\n const body = isGetOrDelete ? undefined : bodyOrOptions;\n const options = isGetOrDelete ? (bodyOrOptions as { headers?: Record<string, string> }) : (optionsArg as { headers?: Record<string, string> });\n\n let context: RequestInterceptorContext = {\n method: methodName,\n url,\n headers: options?.headers,\n body,\n };\n\n try {\n // Before interceptor (can modify url, headers, body)\n if (interceptor.before) {\n const beforeResult = await interceptor.before(context);\n if (beforeResult && typeof beforeResult === 'object') {\n context = { ...context, ...beforeResult };\n }\n }\n\n // Build options with potentially modified headers\n const finalOptions = context.headers ? { headers: context.headers } : undefined;\n\n // Execute original method with potentially modified properties\n const result = isGetOrDelete\n ? await (originalMethod as (url: string, options?: { headers?: Record<string, string> }) => Promise<T>)(context.url, finalOptions)\n : await (originalMethod as (url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>)(context.url, context.body, finalOptions);\n\n // After interceptor\n if (interceptor.after) {\n return await interceptor.after<T>({\n method: methodName,\n url: context.url,\n result: result as T,\n body: context.body,\n });\n }\n\n return result as T;\n } catch (error) {\n // Error interceptor\n if (interceptor.error) {\n await interceptor.error(methodName, context.url, error as Error, context.body);\n }\n throw error;\n }\n };\n };\n\n return {\n get: wrapMethod('get') as <T>(url: string, options?: { headers?: Record<string, string> }) => Promise<T>,\n post: wrapMethod('post') as <T>(url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>,\n patch: wrapMethod('patch') as <T>(url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>,\n put: wrapMethod('put') as <T>(url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>,\n delete: wrapMethod('delete') as <T>(url: string, options?: { headers?: Record<string, string> }) => Promise<T>,\n };\n}\n\n/**\n * Wraps a WebSocket delegate with interceptors for connect, send, and close\n */\nexport function wrapWebSocketDelegate(delegate: WebSocketDelegate, interceptor: WebSocketInterceptor): WebSocketDelegate {\n return {\n ...delegate,\n connect: () => {\n if (interceptor.beforeConnect) {\n Promise.resolve(interceptor.beforeConnect()).catch(console.error);\n }\n\n delegate.connect();\n\n if (interceptor.afterConnect) {\n Promise.resolve(interceptor.afterConnect()).catch(console.error);\n }\n },\n\n send: (message: unknown) => {\n if (interceptor.beforeSend) {\n Promise.resolve(interceptor.beforeSend(message)).catch(console.error);\n }\n\n delegate.send(message);\n\n if (interceptor.afterSend) {\n Promise.resolve(interceptor.afterSend(message)).catch(console.error);\n }\n },\n\n close: () => {\n if (interceptor.beforeClose) {\n Promise.resolve(interceptor.beforeClose()).catch(console.error);\n }\n\n delegate.close();\n\n if (interceptor.afterClose) {\n Promise.resolve(interceptor.afterClose()).catch(console.error);\n }\n },\n };\n}\n","import type { DelegateFeature, Feature, HttpDelegate, ServerSentEventDelegate, WebSocketDelegate } from '../../../types';\nimport { createDelegate, type DelegateOptions } from '../../../utils';\n\ntype DelegateFromOptions<O extends DelegateOptions> = O['type'] extends 'http' ? HttpDelegate : O['type'] extends 'websocket' ? WebSocketDelegate : O['type'] extends 'server-sent-event' ? ServerSentEventDelegate : never;\n\n/**\n * Add a delegate to the client.\n *\n * @param options - The options for the delegate.\n * @param features - The features to apply to the delegate.\n * @returns A feature that returns the delegate.\n */\nexport function withDelegate<const Options extends DelegateOptions & { name: string }>(options: Options, ...features: DelegateFeature[]): Feature<unknown, { [key in Options['name']]: DelegateFromOptions<Options> }>;\nexport function withDelegate<const Options extends DelegateOptions>(options: Options, ...features: DelegateFeature[]): Feature<unknown, { delegate: DelegateFromOptions<Options> }>;\nexport function withDelegate(options: DelegateOptions & { name?: string }, ...features: DelegateFeature[]): unknown {\n return (input: Record<string, unknown>) => {\n const { delegate, ...rest } = features.reduce(\n (acc, feature) => {\n const result = feature(acc);\n return Object.assign({}, acc, result);\n },\n { ...input, delegate: createDelegate(options) },\n );\n\n const delegateName = options.name ?? 'delegate';\n\n return {\n [delegateName]: delegate,\n ...rest,\n };\n };\n}\n","import type { Feature } from '../../../types';\n\ninterface Hooks<Input> {\n onInit?: (input: Input) => void;\n}\n\n/**\n * Add hooks to the client.\n *\n * @param hooks - The hooks to be used in the feature.\n * @returns A feature that returns the hooks.\n */\nexport function withHooks<H extends Hooks<Input>, Input>(hooks: H): Feature<Input, Input> {\n return () => ({ ...hooks }) as unknown as Input;\n}\n","import type { Feature } from '../../../types';\n\n/**\n * Add methods to the client.\n *\n * @param methodCreator - The method creator to be used in the feature.\n * @returns A feature that returns the methods.\n */\nexport function withMethods<Methods, Input>(methodCreator: (input: Input) => Methods): Feature<Input, Methods & Input> {\n return (input) => ({ ...methodCreator(input), ...input });\n}\n","import type { Feature, HttpDelegate, WebSocketDelegate } from '../../../types';\nimport { isHttpDelegate, isWebSocketDelegate, wrapHttpDelegate, wrapWebSocketDelegate } from '../../../utils';\n\ntype Environments = Record<string, string>;\n\ninterface EnvironmentsConfig<Input, Environment extends Environments = Environments> {\n name: keyof Input;\n environments: Environment;\n default?: keyof Environment;\n fallback?: keyof Environment;\n}\n\ninterface EnvironmentManager<Environment extends Environments> {\n getCurrentEnvironment(): keyof Environment;\n setEnvironment(env: keyof Environment): void;\n getBaseURL(): string;\n}\n\nfunction createEnvironmentManager<Input, Environment extends Environments>(config: EnvironmentsConfig<Input, Environment>): EnvironmentManager<Environment> {\n const environmentKeys = Object.keys(config.environments);\n const defaultKey = config.default || environmentKeys[0];\n let currentEnv = defaultKey;\n\n function getCurrentEnvironment(): keyof Environment {\n return currentEnv;\n }\n\n function setEnvironment(env: string): void {\n if (!config.environments[env]) {\n const fallback = config.fallback || defaultKey;\n console.warn(`[ENVIRONMENTS] Environment \"${env}\" not found, falling back to \"${String(fallback)}\"`);\n currentEnv = fallback;\n } else {\n currentEnv = env;\n console.info(`[ENVIRONMENTS] Switched to environment: ${env} (${config.environments[env]})`);\n }\n }\n\n function getBaseURL() {\n return config.environments[currentEnv] || config.environments[Object.keys(config.environments)[0]];\n }\n\n return {\n getCurrentEnvironment,\n setEnvironment,\n getBaseURL,\n };\n}\n\nfunction wrapHttpDelegateWithEnvironments<Environment extends Environments>(delegate: HttpDelegate, envManager: EnvironmentManager<Environment>): HttpDelegate {\n const buildFullURL = (url: string) => {\n const baseURL = envManager.getBaseURL();\n if (url.startsWith('http')) {\n return url;\n }\n\n const cleanBaseURL = baseURL.replace(/\\/$/, '');\n const cleanPath = url.startsWith('/') ? url : `/${url}`;\n const fullURL = `${cleanBaseURL}${cleanPath}`;\n console.info(`[ENVIRONMENTS] Building URL: ${cleanBaseURL} + ${cleanPath} = ${fullURL}`);\n return fullURL;\n };\n\n return wrapHttpDelegate(delegate, {\n before: (context) => {\n return { url: buildFullURL(context.url) };\n },\n });\n}\n\nfunction wrapWebSocketDelegateWithEnvironments<Environment extends Environments>(delegate: WebSocketDelegate, envManager: EnvironmentManager<Environment>): WebSocketDelegate {\n return wrapWebSocketDelegate(delegate, {\n beforeConnect: () => {\n console.info(`[ENVIRONMENTS] WebSocket connecting to: ${envManager.getBaseURL()}`);\n },\n });\n}\n\nfunction wrapDelegateWithEnvironments<Environment extends Environments>(delegate: unknown, envManager: EnvironmentManager<Environment>): unknown {\n if (isHttpDelegate(delegate)) {\n return wrapHttpDelegateWithEnvironments(delegate, envManager);\n }\n\n if (isWebSocketDelegate(delegate)) {\n return wrapWebSocketDelegateWithEnvironments(delegate, envManager);\n }\n\n return delegate;\n}\n\nexport function withEnvironments<Input, Environment extends Environments>(config: EnvironmentsConfig<Input, Environment>): Feature<Input, Input & { environments: EnvironmentManager<Environment> }> {\n return (input: Input) => {\n const { name } = config;\n const environments = createEnvironmentManager(config);\n\n return {\n ...input,\n [name]: wrapDelegateWithEnvironments(input[name], environments),\n environments,\n };\n };\n}\n","import type { DelegateFeature } from '../../../types';\nimport { isHttpDelegate, wrapHttpDelegate } from '../../../utils';\nimport type { HttpInterceptor } from '../../../utils/delegate-middleware.utils';\n\nexport interface InterceptorConfig {\n name?: string;\n interceptor: HttpInterceptor;\n}\n\n/**\n * Add HTTP interceptor to the delegate.\n *\n * @param config - The interceptor configuration.\n * @returns A delegate feature that wraps the HTTP delegate with the interceptor.\n */\nexport function withInterceptor(config: InterceptorConfig): DelegateFeature {\n return ({ delegate, ...rest }) => {\n const { interceptor } = config;\n\n if (isHttpDelegate(delegate)) {\n return {\n ...rest,\n delegate: wrapHttpDelegate(delegate, interceptor),\n };\n }\n\n return { ...rest, delegate };\n };\n}\n","import type { Delegate, DelegateFeature, HttpDelegate } from '../../../types';\nimport { isHttpDelegate } from '../../../utils';\n\ninterface OfflineConfig {\n /**\n * The strategy to use for the offline manager.\n * @default 'cache-first'\n */\n strategy?: 'cache-first' | 'network-first' | 'network-only';\n /**\n * The TTL for the cache in milliseconds.\n * @default 300000 (5 minutes)\n */\n cacheTTL?: number;\n}\n\ninterface CacheEntry<T = unknown> {\n data: T;\n timestamp: number;\n ttl: number;\n}\n\ninterface OfflineManager {\n isOnline(): boolean;\n clearCache(): void;\n getCacheSize(): number;\n}\n\ninterface ExtendedOfflineManager extends OfflineManager {\n getFromCache: <T>(key: string) => T | null;\n setInCache: <T>(key: string, data: T) => void;\n generateCacheKey: (method: string, url: string, body?: unknown) => string;\n}\n\nfunction isOnline(): boolean {\n return typeof navigator !== 'undefined' && navigator.onLine !== undefined ? navigator.onLine : true;\n}\n\nfunction createOfflineManager(config: OfflineConfig): ExtendedOfflineManager {\n const cache = new Map<string, CacheEntry>();\n const cacheTTL = config.cacheTTL ?? 300000;\n\n function generateCacheKey(method: string, url: string, body?: unknown): string {\n const bodyStr = body ? JSON.stringify(body) : '';\n return `${method}:${url}:${bodyStr}`;\n }\n\n function getFromCache<T>(cacheKey: string): T | null {\n const entry = cache.get(cacheKey);\n if (!entry) {\n return null;\n }\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n cache.delete(cacheKey);\n return null;\n }\n\n return entry.data as T;\n }\n\n function setInCache<T>(cacheKey: string, data: T): void {\n cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n ttl: cacheTTL,\n });\n }\n\n return {\n isOnline,\n clearCache: () => cache.clear(),\n getCacheSize: () => cache.size,\n getFromCache: getFromCache,\n setInCache: setInCache,\n generateCacheKey: generateCacheKey,\n };\n}\n\nfunction wrapHttpDelegateWithOffline(delegate: HttpDelegate, offlineManager: ExtendedOfflineManager, config: OfflineConfig): HttpDelegate {\n const strategy = config.strategy ?? 'cache-first';\n\n const wrapMethod = <K extends keyof HttpDelegate>(methodName: K) => {\n const originalMethod = delegate[methodName];\n\n return async <T>(url: string, bodyOrOptions?: unknown, optionsArg?: unknown): Promise<T> => {\n // Handle overloaded signatures\n const isGetOrDelete = methodName === 'get' || methodName === 'delete';\n const body = isGetOrDelete ? undefined : bodyOrOptions;\n const options = isGetOrDelete ? bodyOrOptions : optionsArg;\n\n const cacheKey = offlineManager.generateCacheKey(String(methodName), url, body);\n\n if (strategy === 'cache-first') {\n const cached = offlineManager.getFromCache<T>(cacheKey);\n if (cached) {\n console.info(`[OFFLINE] Cache hit for ${methodName} ${url}`);\n return cached;\n }\n\n if (offlineManager.isOnline()) {\n try {\n const result = isGetOrDelete ? await (originalMethod as (url: string, options?: unknown) => Promise<T>)(url, options) : await (originalMethod as (url: string, body: unknown, options?: unknown) => Promise<T>)(url, body, options);\n offlineManager.setInCache(cacheKey, result);\n return result;\n } catch (error) {\n console.error(`[OFFLINE] Network error for ${methodName} ${url}:`, error);\n throw error;\n }\n }\n\n throw new Error(`[OFFLINE] No cache available and offline for ${methodName} ${url}`);\n }\n\n if (strategy === 'network-first') {\n if (offlineManager.isOnline()) {\n try {\n const result = isGetOrDelete ? await (originalMethod as (url: string, options?: unknown) => Promise<T>)(url, options) : await (originalMethod as (url: string, body: unknown, options?: unknown) => Promise<T>)(url, body, options);\n offlineManager.setInCache(cacheKey, result);\n return result;\n } catch (error) {\n const cached = offlineManager.getFromCache<T>(cacheKey);\n if (cached) {\n console.warn(`[OFFLINE] Network failed, using cache for ${methodName} ${url}`);\n return cached;\n }\n throw error;\n }\n }\n\n const cached = offlineManager.getFromCache<T>(cacheKey);\n if (cached) {\n return cached;\n }\n throw new Error(`[OFFLINE] Offline and no cache for ${methodName} ${url}`);\n }\n\n if (strategy === 'network-only') {\n if (!offlineManager.isOnline()) {\n throw new Error(`[OFFLINE] Network unavailable for ${methodName} ${url}`);\n }\n return isGetOrDelete ? await (originalMethod as (url: string, options?: unknown) => Promise<T>)(url, options) : await (originalMethod as (url: string, body: unknown, options?: unknown) => Promise<T>)(url, body, options);\n }\n\n throw new Error(`[OFFLINE] Unknown strategy: ${strategy}`);\n };\n };\n\n return {\n get: wrapMethod('get'),\n post: wrapMethod('post'),\n patch: wrapMethod('patch'),\n put: wrapMethod('put'),\n delete: wrapMethod('delete'),\n };\n}\n\nfunction wrapDelegateWithOffline(delegate: Delegate, offlineManager: ExtendedOfflineManager, config: OfflineConfig): Delegate {\n if (isHttpDelegate(delegate)) {\n return wrapHttpDelegateWithOffline(delegate, offlineManager, config);\n }\n\n return delegate;\n}\n\nexport function withOffline(config: OfflineConfig = {}): DelegateFeature<{ offline: OfflineManager }> {\n return ({ delegate, ...rest }) => {\n const offlineManager = createOfflineManager(config);\n\n return {\n ...rest,\n delegate: wrapDelegateWithOffline(delegate, offlineManager, config),\n offline: offlineManager,\n };\n };\n}\n","import type { Delegate, DelegateFeature, WebSocketDelegate } from '../../../types';\nimport { isHttpDelegate, isWebSocketDelegate, wrapHttpDelegate } from '../../../utils';\n\ninterface TelemetryEvent {\n timestamp: number;\n type: 'request' | 'response' | 'error';\n operation: string;\n duration?: number;\n status?: number;\n error?: Error;\n traceId?: string;\n}\n\ninterface TelemetryMetrics {\n requests: { total: number; success: number; errors: number };\n latency: { avg: number; min: number; max: number };\n}\n\ninterface TelemetryCollector {\n recordEvent: (event: TelemetryEvent) => void;\n generateTraceId: () => string | undefined;\n getMetrics: () => TelemetryMetrics;\n}\n\ninterface TelemetryOptions {\n enableMetrics?: boolean;\n enableTracing?: boolean;\n enableLogging?: boolean;\n onEvent?: (event: TelemetryEvent) => void;\n onMetrics?: (metrics: TelemetryMetrics) => void;\n}\n\nfunction createTelemetryCollector({ enableMetrics = false, enableTracing = false, enableLogging = false, onEvent = () => {}, onMetrics = () => {} }: TelemetryOptions): TelemetryCollector {\n const events: TelemetryEvent[] = [];\n const metrics: TelemetryMetrics = {\n requests: { total: 0, success: 0, errors: 0 },\n latency: { avg: 0, min: Number.MAX_SAFE_INTEGER, max: Number.MIN_SAFE_INTEGER },\n };\n\n function recordEvent(event: TelemetryEvent): void {\n events.push(event);\n updateMetrics(event);\n\n if (enableLogging) {\n logEvent(event);\n }\n\n onEvent(event);\n }\n\n function generateTraceId(): string | undefined {\n return enableTracing ? Math.random().toString(36).substring(2, 15) : undefined;\n }\n\n function getMetrics(): TelemetryMetrics {\n return {\n requests: enableMetrics ? metrics.requests : { total: 0, success: 0, errors: 0 },\n latency: enableMetrics ? metrics.latency : { avg: 0, min: 0, max: 0 },\n };\n }\n\n function updateMetrics(event: TelemetryEvent): void {\n if (!enableMetrics) {\n return;\n }\n\n switch (event.type) {\n case 'request':\n metrics.requests.total++;\n break;\n\n case 'response':\n metrics.requests.success++;\n if (event.duration) {\n updateLatency(event.duration);\n }\n break;\n\n case 'error':\n metrics.requests.errors++;\n if (event.duration) {\n updateLatency(event.duration);\n }\n break;\n }\n\n onMetrics(metrics);\n }\n\n function updateLatency(_duration: number): void {\n const latencies = events\n .filter((event): event is TelemetryEvent & { duration: number } => event.duration !== undefined)\n .map((event) => event.duration)\n .filter((d) => d > 0);\n\n if (latencies.length > 0) {\n metrics.latency.avg = latencies.reduce((sum, lat) => sum + lat, 0) / latencies.length;\n metrics.latency.min = Math.min(...latencies);\n metrics.latency.max = Math.max(...latencies);\n }\n }\n\n function logEvent(event: TelemetryEvent): void {\n const logLevel = event.type === 'error' ? 'error' : 'info';\n const message = `[TELEMETRY] ${event.operation} ${event.duration ? `(${event.duration}ms)` : ''}`;\n\n if (event.type === 'error' && event.error) {\n console[logLevel](message, event.error);\n } else {\n console[logLevel](message);\n }\n }\n\n return {\n recordEvent,\n generateTraceId,\n getMetrics,\n };\n}\n\nfunction createTelemetryHttpInterceptor(collector: TelemetryCollector) {\n const startTimes = new Map<string, { time: number; traceId: string | undefined }>();\n\n return {\n before: (context: { method: string; url: string }) => {\n const traceId = collector.generateTraceId();\n const operation = `${context.method.toUpperCase()} ${context.url}`;\n const startTime = Date.now();\n\n startTimes.set(operation, { time: startTime, traceId });\n\n collector.recordEvent({\n timestamp: startTime,\n type: 'request',\n operation,\n traceId,\n });\n\n return undefined;\n },\n after: <T>(context: { method: string; url: string; result: T }) => {\n const operation = `${context.method.toUpperCase()} ${context.url}`;\n const startData = startTimes.get(operation);\n\n if (startData) {\n const duration = Date.now() - startData.time;\n\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'response',\n operation,\n duration,\n status: 200,\n traceId: startData.traceId,\n });\n\n startTimes.delete(operation);\n }\n\n return context.result;\n },\n error: (method: string, url: string, error: Error) => {\n const operation = `${method.toUpperCase()} ${url}`;\n const startData = startTimes.get(operation);\n\n if (startData) {\n const duration = Date.now() - startData.time;\n\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'error',\n operation,\n duration,\n error,\n traceId: startData.traceId,\n });\n\n startTimes.delete(operation);\n }\n },\n };\n}\n\nfunction wrapWebSocketDelegateWithTelemetry(delegate: WebSocketDelegate, collector: TelemetryCollector): WebSocketDelegate {\n const createTimedOperation = (operation: string) => {\n const traceId = collector.generateTraceId();\n const startTime = Date.now();\n\n collector.recordEvent({\n timestamp: startTime,\n type: 'request',\n operation,\n traceId,\n });\n\n return {\n success: () => {\n const duration = Date.now() - startTime;\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'response',\n operation,\n duration,\n status: 200,\n traceId,\n });\n },\n error: (error: Error) => {\n const duration = Date.now() - startTime;\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'error',\n operation,\n duration,\n error,\n traceId,\n });\n },\n };\n };\n\n return {\n ...delegate,\n connect: () => {\n const op = createTimedOperation('connect');\n try {\n delegate.connect();\n op.success();\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n send: (message: unknown) => {\n const op = createTimedOperation('send');\n try {\n delegate.send(message);\n op.success();\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n close: () => {\n const op = createTimedOperation('close');\n try {\n delegate.close();\n op.success();\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n onMessage: (callback: (data: unknown) => void) => {\n const op = createTimedOperation('onMessage');\n try {\n const result = delegate.onMessage(callback);\n op.success();\n return result;\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n onError: (callback: (event: Event) => void) => {\n return delegate.onError((event: Event) => {\n const op = createTimedOperation('onError');\n op.error(new Error('WebSocket error'));\n callback(event);\n });\n },\n };\n}\n\nfunction wrapDelegateWithTelemetry(delegate: Delegate, collector: TelemetryCollector): Delegate {\n if (isHttpDelegate(delegate)) {\n return wrapHttpDelegate(delegate, createTelemetryHttpInterceptor(collector));\n }\n\n if (isWebSocketDelegate(delegate)) {\n return wrapWebSocketDelegateWithTelemetry(delegate, collector);\n }\n\n return delegate;\n}\n\nexport function withTelemetry(options: TelemetryOptions = {}): DelegateFeature<{ telemetry: TelemetryCollector }> {\n return ({ delegate, ...rest }) => {\n const telemetryCollector = createTelemetryCollector(options);\n\n return {\n ...rest,\n delegate: wrapDelegateWithTelemetry(delegate, telemetryCollector),\n telemetry: telemetryCollector,\n };\n };\n}\n","import type { Feature } from './types';\n\ntype Merge<A, B> = Omit<A, keyof B> & B;\n\n/**\n * Creates a universal client that combines multiple features.\n *\n * @param features - The features to be used in the client.\n * @returns A universal client that combines multiple features.\n */\nexport function universalClient<A>(featureA: Feature<unknown, A>): A;\nexport function universalClient<A, B>(featureA: Feature<unknown, A>, featureB: Feature<A, B>): Merge<A, B>;\nexport function universalClient<A, B, C>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>): Merge<Merge<A, B>, C>;\nexport function universalClient<A, B, C, D>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>): Merge<Merge<Merge<A, B>, C>, D>;\nexport function universalClient<A, B, C, D, E>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n): Merge<Merge<Merge<Merge<A, B>, C>, D>, E>;\nexport function universalClient<A, B, C, D, E, F>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n): Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>;\nexport function universalClient<A, B, C, D, E, F, G>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n): Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>;\nexport function universalClient<A, B, C, D, E, F, G, H>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>,\n): Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>;\nexport function universalClient<A, B, C, D, E, F, G, H, I>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>,\n featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>,\n): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>;\nexport function universalClient<A, B, C, D, E, F, G, H, I, J>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>,\n featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>,\n featureJ: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>,\n): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>;\nexport function universalClient(...withFeatures: Feature<unknown, unknown>[]): unknown;\nexport function universalClient(...withFeatures: Feature<unknown, unknown>[]) {\n // biome-ignore lint/performance/noAccumulatingSpread: needed for typescript\n const client = withFeatures.reduce((accumulator, feature) => Object.assign(accumulator, feature(accumulator)), {});\n\n // Extract onInit hook if present\n const { onInit, ...rest } = client as Record<string, unknown>;\n\n // Call onInit hook if it exists\n if (typeof onInit === 'function') {\n onInit(rest);\n }\n\n return rest;\n}\n"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * universal-client v0.0.9-rc.1
3
+ * (c) 2025 Kevin Bonnoron
4
+ * @license MIT
5
+ */
6
+ var P=Object.defineProperty;var M=(e,t)=>()=>(e&&(t=e(e=0)),t);var y=(e,t)=>{for(var a in t)P(e,a,{get:t[a],enumerable:true});};var C={};y(C,{createAxiosDelegate:()=>H});async function H(e){let t;try{t=await new Function("moduleName","return import(moduleName)")("axios");}catch{t=null;}if(!t)throw new Error("Axios is not installed. Please install axios to use the axios delegate.");let a=t.default,{baseURL:r,...o}=e,n=a.create({baseURL:r,...o});return {get(s,i){return n.get(s,{headers:i?.headers}).then(c=>c.data)},post(s,i,c){return n.post(s,i,{headers:c?.headers}).then(p=>p.data)},patch(s,i,c){return n.patch(s,i,{headers:c?.headers}).then(p=>p.data)},put(s,i,c){return n.put(s,i,{headers:c?.headers}).then(p=>p.data)},delete(s,i){return n.delete(s,{headers:i?.headers}).then(c=>c.data)}}}var F=M(()=>{});var T={};y(T,{createBetterFetchDelegate:()=>I});async function I(e){let t;try{t=await new Function("moduleName","return import(moduleName)")("@better-fetch/fetch");}catch{t=null;}if(!t)throw new Error("@better-fetch/fetch is not installed. Please install @better-fetch/fetch to use the better-fetch delegate.");let{createFetch:a}=t,{baseURL:r,...o}=e,n=a({baseURL:r,...o});return {get(s,i){return n(s,{headers:i?.headers}).then(c=>c.data)},post(s,i,c){return n(s,{method:"POST",body:i,headers:c?.headers}).then(p=>p.data)},patch(s,i,c){return n(s,{method:"PATCH",body:i,headers:c?.headers}).then(p=>p.data)},put(s,i,c){return n(s,{method:"PUT",body:i,headers:c?.headers}).then(p=>p.data)},delete(s,i){return n(s,{method:"DELETE",headers:i?.headers}).then(c=>c.data)}}}var b=M(()=>{});var h=e=>t=>e==="json"?t.json():e==="text"?t.text():t;function k({baseURL:e,format:t="json"}){return {get(a,{params:r={},headers:o={}}={}){let n=new URLSearchParams;for(let[s,i]of Object.entries(r))n.append(s,i);return fetch(`${e}${a}${n.size?`?${n}`:""}`,{headers:{...o}}).then(h(t))},post(a,r,{params:o={},headers:n={}}={}){let s=new URLSearchParams;for(let[i,c]of Object.entries(o))s.append(i,c);return fetch(`${e}${a}${s.size?`?${s}`:""}`,{method:"POST",body:JSON.stringify(r),headers:{...n}}).then(h(t))},patch(a,r,{params:o={},headers:n={}}={}){let s=new URLSearchParams;for(let[i,c]of Object.entries(o))s.append(i,c);return fetch(`${e}${a}${s.size?`?${s}`:""}`,{method:"PATCH",body:JSON.stringify(r),headers:{...n}}).then(h(t))},put(a,r,{params:o={},headers:n={}}={}){let s=new URLSearchParams;for(let[i,c]of Object.entries(o))s.append(i,c);return fetch(`${e}${a}${o}`,{method:"PUT",body:JSON.stringify(r),headers:{...n}}).then(h(t))},delete(a,{params:r={},headers:o={}}={}){let n=new URLSearchParams;for(let[s,i]of Object.entries(r))n.append(s,i);return fetch(`${e}${a}${n.size?`?${n}`:""}`,{method:"DELETE",headers:{...o}}).then(h(t))}}}async function S(e){if(e.impl==="axios"){let{createAxiosDelegate:t}=await Promise.resolve().then(()=>(F(),C));return t(e)}if(e.impl==="better-fetch"){let{createBetterFetchDelegate:t}=await Promise.resolve().then(()=>(b(),T));return t(e)}return k(e)}async function O({baseURL:e}){if(typeof EventSource>"u")throw new Error("EventSource is not available. This delegate only works in browser environments.");let t=new EventSource(e),a=new Set,r=new Set,o=new Set;return t.onmessage=n=>{for(let s of r)s(n.data);},t.addEventListener("open",n=>{for(let s of a)s(n);}),t.addEventListener("message",n=>{for(let s of r)s(n.data);}),t.addEventListener("error",n=>{for(let s of o)s(n);}),{close(){t.close();},onOpen(n){return a.add(n),()=>a.delete(n)},onError(n){return o.add(n),()=>o.delete(n)},onMessage(n){return r.add(n),()=>r.delete(n)},subscribe(n,s){let i=c=>s(c.data);return t.addEventListener(n,i),()=>t.removeEventListener(n,i)}}}function x({baseURL:e,protocols:t,reconnectInterval:a=5e3,maxReconnectAttempts:r=10}){let o=null,n=null,s=0,i=new Set,c=new Set,p=new Set,m=new Set;function f(){n!==null||s>=r||(s++,n=window.setTimeout(()=>{n=null,d.connect();},a));}let d={connect:()=>{o&&o.close(),o=new WebSocket(e,t),o.onopen=u=>{s=0;for(let g of i)g(u);},o.onclose=u=>{for(let g of p)g(u);f();},o.onerror=u=>{for(let g of m)g(u);},o.onmessage=u=>{let g;try{g=JSON.parse(u.data);}catch{g=u.data;}for(let l of c)l(g);};},close(){o&&(o.close(),o=null),n!==null&&(window.clearTimeout(n),n=null);},send(u){o&&o.readyState===WebSocket.OPEN?o.send(JSON.stringify(u)):console.warn("WebSocket is not connected. Message not sent.");},onOpen(u){return i.add(u),()=>i.delete(u)},onClose(u){return p.add(u),()=>p.delete(u)},onError(u){return m.add(u),()=>m.delete(u)},onMessage(u){return c.add(u),()=>c.delete(u)}};return d.connect(),d}function v(e){return typeof e=="object"&&e!==null&&"get"in e&&"post"in e&&"patch"in e&&"put"in e&&"delete"in e}function E(e){return typeof e=="object"&&e!==null&&"connect"in e&&"send"in e&&"close"in e}var R=e=>typeof e=="object"&&e!==null&&"type"in e;function A(e){if(R(e)){if(e.type==="http")return $(e);if(e.type==="websocket")return x(e);if(e.type==="server-sent-event")return W(e);throw new Error("Unsupported delegate type")}return e}function $(e){let t=null,a=()=>(t||(t=S(e)),t);return {async get(r,o){return (await a()).get(r,o)},async post(r,o,n){return (await a()).post(r,o,n)},async patch(r,o,n){return (await a()).patch(r,o,n)},async put(r,o,n){return (await a()).put(r,o,n)},async delete(r,o){return (await a()).delete(r,o)}}}function W(e){let t=null,a=()=>(t||(t=O(e)),t);return {close(){t&&t.then(r=>r.close()).catch(console.error);},onOpen(r){let o=null;return a().then(n=>{o=n.onOpen(r);}).catch(n=>console.error("[SSE] Failed to attach onOpen handler:",n)),()=>{o&&o();}},onError(r){let o=null;return a().then(n=>{o=n.onError(r);}).catch(n=>console.error("[SSE] Failed to attach onError handler:",n)),()=>{o&&o();}},onMessage(r){let o=null;return a().then(n=>{o=n.onMessage(r);}).catch(n=>console.error("[SSE] Failed to attach onMessage handler:",n)),()=>{o&&o();}},subscribe(r,o){let n=null;return a().then(s=>{n=s.subscribe(r,o);}).catch(s=>console.error(`[SSE] Failed to subscribe to event "${r}":`,s)),()=>{n&&n();}}}}function w(e,t){let a=r=>{let o=e[r];return async(n,s,i)=>{let c=r==="get"||r==="delete",p=c?void 0:s,f={method:r,url:n,headers:(c?s:i)?.headers,body:p};try{if(t.before){let g=await t.before(f);g&&typeof g=="object"&&(f={...f,...g});}let d=f.headers?{headers:f.headers}:void 0,u=c?await o(f.url,d):await o(f.url,f.body,d);return t.after?await t.after({method:r,url:f.url,result:u,body:f.body}):u}catch(d){throw t.error&&await t.error(r,f.url,d,f.body),d}}};return {get:a("get"),post:a("post"),patch:a("patch"),put:a("put"),delete:a("delete")}}function B(e,t){return {...e,connect:()=>{t.beforeConnect&&Promise.resolve(t.beforeConnect()).catch(console.error),e.connect(),t.afterConnect&&Promise.resolve(t.afterConnect()).catch(console.error);},send:a=>{t.beforeSend&&Promise.resolve(t.beforeSend(a)).catch(console.error),e.send(a),t.afterSend&&Promise.resolve(t.afterSend(a)).catch(console.error);},close:()=>{t.beforeClose&&Promise.resolve(t.beforeClose()).catch(console.error),e.close(),t.afterClose&&Promise.resolve(t.afterClose()).catch(console.error);}}}function me(e,...t){return a=>{let{delegate:r,...o}=t.reduce((s,i)=>{let c=i(s);return Object.assign({},s,c)},{...a,delegate:A(e)});return {[e.name??"delegate"]:r,...o}}}function we(e){return ()=>({...e})}function De(e){return t=>({...e(t),...t})}function L(e){let t=Object.keys(e.environments),a=e.default||t[0],r=a;function o(){return r}function n(i){if(e.environments[i])r=i,console.info(`[ENVIRONMENTS] Switched to environment: ${i} (${e.environments[i]})`);else {let c=e.fallback||a;console.warn(`[ENVIRONMENTS] Environment "${i}" not found, falling back to "${String(c)}"`),r=c;}}function s(){return e.environments[r]||e.environments[Object.keys(e.environments)[0]]}return {getCurrentEnvironment:o,setEnvironment:n,getBaseURL:s}}function q(e,t){let a=r=>{let o=t.getBaseURL();if(r.startsWith("http"))return r;let n=o.replace(/\/$/,""),s=r.startsWith("/")?r:`/${r}`,i=`${n}${s}`;return console.info(`[ENVIRONMENTS] Building URL: ${n} + ${s} = ${i}`),i};return w(e,{before:r=>({url:a(r.url)})})}function N(e,t){return B(e,{beforeConnect:()=>{console.info(`[ENVIRONMENTS] WebSocket connecting to: ${t.getBaseURL()}`);}})}function G(e,t){return v(e)?q(e,t):E(e)?N(e,t):e}function ye(e){return t=>{let{name:a}=e,r=L(e);return {...t,[a]:G(t[a],r),environments:r}}}function Fe(e){return ({delegate:t,...a})=>{let{interceptor:r}=e;return v(t)?{...a,delegate:w(t,r)}:{...a,delegate:t}}}function U(){return typeof navigator<"u"&&navigator.onLine!==void 0?navigator.onLine:true}function j(e){let t=new Map,a=e.cacheTTL??3e5;function r(s,i,c){let p=c?JSON.stringify(c):"";return `${s}:${i}:${p}`}function o(s){let i=t.get(s);return i?Date.now()-i.timestamp>i.ttl?(t.delete(s),null):i.data:null}function n(s,i){t.set(s,{data:i,timestamp:Date.now(),ttl:a});}return {isOnline:U,clearCache:()=>t.clear(),getCacheSize:()=>t.size,getFromCache:o,setInCache:n,generateCacheKey:r}}function J(e,t,a){let r=a.strategy??"cache-first",o=n=>{let s=e[n];return async(i,c,p)=>{let m=n==="get"||n==="delete",f=m?void 0:c,d=m?c:p,u=t.generateCacheKey(String(n),i,f);if(r==="cache-first"){let g=t.getFromCache(u);if(g)return console.info(`[OFFLINE] Cache hit for ${n} ${i}`),g;if(t.isOnline())try{let l=m?await s(i,d):await s(i,f,d);return t.setInCache(u,l),l}catch(l){throw console.error(`[OFFLINE] Network error for ${n} ${i}:`,l),l}throw new Error(`[OFFLINE] No cache available and offline for ${n} ${i}`)}if(r==="network-first"){if(t.isOnline())try{let l=m?await s(i,d):await s(i,f,d);return t.setInCache(u,l),l}catch(l){let D=t.getFromCache(u);if(D)return console.warn(`[OFFLINE] Network failed, using cache for ${n} ${i}`),D;throw l}let g=t.getFromCache(u);if(g)return g;throw new Error(`[OFFLINE] Offline and no cache for ${n} ${i}`)}if(r==="network-only"){if(!t.isOnline())throw new Error(`[OFFLINE] Network unavailable for ${n} ${i}`);return m?await s(i,d):await s(i,f,d)}throw new Error(`[OFFLINE] Unknown strategy: ${r}`)}};return {get:o("get"),post:o("post"),patch:o("patch"),put:o("put"),delete:o("delete")}}function z(e,t,a){return v(e)?J(e,t,a):e}function Se(e={}){return ({delegate:t,...a})=>{let r=j(e);return {...a,delegate:z(t,r,e),offline:r}}}function K({enableMetrics:e=false,enableTracing:t=false,enableLogging:a=false,onEvent:r=()=>{},onMetrics:o=()=>{}}){let n=[],s={requests:{total:0,success:0,errors:0},latency:{avg:0,min:Number.MAX_SAFE_INTEGER,max:Number.MIN_SAFE_INTEGER}};function i(u){n.push(u),m(u),a&&d(u),r(u);}function c(){return t?Math.random().toString(36).substring(2,15):void 0}function p(){return {requests:e?s.requests:{total:0,success:0,errors:0},latency:e?s.latency:{avg:0,min:0,max:0}}}function m(u){if(e){switch(u.type){case "request":s.requests.total++;break;case "response":s.requests.success++,u.duration&&f(u.duration);break;case "error":s.requests.errors++,u.duration&&f(u.duration);break}o(s);}}function f(u){let g=n.filter(l=>l.duration!==void 0).map(l=>l.duration).filter(l=>l>0);g.length>0&&(s.latency.avg=g.reduce((l,D)=>l+D,0)/g.length,s.latency.min=Math.min(...g),s.latency.max=Math.max(...g));}function d(u){let g=u.type==="error"?"error":"info",l=`[TELEMETRY] ${u.operation} ${u.duration?`(${u.duration}ms)`:""}`;u.type==="error"&&u.error?console[g](l,u.error):console[g](l);}return {recordEvent:i,generateTraceId:c,getMetrics:p}}function _(e){let t=new Map;return {before:a=>{let r=e.generateTraceId(),o=`${a.method.toUpperCase()} ${a.url}`,n=Date.now();t.set(o,{time:n,traceId:r}),e.recordEvent({timestamp:n,type:"request",operation:o,traceId:r});},after:a=>{let r=`${a.method.toUpperCase()} ${a.url}`,o=t.get(r);if(o){let n=Date.now()-o.time;e.recordEvent({timestamp:Date.now(),type:"response",operation:r,duration:n,status:200,traceId:o.traceId}),t.delete(r);}return a.result},error:(a,r,o)=>{let n=`${a.toUpperCase()} ${r}`,s=t.get(n);if(s){let i=Date.now()-s.time;e.recordEvent({timestamp:Date.now(),type:"error",operation:n,duration:i,error:o,traceId:s.traceId}),t.delete(n);}}}}function V(e,t){let a=r=>{let o=t.generateTraceId(),n=Date.now();return t.recordEvent({timestamp:n,type:"request",operation:r,traceId:o}),{success:()=>{let s=Date.now()-n;t.recordEvent({timestamp:Date.now(),type:"response",operation:r,duration:s,status:200,traceId:o});},error:s=>{let i=Date.now()-n;t.recordEvent({timestamp:Date.now(),type:"error",operation:r,duration:i,error:s,traceId:o});}}};return {...e,connect:()=>{let r=a("connect");try{e.connect(),r.success();}catch(o){throw r.error(o),o}},send:r=>{let o=a("send");try{e.send(r),o.success();}catch(n){throw o.error(n),n}},close:()=>{let r=a("close");try{e.close(),r.success();}catch(o){throw r.error(o),o}},onMessage:r=>{let o=a("onMessage");try{let n=e.onMessage(r);return o.success(),n}catch(n){throw o.error(n),n}},onError:r=>e.onError(o=>{a("onError").error(new Error("WebSocket error")),r(o);})}}function X(e,t){return v(e)?w(e,_(t)):E(e)?V(e,t):e}function Ae(e={}){return ({delegate:t,...a})=>{let r=K(e);return {...a,delegate:X(t,r),telemetry:r}}}function Je(...e){let t=e.reduce((o,n)=>Object.assign(o,n(o)),{}),{onInit:a,...r}=t;return typeof a=="function"&&a(r),r}export{Je as universalClient,me as withDelegate,ye as withEnvironments,we as withHooks,Fe as withInterceptor,De as withMethods,Se as withOffline,Ae as withTelemetry};//# sourceMappingURL=index.mjs.map
7
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/delegate/http/axios-delegate.utils.ts","../src/utils/delegate/http/better-fetch-delegate.utils.ts","../src/utils/delegate/http/fetch-delegate.utils.ts","../src/utils/delegate/http-delegate.utils.ts","../src/utils/delegate/server-sent-event-delegate.utils.ts","../src/utils/delegate/websocket-delegate.utils.ts","../src/utils/delegate.utils.ts","../src/utils/delegate-middleware.utils.ts","../src/features/core/with-delegate/with-delegate.feature.ts","../src/features/core/with-hooks/with-hooks.feature.ts","../src/features/core/with-methods/with-methods.feature.ts","../src/features/delegate/with-environments/with-environments.feature.ts","../src/features/delegate/with-interceptor/with-interceptor.feature.ts","../src/features/delegate/with-offline/with-offline.feature.ts","../src/features/delegate/with-telemetry/with-telemetry.feature.ts","../src/universal-client.ts"],"names":["axios_delegate_utils_exports","__export","createAxiosDelegate","options","axiosModule","axios","baseURL","restOptions","instance","url","requestOptions","response","body","init_axios_delegate_utils","__esmMin","better_fetch_delegate_utils_exports","createBetterFetchDelegate","betterFetchModule","createFetch","init_better_fetch_delegate_utils","parseResponse","format","createFetchDelegate","params","headers","query","key","value","createHttpDelegate","createServerSentEventDelegate","eventSource","openListeners","messageListeners","errorListeners","event","listener","callback","handler","createWebSocketDelegate","protocols","reconnectInterval","maxReconnectAttempts","socket","reconnectTimer","reconnectAttempts","closeListeners","reconnect","delegate","message","isHttpDelegate","isWebSocketDelegate","isDelegateOptions","createDelegate","delegateOrOptions","createLazyHttpDelegate","createLazyServerSentEventDelegate","delegatePromise","ensureDelegate","d","unsubscribe","error","wrapHttpDelegate","interceptor","wrapMethod","methodName","originalMethod","bodyOrOptions","optionsArg","isGetOrDelete","context","beforeResult","finalOptions","result","wrapWebSocketDelegate","withDelegate","features","input","rest","acc","feature","withHooks","hooks","withMethods","methodCreator","createEnvironmentManager","config","environmentKeys","defaultKey","currentEnv","getCurrentEnvironment","setEnvironment","env","fallback","getBaseURL","wrapHttpDelegateWithEnvironments","envManager","buildFullURL","cleanBaseURL","cleanPath","fullURL","wrapWebSocketDelegateWithEnvironments","wrapDelegateWithEnvironments","withEnvironments","name","environments","withInterceptor","isOnline","createOfflineManager","cache","cacheTTL","generateCacheKey","method","bodyStr","getFromCache","cacheKey","entry","setInCache","data","wrapHttpDelegateWithOffline","offlineManager","strategy","cached","wrapDelegateWithOffline","withOffline","createTelemetryCollector","enableMetrics","enableTracing","enableLogging","onEvent","onMetrics","events","metrics","recordEvent","updateMetrics","logEvent","generateTraceId","getMetrics","updateLatency","_duration","latencies","sum","lat","logLevel","createTelemetryHttpInterceptor","collector","startTimes","traceId","operation","startTime","startData","duration","wrapWebSocketDelegateWithTelemetry","createTimedOperation","op","wrapDelegateWithTelemetry","withTelemetry","telemetryCollector","universalClient","withFeatures","client","accumulator","onInit"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { HttpRequestOptions } from '../../../types';\nimport type { CreateAxiosDelegateOptions } from './types';\n\nexport async function createAxiosDelegate(options: CreateAxiosDelegateOptions) {\n let axiosModule: {\n default: {\n create: (config: Record<string, unknown>) => unknown;\n get: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n post: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n patch: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n put: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n delete: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n } | null;\n try {\n axiosModule = await new Function('moduleName', 'return import(moduleName)')('axios');\n } catch {\n axiosModule = null;\n }\n\n if (!axiosModule) {\n throw new Error('Axios is not installed. Please install axios to use the axios delegate.');\n }\n\n const axios = axiosModule.default;\n const { baseURL, ...restOptions } = options;\n const instance = axios.create({ baseURL, ...restOptions }) as {\n get: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n post: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n patch: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n put: (url: string, data: unknown, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n delete: (url: string, config?: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n\n return {\n get<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance.get(url, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n post<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance.post(url, body, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n patch<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance.patch(url, body, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n put<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance.put(url, body, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n delete<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance.delete(url, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n };\n}\n","import type { HttpRequestOptions } from '../../../types';\nimport type { CreateBetterFetchDelegateOptions } from './types';\n\nexport async function createBetterFetchDelegate(options: CreateBetterFetchDelegateOptions) {\n let betterFetchModule: { createFetch: (options: CreateBetterFetchDelegateOptions) => (url: string, options?: Record<string, unknown>) => Promise<{ data: unknown }> } | null;\n try {\n betterFetchModule = await new Function('moduleName', 'return import(moduleName)')('@better-fetch/fetch');\n } catch {\n betterFetchModule = null;\n }\n\n if (!betterFetchModule) {\n throw new Error('@better-fetch/fetch is not installed. Please install @better-fetch/fetch to use the better-fetch delegate.');\n }\n\n const { createFetch } = betterFetchModule;\n const { baseURL, ...restOptions } = options;\n const instance = createFetch({ baseURL, ...restOptions });\n\n return {\n get<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance(url, { headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n post<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'POST', body, headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n patch<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'PATCH', body, headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n put<T>(url: string, body: unknown, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'PUT', body, headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n delete<T>(url: string, requestOptions?: HttpRequestOptions) {\n return instance(url, { method: 'DELETE', headers: requestOptions?.headers }).then((response: { data: unknown }) => response.data) as Promise<T>;\n },\n };\n}\n","import type { HttpDelegate, HttpRequestOptions } from '../../../types';\nimport type { CreateFetchDelegateOptions } from './types';\n\nconst parseResponse = (format: CreateFetchDelegateOptions['format']) => (response: Response) => {\n if (format === 'json') {\n return response.json();\n }\n\n if (format === 'text') {\n return response.text();\n }\n\n return response;\n};\n\n/**\n * Creates a delegate to handle fetch requests.\n *\n * @param options - The options to be used in the delegate.\n * @returns A delegate to handle fetch requests.\n */\nexport function createFetchDelegate({ baseURL, format = 'json' }: CreateFetchDelegateOptions): HttpDelegate {\n return {\n get<T>(url: string, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n post<T>(url: string, body: unknown, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n method: 'POST',\n body: JSON.stringify(body),\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n patch<T>(url: string, body: unknown, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n method: 'PATCH',\n body: JSON.stringify(body),\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n put<T>(url: string, body: unknown, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${params}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n delete<T>(url: string, { params = {}, headers = {} }: HttpRequestOptions = {}) {\n const query = new URLSearchParams();\n for (const [key, value] of Object.entries(params)) {\n query.append(key, value);\n }\n\n return fetch(`${baseURL}${url}${query.size ? `?${query}` : ''}`, {\n method: 'DELETE',\n headers: {\n ...headers,\n },\n }).then(parseResponse(format)) as Promise<T>;\n },\n };\n}\n","import type { HttpDelegate } from '../../types';\nimport { createFetchDelegate } from './http/fetch-delegate.utils';\nimport type { CreateAxiosDelegateOptions, CreateBetterFetchDelegateOptions, CreateFetchDelegateOptions } from './http/types';\n\nexport type HttpDelegateOptions = CreateFetchDelegateOptions | CreateBetterFetchDelegateOptions | CreateAxiosDelegateOptions;\n\nexport async function createHttpDelegate(options: HttpDelegateOptions): Promise<HttpDelegate> {\n if (options.impl === 'axios') {\n const { createAxiosDelegate } = await import('./http/axios-delegate.utils');\n return createAxiosDelegate(options);\n }\n\n if (options.impl === 'better-fetch') {\n const { createBetterFetchDelegate } = await import('./http/better-fetch-delegate.utils');\n return createBetterFetchDelegate(options);\n }\n\n return createFetchDelegate(options);\n}\n","import type { ServerSentEventDelegate } from '../../types';\n\nexport interface CreateServerSentEventDelegateOptions {\n baseURL: string;\n}\n\nexport type ServerSentEventDelegateOptions = {\n type: 'server-sent-event';\n} & CreateServerSentEventDelegateOptions;\n\n/**\n * Creates a delegate to handle Server Sent Events.\n *\n * @param options - The options to be used in the delegate.\n * @returns A delegate to handle Server Sent Events.\n */\nexport async function createServerSentEventDelegate({ baseURL }: CreateServerSentEventDelegateOptions): Promise<ServerSentEventDelegate> {\n // Use native browser EventSource\n if (typeof EventSource === 'undefined') {\n throw new Error('EventSource is not available. This delegate only works in browser environments.');\n }\n\n const eventSource = new EventSource(baseURL);\n const openListeners: Set<(event: Event) => void> = new Set();\n const messageListeners: Set<(data: unknown) => void> = new Set();\n const errorListeners: Set<(event: Event) => void> = new Set();\n\n eventSource.onmessage = (event) => {\n for (const listener of messageListeners) {\n listener(event.data);\n }\n };\n\n eventSource.addEventListener('open', (event) => {\n for (const listener of openListeners) {\n listener(event);\n }\n });\n\n eventSource.addEventListener('message', (event) => {\n for (const listener of messageListeners) {\n listener(event.data);\n }\n });\n\n eventSource.addEventListener('error', (event) => {\n for (const listener of errorListeners) {\n listener(event);\n }\n });\n\n return {\n close() {\n eventSource.close();\n },\n onOpen(callback: (event: Event) => void) {\n openListeners.add(callback);\n return () => openListeners.delete(callback);\n },\n onError(callback: (event: Event) => void) {\n errorListeners.add(callback);\n return () => errorListeners.delete(callback);\n },\n onMessage(callback: (data: unknown) => void) {\n messageListeners.add(callback);\n return () => messageListeners.delete(callback);\n },\n subscribe(event: string, callback: (data: unknown) => void) {\n const handler = (event: MessageEvent) => callback(event.data);\n eventSource.addEventListener(event, handler);\n return () => eventSource.removeEventListener(event, handler);\n },\n };\n}\n","import type { WebSocketDelegate } from '../../types';\n\nexport interface CreateWebSocketDelegateOptions {\n baseURL: string;\n protocols?: string | string[];\n reconnectInterval?: number;\n maxReconnectAttempts?: number;\n}\n\nexport type WebSocketDelegateOptions = {\n type: 'websocket';\n} & CreateWebSocketDelegateOptions;\n\n/**\n * Creates a delegate to handle WebSocket requests.\n *\n * @param options - The options to be used in the delegate.\n * @returns A delegate to handle WebSocket requests.\n */\nexport function createWebSocketDelegate({ baseURL, protocols, reconnectInterval = 5000, maxReconnectAttempts = 10 }: CreateWebSocketDelegateOptions): WebSocketDelegate {\n let socket: WebSocket | null = null;\n let reconnectTimer: number | null = null;\n let reconnectAttempts = 0;\n const openListeners: Set<(event: Event) => void> = new Set();\n const messageListeners: Set<(data: unknown) => void> = new Set();\n const closeListeners: Set<(event: CloseEvent) => void> = new Set();\n const errorListeners: Set<(event: Event) => void> = new Set();\n\n function reconnect() {\n if (reconnectTimer !== null || reconnectAttempts >= maxReconnectAttempts) {\n return;\n }\n\n reconnectAttempts++;\n reconnectTimer = window.setTimeout(() => {\n reconnectTimer = null;\n delegate.connect();\n }, reconnectInterval);\n }\n\n const delegate: WebSocketDelegate = {\n connect: () => {\n if (socket) {\n socket.close();\n }\n\n socket = new WebSocket(baseURL, protocols);\n socket.onopen = (event) => {\n reconnectAttempts = 0;\n for (const listener of openListeners) {\n listener(event);\n }\n };\n\n socket.onclose = (event) => {\n for (const listener of closeListeners) {\n listener(event);\n }\n reconnect();\n };\n\n socket.onerror = (event) => {\n for (const listener of errorListeners) {\n listener(event);\n }\n };\n\n socket.onmessage = (event) => {\n let message: unknown;\n try {\n message = JSON.parse(event.data);\n } catch (_error) {\n message = event.data;\n }\n\n for (const listener of messageListeners) {\n listener(message);\n }\n };\n },\n close(): void {\n if (socket) {\n socket.close();\n socket = null;\n }\n\n if (reconnectTimer !== null) {\n window.clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n },\n send(message: unknown): void {\n if (socket && socket.readyState === WebSocket.OPEN) {\n socket.send(JSON.stringify(message));\n } else {\n console.warn('WebSocket is not connected. Message not sent.');\n }\n },\n onOpen(callback: (event: Event) => void): () => void {\n openListeners.add(callback);\n return () => openListeners.delete(callback);\n },\n onClose(callback: (event: CloseEvent) => void): () => void {\n closeListeners.add(callback);\n return () => closeListeners.delete(callback);\n },\n onError(callback: (event: Event) => void): () => void {\n errorListeners.add(callback);\n return () => errorListeners.delete(callback);\n },\n onMessage(callback: (data: unknown) => void): () => void {\n messageListeners.add(callback);\n return () => messageListeners.delete(callback);\n },\n };\n\n delegate.connect();\n return delegate;\n}\n","import type { Delegate, HttpDelegate, ServerSentEventDelegate, WebSocketDelegate } from '../types';\nimport { createHttpDelegate, createServerSentEventDelegate, createWebSocketDelegate, type HttpDelegateOptions, type ServerSentEventDelegateOptions, type WebSocketDelegateOptions } from './delegate';\n\nexport function isHttpDelegate(delegate: unknown): delegate is HttpDelegate {\n return typeof delegate === 'object' && delegate !== null && 'get' in delegate && 'post' in delegate && 'patch' in delegate && 'put' in delegate && 'delete' in delegate;\n}\n\nexport function isWebSocketDelegate(delegate: unknown): delegate is WebSocketDelegate {\n return typeof delegate === 'object' && delegate !== null && 'connect' in delegate && 'send' in delegate && 'close' in delegate;\n}\n\nexport function isServerSentEventDelegate(delegate: unknown): delegate is ServerSentEventDelegate {\n return typeof delegate === 'object' && delegate !== null && 'onMessage' in delegate && 'onError' in delegate && 'onOpen' in delegate && 'subscribe' in delegate;\n}\n\nexport function isDelegate(delegate: unknown): delegate is Delegate {\n return isHttpDelegate(delegate) || isWebSocketDelegate(delegate) || isServerSentEventDelegate(delegate);\n}\n\nexport type DelegateOptions = HttpDelegateOptions | WebSocketDelegateOptions | ServerSentEventDelegateOptions;\n\nconst isDelegateOptions = (value: unknown): value is DelegateOptions => {\n return typeof value === 'object' && value !== null && 'type' in value;\n};\n\nexport function createDelegate(delegateOrOptions: Delegate | DelegateOptions): Delegate {\n if (isDelegateOptions(delegateOrOptions)) {\n if (delegateOrOptions.type === 'http') {\n return createLazyHttpDelegate(delegateOrOptions);\n }\n\n if (delegateOrOptions.type === 'websocket') {\n return createWebSocketDelegate(delegateOrOptions);\n }\n\n if (delegateOrOptions.type === 'server-sent-event') {\n return createLazyServerSentEventDelegate(delegateOrOptions);\n }\n\n throw new Error('Unsupported delegate type');\n }\n\n return delegateOrOptions;\n}\n\nfunction createLazyHttpDelegate(options: HttpDelegateOptions): HttpDelegate {\n let delegatePromise: Promise<HttpDelegate> | null = null;\n\n const ensureDelegate = () => {\n if (!delegatePromise) {\n delegatePromise = createHttpDelegate(options);\n }\n return delegatePromise;\n };\n\n return {\n async get<T>(url: string, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.get<T>(url, requestOptions);\n },\n async post<T>(url: string, body: unknown, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.post<T>(url, body, requestOptions);\n },\n async patch<T>(url: string, body: unknown, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.patch<T>(url, body, requestOptions);\n },\n async put<T>(url: string, body: unknown, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.put<T>(url, body, requestOptions);\n },\n async delete<T>(url: string, requestOptions?: Record<string, unknown>): Promise<T> {\n const d = await ensureDelegate();\n return d.delete<T>(url, requestOptions);\n },\n };\n}\n\nfunction createLazyServerSentEventDelegate(options: ServerSentEventDelegateOptions): ServerSentEventDelegate {\n let delegatePromise: Promise<ServerSentEventDelegate> | null = null;\n\n const ensureDelegate = () => {\n if (!delegatePromise) {\n delegatePromise = createServerSentEventDelegate(options);\n }\n return delegatePromise;\n };\n\n return {\n close(): void {\n if (delegatePromise) {\n delegatePromise.then((d) => d.close()).catch(console.error);\n }\n },\n onOpen(callback: (event: Event) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.onOpen(callback);\n })\n .catch((error) => console.error('[SSE] Failed to attach onOpen handler:', error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n onError(callback: (event: Event) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.onError(callback);\n })\n .catch((error) => console.error('[SSE] Failed to attach onError handler:', error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n onMessage(callback: (data: unknown) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.onMessage(callback);\n })\n .catch((error) => console.error('[SSE] Failed to attach onMessage handler:', error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n subscribe(event: string, callback: (data: unknown) => void): () => void {\n let unsubscribe: (() => void) | null = null;\n ensureDelegate()\n .then((d) => {\n unsubscribe = d.subscribe(event, callback);\n })\n .catch((error) => console.error(`[SSE] Failed to subscribe to event \"${event}\":`, error));\n return () => {\n if (unsubscribe) {\n unsubscribe();\n }\n };\n },\n };\n}\n","import type { HttpDelegate, WebSocketDelegate } from '../types';\n\n/**\n * Context for request interception, allows modifying request properties\n */\nexport interface RequestInterceptorContext {\n method: string;\n url: string;\n headers?: Record<string, string>;\n body?: unknown;\n}\n\n/**\n * Context for response interception\n */\nexport interface ResponseInterceptorContext<T = unknown> {\n method: string;\n url: string;\n result: T;\n body?: unknown;\n}\n\n/**\n * Interceptor for HTTP delegate methods\n */\nexport interface HttpInterceptor {\n before?: (context: RequestInterceptorContext) => undefined | Partial<RequestInterceptorContext> | Promise<undefined | Partial<RequestInterceptorContext>>;\n after?: <T>(context: ResponseInterceptorContext<T>) => T | Promise<T>;\n error?: (method: string, url: string, error: Error, body?: unknown) => void | Promise<void>;\n}\n\n/**\n * Interceptor for WebSocket delegate methods\n */\nexport interface WebSocketInterceptor {\n beforeConnect?: () => void | Promise<void>;\n afterConnect?: () => void | Promise<void>;\n beforeSend?: (message: unknown) => void | Promise<void>;\n afterSend?: (message: unknown) => void | Promise<void>;\n beforeClose?: () => void | Promise<void>;\n afterClose?: () => void | Promise<void>;\n onError?: (error: Error) => void | Promise<void>;\n}\n\n/**\n * Wraps an HTTP delegate with interceptors for all methods\n */\nexport function wrapHttpDelegate(delegate: HttpDelegate, interceptor: HttpInterceptor): HttpDelegate {\n const wrapMethod = (methodName: 'get' | 'post' | 'patch' | 'put' | 'delete') => {\n const originalMethod = delegate[methodName];\n\n return async <T>(url: string, bodyOrOptions?: unknown, optionsArg?: unknown): Promise<T> => {\n // Handle overloaded signatures: (url) or (url, body) or (url, options) or (url, body, options)\n const isGetOrDelete = methodName === 'get' || methodName === 'delete';\n const body = isGetOrDelete ? undefined : bodyOrOptions;\n const options = isGetOrDelete ? (bodyOrOptions as { headers?: Record<string, string> }) : (optionsArg as { headers?: Record<string, string> });\n\n let context: RequestInterceptorContext = {\n method: methodName,\n url,\n headers: options?.headers,\n body,\n };\n\n try {\n // Before interceptor (can modify url, headers, body)\n if (interceptor.before) {\n const beforeResult = await interceptor.before(context);\n if (beforeResult && typeof beforeResult === 'object') {\n context = { ...context, ...beforeResult };\n }\n }\n\n // Build options with potentially modified headers\n const finalOptions = context.headers ? { headers: context.headers } : undefined;\n\n // Execute original method with potentially modified properties\n const result = isGetOrDelete\n ? await (originalMethod as (url: string, options?: { headers?: Record<string, string> }) => Promise<T>)(context.url, finalOptions)\n : await (originalMethod as (url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>)(context.url, context.body, finalOptions);\n\n // After interceptor\n if (interceptor.after) {\n return await interceptor.after<T>({\n method: methodName,\n url: context.url,\n result: result as T,\n body: context.body,\n });\n }\n\n return result as T;\n } catch (error) {\n // Error interceptor\n if (interceptor.error) {\n await interceptor.error(methodName, context.url, error as Error, context.body);\n }\n throw error;\n }\n };\n };\n\n return {\n get: wrapMethod('get') as <T>(url: string, options?: { headers?: Record<string, string> }) => Promise<T>,\n post: wrapMethod('post') as <T>(url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>,\n patch: wrapMethod('patch') as <T>(url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>,\n put: wrapMethod('put') as <T>(url: string, body: unknown, options?: { headers?: Record<string, string> }) => Promise<T>,\n delete: wrapMethod('delete') as <T>(url: string, options?: { headers?: Record<string, string> }) => Promise<T>,\n };\n}\n\n/**\n * Wraps a WebSocket delegate with interceptors for connect, send, and close\n */\nexport function wrapWebSocketDelegate(delegate: WebSocketDelegate, interceptor: WebSocketInterceptor): WebSocketDelegate {\n return {\n ...delegate,\n connect: () => {\n if (interceptor.beforeConnect) {\n Promise.resolve(interceptor.beforeConnect()).catch(console.error);\n }\n\n delegate.connect();\n\n if (interceptor.afterConnect) {\n Promise.resolve(interceptor.afterConnect()).catch(console.error);\n }\n },\n\n send: (message: unknown) => {\n if (interceptor.beforeSend) {\n Promise.resolve(interceptor.beforeSend(message)).catch(console.error);\n }\n\n delegate.send(message);\n\n if (interceptor.afterSend) {\n Promise.resolve(interceptor.afterSend(message)).catch(console.error);\n }\n },\n\n close: () => {\n if (interceptor.beforeClose) {\n Promise.resolve(interceptor.beforeClose()).catch(console.error);\n }\n\n delegate.close();\n\n if (interceptor.afterClose) {\n Promise.resolve(interceptor.afterClose()).catch(console.error);\n }\n },\n };\n}\n","import type { DelegateFeature, Feature, HttpDelegate, ServerSentEventDelegate, WebSocketDelegate } from '../../../types';\nimport { createDelegate, type DelegateOptions } from '../../../utils';\n\ntype DelegateFromOptions<O extends DelegateOptions> = O['type'] extends 'http' ? HttpDelegate : O['type'] extends 'websocket' ? WebSocketDelegate : O['type'] extends 'server-sent-event' ? ServerSentEventDelegate : never;\n\n/**\n * Add a delegate to the client.\n *\n * @param options - The options for the delegate.\n * @param features - The features to apply to the delegate.\n * @returns A feature that returns the delegate.\n */\nexport function withDelegate<const Options extends DelegateOptions & { name: string }>(options: Options, ...features: DelegateFeature[]): Feature<unknown, { [key in Options['name']]: DelegateFromOptions<Options> }>;\nexport function withDelegate<const Options extends DelegateOptions>(options: Options, ...features: DelegateFeature[]): Feature<unknown, { delegate: DelegateFromOptions<Options> }>;\nexport function withDelegate(options: DelegateOptions & { name?: string }, ...features: DelegateFeature[]): unknown {\n return (input: Record<string, unknown>) => {\n const { delegate, ...rest } = features.reduce(\n (acc, feature) => {\n const result = feature(acc);\n return Object.assign({}, acc, result);\n },\n { ...input, delegate: createDelegate(options) },\n );\n\n const delegateName = options.name ?? 'delegate';\n\n return {\n [delegateName]: delegate,\n ...rest,\n };\n };\n}\n","import type { Feature } from '../../../types';\n\ninterface Hooks<Input> {\n onInit?: (input: Input) => void;\n}\n\n/**\n * Add hooks to the client.\n *\n * @param hooks - The hooks to be used in the feature.\n * @returns A feature that returns the hooks.\n */\nexport function withHooks<H extends Hooks<Input>, Input>(hooks: H): Feature<Input, Input> {\n return () => ({ ...hooks }) as unknown as Input;\n}\n","import type { Feature } from '../../../types';\n\n/**\n * Add methods to the client.\n *\n * @param methodCreator - The method creator to be used in the feature.\n * @returns A feature that returns the methods.\n */\nexport function withMethods<Methods, Input>(methodCreator: (input: Input) => Methods): Feature<Input, Methods & Input> {\n return (input) => ({ ...methodCreator(input), ...input });\n}\n","import type { Feature, HttpDelegate, WebSocketDelegate } from '../../../types';\nimport { isHttpDelegate, isWebSocketDelegate, wrapHttpDelegate, wrapWebSocketDelegate } from '../../../utils';\n\ntype Environments = Record<string, string>;\n\ninterface EnvironmentsConfig<Input, Environment extends Environments = Environments> {\n name: keyof Input;\n environments: Environment;\n default?: keyof Environment;\n fallback?: keyof Environment;\n}\n\ninterface EnvironmentManager<Environment extends Environments> {\n getCurrentEnvironment(): keyof Environment;\n setEnvironment(env: keyof Environment): void;\n getBaseURL(): string;\n}\n\nfunction createEnvironmentManager<Input, Environment extends Environments>(config: EnvironmentsConfig<Input, Environment>): EnvironmentManager<Environment> {\n const environmentKeys = Object.keys(config.environments);\n const defaultKey = config.default || environmentKeys[0];\n let currentEnv = defaultKey;\n\n function getCurrentEnvironment(): keyof Environment {\n return currentEnv;\n }\n\n function setEnvironment(env: string): void {\n if (!config.environments[env]) {\n const fallback = config.fallback || defaultKey;\n console.warn(`[ENVIRONMENTS] Environment \"${env}\" not found, falling back to \"${String(fallback)}\"`);\n currentEnv = fallback;\n } else {\n currentEnv = env;\n console.info(`[ENVIRONMENTS] Switched to environment: ${env} (${config.environments[env]})`);\n }\n }\n\n function getBaseURL() {\n return config.environments[currentEnv] || config.environments[Object.keys(config.environments)[0]];\n }\n\n return {\n getCurrentEnvironment,\n setEnvironment,\n getBaseURL,\n };\n}\n\nfunction wrapHttpDelegateWithEnvironments<Environment extends Environments>(delegate: HttpDelegate, envManager: EnvironmentManager<Environment>): HttpDelegate {\n const buildFullURL = (url: string) => {\n const baseURL = envManager.getBaseURL();\n if (url.startsWith('http')) {\n return url;\n }\n\n const cleanBaseURL = baseURL.replace(/\\/$/, '');\n const cleanPath = url.startsWith('/') ? url : `/${url}`;\n const fullURL = `${cleanBaseURL}${cleanPath}`;\n console.info(`[ENVIRONMENTS] Building URL: ${cleanBaseURL} + ${cleanPath} = ${fullURL}`);\n return fullURL;\n };\n\n return wrapHttpDelegate(delegate, {\n before: (context) => {\n return { url: buildFullURL(context.url) };\n },\n });\n}\n\nfunction wrapWebSocketDelegateWithEnvironments<Environment extends Environments>(delegate: WebSocketDelegate, envManager: EnvironmentManager<Environment>): WebSocketDelegate {\n return wrapWebSocketDelegate(delegate, {\n beforeConnect: () => {\n console.info(`[ENVIRONMENTS] WebSocket connecting to: ${envManager.getBaseURL()}`);\n },\n });\n}\n\nfunction wrapDelegateWithEnvironments<Environment extends Environments>(delegate: unknown, envManager: EnvironmentManager<Environment>): unknown {\n if (isHttpDelegate(delegate)) {\n return wrapHttpDelegateWithEnvironments(delegate, envManager);\n }\n\n if (isWebSocketDelegate(delegate)) {\n return wrapWebSocketDelegateWithEnvironments(delegate, envManager);\n }\n\n return delegate;\n}\n\nexport function withEnvironments<Input, Environment extends Environments>(config: EnvironmentsConfig<Input, Environment>): Feature<Input, Input & { environments: EnvironmentManager<Environment> }> {\n return (input: Input) => {\n const { name } = config;\n const environments = createEnvironmentManager(config);\n\n return {\n ...input,\n [name]: wrapDelegateWithEnvironments(input[name], environments),\n environments,\n };\n };\n}\n","import type { DelegateFeature } from '../../../types';\nimport { isHttpDelegate, wrapHttpDelegate } from '../../../utils';\nimport type { HttpInterceptor } from '../../../utils/delegate-middleware.utils';\n\nexport interface InterceptorConfig {\n name?: string;\n interceptor: HttpInterceptor;\n}\n\n/**\n * Add HTTP interceptor to the delegate.\n *\n * @param config - The interceptor configuration.\n * @returns A delegate feature that wraps the HTTP delegate with the interceptor.\n */\nexport function withInterceptor(config: InterceptorConfig): DelegateFeature {\n return ({ delegate, ...rest }) => {\n const { interceptor } = config;\n\n if (isHttpDelegate(delegate)) {\n return {\n ...rest,\n delegate: wrapHttpDelegate(delegate, interceptor),\n };\n }\n\n return { ...rest, delegate };\n };\n}\n","import type { Delegate, DelegateFeature, HttpDelegate } from '../../../types';\nimport { isHttpDelegate } from '../../../utils';\n\ninterface OfflineConfig {\n /**\n * The strategy to use for the offline manager.\n * @default 'cache-first'\n */\n strategy?: 'cache-first' | 'network-first' | 'network-only';\n /**\n * The TTL for the cache in milliseconds.\n * @default 300000 (5 minutes)\n */\n cacheTTL?: number;\n}\n\ninterface CacheEntry<T = unknown> {\n data: T;\n timestamp: number;\n ttl: number;\n}\n\ninterface OfflineManager {\n isOnline(): boolean;\n clearCache(): void;\n getCacheSize(): number;\n}\n\ninterface ExtendedOfflineManager extends OfflineManager {\n getFromCache: <T>(key: string) => T | null;\n setInCache: <T>(key: string, data: T) => void;\n generateCacheKey: (method: string, url: string, body?: unknown) => string;\n}\n\nfunction isOnline(): boolean {\n return typeof navigator !== 'undefined' && navigator.onLine !== undefined ? navigator.onLine : true;\n}\n\nfunction createOfflineManager(config: OfflineConfig): ExtendedOfflineManager {\n const cache = new Map<string, CacheEntry>();\n const cacheTTL = config.cacheTTL ?? 300000;\n\n function generateCacheKey(method: string, url: string, body?: unknown): string {\n const bodyStr = body ? JSON.stringify(body) : '';\n return `${method}:${url}:${bodyStr}`;\n }\n\n function getFromCache<T>(cacheKey: string): T | null {\n const entry = cache.get(cacheKey);\n if (!entry) {\n return null;\n }\n\n if (Date.now() - entry.timestamp > entry.ttl) {\n cache.delete(cacheKey);\n return null;\n }\n\n return entry.data as T;\n }\n\n function setInCache<T>(cacheKey: string, data: T): void {\n cache.set(cacheKey, {\n data,\n timestamp: Date.now(),\n ttl: cacheTTL,\n });\n }\n\n return {\n isOnline,\n clearCache: () => cache.clear(),\n getCacheSize: () => cache.size,\n getFromCache: getFromCache,\n setInCache: setInCache,\n generateCacheKey: generateCacheKey,\n };\n}\n\nfunction wrapHttpDelegateWithOffline(delegate: HttpDelegate, offlineManager: ExtendedOfflineManager, config: OfflineConfig): HttpDelegate {\n const strategy = config.strategy ?? 'cache-first';\n\n const wrapMethod = <K extends keyof HttpDelegate>(methodName: K) => {\n const originalMethod = delegate[methodName];\n\n return async <T>(url: string, bodyOrOptions?: unknown, optionsArg?: unknown): Promise<T> => {\n // Handle overloaded signatures\n const isGetOrDelete = methodName === 'get' || methodName === 'delete';\n const body = isGetOrDelete ? undefined : bodyOrOptions;\n const options = isGetOrDelete ? bodyOrOptions : optionsArg;\n\n const cacheKey = offlineManager.generateCacheKey(String(methodName), url, body);\n\n if (strategy === 'cache-first') {\n const cached = offlineManager.getFromCache<T>(cacheKey);\n if (cached) {\n console.info(`[OFFLINE] Cache hit for ${methodName} ${url}`);\n return cached;\n }\n\n if (offlineManager.isOnline()) {\n try {\n const result = isGetOrDelete ? await (originalMethod as (url: string, options?: unknown) => Promise<T>)(url, options) : await (originalMethod as (url: string, body: unknown, options?: unknown) => Promise<T>)(url, body, options);\n offlineManager.setInCache(cacheKey, result);\n return result;\n } catch (error) {\n console.error(`[OFFLINE] Network error for ${methodName} ${url}:`, error);\n throw error;\n }\n }\n\n throw new Error(`[OFFLINE] No cache available and offline for ${methodName} ${url}`);\n }\n\n if (strategy === 'network-first') {\n if (offlineManager.isOnline()) {\n try {\n const result = isGetOrDelete ? await (originalMethod as (url: string, options?: unknown) => Promise<T>)(url, options) : await (originalMethod as (url: string, body: unknown, options?: unknown) => Promise<T>)(url, body, options);\n offlineManager.setInCache(cacheKey, result);\n return result;\n } catch (error) {\n const cached = offlineManager.getFromCache<T>(cacheKey);\n if (cached) {\n console.warn(`[OFFLINE] Network failed, using cache for ${methodName} ${url}`);\n return cached;\n }\n throw error;\n }\n }\n\n const cached = offlineManager.getFromCache<T>(cacheKey);\n if (cached) {\n return cached;\n }\n throw new Error(`[OFFLINE] Offline and no cache for ${methodName} ${url}`);\n }\n\n if (strategy === 'network-only') {\n if (!offlineManager.isOnline()) {\n throw new Error(`[OFFLINE] Network unavailable for ${methodName} ${url}`);\n }\n return isGetOrDelete ? await (originalMethod as (url: string, options?: unknown) => Promise<T>)(url, options) : await (originalMethod as (url: string, body: unknown, options?: unknown) => Promise<T>)(url, body, options);\n }\n\n throw new Error(`[OFFLINE] Unknown strategy: ${strategy}`);\n };\n };\n\n return {\n get: wrapMethod('get'),\n post: wrapMethod('post'),\n patch: wrapMethod('patch'),\n put: wrapMethod('put'),\n delete: wrapMethod('delete'),\n };\n}\n\nfunction wrapDelegateWithOffline(delegate: Delegate, offlineManager: ExtendedOfflineManager, config: OfflineConfig): Delegate {\n if (isHttpDelegate(delegate)) {\n return wrapHttpDelegateWithOffline(delegate, offlineManager, config);\n }\n\n return delegate;\n}\n\nexport function withOffline(config: OfflineConfig = {}): DelegateFeature<{ offline: OfflineManager }> {\n return ({ delegate, ...rest }) => {\n const offlineManager = createOfflineManager(config);\n\n return {\n ...rest,\n delegate: wrapDelegateWithOffline(delegate, offlineManager, config),\n offline: offlineManager,\n };\n };\n}\n","import type { Delegate, DelegateFeature, WebSocketDelegate } from '../../../types';\nimport { isHttpDelegate, isWebSocketDelegate, wrapHttpDelegate } from '../../../utils';\n\ninterface TelemetryEvent {\n timestamp: number;\n type: 'request' | 'response' | 'error';\n operation: string;\n duration?: number;\n status?: number;\n error?: Error;\n traceId?: string;\n}\n\ninterface TelemetryMetrics {\n requests: { total: number; success: number; errors: number };\n latency: { avg: number; min: number; max: number };\n}\n\ninterface TelemetryCollector {\n recordEvent: (event: TelemetryEvent) => void;\n generateTraceId: () => string | undefined;\n getMetrics: () => TelemetryMetrics;\n}\n\ninterface TelemetryOptions {\n enableMetrics?: boolean;\n enableTracing?: boolean;\n enableLogging?: boolean;\n onEvent?: (event: TelemetryEvent) => void;\n onMetrics?: (metrics: TelemetryMetrics) => void;\n}\n\nfunction createTelemetryCollector({ enableMetrics = false, enableTracing = false, enableLogging = false, onEvent = () => {}, onMetrics = () => {} }: TelemetryOptions): TelemetryCollector {\n const events: TelemetryEvent[] = [];\n const metrics: TelemetryMetrics = {\n requests: { total: 0, success: 0, errors: 0 },\n latency: { avg: 0, min: Number.MAX_SAFE_INTEGER, max: Number.MIN_SAFE_INTEGER },\n };\n\n function recordEvent(event: TelemetryEvent): void {\n events.push(event);\n updateMetrics(event);\n\n if (enableLogging) {\n logEvent(event);\n }\n\n onEvent(event);\n }\n\n function generateTraceId(): string | undefined {\n return enableTracing ? Math.random().toString(36).substring(2, 15) : undefined;\n }\n\n function getMetrics(): TelemetryMetrics {\n return {\n requests: enableMetrics ? metrics.requests : { total: 0, success: 0, errors: 0 },\n latency: enableMetrics ? metrics.latency : { avg: 0, min: 0, max: 0 },\n };\n }\n\n function updateMetrics(event: TelemetryEvent): void {\n if (!enableMetrics) {\n return;\n }\n\n switch (event.type) {\n case 'request':\n metrics.requests.total++;\n break;\n\n case 'response':\n metrics.requests.success++;\n if (event.duration) {\n updateLatency(event.duration);\n }\n break;\n\n case 'error':\n metrics.requests.errors++;\n if (event.duration) {\n updateLatency(event.duration);\n }\n break;\n }\n\n onMetrics(metrics);\n }\n\n function updateLatency(_duration: number): void {\n const latencies = events\n .filter((event): event is TelemetryEvent & { duration: number } => event.duration !== undefined)\n .map((event) => event.duration)\n .filter((d) => d > 0);\n\n if (latencies.length > 0) {\n metrics.latency.avg = latencies.reduce((sum, lat) => sum + lat, 0) / latencies.length;\n metrics.latency.min = Math.min(...latencies);\n metrics.latency.max = Math.max(...latencies);\n }\n }\n\n function logEvent(event: TelemetryEvent): void {\n const logLevel = event.type === 'error' ? 'error' : 'info';\n const message = `[TELEMETRY] ${event.operation} ${event.duration ? `(${event.duration}ms)` : ''}`;\n\n if (event.type === 'error' && event.error) {\n console[logLevel](message, event.error);\n } else {\n console[logLevel](message);\n }\n }\n\n return {\n recordEvent,\n generateTraceId,\n getMetrics,\n };\n}\n\nfunction createTelemetryHttpInterceptor(collector: TelemetryCollector) {\n const startTimes = new Map<string, { time: number; traceId: string | undefined }>();\n\n return {\n before: (context: { method: string; url: string }) => {\n const traceId = collector.generateTraceId();\n const operation = `${context.method.toUpperCase()} ${context.url}`;\n const startTime = Date.now();\n\n startTimes.set(operation, { time: startTime, traceId });\n\n collector.recordEvent({\n timestamp: startTime,\n type: 'request',\n operation,\n traceId,\n });\n\n return undefined;\n },\n after: <T>(context: { method: string; url: string; result: T }) => {\n const operation = `${context.method.toUpperCase()} ${context.url}`;\n const startData = startTimes.get(operation);\n\n if (startData) {\n const duration = Date.now() - startData.time;\n\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'response',\n operation,\n duration,\n status: 200,\n traceId: startData.traceId,\n });\n\n startTimes.delete(operation);\n }\n\n return context.result;\n },\n error: (method: string, url: string, error: Error) => {\n const operation = `${method.toUpperCase()} ${url}`;\n const startData = startTimes.get(operation);\n\n if (startData) {\n const duration = Date.now() - startData.time;\n\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'error',\n operation,\n duration,\n error,\n traceId: startData.traceId,\n });\n\n startTimes.delete(operation);\n }\n },\n };\n}\n\nfunction wrapWebSocketDelegateWithTelemetry(delegate: WebSocketDelegate, collector: TelemetryCollector): WebSocketDelegate {\n const createTimedOperation = (operation: string) => {\n const traceId = collector.generateTraceId();\n const startTime = Date.now();\n\n collector.recordEvent({\n timestamp: startTime,\n type: 'request',\n operation,\n traceId,\n });\n\n return {\n success: () => {\n const duration = Date.now() - startTime;\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'response',\n operation,\n duration,\n status: 200,\n traceId,\n });\n },\n error: (error: Error) => {\n const duration = Date.now() - startTime;\n collector.recordEvent({\n timestamp: Date.now(),\n type: 'error',\n operation,\n duration,\n error,\n traceId,\n });\n },\n };\n };\n\n return {\n ...delegate,\n connect: () => {\n const op = createTimedOperation('connect');\n try {\n delegate.connect();\n op.success();\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n send: (message: unknown) => {\n const op = createTimedOperation('send');\n try {\n delegate.send(message);\n op.success();\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n close: () => {\n const op = createTimedOperation('close');\n try {\n delegate.close();\n op.success();\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n onMessage: (callback: (data: unknown) => void) => {\n const op = createTimedOperation('onMessage');\n try {\n const result = delegate.onMessage(callback);\n op.success();\n return result;\n } catch (error) {\n op.error(error as Error);\n throw error;\n }\n },\n onError: (callback: (event: Event) => void) => {\n return delegate.onError((event: Event) => {\n const op = createTimedOperation('onError');\n op.error(new Error('WebSocket error'));\n callback(event);\n });\n },\n };\n}\n\nfunction wrapDelegateWithTelemetry(delegate: Delegate, collector: TelemetryCollector): Delegate {\n if (isHttpDelegate(delegate)) {\n return wrapHttpDelegate(delegate, createTelemetryHttpInterceptor(collector));\n }\n\n if (isWebSocketDelegate(delegate)) {\n return wrapWebSocketDelegateWithTelemetry(delegate, collector);\n }\n\n return delegate;\n}\n\nexport function withTelemetry(options: TelemetryOptions = {}): DelegateFeature<{ telemetry: TelemetryCollector }> {\n return ({ delegate, ...rest }) => {\n const telemetryCollector = createTelemetryCollector(options);\n\n return {\n ...rest,\n delegate: wrapDelegateWithTelemetry(delegate, telemetryCollector),\n telemetry: telemetryCollector,\n };\n };\n}\n","import type { Feature } from './types';\n\ntype Merge<A, B> = Omit<A, keyof B> & B;\n\n/**\n * Creates a universal client that combines multiple features.\n *\n * @param features - The features to be used in the client.\n * @returns A universal client that combines multiple features.\n */\nexport function universalClient<A>(featureA: Feature<unknown, A>): A;\nexport function universalClient<A, B>(featureA: Feature<unknown, A>, featureB: Feature<A, B>): Merge<A, B>;\nexport function universalClient<A, B, C>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>): Merge<Merge<A, B>, C>;\nexport function universalClient<A, B, C, D>(featureA: Feature<unknown, A>, featureB: Feature<A, B>, featureC: Feature<Merge<A, B>, C>, featureD: Feature<Merge<Merge<A, B>, C>, D>): Merge<Merge<Merge<A, B>, C>, D>;\nexport function universalClient<A, B, C, D, E>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n): Merge<Merge<Merge<Merge<A, B>, C>, D>, E>;\nexport function universalClient<A, B, C, D, E, F>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n): Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>;\nexport function universalClient<A, B, C, D, E, F, G>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n): Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>;\nexport function universalClient<A, B, C, D, E, F, G, H>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>,\n): Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>;\nexport function universalClient<A, B, C, D, E, F, G, H, I>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>,\n featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>,\n): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>;\nexport function universalClient<A, B, C, D, E, F, G, H, I, J>(\n featureA: Feature<unknown, A>,\n featureB: Feature<A, B>,\n featureC: Feature<Merge<A, B>, C>,\n featureD: Feature<Merge<Merge<A, B>, C>, D>,\n featureE: Feature<Merge<Merge<Merge<A, B>, C>, D>, E>,\n featureF: Feature<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>,\n featureG: Feature<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>,\n featureH: Feature<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>,\n featureI: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>,\n featureJ: Feature<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>,\n): Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<Merge<A, B>, C>, D>, E>, F>, G>, H>, I>, J>;\nexport function universalClient(...withFeatures: Feature<unknown, unknown>[]): unknown;\nexport function universalClient(...withFeatures: Feature<unknown, unknown>[]) {\n // biome-ignore lint/performance/noAccumulatingSpread: needed for typescript\n const client = withFeatures.reduce((accumulator, feature) => Object.assign(accumulator, feature(accumulator)), {});\n\n // Extract onInit hook if present\n const { onInit, ...rest } = client as Record<string, unknown>;\n\n // Call onInit hook if it exists\n if (typeof onInit === 'function') {\n onInit(rest);\n }\n\n return rest;\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "universal-client",
3
+ "description": "Universal client for web applications",
4
+ "version": "0.0.9-rc.1",
5
+ "keywords": [
6
+ "api",
7
+ "client",
8
+ "fetch",
9
+ "websocket",
10
+ "sse",
11
+ "universal"
12
+ ],
13
+ "author": "Kevin Bonnoron",
14
+ "license": "MIT",
15
+ "main": "dist/index.js",
16
+ "module": "dist/index.mjs",
17
+ "types": "dist/index.d.ts",
18
+ "exports": {
19
+ ".": {
20
+ "types": "./dist/index.d.ts",
21
+ "import": "./dist/index.mjs",
22
+ "require": "./dist/index.js"
23
+ }
24
+ },
25
+ "files": [
26
+ "dist"
27
+ ],
28
+ "scripts": {
29
+ "build": "tsup",
30
+ "build:watch": "tsup --watch",
31
+ "build:analyze": "tsup --metafile && bunx esbuild-visualizer --metadata dist/metafile-*.json --open",
32
+ "dev": "tsup --watch",
33
+ "test": "bun test",
34
+ "test:watch": "bun test --watch",
35
+ "test:coverage": "bun test --coverage",
36
+ "test:ui": "bun test --watch",
37
+ "lint": "bunx biome check",
38
+ "lint:fix": "bunx biome check --write",
39
+ "format": "bunx biome format --write",
40
+ "typecheck": "tsc --noEmit",
41
+ "prepublishOnly": "bun run build",
42
+ "version:patch": "node scripts/version.js patch",
43
+ "version:minor": "node scripts/version.js minor",
44
+ "version:major": "node scripts/version.js major",
45
+ "version:alpha": "node scripts/version.js alpha",
46
+ "version:beta": "node scripts/version.js beta",
47
+ "version:rc": "node scripts/version.js rc"
48
+ },
49
+ "devDependencies": {
50
+ "@biomejs/biome": "2.2.5",
51
+ "@types/bun": "latest",
52
+ "eventsource": "^4.0.0",
53
+ "tsup": "^8.5.0"
54
+ },
55
+ "peerDependencies": {
56
+ "typescript": "^5.0.0"
57
+ },
58
+ "peerDependenciesMeta": {
59
+ "axios": {
60
+ "optional": true
61
+ },
62
+ "@better-fetch/fetch": {
63
+ "optional": true
64
+ }
65
+ }
66
+ }