UNPKG

@itwin/object-storage-s3

Version:

Object storage implementation base for S3 compatible providers

139 lines 6.61 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.S3ServerStorage = 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 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"); class S3ServerStorage extends object_storage_core_1.ServerStorage { _presignedUrlProvider; _transferConfigProvider; _s3Client; constructor(s3Client, presignedUrlProvider, transferConfigProvider) { super(); this._s3Client = s3Client; this._presignedUrlProvider = presignedUrlProvider; this._transferConfigProvider = transferConfigProvider; } async download(reference, transferType, localPath) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); const downloadStream = await this._s3Client.download(reference); return (0, internal_2.streamToTransferType)(downloadStream, transferType, localPath); } async upload(reference, data, metadata, headers) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); let dataToUpload; if (typeof data === "string") { await (0, internal_2.assertFileNotEmpty)(data); dataToUpload = (0, fs_1.createReadStream)(data); } else { dataToUpload = data; } return this._s3Client.upload(reference, dataToUpload, metadata, headers); } async uploadInMultipleParts(reference, data, options, headers) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); let dataToUpload; if (typeof data === "string") { await (0, internal_2.assertFileNotEmpty)(data); dataToUpload = (0, fs_1.createReadStream)(data); } else { dataToUpload = data; } return this._s3Client.uploadInMultipleParts(reference, dataToUpload, options, headers); } async createBaseDirectory(directory) { return this._s3Client.upload({ baseDirectory: directory.baseDirectory, objectName: "", }); } getListDirectoriesPagedIterator(maxPageSize = 1000) { const pageIterator = new object_storage_core_1.EntityPageListIterator(() => this._s3Client.getDirectoriesNextPage({ maxPageSize: maxPageSize })); return pageIterator; } getListObjectsPagedIterator(directory, maxPageSize = 1000) { const pageIterator = new object_storage_core_1.EntityPageListIterator(() => this._s3Client.getObjectsNextPage(directory, { maxPageSize: maxPageSize, })); return pageIterator; } /** Max 1000 objects * @deprecated Use listObjects method instead. */ // eslint-disable-next-line deprecation/deprecation async list(directory) { return this.listObjects(directory); } async deleteBaseDirectory(directory) { const options = { maxPageSize: 1000, includeEmptyFiles: true }; const pageIterator = new object_storage_core_1.EntityPageListIterator(() => this._s3Client.getObjectsNextPage(directory, options)); await Promise.all((await this.listAllEntriesFromIterator(pageIterator)).map(async (file) => this._s3Client.deleteObject(file))); } async deleteObject(reference) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); await this._s3Client.deleteObject(reference); } async baseDirectoryExists(directory) { return this._s3Client.prefixExists(directory); } async objectExists(reference) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); return this._s3Client.objectExists(reference); } async updateMetadata(reference, metadata) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); return this._s3Client.updateMetadata(reference, metadata); } async getObjectProperties(reference) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); return this._s3Client.getObjectProperties(reference); } async getDownloadUrl(reference, options) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); return this._presignedUrlProvider.getDownloadUrl(reference, options); } async getUploadUrl(reference, options) { (0, internal_1.assertRelativeDirectory)(reference.relativeDirectory); return this._presignedUrlProvider.getUploadUrl(reference, options); } async getDownloadConfig(directory, options) { (0, internal_1.assertRelativeDirectory)(directory.relativeDirectory); return this._transferConfigProvider.getDownloadConfig(directory, options); } async getUploadConfig(directory, options) { (0, internal_1.assertRelativeDirectory)(directory.relativeDirectory); return this._transferConfigProvider.getUploadConfig(directory, options); } // eslint-disable-next-line @typescript-eslint/require-await async getDirectoryAccessConfig(directory, options) { (0, internal_1.assertRelativeDirectory)(directory.relativeDirectory); return this._transferConfigProvider.getDirectoryAccessConfig(directory, options); } /** * Copying from a different region is only available on AWS. */ copyObject(sourceStorage, sourceReference, targetReference) { (0, internal_1.assertRelativeDirectory)(sourceReference.relativeDirectory); (0, internal_1.assertRelativeDirectory)(targetReference.relativeDirectory); if (!(sourceStorage instanceof S3ServerStorage)) { throw new Error(`Source storage must be an instance of ${S3ServerStorage.name} to use ${S3ServerStorage.prototype.copyObject.name} method.`); } return this._s3Client.copyObject(sourceStorage.bucketName, sourceReference, targetReference); } get bucketName() { return this._s3Client.bucketName; } releaseResources() { this._s3Client.releaseResources(); return Promise.resolve(); } } exports.S3ServerStorage = S3ServerStorage; //# sourceMappingURL=S3ServerStorage.js.map