{"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"]}