@lenne.tech/nest-server 11.7.3 → 11.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/core/common/interfaces/server-options.interface.d.ts +22 -0
  2. package/dist/core/modules/file/core-file.controller.d.ts +1 -0
  3. package/dist/core/modules/file/core-file.controller.js +22 -0
  4. package/dist/core/modules/file/core-file.controller.js.map +1 -1
  5. package/dist/core/modules/tus/core-tus.controller.d.ts +9 -0
  6. package/dist/core/modules/tus/core-tus.controller.js +85 -0
  7. package/dist/core/modules/tus/core-tus.controller.js.map +1 -0
  8. package/dist/core/modules/tus/core-tus.service.d.ts +30 -0
  9. package/dist/core/modules/tus/core-tus.service.js +284 -0
  10. package/dist/core/modules/tus/core-tus.service.js.map +1 -0
  11. package/dist/core/modules/tus/index.d.ts +4 -0
  12. package/dist/core/modules/tus/index.js +21 -0
  13. package/dist/core/modules/tus/index.js.map +1 -0
  14. package/dist/core/modules/tus/interfaces/tus-config.interface.d.ts +10 -0
  15. package/dist/core/modules/tus/interfaces/tus-config.interface.js +59 -0
  16. package/dist/core/modules/tus/interfaces/tus-config.interface.js.map +1 -0
  17. package/dist/core/modules/tus/tus.module.d.ts +21 -0
  18. package/dist/core/modules/tus/tus.module.js +99 -0
  19. package/dist/core/modules/tus/tus.module.js.map +1 -0
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.js +1 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/server/modules/file/file.controller.d.ts +5 -7
  24. package/dist/server/modules/file/file.controller.js +3 -31
  25. package/dist/server/modules/file/file.controller.js.map +1 -1
  26. package/dist/server/server.module.js +3 -1
  27. package/dist/server/server.module.js.map +1 -1
  28. package/dist/tsconfig.build.tsbuildinfo +1 -1
  29. package/package.json +4 -1
  30. package/src/core/common/interfaces/server-options.interface.ts +154 -0
  31. package/src/core/modules/file/README.md +165 -0
  32. package/src/core/modules/file/core-file.controller.ts +27 -1
  33. package/src/core/modules/tus/INTEGRATION-CHECKLIST.md +176 -0
  34. package/src/core/modules/tus/README.md +439 -0
  35. package/src/core/modules/tus/core-tus.controller.ts +88 -0
  36. package/src/core/modules/tus/core-tus.service.ts +424 -0
  37. package/src/core/modules/tus/index.ts +5 -0
  38. package/src/core/modules/tus/interfaces/tus-config.interface.ts +107 -0
  39. package/src/core/modules/tus/tus.module.ts +187 -0
  40. package/src/index.ts +6 -0
  41. package/src/server/modules/file/file.controller.ts +14 -34
  42. package/src/server/server.module.ts +5 -1
@@ -195,4 +195,26 @@ export interface IServerOptions {
195
195
  engine?: string;
196
196
  path?: string;
197
197
  };
198
+ tus?: boolean | ITusConfig;
199
+ }
200
+ export interface ITusConfig {
201
+ allowedHeaders?: string[];
202
+ allowedTypes?: string[];
203
+ checksum?: boolean;
204
+ concatenation?: boolean;
205
+ creation?: boolean | ITusCreationConfig;
206
+ creationWithUpload?: boolean;
207
+ enabled?: boolean;
208
+ expiration?: boolean | ITusExpirationConfig;
209
+ maxSize?: number;
210
+ path?: string;
211
+ termination?: boolean;
212
+ uploadDir?: string;
213
+ }
214
+ export interface ITusCreationConfig {
215
+ enabled?: boolean;
216
+ }
217
+ export interface ITusExpirationConfig {
218
+ enabled?: boolean;
219
+ expiresIn?: string;
198
220
  }
@@ -3,5 +3,6 @@ import { CoreFileService } from './core-file.service';
3
3
  export declare abstract class CoreFileController {
4
4
  protected fileService: CoreFileService;
5
5
  protected constructor(fileService: CoreFileService);
6
+ getFileById(id: string, res: Response): Promise<Response<any, Record<string, any>>>;
6
7
  getFile(filename: string, res: Response): Promise<Response<any, Record<string, any>>>;
7
8
  }
@@ -21,6 +21,19 @@ let CoreFileController = class CoreFileController {
21
21
  constructor(fileService) {
22
22
  this.fileService = fileService;
23
23
  }
24
+ async getFileById(id, res) {
25
+ if (!id) {
26
+ throw new common_1.BadRequestException('Missing file ID for download');
27
+ }
28
+ const file = await this.fileService.getFileInfo(id);
29
+ if (!file) {
30
+ throw new common_1.NotFoundException('File not found');
31
+ }
32
+ const filestream = await this.fileService.getFileStream(id);
33
+ res.header('Content-Type', file.contentType || 'application/octet-stream');
34
+ res.header('Content-Disposition', `attachment; filename=${file.filename}`);
35
+ return filestream.pipe(res);
36
+ }
24
37
  async getFile(filename, res) {
25
38
  if (!filename) {
26
39
  throw new common_1.BadRequestException('Missing filename for download');
@@ -36,6 +49,15 @@ let CoreFileController = class CoreFileController {
36
49
  }
37
50
  };
38
51
  exports.CoreFileController = CoreFileController;
52
+ __decorate([
53
+ (0, common_1.Get)('id/:id'),
54
+ (0, roles_decorator_1.Roles)(role_enum_1.RoleEnum.S_EVERYONE),
55
+ __param(0, (0, common_1.Param)('id')),
56
+ __param(1, (0, common_1.Res)()),
57
+ __metadata("design:type", Function),
58
+ __metadata("design:paramtypes", [String, Object]),
59
+ __metadata("design:returntype", Promise)
60
+ ], CoreFileController.prototype, "getFileById", null);
39
61
  __decorate([
40
62
  (0, common_1.Get)(':filename'),
41
63
  (0, roles_decorator_1.Roles)(role_enum_1.RoleEnum.S_EVERYONE),
@@ -1 +1 @@
1
- {"version":3,"file":"core-file.controller.js","sourceRoot":"","sources":["../../../../src/core/modules/file/core-file.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAqG;AAGrG,6EAAgE;AAChE,4DAAwD;AACxD,2DAAsD;AAO/C,IAAe,kBAAkB,GAAjC,MAAe,kBAAkB;IAItC,YAAgC,WAA4B;QAA5B,gBAAW,GAAX,WAAW,CAAiB;IAAG,CAAC;IAO1D,AAAN,KAAK,CAAC,OAAO,CAAoB,QAAgB,EAAS,GAAa;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,4BAAmB,CAAC,+BAA+B,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,0BAAiB,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC;QAC3E,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;CACF,CAAA;AAzBqB,gDAAkB;AAWhC;IAFL,IAAA,YAAG,EAAC,WAAW,CAAC;IAChB,IAAA,uBAAK,EAAC,oBAAQ,CAAC,UAAU,CAAC;IACZ,WAAA,IAAA,cAAK,EAAC,UAAU,CAAC,CAAA;IAAoB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;iDAaxD;6BAxBmB,kBAAkB;IAFvC,IAAA,mBAAU,EAAC,OAAO,CAAC;IACnB,IAAA,uBAAK,EAAC,oBAAQ,CAAC,KAAK,CAAC;qCAKyB,mCAAe;GAJxC,kBAAkB,CAyBvC"}
1
+ {"version":3,"file":"core-file.controller.js","sourceRoot":"","sources":["../../../../src/core/modules/file/core-file.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAqG;AAGrG,6EAAgE;AAChE,4DAAwD;AACxD,2DAAsD;AAO/C,IAAe,kBAAkB,GAAjC,MAAe,kBAAkB;IAItC,YAAgC,WAA4B;QAA5B,gBAAW,GAAX,WAAW,CAAiB;IAAG,CAAC;IAU1D,AAAN,KAAK,CAAC,WAAW,CAAc,EAAU,EAAS,GAAa;QAC7D,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,4BAAmB,CAAC,8BAA8B,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,0BAAiB,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC5D,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC;QAC3E,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAUK,AAAN,KAAK,CAAC,OAAO,CAAoB,QAAgB,EAAS,GAAa;QACrE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,4BAAmB,CAAC,+BAA+B,CAAC,CAAC;QACjE,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,0BAAiB,CAAC,gBAAgB,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjE,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,IAAI,0BAA0B,CAAC,CAAC;QAC3E,GAAG,CAAC,MAAM,CAAC,qBAAqB,EAAE,wBAAwB,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3E,OAAO,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;CACF,CAAA;AAnDqB,gDAAkB;AAchC;IAFL,IAAA,YAAG,EAAC,QAAQ,CAAC;IACb,IAAA,uBAAK,EAAC,oBAAQ,CAAC,UAAU,CAAC;IACR,WAAA,IAAA,cAAK,EAAC,IAAI,CAAC,CAAA;IAAc,WAAA,IAAA,YAAG,GAAE,CAAA;;;;qDAahD;AAUK;IAFL,IAAA,YAAG,EAAC,WAAW,CAAC;IAChB,IAAA,uBAAK,EAAC,oBAAQ,CAAC,UAAU,CAAC;IACZ,WAAA,IAAA,cAAK,EAAC,UAAU,CAAC,CAAA;IAAoB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;iDAaxD;6BAlDmB,kBAAkB;IAFvC,IAAA,mBAAU,EAAC,OAAO,CAAC;IACnB,IAAA,uBAAK,EAAC,oBAAQ,CAAC,KAAK,CAAC;qCAKyB,mCAAe;GAJxC,kBAAkB,CAmDvC"}
@@ -0,0 +1,9 @@
1
+ import { Request, Response } from 'express';
2
+ import { CoreTusService } from './core-tus.service';
3
+ export declare class CoreTusController {
4
+ protected readonly tusService: CoreTusService;
5
+ private readonly logger;
6
+ constructor(tusService: CoreTusService);
7
+ handleTus(req: Request, res: Response): Promise<void>;
8
+ handleTusWithId(req: Request, res: Response): Promise<void>;
9
+ }
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var CoreTusController_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.CoreTusController = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const roles_decorator_1 = require("../../common/decorators/roles.decorator");
19
+ const role_enum_1 = require("../../common/enums/role.enum");
20
+ const core_tus_service_1 = require("./core-tus.service");
21
+ let CoreTusController = CoreTusController_1 = class CoreTusController {
22
+ constructor(tusService) {
23
+ this.tusService = tusService;
24
+ this.logger = new common_1.Logger(CoreTusController_1.name);
25
+ }
26
+ async handleTus(req, res) {
27
+ const server = this.tusService.getServer();
28
+ if (!server) {
29
+ this.logger.warn('TUS server not initialized');
30
+ res.status(503).json({ message: 'TUS uploads not available' });
31
+ return;
32
+ }
33
+ try {
34
+ await server.handle(req, res);
35
+ }
36
+ catch (error) {
37
+ this.logger.error(`TUS request error: ${error.message}`);
38
+ if (!res.headersSent) {
39
+ res.status(500).json({ message: 'Upload error' });
40
+ }
41
+ }
42
+ }
43
+ async handleTusWithId(req, res) {
44
+ const server = this.tusService.getServer();
45
+ if (!server) {
46
+ this.logger.warn('TUS server not initialized');
47
+ res.status(503).json({ message: 'TUS uploads not available' });
48
+ return;
49
+ }
50
+ try {
51
+ await server.handle(req, res);
52
+ }
53
+ catch (error) {
54
+ this.logger.error(`TUS request error for upload ${req.params.id}: ${error.message}`);
55
+ if (!res.headersSent) {
56
+ res.status(500).json({ message: 'Upload error' });
57
+ }
58
+ }
59
+ }
60
+ };
61
+ exports.CoreTusController = CoreTusController;
62
+ __decorate([
63
+ (0, common_1.All)(),
64
+ (0, roles_decorator_1.Roles)(role_enum_1.RoleEnum.S_EVERYONE),
65
+ __param(0, (0, common_1.Req)()),
66
+ __param(1, (0, common_1.Res)()),
67
+ __metadata("design:type", Function),
68
+ __metadata("design:paramtypes", [Object, Object]),
69
+ __metadata("design:returntype", Promise)
70
+ ], CoreTusController.prototype, "handleTus", null);
71
+ __decorate([
72
+ (0, common_1.All)(':id'),
73
+ (0, roles_decorator_1.Roles)(role_enum_1.RoleEnum.S_EVERYONE),
74
+ __param(0, (0, common_1.Req)()),
75
+ __param(1, (0, common_1.Res)()),
76
+ __metadata("design:type", Function),
77
+ __metadata("design:paramtypes", [Object, Object]),
78
+ __metadata("design:returntype", Promise)
79
+ ], CoreTusController.prototype, "handleTusWithId", null);
80
+ exports.CoreTusController = CoreTusController = CoreTusController_1 = __decorate([
81
+ (0, common_1.Controller)('tus'),
82
+ (0, roles_decorator_1.Roles)(role_enum_1.RoleEnum.S_EVERYONE),
83
+ __metadata("design:paramtypes", [core_tus_service_1.CoreTusService])
84
+ ], CoreTusController);
85
+ //# sourceMappingURL=core-tus.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tus.controller.js","sourceRoot":"","sources":["../../../../src/core/modules/tus/core-tus.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAmE;AAGnE,6EAAgE;AAChE,4DAAwD;AACxD,yDAAoD;AAqB7C,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAG5B,YAA+B,UAA0B;QAA1B,eAAU,GAAV,UAAU,CAAgB;QAFxC,WAAM,GAAG,IAAI,eAAM,CAAC,mBAAiB,CAAC,IAAI,CAAC,CAAC;IAED,CAAC;IAcvD,AAAN,KAAK,CAAC,SAAS,CAAQ,GAAY,EAAS,GAAa;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAE3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;IASK,AAAN,KAAK,CAAC,eAAe,CAAQ,GAAY,EAAS,GAAa;QAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAE3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,2BAA2B,EAAE,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC;CACF,CAAA;AA7DY,8CAAiB;AAiBtB;IAFL,IAAA,YAAG,GAAE;IACL,IAAA,uBAAK,EAAC,oBAAQ,CAAC,UAAU,CAAC;IACV,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;kDAiB1C;AASK;IAFL,IAAA,YAAG,EAAC,KAAK,CAAC;IACV,IAAA,uBAAK,EAAC,oBAAQ,CAAC,UAAU,CAAC;IACJ,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;wDAiBhD;4BA5DU,iBAAiB;IAF7B,IAAA,mBAAU,EAAC,KAAK,CAAC;IACjB,IAAA,uBAAK,EAAC,oBAAQ,CAAC,UAAU,CAAC;qCAIkB,iCAAc;GAH9C,iBAAiB,CA6D7B"}
@@ -0,0 +1,30 @@
1
+ import { OnModuleDestroy, OnModuleInit } from '@nestjs/common';
2
+ import { Server, Upload } from '@tus/server';
3
+ import { Connection } from 'mongoose';
4
+ import { ITusConfig } from '../../common/interfaces/server-options.interface';
5
+ export declare class CoreTusService implements OnModuleDestroy, OnModuleInit {
6
+ private readonly connection;
7
+ private readonly logger;
8
+ private tusServer;
9
+ private config;
10
+ private files;
11
+ private cleanupInterval;
12
+ constructor(connection: Connection);
13
+ configure(config: boolean | ITusConfig | undefined): void;
14
+ onModuleInit(): Promise<void>;
15
+ onModuleDestroy(): Promise<void>;
16
+ getServer(): null | Server;
17
+ getConfig(): ITusConfig;
18
+ isEnabled(): boolean;
19
+ getPath(): string;
20
+ protected onUploadComplete(upload: Upload): Promise<void>;
21
+ protected onUploadTerminate(upload: Upload): Promise<void>;
22
+ protected validateFileType(filetype: string | undefined): boolean;
23
+ private createTusServer;
24
+ private parseMetadata;
25
+ private ensureUploadDir;
26
+ private deleteTemporaryFile;
27
+ private setupExpirationCleanup;
28
+ private cleanupExpiredUploads;
29
+ private logEnabledFeatures;
30
+ }
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var CoreTusService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CoreTusService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const file_store_1 = require("@tus/file-store");
16
+ const server_1 = require("@tus/server");
17
+ const fs = require("fs");
18
+ const mongoose_1 = require("mongoose");
19
+ const path = require("path");
20
+ const gridfs_helper_1 = require("../../common/helpers/gridfs.helper");
21
+ const tus_config_interface_1 = require("./interfaces/tus-config.interface");
22
+ let CoreTusService = CoreTusService_1 = class CoreTusService {
23
+ constructor(connection) {
24
+ this.connection = connection;
25
+ this.logger = new common_1.Logger(CoreTusService_1.name);
26
+ this.tusServer = null;
27
+ this.cleanupInterval = null;
28
+ this.config = { ...tus_config_interface_1.DEFAULT_TUS_CONFIG };
29
+ }
30
+ configure(config) {
31
+ const normalizedConfig = (0, tus_config_interface_1.normalizeTusConfig)(config);
32
+ if (normalizedConfig) {
33
+ this.config = normalizedConfig;
34
+ }
35
+ }
36
+ async onModuleInit() {
37
+ if (!this.config.enabled) {
38
+ this.logger.debug('TUS uploads disabled');
39
+ return;
40
+ }
41
+ this.files = new mongoose_1.mongo.GridFSBucket(this.connection.db, { bucketName: 'fs' });
42
+ const uploadDir = this.config.uploadDir || tus_config_interface_1.DEFAULT_TUS_CONFIG.uploadDir;
43
+ await this.ensureUploadDir(uploadDir);
44
+ this.tusServer = this.createTusServer(uploadDir);
45
+ this.setupExpirationCleanup();
46
+ this.logger.log(`TUS server initialized at ${this.config.path}`);
47
+ this.logEnabledFeatures();
48
+ }
49
+ async onModuleDestroy() {
50
+ if (this.cleanupInterval) {
51
+ clearInterval(this.cleanupInterval);
52
+ this.cleanupInterval = null;
53
+ }
54
+ }
55
+ getServer() {
56
+ return this.tusServer;
57
+ }
58
+ getConfig() {
59
+ return this.config;
60
+ }
61
+ isEnabled() {
62
+ return this.config.enabled !== false && this.tusServer !== null;
63
+ }
64
+ getPath() {
65
+ return this.config.path || tus_config_interface_1.DEFAULT_TUS_CONFIG.path;
66
+ }
67
+ async onUploadComplete(upload) {
68
+ const uploadDir = this.config.uploadDir || tus_config_interface_1.DEFAULT_TUS_CONFIG.uploadDir;
69
+ const filePath = path.join(uploadDir, upload.id);
70
+ try {
71
+ const metadata = this.parseMetadata(upload.metadata);
72
+ const filename = metadata.filename || upload.id;
73
+ const contentType = metadata.filetype || 'application/octet-stream';
74
+ const fileExists = await fs.promises
75
+ .access(filePath)
76
+ .then(() => true)
77
+ .catch(() => false);
78
+ if (!fileExists) {
79
+ this.logger.warn(`Upload file not found at ${filePath}, skipping GridFS migration`);
80
+ return;
81
+ }
82
+ const readStream = fs.createReadStream(filePath);
83
+ const fileInfo = await gridfs_helper_1.GridFSHelper.writeFileFromStream(this.files, readStream, {
84
+ contentType,
85
+ filename,
86
+ metadata: {
87
+ originalMetadata: metadata,
88
+ tusUploadId: upload.id,
89
+ uploadedAt: new Date(),
90
+ },
91
+ });
92
+ this.logger.debug(`Upload ${upload.id} migrated to GridFS as ${fileInfo._id} (filename: ${filename})`);
93
+ await this.deleteTemporaryFile(upload.id);
94
+ }
95
+ catch (error) {
96
+ this.logger.error(`Failed to migrate upload ${upload.id} to GridFS: ${error.message}`);
97
+ throw error;
98
+ }
99
+ }
100
+ async onUploadTerminate(upload) {
101
+ this.logger.debug(`Upload ${upload.id} terminated`);
102
+ await this.deleteTemporaryFile(upload.id);
103
+ }
104
+ validateFileType(filetype) {
105
+ const allowedTypes = this.config.allowedTypes;
106
+ if (!allowedTypes || allowedTypes.length === 0) {
107
+ return true;
108
+ }
109
+ if (!filetype) {
110
+ return false;
111
+ }
112
+ if (allowedTypes.includes(filetype)) {
113
+ return true;
114
+ }
115
+ for (const allowed of allowedTypes) {
116
+ if (allowed.endsWith('/*')) {
117
+ const prefix = allowed.slice(0, -1);
118
+ if (filetype.startsWith(prefix)) {
119
+ return true;
120
+ }
121
+ }
122
+ }
123
+ return false;
124
+ }
125
+ createTusServer(uploadDir) {
126
+ const datastore = new file_store_1.FileStore({ directory: uploadDir });
127
+ const server = new server_1.Server({
128
+ allowedHeaders: this.config.allowedHeaders || tus_config_interface_1.DEFAULT_TUS_ALLOWED_HEADERS,
129
+ datastore,
130
+ maxSize: this.config.maxSize,
131
+ onUploadCreate: async (_req, upload) => {
132
+ if (this.config.allowedTypes && this.config.allowedTypes.length > 0) {
133
+ const metadata = this.parseMetadata(upload.metadata);
134
+ const filetype = metadata.filetype;
135
+ if (!this.validateFileType(filetype)) {
136
+ const allowedList = this.config.allowedTypes.join(', ');
137
+ this.logger.warn(`Upload rejected: file type '${filetype || 'unknown'}' not allowed. Allowed types: ${allowedList}`);
138
+ const error = new Error(`File type '${filetype || 'unknown'}' is not allowed. Allowed types: ${allowedList}`);
139
+ error.status_code = 415;
140
+ throw error;
141
+ }
142
+ }
143
+ return {};
144
+ },
145
+ onUploadFinish: async (_req, upload) => {
146
+ try {
147
+ await this.onUploadComplete(upload);
148
+ return {};
149
+ }
150
+ catch (error) {
151
+ this.logger.error(`Upload finish error: ${error.message}`);
152
+ return {};
153
+ }
154
+ },
155
+ path: this.config.path || tus_config_interface_1.DEFAULT_TUS_CONFIG.path,
156
+ respectForwardedHeaders: true,
157
+ });
158
+ return server;
159
+ }
160
+ parseMetadata(metadata) {
161
+ if (!metadata) {
162
+ return {};
163
+ }
164
+ if (typeof metadata === 'object') {
165
+ return metadata;
166
+ }
167
+ const result = {};
168
+ const pairs = metadata.split(',');
169
+ for (const pair of pairs) {
170
+ const [key, value] = pair.trim().split(' ');
171
+ if (key) {
172
+ result[key] = value ? Buffer.from(value, 'base64').toString('utf-8') : '';
173
+ }
174
+ }
175
+ return result;
176
+ }
177
+ async ensureUploadDir(uploadDir) {
178
+ try {
179
+ await fs.promises.mkdir(uploadDir, { recursive: true });
180
+ }
181
+ catch (error) {
182
+ if (error.code !== 'EEXIST') {
183
+ throw error;
184
+ }
185
+ }
186
+ }
187
+ async deleteTemporaryFile(uploadId) {
188
+ const uploadDir = this.config.uploadDir || tus_config_interface_1.DEFAULT_TUS_CONFIG.uploadDir;
189
+ const filePath = path.join(uploadDir, uploadId);
190
+ const infoPath = `${filePath}.json`;
191
+ try {
192
+ await fs.promises.unlink(filePath);
193
+ }
194
+ catch {
195
+ }
196
+ try {
197
+ await fs.promises.unlink(infoPath);
198
+ }
199
+ catch {
200
+ }
201
+ }
202
+ setupExpirationCleanup() {
203
+ const expirationConfig = this.config.expiration;
204
+ if (!expirationConfig) {
205
+ return;
206
+ }
207
+ let expiresIn = '24h';
208
+ if (typeof expirationConfig === 'boolean') {
209
+ if (!expirationConfig) {
210
+ return;
211
+ }
212
+ }
213
+ else {
214
+ if (expirationConfig.enabled === false) {
215
+ return;
216
+ }
217
+ expiresIn = expirationConfig.expiresIn || '24h';
218
+ }
219
+ const expirationMs = (0, tus_config_interface_1.parseExpirationTime)(expiresIn);
220
+ this.cleanupInterval = setInterval(async () => {
221
+ await this.cleanupExpiredUploads(expirationMs);
222
+ }, 60 * 60 * 1000);
223
+ this.logger.debug(`Expiration cleanup scheduled (expire after ${expiresIn})`);
224
+ }
225
+ async cleanupExpiredUploads(maxAgeMs) {
226
+ const uploadDir = this.config.uploadDir || tus_config_interface_1.DEFAULT_TUS_CONFIG.uploadDir;
227
+ const now = Date.now();
228
+ try {
229
+ const files = await fs.promises.readdir(uploadDir);
230
+ let cleanedCount = 0;
231
+ for (const file of files) {
232
+ if (file.endsWith('.json')) {
233
+ continue;
234
+ }
235
+ const filePath = path.join(uploadDir, file);
236
+ const stats = await fs.promises.stat(filePath);
237
+ const age = now - stats.mtimeMs;
238
+ if (age > maxAgeMs) {
239
+ await this.deleteTemporaryFile(file);
240
+ cleanedCount++;
241
+ }
242
+ }
243
+ if (cleanedCount > 0) {
244
+ this.logger.debug(`Cleaned up ${cleanedCount} expired uploads`);
245
+ }
246
+ }
247
+ catch (error) {
248
+ this.logger.warn(`Failed to cleanup expired uploads: ${error.message}`);
249
+ }
250
+ }
251
+ logEnabledFeatures() {
252
+ const features = [];
253
+ if (this.config.creation !== false) {
254
+ features.push('creation');
255
+ }
256
+ if (this.config.creationWithUpload !== false) {
257
+ features.push('creation-with-upload');
258
+ }
259
+ if (this.config.termination !== false) {
260
+ features.push('termination');
261
+ }
262
+ if (this.config.expiration !== false) {
263
+ features.push('expiration');
264
+ }
265
+ if (this.config.checksum !== false) {
266
+ features.push('checksum');
267
+ }
268
+ if (this.config.concatenation !== false) {
269
+ features.push('concatenation');
270
+ }
271
+ if (features.length > 0) {
272
+ this.logger.log(`TUS extensions: ${features.join(', ')}`);
273
+ }
274
+ if (this.config.allowedTypes && this.config.allowedTypes.length > 0) {
275
+ this.logger.log(`TUS allowed types: ${this.config.allowedTypes.join(', ')}`);
276
+ }
277
+ }
278
+ };
279
+ exports.CoreTusService = CoreTusService;
280
+ exports.CoreTusService = CoreTusService = CoreTusService_1 = __decorate([
281
+ (0, common_1.Injectable)(),
282
+ __metadata("design:paramtypes", [mongoose_1.Connection])
283
+ ], CoreTusService);
284
+ //# sourceMappingURL=core-tus.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-tus.service.js","sourceRoot":"","sources":["../../../../src/core/modules/tus/core-tus.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './core-tus.controller';
2
+ export * from './core-tus.service';
3
+ export * from './interfaces/tus-config.interface';
4
+ export * from './tus.module';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./core-tus.controller"), exports);
18
+ __exportStar(require("./core-tus.service"), exports);
19
+ __exportStar(require("./interfaces/tus-config.interface"), exports);
20
+ __exportStar(require("./tus.module"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/modules/tus/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,wDAAsC;AACtC,qDAAmC;AACnC,oEAAkD;AAClD,+CAA6B"}
@@ -0,0 +1,10 @@
1
+ import { ITusConfig, ITusExpirationConfig } from '../../../common/interfaces/server-options.interface';
2
+ export { ITusConfig, ITusCreationConfig, ITusExpirationConfig, } from '../../../common/interfaces/server-options.interface';
3
+ export declare const DEFAULT_TUS_ALLOWED_HEADERS: string[];
4
+ export declare const DEFAULT_TUS_CONFIG: Required<Omit<ITusConfig, 'allowedTypes' | 'creation' | 'expiration'> & {
5
+ allowedTypes: undefined;
6
+ creation: boolean;
7
+ expiration: ITusExpirationConfig;
8
+ }>;
9
+ export declare function normalizeTusConfig(config: boolean | ITusConfig | undefined): ITusConfig | null;
10
+ export declare function parseExpirationTime(expiresIn: string): number;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_TUS_CONFIG = exports.DEFAULT_TUS_ALLOWED_HEADERS = void 0;
4
+ exports.normalizeTusConfig = normalizeTusConfig;
5
+ exports.parseExpirationTime = parseExpirationTime;
6
+ exports.DEFAULT_TUS_ALLOWED_HEADERS = [];
7
+ exports.DEFAULT_TUS_CONFIG = {
8
+ allowedHeaders: exports.DEFAULT_TUS_ALLOWED_HEADERS,
9
+ allowedTypes: undefined,
10
+ checksum: true,
11
+ concatenation: true,
12
+ creation: true,
13
+ creationWithUpload: true,
14
+ enabled: true,
15
+ expiration: { enabled: true, expiresIn: '24h' },
16
+ maxSize: 50 * 1024 * 1024 * 1024,
17
+ path: '/tus',
18
+ termination: true,
19
+ uploadDir: 'uploads/tus',
20
+ };
21
+ function normalizeTusConfig(config) {
22
+ if (config === undefined) {
23
+ return { ...exports.DEFAULT_TUS_CONFIG };
24
+ }
25
+ if (config === true) {
26
+ return { ...exports.DEFAULT_TUS_CONFIG };
27
+ }
28
+ if (config === false) {
29
+ return null;
30
+ }
31
+ if (config.enabled === false) {
32
+ return null;
33
+ }
34
+ return {
35
+ ...exports.DEFAULT_TUS_CONFIG,
36
+ ...config,
37
+ };
38
+ }
39
+ function parseExpirationTime(expiresIn) {
40
+ const match = expiresIn.match(/^(\d+)([hdms])$/);
41
+ if (!match) {
42
+ return 24 * 60 * 60 * 1000;
43
+ }
44
+ const value = parseInt(match[1], 10);
45
+ const unit = match[2];
46
+ switch (unit) {
47
+ case 'd':
48
+ return value * 24 * 60 * 60 * 1000;
49
+ case 'h':
50
+ return value * 60 * 60 * 1000;
51
+ case 'm':
52
+ return value * 60 * 1000;
53
+ case 's':
54
+ return value * 1000;
55
+ default:
56
+ return 24 * 60 * 60 * 1000;
57
+ }
58
+ }
59
+ //# sourceMappingURL=tus-config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tus-config.interface.js","sourceRoot":"","sources":["../../../../../src/core/modules/tus/interfaces/tus-config.interface.ts"],"names":[],"mappings":";;;AA2DA,gDAoBC;AAMD,kDAqBC;AAhFY,QAAA,2BAA2B,GAAa,EAAE,CAAC;AAK3C,QAAA,kBAAkB,GAM3B;IACF,cAAc,EAAE,mCAA2B;IAC3C,YAAY,EAAE,SAAS;IACvB,QAAQ,EAAE,IAAI;IACd,aAAa,EAAE,IAAI;IACnB,QAAQ,EAAE,IAAI;IACd,kBAAkB,EAAE,IAAI;IACxB,OAAO,EAAE,IAAI;IACb,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE;IAC/C,OAAO,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI;IAChC,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,IAAI;IACjB,SAAS,EAAE,aAAa;CACzB,CAAC;AASF,SAAgB,kBAAkB,CAAC,MAAwC;IAEzE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,0BAAkB,EAAE,CAAC;IACnC,CAAC;IACD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,GAAG,0BAAkB,EAAE,CAAC;IACnC,CAAC;IACD,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,GAAG,0BAAkB;QACrB,GAAG,MAAM;KACV,CAAC;AACJ,CAAC;AAMD,SAAgB,mBAAmB,CAAC,SAAiB;IACnD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACjD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAEtB,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,GAAG;YACN,OAAO,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACrC,KAAK,GAAG;YACN,OAAO,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC;QAC3B,KAAK,GAAG;YACN,OAAO,KAAK,GAAG,IAAI,CAAC;QACtB;YACE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAC/B,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { DynamicModule, OnModuleInit, Type } from '@nestjs/common';
2
+ import { ITusConfig } from '../../common/interfaces/server-options.interface';
3
+ import { CoreTusController } from './core-tus.controller';
4
+ import { CoreTusService } from './core-tus.service';
5
+ export declare const TUS_CONFIG = "TUS_CONFIG";
6
+ export interface TusModuleOptions {
7
+ config?: boolean | ITusConfig;
8
+ controller?: Type<CoreTusController>;
9
+ }
10
+ export declare class TusModule implements OnModuleInit {
11
+ private readonly tusService?;
12
+ private static logger;
13
+ private static tusEnabled;
14
+ private static currentConfig;
15
+ private static customController;
16
+ constructor(tusService?: CoreTusService);
17
+ onModuleInit(): Promise<void>;
18
+ private static getControllerClass;
19
+ static forRoot(options?: TusModuleOptions): DynamicModule;
20
+ static reset(): void;
21
+ }