@media-engine/providers 0.1.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/README.md +85 -25
- package/README.ru.md +90 -26
- package/dist/aniliberty-streaming/client.d.ts +33 -0
- package/dist/aniliberty-streaming/client.js +188 -0
- package/dist/aniliberty-streaming/client.js.map +1 -0
- package/dist/aniliberty-streaming/config.d.ts +24 -0
- package/dist/aniliberty-streaming/config.js +61 -0
- package/dist/aniliberty-streaming/config.js.map +1 -0
- package/dist/aniliberty-streaming/index.d.ts +4 -0
- package/dist/aniliberty-streaming/index.js +45 -0
- package/dist/aniliberty-streaming/index.js.map +1 -0
- package/dist/aniliberty-streaming/mapping.d.ts +3 -0
- package/dist/aniliberty-streaming/mapping.js +87 -0
- package/dist/aniliberty-streaming/mapping.js.map +1 -0
- package/dist/aniliberty-streaming/matching.d.ts +4 -0
- package/dist/aniliberty-streaming/matching.js +44 -0
- package/dist/aniliberty-streaming/matching.js.map +1 -0
- package/dist/anilist/graphql.d.ts +2 -0
- package/dist/anilist/graphql.js +135 -0
- package/dist/anilist/graphql.js.map +1 -0
- package/dist/anilist/index.js +8 -6
- package/dist/anilist/index.js.map +1 -1
- package/dist/bitsearch-torrent/client.d.ts +19 -0
- package/dist/bitsearch-torrent/client.js +181 -0
- package/dist/bitsearch-torrent/client.js.map +1 -0
- package/dist/bitsearch-torrent/config.d.ts +26 -0
- package/dist/bitsearch-torrent/config.js +74 -0
- package/dist/bitsearch-torrent/config.js.map +1 -0
- package/dist/bitsearch-torrent/index.d.ts +4 -0
- package/dist/bitsearch-torrent/index.js +35 -0
- package/dist/bitsearch-torrent/index.js.map +1 -0
- package/dist/bitsearch-torrent/mapping.d.ts +3 -0
- package/dist/bitsearch-torrent/mapping.js +53 -0
- package/dist/bitsearch-torrent/mapping.js.map +1 -0
- package/dist/bitsearch-torrent/matching.d.ts +3 -0
- package/dist/bitsearch-torrent/matching.js +13 -0
- package/dist/bitsearch-torrent/matching.js.map +1 -0
- package/dist/bitsearch-torrent/quota.d.ts +9 -0
- package/dist/bitsearch-torrent/quota.js +53 -0
- package/dist/bitsearch-torrent/quota.js.map +1 -0
- package/dist/cinemeta/index.js +37 -12
- package/dist/cinemeta/index.js.map +1 -1
- package/dist/ddbb-streaming/client.d.ts +24 -0
- package/dist/ddbb-streaming/client.js +98 -0
- package/dist/ddbb-streaming/client.js.map +1 -0
- package/dist/ddbb-streaming/config.d.ts +31 -0
- package/dist/ddbb-streaming/config.js +67 -0
- package/dist/ddbb-streaming/config.js.map +1 -0
- package/dist/ddbb-streaming/index.d.ts +4 -0
- package/dist/ddbb-streaming/index.js +53 -0
- package/dist/ddbb-streaming/index.js.map +1 -0
- package/dist/ddbb-streaming/mapping.d.ts +8 -0
- package/dist/ddbb-streaming/mapping.js +164 -0
- package/dist/ddbb-streaming/mapping.js.map +1 -0
- package/dist/ddbb-streaming/validation.d.ts +3 -0
- package/dist/ddbb-streaming/validation.js +84 -0
- package/dist/ddbb-streaming/validation.js.map +1 -0
- package/dist/experimental-streaming/index.js +55 -0
- package/dist/experimental-streaming/index.js.map +1 -1
- package/dist/filmix-streaming/client.d.ts +36 -0
- package/dist/filmix-streaming/client.js +241 -0
- package/dist/filmix-streaming/client.js.map +1 -0
- package/dist/filmix-streaming/config.d.ts +42 -0
- package/dist/filmix-streaming/config.js +93 -0
- package/dist/filmix-streaming/config.js.map +1 -0
- package/dist/filmix-streaming/index.d.ts +4 -0
- package/dist/filmix-streaming/index.js +48 -0
- package/dist/filmix-streaming/index.js.map +1 -0
- package/dist/filmix-streaming/mapping.d.ts +3 -0
- package/dist/filmix-streaming/mapping.js +109 -0
- package/dist/filmix-streaming/mapping.js.map +1 -0
- package/dist/filmix-streaming/matching.d.ts +4 -0
- package/dist/filmix-streaming/matching.js +41 -0
- package/dist/filmix-streaming/matching.js.map +1 -0
- package/dist/flixhq-streaming/client.d.ts +12 -0
- package/dist/flixhq-streaming/client.js +103 -0
- package/dist/flixhq-streaming/client.js.map +1 -0
- package/dist/flixhq-streaming/index.d.ts +2 -2
- package/dist/flixhq-streaming/index.js +58 -104
- package/dist/flixhq-streaming/index.js.map +1 -1
- package/dist/imdb-dataset/index.d.ts +20 -5
- package/dist/imdb-dataset/index.js +82 -184
- package/dist/imdb-dataset/index.js.map +1 -1
- package/dist/imdb-dataset/memory-storage.d.ts +7 -0
- package/dist/imdb-dataset/memory-storage.js +168 -0
- package/dist/imdb-dataset/memory-storage.js.map +1 -0
- package/dist/imdb-dataset/sqlite-import.d.ts +24 -0
- package/dist/imdb-dataset/sqlite-import.js +301 -0
- package/dist/imdb-dataset/sqlite-import.js.map +1 -0
- package/dist/imdb-dataset/sqlite-runtime.d.ts +3 -0
- package/dist/imdb-dataset/sqlite-runtime.js +11 -0
- package/dist/imdb-dataset/sqlite-runtime.js.map +1 -0
- package/dist/imdb-dataset/sqlite-schema.d.ts +6 -0
- package/dist/imdb-dataset/sqlite-schema.js +88 -0
- package/dist/imdb-dataset/sqlite-schema.js.map +1 -0
- package/dist/imdb-dataset/sqlite-storage.d.ts +12 -0
- package/dist/imdb-dataset/sqlite-storage.js +208 -0
- package/dist/imdb-dataset/sqlite-storage.js.map +1 -0
- package/dist/imdb-dataset/storage.d.ts +33 -0
- package/dist/imdb-dataset/storage.js +2 -0
- package/dist/imdb-dataset/storage.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -1
- package/dist/jacred-torrent/client.d.ts +24 -0
- package/dist/jacred-torrent/client.js +254 -0
- package/dist/jacred-torrent/client.js.map +1 -0
- package/dist/jacred-torrent/config.d.ts +24 -0
- package/dist/jacred-torrent/config.js +70 -0
- package/dist/jacred-torrent/config.js.map +1 -0
- package/dist/jacred-torrent/index.d.ts +4 -0
- package/dist/jacred-torrent/index.js +45 -0
- package/dist/jacred-torrent/index.js.map +1 -0
- package/dist/jacred-torrent/mapping.d.ts +3 -0
- package/dist/jacred-torrent/mapping.js +129 -0
- package/dist/jacred-torrent/mapping.js.map +1 -0
- package/dist/jacred-torrent/matching.d.ts +3 -0
- package/dist/jacred-torrent/matching.js +19 -0
- package/dist/jacred-torrent/matching.js.map +1 -0
- package/dist/kinobd/index.js +5 -6
- package/dist/kinobd/index.js.map +1 -1
- package/dist/kinobd-streaming/availability.js +52 -29
- package/dist/kinobd-streaming/availability.js.map +1 -1
- package/dist/kinobd-streaming/candidates.d.ts +3 -2
- package/dist/kinobd-streaming/candidates.js +89 -37
- package/dist/kinobd-streaming/candidates.js.map +1 -1
- package/dist/kinobd-streaming/config.d.ts +15 -0
- package/dist/kinobd-streaming/config.js +21 -17
- package/dist/kinobd-streaming/config.js.map +1 -1
- package/dist/kinobd-streaming/index.d.ts +1 -1
- package/dist/kinobd-streaming/index.js.map +1 -1
- package/dist/kinobd-streaming/players.d.ts +2 -1
- package/dist/kinobd-streaming/players.js +7 -7
- package/dist/kinobd-streaming/players.js.map +1 -1
- package/dist/kinobd-streaming/request-budget.d.ts +15 -0
- package/dist/kinobd-streaming/request-budget.js +61 -0
- package/dist/kinobd-streaming/request-budget.js.map +1 -0
- package/dist/kinobd-streaming/validation.d.ts +5 -3
- package/dist/kinobd-streaming/validation.js +78 -49
- package/dist/kinobd-streaming/validation.js.map +1 -1
- package/dist/magnetz-torrent/client.d.ts +16 -0
- package/dist/magnetz-torrent/client.js +235 -0
- package/dist/magnetz-torrent/client.js.map +1 -0
- package/dist/magnetz-torrent/config.d.ts +27 -0
- package/dist/magnetz-torrent/config.js +73 -0
- package/dist/magnetz-torrent/config.js.map +1 -0
- package/dist/magnetz-torrent/index.d.ts +4 -0
- package/dist/magnetz-torrent/index.js +35 -0
- package/dist/magnetz-torrent/index.js.map +1 -0
- package/dist/magnetz-torrent/mapping.d.ts +3 -0
- package/dist/magnetz-torrent/mapping.js +52 -0
- package/dist/magnetz-torrent/mapping.js.map +1 -0
- package/dist/magnetz-torrent/matching.d.ts +3 -0
- package/dist/magnetz-torrent/matching.js +5 -0
- package/dist/magnetz-torrent/matching.js.map +1 -0
- package/dist/magnetz-torrent/request-gate.d.ts +9 -0
- package/dist/magnetz-torrent/request-gate.js +48 -0
- package/dist/magnetz-torrent/request-gate.js.map +1 -0
- package/dist/package-version.d.ts +2 -0
- package/dist/package-version.js +5 -0
- package/dist/package-version.js.map +1 -0
- package/dist/rutube-streaming/client.d.ts +18 -0
- package/dist/rutube-streaming/client.js +106 -0
- package/dist/rutube-streaming/client.js.map +1 -0
- package/dist/rutube-streaming/config.d.ts +26 -0
- package/dist/rutube-streaming/config.js +57 -0
- package/dist/rutube-streaming/config.js.map +1 -0
- package/dist/rutube-streaming/index.d.ts +4 -0
- package/dist/rutube-streaming/index.js +38 -0
- package/dist/rutube-streaming/index.js.map +1 -0
- package/dist/rutube-streaming/mapping.d.ts +4 -0
- package/dist/rutube-streaming/mapping.js +32 -0
- package/dist/rutube-streaming/mapping.js.map +1 -0
- package/dist/rutube-streaming/matching.d.ts +2 -0
- package/dist/rutube-streaming/matching.js +37 -0
- package/dist/rutube-streaming/matching.js.map +1 -0
- package/dist/shared/abort.d.ts +1 -0
- package/dist/shared/abort.js +22 -0
- package/dist/shared/abort.js.map +1 -1
- package/dist/shared/http.d.ts +8 -2
- package/dist/shared/http.js +37 -67
- package/dist/shared/http.js.map +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.js +1 -0
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/mapping.js +3 -1
- package/dist/shared/mapping.js.map +1 -1
- package/dist/shared/output-url.d.ts +2 -0
- package/dist/shared/output-url.js +50 -0
- package/dist/shared/output-url.js.map +1 -0
- package/dist/shared/rate-limit.js +2 -18
- package/dist/shared/rate-limit.js.map +1 -1
- package/dist/shared/response-body.d.ts +6 -0
- package/dist/shared/response-body.js +109 -0
- package/dist/shared/response-body.js.map +1 -0
- package/dist/shared/safe-fetch.d.ts +16 -0
- package/dist/shared/safe-fetch.js +300 -0
- package/dist/shared/safe-fetch.js.map +1 -0
- package/dist/shared/torrent-release-matching.d.ts +7 -0
- package/dist/shared/torrent-release-matching.js +143 -0
- package/dist/shared/torrent-release-matching.js.map +1 -0
- package/dist/shared/torrent-release-metadata.d.ts +4 -0
- package/dist/shared/torrent-release-metadata.js +95 -0
- package/dist/shared/torrent-release-metadata.js.map +1 -0
- package/dist/shikimori/index.js +4 -7
- package/dist/shikimori/index.js.map +1 -1
- package/dist/tvmaze/index.d.ts +11 -0
- package/dist/tvmaze/index.js +274 -0
- package/dist/tvmaze/index.js.map +1 -0
- package/dist/veoveo-streaming/client.d.ts +28 -0
- package/dist/veoveo-streaming/client.js +212 -0
- package/dist/veoveo-streaming/client.js.map +1 -0
- package/dist/veoveo-streaming/config.d.ts +32 -0
- package/dist/veoveo-streaming/config.js +67 -0
- package/dist/veoveo-streaming/config.js.map +1 -0
- package/dist/veoveo-streaming/index.d.ts +4 -0
- package/dist/veoveo-streaming/index.js +46 -0
- package/dist/veoveo-streaming/index.js.map +1 -0
- package/dist/veoveo-streaming/mapping.d.ts +3 -0
- package/dist/veoveo-streaming/mapping.js +121 -0
- package/dist/veoveo-streaming/mapping.js.map +1 -0
- package/dist/videohub-streaming/client.d.ts +33 -0
- package/dist/videohub-streaming/client.js +208 -0
- package/dist/videohub-streaming/client.js.map +1 -0
- package/dist/videohub-streaming/config.d.ts +34 -0
- package/dist/videohub-streaming/config.js +73 -0
- package/dist/videohub-streaming/config.js.map +1 -0
- package/dist/videohub-streaming/index.d.ts +4 -0
- package/dist/videohub-streaming/index.js +53 -0
- package/dist/videohub-streaming/index.js.map +1 -0
- package/dist/videohub-streaming/mapping.d.ts +3 -0
- package/dist/videohub-streaming/mapping.js +84 -0
- package/dist/videohub-streaming/mapping.js.map +1 -0
- package/dist/wikidata/cache.d.ts +11 -0
- package/dist/wikidata/cache.js +30 -0
- package/dist/wikidata/cache.js.map +1 -0
- package/dist/wikidata/candidates.d.ts +12 -0
- package/dist/wikidata/candidates.js +67 -0
- package/dist/wikidata/candidates.js.map +1 -0
- package/dist/wikidata/client.d.ts +40 -0
- package/dist/wikidata/client.js +224 -0
- package/dist/wikidata/client.js.map +1 -0
- package/dist/wikidata/index.d.ts +3 -0
- package/dist/wikidata/index.js +30 -104
- package/dist/wikidata/index.js.map +1 -1
- package/dist/yts-torrent/client.d.ts +25 -0
- package/dist/yts-torrent/client.js +163 -0
- package/dist/yts-torrent/client.js.map +1 -0
- package/dist/yts-torrent/config.d.ts +22 -0
- package/dist/yts-torrent/config.js +57 -0
- package/dist/yts-torrent/config.js.map +1 -0
- package/dist/yts-torrent/index.d.ts +4 -0
- package/dist/yts-torrent/index.js +42 -0
- package/dist/yts-torrent/index.js.map +1 -0
- package/dist/yts-torrent/mapping.d.ts +4 -0
- package/dist/yts-torrent/mapping.js +107 -0
- package/dist/yts-torrent/mapping.js.map +1 -0
- package/package.json +23 -5
package/dist/shared/http.js
CHANGED
|
@@ -1,60 +1,15 @@
|
|
|
1
1
|
import { ProviderError } from "@media-engine/core";
|
|
2
|
+
import { readBoundedResponseText } from "./response-body.js";
|
|
2
3
|
import { calculateRetryDelayMs, parseRetryAfterMs } from "./retry.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
url.username !== "" ||
|
|
13
|
-
url.password !== "" ||
|
|
14
|
-
isPrivateHostname(url.hostname)) {
|
|
15
|
-
return undefined;
|
|
16
|
-
}
|
|
17
|
-
return url.href;
|
|
18
|
-
}
|
|
19
|
-
catch {
|
|
20
|
-
return undefined;
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
function isPrivateHostname(value) {
|
|
24
|
-
const hostname = value
|
|
25
|
-
.toLowerCase()
|
|
26
|
-
.replace(/^\[|\]$/g, "")
|
|
27
|
-
.replace(/\.$/, "");
|
|
28
|
-
if (hostname === "localhost" ||
|
|
29
|
-
hostname.endsWith(".localhost") ||
|
|
30
|
-
hostname === "0.0.0.0" ||
|
|
31
|
-
hostname === "::" ||
|
|
32
|
-
hostname === "::1") {
|
|
33
|
-
return true;
|
|
34
|
-
}
|
|
35
|
-
if (hostname.includes(":")) {
|
|
36
|
-
const first = Number.parseInt(hostname.split(":")[0] ?? "", 16);
|
|
37
|
-
return (hostname.startsWith("::ffff:") ||
|
|
38
|
-
(first >= 0xfc00 && first <= 0xfdff) ||
|
|
39
|
-
(first >= 0xfe80 && first <= 0xfebf));
|
|
40
|
-
}
|
|
41
|
-
const octets = hostname.split(".").map(Number);
|
|
42
|
-
if (octets.length !== 4 ||
|
|
43
|
-
octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {
|
|
44
|
-
return false;
|
|
45
|
-
}
|
|
46
|
-
const [first, second] = octets;
|
|
47
|
-
return (first === 0 ||
|
|
48
|
-
first === 10 ||
|
|
49
|
-
first === 127 ||
|
|
50
|
-
(first === 100 && second >= 64 && second <= 127) ||
|
|
51
|
-
(first === 169 && second === 254) ||
|
|
52
|
-
(first === 172 && second >= 16 && second <= 31) ||
|
|
53
|
-
(first === 192 && second === 0) ||
|
|
54
|
-
(first === 192 && second === 168) ||
|
|
55
|
-
(first === 198 && (second === 18 || second === 19)) ||
|
|
56
|
-
first >= 224);
|
|
57
|
-
}
|
|
4
|
+
const DEFAULT_MAX_JSON_RESPONSE_BYTES = 4 * 1024 * 1024;
|
|
5
|
+
const defaultScheduler = {
|
|
6
|
+
setTimeout(callback, delayMs) {
|
|
7
|
+
return setTimeout(callback, delayMs);
|
|
8
|
+
},
|
|
9
|
+
clearTimeout(handle) {
|
|
10
|
+
clearTimeout(handle);
|
|
11
|
+
},
|
|
12
|
+
};
|
|
58
13
|
// Reads JSON through fetch and maps failures to ProviderError.
|
|
59
14
|
// Читает JSON через fetch и преобразует сбои в ProviderError.
|
|
60
15
|
export async function fetchJson(options) {
|
|
@@ -62,10 +17,16 @@ export async function fetchJson(options) {
|
|
|
62
17
|
const retryDelayMs = options.retryDelayMs ?? 150;
|
|
63
18
|
const maxRetryDelayMs = options.maxRetryDelayMs ?? 2_000;
|
|
64
19
|
const retryJitterRatio = options.retryJitterRatio ?? 0.2;
|
|
65
|
-
const
|
|
20
|
+
const maxResponseBytes = options.maxResponseBytes ?? DEFAULT_MAX_JSON_RESPONSE_BYTES;
|
|
21
|
+
if (!Number.isSafeInteger(maxResponseBytes) || maxResponseBytes <= 0) {
|
|
22
|
+
throw new TypeError("fetchJson maxResponseBytes must be a positive safe integer.");
|
|
23
|
+
}
|
|
24
|
+
const scheduler = options.scheduler ?? defaultScheduler;
|
|
25
|
+
const timeout = createProviderTimeout(options.provider, options.context, scheduler);
|
|
66
26
|
const signal = mergeAbortSignals(options.context?.signal, timeout.controller.signal);
|
|
67
27
|
const boundedOptions = {
|
|
68
28
|
...options,
|
|
29
|
+
maxResponseBytes,
|
|
69
30
|
context: {
|
|
70
31
|
...options.context,
|
|
71
32
|
signal,
|
|
@@ -95,7 +56,7 @@ export async function fetchJson(options) {
|
|
|
95
56
|
if (!providerError.retryable || attempt >= maxRetries) {
|
|
96
57
|
throw providerError;
|
|
97
58
|
}
|
|
98
|
-
await delay(retryDelay, signal);
|
|
59
|
+
await delay(retryDelay, signal, scheduler);
|
|
99
60
|
attempt += 1;
|
|
100
61
|
}
|
|
101
62
|
}
|
|
@@ -109,7 +70,7 @@ export async function fetchJson(options) {
|
|
|
109
70
|
// Выполняет одну попытку JSON HTTP с новым timeout signal.
|
|
110
71
|
async function fetchJsonAttempt(options) {
|
|
111
72
|
const fetchImpl = options.fetch ?? fetch;
|
|
112
|
-
const timeout = createProviderTimeout(options.provider, options.context);
|
|
73
|
+
const timeout = createProviderTimeout(options.provider, options.context, options.scheduler ?? defaultScheduler);
|
|
113
74
|
const signal = mergeAbortSignals(options.context?.signal, timeout.controller.signal);
|
|
114
75
|
try {
|
|
115
76
|
const response = await fetchImpl(options.url, {
|
|
@@ -119,7 +80,7 @@ async function fetchJsonAttempt(options) {
|
|
|
119
80
|
if (!response.ok) {
|
|
120
81
|
throw mapHttpResponseToProviderError(options.provider, response);
|
|
121
82
|
}
|
|
122
|
-
return await parseJsonResponse(options.provider, response);
|
|
83
|
+
return await parseJsonResponse(options.provider, response, options.maxResponseBytes ?? DEFAULT_MAX_JSON_RESPONSE_BYTES, signal);
|
|
123
84
|
}
|
|
124
85
|
finally {
|
|
125
86
|
timeout.clear();
|
|
@@ -127,9 +88,10 @@ async function fetchJsonAttempt(options) {
|
|
|
127
88
|
}
|
|
128
89
|
// Parses response JSON and maps invalid bodies to ProviderError.
|
|
129
90
|
// Парсит JSON ответа и преобразует невалидное тело в ProviderError.
|
|
130
|
-
export async function parseJsonResponse(provider, response) {
|
|
91
|
+
export async function parseJsonResponse(provider, response, maxResponseBytes = DEFAULT_MAX_JSON_RESPONSE_BYTES, signal) {
|
|
92
|
+
const text = await readBoundedResponseText(provider, response, maxResponseBytes, { signal });
|
|
131
93
|
try {
|
|
132
|
-
return
|
|
94
|
+
return JSON.parse(text);
|
|
133
95
|
}
|
|
134
96
|
catch (error) {
|
|
135
97
|
throw new ProviderError({
|
|
@@ -197,13 +159,21 @@ export function mapHttpResponseToProviderError(provider, response) {
|
|
|
197
159
|
code,
|
|
198
160
|
message: `Provider "${provider}" returned HTTP ${status}.`,
|
|
199
161
|
retryable: code === "PROVIDER_RATE_LIMITED" || code === "PROVIDER_UNAVAILABLE",
|
|
162
|
+
status,
|
|
200
163
|
retryAfterMs: parseRetryAfterMs(response.headers.get("retry-after")),
|
|
201
164
|
});
|
|
202
165
|
}
|
|
166
|
+
// Returns the HTTP status retained by errors created from provider responses.
|
|
167
|
+
// Возвращает HTTP status, сохраненный в ошибках из provider response.
|
|
168
|
+
export function getProviderHttpStatus(error) {
|
|
169
|
+
return error instanceof HttpProviderError ? error.status : undefined;
|
|
170
|
+
}
|
|
203
171
|
class HttpProviderError extends ProviderError {
|
|
172
|
+
status;
|
|
204
173
|
retryAfterMs;
|
|
205
174
|
constructor(options) {
|
|
206
175
|
super(options);
|
|
176
|
+
this.status = options.status;
|
|
207
177
|
this.retryAfterMs = options.retryAfterMs;
|
|
208
178
|
}
|
|
209
179
|
}
|
|
@@ -224,7 +194,7 @@ function deferSharedRateLimit(gate, error, fallbackDelayMs) {
|
|
|
224
194
|
}
|
|
225
195
|
// Creates a timeout controller for provider HTTP calls.
|
|
226
196
|
// Создает timeout controller для HTTP-вызовов провайдера.
|
|
227
|
-
function createProviderTimeout(provider, context) {
|
|
197
|
+
function createProviderTimeout(provider, context, scheduler) {
|
|
228
198
|
const controller = new AbortController();
|
|
229
199
|
const timeoutMs = context?.timeoutMs;
|
|
230
200
|
if (timeoutMs === undefined) {
|
|
@@ -250,13 +220,13 @@ function createProviderTimeout(provider, context) {
|
|
|
250
220
|
},
|
|
251
221
|
};
|
|
252
222
|
}
|
|
253
|
-
const timeout = setTimeout(() => {
|
|
223
|
+
const timeout = scheduler.setTimeout(() => {
|
|
254
224
|
controller.abort(timeoutError);
|
|
255
225
|
}, timeoutMs);
|
|
256
226
|
return {
|
|
257
227
|
controller,
|
|
258
228
|
clear() {
|
|
259
|
-
clearTimeout(timeout);
|
|
229
|
+
scheduler.clearTimeout(timeout);
|
|
260
230
|
},
|
|
261
231
|
};
|
|
262
232
|
}
|
|
@@ -273,7 +243,7 @@ function isAbortError(error) {
|
|
|
273
243
|
}
|
|
274
244
|
// Waits before the next provider retry.
|
|
275
245
|
// Ждет перед следующей provider retry.
|
|
276
|
-
function delay(ms, signal) {
|
|
246
|
+
function delay(ms, signal, scheduler) {
|
|
277
247
|
if (ms <= 0) {
|
|
278
248
|
return Promise.resolve();
|
|
279
249
|
}
|
|
@@ -282,12 +252,12 @@ function delay(ms, signal) {
|
|
|
282
252
|
reject(signal.reason);
|
|
283
253
|
return;
|
|
284
254
|
}
|
|
285
|
-
const timeout = setTimeout(() => {
|
|
255
|
+
const timeout = scheduler.setTimeout(() => {
|
|
286
256
|
signal?.removeEventListener("abort", onAbort);
|
|
287
257
|
resolve();
|
|
288
258
|
}, ms);
|
|
289
259
|
const onAbort = () => {
|
|
290
|
-
clearTimeout(timeout);
|
|
260
|
+
scheduler.clearTimeout(timeout);
|
|
291
261
|
reject(signal?.reason);
|
|
292
262
|
};
|
|
293
263
|
signal?.addEventListener("abort", onAbort, { once: true });
|
package/dist/shared/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0B,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0B,MAAM,oBAAoB,CAAC;AAG3E,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEtE,MAAM,+BAA+B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AA8BxD,MAAM,gBAAgB,GAA0B;IAC9C,UAAU,CAAC,QAAQ,EAAE,OAAO;QAC1B,OAAO,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IACD,YAAY,CAAC,MAAM;QACjB,YAAY,CAAC,MAAuC,CAAC,CAAC;IACxD,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,8DAA8D;AAC9D,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,OAAyB;IAC1D,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,GAAG,CAAC;IACjD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,KAAK,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,GAAG,CAAC;IACzD,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,+BAA+B,CAAC;IAErF,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,IAAI,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,SAAS,CAAC,6DAA6D,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,gBAAgB,CAAC;IACxD,MAAM,OAAO,GAAG,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,cAAc,GAAqB;QACvC,GAAG,OAAO;QACV,gBAAgB;QAChB,OAAO,EAAE;YACP,GAAG,OAAO,CAAC,OAAO;YAClB,MAAM;YACN,SAAS,EAAE,SAAS;SACrB;KACF,CAAC;IACF,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAoC,CAAC;IAEzC,IAAI,CAAC;QACH,OAAO,OAAO,IAAI,UAAU,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,MAAM,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC1C,OAAO,MAAM,gBAAgB,CAAI,cAAc,CAAC,CAAC;YACnD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,aAAa,GAAG,oBAAoB,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBACpE,MAAM,UAAU,GAAG,qBAAqB,CAAC;oBACvC,WAAW,EAAE,YAAY;oBACzB,OAAO;oBACP,UAAU,EAAE,eAAe;oBAC3B,WAAW,EAAE,gBAAgB;oBAC7B,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE;oBAC1B,YAAY,EAAE,eAAe,CAAC,aAAa,CAAC;iBAC7C,CAAC,CAAC;gBAEH,SAAS,GAAG,aAAa,CAAC;gBAC1B,oBAAoB,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;gBAEvE,IAAI,CAAC,aAAa,CAAC,SAAS,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;oBACtD,MAAM,aAAa,CAAC;gBACtB,CAAC;gBAED,MAAM,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBAC3C,OAAO,IAAI,CAAC,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC;AAED,0DAA0D;AAC1D,2DAA2D;AAC3D,KAAK,UAAU,gBAAgB,CAAI,OAAyB;IAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACzC,MAAM,OAAO,GAAG,qBAAqB,CACnC,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,SAAS,IAAI,gBAAgB,CACtC,CAAC;IACF,MAAM,MAAM,GAAG,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAErF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5C,GAAG,OAAO,CAAC,IAAI;YACf,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,8BAA8B,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,MAAM,iBAAiB,CAC5B,OAAO,CAAC,QAAQ,EAChB,QAAQ,EACR,OAAO,CAAC,gBAAgB,IAAI,+BAA+B,EAC3D,MAAM,CACP,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,iEAAiE;AACjE,oEAAoE;AACpE,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,QAAgB,EAChB,QAAkB,EAClB,gBAAgB,GAAG,+BAA+B,EAClD,MAAoB;IAEpB,MAAM,IAAI,GAAG,MAAM,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAE7F,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC;YACtB,QAAQ;YACR,IAAI,EAAE,2BAA2B;YACjC,OAAO,EAAE,aAAa,QAAQ,0BAA0B;YACxD,SAAS,EAAE,KAAK;YAChB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,uDAAuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,KAAc;IACnE,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,aAAa,CAAC;YACvB,QAAQ;YACR,IAAI,EAAE,kBAAkB;YACxB,OAAO,EAAE,aAAa,QAAQ,sBAAsB;YACpD,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO,IAAI,aAAa,CAAC;YACvB,QAAQ;YACR,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;IAED,OAAO,IAAI,aAAa,CAAC;QACvB,QAAQ;QACR,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,aAAa,QAAQ,mBAAmB;QACjD,SAAS,EAAE,KAAK;QAChB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;AACL,CAAC;AAED,yDAAyD;AACzD,2DAA2D;AAC3D,MAAM,UAAU,gCAAgC,CAAC,MAAc;IAC7D,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;QACnB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;QAClB,OAAO,sBAAsB,CAAC;IAChC,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,wDAAwD;AACxD,+CAA+C;AAC/C,MAAM,UAAU,8BAA8B,CAC5C,QAAgB,EAChB,QAAkB;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,MAAM,IAAI,GAAG,gCAAgC,CAAC,MAAM,CAAC,CAAC;IAEtD,OAAO,IAAI,iBAAiB,CAAC;QAC3B,QAAQ;QACR,IAAI;QACJ,OAAO,EAAE,aAAa,QAAQ,mBAAmB,MAAM,GAAG;QAC1D,SAAS,EAAE,IAAI,KAAK,uBAAuB,IAAI,IAAI,KAAK,sBAAsB;QAC9E,MAAM;QACN,YAAY,EAAE,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;KACrE,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,sEAAsE;AACtE,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,OAAO,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAWD,MAAM,iBAAkB,SAAQ,aAAa;IAClC,MAAM,CAAS;IACf,YAAY,CAAqB;IAE1C,YAAY,OAAiC;QAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IAC3C,CAAC;CACF;AAED,SAAS,eAAe,CAAC,KAAoB;IAC3C,OAAO,KAAK,YAAY,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7E,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAuC,EACvC,KAAoB,EACpB,eAAuB;IAEvB,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,YAAY,iBAAiB,CAAC,EAAE,CAAC;QACnD,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;QAC3C,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,0DAA0D;AAC1D,SAAS,qBAAqB,CAC5B,QAAgB,EAChB,OAAoC,EACpC,SAAgC;IAEhC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;IAErC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO;YACL,UAAU;YACV,KAAK;gBACH,OAAO;YACT,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,aAAa,CAAC;QACrC,QAAQ;QACR,IAAI,EAAE,kBAAkB;QACxB,OAAO,EAAE,aAAa,QAAQ,sBAAsB;QACpD,SAAS,EAAE,IAAI;KAChB,CAAC,CAAC;IAEH,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QACnB,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC/B,OAAO;YACL,UAAU;YACV,KAAK;gBACH,OAAO;YACT,CAAC;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE;QACxC,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC,EAAE,SAAS,CAAC,CAAC;IAEd,OAAO;QACL,UAAU;QACV,KAAK;YACH,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC;AAED,4DAA4D;AAC5D,4DAA4D;AAC5D,SAAS,iBAAiB,CACxB,cAAuC,EACvC,aAA0B;IAE1B,OAAO,cAAc,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAC3F,CAAC;AAED,2DAA2D;AAC3D,iEAAiE;AACjE,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,CACL,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;QAC9D,CAAC,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,CACxD,CAAC;AACJ,CAAC;AAED,wCAAwC;AACxC,uCAAuC;AACvC,SAAS,KAAK,CACZ,EAAU,EACV,MAA+B,EAC/B,SAAgC;IAEhC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE;YACxC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YAChC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzB,CAAC,CAAC;QAEF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/dist/shared/index.d.ts
CHANGED
package/dist/shared/index.js
CHANGED
package/dist/shared/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shared/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
|
package/dist/shared/mapping.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeProviderOutputUrl } from "./output-url.js";
|
|
1
2
|
// Maps simple genre labels into normalized provider-attributed values.
|
|
2
3
|
// Преобразует простые названия жанров в нормализованные значения с источником.
|
|
3
4
|
export function mapGenreNames(genres, source) {
|
|
@@ -6,7 +7,8 @@ export function mapGenreNames(genres, source) {
|
|
|
6
7
|
// Creates one normalized provider-attributed image from a direct URL.
|
|
7
8
|
// Создает одно нормализованное изображение с источником из прямого URL.
|
|
8
9
|
export function createProviderImage(url, type, source) {
|
|
9
|
-
|
|
10
|
+
const normalizedUrl = normalizeProviderOutputUrl(url);
|
|
11
|
+
return normalizedUrl ? { url: normalizedUrl, type, source } : undefined;
|
|
10
12
|
}
|
|
11
13
|
// Normalizes text for conservative provider-local title comparisons.
|
|
12
14
|
// Нормализует текст для консервативного сравнения названий внутри провайдеров.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/shared/mapping.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../src/shared/mapping.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAE7D,uEAAuE;AACvE,+EAA+E;AAC/E,MAAM,UAAU,aAAa,CAAC,MAA4B,EAAE,MAAc;IACxE,OAAO,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,sEAAsE;AACtE,wEAAwE;AACxE,MAAM,UAAU,mBAAmB,CACjC,GAA8B,EAC9B,IAAmB,EACnB,MAAc;IAEd,MAAM,aAAa,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC;IACtD,OAAO,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1E,CAAC;AAED,qEAAqE;AACrE,+EAA+E;AAC/E,MAAM,UAAU,2BAA2B,CAAC,KAAa;IACvD,OAAO,KAAK;SACT,iBAAiB,EAAE;SACnB,UAAU,CAAC,kBAAkB,EAAE,GAAG,CAAC;SACnC,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,yEAAyE;AACzE,qEAAqE;AACrE,MAAM,UAAU,kBAAkB,CAAC,IAA+B;IAChE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { isPublicIpAddress } from "./safe-fetch.js";
|
|
2
|
+
const CONTROL_CHARACTERS = /[\u0000-\u001f\u007f]/u;
|
|
3
|
+
// Normalizes a provider URL before it is exposed through metadata or streaming output.
|
|
4
|
+
// Нормализует URL провайдера перед публикацией в metadata или streaming output.
|
|
5
|
+
export function normalizeProviderOutputUrl(value) {
|
|
6
|
+
if (!value || CONTROL_CHARACTERS.test(value)) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const url = new URL(value);
|
|
11
|
+
if ((url.protocol !== "http:" && url.protocol !== "https:") ||
|
|
12
|
+
url.username !== "" ||
|
|
13
|
+
url.password !== "" ||
|
|
14
|
+
isLiteralLocalTarget(url.hostname)) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return url.href;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
// Backwards-compatible name for the provider output URL policy.
|
|
24
|
+
// Обратно совместимое имя политики provider output URL.
|
|
25
|
+
export function normalizePublicHttpUrl(value) {
|
|
26
|
+
return normalizeProviderOutputUrl(value);
|
|
27
|
+
}
|
|
28
|
+
function isLiteralLocalTarget(value) {
|
|
29
|
+
const hostname = value
|
|
30
|
+
.toLowerCase()
|
|
31
|
+
.replace(/^\[|\]$/g, "")
|
|
32
|
+
.replace(/\.$/, "");
|
|
33
|
+
if (hostname === "localhost" ||
|
|
34
|
+
hostname.endsWith(".localhost") ||
|
|
35
|
+
hostname === "0.0.0.0" ||
|
|
36
|
+
hostname === "::" ||
|
|
37
|
+
hostname === "::1") {
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
if (hostname.includes(":")) {
|
|
41
|
+
return !isPublicIpAddress(hostname);
|
|
42
|
+
}
|
|
43
|
+
const octets = hostname.split(".").map(Number);
|
|
44
|
+
if (octets.length !== 4 ||
|
|
45
|
+
octets.some((octet) => !Number.isInteger(octet) || octet < 0 || octet > 255)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return !isPublicIpAddress(hostname);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=output-url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-url.js","sourceRoot":"","sources":["../../src/shared/output-url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEpD,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAEpD,uFAAuF;AACvF,gFAAgF;AAChF,MAAM,UAAU,0BAA0B,CAAC,KAAgC;IACzE,IAAI,CAAC,KAAK,IAAI,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAE3B,IACE,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC;YACvD,GAAG,CAAC,QAAQ,KAAK,EAAE;YACnB,GAAG,CAAC,QAAQ,KAAK,EAAE;YACnB,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAClC,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,wDAAwD;AACxD,MAAM,UAAU,sBAAsB,CAAC,KAAgC;IACrE,OAAO,0BAA0B,CAAC,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAa;IACzC,MAAM,QAAQ,GAAG,KAAK;SACnB,WAAW,EAAE;SACb,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtB,IACE,QAAQ,KAAK,WAAW;QACxB,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC;QAC/B,QAAQ,KAAK,SAAS;QACtB,QAAQ,KAAK,IAAI;QACjB,QAAQ,KAAK,KAAK,EAClB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE/C,IACE,MAAM,CAAC,MAAM,KAAK,CAAC;QACnB,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,CAAC,EAC5E,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { waitForAbortableDelay } from "./abort.js";
|
|
1
2
|
import { parseRetryAfterMs } from "./retry.js";
|
|
2
3
|
const DEFAULT_MAX_COOLDOWN_MS = 30_000;
|
|
3
4
|
const DEFAULT_RATE_LIMIT_FALLBACK_MS = 1_000;
|
|
@@ -32,7 +33,7 @@ export class ProviderRateLimitGate {
|
|
|
32
33
|
if (remainingMs <= 0) {
|
|
33
34
|
return;
|
|
34
35
|
}
|
|
35
|
-
await
|
|
36
|
+
await waitForAbortableDelay(remainingMs, signal);
|
|
36
37
|
}
|
|
37
38
|
}
|
|
38
39
|
}
|
|
@@ -48,21 +49,4 @@ export function deferProviderRateLimitFromResponse(gate, response, fallbackDelay
|
|
|
48
49
|
gate.defer(retryAfterMs);
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
|
-
function abortableDelay(ms, signal) {
|
|
52
|
-
return new Promise((resolve, reject) => {
|
|
53
|
-
if (signal?.aborted) {
|
|
54
|
-
reject(signal.reason);
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
const timeout = setTimeout(() => {
|
|
58
|
-
signal?.removeEventListener("abort", onAbort);
|
|
59
|
-
resolve();
|
|
60
|
-
}, ms);
|
|
61
|
-
const onAbort = () => {
|
|
62
|
-
clearTimeout(timeout);
|
|
63
|
-
reject(signal?.reason);
|
|
64
|
-
};
|
|
65
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
52
|
//# sourceMappingURL=rate-limit.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/shared/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAO7C,sFAAsF;AACtF,qFAAqF;AACrF,MAAM,OAAO,qBAAqB;IACvB,cAAc,CAAS;IACvB,IAAI,CAAe;IAC5B,aAAa,GAAG,CAAC,CAAC;IAElB,YAAY,UAAwC,EAAE;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAC;QAEvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,UAAU,CAAC,kEAAkE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACtC,CAAC;IAED,8EAA8E;IAC9E,mFAAmF;IACnF,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC;IAClF,CAAC;IAED,iFAAiF;IACjF,8EAA8E;IAC9E,KAAK,CAAC,IAAI,CAAC,MAAoB;QAC7B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAErD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,
|
|
1
|
+
{"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../src/shared/rate-limit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,uBAAuB,GAAG,MAAM,CAAC;AACvC,MAAM,8BAA8B,GAAG,KAAK,CAAC;AAO7C,sFAAsF;AACtF,qFAAqF;AACrF,MAAM,OAAO,qBAAqB;IACvB,cAAc,CAAS;IACvB,IAAI,CAAe;IAC5B,aAAa,GAAG,CAAC,CAAC;IAElB,YAAY,UAAwC,EAAE;QACpD,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAC;QAEvE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACzD,MAAM,IAAI,UAAU,CAAC,kEAAkE,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;QACpC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACtC,CAAC;IAED,8EAA8E;IAC9E,mFAAmF;IACnF,KAAK,CAAC,OAAe;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,IAAI,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;YAC3E,OAAO;QACT,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC;IAClF,CAAC;IAED,iFAAiF;IACjF,8EAA8E;IAC9E,KAAK,CAAC,IAAI,CAAC,MAAoB;QAC7B,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAErD,IAAI,WAAW,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,qBAAqB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;CACF;AAED,mFAAmF;AACnF,qFAAqF;AACrF,MAAM,UAAU,kCAAkC,CAChD,IAA2B,EAC3B,QAAkB,EAClB,eAAe,GAAG,8BAA8B;IAEhD,MAAM,YAAY,GAAG,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAE5E,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export interface ReadBoundedResponseBodyOptions {
|
|
2
|
+
signal?: AbortSignal;
|
|
3
|
+
overflow?: "throw" | "truncate";
|
|
4
|
+
}
|
|
5
|
+
export declare function readBoundedResponseBytes(provider: string, response: Response, maxBytes: number, options?: ReadBoundedResponseBodyOptions): Promise<Uint8Array>;
|
|
6
|
+
export declare function readBoundedResponseText(provider: string, response: Response, maxBytes: number, options?: ReadBoundedResponseBodyOptions): Promise<string>;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { ProviderError } from "@media-engine/core";
|
|
2
|
+
// Reads at most the configured response bytes and cancels the stream as soon as it overflows.
|
|
3
|
+
// Читает не больше заданного объема ответа и отменяет stream сразу при переполнении.
|
|
4
|
+
export async function readBoundedResponseBytes(provider, response, maxBytes, options = {}) {
|
|
5
|
+
assertPositiveByteLimit(maxBytes);
|
|
6
|
+
const overflow = options.overflow ?? "throw";
|
|
7
|
+
const declaredLength = parseContentLength(response.headers.get("content-length"));
|
|
8
|
+
if (overflow === "throw" && declaredLength !== undefined && declaredLength > maxBytes) {
|
|
9
|
+
await cancelBody(response.body);
|
|
10
|
+
throw createOversizedResponseError(provider, maxBytes);
|
|
11
|
+
}
|
|
12
|
+
if (options.signal?.aborted) {
|
|
13
|
+
await cancelBody(response.body, options.signal.reason);
|
|
14
|
+
throw options.signal.reason ?? new DOMException("Aborted", "AbortError");
|
|
15
|
+
}
|
|
16
|
+
if (!response.body) {
|
|
17
|
+
return new Uint8Array();
|
|
18
|
+
}
|
|
19
|
+
const reader = response.body.getReader();
|
|
20
|
+
const chunks = [];
|
|
21
|
+
let totalBytes = 0;
|
|
22
|
+
const onAbort = () => {
|
|
23
|
+
void reader.cancel(options.signal?.reason).catch(() => undefined);
|
|
24
|
+
};
|
|
25
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
26
|
+
try {
|
|
27
|
+
while (true) {
|
|
28
|
+
const { done, value } = await reader.read();
|
|
29
|
+
if (options.signal?.aborted) {
|
|
30
|
+
throw options.signal.reason ?? new DOMException("Aborted", "AbortError");
|
|
31
|
+
}
|
|
32
|
+
if (done) {
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
if (totalBytes + value.byteLength > maxBytes) {
|
|
36
|
+
await cancelReader(reader);
|
|
37
|
+
if (overflow === "truncate") {
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
throw createOversizedResponseError(provider, maxBytes);
|
|
41
|
+
}
|
|
42
|
+
chunks.push(value);
|
|
43
|
+
totalBytes += value.byteLength;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (options.signal?.aborted) {
|
|
48
|
+
throw options.signal.reason ?? error;
|
|
49
|
+
}
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
54
|
+
reader.releaseLock();
|
|
55
|
+
}
|
|
56
|
+
const body = new Uint8Array(totalBytes);
|
|
57
|
+
let offset = 0;
|
|
58
|
+
for (const chunk of chunks) {
|
|
59
|
+
body.set(chunk, offset);
|
|
60
|
+
offset += chunk.byteLength;
|
|
61
|
+
}
|
|
62
|
+
return body;
|
|
63
|
+
}
|
|
64
|
+
// Reads a bounded UTF-8 response body.
|
|
65
|
+
// Читает ограниченное UTF-8 тело ответа.
|
|
66
|
+
export async function readBoundedResponseText(provider, response, maxBytes, options = {}) {
|
|
67
|
+
const body = await readBoundedResponseBytes(provider, response, maxBytes, options);
|
|
68
|
+
return new TextDecoder().decode(body);
|
|
69
|
+
}
|
|
70
|
+
function createOversizedResponseError(provider, maxBytes) {
|
|
71
|
+
return new ProviderError({
|
|
72
|
+
provider,
|
|
73
|
+
code: "PROVIDER_RESPONSE_TOO_LARGE",
|
|
74
|
+
message: `Provider "${provider}" response exceeded the ${maxBytes}-byte limit.`,
|
|
75
|
+
retryable: false,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
function parseContentLength(value) {
|
|
79
|
+
if (value === null || !/^\d+$/.test(value.trim())) {
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
const length = Number(value);
|
|
83
|
+
return Number.isSafeInteger(length) ? length : undefined;
|
|
84
|
+
}
|
|
85
|
+
function assertPositiveByteLimit(maxBytes) {
|
|
86
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
|
|
87
|
+
throw new TypeError("Response body maxBytes must be a positive safe integer.");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
async function cancelBody(body, reason) {
|
|
91
|
+
if (!body) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
try {
|
|
95
|
+
await body.cancel(reason);
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
// Cancellation cleanup must not hide the original response error.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
async function cancelReader(reader, reason) {
|
|
102
|
+
try {
|
|
103
|
+
await reader.cancel(reason);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Cancellation cleanup must not hide the original response error.
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=response-body.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"response-body.js","sourceRoot":"","sources":["../../src/shared/response-body.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface ResolvedAddress {
|
|
2
|
+
address: string;
|
|
3
|
+
family: 4 | 6;
|
|
4
|
+
}
|
|
5
|
+
export type HostnameResolver = (hostname: string) => Promise<ReadonlyArray<ResolvedAddress>>;
|
|
6
|
+
export type PinnedHttpTransport = (url: URL, init: RequestInit, address: ResolvedAddress) => Promise<Response>;
|
|
7
|
+
export interface HardenedProviderFetchOptions {
|
|
8
|
+
provider: string;
|
|
9
|
+
maxRedirects?: number;
|
|
10
|
+
addressAttemptTimeoutMs?: number;
|
|
11
|
+
resolver?: HostnameResolver;
|
|
12
|
+
transport?: PinnedHttpTransport;
|
|
13
|
+
}
|
|
14
|
+
export declare function createHardenedProviderFetch(options: HardenedProviderFetchOptions): (input: string | URL, init?: RequestInit) => Promise<Response>;
|
|
15
|
+
export declare function getHardenedProviderResponseUrl(response: Response): string | undefined;
|
|
16
|
+
export declare function isPublicIpAddress(address: string): boolean;
|