@itwin/object-storage-s3
Version:
Object storage implementation base for S3 compatible providers
129 lines • 5.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FrontendS3ClientWrapper = 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 client_s3_1 = require("@aws-sdk/client-s3");
const lib_storage_1 = require("@aws-sdk/lib-storage");
const internal_1 = require("@itwin/object-storage-core/lib/common/internal");
class FrontendS3ClientWrapper {
_client;
_bucket;
constructor(_client, _bucket) {
this._client = _client;
this._bucket = _bucket;
}
async download(reference) {
/* eslint-disable @typescript-eslint/naming-convention */
const { Body } = await this._client.send(new client_s3_1.GetObjectCommand({
Bucket: this._bucket,
Key: (0, internal_1.buildObjectKey)(reference),
}));
/* eslint-enable @typescript-eslint/naming-convention */
if (Body instanceof ReadableStream)
return Body;
if (Body instanceof Blob)
return Body.stream();
throw new Error("Unexpected body type");
}
async upload(reference, data, metadata) {
/* eslint-disable @typescript-eslint/naming-convention */
await this._client.send(new client_s3_1.PutObjectCommand({
Bucket: this._bucket,
Key: (0, internal_1.buildObjectKey)(reference),
Body: new Uint8Array(data),
Metadata: metadata,
}));
/* eslint-enable @typescript-eslint/naming-convention */
}
async uploadInMultipleParts(reference, data, options) {
const { queueSize, partSize, metadata } = options ?? {};
/* eslint-disable @typescript-eslint/naming-convention */
const upload = new lib_storage_1.Upload({
client: this._client,
queueSize,
partSize,
leavePartsOnError: false,
params: {
Bucket: this._bucket,
Key: (0, internal_1.buildObjectKey)(reference),
Body: data,
Metadata: metadata,
},
});
/* eslint-enable @typescript-eslint/naming-convention */
await upload.done();
}
async list(directory, options) {
/* eslint-disable @typescript-eslint/naming-convention */
const { Contents } = await this._client.send(new client_s3_1.ListObjectsV2Command({
Bucket: this._bucket,
Prefix: directory.baseDirectory,
MaxKeys: options?.maxResults,
}));
/* eslint-enable @typescript-eslint/naming-convention */
const references = Contents?.map((object) => (0, internal_1.buildObjectReference)(object.Key)) ?? [];
if (options?.includeEmptyFiles)
return references;
const nonEmptyReferences = references.filter((ref) => !!ref.objectName);
return nonEmptyReferences;
}
async deleteObject(reference) {
/* eslint-disable @typescript-eslint/naming-convention */
await this._client.send(new client_s3_1.DeleteObjectCommand({
Bucket: this._bucket,
Key: (0, internal_1.buildObjectKey)(reference),
}));
/* eslint-enable @typescript-eslint/naming-convention */
}
async updateMetadata(reference, metadata) {
/* eslint-disable @typescript-eslint/naming-convention */
await this._client.send(new client_s3_1.CopyObjectCommand({
Bucket: this._bucket,
Key: (0, internal_1.buildObjectKey)(reference),
CopySource: `${this._bucket}/${(0, internal_1.buildObjectKey)(reference)}`,
Metadata: metadata,
MetadataDirective: "REPLACE",
}));
/* eslint-enable @typescript-eslint/naming-convention */
}
async getObjectProperties(reference) {
/* eslint-disable @typescript-eslint/naming-convention */
const { LastModified, ContentLength, Metadata: metadata, } = await this._client.send(new client_s3_1.HeadObjectCommand({
Bucket: this._bucket,
Key: (0, internal_1.buildObjectKey)(reference),
}));
/* eslint-enable @typescript-eslint/naming-convention */
return {
reference,
lastModified: LastModified,
size: ContentLength,
metadata,
};
}
async objectExists(reference) {
try {
return !!(await this.getObjectProperties(reference));
// eslint-disable-next-line @typescript-eslint/no-explicit-any
}
catch (error) {
if (error.name === "NotFound")
return false;
throw error;
}
}
async prefixExists(directory) {
const filesWithPrefix = await this.list(directory, {
maxResults: 1,
includeEmptyFiles: true,
});
return filesWithPrefix.length !== 0;
}
releaseResources() {
this._client.destroy();
}
}
exports.FrontendS3ClientWrapper = FrontendS3ClientWrapper;
//# sourceMappingURL=FrontendS3ClientWrapper.js.map