aboutsummaryrefslogtreecommitdiff
path: root/src/http.ffi.mjs
diff options
context:
space:
mode:
authorHayleigh Thompson <me@hayleigh.dev>2023-12-06 22:01:42 +0000
committerHayleigh Thompson <me@hayleigh.dev>2023-12-06 22:01:42 +0000
commit507257ef238fa59687d33893596539a1ee546426 (patch)
treee3003a17627306def28693fde78697748c572391 /src/http.ffi.mjs
parent1231c522f4b85b8e1b224f8d14bba77166aa5c7e (diff)
downloadlustre-507257ef238fa59687d33893596539a1ee546426.tar.gz
lustre-507257ef238fa59687d33893596539a1ee546426.zip
:sparkles: Create a simple preview server for trying out lustre.
Diffstat (limited to 'src/http.ffi.mjs')
-rw-r--r--src/http.ffi.mjs90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/http.ffi.mjs b/src/http.ffi.mjs
new file mode 100644
index 0000000..56fd950
--- /dev/null
+++ b/src/http.ffi.mjs
@@ -0,0 +1,90 @@
+import { readFileSync } from "node:fs";
+import * as Fs from "node:fs/promises";
+import * as Http from "node:http";
+import * as Path from "node:path";
+import * as Process from "node:process";
+
+const cwd = Process.cwd();
+const root = Path.join(cwd, "build/dev/javascript");
+const toml = readFileSync(Path.join(cwd, "gleam.toml"), "utf-8");
+const name = toml.match(/name *= *"(.+)"/)[1];
+
+const html = `<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="UTF-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <title>Lustre preview server</title>
+
+ <script type="module">
+ import { main } from "./${name}/${name}.mjs"
+
+ document.addEventListener("DOMContentLoaded", () => {
+ main();
+ });
+ </script>
+</head>
+<body>
+ <div data-lustre-app></div>
+</body>
+</html>`;
+
+const server = Http.createServer((req, res) => {
+ switch (true) {
+ case req.url === "/": {
+ res.setHeader("Content-Type", "text/html");
+ res.statusCode = 200;
+ res.end(html);
+
+ break;
+ }
+
+ case req.url.endsWith(".js"):
+ case req.url.endsWith(".mjs"): {
+ Fs.readFile(Path.join(root, req.url), "utf-8")
+ .then((src) => {
+ res.setHeader("Content-Type", "application/javascript");
+ res.statusCode = 200;
+ res.end(src);
+ })
+ .catch((err) => {
+ res.statusCode = 404;
+ res.end(err);
+ });
+
+ break;
+ }
+
+ case req.url.endsWith(".css"): {
+ Fs.readFile(Path.join(root, req.url), "utf-8")
+ .then((src) => {
+ res.setHeader("Content-Type", "text/css");
+ res.statusCode = 200;
+ res.end(src);
+ })
+ .catch((err) => {
+ res.statusCode = 404;
+ res.end(err);
+ });
+
+ break;
+ }
+
+ default: {
+ Fs.readFile(Path.join(root, req.url), "utf-8")
+ .then((src) => {
+ res.setHeader("Content-Type", "text/plain");
+ res.statusCode = 200;
+ res.end(src);
+ })
+ .catch((err) => {
+ res.statusCode = 404;
+ res.end(err);
+ });
+ }
+ }
+});
+
+export const serve = (port) => {
+ server.listen(port, "localhost");
+};