···11+# fill in and rename to .env
22+# note these aren't secrets, just config
33+KNOT_DOMAIN = "knot.gracekind.net"
44+OWNER_DID = "did:plc:p572wxnsuoogcrhlfrlizlrb"
55+REPO_NAME = "static-site-example"
···11+import PagesService from "./pages-service.js";
22+import express from "express";
33+import dotenv from "dotenv";
44+55+dotenv.config();
66+77+const pagesService = new PagesService({
88+ domain: process.env.KNOT_DOMAIN,
99+ ownerDid: process.env.OWNER_DID,
1010+ repoName: process.env.REPO_NAME,
1111+ verbose: process.env.NODE_ENV === "development",
1212+});
1313+1414+// preload to make sure there are no problems with the config
1515+await pagesService.loadConfig();
1616+1717+const app = express();
1818+1919+app.get("/{*any}", async (req, res) => {
2020+ const route = req.path;
2121+ const { status, content, contentType } = await pagesService.getPage(route);
2222+ res.status(status).set("Content-Type", contentType).send(content);
2323+});
2424+2525+function main() {
2626+ const server = app.listen(3000, () => {
2727+ console.log("Server is running on port 3000");
2828+ });
2929+3030+ server.on("error", (error) => {
3131+ console.error("Server error:", error);
3232+ });
3333+}
3434+3535+main();
+30
src/worker.js
···11+import PagesService from "./pages-service.js";
22+33+let pagesService = null;
44+55+// idk how long cloudflare will keep this around.
66+// it would be better to save the config in a KV store
77+// but this is good enough for now
88+function getPagesService(env) {
99+ if (!pagesService) {
1010+ pagesService = new PagesService({
1111+ domain: env.KNOT_DOMAIN,
1212+ ownerDid: env.OWNER_DID,
1313+ repoName: env.REPO_NAME,
1414+ verbose: env.NODE_ENV === "development",
1515+ });
1616+ }
1717+ return pagesService;
1818+}
1919+2020+export default {
2121+ async fetch(request, env, ctx) {
2222+ const route = new URL(request.url).pathname;
2323+ const pagesService = getPagesService(env);
2424+ const { status, content, contentType } = await pagesService.getPage(route);
2525+ return new Response(content, {
2626+ status,
2727+ headers: { "Content-Type": contentType },
2828+ });
2929+ },
3030+};