@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.
Files changed (259) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +85 -25
  3. package/README.ru.md +90 -26
  4. package/dist/aniliberty-streaming/client.d.ts +33 -0
  5. package/dist/aniliberty-streaming/client.js +188 -0
  6. package/dist/aniliberty-streaming/client.js.map +1 -0
  7. package/dist/aniliberty-streaming/config.d.ts +24 -0
  8. package/dist/aniliberty-streaming/config.js +61 -0
  9. package/dist/aniliberty-streaming/config.js.map +1 -0
  10. package/dist/aniliberty-streaming/index.d.ts +4 -0
  11. package/dist/aniliberty-streaming/index.js +45 -0
  12. package/dist/aniliberty-streaming/index.js.map +1 -0
  13. package/dist/aniliberty-streaming/mapping.d.ts +3 -0
  14. package/dist/aniliberty-streaming/mapping.js +87 -0
  15. package/dist/aniliberty-streaming/mapping.js.map +1 -0
  16. package/dist/aniliberty-streaming/matching.d.ts +4 -0
  17. package/dist/aniliberty-streaming/matching.js +44 -0
  18. package/dist/aniliberty-streaming/matching.js.map +1 -0
  19. package/dist/anilist/graphql.d.ts +2 -0
  20. package/dist/anilist/graphql.js +135 -0
  21. package/dist/anilist/graphql.js.map +1 -0
  22. package/dist/anilist/index.js +8 -6
  23. package/dist/anilist/index.js.map +1 -1
  24. package/dist/bitsearch-torrent/client.d.ts +19 -0
  25. package/dist/bitsearch-torrent/client.js +181 -0
  26. package/dist/bitsearch-torrent/client.js.map +1 -0
  27. package/dist/bitsearch-torrent/config.d.ts +26 -0
  28. package/dist/bitsearch-torrent/config.js +74 -0
  29. package/dist/bitsearch-torrent/config.js.map +1 -0
  30. package/dist/bitsearch-torrent/index.d.ts +4 -0
  31. package/dist/bitsearch-torrent/index.js +35 -0
  32. package/dist/bitsearch-torrent/index.js.map +1 -0
  33. package/dist/bitsearch-torrent/mapping.d.ts +3 -0
  34. package/dist/bitsearch-torrent/mapping.js +53 -0
  35. package/dist/bitsearch-torrent/mapping.js.map +1 -0
  36. package/dist/bitsearch-torrent/matching.d.ts +3 -0
  37. package/dist/bitsearch-torrent/matching.js +13 -0
  38. package/dist/bitsearch-torrent/matching.js.map +1 -0
  39. package/dist/bitsearch-torrent/quota.d.ts +9 -0
  40. package/dist/bitsearch-torrent/quota.js +53 -0
  41. package/dist/bitsearch-torrent/quota.js.map +1 -0
  42. package/dist/cinemeta/index.js +37 -12
  43. package/dist/cinemeta/index.js.map +1 -1
  44. package/dist/ddbb-streaming/client.d.ts +24 -0
  45. package/dist/ddbb-streaming/client.js +98 -0
  46. package/dist/ddbb-streaming/client.js.map +1 -0
  47. package/dist/ddbb-streaming/config.d.ts +31 -0
  48. package/dist/ddbb-streaming/config.js +67 -0
  49. package/dist/ddbb-streaming/config.js.map +1 -0
  50. package/dist/ddbb-streaming/index.d.ts +4 -0
  51. package/dist/ddbb-streaming/index.js +53 -0
  52. package/dist/ddbb-streaming/index.js.map +1 -0
  53. package/dist/ddbb-streaming/mapping.d.ts +8 -0
  54. package/dist/ddbb-streaming/mapping.js +164 -0
  55. package/dist/ddbb-streaming/mapping.js.map +1 -0
  56. package/dist/ddbb-streaming/validation.d.ts +3 -0
  57. package/dist/ddbb-streaming/validation.js +84 -0
  58. package/dist/ddbb-streaming/validation.js.map +1 -0
  59. package/dist/experimental-streaming/index.js +55 -0
  60. package/dist/experimental-streaming/index.js.map +1 -1
  61. package/dist/filmix-streaming/client.d.ts +36 -0
  62. package/dist/filmix-streaming/client.js +241 -0
  63. package/dist/filmix-streaming/client.js.map +1 -0
  64. package/dist/filmix-streaming/config.d.ts +42 -0
  65. package/dist/filmix-streaming/config.js +93 -0
  66. package/dist/filmix-streaming/config.js.map +1 -0
  67. package/dist/filmix-streaming/index.d.ts +4 -0
  68. package/dist/filmix-streaming/index.js +48 -0
  69. package/dist/filmix-streaming/index.js.map +1 -0
  70. package/dist/filmix-streaming/mapping.d.ts +3 -0
  71. package/dist/filmix-streaming/mapping.js +109 -0
  72. package/dist/filmix-streaming/mapping.js.map +1 -0
  73. package/dist/filmix-streaming/matching.d.ts +4 -0
  74. package/dist/filmix-streaming/matching.js +41 -0
  75. package/dist/filmix-streaming/matching.js.map +1 -0
  76. package/dist/flixhq-streaming/client.d.ts +12 -0
  77. package/dist/flixhq-streaming/client.js +103 -0
  78. package/dist/flixhq-streaming/client.js.map +1 -0
  79. package/dist/flixhq-streaming/index.d.ts +2 -2
  80. package/dist/flixhq-streaming/index.js +58 -104
  81. package/dist/flixhq-streaming/index.js.map +1 -1
  82. package/dist/imdb-dataset/index.d.ts +20 -5
  83. package/dist/imdb-dataset/index.js +82 -184
  84. package/dist/imdb-dataset/index.js.map +1 -1
  85. package/dist/imdb-dataset/memory-storage.d.ts +7 -0
  86. package/dist/imdb-dataset/memory-storage.js +168 -0
  87. package/dist/imdb-dataset/memory-storage.js.map +1 -0
  88. package/dist/imdb-dataset/sqlite-import.d.ts +24 -0
  89. package/dist/imdb-dataset/sqlite-import.js +301 -0
  90. package/dist/imdb-dataset/sqlite-import.js.map +1 -0
  91. package/dist/imdb-dataset/sqlite-runtime.d.ts +3 -0
  92. package/dist/imdb-dataset/sqlite-runtime.js +11 -0
  93. package/dist/imdb-dataset/sqlite-runtime.js.map +1 -0
  94. package/dist/imdb-dataset/sqlite-schema.d.ts +6 -0
  95. package/dist/imdb-dataset/sqlite-schema.js +88 -0
  96. package/dist/imdb-dataset/sqlite-schema.js.map +1 -0
  97. package/dist/imdb-dataset/sqlite-storage.d.ts +12 -0
  98. package/dist/imdb-dataset/sqlite-storage.js +208 -0
  99. package/dist/imdb-dataset/sqlite-storage.js.map +1 -0
  100. package/dist/imdb-dataset/storage.d.ts +33 -0
  101. package/dist/imdb-dataset/storage.js +2 -0
  102. package/dist/imdb-dataset/storage.js.map +1 -0
  103. package/dist/index.d.ts +11 -0
  104. package/dist/index.js +11 -0
  105. package/dist/index.js.map +1 -1
  106. package/dist/jacred-torrent/client.d.ts +24 -0
  107. package/dist/jacred-torrent/client.js +254 -0
  108. package/dist/jacred-torrent/client.js.map +1 -0
  109. package/dist/jacred-torrent/config.d.ts +24 -0
  110. package/dist/jacred-torrent/config.js +70 -0
  111. package/dist/jacred-torrent/config.js.map +1 -0
  112. package/dist/jacred-torrent/index.d.ts +4 -0
  113. package/dist/jacred-torrent/index.js +45 -0
  114. package/dist/jacred-torrent/index.js.map +1 -0
  115. package/dist/jacred-torrent/mapping.d.ts +3 -0
  116. package/dist/jacred-torrent/mapping.js +129 -0
  117. package/dist/jacred-torrent/mapping.js.map +1 -0
  118. package/dist/jacred-torrent/matching.d.ts +3 -0
  119. package/dist/jacred-torrent/matching.js +19 -0
  120. package/dist/jacred-torrent/matching.js.map +1 -0
  121. package/dist/kinobd/index.js +5 -6
  122. package/dist/kinobd/index.js.map +1 -1
  123. package/dist/kinobd-streaming/availability.js +52 -29
  124. package/dist/kinobd-streaming/availability.js.map +1 -1
  125. package/dist/kinobd-streaming/candidates.d.ts +3 -2
  126. package/dist/kinobd-streaming/candidates.js +89 -37
  127. package/dist/kinobd-streaming/candidates.js.map +1 -1
  128. package/dist/kinobd-streaming/config.d.ts +15 -0
  129. package/dist/kinobd-streaming/config.js +21 -17
  130. package/dist/kinobd-streaming/config.js.map +1 -1
  131. package/dist/kinobd-streaming/index.d.ts +1 -1
  132. package/dist/kinobd-streaming/index.js.map +1 -1
  133. package/dist/kinobd-streaming/players.d.ts +2 -1
  134. package/dist/kinobd-streaming/players.js +7 -7
  135. package/dist/kinobd-streaming/players.js.map +1 -1
  136. package/dist/kinobd-streaming/request-budget.d.ts +15 -0
  137. package/dist/kinobd-streaming/request-budget.js +61 -0
  138. package/dist/kinobd-streaming/request-budget.js.map +1 -0
  139. package/dist/kinobd-streaming/validation.d.ts +5 -3
  140. package/dist/kinobd-streaming/validation.js +78 -49
  141. package/dist/kinobd-streaming/validation.js.map +1 -1
  142. package/dist/magnetz-torrent/client.d.ts +16 -0
  143. package/dist/magnetz-torrent/client.js +235 -0
  144. package/dist/magnetz-torrent/client.js.map +1 -0
  145. package/dist/magnetz-torrent/config.d.ts +27 -0
  146. package/dist/magnetz-torrent/config.js +73 -0
  147. package/dist/magnetz-torrent/config.js.map +1 -0
  148. package/dist/magnetz-torrent/index.d.ts +4 -0
  149. package/dist/magnetz-torrent/index.js +35 -0
  150. package/dist/magnetz-torrent/index.js.map +1 -0
  151. package/dist/magnetz-torrent/mapping.d.ts +3 -0
  152. package/dist/magnetz-torrent/mapping.js +52 -0
  153. package/dist/magnetz-torrent/mapping.js.map +1 -0
  154. package/dist/magnetz-torrent/matching.d.ts +3 -0
  155. package/dist/magnetz-torrent/matching.js +5 -0
  156. package/dist/magnetz-torrent/matching.js.map +1 -0
  157. package/dist/magnetz-torrent/request-gate.d.ts +9 -0
  158. package/dist/magnetz-torrent/request-gate.js +48 -0
  159. package/dist/magnetz-torrent/request-gate.js.map +1 -0
  160. package/dist/package-version.d.ts +2 -0
  161. package/dist/package-version.js +5 -0
  162. package/dist/package-version.js.map +1 -0
  163. package/dist/rutube-streaming/client.d.ts +18 -0
  164. package/dist/rutube-streaming/client.js +106 -0
  165. package/dist/rutube-streaming/client.js.map +1 -0
  166. package/dist/rutube-streaming/config.d.ts +26 -0
  167. package/dist/rutube-streaming/config.js +57 -0
  168. package/dist/rutube-streaming/config.js.map +1 -0
  169. package/dist/rutube-streaming/index.d.ts +4 -0
  170. package/dist/rutube-streaming/index.js +38 -0
  171. package/dist/rutube-streaming/index.js.map +1 -0
  172. package/dist/rutube-streaming/mapping.d.ts +4 -0
  173. package/dist/rutube-streaming/mapping.js +32 -0
  174. package/dist/rutube-streaming/mapping.js.map +1 -0
  175. package/dist/rutube-streaming/matching.d.ts +2 -0
  176. package/dist/rutube-streaming/matching.js +37 -0
  177. package/dist/rutube-streaming/matching.js.map +1 -0
  178. package/dist/shared/abort.d.ts +1 -0
  179. package/dist/shared/abort.js +22 -0
  180. package/dist/shared/abort.js.map +1 -1
  181. package/dist/shared/http.d.ts +8 -2
  182. package/dist/shared/http.js +37 -67
  183. package/dist/shared/http.js.map +1 -1
  184. package/dist/shared/index.d.ts +1 -0
  185. package/dist/shared/index.js +1 -0
  186. package/dist/shared/index.js.map +1 -1
  187. package/dist/shared/mapping.js +3 -1
  188. package/dist/shared/mapping.js.map +1 -1
  189. package/dist/shared/output-url.d.ts +2 -0
  190. package/dist/shared/output-url.js +50 -0
  191. package/dist/shared/output-url.js.map +1 -0
  192. package/dist/shared/rate-limit.js +2 -18
  193. package/dist/shared/rate-limit.js.map +1 -1
  194. package/dist/shared/response-body.d.ts +6 -0
  195. package/dist/shared/response-body.js +109 -0
  196. package/dist/shared/response-body.js.map +1 -0
  197. package/dist/shared/safe-fetch.d.ts +16 -0
  198. package/dist/shared/safe-fetch.js +300 -0
  199. package/dist/shared/safe-fetch.js.map +1 -0
  200. package/dist/shared/torrent-release-matching.d.ts +7 -0
  201. package/dist/shared/torrent-release-matching.js +143 -0
  202. package/dist/shared/torrent-release-matching.js.map +1 -0
  203. package/dist/shared/torrent-release-metadata.d.ts +4 -0
  204. package/dist/shared/torrent-release-metadata.js +95 -0
  205. package/dist/shared/torrent-release-metadata.js.map +1 -0
  206. package/dist/shikimori/index.js +4 -7
  207. package/dist/shikimori/index.js.map +1 -1
  208. package/dist/tvmaze/index.d.ts +11 -0
  209. package/dist/tvmaze/index.js +274 -0
  210. package/dist/tvmaze/index.js.map +1 -0
  211. package/dist/veoveo-streaming/client.d.ts +28 -0
  212. package/dist/veoveo-streaming/client.js +212 -0
  213. package/dist/veoveo-streaming/client.js.map +1 -0
  214. package/dist/veoveo-streaming/config.d.ts +32 -0
  215. package/dist/veoveo-streaming/config.js +67 -0
  216. package/dist/veoveo-streaming/config.js.map +1 -0
  217. package/dist/veoveo-streaming/index.d.ts +4 -0
  218. package/dist/veoveo-streaming/index.js +46 -0
  219. package/dist/veoveo-streaming/index.js.map +1 -0
  220. package/dist/veoveo-streaming/mapping.d.ts +3 -0
  221. package/dist/veoveo-streaming/mapping.js +121 -0
  222. package/dist/veoveo-streaming/mapping.js.map +1 -0
  223. package/dist/videohub-streaming/client.d.ts +33 -0
  224. package/dist/videohub-streaming/client.js +208 -0
  225. package/dist/videohub-streaming/client.js.map +1 -0
  226. package/dist/videohub-streaming/config.d.ts +34 -0
  227. package/dist/videohub-streaming/config.js +73 -0
  228. package/dist/videohub-streaming/config.js.map +1 -0
  229. package/dist/videohub-streaming/index.d.ts +4 -0
  230. package/dist/videohub-streaming/index.js +53 -0
  231. package/dist/videohub-streaming/index.js.map +1 -0
  232. package/dist/videohub-streaming/mapping.d.ts +3 -0
  233. package/dist/videohub-streaming/mapping.js +84 -0
  234. package/dist/videohub-streaming/mapping.js.map +1 -0
  235. package/dist/wikidata/cache.d.ts +11 -0
  236. package/dist/wikidata/cache.js +30 -0
  237. package/dist/wikidata/cache.js.map +1 -0
  238. package/dist/wikidata/candidates.d.ts +12 -0
  239. package/dist/wikidata/candidates.js +67 -0
  240. package/dist/wikidata/candidates.js.map +1 -0
  241. package/dist/wikidata/client.d.ts +40 -0
  242. package/dist/wikidata/client.js +224 -0
  243. package/dist/wikidata/client.js.map +1 -0
  244. package/dist/wikidata/index.d.ts +3 -0
  245. package/dist/wikidata/index.js +30 -104
  246. package/dist/wikidata/index.js.map +1 -1
  247. package/dist/yts-torrent/client.d.ts +25 -0
  248. package/dist/yts-torrent/client.js +163 -0
  249. package/dist/yts-torrent/client.js.map +1 -0
  250. package/dist/yts-torrent/config.d.ts +22 -0
  251. package/dist/yts-torrent/config.js +57 -0
  252. package/dist/yts-torrent/config.js.map +1 -0
  253. package/dist/yts-torrent/index.d.ts +4 -0
  254. package/dist/yts-torrent/index.js +42 -0
  255. package/dist/yts-torrent/index.js.map +1 -0
  256. package/dist/yts-torrent/mapping.d.ts +4 -0
  257. package/dist/yts-torrent/mapping.js +107 -0
  258. package/dist/yts-torrent/mapping.js.map +1 -0
  259. package/package.json +23 -5
@@ -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
- // Accepts only remote HTTP targets that cannot directly address the local machine or LAN.
4
- // Принимает только удаленные HTTP-цели без прямого доступа к локальной машине или LAN.
5
- export function normalizePublicHttpUrl(value) {
6
- if (!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
- 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 timeout = createProviderTimeout(options.provider, options.context);
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 (await response.json());
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 });
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/shared/http.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  export * from "./http.js";
2
+ export * from "./output-url.js";
2
3
  export * from "./rate-limit.js";
@@ -1,3 +1,4 @@
1
1
  export * from "./http.js";
2
+ export * from "./output-url.js";
2
3
  export * from "./rate-limit.js";
3
4
  //# sourceMappingURL=index.js.map
@@ -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"}
@@ -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
- return url ? { url, type, source } : undefined;
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":"AAEA,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,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,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"}
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,2 @@
1
+ export declare function normalizeProviderOutputUrl(value: string | null | undefined): string | undefined;
2
+ export declare function normalizePublicHttpUrl(value: string | null | undefined): string | undefined;
@@ -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 abortableDelay(remainingMs, signal);
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":"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"}
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;