UNPKG

@itwin/object-storage-s3

Version:

Object storage implementation base for S3 compatible providers

129 lines 5.33 kB
"use strict"; 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