import { Page } from "./metadata"; import generators from "./generate"; import express, { Router } from "express"; import morgan from "morgan"; import bodyParser from "body-parser"; import activitypub from "./activitypub"; import validateHttpSig from "./activitypub/middleware/http-signature"; import sqlite3 from "sqlite3"; const db = new (sqlite3.verbose().Database)(process.env.DB_PATH!); db.run("CREATE TABLE IF NOT EXISTS followers (id TEXT PRIMARY KEY, inbox TEXT)"); db.run("CREATE TABLE IF NOT EXISTS articles (id TEXT PRIMARY KEY, article_doc TEXT, conversation TEXT, has_federated INT)"); db.run("CREATE TABLE IF NOT EXISTS notes (id TEXT PRIMARY KEY, content TEXT, attributed_to TEXT, in_reply_to TEXT, conversation TEXT, published TEXT)"); db.run("CREATE TABLE IF NOT EXISTS actors (id TEXT PRIMARY KEY, display_name TEXT, inbox TEXT, icon_url TEXT, public_key_pem TEXT)") async function generate(): Promise { generators.copy(); generators.css(); generators.missing(); const tutorials = await generators.tutorials(); const posts = await generators.posts(); generators.homepage(posts); generators.redirects(posts); const categories = await generators.categories(posts); await generators.rss(posts, categories, tutorials); return posts; } const app = express(); app.set("db", db); app.use(morgan("dev")); app.use(bodyParser.json({ type: "application/activity+json" })); //db.run("DELETE FROM articles"); (async () => { const posts = await generate(); await activitypub.articles.setup(posts, db); const toFederate = await activitypub.articles.toFederate(db); const apRouter = Router(); apRouter.use(validateHttpSig); await activitypub.actor(apRouter); activitypub.comments(apRouter); activitypub.followers(apRouter); activitypub.inbox(apRouter); activitypub.webfinger(apRouter); activitypub.articles.route(apRouter); app.use(apRouter); app.use(express.static("out")); const port = process.env.PORT || 8083; app.listen(port, () => { console.log(`Listening on port ${port}`); activitypub.federate(toFederate, db); }); })();