@tc-libs/file-handler 0.9.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 (56) hide show
  1. package/README.md +11 -0
  2. package/package.json +11 -0
  3. package/src/file-handler.module.d.ts +6 -0
  4. package/src/file-handler.module.js +53 -0
  5. package/src/file-handler.module.js.map +1 -0
  6. package/src/file-handler.module.options.d.ts +12 -0
  7. package/src/file-handler.module.options.js +5 -0
  8. package/src/file-handler.module.options.js.map +1 -0
  9. package/src/index.d.ts +6 -0
  10. package/src/index.js +10 -0
  11. package/src/index.js.map +1 -0
  12. package/src/interfaces/file-handler.interface.d.ts +43 -0
  13. package/src/interfaces/file-handler.interface.js +3 -0
  14. package/src/interfaces/file-handler.interface.js.map +1 -0
  15. package/src/interfaces/file.interface.d.ts +12 -0
  16. package/src/interfaces/file.interface.js +3 -0
  17. package/src/interfaces/file.interface.js.map +1 -0
  18. package/src/repository/entities/file.entity.d.ts +43 -0
  19. package/src/repository/entities/file.entity.js +132 -0
  20. package/src/repository/entities/file.entity.js.map +1 -0
  21. package/src/repository/file.repository.module.d.ts +2 -0
  22. package/src/repository/file.repository.module.js +27 -0
  23. package/src/repository/file.repository.module.js.map +1 -0
  24. package/src/repository/index.d.ts +3 -0
  25. package/src/repository/index.js +7 -0
  26. package/src/repository/index.js.map +1 -0
  27. package/src/repository/repositories/file.repository.d.ts +11 -0
  28. package/src/repository/repositories/file.repository.js +28 -0
  29. package/src/repository/repositories/file.repository.js.map +1 -0
  30. package/src/services/file-handler.service.d.ts +26 -0
  31. package/src/services/file-handler.service.js +147 -0
  32. package/src/services/file-handler.service.js.map +1 -0
  33. package/src/services/file-handler.text.service.d.ts +10 -0
  34. package/src/services/file-handler.text.service.js +63 -0
  35. package/src/services/file-handler.text.service.js.map +1 -0
  36. package/src/services/file-handler.video.service.d.ts +13 -0
  37. package/src/services/file-handler.video.service.js +147 -0
  38. package/src/services/file-handler.video.service.js.map +1 -0
  39. package/src/services/handlers/audio.d.ts +0 -0
  40. package/src/services/handlers/audio.js +174 -0
  41. package/src/services/handlers/audio.js.map +1 -0
  42. package/src/services/handlers/file.d.ts +5 -0
  43. package/src/services/handlers/file.js +32 -0
  44. package/src/services/handlers/file.js.map +1 -0
  45. package/src/services/handlers/index.d.ts +2 -0
  46. package/src/services/handlers/index.js +8 -0
  47. package/src/services/handlers/index.js.map +1 -0
  48. package/src/services/handlers/jpg.d.ts +5 -0
  49. package/src/services/handlers/jpg.js +96 -0
  50. package/src/services/handlers/jpg.js.map +1 -0
  51. package/src/services/handlers/png.d.ts +0 -0
  52. package/src/services/handlers/png.js +2 -0
  53. package/src/services/handlers/png.js.map +1 -0
  54. package/src/services/handlers/video.d.ts +0 -0
  55. package/src/services/handlers/video.js +174 -0
  56. package/src/services/handlers/video.js.map +1 -0
@@ -0,0 +1,5 @@
1
+ import { HandleFileResponse, FileHandlerConf } from '../../interfaces/file-handler.interface';
2
+ import { StorageAwsS3Service } from '@tc-libs/storage';
3
+ import { HandleFileOptions } from '../file-handler.service';
4
+ import { IFile } from '../../interfaces/file.interface';
5
+ export declare const handleImg: (imgConf: FileHandlerConf, ext: string, hashName: string, file: IFile, mime: any, content: Buffer, fileType: string, storage: StorageAwsS3Service, options: HandleFileOptions) => Promise<HandleFileResponse>;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleImg = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const sharp_1 = tslib_1.__importDefault(require("sharp"));
6
+ sharp_1.default.cache(false);
7
+ const resizeAndUpload = async (resize, remoteFolder, remoteKey, mime, content, storage, options) => {
8
+ // get image by sharp
9
+ const image = (0, sharp_1.default)(content);
10
+ // get metadata for estract original width and height
11
+ const metadata = await image.metadata();
12
+ if (resize && resize.size && resize.size > 0) {
13
+ // if resize is bigger than original, skip it
14
+ // if (Math.max(metadata.width, metadata.height) < resize.size) return null;
15
+ // check which is the bigger dimension
16
+ const biggerDimension = (metadata.width ?? 0) > (metadata.height ?? 0) ? 'width' : 'height';
17
+ // build the resize param
18
+ const resizeObj = {};
19
+ resizeObj[biggerDimension] = resize.size;
20
+ image.resize(resizeObj);
21
+ }
22
+ switch (metadata.format) {
23
+ case 'jpeg':
24
+ image.jpeg({
25
+ quality: resize.quality,
26
+ progressive: true,
27
+ });
28
+ break;
29
+ case 'png':
30
+ image.png({
31
+ compressionLevel: 9,
32
+ quality: resize.quality,
33
+ palette: true,
34
+ progressive: true,
35
+ });
36
+ break;
37
+ default:
38
+ break;
39
+ }
40
+ image.withMetadata({ density: 72 });
41
+ // resize img to a buffer
42
+ const { data, info } = await image.toBuffer({ resolveWithObject: true });
43
+ // upload buffer to blob storage
44
+ const storageResponse = await storage.uploadItem(remoteKey, data, {
45
+ path: remoteFolder,
46
+ mime: mime,
47
+ acl: options.acl,
48
+ });
49
+ return { info, storageResponse };
50
+ };
51
+ const handleImg = async (imgConf, ext, hashName, file, mime, content, fileType, storage, options) => {
52
+ // get all resizes
53
+ const resizes = imgConf.resizes;
54
+ // logger.log(`handling ${file.filename} with resizing`, imgConf.resizes);
55
+ const { info: originalInfo, storageResponse } = await resizeAndUpload({
56
+ size: null,
57
+ name: null,
58
+ quality: imgConf.quality,
59
+ }, fileType, `${hashName}${ext}`, mime, content, storage, options);
60
+ // return metadata
61
+ const response = {
62
+ filename: storageResponse.filename,
63
+ path: storageResponse.pathWithFilename,
64
+ folder: storageResponse.path,
65
+ hash: hashName,
66
+ ext,
67
+ mime,
68
+ size: file.size,
69
+ baseUrl: storageResponse.baseUrl,
70
+ completeUrl: storageResponse.completeUrl,
71
+ provider: storageResponse.provider,
72
+ width: originalInfo.width,
73
+ height: originalInfo.height,
74
+ formats: [],
75
+ };
76
+ for (const resize of resizes) {
77
+ // build resized img path
78
+ const { info: resizedInfo, storageResponse } = await resizeAndUpload(resize, `${fileType}/${resize.name}`, `${hashName}${ext}`, mime, content, storage, options);
79
+ if (!resizedInfo)
80
+ continue;
81
+ response.formats.push({
82
+ name: resize.name,
83
+ meta: {
84
+ width: resizedInfo.width,
85
+ height: resizedInfo.height,
86
+ size: resizedInfo.size,
87
+ completeUrl: storageResponse.completeUrl,
88
+ folder: storageResponse.path,
89
+ path: storageResponse.pathWithFilename,
90
+ },
91
+ });
92
+ }
93
+ return response;
94
+ };
95
+ exports.handleImg = handleImg;
96
+ //# sourceMappingURL=jpg.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jpg.js","sourceRoot":"","sources":["../../../../../../packages/file-handler/src/services/handlers/jpg.ts"],"names":[],"mappings":"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"}
File without changes
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=png.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"png.js","sourceRoot":"","sources":["../../../../../../packages/file-handler/src/services/handlers/png.ts"],"names":[],"mappings":""}
File without changes
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ // import path = require('path');
3
+ // import shortid from 'shortid';
4
+ // import FFmpeg from 'fluent-ffmpeg';
5
+ // import { existsSync, unlinkSync } from 'fs';
6
+ // import {
7
+ // FileHandlerConf,
8
+ // HandleFileResponse,
9
+ // } from '../../interfaces/file-handler.interface';
10
+ // import { StorageAwsS3Service } from '@tc-libs/storage';
11
+ // import { IFile } from '../interfaces/file.interface';
12
+ // import { Readable } from 'stream';
13
+ // const getVideoInfo = (content: Buffer) => {
14
+ // return new Promise((resolve, reject) => {
15
+ // FFmpeg.ffprobe(videoPath, (err: any, metadata: any) => {
16
+ // if (err) return reject(err);
17
+ // return resolve(metadata);
18
+ // });
19
+ // });
20
+ // };
21
+ // const resizeAndUploadVideo = (
22
+ // imgConf: FileHandlerConf,
23
+ // resize: { name: string | null; size: number | null; quality: number },
24
+ // remoteFolder: string,
25
+ // remoteKey: string,
26
+ // mime: string,
27
+ // content: Buffer,
28
+ // storage: StorageAwsS3Service,
29
+ // ): Promise<{ width: number; height: number; size: number }> => {
30
+ // return new Promise(async (resolve, reject) => {
31
+ // const tmpName = `video_${shortid.generate()}.mp4`;
32
+ // const output = path.resolve(path.join(imgConf.workDirectory, tmpName));
33
+ // // get file info
34
+ // const metadata: any = await getVideoInfo(content);
35
+ // // get stream data
36
+ // let stream;
37
+ // if (metadata && metadata.streams && metadata.streams.length)
38
+ // stream = metadata.streams[0];
39
+ // if (!stream) reject('Missing stream video');
40
+ // // extract w,h,ratio
41
+ // const { display_aspect_ratio: ratio, height: h, width: w } = stream;
42
+ // // if resize is bigger than original, skip it
43
+ // // if (resize.size && Math.max(w, h) < resize.size)
44
+ // // return resolve({ width: w, height: h, size: metadata.format.size });
45
+ // const readable: Readable = Readable.from(content);
46
+ // const video = FFmpeg(
47
+ // { source: readable as string | Readable },
48
+ // { objectMode: false },
49
+ // );
50
+ // // .writeToStream(bufferStream);
51
+ // let computedW = w;
52
+ // let computedH = h;
53
+ // // has to resize
54
+ // if (resize.size) {
55
+ // const [wRatio, hRatio] = ratio.split(':');
56
+ // const biggerDimension = w > h ? 'width' : 'height';
57
+ // if (biggerDimension === 'width') {
58
+ // const r = wRatio / hRatio;
59
+ // computedW = resize.size;
60
+ // computedH = Math.round(resize.size / r);
61
+ // } else {
62
+ // const r = hRatio / wRatio;
63
+ // computedH = resize.size;
64
+ // computedW = Math.round(resize.size / r);
65
+ // }
66
+ // video.size(`${computedW}x${computedH}`);
67
+ // }
68
+ // video
69
+ // .on('end', async () => {
70
+ // const {
71
+ // format: { size: computedSize },
72
+ // }: any = await getVideoInfo(output);
73
+ // const result = await storage.uploadItem(remoteKey, output, {
74
+ // mime,
75
+ // path: remoteFolder,
76
+ // });
77
+ // // delete file
78
+ // if (imgConf.hasToClean && existsSync(output)) unlinkSync(output);
79
+ // resolve({
80
+ // height: computedH,
81
+ // width: computedW,
82
+ // size: computedSize,
83
+ // });
84
+ // })
85
+ // .save(output);
86
+ // // const buffers = [];
87
+ // // bufferStream.on('data', (buf) => {
88
+ // // buffers.push(buf);
89
+ // // });
90
+ // // bufferStream.on('end', async () => {
91
+ // // const outputBuffer = Buffer.concat(buffers);
92
+ // // // use outputBuffer
93
+ // // // resize img to a buffer
94
+ // // // upload buffer to blob storage
95
+ // // if (outputBuffer.length) {
96
+ // // console.log(12);
97
+ // // await this._storage.uploadFileFromBuffer(
98
+ // // user,
99
+ // // outputBuffer,
100
+ // // ACL.PUBLIC_READ,
101
+ // // mime,
102
+ // // remoteFilePath,
103
+ // // );
104
+ // // }
105
+ // // });
106
+ // });
107
+ // };
108
+ // export const handleAudio = async (
109
+ // imgConf: FileHandlerConf,
110
+ // ext: string,
111
+ // hashName: string,
112
+ // file: IFile,
113
+ // mime: any,
114
+ // content: Buffer,
115
+ // fileType: string,
116
+ // storage: StorageAwsS3Service,
117
+ // ): Promise<HandleFileResponse> => {
118
+ // // get all resizes
119
+ // const resizes = imgConf.resizes;
120
+ // const originalRemoteFullPath = `${fileType}/${hashName}${ext}`;
121
+ // // original upload to s3
122
+ // const originalInfo = await resizeAndUploadVideo(
123
+ // imgConf,
124
+ // {
125
+ // size: null,
126
+ // name: null,
127
+ // quality: imgConf.quality,
128
+ // },
129
+ // fileType,
130
+ // `${hashName}${ext}`,
131
+ // mime,
132
+ // content,
133
+ // storage,
134
+ // );
135
+ // // return metadata
136
+ // const response: HandleFileResponse = {
137
+ // path: file.path,
138
+ // filename: file.filename,
139
+ // hash: hashName,
140
+ // ext,
141
+ // mime,
142
+ // size: file.size,
143
+ // url: originalRemoteFullPath,
144
+ // provider: 'aws-s3',
145
+ // width: originalInfo.width,
146
+ // height: originalInfo.height,
147
+ // formats: [],
148
+ // };
149
+ // for (const resize of resizes) {
150
+ // // build resized img path
151
+ // const remoteFullPath = `${fileType}/${resize.name}/${hashName}${ext}`;
152
+ // const resizedInfo = await resizeAndUploadVideo(
153
+ // imgConf,
154
+ // resize,
155
+ // `${fileType}/${resize.name}`,
156
+ // `${hashName}${ext}`,
157
+ // mime,
158
+ // content,
159
+ // storage,
160
+ // );
161
+ // if (!resizedInfo) continue;
162
+ // response.formats.push({
163
+ // name: resize.name,
164
+ // meta: {
165
+ // width: resizedInfo.width,
166
+ // height: resizedInfo.height,
167
+ // size: resizedInfo.size,
168
+ // url: remoteFullPath,
169
+ // },
170
+ // });
171
+ // }
172
+ // return response;
173
+ // };
174
+ //# sourceMappingURL=video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video.js","sourceRoot":"","sources":["../../../../../../packages/file-handler/src/services/handlers/video.ts"],"names":[],"mappings":"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"}