@lgriffin/esi.ts 9.6.0 → 10.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.
- package/CHANGELOG.md +787 -388
- package/LICENSE +26 -26
- package/README.md +974 -1030
- package/dist/EsiClient.d.ts +4 -0
- package/dist/EsiClient.d.ts.map +1 -1
- package/dist/EsiClientBuilder.d.ts.map +1 -1
- package/dist/auth/EsiTokenManager.d.ts +200 -0
- package/dist/auth/EsiTokenManager.d.ts.map +1 -0
- package/dist/auth/EveSsoClient.d.ts +88 -0
- package/dist/auth/EveSsoClient.d.ts.map +1 -0
- package/dist/auth/errors.d.ts +42 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/index.d.ts +14 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/jwt.d.ts +43 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/pkce.d.ts +21 -0
- package/dist/auth/pkce.d.ts.map +1 -0
- package/dist/auth/storage/FileTokenStorage.d.ts +44 -0
- package/dist/auth/storage/FileTokenStorage.d.ts.map +1 -0
- package/dist/auth/storage/MemoryTokenStorage.d.ts +18 -0
- package/dist/auth/storage/MemoryTokenStorage.d.ts.map +1 -0
- package/dist/auth/types.d.ts +42 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/chunk-3ZI5A37L.mjs +1065 -0
- package/dist/chunk-3ZI5A37L.mjs.map +1 -0
- package/dist/chunk-7A72QFDF.mjs +416 -0
- package/dist/chunk-7A72QFDF.mjs.map +1 -0
- package/dist/chunk-BBSHKVPI.js +71 -0
- package/dist/chunk-BBSHKVPI.js.map +1 -0
- package/dist/chunk-HPSACXX3.js +416 -0
- package/dist/chunk-HPSACXX3.js.map +1 -0
- package/dist/chunk-JIW4BXLP.mjs +17 -0
- package/dist/chunk-JIW4BXLP.mjs.map +1 -0
- package/dist/chunk-MSJHIJXA.js +1065 -0
- package/dist/chunk-MSJHIJXA.js.map +1 -0
- package/dist/chunk-PZ5AY32C.js +10 -0
- package/dist/chunk-PZ5AY32C.js.map +1 -0
- package/dist/chunk-R7D7M2LQ.mjs +71 -0
- package/dist/chunk-R7D7M2LQ.mjs.map +1 -0
- package/dist/chunk-SAQBXXTM.js +2614 -0
- package/dist/chunk-SAQBXXTM.js.map +1 -0
- package/dist/chunk-VZS32UQ3.mjs +2614 -0
- package/dist/chunk-VZS32UQ3.mjs.map +1 -0
- package/dist/clients/AllianceClient.d.ts +2 -0
- package/dist/clients/AllianceClient.d.ts.map +1 -1
- package/dist/clients/AssetsClient.d.ts +2 -0
- package/dist/clients/AssetsClient.d.ts.map +1 -1
- package/dist/clients/BaseEsiClient.d.ts +1 -0
- package/dist/clients/BaseEsiClient.d.ts.map +1 -1
- package/dist/clients/CalendarClient.d.ts +2 -0
- package/dist/clients/CalendarClient.d.ts.map +1 -1
- package/dist/clients/CharacterClient.d.ts +8 -0
- package/dist/clients/CharacterClient.d.ts.map +1 -1
- package/dist/clients/ClonesClient.d.ts +1 -0
- package/dist/clients/ClonesClient.d.ts.map +1 -1
- package/dist/clients/ContactsClient.d.ts +6 -0
- package/dist/clients/ContactsClient.d.ts.map +1 -1
- package/dist/clients/ContractsClient.d.ts +14 -8
- package/dist/clients/ContractsClient.d.ts.map +1 -1
- package/dist/clients/CorporationProjectsClient.d.ts +22 -12
- package/dist/clients/CorporationProjectsClient.d.ts.map +1 -1
- package/dist/clients/CorporationsClient.d.ts +17 -0
- package/dist/clients/CorporationsClient.d.ts.map +1 -1
- package/dist/clients/FactionClient.d.ts +4 -4
- package/dist/clients/FactionClient.d.ts.map +1 -1
- package/dist/clients/FittingsClient.d.ts +1 -0
- package/dist/clients/FittingsClient.d.ts.map +1 -1
- package/dist/clients/FleetClient.d.ts +2 -0
- package/dist/clients/FleetClient.d.ts.map +1 -1
- package/dist/clients/FreelanceJobsClient.d.ts +3 -3
- package/dist/clients/FreelanceJobsClient.d.ts.map +1 -1
- package/dist/clients/IndustryClient.d.ts +11 -3
- package/dist/clients/IndustryClient.d.ts.map +1 -1
- package/dist/clients/KillmailsClient.d.ts +2 -0
- package/dist/clients/KillmailsClient.d.ts.map +1 -1
- package/dist/clients/LoyaltyClient.d.ts +2 -0
- package/dist/clients/LoyaltyClient.d.ts.map +1 -1
- package/dist/clients/MailClient.d.ts +8 -3
- package/dist/clients/MailClient.d.ts.map +1 -1
- package/dist/clients/MarketClient.d.ts +6 -0
- package/dist/clients/MarketClient.d.ts.map +1 -1
- package/dist/clients/MetaClient.d.ts +3 -2
- package/dist/clients/MetaClient.d.ts.map +1 -1
- package/dist/clients/PiClient.d.ts +2 -0
- package/dist/clients/PiClient.d.ts.map +1 -1
- package/dist/clients/SkillsClient.d.ts +1 -0
- package/dist/clients/SkillsClient.d.ts.map +1 -1
- package/dist/clients/WalletClient.d.ts +7 -3
- package/dist/clients/WalletClient.d.ts.map +1 -1
- package/dist/clients/WarsClient.d.ts +2 -0
- package/dist/clients/WarsClient.d.ts.map +1 -1
- package/dist/core/ApiClient.d.ts +8 -0
- package/dist/core/ApiClient.d.ts.map +1 -1
- package/dist/core/ApiClientBuilder.d.ts +3 -1
- package/dist/core/ApiClientBuilder.d.ts.map +1 -1
- package/dist/core/ApiRequestHandler.d.ts.map +1 -1
- package/dist/core/BatchRequestHandler.d.ts.map +1 -1
- package/dist/core/RequestDeduplicator.d.ts +2 -0
- package/dist/core/RequestDeduplicator.d.ts.map +1 -1
- package/dist/core/RetryStrategy.d.ts +2 -0
- package/dist/core/RetryStrategy.d.ts.map +1 -1
- package/dist/core/cache/ETagCacheManager.d.ts +4 -0
- package/dist/core/cache/ETagCacheManager.d.ts.map +1 -1
- package/dist/core/circuitBreaker/CircuitBreaker.d.ts +3 -0
- package/dist/core/circuitBreaker/CircuitBreaker.d.ts.map +1 -1
- package/dist/core/configureApiClient.d.ts.map +1 -1
- package/dist/core/constants.d.ts +2 -2
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/endpoints/EndpointDefinition.d.ts +2 -2
- package/dist/core/endpoints/EndpointDefinition.d.ts.map +1 -1
- package/dist/core/endpoints/calendarEndpoints.d.ts +7 -7
- package/dist/core/endpoints/characterEndpoints.d.ts +2 -2
- package/dist/core/endpoints/cloneEndpoints.d.ts +2 -2
- package/dist/core/endpoints/contractEndpoints.d.ts +15 -22
- package/dist/core/endpoints/contractEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/corporationEndpoints.d.ts +19 -22
- package/dist/core/endpoints/corporationEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/corporationProjectEndpoints.d.ts +75 -23
- package/dist/core/endpoints/corporationProjectEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/createClient.d.ts +2 -2
- package/dist/core/endpoints/createClient.d.ts.map +1 -1
- package/dist/core/endpoints/dogmaEndpoints.d.ts +2 -2
- package/dist/core/endpoints/factionEndpoints.d.ts +36 -36
- package/dist/core/endpoints/factionEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/fleetEndpoints.d.ts +1 -1
- package/dist/core/endpoints/freelanceJobsEndpoints.d.ts +131 -122
- package/dist/core/endpoints/freelanceJobsEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/industryEndpoints.d.ts +6 -6
- package/dist/core/endpoints/industryEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/mailEndpoints.d.ts +3 -5
- package/dist/core/endpoints/mailEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/mercenaryEndpoints.d.ts +1 -1
- package/dist/core/endpoints/metaEndpoints.d.ts +5 -1
- package/dist/core/endpoints/metaEndpoints.d.ts.map +1 -1
- package/dist/core/endpoints/piEndpoints.d.ts +2 -2
- package/dist/core/endpoints/statusEndpoints.d.ts +1 -1
- package/dist/core/endpoints/universeEndpoints.d.ts +22 -22
- package/dist/core/endpoints/walletEndpoints.d.ts +2 -3
- package/dist/core/endpoints/walletEndpoints.d.ts.map +1 -1
- package/dist/core/logger/DefaultLogger.d.ts +31 -0
- package/dist/core/logger/DefaultLogger.d.ts.map +1 -0
- package/dist/core/logger/ILogger.d.ts +14 -4
- package/dist/core/logger/ILogger.d.ts.map +1 -1
- package/dist/core/logger/NoopLogger.d.ts +7 -0
- package/dist/core/logger/NoopLogger.d.ts.map +1 -0
- package/dist/core/logger/clientLog.d.ts +11 -0
- package/dist/core/logger/clientLog.d.ts.map +1 -0
- package/dist/core/logger/logger.d.ts +11 -3
- package/dist/core/logger/logger.d.ts.map +1 -1
- package/dist/core/logger/loggerUtil.d.ts +8 -6
- package/dist/core/logger/loggerUtil.d.ts.map +1 -1
- package/dist/core/logger/resolveLogger.d.ts +10 -0
- package/dist/core/logger/resolveLogger.d.ts.map +1 -0
- package/dist/core/pagination/AsyncPaginationIterator.d.ts +1 -0
- package/dist/core/pagination/AsyncPaginationIterator.d.ts.map +1 -1
- package/dist/core/pagination/CursorPaginationHandler.d.ts.map +1 -1
- package/dist/core/pagination/PaginationHandler.d.ts.map +1 -1
- package/dist/core/rateLimiter/RateLimiter.d.ts +6 -0
- package/dist/core/rateLimiter/RateLimiter.d.ts.map +1 -1
- package/dist/core/requestPipeline/cachePolicy.d.ts +14 -0
- package/dist/core/requestPipeline/cachePolicy.d.ts.map +1 -1
- package/dist/core/requestPipeline/fetchExecution.d.ts +1 -1
- package/dist/core/requestPipeline/fetchExecution.d.ts.map +1 -1
- package/dist/core/requestPipeline/headers.d.ts.map +1 -1
- package/dist/core/requestPipeline/index.d.ts +2 -2
- package/dist/core/requestPipeline/index.d.ts.map +1 -1
- package/dist/core/requestPipeline/paginationOrchestration.d.ts.map +1 -1
- package/dist/core/requestPipeline/statusHandling.d.ts +8 -2
- package/dist/core/requestPipeline/statusHandling.d.ts.map +1 -1
- package/dist/core/util/concurrency.d.ts +29 -0
- package/dist/core/util/concurrency.d.ts.map +1 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +53 -195
- package/dist/errors.js.map +1 -1
- package/dist/errors.mjs +37 -129
- package/dist/errors.mjs.map +1 -1
- package/dist/index.d.ts +10 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2597 -3480
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2250 -3024
- package/dist/index.mjs.map +1 -1
- package/dist/schemas/calendar.d.ts +9 -7
- package/dist/schemas/calendar.d.ts.map +1 -1
- package/dist/schemas/character.d.ts +2 -2
- package/dist/schemas/clones.d.ts +2 -2
- package/dist/schemas/common.d.ts +11 -1
- package/dist/schemas/common.d.ts.map +1 -1
- package/dist/schemas/contracts.d.ts +69 -6
- package/dist/schemas/contracts.d.ts.map +1 -1
- package/dist/schemas/corporation-projects.d.ts +96 -9
- package/dist/schemas/corporation-projects.d.ts.map +1 -1
- package/dist/schemas/corporation.d.ts +34 -22
- package/dist/schemas/corporation.d.ts.map +1 -1
- package/dist/schemas/dogma.d.ts +2 -2
- package/dist/schemas/faction-warfare.d.ts +125 -12
- package/dist/schemas/faction-warfare.d.ts.map +1 -1
- package/dist/schemas/fleet.d.ts +1 -1
- package/dist/schemas/freelance-jobs.d.ts +52 -22
- package/dist/schemas/freelance-jobs.d.ts.map +1 -1
- package/dist/schemas/index.js +420 -2474
- package/dist/schemas/index.js.map +1 -1
- package/dist/schemas/index.mjs +225 -2060
- package/dist/schemas/index.mjs.map +1 -1
- package/dist/schemas/industry.d.ts +33 -0
- package/dist/schemas/industry.d.ts.map +1 -1
- package/dist/schemas/mail.d.ts +24 -5
- package/dist/schemas/mail.d.ts.map +1 -1
- package/dist/schemas/mercenary.d.ts +1 -1
- package/dist/schemas/meta.d.ts +12 -1
- package/dist/schemas/meta.d.ts.map +1 -1
- package/dist/schemas/pi.d.ts +2 -2
- package/dist/schemas/status.d.ts +1 -1
- package/dist/schemas/universe.d.ts +22 -22
- package/dist/schemas/universe.d.ts.map +1 -1
- package/dist/schemas/wallet.d.ts +16 -0
- package/dist/schemas/wallet.d.ts.map +1 -1
- package/dist/sde/SdeDataProvider.d.ts.map +1 -1
- package/dist/sde/index.js +95 -1162
- package/dist/sde/index.js.map +1 -1
- package/dist/sde/index.mjs +73 -1091
- package/dist/sde/index.mjs.map +1 -1
- package/dist/sde/ingestion/SdeExtractor.d.ts.map +1 -1
- package/dist/sde/ingestion/metadata.d.ts +13 -0
- package/dist/sde/ingestion/metadata.d.ts.map +1 -0
- package/dist/sde/memory.js +21 -1095
- package/dist/sde/memory.js.map +1 -1
- package/dist/sde/memory.mjs +13 -1051
- package/dist/sde/memory.mjs.map +1 -1
- package/dist/sde/optionalPeers.d.ts +25 -0
- package/dist/sde/optionalPeers.d.ts.map +1 -0
- package/dist/testing/TestDataFactory.d.ts +28 -1
- package/dist/testing/TestDataFactory.d.ts.map +1 -1
- package/dist/testing/index.js +116 -125
- package/dist/testing/index.js.map +1 -1
- package/dist/testing/index.mjs +110 -82
- package/dist/testing/index.mjs.map +1 -1
- package/dist/types/contracts.d.ts +4 -1
- package/dist/types/contracts.d.ts.map +1 -1
- package/dist/types/corporation-projects.d.ts +5 -1
- package/dist/types/corporation-projects.d.ts.map +1 -1
- package/dist/types/faction-warfare.d.ts +9 -1
- package/dist/types/faction-warfare.d.ts.map +1 -1
- package/dist/types/freelance-jobs.d.ts +2 -1
- package/dist/types/freelance-jobs.d.ts.map +1 -1
- package/dist/types/generated/esi-spec.generated.d.ts +12 -12
- package/dist/types/generated/esi-spec.generated.d.ts.map +1 -1
- package/dist/types/generated/spec-alignment.check.d.ts +2 -2
- package/dist/types/industry.d.ts +2 -1
- package/dist/types/industry.d.ts.map +1 -1
- package/dist/types/mail.d.ts +2 -1
- package/dist/types/mail.d.ts.map +1 -1
- package/dist/types/meta.d.ts +2 -1
- package/dist/types/meta.d.ts.map +1 -1
- package/dist/types/wallet.d.ts +2 -1
- package/dist/types/wallet.d.ts.map +1 -1
- package/package.json +326 -289
package/dist/errors.js
CHANGED
|
@@ -1,196 +1,54 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
-
});
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
var _chunkBBSHKVPIjs = require('./chunk-BBSHKVPI.js');
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
var _chunkHPSACXX3js = require('./chunk-HPSACXX3.js');
|
|
28
|
+
require('./chunk-PZ5AY32C.js');
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
exports.AuthError = _chunkBBSHKVPIjs.AuthError; exports.CharacterNotFoundError = _chunkBBSHKVPIjs.CharacterNotFoundError; exports.CircuitOpenError = _chunkHPSACXX3js.CircuitOpenError; exports.EsiError = _chunkHPSACXX3js.EsiError; exports.EsiValidationError = _chunkHPSACXX3js.EsiValidationError; exports.SsoError = _chunkBBSHKVPIjs.SsoError; exports.TimeoutError = _chunkHPSACXX3js.TimeoutError; exports.TokenDecodeError = _chunkBBSHKVPIjs.TokenDecodeError; exports.TokenRevokedError = _chunkBBSHKVPIjs.TokenRevokedError; exports.isAuthError = _chunkBBSHKVPIjs.isAuthError; exports.isCharacterNotFound = _chunkBBSHKVPIjs.isCharacterNotFound; exports.isEsiError = _chunkHPSACXX3js.isEsiError; exports.isForbidden = _chunkHPSACXX3js.isForbidden; exports.isNotFound = _chunkHPSACXX3js.isNotFound; exports.isRateLimited = _chunkHPSACXX3js.isRateLimited; exports.isRetryable = _chunkHPSACXX3js.isRetryable; exports.isServerError = _chunkHPSACXX3js.isServerError; exports.isSsoError = _chunkBBSHKVPIjs.isSsoError; exports.isTimeout = _chunkHPSACXX3js.isTimeout; exports.isTokenRevoked = _chunkBBSHKVPIjs.isTokenRevoked; exports.isUnauthorized = _chunkHPSACXX3js.isUnauthorized; exports.isValidationError = _chunkHPSACXX3js.isValidationError; exports.sanitizeUrl = _chunkHPSACXX3js.sanitizeUrl;
|
|
196
54
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +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 {\r\n EsiError,\r\n TimeoutError,\r\n EsiValidationError,\r\n isEsiError,\r\n isRateLimited,\r\n isNotFound,\r\n isUnauthorized,\r\n isForbidden,\r\n isServerError,\r\n isTimeout,\r\n isRetryable,\r\n isValidationError,\r\n sanitizeUrl,\r\n} from './core/util/error';\r\nexport type { ValidationDirection } from './core/util/error';\r\n\r\nexport { CircuitOpenError } from './core/circuitBreaker/CircuitBreaker';\r\n","import pino from 'pino';\r\nimport { ILogger } from './ILogger';\r\n\r\nconst pinoLogger = pino({ level: process.env.ESI_LOG_LEVEL || 'warn' });\r\n\r\nconst logger: ILogger = {\r\n info: (msg: string) => {\r\n pinoLogger.info(msg);\r\n },\r\n warn: (msg: string) => {\r\n pinoLogger.warn(msg);\r\n },\r\n error: (msg: string) => {\r\n pinoLogger.error(msg);\r\n },\r\n debug: (msg: string) => {\r\n pinoLogger.debug(msg);\r\n },\r\n};\r\n\r\nexport default logger;\r\n","import { logWarn, logInfo } from '../logger/loggerUtil';\r\nimport { ICircuitBreaker } from './ICircuitBreaker';\r\n\r\nexport type CircuitState = 'closed' | 'open' | 'half-open';\r\n\r\nexport interface CircuitBreakerConfig {\r\n failureThreshold?: number;\r\n resetTimeoutMs?: number;\r\n halfOpenMaxAttempts?: number;\r\n staleThresholdMs?: number;\r\n /** 'resolved' (default, current behavior) | 'template' (group by endpoint template path) */\r\n keyStrategy?: 'resolved' | 'template';\r\n /** Interval in ms for automatic cleanup of stale circuits. 0 or undefined disables. Recommended value: staleThresholdMs. */\r\n cleanupIntervalMs?: number;\r\n}\r\n\r\ninterface CircuitRecord {\r\n state: CircuitState;\r\n failures: number;\r\n lastFailureTime: number;\r\n halfOpenAttempts: number;\r\n}\r\n\r\nexport class CircuitBreaker implements ICircuitBreaker {\r\n private circuits: Map<string, CircuitRecord> = new Map();\r\n private readonly failureThreshold: number;\r\n private readonly resetTimeoutMs: number;\r\n private readonly halfOpenMaxAttempts: number;\r\n private readonly staleThresholdMs: number;\r\n private readonly keyStrategy: 'resolved' | 'template';\r\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n constructor(config: CircuitBreakerConfig = {}) {\r\n this.failureThreshold = config.failureThreshold ?? 5;\r\n this.resetTimeoutMs = config.resetTimeoutMs ?? 30_000;\r\n this.halfOpenMaxAttempts = config.halfOpenMaxAttempts ?? 1;\r\n this.staleThresholdMs = config.staleThresholdMs ?? 3_600_000;\r\n this.keyStrategy = config.keyStrategy ?? 'resolved';\r\n\r\n const cleanupIntervalMs = config.cleanupIntervalMs;\r\n if (cleanupIntervalMs !== undefined && cleanupIntervalMs > 0) {\r\n this.startCleanupTimer(cleanupIntervalMs);\r\n }\r\n }\r\n\r\n private getKey(endpoint: string): string {\r\n return endpoint.split('?')[0]!;\r\n }\r\n\r\n private getOrCreate(key: string): CircuitRecord {\r\n let record = this.circuits.get(key);\r\n if (!record) {\r\n record = {\r\n state: 'closed',\r\n failures: 0,\r\n lastFailureTime: 0,\r\n halfOpenAttempts: 0,\r\n };\r\n this.circuits.set(key, record);\r\n }\r\n return record;\r\n }\r\n\r\n checkCircuit(endpoint: string): void {\r\n const key = this.getKey(endpoint);\r\n const record = this.getOrCreate(key);\r\n\r\n if (record.state === 'closed') return;\r\n\r\n if (record.state === 'open') {\r\n const elapsed = Date.now() - record.lastFailureTime;\r\n if (elapsed >= this.resetTimeoutMs) {\r\n record.state = 'half-open';\r\n record.halfOpenAttempts = 0;\r\n logInfo(`Circuit half-open for ${key}, allowing probe request`);\r\n return;\r\n }\r\n const remainingMs = this.resetTimeoutMs - elapsed;\r\n throw new CircuitOpenError(key, record.failures, remainingMs);\r\n }\r\n\r\n if (record.state === 'half-open') {\r\n if (record.halfOpenAttempts >= this.halfOpenMaxAttempts) {\r\n throw new CircuitOpenError(key, record.failures, this.resetTimeoutMs);\r\n }\r\n record.halfOpenAttempts++;\r\n }\r\n }\r\n\r\n recordSuccess(endpoint: string): void {\r\n const key = this.getKey(endpoint);\r\n const record = this.circuits.get(key);\r\n if (!record) return;\r\n\r\n if (record.state === 'half-open') {\r\n logInfo(`Circuit closed for ${key} after successful probe`);\r\n }\r\n\r\n record.state = 'closed';\r\n record.failures = 0;\r\n record.halfOpenAttempts = 0;\r\n }\r\n\r\n recordFailure(endpoint: string, statusCode: number): void {\r\n // statusCode 0 = network/timeout; 420/429 = rate limited; >=500 = server errors\r\n if (\r\n statusCode !== 0 &&\r\n statusCode < 500 &&\r\n statusCode !== 420 &&\r\n statusCode !== 429\r\n ) {\r\n return;\r\n }\r\n\r\n const key = this.getKey(endpoint);\r\n const record = this.getOrCreate(key);\r\n\r\n record.failures++;\r\n record.lastFailureTime = Date.now();\r\n\r\n if (record.state === 'half-open') {\r\n record.state = 'open';\r\n logWarn(\r\n `Circuit re-opened for ${key} after failed probe (${record.failures} failures)`,\r\n );\r\n return;\r\n }\r\n\r\n if (record.failures >= this.failureThreshold) {\r\n record.state = 'open';\r\n logWarn(\r\n `Circuit opened for ${key} after ${record.failures} consecutive failures`,\r\n );\r\n }\r\n }\r\n\r\n getState(endpoint: string): CircuitState {\r\n const key = this.getKey(endpoint);\r\n const record = this.circuits.get(key);\r\n if (!record) return 'closed';\r\n\r\n if (record.state === 'open') {\r\n const elapsed = Date.now() - record.lastFailureTime;\r\n if (elapsed >= this.resetTimeoutMs) {\r\n return 'half-open';\r\n }\r\n }\r\n\r\n return record.state;\r\n }\r\n\r\n getStats(): {\r\n totalCircuits: number;\r\n openCircuits: number;\r\n circuits: Record<string, { state: CircuitState; failures: number }>;\r\n } {\r\n const circuits: Record<string, { state: CircuitState; failures: number }> =\r\n {};\r\n let openCircuits = 0;\r\n\r\n for (const [key, record] of this.circuits.entries()) {\r\n const state = this.getState(key);\r\n // eslint-disable-next-line security/detect-object-injection\r\n circuits[key] = { state, failures: record.failures };\r\n if (state === 'open') openCircuits++;\r\n }\r\n\r\n return {\r\n totalCircuits: this.circuits.size,\r\n openCircuits,\r\n circuits,\r\n };\r\n }\r\n\r\n reset(endpoint?: string): void {\r\n if (endpoint) {\r\n this.circuits.delete(this.getKey(endpoint));\r\n } else {\r\n this.circuits.clear();\r\n }\r\n }\r\n\r\n cleanup(): number {\r\n const now = Date.now();\r\n let cleaned = 0;\r\n for (const [key, record] of this.circuits.entries()) {\r\n if (\r\n record.state === 'closed' &&\r\n record.failures === 0 &&\r\n record.lastFailureTime > 0 &&\r\n now - record.lastFailureTime > this.staleThresholdMs\r\n ) {\r\n this.circuits.delete(key);\r\n cleaned++;\r\n }\r\n }\r\n if (cleaned > 0) {\r\n logInfo(`Circuit breaker cleanup: removed ${cleaned} stale circuits`);\r\n }\r\n return cleaned;\r\n }\r\n\r\n getKeyStrategy(): 'resolved' | 'template' {\r\n return this.keyStrategy;\r\n }\r\n\r\n destroy(): void {\r\n if (this.cleanupTimer) {\r\n clearInterval(this.cleanupTimer);\r\n this.cleanupTimer = null;\r\n }\r\n this.circuits.clear();\r\n }\r\n\r\n shutdown(): void {\r\n this.destroy();\r\n }\r\n\r\n private startCleanupTimer(intervalMs: number): void {\r\n this.cleanupTimer = setInterval(() => {\r\n this.cleanup();\r\n }, intervalMs);\r\n // Don't prevent process exit (important for test runners and CLI tools)\r\n this.cleanupTimer.unref();\r\n }\r\n}\r\n\r\nexport class CircuitOpenError extends Error {\r\n readonly endpoint: string;\r\n readonly failures: number;\r\n readonly retryAfterMs: number;\r\n\r\n constructor(endpoint: string, failures: number, retryAfterMs: number) {\r\n super(\r\n `Circuit breaker open for ${endpoint} after ${failures} failures (retry after ${Math.ceil(retryAfterMs / 1000)}s)`,\r\n );\r\n this.name = 'CircuitOpenError';\r\n this.endpoint = endpoint;\r\n this.failures = failures;\r\n this.retryAfterMs = retryAfterMs;\r\n }\r\n}\r\n","const SENSITIVE_PARAMS = [\r\n 'token',\r\n 'access_token',\r\n 'api_key',\r\n 'refresh_token',\r\n 'client_secret',\r\n 'code',\r\n 'key',\r\n 'secret',\r\n 'auth',\r\n 'password',\r\n 'bearer',\r\n];\r\n\r\nexport function sanitizeUrl(url?: string): string | undefined {\r\n if (!url) return url;\r\n try {\r\n const parsed = new URL(url);\r\n for (const param of SENSITIVE_PARAMS) {\r\n if (parsed.searchParams.has(param)) {\r\n parsed.searchParams.set(param, '[REDACTED]');\r\n }\r\n }\r\n return parsed.toString();\r\n } catch {\r\n const qIndex = url.indexOf('?');\r\n return qIndex >= 0 ? url.substring(0, qIndex) + '?[params-redacted]' : url;\r\n }\r\n}\r\n\r\nexport class EsiError extends Error {\r\n public readonly url?: string;\r\n\r\n constructor(\r\n public readonly statusCode: number,\r\n message: string,\r\n url?: string,\r\n public readonly requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'EsiError';\r\n this.url = sanitizeUrl(url);\r\n }\r\n\r\n isRateLimited(): boolean {\r\n return this.statusCode === 420 || this.statusCode === 429;\r\n }\r\n\r\n isNotFound(): boolean {\r\n return this.statusCode === 404;\r\n }\r\n\r\n isUnauthorized(): boolean {\r\n return this.statusCode === 401;\r\n }\r\n\r\n isForbidden(): boolean {\r\n return this.statusCode === 403;\r\n }\r\n\r\n isServerError(): boolean {\r\n return this.statusCode >= 500;\r\n }\r\n\r\n isTimeout(): boolean {\r\n return this.statusCode === 0;\r\n }\r\n\r\n get retryable(): boolean {\r\n return (\r\n this.statusCode === 0 ||\r\n this.statusCode === 420 ||\r\n this.statusCode === 429 ||\r\n this.statusCode === 502 ||\r\n this.statusCode === 503 ||\r\n this.statusCode === 504\r\n );\r\n }\r\n}\r\n\r\nexport function isEsiError(error: unknown): error is EsiError {\r\n return error instanceof EsiError;\r\n}\r\n\r\nexport function isRateLimited(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isRateLimited();\r\n}\r\n\r\nexport function isNotFound(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isNotFound();\r\n}\r\n\r\nexport function isUnauthorized(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isUnauthorized();\r\n}\r\n\r\nexport function isForbidden(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isForbidden();\r\n}\r\n\r\nexport function isServerError(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isServerError();\r\n}\r\n\r\nexport class TimeoutError extends EsiError {\r\n constructor(\r\n public readonly timeoutMs: number,\r\n url?: string,\r\n requestId?: string,\r\n ) {\r\n super(0, `Request timed out after ${timeoutMs}ms`, url, requestId);\r\n this.name = 'TimeoutError';\r\n }\r\n}\r\n\r\nexport function isTimeout(error: unknown): error is TimeoutError {\r\n return error instanceof TimeoutError;\r\n}\r\n\r\nexport function isRetryable(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.retryable;\r\n}\r\n\r\n// Re-export CircuitOpenError for the type guard — avoid forcing consumers\r\n// to import from the circuitBreaker subpath just for error checking.\r\nimport { CircuitOpenError } from '../circuitBreaker/CircuitBreaker';\r\n\r\nexport function isCircuitOpen(error: unknown): error is CircuitOpenError {\r\n return error instanceof CircuitOpenError;\r\n}\r\n\r\nexport const buildError = (\r\n message: string,\r\n type: string = 'ERROR',\r\n url?: string,\r\n): Error => {\r\n const error = new Error(`[${type}] ${message}`);\r\n if (url) {\r\n (error as Error & { url: string }).url = url;\r\n }\r\n return error;\r\n};\r\n\r\nexport type ValidationDirection = 'request' | 'response';\r\n\r\nexport class EsiValidationError extends EsiError {\r\n public readonly validationError: unknown;\r\n public readonly direction: ValidationDirection;\r\n\r\n constructor(\r\n url: string,\r\n zodError: unknown,\r\n requestId?: string,\r\n direction: ValidationDirection = 'response',\r\n ) {\r\n const safeUrl = sanitizeUrl(url) ?? url;\r\n const label = direction === 'request' ? 'Request body' : 'Response';\r\n super(0, `${label} validation failed for ${safeUrl}`, url, requestId);\r\n this.name = 'EsiValidationError';\r\n this.validationError = zodError;\r\n this.direction = direction;\r\n }\r\n}\r\n\r\nexport function isValidationError(error: unknown): error is EsiValidationError {\r\n return error instanceof EsiValidationError;\r\n}\r\n"],"mappings":"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","names":["pino"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/ESI.ts/ESI.ts/dist/errors.js"],"names":[],"mappings":"AAAA;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,sDAA4B;AAC5B,+BAA4B;AAC5B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,uwCAAC","file":"/home/runner/work/ESI.ts/ESI.ts/dist/errors.js"}
|
package/dist/errors.mjs
CHANGED
|
@@ -1,144 +1,52 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
"key",
|
|
30
|
-
"secret",
|
|
31
|
-
"auth",
|
|
32
|
-
"password",
|
|
33
|
-
"bearer"
|
|
34
|
-
];
|
|
35
|
-
function sanitizeUrl(url) {
|
|
36
|
-
if (!url) return url;
|
|
37
|
-
try {
|
|
38
|
-
const parsed = new URL(url);
|
|
39
|
-
for (const param of SENSITIVE_PARAMS) {
|
|
40
|
-
if (parsed.searchParams.has(param)) {
|
|
41
|
-
parsed.searchParams.set(param, "[REDACTED]");
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
return parsed.toString();
|
|
45
|
-
} catch {
|
|
46
|
-
const qIndex = url.indexOf("?");
|
|
47
|
-
return qIndex >= 0 ? url.substring(0, qIndex) + "?[params-redacted]" : url;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
var EsiError = class extends Error {
|
|
51
|
-
constructor(statusCode, message, url, requestId) {
|
|
52
|
-
super(message);
|
|
53
|
-
this.statusCode = statusCode;
|
|
54
|
-
this.requestId = requestId;
|
|
55
|
-
this.name = "EsiError";
|
|
56
|
-
this.url = sanitizeUrl(url);
|
|
57
|
-
}
|
|
58
|
-
statusCode;
|
|
59
|
-
requestId;
|
|
60
|
-
url;
|
|
61
|
-
isRateLimited() {
|
|
62
|
-
return this.statusCode === 420 || this.statusCode === 429;
|
|
63
|
-
}
|
|
64
|
-
isNotFound() {
|
|
65
|
-
return this.statusCode === 404;
|
|
66
|
-
}
|
|
67
|
-
isUnauthorized() {
|
|
68
|
-
return this.statusCode === 401;
|
|
69
|
-
}
|
|
70
|
-
isForbidden() {
|
|
71
|
-
return this.statusCode === 403;
|
|
72
|
-
}
|
|
73
|
-
isServerError() {
|
|
74
|
-
return this.statusCode >= 500;
|
|
75
|
-
}
|
|
76
|
-
isTimeout() {
|
|
77
|
-
return this.statusCode === 0;
|
|
78
|
-
}
|
|
79
|
-
get retryable() {
|
|
80
|
-
return this.statusCode === 0 || this.statusCode === 420 || this.statusCode === 429 || this.statusCode === 502 || this.statusCode === 503 || this.statusCode === 504;
|
|
81
|
-
}
|
|
82
|
-
};
|
|
83
|
-
function isEsiError(error) {
|
|
84
|
-
return error instanceof EsiError;
|
|
85
|
-
}
|
|
86
|
-
function isRateLimited(error) {
|
|
87
|
-
return error instanceof EsiError && error.isRateLimited();
|
|
88
|
-
}
|
|
89
|
-
function isNotFound(error) {
|
|
90
|
-
return error instanceof EsiError && error.isNotFound();
|
|
91
|
-
}
|
|
92
|
-
function isUnauthorized(error) {
|
|
93
|
-
return error instanceof EsiError && error.isUnauthorized();
|
|
94
|
-
}
|
|
95
|
-
function isForbidden(error) {
|
|
96
|
-
return error instanceof EsiError && error.isForbidden();
|
|
97
|
-
}
|
|
98
|
-
function isServerError(error) {
|
|
99
|
-
return error instanceof EsiError && error.isServerError();
|
|
100
|
-
}
|
|
101
|
-
var TimeoutError = class extends EsiError {
|
|
102
|
-
constructor(timeoutMs, url, requestId) {
|
|
103
|
-
super(0, `Request timed out after ${timeoutMs}ms`, url, requestId);
|
|
104
|
-
this.timeoutMs = timeoutMs;
|
|
105
|
-
this.name = "TimeoutError";
|
|
106
|
-
}
|
|
107
|
-
timeoutMs;
|
|
108
|
-
};
|
|
109
|
-
function isTimeout(error) {
|
|
110
|
-
return error instanceof TimeoutError;
|
|
111
|
-
}
|
|
112
|
-
function isRetryable(error) {
|
|
113
|
-
return error instanceof EsiError && error.retryable;
|
|
114
|
-
}
|
|
115
|
-
var EsiValidationError = class extends EsiError {
|
|
116
|
-
validationError;
|
|
117
|
-
direction;
|
|
118
|
-
constructor(url, zodError, requestId, direction = "response") {
|
|
119
|
-
const safeUrl = sanitizeUrl(url) ?? url;
|
|
120
|
-
const label = direction === "request" ? "Request body" : "Response";
|
|
121
|
-
super(0, `${label} validation failed for ${safeUrl}`, url, requestId);
|
|
122
|
-
this.name = "EsiValidationError";
|
|
123
|
-
this.validationError = zodError;
|
|
124
|
-
this.direction = direction;
|
|
125
|
-
}
|
|
126
|
-
};
|
|
127
|
-
function isValidationError(error) {
|
|
128
|
-
return error instanceof EsiValidationError;
|
|
129
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
AuthError,
|
|
3
|
+
CharacterNotFoundError,
|
|
4
|
+
SsoError,
|
|
5
|
+
TokenDecodeError,
|
|
6
|
+
TokenRevokedError,
|
|
7
|
+
isAuthError,
|
|
8
|
+
isCharacterNotFound,
|
|
9
|
+
isSsoError,
|
|
10
|
+
isTokenRevoked
|
|
11
|
+
} from "./chunk-R7D7M2LQ.mjs";
|
|
12
|
+
import {
|
|
13
|
+
CircuitOpenError,
|
|
14
|
+
EsiError,
|
|
15
|
+
EsiValidationError,
|
|
16
|
+
TimeoutError,
|
|
17
|
+
isEsiError,
|
|
18
|
+
isForbidden,
|
|
19
|
+
isNotFound,
|
|
20
|
+
isRateLimited,
|
|
21
|
+
isRetryable,
|
|
22
|
+
isServerError,
|
|
23
|
+
isTimeout,
|
|
24
|
+
isUnauthorized,
|
|
25
|
+
isValidationError,
|
|
26
|
+
sanitizeUrl
|
|
27
|
+
} from "./chunk-7A72QFDF.mjs";
|
|
28
|
+
import "./chunk-JIW4BXLP.mjs";
|
|
130
29
|
export {
|
|
30
|
+
AuthError,
|
|
31
|
+
CharacterNotFoundError,
|
|
131
32
|
CircuitOpenError,
|
|
132
33
|
EsiError,
|
|
133
34
|
EsiValidationError,
|
|
35
|
+
SsoError,
|
|
134
36
|
TimeoutError,
|
|
37
|
+
TokenDecodeError,
|
|
38
|
+
TokenRevokedError,
|
|
39
|
+
isAuthError,
|
|
40
|
+
isCharacterNotFound,
|
|
135
41
|
isEsiError,
|
|
136
42
|
isForbidden,
|
|
137
43
|
isNotFound,
|
|
138
44
|
isRateLimited,
|
|
139
45
|
isRetryable,
|
|
140
46
|
isServerError,
|
|
47
|
+
isSsoError,
|
|
141
48
|
isTimeout,
|
|
49
|
+
isTokenRevoked,
|
|
142
50
|
isUnauthorized,
|
|
143
51
|
isValidationError,
|
|
144
52
|
sanitizeUrl
|
package/dist/errors.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/logger/logger.ts","../src/core/circuitBreaker/CircuitBreaker.ts","../src/core/util/error.ts"],"sourcesContent":["import pino from 'pino';\r\nimport { ILogger } from './ILogger';\r\n\r\nconst pinoLogger = pino({ level: process.env.ESI_LOG_LEVEL || 'warn' });\r\n\r\nconst logger: ILogger = {\r\n info: (msg: string) => {\r\n pinoLogger.info(msg);\r\n },\r\n warn: (msg: string) => {\r\n pinoLogger.warn(msg);\r\n },\r\n error: (msg: string) => {\r\n pinoLogger.error(msg);\r\n },\r\n debug: (msg: string) => {\r\n pinoLogger.debug(msg);\r\n },\r\n};\r\n\r\nexport default logger;\r\n","import { logWarn, logInfo } from '../logger/loggerUtil';\r\nimport { ICircuitBreaker } from './ICircuitBreaker';\r\n\r\nexport type CircuitState = 'closed' | 'open' | 'half-open';\r\n\r\nexport interface CircuitBreakerConfig {\r\n failureThreshold?: number;\r\n resetTimeoutMs?: number;\r\n halfOpenMaxAttempts?: number;\r\n staleThresholdMs?: number;\r\n /** 'resolved' (default, current behavior) | 'template' (group by endpoint template path) */\r\n keyStrategy?: 'resolved' | 'template';\r\n /** Interval in ms for automatic cleanup of stale circuits. 0 or undefined disables. Recommended value: staleThresholdMs. */\r\n cleanupIntervalMs?: number;\r\n}\r\n\r\ninterface CircuitRecord {\r\n state: CircuitState;\r\n failures: number;\r\n lastFailureTime: number;\r\n halfOpenAttempts: number;\r\n}\r\n\r\nexport class CircuitBreaker implements ICircuitBreaker {\r\n private circuits: Map<string, CircuitRecord> = new Map();\r\n private readonly failureThreshold: number;\r\n private readonly resetTimeoutMs: number;\r\n private readonly halfOpenMaxAttempts: number;\r\n private readonly staleThresholdMs: number;\r\n private readonly keyStrategy: 'resolved' | 'template';\r\n private cleanupTimer: ReturnType<typeof setInterval> | null = null;\r\n\r\n constructor(config: CircuitBreakerConfig = {}) {\r\n this.failureThreshold = config.failureThreshold ?? 5;\r\n this.resetTimeoutMs = config.resetTimeoutMs ?? 30_000;\r\n this.halfOpenMaxAttempts = config.halfOpenMaxAttempts ?? 1;\r\n this.staleThresholdMs = config.staleThresholdMs ?? 3_600_000;\r\n this.keyStrategy = config.keyStrategy ?? 'resolved';\r\n\r\n const cleanupIntervalMs = config.cleanupIntervalMs;\r\n if (cleanupIntervalMs !== undefined && cleanupIntervalMs > 0) {\r\n this.startCleanupTimer(cleanupIntervalMs);\r\n }\r\n }\r\n\r\n private getKey(endpoint: string): string {\r\n return endpoint.split('?')[0]!;\r\n }\r\n\r\n private getOrCreate(key: string): CircuitRecord {\r\n let record = this.circuits.get(key);\r\n if (!record) {\r\n record = {\r\n state: 'closed',\r\n failures: 0,\r\n lastFailureTime: 0,\r\n halfOpenAttempts: 0,\r\n };\r\n this.circuits.set(key, record);\r\n }\r\n return record;\r\n }\r\n\r\n checkCircuit(endpoint: string): void {\r\n const key = this.getKey(endpoint);\r\n const record = this.getOrCreate(key);\r\n\r\n if (record.state === 'closed') return;\r\n\r\n if (record.state === 'open') {\r\n const elapsed = Date.now() - record.lastFailureTime;\r\n if (elapsed >= this.resetTimeoutMs) {\r\n record.state = 'half-open';\r\n record.halfOpenAttempts = 0;\r\n logInfo(`Circuit half-open for ${key}, allowing probe request`);\r\n return;\r\n }\r\n const remainingMs = this.resetTimeoutMs - elapsed;\r\n throw new CircuitOpenError(key, record.failures, remainingMs);\r\n }\r\n\r\n if (record.state === 'half-open') {\r\n if (record.halfOpenAttempts >= this.halfOpenMaxAttempts) {\r\n throw new CircuitOpenError(key, record.failures, this.resetTimeoutMs);\r\n }\r\n record.halfOpenAttempts++;\r\n }\r\n }\r\n\r\n recordSuccess(endpoint: string): void {\r\n const key = this.getKey(endpoint);\r\n const record = this.circuits.get(key);\r\n if (!record) return;\r\n\r\n if (record.state === 'half-open') {\r\n logInfo(`Circuit closed for ${key} after successful probe`);\r\n }\r\n\r\n record.state = 'closed';\r\n record.failures = 0;\r\n record.halfOpenAttempts = 0;\r\n }\r\n\r\n recordFailure(endpoint: string, statusCode: number): void {\r\n // statusCode 0 = network/timeout; 420/429 = rate limited; >=500 = server errors\r\n if (\r\n statusCode !== 0 &&\r\n statusCode < 500 &&\r\n statusCode !== 420 &&\r\n statusCode !== 429\r\n ) {\r\n return;\r\n }\r\n\r\n const key = this.getKey(endpoint);\r\n const record = this.getOrCreate(key);\r\n\r\n record.failures++;\r\n record.lastFailureTime = Date.now();\r\n\r\n if (record.state === 'half-open') {\r\n record.state = 'open';\r\n logWarn(\r\n `Circuit re-opened for ${key} after failed probe (${record.failures} failures)`,\r\n );\r\n return;\r\n }\r\n\r\n if (record.failures >= this.failureThreshold) {\r\n record.state = 'open';\r\n logWarn(\r\n `Circuit opened for ${key} after ${record.failures} consecutive failures`,\r\n );\r\n }\r\n }\r\n\r\n getState(endpoint: string): CircuitState {\r\n const key = this.getKey(endpoint);\r\n const record = this.circuits.get(key);\r\n if (!record) return 'closed';\r\n\r\n if (record.state === 'open') {\r\n const elapsed = Date.now() - record.lastFailureTime;\r\n if (elapsed >= this.resetTimeoutMs) {\r\n return 'half-open';\r\n }\r\n }\r\n\r\n return record.state;\r\n }\r\n\r\n getStats(): {\r\n totalCircuits: number;\r\n openCircuits: number;\r\n circuits: Record<string, { state: CircuitState; failures: number }>;\r\n } {\r\n const circuits: Record<string, { state: CircuitState; failures: number }> =\r\n {};\r\n let openCircuits = 0;\r\n\r\n for (const [key, record] of this.circuits.entries()) {\r\n const state = this.getState(key);\r\n // eslint-disable-next-line security/detect-object-injection\r\n circuits[key] = { state, failures: record.failures };\r\n if (state === 'open') openCircuits++;\r\n }\r\n\r\n return {\r\n totalCircuits: this.circuits.size,\r\n openCircuits,\r\n circuits,\r\n };\r\n }\r\n\r\n reset(endpoint?: string): void {\r\n if (endpoint) {\r\n this.circuits.delete(this.getKey(endpoint));\r\n } else {\r\n this.circuits.clear();\r\n }\r\n }\r\n\r\n cleanup(): number {\r\n const now = Date.now();\r\n let cleaned = 0;\r\n for (const [key, record] of this.circuits.entries()) {\r\n if (\r\n record.state === 'closed' &&\r\n record.failures === 0 &&\r\n record.lastFailureTime > 0 &&\r\n now - record.lastFailureTime > this.staleThresholdMs\r\n ) {\r\n this.circuits.delete(key);\r\n cleaned++;\r\n }\r\n }\r\n if (cleaned > 0) {\r\n logInfo(`Circuit breaker cleanup: removed ${cleaned} stale circuits`);\r\n }\r\n return cleaned;\r\n }\r\n\r\n getKeyStrategy(): 'resolved' | 'template' {\r\n return this.keyStrategy;\r\n }\r\n\r\n destroy(): void {\r\n if (this.cleanupTimer) {\r\n clearInterval(this.cleanupTimer);\r\n this.cleanupTimer = null;\r\n }\r\n this.circuits.clear();\r\n }\r\n\r\n shutdown(): void {\r\n this.destroy();\r\n }\r\n\r\n private startCleanupTimer(intervalMs: number): void {\r\n this.cleanupTimer = setInterval(() => {\r\n this.cleanup();\r\n }, intervalMs);\r\n // Don't prevent process exit (important for test runners and CLI tools)\r\n this.cleanupTimer.unref();\r\n }\r\n}\r\n\r\nexport class CircuitOpenError extends Error {\r\n readonly endpoint: string;\r\n readonly failures: number;\r\n readonly retryAfterMs: number;\r\n\r\n constructor(endpoint: string, failures: number, retryAfterMs: number) {\r\n super(\r\n `Circuit breaker open for ${endpoint} after ${failures} failures (retry after ${Math.ceil(retryAfterMs / 1000)}s)`,\r\n );\r\n this.name = 'CircuitOpenError';\r\n this.endpoint = endpoint;\r\n this.failures = failures;\r\n this.retryAfterMs = retryAfterMs;\r\n }\r\n}\r\n","const SENSITIVE_PARAMS = [\r\n 'token',\r\n 'access_token',\r\n 'api_key',\r\n 'refresh_token',\r\n 'client_secret',\r\n 'code',\r\n 'key',\r\n 'secret',\r\n 'auth',\r\n 'password',\r\n 'bearer',\r\n];\r\n\r\nexport function sanitizeUrl(url?: string): string | undefined {\r\n if (!url) return url;\r\n try {\r\n const parsed = new URL(url);\r\n for (const param of SENSITIVE_PARAMS) {\r\n if (parsed.searchParams.has(param)) {\r\n parsed.searchParams.set(param, '[REDACTED]');\r\n }\r\n }\r\n return parsed.toString();\r\n } catch {\r\n const qIndex = url.indexOf('?');\r\n return qIndex >= 0 ? url.substring(0, qIndex) + '?[params-redacted]' : url;\r\n }\r\n}\r\n\r\nexport class EsiError extends Error {\r\n public readonly url?: string;\r\n\r\n constructor(\r\n public readonly statusCode: number,\r\n message: string,\r\n url?: string,\r\n public readonly requestId?: string,\r\n ) {\r\n super(message);\r\n this.name = 'EsiError';\r\n this.url = sanitizeUrl(url);\r\n }\r\n\r\n isRateLimited(): boolean {\r\n return this.statusCode === 420 || this.statusCode === 429;\r\n }\r\n\r\n isNotFound(): boolean {\r\n return this.statusCode === 404;\r\n }\r\n\r\n isUnauthorized(): boolean {\r\n return this.statusCode === 401;\r\n }\r\n\r\n isForbidden(): boolean {\r\n return this.statusCode === 403;\r\n }\r\n\r\n isServerError(): boolean {\r\n return this.statusCode >= 500;\r\n }\r\n\r\n isTimeout(): boolean {\r\n return this.statusCode === 0;\r\n }\r\n\r\n get retryable(): boolean {\r\n return (\r\n this.statusCode === 0 ||\r\n this.statusCode === 420 ||\r\n this.statusCode === 429 ||\r\n this.statusCode === 502 ||\r\n this.statusCode === 503 ||\r\n this.statusCode === 504\r\n );\r\n }\r\n}\r\n\r\nexport function isEsiError(error: unknown): error is EsiError {\r\n return error instanceof EsiError;\r\n}\r\n\r\nexport function isRateLimited(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isRateLimited();\r\n}\r\n\r\nexport function isNotFound(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isNotFound();\r\n}\r\n\r\nexport function isUnauthorized(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isUnauthorized();\r\n}\r\n\r\nexport function isForbidden(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isForbidden();\r\n}\r\n\r\nexport function isServerError(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.isServerError();\r\n}\r\n\r\nexport class TimeoutError extends EsiError {\r\n constructor(\r\n public readonly timeoutMs: number,\r\n url?: string,\r\n requestId?: string,\r\n ) {\r\n super(0, `Request timed out after ${timeoutMs}ms`, url, requestId);\r\n this.name = 'TimeoutError';\r\n }\r\n}\r\n\r\nexport function isTimeout(error: unknown): error is TimeoutError {\r\n return error instanceof TimeoutError;\r\n}\r\n\r\nexport function isRetryable(error: unknown): error is EsiError {\r\n return error instanceof EsiError && error.retryable;\r\n}\r\n\r\n// Re-export CircuitOpenError for the type guard — avoid forcing consumers\r\n// to import from the circuitBreaker subpath just for error checking.\r\nimport { CircuitOpenError } from '../circuitBreaker/CircuitBreaker';\r\n\r\nexport function isCircuitOpen(error: unknown): error is CircuitOpenError {\r\n return error instanceof CircuitOpenError;\r\n}\r\n\r\nexport const buildError = (\r\n message: string,\r\n type: string = 'ERROR',\r\n url?: string,\r\n): Error => {\r\n const error = new Error(`[${type}] ${message}`);\r\n if (url) {\r\n (error as Error & { url: string }).url = url;\r\n }\r\n return error;\r\n};\r\n\r\nexport type ValidationDirection = 'request' | 'response';\r\n\r\nexport class EsiValidationError extends EsiError {\r\n public readonly validationError: unknown;\r\n public readonly direction: ValidationDirection;\r\n\r\n constructor(\r\n url: string,\r\n zodError: unknown,\r\n requestId?: string,\r\n direction: ValidationDirection = 'response',\r\n ) {\r\n const safeUrl = sanitizeUrl(url) ?? url;\r\n const label = direction === 'request' ? 'Request body' : 'Response';\r\n super(0, `${label} validation failed for ${safeUrl}`, url, requestId);\r\n this.name = 'EsiValidationError';\r\n this.validationError = zodError;\r\n this.direction = direction;\r\n }\r\n}\r\n\r\nexport function isValidationError(error: unknown): error is EsiValidationError {\r\n return error instanceof EsiValidationError;\r\n}\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ export { EsiClient, EsiClientConfig, EsiDatasource } from './EsiClient';
|
|
|
2
2
|
export { getDefaultClient } from './EsiClient';
|
|
3
3
|
export { CustomEsiClient, EsiClientBuilder, EsiApiFactory, } from './EsiClientBuilder';
|
|
4
4
|
export { ApiClientType } from './core/ClientRegistry';
|
|
5
|
-
export { ApiClient, TokenProvider } from './core/ApiClient';
|
|
5
|
+
export { ApiClient, TokenProvider, FetchLike } from './core/ApiClient';
|
|
6
6
|
export { ApiClientBuilder } from './core/ApiClientBuilder';
|
|
7
7
|
export { configureApiClient, ConfigureApiClientResult, } from './core/configureApiClient';
|
|
8
8
|
export { BaseEsiClient } from './clients/BaseEsiClient';
|
|
@@ -53,7 +53,7 @@ export { DeprecationInfo } from './core/endpoints/EndpointDefinition';
|
|
|
53
53
|
export { RequestInterceptor, ResponseInterceptor, RequestContext, ResponseContext, } from './core/middleware/Middleware';
|
|
54
54
|
export { CircuitBreaker, CircuitBreakerConfig, CircuitState, CircuitOpenError, } from './core/circuitBreaker/CircuitBreaker';
|
|
55
55
|
export type { ICircuitBreaker } from './core/circuitBreaker/ICircuitBreaker';
|
|
56
|
-
export { RateLimiter, RateLimitInfo, RateLimiterConfig, } from './core/rateLimiter/RateLimiter';
|
|
56
|
+
export { RateLimiter, RateLimitEndpointOverride, RateLimitInfo, RateLimiterConfig, } from './core/rateLimiter/RateLimiter';
|
|
57
57
|
export { ETagCacheManager, ETagCacheConfig, } from './core/cache/ETagCacheManager';
|
|
58
58
|
export { RetryConfig } from './core/util/retry';
|
|
59
59
|
export { RetryStrategy } from './core/RetryStrategy';
|
|
@@ -63,14 +63,19 @@ export { RequestDeduplicator } from './core/RequestDeduplicator';
|
|
|
63
63
|
export type { IDeduplicator } from './core/IDeduplicator';
|
|
64
64
|
export { batchFetch, batchPost, BatchOptions, BatchResult, } from './core/BatchRequestHandler';
|
|
65
65
|
export { EsiDiagnostics, CacheStats, CircuitBreakerStats, } from './core/EsiDiagnostics';
|
|
66
|
-
export { fetchPages, PageResult, } from './core/pagination/AsyncPaginationIterator';
|
|
66
|
+
export { fetchAllPages, fetchPages, PageResult, } from './core/pagination/AsyncPaginationIterator';
|
|
67
67
|
export { buildEndpointPath } from './core/endpoints/buildEndpointPath';
|
|
68
68
|
export { ICache } from './core/cache/ICache';
|
|
69
69
|
export { IRateLimiter, RateLimitGroupStatus, } from './core/rateLimiter/IRateLimiter';
|
|
70
70
|
export { RateLimitGroupSpec } from './core/endpoints/esi-rate-limit-groups.generated';
|
|
71
71
|
export { EsiScope, esiEndpointScopes, } from './core/endpoints/esi-scopes.generated';
|
|
72
|
-
export { ILogger } from './core/logger/ILogger';
|
|
73
|
-
export { setLogger } from './core/logger/loggerUtil';
|
|
72
|
+
export { ILogger, LogContext } from './core/logger/ILogger';
|
|
73
|
+
export { setLogger, getLogger, logFatal, logInfo, logError, logWarn, logDebug, logTrace, } from './core/logger/loggerUtil';
|
|
74
|
+
export { createNoopLogger } from './core/logger/NoopLogger';
|
|
75
|
+
export { createDefaultLogger, toPinoLogger } from './core/logger/DefaultLogger';
|
|
76
|
+
export type { LogLevel } from './core/logger/DefaultLogger';
|
|
74
77
|
export * from './types/api-responses';
|
|
75
78
|
export * as schemas from './schemas';
|
|
79
|
+
export { EveSsoClient, DEFAULT_SSO_BASE_URL, EsiTokenManager, MemoryTokenStorage, FileTokenStorage, AuthError, SsoError, TokenRevokedError, TokenDecodeError, CharacterNotFoundError, isAuthError, isSsoError, isTokenRevoked, isCharacterNotFound, decodeAccessToken, decodeJwtPayload, parseCharacterId, parseScopes, generatePkcePair, generateCodeVerifier, codeChallengeFromVerifier, generateState, } from './auth';
|
|
80
|
+
export type { ITokenStorage, StoredToken, EveSsoClientConfig, SsoTokenResponse, AuthorizationUrlOptions, ExchangeCodeOptions, RefreshOptions, EsiTokenManagerConfig, AddCharacterOptions, RemoveCharacterOptions, RefreshAllOptions, RefreshResult, RefreshStatus, CharacterSummary, ManagedClientConfig, FileTokenStorageOptions, DecodedAccessToken, EveJwtClaims, PkcePair, } from './auth';
|
|
76
81
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,aAAa,GACd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|