Packages
lustre
3.1.4
5.7.1
5.7.0
5.6.0
5.5.2
5.5.1
5.5.0
5.4.0
5.3.5
5.3.4
5.3.3
5.3.2
5.3.1
5.3.0
5.2.1
5.2.0
5.1.1
5.1.0
5.0.3
5.0.2
5.0.1
5.0.0
4.6.4
4.6.3
4.6.2
4.6.1
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.6
4.3.5
4.3.4
4.3.3
4.3.2
4.3.1
4.3.0
4.2.6
4.2.5
4.2.4
4.2.3
4.2.2
4.2.1
4.2.0
4.1.8
4.1.7
4.1.6
4.1.5
4.1.4
4.1.3
4.1.2
4.1.1
4.1.0
4.0.0
4.0.0-rc1
4.0.0-rc.2
3.1.4
3.1.3
3.1.2
3.1.1
3.1.0
3.0.12
3.0.11
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
3.0.0-rc.8
3.0.0-rc.7
3.0.0-rc.6
3.0.0-rc.5
3.0.0-rc.4
3.0.0-rc.3
3.0.0-rc.2
3.0.0-rc.1
2.0.1
2.0.0
1.3.0
1.2.0
1.1.0
1.0.0
Create HTML templates, single page applications, Web Components, and real-time server components in Gleam!
Current section
Files
Jump to
Current section
Files
src/http.ffi.mjs
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];
let html;
const server = Http.createServer((req, res) => {
res.setHeader(
"Cache-Control",
"no-store, no-cache, must-revalidate, private"
);
res.setHeader("Pragma", "no-cache");
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();
});
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();
});
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();
});
}
}
});
export const serve = (
{ host, port, include_styles },
on_start,
on_port_taken
) => {
let is_first_try = true;
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>
${
include_styles
? `<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/lustre-labs/ui/priv/styles.css">`
: ""
}
<script type="module">
import { main } from "./${name}/${name}.mjs"
document.addEventListener("DOMContentLoaded", () => {
main();
});
</script>
</head>
<body>
<div data-lustre-app></div>
</body>
</html>`;
server
.on("error", (error) => {
if (error.code === "EADDRINUSE") {
if (is_first_try) {
on_port_taken(port);
is_first_try = false;
}
server.listen(++port, host);
}
})
.listen(port, host, () => {
on_start(port);
});
};