@uploadx/core
Version:
Node.js resumable upload middleware
86 lines (85 loc) • 3.45 kB
TypeScript
import { EventEmitter } from 'events';
import { BaseStorage, DiskStorageOptions, UploadList, UploadxEventType, UploadxFile, UserIdentifier } from '../storages';
import { IncomingMessage, ResponseBodyType, ServerResponse, UploadxResponse } from '../types';
import { ErrorResponses, Logger, UploadxError } from '../utils';
import { Cors } from './cors';
type Handlers = 'delete' | 'get' | 'head' | 'options' | 'patch' | 'post' | 'put';
export type AsyncHandler = (req: IncomingMessage, res: ServerResponse) => Promise<any>;
export type MethodHandler = {
[h in Handlers]?: AsyncHandler;
};
type ReqEvent = {
request: Pick<IncomingMessage, 'url' | 'headers' | 'method'>;
};
export type UploadxEvent<TFile extends UploadxFile> = TFile & ReqEvent;
export type UploadxErrorEvent = UploadxError & ReqEvent;
export interface BaseHandler<TFile extends UploadxFile> extends EventEmitter {
on(event: 'error', listener: (error: UploadxErrorEvent) => void): this;
on(event: UploadxEventType, listener: (payload: UploadxEvent<TFile>) => void): this;
off(event: UploadxEventType, listener: (payload: UploadxEvent<TFile>) => void): this;
off(event: 'error', listener: (error: UploadxErrorEvent) => void): this;
emit(event: UploadxEventType, payload: UploadxEvent<TFile>): boolean;
emit(event: 'error', error: UploadxErrorEvent): boolean;
}
export type UploadxOptions<TFile extends UploadxFile> = {
storage: BaseStorage<TFile>;
userIdentifier?: UserIdentifier;
} | DiskStorageOptions;
export declare abstract class BaseHandler<TFile extends UploadxFile> extends EventEmitter implements MethodHandler {
/**
* Limiting enabled http method handlers
* @example
* ```ts
* Uploadx.methods = ['post', 'put', 'delete'];
* app.use('/upload', uploadx(opts));
* ```
*/
static methods: Handlers[];
cors: Cors;
responseType: ResponseBodyType;
storage: BaseStorage<TFile>;
registeredHandlers: Map<string, AsyncHandler>;
logger: Logger;
protected _errorResponses: ErrorResponses;
constructor(config?: UploadxOptions<TFile>);
/**
* Override error responses
* @example
* ```ts
* const uploadx = new Uploadx({ storage });
* uploadx.errorResponses = {
* FileNotFound: [404, { message: 'Not Found!' }]
* }
* ```
*/
set errorResponses(value: Partial<ErrorResponses>);
compose(): void;
assembleErrors(customErrors?: {}): void;
handle: (req: IncomingMessage, res: ServerResponse) => void;
upload: (req: IncomingMessage, res: ServerResponse, next?: () => void) => void;
getUserId: UserIdentifier;
options(req: IncomingMessage, res: ServerResponse): Promise<TFile>;
/**
* Returns user uploads list
*/
get(req: IncomingMessage, res: ServerResponse): Promise<UploadList>;
/**
* Make response
*/
send(res: ServerResponse, { statusCode, headers, body }: UploadxResponse): void;
/**
* Send Error to client
*/
sendError(res: ServerResponse, error: Error): void;
/**
* Get id from request
*/
getId(req: IncomingMessage): string;
getAndVerifyId(req: IncomingMessage, res: ServerResponse): Promise<string>;
/**
* Build file url from request
*/
buildFileUrl(req: IncomingMessage, file: TFile): string;
protected finish(req: IncomingMessage, res: ServerResponse, response: UploadxResponse): void;
}
export {};