@itwin/object-storage-azure
Version:
Object storage implementation using Azure Blob Storage
175 lines • 9.06 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.AzureServerStorage = void 0;
/*---------------------------------------------------------------------------------------------
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
* See LICENSE.md in the project root for license terms and full copyright notice.
*--------------------------------------------------------------------------------------------*/
const fs_1 = require("fs");
const path_1 = require("path");
const storage_blob_1 = require("@azure/storage-blob");
const internal_1 = require("@itwin/object-storage-core/lib/common/internal");
const internal_2 = require("@itwin/object-storage-core/lib/server/internal");
const object_storage_core_1 = require("@itwin/object-storage-core");
const common_1 = require("../common");
const internal_3 = require("../common/internal");
const internal_4 = require("./internal");
const wrappers_1 = require("./wrappers");
class AzureServerStorage extends object_storage_core_1.ServerStorage {
_config;
_client;
constructor(config, client) {
super();
this._config = config;
this._client = client;
}
async download(reference, transferType, localPath) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
if (transferType === "local") {
(0, internal_2.assertLocalFile)(localPath);
await fs_1.promises.mkdir((0, path_1.dirname)(localPath), { recursive: true });
}
const downloadStream = await new wrappers_1.BlockBlobClientWrapper(this._client.getBlockBlobClient(reference)).download();
return (0, internal_2.streamToTransferType)(downloadStream, transferType, localPath);
}
async upload(reference, data, metadata, headers) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
if (typeof data === "string")
await (0, internal_2.assertFileNotEmpty)(data);
return new wrappers_1.BlockBlobClientWrapper(this._client.getBlockBlobClient(reference)).upload(data, metadata, headers);
}
async uploadInMultipleParts(reference, data, options, headers) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
if (typeof data === "string")
await (0, internal_2.assertFileNotEmpty)(data);
return new wrappers_1.BlockBlobClientWrapper(this._client.getBlockBlobClient(reference)).uploadInMultipleParts(data, options, headers);
}
async createBaseDirectory(directory) {
await this._client.getContainerClient(directory.baseDirectory).create();
}
getListDirectoriesPagedIterator(maxPageSize = 1000) {
const pageIterator = new object_storage_core_1.EntityPageListIterator(() => this._client.getDirectoriesNextPage({ maxPageSize: maxPageSize }));
return pageIterator;
}
getListObjectsPagedIterator(directory, maxPageSize = 1000) {
const pageIterator = new object_storage_core_1.EntityPageListIterator(() => this._client.getObjectsNextPage(directory, { maxPageSize: maxPageSize }));
return pageIterator;
}
/**
* @deprecated Use listObjects method instead.
*/
// eslint-disable-next-line deprecation/deprecation
async list(directory) {
return this.listObjects(directory);
}
async deleteBaseDirectory(directory) {
return this.handleNotFound(async () => {
await this._client.getContainerClient(directory.baseDirectory).delete();
});
}
async deleteObject(reference) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
return this.handleNotFound(async () => {
await this._client.getBlobClient(reference).delete();
});
}
async baseDirectoryExists(directory) {
return this._client.getContainerClient(directory.baseDirectory).exists();
}
async objectExists(reference) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
return this._client.getBlobClient(reference).exists();
}
async updateMetadata(reference, metadata) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
await this._client.getBlobClient(reference).setMetadata(metadata);
}
async getObjectProperties(reference) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
const { lastModified, contentLength, metadata, _response } = await this._client.getBlobClient(reference).getProperties();
return {
lastModified: lastModified,
reference,
size: contentLength,
metadata,
contentEncoding: _response.parsedHeaders.contentEncoding,
contentType: _response.parsedHeaders.contentType,
cacheControl: _response.parsedHeaders.cacheControl,
};
}
// eslint-disable-next-line @typescript-eslint/require-await
async getDownloadUrl(reference, expiry) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
const blobClient = this._client.getBlockBlobClient(reference);
const parameters = (0, internal_4.buildBlobSASParameters)(reference.baseDirectory, "read", (0, internal_2.getExpiryDate)(expiry), this._config.accountName, this._config.accountKey, (0, internal_3.buildBlobName)(reference));
return `${blobClient.url}?${parameters}`;
}
// eslint-disable-next-line @typescript-eslint/require-await
async getUploadUrl(reference, expiry) {
(0, internal_1.assertRelativeDirectory)(reference.relativeDirectory);
const blobClient = this._client.getBlockBlobClient(reference);
const parameters = (0, internal_4.buildBlobSASParameters)(reference.baseDirectory, "write", (0, internal_2.getExpiryDate)(expiry), this._config.accountName, this._config.accountKey, (0, internal_3.buildBlobName)(reference));
return `${blobClient.url}?${parameters}`;
}
// eslint-disable-next-line @typescript-eslint/require-await
async getDownloadConfig(directory, expiry) {
(0, internal_1.assertRelativeDirectory)(directory.relativeDirectory);
const expiresOn = (0, internal_2.getExpiryDate)(expiry);
const parameters = (0, internal_4.buildBlobSASParameters)(directory.baseDirectory, "read", expiresOn, this._config.accountName, this._config.accountKey);
return {
storageType: common_1.Constants.storageType,
authentication: parameters,
expiration: expiresOn,
baseUrl: this._config.baseUrl,
};
}
// eslint-disable-next-line @typescript-eslint/require-await
async getUploadConfig(directory, expiry) {
(0, internal_1.assertRelativeDirectory)(directory.relativeDirectory);
const expiresOn = (0, internal_2.getExpiryDate)(expiry);
const parameters = (0, internal_4.buildBlobSASParameters)(directory.baseDirectory, "write", expiresOn, this._config.accountName, this._config.accountKey);
return {
storageType: common_1.Constants.storageType,
authentication: parameters,
expiration: expiresOn,
baseUrl: this._config.baseUrl,
};
}
// eslint-disable-next-line @typescript-eslint/require-await
async getDirectoryAccessConfig(directory, expiry) {
(0, internal_1.assertRelativeDirectory)(directory.relativeDirectory);
const expiresOn = (0, internal_2.getExpiryDate)(expiry);
const parameters = (0, internal_4.buildContainerSASParameters)(directory.baseDirectory, expiresOn, this._config.accountName, this._config.accountKey);
return {
storageType: common_1.Constants.storageType,
authentication: parameters,
expiration: expiresOn,
baseUrl: this._config.baseUrl,
};
}
async copyObject(sourceStorage, sourceReference, targetReference) {
(0, internal_1.assertRelativeDirectory)(sourceReference.relativeDirectory);
(0, internal_1.assertRelativeDirectory)(targetReference.relativeDirectory);
if (!(sourceStorage instanceof AzureServerStorage)) {
throw new Error(`Source storage must be an instance of ${AzureServerStorage.name} to use ${AzureServerStorage.prototype.copyObject.name} method.`);
}
const sourceUrl = await sourceStorage.getDownloadUrl(sourceReference);
const targetBlobClient = this._client.getBlobClient(targetReference);
const copyPoller = await targetBlobClient.beginCopyFromURL(sourceUrl);
await copyPoller.pollUntilDone();
}
async releaseResources() { }
async handleNotFound(operation) {
try {
await operation();
}
catch (error) {
if (error instanceof storage_blob_1.RestError && error.statusCode === 404) {
return;
}
throw error;
}
}
}
exports.AzureServerStorage = AzureServerStorage;
//# sourceMappingURL=AzureServerStorage.js.map
;