@fgrzl/fetch 1.1.0-alpha.3 → 1.1.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -12
- package/dist/cjs/client/fetch-client.d.ts +189 -0
- package/dist/cjs/client/fetch-client.d.ts.map +1 -0
- package/dist/cjs/client/fetch-client.js +339 -0
- package/dist/cjs/client/fetch-client.js.map +1 -0
- package/dist/cjs/client/index.d.ts +11 -0
- package/dist/cjs/client/index.d.ts.map +1 -0
- package/dist/cjs/client/index.js +14 -0
- package/dist/cjs/client/index.js.map +1 -0
- package/dist/cjs/client/types.d.ts +63 -0
- package/dist/cjs/client/types.d.ts.map +1 -0
- package/dist/cjs/client/types.js +9 -0
- package/dist/cjs/client/types.js.map +1 -0
- package/dist/{errors.d.ts → cjs/errors/index.d.ts} +20 -3
- package/dist/cjs/errors/index.d.ts.map +1 -0
- package/dist/{errors.js → cjs/errors/index.js} +23 -3
- package/dist/cjs/errors/index.js.map +1 -0
- package/dist/cjs/index.d.ts +65 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +118 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/middleware/authentication/authentication.d.ts +31 -0
- package/dist/cjs/middleware/authentication/authentication.d.ts.map +1 -0
- package/dist/cjs/middleware/authentication/authentication.js +93 -0
- package/dist/cjs/middleware/authentication/authentication.js.map +1 -0
- package/dist/cjs/middleware/authentication/index.d.ts +37 -0
- package/dist/cjs/middleware/authentication/index.d.ts.map +1 -0
- package/dist/cjs/middleware/authentication/index.js +42 -0
- package/dist/cjs/middleware/authentication/index.js.map +1 -0
- package/dist/cjs/middleware/authentication/types.d.ts +73 -0
- package/dist/cjs/middleware/authentication/types.d.ts.map +1 -0
- package/dist/cjs/middleware/authentication/types.js +6 -0
- package/dist/cjs/middleware/authentication/types.js.map +1 -0
- package/dist/cjs/middleware/authorization/authorization.d.ts +30 -0
- package/dist/cjs/middleware/authorization/authorization.d.ts.map +1 -0
- package/dist/cjs/middleware/authorization/authorization.js +82 -0
- package/dist/cjs/middleware/authorization/authorization.js.map +1 -0
- package/dist/cjs/middleware/authorization/index.d.ts +36 -0
- package/dist/cjs/middleware/authorization/index.d.ts.map +1 -0
- package/dist/cjs/middleware/authorization/index.js +41 -0
- package/dist/cjs/middleware/authorization/index.js.map +1 -0
- package/dist/cjs/middleware/authorization/types.d.ts +67 -0
- package/dist/cjs/middleware/authorization/types.d.ts.map +1 -0
- package/dist/cjs/middleware/authorization/types.js +6 -0
- package/dist/cjs/middleware/authorization/types.js.map +1 -0
- package/dist/cjs/middleware/cache/cache.d.ts +41 -0
- package/dist/cjs/middleware/cache/cache.d.ts.map +1 -0
- package/dist/cjs/middleware/cache/cache.js +191 -0
- package/dist/cjs/middleware/cache/cache.js.map +1 -0
- package/dist/cjs/middleware/cache/index.d.ts +44 -0
- package/dist/cjs/middleware/cache/index.d.ts.map +1 -0
- package/dist/cjs/middleware/cache/index.js +50 -0
- package/dist/cjs/middleware/cache/index.js.map +1 -0
- package/dist/cjs/middleware/cache/types.d.ts +89 -0
- package/dist/cjs/middleware/cache/types.d.ts.map +1 -0
- package/dist/cjs/middleware/cache/types.js +6 -0
- package/dist/cjs/middleware/cache/types.js.map +1 -0
- package/dist/cjs/middleware/csrf/csrf.d.ts +34 -0
- package/dist/cjs/middleware/csrf/csrf.d.ts.map +1 -0
- package/dist/cjs/middleware/csrf/csrf.js +94 -0
- package/dist/cjs/middleware/csrf/csrf.js.map +1 -0
- package/dist/cjs/middleware/csrf/index.d.ts +57 -0
- package/dist/cjs/middleware/csrf/index.d.ts.map +1 -0
- package/dist/cjs/middleware/csrf/index.js +62 -0
- package/dist/cjs/middleware/csrf/index.js.map +1 -0
- package/dist/cjs/middleware/csrf/types.d.ts +57 -0
- package/dist/cjs/middleware/csrf/types.d.ts.map +1 -0
- package/dist/cjs/middleware/csrf/types.js +6 -0
- package/dist/cjs/middleware/csrf/types.js.map +1 -0
- package/dist/cjs/middleware/index.d.ts +115 -0
- package/dist/cjs/middleware/index.d.ts.map +1 -0
- package/dist/cjs/middleware/index.js +153 -0
- package/dist/cjs/middleware/index.js.map +1 -0
- package/dist/cjs/middleware/logging/index.d.ts +42 -0
- package/dist/cjs/middleware/logging/index.d.ts.map +1 -0
- package/dist/cjs/middleware/logging/index.js +47 -0
- package/dist/cjs/middleware/logging/index.js.map +1 -0
- package/dist/cjs/middleware/logging/logging.d.ts +29 -0
- package/dist/cjs/middleware/logging/logging.d.ts.map +1 -0
- package/dist/cjs/middleware/logging/logging.js +171 -0
- package/dist/cjs/middleware/logging/logging.js.map +1 -0
- package/dist/cjs/middleware/logging/types.d.ts +90 -0
- package/dist/cjs/middleware/logging/types.d.ts.map +1 -0
- package/dist/cjs/middleware/logging/types.js +6 -0
- package/dist/cjs/middleware/logging/types.js.map +1 -0
- package/dist/cjs/middleware/rate-limit/index.d.ts +16 -0
- package/dist/cjs/middleware/rate-limit/index.d.ts.map +1 -0
- package/dist/cjs/middleware/rate-limit/index.js +21 -0
- package/dist/cjs/middleware/rate-limit/index.js.map +1 -0
- package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +14 -0
- package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +1 -0
- package/dist/cjs/middleware/rate-limit/rate-limit.js +87 -0
- package/dist/cjs/middleware/rate-limit/rate-limit.js.map +1 -0
- package/dist/cjs/middleware/rate-limit/types.d.ts +97 -0
- package/dist/cjs/middleware/rate-limit/types.d.ts.map +1 -0
- package/dist/cjs/middleware/rate-limit/types.js +6 -0
- package/dist/cjs/middleware/rate-limit/types.js.map +1 -0
- package/dist/cjs/middleware/retry/index.d.ts +6 -0
- package/dist/cjs/middleware/retry/index.d.ts.map +1 -0
- package/dist/cjs/middleware/retry/index.js +11 -0
- package/dist/cjs/middleware/retry/index.js.map +1 -0
- package/dist/cjs/middleware/retry/retry.d.ts +39 -0
- package/dist/cjs/middleware/retry/retry.d.ts.map +1 -0
- package/dist/cjs/middleware/retry/retry.js +144 -0
- package/dist/cjs/middleware/retry/retry.js.map +1 -0
- package/dist/cjs/middleware/retry/types.d.ts +61 -0
- package/dist/cjs/middleware/retry/types.d.ts.map +1 -0
- package/dist/cjs/middleware/retry/types.js +6 -0
- package/dist/cjs/middleware/retry/types.js.map +1 -0
- package/dist/client/fetch-client.d.ts +189 -0
- package/dist/client/fetch-client.d.ts.map +1 -0
- package/dist/client/fetch-client.js +335 -0
- package/dist/client/fetch-client.js.map +1 -0
- package/dist/client/index.d.ts +11 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +10 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/types.d.ts +63 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +8 -0
- package/dist/client/types.js.map +1 -0
- package/dist/errors/index.d.ts +64 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +73 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/index.d.ts +49 -20
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +86 -42
- package/dist/index.js.map +1 -1
- package/dist/middleware/authentication/authentication.d.ts +31 -0
- package/dist/middleware/authentication/authentication.d.ts.map +1 -0
- package/dist/middleware/authentication/authentication.js +90 -0
- package/dist/middleware/authentication/authentication.js.map +1 -0
- package/dist/middleware/authentication/index.d.ts +37 -0
- package/dist/middleware/authentication/index.d.ts.map +1 -0
- package/dist/middleware/authentication/index.js +37 -0
- package/dist/middleware/authentication/index.js.map +1 -0
- package/dist/middleware/authentication/types.d.ts +73 -0
- package/dist/middleware/authentication/types.d.ts.map +1 -0
- package/dist/middleware/authentication/types.js +5 -0
- package/dist/middleware/authentication/types.js.map +1 -0
- package/dist/middleware/authorization/authorization.d.ts +30 -0
- package/dist/middleware/authorization/authorization.d.ts.map +1 -0
- package/dist/middleware/authorization/authorization.js +79 -0
- package/dist/middleware/authorization/authorization.js.map +1 -0
- package/dist/middleware/authorization/index.d.ts +36 -0
- package/dist/middleware/authorization/index.d.ts.map +1 -0
- package/dist/middleware/authorization/index.js +36 -0
- package/dist/middleware/authorization/index.js.map +1 -0
- package/dist/middleware/authorization/types.d.ts +67 -0
- package/dist/middleware/authorization/types.d.ts.map +1 -0
- package/dist/middleware/authorization/types.js +5 -0
- package/dist/middleware/authorization/types.js.map +1 -0
- package/dist/middleware/cache/cache.d.ts +41 -0
- package/dist/middleware/cache/cache.d.ts.map +1 -0
- package/dist/middleware/cache/cache.js +186 -0
- package/dist/middleware/cache/cache.js.map +1 -0
- package/dist/middleware/cache/index.d.ts +44 -0
- package/dist/middleware/cache/index.d.ts.map +1 -0
- package/dist/middleware/cache/index.js +44 -0
- package/dist/middleware/cache/index.js.map +1 -0
- package/dist/middleware/cache/types.d.ts +89 -0
- package/dist/middleware/cache/types.d.ts.map +1 -0
- package/dist/middleware/cache/types.js +5 -0
- package/dist/middleware/cache/types.js.map +1 -0
- package/dist/middleware/csrf/csrf.d.ts +34 -0
- package/dist/middleware/csrf/csrf.d.ts.map +1 -0
- package/dist/middleware/csrf/csrf.js +91 -0
- package/dist/middleware/csrf/csrf.js.map +1 -0
- package/dist/middleware/csrf/index.d.ts +57 -0
- package/dist/middleware/csrf/index.d.ts.map +1 -0
- package/dist/middleware/csrf/index.js +57 -0
- package/dist/middleware/csrf/index.js.map +1 -0
- package/dist/middleware/csrf/types.d.ts +57 -0
- package/dist/middleware/csrf/types.d.ts.map +1 -0
- package/dist/middleware/csrf/types.js +5 -0
- package/dist/middleware/csrf/types.js.map +1 -0
- package/dist/middleware/index.d.ts +115 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +134 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/logging/index.d.ts +42 -0
- package/dist/middleware/logging/index.d.ts.map +1 -0
- package/dist/middleware/logging/index.js +42 -0
- package/dist/middleware/logging/index.js.map +1 -0
- package/dist/middleware/logging/logging.d.ts +29 -0
- package/dist/middleware/logging/logging.d.ts.map +1 -0
- package/dist/middleware/logging/logging.js +168 -0
- package/dist/middleware/logging/logging.js.map +1 -0
- package/dist/middleware/logging/types.d.ts +90 -0
- package/dist/middleware/logging/types.d.ts.map +1 -0
- package/dist/middleware/logging/types.js +5 -0
- package/dist/middleware/logging/types.js.map +1 -0
- package/dist/middleware/rate-limit/index.d.ts +16 -0
- package/dist/middleware/rate-limit/index.d.ts.map +1 -0
- package/dist/middleware/rate-limit/index.js +16 -0
- package/dist/middleware/rate-limit/index.js.map +1 -0
- package/dist/middleware/rate-limit/rate-limit.d.ts +14 -0
- package/dist/middleware/rate-limit/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit/rate-limit.js +84 -0
- package/dist/middleware/rate-limit/rate-limit.js.map +1 -0
- package/dist/middleware/rate-limit/types.d.ts +97 -0
- package/dist/middleware/rate-limit/types.d.ts.map +1 -0
- package/dist/middleware/rate-limit/types.js +5 -0
- package/dist/middleware/rate-limit/types.js.map +1 -0
- package/dist/middleware/retry/index.d.ts +6 -0
- package/dist/middleware/retry/index.d.ts.map +1 -0
- package/dist/middleware/retry/index.js +6 -0
- package/dist/middleware/retry/index.js.map +1 -0
- package/dist/middleware/retry/retry.d.ts +39 -0
- package/dist/middleware/retry/retry.d.ts.map +1 -0
- package/dist/middleware/retry/retry.js +141 -0
- package/dist/middleware/retry/retry.js.map +1 -0
- package/dist/middleware/retry/types.d.ts +61 -0
- package/dist/middleware/retry/types.d.ts.map +1 -0
- package/dist/middleware/retry/types.js +5 -0
- package/dist/middleware/retry/types.js.map +1 -0
- package/package.json +42 -8
- package/dist/client.d.ts +0 -133
- package/dist/client.js +0 -166
- package/dist/client.js.map +0 -1
- package/dist/csrf.d.ts +0 -32
- package/dist/csrf.js +0 -53
- package/dist/csrf.js.map +0 -1
- package/dist/errors.js.map +0 -1
- package/dist/test-utils.d.ts +0 -24
- package/dist/test-utils.js +0 -52
- package/dist/test-utils.js.map +0 -1
- package/dist/unauthorized.d.ts +0 -27
- package/dist/unauthorized.js +0 -41
- package/dist/unauthorized.js.map +0 -1
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Complete middleware collection for FetchClient - "pit of success" APIs.
|
|
4
|
+
*
|
|
5
|
+
* This module provides a comprehensive set of middleware for common HTTP client concerns:
|
|
6
|
+
* - 🔐 Authentication: Bearer token injection
|
|
7
|
+
* - 🛡️ Authorization: 401/403 response handling
|
|
8
|
+
* - 💾 Cache: Response caching with TTL
|
|
9
|
+
* - 🔒 CSRF: Cross-site request forgery protection
|
|
10
|
+
* - 📝 Logging: Request/response logging
|
|
11
|
+
* - 🚦 Rate Limiting: Request rate limiting with token bucket
|
|
12
|
+
* - 🔄 Retry: Automatic retry with backoff
|
|
13
|
+
*
|
|
14
|
+
* Each middleware follows the "pit of success" pattern with:
|
|
15
|
+
* - Smart defaults for common scenarios
|
|
16
|
+
* - Simple `use{Middleware}()` convenience functions
|
|
17
|
+
* - Advanced `create{Middleware}Middleware()` for custom scenarios
|
|
18
|
+
* - Comprehensive TypeScript support
|
|
19
|
+
*
|
|
20
|
+
* @example Quick setup with multiple middleware:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { FetchClient } from '@fgrzl/fetch';
|
|
23
|
+
* import { useAuthentication, useRetry, useLogging } from '@fgrzl/fetch/middleware';
|
|
24
|
+
*
|
|
25
|
+
* const client = new FetchClient();
|
|
26
|
+
* const enhancedClient = useAuthentication(client, {
|
|
27
|
+
* tokenProvider: () => localStorage.getItem('auth-token') || ''
|
|
28
|
+
* })
|
|
29
|
+
* .pipe(useRetry, { retries: 3 })
|
|
30
|
+
* .pipe(useLogging);
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.createRetryMiddleware = exports.useRetry = exports.createRateLimitMiddleware = exports.useRateLimit = exports.createLoggingMiddleware = exports.useLogging = exports.useCSRF = exports.createCacheMiddleware = exports.useCache = exports.createAuthorizationMiddleware = exports.useAuthorization = exports.createAuthenticationMiddleware = exports.useAuthentication = void 0;
|
|
35
|
+
exports.useProductionStack = useProductionStack;
|
|
36
|
+
exports.useDevelopmentStack = useDevelopmentStack;
|
|
37
|
+
exports.useBasicStack = useBasicStack;
|
|
38
|
+
var authentication_1 = require("./authentication");
|
|
39
|
+
Object.defineProperty(exports, "useAuthentication", { enumerable: true, get: function () { return authentication_1.useAuthentication; } });
|
|
40
|
+
Object.defineProperty(exports, "createAuthenticationMiddleware", { enumerable: true, get: function () { return authentication_1.createAuthenticationMiddleware; } });
|
|
41
|
+
var authorization_1 = require("./authorization");
|
|
42
|
+
Object.defineProperty(exports, "useAuthorization", { enumerable: true, get: function () { return authorization_1.useAuthorization; } });
|
|
43
|
+
Object.defineProperty(exports, "createAuthorizationMiddleware", { enumerable: true, get: function () { return authorization_1.createAuthorizationMiddleware; } });
|
|
44
|
+
var cache_1 = require("./cache");
|
|
45
|
+
Object.defineProperty(exports, "useCache", { enumerable: true, get: function () { return cache_1.useCache; } });
|
|
46
|
+
Object.defineProperty(exports, "createCacheMiddleware", { enumerable: true, get: function () { return cache_1.createCacheMiddleware; } });
|
|
47
|
+
// 🔒 CSRF middleware
|
|
48
|
+
var csrf_1 = require("./csrf");
|
|
49
|
+
Object.defineProperty(exports, "useCSRF", { enumerable: true, get: function () { return csrf_1.useCSRF; } });
|
|
50
|
+
var logging_1 = require("./logging");
|
|
51
|
+
Object.defineProperty(exports, "useLogging", { enumerable: true, get: function () { return logging_1.useLogging; } });
|
|
52
|
+
Object.defineProperty(exports, "createLoggingMiddleware", { enumerable: true, get: function () { return logging_1.createLoggingMiddleware; } });
|
|
53
|
+
var rate_limit_1 = require("./rate-limit");
|
|
54
|
+
Object.defineProperty(exports, "useRateLimit", { enumerable: true, get: function () { return rate_limit_1.useRateLimit; } });
|
|
55
|
+
Object.defineProperty(exports, "createRateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_1.createRateLimitMiddleware; } });
|
|
56
|
+
var retry_1 = require("./retry");
|
|
57
|
+
Object.defineProperty(exports, "useRetry", { enumerable: true, get: function () { return retry_1.useRetry; } });
|
|
58
|
+
Object.defineProperty(exports, "createRetryMiddleware", { enumerable: true, get: function () { return retry_1.createRetryMiddleware; } });
|
|
59
|
+
const authentication_2 = require("./authentication");
|
|
60
|
+
const retry_2 = require("./retry");
|
|
61
|
+
const logging_2 = require("./logging");
|
|
62
|
+
const cache_2 = require("./cache");
|
|
63
|
+
const rate_limit_2 = require("./rate-limit");
|
|
64
|
+
/**
|
|
65
|
+
* Production-ready middleware stack with authentication, retry, logging, and caching.
|
|
66
|
+
* Perfect for API clients that need reliability and observability.
|
|
67
|
+
*
|
|
68
|
+
* @param client - The FetchClient to enhance
|
|
69
|
+
* @param config - Configuration for each middleware
|
|
70
|
+
* @returns Enhanced FetchClient with production middleware stack
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const apiClient = useProductionStack(new FetchClient(), {
|
|
75
|
+
* auth: { tokenProvider: () => getAuthToken() },
|
|
76
|
+
* cache: { ttl: 5 * 60 * 1000 }, // 5 minutes
|
|
77
|
+
* logging: { level: 'info' }
|
|
78
|
+
* });
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
function useProductionStack(client, config = {}) {
|
|
82
|
+
let enhanced = client;
|
|
83
|
+
// Apply middleware in order: auth → cache → retry → rate-limit → logging
|
|
84
|
+
if (config.auth) {
|
|
85
|
+
enhanced = (0, authentication_2.useAuthentication)(enhanced, config.auth);
|
|
86
|
+
}
|
|
87
|
+
if (config.cache !== undefined) {
|
|
88
|
+
enhanced = (0, cache_2.useCache)(enhanced, config.cache);
|
|
89
|
+
}
|
|
90
|
+
if (config.retry !== undefined) {
|
|
91
|
+
enhanced = (0, retry_2.useRetry)(enhanced, config.retry);
|
|
92
|
+
}
|
|
93
|
+
if (config.rateLimit !== undefined) {
|
|
94
|
+
enhanced = (0, rate_limit_2.useRateLimit)(enhanced, config.rateLimit);
|
|
95
|
+
}
|
|
96
|
+
if (config.logging !== undefined) {
|
|
97
|
+
enhanced = (0, logging_2.useLogging)(enhanced, config.logging);
|
|
98
|
+
}
|
|
99
|
+
return enhanced;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Development-friendly middleware stack with comprehensive logging and retries.
|
|
103
|
+
* Perfect for local development and debugging.
|
|
104
|
+
*
|
|
105
|
+
* @param client - The FetchClient to enhance
|
|
106
|
+
* @param config - Configuration for development middleware
|
|
107
|
+
* @returns Enhanced FetchClient with development middleware stack
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const devClient = useDevelopmentStack(new FetchClient(), {
|
|
112
|
+
* auth: { tokenProvider: () => 'dev-token' }
|
|
113
|
+
* });
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
function useDevelopmentStack(client, config = {}) {
|
|
117
|
+
let enhanced = client;
|
|
118
|
+
if (config.auth) {
|
|
119
|
+
enhanced = (0, authentication_2.useAuthentication)(enhanced, config.auth);
|
|
120
|
+
}
|
|
121
|
+
// Development-optimized settings
|
|
122
|
+
enhanced = (0, retry_2.useRetry)(enhanced, {
|
|
123
|
+
maxRetries: 1,
|
|
124
|
+
delay: 100,
|
|
125
|
+
});
|
|
126
|
+
enhanced = (0, logging_2.useLogging)(enhanced, {
|
|
127
|
+
level: 'debug',
|
|
128
|
+
includeRequestHeaders: true,
|
|
129
|
+
includeResponseHeaders: true,
|
|
130
|
+
includeRequestBody: true,
|
|
131
|
+
includeResponseBody: true,
|
|
132
|
+
});
|
|
133
|
+
return enhanced;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Basic middleware stack with just authentication and retry.
|
|
137
|
+
* Perfect for simple API clients that need minimal overhead.
|
|
138
|
+
*
|
|
139
|
+
* @param client - The FetchClient to enhance
|
|
140
|
+
* @param config - Basic configuration
|
|
141
|
+
* @returns Enhanced FetchClient with basic middleware stack
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* const basicClient = useBasicStack(new FetchClient(), {
|
|
146
|
+
* auth: { tokenProvider: () => getToken() }
|
|
147
|
+
* });
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
function useBasicStack(client, config) {
|
|
151
|
+
return (0, retry_2.useRetry)((0, authentication_2.useAuthentication)(client, config.auth), { maxRetries: 2 });
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/middleware/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Logging middleware - "pit of success" API.
|
|
3
|
+
*/
|
|
4
|
+
import type { FetchClient } from '../../client/fetch-client';
|
|
5
|
+
import type { LoggingOptions } from './types';
|
|
6
|
+
export type { LoggingOptions, Logger, LogEntry, LogLevel } from './types';
|
|
7
|
+
export { createLoggingMiddleware } from './logging';
|
|
8
|
+
/**
|
|
9
|
+
* "Pit of success" API for adding logging to a FetchClient.
|
|
10
|
+
* Logs HTTP requests and responses for debugging and monitoring.
|
|
11
|
+
*
|
|
12
|
+
* @param client - The FetchClient to add logging to
|
|
13
|
+
* @param options - Logging configuration options
|
|
14
|
+
* @returns A new FetchClient with logging middleware
|
|
15
|
+
*
|
|
16
|
+
* @example Basic logging to console:
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const loggedClient = useLogging(client);
|
|
19
|
+
*
|
|
20
|
+
* // Logs: → GET /api/users
|
|
21
|
+
* // Logs: ← GET /api/users → 200 (245ms)
|
|
22
|
+
* await loggedClient.get('/api/users');
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @example Custom log level and headers:
|
|
26
|
+
* ```typescript
|
|
27
|
+
* const loggedClient = useLogging(client, {
|
|
28
|
+
* level: 'debug',
|
|
29
|
+
* includeRequestHeaders: true,
|
|
30
|
+
* includeResponseHeaders: true
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*
|
|
34
|
+
* @example Skip health check endpoints:
|
|
35
|
+
* ```typescript
|
|
36
|
+
* const loggedClient = useLogging(client, {
|
|
37
|
+
* skipPatterns: ['/health', '/metrics', '/ping']
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export declare function useLogging(client: FetchClient, options?: LoggingOptions): FetchClient;
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/logging/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI9C,YAAY,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,cAAmB,GAC3B,WAAW,CAEb"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Logging middleware - "pit of success" API.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createLoggingMiddleware = void 0;
|
|
7
|
+
exports.useLogging = useLogging;
|
|
8
|
+
const logging_1 = require("./logging");
|
|
9
|
+
var logging_2 = require("./logging");
|
|
10
|
+
Object.defineProperty(exports, "createLoggingMiddleware", { enumerable: true, get: function () { return logging_2.createLoggingMiddleware; } });
|
|
11
|
+
/**
|
|
12
|
+
* "Pit of success" API for adding logging to a FetchClient.
|
|
13
|
+
* Logs HTTP requests and responses for debugging and monitoring.
|
|
14
|
+
*
|
|
15
|
+
* @param client - The FetchClient to add logging to
|
|
16
|
+
* @param options - Logging configuration options
|
|
17
|
+
* @returns A new FetchClient with logging middleware
|
|
18
|
+
*
|
|
19
|
+
* @example Basic logging to console:
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const loggedClient = useLogging(client);
|
|
22
|
+
*
|
|
23
|
+
* // Logs: → GET /api/users
|
|
24
|
+
* // Logs: ← GET /api/users → 200 (245ms)
|
|
25
|
+
* await loggedClient.get('/api/users');
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @example Custom log level and headers:
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const loggedClient = useLogging(client, {
|
|
31
|
+
* level: 'debug',
|
|
32
|
+
* includeRequestHeaders: true,
|
|
33
|
+
* includeResponseHeaders: true
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* @example Skip health check endpoints:
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const loggedClient = useLogging(client, {
|
|
40
|
+
* skipPatterns: ['/health', '/metrics', '/ping']
|
|
41
|
+
* });
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
function useLogging(client, options = {}) {
|
|
45
|
+
return client.use((0, logging_1.createLoggingMiddleware)(options));
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/logging/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA2CH,gCAKC;AA5CD,uCAAoD;AAIpD,qCAAoD;AAA3C,kHAAA,uBAAuB,OAAA;AAEhC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,SAAgB,UAAU,CACxB,MAAmB,EACnB,UAA0B,EAAE;IAE5B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Logging middleware implementation.
|
|
3
|
+
*/
|
|
4
|
+
import type { FetchMiddleware } from '../../client/fetch-client';
|
|
5
|
+
import type { LoggingOptions } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Creates logging middleware with smart defaults.
|
|
8
|
+
* Logs HTTP requests and responses for debugging and monitoring.
|
|
9
|
+
*
|
|
10
|
+
* @param options - Logging configuration options
|
|
11
|
+
* @returns Logging middleware for use with FetchClient
|
|
12
|
+
*
|
|
13
|
+
* @example Basic logging:
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const loggedClient = useLogging(client);
|
|
16
|
+
* // Logs all requests to console
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @example Custom logger:
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const loggedClient = useLogging(client, {
|
|
22
|
+
* logger: winston.createLogger({...}),
|
|
23
|
+
* level: 'debug',
|
|
24
|
+
* includeRequestHeaders: true
|
|
25
|
+
* });
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function createLoggingMiddleware(options?: LoggingOptions): FetchMiddleware;
|
|
29
|
+
//# sourceMappingURL=logging.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../../../src/middleware/logging/logging.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAA8B,MAAM,SAAS,CAAC;AA2D1E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,cAAmB,GAC3B,eAAe,CAmGjB"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Logging middleware implementation.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createLoggingMiddleware = createLoggingMiddleware;
|
|
7
|
+
/**
|
|
8
|
+
* Default console logger implementation.
|
|
9
|
+
*/
|
|
10
|
+
const defaultLogger = {
|
|
11
|
+
// eslint-disable-next-line no-console -- allow console.debug in logger implementation
|
|
12
|
+
debug: (message, data) => console.debug(message, data),
|
|
13
|
+
// eslint-disable-next-line no-console -- allow console.info in logger implementation
|
|
14
|
+
info: (message, data) => console.info(message, data),
|
|
15
|
+
// eslint-disable-next-line no-console -- allow console.warn in logger implementation
|
|
16
|
+
warn: (message, data) => console.warn(message, data),
|
|
17
|
+
// eslint-disable-next-line no-console -- allow console.error in logger implementation
|
|
18
|
+
error: (message, data) => console.error(message, data),
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Log level priority for filtering.
|
|
22
|
+
*/
|
|
23
|
+
const LOG_LEVELS = {
|
|
24
|
+
debug: 0,
|
|
25
|
+
info: 1,
|
|
26
|
+
warn: 2,
|
|
27
|
+
error: 3,
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Default log formatter.
|
|
31
|
+
*/
|
|
32
|
+
const defaultFormatter = (entry) => {
|
|
33
|
+
const { method, url, status, duration } = entry;
|
|
34
|
+
let message = `${method} ${url}`;
|
|
35
|
+
if (status) {
|
|
36
|
+
message += ` → ${status}`;
|
|
37
|
+
}
|
|
38
|
+
if (duration) {
|
|
39
|
+
message += ` (${duration}ms)`;
|
|
40
|
+
}
|
|
41
|
+
return message;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Checks if a URL should skip logging based on configured patterns.
|
|
45
|
+
*/
|
|
46
|
+
function shouldSkipLogging(url, skipPatterns = []) {
|
|
47
|
+
return skipPatterns.some((pattern) => {
|
|
48
|
+
if (typeof pattern === 'string') {
|
|
49
|
+
return url.includes(pattern);
|
|
50
|
+
}
|
|
51
|
+
return pattern.test(url);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Creates logging middleware with smart defaults.
|
|
56
|
+
* Logs HTTP requests and responses for debugging and monitoring.
|
|
57
|
+
*
|
|
58
|
+
* @param options - Logging configuration options
|
|
59
|
+
* @returns Logging middleware for use with FetchClient
|
|
60
|
+
*
|
|
61
|
+
* @example Basic logging:
|
|
62
|
+
* ```typescript
|
|
63
|
+
* const loggedClient = useLogging(client);
|
|
64
|
+
* // Logs all requests to console
|
|
65
|
+
* ```
|
|
66
|
+
*
|
|
67
|
+
* @example Custom logger:
|
|
68
|
+
* ```typescript
|
|
69
|
+
* const loggedClient = useLogging(client, {
|
|
70
|
+
* logger: winston.createLogger({...}),
|
|
71
|
+
* level: 'debug',
|
|
72
|
+
* includeRequestHeaders: true
|
|
73
|
+
* });
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
function createLoggingMiddleware(options = {}) {
|
|
77
|
+
const { level = 'info', logger = defaultLogger, includeRequestHeaders = false, includeResponseHeaders = false, includeRequestBody = false, includeResponseBody = false, skipPatterns = [], formatter = defaultFormatter, } = options;
|
|
78
|
+
const minLevel = LOG_LEVELS[level];
|
|
79
|
+
return async (request, next) => {
|
|
80
|
+
const url = request.url || '';
|
|
81
|
+
const method = (request.method || 'GET').toUpperCase();
|
|
82
|
+
// Skip logging if URL matches skip patterns
|
|
83
|
+
if (shouldSkipLogging(url, skipPatterns)) {
|
|
84
|
+
return next(request);
|
|
85
|
+
}
|
|
86
|
+
const startTime = Date.now();
|
|
87
|
+
// Log request start (debug level)
|
|
88
|
+
if (LOG_LEVELS.debug >= minLevel) {
|
|
89
|
+
const requestHeaders = includeRequestHeaders
|
|
90
|
+
? getHeadersObject(request.headers)
|
|
91
|
+
: undefined;
|
|
92
|
+
const requestBody = includeRequestBody ? request.body : undefined;
|
|
93
|
+
const requestEntry = {
|
|
94
|
+
level: 'debug',
|
|
95
|
+
timestamp: startTime,
|
|
96
|
+
method,
|
|
97
|
+
url,
|
|
98
|
+
...(requestHeaders && { requestHeaders }),
|
|
99
|
+
...(requestBody && { requestBody }),
|
|
100
|
+
};
|
|
101
|
+
logger.debug(`→ ${formatter(requestEntry)}`, requestEntry);
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const response = await next(request);
|
|
105
|
+
const duration = Date.now() - startTime;
|
|
106
|
+
// Determine log level based on response status
|
|
107
|
+
const logLevel = response.status >= 400 ? 'error' : 'info';
|
|
108
|
+
// Log response (info/error level)
|
|
109
|
+
if (LOG_LEVELS[logLevel] >= minLevel) {
|
|
110
|
+
const responseHeaders = includeResponseHeaders
|
|
111
|
+
? getHeadersObject(response.headers)
|
|
112
|
+
: undefined;
|
|
113
|
+
const responseBody = includeResponseBody ? response.data : undefined;
|
|
114
|
+
const responseEntry = {
|
|
115
|
+
level: logLevel,
|
|
116
|
+
timestamp: Date.now(),
|
|
117
|
+
method,
|
|
118
|
+
url,
|
|
119
|
+
status: response.status,
|
|
120
|
+
duration,
|
|
121
|
+
...(responseHeaders ? { responseHeaders } : {}),
|
|
122
|
+
...(responseBody !== undefined ? { responseBody } : {}),
|
|
123
|
+
};
|
|
124
|
+
const logMessage = `← ${formatter(responseEntry)}`;
|
|
125
|
+
if (logLevel === 'error') {
|
|
126
|
+
logger.error(logMessage, responseEntry);
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
logger.info(logMessage, responseEntry);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return response;
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
const duration = Date.now() - startTime;
|
|
136
|
+
// Log error
|
|
137
|
+
if (LOG_LEVELS.error >= minLevel) {
|
|
138
|
+
const errorEntry = {
|
|
139
|
+
level: 'error',
|
|
140
|
+
timestamp: Date.now(),
|
|
141
|
+
method,
|
|
142
|
+
url,
|
|
143
|
+
duration,
|
|
144
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
145
|
+
};
|
|
146
|
+
logger.error(`✗ ${formatter(errorEntry)}`, errorEntry);
|
|
147
|
+
}
|
|
148
|
+
throw error;
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Convert Headers object to plain object.
|
|
154
|
+
*/
|
|
155
|
+
function getHeadersObject(headers) {
|
|
156
|
+
if (!headers) {
|
|
157
|
+
return undefined;
|
|
158
|
+
}
|
|
159
|
+
const obj = {};
|
|
160
|
+
if (headers instanceof Headers) {
|
|
161
|
+
headers.forEach((value, key) => {
|
|
162
|
+
obj[key] = value;
|
|
163
|
+
});
|
|
164
|
+
return obj;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// It's already a Record<string, string>
|
|
168
|
+
return headers;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=logging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../../../src/middleware/logging/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Logging middleware types and configuration.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Log levels for filtering log output.
|
|
6
|
+
*/
|
|
7
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
8
|
+
/**
|
|
9
|
+
* Log entry structure.
|
|
10
|
+
*/
|
|
11
|
+
export interface LogEntry {
|
|
12
|
+
level: LogLevel;
|
|
13
|
+
timestamp: number;
|
|
14
|
+
method: string;
|
|
15
|
+
url: string;
|
|
16
|
+
status?: number;
|
|
17
|
+
duration?: number;
|
|
18
|
+
error?: Error;
|
|
19
|
+
requestHeaders?: Record<string, string>;
|
|
20
|
+
responseHeaders?: Record<string, string>;
|
|
21
|
+
requestBody?: unknown;
|
|
22
|
+
responseBody?: unknown;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Custom logger interface.
|
|
26
|
+
*/
|
|
27
|
+
export interface Logger {
|
|
28
|
+
debug(message: string, data?: unknown): void;
|
|
29
|
+
info(message: string, data?: unknown): void;
|
|
30
|
+
warn(message: string, data?: unknown): void;
|
|
31
|
+
error(message: string, data?: unknown): void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Logging configuration options - optimized for "pit of success".
|
|
35
|
+
*
|
|
36
|
+
* Smart defaults:
|
|
37
|
+
* - Logs to console
|
|
38
|
+
* - Info level by default
|
|
39
|
+
* - Excludes request/response bodies by default
|
|
40
|
+
* - Includes timing information
|
|
41
|
+
*/
|
|
42
|
+
export interface LoggingOptions {
|
|
43
|
+
/**
|
|
44
|
+
* Minimum log level to output (default: 'info')
|
|
45
|
+
* Logs at this level and above will be output
|
|
46
|
+
*/
|
|
47
|
+
level?: LogLevel;
|
|
48
|
+
/**
|
|
49
|
+
* Custom logger implementation (default: console)
|
|
50
|
+
* Can be replaced with winston, pino, etc.
|
|
51
|
+
*/
|
|
52
|
+
logger?: Logger;
|
|
53
|
+
/**
|
|
54
|
+
* Include request headers in logs (default: false)
|
|
55
|
+
* May contain sensitive information
|
|
56
|
+
*/
|
|
57
|
+
includeRequestHeaders?: boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Include response headers in logs (default: false)
|
|
60
|
+
* May contain sensitive information
|
|
61
|
+
*/
|
|
62
|
+
includeResponseHeaders?: boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Include request body in logs (default: false)
|
|
65
|
+
* May contain sensitive information and increase log size
|
|
66
|
+
*/
|
|
67
|
+
includeRequestBody?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Include response body in logs (default: false)
|
|
70
|
+
* May contain sensitive information and increase log size
|
|
71
|
+
*/
|
|
72
|
+
includeResponseBody?: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Skip logging for requests matching these URL patterns
|
|
75
|
+
* Useful for health checks, metrics endpoints, etc.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* skipPatterns: ['/health', '/metrics', /\/static\//]
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
skipPatterns?: (RegExp | string)[];
|
|
83
|
+
/**
|
|
84
|
+
* Custom log formatter function
|
|
85
|
+
* Allows complete customization of log output
|
|
86
|
+
*/
|
|
87
|
+
formatter?: (entry: LogEntry) => string;
|
|
88
|
+
}
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/middleware/logging/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,QAAQ,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,cAAc;IAC7B;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC;IAEjB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAEhC;;;OAGG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAE7B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;;;;;;;OAQG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAEnC;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,MAAM,CAAC;CACzC;AAGD,OAAO,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/middleware/logging/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rate limiting middleware - specialized use cases.
|
|
3
|
+
*/
|
|
4
|
+
import type { FetchClient } from '../../client/fetch-client';
|
|
5
|
+
import type { RateLimitOptions } from './types';
|
|
6
|
+
export type { RateLimitOptions, RateLimitAlgorithm } from './types';
|
|
7
|
+
export { createRateLimitMiddleware } from './rate-limit';
|
|
8
|
+
/**
|
|
9
|
+
* Rate limiting middleware - mainly for API quota management.
|
|
10
|
+
* Note: This is primarily useful for specific scenarios like:
|
|
11
|
+
* - Respecting third-party API limits
|
|
12
|
+
* - Bulk operations that need throttling
|
|
13
|
+
* - Pay-per-request API cost management
|
|
14
|
+
*/
|
|
15
|
+
export declare function useRateLimit(client: FetchClient, options?: RateLimitOptions): FetchClient;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAIhD,YAAY,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAEzD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,gBAAqB,GAC7B,WAAW,CAEb"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Rate limiting middleware - specialized use cases.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createRateLimitMiddleware = void 0;
|
|
7
|
+
exports.useRateLimit = useRateLimit;
|
|
8
|
+
const rate_limit_1 = require("./rate-limit");
|
|
9
|
+
var rate_limit_2 = require("./rate-limit");
|
|
10
|
+
Object.defineProperty(exports, "createRateLimitMiddleware", { enumerable: true, get: function () { return rate_limit_2.createRateLimitMiddleware; } });
|
|
11
|
+
/**
|
|
12
|
+
* Rate limiting middleware - mainly for API quota management.
|
|
13
|
+
* Note: This is primarily useful for specific scenarios like:
|
|
14
|
+
* - Respecting third-party API limits
|
|
15
|
+
* - Bulk operations that need throttling
|
|
16
|
+
* - Pay-per-request API cost management
|
|
17
|
+
*/
|
|
18
|
+
function useRateLimit(client, options = {}) {
|
|
19
|
+
return client.use((0, rate_limit_1.createRateLimitMiddleware)(options));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAiBH,oCAKC;AAlBD,6CAAyD;AAIzD,2CAAyD;AAAhD,uHAAA,yBAAyB,OAAA;AAElC;;;;;;GAMG;AACH,SAAgB,YAAY,CAC1B,MAAmB,EACnB,UAA4B,EAAE;IAE9B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAA,sCAAyB,EAAC,OAAO,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Rate limiting middleware implementation.
|
|
3
|
+
*/
|
|
4
|
+
import type { FetchMiddleware } from '../../client/fetch-client';
|
|
5
|
+
import type { RateLimitOptions } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Creates rate limiting middleware - mainly for API quota management.
|
|
8
|
+
* Note: Rate limiting is typically a server concern, but this can help with:
|
|
9
|
+
* - Respecting API provider limits
|
|
10
|
+
* - Preventing runaway requests in bulk operations
|
|
11
|
+
* - Cost management for pay-per-request APIs
|
|
12
|
+
*/
|
|
13
|
+
export declare function createRateLimitMiddleware(options?: RateLimitOptions): FetchMiddleware;
|
|
14
|
+
//# sourceMappingURL=rate-limit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../../src/middleware/rate-limit/rate-limit.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAyChD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,GAAE,gBAAqB,GAC7B,eAAe,CA6DjB"}
|