@cyanheads/pubmed-mcp-server 2.10.13 → 2.10.15
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/AGENTS.md +24 -6
- package/CLAUDE.md +24 -6
- package/README.md +7 -7
- package/changelog/2.0.x/2.0.0.md +32 -0
- package/changelog/2.0.x/2.0.1.md +32 -0
- package/changelog/2.1.x/2.1.0.md +17 -0
- package/changelog/2.1.x/2.1.1.md +29 -0
- package/changelog/2.1.x/2.1.2.md +18 -0
- package/changelog/2.1.x/2.1.3.md +10 -0
- package/changelog/2.1.x/2.1.4.md +12 -0
- package/changelog/2.1.x/2.1.5.md +18 -0
- package/changelog/2.1.x/2.1.6.md +15 -0
- package/changelog/2.10.x/2.10.0.md +17 -0
- package/changelog/2.10.x/2.10.1.md +14 -0
- package/changelog/2.10.x/2.10.10.md +22 -0
- package/changelog/2.10.x/2.10.11.md +21 -0
- package/changelog/2.10.x/2.10.12.md +14 -0
- package/changelog/2.10.x/2.10.13.md +28 -0
- package/changelog/2.10.x/2.10.14.md +29 -0
- package/changelog/2.10.x/2.10.15.md +28 -0
- package/changelog/2.10.x/2.10.2.md +13 -0
- package/changelog/2.10.x/2.10.3.md +26 -0
- package/changelog/2.10.x/2.10.4.md +11 -0
- package/changelog/2.10.x/2.10.5.md +31 -0
- package/changelog/2.10.x/2.10.6.md +30 -0
- package/changelog/2.10.x/2.10.7.md +17 -0
- package/changelog/2.10.x/2.10.8.md +22 -0
- package/changelog/2.10.x/2.10.9.md +15 -0
- package/changelog/2.2.x/2.2.0.md +67 -0
- package/changelog/2.2.x/2.2.1.md +10 -0
- package/changelog/2.2.x/2.2.2.md +20 -0
- package/changelog/2.2.x/2.2.3.md +17 -0
- package/changelog/2.2.x/2.2.4.md +34 -0
- package/changelog/2.2.x/2.2.5.md +10 -0
- package/changelog/2.2.x/2.2.6.md +17 -0
- package/changelog/2.3.x/2.3.0.md +27 -0
- package/changelog/2.3.x/2.3.1.md +15 -0
- package/changelog/2.3.x/2.3.10.md +20 -0
- package/changelog/2.3.x/2.3.11.md +21 -0
- package/changelog/2.3.x/2.3.2.md +27 -0
- package/changelog/2.3.x/2.3.3.md +38 -0
- package/changelog/2.3.x/2.3.4.md +21 -0
- package/changelog/2.3.x/2.3.5.md +24 -0
- package/changelog/2.3.x/2.3.6.md +26 -0
- package/changelog/2.3.x/2.3.7.md +31 -0
- package/changelog/2.3.x/2.3.8.md +19 -0
- package/changelog/2.3.x/2.3.9.md +22 -0
- package/changelog/2.4.x/2.4.0.md +34 -0
- package/changelog/2.4.x/2.4.1.md +32 -0
- package/changelog/2.5.x/2.5.0.md +35 -0
- package/changelog/2.5.x/2.5.1.md +32 -0
- package/changelog/2.5.x/2.5.2.md +23 -0
- package/changelog/2.5.x/2.5.3.md +22 -0
- package/changelog/2.5.x/2.5.5.md +52 -0
- package/changelog/2.5.x/2.5.6.md +33 -0
- package/changelog/2.6.x/2.6.0.md +32 -0
- package/changelog/2.6.x/2.6.1.md +26 -0
- package/changelog/2.6.x/2.6.10.md +16 -0
- package/changelog/2.6.x/2.6.11.md +24 -0
- package/changelog/2.6.x/2.6.12.md +29 -0
- package/changelog/2.6.x/2.6.2.md +23 -0
- package/changelog/2.6.x/2.6.3.md +17 -0
- package/changelog/2.6.x/2.6.4.md +21 -0
- package/changelog/2.6.x/2.6.5.md +30 -0
- package/changelog/2.6.x/2.6.6.md +25 -0
- package/changelog/2.6.x/2.6.7.md +37 -0
- package/changelog/2.6.x/2.6.8.md +15 -0
- package/changelog/2.6.x/2.6.9.md +36 -0
- package/changelog/2.7.x/2.7.0.md +41 -0
- package/changelog/2.7.x/2.7.1.md +21 -0
- package/changelog/2.7.x/2.7.10.md +13 -0
- package/changelog/2.7.x/2.7.11.md +15 -0
- package/changelog/2.7.x/2.7.2.md +22 -0
- package/changelog/2.7.x/2.7.3.md +18 -0
- package/changelog/2.7.x/2.7.4.md +15 -0
- package/changelog/2.7.x/2.7.5.md +34 -0
- package/changelog/2.7.x/2.7.6.md +14 -0
- package/changelog/2.7.x/2.7.7.md +14 -0
- package/changelog/2.7.x/2.7.8.md +18 -0
- package/changelog/2.7.x/2.7.9.md +16 -0
- package/changelog/2.8.x/2.8.0.md +23 -0
- package/changelog/2.9.x/2.9.0.md +21 -0
- package/changelog/2.9.x/2.9.1.md +12 -0
- package/changelog/2.9.x/2.9.10.md +15 -0
- package/changelog/2.9.x/2.9.2.md +21 -0
- package/changelog/2.9.x/2.9.3.md +11 -0
- package/changelog/2.9.x/2.9.4.md +24 -0
- package/changelog/2.9.x/2.9.5.md +20 -0
- package/changelog/2.9.x/2.9.6.md +22 -0
- package/changelog/2.9.x/2.9.7.md +26 -0
- package/changelog/2.9.x/2.9.8.md +15 -0
- package/changelog/2.9.x/2.9.9.md +35 -0
- package/changelog/template.md +151 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/convert-ids.tool.d.ts +7 -2
- package/dist/mcp-server/tools/definitions/convert-ids.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-articles.tool.d.ts +7 -2
- package/dist/mcp-server/tools/definitions/fetch-articles.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts +14 -5
- package/dist/mcp-server/tools/definitions/fetch-fulltext.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/find-related.tool.d.ts +0 -60
- package/dist/mcp-server/tools/definitions/find-related.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/find-related.tool.js +4 -4
- package/dist/mcp-server/tools/definitions/find-related.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/format-citations.tool.d.ts +7 -2
- package/dist/mcp-server/tools/definitions/format-citations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.d.ts +7 -2
- package/dist/mcp-server/tools/definitions/lookup-citation.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-mesh.tool.d.ts +7 -2
- package/dist/mcp-server/tools/definitions/lookup-mesh.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/pubmed-europepmc-fetch.tool.d.ts +6 -3
- package/dist/mcp-server/tools/definitions/pubmed-europepmc-fetch.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.d.ts +6 -3
- package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.js +1 -1
- package/dist/mcp-server/tools/definitions/pubmed-europepmc-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts +7 -2
- package/dist/mcp-server/tools/definitions/search-articles.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/spell-check.tool.d.ts +7 -2
- package/dist/mcp-server/tools/definitions/spell-check.tool.d.ts.map +1 -1
- package/dist/services/error-contracts.d.ts +30 -13
- package/dist/services/error-contracts.d.ts.map +1 -1
- package/dist/services/error-contracts.js +30 -13
- package/dist/services/error-contracts.js.map +1 -1
- package/dist/services/europe-pmc/api-client.d.ts +14 -2
- package/dist/services/europe-pmc/api-client.d.ts.map +1 -1
- package/dist/services/europe-pmc/api-client.js +30 -4
- package/dist/services/europe-pmc/api-client.js.map +1 -1
- package/dist/services/europe-pmc/europe-pmc-service.d.ts +20 -1
- package/dist/services/europe-pmc/europe-pmc-service.d.ts.map +1 -1
- package/dist/services/europe-pmc/europe-pmc-service.js +98 -50
- package/dist/services/europe-pmc/europe-pmc-service.js.map +1 -1
- package/dist/services/ncbi/ncbi-service.d.ts +18 -26
- package/dist/services/ncbi/ncbi-service.d.ts.map +1 -1
- package/dist/services/ncbi/ncbi-service.js +111 -127
- package/dist/services/ncbi/ncbi-service.js.map +1 -1
- package/dist/services/ncbi/request-queue.d.ts +22 -30
- package/dist/services/ncbi/request-queue.d.ts.map +1 -1
- package/dist/services/ncbi/request-queue.js +29 -128
- package/dist/services/ncbi/request-queue.js.map +1 -1
- package/dist/services/ncbi/response-handler.d.ts +14 -1
- package/dist/services/ncbi/response-handler.d.ts.map +1 -1
- package/dist/services/ncbi/response-handler.js +65 -9
- package/dist/services/ncbi/response-handler.js.map +1 -1
- package/dist/services/openalex/openalex-service.d.ts.map +1 -1
- package/dist/services/openalex/openalex-service.js +3 -10
- package/dist/services/openalex/openalex-service.js.map +1 -1
- package/package.json +20 -11
- package/server.json +3 -3
- package/dist/services/retry-policy.d.ts +0 -18
- package/dist/services/retry-policy.d.ts.map +0 -1
- package/dist/services/retry-policy.js +0 -21
- package/dist/services/retry-policy.js.map +0 -1
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @fileoverview High-level service for interacting with NCBI E-utilities.
|
|
3
3
|
* Orchestrates the API client, request queue, and response handler to provide
|
|
4
|
-
* typed methods for each E-utility endpoint.
|
|
4
|
+
* typed methods for each E-utility endpoint. Every call runs as a retry loop around
|
|
5
|
+
* the shared request queue — each attempt re-queued and re-paced — under one total
|
|
6
|
+
* deadline that covers queue wait, attempts, and backoff. Uses init/accessor pattern.
|
|
5
7
|
* @module src/services/ncbi/ncbi-service
|
|
6
8
|
*/
|
|
7
|
-
import {
|
|
8
|
-
import { logger, requestContextService } from '@cyanheads/mcp-ts-core/utils';
|
|
9
|
+
import { JsonRpcErrorCode, McpError, rateLimited, serializationError, timeout, validationError, } from '@cyanheads/mcp-ts-core/errors';
|
|
10
|
+
import { defaultIsTransient, logger, requestContextService, withRetry, } from '@cyanheads/mcp-ts-core/utils';
|
|
9
11
|
import { getServerConfig } from '../../config/server-config.js';
|
|
10
12
|
import { recoveryFor } from '../error-contracts.js';
|
|
11
|
-
import { isTransient } from '../retry-policy.js';
|
|
12
13
|
import { NcbiApiClient } from './api-client.js';
|
|
13
|
-
import {
|
|
14
|
-
import { NcbiResponseHandler, reclassifyNcbiHttpError } from './response-handler.js';
|
|
14
|
+
import { createNcbiRequestQueue } from './request-queue.js';
|
|
15
|
+
import { emptyEFetchResultFor, NcbiResponseHandler, reclassifyNcbiHttpError, } from './response-handler.js';
|
|
15
16
|
import { NCBI_PMC_IDCONV_URL, } from './types.js';
|
|
16
17
|
/**
|
|
17
18
|
* Per-idType expected-format hints surfaced when PMC ID Converter rejects a
|
|
@@ -54,33 +55,60 @@ function normalizeDiagnosticList(list) {
|
|
|
54
55
|
function wireKeysFor(citations) {
|
|
55
56
|
return citations.map((_, i) => String(i + 1));
|
|
56
57
|
}
|
|
57
|
-
/**
|
|
58
|
-
|
|
59
|
-
constructor(deadlineMs) {
|
|
60
|
-
super(`NCBI request deadline (${deadlineMs}ms) exceeded`);
|
|
61
|
-
this.name = 'NcbiDeadlineExceeded';
|
|
62
|
-
}
|
|
63
|
-
}
|
|
58
|
+
/** Ceiling on one backoff sleep, so a high retry count cannot grow it without bound. */
|
|
59
|
+
const MAX_BACKOFF_MS = 30_000;
|
|
64
60
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
61
|
+
* Margin added to the time left on the deadline when it is offered to the queue as a
|
|
62
|
+
* wait budget. The queue sheds an arrival whose projected wait exceeds the budget, and
|
|
63
|
+
* separately times out a caller still waiting when the budget runs out; that second
|
|
64
|
+
* timer would otherwise land on the same instant as the deadline itself. Setting it just
|
|
65
|
+
* past the deadline leaves expiry to the deadline, so a call still queued when its time
|
|
66
|
+
* is up always reports `ncbi_deadline_exceeded`, never `queue_full`.
|
|
67
67
|
*/
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
68
|
+
const QUEUE_WAIT_MARGIN_MS = 1;
|
|
69
|
+
/**
|
|
70
|
+
* Retry gate: the framework's transient set, narrowed to `McpError`s. The client and
|
|
71
|
+
* response handler classify every upstream failure, so a plain `Error` reaching the
|
|
72
|
+
* loop is a defect or a response that cannot parse — retrying it only repeats it.
|
|
73
|
+
*/
|
|
74
|
+
const isTransient = (error) => error instanceof McpError && defaultIsTransient(error);
|
|
75
|
+
/**
|
|
76
|
+
* Maps what the retry loop throws onto this service's declared failure reasons. Runs
|
|
77
|
+
* outside the loop, so the loop itself still sees the framework's `pacer_shed` — which
|
|
78
|
+
* it never retries — and `retry_deadline_exceeded`.
|
|
79
|
+
*
|
|
80
|
+
* - `pacer_shed` → `queue_full` (RateLimited), keeping the shed's `retryAfter`.
|
|
81
|
+
* - `retry_deadline_exceeded` → `ncbi_deadline_exceeded` (Timeout).
|
|
82
|
+
* - Retries exhausted → the last attempt's code and message with `endpoint` and
|
|
83
|
+
* `attempts`; a ServiceUnavailable is stamped `ncbi_unreachable`.
|
|
84
|
+
* - Anything else — a failure that was never retried — passes through unchanged.
|
|
85
|
+
*/
|
|
86
|
+
function toServiceError(error, endpoint, deadlineMs) {
|
|
87
|
+
if (!(error instanceof McpError))
|
|
88
|
+
return error;
|
|
89
|
+
const data = error.data ?? {};
|
|
90
|
+
if (data.reason === 'pacer_shed') {
|
|
91
|
+
return rateLimited(`NCBI request queue is full or cannot start this call before its deadline (${String(data.queueDepth)} requests waiting).`, {
|
|
92
|
+
reason: 'queue_full',
|
|
93
|
+
endpoint,
|
|
94
|
+
queueSize: data.queueDepth,
|
|
95
|
+
retryAfter: data.retryAfter,
|
|
96
|
+
...recoveryFor('queue_full'),
|
|
97
|
+
}, { cause: error });
|
|
98
|
+
}
|
|
99
|
+
if (data.reason === 'retry_deadline_exceeded') {
|
|
100
|
+
return timeout(`NCBI request deadline (${deadlineMs}ms) exceeded`, { reason: 'ncbi_deadline_exceeded', deadlineMs, ...recoveryFor('ncbi_deadline_exceeded') }, { cause: error });
|
|
101
|
+
}
|
|
102
|
+
if (typeof data.retryAttempts !== 'number')
|
|
103
|
+
return error;
|
|
104
|
+
// Other retryable codes (Timeout, RateLimited) keep their code with no reason.
|
|
105
|
+
const reason = error.code === JsonRpcErrorCode.ServiceUnavailable ? 'ncbi_unreachable' : undefined;
|
|
106
|
+
return new McpError(error.code, error.message, {
|
|
107
|
+
...(reason && { reason, ...recoveryFor(reason) }),
|
|
108
|
+
endpoint,
|
|
109
|
+
attempts: data.retryAttempts,
|
|
110
|
+
...(data.ncbiErrors !== undefined && { ncbiErrors: data.ncbiErrors }),
|
|
111
|
+
}, { cause: error.cause ?? error });
|
|
84
112
|
}
|
|
85
113
|
/**
|
|
86
114
|
* Facade over NCBI's E-utility suite. Each public method corresponds to a
|
|
@@ -266,7 +294,7 @@ export class NcbiService {
|
|
|
266
294
|
};
|
|
267
295
|
let text;
|
|
268
296
|
try {
|
|
269
|
-
text = await this.
|
|
297
|
+
text = await this.runPaced('idconv', options?.signal, (signal) => this.apiClient.makeExternalRequest(NCBI_PMC_IDCONV_URL, params, signal));
|
|
270
298
|
}
|
|
271
299
|
catch (error) {
|
|
272
300
|
// PMC ID Converter returns 400 (InvalidParams) for malformed inputs and
|
|
@@ -294,116 +322,69 @@ export class NcbiService {
|
|
|
294
322
|
}
|
|
295
323
|
return parsed.records ?? [];
|
|
296
324
|
}
|
|
297
|
-
/** Error codes that are transient and worth retrying with backoff. */
|
|
298
|
-
static RETRYABLE_CODES = new Set([
|
|
299
|
-
JsonRpcErrorCode.ServiceUnavailable,
|
|
300
|
-
JsonRpcErrorCode.Timeout,
|
|
301
|
-
JsonRpcErrorCode.RateLimited,
|
|
302
|
-
]);
|
|
303
|
-
/** Maximum backoff delay per retry (prevents exponential explosion at high retry counts). */
|
|
304
|
-
static MAX_BACKOFF_MS = 30_000;
|
|
305
325
|
/**
|
|
306
|
-
*
|
|
307
|
-
* (
|
|
308
|
-
*
|
|
309
|
-
*
|
|
326
|
+
* Runs one NCBI call: a retry loop around the shared request queue, so every
|
|
327
|
+
* attempt re-queues and is re-paced (and a 429 closes the gate for all callers,
|
|
328
|
+
* not just this one). One deadline covers queue wait, attempts, and backoff. Its
|
|
329
|
+
* signal — joined with the caller's — reaches the queue wait, the backoff sleep,
|
|
330
|
+
* and the HTTP request, and each attempt offers the queue only the time left, so
|
|
331
|
+
* a call that cannot start in time is shed at once instead of waiting it out.
|
|
332
|
+
*
|
|
333
|
+
* A caller abort rethrows the caller's own reason; every other failure is mapped
|
|
334
|
+
* onto this service's reasons by {@link toServiceError}, after the loop.
|
|
310
335
|
*/
|
|
311
|
-
async
|
|
312
|
-
|
|
313
|
-
const deadlineTimer = setTimeout(() => deadlineController.abort(new NcbiDeadlineExceeded(this.totalDeadlineMs)), this.totalDeadlineMs);
|
|
314
|
-
const signal = callerSignal
|
|
315
|
-
? AbortSignal.any([deadlineController.signal, callerSignal])
|
|
316
|
-
: deadlineController.signal;
|
|
336
|
+
async runPaced(endpoint, callerSignal, execute) {
|
|
337
|
+
let attempt = 0;
|
|
317
338
|
try {
|
|
318
|
-
return await
|
|
339
|
+
return await withRetry(({ signal, remainingMs }) => {
|
|
340
|
+
attempt += 1;
|
|
341
|
+
return this.queue
|
|
342
|
+
.run(execute, { signal, maxWaitMs: remainingMs + QUEUE_WAIT_MARGIN_MS })
|
|
343
|
+
.catch((error) => {
|
|
344
|
+
if (attempt <= this.maxRetries && isTransient(error)) {
|
|
345
|
+
logger.warning(`NCBI request to ${endpoint} failed on attempt ${attempt} of ${this.maxRetries + 1}.`, requestContextService.createRequestContext({
|
|
346
|
+
operation: 'NcbiRetry',
|
|
347
|
+
additionalContext: {
|
|
348
|
+
endpoint,
|
|
349
|
+
attempt,
|
|
350
|
+
error: error instanceof Error ? error.message : String(error),
|
|
351
|
+
},
|
|
352
|
+
}));
|
|
353
|
+
}
|
|
354
|
+
throw error;
|
|
355
|
+
});
|
|
356
|
+
}, {
|
|
357
|
+
maxRetries: this.maxRetries,
|
|
358
|
+
maxDelayMs: MAX_BACKOFF_MS,
|
|
359
|
+
deadlineMs: this.totalDeadlineMs,
|
|
360
|
+
isTransient,
|
|
361
|
+
operation: `NCBI ${endpoint}`,
|
|
362
|
+
...(callerSignal && { signal: callerSignal }),
|
|
363
|
+
});
|
|
319
364
|
}
|
|
320
365
|
catch (error) {
|
|
321
|
-
if (
|
|
322
|
-
throw
|
|
323
|
-
|
|
324
|
-
deadlineMs: this.totalDeadlineMs,
|
|
325
|
-
...recoveryFor('ncbi_deadline_exceeded'),
|
|
326
|
-
}, { cause: error });
|
|
327
|
-
}
|
|
328
|
-
throw error;
|
|
329
|
-
}
|
|
330
|
-
finally {
|
|
331
|
-
clearTimeout(deadlineTimer);
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Retry wrapper for transient NCBI errors (ServiceUnavailable, Timeout, RateLimited).
|
|
336
|
-
* Non-transient McpErrors and unexpected plain Errors fail immediately.
|
|
337
|
-
* Uses capped exponential backoff with jitter. Backoff sleep is abortable via
|
|
338
|
-
* `signal`, so deadline expiration or caller cancel short-circuits the chain.
|
|
339
|
-
*/
|
|
340
|
-
async withRetry(execute, label, signal) {
|
|
341
|
-
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
342
|
-
if (signal?.aborted)
|
|
343
|
-
throw signal.reason;
|
|
344
|
-
try {
|
|
345
|
-
return await execute();
|
|
346
|
-
}
|
|
347
|
-
catch (error) {
|
|
348
|
-
if (signal?.aborted)
|
|
349
|
-
throw signal.reason;
|
|
350
|
-
if (!(error instanceof McpError)) {
|
|
351
|
-
throw error;
|
|
352
|
-
}
|
|
353
|
-
if (!isTransient(error, NcbiService.RETRYABLE_CODES)) {
|
|
354
|
-
throw error;
|
|
355
|
-
}
|
|
356
|
-
if (attempt < this.maxRetries) {
|
|
357
|
-
const baseDelay = Math.min(1000 * 2 ** attempt, NcbiService.MAX_BACKOFF_MS);
|
|
358
|
-
const jitter = baseDelay * (0.75 + 0.5 * Math.random()); // ±25%
|
|
359
|
-
const retryDelay = Math.round(jitter);
|
|
360
|
-
logger.warning(`NCBI request to ${label} failed. Retrying (${attempt + 1}/${this.maxRetries}) in ${retryDelay}ms.`, requestContextService.createRequestContext({
|
|
361
|
-
operation: 'NcbiRetry',
|
|
362
|
-
additionalContext: { endpoint: label, attempt: attempt + 1, retryDelay },
|
|
363
|
-
}));
|
|
364
|
-
await abortableSleep(retryDelay, signal);
|
|
365
|
-
continue;
|
|
366
|
-
}
|
|
367
|
-
const attempts = this.maxRetries + 1;
|
|
368
|
-
const msg = error instanceof Error ? error.message : String(error);
|
|
369
|
-
// Tag transient ServiceUnavailable retries-exhausted with `ncbi_unreachable` so
|
|
370
|
-
// tool callers can switch on a stable reason. Other retryable codes (Timeout,
|
|
371
|
-
// RateLimited) keep their original code with no reason — `ncbi_deadline_exceeded`
|
|
372
|
-
// and `queue_full` are stamped at their own throw sites.
|
|
373
|
-
const reason = error.code === JsonRpcErrorCode.ServiceUnavailable ? 'ncbi_unreachable' : undefined;
|
|
374
|
-
const ncbiErrors = error.data?.ncbiErrors;
|
|
375
|
-
throw new McpError(error.code, `${msg} (failed after ${attempts} attempts)`, {
|
|
376
|
-
...(reason && { reason, ...recoveryFor(reason) }),
|
|
377
|
-
endpoint: label,
|
|
378
|
-
attempts,
|
|
379
|
-
...(ncbiErrors !== undefined && { ncbiErrors }),
|
|
380
|
-
}, { cause: error });
|
|
381
|
-
}
|
|
366
|
+
if (callerSignal?.aborted)
|
|
367
|
+
throw callerSignal.reason;
|
|
368
|
+
throw toServiceError(error, endpoint, this.totalDeadlineMs);
|
|
382
369
|
}
|
|
383
|
-
throw internalError('Request failed after all retries.', {
|
|
384
|
-
reason: 'ncbi_unreachable',
|
|
385
|
-
endpoint: label,
|
|
386
|
-
...recoveryFor('ncbi_unreachable'),
|
|
387
|
-
});
|
|
388
370
|
}
|
|
389
371
|
/**
|
|
390
|
-
*
|
|
391
|
-
*
|
|
392
|
-
*
|
|
393
|
-
*
|
|
394
|
-
* The combined deadline+caller signal is threaded into the queue (cancels a
|
|
395
|
-
* still-waiting task), the retry chain (cancels pending backoff sleeps),
|
|
396
|
-
* and the HTTP fetch (cancels wedged requests).
|
|
372
|
+
* One eutils request through {@link runPaced}: fetch, classify, parse. EFetch's
|
|
373
|
+
* all-invalid-ID rejection resolves as the empty set NCBI returns for an unknown
|
|
374
|
+
* ID, and a backend-failure envelope is reclassified as transient so it retries.
|
|
397
375
|
*/
|
|
398
376
|
performRequest(endpoint, params, options) {
|
|
399
|
-
return this.
|
|
377
|
+
return this.runPaced(endpoint, options?.signal, async (signal) => {
|
|
400
378
|
const text = await this.apiClient
|
|
401
379
|
.makeRequest(endpoint, params, { ...options, signal })
|
|
402
380
|
.catch((error) => {
|
|
381
|
+
const empty = emptyEFetchResultFor(error, endpoint, params.db);
|
|
382
|
+
if (empty !== undefined)
|
|
383
|
+
return empty;
|
|
403
384
|
throw reclassifyNcbiHttpError(error, endpoint);
|
|
404
385
|
});
|
|
405
386
|
return this.responseHandler.parseAndHandleResponse(text, endpoint, options);
|
|
406
|
-
}
|
|
387
|
+
});
|
|
407
388
|
}
|
|
408
389
|
}
|
|
409
390
|
// ─── Init / Accessor ────────────────────────────────────────────────────────
|
|
@@ -417,7 +398,10 @@ export function initNcbiService() {
|
|
|
417
398
|
...(config.apiKey && { apiKey: config.apiKey }),
|
|
418
399
|
...(config.adminEmail && { adminEmail: config.adminEmail }),
|
|
419
400
|
});
|
|
420
|
-
const queue =
|
|
401
|
+
const queue = createNcbiRequestQueue({
|
|
402
|
+
minStartGapMs: config.requestDelayMs,
|
|
403
|
+
maxConcurrent: config.maxConcurrent,
|
|
404
|
+
});
|
|
421
405
|
const responseHandler = new NcbiResponseHandler();
|
|
422
406
|
_service = new NcbiService(apiClient, queue, responseHandler, config.maxRetries, config.totalDeadlineMs);
|
|
423
407
|
logger.info('NCBI service initialized.', requestContextService.createRequestContext({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ncbi-service.js","sourceRoot":"","sources":["../../../src/services/ncbi/ncbi-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,kBAAkB,EAClB,OAAO,EACP,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAE7E,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAaL,mBAAmB,GAKpB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,uBAAuB,GAA2B;IACtD,IAAI,EAAE,iCAAiC;IACvC,KAAK,EAAE,+DAA+D;IACtE,GAAG,EAAE,+CAA+C;CACrD,CAAC;AAKF;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,IAAoC;IAEpC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,UAAU,CAAC,GAA+B,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CACxF,MAAM,CACP,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,WAAW,CAAC,SAA8B;IACjD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,oEAAoE;AACpE,MAAM,oBAAqB,SAAQ,KAAK;IACtC,YAAY,UAAkB;QAC5B,KAAK,CAAC,0BAA0B,UAAU,cAAc,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,EAAU,EAAE,MAAoB;IACtD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IAEH,SAAS;IACT,KAAK;IACL,eAAe;IACf,UAAU;IACV,eAAe;IALlC,YACmB,SAAwB,EACxB,KAAuB,EACvB,eAAoC,EACpC,UAAkB,EAClB,eAAuB;yBAJvB,SAAS;qBACT,KAAK;+BACL,eAAe;0BACf,UAAU;+BACV,eAAe;IAC/B,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,MAAyB,EAAE,OAAyB;QAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA2B,SAAS,EAAE,MAAM,EAAE;YACtF,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;QACxC,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClE,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC;YACxC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;YAC1C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC;YAC9C,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;YACjE,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/C,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;YAC7C,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAyB,EAAE,OAAyB;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACvF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA4B,UAAU,EAAE,MAAM,EAAE;YACxF,OAAO;YACP,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,cAAc,CAAC;IACjC,CAAC;IAED,MAAM,CACJ,MAAyB,EACzB,OAAO,GAAuB,EAAE,OAAO,EAAE,KAAK,EAAE;QAEhD,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,cAAc,CAAI,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CACH,MAAyB,EACzB,OAAyB;QAEzB,OAAO,IAAI,CAAC,cAAc,CAAI,OAAO,EAAE,MAAM,EAAE;YAC7C,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAyB,EAAE,OAAyB;QAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA0B,QAAQ,EAAE,MAAM,EAAE;YACpF,OAAO,EAAE,KAAK;YACd,wEAAwE;YACxE,yEAAyE;YACzE,iEAAiE;YACjE,iBAAiB,EAAE,IAAI;YACvB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAK,MAAM,CAAC,IAAe,IAAI,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC;QAEnD,MAAM,CAAC,KAAK,CACV,uBAAuB,EACvB,qBAAqB,CAAC,oBAAoB,CAAC;YACzC,SAAS,EAAE,YAAY;YACvB,iBAAiB,EAAE;gBACjB,QAAQ;gBACR,SAAS;gBACT,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,QAAQ;aAC9D;SACF,CAAC,CACH,CAAC;QAEF,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,SAAS,IAAI,QAAQ;YAChC,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,QAAQ;SAC9D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAyB,EAAE,OAAyB;QACxD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;YAC1C,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,SAAS,CACb,SAA8B,EAC9B,OAAyB;QAEzB,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,SAAS;aACpB,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CACpH;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CACpC,eAAe,EACf,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EACvC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CACxE,CAAC;QAEF,MAAM,MAAM,GAAsB,IAAI;aACnC,KAAK,CAAC,SAAS,CAAC;aAChB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAE1C,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;YAC9E,CAAC;YAED,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,cAAc,GAAG,GAAG;oBACxB,CAAC,CAAC,GAAG;yBACA,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;yBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACnC,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO;oBACL,GAAG;oBACH,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,WAAoB;oBAC5B,MAAM,EAAE,UAAU;oBAClB,GAAG,CAAC,cAAc,EAAE,MAAM,IAAI,EAAE,cAAc,EAAE,CAAC;iBAClD,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,WAAoB;gBAC5B,GAAG,CAAC,UAAU,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;aAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,2EAA2E;QAC3E,6EAA6E;QAC7E,sEAAsE;QACtE,2EAA2E;QAC3E,oEAAoE;QACpE,6CAA6C;QAC7C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAmB,EAAE;YAC7C,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,GAAG;gBACR,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE;gBACxB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAoB,EAAE,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,GAAa,EACb,MAAe,EACf,OAAyB;QAEzB,wEAAwE;QACxE,wEAAwE;QACxE,qEAAqE;QACrE,0EAA0E;QAC1E,uEAAuE;QACvE,gBAAgB;QAChB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,eAAe,CACnB,gCAAgC,MAAM,uGAAuG,EAC7I,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CACxC,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,2EAA2E;QAC3E,wEAAwE;QACxE,yDAAyD;QACzD,MAAM,aAAa,GACjB,MAAM,KAAK,OAAO;YAChB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACb,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,CAAC,CAAC;YACJ,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,MAAM,GAAsB;YAChC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,MAAM,EAAE,MAAM;YACd,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC;QAEF,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAC/B,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,GAAG,EAAE,CACH,IAAI,CAAC,SAAS,CACZ,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7E,QAAQ,EACR,MAAM,CACP,EACH,QAAQ,EACR,MAAM,EACN,MAAM,CACP,EACH,OAAO,EAAE,MAAM,CAChB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,wEAAwE;YACxE,yEAAyE;YACzE,0EAA0E;YAC1E,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,aAAa,EAAE,CAAC;gBAC/E,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI;oBAClB,CAAC,CAAC,sEAAsE,MAAM,iBAAiB,IAAI,GAAG;oBACtG,CAAC,CAAC,6DAA6D,MAAM,IAAI,aAAa,KAAK,CAAC;gBAC9F,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,kBAAkB,CACtB,6CAA6C,EAC7C;gBACE,MAAM,EAAE,uBAAuB;gBAC/B,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBACvC,GAAG,WAAW,CAAC,uBAAuB,CAAC;aACxC,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;QAED,OAAQ,MAA4B,CAAC,OAAO,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,sEAAsE;IAC9D,MAAM,CAAU,eAAe,GAAG,IAAI,GAAG,CAAC;QAChD,gBAAgB,CAAC,kBAAkB;QACnC,gBAAgB,CAAC,OAAO;QACxB,gBAAgB,CAAC,WAAW;KAC7B,CAAC,CAAC;IAEH,6FAA6F;IACrF,MAAM,CAAU,cAAc,GAAG,MAAM,CAAC;IAEhD;;;;;OAKG;IACK,KAAK,CAAC,eAAe,CAC3B,IAAyC,EACzC,YAA0B;QAE1B,MAAM,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAC;QACjD,MAAM,aAAa,GAAG,UAAU,CAC9B,GAAG,EAAE,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAC9E,IAAI,CAAC,eAAe,CACrB,CAAC;QAEF,MAAM,MAAM,GAAG,YAAY;YACzB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAC5D,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAE9B,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC1C,MAAM,OAAO,CACX,KAAK,CAAC,OAAO,EACb;oBACE,MAAM,EAAE,wBAAwB;oBAChC,UAAU,EAAE,IAAI,CAAC,eAAe;oBAChC,GAAG,WAAW,CAAC,wBAAwB,CAAC;iBACzC,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,aAAa,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,SAAS,CACrB,OAAyB,EACzB,KAAa,EACb,MAAoB;QAEpB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;YAC5D,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,MAAM,CAAC,MAAM,CAAC;YAEzC,IAAI,CAAC;gBACH,OAAO,MAAM,OAAO,EAAE,CAAC;YACzB,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,IAAI,MAAM,EAAE,OAAO;oBAAE,MAAM,MAAM,CAAC,MAAM,CAAC;gBAEzC,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC,EAAE,CAAC;oBACjC,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,eAAe,CAAC,EAAE,CAAC;oBACrD,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC9B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;oBAC5E,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO;oBAChE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACtC,MAAM,CAAC,OAAO,CACZ,mBAAmB,KAAK,sBAAsB,OAAO,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,QAAQ,UAAU,KAAK,EACnG,qBAAqB,CAAC,oBAAoB,CAAC;wBACzC,SAAS,EAAE,WAAW;wBACtB,iBAAiB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,CAAC,EAAE,UAAU,EAAE;qBACzE,CAAC,CACH,CAAC;oBACF,MAAM,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;oBACzC,SAAS;gBACX,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;gBACrC,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnE,gFAAgF;gBAChF,8EAA8E;gBAC9E,kFAAkF;gBAClF,yDAAyD;gBACzD,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC;gBAC1C,MAAM,IAAI,QAAQ,CAChB,KAAK,CAAC,IAAI,EACV,GAAG,GAAG,kBAAkB,QAAQ,YAAY,EAC5C;oBACE,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;oBACjD,QAAQ,EAAE,KAAK;oBACf,QAAQ;oBACR,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,CAAC;iBAChD,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,aAAa,CAAC,mCAAmC,EAAE;YACvD,MAAM,EAAE,kBAAkB;YAC1B,QAAQ,EAAE,KAAK;YACf,GAAG,WAAW,CAAC,kBAAkB,CAAC;SACnC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;OAQG;IACK,cAAc,CACpB,QAAgB,EAChB,MAAyB,EACzB,OAA4B;QAE5B,OAAO,IAAI,CAAC,eAAe,CACzB,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,CAAC,KAAK,CAAC,OAAO,CAChB,GAAG,EAAE,CACH,IAAI,CAAC,SAAS,CACZ,KAAK,IAAI,EAAE;YACT,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS;iBAC9B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;iBACrD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,MAAM,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YACL,OAAO,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,EACD,QAAQ,EACR,MAAM,CACP,EACH,QAAQ,EACR,MAAM,EACN,MAAM,CACP,EACH,OAAO,EAAE,MAAM,CAChB,CAAC;IACJ,CAAC;CACF;AAED,+EAA+E;AAE/E,IAAI,QAAiC,CAAC;AAEtC,qEAAqE;AACrE,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC;QAClC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;KAC5D,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAClD,QAAQ,GAAG,IAAI,WAAW,CACxB,SAAS,EACT,KAAK,EACL,eAAe,EACf,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,eAAe,CACvB,CAAC;IACF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,qBAAqB,CAAC,oBAAoB,CAAC;QACzC,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE;YACjB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;YAC1B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC9F,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"ncbi-service.js","sourceRoot":"","sources":["../../../src/services/ncbi/ncbi-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,eAAe,GAChB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,kBAAkB,EAClB,MAAM,EAEN,qBAAqB,EACrB,SAAS,GACV,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAaL,mBAAmB,GAKpB,MAAM,YAAY,CAAC;AAEpB;;;;;GAKG;AACH,MAAM,uBAAuB,GAA2B;IACtD,IAAI,EAAE,iCAAiC;IACvC,KAAK,EAAE,+DAA+D;IACtE,GAAG,EAAE,+CAA+C;CACrD,CAAC;AAKF;;;;;GAKG;AACH,SAAS,uBAAuB,CAC9B,IAAoC;IAEpC,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,UAAU,GAAuB,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,UAAU,CAAC,GAA+B,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CACxF,MAAM,CACP,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAS,WAAW,CAAC,SAA8B;IACjD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,wFAAwF;AACxF,MAAM,cAAc,GAAG,MAAM,CAAC;AAE9B;;;;;;;GAOG;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAE/B;;;;GAIG;AACH,MAAM,WAAW,GAAG,CAAC,KAAc,EAAW,EAAE,CAC9C,KAAK,YAAY,QAAQ,IAAI,kBAAkB,CAAC,KAAK,CAAC,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,SAAS,cAAc,CAAC,KAAc,EAAE,QAAgB,EAAE,UAAkB;IAC1E,IAAI,CAAC,CAAC,KAAK,YAAY,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;IAE9B,IAAI,IAAI,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,WAAW,CAChB,6EAA6E,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,EACzH;YACE,MAAM,EAAE,YAAY;YACpB,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,GAAG,WAAW,CAAC,YAAY,CAAC;SAC7B,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,KAAK,yBAAyB,EAAE,CAAC;QAC9C,OAAO,OAAO,CACZ,0BAA0B,UAAU,cAAc,EAClD,EAAE,MAAM,EAAE,wBAAwB,EAAE,UAAU,EAAE,GAAG,WAAW,CAAC,wBAAwB,CAAC,EAAE,EAC1F,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzD,+EAA+E;IAC/E,MAAM,MAAM,GACV,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS,CAAC;IACtF,OAAO,IAAI,QAAQ,CACjB,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,OAAO,EACb;QACE,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,QAAQ;QACR,QAAQ,EAAE,IAAI,CAAC,aAAa;QAC5B,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;KACtE,EACD,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,EAAE,CAChC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,WAAW;IAEH,SAAS;IACT,KAAK;IACL,eAAe;IACf,UAAU;IACV,eAAe;IALlC,YACmB,SAAwB,EACxB,KAAY,EACZ,eAAoC,EACpC,UAAkB,EAClB,eAAuB;yBAJvB,SAAS;qBACT,KAAK;+BACL,eAAe;0BACf,UAAU;+BACV,eAAe;IAC/B,CAAC;IAEJ,KAAK,CAAC,OAAO,CAAC,MAAyB,EAAE,OAAyB;QAChE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA2B,SAAS,EAAE,MAAM,EAAE;YACtF,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC;QACxC,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,uBAAuB,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAClE,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC;YACxC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC;YAC1C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC;YAC9C,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACvE,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;YACjE,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;YAC/C,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;YAC3C,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;YAC7C,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,EAAE,WAAW,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAyB,EAAE,OAAyB;QACjE,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,KAAK,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;QACvF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA4B,UAAU,EAAE,MAAM,EAAE;YACxF,OAAO;YACP,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,cAAc,CAAC;IACjC,CAAC;IAED,MAAM,CACJ,MAAyB,EACzB,OAAO,GAAuB,EAAE,OAAO,EAAE,KAAK,EAAE;QAEhD,MAAM,OAAO,GACX,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;QAC1F,OAAO,IAAI,CAAC,cAAc,CAAI,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CACH,MAAyB,EACzB,OAAyB;QAEzB,OAAO,IAAI,CAAC,cAAc,CAAI,OAAO,EAAE,MAAM,EAAE;YAC7C,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAyB,EAAE,OAAyB;QAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAA0B,QAAQ,EAAE,MAAM,EAAE;YACpF,OAAO,EAAE,KAAK;YACd,wEAAwE;YACxE,yEAAyE;YACzE,iEAAiE;YACjE,iBAAiB,EAAE,IAAI;YACvB,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;QAEH,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC1C,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAK,MAAM,CAAC,IAAe,IAAI,EAAE,CAAC;QACpE,MAAM,SAAS,GAAG,WAAW,CAAC,cAAc,IAAI,EAAE,CAAC;QAEnD,MAAM,CAAC,KAAK,CACV,uBAAuB,EACvB,qBAAqB,CAAC,oBAAoB,CAAC;YACzC,SAAS,EAAE,YAAY;YACvB,iBAAiB,EAAE;gBACjB,QAAQ;gBACR,SAAS;gBACT,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,QAAQ;aAC9D;SACF,CAAC,CACH,CAAC;QAEF,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,SAAS,IAAI,QAAQ;YAChC,aAAa,EAAE,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,QAAQ;SAC9D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAyB,EAAE,OAAyB;QACxD,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE;YAC1C,OAAO,EAAE,KAAK;YACd,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SACnD,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,SAAS,CACb,SAA8B,EAC9B,OAAyB;QAEzB,MAAM,QAAQ,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,KAAK,GAAG,SAAS;aACpB,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,CAAC,CAAC,UAAU,IAAI,EAAE,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,CACpH;aACA,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CACpC,eAAe,EACf,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EACvC,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,CACxE,CAAC;QAEF,MAAM,MAAM,GAAsB,IAAI;aACnC,KAAK,CAAC,SAAS,CAAC;aAChB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;aACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAE1C,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAkB,EAAE,CAAC;YAC9E,CAAC;YAED,IAAI,UAAU,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACvC,MAAM,GAAG,GAAG,yBAAyB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC5D,MAAM,cAAc,GAAG,GAAG;oBACxB,CAAC,CAAC,GAAG;yBACA,KAAK,CAAC,GAAG,CAAC;yBACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;yBACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACnC,CAAC,CAAC,SAAS,CAAC;gBACd,OAAO;oBACL,GAAG;oBACH,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,WAAoB;oBAC5B,MAAM,EAAE,UAAU;oBAClB,GAAG,CAAC,cAAc,EAAE,MAAM,IAAI,EAAE,cAAc,EAAE,CAAC;iBAClD,CAAC;YACJ,CAAC;YAED,OAAO;gBACL,GAAG;gBACH,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,WAAoB;gBAC5B,GAAG,CAAC,UAAU,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;aAC1C,CAAC;QACJ,CAAC,CAAC,CAAC;QAEL,2EAA2E;QAC3E,6EAA6E;QAC7E,sEAAsE;QACtE,2EAA2E;QAC3E,oEAAoE;QACpE,6CAA6C;QAC7C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAmB,EAAE;YAC7C,MAAM,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,GAAG;gBACR,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE;gBACxB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,WAAoB,EAAE,CAAC;QAC/E,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,SAAS,CACb,GAAa,EACb,MAAe,EACf,OAAyB;QAEzB,wEAAwE;QACxE,wEAAwE;QACxE,qEAAqE;QACrE,0EAA0E;QAC1E,uEAAuE;QACvE,gBAAgB;QAChB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,eAAe,CACnB,gCAAgC,MAAM,uGAAuG,EAC7I,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,CACxC,CAAC;QACJ,CAAC;QAED,4EAA4E;QAC5E,2EAA2E;QAC3E,wEAAwE;QACxE,yDAAyD;QACzD,MAAM,aAAa,GACjB,MAAM,KAAK,OAAO;YAChB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;gBACb,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC;gBAC1B,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,CAAC,CAAC;YACJ,CAAC,CAAC,GAAG,CAAC;QACV,MAAM,MAAM,GAAsB;YAChC,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B,MAAM,EAAE,MAAM;YACd,GAAG,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,CAAC;SAC1B,CAAC;QAEF,IAAI,IAAY,CAAC;QACjB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAC/D,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,CAAC,CACxE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,wEAAwE;YACxE,yEAAyE;YACzE,0EAA0E;YAC1E,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,CAAC,aAAa,EAAE,CAAC;gBAC/E,MAAM,IAAI,GAAG,uBAAuB,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;gBACnD,MAAM,OAAO,GAAG,IAAI;oBAClB,CAAC,CAAC,sEAAsE,MAAM,iBAAiB,IAAI,GAAG;oBACtG,CAAC,CAAC,6DAA6D,MAAM,IAAI,aAAa,KAAK,CAAC;gBAC9F,MAAM,eAAe,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,kBAAkB,CACtB,6CAA6C,EAC7C;gBACE,MAAM,EAAE,uBAAuB;gBAC/B,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;gBACvC,GAAG,WAAW,CAAC,uBAAuB,CAAC;aACxC,EACD,EAAE,KAAK,EAAE,KAAK,EAAE,CACjB,CAAC;QACJ,CAAC;QAED,OAAQ,MAA4B,CAAC,OAAO,IAAI,EAAE,CAAC;IACrD,CAAC;IAED;;;;;;;;;;OAUG;IACK,KAAK,CAAC,QAAQ,CACpB,QAAgB,EAChB,YAAqC,EACrC,OAA4C;QAE5C,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,IAAI,CAAC;YACH,OAAO,MAAM,SAAS,CACpB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE;gBAC1B,OAAO,IAAI,CAAC,CAAC;gBACb,OAAO,IAAI,CAAC,KAAK;qBACd,GAAG,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,oBAAoB,EAAE,CAAC;qBACvE,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;oBACxB,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;wBACrD,MAAM,CAAC,OAAO,CACZ,mBAAmB,QAAQ,sBAAsB,OAAO,OAAO,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,EACrF,qBAAqB,CAAC,oBAAoB,CAAC;4BACzC,SAAS,EAAE,WAAW;4BACtB,iBAAiB,EAAE;gCACjB,QAAQ;gCACR,OAAO;gCACP,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;6BAC9D;yBACF,CAAC,CACH,CAAC;oBACJ,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC,CAAC,CAAC;YACP,CAAC,EACD;gBACE,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,UAAU,EAAE,cAAc;gBAC1B,UAAU,EAAE,IAAI,CAAC,eAAe;gBAChC,WAAW;gBACX,SAAS,EAAE,QAAQ,QAAQ,EAAE;gBAC7B,GAAG,CAAC,YAAY,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;aAC9C,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAI,YAAY,EAAE,OAAO;gBAAE,MAAM,YAAY,CAAC,MAAM,CAAC;YACrD,MAAM,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,cAAc,CACpB,QAAgB,EAChB,MAAyB,EACzB,OAA4B;QAE5B,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS;iBAC9B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC;iBACrD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;gBACxB,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/D,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAC;gBACtC,MAAM,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YACjD,CAAC,CAAC,CAAC;YACL,OAAO,IAAI,CAAC,eAAe,CAAC,sBAAsB,CAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,+EAA+E;AAE/E,IAAI,QAAiC,CAAC;AAEtC,qEAAqE;AACrE,MAAM,UAAU,eAAe;IAC7B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,aAAa,CAAC;QAClC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC/C,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;KAC5D,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,sBAAsB,CAAC;QACnC,aAAa,EAAE,MAAM,CAAC,cAAc;QACpC,aAAa,EAAE,MAAM,CAAC,aAAa;KACpC,CAAC,CAAC;IACH,MAAM,eAAe,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAClD,QAAQ,GAAG,IAAI,WAAW,CACxB,SAAS,EACT,KAAK,EACL,eAAe,EACf,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,eAAe,CACvB,CAAC;IACF,MAAM,CAAC,IAAI,CACT,2BAA2B,EAC3B,qBAAqB,CAAC,oBAAoB,CAAC;QACzC,SAAS,EAAE,UAAU;QACrB,iBAAiB,EAAE;YACjB,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;YAC1B,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,aAAa,EAAE,MAAM,CAAC,aAAa;YACnC,eAAe,EAAE,MAAM,CAAC,eAAe;SACxC;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,cAAc;IAC5B,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;IAC9F,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -1,36 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* @fileoverview Request queue for NCBI E-utility calls, built on the framework pacer.
|
|
3
|
+
* Spaces request starts to NCBI's per-second ceiling, caps concurrent in-flight
|
|
4
|
+
* requests and queue depth, releases a waiting caller the moment its signal aborts,
|
|
5
|
+
* and closes one shared cooldown gate for every queued caller when NCBI answers 429.
|
|
6
|
+
* Each retry attempt re-enters the queue, so a throttled upstream paces the whole
|
|
7
|
+
* server rather than each caller retrying into it on its own backoff.
|
|
6
8
|
* @module src/services/ncbi/request-queue
|
|
7
9
|
*/
|
|
8
|
-
import type
|
|
10
|
+
import { type Pacer } from '@cyanheads/mcp-ts-core/utils';
|
|
11
|
+
/** Settings for {@link createNcbiRequestQueue}. */
|
|
12
|
+
export interface NcbiRequestQueueOptions {
|
|
13
|
+
/** Maximum requests in flight at once. */
|
|
14
|
+
maxConcurrent: number;
|
|
15
|
+
/** Waiting callers past which a new arrival is shed. Defaults to 100. */
|
|
16
|
+
maxQueueDepth?: number;
|
|
17
|
+
/** Minimum gap between two request starts — NCBI's per-second ceiling. */
|
|
18
|
+
minStartGapMs: number;
|
|
19
|
+
}
|
|
9
20
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* - **Concurrency** (`maxConcurrent`): maximum number of requests in flight
|
|
16
|
-
* simultaneously. Decouples concurrency from rate, so slow upstream
|
|
17
|
-
* responses don't block new dispatches.
|
|
18
|
-
*
|
|
19
|
-
* Enqueue accepts an optional `AbortSignal` so callers can bound their total
|
|
20
|
-
* time inside the scheduler — when the signal fires, a still-waiting task
|
|
21
|
-
* rejects immediately instead of sitting behind a saturated worker for
|
|
22
|
-
* minutes.
|
|
21
|
+
* Creates the pacer every NCBI E-utility call runs through. A caller passes its
|
|
22
|
+
* remaining deadline as `maxWaitMs`: a call whose projected wait already exceeds it
|
|
23
|
+
* — behind a deep queue or a closed cooldown gate — is shed at enqueue with a
|
|
24
|
+
* `pacer_shed` rejection carrying `retryAfter`, rather than waiting out a deadline
|
|
25
|
+
* it cannot meet.
|
|
23
26
|
*/
|
|
24
|
-
export declare
|
|
25
|
-
private readonly waiters;
|
|
26
|
-
private readonly minStartGapMs;
|
|
27
|
-
private readonly maxConcurrent;
|
|
28
|
-
private readonly maxQueueSize;
|
|
29
|
-
private inFlight;
|
|
30
|
-
private lastStartTime;
|
|
31
|
-
private nextDispatchTimer;
|
|
32
|
-
constructor(minStartGapMs: number, maxConcurrent?: number, maxQueueSize?: number);
|
|
33
|
-
enqueue<T>(task: () => Promise<T>, endpoint: string, params: NcbiRequestParams, signal?: AbortSignal): Promise<T>;
|
|
34
|
-
private tryDispatch;
|
|
35
|
-
}
|
|
27
|
+
export declare function createNcbiRequestQueue({ maxConcurrent, maxQueueDepth, minStartGapMs, }: NcbiRequestQueueOptions): Pacer;
|
|
36
28
|
//# sourceMappingURL=request-queue.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-queue.d.ts","sourceRoot":"","sources":["../../../src/services/ncbi/request-queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"request-queue.d.ts","sourceRoot":"","sources":["../../../src/services/ncbi/request-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAavE,mDAAmD;AACnD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,EACrC,aAAa,EACb,aAAuC,EACvC,aAAa,GACd,EAAE,uBAAuB,GAAG,KAAK,CAQjC"}
|
|
@@ -1,135 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @fileoverview
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* @fileoverview Request queue for NCBI E-utility calls, built on the framework pacer.
|
|
3
|
+
* Spaces request starts to NCBI's per-second ceiling, caps concurrent in-flight
|
|
4
|
+
* requests and queue depth, releases a waiting caller the moment its signal aborts,
|
|
5
|
+
* and closes one shared cooldown gate for every queued caller when NCBI answers 429.
|
|
6
|
+
* Each retry attempt re-enters the queue, so a throttled upstream paces the whole
|
|
7
|
+
* server rather than each caller retrying into it on its own backoff.
|
|
6
8
|
* @module src/services/ncbi/request-queue
|
|
7
9
|
*/
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
const DEFAULT_MAX_CONCURRENT = 8;
|
|
12
|
-
const DEFAULT_MAX_QUEUE_SIZE = 100;
|
|
10
|
+
import { createPacer } from '@cyanheads/mcp-ts-core/utils';
|
|
11
|
+
/** Waiting callers past which a new arrival is shed at once. */
|
|
12
|
+
const DEFAULT_MAX_QUEUE_DEPTH = 100;
|
|
13
13
|
/**
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* an API key, ≈10/s with one).
|
|
19
|
-
* - **Concurrency** (`maxConcurrent`): maximum number of requests in flight
|
|
20
|
-
* simultaneously. Decouples concurrency from rate, so slow upstream
|
|
21
|
-
* responses don't block new dispatches.
|
|
22
|
-
*
|
|
23
|
-
* Enqueue accepts an optional `AbortSignal` so callers can bound their total
|
|
24
|
-
* time inside the scheduler — when the signal fires, a still-waiting task
|
|
25
|
-
* rejects immediately instead of sitting behind a saturated worker for
|
|
26
|
-
* minutes.
|
|
14
|
+
* Gate closed on an NCBI 429: one second — the width of NCBI's rate window — doubled
|
|
15
|
+
* per consecutive 429 and reset by the first success. An honored `Retry-After` is capped
|
|
16
|
+
* by the same ceiling, a quarter of the default total deadline, so a caller queued
|
|
17
|
+
* behind the longest gate still has budget left for its request.
|
|
27
18
|
*/
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
reason: 'queue_full',
|
|
45
|
-
endpoint,
|
|
46
|
-
queueSize: this.waiters.length,
|
|
47
|
-
...recoveryFor('queue_full'),
|
|
48
|
-
}));
|
|
49
|
-
}
|
|
50
|
-
return new Promise((resolve, reject) => {
|
|
51
|
-
if (signal?.aborted) {
|
|
52
|
-
reject(signal.reason);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
const waiter = {
|
|
56
|
-
resolve,
|
|
57
|
-
reject,
|
|
58
|
-
task,
|
|
59
|
-
endpoint,
|
|
60
|
-
params,
|
|
61
|
-
...(signal && { signal }),
|
|
62
|
-
};
|
|
63
|
-
if (signal) {
|
|
64
|
-
const onAbort = () => {
|
|
65
|
-
const idx = this.waiters.indexOf(waiter);
|
|
66
|
-
if (idx === -1)
|
|
67
|
-
return; // already dispatched — the task forwards its own signal
|
|
68
|
-
this.waiters.splice(idx, 1);
|
|
69
|
-
reject(signal.reason);
|
|
70
|
-
};
|
|
71
|
-
waiter.onAbort = onAbort;
|
|
72
|
-
signal.addEventListener('abort', onAbort, { once: true });
|
|
73
|
-
}
|
|
74
|
-
this.waiters.push(waiter);
|
|
75
|
-
this.tryDispatch();
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
tryDispatch() {
|
|
79
|
-
if (this.nextDispatchTimer !== undefined)
|
|
80
|
-
return;
|
|
81
|
-
while (this.inFlight < this.maxConcurrent && this.waiters.length > 0) {
|
|
82
|
-
const now = Date.now();
|
|
83
|
-
const gap = this.minStartGapMs - (now - this.lastStartTime);
|
|
84
|
-
if (gap > 0) {
|
|
85
|
-
logger.debug(`Delaying next NCBI dispatch by ${gap}ms to respect rate limit.`, requestContextService.createRequestContext({
|
|
86
|
-
operation: 'NcbiQueueWait',
|
|
87
|
-
additionalContext: { delayMs: gap },
|
|
88
|
-
}));
|
|
89
|
-
this.nextDispatchTimer = setTimeout(() => {
|
|
90
|
-
this.nextDispatchTimer = undefined;
|
|
91
|
-
this.tryDispatch();
|
|
92
|
-
}, gap);
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const waiter = this.waiters.shift();
|
|
96
|
-
if (!waiter)
|
|
97
|
-
return;
|
|
98
|
-
// Detach the cancel listener now that we're about to start; the task is
|
|
99
|
-
// responsible for forwarding its own signal to downstream I/O.
|
|
100
|
-
if (waiter.signal && waiter.onAbort) {
|
|
101
|
-
waiter.signal.removeEventListener('abort', waiter.onAbort);
|
|
102
|
-
}
|
|
103
|
-
this.lastStartTime = Date.now();
|
|
104
|
-
this.inFlight += 1;
|
|
105
|
-
logger.info(`Executing NCBI request via queue: ${waiter.endpoint}`, requestContextService.createRequestContext({
|
|
106
|
-
operation: 'NcbiQueueDispatch',
|
|
107
|
-
additionalContext: {
|
|
108
|
-
endpoint: waiter.endpoint,
|
|
109
|
-
inFlight: this.inFlight,
|
|
110
|
-
queueDepth: this.waiters.length,
|
|
111
|
-
},
|
|
112
|
-
}));
|
|
113
|
-
// `Promise.resolve().then(() => task())` converts any sync throw from
|
|
114
|
-
// `task()` into a rejected promise so the finally() bookkeeping always
|
|
115
|
-
// runs.
|
|
116
|
-
Promise.resolve()
|
|
117
|
-
.then(() => waiter.task())
|
|
118
|
-
.then(waiter.resolve, (err) => {
|
|
119
|
-
logger.error('Error processing NCBI request from queue.', requestContextService.createRequestContext({
|
|
120
|
-
operation: 'NcbiQueueProcess',
|
|
121
|
-
additionalContext: {
|
|
122
|
-
endpoint: waiter.endpoint,
|
|
123
|
-
errorMessage: err instanceof Error ? err.message : String(err),
|
|
124
|
-
},
|
|
125
|
-
}));
|
|
126
|
-
waiter.reject(err);
|
|
127
|
-
})
|
|
128
|
-
.finally(() => {
|
|
129
|
-
this.inFlight -= 1;
|
|
130
|
-
this.tryDispatch();
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
}
|
|
19
|
+
const RATE_LIMIT_COOLDOWN = { baseMs: 1_000, maxMs: 15_000 };
|
|
20
|
+
/**
|
|
21
|
+
* Creates the pacer every NCBI E-utility call runs through. A caller passes its
|
|
22
|
+
* remaining deadline as `maxWaitMs`: a call whose projected wait already exceeds it
|
|
23
|
+
* — behind a deep queue or a closed cooldown gate — is shed at enqueue with a
|
|
24
|
+
* `pacer_shed` rejection carrying `retryAfter`, rather than waiting out a deadline
|
|
25
|
+
* it cannot meet.
|
|
26
|
+
*/
|
|
27
|
+
export function createNcbiRequestQueue({ maxConcurrent, maxQueueDepth = DEFAULT_MAX_QUEUE_DEPTH, minStartGapMs, }) {
|
|
28
|
+
return createPacer({
|
|
29
|
+
name: 'ncbi',
|
|
30
|
+
minStartGapMs,
|
|
31
|
+
maxConcurrent,
|
|
32
|
+
maxQueueDepth,
|
|
33
|
+
cooldown: RATE_LIMIT_COOLDOWN,
|
|
34
|
+
});
|
|
134
35
|
}
|
|
135
36
|
//# sourceMappingURL=request-queue.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-queue.js","sourceRoot":"","sources":["../../../src/services/ncbi/request-queue.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"request-queue.js","sourceRoot":"","sources":["../../../src/services/ncbi/request-queue.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,WAAW,EAAc,MAAM,8BAA8B,CAAC;AAEvE,gEAAgE;AAChE,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;;GAKG;AACH,MAAM,mBAAmB,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAY7D;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,EACrC,aAAa,EACb,aAAa,GAAG,uBAAuB,EACvC,aAAa,GACW;IACxB,OAAO,WAAW,CAAC;QACjB,IAAI,EAAE,MAAM;QACZ,aAAa;QACb,aAAa;QACb,aAAa;QACb,QAAQ,EAAE,mBAAmB;KAC9B,CAAC,CAAC;AACL,CAAC"}
|