feat(multipart): Add multipart upload support with MultipartUploadManager and controller integration

This commit is contained in:
2025-11-23 22:41:46 +00:00
parent 0d4837184f
commit 74b81d7ba8
6 changed files with 201 additions and 7 deletions

View File

@@ -5,6 +5,7 @@ import { S3Context } from './context.js';
import { FilesystemStore } from './filesystem-store.js';
import { S3Error } from './s3-error.js';
import { Logger } from './logger.js';
import { MultipartUploadManager } from './multipart-manager.js';
import { ServiceController } from '../controllers/service.controller.js';
import { BucketController } from '../controllers/bucket.controller.js';
import { ObjectController } from '../controllers/object.controller.js';
@@ -28,6 +29,7 @@ export class Smarts3Server {
private router: S3Router;
private middlewares: MiddlewareStack;
public store: FilesystemStore; // Made public for direct access from Smarts3 class
public multipart: MultipartUploadManager; // Made public for controller access
private options: Required<Omit<ISmarts3ServerOptions, 'config'>>;
private config: Required<ISmarts3Config>;
private logger: Logger;
@@ -80,6 +82,7 @@ export class Smarts3Server {
this.logger = new Logger(this.config.logging);
this.store = new FilesystemStore(this.options.directory);
this.multipart = new MultipartUploadManager(this.options.directory);
this.router = new S3Router();
this.middlewares = new MiddlewareStack();
@@ -220,6 +223,7 @@ export class Smarts3Server {
// Object level (/:bucket/:key*)
this.router.put('/:bucket/:key*', ObjectController.putObject);
this.router.post('/:bucket/:key*', ObjectController.postObject); // For multipart operations
this.router.get('/:bucket/:key*', ObjectController.getObject);
this.router.head('/:bucket/:key*', ObjectController.headObject);
this.router.delete('/:bucket/:key*', ObjectController.deleteObject);
@@ -232,7 +236,7 @@ export class Smarts3Server {
req: plugins.http.IncomingMessage,
res: plugins.http.ServerResponse
): Promise<void> {
const context = new S3Context(req, res, this.store);
const context = new S3Context(req, res, this.store, this.multipart);
try {
// Execute middleware stack
@@ -290,6 +294,9 @@ export class Smarts3Server {
// Initialize store
await this.store.initialize();
// Initialize multipart upload manager
await this.multipart.initialize();
// Clean slate if requested
if (this.options.cleanSlate) {
await this.store.reset();