summaryrefslogtreecommitdiff
path: root/llama.cpp/scripts/serve-static.js
diff options
context:
space:
mode:
Diffstat (limited to 'llama.cpp/scripts/serve-static.js')
-rw-r--r--llama.cpp/scripts/serve-static.js110
1 files changed, 110 insertions, 0 deletions
diff --git a/llama.cpp/scripts/serve-static.js b/llama.cpp/scripts/serve-static.js
new file mode 100644
index 0000000..df4953e
--- /dev/null
+++ b/llama.cpp/scripts/serve-static.js
@@ -0,0 +1,110 @@
+const http = require('http');
+const fs = require('fs').promises;
+const path = require('path');
+
+// This file is used for testing wasm build from emscripten
+// Example build command:
+// emcmake cmake -B build-wasm -DGGML_WEBGPU=ON -DLLAMA_OPENSSL=OFF
+// cmake --build build-wasm --target test-backend-ops -j
+
+const PORT = 8080;
+const STATIC_DIR = path.join(__dirname, '../build-wasm/bin');
+console.log(`Serving static files from: ${STATIC_DIR}`);
+
+const mimeTypes = {
+ '.html': 'text/html',
+ '.js': 'text/javascript',
+ '.css': 'text/css',
+ '.png': 'image/png',
+ '.jpg': 'image/jpeg',
+ '.gif': 'image/gif',
+ '.svg': 'image/svg+xml',
+ '.json': 'application/json',
+ '.woff': 'font/woff',
+ '.woff2': 'font/woff2',
+};
+
+async function generateDirListing(dirPath, reqUrl) {
+ const files = await fs.readdir(dirPath);
+ let html = `
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <title>Directory Listing</title>
+ <style>
+ body { font-family: Arial, sans-serif; padding: 20px; }
+ ul { list-style: none; padding: 0; }
+ li { margin: 5px 0; }
+ a { text-decoration: none; color: #0066cc; }
+ a:hover { text-decoration: underline; }
+ </style>
+ </head>
+ <body>
+ <h1>Directory: ${reqUrl}</h1>
+ <ul>
+ `;
+
+ if (reqUrl !== '/') {
+ html += `<li><a href="../">../ (Parent Directory)</a></li>`;
+ }
+
+ for (const file of files) {
+ const filePath = path.join(dirPath, file);
+ const stats = await fs.stat(filePath);
+ const link = encodeURIComponent(file) + (stats.isDirectory() ? '/' : '');
+ html += `<li><a href="${link}">${file}${stats.isDirectory() ? '/' : ''}</a></li>`;
+ }
+
+ html += `
+ </ul>
+ </body>
+ </html>
+ `;
+ return html;
+}
+
+const server = http.createServer(async (req, res) => {
+ try {
+ // Set COOP and COEP headers
+ res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
+ res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
+ res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');
+ res.setHeader('Pragma', 'no-cache');
+ res.setHeader('Expires', '0');
+
+ const filePath = path.join(STATIC_DIR, decodeURIComponent(req.url));
+ const stats = await fs.stat(filePath);
+
+ if (stats.isDirectory()) {
+ const indexPath = path.join(filePath, 'index.html');
+ try {
+ const indexData = await fs.readFile(indexPath);
+ res.writeHeader(200, { 'Content-Type': 'text/html' });
+ res.end(indexData);
+ } catch {
+ // No index.html, generate directory listing
+ const dirListing = await generateDirListing(filePath, req.url);
+ res.writeHeader(200, { 'Content-Type': 'text/html' });
+ res.end(dirListing);
+ }
+ } else {
+ const ext = path.extname(filePath).toLowerCase();
+ const contentType = mimeTypes[ext] || 'application/octet-stream';
+ const data = await fs.readFile(filePath);
+ res.writeHeader(200, { 'Content-Type': contentType });
+ res.end(data);
+ }
+ } catch (err) {
+ if (err.code === 'ENOENT') {
+ res.writeHeader(404, { 'Content-Type': 'text/plain' });
+ res.end('404 Not Found');
+ } else {
+ res.writeHeader(500, { 'Content-Type': 'text/plain' });
+ res.end('500 Internal Server Error');
+ }
+ }
+});
+
+server.listen(PORT, () => {
+ console.log(`Server running at http://localhost:${PORT}/`);
+});