bitwarden-estensione-browser/apps/browser/src/platform/services/browser-file-download.servi...

43 lines
1.7 KiB
TypeScript

import { Injectable } from "@angular/core";
import { FileDownloadBuilder } from "@bitwarden/common/platform/abstractions/file-download/file-download.builder";
import { FileDownloadRequest } from "@bitwarden/common/platform/abstractions/file-download/file-download.request";
import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service";
import { Utils } from "@bitwarden/common/platform/misc/utils";
import { SafariApp } from "../../browser/safariApp";
import { BrowserApi } from "../browser/browser-api";
@Injectable()
export class BrowserFileDownloadService implements FileDownloadService {
download(request: FileDownloadRequest): void {
const builder = new FileDownloadBuilder(request);
if (BrowserApi.isSafariApi) {
let data: BlobPart = null;
if (builder.blobOptions.type === "text/plain" && typeof request.blobData === "string") {
data = request.blobData;
} else {
data = Utils.fromBufferToB64(request.blobData as ArrayBuffer);
}
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
// eslint-disable-next-line @typescript-eslint/no-floating-promises
SafariApp.sendMessageToApp(
"downloadFile",
JSON.stringify({
blobData: data,
blobOptions: request.blobOptions,
fileName: request.fileName,
}),
true,
);
} else {
const a = window.document.createElement("a");
a.href = URL.createObjectURL(builder.blob);
a.download = request.fileName;
window.document.body.appendChild(a);
a.click();
window.document.body.removeChild(a);
}
}
}