UNPKG

@itwin/object-storage-azure

Version:

Object storage implementation using Azure Blob Storage

175 lines 9.06 kB
"use strict"; 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