@itwin/object-storage-s3
Version:
Object storage implementation base for S3 compatible providers
139 lines • 6.61 kB
JavaScript
;
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