@pioneer-platform/markets 8.41.0 → 8.45.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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +51 -0
- package/lib/api-metrics-reporter.d.ts +2 -1
- package/lib/api-metrics-reporter.js +49 -81
- package/lib/index.js +34 -113
- package/lib/metrics-logger.d.ts +1 -2
- package/lib/metrics-logger.js +1 -0
- package/lib/token-bucket-manager.d.ts +1 -2
- package/lib/token-bucket-manager.js +1 -0
- package/lib/token-bucket.d.ts +1 -2
- package/lib/token-bucket.js +1 -0
- package/package.json +5 -5
- package/tsconfig.json +10 -3
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
2
|
|
|
3
|
-
> @pioneer-platform/markets@8.
|
|
3
|
+
> @pioneer-platform/markets@8.45.1 build /Users/highlander/WebstormProjects/keepkey-stack/projects/pioneer/modules/intergrations/markets
|
|
4
4
|
> tsc -p .
|
|
5
5
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,56 @@
|
|
|
1
1
|
# @pioneer-platform/markets
|
|
2
2
|
|
|
3
|
+
## 8.45.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- fix(cache-worker): fix balance module import and initialization
|
|
8
|
+
- Updated dependencies
|
|
9
|
+
- @pioneer-platform/pioneer-discovery@8.45.1
|
|
10
|
+
|
|
11
|
+
## 8.45.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- feat: remove Discord dependency and alerts integration
|
|
16
|
+
- Eliminated dependency on @pioneer-platform/pioneer-server/services/discord-notifier.service
|
|
17
|
+
- Replaced Discord alerts with console logging for rate limits and metrics
|
|
18
|
+
- Disabled automatic hourly metrics reporting (metrics still collected and available via API)
|
|
19
|
+
- Reduced external dependencies and improved module standalone compatibility
|
|
20
|
+
|
|
21
|
+
## 8.44.0
|
|
22
|
+
|
|
23
|
+
### Minor Changes
|
|
24
|
+
|
|
25
|
+
- chore: feat(e2e): add blue API support to swap roundtrip tests
|
|
26
|
+
|
|
27
|
+
### Patch Changes
|
|
28
|
+
|
|
29
|
+
- Updated dependencies
|
|
30
|
+
- @pioneer-platform/pioneer-discovery@8.44.0
|
|
31
|
+
|
|
32
|
+
## 8.43.0
|
|
33
|
+
|
|
34
|
+
### Minor Changes
|
|
35
|
+
|
|
36
|
+
- feat(e2e): add blue API support to swap roundtrip tests
|
|
37
|
+
|
|
38
|
+
### Patch Changes
|
|
39
|
+
|
|
40
|
+
- Updated dependencies
|
|
41
|
+
- @pioneer-platform/pioneer-discovery@8.43.0
|
|
42
|
+
|
|
43
|
+
## 8.42.0
|
|
44
|
+
|
|
45
|
+
### Minor Changes
|
|
46
|
+
|
|
47
|
+
- feat(swaps): make GetPendingSwap idempotent with auto-backfill
|
|
48
|
+
|
|
49
|
+
### Patch Changes
|
|
50
|
+
|
|
51
|
+
- Updated dependencies
|
|
52
|
+
- @pioneer-platform/pioneer-discovery@8.42.0
|
|
53
|
+
|
|
3
54
|
## 8.41.0
|
|
4
55
|
|
|
5
56
|
### Minor Changes
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generate and
|
|
2
|
+
* Generate and log hourly metrics report
|
|
3
3
|
*/
|
|
4
4
|
export declare function sendHourlyMetricsReport(): Promise<void>;
|
|
5
5
|
/**
|
|
@@ -16,5 +16,6 @@ export declare function getUnpriceableTokens(limit?: number): Promise<string[]>;
|
|
|
16
16
|
export declare function clearUnpriceableToken(caip: string): Promise<boolean>;
|
|
17
17
|
/**
|
|
18
18
|
* Start hourly reporting (call this on module initialization)
|
|
19
|
+
* Note: This function is kept for backwards compatibility but no longer starts automatic reporting
|
|
19
20
|
*/
|
|
20
21
|
export declare function startHourlyReporting(): void;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
/*
|
|
3
3
|
API Metrics Reporter
|
|
4
4
|
|
|
5
|
-
Collects and reports API usage metrics
|
|
6
|
-
|
|
5
|
+
Collects and reports API usage metrics via logging
|
|
6
|
+
Tracks pricing API health and usage
|
|
7
7
|
*/
|
|
8
8
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
9
9
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
@@ -51,9 +51,8 @@ var log = require('@pioneer-platform/loggerdog')();
|
|
|
51
51
|
var redis = require('@pioneer-platform/default-redis').redis;
|
|
52
52
|
var axios = require('axios');
|
|
53
53
|
var TAG = ' | api-metrics-reporter | ';
|
|
54
|
-
//
|
|
55
|
-
var
|
|
56
|
-
var ALERTS_ENABLED = process.env.ALERTS_ENABLED !== 'false';
|
|
54
|
+
// Metrics logging (Discord integration removed)
|
|
55
|
+
var METRICS_ENABLED = process.env.METRICS_ENABLED !== 'false';
|
|
57
56
|
// Redis keys
|
|
58
57
|
var REDIS_API_METRICS_KEY = 'markets:api_metrics';
|
|
59
58
|
var REDIS_UNPRICEABLE_SET = 'markets:unpriceable_tokens';
|
|
@@ -80,58 +79,40 @@ function getHealthEmoji(successRate) {
|
|
|
80
79
|
return '🔴';
|
|
81
80
|
}
|
|
82
81
|
/**
|
|
83
|
-
*
|
|
82
|
+
* Log metrics report to console
|
|
84
83
|
*/
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
title: title,
|
|
104
|
-
message: message,
|
|
105
|
-
timestamp: new Date().toISOString()
|
|
106
|
-
}, {
|
|
107
|
-
timeout: 5000
|
|
108
|
-
})];
|
|
109
|
-
case 2:
|
|
110
|
-
_a.sent();
|
|
111
|
-
log.info(tag, "Sent Discord alert: ".concat(title));
|
|
112
|
-
return [3 /*break*/, 4];
|
|
113
|
-
case 3:
|
|
114
|
-
error_1 = _a.sent();
|
|
115
|
-
log.error(tag, "Failed to send Discord alert: ".concat(error_1.message));
|
|
116
|
-
return [3 /*break*/, 4];
|
|
117
|
-
case 4: return [2 /*return*/];
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
});
|
|
84
|
+
function logMetricsReport(title, message, level) {
|
|
85
|
+
if (level === void 0) { level = 'info'; }
|
|
86
|
+
var tag = TAG + 'logMetricsReport | ';
|
|
87
|
+
if (!METRICS_ENABLED) {
|
|
88
|
+
log.debug(tag, 'Metrics logging disabled');
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Log the report based on level
|
|
92
|
+
switch (level) {
|
|
93
|
+
case 'error':
|
|
94
|
+
log.error(tag, "".concat(title, ": ").concat(message));
|
|
95
|
+
break;
|
|
96
|
+
case 'warn':
|
|
97
|
+
log.warn(tag, "".concat(title, ": ").concat(message));
|
|
98
|
+
break;
|
|
99
|
+
default:
|
|
100
|
+
log.info(tag, "".concat(title, ": ").concat(message));
|
|
101
|
+
}
|
|
121
102
|
}
|
|
122
103
|
/**
|
|
123
|
-
* Generate and
|
|
104
|
+
* Generate and log hourly metrics report
|
|
124
105
|
*/
|
|
125
106
|
function sendHourlyMetricsReport() {
|
|
126
107
|
return __awaiter(this, void 0, void 0, function () {
|
|
127
|
-
var tag, lastReport, now, timeSinceLastReport, oneHour, metricsData, metrics, unpriceableCount, totalSuccess, totalFailures, criticalErrors, apiReport, _i, _a, _b, api, stats, success, failures, total, rate, totalRate, reportMessage, _c, apiReport_1, api, _d, criticalErrors_1, error, level,
|
|
108
|
+
var tag, lastReport, now, timeSinceLastReport, oneHour, metricsData, metrics, unpriceableCount, totalSuccess, totalFailures, criticalErrors, apiReport, _i, _a, _b, api, stats, success, failures, total, rate, totalRate, reportMessage, _c, apiReport_1, api, _d, criticalErrors_1, error, level, error_1;
|
|
128
109
|
return __generator(this, function (_e) {
|
|
129
110
|
switch (_e.label) {
|
|
130
111
|
case 0:
|
|
131
112
|
tag = TAG + 'sendHourlyMetricsReport | ';
|
|
132
113
|
_e.label = 1;
|
|
133
114
|
case 1:
|
|
134
|
-
_e.trys.push([1,
|
|
115
|
+
_e.trys.push([1, 7, , 8]);
|
|
135
116
|
return [4 /*yield*/, redis.get(REDIS_LAST_REPORT_KEY)];
|
|
136
117
|
case 2:
|
|
137
118
|
lastReport = _e.sent();
|
|
@@ -215,28 +196,25 @@ function sendHourlyMetricsReport() {
|
|
|
215
196
|
reportMessage += "".concat(unpriceableCount, " tokens marked as unpriceable (likely scam/spam)\n");
|
|
216
197
|
}
|
|
217
198
|
level = criticalErrors.length > 0 ? 'warn' : 'info';
|
|
218
|
-
//
|
|
219
|
-
|
|
220
|
-
case 5:
|
|
221
|
-
// Send to Discord
|
|
222
|
-
_e.sent();
|
|
199
|
+
// Log metrics report
|
|
200
|
+
logMetricsReport("Pricing API Metrics - ".concat(new Date().toLocaleString()), reportMessage, level);
|
|
223
201
|
// Update last report timestamp
|
|
224
202
|
return [4 /*yield*/, redis.set(REDIS_LAST_REPORT_KEY, now.toString())];
|
|
225
|
-
case
|
|
203
|
+
case 5:
|
|
226
204
|
// Update last report timestamp
|
|
227
205
|
_e.sent();
|
|
228
206
|
// Reset metrics for next hour
|
|
229
207
|
return [4 /*yield*/, redis.del(REDIS_API_METRICS_KEY)];
|
|
230
|
-
case
|
|
208
|
+
case 6:
|
|
231
209
|
// Reset metrics for next hour
|
|
232
210
|
_e.sent();
|
|
233
|
-
log.info(tag, "
|
|
234
|
-
return [3 /*break*/,
|
|
235
|
-
case
|
|
236
|
-
|
|
237
|
-
log.error(tag, "Error generating metrics report:",
|
|
238
|
-
return [3 /*break*/,
|
|
239
|
-
case
|
|
211
|
+
log.info(tag, "Generated metrics report - Overall: ".concat(totalRate, "%, Issues: ").concat(criticalErrors.length));
|
|
212
|
+
return [3 /*break*/, 8];
|
|
213
|
+
case 7:
|
|
214
|
+
error_1 = _e.sent();
|
|
215
|
+
log.error(tag, "Error generating metrics report:", error_1);
|
|
216
|
+
return [3 /*break*/, 8];
|
|
217
|
+
case 8: return [2 /*return*/];
|
|
240
218
|
}
|
|
241
219
|
});
|
|
242
220
|
});
|
|
@@ -246,7 +224,7 @@ function sendHourlyMetricsReport() {
|
|
|
246
224
|
*/
|
|
247
225
|
function getCurrentMetrics() {
|
|
248
226
|
return __awaiter(this, void 0, void 0, function () {
|
|
249
|
-
var tag, metricsData, unpriceableCount, metrics,
|
|
227
|
+
var tag, metricsData, unpriceableCount, metrics, error_2;
|
|
250
228
|
return __generator(this, function (_a) {
|
|
251
229
|
switch (_a.label) {
|
|
252
230
|
case 0:
|
|
@@ -273,8 +251,8 @@ function getCurrentMetrics() {
|
|
|
273
251
|
timestamp: new Date().toISOString()
|
|
274
252
|
}];
|
|
275
253
|
case 4:
|
|
276
|
-
|
|
277
|
-
log.error(tag, "Error getting metrics:",
|
|
254
|
+
error_2 = _a.sent();
|
|
255
|
+
log.error(tag, "Error getting metrics:", error_2);
|
|
278
256
|
return [2 /*return*/, { error: 'Failed to retrieve metrics' }];
|
|
279
257
|
case 5: return [2 /*return*/];
|
|
280
258
|
}
|
|
@@ -286,7 +264,7 @@ function getCurrentMetrics() {
|
|
|
286
264
|
*/
|
|
287
265
|
function getUnpriceableTokens() {
|
|
288
266
|
return __awaiter(this, arguments, void 0, function (limit) {
|
|
289
|
-
var tag, tokens,
|
|
267
|
+
var tag, tokens, error_3;
|
|
290
268
|
if (limit === void 0) { limit = 100; }
|
|
291
269
|
return __generator(this, function (_a) {
|
|
292
270
|
switch (_a.label) {
|
|
@@ -300,8 +278,8 @@ function getUnpriceableTokens() {
|
|
|
300
278
|
tokens = _a.sent();
|
|
301
279
|
return [2 /*return*/, tokens.slice(0, limit)];
|
|
302
280
|
case 3:
|
|
303
|
-
|
|
304
|
-
log.error(tag, "Error getting unpriceable tokens:",
|
|
281
|
+
error_3 = _a.sent();
|
|
282
|
+
log.error(tag, "Error getting unpriceable tokens:", error_3);
|
|
305
283
|
return [2 /*return*/, []];
|
|
306
284
|
case 4: return [2 /*return*/];
|
|
307
285
|
}
|
|
@@ -313,7 +291,7 @@ function getUnpriceableTokens() {
|
|
|
313
291
|
*/
|
|
314
292
|
function clearUnpriceableToken(caip) {
|
|
315
293
|
return __awaiter(this, void 0, void 0, function () {
|
|
316
|
-
var tag,
|
|
294
|
+
var tag, error_4;
|
|
317
295
|
return __generator(this, function (_a) {
|
|
318
296
|
switch (_a.label) {
|
|
319
297
|
case 0:
|
|
@@ -327,8 +305,8 @@ function clearUnpriceableToken(caip) {
|
|
|
327
305
|
log.info(tag, "Removed ".concat(caip, " from unpriceable list"));
|
|
328
306
|
return [2 /*return*/, true];
|
|
329
307
|
case 3:
|
|
330
|
-
|
|
331
|
-
log.error(tag, "Error clearing unpriceable token:",
|
|
308
|
+
error_4 = _a.sent();
|
|
309
|
+
log.error(tag, "Error clearing unpriceable token:", error_4);
|
|
332
310
|
return [2 /*return*/, false];
|
|
333
311
|
case 4: return [2 /*return*/];
|
|
334
312
|
}
|
|
@@ -337,20 +315,10 @@ function clearUnpriceableToken(caip) {
|
|
|
337
315
|
}
|
|
338
316
|
/**
|
|
339
317
|
* Start hourly reporting (call this on module initialization)
|
|
318
|
+
* Note: This function is kept for backwards compatibility but no longer starts automatic reporting
|
|
340
319
|
*/
|
|
341
320
|
function startHourlyReporting() {
|
|
342
321
|
var tag = TAG + 'startHourlyReporting | ';
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
sendHourlyMetricsReport().catch(function (err) {
|
|
346
|
-
log.error(tag, 'Error in initial metrics report:', err);
|
|
347
|
-
});
|
|
348
|
-
}, 5 * 60 * 1000);
|
|
349
|
-
// Then send every hour
|
|
350
|
-
setInterval(function () {
|
|
351
|
-
sendHourlyMetricsReport().catch(function (err) {
|
|
352
|
-
log.error(tag, 'Error in hourly metrics report:', err);
|
|
353
|
-
});
|
|
354
|
-
}, 60 * 60 * 1000);
|
|
355
|
-
log.info(tag, '✅ Hourly metrics reporting started');
|
|
322
|
+
log.info(tag, '⚠️ Hourly metrics reporting disabled (Discord dependency removed)');
|
|
323
|
+
log.info(tag, 'Metrics are still collected and available via getCurrentMetrics()');
|
|
356
324
|
}
|
package/lib/index.js
CHANGED
|
@@ -162,8 +162,7 @@ module.exports = {
|
|
|
162
162
|
COINGECKO_API_KEY = settings.apiKey;
|
|
163
163
|
}
|
|
164
164
|
//if(!COINGECKO_API_KEY) throw Error("api key required! set env COINGECKO_API_KEY")
|
|
165
|
-
//
|
|
166
|
-
(0, api_metrics_reporter_1.startHourlyReporting)();
|
|
165
|
+
// Note: Hourly metrics reporting removed (Discord dependency eliminated)
|
|
167
166
|
},
|
|
168
167
|
// NEW: CAIP-first individual asset price lookup
|
|
169
168
|
getAssetPriceByCaip: function (caip, returnSource) {
|
|
@@ -1049,7 +1048,7 @@ var trackAPIMetric = function (api, success, error) {
|
|
|
1049
1048
|
*/
|
|
1050
1049
|
var get_price_from_coingecko = function (coingeckoId) {
|
|
1051
1050
|
return __awaiter(this, void 0, void 0, function () {
|
|
1052
|
-
var tag, startTime, hasTokens, url, headers, response, responseTime, price, error_3, responseTime, status_3, wasRateLimited
|
|
1051
|
+
var tag, startTime, hasTokens, url, headers, response, responseTime, price, error_3, responseTime, status_3, wasRateLimited;
|
|
1053
1052
|
var _a;
|
|
1054
1053
|
return __generator(this, function (_b) {
|
|
1055
1054
|
switch (_b.label) {
|
|
@@ -1077,7 +1076,7 @@ var get_price_from_coingecko = function (coingeckoId) {
|
|
|
1077
1076
|
_b.label = 3;
|
|
1078
1077
|
case 3: return [2 /*return*/, 0]; // Don't call API if no tokens!
|
|
1079
1078
|
case 4:
|
|
1080
|
-
_b.trys.push([4, 11, ,
|
|
1079
|
+
_b.trys.push([4, 11, , 14]);
|
|
1081
1080
|
url = "".concat(URL_COINGECKO, "simple/price?ids=").concat(coingeckoId, "&vs_currencies=usd");
|
|
1082
1081
|
log.debug(tag, "Fetching from CoinGecko: ".concat(url));
|
|
1083
1082
|
headers = {};
|
|
@@ -1145,41 +1144,15 @@ var get_price_from_coingecko = function (coingeckoId) {
|
|
|
1145
1144
|
_b.sent();
|
|
1146
1145
|
_b.label = 13;
|
|
1147
1146
|
case 13:
|
|
1148
|
-
if (
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
discordNotifier = require('@pioneer-platform/pioneer-server/services/discord-notifier.service').discordNotifier;
|
|
1158
|
-
if (!(discordNotifier && discordNotifier.isEnabled())) return [3 /*break*/, 17];
|
|
1159
|
-
return [4 /*yield*/, discordNotifier.sendRateLimitAlert('CoinGecko', status_3, {
|
|
1160
|
-
endpoint: '/simple/price',
|
|
1161
|
-
asset: coingeckoId
|
|
1162
|
-
})];
|
|
1163
|
-
case 16:
|
|
1164
|
-
_b.sent();
|
|
1165
|
-
_b.label = 17;
|
|
1166
|
-
case 17: return [3 /*break*/, 19];
|
|
1167
|
-
case 18:
|
|
1168
|
-
importError_1 = _b.sent();
|
|
1169
|
-
// Server context not available - running standalone, skip alert
|
|
1170
|
-
log.debug(tag, 'Discord notifier not available (standalone mode)');
|
|
1171
|
-
return [3 /*break*/, 19];
|
|
1172
|
-
case 19: return [3 /*break*/, 21];
|
|
1173
|
-
case 20:
|
|
1174
|
-
alertError_1 = _b.sent();
|
|
1175
|
-
log.debug(tag, 'Failed to send rate limit alert:', alertError_1);
|
|
1176
|
-
return [3 /*break*/, 21];
|
|
1177
|
-
case 21: return [3 /*break*/, 23];
|
|
1178
|
-
case 22:
|
|
1179
|
-
log.debug(tag, "CoinGecko error for ".concat(coingeckoId, ": ").concat(error_3.message));
|
|
1180
|
-
_b.label = 23;
|
|
1181
|
-
case 23: return [2 /*return*/, 0];
|
|
1182
|
-
case 24: return [2 /*return*/];
|
|
1147
|
+
if (wasRateLimited) {
|
|
1148
|
+
log.warn(tag, "CoinGecko rate limit (".concat(status_3, ") for ").concat(coingeckoId));
|
|
1149
|
+
// Note: Rate limit alerting removed (Discord dependency eliminated)
|
|
1150
|
+
}
|
|
1151
|
+
else {
|
|
1152
|
+
log.debug(tag, "CoinGecko error for ".concat(coingeckoId, ": ").concat(error_3.message));
|
|
1153
|
+
}
|
|
1154
|
+
return [2 /*return*/, 0];
|
|
1155
|
+
case 14: return [2 /*return*/];
|
|
1183
1156
|
}
|
|
1184
1157
|
});
|
|
1185
1158
|
});
|
|
@@ -1239,7 +1212,7 @@ var get_price_from_coingecko_contract = function (contractAddress_1) {
|
|
|
1239
1212
|
*/
|
|
1240
1213
|
var get_price_from_coinmarketcap = function (symbol) {
|
|
1241
1214
|
return __awaiter(this, void 0, void 0, function () {
|
|
1242
|
-
var tag, startTime, hasTokens, url, response, responseTime, coinData, priceData, price, error_5, responseTime, status_5, wasRateLimited
|
|
1215
|
+
var tag, startTime, hasTokens, url, response, responseTime, coinData, priceData, price, error_5, responseTime, status_5, wasRateLimited;
|
|
1243
1216
|
var _a, _b, _c;
|
|
1244
1217
|
return __generator(this, function (_d) {
|
|
1245
1218
|
switch (_d.label) {
|
|
@@ -1271,7 +1244,7 @@ var get_price_from_coinmarketcap = function (symbol) {
|
|
|
1271
1244
|
_d.label = 3;
|
|
1272
1245
|
case 3: return [2 /*return*/, 0];
|
|
1273
1246
|
case 4:
|
|
1274
|
-
_d.trys.push([4, 14, ,
|
|
1247
|
+
_d.trys.push([4, 14, , 17]);
|
|
1275
1248
|
url = "".concat(URL_COINMARKETCAP, "cryptocurrency/quotes/latest?symbol=").concat(symbol, "&convert=USD");
|
|
1276
1249
|
log.debug(tag, "Fetching from CoinMarketCap: ".concat(url));
|
|
1277
1250
|
return [4 /*yield*/, axios.get(url, {
|
|
@@ -1360,41 +1333,15 @@ var get_price_from_coinmarketcap = function (symbol) {
|
|
|
1360
1333
|
_d.sent();
|
|
1361
1334
|
_d.label = 16;
|
|
1362
1335
|
case 16:
|
|
1363
|
-
if (
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
discordNotifier = require('@pioneer-platform/pioneer-server/services/discord-notifier.service').discordNotifier;
|
|
1373
|
-
if (!(discordNotifier && discordNotifier.isEnabled())) return [3 /*break*/, 20];
|
|
1374
|
-
return [4 /*yield*/, discordNotifier.sendRateLimitAlert('CoinMarketCap', status_5, {
|
|
1375
|
-
endpoint: '/cryptocurrency/quotes/latest',
|
|
1376
|
-
symbol: symbol
|
|
1377
|
-
})];
|
|
1378
|
-
case 19:
|
|
1379
|
-
_d.sent();
|
|
1380
|
-
_d.label = 20;
|
|
1381
|
-
case 20: return [3 /*break*/, 22];
|
|
1382
|
-
case 21:
|
|
1383
|
-
importError_2 = _d.sent();
|
|
1384
|
-
// Server context not available - running standalone, skip alert
|
|
1385
|
-
log.debug(tag, 'Discord notifier not available (standalone mode)');
|
|
1386
|
-
return [3 /*break*/, 22];
|
|
1387
|
-
case 22: return [3 /*break*/, 24];
|
|
1388
|
-
case 23:
|
|
1389
|
-
alertError_2 = _d.sent();
|
|
1390
|
-
log.debug(tag, 'Failed to send rate limit alert:', alertError_2);
|
|
1391
|
-
return [3 /*break*/, 24];
|
|
1392
|
-
case 24: return [3 /*break*/, 26];
|
|
1393
|
-
case 25:
|
|
1394
|
-
log.debug(tag, "CoinMarketCap error for ".concat(symbol, ": ").concat(error_5.message));
|
|
1395
|
-
_d.label = 26;
|
|
1396
|
-
case 26: return [2 /*return*/, 0];
|
|
1397
|
-
case 27: return [2 /*return*/];
|
|
1336
|
+
if (wasRateLimited) {
|
|
1337
|
+
log.warn(tag, "CoinMarketCap rate limit (".concat(status_5, ") for ").concat(symbol));
|
|
1338
|
+
// Note: Rate limit alerting removed (Discord dependency eliminated)
|
|
1339
|
+
}
|
|
1340
|
+
else {
|
|
1341
|
+
log.debug(tag, "CoinMarketCap error for ".concat(symbol, ": ").concat(error_5.message));
|
|
1342
|
+
}
|
|
1343
|
+
return [2 /*return*/, 0];
|
|
1344
|
+
case 17: return [2 /*return*/];
|
|
1398
1345
|
}
|
|
1399
1346
|
});
|
|
1400
1347
|
});
|
|
@@ -1405,7 +1352,7 @@ var get_price_from_coinmarketcap = function (symbol) {
|
|
|
1405
1352
|
*/
|
|
1406
1353
|
var get_price_from_coincap = function (symbol) {
|
|
1407
1354
|
return __awaiter(this, void 0, void 0, function () {
|
|
1408
|
-
var tag, startTime, hasTokens, url, response, responseTime, price, error_6, responseTime, status_6, wasRateLimited
|
|
1355
|
+
var tag, startTime, hasTokens, url, response, responseTime, price, error_6, responseTime, status_6, wasRateLimited;
|
|
1409
1356
|
var _a;
|
|
1410
1357
|
return __generator(this, function (_b) {
|
|
1411
1358
|
switch (_b.label) {
|
|
@@ -1437,7 +1384,7 @@ var get_price_from_coincap = function (symbol) {
|
|
|
1437
1384
|
_b.label = 3;
|
|
1438
1385
|
case 3: return [2 /*return*/, 0];
|
|
1439
1386
|
case 4:
|
|
1440
|
-
_b.trys.push([4, 11, ,
|
|
1387
|
+
_b.trys.push([4, 11, , 14]);
|
|
1441
1388
|
url = "".concat(URL_COINCAP, "assets/").concat(symbol);
|
|
1442
1389
|
log.debug(tag, "Fetching from CoinCap: ".concat(url));
|
|
1443
1390
|
return [4 /*yield*/, axios.get(url, {
|
|
@@ -1506,41 +1453,15 @@ var get_price_from_coincap = function (symbol) {
|
|
|
1506
1453
|
_b.sent();
|
|
1507
1454
|
_b.label = 13;
|
|
1508
1455
|
case 13:
|
|
1509
|
-
if (
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
discordNotifier = require('@pioneer-platform/pioneer-server/services/discord-notifier.service').discordNotifier;
|
|
1519
|
-
if (!(discordNotifier && discordNotifier.isEnabled())) return [3 /*break*/, 17];
|
|
1520
|
-
return [4 /*yield*/, discordNotifier.sendRateLimitAlert('CoinCap', status_6, {
|
|
1521
|
-
endpoint: '/assets',
|
|
1522
|
-
symbol: symbol
|
|
1523
|
-
})];
|
|
1524
|
-
case 16:
|
|
1525
|
-
_b.sent();
|
|
1526
|
-
_b.label = 17;
|
|
1527
|
-
case 17: return [3 /*break*/, 19];
|
|
1528
|
-
case 18:
|
|
1529
|
-
importError_3 = _b.sent();
|
|
1530
|
-
// Server context not available - running standalone, skip alert
|
|
1531
|
-
log.debug(tag, 'Discord notifier not available (standalone mode)');
|
|
1532
|
-
return [3 /*break*/, 19];
|
|
1533
|
-
case 19: return [3 /*break*/, 21];
|
|
1534
|
-
case 20:
|
|
1535
|
-
alertError_3 = _b.sent();
|
|
1536
|
-
log.debug(tag, 'Failed to send rate limit alert:', alertError_3);
|
|
1537
|
-
return [3 /*break*/, 21];
|
|
1538
|
-
case 21: return [3 /*break*/, 23];
|
|
1539
|
-
case 22:
|
|
1540
|
-
log.debug(tag, "CoinCap error for ".concat(symbol, ": ").concat(error_6.message));
|
|
1541
|
-
_b.label = 23;
|
|
1542
|
-
case 23: return [2 /*return*/, 0];
|
|
1543
|
-
case 24: return [2 /*return*/];
|
|
1456
|
+
if (wasRateLimited) {
|
|
1457
|
+
log.warn(tag, "CoinCap rate limit (".concat(status_6, ") for ").concat(symbol));
|
|
1458
|
+
// Note: Rate limit alerting removed (Discord dependency eliminated)
|
|
1459
|
+
}
|
|
1460
|
+
else {
|
|
1461
|
+
log.debug(tag, "CoinCap error for ".concat(symbol, ": ").concat(error_6.message));
|
|
1462
|
+
}
|
|
1463
|
+
return [2 /*return*/, 0];
|
|
1464
|
+
case 14: return [2 /*return*/];
|
|
1544
1465
|
}
|
|
1545
1466
|
});
|
|
1546
1467
|
});
|
package/lib/metrics-logger.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Db } from 'mongodb';
|
|
2
1
|
export interface APICallLog {
|
|
3
2
|
apiName: string;
|
|
4
3
|
endpoint?: string;
|
|
@@ -24,7 +23,7 @@ export declare class MetricsLogger {
|
|
|
24
23
|
private db;
|
|
25
24
|
private logsCollection;
|
|
26
25
|
private enabled;
|
|
27
|
-
constructor(db:
|
|
26
|
+
constructor(db: any);
|
|
28
27
|
/**
|
|
29
28
|
* Enable/disable logging (for performance testing)
|
|
30
29
|
*/
|
package/lib/metrics-logger.js
CHANGED
|
@@ -53,6 +53,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
53
53
|
};
|
|
54
54
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
55
|
exports.MetricsLogger = void 0;
|
|
56
|
+
// Types are from default-mongo-v2 via dependency injection
|
|
56
57
|
var log = require('@pioneer-platform/loggerdog')();
|
|
57
58
|
var TAG = ' | MetricsLogger | ';
|
|
58
59
|
var MetricsLogger = /** @class */ (function () {
|
|
@@ -43,6 +43,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
43
43
|
};
|
|
44
44
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
45
|
exports.TokenBucketManager = void 0;
|
|
46
|
+
// Types are from default-mongo-v2 via dependency injection
|
|
46
47
|
var token_bucket_1 = require("./token-bucket");
|
|
47
48
|
var log = require('@pioneer-platform/loggerdog')();
|
|
48
49
|
var TAG = ' | TokenBucketManager | ';
|
package/lib/token-bucket.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { Db } from 'mongodb';
|
|
2
1
|
export interface TokenBucketConfig {
|
|
3
2
|
apiName: string;
|
|
4
3
|
capacity: number;
|
|
@@ -33,7 +32,7 @@ export declare class TokenBucket {
|
|
|
33
32
|
private cachedTokens;
|
|
34
33
|
private lastSync;
|
|
35
34
|
private syncInterval;
|
|
36
|
-
constructor(config: TokenBucketConfig, db:
|
|
35
|
+
constructor(config: TokenBucketConfig, db: any);
|
|
37
36
|
/**
|
|
38
37
|
* Initialize bucket (call on startup)
|
|
39
38
|
*/
|
package/lib/token-bucket.js
CHANGED
|
@@ -46,6 +46,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
46
46
|
};
|
|
47
47
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
48
|
exports.TokenBucket = void 0;
|
|
49
|
+
// Types are from default-mongo-v2 via dependency injection
|
|
49
50
|
var log = require('@pioneer-platform/loggerdog')();
|
|
50
51
|
var TAG = ' | TokenBucket | ';
|
|
51
52
|
var TokenBucket = /** @class */ (function () {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pioneer-platform/markets",
|
|
3
|
-
"version": "8.
|
|
3
|
+
"version": "8.45.1",
|
|
4
4
|
"main": "./lib/index.js",
|
|
5
5
|
"types": "./lib/index.d.ts",
|
|
6
6
|
"dependencies": {
|
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
"dotenv": "^8.2.0",
|
|
13
13
|
"node-schedule": "^2.1.1",
|
|
14
14
|
"@pioneer-platform/default-mongo-v2": "1.16.0",
|
|
15
|
-
"@pioneer-platform/loggerdog": "8.11.0",
|
|
16
15
|
"@pioneer-platform/default-redis": "8.11.7",
|
|
17
|
-
"@pioneer-platform/
|
|
18
|
-
"@pioneer-platform/pioneer-
|
|
19
|
-
"@pioneer-platform/pioneer-
|
|
16
|
+
"@pioneer-platform/loggerdog": "8.11.0",
|
|
17
|
+
"@pioneer-platform/pioneer-types": "8.19.3",
|
|
18
|
+
"@pioneer-platform/pioneer-discovery": "8.45.1",
|
|
19
|
+
"@pioneer-platform/pioneer-coins": "9.20.0"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|
|
22
22
|
"@types/jest": "^25.2.3",
|
package/tsconfig.json
CHANGED
|
@@ -2,12 +2,19 @@
|
|
|
2
2
|
"compilerOptions": {
|
|
3
3
|
"target": "es5",
|
|
4
4
|
"module": "commonjs",
|
|
5
|
-
"lib": [
|
|
5
|
+
"lib": [
|
|
6
|
+
"es6",
|
|
7
|
+
"es2015",
|
|
8
|
+
"dom"
|
|
9
|
+
],
|
|
6
10
|
"declaration": true,
|
|
7
11
|
"outDir": "lib",
|
|
8
12
|
"rootDir": "src",
|
|
9
13
|
"strict": true,
|
|
10
|
-
"types": [
|
|
11
|
-
|
|
14
|
+
"types": [
|
|
15
|
+
"node"
|
|
16
|
+
],
|
|
17
|
+
"esModuleInterop": true,
|
|
18
|
+
"skipLibCheck": true
|
|
12
19
|
}
|
|
13
20
|
}
|