transloadit 5.0.1 → 5.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.
@@ -4,6 +4,7 @@ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
4
4
  import { isIP } from 'node:net';
5
5
  import { tmpdir } from 'node:os';
6
6
  import { basename, join, parse } from 'node:path';
7
+ import { Transform } from 'node:stream';
7
8
  import { pipeline } from 'node:stream/promises';
8
9
  import got from 'got';
9
10
  import { ensureUniqueCounterValue } from "./ensureUniqueCounter.js";
@@ -140,16 +141,26 @@ const isPrivateIp = (address) => {
140
141
  }
141
142
  return false;
142
143
  };
144
+ /**
145
+ * Names a URL in error messages without its query or fragment: input URLs are often presigned
146
+ * (ChatGPT attachments, S3), and these messages reach logs and model-visible tool results.
147
+ */
148
+ const describeUrl = (value) => {
149
+ if (!URL.canParse(value))
150
+ return '[unparseable URL]';
151
+ const url = new URL(value);
152
+ return `${url.origin}${url.pathname}`;
153
+ };
143
154
  export const resolvePublicDownloadAddresses = async (value) => {
144
155
  const parsed = new URL(value);
145
156
  const hostname = parsed.hostname.startsWith('[') && parsed.hostname.endsWith(']')
146
157
  ? parsed.hostname.slice(1, -1)
147
158
  : parsed.hostname;
148
159
  if (!['http:', 'https:'].includes(parsed.protocol)) {
149
- throw new Error(`URL downloads are limited to http/https: ${value}`);
160
+ throw new Error(`URL downloads are limited to http/https: ${describeUrl(value)}`);
150
161
  }
151
162
  if (isPrivateIp(hostname)) {
152
- throw new Error(`URL downloads are limited to public hosts: ${value}`);
163
+ throw new Error(`URL downloads are limited to public hosts: ${describeUrl(value)}`);
153
164
  }
154
165
  const literalFamily = isIP(hostname);
155
166
  const resolvedAddresses = literalFamily !== 0
@@ -159,10 +170,10 @@ export const resolvePublicDownloadAddresses = async (value) => {
159
170
  verbatim: true,
160
171
  });
161
172
  if (resolvedAddresses.some((address) => isPrivateIp(address.address))) {
162
- throw new Error(`URL downloads are limited to public hosts: ${value}`);
173
+ throw new Error(`URL downloads are limited to public hosts: ${describeUrl(value)}`);
163
174
  }
164
175
  if (resolvedAddresses.length === 0) {
165
- throw new Error(`Unable to resolve URL hostname: ${value}`);
176
+ throw new Error(`Unable to resolve URL hostname: ${describeUrl(value)}`);
166
177
  }
167
178
  return resolvedAddresses.map((address) => ({
168
179
  address: address.address,
@@ -213,19 +224,46 @@ export function createPinnedDnsLookup(validatedAddresses) {
213
224
  }
214
225
  return pinnedDnsLookup;
215
226
  }
216
- const downloadUrlToFile = async ({ allowPrivateUrls, filePath, url, }) => {
227
+ const budgetExceeded = (budget, url) => new Error(`URL downloads exceed ${budget.totalBytes} bytes: ${describeUrl(url)}`);
228
+ /** Errors once the budget is used up, so temp files stay bounded while they stream in. */
229
+ const limitDownloadBytes = (budget, url) => new Transform({
230
+ transform(chunk, _encoding, callback) {
231
+ budget.remainingBytes -= chunk.length;
232
+ if (budget.remainingBytes < 0) {
233
+ callback(budgetExceeded(budget, url));
234
+ return;
235
+ }
236
+ callback(null, chunk);
237
+ },
238
+ });
239
+ const downloadUrlToFile = async ({ allowPrivateUrls, filePath, url, budget, timeoutMs, }) => {
217
240
  let currentUrl = url;
241
+ // One deadline for the whole download, so DNS checks and redirects cannot each restart it.
242
+ const deadline = timeoutMs === undefined ? undefined : Date.now() + timeoutMs;
243
+ const remainingMs = () => {
244
+ if (deadline === undefined)
245
+ return undefined;
246
+ const remaining = deadline - Date.now();
247
+ if (remaining <= 0) {
248
+ throw new Error(`URL download timed out after ${timeoutMs} ms: ${describeUrl(url)}`);
249
+ }
250
+ return remaining;
251
+ };
218
252
  for (let redirectCount = 0; redirectCount <= MAX_URL_REDIRECTS; redirectCount += 1) {
219
253
  let validatedAddresses = null;
220
254
  if (!allowPrivateUrls) {
255
+ // Not raced against the deadline: the system resolver bounds each lookup with its own
256
+ // short timeout and no bytes are transferred, so checking the clock right after suffices.
221
257
  validatedAddresses = await resolvePublicDownloadAddresses(currentUrl);
222
258
  }
259
+ const requestTimeoutMs = remainingMs();
223
260
  const dnsLookup = validatedAddresses == null ? undefined : createPinnedDnsLookup(validatedAddresses);
224
261
  const responseStream = got.stream(currentUrl, {
225
262
  dnsLookup,
226
263
  followRedirect: false,
227
264
  retry: { limit: 0 },
228
265
  throwHttpErrors: false,
266
+ ...(requestTimeoutMs === undefined ? {} : { timeout: { request: requestTimeoutMs } }),
229
267
  });
230
268
  const response = await new Promise((resolvePromise, reject) => {
231
269
  responseStream.once('response', (incomingResponse) => {
@@ -238,26 +276,37 @@ const downloadUrlToFile = async ({ allowPrivateUrls, filePath, url, }) => {
238
276
  responseStream.destroy();
239
277
  const location = response.headers.location;
240
278
  if (location == null) {
241
- throw new Error(`Redirect response missing Location header: ${currentUrl}`);
279
+ throw new Error(`Redirect response missing Location header: ${describeUrl(currentUrl)}`);
242
280
  }
243
281
  currentUrl = new URL(location, currentUrl).toString();
244
282
  continue;
245
283
  }
246
284
  if (statusCode >= 400) {
247
285
  responseStream.destroy();
248
- throw new Error(`Failed to download URL: ${currentUrl} (${statusCode})`);
286
+ throw new Error(`Failed to download URL: ${describeUrl(currentUrl)} (${statusCode})`);
287
+ }
288
+ if (budget === undefined) {
289
+ await pipeline(responseStream, createWriteStream(filePath));
290
+ return;
291
+ }
292
+ if (Number(response.headers['content-length']) > budget.remainingBytes) {
293
+ responseStream.destroy();
294
+ throw budgetExceeded(budget, url);
249
295
  }
250
- await pipeline(responseStream, createWriteStream(filePath));
296
+ await pipeline(responseStream, limitDownloadBytes(budget, url), createWriteStream(filePath));
251
297
  return;
252
298
  }
253
- throw new Error(`Too many redirects while downloading URL input: ${url}`);
299
+ throw new Error(`Too many redirects while downloading URL input: ${describeUrl(url)}`);
254
300
  };
255
301
  export const prepareInputFiles = async (options = {}) => {
256
- const { inputFiles = [], params = {}, fields, base64Strategy = 'buffer', urlStrategy = 'import', maxBase64Bytes, allowPrivateUrls = true, tempDir, } = options;
302
+ const { inputFiles = [], params = {}, fields, base64Strategy = 'buffer', urlStrategy = 'import', maxBase64Bytes, allowPrivateUrls = true, maxUrlDownloadBytes, urlDownloadTimeoutMs, beforeUrlDownload, tempDir, } = options;
257
303
  let nextParams = { ...params };
258
304
  const files = {};
259
305
  const uploads = {};
260
306
  const cleanup = [];
307
+ const downloadBudget = maxUrlDownloadBytes === undefined
308
+ ? undefined
309
+ : { totalBytes: maxUrlDownloadBytes, remainingBytes: maxUrlDownloadBytes };
261
310
  if (fields && Object.keys(fields).length > 0) {
262
311
  nextParams = {
263
312
  ...nextParams,
@@ -329,10 +378,13 @@ export const prepareInputFiles = async (options = {}) => {
329
378
  getFilenameFromUrl(file.url) ??
330
379
  `${file.field}.bin`;
331
380
  const filePath = await ensureUniqueTempFilePath(root, filename, usedTempPaths);
381
+ await beforeUrlDownload?.();
332
382
  await downloadUrlToFile({
333
383
  allowPrivateUrls,
334
384
  filePath,
335
385
  url: file.url,
386
+ budget: downloadBudget,
387
+ timeoutMs: urlDownloadTimeoutMs,
336
388
  });
337
389
  files[file.field] = filePath;
338
390
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inputFiles.js","sourceRoot":"","sources":["../src/inputFiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputFiles.js","sourceRoot":"","sources":["../src/inputFiles.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "transloadit",
3
- "version": "5.0.1",
3
+ "version": "5.2.0",
4
4
  "description": "Node.js SDK for Transloadit",
5
5
  "homepage": "https://github.com/transloadit/node-sdk/tree/main/packages/node",
6
6
  "bugs": {
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "dependencies": {
35
35
  "@transloadit/sev-logger": "^0.1.9",
36
- "@transloadit/utils": "^4.9.0",
36
+ "@transloadit/utils": "^4.10.0",
37
37
  "cacheable-lookup": "^7.0.0",
38
38
  "clipanion": "^4.0.0-rc.4",
39
39
  "debug": "^4.4.3",
@@ -5,7 +5,13 @@ import type {
5
5
  CompileAssemblyInstructionsResult,
6
6
  } from '@transloadit/utils'
7
7
  import type { SignatureAlgorithm } from '@transloadit/utils/node'
8
- import type { Delays, Headers, OptionsOfJSONResponseBody, RetryOptions } from 'got'
8
+ import type {
9
+ BeforeRedirectHook,
10
+ Delays,
11
+ Headers,
12
+ OptionsOfJSONResponseBody,
13
+ RetryOptions,
14
+ } from 'got'
9
15
  import type { Input as IntoStreamInput } from 'into-stream'
10
16
 
11
17
  import type { TransloaditErrorResponseBody } from './ApiError.ts'
@@ -296,6 +302,11 @@ export interface CreateAssemblyOptions extends AssemblyUploadOptions {
296
302
  * Expected number of tus uploads when files will be uploaded separately.
297
303
  */
298
304
  expectedUploads?: number
305
+ /**
306
+ * Called once API2 has accepted the creation request, before uploads and polling. Callers that
307
+ * must not create an Assembly twice use it to tell later failures apart from rejected creation.
308
+ */
309
+ onAssemblyCreated?: (assembly: AssemblyStatus) => void
299
310
  }
300
311
 
301
312
  export interface ResumeAssemblyUploadsOptions extends AssemblyUploadOptions {
@@ -459,6 +470,11 @@ type BaseOptions = {
459
470
  followRedirects?: boolean
460
471
  validateResponses?: boolean
461
472
  clientName?: string
473
+ /**
474
+ * Fixed headers sent with every API request, for trusted relays such as the Transloadit-hosted
475
+ * MCP service that must identify itself to API2 next to a forwarded bearer token.
476
+ */
477
+ extraHeaders?: Record<string, string>
462
478
  }
463
479
 
464
480
  export type Options = BaseOptions & (AuthKeySecret | AuthToken)
@@ -482,8 +498,28 @@ export class Transloadit {
482
498
 
483
499
  private _clientName: string
484
500
 
501
+ #extraHeaders: Record<string, string>
502
+
485
503
  private _lastUsedAssemblyUrl = ''
486
504
 
505
+ /**
506
+ * got drops `Authorization` and cookies when a redirect changes origin, but not custom headers,
507
+ * so `extraHeaders` (such as a relay's shared secret) are removed the same way.
508
+ */
509
+ #dropExtraHeadersOffOrigin(requestUrl: string): BeforeRedirectHook[] {
510
+ const names = Object.keys(this.#extraHeaders).map((name) => name.toLowerCase())
511
+ if (names.length === 0) return []
512
+ // An unparseable request URL counts as a different origin, which drops the headers.
513
+ const requestOrigin = URL.canParse(requestUrl) ? new URL(requestUrl).origin : undefined
514
+ return [
515
+ (redirectOptions) => {
516
+ const redirectUrl = redirectOptions.url
517
+ if (requestOrigin && redirectUrl && new URL(redirectUrl).origin === requestOrigin) return
518
+ for (const name of names) delete redirectOptions.headers[name]
519
+ },
520
+ ]
521
+ }
522
+
487
523
  private _validateResponses = false
488
524
 
489
525
  /** Create a client; new combined keys require signatureAlgorithm: 'sha256' explicitly. */
@@ -514,6 +550,7 @@ export class Transloadit {
514
550
  this._maxRetries = opts.maxRetries != null ? opts.maxRetries : 5
515
551
  this._defaultTimeout = opts.timeout != null ? opts.timeout : 60000
516
552
  this._clientName = opts.clientName?.trim() || `node-sdk:${version}`
553
+ this.#extraHeaders = { ...opts.extraHeaders }
517
554
 
518
555
  // Passed on to got https://github.com/sindresorhus/got/blob/main/documentation/7-retry.md
519
556
  this._gotRetry = opts.gotRetry != null ? opts.gotRetry : { limit: 0 }
@@ -667,6 +704,7 @@ export class Transloadit {
667
704
  uploads = {},
668
705
  assemblyId,
669
706
  expectedUploads,
707
+ onAssemblyCreated,
670
708
  signal,
671
709
  uploadBehavior = 'await',
672
710
  } = opts
@@ -738,6 +776,7 @@ export class Transloadit {
738
776
  signal,
739
777
  })
740
778
  checkResult(result)
779
+ onAssemblyCreated?.(result)
741
780
 
742
781
  if (Object.keys(allStreamsMap).length > 0) {
743
782
  const { uploadUrls } = await sendTusRequest({
@@ -1665,8 +1704,10 @@ export class Transloadit {
1665
1704
  'Transloadit-Client': this._clientName,
1666
1705
  'User-Agent': undefined, // Remove got's user-agent
1667
1706
  ...(this._authToken ? { Authorization: `Bearer ${this._authToken}` } : {}),
1707
+ ...this.#extraHeaders,
1668
1708
  ...headers,
1669
1709
  },
1710
+ hooks: { beforeRedirect: this.#dropExtraHeadersOffOrigin(url) },
1670
1711
  responseType: 'json',
1671
1712
  signal,
1672
1713
  }
package/src/apiTypes.ts CHANGED
@@ -100,6 +100,8 @@ export type ListTemplatesParams = OptionalAuthParams & {
100
100
  todate?: string
101
101
  keywords?: string[]
102
102
  include_builtin?: 'all' | 'latest' | 'exclusively-all' | 'exclusively-latest'
103
+ /** Template columns to return, such as `['id', 'account_id']`; API2's default omits some. */
104
+ fields?: string[]
103
105
  }
104
106
 
105
107
  interface TemplateResponseBase {
@@ -313,13 +313,18 @@ export async function lint(
313
313
  }
314
314
 
315
315
  const issues = result.issues
316
+ // Unchanged wrapped instructions may already include their final newline.
317
+ const fixedInstructions =
318
+ result.fixedInstructions != null && !result.fixedInstructions.endsWith('\n')
319
+ ? `${result.fixedInstructions}\n`
320
+ : result.fixedInstructions
316
321
 
317
322
  if (fix && isStdin) {
318
- if (result.fixedInstructions == null) {
323
+ if (fixedInstructions == null) {
319
324
  output.error('No fixed output available.')
320
325
  return 1
321
326
  }
322
- process.stdout.write(`${result.fixedInstructions}\n`)
327
+ process.stdout.write(fixedInstructions)
323
328
  for (const issue of issues) {
324
329
  const line = formatLintIssue(issue)
325
330
  if (issue.type === 'warning') output.warn(line)
@@ -328,8 +333,8 @@ export async function lint(
328
333
  return result.success ? 0 : 1
329
334
  }
330
335
 
331
- if (fix && inputPath && result.fixedInstructions != null) {
332
- await fsp.writeFile(inputPath, result.fixedInstructions)
336
+ if (fix && inputPath && fixedInstructions != null) {
337
+ await fsp.writeFile(inputPath, fixedInstructions)
333
338
  }
334
339
 
335
340
  if (json) {
@@ -17,6 +17,7 @@ import { mintBearerTokenWithCredentials } from '../../bearerToken.ts'
17
17
  import { Transloadit } from '../../Transloadit.ts'
18
18
  import {
19
19
  buildMissingCredentialsMessage,
20
+ cliSignatureAlgorithmSchema,
20
21
  readCliInput,
21
22
  requireCliCredentials,
22
23
  resolveCliConfig,
@@ -337,7 +338,7 @@ export class SignatureCommand extends UnauthenticatedCommand {
337
338
  })
338
339
 
339
340
  algorithm = Option.String('--algorithm,-a', {
340
- description: 'Signature algorithm to use (sha1, sha256, sha384, sha512)',
341
+ description: `Signature algorithm to use (${cliSignatureAlgorithmSchema.options.join(', ')})`,
341
342
  })
342
343
 
343
344
  protected async run(): Promise<number | undefined> {
@@ -13,7 +13,7 @@ import { z } from 'zod'
13
13
  import { isAPIError } from './types.ts'
14
14
 
15
15
  /** API signing algorithms supported by CLI credentials and device authorization. */
16
- export const cliSignatureAlgorithmSchema = z.enum(['sha1', 'sha256', 'sha384', 'sha512'])
16
+ export const cliSignatureAlgorithmSchema = z.enum(['sha1', 'sha256', 'sha384'])
17
17
  export type CliKeySecretCredentials = {
18
18
  authKey: string
19
19
  authSecret: string
@@ -2,16 +2,31 @@ import type { StepsInput } from '../alphalib/types/template.ts'
2
2
 
3
3
  import fsp from 'node:fs/promises'
4
4
 
5
+ import { z } from 'zod'
6
+
5
7
  import { stepsSchema } from '../alphalib/types/template.ts'
6
8
 
9
+ const stepsWrapperSchema = z.object({ steps: z.record(z.unknown()) })
10
+
7
11
  export function parseStepsInputJson(content: string): StepsInput {
8
12
  const parsed: unknown = JSON.parse(content)
9
- const validated = stepsSchema.safeParse(parsed)
13
+ const wrapped = stepsWrapperSchema.safeParse(parsed)
14
+ let stepsInput = parsed
15
+ // A step named “steps” has a robot, unlike the top-level instructions wrapper.
16
+ if (wrapped.success && typeof wrapped.data.steps.robot !== 'string') {
17
+ // --steps only supplies steps; other instructions must not be silently discarded.
18
+ const validatedWrapper = stepsWrapperSchema.strict().safeParse(parsed)
19
+ if (!validatedWrapper.success) {
20
+ throw new Error(`Invalid steps format: ${validatedWrapper.error.message}`)
21
+ }
22
+ stepsInput = validatedWrapper.data.steps
23
+ }
24
+ const validated = stepsSchema.safeParse(stepsInput)
10
25
  if (!validated.success) {
11
26
  throw new Error(`Invalid steps format: ${validated.error.message}`)
12
27
  }
13
28
 
14
- const parsedSteps = parsed as Record<string, Record<string, unknown>>
29
+ const parsedSteps = stepsInput as Record<string, Record<string, unknown>>
15
30
  const validatedSteps = validated.data as Record<string, Record<string, unknown>>
16
31
 
17
32
  return Object.fromEntries(
package/src/inputFiles.ts CHANGED
@@ -13,6 +13,7 @@ import { mkdtemp, rm, writeFile } from 'node:fs/promises'
13
13
  import { isIP } from 'node:net'
14
14
  import { tmpdir } from 'node:os'
15
15
  import { basename, join, parse } from 'node:path'
16
+ import { Transform } from 'node:stream'
16
17
  import { pipeline } from 'node:stream/promises'
17
18
 
18
19
  import got from 'got'
@@ -53,6 +54,15 @@ export type PrepareInputFilesOptions = {
53
54
  urlStrategy?: UrlStrategy
54
55
  maxBase64Bytes?: number
55
56
  allowPrivateUrls?: boolean
57
+ /** Abort once all URL downloads of this call exceed this many bytes together. */
58
+ maxUrlDownloadBytes?: number
59
+ /** Abort a URL download (DNS checks and redirects included) after this many milliseconds. */
60
+ urlDownloadTimeoutMs?: number
61
+ /**
62
+ * Awaited before each URL input is downloaded locally (not for `/http/import`), so a caller can
63
+ * vouch for the requester first; rejecting aborts preparation.
64
+ */
65
+ beforeUrlDownload?: () => Promise<void>
56
66
  tempDir?: string
57
67
  }
58
68
 
@@ -202,6 +212,16 @@ const isPrivateIp = (address: string): boolean => {
202
212
  return false
203
213
  }
204
214
 
215
+ /**
216
+ * Names a URL in error messages without its query or fragment: input URLs are often presigned
217
+ * (ChatGPT attachments, S3), and these messages reach logs and model-visible tool results.
218
+ */
219
+ const describeUrl = (value: string): string => {
220
+ if (!URL.canParse(value)) return '[unparseable URL]'
221
+ const url = new URL(value)
222
+ return `${url.origin}${url.pathname}`
223
+ }
224
+
205
225
  export const resolvePublicDownloadAddresses = async (
206
226
  value: string,
207
227
  ): Promise<Array<{ address: string; family: 4 | 6 }>> => {
@@ -211,10 +231,10 @@ export const resolvePublicDownloadAddresses = async (
211
231
  ? parsed.hostname.slice(1, -1)
212
232
  : parsed.hostname
213
233
  if (!['http:', 'https:'].includes(parsed.protocol)) {
214
- throw new Error(`URL downloads are limited to http/https: ${value}`)
234
+ throw new Error(`URL downloads are limited to http/https: ${describeUrl(value)}`)
215
235
  }
216
236
  if (isPrivateIp(hostname)) {
217
- throw new Error(`URL downloads are limited to public hosts: ${value}`)
237
+ throw new Error(`URL downloads are limited to public hosts: ${describeUrl(value)}`)
218
238
  }
219
239
 
220
240
  const literalFamily = isIP(hostname)
@@ -226,11 +246,11 @@ export const resolvePublicDownloadAddresses = async (
226
246
  verbatim: true,
227
247
  })
228
248
  if (resolvedAddresses.some((address) => isPrivateIp(address.address))) {
229
- throw new Error(`URL downloads are limited to public hosts: ${value}`)
249
+ throw new Error(`URL downloads are limited to public hosts: ${describeUrl(value)}`)
230
250
  }
231
251
 
232
252
  if (resolvedAddresses.length === 0) {
233
- throw new Error(`Unable to resolve URL hostname: ${value}`)
253
+ throw new Error(`Unable to resolve URL hostname: ${describeUrl(value)}`)
234
254
  }
235
255
 
236
256
  return resolvedAddresses.map((address) => ({
@@ -370,22 +390,58 @@ export function createPinnedDnsLookup(
370
390
  return pinnedDnsLookup as PinnedDnsLookup
371
391
  }
372
392
 
393
+ /** A budget shared by every URL download of one `prepareInputFiles` call. */
394
+ type DownloadBudget = { totalBytes: number; remainingBytes: number }
395
+
396
+ const budgetExceeded = (budget: DownloadBudget, url: string): Error =>
397
+ new Error(`URL downloads exceed ${budget.totalBytes} bytes: ${describeUrl(url)}`)
398
+
399
+ /** Errors once the budget is used up, so temp files stay bounded while they stream in. */
400
+ const limitDownloadBytes = (budget: DownloadBudget, url: string): Transform =>
401
+ new Transform({
402
+ transform(chunk: Buffer, _encoding, callback) {
403
+ budget.remainingBytes -= chunk.length
404
+ if (budget.remainingBytes < 0) {
405
+ callback(budgetExceeded(budget, url))
406
+ return
407
+ }
408
+ callback(null, chunk)
409
+ },
410
+ })
411
+
373
412
  const downloadUrlToFile = async ({
374
413
  allowPrivateUrls,
375
414
  filePath,
376
415
  url,
416
+ budget,
417
+ timeoutMs,
377
418
  }: {
378
419
  allowPrivateUrls: boolean
379
420
  filePath: string
380
421
  url: string
422
+ budget?: DownloadBudget
423
+ timeoutMs?: number
381
424
  }): Promise<void> => {
382
425
  let currentUrl = url
426
+ // One deadline for the whole download, so DNS checks and redirects cannot each restart it.
427
+ const deadline = timeoutMs === undefined ? undefined : Date.now() + timeoutMs
428
+ const remainingMs = (): number | undefined => {
429
+ if (deadline === undefined) return undefined
430
+ const remaining = deadline - Date.now()
431
+ if (remaining <= 0) {
432
+ throw new Error(`URL download timed out after ${timeoutMs} ms: ${describeUrl(url)}`)
433
+ }
434
+ return remaining
435
+ }
383
436
 
384
437
  for (let redirectCount = 0; redirectCount <= MAX_URL_REDIRECTS; redirectCount += 1) {
385
438
  let validatedAddresses: Array<{ address: string; family: 4 | 6 }> | null = null
386
439
  if (!allowPrivateUrls) {
440
+ // Not raced against the deadline: the system resolver bounds each lookup with its own
441
+ // short timeout and no bytes are transferred, so checking the clock right after suffices.
387
442
  validatedAddresses = await resolvePublicDownloadAddresses(currentUrl)
388
443
  }
444
+ const requestTimeoutMs = remainingMs()
389
445
 
390
446
  const dnsLookup: LookupFunction | undefined =
391
447
  validatedAddresses == null ? undefined : createPinnedDnsLookup(validatedAddresses)
@@ -395,6 +451,7 @@ const downloadUrlToFile = async ({
395
451
  followRedirect: false,
396
452
  retry: { limit: 0 },
397
453
  throwHttpErrors: false,
454
+ ...(requestTimeoutMs === undefined ? {} : { timeout: { request: requestTimeoutMs } }),
398
455
  })
399
456
 
400
457
  const response = await new Promise<
@@ -416,7 +473,7 @@ const downloadUrlToFile = async ({
416
473
  responseStream.destroy()
417
474
  const location = response.headers.location
418
475
  if (location == null) {
419
- throw new Error(`Redirect response missing Location header: ${currentUrl}`)
476
+ throw new Error(`Redirect response missing Location header: ${describeUrl(currentUrl)}`)
420
477
  }
421
478
  currentUrl = new URL(location, currentUrl).toString()
422
479
  continue
@@ -424,14 +481,22 @@ const downloadUrlToFile = async ({
424
481
 
425
482
  if (statusCode >= 400) {
426
483
  responseStream.destroy()
427
- throw new Error(`Failed to download URL: ${currentUrl} (${statusCode})`)
484
+ throw new Error(`Failed to download URL: ${describeUrl(currentUrl)} (${statusCode})`)
428
485
  }
429
486
 
430
- await pipeline(responseStream, createWriteStream(filePath))
487
+ if (budget === undefined) {
488
+ await pipeline(responseStream, createWriteStream(filePath))
489
+ return
490
+ }
491
+ if (Number(response.headers['content-length']) > budget.remainingBytes) {
492
+ responseStream.destroy()
493
+ throw budgetExceeded(budget, url)
494
+ }
495
+ await pipeline(responseStream, limitDownloadBytes(budget, url), createWriteStream(filePath))
431
496
  return
432
497
  }
433
498
 
434
- throw new Error(`Too many redirects while downloading URL input: ${url}`)
499
+ throw new Error(`Too many redirects while downloading URL input: ${describeUrl(url)}`)
435
500
  }
436
501
 
437
502
  export const prepareInputFiles = async (
@@ -445,6 +510,9 @@ export const prepareInputFiles = async (
445
510
  urlStrategy = 'import',
446
511
  maxBase64Bytes,
447
512
  allowPrivateUrls = true,
513
+ maxUrlDownloadBytes,
514
+ urlDownloadTimeoutMs,
515
+ beforeUrlDownload,
448
516
  tempDir,
449
517
  } = options
450
518
 
@@ -452,6 +520,10 @@ export const prepareInputFiles = async (
452
520
  const files: Record<string, string> = {}
453
521
  const uploads: Record<string, UploadInput> = {}
454
522
  const cleanup: Array<() => Promise<void>> = []
523
+ const downloadBudget: DownloadBudget | undefined =
524
+ maxUrlDownloadBytes === undefined
525
+ ? undefined
526
+ : { totalBytes: maxUrlDownloadBytes, remainingBytes: maxUrlDownloadBytes }
455
527
 
456
528
  if (fields && Object.keys(fields).length > 0) {
457
529
  nextParams = {
@@ -530,10 +602,13 @@ export const prepareInputFiles = async (
530
602
  getFilenameFromUrl(file.url) ??
531
603
  `${file.field}.bin`
532
604
  const filePath = await ensureUniqueTempFilePath(root, filename, usedTempPaths)
605
+ await beforeUrlDownload?.()
533
606
  await downloadUrlToFile({
534
607
  allowPrivateUrls,
535
608
  filePath,
536
609
  url: file.url,
610
+ budget: downloadBudget,
611
+ timeoutMs: urlDownloadTimeoutMs,
537
612
  })
538
613
  files[file.field] = filePath
539
614
  }