@@ -9,6 +9,7 @@ import {safeEventCallback} from "./safeEventCallback.js";
99import { ModelFileAccessTokens , resolveModelFileAccessTokensTryHeaders } from "./modelFileAccesTokens.js" ;
1010import { pushAll } from "./pushAll.js" ;
1111import { resolveModelDestination } from "./resolveModelDestination.js" ;
12+ import { getAuthorizationHeader , resolveParsedModelUri } from "./parseModelUri.js" ;
1213
1314export type ModelDownloaderOptions = ( {
1415 /**
@@ -122,17 +123,22 @@ export type ModelDownloaderOptions = ({
122123 * });
123124 * ```
124125 */
125- export async function createModelDownloader ( options : ModelDownloaderOptions ) {
126- const downloader = ModelDownloader . _create ( options ) ;
127- await downloader . _init ( ) ;
128- return downloader ;
126+ export function createModelDownloader ( options : ModelDownloaderOptions ) {
127+ return ModelDownloader . _create ( options ) ;
129128}
130129
131130/**
132131 * Combine multiple models downloaders to a single downloader to download everything using as much parallelism as possible.
133132 *
134133 * You can check each individual model downloader for its download progress,
135134 * but only the `onProgress` passed to the combined downloader will be called during the download.
135+ *
136+ * When combining `ModelDownloader` instances, the following options on each individual `ModelDownloader` are ignored:
137+ * - `showCliProgress`
138+ * - `onProgress`
139+ * - `parallelDownloads`
140+ *
141+ * To set any of those options for the combined downloader, you have to pass them to the combined downloader instance.
136142 * @example
137143 * ```typescript
138144 * import {fileURLToPath} from "url";
@@ -196,31 +202,18 @@ export class ModelDownloader {
196202 /** @internal */ private _totalFiles ?: number ;
197203 /** @internal */ private _tryHeaders : Record < string , string > [ ] = [ ] ;
198204
199- private constructor ( options : ModelDownloaderOptions ) {
205+ private constructor ( options : ModelDownloaderOptions , { resolvedModelUrl, resolvedFileName} : {
206+ resolvedModelUrl : string ,
207+ resolvedFileName ?: string
208+ } ) {
200209 const {
201- modelUri, modelUrl,
202- dirPath = cliModelsDirectory , fileName, headers, showCliProgress = false , onProgress, deleteTempFileOnCancel = true ,
210+ dirPath = cliModelsDirectory , headers, showCliProgress = false , onProgress, deleteTempFileOnCancel = true ,
203211 skipExisting = true , parallelDownloads = 4 , tokens
204- } = options as ModelDownloaderOptions & {
205- modelUri : string ,
206- modelUrl : string
207- } ;
208- const resolvedModelUri = modelUri || modelUrl ;
212+ } = options ;
209213
210- if ( resolvedModelUri == null || dirPath == null )
211- throw new Error ( "modelUri and dirPath cannot be null" ) ;
212-
213- const resolvedModelDestination = resolveModelDestination ( resolvedModelUri ) ;
214-
215- this . _modelUrl = resolvedModelDestination . type === "file"
216- ? path . join ( dirPath , resolvedModelUri )
217- : resolvedModelDestination . url ;
214+ this . _modelUrl = resolvedModelUrl ;
218215 this . _dirPath = path . resolve ( process . cwd ( ) , dirPath ) ;
219- this . _fileName = fileName || (
220- resolvedModelDestination . type === "uri"
221- ? resolvedModelDestination . parsedUri . fullFilename
222- : undefined
223- ) ;
216+ this . _fileName = resolvedFileName ;
224217 this . _headers = headers ;
225218 this . _showCliProgress = showCliProgress ;
226219 this . _onProgress = safeEventCallback ( onProgress ) ;
@@ -324,15 +317,11 @@ export class ModelDownloader {
324317 */
325318 deleteTempFile ?: boolean
326319 } = { } ) {
327- for ( const downloader of this . _specificFileDownloaders ) {
328- if ( deleteTempFile )
329- await downloader . closeAndDeleteFile ( ) ;
330- else
331- await downloader . close ( ) ;
332- }
320+ for ( const downloader of this . _specificFileDownloaders )
321+ await downloader . close ( { deleteTempFile} ) ;
333322
334323 if ( this . _downloader !== this . _specificFileDownloaders [ 0 ] )
335- await this . _downloader ?. close ( ) ;
324+ await this . _downloader ?. close ( { deleteTempFile } ) ;
336325 }
337326
338327 /** @internal */
@@ -435,8 +424,54 @@ export class ModelDownloader {
435424 }
436425
437426 /** @internal */
438- public static _create ( options : ModelDownloaderOptions ) {
439- return new ModelDownloader ( options ) ;
427+ public static async _create ( options : ModelDownloaderOptions ) {
428+ const {
429+ modelUri, modelUrl, dirPath = cliModelsDirectory , fileName
430+ } = options as ModelDownloaderOptions & {
431+ modelUri ?: string ,
432+ modelUrl ?: string
433+ } ;
434+ const resolvedModelUri = modelUri || modelUrl ;
435+
436+ if ( resolvedModelUri == null || dirPath == null )
437+ throw new Error ( "modelUri and dirPath cannot be null" ) ;
438+
439+ async function getModelUrlAndFilename ( ) : Promise < {
440+ resolvedModelUrl : string ,
441+ resolvedFileName ?: string
442+ } > {
443+ const resolvedModelDestination = resolveModelDestination ( resolvedModelUri ! ) ;
444+
445+ if ( resolvedModelDestination . type == "file" )
446+ return {
447+ resolvedModelUrl : path . resolve ( dirPath , resolvedModelDestination . path ) ,
448+ resolvedFileName : fileName
449+ } ;
450+ else if ( resolvedModelDestination . type === "url" )
451+ return {
452+ resolvedModelUrl : resolvedModelDestination . url ,
453+ resolvedFileName : fileName
454+ } ;
455+ else if ( resolvedModelDestination . parsedUri . type === "resolved" )
456+ return {
457+ resolvedModelUrl : resolvedModelDestination . parsedUri . resolvedUrl ,
458+ resolvedFileName : fileName || resolvedModelDestination . parsedUri . filename
459+ } ;
460+
461+ const resolvedUri = await resolveParsedModelUri ( resolvedModelDestination . parsedUri , {
462+ tokens : options . tokens ,
463+ authorizationHeader : getAuthorizationHeader ( options . headers )
464+ } ) ;
465+
466+ return {
467+ resolvedModelUrl : resolvedUri . resolvedUrl ,
468+ resolvedFileName : fileName || resolvedUri . filename
469+ } ;
470+ }
471+
472+ const modelDownloader = new ModelDownloader ( options , await getModelUrlAndFilename ( ) ) ;
473+ await modelDownloader . _init ( ) ;
474+ return modelDownloader ;
440475 }
441476}
442477
@@ -472,7 +507,7 @@ export class CombinedModelDownloader {
472507 *
473508 * To set any of those options for the combined downloader, you have to pass them to the combined downloader instance
474509 */
475- public constructor ( downloaders : ModelDownloader [ ] , options ?: CombinedModelDownloaderOptions ) {
510+ private constructor ( downloaders : ModelDownloader [ ] , options ?: CombinedModelDownloaderOptions ) {
476511 const {
477512 showCliProgress = false ,
478513 onProgress,
@@ -488,18 +523,16 @@ export class CombinedModelDownloader {
488523 }
489524
490525 public async cancel ( ) {
491- for ( const modelDownloader of await Promise . all ( this . _downloaders ) ) {
526+ for ( const modelDownloader of this . _downloaders ) {
492527 if ( modelDownloader . _specificFileDownloaders . every (
493528 ( downloader ) => downloader . status . downloadStatus === "Finished"
494529 ) )
495530 continue ;
496531
497- for ( const downloader of modelDownloader . _specificFileDownloaders ) {
498- if ( modelDownloader . _deleteTempFileOnCancel )
499- await downloader . closeAndDeleteFile ( ) ;
500- else
501- await downloader . close ( ) ;
502- }
532+ for ( const downloader of modelDownloader . _specificFileDownloaders )
533+ await downloader . close ( {
534+ deleteTempFile : modelDownloader . _deleteTempFileOnCancel
535+ } ) ;
503536 }
504537 }
505538
@@ -543,7 +576,7 @@ export class CombinedModelDownloader {
543576 return this . entrypointFilePaths ;
544577 }
545578
546- public get modelDownloaders ( ) {
579+ public get modelDownloaders ( ) : readonly ModelDownloader [ ] {
547580 return this . _downloaders ;
548581 }
549582
@@ -598,7 +631,7 @@ export class CombinedModelDownloader {
598631 cliStyle : isCI ? "ci" : "fancy" ,
599632 parallelDownloads : this . _parallelDownloads
600633 } ,
601- ...( await Promise . all ( this . _downloaders ) ) . flatMap ( ( downloader ) => downloader . _specificFileDownloaders )
634+ ...this . _downloaders . flatMap ( ( downloader ) => downloader . _specificFileDownloaders )
602635 ) ;
603636 }
604637
0 commit comments