@lgriffin/esi.ts 10.0.0 → 10.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. package/CHANGELOG.md +158 -0
  2. package/README.md +14 -5
  3. package/dist/EsiClient.d.mts +140 -0
  4. package/dist/EsiClientBuilder.d.mts +75 -0
  5. package/dist/auth/EsiTokenManager.d.mts +200 -0
  6. package/dist/auth/EveSsoClient.d.mts +88 -0
  7. package/dist/auth/errors.d.mts +42 -0
  8. package/dist/auth/index.d.mts +14 -0
  9. package/dist/auth/jwt.d.mts +43 -0
  10. package/dist/auth/pkce.d.mts +21 -0
  11. package/dist/auth/storage/FileTokenStorage.d.mts +44 -0
  12. package/dist/auth/storage/MemoryTokenStorage.d.mts +18 -0
  13. package/dist/auth/types.d.mts +42 -0
  14. package/dist/{chunk-7A72QFDF.mjs → chunk-4W66ONJI.mjs} +4 -7
  15. package/dist/chunk-4W66ONJI.mjs.map +1 -0
  16. package/dist/{chunk-HPSACXX3.js → chunk-N3B65VLB.js} +4 -7
  17. package/dist/chunk-N3B65VLB.js.map +1 -0
  18. package/dist/clients/AccessListsClient.d.mts +25 -0
  19. package/dist/clients/AllianceClient.d.mts +59 -0
  20. package/dist/clients/AssetsClient.d.mts +65 -0
  21. package/dist/clients/BaseEsiClient.d.mts +19 -0
  22. package/dist/clients/CalendarClient.d.mts +48 -0
  23. package/dist/clients/CharacterClient.d.mts +134 -0
  24. package/dist/clients/ClonesClient.d.mts +27 -0
  25. package/dist/clients/ContactsClient.d.mts +96 -0
  26. package/dist/clients/ContractsClient.d.mts +91 -0
  27. package/dist/clients/CorporationProjectsClient.d.mts +54 -0
  28. package/dist/clients/CorporationsClient.d.mts +219 -0
  29. package/dist/clients/CosmeticsClient.d.mts +11 -0
  30. package/dist/clients/DogmaClient.d.mts +42 -0
  31. package/dist/clients/FactionClient.d.mts +60 -0
  32. package/dist/clients/FittingsClient.d.mts +38 -0
  33. package/dist/clients/FleetClient.d.mts +134 -0
  34. package/dist/clients/FreelanceJobsClient.d.mts +61 -0
  35. package/dist/clients/IncursionsClient.d.mts +14 -0
  36. package/dist/clients/IndustryClient.d.mts +86 -0
  37. package/dist/clients/InsuranceClient.d.mts +14 -0
  38. package/dist/clients/KillmailsClient.d.mts +37 -0
  39. package/dist/clients/LocationClient.d.mts +32 -0
  40. package/dist/clients/LoyaltyClient.d.mts +28 -0
  41. package/dist/clients/MailClient.d.mts +104 -0
  42. package/dist/clients/MarketClient.d.mts +102 -0
  43. package/dist/clients/MercenaryClient.d.mts +42 -0
  44. package/dist/clients/MetaClient.d.mts +45 -0
  45. package/dist/clients/MilitaryCampaignsClient.d.mts +53 -0
  46. package/dist/clients/ParagonHubClient.d.mts +13 -0
  47. package/dist/clients/PiClient.d.mts +45 -0
  48. package/dist/clients/RouteClient.d.mts +25 -0
  49. package/dist/clients/SearchClient.d.mts +17 -0
  50. package/dist/clients/SkillsClient.d.mts +39 -0
  51. package/dist/clients/SkyhooksClient.d.mts +48 -0
  52. package/dist/clients/SovereigntyClient.d.mts +20 -0
  53. package/dist/clients/StatusClient.d.mts +14 -0
  54. package/dist/clients/UiClient.d.mts +44 -0
  55. package/dist/clients/UniverseClient.d.mts +212 -0
  56. package/dist/clients/WalletClient.d.mts +70 -0
  57. package/dist/clients/WarsClient.d.mts +33 -0
  58. package/dist/core/ApiClient.d.mts +73 -0
  59. package/dist/core/ApiClientBuilder.d.mts +24 -0
  60. package/dist/core/ApiRequestHandler.d.ts.map +1 -1
  61. package/dist/core/BatchRequestHandler.d.mts +12 -0
  62. package/dist/core/ClientRegistry.d.mts +45 -0
  63. package/dist/core/EsiDiagnostics.d.mts +35 -0
  64. package/dist/core/IDeduplicator.d.mts +22 -0
  65. package/dist/core/IDeduplicator.d.ts +16 -0
  66. package/dist/core/IDeduplicator.d.ts.map +1 -1
  67. package/dist/core/IRetryStrategy.d.mts +5 -0
  68. package/dist/core/RequestDeduplicator.d.mts +21 -0
  69. package/dist/core/RequestDeduplicator.d.ts +11 -0
  70. package/dist/core/RequestDeduplicator.d.ts.map +1 -1
  71. package/dist/core/RetryStrategy.d.mts +21 -0
  72. package/dist/core/cache/ETagCacheManager.d.mts +75 -0
  73. package/dist/core/cache/ICache.d.mts +27 -0
  74. package/dist/core/cache/cacheKey.d.ts +11 -0
  75. package/dist/core/cache/cacheKey.d.ts.map +1 -1
  76. package/dist/core/circuitBreaker/CircuitBreaker.d.mts +52 -0
  77. package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
  78. package/dist/core/circuitBreaker/ICircuitBreaker.d.mts +23 -0
  79. package/dist/core/configureApiClient.d.mts +18 -0
  80. package/dist/core/constants.d.ts +2 -2
  81. package/dist/core/endpoints/EndpointDefinition.d.mts +63 -0
  82. package/dist/core/endpoints/accessListEndpoints.d.mts +34 -0
  83. package/dist/core/endpoints/allianceEndpoints.d.mts +43 -0
  84. package/dist/core/endpoints/assetEndpoints.d.mts +76 -0
  85. package/dist/core/endpoints/buildEndpointPath.d.mts +7 -0
  86. package/dist/core/endpoints/calendarEndpoints.d.mts +54 -0
  87. package/dist/core/endpoints/characterEndpoints.d.mts +185 -0
  88. package/dist/core/endpoints/cloneEndpoints.d.mts +32 -0
  89. package/dist/core/endpoints/contactEndpoints.d.mts +106 -0
  90. package/dist/core/endpoints/contractEndpoints.d.mts +168 -0
  91. package/dist/core/endpoints/corporationEndpoints.d.mts +324 -0
  92. package/dist/core/endpoints/corporationProjectEndpoints.d.mts +102 -0
  93. package/dist/core/endpoints/cosmeticsEndpoints.d.mts +52 -0
  94. package/dist/core/endpoints/createClient.d.mts +69 -0
  95. package/dist/core/endpoints/dogmaEndpoints.d.mts +89 -0
  96. package/dist/core/endpoints/esi-cache-ttls.generated.d.ts.map +1 -1
  97. package/dist/core/endpoints/esi-rate-limit-groups.generated.d.mts +7 -0
  98. package/dist/core/endpoints/esi-rate-limit-groups.generated.d.ts.map +1 -1
  99. package/dist/core/endpoints/esi-scopes.generated.d.mts +3 -0
  100. package/dist/core/endpoints/esi-scopes.generated.d.ts.map +1 -1
  101. package/dist/core/endpoints/factionEndpoints.d.mts +194 -0
  102. package/dist/core/endpoints/fittingEndpoints.d.mts +34 -0
  103. package/dist/core/endpoints/fleetEndpoints.d.mts +137 -0
  104. package/dist/core/endpoints/freelanceJobsEndpoints.d.mts +181 -0
  105. package/dist/core/endpoints/incursionEndpoints.d.mts +19 -0
  106. package/dist/core/endpoints/industryEndpoints.d.mts +138 -0
  107. package/dist/core/endpoints/insuranceEndpoints.d.mts +17 -0
  108. package/dist/core/endpoints/killmailEndpoints.d.mts +62 -0
  109. package/dist/core/endpoints/locationEndpoints.d.mts +37 -0
  110. package/dist/core/endpoints/loyaltyEndpoints.d.mts +32 -0
  111. package/dist/core/endpoints/mailEndpoints.d.mts +111 -0
  112. package/dist/core/endpoints/marketEndpoints.d.mts +191 -0
  113. package/dist/core/endpoints/mercenaryEndpoints.d.mts +79 -0
  114. package/dist/core/endpoints/metaEndpoints.d.mts +50 -0
  115. package/dist/core/endpoints/militaryCampaignEndpoints.d.mts +87 -0
  116. package/dist/core/endpoints/paragonHubEndpoints.d.mts +163 -0
  117. package/dist/core/endpoints/piEndpoints.d.mts +101 -0
  118. package/dist/core/endpoints/routeEndpoints.d.mts +14 -0
  119. package/dist/core/endpoints/searchEndpoints.d.mts +26 -0
  120. package/dist/core/endpoints/skillEndpoints.d.mts +52 -0
  121. package/dist/core/endpoints/skyhookEndpoints.d.mts +111 -0
  122. package/dist/core/endpoints/sovereigntyEndpoints.d.mts +59 -0
  123. package/dist/core/endpoints/statusEndpoints.d.mts +14 -0
  124. package/dist/core/endpoints/uiEndpoints.d.mts +43 -0
  125. package/dist/core/endpoints/universeEndpoints.d.mts +456 -0
  126. package/dist/core/endpoints/walletEndpoints.d.mts +98 -0
  127. package/dist/core/endpoints/warEndpoints.d.mts +51 -0
  128. package/dist/core/logger/DefaultLogger.d.mts +31 -0
  129. package/dist/core/logger/ILogger.d.mts +17 -0
  130. package/dist/core/logger/NoopLogger.d.mts +7 -0
  131. package/dist/core/logger/loggerUtil.d.mts +11 -0
  132. package/dist/core/logger/resolveLogger.d.ts +3 -3
  133. package/dist/core/logger/resolveLogger.d.ts.map +1 -1
  134. package/dist/core/middleware/Middleware.d.mts +30 -0
  135. package/dist/core/pagination/AsyncPaginationIterator.d.mts +12 -0
  136. package/dist/core/pagination/AsyncPaginationIterator.d.ts.map +1 -1
  137. package/dist/core/pagination/CursorPaginationHandler.d.mts +68 -0
  138. package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
  139. package/dist/core/rateLimiter/IRateLimiter.d.mts +27 -0
  140. package/dist/core/rateLimiter/RateLimiter.d.mts +62 -0
  141. package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
  142. package/dist/core/requestPipeline/cachePolicy.d.ts +11 -1
  143. package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -1
  144. package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -1
  145. package/dist/core/requestPipeline/index.d.ts +1 -1
  146. package/dist/core/requestPipeline/index.d.ts.map +1 -1
  147. package/dist/core/requestPipeline/paginationOrchestration.d.ts +1 -1
  148. package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -1
  149. package/dist/core/requestPipeline/statusHandling.d.ts +6 -0
  150. package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -1
  151. package/dist/core/util/concurrency.d.ts.map +1 -1
  152. package/dist/core/util/error.d.mts +37 -0
  153. package/dist/core/util/retry.d.mts +8 -0
  154. package/dist/core/util/retry.d.ts.map +1 -1
  155. package/dist/errors.d.mts +5 -0
  156. package/dist/errors.js +2 -2
  157. package/dist/errors.mjs +1 -1
  158. package/dist/index.d.mts +81 -0
  159. package/dist/index.js +374 -197
  160. package/dist/index.js.map +1 -1
  161. package/dist/index.mjs +267 -90
  162. package/dist/index.mjs.map +1 -1
  163. package/dist/schemas/access-lists.d.mts +16 -0
  164. package/dist/schemas/alliance.d.mts +26 -0
  165. package/dist/schemas/assets.d.mts +24 -0
  166. package/dist/schemas/calendar.d.mts +27 -0
  167. package/dist/schemas/character.d.mts +109 -0
  168. package/dist/schemas/clones.d.mts +17 -0
  169. package/dist/schemas/common.d.mts +74 -0
  170. package/dist/schemas/contacts.d.mts +14 -0
  171. package/dist/schemas/contracts.d.mts +104 -0
  172. package/dist/schemas/corporation-projects.d.mts +104 -0
  173. package/dist/schemas/corporation.d.mts +193 -0
  174. package/dist/schemas/cosmetics.d.mts +58 -0
  175. package/dist/schemas/dogma.d.mts +57 -0
  176. package/dist/schemas/esiEnum.d.mts +3 -0
  177. package/dist/schemas/faction-warfare.d.mts +203 -0
  178. package/dist/schemas/fittings.d.mts +13 -0
  179. package/dist/schemas/fleet.d.mts +37 -0
  180. package/dist/schemas/freelance-jobs.d.mts +171 -0
  181. package/dist/schemas/incursions.d.mts +12 -0
  182. package/dist/schemas/index.d.mts +39 -0
  183. package/dist/schemas/industry.d.mts +99 -0
  184. package/dist/schemas/insurance.d.mts +10 -0
  185. package/dist/schemas/killmails.d.mts +38 -0
  186. package/dist/schemas/location.d.mts +18 -0
  187. package/dist/schemas/loyalty.d.mts +18 -0
  188. package/dist/schemas/mail.d.mts +53 -0
  189. package/dist/schemas/market.d.mts +123 -0
  190. package/dist/schemas/mercenary.d.mts +74 -0
  191. package/dist/schemas/meta.d.mts +36 -0
  192. package/dist/schemas/military-campaigns.d.mts +26 -0
  193. package/dist/schemas/paragon-hub.d.mts +96 -0
  194. package/dist/schemas/pi.d.mts +71 -0
  195. package/dist/schemas/skills.d.mts +28 -0
  196. package/dist/schemas/skyhooks.d.mts +129 -0
  197. package/dist/schemas/sovereignty.d.mts +56 -0
  198. package/dist/schemas/status.d.mts +8 -0
  199. package/dist/schemas/universe.d.mts +285 -0
  200. package/dist/schemas/wallet.d.mts +45 -0
  201. package/dist/schemas/wars.d.mts +27 -0
  202. package/dist/sde/IStaticDataProvider.d.mts +106 -0
  203. package/dist/sde/MemorySdeProvider.d.mts +167 -0
  204. package/dist/sde/SdeDataProvider.d.mts +119 -0
  205. package/dist/sde/SdeTestDataFactory.d.mts +33 -0
  206. package/dist/sde/errors.d.mts +23 -0
  207. package/dist/sde/index.d.mts +9 -0
  208. package/dist/sde/memory.d.mts +8 -0
  209. package/dist/sde/types.d.mts +1039 -0
  210. package/dist/sde/version.d.mts +7 -0
  211. package/dist/testing/TestDataFactory.d.mts +172 -0
  212. package/dist/testing/index.d.mts +2 -0
  213. package/dist/testing/index.js +2 -2
  214. package/dist/testing/index.mjs +1 -1
  215. package/dist/types/access-lists.d.mts +5 -0
  216. package/dist/types/alliance.d.mts +7 -0
  217. package/dist/types/api-responses.d.mts +40 -0
  218. package/dist/types/assets.d.mts +6 -0
  219. package/dist/types/branded.d.mts +23 -0
  220. package/dist/types/calendar.d.mts +6 -0
  221. package/dist/types/character.d.mts +17 -0
  222. package/dist/types/clones.d.mts +4 -0
  223. package/dist/types/common.d.mts +19 -0
  224. package/dist/types/contacts.d.mts +5 -0
  225. package/dist/types/contracts.d.mts +9 -0
  226. package/dist/types/corporation-projects.d.mts +10 -0
  227. package/dist/types/corporation.d.mts +19 -0
  228. package/dist/types/cosmetics.d.mts +8 -0
  229. package/dist/types/dogma.d.mts +6 -0
  230. package/dist/types/faction-warfare.d.mts +17 -0
  231. package/dist/types/fittings.d.mts +4 -0
  232. package/dist/types/fleet.d.mts +7 -0
  233. package/dist/types/freelance-jobs.d.mts +12 -0
  234. package/dist/types/generated/esi-spec.generated.d.mts +2136 -0
  235. package/dist/types/generated/esi-spec.generated.d.ts +164 -16
  236. package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
  237. package/dist/types/generated/spec-alignment.check.d.ts +2 -2
  238. package/dist/types/incursions.d.mts +4 -0
  239. package/dist/types/industry.d.mts +11 -0
  240. package/dist/types/insurance.d.mts +4 -0
  241. package/dist/types/killmails.d.mts +5 -0
  242. package/dist/types/location.d.mts +6 -0
  243. package/dist/types/loyalty.d.mts +5 -0
  244. package/dist/types/mail.d.mts +6 -0
  245. package/dist/types/market.d.mts +12 -0
  246. package/dist/types/mercenary.d.mts +7 -0
  247. package/dist/types/meta.d.mts +9 -0
  248. package/dist/types/military-campaigns.d.mts +6 -0
  249. package/dist/types/paragon-hub.d.mts +8 -0
  250. package/dist/types/pi.d.mts +6 -0
  251. package/dist/types/skills.d.mts +5 -0
  252. package/dist/types/skyhooks.d.mts +8 -0
  253. package/dist/types/sovereignty.d.mts +6 -0
  254. package/dist/types/status.d.mts +4 -0
  255. package/dist/types/universe.d.mts +27 -0
  256. package/dist/types/wallet.d.mts +6 -0
  257. package/dist/types/wars.d.mts +4 -0
  258. package/package.json +92 -24
  259. package/dist/chunk-7A72QFDF.mjs.map +0 -1
  260. package/dist/chunk-HPSACXX3.js.map +0 -1
@@ -0,0 +1,88 @@
1
+ import type { FetchLike } from '../core/ApiClient.mjs';
2
+ export declare const DEFAULT_SSO_BASE_URL = "https://login.eveonline.com";
3
+ export interface EveSsoClientConfig {
4
+ /** The application's client id from developers.eveonline.com. */
5
+ clientId: string;
6
+ /**
7
+ * The application's client secret. Omit for a public (PKCE) client; token
8
+ * requests then identify the application by `client_id` in the form body.
9
+ */
10
+ clientSecret?: string;
11
+ /** Redirect URI registered for the application. Used by {@link EveSsoClient.getAuthorizationUrl}. */
12
+ callbackUrl?: string;
13
+ /** Override the SSO host, for tests or a proxy. Defaults to https://login.eveonline.com. */
14
+ ssoBaseUrl?: string;
15
+ /** Custom fetch implementation. Defaults to `globalThis.fetch` resolved at call time. */
16
+ fetch?: FetchLike;
17
+ }
18
+ /** A successful response from the SSO token endpoint. */
19
+ export interface SsoTokenResponse {
20
+ accessToken: string;
21
+ refreshToken: string;
22
+ /** Lifetime of `accessToken` in seconds, as reported by SSO. */
23
+ expiresIn: number;
24
+ tokenType: string;
25
+ }
26
+ export interface AuthorizationUrlOptions {
27
+ /** Scopes to request. */
28
+ scopes: readonly string[];
29
+ /** Opaque value echoed back on the callback; use {@link generateState}. */
30
+ state: string;
31
+ /** PKCE challenge for public clients; see {@link generatePkcePair}. */
32
+ codeChallenge?: string;
33
+ /** Overrides `callbackUrl` from the config. */
34
+ redirectUri?: string;
35
+ }
36
+ export interface ExchangeCodeOptions {
37
+ /** PKCE verifier that produced the challenge sent in the authorization URL. */
38
+ codeVerifier?: string;
39
+ /**
40
+ * The redirect URI that was sent in the authorization request. Defaults to
41
+ * the configured `callbackUrl`; when neither is set the field is omitted.
42
+ */
43
+ redirectUri?: string;
44
+ }
45
+ export interface RefreshOptions {
46
+ /** Request a subset of the originally granted scopes. */
47
+ scopes?: readonly string[];
48
+ }
49
+ /**
50
+ * Minimal client for the EVE SSO OAuth2 endpoints: building the login URL,
51
+ * exchanging an authorization code, refreshing, and revoking.
52
+ *
53
+ * Supports confidential clients (HTTP Basic with the client secret) and
54
+ * public clients (PKCE with `client_id` in the body). No JWT signature
55
+ * verification is performed; tokens are trusted because they arrive directly
56
+ * from SSO over TLS.
57
+ */
58
+ export declare class EveSsoClient {
59
+ private readonly clientId;
60
+ private readonly clientSecret?;
61
+ private readonly callbackUrl?;
62
+ private readonly baseUrl;
63
+ private readonly fetchFn?;
64
+ constructor(config: EveSsoClientConfig);
65
+ /** True when a client secret is configured (confidential client). */
66
+ isConfidential(): boolean;
67
+ get tokenUrl(): string;
68
+ get authorizeUrl(): string;
69
+ get revokeUrl(): string;
70
+ /** Build the URL to send a player to for login. */
71
+ getAuthorizationUrl(options: AuthorizationUrlOptions): string;
72
+ /** Exchange the authorization code from the callback for tokens. */
73
+ exchangeCode(code: string, options?: ExchangeCodeOptions): Promise<SsoTokenResponse>;
74
+ /** Obtain a new access token (and rotated refresh token) from a refresh token. */
75
+ refresh(refreshToken: string, options?: RefreshOptions): Promise<SsoTokenResponse>;
76
+ /** Revoke a refresh token so it can no longer be used. */
77
+ revoke(token: string, tokenTypeHint?: 'refresh_token' | 'access_token'): Promise<void>;
78
+ private tokenRequest;
79
+ private post;
80
+ /**
81
+ * Map a non-2xx SSO response to an error. `invalid_grant` means "the
82
+ * refresh token is dead" only for a refresh grant; on a code exchange (or
83
+ * a revoke) it describes the login code or request, so it stays an
84
+ * `SsoError` and does not trigger the re-authentication path.
85
+ */
86
+ private errorFromResponse;
87
+ }
88
+ //# sourceMappingURL=EveSsoClient.d.ts.map
@@ -0,0 +1,42 @@
1
+ /** Base class for every error raised by the auth subsystem. */
2
+ export declare class AuthError extends Error {
3
+ constructor(message: string);
4
+ }
5
+ /**
6
+ * EVE SSO answered a token or revoke request with a non-2xx status.
7
+ *
8
+ * `errorCode` is the OAuth2 `error` field from the response body
9
+ * (`invalid_client`, `invalid_request`, ...) or `unknown` when the body could
10
+ * not be parsed. `statusCode` is the HTTP status.
11
+ */
12
+ export declare class SsoError extends AuthError {
13
+ readonly statusCode: number;
14
+ readonly errorCode: string;
15
+ readonly errorDescription?: string;
16
+ constructor(statusCode: number, errorCode: string, errorDescription?: string);
17
+ /** True for statuses where the same request can be retried later. */
18
+ isRetryable(): boolean;
19
+ }
20
+ /**
21
+ * The refresh token is no longer accepted by SSO (`invalid_grant`), or the
22
+ * manager has already recorded that outcome for the character. The character
23
+ * must log in again; retrying cannot help.
24
+ */
25
+ export declare class TokenRevokedError extends AuthError {
26
+ readonly characterId?: number;
27
+ constructor(message: string, characterId?: number);
28
+ }
29
+ /** A JWT access token could not be decoded into the claims the manager needs. */
30
+ export declare class TokenDecodeError extends AuthError {
31
+ constructor(message: string);
32
+ }
33
+ /** No token is stored for the requested character. */
34
+ export declare class CharacterNotFoundError extends AuthError {
35
+ readonly characterId: number;
36
+ constructor(characterId: number);
37
+ }
38
+ export declare function isAuthError(error: unknown): error is AuthError;
39
+ export declare function isSsoError(error: unknown): error is SsoError;
40
+ export declare function isTokenRevoked(error: unknown): error is TokenRevokedError;
41
+ export declare function isCharacterNotFound(error: unknown): error is CharacterNotFoundError;
42
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1,14 @@
1
+ export type { ITokenStorage, StoredToken } from './types.mjs';
2
+ export { EveSsoClient, DEFAULT_SSO_BASE_URL } from './EveSsoClient.mjs';
3
+ export type { EveSsoClientConfig, SsoTokenResponse, AuthorizationUrlOptions, ExchangeCodeOptions, RefreshOptions, } from './EveSsoClient.mjs';
4
+ export { EsiTokenManager } from './EsiTokenManager.mjs';
5
+ export type { EsiTokenManagerConfig, AddCharacterOptions, RemoveCharacterOptions, RefreshAllOptions, RefreshResult, RefreshStatus, CharacterSummary, ManagedClientConfig, } from './EsiTokenManager.mjs';
6
+ export { MemoryTokenStorage } from './storage/MemoryTokenStorage.mjs';
7
+ export { FileTokenStorage } from './storage/FileTokenStorage.mjs';
8
+ export type { FileTokenStorageOptions } from './storage/FileTokenStorage.mjs';
9
+ export { AuthError, SsoError, TokenRevokedError, TokenDecodeError, CharacterNotFoundError, isAuthError, isSsoError, isTokenRevoked, isCharacterNotFound, } from './errors.mjs';
10
+ export { decodeAccessToken, decodeJwtPayload, parseCharacterId, parseScopes, } from './jwt.mjs';
11
+ export type { DecodedAccessToken, EveJwtClaims } from './jwt.mjs';
12
+ export { generatePkcePair, generateCodeVerifier, codeChallengeFromVerifier, generateState, } from './pkce.mjs';
13
+ export type { PkcePair } from './pkce.mjs';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,43 @@
1
+ /** Claims EVE SSO places in an access token. Only the ones the manager reads are typed. */
2
+ export interface EveJwtClaims {
3
+ /** `CHARACTER:EVE:<characterId>` */
4
+ sub: string;
5
+ /** Character name. */
6
+ name?: string;
7
+ /** Granted scopes: a single string, or an array when more than one. */
8
+ scp?: string | string[];
9
+ /** Expiry as epoch seconds. */
10
+ exp?: number;
11
+ /** Issued-at as epoch seconds. */
12
+ iat?: number;
13
+ /** Owner hash; changes on character transfer. */
14
+ owner?: string;
15
+ iss?: string;
16
+ aud?: string | string[];
17
+ [claim: string]: unknown;
18
+ }
19
+ /** Identity and lifetime information extracted from an EVE SSO access token. */
20
+ export interface DecodedAccessToken {
21
+ characterId: number;
22
+ characterName: string;
23
+ scopes: string[];
24
+ /** Epoch milliseconds, or undefined when the token carries no `exp`. */
25
+ expiresAt?: number;
26
+ ownerHash?: string;
27
+ claims: EveJwtClaims;
28
+ }
29
+ /**
30
+ * Decode the payload of a JWT without verifying its signature.
31
+ *
32
+ * Tokens reach the manager directly from SSO over TLS, so the payload is
33
+ * trusted for the purpose of learning which character it belongs to. Do not
34
+ * use this to authenticate tokens presented by third parties.
35
+ */
36
+ export declare function decodeJwtPayload(token: string): EveJwtClaims;
37
+ /** Parse the character id out of an SSO `sub` claim (`CHARACTER:EVE:123`). */
38
+ export declare function parseCharacterId(sub: unknown): number;
39
+ /** Normalise the `scp` claim, which SSO emits as a string for one scope and an array otherwise. */
40
+ export declare function parseScopes(scp: unknown): string[];
41
+ /** Decode an EVE SSO access token into the fields the token manager stores. */
42
+ export declare function decodeAccessToken(token: string): DecodedAccessToken;
43
+ //# sourceMappingURL=jwt.d.ts.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * A PKCE verifier/challenge pair for the authorization-code flow of a public
3
+ * client (one that cannot hold a client secret).
4
+ */
5
+ export interface PkcePair {
6
+ /** Random secret sent with the token request as `code_verifier`. */
7
+ codeVerifier: string;
8
+ /** `BASE64URL(SHA256(codeVerifier))`, sent in the authorization URL. */
9
+ codeChallenge: string;
10
+ /** Always `S256`; EVE SSO does not accept the plain method. */
11
+ codeChallengeMethod: 'S256';
12
+ }
13
+ /** Generate a 32-byte base64url code verifier (43 characters). */
14
+ export declare function generateCodeVerifier(): string;
15
+ /** Derive the S256 code challenge for a verifier. */
16
+ export declare function codeChallengeFromVerifier(codeVerifier: string): string;
17
+ /** Generate a verifier and its challenge in one call. */
18
+ export declare function generatePkcePair(): PkcePair;
19
+ /** Generate an unguessable OAuth2 `state` value. */
20
+ export declare function generateState(): string;
21
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1,44 @@
1
+ import type { ITokenStorage, StoredToken } from '../types.mjs';
2
+ export interface FileTokenStorageOptions {
3
+ /**
4
+ * POSIX permission bits for the token file. Defaults to `0o600` (owner
5
+ * read/write only). Ignored on platforms without POSIX modes.
6
+ */
7
+ mode?: number;
8
+ }
9
+ /**
10
+ * JSON-file {@link ITokenStorage} for single-process applications.
11
+ *
12
+ * Writes go to a sibling temporary file that is renamed over the target, so a
13
+ * crash mid-write leaves the previous file intact. Writes are serialised
14
+ * within the process. Two processes sharing one file are not supported: each
15
+ * would rotate refresh tokens the other cannot see.
16
+ */
17
+ export declare class FileTokenStorage implements ITokenStorage {
18
+ private readonly filePath;
19
+ private readonly mode;
20
+ private cache;
21
+ private loading;
22
+ /** Bumped by invalidate() so a read that began earlier cannot repopulate the cache. */
23
+ private loadGeneration;
24
+ private writeChain;
25
+ constructor(filePath: string, options?: FileTokenStorageOptions);
26
+ /** Absolute path of the backing file. */
27
+ get path(): string;
28
+ get(characterId: number): Promise<StoredToken | null>;
29
+ set(characterId: number, token: StoredToken): Promise<void>;
30
+ delete(characterId: number): Promise<void>;
31
+ list(): Promise<StoredToken[]>;
32
+ /** Drop the in-memory copy so the next call re-reads the file. */
33
+ invalidate(): void;
34
+ /**
35
+ * Load once; overlapping first calls share the same read so none of them
36
+ * clobbers another's map. A read that started before invalidate() still
37
+ * resolves for its own callers but neither becomes the cache nor clears a
38
+ * newer in-flight read.
39
+ */
40
+ private load;
41
+ private readFile;
42
+ private persist;
43
+ }
44
+ //# sourceMappingURL=FileTokenStorage.d.ts.map
@@ -0,0 +1,18 @@
1
+ import type { ITokenStorage, StoredToken } from '../types.mjs';
2
+ /**
3
+ * In-memory {@link ITokenStorage}. Tokens live only as long as the process.
4
+ * Useful for tests, CLIs that log in on every run, and as a cache in front of
5
+ * a durable store.
6
+ */
7
+ export declare class MemoryTokenStorage implements ITokenStorage {
8
+ private readonly tokens;
9
+ constructor(initial?: readonly StoredToken[]);
10
+ get(characterId: number): Promise<StoredToken | null>;
11
+ set(characterId: number, token: StoredToken): Promise<void>;
12
+ delete(characterId: number): Promise<void>;
13
+ list(): Promise<StoredToken[]>;
14
+ /** Remove every token. */
15
+ clear(): void;
16
+ get size(): number;
17
+ }
18
+ //# sourceMappingURL=MemoryTokenStorage.d.ts.map
@@ -0,0 +1,42 @@
1
+ /**
2
+ * A character's SSO credentials as held by an {@link ITokenStorage}.
3
+ *
4
+ * Timestamps are epoch milliseconds so the record is JSON-safe and can be
5
+ * compared against `Date.now()` without parsing.
6
+ */
7
+ export interface StoredToken {
8
+ /** EVE character id, decoded from the access token's `sub` claim. */
9
+ characterId: number;
10
+ /** Character name, decoded from the access token's `name` claim. */
11
+ characterName: string;
12
+ /** Current bearer token for ESI requests. */
13
+ accessToken: string;
14
+ /** Refresh token as of the last SSO exchange; SSO rotates it on every use. */
15
+ refreshToken: string;
16
+ /** When `accessToken` expires, in epoch milliseconds. */
17
+ expiresAt: number;
18
+ /** Scopes granted to this token, decoded from the `scp` claim. */
19
+ scopes: string[];
20
+ /** The `owner` claim: changes if the character is transferred between accounts. */
21
+ ownerHash?: string;
22
+ /** When this record was last written, in epoch milliseconds. */
23
+ updatedAt: number;
24
+ /**
25
+ * Set when SSO rejected the refresh token as invalid. The manager stops
26
+ * contacting SSO for this character until it is added again.
27
+ */
28
+ revokedAt?: number;
29
+ }
30
+ /**
31
+ * Persistence contract for {@link StoredToken} records, keyed by character id.
32
+ *
33
+ * Implementations must return copies rather than shared references and must
34
+ * tolerate `get`/`delete` for ids they have never seen.
35
+ */
36
+ export interface ITokenStorage {
37
+ get(characterId: number): Promise<StoredToken | null>;
38
+ set(characterId: number, token: StoredToken): Promise<void>;
39
+ delete(characterId: number): Promise<void>;
40
+ list(): Promise<StoredToken[]>;
41
+ }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -46,11 +46,7 @@ var logTrace = (message, context) => {
46
46
 
47
47
  // src/core/logger/resolveLogger.ts
48
48
  function resolveLogger(client) {
49
- const perClient = client?.getLogger?.();
50
- if (perClient) return perClient;
51
- const global = getLogger();
52
- if (global !== defaultLogger) return global;
53
- return defaultLogger;
49
+ return client?.getLogger?.() ?? getLogger();
54
50
  }
55
51
 
56
52
  // src/core/logger/clientLog.ts
@@ -115,7 +111,7 @@ var CircuitBreaker = class {
115
111
  const elapsed = Date.now() - record.lastFailureTime;
116
112
  if (elapsed >= this.resetTimeoutMs) {
117
113
  record.state = "half-open";
118
- record.halfOpenAttempts = 0;
114
+ record.halfOpenAttempts = 1;
119
115
  logInfo2(
120
116
  this.client,
121
117
  `Circuit half-open for ${key}, allowing probe request`,
@@ -137,6 +133,7 @@ var CircuitBreaker = class {
137
133
  const key = this.getKey(endpoint);
138
134
  const record = this.circuits.get(key);
139
135
  if (!record) return;
136
+ if (record.state === "open") return;
140
137
  if (record.state === "half-open") {
141
138
  logInfo2(this.client, `Circuit closed for ${key} after successful probe`, {
142
139
  key
@@ -413,4 +410,4 @@ export {
413
410
  EsiValidationError,
414
411
  isValidationError
415
412
  };
416
- //# sourceMappingURL=chunk-7A72QFDF.mjs.map
413
+ //# sourceMappingURL=chunk-4W66ONJI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/logger/DefaultLogger.ts","../src/core/logger/loggerUtil.ts","../src/core/logger/resolveLogger.ts","../src/core/logger/clientLog.ts","../src/core/circuitBreaker/CircuitBreaker.ts","../src/core/util/error.ts"],"sourcesContent":["import pino from 'pino';\nimport type { ILogger, LogContext } from './ILogger';\n\n/**\n * The default `ILogger` implementation — a thin wrapper around pino.\n *\n * Level resolution (highest precedence first):\n * 1. `level` passed to `createDefaultLogger` (e.g. from\n * `EsiClientConfig.logLevel`).\n * 2. The `ESI_LOG_LEVEL` environment variable.\n * 3. `'warn'` (library default — quiet unless the app opts in).\n *\n * The logger writes to `process.stdout` and can be swapped entirely via\n * `EsiClientConfig.logger` or the global `setLogger()` fallback.\n */\nexport type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport function createDefaultLogger(level?: string): ILogger {\n const resolved = level || process.env.ESI_LOG_LEVEL || 'warn';\n const pinoLogger = pino({ level: resolved });\n return toPinoLogger(pinoLogger);\n}\n\n/**\n * Adapt any pino-compatible logger (pino, pino-http child, custom sink) to the\n * `ILogger` contract. Context objects are spread onto the log event so they\n * appear as structured fields rather than being stringified into the message.\n */\nexport function toPinoLogger(p: {\n fatal: (...a: unknown[]) => void;\n error: (...a: unknown[]) => void;\n warn: (...a: unknown[]) => void;\n info: (...a: unknown[]) => void;\n debug: (...a: unknown[]) => void;\n trace: (...a: unknown[]) => void;\n}): ILogger {\n // Call through the sink object so pino methods keep their `this` binding.\n const emit =\n (level: LogLevel) =>\n (message: string, context?: LogContext): void =>\n context ? p[level](context, message) : p[level](message);\n return {\n fatal: emit('fatal'),\n error: emit('error'),\n warn: emit('warn'),\n info: emit('info'),\n debug: emit('debug'),\n trace: emit('trace'),\n };\n}\n\n/** Backwards-compatible default instance (level from `ESI_LOG_LEVEL`). */\nexport const defaultLogger: ILogger = createDefaultLogger();\n","import type { ILogger, LogContext } from './ILogger';\nimport { defaultLogger } from './DefaultLogger';\n\nexport type { ILogger, LogContext } from './ILogger';\n\n/**\n * Global logger fallback.\n *\n * The request pipeline reads the *per-client* logger first and only falls\n * back to this global when a client has none (e.g. the raw factory\n * `EsiApiFactory` clients, or unit tests that call pipeline modules\n * directly). Production apps can rely on the per-client logger from\n * `EsiClientConfig.logger`; this global exists for backwards compatibility\n * and for apps that want one shared logger across all clients.\n */\nlet activeLogger: ILogger = defaultLogger;\n\nexport const setLogger = (customLogger: ILogger): void => {\n activeLogger = customLogger;\n};\n\nexport const getLogger = (): ILogger => activeLogger;\n\nconst ctx = (context?: LogContext): LogContext | undefined =>\n context && Object.keys(context).length > 0 ? context : undefined;\n\nexport const logFatal = (message: string, context?: LogContext): void => {\n activeLogger.fatal(message, ctx(context));\n};\n\nexport const logError = (message: string, context?: LogContext): void => {\n activeLogger.error(message, ctx(context));\n};\n\nexport const logWarn = (message: string, context?: LogContext): void => {\n activeLogger.warn(message, ctx(context));\n};\n\nexport const logInfo = (message: string, context?: LogContext): void => {\n activeLogger.info(message, ctx(context));\n};\n\nexport const logDebug = (message: string, context?: LogContext): void => {\n activeLogger.debug(message, ctx(context));\n};\n\nexport const logTrace = (message: string, context?: LogContext): void => {\n activeLogger.trace(message, ctx(context));\n};\n","import type { ILogger } from './ILogger';\nimport { getLogger } from './loggerUtil';\n\n/**\n * Resolve the logger for a given API client: per-client logger first, then\n * the global one — a logger installed with `setLogger`, or the built-in pino\n * default when none was.\n */\nexport function resolveLogger(\n client: { getLogger?: () => ILogger | null } | null | undefined,\n): ILogger {\n return client?.getLogger?.() ?? getLogger();\n}\n","import type { ApiClient } from '../ApiClient';\nimport type { LogContext } from './ILogger';\nimport { resolveLogger } from './resolveLogger';\n\ntype Level = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\ntype Emit = (\n client: ApiClient | null | undefined,\n message: string,\n context?: LogContext,\n) => void;\n\nconst emit =\n (level: Level): Emit =>\n (client, message, context) => {\n resolveLogger(client)[level](\n message,\n context && Object.keys(context).length > 0 ? context : undefined,\n );\n };\n\nexport const logFatal: Emit = emit('fatal');\nexport const logError: Emit = emit('error');\nexport const logWarn: Emit = emit('warn');\nexport const logInfo: Emit = emit('info');\nexport const logDebug: Emit = emit('debug');\nexport const logTrace: Emit = emit('trace');\n","import { ApiClient } from '../ApiClient';\nimport { logWarn, logInfo } from '../logger/clientLog';\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 private client: ApiClient | null = null;\n\n setClient(client: ApiClient | null): void {\n this.client = client;\n }\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 // This call is the first probe, so it counts towards halfOpenMaxAttempts.\n record.halfOpenAttempts = 1;\n logInfo(\n this.client,\n `Circuit half-open for ${key}, allowing probe request`,\n { key },\n );\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 // A success while open comes from a call admitted before the circuit\n // opened. Only a half-open probe may close the circuit.\n if (record.state === 'open') return;\n\n if (record.state === 'half-open') {\n logInfo(this.client, `Circuit closed for ${key} after successful probe`, {\n key,\n });\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 this.client,\n `Circuit re-opened for ${key} after failed probe (${record.failures} failures)`,\n { key, failures: record.failures },\n );\n return;\n }\n\n if (record.failures >= this.failureThreshold) {\n record.state = 'open';\n logWarn(\n this.client,\n `Circuit opened for ${key} after ${record.failures} consecutive failures`,\n { key, failures: record.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(\n this.client,\n `Circuit breaker cleanup: removed ${cleaned} stale circuits`,\n {\n cleaned,\n },\n );\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":"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","names":["emit","logFatal","logError","logWarn","logInfo","logDebug","logTrace","logInfo","logWarn"]}
@@ -46,11 +46,7 @@ var logTrace = (message, context) => {
46
46
 
47
47
  // src/core/logger/resolveLogger.ts
48
48
  function resolveLogger(client) {
49
- const perClient = _optionalChain([client, 'optionalAccess', _ => _.getLogger, 'optionalCall', _2 => _2()]);
50
- if (perClient) return perClient;
51
- const global = getLogger();
52
- if (global !== defaultLogger) return global;
53
- return defaultLogger;
49
+ return _nullishCoalesce(_optionalChain([client, 'optionalAccess', _ => _.getLogger, 'optionalCall', _2 => _2()]), () => ( getLogger()));
54
50
  }
55
51
 
56
52
  // src/core/logger/clientLog.ts
@@ -115,7 +111,7 @@ var CircuitBreaker = (_class = class {
115
111
  const elapsed = Date.now() - record.lastFailureTime;
116
112
  if (elapsed >= this.resetTimeoutMs) {
117
113
  record.state = "half-open";
118
- record.halfOpenAttempts = 0;
114
+ record.halfOpenAttempts = 1;
119
115
  logInfo2(
120
116
  this.client,
121
117
  `Circuit half-open for ${key}, allowing probe request`,
@@ -137,6 +133,7 @@ var CircuitBreaker = (_class = class {
137
133
  const key = this.getKey(endpoint);
138
134
  const record = this.circuits.get(key);
139
135
  if (!record) return;
136
+ if (record.state === "open") return;
140
137
  if (record.state === "half-open") {
141
138
  logInfo2(this.client, `Circuit closed for ${key} after successful probe`, {
142
139
  key
@@ -413,4 +410,4 @@ function isValidationError(error) {
413
410
 
414
411
 
415
412
  exports.createDefaultLogger = createDefaultLogger; exports.toPinoLogger = toPinoLogger; exports.setLogger = setLogger; exports.getLogger = getLogger; exports.logFatal = logFatal; exports.logError = logError; exports.logWarn = logWarn; exports.logInfo = logInfo; exports.logDebug = logDebug; exports.logTrace = logTrace; exports.logError2 = logError2; exports.logWarn2 = logWarn2; exports.logInfo2 = logInfo2; exports.logDebug2 = logDebug2; exports.CircuitBreaker = CircuitBreaker; exports.CircuitOpenError = CircuitOpenError; exports.sanitizeUrl = sanitizeUrl; exports.EsiError = EsiError; exports.isEsiError = isEsiError; exports.isRateLimited = isRateLimited; exports.isNotFound = isNotFound; exports.isUnauthorized = isUnauthorized; exports.isForbidden = isForbidden; exports.isServerError = isServerError; exports.TimeoutError = TimeoutError; exports.isTimeout = isTimeout; exports.isRetryable = isRetryable; exports.isCircuitOpen = isCircuitOpen; exports.buildError = buildError; exports.EsiValidationError = EsiValidationError; exports.isValidationError = isValidationError;
416
- //# sourceMappingURL=chunk-HPSACXX3.js.map
413
+ //# sourceMappingURL=chunk-N3B65VLB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/ESI.ts/ESI.ts/dist/chunk-N3B65VLB.js","../src/core/logger/DefaultLogger.ts","../src/core/logger/loggerUtil.ts","../src/core/logger/resolveLogger.ts","../src/core/logger/clientLog.ts","../src/core/circuitBreaker/CircuitBreaker.ts","../src/core/util/error.ts"],"names":["emit","logFatal","logError","logWarn","logInfo","logDebug","logTrace"],"mappings":"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","file":"/home/runner/work/ESI.ts/ESI.ts/dist/chunk-N3B65VLB.js","sourcesContent":[null,"import pino from 'pino';\nimport type { ILogger, LogContext } from './ILogger';\n\n/**\n * The default `ILogger` implementation — a thin wrapper around pino.\n *\n * Level resolution (highest precedence first):\n * 1. `level` passed to `createDefaultLogger` (e.g. from\n * `EsiClientConfig.logLevel`).\n * 2. The `ESI_LOG_LEVEL` environment variable.\n * 3. `'warn'` (library default — quiet unless the app opts in).\n *\n * The logger writes to `process.stdout` and can be swapped entirely via\n * `EsiClientConfig.logger` or the global `setLogger()` fallback.\n */\nexport type LogLevel = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\nexport function createDefaultLogger(level?: string): ILogger {\n const resolved = level || process.env.ESI_LOG_LEVEL || 'warn';\n const pinoLogger = pino({ level: resolved });\n return toPinoLogger(pinoLogger);\n}\n\n/**\n * Adapt any pino-compatible logger (pino, pino-http child, custom sink) to the\n * `ILogger` contract. Context objects are spread onto the log event so they\n * appear as structured fields rather than being stringified into the message.\n */\nexport function toPinoLogger(p: {\n fatal: (...a: unknown[]) => void;\n error: (...a: unknown[]) => void;\n warn: (...a: unknown[]) => void;\n info: (...a: unknown[]) => void;\n debug: (...a: unknown[]) => void;\n trace: (...a: unknown[]) => void;\n}): ILogger {\n // Call through the sink object so pino methods keep their `this` binding.\n const emit =\n (level: LogLevel) =>\n (message: string, context?: LogContext): void =>\n context ? p[level](context, message) : p[level](message);\n return {\n fatal: emit('fatal'),\n error: emit('error'),\n warn: emit('warn'),\n info: emit('info'),\n debug: emit('debug'),\n trace: emit('trace'),\n };\n}\n\n/** Backwards-compatible default instance (level from `ESI_LOG_LEVEL`). */\nexport const defaultLogger: ILogger = createDefaultLogger();\n","import type { ILogger, LogContext } from './ILogger';\nimport { defaultLogger } from './DefaultLogger';\n\nexport type { ILogger, LogContext } from './ILogger';\n\n/**\n * Global logger fallback.\n *\n * The request pipeline reads the *per-client* logger first and only falls\n * back to this global when a client has none (e.g. the raw factory\n * `EsiApiFactory` clients, or unit tests that call pipeline modules\n * directly). Production apps can rely on the per-client logger from\n * `EsiClientConfig.logger`; this global exists for backwards compatibility\n * and for apps that want one shared logger across all clients.\n */\nlet activeLogger: ILogger = defaultLogger;\n\nexport const setLogger = (customLogger: ILogger): void => {\n activeLogger = customLogger;\n};\n\nexport const getLogger = (): ILogger => activeLogger;\n\nconst ctx = (context?: LogContext): LogContext | undefined =>\n context && Object.keys(context).length > 0 ? context : undefined;\n\nexport const logFatal = (message: string, context?: LogContext): void => {\n activeLogger.fatal(message, ctx(context));\n};\n\nexport const logError = (message: string, context?: LogContext): void => {\n activeLogger.error(message, ctx(context));\n};\n\nexport const logWarn = (message: string, context?: LogContext): void => {\n activeLogger.warn(message, ctx(context));\n};\n\nexport const logInfo = (message: string, context?: LogContext): void => {\n activeLogger.info(message, ctx(context));\n};\n\nexport const logDebug = (message: string, context?: LogContext): void => {\n activeLogger.debug(message, ctx(context));\n};\n\nexport const logTrace = (message: string, context?: LogContext): void => {\n activeLogger.trace(message, ctx(context));\n};\n","import type { ILogger } from './ILogger';\nimport { getLogger } from './loggerUtil';\n\n/**\n * Resolve the logger for a given API client: per-client logger first, then\n * the global one — a logger installed with `setLogger`, or the built-in pino\n * default when none was.\n */\nexport function resolveLogger(\n client: { getLogger?: () => ILogger | null } | null | undefined,\n): ILogger {\n return client?.getLogger?.() ?? getLogger();\n}\n","import type { ApiClient } from '../ApiClient';\nimport type { LogContext } from './ILogger';\nimport { resolveLogger } from './resolveLogger';\n\ntype Level = 'fatal' | 'error' | 'warn' | 'info' | 'debug' | 'trace';\n\ntype Emit = (\n client: ApiClient | null | undefined,\n message: string,\n context?: LogContext,\n) => void;\n\nconst emit =\n (level: Level): Emit =>\n (client, message, context) => {\n resolveLogger(client)[level](\n message,\n context && Object.keys(context).length > 0 ? context : undefined,\n );\n };\n\nexport const logFatal: Emit = emit('fatal');\nexport const logError: Emit = emit('error');\nexport const logWarn: Emit = emit('warn');\nexport const logInfo: Emit = emit('info');\nexport const logDebug: Emit = emit('debug');\nexport const logTrace: Emit = emit('trace');\n","import { ApiClient } from '../ApiClient';\nimport { logWarn, logInfo } from '../logger/clientLog';\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 private client: ApiClient | null = null;\n\n setClient(client: ApiClient | null): void {\n this.client = client;\n }\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 // This call is the first probe, so it counts towards halfOpenMaxAttempts.\n record.halfOpenAttempts = 1;\n logInfo(\n this.client,\n `Circuit half-open for ${key}, allowing probe request`,\n { key },\n );\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 // A success while open comes from a call admitted before the circuit\n // opened. Only a half-open probe may close the circuit.\n if (record.state === 'open') return;\n\n if (record.state === 'half-open') {\n logInfo(this.client, `Circuit closed for ${key} after successful probe`, {\n key,\n });\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 this.client,\n `Circuit re-opened for ${key} after failed probe (${record.failures} failures)`,\n { key, failures: record.failures },\n );\n return;\n }\n\n if (record.failures >= this.failureThreshold) {\n record.state = 'open';\n logWarn(\n this.client,\n `Circuit opened for ${key} after ${record.failures} consecutive failures`,\n { key, failures: record.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(\n this.client,\n `Circuit breaker cleanup: removed ${cleaned} stale circuits`,\n {\n cleaned,\n },\n );\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"]}
@@ -0,0 +1,25 @@
1
+ import { ApiClient } from '../core/ApiClient.mjs';
2
+ import { BaseEsiClient } from './BaseEsiClient.mjs';
3
+ import { accessListEndpoints } from '../core/endpoints/accessListEndpoints.mjs';
4
+ import { AccessList } from '../types/api-responses.mjs';
5
+ export declare class AccessListsClient extends BaseEsiClient<typeof accessListEndpoints> {
6
+ constructor(client: ApiClient);
7
+ /**
8
+ * Retrieves the contents of an access list (ACL) including all character, corporation, and alliance entries.
9
+ *
10
+ * @param characterId - The ID of the character who owns the access list
11
+ * @param accessListId - The ID of the access list to retrieve
12
+ * @returns The access list with its entries
13
+ * @requires Authentication
14
+ */
15
+ getAccessList(characterId: number, accessListId: number): Promise<AccessList>;
16
+ /**
17
+ * Retrieves all access lists for a character.
18
+ *
19
+ * @param characterId - The ID of the character
20
+ * @returns An array of the character's access lists
21
+ * @requires Authentication
22
+ */
23
+ getCharacterAccessLists(characterId: number): Promise<AccessList[]>;
24
+ }
25
+ //# sourceMappingURL=AccessListsClient.d.ts.map
@@ -0,0 +1,59 @@
1
+ import { ApiClient } from '../core/ApiClient.mjs';
2
+ import { BaseEsiClient } from './BaseEsiClient.mjs';
3
+ import { allianceEndpoints } from '../core/endpoints/allianceEndpoints.mjs';
4
+ import { AllianceInfo, AllianceContact, AllianceContactLabel, AllianceIcon } from '../types/api-responses.mjs';
5
+ import { PageResult } from '../core/pagination/AsyncPaginationIterator.mjs';
6
+ export declare class AllianceClient extends BaseEsiClient<typeof allianceEndpoints> {
7
+ private contactApi;
8
+ constructor(client: ApiClient);
9
+ /**
10
+ * Retrieve public information about an alliance.
11
+ *
12
+ * @param allianceId - The ID of the alliance to look up
13
+ * @returns Public alliance information including name, ticker, and founding date
14
+ */
15
+ getAllianceById(allianceId: number): Promise<AllianceInfo>;
16
+ /**
17
+ * Retrieve contacts for an alliance.
18
+ *
19
+ * @deprecated Use ContactsClient.getAllianceContacts() instead
20
+ * @param allianceId - The ID of the alliance whose contacts to retrieve
21
+ * @returns A list of alliance contacts with standings and contact types
22
+ * @requires Authentication
23
+ */
24
+ getContacts(allianceId: number): Promise<AllianceContact[]>;
25
+ /**
26
+ * Retrieve custom contact labels for an alliance.
27
+ *
28
+ * @deprecated Use ContactsClient.getAllianceContactLabels() instead
29
+ * @param allianceId - The ID of the alliance whose contact labels to retrieve
30
+ * @returns A list of custom labels used to categorize alliance contacts
31
+ * @requires Authentication
32
+ */
33
+ getContactLabels(allianceId: number): Promise<AllianceContactLabel[]>;
34
+ /**
35
+ * Retrieve the list of corporation IDs that are members of an alliance.
36
+ *
37
+ * @param allianceId - The ID of the alliance whose member corporations to retrieve
38
+ * @returns An array of corporation IDs belonging to the alliance
39
+ */
40
+ getCorporations(allianceId: number): Promise<number[]>;
41
+ /**
42
+ * Retrieve icon URLs for an alliance.
43
+ *
44
+ * @param allianceId - The ID of the alliance whose icons to retrieve
45
+ * @returns Icon URLs at various resolutions for the alliance
46
+ */
47
+ getIcons(allianceId: number): Promise<AllianceIcon>;
48
+ /**
49
+ * Retrieve a list of all active alliance IDs in EVE Online.
50
+ *
51
+ * @returns An array of all active alliance IDs
52
+ */
53
+ getAlliances(): Promise<number[]>;
54
+ fetchAllAlliances(concurrency?: number): Promise<number[]>;
55
+ fetchAllCorporations(allianceId: number, concurrency?: number): Promise<number[]>;
56
+ streamAlliances(): AsyncGenerator<PageResult<number>, void, undefined>;
57
+ streamCorporations(allianceId: number): AsyncGenerator<PageResult<number>, void, undefined>;
58
+ }
59
+ //# sourceMappingURL=AllianceClient.d.ts.map