1
- const { readFileSync } = require("fs");
1
+ const fs = require("fs");
2
2
const { ReadableStream } = require("stream/web");
3
3
4
- const _bufferToString = (buffer) => {
4
+ /**
5
+ * @param {fs.ReadStream} readStream
6
+ * @returns {ReadableStream}
7
+ */
8
+ function convertReadStreamToReadableStream(readStream) {
9
+ return new ReadableStream({
10
+ start(controller) {
11
+ readStream.on("data", (chunk) => {
12
+ controller.enqueue(chunk);
13
+ });
14
+ readStream.on("end", () => {
15
+ controller.close();
16
+ });
17
+ readStream.on("error", (err) => {
18
+ controller.error(err);
19
+ });
20
+ },
21
+ cancel() {
22
+ readStream.destroy();
23
+ },
24
+ });
25
+ }
26
+
27
+ /**
28
+ * @param {Buffer} buffer
29
+ * @returns {ReadableStream}
30
+ */
31
+ function bufferToReadableStream(buffer) {
5
32
return new ReadableStream({
6
33
start(controller) {
7
34
controller.enqueue(buffer);
8
35
controller.close();
9
36
},
10
37
});
11
- };
38
+ }
12
39
13
40
class InputFile {
14
- stream; // Content of file as a stream
15
- size; // Total final size of the file content
16
- filename; // File name
41
+ /** @type {ReadableStream} Content of file as a stream */
42
+ stream;
43
+
44
+ /** @type {number} Total final size of the file content */
45
+ size;
17
46
47
+ /** @type {string} File name */
48
+ filename;
49
+
50
+ /**
51
+ * @param {string} filePath
52
+ * @param {string} filename
53
+ * @returns {InputFile}
54
+ */
18
55
static fromPath = (filePath, filename) => {
19
- const data = readFileSync (filePath);
20
- const stream = _bufferToString(data );
21
- const size = data.byteLength ;
56
+ const nodeStream = fs.createReadStream (filePath);
57
+ const stream = convertReadStreamToReadableStream(nodeStream );
58
+ const size = fs.statSync(filePath).size ;
22
59
return new InputFile(stream, filename, size);
23
60
};
24
61
62
+ /**
63
+ * @param {Buffer} buffer
64
+ * @param {string} filename
65
+ * @returns {InputFile}
66
+ */
25
67
static fromBuffer = (buffer, filename) => {
26
- const stream = _bufferToString (buffer);
68
+ const stream = bufferToReadableStream (buffer);
27
69
const size = buffer.byteLength;
28
70
return new InputFile(stream, filename, size);
29
71
};
30
72
73
+ /**
74
+ * @param {string} content
75
+ * @param {string} filename
76
+ * @returns {InputFile}
77
+ */
31
78
static fromPlainText = (content, filename) => {
32
- const buffer = new TextEncoder().encode(content);
33
- const stream = _bufferToString(buffer);
34
- const size = buffer.byteLength;
35
- return new InputFile(stream, filename, size);
79
+ const array = new TextEncoder().encode(content);
80
+ const buffer = Buffer.from(array);
81
+ return InputFile.fromBuffer(buffer, filename);
36
82
};
37
83
84
+ /**
85
+ * @param {ReadableStream} stream
86
+ * @param {string} filename
87
+ * @param {number} size
88
+ */
38
89
constructor(stream, filename, size) {
39
90
this.stream = stream;
40
91
this.filename = filename;
41
92
this.size = size;
42
93
}
43
94
}
44
95
45
- module.exports = InputFile;
96
+ module.exports = InputFile;
0 commit comments