@fgrzl/fetch 1.1.0-alpha.7 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/CONTRIBUTING.md +327 -0
  3. package/README.md +50 -21
  4. package/dist/cjs/index.js +1110 -105
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/index.min.js +2 -0
  7. package/dist/cjs/index.min.js.map +1 -0
  8. package/dist/index.d.ts +1381 -10
  9. package/dist/index.js +1066 -91
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.min.js +2 -0
  12. package/dist/index.min.js.map +1 -0
  13. package/package.json +14 -5
  14. package/dist/cjs/client/fetch-client.d.ts +0 -189
  15. package/dist/cjs/client/fetch-client.d.ts.map +0 -1
  16. package/dist/cjs/client/fetch-client.js +0 -339
  17. package/dist/cjs/client/fetch-client.js.map +0 -1
  18. package/dist/cjs/client/index.d.ts +0 -11
  19. package/dist/cjs/client/index.d.ts.map +0 -1
  20. package/dist/cjs/client/index.js +0 -14
  21. package/dist/cjs/client/index.js.map +0 -1
  22. package/dist/cjs/client/types.d.ts +0 -63
  23. package/dist/cjs/client/types.d.ts.map +0 -1
  24. package/dist/cjs/client/types.js +0 -9
  25. package/dist/cjs/client/types.js.map +0 -1
  26. package/dist/cjs/errors/index.d.ts +0 -64
  27. package/dist/cjs/errors/index.d.ts.map +0 -1
  28. package/dist/cjs/errors/index.js +0 -79
  29. package/dist/cjs/errors/index.js.map +0 -1
  30. package/dist/cjs/index.d.ts +0 -65
  31. package/dist/cjs/index.d.ts.map +0 -1
  32. package/dist/cjs/middleware/authentication/authentication.d.ts +0 -31
  33. package/dist/cjs/middleware/authentication/authentication.d.ts.map +0 -1
  34. package/dist/cjs/middleware/authentication/authentication.js +0 -93
  35. package/dist/cjs/middleware/authentication/authentication.js.map +0 -1
  36. package/dist/cjs/middleware/authentication/index.d.ts +0 -37
  37. package/dist/cjs/middleware/authentication/index.d.ts.map +0 -1
  38. package/dist/cjs/middleware/authentication/index.js +0 -42
  39. package/dist/cjs/middleware/authentication/index.js.map +0 -1
  40. package/dist/cjs/middleware/authentication/types.d.ts +0 -73
  41. package/dist/cjs/middleware/authentication/types.d.ts.map +0 -1
  42. package/dist/cjs/middleware/authentication/types.js +0 -6
  43. package/dist/cjs/middleware/authentication/types.js.map +0 -1
  44. package/dist/cjs/middleware/authorization/authorization.d.ts +0 -30
  45. package/dist/cjs/middleware/authorization/authorization.d.ts.map +0 -1
  46. package/dist/cjs/middleware/authorization/authorization.js +0 -82
  47. package/dist/cjs/middleware/authorization/authorization.js.map +0 -1
  48. package/dist/cjs/middleware/authorization/index.d.ts +0 -36
  49. package/dist/cjs/middleware/authorization/index.d.ts.map +0 -1
  50. package/dist/cjs/middleware/authorization/index.js +0 -41
  51. package/dist/cjs/middleware/authorization/index.js.map +0 -1
  52. package/dist/cjs/middleware/authorization/types.d.ts +0 -67
  53. package/dist/cjs/middleware/authorization/types.d.ts.map +0 -1
  54. package/dist/cjs/middleware/authorization/types.js +0 -6
  55. package/dist/cjs/middleware/authorization/types.js.map +0 -1
  56. package/dist/cjs/middleware/cache/cache.d.ts +0 -41
  57. package/dist/cjs/middleware/cache/cache.d.ts.map +0 -1
  58. package/dist/cjs/middleware/cache/cache.js +0 -191
  59. package/dist/cjs/middleware/cache/cache.js.map +0 -1
  60. package/dist/cjs/middleware/cache/index.d.ts +0 -44
  61. package/dist/cjs/middleware/cache/index.d.ts.map +0 -1
  62. package/dist/cjs/middleware/cache/index.js +0 -50
  63. package/dist/cjs/middleware/cache/index.js.map +0 -1
  64. package/dist/cjs/middleware/cache/types.d.ts +0 -89
  65. package/dist/cjs/middleware/cache/types.d.ts.map +0 -1
  66. package/dist/cjs/middleware/cache/types.js +0 -6
  67. package/dist/cjs/middleware/cache/types.js.map +0 -1
  68. package/dist/cjs/middleware/csrf/csrf.d.ts +0 -34
  69. package/dist/cjs/middleware/csrf/csrf.d.ts.map +0 -1
  70. package/dist/cjs/middleware/csrf/csrf.js +0 -94
  71. package/dist/cjs/middleware/csrf/csrf.js.map +0 -1
  72. package/dist/cjs/middleware/csrf/index.d.ts +0 -57
  73. package/dist/cjs/middleware/csrf/index.d.ts.map +0 -1
  74. package/dist/cjs/middleware/csrf/index.js +0 -62
  75. package/dist/cjs/middleware/csrf/index.js.map +0 -1
  76. package/dist/cjs/middleware/csrf/types.d.ts +0 -57
  77. package/dist/cjs/middleware/csrf/types.d.ts.map +0 -1
  78. package/dist/cjs/middleware/csrf/types.js +0 -6
  79. package/dist/cjs/middleware/csrf/types.js.map +0 -1
  80. package/dist/cjs/middleware/index.d.ts +0 -115
  81. package/dist/cjs/middleware/index.d.ts.map +0 -1
  82. package/dist/cjs/middleware/index.js +0 -153
  83. package/dist/cjs/middleware/index.js.map +0 -1
  84. package/dist/cjs/middleware/logging/index.d.ts +0 -42
  85. package/dist/cjs/middleware/logging/index.d.ts.map +0 -1
  86. package/dist/cjs/middleware/logging/index.js +0 -47
  87. package/dist/cjs/middleware/logging/index.js.map +0 -1
  88. package/dist/cjs/middleware/logging/logging.d.ts +0 -29
  89. package/dist/cjs/middleware/logging/logging.d.ts.map +0 -1
  90. package/dist/cjs/middleware/logging/logging.js +0 -171
  91. package/dist/cjs/middleware/logging/logging.js.map +0 -1
  92. package/dist/cjs/middleware/logging/types.d.ts +0 -90
  93. package/dist/cjs/middleware/logging/types.d.ts.map +0 -1
  94. package/dist/cjs/middleware/logging/types.js +0 -6
  95. package/dist/cjs/middleware/logging/types.js.map +0 -1
  96. package/dist/cjs/middleware/rate-limit/index.d.ts +0 -16
  97. package/dist/cjs/middleware/rate-limit/index.d.ts.map +0 -1
  98. package/dist/cjs/middleware/rate-limit/index.js +0 -21
  99. package/dist/cjs/middleware/rate-limit/index.js.map +0 -1
  100. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts +0 -14
  101. package/dist/cjs/middleware/rate-limit/rate-limit.d.ts.map +0 -1
  102. package/dist/cjs/middleware/rate-limit/rate-limit.js +0 -87
  103. package/dist/cjs/middleware/rate-limit/rate-limit.js.map +0 -1
  104. package/dist/cjs/middleware/rate-limit/types.d.ts +0 -97
  105. package/dist/cjs/middleware/rate-limit/types.d.ts.map +0 -1
  106. package/dist/cjs/middleware/rate-limit/types.js +0 -6
  107. package/dist/cjs/middleware/rate-limit/types.js.map +0 -1
  108. package/dist/cjs/middleware/retry/index.d.ts +0 -6
  109. package/dist/cjs/middleware/retry/index.d.ts.map +0 -1
  110. package/dist/cjs/middleware/retry/index.js +0 -11
  111. package/dist/cjs/middleware/retry/index.js.map +0 -1
  112. package/dist/cjs/middleware/retry/retry.d.ts +0 -39
  113. package/dist/cjs/middleware/retry/retry.d.ts.map +0 -1
  114. package/dist/cjs/middleware/retry/retry.js +0 -144
  115. package/dist/cjs/middleware/retry/retry.js.map +0 -1
  116. package/dist/cjs/middleware/retry/types.d.ts +0 -61
  117. package/dist/cjs/middleware/retry/types.d.ts.map +0 -1
  118. package/dist/cjs/middleware/retry/types.js +0 -6
  119. package/dist/cjs/middleware/retry/types.js.map +0 -1
  120. package/dist/client/fetch-client.d.ts +0 -189
  121. package/dist/client/fetch-client.d.ts.map +0 -1
  122. package/dist/client/fetch-client.js +0 -335
  123. package/dist/client/fetch-client.js.map +0 -1
  124. package/dist/client/index.d.ts +0 -11
  125. package/dist/client/index.d.ts.map +0 -1
  126. package/dist/client/index.js +0 -10
  127. package/dist/client/index.js.map +0 -1
  128. package/dist/client/types.d.ts +0 -63
  129. package/dist/client/types.d.ts.map +0 -1
  130. package/dist/client/types.js +0 -8
  131. package/dist/client/types.js.map +0 -1
  132. package/dist/errors/index.d.ts +0 -64
  133. package/dist/errors/index.d.ts.map +0 -1
  134. package/dist/errors/index.js +0 -73
  135. package/dist/errors/index.js.map +0 -1
  136. package/dist/index.d.ts.map +0 -1
  137. package/dist/middleware/authentication/authentication.d.ts +0 -31
  138. package/dist/middleware/authentication/authentication.d.ts.map +0 -1
  139. package/dist/middleware/authentication/authentication.js +0 -90
  140. package/dist/middleware/authentication/authentication.js.map +0 -1
  141. package/dist/middleware/authentication/index.d.ts +0 -37
  142. package/dist/middleware/authentication/index.d.ts.map +0 -1
  143. package/dist/middleware/authentication/index.js +0 -37
  144. package/dist/middleware/authentication/index.js.map +0 -1
  145. package/dist/middleware/authentication/types.d.ts +0 -73
  146. package/dist/middleware/authentication/types.d.ts.map +0 -1
  147. package/dist/middleware/authentication/types.js +0 -5
  148. package/dist/middleware/authentication/types.js.map +0 -1
  149. package/dist/middleware/authorization/authorization.d.ts +0 -30
  150. package/dist/middleware/authorization/authorization.d.ts.map +0 -1
  151. package/dist/middleware/authorization/authorization.js +0 -79
  152. package/dist/middleware/authorization/authorization.js.map +0 -1
  153. package/dist/middleware/authorization/index.d.ts +0 -36
  154. package/dist/middleware/authorization/index.d.ts.map +0 -1
  155. package/dist/middleware/authorization/index.js +0 -36
  156. package/dist/middleware/authorization/index.js.map +0 -1
  157. package/dist/middleware/authorization/types.d.ts +0 -67
  158. package/dist/middleware/authorization/types.d.ts.map +0 -1
  159. package/dist/middleware/authorization/types.js +0 -5
  160. package/dist/middleware/authorization/types.js.map +0 -1
  161. package/dist/middleware/cache/cache.d.ts +0 -41
  162. package/dist/middleware/cache/cache.d.ts.map +0 -1
  163. package/dist/middleware/cache/cache.js +0 -186
  164. package/dist/middleware/cache/cache.js.map +0 -1
  165. package/dist/middleware/cache/index.d.ts +0 -44
  166. package/dist/middleware/cache/index.d.ts.map +0 -1
  167. package/dist/middleware/cache/index.js +0 -44
  168. package/dist/middleware/cache/index.js.map +0 -1
  169. package/dist/middleware/cache/types.d.ts +0 -89
  170. package/dist/middleware/cache/types.d.ts.map +0 -1
  171. package/dist/middleware/cache/types.js +0 -5
  172. package/dist/middleware/cache/types.js.map +0 -1
  173. package/dist/middleware/csrf/csrf.d.ts +0 -34
  174. package/dist/middleware/csrf/csrf.d.ts.map +0 -1
  175. package/dist/middleware/csrf/csrf.js +0 -91
  176. package/dist/middleware/csrf/csrf.js.map +0 -1
  177. package/dist/middleware/csrf/index.d.ts +0 -57
  178. package/dist/middleware/csrf/index.d.ts.map +0 -1
  179. package/dist/middleware/csrf/index.js +0 -57
  180. package/dist/middleware/csrf/index.js.map +0 -1
  181. package/dist/middleware/csrf/types.d.ts +0 -57
  182. package/dist/middleware/csrf/types.d.ts.map +0 -1
  183. package/dist/middleware/csrf/types.js +0 -5
  184. package/dist/middleware/csrf/types.js.map +0 -1
  185. package/dist/middleware/index.d.ts +0 -115
  186. package/dist/middleware/index.d.ts.map +0 -1
  187. package/dist/middleware/index.js +0 -134
  188. package/dist/middleware/index.js.map +0 -1
  189. package/dist/middleware/logging/index.d.ts +0 -42
  190. package/dist/middleware/logging/index.d.ts.map +0 -1
  191. package/dist/middleware/logging/index.js +0 -42
  192. package/dist/middleware/logging/index.js.map +0 -1
  193. package/dist/middleware/logging/logging.d.ts +0 -29
  194. package/dist/middleware/logging/logging.d.ts.map +0 -1
  195. package/dist/middleware/logging/logging.js +0 -168
  196. package/dist/middleware/logging/logging.js.map +0 -1
  197. package/dist/middleware/logging/types.d.ts +0 -90
  198. package/dist/middleware/logging/types.d.ts.map +0 -1
  199. package/dist/middleware/logging/types.js +0 -5
  200. package/dist/middleware/logging/types.js.map +0 -1
  201. package/dist/middleware/rate-limit/index.d.ts +0 -16
  202. package/dist/middleware/rate-limit/index.d.ts.map +0 -1
  203. package/dist/middleware/rate-limit/index.js +0 -16
  204. package/dist/middleware/rate-limit/index.js.map +0 -1
  205. package/dist/middleware/rate-limit/rate-limit.d.ts +0 -14
  206. package/dist/middleware/rate-limit/rate-limit.d.ts.map +0 -1
  207. package/dist/middleware/rate-limit/rate-limit.js +0 -84
  208. package/dist/middleware/rate-limit/rate-limit.js.map +0 -1
  209. package/dist/middleware/rate-limit/types.d.ts +0 -97
  210. package/dist/middleware/rate-limit/types.d.ts.map +0 -1
  211. package/dist/middleware/rate-limit/types.js +0 -5
  212. package/dist/middleware/rate-limit/types.js.map +0 -1
  213. package/dist/middleware/retry/index.d.ts +0 -6
  214. package/dist/middleware/retry/index.d.ts.map +0 -1
  215. package/dist/middleware/retry/index.js +0 -6
  216. package/dist/middleware/retry/index.js.map +0 -1
  217. package/dist/middleware/retry/retry.d.ts +0 -39
  218. package/dist/middleware/retry/retry.d.ts.map +0 -1
  219. package/dist/middleware/retry/retry.js +0 -141
  220. package/dist/middleware/retry/retry.js.map +0 -1
  221. package/dist/middleware/retry/types.d.ts +0 -61
  222. package/dist/middleware/retry/types.d.ts.map +0 -1
  223. package/dist/middleware/retry/types.js +0 -5
  224. package/dist/middleware/retry/types.js.map +0 -1
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createRetryMiddleware = void 0;
4
- exports.useRetry = useRetry;
5
- const retry_1 = require("./retry");
6
- var retry_2 = require("./retry");
7
- Object.defineProperty(exports, "createRetryMiddleware", { enumerable: true, get: function () { return retry_2.createRetryMiddleware; } });
8
- function useRetry(client, options = {}) {
9
- return client.use((0, retry_1.createRetryMiddleware)(options));
10
- }
11
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/middleware/retry/index.ts"],"names":[],"mappings":";;;AAOA,4BAKC;AAVD,mCAAgD;AAGhD,iCAAgD;AAAvC,8GAAA,qBAAqB,OAAA;AAE9B,SAAgB,QAAQ,CACtB,MAAmB,EACnB,UAAwB,EAAE;IAE1B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAA,6BAAqB,EAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC"}
@@ -1,39 +0,0 @@
1
- /**
2
- * @fileoverview Retry middleware implementation with enhanced architecture.
3
- */
4
- import type { FetchMiddleware } from '../../client/fetch-client';
5
- import type { RetryOptions } from './types';
6
- /**
7
- * Creates a retry middleware with smart defaults.
8
- *
9
- * 🎯 PIT OF SUCCESS: Works great with no config, customizable when needed.
10
- *
11
- * Features:
12
- * - ✅ Preserves full middleware chain on retries (unlike old implementation)
13
- * - ✅ Exponential backoff with jitter
14
- * - ✅ Smart retry conditions (network errors + 5xx)
15
- * - ✅ Configurable but sensible defaults
16
- * - ✅ Type-safe configuration
17
- *
18
- * @param options - Retry configuration (all optional)
19
- * @returns Middleware function
20
- *
21
- * @example Basic usage:
22
- * ```typescript
23
- * const client = new FetchClient();
24
- * client.use(createRetryMiddleware()); // 3 retries with exponential backoff
25
- * ```
26
- *
27
- * @example Custom configuration:
28
- * ```typescript
29
- * const client = new FetchClient();
30
- * client.use(createRetryMiddleware({
31
- * maxRetries: 5,
32
- * delay: 500,
33
- * backoff: 'linear',
34
- * onRetry: (attempt, delay) => console.log(`Retry ${attempt} in ${delay}ms`)
35
- * }));
36
- * ```
37
- */
38
- export declare function createRetryMiddleware(options?: RetryOptions): FetchMiddleware;
39
- //# sourceMappingURL=retry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../../src/middleware/retry/retry.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAgD5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,GAAE,YAAiB,GACzB,eAAe,CAgGjB"}
@@ -1,144 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Retry middleware implementation with enhanced architecture.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createRetryMiddleware = createRetryMiddleware;
7
- /**
8
- * Default retry condition - retry on network errors and 5xx server errors.
9
- */
10
- const defaultShouldRetry = (response) => {
11
- // Network errors (status 0) or server errors (5xx)
12
- return (response.status === 0 || (response.status >= 500 && response.status < 600));
13
- };
14
- /**
15
- * Calculate delay for retry attempt based on backoff strategy.
16
- */
17
- const calculateDelay = (attempt, baseDelay, backoff, maxDelay) => {
18
- let delay;
19
- switch (backoff) {
20
- case 'exponential':
21
- delay = baseDelay * Math.pow(2, attempt - 1);
22
- break;
23
- case 'linear':
24
- delay = baseDelay * attempt;
25
- break;
26
- case 'fixed':
27
- default:
28
- delay = baseDelay;
29
- break;
30
- }
31
- return Math.min(delay, maxDelay);
32
- };
33
- /**
34
- * Sleep for specified duration.
35
- */
36
- const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
37
- /**
38
- * Creates a retry middleware with smart defaults.
39
- *
40
- * 🎯 PIT OF SUCCESS: Works great with no config, customizable when needed.
41
- *
42
- * Features:
43
- * - ✅ Preserves full middleware chain on retries (unlike old implementation)
44
- * - ✅ Exponential backoff with jitter
45
- * - ✅ Smart retry conditions (network errors + 5xx)
46
- * - ✅ Configurable but sensible defaults
47
- * - ✅ Type-safe configuration
48
- *
49
- * @param options - Retry configuration (all optional)
50
- * @returns Middleware function
51
- *
52
- * @example Basic usage:
53
- * ```typescript
54
- * const client = new FetchClient();
55
- * client.use(createRetryMiddleware()); // 3 retries with exponential backoff
56
- * ```
57
- *
58
- * @example Custom configuration:
59
- * ```typescript
60
- * const client = new FetchClient();
61
- * client.use(createRetryMiddleware({
62
- * maxRetries: 5,
63
- * delay: 500,
64
- * backoff: 'linear',
65
- * onRetry: (attempt, delay) => console.log(`Retry ${attempt} in ${delay}ms`)
66
- * }));
67
- * ```
68
- */
69
- function createRetryMiddleware(options = {}) {
70
- const { maxRetries = 3, delay = 1000, backoff = 'exponential', maxDelay = 30000, shouldRetry = defaultShouldRetry, onRetry, } = options;
71
- return async (request, next) => {
72
- let lastResponse;
73
- let attempt = 0;
74
- while (attempt <= maxRetries) {
75
- try {
76
- // Execute the request through the middleware chain
77
- const response = await next(request);
78
- // If successful, return immediately
79
- if (response.ok) {
80
- return response;
81
- }
82
- // Check if we should retry this response with current attempt count
83
- if (!shouldRetry({ status: response.status, ok: response.ok }, attempt + 1)) {
84
- return response;
85
- }
86
- // If we've reached max retries, return the response
87
- if (attempt >= maxRetries) {
88
- return response;
89
- }
90
- // Store the failed response and increment attempt counter
91
- lastResponse = response;
92
- attempt++;
93
- // Calculate delay for next attempt
94
- const retryDelay = calculateDelay(attempt, delay, backoff, maxDelay);
95
- // Call onRetry callback if provided
96
- if (onRetry) {
97
- onRetry(attempt, retryDelay, {
98
- status: response.status,
99
- statusText: response.statusText,
100
- });
101
- }
102
- // Wait before retrying
103
- await sleep(retryDelay);
104
- }
105
- catch (error) {
106
- // Handle unexpected errors - treat as network error (status 0)
107
- const errorResponse = {
108
- data: null,
109
- status: 0,
110
- statusText: 'Network Error',
111
- headers: new Headers(),
112
- url: request.url || '',
113
- ok: false,
114
- error: {
115
- message: error instanceof Error ? error.message : 'Unknown error',
116
- body: error,
117
- },
118
- };
119
- // If shouldn't retry, return error immediately
120
- if (!shouldRetry(errorResponse, attempt + 1)) {
121
- return errorResponse;
122
- }
123
- // If we've reached max retries, return the error
124
- if (attempt >= maxRetries) {
125
- return errorResponse;
126
- }
127
- lastResponse = errorResponse;
128
- attempt++;
129
- // Calculate delay for next attempt
130
- const retryDelay = calculateDelay(attempt, delay, backoff, maxDelay);
131
- if (onRetry) {
132
- onRetry(attempt, retryDelay, {
133
- status: errorResponse.status,
134
- statusText: errorResponse.statusText,
135
- });
136
- }
137
- await sleep(retryDelay);
138
- }
139
- }
140
- // Return the last response if we've exhausted all retries
141
- return lastResponse;
142
- };
143
- }
144
- //# sourceMappingURL=retry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../../src/middleware/retry/retry.ts"],"names":[],"mappings":"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"}
@@ -1,61 +0,0 @@
1
- /**
2
- * @fileoverview Retry middleware types and configuration.
3
- */
4
- /**
5
- * Retry configuration options - optimized for "pit of success".
6
- *
7
- * Smart defaults:
8
- * - 3 retries (4 total attempts)
9
- * - Exponential backoff starting at 1000ms
10
- * - Only retry on network errors and 5xx status codes
11
- */
12
- export interface RetryOptions {
13
- /**
14
- * Maximum number of retry attempts (default: 3)
15
- * Total attempts will be maxRetries + 1
16
- */
17
- maxRetries?: number;
18
- /**
19
- * Initial delay in milliseconds (default: 1000)
20
- * Subsequent delays use exponential backoff
21
- */
22
- delay?: number;
23
- /**
24
- * Backoff strategy (default: 'exponential')
25
- * - 'exponential': delay * (2 ^ attempt)
26
- * - 'linear': delay * attempt
27
- * - 'fixed': always use delay
28
- */
29
- backoff?: 'exponential' | 'linear' | 'fixed';
30
- /**
31
- * Maximum delay cap in milliseconds (default: 30000 = 30s)
32
- * Prevents exponential backoff from getting too large
33
- */
34
- maxDelay?: number;
35
- /**
36
- * Custom function to determine if a response should be retried
37
- * Default: retry on network errors (status 0) and server errors (5xx)
38
- *
39
- * @param response - The fetch response or error
40
- * @param attempt - Current attempt number (1-based)
41
- * @returns true if request should be retried
42
- */
43
- shouldRetry?: (response: {
44
- status: number;
45
- ok: boolean;
46
- }, attempt: number) => boolean;
47
- /**
48
- * Optional callback called before each retry attempt
49
- * Useful for logging or analytics
50
- *
51
- * @param attempt - Current attempt number (1-based)
52
- * @param delay - Delay before this retry in ms
53
- * @param lastResponse - The failed response that triggered the retry
54
- */
55
- onRetry?: (attempt: number, delay: number, lastResponse: {
56
- status: number;
57
- statusText: string;
58
- }) => void;
59
- }
60
- export {};
61
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/middleware/retry/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,MAAM,WAAW,YAAY;IAC3B;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,GAAG,QAAQ,GAAG,OAAO,CAAC;IAE7C;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,CACZ,QAAQ,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,OAAO,CAAA;KAAE,EACzC,OAAO,EAAE,MAAM,KACZ,OAAO,CAAC;IAEb;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,CACR,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KACjD,IAAI,CAAC;CACX;AAGD,OAAO,EAAE,CAAC"}
@@ -1,6 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Retry middleware types and configuration.
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/middleware/retry/types.ts"],"names":[],"mappings":";AAAA;;GAEG"}
@@ -1,189 +0,0 @@
1
- /**
2
- * @fileoverview Enhanced fetch client with intercept middleware architecture.
3
- */
4
- import type { FetchResponse, FetchClientOptions } from './types';
5
- /**
6
- * Intercept middleware type that allows full control over request/response cycle.
7
- * Middleware can modify requests, handle responses, implement retries, etc.
8
- */
9
- export type FetchMiddleware = (request: RequestInit & {
10
- url?: string;
11
- }, next: (modifiedRequest?: RequestInit & {
12
- url?: string;
13
- }) => Promise<FetchResponse<unknown>>) => Promise<FetchResponse<unknown>>;
14
- /**
15
- * Enhanced HTTP client with intercept middleware architecture.
16
- *
17
- * Features:
18
- * - 🎯 Smart defaults (JSON content-type, same-origin credentials)
19
- * - 🔧 Powerful middleware system for cross-cutting concerns
20
- * - 🛡️ Consistent error handling (never throws, always returns response)
21
- * - 📦 TypeScript-first with full type inference
22
- * - 🚀 Modern async/await API
23
- *
24
- * @example Basic usage:
25
- * ```typescript
26
- * const client = new FetchClient();
27
- *
28
- * // GET request - just works
29
- * const users = await client.get<User[]>('/api/users');
30
- * if (users.ok) {
31
- * console.log(users.data); // Type is User[]
32
- * }
33
- *
34
- * // POST request - JSON by default
35
- * const result = await client.post('/api/users', { name: 'John' });
36
- * ```
37
- *
38
- * @example With middleware:
39
- * ```typescript
40
- * const client = new FetchClient();
41
- *
42
- * // Add auth middleware
43
- * client.use((request, next) => {
44
- * request.headers = { ...request.headers, Authorization: 'Bearer token' };
45
- * return next(request);
46
- * });
47
- *
48
- * // Now all requests include auth
49
- * const data = await client.get('/api/protected');
50
- * ```
51
- */
52
- export declare class FetchClient {
53
- private middlewares;
54
- private credentials;
55
- constructor(config?: FetchClientOptions);
56
- use(middleware: FetchMiddleware): this;
57
- request<T = unknown>(url: string, init?: RequestInit): Promise<FetchResponse<T>>;
58
- private coreFetch;
59
- private parseResponse;
60
- private buildUrlWithParams;
61
- /**
62
- * HEAD request with query parameter support.
63
- *
64
- * HEAD requests are used to retrieve metadata about a resource without downloading
65
- * the response body. Useful for checking if a resource exists, getting content length,
66
- * last modified date, etc.
67
- *
68
- * @template T - Expected response data type (will be null for HEAD requests)
69
- * @param url - Request URL
70
- * @param params - Query parameters to append to URL
71
- * @returns Promise resolving to typed response (data will always be null)
72
- *
73
- * @example Check if resource exists:
74
- * ```typescript
75
- * const headResponse = await client.head('/api/large-file.zip');
76
- * if (headResponse.ok) {
77
- * const contentLength = headResponse.headers.get('content-length');
78
- * const lastModified = headResponse.headers.get('last-modified');
79
- * console.log(`File size: ${contentLength} bytes`);
80
- * }
81
- * ```
82
- *
83
- * @example Check with query parameters:
84
- * ```typescript
85
- * const exists = await client.head('/api/users', { id: 123 });
86
- * if (exists.status === 404) {
87
- * console.log('User not found');
88
- * }
89
- * ```
90
- */
91
- head<T = null>(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<T>>;
92
- /**
93
- * HEAD request that returns useful metadata about a resource.
94
- *
95
- * This is a convenience method that extracts common metadata from HEAD responses
96
- * for easier consumption.
97
- *
98
- * @param url - Request URL
99
- * @param params - Query parameters to append to URL
100
- * @returns Promise resolving to response with extracted metadata
101
- *
102
- * @example Get resource metadata:
103
- * ```typescript
104
- * const metadata = await client.headMetadata('/api/large-file.zip');
105
- * if (metadata.ok) {
106
- * console.log('File exists:', metadata.exists);
107
- * console.log('Content type:', metadata.contentType);
108
- * console.log('Size:', metadata.contentLength, 'bytes');
109
- * console.log('Last modified:', metadata.lastModified);
110
- * }
111
- * ```
112
- */
113
- headMetadata(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<null> & {
114
- exists: boolean;
115
- contentType: string | undefined;
116
- contentLength: number | undefined;
117
- lastModified: Date | undefined;
118
- etag: string | undefined;
119
- cacheControl: string | undefined;
120
- }>;
121
- /**
122
- * GET request with query parameter support.
123
- *
124
- * @template T - Expected response data type
125
- * @param url - Request URL
126
- * @param params - Query parameters to append to URL
127
- * @returns Promise resolving to typed response
128
- *
129
- * @example
130
- * ```typescript
131
- * const users = await client.get<User[]>('/api/users');
132
- * const filteredUsers = await client.get<User[]>('/api/users', { status: 'active', limit: 10 });
133
- * if (users.ok) console.log(users.data);
134
- * ```
135
- */
136
- get<T>(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<T>>;
137
- /**
138
- * POST request with automatic JSON serialization.
139
- *
140
- * @template T - Expected response data type
141
- * @param url - Request URL
142
- * @param body - Request body (auto-serialized to JSON)
143
- * @param headers - Additional headers (Content-Type: application/json is default)
144
- * @returns Promise resolving to typed response
145
- *
146
- * @example
147
- * ```typescript
148
- * const result = await client.post<User>('/api/users', { name: 'John' });
149
- * ```
150
- */
151
- post<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<FetchResponse<T>>;
152
- /**
153
- * PUT request with automatic JSON serialization.
154
- *
155
- * @template T - Expected response data type
156
- * @param url - Request URL
157
- * @param body - Request body (auto-serialized to JSON)
158
- * @param headers - Additional headers (Content-Type: application/json is default)
159
- * @returns Promise resolving to typed response
160
- */
161
- put<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<FetchResponse<T>>;
162
- /**
163
- * PATCH request with automatic JSON serialization.
164
- *
165
- * @template T - Expected response data type
166
- * @param url - Request URL
167
- * @param body - Request body (auto-serialized to JSON)
168
- * @param headers - Additional headers (Content-Type: application/json is default)
169
- * @returns Promise resolving to typed response
170
- */
171
- patch<T>(url: string, body?: unknown, headers?: Record<string, string>): Promise<FetchResponse<T>>;
172
- /**
173
- * DELETE request with query parameter support.
174
- *
175
- * @template T - Expected response data type
176
- * @param url - Request URL
177
- * @param params - Query parameters to append to URL
178
- * @returns Promise resolving to typed response
179
- *
180
- * @example
181
- * ```typescript
182
- * const result = await client.del('/api/users/123');
183
- * const bulkResult = await client.del('/api/users', { status: 'inactive', force: true });
184
- * if (result.ok) console.log('Deleted successfully');
185
- * ```
186
- */
187
- del<T>(url: string, params?: Record<string, string | number | boolean | undefined>): Promise<FetchResponse<T>>;
188
- }
189
- //# sourceMappingURL=fetch-client.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fetch-client.d.ts","sourceRoot":"","sources":["../../src/client/fetch-client.ts"],"names":[],"mappings":"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"}