export async function downloadTool()

in tool.ts [201:263]


export async function downloadTool(url: string, fileName?: string, handlers?: ifm.IRequestHandler[]): Promise<string> {
    return new Promise<string>(async (resolve, reject) => {
        try {
            handlers = handlers || null;
            let http: httpm.HttpClient = new httpm.HttpClient(userAgent, handlers, requestOptions);
            tl.debug(fileName);
            fileName = fileName || uuidV4();

            // check if it's an absolute path already
            var destPath: string;
            if(path.isAbsolute(fileName))
            {
                destPath = fileName;
            }
            else
            {
                destPath = path.join(_getAgentTemp(), fileName);
            }

            // make sure that the folder exists
            tl.mkdirP(path.dirname(destPath));

            console.log(tl.loc('TOOL_LIB_Downloading', url));
            tl.debug('destination ' + destPath);

            if (fs.existsSync(destPath)) {
                throw new Error("Destination file path already exists");
            }
            
            tl.debug('downloading');
            let response: httpm.HttpClientResponse = await http.get(url);
            
            if (response.message.statusCode != 200) {
                let err: Error = new Error('Unexpected HTTP response: ' + response.message.statusCode);
                err['httpStatusCode'] = response.message.statusCode;
                tl.debug(`Failed to download "${fileName}" from "${url}". Code(${response.message.statusCode}) Message(${response.message.statusMessage})`);
                throw err;
            }

            tl.debug('creating stream');
            let file: NodeJS.WritableStream = fs.createWriteStream(destPath);
            file.on('open', async (fd) => {
                try {
                    let stream = response.message.pipe(file);
                    stream.on('close', () => {
                        tl.debug('download complete');
                        resolve(destPath);
                    });
                }
                catch (err) {
                    reject(err);
                }
            });
            file.on('error', (err) => {
                file.end();
                reject(err);
            })
        }
        catch (error) {
            reject(error);
        }
    });
}