summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/S3Service.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/backend/src/core/S3Service.ts')
-rw-r--r--packages/backend/src/core/S3Service.ts38
1 files changed, 38 insertions, 0 deletions
diff --git a/packages/backend/src/core/S3Service.ts b/packages/backend/src/core/S3Service.ts
new file mode 100644
index 0000000000..9549e19990
--- /dev/null
+++ b/packages/backend/src/core/S3Service.ts
@@ -0,0 +1,38 @@
+import { URL } from 'node:url';
+import { Inject, Injectable } from '@nestjs/common';
+import S3 from 'aws-sdk/clients/s3.js';
+import { DI } from '@/di-symbols.js';
+import { Config } from '@/config.js';
+import type { Meta } from '@/models/entities/Meta.js';
+import { HttpRequestService } from './HttpRequestService.js';
+
+@Injectable()
+export class S3Service {
+ constructor(
+ @Inject(DI.config)
+ private config: Config,
+
+ private httpRequestService: HttpRequestService,
+ ) {
+ }
+
+ public getS3(meta: Meta) {
+ const u = meta.objectStorageEndpoint != null
+ ? `${meta.objectStorageUseSSL ? 'https://' : 'http://'}${meta.objectStorageEndpoint}`
+ : `${meta.objectStorageUseSSL ? 'https://' : 'http://'}example.net`;
+
+ return new S3({
+ endpoint: meta.objectStorageEndpoint ?? undefined,
+ accessKeyId: meta.objectStorageAccessKey!,
+ secretAccessKey: meta.objectStorageSecretKey!,
+ region: meta.objectStorageRegion ?? undefined,
+ sslEnabled: meta.objectStorageUseSSL,
+ s3ForcePathStyle: !meta.objectStorageEndpoint // AWS with endPoint omitted
+ ? false
+ : meta.objectStorageS3ForcePathStyle,
+ httpOptions: {
+ agent: this.httpRequestService.getAgentByUrl(new URL(u), !meta.objectStorageUseProxy),
+ },
+ });
+ }
+}