p2s_mapper 1.1.0 → 1.2.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/README.md +6 -2
- package/dist/fetchUtils.d.ts +14 -1
- package/dist/fetchUtils.js +23 -1
- package/dist/fetchUtils.js.map +1 -1
- package/dist/pdbUniProtMapping.d.ts +11 -2
- package/dist/pdbUniProtMapping.js +13 -3
- package/dist/pdbUniProtMapping.js.map +1 -1
- package/esm/fetchUtils.d.ts +14 -1
- package/esm/fetchUtils.js +20 -1
- package/esm/fetchUtils.js.map +1 -1
- package/esm/pdbUniProtMapping.d.ts +11 -2
- package/esm/pdbUniProtMapping.js +14 -4
- package/esm/pdbUniProtMapping.js.map +1 -1
- package/package.json +1 -1
- package/src/fetchUtils.ts +26 -1
- package/src/pdbUniProtMapping.ts +14 -4
package/README.md
CHANGED
|
@@ -140,8 +140,12 @@ yields a model with thousands of misread atoms and zero polymer entities.
|
|
|
140
140
|
|
|
141
141
|
`caCoordsToPdb`, `hasValidCaCoords` — a PDB file from Foldseek Cα coordinates.
|
|
142
142
|
|
|
143
|
-
`rawfetch`, `myfetch`, `jsonfetch`, `httpError`, `
|
|
144
|
-
`timeout`, `FetchOptions`.
|
|
143
|
+
`rawfetch`, `myfetch`, `jsonfetch`, `httpError`, `HttpError`,
|
|
144
|
+
`isDefinitiveFailure`, `networkError`, `abortError`, `timeout`, `FetchOptions`.
|
|
145
|
+
A failed response throws an `HttpError` carrying its `status`, and
|
|
146
|
+
`isDefinitiveFailure` is true for a 4xx — the server understood and declined, so
|
|
147
|
+
retrying repeats the answer. `fetchUniProtStructureMappings` uses it: PDBe
|
|
148
|
+
answers 404 for an entry it has no UniProt mapping for at all.
|
|
145
149
|
|
|
146
150
|
## License
|
|
147
151
|
|
package/dist/fetchUtils.d.ts
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
3
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
4
|
+
* unchanged, so existing error rendering is unaffected.
|
|
5
|
+
*/
|
|
6
|
+
export declare class HttpError extends Error {
|
|
7
|
+
readonly status: number;
|
|
8
|
+
constructor(message: string, status: number);
|
|
9
|
+
}
|
|
10
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
11
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
12
|
+
* not. */
|
|
13
|
+
export declare function isDefinitiveFailure(e: unknown): boolean;
|
|
1
14
|
/**
|
|
2
15
|
* The error a failed response deserves: status and host, plus at most the first
|
|
3
16
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
4
17
|
* and pasting it into the dialog buries the one line that says what went wrong.
|
|
5
18
|
*/
|
|
6
|
-
export declare function httpError(response: Response, url: string): Promise<
|
|
19
|
+
export declare function httpError(response: Response, url: string): Promise<HttpError>;
|
|
7
20
|
/**
|
|
8
21
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
|
9
22
|
* an offline browser and a refused cross-origin request alike, naming neither
|
package/dist/fetchUtils.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HttpError = void 0;
|
|
4
|
+
exports.isDefinitiveFailure = isDefinitiveFailure;
|
|
3
5
|
exports.httpError = httpError;
|
|
4
6
|
exports.networkError = networkError;
|
|
5
7
|
exports.rawfetch = rawfetch;
|
|
@@ -20,6 +22,26 @@ function firstLine(body) {
|
|
|
20
22
|
const line = body.split('\n', 1)[0]?.trim() ?? '';
|
|
21
23
|
return line.length > MAX_DETAIL ? `${line.slice(0, MAX_DETAIL)}…` : line;
|
|
22
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
27
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
28
|
+
* unchanged, so existing error rendering is unaffected.
|
|
29
|
+
*/
|
|
30
|
+
class HttpError extends Error {
|
|
31
|
+
status;
|
|
32
|
+
constructor(message, status) {
|
|
33
|
+
super(message);
|
|
34
|
+
this.name = 'HttpError';
|
|
35
|
+
this.status = status;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.HttpError = HttpError;
|
|
39
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
40
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
41
|
+
* not. */
|
|
42
|
+
function isDefinitiveFailure(e) {
|
|
43
|
+
return e instanceof HttpError && e.status >= 400 && e.status < 500;
|
|
44
|
+
}
|
|
23
45
|
/**
|
|
24
46
|
* The error a failed response deserves: status and host, plus at most the first
|
|
25
47
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
@@ -28,7 +50,7 @@ function firstLine(body) {
|
|
|
28
50
|
async function httpError(response, url) {
|
|
29
51
|
const detail = firstLine(await response.text().catch(() => ''));
|
|
30
52
|
const status = `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''} from ${hostOf(url)}`;
|
|
31
|
-
return new
|
|
53
|
+
return new HttpError(detail ? `${status}: ${detail}` : status, response.status);
|
|
32
54
|
}
|
|
33
55
|
/**
|
|
34
56
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
package/dist/fetchUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,8 +28,17 @@ export interface UniProtStructureMapping {
|
|
|
28
28
|
*/
|
|
29
29
|
export type MapUniProtPosition = (uniprotPos: number) => number | undefined;
|
|
30
30
|
export declare function pdbeSiftsUrl(pdbId: string): string;
|
|
31
|
-
/**
|
|
32
|
-
*
|
|
31
|
+
/**
|
|
32
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
33
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
34
|
+
*
|
|
35
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
36
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
37
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
38
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
39
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
40
|
+
* resolve.
|
|
41
|
+
*/
|
|
33
42
|
export declare function fetchUniProtStructureMappings(pdbId: string, opts?: FetchOptions): Promise<UniProtStructureMapping[]>;
|
|
34
43
|
/**
|
|
35
44
|
* Parses a PDBe `mappings/uniprot/{pdbId}` response into one entry per UniProt
|
|
@@ -29,8 +29,17 @@ function pdbeSiftsUrl(pdbId) {
|
|
|
29
29
|
const SIFTS_RETRY_DELAYS_MS = [1000, 3000];
|
|
30
30
|
// bounded, since a view reports itself loading until SIFTS answers
|
|
31
31
|
const SIFTS_TIMEOUT_MS = 20_000;
|
|
32
|
-
/**
|
|
33
|
-
*
|
|
32
|
+
/**
|
|
33
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
34
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
35
|
+
*
|
|
36
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
37
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
38
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
39
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
40
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
41
|
+
* resolve.
|
|
42
|
+
*/
|
|
34
43
|
async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
35
44
|
const { signal: caller, ...rest } = opts ?? {};
|
|
36
45
|
const signal = caller ?? undefined;
|
|
@@ -43,7 +52,8 @@ async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
|
43
52
|
}
|
|
44
53
|
catch (e) {
|
|
45
54
|
const delay = SIFTS_RETRY_DELAYS_MS[attempt];
|
|
46
|
-
|
|
55
|
+
// the caller's own abort is not a failure to retry either
|
|
56
|
+
if (delay === undefined || (0, fetchUtils_ts_1.isDefinitiveFailure)(e) || signal?.aborted) {
|
|
47
57
|
throw e;
|
|
48
58
|
}
|
|
49
59
|
await (0, fetchUtils_ts_1.timeout)(delay, signal);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,4BAA4B;AAC5B,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,eAAe;;;AAqCf,oCAEC;
|
|
1
|
+
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":"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"}
|
package/esm/fetchUtils.d.ts
CHANGED
|
@@ -1,9 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
3
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
4
|
+
* unchanged, so existing error rendering is unaffected.
|
|
5
|
+
*/
|
|
6
|
+
export declare class HttpError extends Error {
|
|
7
|
+
readonly status: number;
|
|
8
|
+
constructor(message: string, status: number);
|
|
9
|
+
}
|
|
10
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
11
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
12
|
+
* not. */
|
|
13
|
+
export declare function isDefinitiveFailure(e: unknown): boolean;
|
|
1
14
|
/**
|
|
2
15
|
* The error a failed response deserves: status and host, plus at most the first
|
|
3
16
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
4
17
|
* and pasting it into the dialog buries the one line that says what went wrong.
|
|
5
18
|
*/
|
|
6
|
-
export declare function httpError(response: Response, url: string): Promise<
|
|
19
|
+
export declare function httpError(response: Response, url: string): Promise<HttpError>;
|
|
7
20
|
/**
|
|
8
21
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
|
9
22
|
* an offline browser and a refused cross-origin request alike, naming neither
|
package/esm/fetchUtils.js
CHANGED
|
@@ -11,6 +11,25 @@ function firstLine(body) {
|
|
|
11
11
|
const line = body.split('\n', 1)[0]?.trim() ?? '';
|
|
12
12
|
return line.length > MAX_DETAIL ? `${line.slice(0, MAX_DETAIL)}…` : line;
|
|
13
13
|
}
|
|
14
|
+
/**
|
|
15
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
16
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
17
|
+
* unchanged, so existing error rendering is unaffected.
|
|
18
|
+
*/
|
|
19
|
+
export class HttpError extends Error {
|
|
20
|
+
status;
|
|
21
|
+
constructor(message, status) {
|
|
22
|
+
super(message);
|
|
23
|
+
this.name = 'HttpError';
|
|
24
|
+
this.status = status;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
28
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
29
|
+
* not. */
|
|
30
|
+
export function isDefinitiveFailure(e) {
|
|
31
|
+
return e instanceof HttpError && e.status >= 400 && e.status < 500;
|
|
32
|
+
}
|
|
14
33
|
/**
|
|
15
34
|
* The error a failed response deserves: status and host, plus at most the first
|
|
16
35
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
@@ -19,7 +38,7 @@ function firstLine(body) {
|
|
|
19
38
|
export async function httpError(response, url) {
|
|
20
39
|
const detail = firstLine(await response.text().catch(() => ''));
|
|
21
40
|
const status = `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''} from ${hostOf(url)}`;
|
|
22
|
-
return new
|
|
41
|
+
return new HttpError(detail ? `${status}: ${detail}` : status, response.status);
|
|
23
42
|
}
|
|
24
43
|
/**
|
|
25
44
|
* `fetch` rejects with a bare `TypeError: Failed to fetch` for a DNS failure,
|
package/esm/fetchUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"AAAA,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,GAAG,CAAA;AAEtB,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACjD,OAAO,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB,EAAE,GAAW;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,QAAQ,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACnH,OAAO,IAAI,
|
|
1
|
+
{"version":3,"file":"fetchUtils.js","sourceRoot":"","sources":["../src/fetchUtils.ts"],"names":[],"mappings":"AAAA,SAAS,MAAM,CAAC,GAAW;IACzB,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAA;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAA;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,GAAG,CAAA;AAEtB,SAAS,SAAS,CAAC,IAAY;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;IACjD,OAAO,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1E,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAQ;IAEvB,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,WAAW,CAAA;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;CACF;AAED;;UAEU;AACV,MAAM,UAAU,mBAAmB,CAAC,CAAU;IAC5C,OAAO,CAAC,YAAY,SAAS,IAAI,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,CAAA;AACpE,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAkB,EAAE,GAAW;IAC7D,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC/D,MAAM,MAAM,GAAG,QAAQ,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;IACnH,OAAO,IAAI,SAAS,CAClB,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,EACxC,QAAQ,CAAC,MAAM,CAChB,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAAc;IACtD,OAAO,KAAK,YAAY,SAAS;QAC/B,CAAC,CAAC,IAAI,KAAK,CACP,mBAAmB,MAAM,CAAC,GAAG,CAAC,wGAAwG,EACtI,EAAE,KAAK,EAAE,CACV;QACH,CAAC,CAAC,KAAK,CAAA;AACX,CAAC;AAaD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAmB;IAC7D,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,CAAA;IAC3D,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC3B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC5B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAmB;IAC5D,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAE1C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,MAAM,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;IACtC,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,GAAW,EACX,IAAmB;IAEnB,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,QAAQ,GAA+B,MAAM,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IACrE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAA;AACxB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAmB;IAC5C,OAAO,MAAM,CAAC,MAAM,YAAY,KAAK;QACnC,CAAC,CAAC,MAAM,CAAC,MAAM;QACf,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,MAAoB;IACxD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;QAC5B,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACpC,MAAM,EAAE,gBAAgB,CACtB,OAAO,EACP,GAAG,EAAE;gBACH,YAAY,CAAC,EAAE,CAAC,CAAA;gBAChB,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAA;YAC5B,CAAC,EACD,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -28,8 +28,17 @@ export interface UniProtStructureMapping {
|
|
|
28
28
|
*/
|
|
29
29
|
export type MapUniProtPosition = (uniprotPos: number) => number | undefined;
|
|
30
30
|
export declare function pdbeSiftsUrl(pdbId: string): string;
|
|
31
|
-
/**
|
|
32
|
-
*
|
|
31
|
+
/**
|
|
32
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
33
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
34
|
+
*
|
|
35
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
36
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
37
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
38
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
39
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
40
|
+
* resolve.
|
|
41
|
+
*/
|
|
33
42
|
export declare function fetchUniProtStructureMappings(pdbId: string, opts?: FetchOptions): Promise<UniProtStructureMapping[]>;
|
|
34
43
|
/**
|
|
35
44
|
* Parses a PDBe `mappings/uniprot/{pdbId}` response into one entry per UniProt
|
package/esm/pdbUniProtMapping.js
CHANGED
|
@@ -13,15 +13,24 @@
|
|
|
13
13
|
// SEQRES, i.e. label_seq_id, which is exactly this plugin's structure-sequence
|
|
14
14
|
// position + 1 (see applyLociInteractivity.ts for the other place that boundary
|
|
15
15
|
// is crossed).
|
|
16
|
-
import { jsonfetch, timeout } from "./fetchUtils.js";
|
|
16
|
+
import { isDefinitiveFailure, jsonfetch, timeout } from "./fetchUtils.js";
|
|
17
17
|
export function pdbeSiftsUrl(pdbId) {
|
|
18
18
|
return `https://www.ebi.ac.uk/pdbe/api/mappings/uniprot/${pdbId.toLowerCase()}`;
|
|
19
19
|
}
|
|
20
20
|
const SIFTS_RETRY_DELAYS_MS = [1000, 3000];
|
|
21
21
|
// bounded, since a view reports itself loading until SIFTS answers
|
|
22
22
|
const SIFTS_TIMEOUT_MS = 20_000;
|
|
23
|
-
/**
|
|
24
|
-
*
|
|
23
|
+
/**
|
|
24
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
25
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
26
|
+
*
|
|
27
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
28
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
29
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
30
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
31
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
32
|
+
* resolve.
|
|
33
|
+
*/
|
|
25
34
|
export async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
26
35
|
const { signal: caller, ...rest } = opts ?? {};
|
|
27
36
|
const signal = caller ?? undefined;
|
|
@@ -34,7 +43,8 @@ export async function fetchUniProtStructureMappings(pdbId, opts) {
|
|
|
34
43
|
}
|
|
35
44
|
catch (e) {
|
|
36
45
|
const delay = SIFTS_RETRY_DELAYS_MS[attempt];
|
|
37
|
-
|
|
46
|
+
// the caller's own abort is not a failure to retry either
|
|
47
|
+
if (delay === undefined || isDefinitiveFailure(e) || signal?.aborted) {
|
|
38
48
|
throw e;
|
|
39
49
|
}
|
|
40
50
|
await timeout(delay, signal);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":"AAAA,yCAAyC;AACzC,EAAE;AACF,+EAA+E;AAC/E,iFAAiF;AACjF,+EAA+E;AAC/E,6EAA6E;AAC7E,6EAA6E;AAC7E,2EAA2E;AAC3E,+EAA+E;AAC/E,4BAA4B;AAC5B,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,eAAe;AAEf,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"pdbUniProtMapping.js","sourceRoot":"","sources":["../src/pdbUniProtMapping.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "p2s_mapper",
|
|
3
3
|
"description": "Map a transcript's translation onto a protein structure: alignment, coordinates, chain choice, SIFTS, and the AlphaFold and PDBe lookups that find the structure",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"packageManager": "pnpm@11.15.1",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
package/src/fetchUtils.ts
CHANGED
|
@@ -13,6 +13,28 @@ function firstLine(body: string) {
|
|
|
13
13
|
return line.length > MAX_DETAIL ? `${line.slice(0, MAX_DETAIL)}…` : line
|
|
14
14
|
}
|
|
15
15
|
|
|
16
|
+
/**
|
|
17
|
+
* A failed response, carrying its status so a caller can tell a definitive
|
|
18
|
+
* refusal from one worth asking again. `instanceof Error` and the message are
|
|
19
|
+
* unchanged, so existing error rendering is unaffected.
|
|
20
|
+
*/
|
|
21
|
+
export class HttpError extends Error {
|
|
22
|
+
readonly status: number
|
|
23
|
+
|
|
24
|
+
constructor(message: string, status: number) {
|
|
25
|
+
super(message)
|
|
26
|
+
this.name = 'HttpError'
|
|
27
|
+
this.status = status
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** A 4xx means the server understood and declined, so asking again gets the
|
|
32
|
+
* same answer. Anything else — 5xx, a timeout, a dropped connection — might
|
|
33
|
+
* not. */
|
|
34
|
+
export function isDefinitiveFailure(e: unknown) {
|
|
35
|
+
return e instanceof HttpError && e.status >= 400 && e.status < 500
|
|
36
|
+
}
|
|
37
|
+
|
|
16
38
|
/**
|
|
17
39
|
* The error a failed response deserves: status and host, plus at most the first
|
|
18
40
|
* line of the body. A whole body is an HTML error page or a megabyte of JSON,
|
|
@@ -21,7 +43,10 @@ function firstLine(body: string) {
|
|
|
21
43
|
export async function httpError(response: Response, url: string) {
|
|
22
44
|
const detail = firstLine(await response.text().catch(() => ''))
|
|
23
45
|
const status = `HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''} from ${hostOf(url)}`
|
|
24
|
-
return new
|
|
46
|
+
return new HttpError(
|
|
47
|
+
detail ? `${status}: ${detail}` : status,
|
|
48
|
+
response.status,
|
|
49
|
+
)
|
|
25
50
|
}
|
|
26
51
|
|
|
27
52
|
/**
|
package/src/pdbUniProtMapping.ts
CHANGED
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// position + 1 (see applyLociInteractivity.ts for the other place that boundary
|
|
15
15
|
// is crossed).
|
|
16
16
|
|
|
17
|
-
import { jsonfetch, timeout } from './fetchUtils.ts'
|
|
17
|
+
import { isDefinitiveFailure, jsonfetch, timeout } from './fetchUtils.ts'
|
|
18
18
|
|
|
19
19
|
import type { FetchOptions } from './fetchUtils.ts'
|
|
20
20
|
|
|
@@ -57,8 +57,17 @@ const SIFTS_RETRY_DELAYS_MS = [1000, 3000]
|
|
|
57
57
|
// bounded, since a view reports itself loading until SIFTS answers
|
|
58
58
|
const SIFTS_TIMEOUT_MS = 20_000
|
|
59
59
|
|
|
60
|
-
/**
|
|
61
|
-
*
|
|
60
|
+
/**
|
|
61
|
+
* SIFTS for an entry, retried twice: one failed request would otherwise leave a
|
|
62
|
+
* fusion construct mapped onto its partner for the whole session.
|
|
63
|
+
*
|
|
64
|
+
* A 4xx is not retried. PDBe answers 404 for an entry it has no UniProt
|
|
65
|
+
* mapping for at all — a DNA-only or obsolete entry — and that answer cannot
|
|
66
|
+
* change, so the retries only postponed it: measured 2026-09-16, `1hhb` and
|
|
67
|
+
* `1bna` each took three requests and ~4.8s to say so, which a caller shows as
|
|
68
|
+
* four and a half seconds of "resolving" for a structure that will never
|
|
69
|
+
* resolve.
|
|
70
|
+
*/
|
|
62
71
|
export async function fetchUniProtStructureMappings(
|
|
63
72
|
pdbId: string,
|
|
64
73
|
opts?: FetchOptions,
|
|
@@ -76,7 +85,8 @@ export async function fetchUniProtStructureMappings(
|
|
|
76
85
|
)
|
|
77
86
|
} catch (e) {
|
|
78
87
|
const delay = SIFTS_RETRY_DELAYS_MS[attempt]
|
|
79
|
-
|
|
88
|
+
// the caller's own abort is not a failure to retry either
|
|
89
|
+
if (delay === undefined || isDefinitiveFailure(e) || signal?.aborted) {
|
|
80
90
|
throw e
|
|
81
91
|
}
|
|
82
92
|
await timeout(delay, signal)
|