68 lines
2.1 KiB
TypeScript
68 lines
2.1 KiB
TypeScript
/**
|
|
* Copyright (c) HashiCorp, Inc.
|
|
* SPDX-License-Identifier: MPL-2.0
|
|
*/
|
|
|
|
import Service from '@ember/service';
|
|
import timestamp from 'core/utils/timestamp';
|
|
|
|
interface Extensions {
|
|
csv: string;
|
|
hcl: string;
|
|
sentinel: string;
|
|
json: string;
|
|
pem: string;
|
|
txt: string;
|
|
}
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
|
|
const EXTENSION_TO_MIME: Extensions = {
|
|
csv: 'txt/csv',
|
|
hcl: 'text/plain',
|
|
sentinel: 'text/plain',
|
|
json: 'application/json',
|
|
pem: 'application/x-pem-file',
|
|
txt: 'text/plain',
|
|
};
|
|
|
|
export default class DownloadService extends Service {
|
|
download(filename: string, content: string, extension: string) {
|
|
// replace spaces with hyphens, append extension to filename
|
|
const formattedFilename =
|
|
`${filename?.replace(/\s+/g, '-')}.${extension}` ||
|
|
`vault-data-${timestamp.now().toISOString()}.${extension}`;
|
|
|
|
// map extension to MIME type or use default
|
|
const mimetype = EXTENSION_TO_MIME[extension as keyof Extensions] || 'text/plain';
|
|
|
|
// commence download
|
|
const { document, URL } = window;
|
|
const downloadElement = document.createElement('a');
|
|
const data = new File([content], formattedFilename, { type: mimetype });
|
|
downloadElement.download = formattedFilename;
|
|
downloadElement.href = URL.createObjectURL(data);
|
|
document.body.appendChild(downloadElement);
|
|
downloadElement.click();
|
|
URL.revokeObjectURL(downloadElement.href);
|
|
downloadElement.remove();
|
|
return formattedFilename;
|
|
}
|
|
|
|
// SAMPLE CSV FORMAT ('content' argument)
|
|
// Must be a string with each row \n separated and each column comma separated
|
|
// 'Namespace path,Authentication method,Total clients,Entity clients,Non-entity clients\n
|
|
// namespacelonglonglong4/,,191,171,20\n
|
|
// namespacelonglonglong4/,auth/method/uMGBU,35,20,15\n'
|
|
csv(filename: string, content: string) {
|
|
this.download(filename, content, 'csv');
|
|
}
|
|
|
|
pem(filename: string, content: string) {
|
|
this.download(filename, content, 'pem');
|
|
}
|
|
|
|
miscExtension(filename: string, content: string, extension: string) {
|
|
this.download(filename, content, extension);
|
|
}
|
|
}
|