nestjs-azure-storage-blob
Version:
Azure Blob Storage module for Nest.js
143 lines • 5.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AzureStorageBlobService = void 0;
const tslib_1 = require("tslib");
const storage_blob_1 = require("@azure/storage-blob");
const common_1 = require("@nestjs/common");
const azure_storage_blob_decorator_1 = require("./azure-storage-blob.decorator");
/**
* request headers
* https://learn.microsoft.com/rest/api/storageservices/put-blob#request-headers-all-blob-types
*/
let AzureStorageBlobService = class AzureStorageBlobService {
constructor(blobServiceClient) {
this.blobServiceClient = blobServiceClient;
this.containerName = process.env.NEST_STORAGE_BLOB_CONTAINER;
}
getClient() {
return this.blobServiceClient;
}
getContainerName() {
return this.containerName;
}
convertToResourceTypes(resourceTypeMap = {
container: true,
object: true,
service: true,
}) {
const resType = new storage_blob_1.AccountSASResourceTypes();
if (resourceTypeMap.container) {
resType.container = true;
}
if (resourceTypeMap.object) {
resType.object = true;
}
if (resourceTypeMap.service) {
resType.service = true;
}
return resType.toString();
}
getAccountSasUrl(expiresOn = new Date(Date.now() + 5 * 60 * 1000), permissions = { read: true }, resourceTypeMap = {
container: true,
object: true,
service: true,
}, options) {
const _permissions = storage_blob_1.AccountSASPermissions.from(permissions);
const resourceTypes = this.convertToResourceTypes(resourceTypeMap);
const accountSasUrl = this.blobServiceClient.generateAccountSasUrl(expiresOn, _permissions, resourceTypes, options);
const data = {
sasUrl: accountSasUrl,
headers: {},
};
return data;
}
async getContainerSasUrl(containerName, permissions = {
read: true,
}, options = {
expiresOn: new Date(Date.now() + 5 * 60 * 1000),
}) {
const _permissions = storage_blob_1.ContainerSASPermissions.from(permissions);
const containerSasUrl = await this.blobServiceClient
.getContainerClient(containerName)
.generateSasUrl({
...options,
permissions: _permissions,
});
const data = {
sasUrl: containerSasUrl,
headers: {},
};
return data;
}
async getBlockBlobSasUrl(containerName, blobName, permissions = {
read: true,
create: true,
}, options = {}) {
// - How to use this sasURl?
// PUT {{sasUrl}} with header 'x-ms-blob-type: BlockBlob'
// header setting is mendatory
// and attach file to body
// - How to revoke sasUrl after upload?
// https://stackoverflow.com/questions/26206993/how-to-revoke-shared-access-signature-in-azure-sdk
// https://www.youtube.com/watch?v=lFFYcNbDvdo
const _permissions = storage_blob_1.BlobSASPermissions.from(permissions);
const sasUrl = await this.blobServiceClient
.getContainerClient(containerName)
.getBlockBlobClient(blobName)
.generateSasUrl({
...options,
permissions: _permissions,
});
const data = {
sasUrl,
headers: { 'x-ms-blob-type': 'BlockBlob' },
};
return data;
}
async getUploadable(containerName, blobName, expiresIn = 5 * 60 * 1000) {
const { sasUrl: uploadUrl, headers } = await this.getBlockBlobSasUrl(containerName, blobName, { create: true }, { expiresOn: new Date(Date.now() + expiresIn) });
const { sasUrl: downloadUrl } = await this.getBlockBlobSasUrl(containerName, blobName, { read: true }, { expiresOn: new Date(Date.now() + expiresIn) });
const data = {
upload: {
method: 'PUT',
url: uploadUrl,
headers,
expiresIn,
},
download: {
method: 'GET',
url: downloadUrl,
expiresIn,
},
};
return data;
}
async listFiles(destination, containerName) {
const container = this.blobServiceClient.getContainerClient(containerName);
const files = container.listBlobsFlat({ prefix: destination });
const paths = [];
for await (const file of files) {
paths.push(file);
}
return paths;
}
async deleteFile(container, blob) {
return this.blobServiceClient.getContainerClient(container).getBlockBlobClient(blob).delete();
}
async deleteFileIfExists(container, blob) {
return this.blobServiceClient
.getContainerClient(container)
.getBlockBlobClient(blob)
.deleteIfExists();
}
async downloadStream(container, blob) {
return this.blobServiceClient.getContainerClient(container).getBlockBlobClient(blob).download();
}
};
exports.AzureStorageBlobService = AzureStorageBlobService;
exports.AzureStorageBlobService = AzureStorageBlobService = tslib_1.__decorate([
(0, common_1.Injectable)(),
tslib_1.__param(0, (0, azure_storage_blob_decorator_1.InjectStorageBlob)()),
tslib_1.__metadata("design:paramtypes", [storage_blob_1.BlobServiceClient])
], AzureStorageBlobService);
//# sourceMappingURL=azure-storage-blob.service.js.map