swcombine-sdk 1.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/LICENSE +21 -0
- package/README.md +404 -0
- package/dist/cjs/SWCombine.js +120 -0
- package/dist/cjs/SWCombine.js.map +1 -0
- package/dist/cjs/auth/OAuthClient.js +195 -0
- package/dist/cjs/auth/OAuthClient.js.map +1 -0
- package/dist/cjs/auth/TokenManager.js +139 -0
- package/dist/cjs/auth/TokenManager.js.map +1 -0
- package/dist/cjs/auth/permissions.js +281 -0
- package/dist/cjs/auth/permissions.js.map +1 -0
- package/dist/cjs/auth/scopes.js +285 -0
- package/dist/cjs/auth/scopes.js.map +1 -0
- package/dist/cjs/http/HttpClient.js +216 -0
- package/dist/cjs/http/HttpClient.js.map +1 -0
- package/dist/cjs/http/errors.js +156 -0
- package/dist/cjs/http/errors.js.map +1 -0
- package/dist/cjs/index.js +48 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/resources/ApiResource.js +44 -0
- package/dist/cjs/resources/ApiResource.js.map +1 -0
- package/dist/cjs/resources/BaseResource.js +33 -0
- package/dist/cjs/resources/BaseResource.js.map +1 -0
- package/dist/cjs/resources/CharacterResource.js +178 -0
- package/dist/cjs/resources/CharacterResource.js.map +1 -0
- package/dist/cjs/resources/DatacardResource.js +42 -0
- package/dist/cjs/resources/DatacardResource.js.map +1 -0
- package/dist/cjs/resources/EventsResource.js +42 -0
- package/dist/cjs/resources/EventsResource.js.map +1 -0
- package/dist/cjs/resources/FactionResource.js +162 -0
- package/dist/cjs/resources/FactionResource.js.map +1 -0
- package/dist/cjs/resources/GalaxyResource.js +184 -0
- package/dist/cjs/resources/GalaxyResource.js.map +1 -0
- package/dist/cjs/resources/InventoryResource.js +95 -0
- package/dist/cjs/resources/InventoryResource.js.map +1 -0
- package/dist/cjs/resources/LocationResource.js +20 -0
- package/dist/cjs/resources/LocationResource.js.map +1 -0
- package/dist/cjs/resources/MarketResource.js +44 -0
- package/dist/cjs/resources/MarketResource.js.map +1 -0
- package/dist/cjs/resources/NewsResource.js +109 -0
- package/dist/cjs/resources/NewsResource.js.map +1 -0
- package/dist/cjs/resources/TypesResource.js +75 -0
- package/dist/cjs/resources/TypesResource.js.map +1 -0
- package/dist/cjs/types/index.js +25 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/esm/SWCombine.js +116 -0
- package/dist/esm/SWCombine.js.map +1 -0
- package/dist/esm/auth/OAuthClient.js +188 -0
- package/dist/esm/auth/OAuthClient.js.map +1 -0
- package/dist/esm/auth/TokenManager.js +135 -0
- package/dist/esm/auth/TokenManager.js.map +1 -0
- package/dist/esm/auth/permissions.js +275 -0
- package/dist/esm/auth/permissions.js.map +1 -0
- package/dist/esm/auth/scopes.js +274 -0
- package/dist/esm/auth/scopes.js.map +1 -0
- package/dist/esm/http/HttpClient.js +209 -0
- package/dist/esm/http/HttpClient.js.map +1 -0
- package/dist/esm/http/errors.js +152 -0
- package/dist/esm/http/errors.js.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/resources/ApiResource.js +40 -0
- package/dist/esm/resources/ApiResource.js.map +1 -0
- package/dist/esm/resources/BaseResource.js +29 -0
- package/dist/esm/resources/BaseResource.js.map +1 -0
- package/dist/esm/resources/CharacterResource.js +168 -0
- package/dist/esm/resources/CharacterResource.js.map +1 -0
- package/dist/esm/resources/DatacardResource.js +38 -0
- package/dist/esm/resources/DatacardResource.js.map +1 -0
- package/dist/esm/resources/EventsResource.js +38 -0
- package/dist/esm/resources/EventsResource.js.map +1 -0
- package/dist/esm/resources/FactionResource.js +153 -0
- package/dist/esm/resources/FactionResource.js.map +1 -0
- package/dist/esm/resources/GalaxyResource.js +175 -0
- package/dist/esm/resources/GalaxyResource.js.map +1 -0
- package/dist/esm/resources/InventoryResource.js +90 -0
- package/dist/esm/resources/InventoryResource.js.map +1 -0
- package/dist/esm/resources/LocationResource.js +16 -0
- package/dist/esm/resources/LocationResource.js.map +1 -0
- package/dist/esm/resources/MarketResource.js +39 -0
- package/dist/esm/resources/MarketResource.js.map +1 -0
- package/dist/esm/resources/NewsResource.js +103 -0
- package/dist/esm/resources/NewsResource.js.map +1 -0
- package/dist/esm/resources/TypesResource.js +69 -0
- package/dist/esm/resources/TypesResource.js.map +1 -0
- package/dist/esm/types/index.js +22 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/types/SWCombine.d.ts +66 -0
- package/dist/types/SWCombine.d.ts.map +1 -0
- package/dist/types/auth/OAuthClient.d.ts +48 -0
- package/dist/types/auth/OAuthClient.d.ts.map +1 -0
- package/dist/types/auth/TokenManager.d.ts +66 -0
- package/dist/types/auth/TokenManager.d.ts.map +1 -0
- package/dist/types/auth/permissions.d.ts +173 -0
- package/dist/types/auth/permissions.d.ts.map +1 -0
- package/dist/types/auth/scopes.d.ts +309 -0
- package/dist/types/auth/scopes.d.ts.map +1 -0
- package/dist/types/http/HttpClient.d.ts +64 -0
- package/dist/types/http/HttpClient.d.ts.map +1 -0
- package/dist/types/http/errors.d.ts +54 -0
- package/dist/types/http/errors.d.ts.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/resources/ApiResource.d.ts +56 -0
- package/dist/types/resources/ApiResource.d.ts.map +1 -0
- package/dist/types/resources/BaseResource.d.ts +16 -0
- package/dist/types/resources/BaseResource.d.ts.map +1 -0
- package/dist/types/resources/CharacterResource.d.ts +151 -0
- package/dist/types/resources/CharacterResource.d.ts.map +1 -0
- package/dist/types/resources/DatacardResource.d.ts +42 -0
- package/dist/types/resources/DatacardResource.d.ts.map +1 -0
- package/dist/types/resources/EventsResource.d.ts +34 -0
- package/dist/types/resources/EventsResource.d.ts.map +1 -0
- package/dist/types/resources/FactionResource.d.ts +166 -0
- package/dist/types/resources/FactionResource.d.ts.map +1 -0
- package/dist/types/resources/GalaxyResource.d.ts +134 -0
- package/dist/types/resources/GalaxyResource.d.ts.map +1 -0
- package/dist/types/resources/InventoryResource.d.ts +77 -0
- package/dist/types/resources/InventoryResource.d.ts.map +1 -0
- package/dist/types/resources/LocationResource.d.ts +18 -0
- package/dist/types/resources/LocationResource.d.ts.map +1 -0
- package/dist/types/resources/MarketResource.d.ts +34 -0
- package/dist/types/resources/MarketResource.d.ts.map +1 -0
- package/dist/types/resources/NewsResource.d.ts +54 -0
- package/dist/types/resources/NewsResource.d.ts.map +1 -0
- package/dist/types/resources/TypesResource.d.ts +72 -0
- package/dist/types/resources/TypesResource.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +296 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP client for making requests to SW Combine API
|
|
3
|
+
*/
|
|
4
|
+
import axios from 'axios';
|
|
5
|
+
import { SWCError } from './errors.js';
|
|
6
|
+
/**
|
|
7
|
+
* HTTP client that handles requests, retries, and token refresh
|
|
8
|
+
*/
|
|
9
|
+
export class HttpClient {
|
|
10
|
+
constructor(options, tokenManager) {
|
|
11
|
+
this.tokenManager = tokenManager;
|
|
12
|
+
this.maxRetries = options.maxRetries ?? 3;
|
|
13
|
+
this.retryDelay = options.retryDelay ?? 1000;
|
|
14
|
+
this.debug = options.debug ?? false;
|
|
15
|
+
// Create axios instance
|
|
16
|
+
this.axios = axios.create({
|
|
17
|
+
baseURL: options.baseURL ?? 'https://www.swcombine.com/ws/v2.0/',
|
|
18
|
+
timeout: options.timeout ?? 30000,
|
|
19
|
+
headers: {
|
|
20
|
+
'Accept': 'application/json',
|
|
21
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
// Set up interceptors
|
|
25
|
+
this.setupRequestInterceptor();
|
|
26
|
+
this.setupResponseInterceptor();
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Set up request interceptor to add auth token
|
|
30
|
+
*/
|
|
31
|
+
setupRequestInterceptor() {
|
|
32
|
+
this.axios.interceptors.request.use(async (config) => {
|
|
33
|
+
// Add access token if available
|
|
34
|
+
if (this.tokenManager) {
|
|
35
|
+
try {
|
|
36
|
+
const token = await this.tokenManager.getAccessToken();
|
|
37
|
+
if (token) {
|
|
38
|
+
// Try query parameter method instead of header
|
|
39
|
+
// SW Combine API docs say: "Access tokens are sent to a Resource in the HTTP
|
|
40
|
+
// Authorization header, or as a query string parameter"
|
|
41
|
+
config.params = config.params || {};
|
|
42
|
+
config.params.access_token = token;
|
|
43
|
+
if (this.debug) {
|
|
44
|
+
console.log(`[SWC SDK] Added auth token as query param: ${token.substring(0, 20)}...`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
if (this.debug) {
|
|
49
|
+
console.log(`[SWC SDK] No token available from TokenManager`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch (error) {
|
|
54
|
+
if (this.debug) {
|
|
55
|
+
console.log(`[SWC SDK] Error getting token: ${error.message}`);
|
|
56
|
+
}
|
|
57
|
+
// Don't fail the request, just proceed without token
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (this.debug) {
|
|
61
|
+
console.log(`[SWC SDK] ${config.method?.toUpperCase()} ${config.url}`);
|
|
62
|
+
console.log(`[SWC SDK] Query params:`, config.params);
|
|
63
|
+
}
|
|
64
|
+
return config;
|
|
65
|
+
}, (error) => {
|
|
66
|
+
return Promise.reject(error);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Set up response interceptor to handle errors and retries
|
|
71
|
+
*/
|
|
72
|
+
setupResponseInterceptor() {
|
|
73
|
+
this.axios.interceptors.response.use((response) => {
|
|
74
|
+
// Extract data from swcapi wrapper if present
|
|
75
|
+
if (response.data && typeof response.data === 'object' && 'swcapi' in response.data) {
|
|
76
|
+
const swcapiData = response.data.swcapi;
|
|
77
|
+
// Get the first key's value (e.g., swcapi.character -> character data)
|
|
78
|
+
const keys = Object.keys(swcapiData);
|
|
79
|
+
if (keys.length === 1) {
|
|
80
|
+
response.data = swcapiData[keys[0]];
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// If multiple keys or no keys, return the swcapi object itself
|
|
84
|
+
response.data = swcapiData;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return response;
|
|
88
|
+
}, async (error) => {
|
|
89
|
+
const config = error.config;
|
|
90
|
+
// Handle 401 - attempt token refresh
|
|
91
|
+
if (error.response?.status === 401 && this.tokenManager) {
|
|
92
|
+
try {
|
|
93
|
+
await this.tokenManager.refreshToken();
|
|
94
|
+
// Retry the request with new token
|
|
95
|
+
return this.axios.request(config);
|
|
96
|
+
}
|
|
97
|
+
catch (refreshError) {
|
|
98
|
+
// Token refresh failed, throw auth error
|
|
99
|
+
throw SWCError.fromHttpResponse(401, error.response?.data, error.response?.headers['x-request-id']);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Handle retryable errors
|
|
103
|
+
if (this.shouldRetry(error, config._retryCount ?? 0)) {
|
|
104
|
+
config._retryCount = (config._retryCount ?? 0) + 1;
|
|
105
|
+
// Wait before retrying (exponential backoff)
|
|
106
|
+
const delay = this.retryDelay * Math.pow(2, config._retryCount - 1);
|
|
107
|
+
await this.sleep(delay);
|
|
108
|
+
if (this.debug) {
|
|
109
|
+
console.log(`[SWC SDK] Retrying request (attempt ${config._retryCount}/${this.maxRetries})`);
|
|
110
|
+
}
|
|
111
|
+
return this.axios.request(config);
|
|
112
|
+
}
|
|
113
|
+
// Convert to SWCError
|
|
114
|
+
if (error.response) {
|
|
115
|
+
throw SWCError.fromHttpResponse(error.response.status, error.response.data, error.response.headers['x-request-id']);
|
|
116
|
+
}
|
|
117
|
+
else if (error.request) {
|
|
118
|
+
throw SWCError.fromNetworkError(error);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
throw new SWCError(error.message, {
|
|
122
|
+
type: 'unknown',
|
|
123
|
+
cause: error,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Determine if a request should be retried
|
|
130
|
+
*/
|
|
131
|
+
shouldRetry(error, retryCount) {
|
|
132
|
+
// Don't retry if we've exceeded max retries
|
|
133
|
+
if (retryCount >= this.maxRetries) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
// Network errors are retryable
|
|
137
|
+
if (!error.response) {
|
|
138
|
+
return true;
|
|
139
|
+
}
|
|
140
|
+
const status = error.response.status;
|
|
141
|
+
const responseData = error.response.data;
|
|
142
|
+
// Check if HTTP 400 is actually a rate limit error
|
|
143
|
+
const isRateLimitError = status === 400 &&
|
|
144
|
+
(responseData?.error === 'rate_limit_exceeded' ||
|
|
145
|
+
responseData?.message?.toLowerCase().includes('rate limit') ||
|
|
146
|
+
responseData?.error_description?.toLowerCase().includes('rate limit'));
|
|
147
|
+
// Retry rate limit errors (429 or 400 with rate limit content)
|
|
148
|
+
if (status === 429 || isRateLimitError) {
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
// Don't retry other 4xx errors
|
|
152
|
+
if (status >= 400 && status < 500) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
// Retry 5xx server errors
|
|
156
|
+
if (status >= 500) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Sleep for specified milliseconds
|
|
163
|
+
*/
|
|
164
|
+
sleep(ms) {
|
|
165
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Make a GET request
|
|
169
|
+
*/
|
|
170
|
+
async get(url, config) {
|
|
171
|
+
const response = await this.axios.get(url, config);
|
|
172
|
+
return response.data;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Make a POST request
|
|
176
|
+
*/
|
|
177
|
+
async post(url, data, config) {
|
|
178
|
+
const response = await this.axios.post(url, data, config);
|
|
179
|
+
return response.data;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Make a PUT request
|
|
183
|
+
*/
|
|
184
|
+
async put(url, data, config) {
|
|
185
|
+
const response = await this.axios.put(url, data, config);
|
|
186
|
+
return response.data;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Make a DELETE request
|
|
190
|
+
*/
|
|
191
|
+
async delete(url, config) {
|
|
192
|
+
const response = await this.axios.delete(url, config);
|
|
193
|
+
return response.data;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Make a custom request
|
|
197
|
+
*/
|
|
198
|
+
async request(config) {
|
|
199
|
+
const response = await this.axios.request(config);
|
|
200
|
+
return response.data;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Set token manager (useful for late initialization)
|
|
204
|
+
*/
|
|
205
|
+
setTokenManager(tokenManager) {
|
|
206
|
+
this.tokenManager = tokenManager;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=HttpClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpClient.js","sourceRoot":"","sources":["../../../src/http/HttpClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error handling for SW Combine SDK
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Custom error class for SW Combine API errors
|
|
6
|
+
*/
|
|
7
|
+
export class SWCError extends Error {
|
|
8
|
+
constructor(message, options) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'SWCError';
|
|
11
|
+
this.type = options.type;
|
|
12
|
+
this.statusCode = options.statusCode;
|
|
13
|
+
this.requestId = options.requestId;
|
|
14
|
+
this.response = options.response;
|
|
15
|
+
this.retryable = options.retryable ?? this.determineRetryable(options.type, options.statusCode);
|
|
16
|
+
this.retryAfter = options.retryAfter;
|
|
17
|
+
this.cause = options.cause;
|
|
18
|
+
// Maintains proper stack trace for where our error was thrown (only available on V8)
|
|
19
|
+
if (Error.captureStackTrace) {
|
|
20
|
+
Error.captureStackTrace(this, SWCError);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Determine if an error is retryable based on type and status code
|
|
25
|
+
*/
|
|
26
|
+
determineRetryable(type, statusCode) {
|
|
27
|
+
// Network errors are always retryable
|
|
28
|
+
if (type === 'network') {
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
// Server errors (5xx) are retryable
|
|
32
|
+
if (type === 'server' || (statusCode && statusCode >= 500 && statusCode < 600)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Rate limit errors are technically retryable (with backoff)
|
|
36
|
+
if (type === 'rate_limit') {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
// Everything else is not retryable
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create an error from an HTTP status code and response
|
|
44
|
+
*/
|
|
45
|
+
static fromHttpResponse(statusCode, response, requestId) {
|
|
46
|
+
let type;
|
|
47
|
+
let message;
|
|
48
|
+
// Check if this is a rate limit error (SW Combine uses HTTP 400 for rate limiting)
|
|
49
|
+
const isRateLimitError = statusCode === 400 &&
|
|
50
|
+
(response?.error === 'rate_limit_exceeded' ||
|
|
51
|
+
response?.message?.toLowerCase().includes('rate limit') ||
|
|
52
|
+
response?.error_description?.toLowerCase().includes('rate limit'));
|
|
53
|
+
// Determine error type from status code and content
|
|
54
|
+
if (isRateLimitError) {
|
|
55
|
+
type = 'rate_limit';
|
|
56
|
+
message = 'Rate limit exceeded. Please wait before making more requests.';
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
switch (statusCode) {
|
|
60
|
+
case 401:
|
|
61
|
+
type = 'auth';
|
|
62
|
+
message = 'Authentication failed. Check your credentials or token.';
|
|
63
|
+
break;
|
|
64
|
+
case 403:
|
|
65
|
+
type = 'auth';
|
|
66
|
+
message = 'Forbidden. You do not have permission to access this resource.';
|
|
67
|
+
break;
|
|
68
|
+
case 404:
|
|
69
|
+
type = 'not_found';
|
|
70
|
+
message = 'Resource not found.';
|
|
71
|
+
break;
|
|
72
|
+
case 400:
|
|
73
|
+
case 422:
|
|
74
|
+
type = 'validation';
|
|
75
|
+
message = 'Invalid request parameters.';
|
|
76
|
+
break;
|
|
77
|
+
case 429:
|
|
78
|
+
type = 'rate_limit';
|
|
79
|
+
message = 'Rate limit exceeded. Please wait before making more requests.';
|
|
80
|
+
break;
|
|
81
|
+
default:
|
|
82
|
+
if (statusCode >= 500) {
|
|
83
|
+
type = 'server';
|
|
84
|
+
message = 'Server error occurred. Please try again later.';
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
type = 'unknown';
|
|
88
|
+
message = 'An unknown error occurred.';
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
// Use error message from response if available
|
|
93
|
+
if (response?.error_description) {
|
|
94
|
+
message = response.error_description;
|
|
95
|
+
}
|
|
96
|
+
else if (response?.message) {
|
|
97
|
+
message = response.message;
|
|
98
|
+
}
|
|
99
|
+
else if (response?.error) {
|
|
100
|
+
message = typeof response.error === 'string' ? response.error : message;
|
|
101
|
+
}
|
|
102
|
+
// Extract retry-after header for rate limit errors
|
|
103
|
+
const retryAfter = type === 'rate_limit' ? response?.retry_after : undefined;
|
|
104
|
+
return new SWCError(message, {
|
|
105
|
+
type,
|
|
106
|
+
statusCode,
|
|
107
|
+
requestId,
|
|
108
|
+
response,
|
|
109
|
+
retryAfter,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create an error from a network failure
|
|
114
|
+
*/
|
|
115
|
+
static fromNetworkError(error) {
|
|
116
|
+
return new SWCError(`Network error: ${error.message}`, {
|
|
117
|
+
type: 'network',
|
|
118
|
+
retryable: true,
|
|
119
|
+
cause: error,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Check if an error is a SWCError
|
|
124
|
+
*/
|
|
125
|
+
static isSWCError(error) {
|
|
126
|
+
return error instanceof SWCError;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get a user-friendly error message
|
|
130
|
+
*/
|
|
131
|
+
toUserFriendlyMessage() {
|
|
132
|
+
switch (this.type) {
|
|
133
|
+
case 'auth':
|
|
134
|
+
return 'Authentication failed. Please check your credentials and try again.';
|
|
135
|
+
case 'rate_limit':
|
|
136
|
+
return this.retryAfter
|
|
137
|
+
? `Rate limit exceeded. Please wait ${this.retryAfter} seconds before trying again.`
|
|
138
|
+
: 'Rate limit exceeded. Please wait before making more requests.';
|
|
139
|
+
case 'not_found':
|
|
140
|
+
return 'The requested resource was not found.';
|
|
141
|
+
case 'validation':
|
|
142
|
+
return 'Invalid request. Please check your parameters and try again.';
|
|
143
|
+
case 'server':
|
|
144
|
+
return 'A server error occurred. Please try again later.';
|
|
145
|
+
case 'network':
|
|
146
|
+
return 'Network connection failed. Please check your internet connection and try again.';
|
|
147
|
+
default:
|
|
148
|
+
return 'An unexpected error occurred. Please try again.';
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/http/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SW Combine SDK for Node.js
|
|
3
|
+
* Main entry point
|
|
4
|
+
*/
|
|
5
|
+
// Main client
|
|
6
|
+
export { SWCombine } from './SWCombine.js';
|
|
7
|
+
// Error handling
|
|
8
|
+
export { SWCError } from './http/errors.js';
|
|
9
|
+
// Types
|
|
10
|
+
export * from './types/index.js';
|
|
11
|
+
// OAuth permissions
|
|
12
|
+
export * from './auth/permissions.js';
|
|
13
|
+
// OAuth scopes
|
|
14
|
+
export { Scopes, CharacterScopes, MessageScopes, PersonalInventoryScopes, FactionScopes, FactionInventoryScopes, getAllScopes, getAllCharacterScopes, getAllMessageScopes, getAllPersonalInventoryScopes, getAllFactionScopes, getAllFactionInventoryScopes, getReadOnlyScopes, getMinimalScopes, } from './auth/scopes.js';
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc;AACd,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,iBAAiB;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,QAAQ;AACR,cAAc,kBAAkB,CAAC;AAEjC,oBAAoB;AACpB,cAAc,uBAAuB,CAAC;AAEtC,eAAe;AACf,OAAO,EACL,MAAM,EACN,eAAe,EACf,aAAa,EACb,uBAAuB,EACvB,aAAa,EACb,sBAAsB,EACtB,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,6BAA6B,EAC7B,mBAAmB,EACnB,4BAA4B,EAC5B,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API utility endpoints
|
|
3
|
+
*/
|
|
4
|
+
import { BaseResource } from './BaseResource.js';
|
|
5
|
+
/**
|
|
6
|
+
* API resource for utility endpoints
|
|
7
|
+
*/
|
|
8
|
+
export class ApiResource extends BaseResource {
|
|
9
|
+
/**
|
|
10
|
+
* Print a HelloWorld message
|
|
11
|
+
*/
|
|
12
|
+
async helloWorld() {
|
|
13
|
+
return this.request('GET', '/api/helloworld');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Print a HelloWorld message for authorized clients
|
|
17
|
+
*/
|
|
18
|
+
async helloAuth() {
|
|
19
|
+
return this.request('GET', '/api/helloauth');
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get list of available web services permissions
|
|
23
|
+
*/
|
|
24
|
+
async permissions() {
|
|
25
|
+
return this.request('GET', '/api/permissions');
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Get current rate limit status
|
|
29
|
+
*/
|
|
30
|
+
async rateLimits() {
|
|
31
|
+
return this.request('GET', '/api/ratelimits');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get current time or convert times
|
|
35
|
+
*/
|
|
36
|
+
async time() {
|
|
37
|
+
return this.request('GET', '/api/time');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=ApiResource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApiResource.js","sourceRoot":"","sources":["../../../src/resources/ApiResource.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAiCjD;;GAEG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IAC3C;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAqB,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS;QACb,OAAO,IAAI,CAAC,OAAO,CAAoB,KAAK,EAAE,gBAAgB,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAe,KAAK,EAAE,kBAAkB,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,IAAI,CAAC,OAAO,CAAgB,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAC,OAAO,CAAe,KAAK,EAAE,WAAW,CAAC,CAAC;IACxD,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base class for all API resources
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Base resource class that all API resources extend
|
|
6
|
+
*/
|
|
7
|
+
export class BaseResource {
|
|
8
|
+
constructor(http) {
|
|
9
|
+
this.http = http;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Make a request to the API
|
|
13
|
+
*/
|
|
14
|
+
async request(method, path, data) {
|
|
15
|
+
switch (method.toUpperCase()) {
|
|
16
|
+
case 'GET':
|
|
17
|
+
return this.http.get(path);
|
|
18
|
+
case 'POST':
|
|
19
|
+
return this.http.post(path, data);
|
|
20
|
+
case 'PUT':
|
|
21
|
+
return this.http.put(path, data);
|
|
22
|
+
case 'DELETE':
|
|
23
|
+
return this.http.delete(path);
|
|
24
|
+
default:
|
|
25
|
+
throw new Error(`Unsupported HTTP method: ${method}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=BaseResource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseResource.js","sourceRoot":"","sources":["../../../src/resources/BaseResource.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,OAAgB,YAAY;IAGhC,YAAY,IAAgB;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACrE,QAAQ,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,CAAC,CAAC;YAChC,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC;YACvC,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAI,IAAI,EAAE,IAAI,CAAC,CAAC;YACtC,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAI,IAAI,CAAC,CAAC;YACnC;gBACE,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Character resource for accessing character data
|
|
3
|
+
*/
|
|
4
|
+
import { BaseResource } from './BaseResource.js';
|
|
5
|
+
/**
|
|
6
|
+
* Character messages resource
|
|
7
|
+
*/
|
|
8
|
+
export class CharacterMessagesResource extends BaseResource {
|
|
9
|
+
/**
|
|
10
|
+
* List messages sent or received by character (paginated)
|
|
11
|
+
* @param options - Character UID, message mode, and optional pagination parameters
|
|
12
|
+
* @example
|
|
13
|
+
* const messages = await client.character.messages.list({ uid: '1:12345', mode: 'received' });
|
|
14
|
+
* const moreMessages = await client.character.messages.list({ uid: '1:12345', mode: 'received', start_index: 51, item_count: 50 });
|
|
15
|
+
*/
|
|
16
|
+
async list(options) {
|
|
17
|
+
const params = {
|
|
18
|
+
start_index: options.start_index || 1,
|
|
19
|
+
item_count: options.item_count || 50,
|
|
20
|
+
};
|
|
21
|
+
return this.http.get(`/character/${options.uid}/messages/${options.mode}`, { params });
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a specific message
|
|
25
|
+
*/
|
|
26
|
+
async get(options) {
|
|
27
|
+
return this.request('GET', `/character/${options.uid}/messages/${options.messageId}`);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Delete a message
|
|
31
|
+
*/
|
|
32
|
+
async delete(options) {
|
|
33
|
+
return this.request('DELETE', `/character/${options.uid}/messages/${options.messageId}`);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Send a message
|
|
37
|
+
*/
|
|
38
|
+
async create(options) {
|
|
39
|
+
return this.request('PUT', `/character/${options.uid}/messages/sent`, {
|
|
40
|
+
recipient: options.recipient,
|
|
41
|
+
subject: options.subject,
|
|
42
|
+
body: options.body,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Character skills resource
|
|
48
|
+
*/
|
|
49
|
+
export class CharacterSkillsResource extends BaseResource {
|
|
50
|
+
/**
|
|
51
|
+
* Get character's skills
|
|
52
|
+
*/
|
|
53
|
+
async list(options) {
|
|
54
|
+
return this.request('GET', `/character/${options.uid}/skills`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Character privileges resource
|
|
59
|
+
*/
|
|
60
|
+
export class CharacterPrivilegesResource extends BaseResource {
|
|
61
|
+
/**
|
|
62
|
+
* Get character's privileges
|
|
63
|
+
*/
|
|
64
|
+
async list(options) {
|
|
65
|
+
return this.request('GET', `/character/${options.uid}/privileges`);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get or update a specific privilege
|
|
69
|
+
*/
|
|
70
|
+
async get(options) {
|
|
71
|
+
return this.request('GET', `/character/${options.uid}/privileges/${options.privilegeGroup}/${options.privilege}`);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Update a specific privilege
|
|
75
|
+
*/
|
|
76
|
+
async update(options) {
|
|
77
|
+
return this.request('POST', `/character/${options.uid}/privileges/${options.privilegeGroup}/${options.privilege}`, { value: options.value });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Character credits resource
|
|
82
|
+
*/
|
|
83
|
+
export class CharacterCreditsResource extends BaseResource {
|
|
84
|
+
/**
|
|
85
|
+
* Get character's credits
|
|
86
|
+
*/
|
|
87
|
+
async get(options) {
|
|
88
|
+
return this.request('GET', `/character/${options.uid}/credits`);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Update character's credits (transfer)
|
|
92
|
+
*/
|
|
93
|
+
async update(options) {
|
|
94
|
+
return this.request('POST', `/character/${options.uid}/credits`, {
|
|
95
|
+
amount: options.amount,
|
|
96
|
+
recipient: options.recipient,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Character credit log resource
|
|
102
|
+
*/
|
|
103
|
+
export class CharacterCreditlogResource extends BaseResource {
|
|
104
|
+
/**
|
|
105
|
+
* Get character's credit log (paginated)
|
|
106
|
+
* @param options - Character UID and optional pagination/filtering parameters
|
|
107
|
+
* @example
|
|
108
|
+
* const creditlog = await client.character.creditlog.list({ uid: '1:12345' });
|
|
109
|
+
* const moreLogs = await client.character.creditlog.list({ uid: '1:12345', start_index: 51, item_count: 100 });
|
|
110
|
+
* const oldestLogs = await client.character.creditlog.list({ uid: '1:12345', start_id: 1 });
|
|
111
|
+
*/
|
|
112
|
+
async list(options) {
|
|
113
|
+
const params = {
|
|
114
|
+
start_index: options.start_index || 1,
|
|
115
|
+
item_count: options.item_count || 50,
|
|
116
|
+
};
|
|
117
|
+
if (options.start_id !== undefined) {
|
|
118
|
+
params.start_id = options.start_id;
|
|
119
|
+
}
|
|
120
|
+
return this.http.get(`/character/${options.uid}/creditlog`, { params });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Character permissions resource
|
|
125
|
+
*/
|
|
126
|
+
export class CharacterPermissionsResource extends BaseResource {
|
|
127
|
+
/**
|
|
128
|
+
* Get permissions granted to API client for this character
|
|
129
|
+
*/
|
|
130
|
+
async list(options) {
|
|
131
|
+
return this.request('GET', `/character/${options.uid}/permissions`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Character resource for managing characters
|
|
136
|
+
*/
|
|
137
|
+
export class CharacterResource extends BaseResource {
|
|
138
|
+
constructor(http) {
|
|
139
|
+
super(http);
|
|
140
|
+
this.messages = new CharacterMessagesResource(http);
|
|
141
|
+
this.skills = new CharacterSkillsResource(http);
|
|
142
|
+
this.privileges = new CharacterPrivilegesResource(http);
|
|
143
|
+
this.credits = new CharacterCreditsResource(http);
|
|
144
|
+
this.creditlog = new CharacterCreditlogResource(http);
|
|
145
|
+
this.permissions = new CharacterPermissionsResource(http);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get the currently authenticated user's character
|
|
149
|
+
* Requires authentication
|
|
150
|
+
* @returns The authenticated character's full profile
|
|
151
|
+
*/
|
|
152
|
+
async me() {
|
|
153
|
+
return this.request('GET', '/character/');
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get character by UID
|
|
157
|
+
*/
|
|
158
|
+
async get(options) {
|
|
159
|
+
return this.request('GET', `/character/${options.uid}`);
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get character UID by handle (username)
|
|
163
|
+
*/
|
|
164
|
+
async getByHandle(options) {
|
|
165
|
+
return this.request('GET', `/character/handlecheck/${options.handle}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=CharacterResource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CharacterResource.js","sourceRoot":"","sources":["../../../src/resources/CharacterResource.ts"],"names":[],"mappings":"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"}
|