@itwin/imodels-client-authoring
Version:
iModels API client wrapper for applications that author iModels.
48 lines • 2.06 kB
JavaScript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
import * as fs from "fs";
import { IModelsErrorCode, IModelsErrorImpl, } from "@itwin/imodels-client-management";
/** Downloads file to path from provided storage. */
export async function downloadFile(params) {
const targetFileStream = fs.createWriteStream(params.localPath);
try {
const downloadStream = await params.storage.download({
...params,
transferType: "stream",
});
downloadStream.pipe(targetFileStream);
if (params.totalDownloadCallback ||
params.latestDownloadedChunkSizeCallback) {
let bytesDownloaded = 0;
// eslint-disable-next-line @typescript-eslint/no-explicit-any
downloadStream.on("data", (chunk) => {
bytesDownloaded += chunk?.length;
params.totalDownloadCallback?.(bytesDownloaded);
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
params.latestDownloadedChunkSizeCallback?.(chunk?.length);
});
}
await new Promise((resolve, reject) => {
downloadStream.on("error", reject);
targetFileStream.on("close", () => resolve());
});
}
catch (error) {
targetFileStream.end();
throw adaptAbortError(error);
}
}
function adaptAbortError(error) {
if (!(error instanceof Error) || error.name !== "AbortError")
return error;
return new IModelsErrorImpl({
code: IModelsErrorCode.DownloadAborted,
message: `Download was aborted. Message: ${error.message}}.`,
originalError: error,
statusCode: undefined,
details: undefined,
});
}
//# sourceMappingURL=FileDownload.js.map