import { S3Client } from '@aws-sdk/client-s3' import { logger } from '@server/helpers/logger' import { CONFIG } from '@server/initializers/config' import { lTags } from './logger' let endpointParsed: URL function getEndpointParsed () { if (endpointParsed) return endpointParsed endpointParsed = new URL(getEndpoint()) return endpointParsed } let s3Client: S3Client function getClient () { if (s3Client) return s3Client const OBJECT_STORAGE = CONFIG.OBJECT_STORAGE s3Client = new S3Client({ endpoint: getEndpoint(), region: OBJECT_STORAGE.REGION, credentials: OBJECT_STORAGE.CREDENTIALS.ACCESS_KEY_ID ? { accessKeyId: OBJECT_STORAGE.CREDENTIALS.ACCESS_KEY_ID, secretAccessKey: OBJECT_STORAGE.CREDENTIALS.SECRET_ACCESS_KEY } : undefined }) // FIXME: https://github.com/aws/aws-sdk-js-v3/issues/2445 workaround s3Client.middlewareStack.add( (next, _context) => (args: any) => { if (typeof args.request?.body === 'string' && args.request.body.includes('CompletedMultipartUpload')) { args.request.body = args.request.body.replace(/CompletedMultipartUpload/g, 'CompleteMultipartUpload') } return next(args) }, { step: 'build', priority: 'high' } ) logger.info('Initialized S3 client %s with region %s.', getEndpoint(), OBJECT_STORAGE.REGION, lTags()) return s3Client } // --------------------------------------------------------------------------- export { getEndpointParsed, getClient } // --------------------------------------------------------------------------- let endpoint: string function getEndpoint () { if (endpoint) return endpoint const endpointConfig = CONFIG.OBJECT_STORAGE.ENDPOINT endpoint = endpointConfig.startsWith('http://') || endpointConfig.startsWith('https://') ? CONFIG.OBJECT_STORAGE.ENDPOINT : 'https://' + CONFIG.OBJECT_STORAGE.ENDPOINT return endpoint }