laju-server 1.0.0 → 1.0.1
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.
- package/index.js +43 -5
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -16,7 +16,18 @@ function startServer(folderPath, port = 3000) {
|
|
|
16
16
|
process.exit(1);
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const server = new HyperExpress.Server(
|
|
19
|
+
const server = new HyperExpress.Server({
|
|
20
|
+
fast_buffers: true,
|
|
21
|
+
max_body_buffer: 64 * 1024, // 64KB buffer for streaming
|
|
22
|
+
streaming: {
|
|
23
|
+
readable: {
|
|
24
|
+
highWaterMark: 64 * 1024, // 64KB chunks
|
|
25
|
+
},
|
|
26
|
+
writable: {
|
|
27
|
+
highWaterMark: 64 * 1024, // 64KB chunks
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
});
|
|
20
31
|
|
|
21
32
|
// Serve static files
|
|
22
33
|
server.get('/*', async (req, res) => {
|
|
@@ -82,11 +93,20 @@ function startServer(folderPath, port = 3000) {
|
|
|
82
93
|
|
|
83
94
|
const range = req.headers['range'];
|
|
84
95
|
|
|
96
|
+
// Use larger buffer for big files (64KB chunks)
|
|
97
|
+
const highWaterMark = 64 * 1024;
|
|
98
|
+
|
|
85
99
|
if (range) {
|
|
86
100
|
// Handle range requests for video streaming / resume download
|
|
87
101
|
const parts = range.replace(/bytes=/, '').split('-');
|
|
88
102
|
const start = parseInt(parts[0], 10);
|
|
89
|
-
|
|
103
|
+
// Limit chunk size to 10MB per request for stability
|
|
104
|
+
const maxChunk = 10 * 1024 * 1024;
|
|
105
|
+
let end = parts[1] ? parseInt(parts[1], 10) : Math.min(start + maxChunk, fileSize - 1);
|
|
106
|
+
|
|
107
|
+
// Ensure end doesn't exceed file size
|
|
108
|
+
if (end >= fileSize) end = fileSize - 1;
|
|
109
|
+
|
|
90
110
|
const chunkSize = end - start + 1;
|
|
91
111
|
|
|
92
112
|
res.status(206);
|
|
@@ -94,16 +114,34 @@ function startServer(folderPath, port = 3000) {
|
|
|
94
114
|
res.setHeader('Accept-Ranges', 'bytes');
|
|
95
115
|
res.setHeader('Content-Length', chunkSize);
|
|
96
116
|
res.setHeader('Content-Type', mimeType);
|
|
117
|
+
res.setHeader('Connection', 'keep-alive');
|
|
118
|
+
|
|
119
|
+
const stream = fs.createReadStream(filePath, { start, end, highWaterMark });
|
|
120
|
+
|
|
121
|
+
stream.on('error', (err) => {
|
|
122
|
+
console.error('Stream error:', err.message);
|
|
123
|
+
if (!res.headersSent) {
|
|
124
|
+
res.status(500).send('Stream error');
|
|
125
|
+
}
|
|
126
|
+
});
|
|
97
127
|
|
|
98
|
-
const stream = fs.createReadStream(filePath, { start, end });
|
|
99
128
|
res.stream(stream);
|
|
100
129
|
} else {
|
|
101
|
-
//
|
|
130
|
+
// For large files without range, suggest client to use range requests
|
|
102
131
|
res.setHeader('Content-Length', fileSize);
|
|
103
132
|
res.setHeader('Content-Type', mimeType);
|
|
104
133
|
res.setHeader('Accept-Ranges', 'bytes');
|
|
134
|
+
res.setHeader('Connection', 'keep-alive');
|
|
135
|
+
|
|
136
|
+
const stream = fs.createReadStream(filePath, { highWaterMark });
|
|
137
|
+
|
|
138
|
+
stream.on('error', (err) => {
|
|
139
|
+
console.error('Stream error:', err.message);
|
|
140
|
+
if (!res.headersSent) {
|
|
141
|
+
res.status(500).send('Stream error');
|
|
142
|
+
}
|
|
143
|
+
});
|
|
105
144
|
|
|
106
|
-
const stream = fs.createReadStream(filePath);
|
|
107
145
|
res.stream(stream);
|
|
108
146
|
}
|
|
109
147
|
}
|