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.
Files changed (2) hide show
  1. package/index.js +43 -5
  2. 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
- const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
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
- // Stream full file
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
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "laju-server",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "Instant static file server using hyper-express",
5
5
  "main": "index.js",
6
6
  "bin": {