@qrvey/object-storage 0.0.11-beta.2 → 0.0.11-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cjs/index.js CHANGED
@@ -1209,7 +1209,9 @@ var S3StorageService = class {
1209
1209
  };
1210
1210
  const upload = new libStorage.Upload({
1211
1211
  client: this.s3Client,
1212
- params
1212
+ params,
1213
+ queueSize: 5,
1214
+ partSize: 8 * 1024 * 1024
1213
1215
  });
1214
1216
  return {
1215
1217
  key,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/storage/blob/blobStorage.service.ts","../../src/shared/utils/errorHandler.ts","../../src/services/storage/blob/blobHelpers.ts","../../src/services/storage/blob/blocIdStorage.ts","../../src/services/storage/s3/s3Storage.service.ts","../../src/services/storage/s3/s3Helpers.ts","../../../../node_modules/@smithy/types/dist-es/auth/auth.js","../../../../node_modules/@smithy/types/dist-es/auth/HttpApiKeyAuth.js","../../../../node_modules/@smithy/types/dist-es/endpoint.js","../../../../node_modules/@smithy/types/dist-es/extensions/checksum.js","../../../../node_modules/@smithy/types/dist-es/http.js","../../../../node_modules/@smithy/types/dist-es/profile.js","../../../../node_modules/@smithy/types/dist-es/transfer.js","../../../../node_modules/@smithy/protocol-http/dist-es/httpResponse.js","../../../../node_modules/@smithy/util-uri-escape/dist-es/escape-uri.js","../../../../node_modules/@smithy/querystring-builder/dist-es/index.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js","../../../../node_modules/@smithy/node-http-handler/dist-es/constants.js","../../../../node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/write-request-body.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js","../../src/shared/utils/constants.ts","../../src/services/objectStorageFactory.service.ts","../../src/services/objectStorage.service.ts"],"names":["stream","HttpAuthLocation","HttpApiKeyAuthLocation","EndpointURLScheme","AlgorithmId","FieldPosition","IniSectionType","RequestHandlerProtocol"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport stream from 'stream';\nimport { IObjectStorage, IGetObjectOptions } from '../../../interfaces';\nimport {\n FileContent,\n ListResponse,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n ListResponseItem,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport {\n BlobServiceClient,\n BlobSASPermissions,\n BlobItem,\n ContainerClient,\n} from '@azure/storage-blob';\n\nimport { Readable } from 'stream';\nimport { ErrorHandler } from '../../../shared/utils/errorHandler';\nimport { BlobPropertiesResponseToObjectResponse } from './blobHelpers';\nimport { BlockIdStorage } from './blocIdStorage';\nexport class BlobStorageService implements IObjectStorage {\n private blobServiceClient: BlobServiceClient;\n private containerName: string;\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n constructor(containerName: string) {\n this.containerName = containerName;\n this.blobServiceClient = BlobServiceClient.fromConnectionString(\n process.env.AZURE_STORAGE_CONNECTION_STRING!,\n );\n }\n\n /**\n * Creates a writable stream for uploading a file to the Blob storage.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded blob, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(blobName: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient = containerClient.getBlockBlobClient(blobName);\n\n const uploadPromise = blockBlobClient\n .uploadStream(streamPassThrough, undefined, undefined, {\n onProgress: (ev) => console.log(ev),\n })\n .then(() => {\n return { Bucket: this.containerName, Key: blobName };\n });\n\n return {\n key: blobName,\n stream: streamPassThrough,\n promise: uploadPromise,\n };\n }\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n async getHeadObject(blobName: string): Promise<GetObjectResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const blobProperties = await blockBlobClient.getProperties();\n return BlobPropertiesResponseToObjectResponse(blobProperties);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves an object from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to retrieve.\n * @param {Object} [options] - The options that you can pass to the library.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the object data, including the body, metadata, content type, and content length, or rejects with an error if there was an issue.\n */\n async getObject(\n blobName: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n try {\n let downloadBlockBlobResponse;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const expression = options?.range || '';\n const matches = expression.match(/\\d+/g);\n if (expression && matches?.length) {\n const [start, end] = matches.map(Number);\n downloadBlockBlobResponse = await blockBlobClient.download(\n start,\n end,\n );\n } else {\n downloadBlockBlobResponse = await blockBlobClient.download(0);\n }\n return {\n body: downloadBlockBlobResponse.readableStreamBody as Readable,\n metadata: downloadBlockBlobResponse.metadata,\n contentType: downloadBlockBlobResponse.contentType,\n contentLength: downloadBlockBlobResponse.contentLength,\n };\n } catch (error: any) {\n let errorKey = 'DEFAULT';\n if (error?.response?.status === 404) {\n errorKey = 'ObjectNotFound';\n }\n throw ErrorHandler.handleError(errorKey, '', error as Error);\n }\n }\n\n private async getSignatureUrl(\n blobName: string,\n expiresInMinutes: number,\n permissions: string,\n ): Promise<string> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n\n const startDate = new Date();\n const expiryDate = new Date(startDate);\n expiryDate.setMinutes(startDate.getMinutes() + expiresInMinutes);\n\n return blockBlobClient.generateSasUrl({\n permissions: BlobSASPermissions.parse(permissions),\n startsOn: startDate,\n expiresOn: expiryDate,\n });\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n async getUploadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<GetUploadUrlResponse> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n return { key: blobName, signedUrl: sasUrl };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves a signed URL for the blob with the specified name that expires after a certain period.\n *\n * @param {string} blobName - The name of the blob to generate the signed URL for.\n * @param {number} expiresInMinutes - The duration in minutes until the signed URL expires.\n * @return {Promise<string>} A Promise that resolves with the signed URL.\n */\n async getDownloadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<string> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'r',\n );\n return sasUrl;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Uploads a file to the blob storage service.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {{ [key: string]: string } | undefined} [metadata] - Optional metadata to associate with the blob.\n * @return {Promise<UploadResponse>} A promise that resolves to the response object containing the key of the uploaded blob, or rejects with an error if there was an issue.\n */\n async upload(\n blobName: string,\n body: FileContent,\n metadata: { [key: string]: string } = {},\n ): Promise<UploadResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n Buffer.isBuffer(body)\n ? await blockBlobClient.upload(body, body.length, { metadata })\n : await blockBlobClient.uploadStream(\n body as Readable,\n undefined,\n undefined,\n { metadata },\n );\n\n return { key: blobName };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async delete(data: string): Promise<boolean> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n return this.deleteObject(containerClient, data);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Lists a chunk of blobs from the specified container client based on the provided options and continuation token.\n *\n * @param {ListRequestOptions} options - The options for listing the blobs.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of blobs to list in a single page.\n * @param {ContainerClient} containerClient - The container client to list the blobs from.\n * @return {Promise<{ items: BlobItem[]; continuationToken?: string }>} - A promise that resolves to an object containing the list of blob items and an optional continuation token.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n containerClient: ContainerClient,\n ): Promise<{ items: BlobItem[]; continuationToken?: string }> {\n const iterator = containerClient\n .listBlobsFlat({\n prefix: options.prefix,\n })\n .byPage({\n maxPageSize: limit,\n continuationToken: continuationToken,\n });\n\n const items: BlobItem[] = [];\n const response = (await iterator.next()).value;\n items.push(...response.segment.blobItems);\n return {\n items,\n continuationToken: response.continuationToken,\n };\n }\n\n /**\n * Retrieves a list of blob contents based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the blob contents.\n * @return {Promise<{ contents: BlobItem[]; nextContinuationToken?: string }>} A promise that resolves to the list of blob contents and the next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: BlobItem[]; nextContinuationToken?: string }> {\n let responseContents: BlobItem[] = [];\n let continuationToken: string | undefined = options.pagination;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n while (continueListing) {\n const response = await this.listChunk(\n options,\n continuationToken,\n limit - responseContents.length,\n containerClient,\n );\n continuationToken = response.continuationToken;\n responseContents = responseContents.concat(response.items);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists blobs in the Azure Blob Storage container with pagination.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to a paginated list of blob names.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? response.contents.map((blob) => {\n return {\n key: blob.name,\n lastModified: blob.properties.lastModified,\n size: blob.properties.contentLength!,\n eTag: blob.properties.etag,\n };\n })\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken?.length\n ? response.nextContinuationToken\n : null,\n count: items.length,\n };\n }\n\n /**\n * Lists all blobs in the Azure Blob Storage container.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to list of blob names.\n */\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination = response.pagination ?? undefined;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async deleteObject(\n containerClient: ContainerClient,\n blobName: string,\n ): Promise<boolean> {\n try {\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n await blockBlobClient.delete();\n return true;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes multiple blobs from the blob storage service.\n *\n * @param {string[]} blobNames - An array of blob names to be deleted.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[]>} - A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each blob deleted.\n */\n async deleteObjects(\n blobNames: string[],\n ): Promise<{ key: string; deleted: boolean; error?: string }[]> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const deleteBlobPromises = blobNames.map(async (blobName) => {\n try {\n await this.deleteObject(containerClient, blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n }\n\n /**\n * Retrieves the properties of the container.\n *\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the container properties.\n */\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const properties = await containerClient.getProperties();\n return properties;\n } catch (error) {\n throw new Error(\n 'Error in Azure getHeadContainer. Container: ' +\n this.containerName +\n ' Error: ' +\n error,\n );\n }\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobList = containerClient.listBlobsFlat();\n\n const uploads = [];\n\n for await (const blob of blobList) {\n uploads.push({\n uploadId: blob.name,\n key: blob.name,\n initiated: blob.properties.createdOn || new Date(),\n });\n }\n\n return {\n bucketName: this.containerName,\n uploads,\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} blobName - The name of the blob (file) in Azure Blob Storage.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n blobName: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const listResponse = await blobClient.getBlockList('all');\n const parts =\n listResponse?.uncommittedBlocks?.map((block, index) => ({\n PartNumber: index + 1,\n LastModified: new Date(), // Azure Blob Storage doesn't provide the last modified date for individual parts\n ETag: block.name,\n Size: block.size,\n })) || [];\n return {\n Parts: parts,\n };\n }\n\n /**\n * Generates a unique upload ID for multipart uploads.\n *\n * @return {Promise<string>} A promise that resolves to a unique upload ID.\n */\n async generateUploadIdMultipart(): Promise<string> {\n const timestamp = Date.now();\n const randomNum = Math.floor(Math.random() * 100);\n const blockIdBase = (timestamp - randomNum).toString();\n return blockIdBase;\n }\n\n /**\n * Uploads a part of a file as a block to Azure Blob Storage and updates the metadata with the block ID.\n *\n * @param {string} blobName - The name of the blob (file) that you want to upload in parts to Azure Blob Storage.\n * @param {FileContent | any} file - The content of the file that you want to upload as a part of a multipart upload.\n * @param {number} partNumber - The number or index of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload. If not provided, a new upload ID will be generated.\n * @return {Promise<string>} A Promise that resolves to a string representing the base64 encoded block ID of the uploaded part.\n */\n async uploadMultipart(\n blobName: string,\n file: FileContent | any,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n const blockIdBase =\n uploadId || (await this.generateUploadIdMultipart());\n\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n\n await blobClient.stageBlock(partIdBase64, file, file.length);\n\n return blockIdBase;\n }\n\n /**\n * Completes a multipart upload by committing the blocks to create the blob.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload is being completed.\n * @param {string} uploadId - The ID of the multipart upload to be completed.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is successfully completed.\n * @throws {Error} If no block IDs are found in the metadata.\n */\n async completeMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n // Retrieve the block IDs from temporal storage\n const listMultipartUploads = await this.listMultipartUploadsForKey(blobName)\n const blockIds = listMultipartUploads?.Parts?.map(part => part.ETag) || [];\n if (blockIds.length === 0) {\n throw new Error('No block IDs found in metadata.');\n }\n\n // Commit the blocks to create the blob\n await blobClient.commitBlockList(blockIds);\n }\n\n /**\n * Aborts a multipart upload by deleting the specified blob and clearing its block IDs metadata.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload needs to be aborted.\n * @param {string} uploadId - The ID of the multipart upload to be aborted.\n * @return {Promise<void>} A promise that resolves when the multipart upload is successfully aborted.\n */\n async abortMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const blockIdStorage = BlockIdStorage.getInstance();\n blockIdStorage.clearBlockIds(uploadId);\n\n await blobClient.delete();\n }\n\n async getMultipartUploadPresignedUrl(\n blobName: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 2,\n ): Promise<string> {\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n const url = `${sasUrl}&comp=block&blockid=${partIdBase64}`;\n return url;\n }\n}\n","import { CustomError } from '../../types/CustomError';\n\nconst errorMessages: { [key: string]: string } = {\n AccessDenied: 'Access denied',\n AccountProblem: 'There is a problem with your account',\n AllAccessDisabled: 'All access to this resource has been disabled',\n BucketAlreadyExists: 'The requested bucket name is not available',\n BucketNotEmpty: 'The bucket you tried to delete is not empty',\n EntityTooLarge: 'The entity you are trying to upload is too large',\n ExpiredToken: 'The provided token has expired',\n InternalError: 'An internal server error has occurred',\n InvalidAccessKeyId:\n 'The AWS access key ID you provided does not exist in our records',\n InvalidBucketName: 'The specified bucket name is not valid',\n InvalidObjectState:\n 'The operation is not valid for the current state of the object',\n InvalidToken: 'The provided token is invalid',\n NoSuchBucket: 'The specified bucket does not exist',\n NoSuchKey: 'The specified key does not exist',\n PreconditionFailed: 'The condition specified in the request is not met',\n RequestTimeout: 'The request timed out',\n ServiceUnavailable: 'The service is currently unavailable',\n SignatureDoesNotMatch:\n 'The request signature we calculated does not match the signature you provided',\n SlowDown: 'Please reduce your request rate',\n TemporaryRedirect: 'Temporary redirect',\n ObjectNotFound: 'ObjectNotFound - The specified key does not exist. (404)',\n DEFAULT: 'An unknown error occurred',\n};\n\nexport class ErrorHandler {\n static handleError(\n errorCode: string,\n errorMessage?: string,\n errorObj?: Error,\n ): CustomError {\n const errorResponse: CustomError = {\n code: errorCode,\n message:\n errorMessage ||\n errorMessages[errorCode] ||\n errorMessages['DEFAULT'],\n timestamp: new Date().toISOString(),\n error: errorObj\n ? {\n name: errorObj.name,\n message: errorObj.message,\n stack: errorObj.stack || null,\n }\n : null,\n };\n\n // Return the structured object\n return errorResponse;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectResponse } from '../../../types';\nimport { BlobGetPropertiesResponse } from '@azure/storage-blob';\n\nexport function BlobPropertiesResponseToObjectResponse(\n blobProperties: BlobGetPropertiesResponse,\n): GetObjectResponse {\n return {\n lastModified: blobProperties.lastModified,\n contentLength: blobProperties.contentLength,\n contentType: blobProperties.contentType,\n eTag: blobProperties.etag,\n metadata: blobProperties.metadata,\n contentEncoding: blobProperties.contentEncoding,\n cacheControl: blobProperties.cacheControl,\n contentDisposition: blobProperties.contentDisposition,\n contentLanguage: blobProperties.contentLanguage,\n };\n}\n","export class BlockIdStorage {\n private static instance: BlockIdStorage;\n private blockIdMap: { [blobName: string]: string[] } = {};\n\n private constructor() {}\n\n public static getInstance(): BlockIdStorage {\n if (!BlockIdStorage.instance) {\n BlockIdStorage.instance = new BlockIdStorage();\n }\n return BlockIdStorage.instance;\n }\n\n public addBlockId(blobName: string, blockId: string): void {\n if (!this.blockIdMap[blobName]) {\n this.blockIdMap[blobName] = [];\n }\n this.blockIdMap[blobName].push(blockId);\n }\n\n public getBlockIds(blobName: string): string[] {\n return this.blockIdMap[blobName] || [];\n }\n\n public clearBlockIds(blobName: string): void {\n delete this.blockIdMap[blobName];\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadBucketCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n ListObjectsV2CommandOutput,\n PutObjectAclCommandInput,\n PutObjectCommand,\n S3Client,\n S3,\n S3ClientConfig,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport { IObjectStorage } from '../../../interfaces';\nimport {\n CreateUploadWriteStreamResponse,\n FileContent,\n GetObjectResponse,\n GetUploadUrlResponse,\n ListRequestOptions,\n ListResponse,\n ListResponseItem,\n UploadResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport {\n listResponseContentsToListResponseItems,\n s3ObjectToObjectResponse,\n} from './s3Helpers';\nimport stream from 'stream';\nimport { Upload } from '@aws-sdk/lib-storage';\nimport { NodeHttpHandler } from '@smithy/node-http-handler';\n\nexport class S3StorageService implements IObjectStorage {\n private httpHandler = new NodeHttpHandler({\n socketTimeout: 600000,\n });\n\n private s3Client: S3Client = new S3Client({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private s3 = new S3({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private bucketName: string;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n this.bucketName = bucketName;\n if (\n options?.credentials?.accessKeyId &&\n options?.credentials?.secretAccessKey\n ) {\n const s3Config: S3ClientConfig = {\n region: options?.region || process.env.AWS_REGION,\n credentials: {\n accessKeyId: options?.credentials?.accessKeyId,\n secretAccessKey: options?.credentials?.secretAccessKey,\n },\n };\n this.s3Client = new S3Client(s3Config);\n }\n }\n\n /**\n * Retrieves a chunk of objects from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the objects.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of objects to retrieve.\n * @return {Promise<ListObjectsV2CommandOutput>} - A promise that resolves to the response containing the list of objects and metadata.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n ): Promise<ListObjectsV2CommandOutput> {\n const command = new ListObjectsV2Command({\n Bucket: this.bucketName,\n ContinuationToken: continuationToken || options.pagination,\n Prefix: options.prefix,\n MaxKeys: limit,\n });\n\n return this.s3Client.send(command);\n }\n\n /**\n * Retrieves a list of contents from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the contents.\n * @return {Promise<{ contents: unknown[]; nextContinuationToken?: string }>} - A promise that resolves to an object containing the list of contents and an optional next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: unknown[]; nextContinuationToken?: string }> {\n let responseContents: any[] = [];\n let continuationToken: string | undefined = undefined;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n while (continueListing) {\n const listChunkLimit = limit - responseContents.length;\n const response = await this.listChunk(\n options,\n continuationToken,\n listChunkLimit,\n );\n continuationToken = response.NextContinuationToken;\n responseContents = responseContents.concat(response.Contents ?? []);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists objects in the S3 bucket with pagination.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to a paginated list of object keys.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? listResponseContentsToListResponseItems(response.contents)\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken ?? null,\n count: items.length,\n };\n }\n\n /**\n * Lists all objects in the S3 bucket.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to list of object keys.\n */\n\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination =\n response.pagination === null ? undefined : response.pagination;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getHeadObject(key: string): Promise<GetObjectResponse> {\n const command = new HeadObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getObject(key: string): Promise<GetObjectResponse> {\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Generates a signed URL for accessing an object in the S3 bucket.\n * @param key - The key of the object.\n * @param expiresInMinutes - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n getDownloadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const expiresIn = expiresInMinutes * 60;\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n return getSignedUrl(this.s3Client, command, { expiresIn });\n }\n\n /**\n * Retrieves a signed URL for uploading an object to the S3 bucket.\n *\n * @param {string} key - The key of the object to be uploaded.\n * @param {number} [expiresInMinutes=60] - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n async getUploadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<GetUploadUrlResponse> {\n const expiresIn = expiresInMinutes * 60;\n\n const putObjectCommandParams: PutObjectAclCommandInput = {\n Bucket: process.env.UPLOAD_BUCKET_NAME,\n Key: key,\n ACL: 'private',\n };\n\n const command = new PutObjectCommand(putObjectCommandParams);\n\n const signedUrl = await getSignedUrl(this.s3Client, command, {\n expiresIn,\n });\n\n return {\n signedUrl,\n key: `https://${process.env.UPLOAD_BUCKET_NAME}.s3.${process.env.AWS_DEFAULT_REGION}.amazonaws.com/${key}`,\n };\n }\n\n /**\n * Uploads an object to the S3 bucket.\n * @param key - The key of the object to upload.\n * @param body - The content of the object to upload.\n * @param metadata - Optional metadata to associate with the object.\n * @returns A promise that resolves to the response containing the key of the uploaded object.\n */\n async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n ): Promise<UploadResponse> {\n const command = new PutObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n Body: body,\n Metadata: metadata,\n });\n await this.s3Client.send(command);\n return { key };\n }\n\n /**\n * Creates a writable stream for uploading a file to the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded object, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(key: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: streamPassThrough,\n };\n\n const upload = new Upload({\n client: this.s3Client,\n params,\n });\n\n return {\n key,\n stream: streamPassThrough,\n promise: upload.done(),\n };\n }\n\n /**\n * Deletes an object from the S3 bucket.\n * @param key - The key of the object to delete.\n * @returns A promise that resolves to true if the object was deleted successfully.\n */\n async delete(key: string): Promise<boolean> {\n const command = new DeleteObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n await this.s3Client.send(command);\n return true;\n }\n\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const command = new HeadBucketCommand({\n Bucket: this.bucketName,\n });\n return this.s3Client.send(command);\n } catch (error) {\n throw new Error(\n 'Error in S3 getHeadContainer. bucketName: ' +\n this.bucketName +\n ' Error: ' +\n error,\n );\n }\n }\n\n /**\n * Generates an upload ID for multipart upload in the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n * @throws {Error} If no upload ID was generated.\n */\n async generateUploadIdMultipart(key: string): Promise<string> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n };\n const response = await this.s3.createMultipartUpload(params);\n if (!response?.UploadId) throw new Error('No upload ID was generated');\n return response.UploadId;\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const params = {\n Bucket: this.bucketName,\n };\n const response = await this.s3.listMultipartUploads(params);\n return {\n bucketName: this.bucketName,\n uploads: response.Uploads\n ? response.Uploads.map((upload) => ({\n uploadId: upload.UploadId || '',\n key: upload.Key || '',\n initiator: upload?.Initiator?.ID || '',\n owner: upload?.Owner?.ID || '',\n storageClass: upload.StorageClass || '',\n initiated: upload.Initiated || '',\n }))\n : [],\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} key - The key of the object being uploaded.\n * @param {string} uploadId - The ID of the multipart upload.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n key: string,\n uploadId: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n const response = await this.s3.listParts(params);\n\n const parts = response.Parts\n ? response.Parts.map((part) => ({\n PartNumber: part.PartNumber!,\n LastModified: part.LastModified!,\n ETag: part.ETag!,\n Size: part.Size!,\n }))\n : [];\n\n return {\n Parts: parts,\n };\n }\n\n async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const upId = uploadId || (await this.generateUploadIdMultipart(key));\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: file,\n PartNumber: partNumber,\n UploadId: upId,\n };\n await this.s3.uploadPart(params);\n return upId;\n }\n\n async completeMultipartUpload(\n key: string,\n uploadId: string,\n ): Promise<void> {\n const partsResponse = await this.listMultipartUploadsForKey(\n key,\n uploadId,\n );\n const partsList =\n partsResponse?.Parts &&\n partsResponse.Parts.map(\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n ({ Size, LastModified, ...partList }) => partList,\n );\n const completeMultipartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: partsList,\n },\n };\n await this.s3.completeMultipartUpload(completeMultipartParams);\n }\n\n async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n await this.s3.abortMultipartUpload(params);\n }\n\n async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const uploadPartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n PartNumber: parseInt(partNumber, 10),\n };\n const expiresIn = expiresInMinutes * 60;\n const presignedUrl = await getSignedUrl(\n this.s3Client,\n new UploadPartCommand(uploadPartParams),\n { expiresIn },\n );\n\n return presignedUrl;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport { GetObjectResponse, ListResponseItem } from '../../../types';\nimport { Readable } from 'stream';\n\n/**\n * Converts an array of S3 response contents into an array of ListResponseItem objects.\n *\n * @param {any[]} responseContents - The array of S3 response contents.\n * @return {ListResponseItem[]} The array of ListResponseItem objects.\n */\nexport function listResponseContentsToListResponseItems(\n responseContents: any[],\n): ListResponseItem[] {\n return responseContents.map((responseContent) => {\n return {\n key: responseContent.Key,\n lastModified: new Date(responseContent.LastModified),\n size: responseContent.Size,\n eTag: responseContent.ETag,\n };\n });\n}\n\n/**\n * Converts an S3 object response to a standardized object response.\n *\n * @param {GetObjectCommandOutput} s3Object - The S3 object response to convert.\n * @return {GetObjectResponse} The converted object response.\n */\nexport function s3ObjectToObjectResponse(\n s3Object: GetObjectCommandOutput,\n): GetObjectResponse {\n return {\n body: s3Object.Body as Readable,\n metadata: s3Object.Metadata,\n contentType: s3Object.ContentType,\n contentLength: s3Object.ContentLength as number,\n contentEncoding: s3Object.ContentEncoding,\n cacheControl: s3Object.CacheControl,\n contentDisposition: s3Object.ContentDisposition,\n contentLanguage: s3Object.ContentLanguage,\n eTag: s3Object.ETag,\n lastModified: s3Object.LastModified,\n };\n}\n","export var HttpAuthLocation;\n(function (HttpAuthLocation) {\n HttpAuthLocation[\"HEADER\"] = \"header\";\n HttpAuthLocation[\"QUERY\"] = \"query\";\n})(HttpAuthLocation || (HttpAuthLocation = {}));\n","export var HttpApiKeyAuthLocation;\n(function (HttpApiKeyAuthLocation) {\n HttpApiKeyAuthLocation[\"HEADER\"] = \"header\";\n HttpApiKeyAuthLocation[\"QUERY\"] = \"query\";\n})(HttpApiKeyAuthLocation || (HttpApiKeyAuthLocation = {}));\n","export var EndpointURLScheme;\n(function (EndpointURLScheme) {\n EndpointURLScheme[\"HTTP\"] = \"http\";\n EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(EndpointURLScheme || (EndpointURLScheme = {}));\n","export var AlgorithmId;\n(function (AlgorithmId) {\n AlgorithmId[\"MD5\"] = \"md5\";\n AlgorithmId[\"CRC32\"] = \"crc32\";\n AlgorithmId[\"CRC32C\"] = \"crc32c\";\n AlgorithmId[\"SHA1\"] = \"sha1\";\n AlgorithmId[\"SHA256\"] = \"sha256\";\n})(AlgorithmId || (AlgorithmId = {}));\nexport const getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n if (runtimeConfig.sha256 !== undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.SHA256,\n checksumConstructor: () => runtimeConfig.sha256,\n });\n }\n if (runtimeConfig.md5 != undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.MD5,\n checksumConstructor: () => runtimeConfig.md5,\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexport const resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\n","export var FieldPosition;\n(function (FieldPosition) {\n FieldPosition[FieldPosition[\"HEADER\"] = 0] = \"HEADER\";\n FieldPosition[FieldPosition[\"TRAILER\"] = 1] = \"TRAILER\";\n})(FieldPosition || (FieldPosition = {}));\n","export var IniSectionType;\n(function (IniSectionType) {\n IniSectionType[\"PROFILE\"] = \"profile\";\n IniSectionType[\"SSO_SESSION\"] = \"sso-session\";\n IniSectionType[\"SERVICES\"] = \"services\";\n})(IniSectionType || (IniSectionType = {}));\n","export var RequestHandlerProtocol;\n(function (RequestHandlerProtocol) {\n RequestHandlerProtocol[\"HTTP_0_9\"] = \"http/0.9\";\n RequestHandlerProtocol[\"HTTP_1_0\"] = \"http/1.0\";\n RequestHandlerProtocol[\"TDS_8_0\"] = \"tds/8.0\";\n})(RequestHandlerProtocol || (RequestHandlerProtocol = {}));\n","export class HttpResponse {\n constructor(options) {\n this.statusCode = options.statusCode;\n this.reason = options.reason;\n this.headers = options.headers || {};\n this.body = options.body;\n }\n static isInstance(response) {\n if (!response)\n return false;\n const resp = response;\n return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n }\n}\n","export const escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","import { escapeUri } from \"@smithy/util-uri-escape\";\nexport function buildQueryString(query) {\n const parts = [];\n for (let key of Object.keys(query).sort()) {\n const value = query[key];\n key = escapeUri(key);\n if (Array.isArray(value)) {\n for (let i = 0, iLen = value.length; i < iLen; i++) {\n parts.push(`${key}=${escapeUri(value[i])}`);\n }\n }\n else {\n let qsEntry = key;\n if (value || typeof value === \"string\") {\n qsEntry += `=${escapeUri(value)}`;\n }\n parts.push(qsEntry);\n }\n }\n return parts.join(\"&\");\n}\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { buildQueryString } from \"@smithy/querystring-builder\";\nimport { Agent as hAgent, request as hRequest } from \"http\";\nimport { Agent as hsAgent, request as hsRequest } from \"https\";\nimport { NODEJS_TIMEOUT_ERROR_CODES } from \"./constants\";\nimport { getTransformedHeaders } from \"./get-transformed-headers\";\nimport { setConnectionTimeout } from \"./set-connection-timeout\";\nimport { setSocketKeepAlive } from \"./set-socket-keep-alive\";\nimport { setSocketTimeout } from \"./set-socket-timeout\";\nimport { writeRequestBody } from \"./write-request-body\";\nexport const DEFAULT_REQUEST_TIMEOUT = 0;\nexport class NodeHttpHandler {\n static create(instanceOrOptions) {\n if (typeof instanceOrOptions?.handle === \"function\") {\n return instanceOrOptions;\n }\n return new NodeHttpHandler(instanceOrOptions);\n }\n static checkSocketUsage(agent, socketWarningTimestamp) {\n const { sockets, requests, maxSockets } = agent;\n if (typeof maxSockets !== \"number\" || maxSockets === Infinity) {\n return socketWarningTimestamp;\n }\n const interval = 15000;\n if (Date.now() - interval < socketWarningTimestamp) {\n return socketWarningTimestamp;\n }\n if (sockets && requests) {\n for (const origin in sockets) {\n const socketsInUse = sockets[origin]?.length ?? 0;\n const requestsEnqueued = requests[origin]?.length ?? 0;\n if (socketsInUse >= maxSockets && requestsEnqueued >= 2 * maxSockets) {\n console.warn(\"@smithy/node-http-handler:WARN\", `socket usage at capacity=${socketsInUse} and ${requestsEnqueued} additional requests are enqueued.`, \"See https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html\", \"or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.\");\n return Date.now();\n }\n }\n }\n return socketWarningTimestamp;\n }\n constructor(options) {\n this.socketWarningTimestamp = 0;\n this.metadata = { handlerProtocol: \"http/1.1\" };\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((_options) => {\n resolve(this.resolveDefaultConfig(_options));\n })\n .catch(reject);\n }\n else {\n resolve(this.resolveDefaultConfig(options));\n }\n });\n }\n resolveDefaultConfig(options) {\n const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {};\n const keepAlive = true;\n const maxSockets = 50;\n return {\n connectionTimeout,\n requestTimeout: requestTimeout ?? socketTimeout,\n httpAgent: (() => {\n if (httpAgent instanceof hAgent || typeof httpAgent?.destroy === \"function\") {\n return httpAgent;\n }\n return new hAgent({ keepAlive, maxSockets, ...httpAgent });\n })(),\n httpsAgent: (() => {\n if (httpsAgent instanceof hsAgent || typeof httpsAgent?.destroy === \"function\") {\n return httpsAgent;\n }\n return new hsAgent({ keepAlive, maxSockets, ...httpsAgent });\n })(),\n };\n }\n destroy() {\n this.config?.httpAgent?.destroy();\n this.config?.httpsAgent?.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n }\n let socketCheckTimeoutId;\n return new Promise((_resolve, _reject) => {\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n clearTimeout(socketCheckTimeoutId);\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (!this.config) {\n throw new Error(\"Node HTTP request handler config is not resolved\");\n }\n if (abortSignal?.aborted) {\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const isSSL = request.protocol === \"https:\";\n const agent = isSSL ? this.config.httpsAgent : this.config.httpAgent;\n socketCheckTimeoutId = setTimeout(() => {\n this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp);\n }, this.config.socketAcquisitionWarningTimeout ??\n (this.config.requestTimeout ?? 2000) + (this.config.connectionTimeout ?? 1000));\n const queryString = buildQueryString(request.query || {});\n let auth = undefined;\n if (request.username != null || request.password != null) {\n const username = request.username ?? \"\";\n const password = request.password ?? \"\";\n auth = `${username}:${password}`;\n }\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const nodeHttpsOptions = {\n headers: request.headers,\n host: request.hostname,\n method: request.method,\n path,\n port: request.port,\n agent,\n auth,\n };\n const requestFunc = isSSL ? hsRequest : hRequest;\n const req = requestFunc(nodeHttpsOptions, (res) => {\n const httpResponse = new HttpResponse({\n statusCode: res.statusCode || -1,\n reason: res.statusMessage,\n headers: getTransformedHeaders(res.headers),\n body: res,\n });\n resolve({ response: httpResponse });\n });\n req.on(\"error\", (err) => {\n if (NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n reject(Object.assign(err, { name: \"TimeoutError\" }));\n }\n else {\n reject(err);\n }\n });\n setConnectionTimeout(req, reject, this.config.connectionTimeout);\n setSocketTimeout(req, reject, this.config.requestTimeout);\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.abort();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n };\n }\n const httpAgent = nodeHttpsOptions.agent;\n if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n setSocketKeepAlive(req, {\n keepAlive: httpAgent.keepAlive,\n keepAliveMsecs: httpAgent.keepAliveMsecs,\n });\n }\n writeRequestBodyPromise = writeRequestBody(req, request, this.config.requestTimeout).catch(_reject);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n return this.config ?? {};\n }\n}\n","export const NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n","const getTransformedHeaders = (headers) => {\n const transformedHeaders = {};\n for (const name of Object.keys(headers)) {\n const headerValues = headers[name];\n transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n }\n return transformedHeaders;\n};\nexport { getTransformedHeaders };\n","export const setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n if (!timeoutInMs) {\n return;\n }\n const timeoutId = setTimeout(() => {\n request.destroy();\n reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), {\n name: \"TimeoutError\",\n }));\n }, timeoutInMs);\n request.on(\"socket\", (socket) => {\n if (socket.connecting) {\n socket.on(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n }\n else {\n clearTimeout(timeoutId);\n }\n });\n};\n","export const setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => {\n if (keepAlive !== true) {\n return;\n }\n request.on(\"socket\", (socket) => {\n socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n });\n};\n","export const setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n request.setTimeout(timeoutInMs, () => {\n request.destroy();\n reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: \"TimeoutError\" }));\n });\n};\n","import { Readable } from \"stream\";\nconst MIN_WAIT_TIME = 1000;\nexport async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) {\n const headers = request.headers ?? {};\n const expect = headers[\"Expect\"] || headers[\"expect\"];\n let timeoutId = -1;\n let hasError = false;\n if (expect === \"100-continue\") {\n await Promise.race([\n new Promise((resolve) => {\n timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n }),\n new Promise((resolve) => {\n httpRequest.on(\"continue\", () => {\n clearTimeout(timeoutId);\n resolve();\n });\n httpRequest.on(\"error\", () => {\n hasError = true;\n clearTimeout(timeoutId);\n resolve();\n });\n }),\n ]);\n }\n if (!hasError) {\n writeBody(httpRequest, request.body);\n }\n}\nfunction writeBody(httpRequest, body) {\n if (body instanceof Readable) {\n body.pipe(httpRequest);\n return;\n }\n if (body) {\n if (Buffer.isBuffer(body) || typeof body === \"string\") {\n httpRequest.end(body);\n return;\n }\n const uint8 = body;\n if (typeof uint8 === \"object\" &&\n uint8.buffer &&\n typeof uint8.byteOffset === \"number\" &&\n typeof uint8.byteLength === \"number\") {\n httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength));\n return;\n }\n httpRequest.end(Buffer.from(body));\n return;\n }\n httpRequest.end();\n}\n","export class NodeHttp2ConnectionPool {\n constructor(sessions) {\n this.sessions = [];\n this.sessions = sessions ?? [];\n }\n poll() {\n if (this.sessions.length > 0) {\n return this.sessions.shift();\n }\n }\n offerLast(session) {\n this.sessions.push(session);\n }\n contains(session) {\n return this.sessions.includes(session);\n }\n remove(session) {\n this.sessions = this.sessions.filter((s) => s !== session);\n }\n [Symbol.iterator]() {\n return this.sessions[Symbol.iterator]();\n }\n destroy(connection) {\n for (const session of this.sessions) {\n if (session === connection) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n }\n }\n}\n","export const OBJECT_STORAGE_SERVICE_TYPES = {\n AWS_S3: 'aws_s3',\n AZURE_BLOB_STORAGE: 'azure_blob_storage',\n};\n","import { IObjectStorage } from '../interfaces';\nimport { S3StorageService, BlobStorageService } from './storage';\nimport { ObjectStorageOptions } from '../types';\nimport { OBJECT_STORAGE_SERVICE_TYPES } from '../shared/utils/constants';\n\nexport class ObjectStorageFactory {\n static async instance(\n bucketName: string,\n options?: ObjectStorageOptions,\n ): Promise<IObjectStorage> {\n const provider =\n options?.provider?.toLowerCase() ||\n process.env.OBJECT_STORAGE_SERVICE?.toLowerCase();\n switch (provider) {\n case OBJECT_STORAGE_SERVICE_TYPES.AWS_S3:\n return new S3StorageService(bucketName, options);\n case OBJECT_STORAGE_SERVICE_TYPES.AZURE_BLOB_STORAGE:\n return new BlobStorageService(bucketName);\n default:\n throw new Error(\n `Unsupported object storage provider: ${provider}`,\n );\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IObjectStorage, IGetObjectOptions } from '../interfaces';\nimport {\n ListResponse,\n FileContent,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../types';\nimport { ObjectStorageFactory } from '../services/objectStorageFactory.service';\n\nexport default class ObjectStorageService {\n static bucketName: string;\n static objectStorageOptions: ObjectStorageOptions;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n ObjectStorageService.bucketName = bucketName;\n if (options) ObjectStorageService.objectStorageOptions = options;\n }\n\n static async getObjectStorageServiceInstance(\n bucketName: string = ObjectStorageService.bucketName,\n options:\n | ObjectStorageOptions\n | undefined = ObjectStorageService.objectStorageOptions,\n ): Promise<IObjectStorage> {\n if (!bucketName)\n throw new Error('Bucket name not provided or not valid value');\n return ObjectStorageFactory.instance(bucketName, options);\n }\n\n /**\n * Retrieves a list of objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of objects.\n */\n static async list(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.list(options));\n }\n\n /**\n * Retrieves a list of all objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of all objects.\n */\n static async listAll(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listAll(options));\n }\n\n /**\n * Retrieves an object from the object storage service.\n *\n * @param {string} key - The key of the object to retrieve.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the retrieved object.\n */\n static async getObject(\n key: string,\n bucketName?: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getObject(key, options));\n }\n\n /**\n * Retrieves an object info (without file content) from the object storage service.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the info of the file.\n */\n static async getHeadObject(\n key: string,\n bucketName?: string,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadObject(key));\n }\n\n /**\n * Retrieves a signed URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the signed URL.\n * @param {number} expiresInMinutes - The number of minutes until the signed URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated signed URL.\n */\n static async getDownloadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getDownloadUrl(key, expiresInMinutes));\n }\n\n /**\n * Retrieves an upload URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the upload URL.\n * @param {number} expiresInMinutes - The number of minutes until the upload URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload URL.\n */\n static async getUploadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<GetUploadUrlResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getUploadUrl(key, expiresInMinutes));\n }\n\n /**\n * Uploads a file to the object storage service.\n *\n * @param {string} key - The key of the object to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {Object} [metadata] - Optional metadata to associate with the object.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<UploadResponse>} A promise that resolves to the response of the upload operation.\n */\n static async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n bucketName?: string,\n ): Promise<UploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.upload(key, body, metadata));\n }\n\n /**\n * Creates an upload write stream for the specified key in the object storage service.\n *\n * @param {string} key - The key of the object to create the upload write stream for.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<CreateUploadWriteStreamResponse>} A promise that resolves to the response of the upload operation.\n */\n static async createUploadWriteStream(\n key: string,\n bucketName?: string,\n ): Promise<CreateUploadWriteStreamResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.createUploadWriteStream(key));\n }\n\n /**\n * Deletes an object or multiple objects from the object storage service.\n *\n * @param {string | string[]} key - The key or array of keys of the objects to delete.\n * @param {string} [bucketName] - The name of the bucket where the objects are stored. If not provided, the default bucket name will be used.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[] | boolean>} A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each object deleted, or a boolean value indicating the success of the deletion.\n */\n static async delete(\n key: string | string[],\n bucketName?: string,\n ): Promise<{ key: string; deleted: boolean; error?: string }[] | boolean> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then(async (instance) => {\n if (Array.isArray(key)) {\n const deleteBlobPromises = key.map(async (blobName) => {\n try {\n await instance.delete(blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n } else {\n return instance.delete(key);\n }\n });\n }\n\n /**\n * Retrieves the head bucket from the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the head bucket response.\n */\n static async getHeadBucket(\n bucketName?: string,\n ): Promise<HeadBucketResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadBucket());\n }\n\n /**\n * Generates a unique upload ID for a multipart upload.\n *\n * @param {string} key - The key of the object to upload.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n */\n static async generateUploadIdMultipart(\n key: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.generateUploadIdMultipart(key));\n }\n\n /**\n * Retrieves a list of multipart uploads for a specified key in the object storage service.\n *\n * @param {string} key - The key of the object to retrieve uploads for.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @param {string} [uploadId] - The upload ID to filter the results by.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of multipart uploads for the specified key.\n */\n static async listMultipartUploadsForKey(\n key: string,\n bucketName?: string,\n uploadId?: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.listMultipartUploadsForKey(key, uploadId),\n );\n }\n\n /**\n * Retrieves a list of all multipart uploads for a specified bucket in the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<ListMultipartUploadsResponse>} A promise that resolves to the list of multipart uploads for the specified bucket.\n */\n static async listMultipartUploadsForBucket(\n bucketName?: string,\n ): Promise<ListMultipartUploadsResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listMultipartUploadsForBucket());\n }\n\n /**\n * Uploads a multipart file to the specified bucket in the object storage service.\n *\n * @param {string} key - The key of the object to upload the multipart file to.\n * @param {FileContent} file - The content of the file to upload.\n * @param {number} partNumber - The number of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload.\n * @param {string} [bucketName] - The name of the bucket to upload the file to. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A Promise that resolves to the base64 encoded block ID of the uploaded part.\n */\n static async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.uploadMultipart(key, file, partNumber, uploadId),\n );\n }\n\n /**\n * Completes a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to complete the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to complete.\n * @param {string} [bucketName] - The name of the bucket to complete the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is completed.\n */\n static async completeMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.completeMultipartUpload(key, uploadId));\n }\n\n /**\n * Aborts a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to abort the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to abort.\n * @param {string} [bucketName] - The name of the bucket to abort the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is aborted.\n */\n static async abortMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.abortMultipartUpload(key, uploadId));\n }\n\n /**\n * Retrieves a presigned URL for a specific part of a multipart upload.\n *\n * @param {string} key - The key of the object for which to generate the presigned URL.\n * @param {string} uploadId - The ID of the multipart upload.\n * @param {string} partNumber - The number of the part for which to generate the presigned URL.\n * @param {number} [expiresInMinutes] - The number of minutes until the presigned URL expires. Default is 60 minutes.\n * @return {Promise<string>} A Promise that resolves to the presigned URL for the specified part of the multipart upload.\n */\n static async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes?: number,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance().then(\n (instance) =>\n instance.getMultipartUploadPresignedUrl(\n key,\n uploadId,\n partNumber,\n expiresInMinutes,\n ),\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/services/storage/blob/blobStorage.service.ts","../../src/shared/utils/errorHandler.ts","../../src/services/storage/blob/blobHelpers.ts","../../src/services/storage/blob/blocIdStorage.ts","../../src/services/storage/s3/s3Storage.service.ts","../../src/services/storage/s3/s3Helpers.ts","../../../../node_modules/@smithy/types/dist-es/auth/auth.js","../../../../node_modules/@smithy/types/dist-es/auth/HttpApiKeyAuth.js","../../../../node_modules/@smithy/types/dist-es/endpoint.js","../../../../node_modules/@smithy/types/dist-es/extensions/checksum.js","../../../../node_modules/@smithy/types/dist-es/http.js","../../../../node_modules/@smithy/types/dist-es/profile.js","../../../../node_modules/@smithy/types/dist-es/transfer.js","../../../../node_modules/@smithy/protocol-http/dist-es/httpResponse.js","../../../../node_modules/@smithy/util-uri-escape/dist-es/escape-uri.js","../../../../node_modules/@smithy/querystring-builder/dist-es/index.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js","../../../../node_modules/@smithy/node-http-handler/dist-es/constants.js","../../../../node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/write-request-body.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js","../../src/shared/utils/constants.ts","../../src/services/objectStorageFactory.service.ts","../../src/services/objectStorage.service.ts"],"names":["stream","HttpAuthLocation","HttpApiKeyAuthLocation","EndpointURLScheme","AlgorithmId","FieldPosition","IniSectionType","RequestHandlerProtocol"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport stream from 'stream';\nimport { IObjectStorage, IGetObjectOptions } from '../../../interfaces';\nimport {\n FileContent,\n ListResponse,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n ListResponseItem,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport {\n BlobServiceClient,\n BlobSASPermissions,\n BlobItem,\n ContainerClient,\n} from '@azure/storage-blob';\n\nimport { Readable } from 'stream';\nimport { ErrorHandler } from '../../../shared/utils/errorHandler';\nimport { BlobPropertiesResponseToObjectResponse } from './blobHelpers';\nimport { BlockIdStorage } from './blocIdStorage';\nexport class BlobStorageService implements IObjectStorage {\n private blobServiceClient: BlobServiceClient;\n private containerName: string;\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n constructor(containerName: string) {\n this.containerName = containerName;\n this.blobServiceClient = BlobServiceClient.fromConnectionString(\n process.env.AZURE_STORAGE_CONNECTION_STRING!,\n );\n }\n\n /**\n * Creates a writable stream for uploading a file to the Blob storage.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded blob, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(blobName: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient = containerClient.getBlockBlobClient(blobName);\n\n const uploadPromise = blockBlobClient\n .uploadStream(streamPassThrough, undefined, undefined, {\n onProgress: (ev) => console.log(ev),\n })\n .then(() => {\n return { Bucket: this.containerName, Key: blobName };\n });\n\n return {\n key: blobName,\n stream: streamPassThrough,\n promise: uploadPromise,\n };\n }\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n async getHeadObject(blobName: string): Promise<GetObjectResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const blobProperties = await blockBlobClient.getProperties();\n return BlobPropertiesResponseToObjectResponse(blobProperties);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves an object from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to retrieve.\n * @param {Object} [options] - The options that you can pass to the library.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the object data, including the body, metadata, content type, and content length, or rejects with an error if there was an issue.\n */\n async getObject(\n blobName: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n try {\n let downloadBlockBlobResponse;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const expression = options?.range || '';\n const matches = expression.match(/\\d+/g);\n if (expression && matches?.length) {\n const [start, end] = matches.map(Number);\n downloadBlockBlobResponse = await blockBlobClient.download(\n start,\n end,\n );\n } else {\n downloadBlockBlobResponse = await blockBlobClient.download(0);\n }\n return {\n body: downloadBlockBlobResponse.readableStreamBody as Readable,\n metadata: downloadBlockBlobResponse.metadata,\n contentType: downloadBlockBlobResponse.contentType,\n contentLength: downloadBlockBlobResponse.contentLength,\n };\n } catch (error: any) {\n let errorKey = 'DEFAULT';\n if (error?.response?.status === 404) {\n errorKey = 'ObjectNotFound';\n }\n throw ErrorHandler.handleError(errorKey, '', error as Error);\n }\n }\n\n private async getSignatureUrl(\n blobName: string,\n expiresInMinutes: number,\n permissions: string,\n ): Promise<string> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n\n const startDate = new Date();\n const expiryDate = new Date(startDate);\n expiryDate.setMinutes(startDate.getMinutes() + expiresInMinutes);\n\n return blockBlobClient.generateSasUrl({\n permissions: BlobSASPermissions.parse(permissions),\n startsOn: startDate,\n expiresOn: expiryDate,\n });\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n async getUploadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<GetUploadUrlResponse> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n return { key: blobName, signedUrl: sasUrl };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves a signed URL for the blob with the specified name that expires after a certain period.\n *\n * @param {string} blobName - The name of the blob to generate the signed URL for.\n * @param {number} expiresInMinutes - The duration in minutes until the signed URL expires.\n * @return {Promise<string>} A Promise that resolves with the signed URL.\n */\n async getDownloadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<string> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'r',\n );\n return sasUrl;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Uploads a file to the blob storage service.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {{ [key: string]: string } | undefined} [metadata] - Optional metadata to associate with the blob.\n * @return {Promise<UploadResponse>} A promise that resolves to the response object containing the key of the uploaded blob, or rejects with an error if there was an issue.\n */\n async upload(\n blobName: string,\n body: FileContent,\n metadata: { [key: string]: string } = {},\n ): Promise<UploadResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n Buffer.isBuffer(body)\n ? await blockBlobClient.upload(body, body.length, { metadata })\n : await blockBlobClient.uploadStream(\n body as Readable,\n undefined,\n undefined,\n { metadata },\n );\n\n return { key: blobName };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async delete(data: string): Promise<boolean> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n return this.deleteObject(containerClient, data);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Lists a chunk of blobs from the specified container client based on the provided options and continuation token.\n *\n * @param {ListRequestOptions} options - The options for listing the blobs.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of blobs to list in a single page.\n * @param {ContainerClient} containerClient - The container client to list the blobs from.\n * @return {Promise<{ items: BlobItem[]; continuationToken?: string }>} - A promise that resolves to an object containing the list of blob items and an optional continuation token.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n containerClient: ContainerClient,\n ): Promise<{ items: BlobItem[]; continuationToken?: string }> {\n const iterator = containerClient\n .listBlobsFlat({\n prefix: options.prefix,\n })\n .byPage({\n maxPageSize: limit,\n continuationToken: continuationToken,\n });\n\n const items: BlobItem[] = [];\n const response = (await iterator.next()).value;\n items.push(...response.segment.blobItems);\n return {\n items,\n continuationToken: response.continuationToken,\n };\n }\n\n /**\n * Retrieves a list of blob contents based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the blob contents.\n * @return {Promise<{ contents: BlobItem[]; nextContinuationToken?: string }>} A promise that resolves to the list of blob contents and the next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: BlobItem[]; nextContinuationToken?: string }> {\n let responseContents: BlobItem[] = [];\n let continuationToken: string | undefined = options.pagination;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n while (continueListing) {\n const response = await this.listChunk(\n options,\n continuationToken,\n limit - responseContents.length,\n containerClient,\n );\n continuationToken = response.continuationToken;\n responseContents = responseContents.concat(response.items);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists blobs in the Azure Blob Storage container with pagination.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to a paginated list of blob names.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? response.contents.map((blob) => {\n return {\n key: blob.name,\n lastModified: blob.properties.lastModified,\n size: blob.properties.contentLength!,\n eTag: blob.properties.etag,\n };\n })\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken?.length\n ? response.nextContinuationToken\n : null,\n count: items.length,\n };\n }\n\n /**\n * Lists all blobs in the Azure Blob Storage container.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to list of blob names.\n */\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination = response.pagination ?? undefined;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async deleteObject(\n containerClient: ContainerClient,\n blobName: string,\n ): Promise<boolean> {\n try {\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n await blockBlobClient.delete();\n return true;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes multiple blobs from the blob storage service.\n *\n * @param {string[]} blobNames - An array of blob names to be deleted.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[]>} - A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each blob deleted.\n */\n async deleteObjects(\n blobNames: string[],\n ): Promise<{ key: string; deleted: boolean; error?: string }[]> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const deleteBlobPromises = blobNames.map(async (blobName) => {\n try {\n await this.deleteObject(containerClient, blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n }\n\n /**\n * Retrieves the properties of the container.\n *\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the container properties.\n */\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const properties = await containerClient.getProperties();\n return properties;\n } catch (error) {\n throw new Error(\n 'Error in Azure getHeadContainer. Container: ' +\n this.containerName +\n ' Error: ' +\n error,\n );\n }\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobList = containerClient.listBlobsFlat();\n\n const uploads = [];\n\n for await (const blob of blobList) {\n uploads.push({\n uploadId: blob.name,\n key: blob.name,\n initiated: blob.properties.createdOn || new Date(),\n });\n }\n\n return {\n bucketName: this.containerName,\n uploads,\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} blobName - The name of the blob (file) in Azure Blob Storage.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n blobName: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const listResponse = await blobClient.getBlockList('all');\n const parts =\n listResponse?.uncommittedBlocks?.map((block, index) => ({\n PartNumber: index + 1,\n LastModified: new Date(), // Azure Blob Storage doesn't provide the last modified date for individual parts\n ETag: block.name,\n Size: block.size,\n })) || [];\n return {\n Parts: parts,\n };\n }\n\n /**\n * Generates a unique upload ID for multipart uploads.\n *\n * @return {Promise<string>} A promise that resolves to a unique upload ID.\n */\n async generateUploadIdMultipart(): Promise<string> {\n const timestamp = Date.now();\n const randomNum = Math.floor(Math.random() * 100);\n const blockIdBase = (timestamp - randomNum).toString();\n return blockIdBase;\n }\n\n /**\n * Uploads a part of a file as a block to Azure Blob Storage and updates the metadata with the block ID.\n *\n * @param {string} blobName - The name of the blob (file) that you want to upload in parts to Azure Blob Storage.\n * @param {FileContent | any} file - The content of the file that you want to upload as a part of a multipart upload.\n * @param {number} partNumber - The number or index of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload. If not provided, a new upload ID will be generated.\n * @return {Promise<string>} A Promise that resolves to a string representing the base64 encoded block ID of the uploaded part.\n */\n async uploadMultipart(\n blobName: string,\n file: FileContent | any,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n const blockIdBase =\n uploadId || (await this.generateUploadIdMultipart());\n\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n\n await blobClient.stageBlock(partIdBase64, file, file.length);\n\n return blockIdBase;\n }\n\n /**\n * Completes a multipart upload by committing the blocks to create the blob.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload is being completed.\n * @param {string} uploadId - The ID of the multipart upload to be completed.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is successfully completed.\n * @throws {Error} If no block IDs are found in the metadata.\n */\n async completeMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n // Retrieve the block IDs from temporal storage\n const listMultipartUploads = await this.listMultipartUploadsForKey(blobName)\n const blockIds = listMultipartUploads?.Parts?.map(part => part.ETag) || [];\n if (blockIds.length === 0) {\n throw new Error('No block IDs found in metadata.');\n }\n\n // Commit the blocks to create the blob\n await blobClient.commitBlockList(blockIds);\n }\n\n /**\n * Aborts a multipart upload by deleting the specified blob and clearing its block IDs metadata.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload needs to be aborted.\n * @param {string} uploadId - The ID of the multipart upload to be aborted.\n * @return {Promise<void>} A promise that resolves when the multipart upload is successfully aborted.\n */\n async abortMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const blockIdStorage = BlockIdStorage.getInstance();\n blockIdStorage.clearBlockIds(uploadId);\n\n await blobClient.delete();\n }\n\n async getMultipartUploadPresignedUrl(\n blobName: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 2,\n ): Promise<string> {\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n const url = `${sasUrl}&comp=block&blockid=${partIdBase64}`;\n return url;\n }\n}\n","import { CustomError } from '../../types/CustomError';\n\nconst errorMessages: { [key: string]: string } = {\n AccessDenied: 'Access denied',\n AccountProblem: 'There is a problem with your account',\n AllAccessDisabled: 'All access to this resource has been disabled',\n BucketAlreadyExists: 'The requested bucket name is not available',\n BucketNotEmpty: 'The bucket you tried to delete is not empty',\n EntityTooLarge: 'The entity you are trying to upload is too large',\n ExpiredToken: 'The provided token has expired',\n InternalError: 'An internal server error has occurred',\n InvalidAccessKeyId:\n 'The AWS access key ID you provided does not exist in our records',\n InvalidBucketName: 'The specified bucket name is not valid',\n InvalidObjectState:\n 'The operation is not valid for the current state of the object',\n InvalidToken: 'The provided token is invalid',\n NoSuchBucket: 'The specified bucket does not exist',\n NoSuchKey: 'The specified key does not exist',\n PreconditionFailed: 'The condition specified in the request is not met',\n RequestTimeout: 'The request timed out',\n ServiceUnavailable: 'The service is currently unavailable',\n SignatureDoesNotMatch:\n 'The request signature we calculated does not match the signature you provided',\n SlowDown: 'Please reduce your request rate',\n TemporaryRedirect: 'Temporary redirect',\n ObjectNotFound: 'ObjectNotFound - The specified key does not exist. (404)',\n DEFAULT: 'An unknown error occurred',\n};\n\nexport class ErrorHandler {\n static handleError(\n errorCode: string,\n errorMessage?: string,\n errorObj?: Error,\n ): CustomError {\n const errorResponse: CustomError = {\n code: errorCode,\n message:\n errorMessage ||\n errorMessages[errorCode] ||\n errorMessages['DEFAULT'],\n timestamp: new Date().toISOString(),\n error: errorObj\n ? {\n name: errorObj.name,\n message: errorObj.message,\n stack: errorObj.stack || null,\n }\n : null,\n };\n\n // Return the structured object\n return errorResponse;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectResponse } from '../../../types';\nimport { BlobGetPropertiesResponse } from '@azure/storage-blob';\n\nexport function BlobPropertiesResponseToObjectResponse(\n blobProperties: BlobGetPropertiesResponse,\n): GetObjectResponse {\n return {\n lastModified: blobProperties.lastModified,\n contentLength: blobProperties.contentLength,\n contentType: blobProperties.contentType,\n eTag: blobProperties.etag,\n metadata: blobProperties.metadata,\n contentEncoding: blobProperties.contentEncoding,\n cacheControl: blobProperties.cacheControl,\n contentDisposition: blobProperties.contentDisposition,\n contentLanguage: blobProperties.contentLanguage,\n };\n}\n","export class BlockIdStorage {\n private static instance: BlockIdStorage;\n private blockIdMap: { [blobName: string]: string[] } = {};\n\n private constructor() {}\n\n public static getInstance(): BlockIdStorage {\n if (!BlockIdStorage.instance) {\n BlockIdStorage.instance = new BlockIdStorage();\n }\n return BlockIdStorage.instance;\n }\n\n public addBlockId(blobName: string, blockId: string): void {\n if (!this.blockIdMap[blobName]) {\n this.blockIdMap[blobName] = [];\n }\n this.blockIdMap[blobName].push(blockId);\n }\n\n public getBlockIds(blobName: string): string[] {\n return this.blockIdMap[blobName] || [];\n }\n\n public clearBlockIds(blobName: string): void {\n delete this.blockIdMap[blobName];\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadBucketCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n ListObjectsV2CommandOutput,\n PutObjectAclCommandInput,\n PutObjectCommand,\n S3Client,\n S3,\n S3ClientConfig,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport { IObjectStorage } from '../../../interfaces';\nimport {\n CreateUploadWriteStreamResponse,\n FileContent,\n GetObjectResponse,\n GetUploadUrlResponse,\n ListRequestOptions,\n ListResponse,\n ListResponseItem,\n UploadResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport {\n listResponseContentsToListResponseItems,\n s3ObjectToObjectResponse,\n} from './s3Helpers';\nimport stream from 'stream';\nimport { Upload } from '@aws-sdk/lib-storage';\nimport { NodeHttpHandler } from '@smithy/node-http-handler';\n\nexport class S3StorageService implements IObjectStorage {\n private httpHandler = new NodeHttpHandler({\n socketTimeout: 600000,\n });\n\n private s3Client: S3Client = new S3Client({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private s3 = new S3({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private bucketName: string;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n this.bucketName = bucketName;\n if (\n options?.credentials?.accessKeyId &&\n options?.credentials?.secretAccessKey\n ) {\n const s3Config: S3ClientConfig = {\n region: options?.region || process.env.AWS_REGION,\n credentials: {\n accessKeyId: options?.credentials?.accessKeyId,\n secretAccessKey: options?.credentials?.secretAccessKey,\n },\n };\n this.s3Client = new S3Client(s3Config);\n }\n }\n\n /**\n * Retrieves a chunk of objects from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the objects.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of objects to retrieve.\n * @return {Promise<ListObjectsV2CommandOutput>} - A promise that resolves to the response containing the list of objects and metadata.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n ): Promise<ListObjectsV2CommandOutput> {\n const command = new ListObjectsV2Command({\n Bucket: this.bucketName,\n ContinuationToken: continuationToken || options.pagination,\n Prefix: options.prefix,\n MaxKeys: limit,\n });\n\n return this.s3Client.send(command);\n }\n\n /**\n * Retrieves a list of contents from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the contents.\n * @return {Promise<{ contents: unknown[]; nextContinuationToken?: string }>} - A promise that resolves to an object containing the list of contents and an optional next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: unknown[]; nextContinuationToken?: string }> {\n let responseContents: any[] = [];\n let continuationToken: string | undefined = undefined;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n while (continueListing) {\n const listChunkLimit = limit - responseContents.length;\n const response = await this.listChunk(\n options,\n continuationToken,\n listChunkLimit,\n );\n continuationToken = response.NextContinuationToken;\n responseContents = responseContents.concat(response.Contents ?? []);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists objects in the S3 bucket with pagination.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to a paginated list of object keys.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? listResponseContentsToListResponseItems(response.contents)\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken ?? null,\n count: items.length,\n };\n }\n\n /**\n * Lists all objects in the S3 bucket.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to list of object keys.\n */\n\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination =\n response.pagination === null ? undefined : response.pagination;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getHeadObject(key: string): Promise<GetObjectResponse> {\n const command = new HeadObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getObject(key: string): Promise<GetObjectResponse> {\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Generates a signed URL for accessing an object in the S3 bucket.\n * @param key - The key of the object.\n * @param expiresInMinutes - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n getDownloadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const expiresIn = expiresInMinutes * 60;\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n return getSignedUrl(this.s3Client, command, { expiresIn });\n }\n\n /**\n * Retrieves a signed URL for uploading an object to the S3 bucket.\n *\n * @param {string} key - The key of the object to be uploaded.\n * @param {number} [expiresInMinutes=60] - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n async getUploadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<GetUploadUrlResponse> {\n const expiresIn = expiresInMinutes * 60;\n\n const putObjectCommandParams: PutObjectAclCommandInput = {\n Bucket: process.env.UPLOAD_BUCKET_NAME,\n Key: key,\n ACL: 'private',\n };\n\n const command = new PutObjectCommand(putObjectCommandParams);\n\n const signedUrl = await getSignedUrl(this.s3Client, command, {\n expiresIn,\n });\n\n return {\n signedUrl,\n key: `https://${process.env.UPLOAD_BUCKET_NAME}.s3.${process.env.AWS_DEFAULT_REGION}.amazonaws.com/${key}`,\n };\n }\n\n /**\n * Uploads an object to the S3 bucket.\n * @param key - The key of the object to upload.\n * @param body - The content of the object to upload.\n * @param metadata - Optional metadata to associate with the object.\n * @returns A promise that resolves to the response containing the key of the uploaded object.\n */\n async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n ): Promise<UploadResponse> {\n const command = new PutObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n Body: body,\n Metadata: metadata,\n });\n await this.s3Client.send(command);\n return { key };\n }\n\n /**\n * Creates a writable stream for uploading a file to the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded object, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(key: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: streamPassThrough,\n };\n\n const upload = new Upload({\n client: this.s3Client,\n params,\n queueSize: 5,\n partSize: 8 * 1024 * 1024,\n });\n\n return {\n key,\n stream: streamPassThrough,\n promise: upload.done(),\n };\n }\n\n /**\n * Deletes an object from the S3 bucket.\n * @param key - The key of the object to delete.\n * @returns A promise that resolves to true if the object was deleted successfully.\n */\n async delete(key: string): Promise<boolean> {\n const command = new DeleteObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n await this.s3Client.send(command);\n return true;\n }\n\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const command = new HeadBucketCommand({\n Bucket: this.bucketName,\n });\n return this.s3Client.send(command);\n } catch (error) {\n throw new Error(\n 'Error in S3 getHeadContainer. bucketName: ' +\n this.bucketName +\n ' Error: ' +\n error,\n );\n }\n }\n\n /**\n * Generates an upload ID for multipart upload in the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n * @throws {Error} If no upload ID was generated.\n */\n async generateUploadIdMultipart(key: string): Promise<string> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n };\n const response = await this.s3.createMultipartUpload(params);\n if (!response?.UploadId) throw new Error('No upload ID was generated');\n return response.UploadId;\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const params = {\n Bucket: this.bucketName,\n };\n const response = await this.s3.listMultipartUploads(params);\n return {\n bucketName: this.bucketName,\n uploads: response.Uploads\n ? response.Uploads.map((upload) => ({\n uploadId: upload.UploadId || '',\n key: upload.Key || '',\n initiator: upload?.Initiator?.ID || '',\n owner: upload?.Owner?.ID || '',\n storageClass: upload.StorageClass || '',\n initiated: upload.Initiated || '',\n }))\n : [],\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} key - The key of the object being uploaded.\n * @param {string} uploadId - The ID of the multipart upload.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n key: string,\n uploadId: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n const response = await this.s3.listParts(params);\n\n const parts = response.Parts\n ? response.Parts.map((part) => ({\n PartNumber: part.PartNumber!,\n LastModified: part.LastModified!,\n ETag: part.ETag!,\n Size: part.Size!,\n }))\n : [];\n\n return {\n Parts: parts,\n };\n }\n\n async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const upId = uploadId || (await this.generateUploadIdMultipart(key));\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: file,\n PartNumber: partNumber,\n UploadId: upId,\n };\n await this.s3.uploadPart(params);\n return upId;\n }\n\n async completeMultipartUpload(\n key: string,\n uploadId: string,\n ): Promise<void> {\n const partsResponse = await this.listMultipartUploadsForKey(\n key,\n uploadId,\n );\n const partsList =\n partsResponse?.Parts &&\n partsResponse.Parts.map(\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n ({ Size, LastModified, ...partList }) => partList,\n );\n const completeMultipartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: partsList,\n },\n };\n await this.s3.completeMultipartUpload(completeMultipartParams);\n }\n\n async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n await this.s3.abortMultipartUpload(params);\n }\n\n async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const uploadPartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n PartNumber: parseInt(partNumber, 10),\n };\n const expiresIn = expiresInMinutes * 60;\n const presignedUrl = await getSignedUrl(\n this.s3Client,\n new UploadPartCommand(uploadPartParams),\n { expiresIn },\n );\n\n return presignedUrl;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport { GetObjectResponse, ListResponseItem } from '../../../types';\nimport { Readable } from 'stream';\n\n/**\n * Converts an array of S3 response contents into an array of ListResponseItem objects.\n *\n * @param {any[]} responseContents - The array of S3 response contents.\n * @return {ListResponseItem[]} The array of ListResponseItem objects.\n */\nexport function listResponseContentsToListResponseItems(\n responseContents: any[],\n): ListResponseItem[] {\n return responseContents.map((responseContent) => {\n return {\n key: responseContent.Key,\n lastModified: new Date(responseContent.LastModified),\n size: responseContent.Size,\n eTag: responseContent.ETag,\n };\n });\n}\n\n/**\n * Converts an S3 object response to a standardized object response.\n *\n * @param {GetObjectCommandOutput} s3Object - The S3 object response to convert.\n * @return {GetObjectResponse} The converted object response.\n */\nexport function s3ObjectToObjectResponse(\n s3Object: GetObjectCommandOutput,\n): GetObjectResponse {\n return {\n body: s3Object.Body as Readable,\n metadata: s3Object.Metadata,\n contentType: s3Object.ContentType,\n contentLength: s3Object.ContentLength as number,\n contentEncoding: s3Object.ContentEncoding,\n cacheControl: s3Object.CacheControl,\n contentDisposition: s3Object.ContentDisposition,\n contentLanguage: s3Object.ContentLanguage,\n eTag: s3Object.ETag,\n lastModified: s3Object.LastModified,\n };\n}\n","export var HttpAuthLocation;\n(function (HttpAuthLocation) {\n HttpAuthLocation[\"HEADER\"] = \"header\";\n HttpAuthLocation[\"QUERY\"] = \"query\";\n})(HttpAuthLocation || (HttpAuthLocation = {}));\n","export var HttpApiKeyAuthLocation;\n(function (HttpApiKeyAuthLocation) {\n HttpApiKeyAuthLocation[\"HEADER\"] = \"header\";\n HttpApiKeyAuthLocation[\"QUERY\"] = \"query\";\n})(HttpApiKeyAuthLocation || (HttpApiKeyAuthLocation = {}));\n","export var EndpointURLScheme;\n(function (EndpointURLScheme) {\n EndpointURLScheme[\"HTTP\"] = \"http\";\n EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(EndpointURLScheme || (EndpointURLScheme = {}));\n","export var AlgorithmId;\n(function (AlgorithmId) {\n AlgorithmId[\"MD5\"] = \"md5\";\n AlgorithmId[\"CRC32\"] = \"crc32\";\n AlgorithmId[\"CRC32C\"] = \"crc32c\";\n AlgorithmId[\"SHA1\"] = \"sha1\";\n AlgorithmId[\"SHA256\"] = \"sha256\";\n})(AlgorithmId || (AlgorithmId = {}));\nexport const getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n if (runtimeConfig.sha256 !== undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.SHA256,\n checksumConstructor: () => runtimeConfig.sha256,\n });\n }\n if (runtimeConfig.md5 != undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.MD5,\n checksumConstructor: () => runtimeConfig.md5,\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexport const resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\n","export var FieldPosition;\n(function (FieldPosition) {\n FieldPosition[FieldPosition[\"HEADER\"] = 0] = \"HEADER\";\n FieldPosition[FieldPosition[\"TRAILER\"] = 1] = \"TRAILER\";\n})(FieldPosition || (FieldPosition = {}));\n","export var IniSectionType;\n(function (IniSectionType) {\n IniSectionType[\"PROFILE\"] = \"profile\";\n IniSectionType[\"SSO_SESSION\"] = \"sso-session\";\n IniSectionType[\"SERVICES\"] = \"services\";\n})(IniSectionType || (IniSectionType = {}));\n","export var RequestHandlerProtocol;\n(function (RequestHandlerProtocol) {\n RequestHandlerProtocol[\"HTTP_0_9\"] = \"http/0.9\";\n RequestHandlerProtocol[\"HTTP_1_0\"] = \"http/1.0\";\n RequestHandlerProtocol[\"TDS_8_0\"] = \"tds/8.0\";\n})(RequestHandlerProtocol || (RequestHandlerProtocol = {}));\n","export class HttpResponse {\n constructor(options) {\n this.statusCode = options.statusCode;\n this.reason = options.reason;\n this.headers = options.headers || {};\n this.body = options.body;\n }\n static isInstance(response) {\n if (!response)\n return false;\n const resp = response;\n return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n }\n}\n","export const escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","import { escapeUri } from \"@smithy/util-uri-escape\";\nexport function buildQueryString(query) {\n const parts = [];\n for (let key of Object.keys(query).sort()) {\n const value = query[key];\n key = escapeUri(key);\n if (Array.isArray(value)) {\n for (let i = 0, iLen = value.length; i < iLen; i++) {\n parts.push(`${key}=${escapeUri(value[i])}`);\n }\n }\n else {\n let qsEntry = key;\n if (value || typeof value === \"string\") {\n qsEntry += `=${escapeUri(value)}`;\n }\n parts.push(qsEntry);\n }\n }\n return parts.join(\"&\");\n}\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { buildQueryString } from \"@smithy/querystring-builder\";\nimport { Agent as hAgent, request as hRequest } from \"http\";\nimport { Agent as hsAgent, request as hsRequest } from \"https\";\nimport { NODEJS_TIMEOUT_ERROR_CODES } from \"./constants\";\nimport { getTransformedHeaders } from \"./get-transformed-headers\";\nimport { setConnectionTimeout } from \"./set-connection-timeout\";\nimport { setSocketKeepAlive } from \"./set-socket-keep-alive\";\nimport { setSocketTimeout } from \"./set-socket-timeout\";\nimport { writeRequestBody } from \"./write-request-body\";\nexport const DEFAULT_REQUEST_TIMEOUT = 0;\nexport class NodeHttpHandler {\n static create(instanceOrOptions) {\n if (typeof instanceOrOptions?.handle === \"function\") {\n return instanceOrOptions;\n }\n return new NodeHttpHandler(instanceOrOptions);\n }\n static checkSocketUsage(agent, socketWarningTimestamp) {\n const { sockets, requests, maxSockets } = agent;\n if (typeof maxSockets !== \"number\" || maxSockets === Infinity) {\n return socketWarningTimestamp;\n }\n const interval = 15000;\n if (Date.now() - interval < socketWarningTimestamp) {\n return socketWarningTimestamp;\n }\n if (sockets && requests) {\n for (const origin in sockets) {\n const socketsInUse = sockets[origin]?.length ?? 0;\n const requestsEnqueued = requests[origin]?.length ?? 0;\n if (socketsInUse >= maxSockets && requestsEnqueued >= 2 * maxSockets) {\n console.warn(\"@smithy/node-http-handler:WARN\", `socket usage at capacity=${socketsInUse} and ${requestsEnqueued} additional requests are enqueued.`, \"See https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html\", \"or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.\");\n return Date.now();\n }\n }\n }\n return socketWarningTimestamp;\n }\n constructor(options) {\n this.socketWarningTimestamp = 0;\n this.metadata = { handlerProtocol: \"http/1.1\" };\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((_options) => {\n resolve(this.resolveDefaultConfig(_options));\n })\n .catch(reject);\n }\n else {\n resolve(this.resolveDefaultConfig(options));\n }\n });\n }\n resolveDefaultConfig(options) {\n const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {};\n const keepAlive = true;\n const maxSockets = 50;\n return {\n connectionTimeout,\n requestTimeout: requestTimeout ?? socketTimeout,\n httpAgent: (() => {\n if (httpAgent instanceof hAgent || typeof httpAgent?.destroy === \"function\") {\n return httpAgent;\n }\n return new hAgent({ keepAlive, maxSockets, ...httpAgent });\n })(),\n httpsAgent: (() => {\n if (httpsAgent instanceof hsAgent || typeof httpsAgent?.destroy === \"function\") {\n return httpsAgent;\n }\n return new hsAgent({ keepAlive, maxSockets, ...httpsAgent });\n })(),\n };\n }\n destroy() {\n this.config?.httpAgent?.destroy();\n this.config?.httpsAgent?.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n }\n let socketCheckTimeoutId;\n return new Promise((_resolve, _reject) => {\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n clearTimeout(socketCheckTimeoutId);\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (!this.config) {\n throw new Error(\"Node HTTP request handler config is not resolved\");\n }\n if (abortSignal?.aborted) {\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const isSSL = request.protocol === \"https:\";\n const agent = isSSL ? this.config.httpsAgent : this.config.httpAgent;\n socketCheckTimeoutId = setTimeout(() => {\n this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp);\n }, this.config.socketAcquisitionWarningTimeout ??\n (this.config.requestTimeout ?? 2000) + (this.config.connectionTimeout ?? 1000));\n const queryString = buildQueryString(request.query || {});\n let auth = undefined;\n if (request.username != null || request.password != null) {\n const username = request.username ?? \"\";\n const password = request.password ?? \"\";\n auth = `${username}:${password}`;\n }\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const nodeHttpsOptions = {\n headers: request.headers,\n host: request.hostname,\n method: request.method,\n path,\n port: request.port,\n agent,\n auth,\n };\n const requestFunc = isSSL ? hsRequest : hRequest;\n const req = requestFunc(nodeHttpsOptions, (res) => {\n const httpResponse = new HttpResponse({\n statusCode: res.statusCode || -1,\n reason: res.statusMessage,\n headers: getTransformedHeaders(res.headers),\n body: res,\n });\n resolve({ response: httpResponse });\n });\n req.on(\"error\", (err) => {\n if (NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n reject(Object.assign(err, { name: \"TimeoutError\" }));\n }\n else {\n reject(err);\n }\n });\n setConnectionTimeout(req, reject, this.config.connectionTimeout);\n setSocketTimeout(req, reject, this.config.requestTimeout);\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.abort();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n };\n }\n const httpAgent = nodeHttpsOptions.agent;\n if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n setSocketKeepAlive(req, {\n keepAlive: httpAgent.keepAlive,\n keepAliveMsecs: httpAgent.keepAliveMsecs,\n });\n }\n writeRequestBodyPromise = writeRequestBody(req, request, this.config.requestTimeout).catch(_reject);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n return this.config ?? {};\n }\n}\n","export const NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n","const getTransformedHeaders = (headers) => {\n const transformedHeaders = {};\n for (const name of Object.keys(headers)) {\n const headerValues = headers[name];\n transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n }\n return transformedHeaders;\n};\nexport { getTransformedHeaders };\n","export const setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n if (!timeoutInMs) {\n return;\n }\n const timeoutId = setTimeout(() => {\n request.destroy();\n reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), {\n name: \"TimeoutError\",\n }));\n }, timeoutInMs);\n request.on(\"socket\", (socket) => {\n if (socket.connecting) {\n socket.on(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n }\n else {\n clearTimeout(timeoutId);\n }\n });\n};\n","export const setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => {\n if (keepAlive !== true) {\n return;\n }\n request.on(\"socket\", (socket) => {\n socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n });\n};\n","export const setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n request.setTimeout(timeoutInMs, () => {\n request.destroy();\n reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: \"TimeoutError\" }));\n });\n};\n","import { Readable } from \"stream\";\nconst MIN_WAIT_TIME = 1000;\nexport async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) {\n const headers = request.headers ?? {};\n const expect = headers[\"Expect\"] || headers[\"expect\"];\n let timeoutId = -1;\n let hasError = false;\n if (expect === \"100-continue\") {\n await Promise.race([\n new Promise((resolve) => {\n timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n }),\n new Promise((resolve) => {\n httpRequest.on(\"continue\", () => {\n clearTimeout(timeoutId);\n resolve();\n });\n httpRequest.on(\"error\", () => {\n hasError = true;\n clearTimeout(timeoutId);\n resolve();\n });\n }),\n ]);\n }\n if (!hasError) {\n writeBody(httpRequest, request.body);\n }\n}\nfunction writeBody(httpRequest, body) {\n if (body instanceof Readable) {\n body.pipe(httpRequest);\n return;\n }\n if (body) {\n if (Buffer.isBuffer(body) || typeof body === \"string\") {\n httpRequest.end(body);\n return;\n }\n const uint8 = body;\n if (typeof uint8 === \"object\" &&\n uint8.buffer &&\n typeof uint8.byteOffset === \"number\" &&\n typeof uint8.byteLength === \"number\") {\n httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength));\n return;\n }\n httpRequest.end(Buffer.from(body));\n return;\n }\n httpRequest.end();\n}\n","export class NodeHttp2ConnectionPool {\n constructor(sessions) {\n this.sessions = [];\n this.sessions = sessions ?? [];\n }\n poll() {\n if (this.sessions.length > 0) {\n return this.sessions.shift();\n }\n }\n offerLast(session) {\n this.sessions.push(session);\n }\n contains(session) {\n return this.sessions.includes(session);\n }\n remove(session) {\n this.sessions = this.sessions.filter((s) => s !== session);\n }\n [Symbol.iterator]() {\n return this.sessions[Symbol.iterator]();\n }\n destroy(connection) {\n for (const session of this.sessions) {\n if (session === connection) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n }\n }\n}\n","export const OBJECT_STORAGE_SERVICE_TYPES = {\n AWS_S3: 'aws_s3',\n AZURE_BLOB_STORAGE: 'azure_blob_storage',\n};\n","import { IObjectStorage } from '../interfaces';\nimport { S3StorageService, BlobStorageService } from './storage';\nimport { ObjectStorageOptions } from '../types';\nimport { OBJECT_STORAGE_SERVICE_TYPES } from '../shared/utils/constants';\n\nexport class ObjectStorageFactory {\n static async instance(\n bucketName: string,\n options?: ObjectStorageOptions,\n ): Promise<IObjectStorage> {\n const provider =\n options?.provider?.toLowerCase() ||\n process.env.OBJECT_STORAGE_SERVICE?.toLowerCase();\n switch (provider) {\n case OBJECT_STORAGE_SERVICE_TYPES.AWS_S3:\n return new S3StorageService(bucketName, options);\n case OBJECT_STORAGE_SERVICE_TYPES.AZURE_BLOB_STORAGE:\n return new BlobStorageService(bucketName);\n default:\n throw new Error(\n `Unsupported object storage provider: ${provider}`,\n );\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IObjectStorage, IGetObjectOptions } from '../interfaces';\nimport {\n ListResponse,\n FileContent,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../types';\nimport { ObjectStorageFactory } from '../services/objectStorageFactory.service';\n\nexport default class ObjectStorageService {\n static bucketName: string;\n static objectStorageOptions: ObjectStorageOptions;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n ObjectStorageService.bucketName = bucketName;\n if (options) ObjectStorageService.objectStorageOptions = options;\n }\n\n static async getObjectStorageServiceInstance(\n bucketName: string = ObjectStorageService.bucketName,\n options:\n | ObjectStorageOptions\n | undefined = ObjectStorageService.objectStorageOptions,\n ): Promise<IObjectStorage> {\n if (!bucketName)\n throw new Error('Bucket name not provided or not valid value');\n return ObjectStorageFactory.instance(bucketName, options);\n }\n\n /**\n * Retrieves a list of objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of objects.\n */\n static async list(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.list(options));\n }\n\n /**\n * Retrieves a list of all objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of all objects.\n */\n static async listAll(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listAll(options));\n }\n\n /**\n * Retrieves an object from the object storage service.\n *\n * @param {string} key - The key of the object to retrieve.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the retrieved object.\n */\n static async getObject(\n key: string,\n bucketName?: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getObject(key, options));\n }\n\n /**\n * Retrieves an object info (without file content) from the object storage service.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the info of the file.\n */\n static async getHeadObject(\n key: string,\n bucketName?: string,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadObject(key));\n }\n\n /**\n * Retrieves a signed URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the signed URL.\n * @param {number} expiresInMinutes - The number of minutes until the signed URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated signed URL.\n */\n static async getDownloadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getDownloadUrl(key, expiresInMinutes));\n }\n\n /**\n * Retrieves an upload URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the upload URL.\n * @param {number} expiresInMinutes - The number of minutes until the upload URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload URL.\n */\n static async getUploadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<GetUploadUrlResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getUploadUrl(key, expiresInMinutes));\n }\n\n /**\n * Uploads a file to the object storage service.\n *\n * @param {string} key - The key of the object to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {Object} [metadata] - Optional metadata to associate with the object.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<UploadResponse>} A promise that resolves to the response of the upload operation.\n */\n static async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n bucketName?: string,\n ): Promise<UploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.upload(key, body, metadata));\n }\n\n /**\n * Creates an upload write stream for the specified key in the object storage service.\n *\n * @param {string} key - The key of the object to create the upload write stream for.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<CreateUploadWriteStreamResponse>} A promise that resolves to the response of the upload operation.\n */\n static async createUploadWriteStream(\n key: string,\n bucketName?: string,\n ): Promise<CreateUploadWriteStreamResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.createUploadWriteStream(key));\n }\n\n /**\n * Deletes an object or multiple objects from the object storage service.\n *\n * @param {string | string[]} key - The key or array of keys of the objects to delete.\n * @param {string} [bucketName] - The name of the bucket where the objects are stored. If not provided, the default bucket name will be used.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[] | boolean>} A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each object deleted, or a boolean value indicating the success of the deletion.\n */\n static async delete(\n key: string | string[],\n bucketName?: string,\n ): Promise<{ key: string; deleted: boolean; error?: string }[] | boolean> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then(async (instance) => {\n if (Array.isArray(key)) {\n const deleteBlobPromises = key.map(async (blobName) => {\n try {\n await instance.delete(blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n } else {\n return instance.delete(key);\n }\n });\n }\n\n /**\n * Retrieves the head bucket from the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the head bucket response.\n */\n static async getHeadBucket(\n bucketName?: string,\n ): Promise<HeadBucketResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadBucket());\n }\n\n /**\n * Generates a unique upload ID for a multipart upload.\n *\n * @param {string} key - The key of the object to upload.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n */\n static async generateUploadIdMultipart(\n key: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.generateUploadIdMultipart(key));\n }\n\n /**\n * Retrieves a list of multipart uploads for a specified key in the object storage service.\n *\n * @param {string} key - The key of the object to retrieve uploads for.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @param {string} [uploadId] - The upload ID to filter the results by.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of multipart uploads for the specified key.\n */\n static async listMultipartUploadsForKey(\n key: string,\n bucketName?: string,\n uploadId?: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.listMultipartUploadsForKey(key, uploadId),\n );\n }\n\n /**\n * Retrieves a list of all multipart uploads for a specified bucket in the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<ListMultipartUploadsResponse>} A promise that resolves to the list of multipart uploads for the specified bucket.\n */\n static async listMultipartUploadsForBucket(\n bucketName?: string,\n ): Promise<ListMultipartUploadsResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listMultipartUploadsForBucket());\n }\n\n /**\n * Uploads a multipart file to the specified bucket in the object storage service.\n *\n * @param {string} key - The key of the object to upload the multipart file to.\n * @param {FileContent} file - The content of the file to upload.\n * @param {number} partNumber - The number of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload.\n * @param {string} [bucketName] - The name of the bucket to upload the file to. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A Promise that resolves to the base64 encoded block ID of the uploaded part.\n */\n static async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.uploadMultipart(key, file, partNumber, uploadId),\n );\n }\n\n /**\n * Completes a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to complete the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to complete.\n * @param {string} [bucketName] - The name of the bucket to complete the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is completed.\n */\n static async completeMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.completeMultipartUpload(key, uploadId));\n }\n\n /**\n * Aborts a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to abort the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to abort.\n * @param {string} [bucketName] - The name of the bucket to abort the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is aborted.\n */\n static async abortMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.abortMultipartUpload(key, uploadId));\n }\n\n /**\n * Retrieves a presigned URL for a specific part of a multipart upload.\n *\n * @param {string} key - The key of the object for which to generate the presigned URL.\n * @param {string} uploadId - The ID of the multipart upload.\n * @param {string} partNumber - The number of the part for which to generate the presigned URL.\n * @param {number} [expiresInMinutes] - The number of minutes until the presigned URL expires. Default is 60 minutes.\n * @return {Promise<string>} A Promise that resolves to the presigned URL for the specified part of the multipart upload.\n */\n static async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes?: number,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance().then(\n (instance) =>\n instance.getMultipartUploadPresignedUrl(\n key,\n uploadId,\n partNumber,\n expiresInMinutes,\n ),\n );\n }\n}\n"]}
@@ -1203,7 +1203,9 @@ var S3StorageService = class {
1203
1203
  };
1204
1204
  const upload = new Upload({
1205
1205
  client: this.s3Client,
1206
- params
1206
+ params,
1207
+ queueSize: 5,
1208
+ partSize: 8 * 1024 * 1024
1207
1209
  });
1208
1210
  return {
1209
1211
  key,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/services/storage/blob/blobStorage.service.ts","../../src/shared/utils/errorHandler.ts","../../src/services/storage/blob/blobHelpers.ts","../../src/services/storage/blob/blocIdStorage.ts","../../src/services/storage/s3/s3Storage.service.ts","../../src/services/storage/s3/s3Helpers.ts","../../../../node_modules/@smithy/types/dist-es/auth/auth.js","../../../../node_modules/@smithy/types/dist-es/auth/HttpApiKeyAuth.js","../../../../node_modules/@smithy/types/dist-es/endpoint.js","../../../../node_modules/@smithy/types/dist-es/extensions/checksum.js","../../../../node_modules/@smithy/types/dist-es/http.js","../../../../node_modules/@smithy/types/dist-es/profile.js","../../../../node_modules/@smithy/types/dist-es/transfer.js","../../../../node_modules/@smithy/protocol-http/dist-es/httpResponse.js","../../../../node_modules/@smithy/util-uri-escape/dist-es/escape-uri.js","../../../../node_modules/@smithy/querystring-builder/dist-es/index.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js","../../../../node_modules/@smithy/node-http-handler/dist-es/constants.js","../../../../node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/write-request-body.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js","../../src/shared/utils/constants.ts","../../src/services/objectStorageFactory.service.ts","../../src/services/objectStorage.service.ts"],"names":["stream","HttpAuthLocation","HttpApiKeyAuthLocation","EndpointURLScheme","AlgorithmId","FieldPosition","IniSectionType","RequestHandlerProtocol"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport stream from 'stream';\nimport { IObjectStorage, IGetObjectOptions } from '../../../interfaces';\nimport {\n FileContent,\n ListResponse,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n ListResponseItem,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport {\n BlobServiceClient,\n BlobSASPermissions,\n BlobItem,\n ContainerClient,\n} from '@azure/storage-blob';\n\nimport { Readable } from 'stream';\nimport { ErrorHandler } from '../../../shared/utils/errorHandler';\nimport { BlobPropertiesResponseToObjectResponse } from './blobHelpers';\nimport { BlockIdStorage } from './blocIdStorage';\nexport class BlobStorageService implements IObjectStorage {\n private blobServiceClient: BlobServiceClient;\n private containerName: string;\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n constructor(containerName: string) {\n this.containerName = containerName;\n this.blobServiceClient = BlobServiceClient.fromConnectionString(\n process.env.AZURE_STORAGE_CONNECTION_STRING!,\n );\n }\n\n /**\n * Creates a writable stream for uploading a file to the Blob storage.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded blob, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(blobName: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient = containerClient.getBlockBlobClient(blobName);\n\n const uploadPromise = blockBlobClient\n .uploadStream(streamPassThrough, undefined, undefined, {\n onProgress: (ev) => console.log(ev),\n })\n .then(() => {\n return { Bucket: this.containerName, Key: blobName };\n });\n\n return {\n key: blobName,\n stream: streamPassThrough,\n promise: uploadPromise,\n };\n }\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n async getHeadObject(blobName: string): Promise<GetObjectResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const blobProperties = await blockBlobClient.getProperties();\n return BlobPropertiesResponseToObjectResponse(blobProperties);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves an object from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to retrieve.\n * @param {Object} [options] - The options that you can pass to the library.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the object data, including the body, metadata, content type, and content length, or rejects with an error if there was an issue.\n */\n async getObject(\n blobName: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n try {\n let downloadBlockBlobResponse;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const expression = options?.range || '';\n const matches = expression.match(/\\d+/g);\n if (expression && matches?.length) {\n const [start, end] = matches.map(Number);\n downloadBlockBlobResponse = await blockBlobClient.download(\n start,\n end,\n );\n } else {\n downloadBlockBlobResponse = await blockBlobClient.download(0);\n }\n return {\n body: downloadBlockBlobResponse.readableStreamBody as Readable,\n metadata: downloadBlockBlobResponse.metadata,\n contentType: downloadBlockBlobResponse.contentType,\n contentLength: downloadBlockBlobResponse.contentLength,\n };\n } catch (error: any) {\n let errorKey = 'DEFAULT';\n if (error?.response?.status === 404) {\n errorKey = 'ObjectNotFound';\n }\n throw ErrorHandler.handleError(errorKey, '', error as Error);\n }\n }\n\n private async getSignatureUrl(\n blobName: string,\n expiresInMinutes: number,\n permissions: string,\n ): Promise<string> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n\n const startDate = new Date();\n const expiryDate = new Date(startDate);\n expiryDate.setMinutes(startDate.getMinutes() + expiresInMinutes);\n\n return blockBlobClient.generateSasUrl({\n permissions: BlobSASPermissions.parse(permissions),\n startsOn: startDate,\n expiresOn: expiryDate,\n });\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n async getUploadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<GetUploadUrlResponse> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n return { key: blobName, signedUrl: sasUrl };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves a signed URL for the blob with the specified name that expires after a certain period.\n *\n * @param {string} blobName - The name of the blob to generate the signed URL for.\n * @param {number} expiresInMinutes - The duration in minutes until the signed URL expires.\n * @return {Promise<string>} A Promise that resolves with the signed URL.\n */\n async getDownloadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<string> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'r',\n );\n return sasUrl;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Uploads a file to the blob storage service.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {{ [key: string]: string } | undefined} [metadata] - Optional metadata to associate with the blob.\n * @return {Promise<UploadResponse>} A promise that resolves to the response object containing the key of the uploaded blob, or rejects with an error if there was an issue.\n */\n async upload(\n blobName: string,\n body: FileContent,\n metadata: { [key: string]: string } = {},\n ): Promise<UploadResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n Buffer.isBuffer(body)\n ? await blockBlobClient.upload(body, body.length, { metadata })\n : await blockBlobClient.uploadStream(\n body as Readable,\n undefined,\n undefined,\n { metadata },\n );\n\n return { key: blobName };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async delete(data: string): Promise<boolean> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n return this.deleteObject(containerClient, data);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Lists a chunk of blobs from the specified container client based on the provided options and continuation token.\n *\n * @param {ListRequestOptions} options - The options for listing the blobs.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of blobs to list in a single page.\n * @param {ContainerClient} containerClient - The container client to list the blobs from.\n * @return {Promise<{ items: BlobItem[]; continuationToken?: string }>} - A promise that resolves to an object containing the list of blob items and an optional continuation token.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n containerClient: ContainerClient,\n ): Promise<{ items: BlobItem[]; continuationToken?: string }> {\n const iterator = containerClient\n .listBlobsFlat({\n prefix: options.prefix,\n })\n .byPage({\n maxPageSize: limit,\n continuationToken: continuationToken,\n });\n\n const items: BlobItem[] = [];\n const response = (await iterator.next()).value;\n items.push(...response.segment.blobItems);\n return {\n items,\n continuationToken: response.continuationToken,\n };\n }\n\n /**\n * Retrieves a list of blob contents based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the blob contents.\n * @return {Promise<{ contents: BlobItem[]; nextContinuationToken?: string }>} A promise that resolves to the list of blob contents and the next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: BlobItem[]; nextContinuationToken?: string }> {\n let responseContents: BlobItem[] = [];\n let continuationToken: string | undefined = options.pagination;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n while (continueListing) {\n const response = await this.listChunk(\n options,\n continuationToken,\n limit - responseContents.length,\n containerClient,\n );\n continuationToken = response.continuationToken;\n responseContents = responseContents.concat(response.items);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists blobs in the Azure Blob Storage container with pagination.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to a paginated list of blob names.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? response.contents.map((blob) => {\n return {\n key: blob.name,\n lastModified: blob.properties.lastModified,\n size: blob.properties.contentLength!,\n eTag: blob.properties.etag,\n };\n })\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken?.length\n ? response.nextContinuationToken\n : null,\n count: items.length,\n };\n }\n\n /**\n * Lists all blobs in the Azure Blob Storage container.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to list of blob names.\n */\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination = response.pagination ?? undefined;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async deleteObject(\n containerClient: ContainerClient,\n blobName: string,\n ): Promise<boolean> {\n try {\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n await blockBlobClient.delete();\n return true;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes multiple blobs from the blob storage service.\n *\n * @param {string[]} blobNames - An array of blob names to be deleted.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[]>} - A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each blob deleted.\n */\n async deleteObjects(\n blobNames: string[],\n ): Promise<{ key: string; deleted: boolean; error?: string }[]> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const deleteBlobPromises = blobNames.map(async (blobName) => {\n try {\n await this.deleteObject(containerClient, blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n }\n\n /**\n * Retrieves the properties of the container.\n *\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the container properties.\n */\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const properties = await containerClient.getProperties();\n return properties;\n } catch (error) {\n throw new Error(\n 'Error in Azure getHeadContainer. Container: ' +\n this.containerName +\n ' Error: ' +\n error,\n );\n }\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobList = containerClient.listBlobsFlat();\n\n const uploads = [];\n\n for await (const blob of blobList) {\n uploads.push({\n uploadId: blob.name,\n key: blob.name,\n initiated: blob.properties.createdOn || new Date(),\n });\n }\n\n return {\n bucketName: this.containerName,\n uploads,\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} blobName - The name of the blob (file) in Azure Blob Storage.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n blobName: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const listResponse = await blobClient.getBlockList('all');\n const parts =\n listResponse?.uncommittedBlocks?.map((block, index) => ({\n PartNumber: index + 1,\n LastModified: new Date(), // Azure Blob Storage doesn't provide the last modified date for individual parts\n ETag: block.name,\n Size: block.size,\n })) || [];\n return {\n Parts: parts,\n };\n }\n\n /**\n * Generates a unique upload ID for multipart uploads.\n *\n * @return {Promise<string>} A promise that resolves to a unique upload ID.\n */\n async generateUploadIdMultipart(): Promise<string> {\n const timestamp = Date.now();\n const randomNum = Math.floor(Math.random() * 100);\n const blockIdBase = (timestamp - randomNum).toString();\n return blockIdBase;\n }\n\n /**\n * Uploads a part of a file as a block to Azure Blob Storage and updates the metadata with the block ID.\n *\n * @param {string} blobName - The name of the blob (file) that you want to upload in parts to Azure Blob Storage.\n * @param {FileContent | any} file - The content of the file that you want to upload as a part of a multipart upload.\n * @param {number} partNumber - The number or index of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload. If not provided, a new upload ID will be generated.\n * @return {Promise<string>} A Promise that resolves to a string representing the base64 encoded block ID of the uploaded part.\n */\n async uploadMultipart(\n blobName: string,\n file: FileContent | any,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n const blockIdBase =\n uploadId || (await this.generateUploadIdMultipart());\n\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n\n await blobClient.stageBlock(partIdBase64, file, file.length);\n\n return blockIdBase;\n }\n\n /**\n * Completes a multipart upload by committing the blocks to create the blob.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload is being completed.\n * @param {string} uploadId - The ID of the multipart upload to be completed.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is successfully completed.\n * @throws {Error} If no block IDs are found in the metadata.\n */\n async completeMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n // Retrieve the block IDs from temporal storage\n const listMultipartUploads = await this.listMultipartUploadsForKey(blobName)\n const blockIds = listMultipartUploads?.Parts?.map(part => part.ETag) || [];\n if (blockIds.length === 0) {\n throw new Error('No block IDs found in metadata.');\n }\n\n // Commit the blocks to create the blob\n await blobClient.commitBlockList(blockIds);\n }\n\n /**\n * Aborts a multipart upload by deleting the specified blob and clearing its block IDs metadata.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload needs to be aborted.\n * @param {string} uploadId - The ID of the multipart upload to be aborted.\n * @return {Promise<void>} A promise that resolves when the multipart upload is successfully aborted.\n */\n async abortMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const blockIdStorage = BlockIdStorage.getInstance();\n blockIdStorage.clearBlockIds(uploadId);\n\n await blobClient.delete();\n }\n\n async getMultipartUploadPresignedUrl(\n blobName: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 2,\n ): Promise<string> {\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n const url = `${sasUrl}&comp=block&blockid=${partIdBase64}`;\n return url;\n }\n}\n","import { CustomError } from '../../types/CustomError';\n\nconst errorMessages: { [key: string]: string } = {\n AccessDenied: 'Access denied',\n AccountProblem: 'There is a problem with your account',\n AllAccessDisabled: 'All access to this resource has been disabled',\n BucketAlreadyExists: 'The requested bucket name is not available',\n BucketNotEmpty: 'The bucket you tried to delete is not empty',\n EntityTooLarge: 'The entity you are trying to upload is too large',\n ExpiredToken: 'The provided token has expired',\n InternalError: 'An internal server error has occurred',\n InvalidAccessKeyId:\n 'The AWS access key ID you provided does not exist in our records',\n InvalidBucketName: 'The specified bucket name is not valid',\n InvalidObjectState:\n 'The operation is not valid for the current state of the object',\n InvalidToken: 'The provided token is invalid',\n NoSuchBucket: 'The specified bucket does not exist',\n NoSuchKey: 'The specified key does not exist',\n PreconditionFailed: 'The condition specified in the request is not met',\n RequestTimeout: 'The request timed out',\n ServiceUnavailable: 'The service is currently unavailable',\n SignatureDoesNotMatch:\n 'The request signature we calculated does not match the signature you provided',\n SlowDown: 'Please reduce your request rate',\n TemporaryRedirect: 'Temporary redirect',\n ObjectNotFound: 'ObjectNotFound - The specified key does not exist. (404)',\n DEFAULT: 'An unknown error occurred',\n};\n\nexport class ErrorHandler {\n static handleError(\n errorCode: string,\n errorMessage?: string,\n errorObj?: Error,\n ): CustomError {\n const errorResponse: CustomError = {\n code: errorCode,\n message:\n errorMessage ||\n errorMessages[errorCode] ||\n errorMessages['DEFAULT'],\n timestamp: new Date().toISOString(),\n error: errorObj\n ? {\n name: errorObj.name,\n message: errorObj.message,\n stack: errorObj.stack || null,\n }\n : null,\n };\n\n // Return the structured object\n return errorResponse;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectResponse } from '../../../types';\nimport { BlobGetPropertiesResponse } from '@azure/storage-blob';\n\nexport function BlobPropertiesResponseToObjectResponse(\n blobProperties: BlobGetPropertiesResponse,\n): GetObjectResponse {\n return {\n lastModified: blobProperties.lastModified,\n contentLength: blobProperties.contentLength,\n contentType: blobProperties.contentType,\n eTag: blobProperties.etag,\n metadata: blobProperties.metadata,\n contentEncoding: blobProperties.contentEncoding,\n cacheControl: blobProperties.cacheControl,\n contentDisposition: blobProperties.contentDisposition,\n contentLanguage: blobProperties.contentLanguage,\n };\n}\n","export class BlockIdStorage {\n private static instance: BlockIdStorage;\n private blockIdMap: { [blobName: string]: string[] } = {};\n\n private constructor() {}\n\n public static getInstance(): BlockIdStorage {\n if (!BlockIdStorage.instance) {\n BlockIdStorage.instance = new BlockIdStorage();\n }\n return BlockIdStorage.instance;\n }\n\n public addBlockId(blobName: string, blockId: string): void {\n if (!this.blockIdMap[blobName]) {\n this.blockIdMap[blobName] = [];\n }\n this.blockIdMap[blobName].push(blockId);\n }\n\n public getBlockIds(blobName: string): string[] {\n return this.blockIdMap[blobName] || [];\n }\n\n public clearBlockIds(blobName: string): void {\n delete this.blockIdMap[blobName];\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadBucketCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n ListObjectsV2CommandOutput,\n PutObjectAclCommandInput,\n PutObjectCommand,\n S3Client,\n S3,\n S3ClientConfig,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport { IObjectStorage } from '../../../interfaces';\nimport {\n CreateUploadWriteStreamResponse,\n FileContent,\n GetObjectResponse,\n GetUploadUrlResponse,\n ListRequestOptions,\n ListResponse,\n ListResponseItem,\n UploadResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport {\n listResponseContentsToListResponseItems,\n s3ObjectToObjectResponse,\n} from './s3Helpers';\nimport stream from 'stream';\nimport { Upload } from '@aws-sdk/lib-storage';\nimport { NodeHttpHandler } from '@smithy/node-http-handler';\n\nexport class S3StorageService implements IObjectStorage {\n private httpHandler = new NodeHttpHandler({\n socketTimeout: 600000,\n });\n\n private s3Client: S3Client = new S3Client({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private s3 = new S3({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private bucketName: string;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n this.bucketName = bucketName;\n if (\n options?.credentials?.accessKeyId &&\n options?.credentials?.secretAccessKey\n ) {\n const s3Config: S3ClientConfig = {\n region: options?.region || process.env.AWS_REGION,\n credentials: {\n accessKeyId: options?.credentials?.accessKeyId,\n secretAccessKey: options?.credentials?.secretAccessKey,\n },\n };\n this.s3Client = new S3Client(s3Config);\n }\n }\n\n /**\n * Retrieves a chunk of objects from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the objects.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of objects to retrieve.\n * @return {Promise<ListObjectsV2CommandOutput>} - A promise that resolves to the response containing the list of objects and metadata.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n ): Promise<ListObjectsV2CommandOutput> {\n const command = new ListObjectsV2Command({\n Bucket: this.bucketName,\n ContinuationToken: continuationToken || options.pagination,\n Prefix: options.prefix,\n MaxKeys: limit,\n });\n\n return this.s3Client.send(command);\n }\n\n /**\n * Retrieves a list of contents from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the contents.\n * @return {Promise<{ contents: unknown[]; nextContinuationToken?: string }>} - A promise that resolves to an object containing the list of contents and an optional next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: unknown[]; nextContinuationToken?: string }> {\n let responseContents: any[] = [];\n let continuationToken: string | undefined = undefined;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n while (continueListing) {\n const listChunkLimit = limit - responseContents.length;\n const response = await this.listChunk(\n options,\n continuationToken,\n listChunkLimit,\n );\n continuationToken = response.NextContinuationToken;\n responseContents = responseContents.concat(response.Contents ?? []);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists objects in the S3 bucket with pagination.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to a paginated list of object keys.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? listResponseContentsToListResponseItems(response.contents)\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken ?? null,\n count: items.length,\n };\n }\n\n /**\n * Lists all objects in the S3 bucket.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to list of object keys.\n */\n\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination =\n response.pagination === null ? undefined : response.pagination;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getHeadObject(key: string): Promise<GetObjectResponse> {\n const command = new HeadObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getObject(key: string): Promise<GetObjectResponse> {\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Generates a signed URL for accessing an object in the S3 bucket.\n * @param key - The key of the object.\n * @param expiresInMinutes - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n getDownloadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const expiresIn = expiresInMinutes * 60;\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n return getSignedUrl(this.s3Client, command, { expiresIn });\n }\n\n /**\n * Retrieves a signed URL for uploading an object to the S3 bucket.\n *\n * @param {string} key - The key of the object to be uploaded.\n * @param {number} [expiresInMinutes=60] - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n async getUploadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<GetUploadUrlResponse> {\n const expiresIn = expiresInMinutes * 60;\n\n const putObjectCommandParams: PutObjectAclCommandInput = {\n Bucket: process.env.UPLOAD_BUCKET_NAME,\n Key: key,\n ACL: 'private',\n };\n\n const command = new PutObjectCommand(putObjectCommandParams);\n\n const signedUrl = await getSignedUrl(this.s3Client, command, {\n expiresIn,\n });\n\n return {\n signedUrl,\n key: `https://${process.env.UPLOAD_BUCKET_NAME}.s3.${process.env.AWS_DEFAULT_REGION}.amazonaws.com/${key}`,\n };\n }\n\n /**\n * Uploads an object to the S3 bucket.\n * @param key - The key of the object to upload.\n * @param body - The content of the object to upload.\n * @param metadata - Optional metadata to associate with the object.\n * @returns A promise that resolves to the response containing the key of the uploaded object.\n */\n async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n ): Promise<UploadResponse> {\n const command = new PutObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n Body: body,\n Metadata: metadata,\n });\n await this.s3Client.send(command);\n return { key };\n }\n\n /**\n * Creates a writable stream for uploading a file to the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded object, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(key: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: streamPassThrough,\n };\n\n const upload = new Upload({\n client: this.s3Client,\n params,\n });\n\n return {\n key,\n stream: streamPassThrough,\n promise: upload.done(),\n };\n }\n\n /**\n * Deletes an object from the S3 bucket.\n * @param key - The key of the object to delete.\n * @returns A promise that resolves to true if the object was deleted successfully.\n */\n async delete(key: string): Promise<boolean> {\n const command = new DeleteObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n await this.s3Client.send(command);\n return true;\n }\n\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const command = new HeadBucketCommand({\n Bucket: this.bucketName,\n });\n return this.s3Client.send(command);\n } catch (error) {\n throw new Error(\n 'Error in S3 getHeadContainer. bucketName: ' +\n this.bucketName +\n ' Error: ' +\n error,\n );\n }\n }\n\n /**\n * Generates an upload ID for multipart upload in the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n * @throws {Error} If no upload ID was generated.\n */\n async generateUploadIdMultipart(key: string): Promise<string> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n };\n const response = await this.s3.createMultipartUpload(params);\n if (!response?.UploadId) throw new Error('No upload ID was generated');\n return response.UploadId;\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const params = {\n Bucket: this.bucketName,\n };\n const response = await this.s3.listMultipartUploads(params);\n return {\n bucketName: this.bucketName,\n uploads: response.Uploads\n ? response.Uploads.map((upload) => ({\n uploadId: upload.UploadId || '',\n key: upload.Key || '',\n initiator: upload?.Initiator?.ID || '',\n owner: upload?.Owner?.ID || '',\n storageClass: upload.StorageClass || '',\n initiated: upload.Initiated || '',\n }))\n : [],\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} key - The key of the object being uploaded.\n * @param {string} uploadId - The ID of the multipart upload.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n key: string,\n uploadId: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n const response = await this.s3.listParts(params);\n\n const parts = response.Parts\n ? response.Parts.map((part) => ({\n PartNumber: part.PartNumber!,\n LastModified: part.LastModified!,\n ETag: part.ETag!,\n Size: part.Size!,\n }))\n : [];\n\n return {\n Parts: parts,\n };\n }\n\n async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const upId = uploadId || (await this.generateUploadIdMultipart(key));\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: file,\n PartNumber: partNumber,\n UploadId: upId,\n };\n await this.s3.uploadPart(params);\n return upId;\n }\n\n async completeMultipartUpload(\n key: string,\n uploadId: string,\n ): Promise<void> {\n const partsResponse = await this.listMultipartUploadsForKey(\n key,\n uploadId,\n );\n const partsList =\n partsResponse?.Parts &&\n partsResponse.Parts.map(\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n ({ Size, LastModified, ...partList }) => partList,\n );\n const completeMultipartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: partsList,\n },\n };\n await this.s3.completeMultipartUpload(completeMultipartParams);\n }\n\n async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n await this.s3.abortMultipartUpload(params);\n }\n\n async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const uploadPartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n PartNumber: parseInt(partNumber, 10),\n };\n const expiresIn = expiresInMinutes * 60;\n const presignedUrl = await getSignedUrl(\n this.s3Client,\n new UploadPartCommand(uploadPartParams),\n { expiresIn },\n );\n\n return presignedUrl;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport { GetObjectResponse, ListResponseItem } from '../../../types';\nimport { Readable } from 'stream';\n\n/**\n * Converts an array of S3 response contents into an array of ListResponseItem objects.\n *\n * @param {any[]} responseContents - The array of S3 response contents.\n * @return {ListResponseItem[]} The array of ListResponseItem objects.\n */\nexport function listResponseContentsToListResponseItems(\n responseContents: any[],\n): ListResponseItem[] {\n return responseContents.map((responseContent) => {\n return {\n key: responseContent.Key,\n lastModified: new Date(responseContent.LastModified),\n size: responseContent.Size,\n eTag: responseContent.ETag,\n };\n });\n}\n\n/**\n * Converts an S3 object response to a standardized object response.\n *\n * @param {GetObjectCommandOutput} s3Object - The S3 object response to convert.\n * @return {GetObjectResponse} The converted object response.\n */\nexport function s3ObjectToObjectResponse(\n s3Object: GetObjectCommandOutput,\n): GetObjectResponse {\n return {\n body: s3Object.Body as Readable,\n metadata: s3Object.Metadata,\n contentType: s3Object.ContentType,\n contentLength: s3Object.ContentLength as number,\n contentEncoding: s3Object.ContentEncoding,\n cacheControl: s3Object.CacheControl,\n contentDisposition: s3Object.ContentDisposition,\n contentLanguage: s3Object.ContentLanguage,\n eTag: s3Object.ETag,\n lastModified: s3Object.LastModified,\n };\n}\n","export var HttpAuthLocation;\n(function (HttpAuthLocation) {\n HttpAuthLocation[\"HEADER\"] = \"header\";\n HttpAuthLocation[\"QUERY\"] = \"query\";\n})(HttpAuthLocation || (HttpAuthLocation = {}));\n","export var HttpApiKeyAuthLocation;\n(function (HttpApiKeyAuthLocation) {\n HttpApiKeyAuthLocation[\"HEADER\"] = \"header\";\n HttpApiKeyAuthLocation[\"QUERY\"] = \"query\";\n})(HttpApiKeyAuthLocation || (HttpApiKeyAuthLocation = {}));\n","export var EndpointURLScheme;\n(function (EndpointURLScheme) {\n EndpointURLScheme[\"HTTP\"] = \"http\";\n EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(EndpointURLScheme || (EndpointURLScheme = {}));\n","export var AlgorithmId;\n(function (AlgorithmId) {\n AlgorithmId[\"MD5\"] = \"md5\";\n AlgorithmId[\"CRC32\"] = \"crc32\";\n AlgorithmId[\"CRC32C\"] = \"crc32c\";\n AlgorithmId[\"SHA1\"] = \"sha1\";\n AlgorithmId[\"SHA256\"] = \"sha256\";\n})(AlgorithmId || (AlgorithmId = {}));\nexport const getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n if (runtimeConfig.sha256 !== undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.SHA256,\n checksumConstructor: () => runtimeConfig.sha256,\n });\n }\n if (runtimeConfig.md5 != undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.MD5,\n checksumConstructor: () => runtimeConfig.md5,\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexport const resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\n","export var FieldPosition;\n(function (FieldPosition) {\n FieldPosition[FieldPosition[\"HEADER\"] = 0] = \"HEADER\";\n FieldPosition[FieldPosition[\"TRAILER\"] = 1] = \"TRAILER\";\n})(FieldPosition || (FieldPosition = {}));\n","export var IniSectionType;\n(function (IniSectionType) {\n IniSectionType[\"PROFILE\"] = \"profile\";\n IniSectionType[\"SSO_SESSION\"] = \"sso-session\";\n IniSectionType[\"SERVICES\"] = \"services\";\n})(IniSectionType || (IniSectionType = {}));\n","export var RequestHandlerProtocol;\n(function (RequestHandlerProtocol) {\n RequestHandlerProtocol[\"HTTP_0_9\"] = \"http/0.9\";\n RequestHandlerProtocol[\"HTTP_1_0\"] = \"http/1.0\";\n RequestHandlerProtocol[\"TDS_8_0\"] = \"tds/8.0\";\n})(RequestHandlerProtocol || (RequestHandlerProtocol = {}));\n","export class HttpResponse {\n constructor(options) {\n this.statusCode = options.statusCode;\n this.reason = options.reason;\n this.headers = options.headers || {};\n this.body = options.body;\n }\n static isInstance(response) {\n if (!response)\n return false;\n const resp = response;\n return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n }\n}\n","export const escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","import { escapeUri } from \"@smithy/util-uri-escape\";\nexport function buildQueryString(query) {\n const parts = [];\n for (let key of Object.keys(query).sort()) {\n const value = query[key];\n key = escapeUri(key);\n if (Array.isArray(value)) {\n for (let i = 0, iLen = value.length; i < iLen; i++) {\n parts.push(`${key}=${escapeUri(value[i])}`);\n }\n }\n else {\n let qsEntry = key;\n if (value || typeof value === \"string\") {\n qsEntry += `=${escapeUri(value)}`;\n }\n parts.push(qsEntry);\n }\n }\n return parts.join(\"&\");\n}\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { buildQueryString } from \"@smithy/querystring-builder\";\nimport { Agent as hAgent, request as hRequest } from \"http\";\nimport { Agent as hsAgent, request as hsRequest } from \"https\";\nimport { NODEJS_TIMEOUT_ERROR_CODES } from \"./constants\";\nimport { getTransformedHeaders } from \"./get-transformed-headers\";\nimport { setConnectionTimeout } from \"./set-connection-timeout\";\nimport { setSocketKeepAlive } from \"./set-socket-keep-alive\";\nimport { setSocketTimeout } from \"./set-socket-timeout\";\nimport { writeRequestBody } from \"./write-request-body\";\nexport const DEFAULT_REQUEST_TIMEOUT = 0;\nexport class NodeHttpHandler {\n static create(instanceOrOptions) {\n if (typeof instanceOrOptions?.handle === \"function\") {\n return instanceOrOptions;\n }\n return new NodeHttpHandler(instanceOrOptions);\n }\n static checkSocketUsage(agent, socketWarningTimestamp) {\n const { sockets, requests, maxSockets } = agent;\n if (typeof maxSockets !== \"number\" || maxSockets === Infinity) {\n return socketWarningTimestamp;\n }\n const interval = 15000;\n if (Date.now() - interval < socketWarningTimestamp) {\n return socketWarningTimestamp;\n }\n if (sockets && requests) {\n for (const origin in sockets) {\n const socketsInUse = sockets[origin]?.length ?? 0;\n const requestsEnqueued = requests[origin]?.length ?? 0;\n if (socketsInUse >= maxSockets && requestsEnqueued >= 2 * maxSockets) {\n console.warn(\"@smithy/node-http-handler:WARN\", `socket usage at capacity=${socketsInUse} and ${requestsEnqueued} additional requests are enqueued.`, \"See https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html\", \"or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.\");\n return Date.now();\n }\n }\n }\n return socketWarningTimestamp;\n }\n constructor(options) {\n this.socketWarningTimestamp = 0;\n this.metadata = { handlerProtocol: \"http/1.1\" };\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((_options) => {\n resolve(this.resolveDefaultConfig(_options));\n })\n .catch(reject);\n }\n else {\n resolve(this.resolveDefaultConfig(options));\n }\n });\n }\n resolveDefaultConfig(options) {\n const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {};\n const keepAlive = true;\n const maxSockets = 50;\n return {\n connectionTimeout,\n requestTimeout: requestTimeout ?? socketTimeout,\n httpAgent: (() => {\n if (httpAgent instanceof hAgent || typeof httpAgent?.destroy === \"function\") {\n return httpAgent;\n }\n return new hAgent({ keepAlive, maxSockets, ...httpAgent });\n })(),\n httpsAgent: (() => {\n if (httpsAgent instanceof hsAgent || typeof httpsAgent?.destroy === \"function\") {\n return httpsAgent;\n }\n return new hsAgent({ keepAlive, maxSockets, ...httpsAgent });\n })(),\n };\n }\n destroy() {\n this.config?.httpAgent?.destroy();\n this.config?.httpsAgent?.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n }\n let socketCheckTimeoutId;\n return new Promise((_resolve, _reject) => {\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n clearTimeout(socketCheckTimeoutId);\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (!this.config) {\n throw new Error(\"Node HTTP request handler config is not resolved\");\n }\n if (abortSignal?.aborted) {\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const isSSL = request.protocol === \"https:\";\n const agent = isSSL ? this.config.httpsAgent : this.config.httpAgent;\n socketCheckTimeoutId = setTimeout(() => {\n this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp);\n }, this.config.socketAcquisitionWarningTimeout ??\n (this.config.requestTimeout ?? 2000) + (this.config.connectionTimeout ?? 1000));\n const queryString = buildQueryString(request.query || {});\n let auth = undefined;\n if (request.username != null || request.password != null) {\n const username = request.username ?? \"\";\n const password = request.password ?? \"\";\n auth = `${username}:${password}`;\n }\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const nodeHttpsOptions = {\n headers: request.headers,\n host: request.hostname,\n method: request.method,\n path,\n port: request.port,\n agent,\n auth,\n };\n const requestFunc = isSSL ? hsRequest : hRequest;\n const req = requestFunc(nodeHttpsOptions, (res) => {\n const httpResponse = new HttpResponse({\n statusCode: res.statusCode || -1,\n reason: res.statusMessage,\n headers: getTransformedHeaders(res.headers),\n body: res,\n });\n resolve({ response: httpResponse });\n });\n req.on(\"error\", (err) => {\n if (NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n reject(Object.assign(err, { name: \"TimeoutError\" }));\n }\n else {\n reject(err);\n }\n });\n setConnectionTimeout(req, reject, this.config.connectionTimeout);\n setSocketTimeout(req, reject, this.config.requestTimeout);\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.abort();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n };\n }\n const httpAgent = nodeHttpsOptions.agent;\n if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n setSocketKeepAlive(req, {\n keepAlive: httpAgent.keepAlive,\n keepAliveMsecs: httpAgent.keepAliveMsecs,\n });\n }\n writeRequestBodyPromise = writeRequestBody(req, request, this.config.requestTimeout).catch(_reject);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n return this.config ?? {};\n }\n}\n","export const NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n","const getTransformedHeaders = (headers) => {\n const transformedHeaders = {};\n for (const name of Object.keys(headers)) {\n const headerValues = headers[name];\n transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n }\n return transformedHeaders;\n};\nexport { getTransformedHeaders };\n","export const setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n if (!timeoutInMs) {\n return;\n }\n const timeoutId = setTimeout(() => {\n request.destroy();\n reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), {\n name: \"TimeoutError\",\n }));\n }, timeoutInMs);\n request.on(\"socket\", (socket) => {\n if (socket.connecting) {\n socket.on(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n }\n else {\n clearTimeout(timeoutId);\n }\n });\n};\n","export const setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => {\n if (keepAlive !== true) {\n return;\n }\n request.on(\"socket\", (socket) => {\n socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n });\n};\n","export const setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n request.setTimeout(timeoutInMs, () => {\n request.destroy();\n reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: \"TimeoutError\" }));\n });\n};\n","import { Readable } from \"stream\";\nconst MIN_WAIT_TIME = 1000;\nexport async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) {\n const headers = request.headers ?? {};\n const expect = headers[\"Expect\"] || headers[\"expect\"];\n let timeoutId = -1;\n let hasError = false;\n if (expect === \"100-continue\") {\n await Promise.race([\n new Promise((resolve) => {\n timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n }),\n new Promise((resolve) => {\n httpRequest.on(\"continue\", () => {\n clearTimeout(timeoutId);\n resolve();\n });\n httpRequest.on(\"error\", () => {\n hasError = true;\n clearTimeout(timeoutId);\n resolve();\n });\n }),\n ]);\n }\n if (!hasError) {\n writeBody(httpRequest, request.body);\n }\n}\nfunction writeBody(httpRequest, body) {\n if (body instanceof Readable) {\n body.pipe(httpRequest);\n return;\n }\n if (body) {\n if (Buffer.isBuffer(body) || typeof body === \"string\") {\n httpRequest.end(body);\n return;\n }\n const uint8 = body;\n if (typeof uint8 === \"object\" &&\n uint8.buffer &&\n typeof uint8.byteOffset === \"number\" &&\n typeof uint8.byteLength === \"number\") {\n httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength));\n return;\n }\n httpRequest.end(Buffer.from(body));\n return;\n }\n httpRequest.end();\n}\n","export class NodeHttp2ConnectionPool {\n constructor(sessions) {\n this.sessions = [];\n this.sessions = sessions ?? [];\n }\n poll() {\n if (this.sessions.length > 0) {\n return this.sessions.shift();\n }\n }\n offerLast(session) {\n this.sessions.push(session);\n }\n contains(session) {\n return this.sessions.includes(session);\n }\n remove(session) {\n this.sessions = this.sessions.filter((s) => s !== session);\n }\n [Symbol.iterator]() {\n return this.sessions[Symbol.iterator]();\n }\n destroy(connection) {\n for (const session of this.sessions) {\n if (session === connection) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n }\n }\n}\n","export const OBJECT_STORAGE_SERVICE_TYPES = {\n AWS_S3: 'aws_s3',\n AZURE_BLOB_STORAGE: 'azure_blob_storage',\n};\n","import { IObjectStorage } from '../interfaces';\nimport { S3StorageService, BlobStorageService } from './storage';\nimport { ObjectStorageOptions } from '../types';\nimport { OBJECT_STORAGE_SERVICE_TYPES } from '../shared/utils/constants';\n\nexport class ObjectStorageFactory {\n static async instance(\n bucketName: string,\n options?: ObjectStorageOptions,\n ): Promise<IObjectStorage> {\n const provider =\n options?.provider?.toLowerCase() ||\n process.env.OBJECT_STORAGE_SERVICE?.toLowerCase();\n switch (provider) {\n case OBJECT_STORAGE_SERVICE_TYPES.AWS_S3:\n return new S3StorageService(bucketName, options);\n case OBJECT_STORAGE_SERVICE_TYPES.AZURE_BLOB_STORAGE:\n return new BlobStorageService(bucketName);\n default:\n throw new Error(\n `Unsupported object storage provider: ${provider}`,\n );\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IObjectStorage, IGetObjectOptions } from '../interfaces';\nimport {\n ListResponse,\n FileContent,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../types';\nimport { ObjectStorageFactory } from '../services/objectStorageFactory.service';\n\nexport default class ObjectStorageService {\n static bucketName: string;\n static objectStorageOptions: ObjectStorageOptions;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n ObjectStorageService.bucketName = bucketName;\n if (options) ObjectStorageService.objectStorageOptions = options;\n }\n\n static async getObjectStorageServiceInstance(\n bucketName: string = ObjectStorageService.bucketName,\n options:\n | ObjectStorageOptions\n | undefined = ObjectStorageService.objectStorageOptions,\n ): Promise<IObjectStorage> {\n if (!bucketName)\n throw new Error('Bucket name not provided or not valid value');\n return ObjectStorageFactory.instance(bucketName, options);\n }\n\n /**\n * Retrieves a list of objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of objects.\n */\n static async list(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.list(options));\n }\n\n /**\n * Retrieves a list of all objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of all objects.\n */\n static async listAll(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listAll(options));\n }\n\n /**\n * Retrieves an object from the object storage service.\n *\n * @param {string} key - The key of the object to retrieve.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the retrieved object.\n */\n static async getObject(\n key: string,\n bucketName?: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getObject(key, options));\n }\n\n /**\n * Retrieves an object info (without file content) from the object storage service.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the info of the file.\n */\n static async getHeadObject(\n key: string,\n bucketName?: string,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadObject(key));\n }\n\n /**\n * Retrieves a signed URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the signed URL.\n * @param {number} expiresInMinutes - The number of minutes until the signed URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated signed URL.\n */\n static async getDownloadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getDownloadUrl(key, expiresInMinutes));\n }\n\n /**\n * Retrieves an upload URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the upload URL.\n * @param {number} expiresInMinutes - The number of minutes until the upload URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload URL.\n */\n static async getUploadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<GetUploadUrlResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getUploadUrl(key, expiresInMinutes));\n }\n\n /**\n * Uploads a file to the object storage service.\n *\n * @param {string} key - The key of the object to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {Object} [metadata] - Optional metadata to associate with the object.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<UploadResponse>} A promise that resolves to the response of the upload operation.\n */\n static async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n bucketName?: string,\n ): Promise<UploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.upload(key, body, metadata));\n }\n\n /**\n * Creates an upload write stream for the specified key in the object storage service.\n *\n * @param {string} key - The key of the object to create the upload write stream for.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<CreateUploadWriteStreamResponse>} A promise that resolves to the response of the upload operation.\n */\n static async createUploadWriteStream(\n key: string,\n bucketName?: string,\n ): Promise<CreateUploadWriteStreamResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.createUploadWriteStream(key));\n }\n\n /**\n * Deletes an object or multiple objects from the object storage service.\n *\n * @param {string | string[]} key - The key or array of keys of the objects to delete.\n * @param {string} [bucketName] - The name of the bucket where the objects are stored. If not provided, the default bucket name will be used.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[] | boolean>} A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each object deleted, or a boolean value indicating the success of the deletion.\n */\n static async delete(\n key: string | string[],\n bucketName?: string,\n ): Promise<{ key: string; deleted: boolean; error?: string }[] | boolean> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then(async (instance) => {\n if (Array.isArray(key)) {\n const deleteBlobPromises = key.map(async (blobName) => {\n try {\n await instance.delete(blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n } else {\n return instance.delete(key);\n }\n });\n }\n\n /**\n * Retrieves the head bucket from the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the head bucket response.\n */\n static async getHeadBucket(\n bucketName?: string,\n ): Promise<HeadBucketResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadBucket());\n }\n\n /**\n * Generates a unique upload ID for a multipart upload.\n *\n * @param {string} key - The key of the object to upload.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n */\n static async generateUploadIdMultipart(\n key: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.generateUploadIdMultipart(key));\n }\n\n /**\n * Retrieves a list of multipart uploads for a specified key in the object storage service.\n *\n * @param {string} key - The key of the object to retrieve uploads for.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @param {string} [uploadId] - The upload ID to filter the results by.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of multipart uploads for the specified key.\n */\n static async listMultipartUploadsForKey(\n key: string,\n bucketName?: string,\n uploadId?: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.listMultipartUploadsForKey(key, uploadId),\n );\n }\n\n /**\n * Retrieves a list of all multipart uploads for a specified bucket in the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<ListMultipartUploadsResponse>} A promise that resolves to the list of multipart uploads for the specified bucket.\n */\n static async listMultipartUploadsForBucket(\n bucketName?: string,\n ): Promise<ListMultipartUploadsResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listMultipartUploadsForBucket());\n }\n\n /**\n * Uploads a multipart file to the specified bucket in the object storage service.\n *\n * @param {string} key - The key of the object to upload the multipart file to.\n * @param {FileContent} file - The content of the file to upload.\n * @param {number} partNumber - The number of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload.\n * @param {string} [bucketName] - The name of the bucket to upload the file to. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A Promise that resolves to the base64 encoded block ID of the uploaded part.\n */\n static async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.uploadMultipart(key, file, partNumber, uploadId),\n );\n }\n\n /**\n * Completes a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to complete the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to complete.\n * @param {string} [bucketName] - The name of the bucket to complete the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is completed.\n */\n static async completeMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.completeMultipartUpload(key, uploadId));\n }\n\n /**\n * Aborts a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to abort the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to abort.\n * @param {string} [bucketName] - The name of the bucket to abort the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is aborted.\n */\n static async abortMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.abortMultipartUpload(key, uploadId));\n }\n\n /**\n * Retrieves a presigned URL for a specific part of a multipart upload.\n *\n * @param {string} key - The key of the object for which to generate the presigned URL.\n * @param {string} uploadId - The ID of the multipart upload.\n * @param {string} partNumber - The number of the part for which to generate the presigned URL.\n * @param {number} [expiresInMinutes] - The number of minutes until the presigned URL expires. Default is 60 minutes.\n * @return {Promise<string>} A Promise that resolves to the presigned URL for the specified part of the multipart upload.\n */\n static async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes?: number,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance().then(\n (instance) =>\n instance.getMultipartUploadPresignedUrl(\n key,\n uploadId,\n partNumber,\n expiresInMinutes,\n ),\n );\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/services/storage/blob/blobStorage.service.ts","../../src/shared/utils/errorHandler.ts","../../src/services/storage/blob/blobHelpers.ts","../../src/services/storage/blob/blocIdStorage.ts","../../src/services/storage/s3/s3Storage.service.ts","../../src/services/storage/s3/s3Helpers.ts","../../../../node_modules/@smithy/types/dist-es/auth/auth.js","../../../../node_modules/@smithy/types/dist-es/auth/HttpApiKeyAuth.js","../../../../node_modules/@smithy/types/dist-es/endpoint.js","../../../../node_modules/@smithy/types/dist-es/extensions/checksum.js","../../../../node_modules/@smithy/types/dist-es/http.js","../../../../node_modules/@smithy/types/dist-es/profile.js","../../../../node_modules/@smithy/types/dist-es/transfer.js","../../../../node_modules/@smithy/protocol-http/dist-es/httpResponse.js","../../../../node_modules/@smithy/util-uri-escape/dist-es/escape-uri.js","../../../../node_modules/@smithy/querystring-builder/dist-es/index.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http-handler.js","../../../../node_modules/@smithy/node-http-handler/dist-es/constants.js","../../../../node_modules/@smithy/node-http-handler/dist-es/get-transformed-headers.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-connection-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-keep-alive.js","../../../../node_modules/@smithy/node-http-handler/dist-es/set-socket-timeout.js","../../../../node_modules/@smithy/node-http-handler/dist-es/write-request-body.js","../../../../node_modules/@smithy/node-http-handler/dist-es/node-http2-connection-pool.js","../../src/shared/utils/constants.ts","../../src/services/objectStorageFactory.service.ts","../../src/services/objectStorage.service.ts"],"names":["stream","HttpAuthLocation","HttpApiKeyAuthLocation","EndpointURLScheme","AlgorithmId","FieldPosition","IniSectionType","RequestHandlerProtocol"],"mappings":"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","sourcesContent":["/* eslint-disable no-console */\nimport stream from 'stream';\nimport { IObjectStorage, IGetObjectOptions } from '../../../interfaces';\nimport {\n FileContent,\n ListResponse,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n ListResponseItem,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport {\n BlobServiceClient,\n BlobSASPermissions,\n BlobItem,\n ContainerClient,\n} from '@azure/storage-blob';\n\nimport { Readable } from 'stream';\nimport { ErrorHandler } from '../../../shared/utils/errorHandler';\nimport { BlobPropertiesResponseToObjectResponse } from './blobHelpers';\nimport { BlockIdStorage } from './blocIdStorage';\nexport class BlobStorageService implements IObjectStorage {\n private blobServiceClient: BlobServiceClient;\n private containerName: string;\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n constructor(containerName: string) {\n this.containerName = containerName;\n this.blobServiceClient = BlobServiceClient.fromConnectionString(\n process.env.AZURE_STORAGE_CONNECTION_STRING!,\n );\n }\n\n /**\n * Creates a writable stream for uploading a file to the Blob storage.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded blob, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(blobName: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient = containerClient.getBlockBlobClient(blobName);\n\n const uploadPromise = blockBlobClient\n .uploadStream(streamPassThrough, undefined, undefined, {\n onProgress: (ev) => console.log(ev),\n })\n .then(() => {\n return { Bucket: this.containerName, Key: blobName };\n });\n\n return {\n key: blobName,\n stream: streamPassThrough,\n promise: uploadPromise,\n };\n }\n\n /**\n * Retrieves the properties of a blob from the container by its name.\n *\n * @param {string} blobName - The name of the blob.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the blob properties.\n */\n async getHeadObject(blobName: string): Promise<GetObjectResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const blobProperties = await blockBlobClient.getProperties();\n return BlobPropertiesResponseToObjectResponse(blobProperties);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves an object from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to retrieve.\n * @param {Object} [options] - The options that you can pass to the library.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the object data, including the body, metadata, content type, and content length, or rejects with an error if there was an issue.\n */\n async getObject(\n blobName: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n try {\n let downloadBlockBlobResponse;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n const expression = options?.range || '';\n const matches = expression.match(/\\d+/g);\n if (expression && matches?.length) {\n const [start, end] = matches.map(Number);\n downloadBlockBlobResponse = await blockBlobClient.download(\n start,\n end,\n );\n } else {\n downloadBlockBlobResponse = await blockBlobClient.download(0);\n }\n return {\n body: downloadBlockBlobResponse.readableStreamBody as Readable,\n metadata: downloadBlockBlobResponse.metadata,\n contentType: downloadBlockBlobResponse.contentType,\n contentLength: downloadBlockBlobResponse.contentLength,\n };\n } catch (error: any) {\n let errorKey = 'DEFAULT';\n if (error?.response?.status === 404) {\n errorKey = 'ObjectNotFound';\n }\n throw ErrorHandler.handleError(errorKey, '', error as Error);\n }\n }\n\n private async getSignatureUrl(\n blobName: string,\n expiresInMinutes: number,\n permissions: string,\n ): Promise<string> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n\n const startDate = new Date();\n const expiryDate = new Date(startDate);\n expiryDate.setMinutes(startDate.getMinutes() + expiresInMinutes);\n\n return blockBlobClient.generateSasUrl({\n permissions: BlobSASPermissions.parse(permissions),\n startsOn: startDate,\n expiresOn: expiryDate,\n });\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n async getUploadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<GetUploadUrlResponse> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n return { key: blobName, signedUrl: sasUrl };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Retrieves a signed URL for the blob with the specified name that expires after a certain period.\n *\n * @param {string} blobName - The name of the blob to generate the signed URL for.\n * @param {number} expiresInMinutes - The duration in minutes until the signed URL expires.\n * @return {Promise<string>} A Promise that resolves with the signed URL.\n */\n async getDownloadUrl(\n blobName: string,\n expiresInMinutes: number,\n ): Promise<string> {\n try {\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'r',\n );\n return sasUrl;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Uploads a file to the blob storage service.\n *\n * @param {string} blobName - The name of the blob to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {{ [key: string]: string } | undefined} [metadata] - Optional metadata to associate with the blob.\n * @return {Promise<UploadResponse>} A promise that resolves to the response object containing the key of the uploaded blob, or rejects with an error if there was an issue.\n */\n async upload(\n blobName: string,\n body: FileContent,\n metadata: { [key: string]: string } = {},\n ): Promise<UploadResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n Buffer.isBuffer(body)\n ? await blockBlobClient.upload(body, body.length, { metadata })\n : await blockBlobClient.uploadStream(\n body as Readable,\n undefined,\n undefined,\n { metadata },\n );\n\n return { key: blobName };\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async delete(data: string): Promise<boolean> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n return this.deleteObject(containerClient, data);\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Lists a chunk of blobs from the specified container client based on the provided options and continuation token.\n *\n * @param {ListRequestOptions} options - The options for listing the blobs.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of blobs to list in a single page.\n * @param {ContainerClient} containerClient - The container client to list the blobs from.\n * @return {Promise<{ items: BlobItem[]; continuationToken?: string }>} - A promise that resolves to an object containing the list of blob items and an optional continuation token.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n containerClient: ContainerClient,\n ): Promise<{ items: BlobItem[]; continuationToken?: string }> {\n const iterator = containerClient\n .listBlobsFlat({\n prefix: options.prefix,\n })\n .byPage({\n maxPageSize: limit,\n continuationToken: continuationToken,\n });\n\n const items: BlobItem[] = [];\n const response = (await iterator.next()).value;\n items.push(...response.segment.blobItems);\n return {\n items,\n continuationToken: response.continuationToken,\n };\n }\n\n /**\n * Retrieves a list of blob contents based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the blob contents.\n * @return {Promise<{ contents: BlobItem[]; nextContinuationToken?: string }>} A promise that resolves to the list of blob contents and the next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: BlobItem[]; nextContinuationToken?: string }> {\n let responseContents: BlobItem[] = [];\n let continuationToken: string | undefined = options.pagination;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n while (continueListing) {\n const response = await this.listChunk(\n options,\n continuationToken,\n limit - responseContents.length,\n containerClient,\n );\n continuationToken = response.continuationToken;\n responseContents = responseContents.concat(response.items);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists blobs in the Azure Blob Storage container with pagination.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to a paginated list of blob names.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? response.contents.map((blob) => {\n return {\n key: blob.name,\n lastModified: blob.properties.lastModified,\n size: blob.properties.contentLength!,\n eTag: blob.properties.etag,\n };\n })\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken?.length\n ? response.nextContinuationToken\n : null,\n count: items.length,\n };\n }\n\n /**\n * Lists all blobs in the Azure Blob Storage container.\n * @param options - The options for listing blobs.\n * @returns A promise that resolves to list of blob names.\n */\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination = response.pagination ?? undefined;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Deletes a blob from the blob storage service.\n *\n * @param {string} blobName - The name of the blob to be deleted.\n * @return {Promise<boolean>} A promise that resolves to true if the blob is successfully deleted, or rejects with an error if there was an issue.\n */\n async deleteObject(\n containerClient: ContainerClient,\n blobName: string,\n ): Promise<boolean> {\n try {\n const blockBlobClient =\n containerClient.getBlockBlobClient(blobName);\n await blockBlobClient.delete();\n return true;\n } catch (error) {\n throw ErrorHandler.handleError('DEFAULT', '', error as Error);\n }\n }\n\n /**\n * Deletes multiple blobs from the blob storage service.\n *\n * @param {string[]} blobNames - An array of blob names to be deleted.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[]>} - A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each blob deleted.\n */\n async deleteObjects(\n blobNames: string[],\n ): Promise<{ key: string; deleted: boolean; error?: string }[]> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const deleteBlobPromises = blobNames.map(async (blobName) => {\n try {\n await this.deleteObject(containerClient, blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n }\n\n /**\n * Retrieves the properties of the container.\n *\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the container properties.\n */\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const properties = await containerClient.getProperties();\n return properties;\n } catch (error) {\n throw new Error(\n 'Error in Azure getHeadContainer. Container: ' +\n this.containerName +\n ' Error: ' +\n error,\n );\n }\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobList = containerClient.listBlobsFlat();\n\n const uploads = [];\n\n for await (const blob of blobList) {\n uploads.push({\n uploadId: blob.name,\n key: blob.name,\n initiated: blob.properties.createdOn || new Date(),\n });\n }\n\n return {\n bucketName: this.containerName,\n uploads,\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} blobName - The name of the blob (file) in Azure Blob Storage.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n blobName: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const listResponse = await blobClient.getBlockList('all');\n const parts =\n listResponse?.uncommittedBlocks?.map((block, index) => ({\n PartNumber: index + 1,\n LastModified: new Date(), // Azure Blob Storage doesn't provide the last modified date for individual parts\n ETag: block.name,\n Size: block.size,\n })) || [];\n return {\n Parts: parts,\n };\n }\n\n /**\n * Generates a unique upload ID for multipart uploads.\n *\n * @return {Promise<string>} A promise that resolves to a unique upload ID.\n */\n async generateUploadIdMultipart(): Promise<string> {\n const timestamp = Date.now();\n const randomNum = Math.floor(Math.random() * 100);\n const blockIdBase = (timestamp - randomNum).toString();\n return blockIdBase;\n }\n\n /**\n * Uploads a part of a file as a block to Azure Blob Storage and updates the metadata with the block ID.\n *\n * @param {string} blobName - The name of the blob (file) that you want to upload in parts to Azure Blob Storage.\n * @param {FileContent | any} file - The content of the file that you want to upload as a part of a multipart upload.\n * @param {number} partNumber - The number or index of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload. If not provided, a new upload ID will be generated.\n * @return {Promise<string>} A Promise that resolves to a string representing the base64 encoded block ID of the uploaded part.\n */\n async uploadMultipart(\n blobName: string,\n file: FileContent | any,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n const blockIdBase =\n uploadId || (await this.generateUploadIdMultipart());\n\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n\n await blobClient.stageBlock(partIdBase64, file, file.length);\n\n return blockIdBase;\n }\n\n /**\n * Completes a multipart upload by committing the blocks to create the blob.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload is being completed.\n * @param {string} uploadId - The ID of the multipart upload to be completed.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is successfully completed.\n * @throws {Error} If no block IDs are found in the metadata.\n */\n async completeMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n\n // Retrieve the block IDs from temporal storage\n const listMultipartUploads = await this.listMultipartUploadsForKey(blobName)\n const blockIds = listMultipartUploads?.Parts?.map(part => part.ETag) || [];\n if (blockIds.length === 0) {\n throw new Error('No block IDs found in metadata.');\n }\n\n // Commit the blocks to create the blob\n await blobClient.commitBlockList(blockIds);\n }\n\n /**\n * Aborts a multipart upload by deleting the specified blob and clearing its block IDs metadata.\n *\n * @param {string} blobName - The name of the blob for which the multipart upload needs to be aborted.\n * @param {string} uploadId - The ID of the multipart upload to be aborted.\n * @return {Promise<void>} A promise that resolves when the multipart upload is successfully aborted.\n */\n async abortMultipartUpload(\n blobName: string,\n uploadId: string,\n ): Promise<void> {\n const containerClient = this.blobServiceClient.getContainerClient(\n this.containerName,\n );\n const blobClient = containerClient.getBlockBlobClient(blobName);\n const blockIdStorage = BlockIdStorage.getInstance();\n blockIdStorage.clearBlockIds(uploadId);\n\n await blobClient.delete();\n }\n\n async getMultipartUploadPresignedUrl(\n blobName: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 2,\n ): Promise<string> {\n const partId = partNumber.toString().padStart(6, '0');\n const partIdBase64 = Buffer.from(partId).toString('base64');\n const sasUrl = await this.getSignatureUrl(\n blobName,\n expiresInMinutes,\n 'w',\n );\n const url = `${sasUrl}&comp=block&blockid=${partIdBase64}`;\n return url;\n }\n}\n","import { CustomError } from '../../types/CustomError';\n\nconst errorMessages: { [key: string]: string } = {\n AccessDenied: 'Access denied',\n AccountProblem: 'There is a problem with your account',\n AllAccessDisabled: 'All access to this resource has been disabled',\n BucketAlreadyExists: 'The requested bucket name is not available',\n BucketNotEmpty: 'The bucket you tried to delete is not empty',\n EntityTooLarge: 'The entity you are trying to upload is too large',\n ExpiredToken: 'The provided token has expired',\n InternalError: 'An internal server error has occurred',\n InvalidAccessKeyId:\n 'The AWS access key ID you provided does not exist in our records',\n InvalidBucketName: 'The specified bucket name is not valid',\n InvalidObjectState:\n 'The operation is not valid for the current state of the object',\n InvalidToken: 'The provided token is invalid',\n NoSuchBucket: 'The specified bucket does not exist',\n NoSuchKey: 'The specified key does not exist',\n PreconditionFailed: 'The condition specified in the request is not met',\n RequestTimeout: 'The request timed out',\n ServiceUnavailable: 'The service is currently unavailable',\n SignatureDoesNotMatch:\n 'The request signature we calculated does not match the signature you provided',\n SlowDown: 'Please reduce your request rate',\n TemporaryRedirect: 'Temporary redirect',\n ObjectNotFound: 'ObjectNotFound - The specified key does not exist. (404)',\n DEFAULT: 'An unknown error occurred',\n};\n\nexport class ErrorHandler {\n static handleError(\n errorCode: string,\n errorMessage?: string,\n errorObj?: Error,\n ): CustomError {\n const errorResponse: CustomError = {\n code: errorCode,\n message:\n errorMessage ||\n errorMessages[errorCode] ||\n errorMessages['DEFAULT'],\n timestamp: new Date().toISOString(),\n error: errorObj\n ? {\n name: errorObj.name,\n message: errorObj.message,\n stack: errorObj.stack || null,\n }\n : null,\n };\n\n // Return the structured object\n return errorResponse;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectResponse } from '../../../types';\nimport { BlobGetPropertiesResponse } from '@azure/storage-blob';\n\nexport function BlobPropertiesResponseToObjectResponse(\n blobProperties: BlobGetPropertiesResponse,\n): GetObjectResponse {\n return {\n lastModified: blobProperties.lastModified,\n contentLength: blobProperties.contentLength,\n contentType: blobProperties.contentType,\n eTag: blobProperties.etag,\n metadata: blobProperties.metadata,\n contentEncoding: blobProperties.contentEncoding,\n cacheControl: blobProperties.cacheControl,\n contentDisposition: blobProperties.contentDisposition,\n contentLanguage: blobProperties.contentLanguage,\n };\n}\n","export class BlockIdStorage {\n private static instance: BlockIdStorage;\n private blockIdMap: { [blobName: string]: string[] } = {};\n\n private constructor() {}\n\n public static getInstance(): BlockIdStorage {\n if (!BlockIdStorage.instance) {\n BlockIdStorage.instance = new BlockIdStorage();\n }\n return BlockIdStorage.instance;\n }\n\n public addBlockId(blobName: string, blockId: string): void {\n if (!this.blockIdMap[blobName]) {\n this.blockIdMap[blobName] = [];\n }\n this.blockIdMap[blobName].push(blockId);\n }\n\n public getBlockIds(blobName: string): string[] {\n return this.blockIdMap[blobName] || [];\n }\n\n public clearBlockIds(blobName: string): void {\n delete this.blockIdMap[blobName];\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n DeleteObjectCommand,\n GetObjectCommand,\n HeadBucketCommand,\n HeadObjectCommand,\n ListObjectsV2Command,\n ListObjectsV2CommandOutput,\n PutObjectAclCommandInput,\n PutObjectCommand,\n S3Client,\n S3,\n S3ClientConfig,\n UploadPartCommand,\n} from '@aws-sdk/client-s3';\nimport { IObjectStorage } from '../../../interfaces';\nimport {\n CreateUploadWriteStreamResponse,\n FileContent,\n GetObjectResponse,\n GetUploadUrlResponse,\n ListRequestOptions,\n ListResponse,\n ListResponseItem,\n UploadResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../../../types';\nimport { getSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport {\n listResponseContentsToListResponseItems,\n s3ObjectToObjectResponse,\n} from './s3Helpers';\nimport stream from 'stream';\nimport { Upload } from '@aws-sdk/lib-storage';\nimport { NodeHttpHandler } from '@smithy/node-http-handler';\n\nexport class S3StorageService implements IObjectStorage {\n private httpHandler = new NodeHttpHandler({\n socketTimeout: 600000,\n });\n\n private s3Client: S3Client = new S3Client({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private s3 = new S3({\n region: process.env.AWS_DEFAULT_REGION,\n requestHandler: this.httpHandler,\n });\n private bucketName: string;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n this.bucketName = bucketName;\n if (\n options?.credentials?.accessKeyId &&\n options?.credentials?.secretAccessKey\n ) {\n const s3Config: S3ClientConfig = {\n region: options?.region || process.env.AWS_REGION,\n credentials: {\n accessKeyId: options?.credentials?.accessKeyId,\n secretAccessKey: options?.credentials?.secretAccessKey,\n },\n };\n this.s3Client = new S3Client(s3Config);\n }\n }\n\n /**\n * Retrieves a chunk of objects from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the objects.\n * @param {string | undefined} continuationToken - The continuation token for pagination.\n * @param {number} limit - The maximum number of objects to retrieve.\n * @return {Promise<ListObjectsV2CommandOutput>} - A promise that resolves to the response containing the list of objects and metadata.\n */\n private async listChunk(\n options: ListRequestOptions,\n continuationToken: string | undefined,\n limit: number,\n ): Promise<ListObjectsV2CommandOutput> {\n const command = new ListObjectsV2Command({\n Bucket: this.bucketName,\n ContinuationToken: continuationToken || options.pagination,\n Prefix: options.prefix,\n MaxKeys: limit,\n });\n\n return this.s3Client.send(command);\n }\n\n /**\n * Retrieves a list of contents from the S3 bucket based on the provided options.\n *\n * @param {ListRequestOptions} options - The options for listing the contents.\n * @return {Promise<{ contents: unknown[]; nextContinuationToken?: string }>} - A promise that resolves to an object containing the list of contents and an optional next continuation token.\n */\n private async listContents(\n options: ListRequestOptions,\n ): Promise<{ contents: unknown[]; nextContinuationToken?: string }> {\n let responseContents: any[] = [];\n let continuationToken: string | undefined = undefined;\n const limit = options.limit ?? 1000;\n let continueListing = true;\n while (continueListing) {\n const listChunkLimit = limit - responseContents.length;\n const response = await this.listChunk(\n options,\n continuationToken,\n listChunkLimit,\n );\n continuationToken = response.NextContinuationToken;\n responseContents = responseContents.concat(response.Contents ?? []);\n\n if (responseContents.length >= limit || !continuationToken) {\n continueListing = false;\n }\n }\n\n return {\n contents: responseContents,\n nextContinuationToken: continuationToken,\n };\n }\n\n /**\n * Lists objects in the S3 bucket with pagination.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to a paginated list of object keys.\n */\n async list(options: ListRequestOptions): Promise<ListResponse> {\n let items: ListResponseItem[] = [];\n const response = await this.listContents(options);\n\n items = response.contents.length\n ? listResponseContentsToListResponseItems(response.contents)\n : [];\n\n return {\n items,\n pagination: response.nextContinuationToken ?? null,\n count: items.length,\n };\n }\n\n /**\n * Lists all objects in the S3 bucket.\n * @param options - The options for listing objects.\n * @returns A promise that resolves to list of object keys.\n */\n\n async listAll(options: ListRequestOptions): Promise<ListResponse> {\n let allItems: ListResponseItem[] = [];\n let pagination: string | undefined = undefined;\n\n do {\n const response: ListResponse = await this.list({\n ...options,\n pagination,\n });\n\n if (response.items?.length)\n allItems = [...allItems, ...response.items];\n\n pagination =\n response.pagination === null ? undefined : response.pagination;\n } while (pagination);\n\n return { items: allItems, count: allItems.length };\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getHeadObject(key: string): Promise<GetObjectResponse> {\n const command = new HeadObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Retrieves an object from the S3 bucket.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the content of the file.\n */\n async getObject(key: string): Promise<GetObjectResponse> {\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n const response = await this.s3Client.send(command);\n return s3ObjectToObjectResponse(response);\n }\n\n /**\n * Generates a signed URL for accessing an object in the S3 bucket.\n * @param key - The key of the object.\n * @param expiresInMinutes - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n getDownloadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const expiresIn = expiresInMinutes * 60;\n const command = new GetObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n return getSignedUrl(this.s3Client, command, { expiresIn });\n }\n\n /**\n * Retrieves a signed URL for uploading an object to the S3 bucket.\n *\n * @param {string} key - The key of the object to be uploaded.\n * @param {number} [expiresInMinutes=60] - The number of minutes the signed URL should be valid for. Defaults to 60 minutes.\n * @returns A promise that resolves to the signed URL.\n */\n async getUploadUrl(\n key: string,\n expiresInMinutes: number = 60,\n ): Promise<GetUploadUrlResponse> {\n const expiresIn = expiresInMinutes * 60;\n\n const putObjectCommandParams: PutObjectAclCommandInput = {\n Bucket: process.env.UPLOAD_BUCKET_NAME,\n Key: key,\n ACL: 'private',\n };\n\n const command = new PutObjectCommand(putObjectCommandParams);\n\n const signedUrl = await getSignedUrl(this.s3Client, command, {\n expiresIn,\n });\n\n return {\n signedUrl,\n key: `https://${process.env.UPLOAD_BUCKET_NAME}.s3.${process.env.AWS_DEFAULT_REGION}.amazonaws.com/${key}`,\n };\n }\n\n /**\n * Uploads an object to the S3 bucket.\n * @param key - The key of the object to upload.\n * @param body - The content of the object to upload.\n * @param metadata - Optional metadata to associate with the object.\n * @returns A promise that resolves to the response containing the key of the uploaded object.\n */\n async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n ): Promise<UploadResponse> {\n const command = new PutObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n Body: body,\n Metadata: metadata,\n });\n await this.s3Client.send(command);\n return { key };\n }\n\n /**\n * Creates a writable stream for uploading a file to the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {CreateUploadWriteStreamResponse} An object containing the key of the uploaded object, the writable stream, and a promise that resolves when the upload is complete.\n */\n createUploadWriteStream(key: string): CreateUploadWriteStreamResponse {\n const streamPassThrough = new stream.PassThrough();\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: streamPassThrough,\n };\n\n const upload = new Upload({\n client: this.s3Client,\n params,\n queueSize: 5,\n partSize: 8 * 1024 * 1024,\n });\n\n return {\n key,\n stream: streamPassThrough,\n promise: upload.done(),\n };\n }\n\n /**\n * Deletes an object from the S3 bucket.\n * @param key - The key of the object to delete.\n * @returns A promise that resolves to true if the object was deleted successfully.\n */\n async delete(key: string): Promise<boolean> {\n const command = new DeleteObjectCommand({\n Bucket: this.bucketName,\n Key: key,\n });\n await this.s3Client.send(command);\n return true;\n }\n\n async getHeadBucket(): Promise<HeadBucketResponse> {\n try {\n const command = new HeadBucketCommand({\n Bucket: this.bucketName,\n });\n return this.s3Client.send(command);\n } catch (error) {\n throw new Error(\n 'Error in S3 getHeadContainer. bucketName: ' +\n this.bucketName +\n ' Error: ' +\n error,\n );\n }\n }\n\n /**\n * Generates an upload ID for multipart upload in the S3 bucket.\n *\n * @param {string} key - The key of the object to upload.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n * @throws {Error} If no upload ID was generated.\n */\n async generateUploadIdMultipart(key: string): Promise<string> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n };\n const response = await this.s3.createMultipartUpload(params);\n if (!response?.UploadId) throw new Error('No upload ID was generated');\n return response.UploadId;\n }\n\n async listMultipartUploadsForBucket(): Promise<ListMultipartUploadsResponse> {\n const params = {\n Bucket: this.bucketName,\n };\n const response = await this.s3.listMultipartUploads(params);\n return {\n bucketName: this.bucketName,\n uploads: response.Uploads\n ? response.Uploads.map((upload) => ({\n uploadId: upload.UploadId || '',\n key: upload.Key || '',\n initiator: upload?.Initiator?.ID || '',\n owner: upload?.Owner?.ID || '',\n storageClass: upload.StorageClass || '',\n initiated: upload.Initiated || '',\n }))\n : [],\n };\n }\n\n /**\n * Retrieves the list of parts for a multipart upload.\n *\n * @param {string} key - The key of the object being uploaded.\n * @param {string} uploadId - The ID of the multipart upload.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of parts for the multipart upload.\n */\n async listMultipartUploadsForKey(\n key: string,\n uploadId: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n const response = await this.s3.listParts(params);\n\n const parts = response.Parts\n ? response.Parts.map((part) => ({\n PartNumber: part.PartNumber!,\n LastModified: part.LastModified!,\n ETag: part.ETag!,\n Size: part.Size!,\n }))\n : [];\n\n return {\n Parts: parts,\n };\n }\n\n async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n ): Promise<string> {\n const upId = uploadId || (await this.generateUploadIdMultipart(key));\n const params = {\n Bucket: this.bucketName,\n Key: key,\n Body: file,\n PartNumber: partNumber,\n UploadId: upId,\n };\n await this.s3.uploadPart(params);\n return upId;\n }\n\n async completeMultipartUpload(\n key: string,\n uploadId: string,\n ): Promise<void> {\n const partsResponse = await this.listMultipartUploadsForKey(\n key,\n uploadId,\n );\n const partsList =\n partsResponse?.Parts &&\n partsResponse.Parts.map(\n // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-unused-vars\n ({ Size, LastModified, ...partList }) => partList,\n );\n const completeMultipartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n MultipartUpload: {\n Parts: partsList,\n },\n };\n await this.s3.completeMultipartUpload(completeMultipartParams);\n }\n\n async abortMultipartUpload(key: string, uploadId: string): Promise<void> {\n const params = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n };\n await this.s3.abortMultipartUpload(params);\n }\n\n async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes: number = 60,\n ): Promise<string> {\n const uploadPartParams = {\n Bucket: this.bucketName,\n Key: key,\n UploadId: uploadId,\n PartNumber: parseInt(partNumber, 10),\n };\n const expiresIn = expiresInMinutes * 60;\n const presignedUrl = await getSignedUrl(\n this.s3Client,\n new UploadPartCommand(uploadPartParams),\n { expiresIn },\n );\n\n return presignedUrl;\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { GetObjectCommandOutput } from '@aws-sdk/client-s3';\nimport { GetObjectResponse, ListResponseItem } from '../../../types';\nimport { Readable } from 'stream';\n\n/**\n * Converts an array of S3 response contents into an array of ListResponseItem objects.\n *\n * @param {any[]} responseContents - The array of S3 response contents.\n * @return {ListResponseItem[]} The array of ListResponseItem objects.\n */\nexport function listResponseContentsToListResponseItems(\n responseContents: any[],\n): ListResponseItem[] {\n return responseContents.map((responseContent) => {\n return {\n key: responseContent.Key,\n lastModified: new Date(responseContent.LastModified),\n size: responseContent.Size,\n eTag: responseContent.ETag,\n };\n });\n}\n\n/**\n * Converts an S3 object response to a standardized object response.\n *\n * @param {GetObjectCommandOutput} s3Object - The S3 object response to convert.\n * @return {GetObjectResponse} The converted object response.\n */\nexport function s3ObjectToObjectResponse(\n s3Object: GetObjectCommandOutput,\n): GetObjectResponse {\n return {\n body: s3Object.Body as Readable,\n metadata: s3Object.Metadata,\n contentType: s3Object.ContentType,\n contentLength: s3Object.ContentLength as number,\n contentEncoding: s3Object.ContentEncoding,\n cacheControl: s3Object.CacheControl,\n contentDisposition: s3Object.ContentDisposition,\n contentLanguage: s3Object.ContentLanguage,\n eTag: s3Object.ETag,\n lastModified: s3Object.LastModified,\n };\n}\n","export var HttpAuthLocation;\n(function (HttpAuthLocation) {\n HttpAuthLocation[\"HEADER\"] = \"header\";\n HttpAuthLocation[\"QUERY\"] = \"query\";\n})(HttpAuthLocation || (HttpAuthLocation = {}));\n","export var HttpApiKeyAuthLocation;\n(function (HttpApiKeyAuthLocation) {\n HttpApiKeyAuthLocation[\"HEADER\"] = \"header\";\n HttpApiKeyAuthLocation[\"QUERY\"] = \"query\";\n})(HttpApiKeyAuthLocation || (HttpApiKeyAuthLocation = {}));\n","export var EndpointURLScheme;\n(function (EndpointURLScheme) {\n EndpointURLScheme[\"HTTP\"] = \"http\";\n EndpointURLScheme[\"HTTPS\"] = \"https\";\n})(EndpointURLScheme || (EndpointURLScheme = {}));\n","export var AlgorithmId;\n(function (AlgorithmId) {\n AlgorithmId[\"MD5\"] = \"md5\";\n AlgorithmId[\"CRC32\"] = \"crc32\";\n AlgorithmId[\"CRC32C\"] = \"crc32c\";\n AlgorithmId[\"SHA1\"] = \"sha1\";\n AlgorithmId[\"SHA256\"] = \"sha256\";\n})(AlgorithmId || (AlgorithmId = {}));\nexport const getChecksumConfiguration = (runtimeConfig) => {\n const checksumAlgorithms = [];\n if (runtimeConfig.sha256 !== undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.SHA256,\n checksumConstructor: () => runtimeConfig.sha256,\n });\n }\n if (runtimeConfig.md5 != undefined) {\n checksumAlgorithms.push({\n algorithmId: () => AlgorithmId.MD5,\n checksumConstructor: () => runtimeConfig.md5,\n });\n }\n return {\n _checksumAlgorithms: checksumAlgorithms,\n addChecksumAlgorithm(algo) {\n this._checksumAlgorithms.push(algo);\n },\n checksumAlgorithms() {\n return this._checksumAlgorithms;\n },\n };\n};\nexport const resolveChecksumRuntimeConfig = (clientConfig) => {\n const runtimeConfig = {};\n clientConfig.checksumAlgorithms().forEach((checksumAlgorithm) => {\n runtimeConfig[checksumAlgorithm.algorithmId()] = checksumAlgorithm.checksumConstructor();\n });\n return runtimeConfig;\n};\n","export var FieldPosition;\n(function (FieldPosition) {\n FieldPosition[FieldPosition[\"HEADER\"] = 0] = \"HEADER\";\n FieldPosition[FieldPosition[\"TRAILER\"] = 1] = \"TRAILER\";\n})(FieldPosition || (FieldPosition = {}));\n","export var IniSectionType;\n(function (IniSectionType) {\n IniSectionType[\"PROFILE\"] = \"profile\";\n IniSectionType[\"SSO_SESSION\"] = \"sso-session\";\n IniSectionType[\"SERVICES\"] = \"services\";\n})(IniSectionType || (IniSectionType = {}));\n","export var RequestHandlerProtocol;\n(function (RequestHandlerProtocol) {\n RequestHandlerProtocol[\"HTTP_0_9\"] = \"http/0.9\";\n RequestHandlerProtocol[\"HTTP_1_0\"] = \"http/1.0\";\n RequestHandlerProtocol[\"TDS_8_0\"] = \"tds/8.0\";\n})(RequestHandlerProtocol || (RequestHandlerProtocol = {}));\n","export class HttpResponse {\n constructor(options) {\n this.statusCode = options.statusCode;\n this.reason = options.reason;\n this.headers = options.headers || {};\n this.body = options.body;\n }\n static isInstance(response) {\n if (!response)\n return false;\n const resp = response;\n return typeof resp.statusCode === \"number\" && typeof resp.headers === \"object\";\n }\n}\n","export const escapeUri = (uri) => encodeURIComponent(uri).replace(/[!'()*]/g, hexEncode);\nconst hexEncode = (c) => `%${c.charCodeAt(0).toString(16).toUpperCase()}`;\n","import { escapeUri } from \"@smithy/util-uri-escape\";\nexport function buildQueryString(query) {\n const parts = [];\n for (let key of Object.keys(query).sort()) {\n const value = query[key];\n key = escapeUri(key);\n if (Array.isArray(value)) {\n for (let i = 0, iLen = value.length; i < iLen; i++) {\n parts.push(`${key}=${escapeUri(value[i])}`);\n }\n }\n else {\n let qsEntry = key;\n if (value || typeof value === \"string\") {\n qsEntry += `=${escapeUri(value)}`;\n }\n parts.push(qsEntry);\n }\n }\n return parts.join(\"&\");\n}\n","import { HttpResponse } from \"@smithy/protocol-http\";\nimport { buildQueryString } from \"@smithy/querystring-builder\";\nimport { Agent as hAgent, request as hRequest } from \"http\";\nimport { Agent as hsAgent, request as hsRequest } from \"https\";\nimport { NODEJS_TIMEOUT_ERROR_CODES } from \"./constants\";\nimport { getTransformedHeaders } from \"./get-transformed-headers\";\nimport { setConnectionTimeout } from \"./set-connection-timeout\";\nimport { setSocketKeepAlive } from \"./set-socket-keep-alive\";\nimport { setSocketTimeout } from \"./set-socket-timeout\";\nimport { writeRequestBody } from \"./write-request-body\";\nexport const DEFAULT_REQUEST_TIMEOUT = 0;\nexport class NodeHttpHandler {\n static create(instanceOrOptions) {\n if (typeof instanceOrOptions?.handle === \"function\") {\n return instanceOrOptions;\n }\n return new NodeHttpHandler(instanceOrOptions);\n }\n static checkSocketUsage(agent, socketWarningTimestamp) {\n const { sockets, requests, maxSockets } = agent;\n if (typeof maxSockets !== \"number\" || maxSockets === Infinity) {\n return socketWarningTimestamp;\n }\n const interval = 15000;\n if (Date.now() - interval < socketWarningTimestamp) {\n return socketWarningTimestamp;\n }\n if (sockets && requests) {\n for (const origin in sockets) {\n const socketsInUse = sockets[origin]?.length ?? 0;\n const requestsEnqueued = requests[origin]?.length ?? 0;\n if (socketsInUse >= maxSockets && requestsEnqueued >= 2 * maxSockets) {\n console.warn(\"@smithy/node-http-handler:WARN\", `socket usage at capacity=${socketsInUse} and ${requestsEnqueued} additional requests are enqueued.`, \"See https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-configuring-maxsockets.html\", \"or increase socketAcquisitionWarningTimeout=(millis) in the NodeHttpHandler config.\");\n return Date.now();\n }\n }\n }\n return socketWarningTimestamp;\n }\n constructor(options) {\n this.socketWarningTimestamp = 0;\n this.metadata = { handlerProtocol: \"http/1.1\" };\n this.configProvider = new Promise((resolve, reject) => {\n if (typeof options === \"function\") {\n options()\n .then((_options) => {\n resolve(this.resolveDefaultConfig(_options));\n })\n .catch(reject);\n }\n else {\n resolve(this.resolveDefaultConfig(options));\n }\n });\n }\n resolveDefaultConfig(options) {\n const { requestTimeout, connectionTimeout, socketTimeout, httpAgent, httpsAgent } = options || {};\n const keepAlive = true;\n const maxSockets = 50;\n return {\n connectionTimeout,\n requestTimeout: requestTimeout ?? socketTimeout,\n httpAgent: (() => {\n if (httpAgent instanceof hAgent || typeof httpAgent?.destroy === \"function\") {\n return httpAgent;\n }\n return new hAgent({ keepAlive, maxSockets, ...httpAgent });\n })(),\n httpsAgent: (() => {\n if (httpsAgent instanceof hsAgent || typeof httpsAgent?.destroy === \"function\") {\n return httpsAgent;\n }\n return new hsAgent({ keepAlive, maxSockets, ...httpsAgent });\n })(),\n };\n }\n destroy() {\n this.config?.httpAgent?.destroy();\n this.config?.httpsAgent?.destroy();\n }\n async handle(request, { abortSignal } = {}) {\n if (!this.config) {\n this.config = await this.configProvider;\n }\n let socketCheckTimeoutId;\n return new Promise((_resolve, _reject) => {\n let writeRequestBodyPromise = undefined;\n const resolve = async (arg) => {\n await writeRequestBodyPromise;\n clearTimeout(socketCheckTimeoutId);\n _resolve(arg);\n };\n const reject = async (arg) => {\n await writeRequestBodyPromise;\n _reject(arg);\n };\n if (!this.config) {\n throw new Error(\"Node HTTP request handler config is not resolved\");\n }\n if (abortSignal?.aborted) {\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n return;\n }\n const isSSL = request.protocol === \"https:\";\n const agent = isSSL ? this.config.httpsAgent : this.config.httpAgent;\n socketCheckTimeoutId = setTimeout(() => {\n this.socketWarningTimestamp = NodeHttpHandler.checkSocketUsage(agent, this.socketWarningTimestamp);\n }, this.config.socketAcquisitionWarningTimeout ??\n (this.config.requestTimeout ?? 2000) + (this.config.connectionTimeout ?? 1000));\n const queryString = buildQueryString(request.query || {});\n let auth = undefined;\n if (request.username != null || request.password != null) {\n const username = request.username ?? \"\";\n const password = request.password ?? \"\";\n auth = `${username}:${password}`;\n }\n let path = request.path;\n if (queryString) {\n path += `?${queryString}`;\n }\n if (request.fragment) {\n path += `#${request.fragment}`;\n }\n const nodeHttpsOptions = {\n headers: request.headers,\n host: request.hostname,\n method: request.method,\n path,\n port: request.port,\n agent,\n auth,\n };\n const requestFunc = isSSL ? hsRequest : hRequest;\n const req = requestFunc(nodeHttpsOptions, (res) => {\n const httpResponse = new HttpResponse({\n statusCode: res.statusCode || -1,\n reason: res.statusMessage,\n headers: getTransformedHeaders(res.headers),\n body: res,\n });\n resolve({ response: httpResponse });\n });\n req.on(\"error\", (err) => {\n if (NODEJS_TIMEOUT_ERROR_CODES.includes(err.code)) {\n reject(Object.assign(err, { name: \"TimeoutError\" }));\n }\n else {\n reject(err);\n }\n });\n setConnectionTimeout(req, reject, this.config.connectionTimeout);\n setSocketTimeout(req, reject, this.config.requestTimeout);\n if (abortSignal) {\n abortSignal.onabort = () => {\n req.abort();\n const abortError = new Error(\"Request aborted\");\n abortError.name = \"AbortError\";\n reject(abortError);\n };\n }\n const httpAgent = nodeHttpsOptions.agent;\n if (typeof httpAgent === \"object\" && \"keepAlive\" in httpAgent) {\n setSocketKeepAlive(req, {\n keepAlive: httpAgent.keepAlive,\n keepAliveMsecs: httpAgent.keepAliveMsecs,\n });\n }\n writeRequestBodyPromise = writeRequestBody(req, request, this.config.requestTimeout).catch(_reject);\n });\n }\n updateHttpClientConfig(key, value) {\n this.config = undefined;\n this.configProvider = this.configProvider.then((config) => {\n return {\n ...config,\n [key]: value,\n };\n });\n }\n httpHandlerConfigs() {\n return this.config ?? {};\n }\n}\n","export const NODEJS_TIMEOUT_ERROR_CODES = [\"ECONNRESET\", \"EPIPE\", \"ETIMEDOUT\"];\n","const getTransformedHeaders = (headers) => {\n const transformedHeaders = {};\n for (const name of Object.keys(headers)) {\n const headerValues = headers[name];\n transformedHeaders[name] = Array.isArray(headerValues) ? headerValues.join(\",\") : headerValues;\n }\n return transformedHeaders;\n};\nexport { getTransformedHeaders };\n","export const setConnectionTimeout = (request, reject, timeoutInMs = 0) => {\n if (!timeoutInMs) {\n return;\n }\n const timeoutId = setTimeout(() => {\n request.destroy();\n reject(Object.assign(new Error(`Socket timed out without establishing a connection within ${timeoutInMs} ms`), {\n name: \"TimeoutError\",\n }));\n }, timeoutInMs);\n request.on(\"socket\", (socket) => {\n if (socket.connecting) {\n socket.on(\"connect\", () => {\n clearTimeout(timeoutId);\n });\n }\n else {\n clearTimeout(timeoutId);\n }\n });\n};\n","export const setSocketKeepAlive = (request, { keepAlive, keepAliveMsecs }) => {\n if (keepAlive !== true) {\n return;\n }\n request.on(\"socket\", (socket) => {\n socket.setKeepAlive(keepAlive, keepAliveMsecs || 0);\n });\n};\n","export const setSocketTimeout = (request, reject, timeoutInMs = 0) => {\n request.setTimeout(timeoutInMs, () => {\n request.destroy();\n reject(Object.assign(new Error(`Connection timed out after ${timeoutInMs} ms`), { name: \"TimeoutError\" }));\n });\n};\n","import { Readable } from \"stream\";\nconst MIN_WAIT_TIME = 1000;\nexport async function writeRequestBody(httpRequest, request, maxContinueTimeoutMs = MIN_WAIT_TIME) {\n const headers = request.headers ?? {};\n const expect = headers[\"Expect\"] || headers[\"expect\"];\n let timeoutId = -1;\n let hasError = false;\n if (expect === \"100-continue\") {\n await Promise.race([\n new Promise((resolve) => {\n timeoutId = Number(setTimeout(resolve, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs)));\n }),\n new Promise((resolve) => {\n httpRequest.on(\"continue\", () => {\n clearTimeout(timeoutId);\n resolve();\n });\n httpRequest.on(\"error\", () => {\n hasError = true;\n clearTimeout(timeoutId);\n resolve();\n });\n }),\n ]);\n }\n if (!hasError) {\n writeBody(httpRequest, request.body);\n }\n}\nfunction writeBody(httpRequest, body) {\n if (body instanceof Readable) {\n body.pipe(httpRequest);\n return;\n }\n if (body) {\n if (Buffer.isBuffer(body) || typeof body === \"string\") {\n httpRequest.end(body);\n return;\n }\n const uint8 = body;\n if (typeof uint8 === \"object\" &&\n uint8.buffer &&\n typeof uint8.byteOffset === \"number\" &&\n typeof uint8.byteLength === \"number\") {\n httpRequest.end(Buffer.from(uint8.buffer, uint8.byteOffset, uint8.byteLength));\n return;\n }\n httpRequest.end(Buffer.from(body));\n return;\n }\n httpRequest.end();\n}\n","export class NodeHttp2ConnectionPool {\n constructor(sessions) {\n this.sessions = [];\n this.sessions = sessions ?? [];\n }\n poll() {\n if (this.sessions.length > 0) {\n return this.sessions.shift();\n }\n }\n offerLast(session) {\n this.sessions.push(session);\n }\n contains(session) {\n return this.sessions.includes(session);\n }\n remove(session) {\n this.sessions = this.sessions.filter((s) => s !== session);\n }\n [Symbol.iterator]() {\n return this.sessions[Symbol.iterator]();\n }\n destroy(connection) {\n for (const session of this.sessions) {\n if (session === connection) {\n if (!session.destroyed) {\n session.destroy();\n }\n }\n }\n }\n}\n","export const OBJECT_STORAGE_SERVICE_TYPES = {\n AWS_S3: 'aws_s3',\n AZURE_BLOB_STORAGE: 'azure_blob_storage',\n};\n","import { IObjectStorage } from '../interfaces';\nimport { S3StorageService, BlobStorageService } from './storage';\nimport { ObjectStorageOptions } from '../types';\nimport { OBJECT_STORAGE_SERVICE_TYPES } from '../shared/utils/constants';\n\nexport class ObjectStorageFactory {\n static async instance(\n bucketName: string,\n options?: ObjectStorageOptions,\n ): Promise<IObjectStorage> {\n const provider =\n options?.provider?.toLowerCase() ||\n process.env.OBJECT_STORAGE_SERVICE?.toLowerCase();\n switch (provider) {\n case OBJECT_STORAGE_SERVICE_TYPES.AWS_S3:\n return new S3StorageService(bucketName, options);\n case OBJECT_STORAGE_SERVICE_TYPES.AZURE_BLOB_STORAGE:\n return new BlobStorageService(bucketName);\n default:\n throw new Error(\n `Unsupported object storage provider: ${provider}`,\n );\n }\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { IObjectStorage, IGetObjectOptions } from '../interfaces';\nimport {\n ListResponse,\n FileContent,\n UploadResponse,\n GetObjectResponse,\n ListRequestOptions,\n GetUploadUrlResponse,\n CreateUploadWriteStreamResponse,\n HeadBucketResponse,\n ObjectStorageOptions,\n ListPartsMultipartUploadResponse,\n ListMultipartUploadsResponse,\n} from '../types';\nimport { ObjectStorageFactory } from '../services/objectStorageFactory.service';\n\nexport default class ObjectStorageService {\n static bucketName: string;\n static objectStorageOptions: ObjectStorageOptions;\n\n constructor(bucketName: string, options?: ObjectStorageOptions) {\n ObjectStorageService.bucketName = bucketName;\n if (options) ObjectStorageService.objectStorageOptions = options;\n }\n\n static async getObjectStorageServiceInstance(\n bucketName: string = ObjectStorageService.bucketName,\n options:\n | ObjectStorageOptions\n | undefined = ObjectStorageService.objectStorageOptions,\n ): Promise<IObjectStorage> {\n if (!bucketName)\n throw new Error('Bucket name not provided or not valid value');\n return ObjectStorageFactory.instance(bucketName, options);\n }\n\n /**\n * Retrieves a list of objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of objects.\n */\n static async list(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.list(options));\n }\n\n /**\n * Retrieves a list of all objects from the object storage service.\n *\n * @param {ListRequestOptions} options - The options to apply to the list operation.\n * @param {string} [bucketName] - The name of the bucket to list objects from. If not provided, the default bucket name will be used.\n * @return {Promise<ListResponse>} A promise that resolves to the list of all objects.\n */\n static async listAll(\n options: ListRequestOptions,\n bucketName?: string,\n ): Promise<ListResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listAll(options));\n }\n\n /**\n * Retrieves an object from the object storage service.\n *\n * @param {string} key - The key of the object to retrieve.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<GetObjectResponse>} A promise that resolves to the retrieved object.\n */\n static async getObject(\n key: string,\n bucketName?: string,\n options?: IGetObjectOptions,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getObject(key, options));\n }\n\n /**\n * Retrieves an object info (without file content) from the object storage service.\n * @param key - The key of the object to retrieve.\n * @returns A promise that resolves to the info of the file.\n */\n static async getHeadObject(\n key: string,\n bucketName?: string,\n ): Promise<GetObjectResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadObject(key));\n }\n\n /**\n * Retrieves a signed URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the signed URL.\n * @param {number} expiresInMinutes - The number of minutes until the signed URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object is stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated signed URL.\n */\n static async getDownloadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getDownloadUrl(key, expiresInMinutes));\n }\n\n /**\n * Retrieves an upload URL for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object for which to generate the upload URL.\n * @param {number} expiresInMinutes - The number of minutes until the upload URL expires.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload URL.\n */\n static async getUploadUrl(\n key: string,\n expiresInMinutes: number,\n bucketName?: string,\n ): Promise<GetUploadUrlResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getUploadUrl(key, expiresInMinutes));\n }\n\n /**\n * Uploads a file to the object storage service.\n *\n * @param {string} key - The key of the object to upload.\n * @param {FileContent} body - The content of the file to upload.\n * @param {Object} [metadata] - Optional metadata to associate with the object.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<UploadResponse>} A promise that resolves to the response of the upload operation.\n */\n static async upload(\n key: string,\n body: FileContent,\n metadata?: { [key: string]: string },\n bucketName?: string,\n ): Promise<UploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.upload(key, body, metadata));\n }\n\n /**\n * Creates an upload write stream for the specified key in the object storage service.\n *\n * @param {string} key - The key of the object to create the upload write stream for.\n * @param {string} [bucketName] - The name of the bucket where the object will be stored. If not provided, the default bucket name will be used.\n * @return {Promise<CreateUploadWriteStreamResponse>} A promise that resolves to the response of the upload operation.\n */\n static async createUploadWriteStream(\n key: string,\n bucketName?: string,\n ): Promise<CreateUploadWriteStreamResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.createUploadWriteStream(key));\n }\n\n /**\n * Deletes an object or multiple objects from the object storage service.\n *\n * @param {string | string[]} key - The key or array of keys of the objects to delete.\n * @param {string} [bucketName] - The name of the bucket where the objects are stored. If not provided, the default bucket name will be used.\n * @return {Promise<{ key: string; deleted: boolean; error?: string }[] | boolean>} A promise that resolves to an array of objects containing the key, deleted status, and an optional error message for each object deleted, or a boolean value indicating the success of the deletion.\n */\n static async delete(\n key: string | string[],\n bucketName?: string,\n ): Promise<{ key: string; deleted: boolean; error?: string }[] | boolean> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then(async (instance) => {\n if (Array.isArray(key)) {\n const deleteBlobPromises = key.map(async (blobName) => {\n try {\n await instance.delete(blobName);\n return { key: blobName, deleted: true };\n } catch (error: any) {\n return {\n key: blobName,\n deleted: false,\n error: error?.message ?? '',\n };\n }\n });\n return Promise.all(deleteBlobPromises);\n } else {\n return instance.delete(key);\n }\n });\n }\n\n /**\n * Retrieves the head bucket from the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<HeadBucketResponse>} A promise that resolves to the head bucket response.\n */\n static async getHeadBucket(\n bucketName?: string,\n ): Promise<HeadBucketResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.getHeadBucket());\n }\n\n /**\n * Generates a unique upload ID for a multipart upload.\n *\n * @param {string} key - The key of the object to upload.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A promise that resolves to the generated upload ID.\n */\n static async generateUploadIdMultipart(\n key: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.generateUploadIdMultipart(key));\n }\n\n /**\n * Retrieves a list of multipart uploads for a specified key in the object storage service.\n *\n * @param {string} key - The key of the object to retrieve uploads for.\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @param {string} [uploadId] - The upload ID to filter the results by.\n * @return {Promise<ListPartsMultipartUploadResponse>} A promise that resolves to the list of multipart uploads for the specified key.\n */\n static async listMultipartUploadsForKey(\n key: string,\n bucketName?: string,\n uploadId?: string,\n ): Promise<ListPartsMultipartUploadResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.listMultipartUploadsForKey(key, uploadId),\n );\n }\n\n /**\n * Retrieves a list of all multipart uploads for a specified bucket in the object storage service.\n *\n * @param {string} [bucketName] - The name of the bucket. If not provided, the default bucket name will be used.\n * @return {Promise<ListMultipartUploadsResponse>} A promise that resolves to the list of multipart uploads for the specified bucket.\n */\n static async listMultipartUploadsForBucket(\n bucketName?: string,\n ): Promise<ListMultipartUploadsResponse> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.listMultipartUploadsForBucket());\n }\n\n /**\n * Uploads a multipart file to the specified bucket in the object storage service.\n *\n * @param {string} key - The key of the object to upload the multipart file to.\n * @param {FileContent} file - The content of the file to upload.\n * @param {number} partNumber - The number of the part being uploaded.\n * @param {string} [uploadId] - The ID of the multipart upload.\n * @param {string} [bucketName] - The name of the bucket to upload the file to. If not provided, the default bucket name will be used.\n * @return {Promise<string>} A Promise that resolves to the base64 encoded block ID of the uploaded part.\n */\n static async uploadMultipart(\n key: string,\n file: FileContent,\n partNumber: number,\n uploadId?: string,\n bucketName?: string,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) =>\n instance.uploadMultipart(key, file, partNumber, uploadId),\n );\n }\n\n /**\n * Completes a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to complete the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to complete.\n * @param {string} [bucketName] - The name of the bucket to complete the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is completed.\n */\n static async completeMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.completeMultipartUpload(key, uploadId));\n }\n\n /**\n * Aborts a multipart upload for the specified object in the object storage service.\n *\n * @param {string} key - The key of the object to abort the multipart upload for.\n * @param {string} uploadId - The ID of the multipart upload to abort.\n * @param {string} [bucketName] - The name of the bucket to abort the multipart upload in. If not provided, the default bucket name will be used.\n * @return {Promise<void>} A Promise that resolves when the multipart upload is aborted.\n */\n static async abortMultipartUpload(\n key: string,\n uploadId: string,\n bucketName?: string,\n ): Promise<void> {\n return ObjectStorageService.getObjectStorageServiceInstance(\n bucketName,\n ).then((instance) => instance.abortMultipartUpload(key, uploadId));\n }\n\n /**\n * Retrieves a presigned URL for a specific part of a multipart upload.\n *\n * @param {string} key - The key of the object for which to generate the presigned URL.\n * @param {string} uploadId - The ID of the multipart upload.\n * @param {string} partNumber - The number of the part for which to generate the presigned URL.\n * @param {number} [expiresInMinutes] - The number of minutes until the presigned URL expires. Default is 60 minutes.\n * @return {Promise<string>} A Promise that resolves to the presigned URL for the specified part of the multipart upload.\n */\n static async getMultipartUploadPresignedUrl(\n key: string,\n uploadId: string,\n partNumber: string,\n expiresInMinutes?: number,\n ): Promise<string> {\n return ObjectStorageService.getObjectStorageServiceInstance().then(\n (instance) =>\n instance.getMultipartUploadPresignedUrl(\n key,\n uploadId,\n partNumber,\n expiresInMinutes,\n ),\n );\n }\n}\n"]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@qrvey/object-storage",
3
3
  "types": "dist/types/index.d.ts",
4
4
  "main": "dist/cjs/index.js",
5
- "version": "0.0.11-beta.2",
5
+ "version": "0.0.11-beta.3",
6
6
  "license": "MIT",
7
7
  "exports": {
8
8
  ".": {