my-typescript-library-rahul52us 2.4.9 → 2.5.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.
@@ -40,7 +40,8 @@ const mongoose_1 = __importStar(require("mongoose"));
40
40
  const stream_1 = require("stream");
41
41
  const fileSystem_schema_1 = __importDefault(require("../repository/schemas/fileSystem.schema"));
42
42
  const { GridFSBucket } = mongoose_1.mongo;
43
- function uploadFile(file, name, type) {
43
+ // Core upload logic wrapped as a helper
44
+ function tryUploadFile(file, name, type) {
44
45
  return __awaiter(this, void 0, void 0, function* () {
45
46
  return new Promise((resolve, reject) => {
46
47
  try {
@@ -57,17 +58,11 @@ function uploadFile(file, name, type) {
57
58
  uploadStream.on("finish", () => {
58
59
  const fileId = uploadStream.id;
59
60
  fileSystem_schema_1.default
60
- .create({
61
- fileId: fileId,
62
- })
63
- .then((data) => {
64
- resolve(data);
65
- })
66
- .catch((err) => {
67
- reject("File upload failed");
68
- });
61
+ .create({ fileId: fileId })
62
+ .then((data) => resolve(data))
63
+ .catch(() => reject("File upload failed"));
69
64
  });
70
- uploadStream.on("error", (error) => {
65
+ uploadStream.on("error", () => {
71
66
  reject("Error uploading file");
72
67
  });
73
68
  }
@@ -77,6 +72,25 @@ function uploadFile(file, name, type) {
77
72
  });
78
73
  });
79
74
  }
75
+ // Public function with retry logic
76
+ function uploadFile(file, name, type) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ const maxRetries = 3;
79
+ let attempt = 0;
80
+ while (attempt < maxRetries) {
81
+ try {
82
+ return yield tryUploadFile(file, name, type); // success → exit
83
+ }
84
+ catch (error) {
85
+ attempt++;
86
+ if (attempt >= maxRetries) {
87
+ throw new Error(`File upload failed after ${maxRetries} attempts`);
88
+ }
89
+ yield new Promise((res) => setTimeout(res, 300 * attempt)); // wait before retry
90
+ }
91
+ }
92
+ });
93
+ }
80
94
  exports.uploadFile = uploadFile;
81
95
  function getFile(id) {
82
96
  return __awaiter(this, void 0, void 0, function* () {
@@ -91,13 +105,11 @@ function getFile(id) {
91
105
  chunks.push(chunk);
92
106
  fileSize += chunk.length;
93
107
  });
94
- downloadStream.on("error", (error) => {
108
+ downloadStream.on("error", () => {
95
109
  reject("An error occured while fetching file");
96
110
  });
97
111
  downloadStream.on("end", () => {
98
112
  const buffer = Buffer.concat(chunks, fileSize);
99
- // Use the `buffer` variable as needed, e.g., save it to a file or process it further
100
- // For example, you can assign it to a variable:
101
113
  const downloadData = buffer;
102
114
  const array = new Uint8Array(downloadData);
103
115
  resolve(`[${array}]`);
@@ -119,13 +131,12 @@ function getFileData(id) {
119
131
  const downloadStream = bucket.openDownloadStream(new mongoose_1.default.Types.ObjectId(id));
120
132
  const chunks = [];
121
133
  let fileSize = 0;
122
- // Fetch the file's metadata from fs.files
123
- connection.db.collection('fs.files').findOne({ _id: new mongoose_1.default.Types.ObjectId(id) })
134
+ connection.db
135
+ .collection("fs.files")
136
+ .findOne({ _id: new mongoose_1.default.Types.ObjectId(id) })
124
137
  .then((fileInfo) => {
125
- if (!fileInfo) {
138
+ if (!fileInfo)
126
139
  return reject("File not found");
127
- }
128
- // Push metadata for the response
129
140
  const { filename, contentType, length } = fileInfo;
130
141
  downloadStream.on("data", (chunk) => {
131
142
  chunks.push(chunk);
@@ -138,13 +149,12 @@ function getFileData(id) {
138
149
  const buffer = Buffer.concat(chunks, fileSize);
139
150
  const downloadData = buffer;
140
151
  const array = new Uint8Array(downloadData);
141
- // Return an object containing file metadata and data
142
152
  resolve({
143
153
  fileId: id,
144
- filename: filename,
145
- contentType: contentType,
154
+ filename,
155
+ contentType,
146
156
  fileSize: length,
147
- data: array, // Returning as Uint8Array
157
+ data: array,
148
158
  });
149
159
  });
150
160
  })
@@ -1 +1 @@
1
- {"version":3,"file":"filesystem.repository.js","sourceRoot":"","sources":["../../src/repository/filesystem.repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"filesystem.repository.js","sourceRoot":"","sources":["../../src/repository/filesystem.repository.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "my-typescript-library-rahul52us",
3
- "version": "2.4.9",
3
+ "version": "2.5.0",
4
4
  "description": "A reusable TypeScript utility library.",
5
5
  "main": "dist/server.js",
6
6
  "types": "dist/types/server.d.ts",
@@ -1,134 +1,138 @@
1
- import mongoose, { connection, mongo } from "mongoose";
1
+ import mongoose, { mongo } from "mongoose";
2
2
  import { Readable } from "stream";
3
3
 
4
4
  import fileSystemSchema from "../repository/schemas/fileSystem.schema";
5
5
  const { GridFSBucket } = mongo;
6
6
 
7
- export async function uploadFile(file: any, name: string, type: string) {
7
+ // Core upload logic wrapped as a helper
8
+ async function tryUploadFile(file: any, name: string, type: string) {
8
9
  return new Promise((resolve, reject) => {
9
- try {
10
- const connection = mongoose.connection;
11
- const bucket = new GridFSBucket(connection.db);
12
-
13
- const buffer = Buffer.from(file, 'base64');
14
- const readableStream = new Readable();
15
- readableStream.push(buffer);
16
- readableStream.push(null);
17
-
18
- const uploadStream = bucket.openUploadStream(name, {
19
- metadata: { contentType: type },
20
- });
21
-
22
- readableStream.pipe(uploadStream);
23
-
24
- uploadStream.on("finish", () => {
25
- const fileId = uploadStream.id;
26
- fileSystemSchema
27
- .create({
28
- fileId: fileId,
29
- })
30
- .then((data) => {
31
- resolve(data);
32
- })
33
- .catch((err) => {
34
- reject("File upload failed");
35
- });
36
- });
10
+ try {
11
+ const connection = mongoose.connection;
12
+ const bucket = new GridFSBucket(connection.db);
13
+
14
+ const buffer = Buffer.from(file, 'base64');
15
+ const readableStream = new Readable();
16
+ readableStream.push(buffer);
17
+ readableStream.push(null);
18
+
19
+ const uploadStream = bucket.openUploadStream(name, {
20
+ metadata: { contentType: type },
21
+ });
22
+
23
+ readableStream.pipe(uploadStream);
24
+
25
+ uploadStream.on("finish", () => {
26
+ const fileId = uploadStream.id;
27
+ fileSystemSchema
28
+ .create({ fileId: fileId })
29
+ .then((data) => resolve(data))
30
+ .catch(() => reject("File upload failed"));
31
+ });
32
+
33
+ uploadStream.on("error", () => {
34
+ reject("Error uploading file");
35
+ });
36
+ } catch (err) {
37
+ reject("Error uploading the file");
38
+ }
39
+ });
40
+ }
37
41
 
38
- uploadStream.on("error", (error) => {
39
- reject("Error uploading file");
40
- });
41
- } catch (err) {
42
- reject("Error uploading the file");
42
+ // Public function with retry logic
43
+ export async function uploadFile(file: any, name: string, type: string) {
44
+ const maxRetries = 3;
45
+ let attempt = 0;
46
+ while (attempt < maxRetries) {
47
+ try {
48
+ return await tryUploadFile(file, name, type); // success → exit
49
+ } catch (error) {
50
+ attempt++;
51
+ if (attempt >= maxRetries) {
52
+ throw new Error(`File upload failed after ${maxRetries} attempts`);
43
53
  }
44
- });
45
-
46
-
54
+ await new Promise((res) => setTimeout(res, 300 * attempt)); // wait before retry
55
+ }
56
+ }
47
57
  }
48
58
 
49
59
  export async function getFile(id: string) {
50
60
  return new Promise((resolve, reject) => {
51
- try {
52
- const connection = mongoose.connection;
53
- const bucket = new GridFSBucket(connection.db);
54
- const downloadStream = bucket.openDownloadStream(new mongoose.Types.ObjectId(id));
61
+ try {
62
+ const connection = mongoose.connection;
63
+ const bucket = new GridFSBucket(connection.db);
64
+ const downloadStream = bucket.openDownloadStream(new mongoose.Types.ObjectId(id));
65
+
66
+ const chunks: Buffer[] = [];
67
+ let fileSize = 0;
68
+
69
+ downloadStream.on("data", (chunk) => {
70
+ chunks.push(chunk);
71
+ fileSize += chunk.length;
72
+ });
73
+
74
+ downloadStream.on("error", () => {
75
+ reject("An error occured while fetching file");
76
+ });
77
+
78
+ downloadStream.on("end", () => {
79
+ const buffer = Buffer.concat(chunks, fileSize);
80
+ const downloadData = buffer;
81
+ const array = new Uint8Array(downloadData);
82
+ resolve(`[${array}]`);
83
+ });
84
+ } catch (err) {
85
+ reject("Error Getting the file");
86
+ }
87
+ });
88
+ }
89
+
90
+ export async function getFileData(id: string) {
91
+ return new Promise((resolve, reject) => {
92
+ try {
93
+ const connection = mongoose.connection;
94
+ const bucket = new GridFSBucket(connection.db);
95
+ const downloadStream = bucket.openDownloadStream(new mongoose.Types.ObjectId(id));
96
+
97
+ const chunks: Buffer[] = [];
98
+ let fileSize = 0;
99
+
100
+ connection.db
101
+ .collection("fs.files")
102
+ .findOne({ _id: new mongoose.Types.ObjectId(id) })
103
+ .then((fileInfo) => {
104
+ if (!fileInfo) return reject("File not found");
55
105
 
56
- const chunks: Buffer[] = [];
57
- let fileSize = 0;
106
+ const { filename, contentType, length } = fileInfo;
58
107
 
59
108
  downloadStream.on("data", (chunk) => {
60
109
  chunks.push(chunk);
61
110
  fileSize += chunk.length;
62
111
  });
63
112
 
64
- downloadStream.on("error", (error) => {
65
- reject("An error occured while fetching file")
113
+ downloadStream.on("error", () => {
114
+ reject("An error occurred while fetching the file");
66
115
  });
67
116
 
68
117
  downloadStream.on("end", () => {
69
118
  const buffer = Buffer.concat(chunks, fileSize);
70
-
71
- // Use the `buffer` variable as needed, e.g., save it to a file or process it further
72
- // For example, you can assign it to a variable:
73
119
  const downloadData = buffer;
74
- const array = new Uint8Array(downloadData)
75
- resolve(`[${array}]`)
120
+ const array = new Uint8Array(downloadData);
121
+
122
+ resolve({
123
+ fileId: id,
124
+ filename,
125
+ contentType,
126
+ fileSize: length,
127
+ data: array,
128
+ });
76
129
  });
77
- } catch (err) {
78
- reject("Error Getting the file")
79
- }
80
- })
130
+ })
131
+ .catch(() => {
132
+ reject("Error fetching file metadata");
133
+ });
134
+ } catch (err) {
135
+ reject("Error Getting the file");
136
+ }
137
+ });
81
138
  }
82
-
83
- export async function getFileData(id: string) {
84
- return new Promise((resolve, reject) => {
85
- try {
86
- const connection = mongoose.connection;
87
- const bucket = new GridFSBucket(connection.db);
88
- const downloadStream = bucket.openDownloadStream(new mongoose.Types.ObjectId(id));
89
-
90
- const chunks: Buffer[] = [];
91
- let fileSize = 0;
92
-
93
- // Fetch the file's metadata from fs.files
94
- connection.db.collection('fs.files').findOne({ _id: new mongoose.Types.ObjectId(id) })
95
- .then((fileInfo) => {
96
- if (!fileInfo) {
97
- return reject("File not found");
98
- }
99
-
100
- // Push metadata for the response
101
- const { filename, contentType, length } = fileInfo;
102
-
103
- downloadStream.on("data", (chunk) => {
104
- chunks.push(chunk);
105
- fileSize += chunk.length;
106
- });
107
-
108
- downloadStream.on("error", () => {
109
- reject("An error occurred while fetching the file");
110
- });
111
-
112
- downloadStream.on("end", () => {
113
- const buffer = Buffer.concat(chunks, fileSize);
114
- const downloadData = buffer;
115
- const array = new Uint8Array(downloadData);
116
-
117
- // Return an object containing file metadata and data
118
- resolve({
119
- fileId: id, // Include file ID
120
- filename: filename,
121
- contentType: contentType,
122
- fileSize: length,
123
- data: array, // Returning as Uint8Array
124
- });
125
- });
126
- })
127
- .catch(() => {
128
- reject("Error fetching file metadata");
129
- });
130
- } catch (err) {
131
- reject("Error Getting the file");
132
- }
133
- });
134
- }