From 0593d4d86a48b47d54f306511f9054f2d61d222f Mon Sep 17 00:00:00 2001 From: undefined Date: Sun, 9 Oct 2022 13:17:39 +0800 Subject: [PATCH] core: s3: use lib-storage --- packages/hydrooj/package.json | 3 ++- packages/hydrooj/src/service/storage.ts | 25 +++++++++++++++++++------ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/hydrooj/package.json b/packages/hydrooj/package.json index cdb57e3f6..8ac025180 100644 --- a/packages/hydrooj/package.json +++ b/packages/hydrooj/package.json @@ -1,6 +1,6 @@ { "name": "hydrooj", - "version": "4.0.12", + "version": "4.0.13", "bin": "bin/hydrooj.js", "main": "src/plugin-api", "module": "src/plugin-api", @@ -13,6 +13,7 @@ "preferUnplugged": true, "dependencies": { "@aws-sdk/client-s3": "^3.186.0", + "@aws-sdk/lib-storage": "^3.186.0", "@aws-sdk/middleware-endpoint": "^3.186.0", "@aws-sdk/s3-presigned-post": "^3.186.0", "@aws-sdk/s3-request-presigner": "^3.186.0", diff --git a/packages/hydrooj/src/service/storage.ts b/packages/hydrooj/src/service/storage.ts index 6dbb42ae9..6414b2113 100644 --- a/packages/hydrooj/src/service/storage.ts +++ b/packages/hydrooj/src/service/storage.ts @@ -5,6 +5,7 @@ import { CopyObjectCommand, DeleteObjectCommand, DeleteObjectsCommand, GetObjectCommand, HeadObjectCommand, PutObjectCommand, S3Client, } from '@aws-sdk/client-s3'; +import { Upload } from '@aws-sdk/lib-storage'; import { createPresignedPost } from '@aws-sdk/s3-presigned-post'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; import { @@ -114,12 +115,24 @@ class RemoteStorageService { async put(target: string, file: string | Buffer | Readable, meta: Record = {}) { if (target.includes('..') || target.includes('//')) throw new Error('Invalid path'); if (typeof file === 'string') file = createReadStream(file); - await this.client.send(new PutObjectCommand({ - Bucket: this.opts.bucket, - Body: file, - Key: target, - Metadata: meta, - })); + if (file instanceof Buffer && file.byteLength <= 5 * 1024 * 1024) { + await this.client.send(new PutObjectCommand({ + Bucket: this.opts.bucket, + Body: file, + Key: target, + Metadata: meta, + })); + } else { + const upload = new Upload({ + client: this.client, + params: { Bucket: this.opts.bucket, Key: target, Body: file }, + tags: [], + queueSize: 4, + partSize: 1024 * 1024 * 5, + leavePartsOnError: false, + }); + await upload.done(); + } } async get(target: string, path?: string) {