@lgriffin/esi.ts 7.4.0 → 9.0.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 (348) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +100 -24
  3. package/dist/EsiClient.d.ts +3 -0
  4. package/dist/EsiClient.d.ts.map +1 -1
  5. package/dist/EsiClientBuilder.d.ts +1 -0
  6. package/dist/EsiClientBuilder.d.ts.map +1 -1
  7. package/dist/clients/AllianceClient.d.ts +3 -0
  8. package/dist/clients/AllianceClient.d.ts.map +1 -1
  9. package/dist/clients/BaseEsiClient.d.ts +1 -1
  10. package/dist/clients/BaseEsiClient.d.ts.map +1 -1
  11. package/dist/clients/CalendarClient.d.ts +3 -0
  12. package/dist/clients/CalendarClient.d.ts.map +1 -1
  13. package/dist/clients/CharacterClient.d.ts +10 -2
  14. package/dist/clients/CharacterClient.d.ts.map +1 -1
  15. package/dist/clients/ClonesClient.d.ts +2 -0
  16. package/dist/clients/ClonesClient.d.ts.map +1 -1
  17. package/dist/clients/ContactsClient.d.ts +7 -0
  18. package/dist/clients/ContactsClient.d.ts.map +1 -1
  19. package/dist/clients/CorporationsClient.d.ts +18 -0
  20. package/dist/clients/CorporationsClient.d.ts.map +1 -1
  21. package/dist/clients/FittingsClient.d.ts +2 -0
  22. package/dist/clients/FittingsClient.d.ts.map +1 -1
  23. package/dist/clients/FleetClient.d.ts +3 -0
  24. package/dist/clients/FleetClient.d.ts.map +1 -1
  25. package/dist/clients/IndustryClient.d.ts +9 -0
  26. package/dist/clients/IndustryClient.d.ts.map +1 -1
  27. package/dist/clients/LoyaltyClient.d.ts +3 -0
  28. package/dist/clients/LoyaltyClient.d.ts.map +1 -1
  29. package/dist/clients/MailClient.d.ts +6 -0
  30. package/dist/clients/MailClient.d.ts.map +1 -1
  31. package/dist/clients/MarketClient.d.ts +13 -22
  32. package/dist/clients/MarketClient.d.ts.map +1 -1
  33. package/dist/clients/PiClient.d.ts +3 -0
  34. package/dist/clients/PiClient.d.ts.map +1 -1
  35. package/dist/clients/SkillsClient.d.ts +2 -0
  36. package/dist/clients/SkillsClient.d.ts.map +1 -1
  37. package/dist/clients/WalletClient.d.ts +1 -0
  38. package/dist/clients/WalletClient.d.ts.map +1 -1
  39. package/dist/clients/WarsClient.d.ts +3 -0
  40. package/dist/clients/WarsClient.d.ts.map +1 -1
  41. package/dist/config/jest/globalSetup.d.ts.map +1 -1
  42. package/dist/config/jest/globalTeardown.d.ts.map +1 -1
  43. package/dist/core/ApiClient.d.ts +14 -6
  44. package/dist/core/ApiClient.d.ts.map +1 -1
  45. package/dist/core/ApiRequestHandler.d.ts +3 -11
  46. package/dist/core/ApiRequestHandler.d.ts.map +1 -1
  47. package/dist/core/IDeduplicator.d.ts +6 -0
  48. package/dist/core/IDeduplicator.d.ts.map +1 -0
  49. package/dist/core/IRetryStrategy.d.ts +5 -0
  50. package/dist/core/IRetryStrategy.d.ts.map +1 -0
  51. package/dist/core/RequestDeduplicator.d.ts +2 -1
  52. package/dist/core/RequestDeduplicator.d.ts.map +1 -1
  53. package/dist/core/RetryStrategy.d.ts +19 -0
  54. package/dist/core/RetryStrategy.d.ts.map +1 -0
  55. package/dist/core/circuitBreaker/CircuitBreaker.d.ts +11 -1
  56. package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
  57. package/dist/core/circuitBreaker/ICircuitBreaker.d.ts +23 -0
  58. package/dist/core/circuitBreaker/ICircuitBreaker.d.ts.map +1 -0
  59. package/dist/core/configureApiClient.d.ts +18 -0
  60. package/dist/core/configureApiClient.d.ts.map +1 -0
  61. package/dist/core/endpoints/EndpointDefinition.d.ts +2 -0
  62. package/dist/core/endpoints/EndpointDefinition.d.ts.map +1 -1
  63. package/dist/core/endpoints/calendarEndpoints.d.ts +1 -1
  64. package/dist/core/endpoints/characterEndpoints.d.ts +3 -3
  65. package/dist/core/endpoints/contactEndpoints.d.ts +7 -3
  66. package/dist/core/endpoints/contactEndpoints.d.ts.map +1 -1
  67. package/dist/core/endpoints/corporationEndpoints.d.ts +4 -1
  68. package/dist/core/endpoints/corporationEndpoints.d.ts.map +1 -1
  69. package/dist/core/endpoints/createClient.d.ts +18 -1
  70. package/dist/core/endpoints/createClient.d.ts.map +1 -1
  71. package/dist/core/endpoints/dogmaEndpoints.d.ts +17 -0
  72. package/dist/core/endpoints/dogmaEndpoints.d.ts.map +1 -1
  73. package/dist/core/endpoints/esi-scopes.generated.d.ts +1 -1
  74. package/dist/core/endpoints/esi-scopes.generated.d.ts.map +1 -1
  75. package/dist/core/endpoints/fleetEndpoints.d.ts +5 -0
  76. package/dist/core/endpoints/fleetEndpoints.d.ts.map +1 -1
  77. package/dist/core/endpoints/mailEndpoints.d.ts +13 -0
  78. package/dist/core/endpoints/mailEndpoints.d.ts.map +1 -1
  79. package/dist/core/endpoints/marketEndpoints.d.ts +29 -48
  80. package/dist/core/endpoints/marketEndpoints.d.ts.map +1 -1
  81. package/dist/core/endpoints/piEndpoints.d.ts +3 -0
  82. package/dist/core/endpoints/piEndpoints.d.ts.map +1 -1
  83. package/dist/core/endpoints/universeEndpoints.d.ts +13 -2
  84. package/dist/core/endpoints/universeEndpoints.d.ts.map +1 -1
  85. package/dist/core/endpoints/walletEndpoints.d.ts +4 -0
  86. package/dist/core/endpoints/walletEndpoints.d.ts.map +1 -1
  87. package/dist/core/logger/logger.d.ts +2 -1
  88. package/dist/core/logger/logger.d.ts.map +1 -1
  89. package/dist/core/pagination/AsyncPaginationIterator.d.ts +4 -1
  90. package/dist/core/pagination/AsyncPaginationIterator.d.ts.map +1 -1
  91. package/dist/core/pagination/CursorPaginationHandler.d.ts +15 -6
  92. package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
  93. package/dist/core/pagination/PaginationHandler.d.ts +7 -6
  94. package/dist/core/pagination/PaginationHandler.d.ts.map +1 -1
  95. package/dist/core/rateLimiter/RateLimiter.d.ts +8 -2
  96. package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
  97. package/dist/core/requestPipeline/cachePolicy.d.ts +31 -0
  98. package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -0
  99. package/dist/core/requestPipeline/dependencies.d.ts +10 -0
  100. package/dist/core/requestPipeline/dependencies.d.ts.map +1 -0
  101. package/dist/core/requestPipeline/fetchExecution.d.ts +28 -0
  102. package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -0
  103. package/dist/core/requestPipeline/headers.d.ts +11 -0
  104. package/dist/core/requestPipeline/headers.d.ts.map +1 -0
  105. package/dist/core/requestPipeline/index.d.ts +10 -0
  106. package/dist/core/requestPipeline/index.d.ts.map +1 -0
  107. package/dist/core/requestPipeline/middlewareBridge.d.ts +15 -0
  108. package/dist/core/requestPipeline/middlewareBridge.d.ts.map +1 -0
  109. package/dist/core/requestPipeline/paginationOrchestration.d.ts +15 -0
  110. package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -0
  111. package/dist/core/requestPipeline/statusHandling.d.ts +18 -0
  112. package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -0
  113. package/dist/core/util/error.d.ts +6 -1
  114. package/dist/core/util/error.d.ts.map +1 -1
  115. package/dist/errors.d.ts +4 -0
  116. package/dist/errors.d.ts.map +1 -0
  117. package/dist/errors.js +196 -0
  118. package/dist/errors.js.map +1 -0
  119. package/dist/errors.mjs +146 -0
  120. package/dist/errors.mjs.map +1 -0
  121. package/dist/index.d.ts +9 -2
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +9937 -176
  124. package/dist/index.js.map +1 -0
  125. package/dist/index.mjs +9834 -0
  126. package/dist/index.mjs.map +1 -0
  127. package/dist/schemas/calendar.d.ts +1 -1
  128. package/dist/schemas/character.d.ts +1 -10
  129. package/dist/schemas/character.d.ts.map +1 -1
  130. package/dist/schemas/common.d.ts +9 -0
  131. package/dist/schemas/common.d.ts.map +1 -1
  132. package/dist/schemas/contacts.d.ts +2 -1
  133. package/dist/schemas/contacts.d.ts.map +1 -1
  134. package/dist/schemas/corporation.d.ts +4 -9
  135. package/dist/schemas/corporation.d.ts.map +1 -1
  136. package/dist/schemas/dogma.d.ts +17 -0
  137. package/dist/schemas/dogma.d.ts.map +1 -1
  138. package/dist/schemas/fleet.d.ts +1 -0
  139. package/dist/schemas/fleet.d.ts.map +1 -1
  140. package/dist/schemas/index.js +2085 -46
  141. package/dist/schemas/index.js.map +1 -0
  142. package/dist/schemas/index.mjs +1914 -0
  143. package/dist/schemas/index.mjs.map +1 -0
  144. package/dist/schemas/market.d.ts +91 -4
  145. package/dist/schemas/market.d.ts.map +1 -1
  146. package/dist/schemas/pi.d.ts +3 -0
  147. package/dist/schemas/pi.d.ts.map +1 -1
  148. package/dist/schemas/sovereignty.d.ts +2 -0
  149. package/dist/schemas/sovereignty.d.ts.map +1 -1
  150. package/dist/schemas/universe.d.ts +11 -2
  151. package/dist/schemas/universe.d.ts.map +1 -1
  152. package/dist/schemas/wallet.d.ts +2 -0
  153. package/dist/schemas/wallet.d.ts.map +1 -1
  154. package/dist/testing/TestDataFactory.d.ts.map +1 -1
  155. package/dist/testing/index.d.ts +2 -0
  156. package/dist/testing/index.d.ts.map +1 -0
  157. package/dist/testing/index.js +935 -0
  158. package/dist/testing/index.js.map +1 -0
  159. package/dist/testing/index.mjs +898 -0
  160. package/dist/testing/index.mjs.map +1 -0
  161. package/dist/types/character.d.ts +2 -1
  162. package/dist/types/character.d.ts.map +1 -1
  163. package/dist/types/generated/esi-spec.generated.d.ts +3 -3
  164. package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
  165. package/dist/types/generated/spec-alignment.check.d.ts +9 -0
  166. package/dist/types/generated/spec-alignment.check.d.ts.map +1 -1
  167. package/dist/types/market.d.ts +7 -1
  168. package/dist/types/market.d.ts.map +1 -1
  169. package/package.json +33 -6
  170. package/dist/EsiClient.js +0 -251
  171. package/dist/EsiClientBuilder.js +0 -217
  172. package/dist/clients/AccessListsClient.js +0 -20
  173. package/dist/clients/AllianceClient.js +0 -72
  174. package/dist/clients/AssetsClient.js +0 -81
  175. package/dist/clients/BaseEsiClient.js +0 -40
  176. package/dist/clients/CalendarClient.js +0 -54
  177. package/dist/clients/CharacterClient.js +0 -149
  178. package/dist/clients/ClonesClient.js +0 -31
  179. package/dist/clients/ContactsClient.js +0 -104
  180. package/dist/clients/ContractsClient.js +0 -111
  181. package/dist/clients/CorporationsClient.js +0 -227
  182. package/dist/clients/DogmaClient.js +0 -55
  183. package/dist/clients/FactionClient.js +0 -79
  184. package/dist/clients/FittingsClient.js +0 -42
  185. package/dist/clients/FleetClient.js +0 -162
  186. package/dist/clients/FreelanceJobsClient.js +0 -76
  187. package/dist/clients/IncursionsClient.js +0 -19
  188. package/dist/clients/IndustryClient.js +0 -88
  189. package/dist/clients/InsuranceClient.js +0 -19
  190. package/dist/clients/KillmailsClient.js +0 -47
  191. package/dist/clients/LocationClient.js +0 -41
  192. package/dist/clients/LoyaltyClient.js +0 -30
  193. package/dist/clients/MailClient.js +0 -108
  194. package/dist/clients/MarketClient.js +0 -131
  195. package/dist/clients/MercenaryClient.js +0 -27
  196. package/dist/clients/MetaClient.js +0 -56
  197. package/dist/clients/PiClient.js +0 -51
  198. package/dist/clients/RouteClient.js +0 -24
  199. package/dist/clients/SearchClient.js +0 -22
  200. package/dist/clients/SkillsClient.js +0 -41
  201. package/dist/clients/SkyhooksClient.js +0 -35
  202. package/dist/clients/SovereigntyClient.js +0 -27
  203. package/dist/clients/StatusClient.js +0 -19
  204. package/dist/clients/UiClient.js +0 -58
  205. package/dist/clients/UniverseClient.js +0 -277
  206. package/dist/clients/WalletClient.js +0 -82
  207. package/dist/clients/WarsClient.js +0 -37
  208. package/dist/config/configManager.js +0 -47
  209. package/dist/config/jest/globalSetup.js +0 -7
  210. package/dist/config/jest/globalTeardown.js +0 -7
  211. package/dist/config/jest/jest.setup.js +0 -29
  212. package/dist/core/ApiClient.js +0 -123
  213. package/dist/core/ApiClientBuilder.js +0 -54
  214. package/dist/core/ApiRequestHandler.js +0 -444
  215. package/dist/core/BatchRequestHandler.js +0 -66
  216. package/dist/core/ClientRegistry.js +0 -116
  217. package/dist/core/EsiDiagnostics.js +0 -47
  218. package/dist/core/RequestDeduplicator.js +0 -26
  219. package/dist/core/cache/ETagCacheManager.js +0 -184
  220. package/dist/core/cache/ICache.js +0 -2
  221. package/dist/core/circuitBreaker/CircuitBreaker.js +0 -156
  222. package/dist/core/constants.js +0 -7
  223. package/dist/core/endpoints/EndpointDefinition.js +0 -2
  224. package/dist/core/endpoints/accessListEndpoints.js +0 -13
  225. package/dist/core/endpoints/allianceEndpoints.js +0 -34
  226. package/dist/core/endpoints/assetEndpoints.js +0 -51
  227. package/dist/core/endpoints/buildEndpointPath.js +0 -44
  228. package/dist/core/endpoints/calendarEndpoints.js +0 -35
  229. package/dist/core/endpoints/characterEndpoints.js +0 -104
  230. package/dist/core/endpoints/cloneEndpoints.js +0 -21
  231. package/dist/core/endpoints/contactEndpoints.js +0 -72
  232. package/dist/core/endpoints/contractEndpoints.js +0 -70
  233. package/dist/core/endpoints/corporationEndpoints.js +0 -161
  234. package/dist/core/endpoints/createClient.js +0 -175
  235. package/dist/core/endpoints/dogmaEndpoints.js +0 -40
  236. package/dist/core/endpoints/esi-cache-ttls.generated.js +0 -133
  237. package/dist/core/endpoints/esi-rate-limit-groups.generated.js +0 -153
  238. package/dist/core/endpoints/esi-scopes.generated.js +0 -135
  239. package/dist/core/endpoints/factionEndpoints.js +0 -57
  240. package/dist/core/endpoints/fittingEndpoints.js +0 -27
  241. package/dist/core/endpoints/fleetEndpoints.js +0 -101
  242. package/dist/core/endpoints/freelanceJobsEndpoints.js +0 -51
  243. package/dist/core/endpoints/incursionEndpoints.js +0 -13
  244. package/dist/core/endpoints/industryEndpoints.js +0 -61
  245. package/dist/core/endpoints/insuranceEndpoints.js +0 -13
  246. package/dist/core/endpoints/killmailEndpoints.js +0 -28
  247. package/dist/core/endpoints/locationEndpoints.js +0 -27
  248. package/dist/core/endpoints/loyaltyEndpoints.js +0 -21
  249. package/dist/core/endpoints/mailEndpoints.js +0 -68
  250. package/dist/core/endpoints/marketEndpoints.js +0 -84
  251. package/dist/core/endpoints/mercenaryEndpoints.js +0 -19
  252. package/dist/core/endpoints/metaEndpoints.js +0 -12
  253. package/dist/core/endpoints/piEndpoints.js +0 -36
  254. package/dist/core/endpoints/routeEndpoints.js +0 -14
  255. package/dist/core/endpoints/searchEndpoints.js +0 -14
  256. package/dist/core/endpoints/skillEndpoints.js +0 -29
  257. package/dist/core/endpoints/skyhookEndpoints.js +0 -25
  258. package/dist/core/endpoints/sovereigntyEndpoints.js +0 -19
  259. package/dist/core/endpoints/statusEndpoints.js +0 -12
  260. package/dist/core/endpoints/uiEndpoints.js +0 -39
  261. package/dist/core/endpoints/universeEndpoints.js +0 -210
  262. package/dist/core/endpoints/walletEndpoints.js +0 -50
  263. package/dist/core/endpoints/warEndpoints.js +0 -28
  264. package/dist/core/logger/ILogger.js +0 -2
  265. package/dist/core/logger/logger.js +0 -16
  266. package/dist/core/logger/loggerUtil.js +0 -30
  267. package/dist/core/middleware/Middleware.js +0 -42
  268. package/dist/core/pagination/AsyncPaginationIterator.js +0 -27
  269. package/dist/core/pagination/CursorPaginationHandler.js +0 -148
  270. package/dist/core/pagination/PaginationHandler.js +0 -115
  271. package/dist/core/rateLimiter/IRateLimiter.js +0 -2
  272. package/dist/core/rateLimiter/RateLimiter.js +0 -307
  273. package/dist/core/util/error.js +0 -122
  274. package/dist/core/util/headersUtil.js +0 -37
  275. package/dist/core/util/retry.js +0 -9
  276. package/dist/core/util/sleep.js +0 -6
  277. package/dist/core/util/stringUtil.js +0 -6
  278. package/dist/core/util/testHelpers.js +0 -9
  279. package/dist/core/util/validation.js +0 -52
  280. package/dist/schemas/access-lists.js +0 -14
  281. package/dist/schemas/alliance.js +0 -28
  282. package/dist/schemas/assets.js +0 -26
  283. package/dist/schemas/calendar.js +0 -43
  284. package/dist/schemas/character.js +0 -122
  285. package/dist/schemas/clones.js +0 -21
  286. package/dist/schemas/common.js +0 -34
  287. package/dist/schemas/contacts.js +0 -15
  288. package/dist/schemas/contracts.js +0 -58
  289. package/dist/schemas/corporation.js +0 -192
  290. package/dist/schemas/dogma.js +0 -42
  291. package/dist/schemas/faction-warfare.js +0 -92
  292. package/dist/schemas/fittings.js +0 -15
  293. package/dist/schemas/fleet.js +0 -48
  294. package/dist/schemas/freelance-jobs.js +0 -99
  295. package/dist/schemas/incursions.js +0 -14
  296. package/dist/schemas/industry.js +0 -75
  297. package/dist/schemas/insurance.js +0 -12
  298. package/dist/schemas/killmails.js +0 -42
  299. package/dist/schemas/location.js +0 -20
  300. package/dist/schemas/loyalty.js +0 -20
  301. package/dist/schemas/mail.js +0 -38
  302. package/dist/schemas/market.js +0 -39
  303. package/dist/schemas/mercenary.js +0 -22
  304. package/dist/schemas/pi.js +0 -85
  305. package/dist/schemas/skills.js +0 -30
  306. package/dist/schemas/skyhooks.js +0 -30
  307. package/dist/schemas/sovereignty.js +0 -70
  308. package/dist/schemas/status.js +0 -10
  309. package/dist/schemas/universe.js +0 -245
  310. package/dist/schemas/wallet.js +0 -29
  311. package/dist/schemas/wars.js +0 -31
  312. package/dist/testing/TestDataFactory.js +0 -823
  313. package/dist/types/access-lists.js +0 -2
  314. package/dist/types/alliance.js +0 -2
  315. package/dist/types/api-responses.js +0 -73
  316. package/dist/types/assets.js +0 -2
  317. package/dist/types/branded.js +0 -6
  318. package/dist/types/calendar.js +0 -2
  319. package/dist/types/character.js +0 -2
  320. package/dist/types/clones.js +0 -2
  321. package/dist/types/common.js +0 -2
  322. package/dist/types/contacts.js +0 -2
  323. package/dist/types/contracts.js +0 -2
  324. package/dist/types/corporation.js +0 -2
  325. package/dist/types/dogma.js +0 -2
  326. package/dist/types/faction-warfare.js +0 -2
  327. package/dist/types/fittings.js +0 -2
  328. package/dist/types/fleet.js +0 -2
  329. package/dist/types/freelance-jobs.js +0 -2
  330. package/dist/types/generated/esi-spec.generated.js +0 -6
  331. package/dist/types/generated/spec-alignment.check.js +0 -14
  332. package/dist/types/incursions.js +0 -2
  333. package/dist/types/industry.js +0 -2
  334. package/dist/types/insurance.js +0 -2
  335. package/dist/types/killmails.js +0 -2
  336. package/dist/types/location.js +0 -2
  337. package/dist/types/loyalty.js +0 -2
  338. package/dist/types/mail.js +0 -2
  339. package/dist/types/market.js +0 -2
  340. package/dist/types/mercenary.js +0 -2
  341. package/dist/types/pi.js +0 -2
  342. package/dist/types/skills.js +0 -2
  343. package/dist/types/skyhooks.js +0 -2
  344. package/dist/types/sovereignty.js +0 -2
  345. package/dist/types/status.js +0 -2
  346. package/dist/types/universe.js +0 -2
  347. package/dist/types/wallet.js +0 -2
  348. package/dist/types/wars.js +0 -2
@@ -23,28 +23,37 @@ export interface CursorPage<T = unknown> {
23
23
  data: T[];
24
24
  cursors: CursorTokens;
25
25
  }
26
+ export type CursorPageFetcher = (endpoint: string, cursor?: {
27
+ before?: string;
28
+ after?: string;
29
+ }) => Promise<CursorPage>;
26
30
  export interface CursorPaginationOptions {
27
31
  maxPages?: number;
28
- maxRetries?: number;
29
- retryDelayMs?: number;
30
32
  }
31
33
  export declare class CursorPaginationHandler {
32
34
  private static readonly DEFAULT_OPTIONS;
33
35
  /**
34
36
  * Fetch a single cursor page, returning data + cursor tokens.
37
+ *
38
+ * When no `pageFetch` callback is provided, the request is routed
39
+ * through the standard request pipeline (rate limiter, circuit
40
+ * breaker, timeout, middleware) instead of a raw `fetch()`.
35
41
  */
36
42
  static fetchPage(client: ApiClient, endpoint: string, method: string, requiresAuth: boolean, cursor?: {
37
43
  before?: string;
38
44
  after?: string;
39
- }, body?: unknown): Promise<CursorPage>;
45
+ }, body?: unknown, pageFetch?: CursorPageFetcher): Promise<CursorPage>;
40
46
  /**
41
47
  * Auto-fetch all pages by following `after` tokens until an empty
42
48
  * response is received. Combines the caller-supplied first page
43
49
  * data with all subsequent pages.
44
50
  */
45
- static fetchAll(client: ApiClient, endpoint: string, method: string, requiresAuth: boolean, firstPageData: unknown[], firstCursors: CursorTokens, body?: unknown, options?: CursorPaginationOptions): Promise<unknown[]>;
51
+ static fetchAll(client: ApiClient, endpoint: string, method: string, requiresAuth: boolean, firstPageData: unknown[], firstCursors: CursorTokens, body?: unknown, options?: CursorPaginationOptions, pageFetch?: CursorPageFetcher): Promise<unknown[]>;
46
52
  /**
47
53
  * Fetch a single cursor page with retry logic.
54
+ *
55
+ * Delegates to the configured `IRetryStrategy` (exponential backoff
56
+ * with jitter) instead of implementing a custom retry loop.
48
57
  */
49
58
  private static fetchPageWithRetry;
50
59
  /**
@@ -52,8 +61,8 @@ export declare class CursorPaginationHandler {
52
61
  */
53
62
  static extractCursors(headers: Headers): CursorTokens;
54
63
  /**
55
- * Build a URL with cursor query parameters appended.
64
+ * Build an endpoint path with cursor query parameters appended.
56
65
  */
57
- private static buildUrl;
66
+ private static buildEndpointWithCursor;
58
67
  }
59
68
  //# sourceMappingURL=CursorPaginationHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CursorPaginationHandler.d.ts","sourceRoot":"","sources":["../../../src/core/pagination/CursorPaginationHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAIrC;IAEF;;OAEG;WACU,SAAS,CACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5C,IAAI,CAAC,EAAE,OAAO,GACb,OAAO,CAAC,UAAU,CAAC;IAqCtB;;;;OAIG;WACU,QAAQ,CACnB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,EAAE,EACxB,YAAY,EAAE,YAAY,EAC1B,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,OAAO,EAAE,CAAC;IAwDrB;;OAEG;mBACkB,kBAAkB;IAmCvC;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY;IAQrD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;CAmBxB"}
1
+ {"version":3,"file":"CursorPaginationHandler.d.ts","sourceRoot":"","sources":["../../../src/core/pagination/CursorPaginationHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAUzC,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,IAAI,EAAE,CAAC,EAAE,CAAC;IACV,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,MAAM,iBAAiB,GAAG,CAC9B,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,KACzC,OAAO,CAAC,UAAU,CAAC,CAAC;AAEzB,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,uBAAuB;IAClC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAErC;IAEF;;;;;;OAMG;WACU,SAAS,CACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,EAC5C,IAAI,CAAC,EAAE,OAAO,EACd,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,UAAU,CAAC;IAuCtB;;;;OAIG;WACU,QAAQ,CACnB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,EAAE,EACxB,YAAY,EAAE,YAAY,EAC1B,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,uBAA4B,EACrC,SAAS,CAAC,EAAE,iBAAiB,GAC5B,OAAO,CAAC,OAAO,EAAE,CAAC;IAwDrB;;;;;OAKG;mBACkB,kBAAkB;IAiCvC;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,YAAY;IAQrD;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAiBvC"}
@@ -5,8 +5,6 @@
5
5
  import { ApiClient } from '../ApiClient';
6
6
  export interface PaginationOptions {
7
7
  maxPages?: number;
8
- maxRetries?: number;
9
- retryDelayMs?: number;
10
8
  stopOnEmptyPage?: boolean;
11
9
  }
12
10
  export type PageFetcher = (paginatedEndpoint: string) => Promise<unknown[]>;
@@ -16,15 +14,18 @@ export declare class PaginationHandler {
16
14
  * Fetch remaining pages (2..totalPages) and combine with first page data.
17
15
  * The caller has already fetched page 1 and knows the total page count.
18
16
  */
19
- static fetchRemainingPages(client: ApiClient, endpoint: string, method: string, requiresAuth: boolean, firstPageData: unknown[], totalPages: number, body?: unknown, options?: PaginationOptions, pageFetch?: PageFetcher, templatePath?: string): Promise<unknown[]>;
17
+ static fetchRemainingPages(client: ApiClient, endpoint: string, method: string, requiresAuth: boolean, firstPageData: unknown[], totalPages: number, body: unknown, options: PaginationOptions, pageFetch: PageFetcher, templatePath?: string): Promise<unknown[]>;
20
18
  /**
21
- * Fetch a single page with retry logic
19
+ * Fetch a single page with retry logic.
20
+ *
21
+ * Delegates to the configured `IRetryStrategy` (exponential backoff
22
+ * with jitter) instead of implementing a custom retry loop.
22
23
  */
23
24
  private static fetchPageWithRetry;
24
25
  /**
25
- * Fetch a single page.
26
+ * Build a paginated endpoint path.
26
27
  * Preserves any existing query params on the endpoint and appends page=N.
27
28
  */
28
- private static fetchSinglePage;
29
+ private static buildPaginatedEndpoint;
29
30
  }
30
31
  //# sourceMappingURL=PaginationHandler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PaginationHandler.d.ts","sourceRoot":"","sources":["../../../src/core/pagination/PaginationHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAKzC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAE5E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAKrC;IAEF;;;OAGG;WACU,mBAAmB,CAC9B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,GAAE,iBAAsB,EAC/B,SAAS,CAAC,EAAE,WAAW,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,EAAE,CAAC;IA8DrB;;OAEG;mBACkB,kBAAkB;IA2CvC;;;OAGG;mBACkB,eAAe;CAiDrC"}
1
+ {"version":3,"file":"PaginationHandler.d.ts","sourceRoot":"","sources":["../../../src/core/pagination/PaginationHandler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzC,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAE5E,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAGrC;IAEF;;;OAGG;WACU,mBAAmB,CAC9B,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,aAAa,EAAE,OAAO,EAAE,EACxB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,iBAAiB,EAC1B,SAAS,EAAE,WAAW,EACtB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,OAAO,EAAE,CAAC;IAmDrB;;;;;OAKG;mBACkB,kBAAkB;IA2BvC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;CAOtC"}
@@ -19,9 +19,9 @@ export declare class RateLimiter implements IRateLimiter {
19
19
  private readonly decelerationThreshold;
20
20
  private readonly userKeyExtractor?;
21
21
  private lastRequestTime;
22
+ private minDelayChain;
22
23
  private isTestMode;
23
- private errorLimitRemain;
24
- private errorLimitReset;
24
+ private globalErrorLimit;
25
25
  private defaultBuckets;
26
26
  private userBuckets;
27
27
  private fallbackBucket;
@@ -32,12 +32,18 @@ export declare class RateLimiter implements IRateLimiter {
32
32
  private createBucketFromSpec;
33
33
  private createBucketForGroup;
34
34
  private lookupGroupSpec;
35
+ private resolveUserSet;
35
36
  private resolveBucketMap;
37
+ private resolveErrorLimit;
36
38
  private getBucket;
37
39
  private cleanupStaleUsers;
38
40
  updateFromResponse(headers: Record<string, string>, statusCode: number, templatePath?: string, method?: string, requestHeaders?: Record<string, string>): void;
39
41
  updateRateLimitInfo(headers: Record<string, string>): void;
40
42
  checkRateLimit(templatePath?: string, method?: string, requestHeaders?: Record<string, string>): Promise<void>;
43
+ /**
44
+ * Serializes min-delay waits so concurrent callers cannot all read the same
45
+ * lastRequestTime and fire together after sleeping.
46
+ */
41
47
  private enforceMinDelay;
42
48
  getStatus(): RateLimitInfo;
43
49
  getGroupStatus(group: string): RateLimitGroupStatus | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../../src/core/rateLimiter/RateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AASpE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;CAChE;AAmBD,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAEtB;IAEZ,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAO,CAAC,gBAAgB,CAAe;IACvC,OAAO,CAAC,eAAe,CAAa;IAEpC,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,cAAc,CAAc;IAEpC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAU;gBAEzC,MAAM,CAAC,EAAE,iBAAiB;IAUtC,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,iBAAiB;IAazB,kBAAkB,CAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,IAAI;IAyCP,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIpD,cAAc,CAClB,YAAY,CAAC,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;YA8DF,eAAe;IAgB7B,SAAS,IAAI,aAAa;IAyC1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAa/D,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAexD,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI/C,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAelC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC,KAAK,IAAI,IAAI;CASd"}
1
+ {"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../../src/core/rateLimiter/RateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAUpE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD,MAAM,WAAW,iBAAiB;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,MAAM,CAAC;CAChE;AA0BD,qBAAa,WAAY,YAAW,YAAY;IAC9C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAS;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAEtB;IAEZ,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,UAAU,CAAkB;IAEpC,OAAO,CAAC,gBAAgB,CAA+C;IAEvE,OAAO,CAAC,cAAc,CAAuC;IAC7D,OAAO,CAAC,WAAW,CAA2C;IAC9D,OAAO,CAAC,cAAc,CAAc;IAEpC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAU;gBAEzC,MAAM,CAAC,EAAE,iBAAiB;IAUtC,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,SAAS;IAuBjB,OAAO,CAAC,iBAAiB;IAazB,kBAAkB,CAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,IAAI;IA0CP,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAIpD,cAAc,CAClB,YAAY,CAAC,EAAE,MAAM,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IA+EhB;;;OAGG;YACW,eAAe;IAuB7B,SAAS,IAAI,aAAa;IAyC1B,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS;IAa/D,mBAAmB,IAAI,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC;IAexD,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;IAI/C,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAelC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAInC,KAAK,IAAI,IAAI;CASd"}
@@ -0,0 +1,31 @@
1
+ import { ApiClient } from '../ApiClient';
2
+ import { ICache } from '../cache/ICache';
3
+ import { ParsedHeaders } from '../util/headersUtil';
4
+ export interface EsiHandlerResponse {
5
+ headers: Record<string, string>;
6
+ body: unknown;
7
+ status?: number;
8
+ fromCache?: boolean;
9
+ stale?: boolean;
10
+ cacheHitType?: 'spec-ttl' | 'etag-304' | 'stale-on-error';
11
+ responseTimeMs?: number;
12
+ cursors?: import('../pagination/CursorPaginationHandler').CursorTokens;
13
+ }
14
+ /**
15
+ * Look up the spec-defined cache TTL for a given method + template path.
16
+ * Returns TTL in milliseconds, or undefined if not found.
17
+ */
18
+ export declare function lookupSpecTtl(method: string, templatePath: string): number | undefined;
19
+ /**
20
+ * Attempt a spec-aware cache hit (TTL-based, no network request).
21
+ */
22
+ export declare function trySpecAwareCacheHit(client: ApiClient, url: string, method: string, templatePath: string | undefined, resolveCache: (client: ApiClient) => ICache | null): EsiHandlerResponse | null;
23
+ /**
24
+ * Attempt to return a stale cached response (used on server errors).
25
+ */
26
+ export declare function tryStaleCacheResponse(client: ApiClient, url: string, parsed: ParsedHeaders, resolveCache: (client: ApiClient) => ICache | null): EsiHandlerResponse | null;
27
+ /**
28
+ * Cache a successful response, or invalidate cache for non-GET methods.
29
+ */
30
+ export declare function cacheResponse(client: ApiClient, url: string, method: string, endpoint: string, parsed: ParsedHeaders, data: unknown, useETag: boolean, resolveCache: (client: ApiClient) => ICache | null, templatePath?: string): void;
31
+ //# sourceMappingURL=cachePolicy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cachePolicy.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/cachePolicy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKpD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,YAAY,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,gBAAgB,CAAC;IAC1D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,uCAAuC,EAAE,YAAY,CAAC;CACxE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,MAAM,GAAG,SAAS,CAOpB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,GACjD,kBAAkB,GAAG,IAAI,CAsB3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,GACjD,kBAAkB,GAAG,IAAI,CAa3B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,EAClD,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAgBN"}
@@ -0,0 +1,10 @@
1
+ import { ApiClient } from '../ApiClient';
2
+ import { ICache } from '../cache/ICache';
3
+ import { IRateLimiter } from '../rateLimiter/IRateLimiter';
4
+ import { ICircuitBreaker } from '../circuitBreaker/ICircuitBreaker';
5
+ import { IRetryStrategy } from '../IRetryStrategy';
6
+ export declare function resolveCache(client: ApiClient): ICache | null;
7
+ export declare function resolveRateLimiter(client: ApiClient): IRateLimiter;
8
+ export declare function resolveCircuitBreaker(client: ApiClient): ICircuitBreaker | null;
9
+ export declare function resolveRetryStrategy(client: ApiClient): IRetryStrategy;
10
+ //# sourceMappingURL=dependencies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAE7D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,CAUlE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAChB,eAAe,GAAG,IAAI,CAExB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,cAAc,CAKtE"}
@@ -0,0 +1,28 @@
1
+ import { ApiClient } from '../ApiClient';
2
+ import { ParsedHeaders } from '../util/headersUtil';
3
+ import { ICache } from '../cache/ICache';
4
+ import { IRateLimiter } from '../rateLimiter/IRateLimiter';
5
+ import { ICircuitBreaker } from '../circuitBreaker/ICircuitBreaker';
6
+ export interface RawFetchResult {
7
+ response: Response;
8
+ parsed: ParsedHeaders;
9
+ url: string;
10
+ }
11
+ export interface SingleFetchResult {
12
+ data: unknown;
13
+ parsed: ParsedHeaders;
14
+ url: string;
15
+ }
16
+ /**
17
+ * Execute a single HTTP fetch with rate limiting, circuit breaker, and timeout.
18
+ */
19
+ export declare function executeSingleFetch(client: ApiClient, endpoint: string, method: string, body: unknown, requiresAuth: boolean, useETag: boolean, resolveCache: (client: ApiClient) => ICache | null, resolveRateLimiter: (client: ApiClient) => IRateLimiter, resolveCircuitBreaker: (client: ApiClient) => ICircuitBreaker | null, requestTimeout?: number, templatePath?: string): Promise<RawFetchResult>;
20
+ /**
21
+ * Parse a JSON response body, throwing on parse failure.
22
+ */
23
+ export declare function parseJsonBody(response: Response, _url: string): Promise<unknown>;
24
+ /**
25
+ * Fetch a single page: execute the fetch, check for errors, parse JSON.
26
+ */
27
+ export declare function fetchOnePage(client: ApiClient, endpoint: string, method: string, body: unknown, requiresAuth: boolean, useETag: boolean, resolveCache: (client: ApiClient) => ICache | null, resolveRateLimiter: (client: ApiClient) => IRateLimiter, resolveCircuitBreaker: (client: ApiClient) => ICircuitBreaker | null, requestTimeout?: number, templatePath?: string): Promise<SingleFetchResult>;
28
+ //# sourceMappingURL=fetchExecution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchExecution.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/fetchExecution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAgB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAMpE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,aAAa,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,EAClD,kBAAkB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,YAAY,EACvD,qBAAqB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,eAAe,GAAG,IAAI,EACpE,cAAc,CAAC,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,cAAc,CAAC,CAoGzB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,OAAO,CAAC,CASlB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,OAAO,EACb,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,EAClD,kBAAkB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,YAAY,EACvD,qBAAqB,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,eAAe,GAAG,IAAI,EACpE,cAAc,CAAC,EAAE,MAAM,EACvB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,iBAAiB,CAAC,CA0B5B"}
@@ -0,0 +1,11 @@
1
+ import { ApiClient } from '../ApiClient';
2
+ import { ICache } from '../cache/ICache';
3
+ /**
4
+ * Parse Cache-Control header to extract max-age TTL in milliseconds.
5
+ */
6
+ export declare const parseCacheControlTtl: (headers: Record<string, string>) => number | undefined;
7
+ /**
8
+ * Build the request headers for an ESI API call.
9
+ */
10
+ export declare function buildRequestHeaders(client: ApiClient, url: string, method: string, requiresAuth: boolean, useETag: boolean, body: unknown, resolveCache: (client: ApiClient) => ICache | null): HeadersInit;
11
+ //# sourceMappingURL=headers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/headers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAC9B,MAAM,GAAG,SAKX,CAAC;AAEF;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,OAAO,EACb,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,GACjD,WAAW,CAsCb"}
@@ -0,0 +1,10 @@
1
+ export { buildRequestHeaders, parseCacheControlTtl } from './headers';
2
+ export { lookupSpecTtl, trySpecAwareCacheHit, tryStaleCacheResponse, cacheResponse, } from './cachePolicy';
3
+ export type { EsiHandlerResponse } from './cachePolicy';
4
+ export { STATUS_MESSAGES, handleEarlyStatus, handleErrorResponse, wrapError, } from './statusHandling';
5
+ export { handleCursorPagination, handleOffsetPagination, } from './paginationOrchestration';
6
+ export { applyRequestMiddleware, applyResponseInterceptors, } from './middlewareBridge';
7
+ export { executeSingleFetch, fetchOnePage, parseJsonBody, } from './fetchExecution';
8
+ export type { RawFetchResult, SingleFetchResult } from './fetchExecution';
9
+ export { resolveCache, resolveRateLimiter, resolveCircuitBreaker, resolveRetryStrategy, } from './dependencies';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,SAAS,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { ApiClient } from '../ApiClient';
2
+ import { EsiHandlerResponse } from './cachePolicy';
3
+ /**
4
+ * Apply request interceptors from the middleware pipeline.
5
+ */
6
+ export declare function applyRequestMiddleware(client: ApiClient, url: string, endpoint: string, method: string, headers: Record<string, string>, body: unknown): Promise<{
7
+ url: string;
8
+ headers: Record<string, string>;
9
+ body: unknown;
10
+ }>;
11
+ /**
12
+ * Apply response interceptors from the middleware pipeline.
13
+ */
14
+ export declare function applyResponseInterceptors(client: ApiClient, result: EsiHandlerResponse, url: string, endpoint: string, method: string, startTime: number): Promise<EsiHandlerResponse>;
15
+ //# sourceMappingURL=middlewareBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middlewareBridge.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/middlewareBridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,OAAO,GACZ,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CAkB1E;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAqB7B"}
@@ -0,0 +1,15 @@
1
+ import { ApiClient } from '../ApiClient';
2
+ import { ParsedHeaders } from '../util/headersUtil';
3
+ import { PageFetcher } from '../pagination/PaginationHandler';
4
+ import { ICache } from '../cache/ICache';
5
+ import { EsiHandlerResponse } from './cachePolicy';
6
+ /**
7
+ * Handle cursor-based pagination. Returns null if the response
8
+ * does not contain cursor pagination headers.
9
+ */
10
+ export declare function handleCursorPagination(parsed: ParsedHeaders, data: unknown): EsiHandlerResponse | null;
11
+ /**
12
+ * Handle offset-based pagination. Fetches remaining pages if xPages > 1.
13
+ */
14
+ export declare function handleOffsetPagination(client: ApiClient, endpoint: string, method: string, requiresAuth: boolean, parsed: ParsedHeaders, data: unknown, body: unknown, url: string, useETag: boolean, pageFetch: PageFetcher, resolveCache: (client: ApiClient) => ICache | null, templatePath?: string): Promise<EsiHandlerResponse>;
15
+ //# sourceMappingURL=paginationOrchestration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginationOrchestration.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/paginationOrchestration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAEL,WAAW,EACZ,MAAM,iCAAiC,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAiB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAElE;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,OAAO,GACZ,kBAAkB,GAAG,IAAI,CAS3B;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,OAAO,EACrB,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,OAAO,EACb,IAAI,EAAE,OAAO,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,WAAW,EACtB,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,EAClD,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,kBAAkB,CAAC,CA2D7B"}
@@ -0,0 +1,18 @@
1
+ import { ApiClient } from '../ApiClient';
2
+ import { ICache } from '../cache/ICache';
3
+ import { ParsedHeaders } from '../util/headersUtil';
4
+ import { EsiHandlerResponse } from './cachePolicy';
5
+ export declare const STATUS_MESSAGES: Record<number, string>;
6
+ /**
7
+ * Handle early-return HTTP statuses (201, 204, 304).
8
+ */
9
+ export declare function handleEarlyStatus(client: ApiClient, status: number, url: string, parsed: ParsedHeaders, useETag: boolean, resolveCache: (client: ApiClient) => ICache | null): EsiHandlerResponse | null;
10
+ /**
11
+ * Handle error HTTP responses (4xx, 5xx). May serve stale cache on 5xx.
12
+ */
13
+ export declare function handleErrorResponse(client: ApiClient, response: Response, url: string, parsed: ParsedHeaders, useETag: boolean, resolveCache: (client: ApiClient) => ICache | null): EsiHandlerResponse | never;
14
+ /**
15
+ * Wrap an unknown error into an EsiError or rethrow known errors.
16
+ */
17
+ export declare function wrapError(error: unknown): never;
18
+ //# sourceMappingURL=statusHandling.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"statusHandling.d.ts","sourceRoot":"","sources":["../../../src/core/requestPipeline/statusHandling.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAIpD,OAAO,EAAyB,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAE1E,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAelD,CAAC;AAEF;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,GACjD,kBAAkB,GAAG,IAAI,CAkC3B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,QAAQ,EAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,MAAM,GAAG,IAAI,GACjD,kBAAkB,GAAG,KAAK,CA0B5B;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAU/C"}
@@ -1,3 +1,4 @@
1
+ export declare function sanitizeUrl(url?: string): string | undefined;
1
2
  export declare class EsiError extends Error {
2
3
  readonly statusCode: number;
3
4
  readonly requestId?: string | undefined;
@@ -23,10 +24,14 @@ export declare class TimeoutError extends EsiError {
23
24
  }
24
25
  export declare function isTimeout(error: unknown): error is TimeoutError;
25
26
  export declare function isRetryable(error: unknown): error is EsiError;
27
+ import { CircuitOpenError } from '../circuitBreaker/CircuitBreaker';
28
+ export declare function isCircuitOpen(error: unknown): error is CircuitOpenError;
26
29
  export declare const buildError: (message: string, type?: string, url?: string) => Error;
30
+ export type ValidationDirection = 'request' | 'response';
27
31
  export declare class EsiValidationError extends EsiError {
28
32
  readonly validationError: unknown;
29
- constructor(url: string, zodError: unknown, requestId?: string);
33
+ readonly direction: ValidationDirection;
34
+ constructor(url: string, zodError: unknown, requestId?: string, direction?: ValidationDirection);
30
35
  }
31
36
  export declare function isValidationError(error: unknown): error is EsiValidationError;
32
37
  //# sourceMappingURL=error.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/core/util/error.ts"],"names":[],"mappings":"AAiBA,qBAAa,QAAS,SAAQ,KAAK;aAIf,UAAU,EAAE,MAAM;aAGlB,SAAS,CAAC,EAAE,MAAM;IANpC,SAAgB,GAAG,CAAC,EAAE,MAAM,CAAC;gBAGX,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,EACI,SAAS,CAAC,EAAE,MAAM,YAAA;IAOpC,aAAa,IAAI,OAAO;IAIxB,UAAU,IAAI,OAAO;IAIrB,cAAc,IAAI,OAAO;IAIzB,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,OAAO;IAIpB,IAAI,SAAS,IAAI,OAAO,CASvB;CACF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAEhE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE/D;AAED,qBAAa,YAAa,SAAQ,QAAQ;aAEtB,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM,EACjC,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM;CAKrB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAE/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE7D;AAED,eAAO,MAAM,UAAU,GACrB,SAAS,MAAM,EACf,OAAM,MAAgB,EACtB,MAAM,MAAM,KACX,KAMF,CAAC;AAEF,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,SAAgB,eAAe,EAAE,OAAO,CAAC;gBAE7B,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM;CAK/D;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAE7E"}
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../src/core/util/error.ts"],"names":[],"mappings":"AAcA,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAc5D;AAED,qBAAa,QAAS,SAAQ,KAAK;aAIf,UAAU,EAAE,MAAM;aAGlB,SAAS,CAAC,EAAE,MAAM;IANpC,SAAgB,GAAG,CAAC,EAAE,MAAM,CAAC;gBAGX,UAAU,EAAE,MAAM,EAClC,OAAO,EAAE,MAAM,EACf,GAAG,CAAC,EAAE,MAAM,EACI,SAAS,CAAC,EAAE,MAAM,YAAA;IAOpC,aAAa,IAAI,OAAO;IAIxB,UAAU,IAAI,OAAO;IAIrB,cAAc,IAAI,OAAO;IAIzB,WAAW,IAAI,OAAO;IAItB,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,OAAO;IAIpB,IAAI,SAAS,IAAI,OAAO,CASvB;CACF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAEhE;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE7D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE/D;AAED,qBAAa,YAAa,SAAQ,QAAQ;aAEtB,SAAS,EAAE,MAAM;gBAAjB,SAAS,EAAE,MAAM,EACjC,GAAG,CAAC,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM;CAKrB;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAE/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE7D;AAID,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AAEpE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,gBAAgB,CAEvE;AAED,eAAO,MAAM,UAAU,GACrB,SAAS,MAAM,EACf,OAAM,MAAgB,EACtB,MAAM,MAAM,KACX,KAMF,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,UAAU,CAAC;AAEzD,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,SAAgB,eAAe,EAAE,OAAO,CAAC;IACzC,SAAgB,SAAS,EAAE,mBAAmB,CAAC;gBAG7C,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,EAAE,MAAM,EAClB,SAAS,GAAE,mBAAgC;CAS9C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAE7E"}
@@ -0,0 +1,4 @@
1
+ export { EsiError, TimeoutError, EsiValidationError, isEsiError, isRateLimited, isNotFound, isUnauthorized, isForbidden, isServerError, isTimeout, isRetryable, isValidationError, sanitizeUrl, } from './core/util/error';
2
+ export type { ValidationDirection } from './core/util/error';
3
+ export { CircuitOpenError } from './core/circuitBreaker/CircuitBreaker';
4
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,aAAa,EACb,UAAU,EACV,cAAc,EACd,WAAW,EACX,aAAa,EACb,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,WAAW,GACZ,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC"}
package/dist/errors.js ADDED
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/errors.ts
31
+ var errors_exports = {};
32
+ __export(errors_exports, {
33
+ CircuitOpenError: () => CircuitOpenError,
34
+ EsiError: () => EsiError,
35
+ EsiValidationError: () => EsiValidationError,
36
+ TimeoutError: () => TimeoutError,
37
+ isEsiError: () => isEsiError,
38
+ isForbidden: () => isForbidden,
39
+ isNotFound: () => isNotFound,
40
+ isRateLimited: () => isRateLimited,
41
+ isRetryable: () => isRetryable,
42
+ isServerError: () => isServerError,
43
+ isTimeout: () => isTimeout,
44
+ isUnauthorized: () => isUnauthorized,
45
+ isValidationError: () => isValidationError,
46
+ sanitizeUrl: () => sanitizeUrl
47
+ });
48
+ module.exports = __toCommonJS(errors_exports);
49
+
50
+ // src/core/logger/logger.ts
51
+ var import_pino = __toESM(require("pino"));
52
+ var pinoLogger = (0, import_pino.default)({ level: process.env.ESI_LOG_LEVEL || "warn" });
53
+
54
+ // src/core/circuitBreaker/CircuitBreaker.ts
55
+ var CircuitOpenError = class extends Error {
56
+ endpoint;
57
+ failures;
58
+ retryAfterMs;
59
+ constructor(endpoint, failures, retryAfterMs) {
60
+ super(
61
+ `Circuit breaker open for ${endpoint} after ${failures} failures (retry after ${Math.ceil(retryAfterMs / 1e3)}s)`
62
+ );
63
+ this.name = "CircuitOpenError";
64
+ this.endpoint = endpoint;
65
+ this.failures = failures;
66
+ this.retryAfterMs = retryAfterMs;
67
+ }
68
+ };
69
+
70
+ // src/core/util/error.ts
71
+ var SENSITIVE_PARAMS = [
72
+ "token",
73
+ "access_token",
74
+ "api_key",
75
+ "refresh_token",
76
+ "client_secret",
77
+ "code",
78
+ "key",
79
+ "secret",
80
+ "auth",
81
+ "password",
82
+ "bearer"
83
+ ];
84
+ function sanitizeUrl(url) {
85
+ if (!url) return url;
86
+ try {
87
+ const parsed = new URL(url);
88
+ for (const param of SENSITIVE_PARAMS) {
89
+ if (parsed.searchParams.has(param)) {
90
+ parsed.searchParams.set(param, "[REDACTED]");
91
+ }
92
+ }
93
+ return parsed.toString();
94
+ } catch {
95
+ const qIndex = url.indexOf("?");
96
+ return qIndex >= 0 ? url.substring(0, qIndex) + "?[params-redacted]" : url;
97
+ }
98
+ }
99
+ var EsiError = class extends Error {
100
+ constructor(statusCode, message, url, requestId) {
101
+ super(message);
102
+ this.statusCode = statusCode;
103
+ this.requestId = requestId;
104
+ this.name = "EsiError";
105
+ this.url = sanitizeUrl(url);
106
+ }
107
+ statusCode;
108
+ requestId;
109
+ url;
110
+ isRateLimited() {
111
+ return this.statusCode === 420 || this.statusCode === 429;
112
+ }
113
+ isNotFound() {
114
+ return this.statusCode === 404;
115
+ }
116
+ isUnauthorized() {
117
+ return this.statusCode === 401;
118
+ }
119
+ isForbidden() {
120
+ return this.statusCode === 403;
121
+ }
122
+ isServerError() {
123
+ return this.statusCode >= 500;
124
+ }
125
+ isTimeout() {
126
+ return this.statusCode === 0;
127
+ }
128
+ get retryable() {
129
+ return this.statusCode === 0 || this.statusCode === 420 || this.statusCode === 429 || this.statusCode === 502 || this.statusCode === 503 || this.statusCode === 504;
130
+ }
131
+ };
132
+ function isEsiError(error) {
133
+ return error instanceof EsiError;
134
+ }
135
+ function isRateLimited(error) {
136
+ return error instanceof EsiError && error.isRateLimited();
137
+ }
138
+ function isNotFound(error) {
139
+ return error instanceof EsiError && error.isNotFound();
140
+ }
141
+ function isUnauthorized(error) {
142
+ return error instanceof EsiError && error.isUnauthorized();
143
+ }
144
+ function isForbidden(error) {
145
+ return error instanceof EsiError && error.isForbidden();
146
+ }
147
+ function isServerError(error) {
148
+ return error instanceof EsiError && error.isServerError();
149
+ }
150
+ var TimeoutError = class extends EsiError {
151
+ constructor(timeoutMs, url, requestId) {
152
+ super(0, `Request timed out after ${timeoutMs}ms`, url, requestId);
153
+ this.timeoutMs = timeoutMs;
154
+ this.name = "TimeoutError";
155
+ }
156
+ timeoutMs;
157
+ };
158
+ function isTimeout(error) {
159
+ return error instanceof TimeoutError;
160
+ }
161
+ function isRetryable(error) {
162
+ return error instanceof EsiError && error.retryable;
163
+ }
164
+ var EsiValidationError = class extends EsiError {
165
+ validationError;
166
+ direction;
167
+ constructor(url, zodError, requestId, direction = "response") {
168
+ const safeUrl = sanitizeUrl(url) ?? url;
169
+ const label = direction === "request" ? "Request body" : "Response";
170
+ super(0, `${label} validation failed for ${safeUrl}`, url, requestId);
171
+ this.name = "EsiValidationError";
172
+ this.validationError = zodError;
173
+ this.direction = direction;
174
+ }
175
+ };
176
+ function isValidationError(error) {
177
+ return error instanceof EsiValidationError;
178
+ }
179
+ // Annotate the CommonJS export names for ESM import in node:
180
+ 0 && (module.exports = {
181
+ CircuitOpenError,
182
+ EsiError,
183
+ EsiValidationError,
184
+ TimeoutError,
185
+ isEsiError,
186
+ isForbidden,
187
+ isNotFound,
188
+ isRateLimited,
189
+ isRetryable,
190
+ isServerError,
191
+ isTimeout,
192
+ isUnauthorized,
193
+ isValidationError,
194
+ sanitizeUrl
195
+ });
196
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/core/logger/logger.ts","../src/core/circuitBreaker/CircuitBreaker.ts","../src/core/util/error.ts"],"sourcesContent":["export {\n EsiError,\n TimeoutError,\n EsiValidationError,\n isEsiError,\n isRateLimited,\n isNotFound,\n isUnauthorized,\n isForbidden,\n isServerError,\n isTimeout,\n isRetryable,\n isValidationError,\n sanitizeUrl,\n} from './core/util/error';\nexport type { ValidationDirection } from './core/util/error';\n\nexport { CircuitOpenError } from './core/circuitBreaker/CircuitBreaker';\n","import pino from 'pino';\nimport { ILogger } from './ILogger';\n\nconst pinoLogger = pino({ level: process.env.ESI_LOG_LEVEL || 'warn' });\n\nconst logger: ILogger = {\n info: (msg: string) => {\n pinoLogger.info(msg);\n },\n warn: (msg: string) => {\n pinoLogger.warn(msg);\n },\n error: (msg: string) => {\n pinoLogger.error(msg);\n },\n debug: (msg: string) => {\n pinoLogger.debug(msg);\n },\n};\n\nexport default logger;\n","import { logWarn, logInfo } from '../logger/loggerUtil';\nimport { ICircuitBreaker } from './ICircuitBreaker';\n\nexport type CircuitState = 'closed' | 'open' | 'half-open';\n\nexport interface CircuitBreakerConfig {\n failureThreshold?: number;\n resetTimeoutMs?: number;\n halfOpenMaxAttempts?: number;\n staleThresholdMs?: number;\n /** 'resolved' (default, current behavior) | 'template' (group by endpoint template path) */\n keyStrategy?: 'resolved' | 'template';\n /** Interval in ms for automatic cleanup of stale circuits. 0 or undefined disables. Recommended value: staleThresholdMs. */\n cleanupIntervalMs?: number;\n}\n\ninterface CircuitRecord {\n state: CircuitState;\n failures: number;\n lastFailureTime: number;\n halfOpenAttempts: number;\n}\n\nexport class CircuitBreaker implements ICircuitBreaker {\n private circuits: Map<string, CircuitRecord> = new Map();\n private readonly failureThreshold: number;\n private readonly resetTimeoutMs: number;\n private readonly halfOpenMaxAttempts: number;\n private readonly staleThresholdMs: number;\n private readonly keyStrategy: 'resolved' | 'template';\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: CircuitBreakerConfig = {}) {\n this.failureThreshold = config.failureThreshold ?? 5;\n this.resetTimeoutMs = config.resetTimeoutMs ?? 30_000;\n this.halfOpenMaxAttempts = config.halfOpenMaxAttempts ?? 1;\n this.staleThresholdMs = config.staleThresholdMs ?? 3_600_000;\n this.keyStrategy = config.keyStrategy ?? 'resolved';\n\n const cleanupIntervalMs = config.cleanupIntervalMs;\n if (cleanupIntervalMs !== undefined && cleanupIntervalMs > 0) {\n this.startCleanupTimer(cleanupIntervalMs);\n }\n }\n\n private getKey(endpoint: string): string {\n return endpoint.split('?')[0]!;\n }\n\n private getOrCreate(key: string): CircuitRecord {\n let record = this.circuits.get(key);\n if (!record) {\n record = {\n state: 'closed',\n failures: 0,\n lastFailureTime: 0,\n halfOpenAttempts: 0,\n };\n this.circuits.set(key, record);\n }\n return record;\n }\n\n checkCircuit(endpoint: string): void {\n const key = this.getKey(endpoint);\n const record = this.getOrCreate(key);\n\n if (record.state === 'closed') return;\n\n if (record.state === 'open') {\n const elapsed = Date.now() - record.lastFailureTime;\n if (elapsed >= this.resetTimeoutMs) {\n record.state = 'half-open';\n record.halfOpenAttempts = 0;\n logInfo(`Circuit half-open for ${key}, allowing probe request`);\n return;\n }\n const remainingMs = this.resetTimeoutMs - elapsed;\n throw new CircuitOpenError(key, record.failures, remainingMs);\n }\n\n if (record.state === 'half-open') {\n if (record.halfOpenAttempts >= this.halfOpenMaxAttempts) {\n throw new CircuitOpenError(key, record.failures, this.resetTimeoutMs);\n }\n record.halfOpenAttempts++;\n }\n }\n\n recordSuccess(endpoint: string): void {\n const key = this.getKey(endpoint);\n const record = this.circuits.get(key);\n if (!record) return;\n\n if (record.state === 'half-open') {\n logInfo(`Circuit closed for ${key} after successful probe`);\n }\n\n record.state = 'closed';\n record.failures = 0;\n record.halfOpenAttempts = 0;\n }\n\n recordFailure(endpoint: string, statusCode: number): void {\n // statusCode 0 = network/timeout; 420/429 = rate limited; >=500 = server errors\n if (\n statusCode !== 0 &&\n statusCode < 500 &&\n statusCode !== 420 &&\n statusCode !== 429\n ) {\n return;\n }\n\n const key = this.getKey(endpoint);\n const record = this.getOrCreate(key);\n\n record.failures++;\n record.lastFailureTime = Date.now();\n\n if (record.state === 'half-open') {\n record.state = 'open';\n logWarn(\n `Circuit re-opened for ${key} after failed probe (${record.failures} failures)`,\n );\n return;\n }\n\n if (record.failures >= this.failureThreshold) {\n record.state = 'open';\n logWarn(\n `Circuit opened for ${key} after ${record.failures} consecutive failures`,\n );\n }\n }\n\n getState(endpoint: string): CircuitState {\n const key = this.getKey(endpoint);\n const record = this.circuits.get(key);\n if (!record) return 'closed';\n\n if (record.state === 'open') {\n const elapsed = Date.now() - record.lastFailureTime;\n if (elapsed >= this.resetTimeoutMs) {\n return 'half-open';\n }\n }\n\n return record.state;\n }\n\n getStats(): {\n totalCircuits: number;\n openCircuits: number;\n circuits: Record<string, { state: CircuitState; failures: number }>;\n } {\n const circuits: Record<string, { state: CircuitState; failures: number }> =\n {};\n let openCircuits = 0;\n\n for (const [key, record] of this.circuits.entries()) {\n const state = this.getState(key);\n // eslint-disable-next-line security/detect-object-injection\n circuits[key] = { state, failures: record.failures };\n if (state === 'open') openCircuits++;\n }\n\n return {\n totalCircuits: this.circuits.size,\n openCircuits,\n circuits,\n };\n }\n\n reset(endpoint?: string): void {\n if (endpoint) {\n this.circuits.delete(this.getKey(endpoint));\n } else {\n this.circuits.clear();\n }\n }\n\n cleanup(): number {\n const now = Date.now();\n let cleaned = 0;\n for (const [key, record] of this.circuits.entries()) {\n if (\n record.state === 'closed' &&\n record.failures === 0 &&\n record.lastFailureTime > 0 &&\n now - record.lastFailureTime > this.staleThresholdMs\n ) {\n this.circuits.delete(key);\n cleaned++;\n }\n }\n if (cleaned > 0) {\n logInfo(`Circuit breaker cleanup: removed ${cleaned} stale circuits`);\n }\n return cleaned;\n }\n\n getKeyStrategy(): 'resolved' | 'template' {\n return this.keyStrategy;\n }\n\n destroy(): void {\n if (this.cleanupTimer) {\n clearInterval(this.cleanupTimer);\n this.cleanupTimer = null;\n }\n this.circuits.clear();\n }\n\n shutdown(): void {\n this.destroy();\n }\n\n private startCleanupTimer(intervalMs: number): void {\n this.cleanupTimer = setInterval(() => {\n this.cleanup();\n }, intervalMs);\n // Don't prevent process exit (important for test runners and CLI tools)\n this.cleanupTimer.unref();\n }\n}\n\nexport class CircuitOpenError extends Error {\n readonly endpoint: string;\n readonly failures: number;\n readonly retryAfterMs: number;\n\n constructor(endpoint: string, failures: number, retryAfterMs: number) {\n super(\n `Circuit breaker open for ${endpoint} after ${failures} failures (retry after ${Math.ceil(retryAfterMs / 1000)}s)`,\n );\n this.name = 'CircuitOpenError';\n this.endpoint = endpoint;\n this.failures = failures;\n this.retryAfterMs = retryAfterMs;\n }\n}\n","const SENSITIVE_PARAMS = [\n 'token',\n 'access_token',\n 'api_key',\n 'refresh_token',\n 'client_secret',\n 'code',\n 'key',\n 'secret',\n 'auth',\n 'password',\n 'bearer',\n];\n\nexport function sanitizeUrl(url?: string): string | undefined {\n if (!url) return url;\n try {\n const parsed = new URL(url);\n for (const param of SENSITIVE_PARAMS) {\n if (parsed.searchParams.has(param)) {\n parsed.searchParams.set(param, '[REDACTED]');\n }\n }\n return parsed.toString();\n } catch {\n const qIndex = url.indexOf('?');\n return qIndex >= 0 ? url.substring(0, qIndex) + '?[params-redacted]' : url;\n }\n}\n\nexport class EsiError extends Error {\n public readonly url?: string;\n\n constructor(\n public readonly statusCode: number,\n message: string,\n url?: string,\n public readonly requestId?: string,\n ) {\n super(message);\n this.name = 'EsiError';\n this.url = sanitizeUrl(url);\n }\n\n isRateLimited(): boolean {\n return this.statusCode === 420 || this.statusCode === 429;\n }\n\n isNotFound(): boolean {\n return this.statusCode === 404;\n }\n\n isUnauthorized(): boolean {\n return this.statusCode === 401;\n }\n\n isForbidden(): boolean {\n return this.statusCode === 403;\n }\n\n isServerError(): boolean {\n return this.statusCode >= 500;\n }\n\n isTimeout(): boolean {\n return this.statusCode === 0;\n }\n\n get retryable(): boolean {\n return (\n this.statusCode === 0 ||\n this.statusCode === 420 ||\n this.statusCode === 429 ||\n this.statusCode === 502 ||\n this.statusCode === 503 ||\n this.statusCode === 504\n );\n }\n}\n\nexport function isEsiError(error: unknown): error is EsiError {\n return error instanceof EsiError;\n}\n\nexport function isRateLimited(error: unknown): error is EsiError {\n return error instanceof EsiError && error.isRateLimited();\n}\n\nexport function isNotFound(error: unknown): error is EsiError {\n return error instanceof EsiError && error.isNotFound();\n}\n\nexport function isUnauthorized(error: unknown): error is EsiError {\n return error instanceof EsiError && error.isUnauthorized();\n}\n\nexport function isForbidden(error: unknown): error is EsiError {\n return error instanceof EsiError && error.isForbidden();\n}\n\nexport function isServerError(error: unknown): error is EsiError {\n return error instanceof EsiError && error.isServerError();\n}\n\nexport class TimeoutError extends EsiError {\n constructor(\n public readonly timeoutMs: number,\n url?: string,\n requestId?: string,\n ) {\n super(0, `Request timed out after ${timeoutMs}ms`, url, requestId);\n this.name = 'TimeoutError';\n }\n}\n\nexport function isTimeout(error: unknown): error is TimeoutError {\n return error instanceof TimeoutError;\n}\n\nexport function isRetryable(error: unknown): error is EsiError {\n return error instanceof EsiError && error.retryable;\n}\n\n// Re-export CircuitOpenError for the type guard — avoid forcing consumers\n// to import from the circuitBreaker subpath just for error checking.\nimport { CircuitOpenError } from '../circuitBreaker/CircuitBreaker';\n\nexport function isCircuitOpen(error: unknown): error is CircuitOpenError {\n return error instanceof CircuitOpenError;\n}\n\nexport const buildError = (\n message: string,\n type: string = 'ERROR',\n url?: string,\n): Error => {\n const error = new Error(`[${type}] ${message}`);\n if (url) {\n (error as Error & { url: string }).url = url;\n }\n return error;\n};\n\nexport type ValidationDirection = 'request' | 'response';\n\nexport class EsiValidationError extends EsiError {\n public readonly validationError: unknown;\n public readonly direction: ValidationDirection;\n\n constructor(\n url: string,\n zodError: unknown,\n requestId?: string,\n direction: ValidationDirection = 'response',\n ) {\n const safeUrl = sanitizeUrl(url) ?? url;\n const label = direction === 'request' ? 'Request body' : 'Response';\n super(0, `${label} validation failed for ${safeUrl}`, url, requestId);\n this.name = 'EsiValidationError';\n this.validationError = zodError;\n this.direction = direction;\n }\n}\n\nexport function isValidationError(error: unknown): error is EsiValidationError {\n return error instanceof EsiValidationError;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,kBAAiB;AAGjB,IAAM,iBAAa,YAAAA,SAAK,EAAE,OAAO,QAAQ,IAAI,iBAAiB,OAAO,CAAC;;;ACgO/D,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,UAAkB,UAAkB,cAAsB;AACpE;AAAA,MACE,4BAA4B,QAAQ,UAAU,QAAQ,0BAA0B,KAAK,KAAK,eAAe,GAAI,CAAC;AAAA,IAChH;AACA,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,eAAe;AAAA,EACtB;AACF;;;ACjPA,IAAM,mBAAmB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,SAAS,YAAY,KAAkC;AAC5D,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,GAAG;AAC1B,eAAW,SAAS,kBAAkB;AACpC,UAAI,OAAO,aAAa,IAAI,KAAK,GAAG;AAClC,eAAO,aAAa,IAAI,OAAO,YAAY;AAAA,MAC7C;AAAA,IACF;AACA,WAAO,OAAO,SAAS;AAAA,EACzB,QAAQ;AACN,UAAM,SAAS,IAAI,QAAQ,GAAG;AAC9B,WAAO,UAAU,IAAI,IAAI,UAAU,GAAG,MAAM,IAAI,uBAAuB;AAAA,EACzE;AACF;AAEO,IAAM,WAAN,cAAuB,MAAM;AAAA,EAGlC,YACkB,YAChB,SACA,KACgB,WAChB;AACA,UAAM,OAAO;AALG;AAGA;AAGhB,SAAK,OAAO;AACZ,SAAK,MAAM,YAAY,GAAG;AAAA,EAC5B;AAAA,EARkB;AAAA,EAGA;AAAA,EANF;AAAA,EAahB,gBAAyB;AACvB,WAAO,KAAK,eAAe,OAAO,KAAK,eAAe;AAAA,EACxD;AAAA,EAEA,aAAsB;AACpB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,iBAA0B;AACxB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,cAAuB;AACrB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,gBAAyB;AACvB,WAAO,KAAK,cAAc;AAAA,EAC5B;AAAA,EAEA,YAAqB;AACnB,WAAO,KAAK,eAAe;AAAA,EAC7B;AAAA,EAEA,IAAI,YAAqB;AACvB,WACE,KAAK,eAAe,KACpB,KAAK,eAAe,OACpB,KAAK,eAAe,OACpB,KAAK,eAAe,OACpB,KAAK,eAAe,OACpB,KAAK,eAAe;AAAA,EAExB;AACF;AAEO,SAAS,WAAW,OAAmC;AAC5D,SAAO,iBAAiB;AAC1B;AAEO,SAAS,cAAc,OAAmC;AAC/D,SAAO,iBAAiB,YAAY,MAAM,cAAc;AAC1D;AAEO,SAAS,WAAW,OAAmC;AAC5D,SAAO,iBAAiB,YAAY,MAAM,WAAW;AACvD;AAEO,SAAS,eAAe,OAAmC;AAChE,SAAO,iBAAiB,YAAY,MAAM,eAAe;AAC3D;AAEO,SAAS,YAAY,OAAmC;AAC7D,SAAO,iBAAiB,YAAY,MAAM,YAAY;AACxD;AAEO,SAAS,cAAc,OAAmC;AAC/D,SAAO,iBAAiB,YAAY,MAAM,cAAc;AAC1D;AAEO,IAAM,eAAN,cAA2B,SAAS;AAAA,EACzC,YACkB,WAChB,KACA,WACA;AACA,UAAM,GAAG,2BAA2B,SAAS,MAAM,KAAK,SAAS;AAJjD;AAKhB,SAAK,OAAO;AAAA,EACd;AAAA,EANkB;AAOpB;AAEO,SAAS,UAAU,OAAuC;AAC/D,SAAO,iBAAiB;AAC1B;AAEO,SAAS,YAAY,OAAmC;AAC7D,SAAO,iBAAiB,YAAY,MAAM;AAC5C;AAwBO,IAAM,qBAAN,cAAiC,SAAS;AAAA,EAC/B;AAAA,EACA;AAAA,EAEhB,YACE,KACA,UACA,WACA,YAAiC,YACjC;AACA,UAAM,UAAU,YAAY,GAAG,KAAK;AACpC,UAAM,QAAQ,cAAc,YAAY,iBAAiB;AACzD,UAAM,GAAG,GAAG,KAAK,0BAA0B,OAAO,IAAI,KAAK,SAAS;AACpE,SAAK,OAAO;AACZ,SAAK,kBAAkB;AACvB,SAAK,YAAY;AAAA,EACnB;AACF;AAEO,SAAS,kBAAkB,OAA6C;AAC7E,SAAO,iBAAiB;AAC1B;","names":["pino"]}