jank-client-fork/src/index.ts
2024-09-24 11:58:42 -05:00

141 lines
3.7 KiB
JavaScript

#!/usr/bin/env node
import compression from"compression";
import express, { Request, Response }from"express";
import fs from"node:fs";
import fetch from"node-fetch";
import path from"node:path";
import{ observe, uptime }from"./stats.js";
import{ getApiUrls, inviteResponse }from"./utils.js";
import{ fileURLToPath }from"node:url";
const devmode = (process.env.NODE_ENV || 'development')==='development';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
interface Instance {
name: string;
[key: string]: any;
}
const app = express();
import instances from"./webpage/instances.json" with { type: "json" };
const instanceNames = new Map<string, Instance>();
for(const instance of instances){
instanceNames.set(instance.name, instance);
}
app.use(compression());
async function updateInstances(): Promise<void>{
try{
const response = await fetch(
"https://raw.githubusercontent.com/spacebarchat/spacebarchat/master/instances/instances.json"
);
const json = (await response.json()) as Instance[];
for(const instance of json){
if(instanceNames.has(instance.name)){
const existingInstance = instanceNames.get(instance.name);
if(existingInstance){
for(const key of Object.keys(instance)){
if(!existingInstance[key]){
existingInstance[key] = instance[key];
}
}
}
}else{
instances.push(instance as any);
}
}
observe(instances);
}catch(error){
console.error("Error updating instances:", error);
}
}
//updateInstances();
app.use("/getupdates", (_req: Request, res: Response)=>{
try{
const stats = fs.statSync(path.join(__dirname, "webpage"));
res.send(stats.mtimeMs.toString());
}catch(error){
console.error("Error getting updates:", error);
res.status(500).send("Error getting updates");
}
});
app.use("/services/oembed", (req: Request, res: Response)=>{
inviteResponse(req, res);
});
app.use("/uptime", (req: Request, res: Response)=>{
const instanceUptime = uptime[req.query.name as string];
res.send(instanceUptime);
});
app.use("/", async (req: Request, res: Response)=>{
const scheme = req.secure ? "https" : "http";
const host = `${scheme}://${req.get("Host")}`;
const ref = host + req.originalUrl;
if(host && ref){
const link = `${host}/services/oembed?url=${encodeURIComponent(ref)}`;
res.set(
"Link",
`<${link}>; rel="alternate"; type="application/json+oembed"; title="Jank Client oEmbed format"`
);
}
if(req.path === "/"){
res.sendFile(path.join(__dirname, "webpage", "home.html"));
return;
}
if(req.path.startsWith("/instances.json")){
res.json(instances);
return;
}
if(req.path.startsWith("/invite/")){
res.sendFile(path.join(__dirname, "webpage", "invite.html"));
return;
}
const filePath = path.join(__dirname, "webpage", req.path);
if(fs.existsSync(filePath)){
if(devmode){
const filePath2 = path.join(__dirname, "../src/webpage", req.path);
if(fs.existsSync(filePath2)){
res.sendFile(filePath2);
return;
}
}
res.sendFile(filePath);
}else if(fs.existsSync(`${filePath}.html`)){
if(devmode){
const filePath2 = path.join(__dirname, "../src/webpage", req.path);
if(fs.existsSync(filePath2+".html")){
res.sendFile(filePath2+".html");
return;
}
}
res.sendFile(`${filePath}.html`);
}else{
if(req.path.startsWith("/src/webpage")){
const filePath2 = path.join(__dirname, "..", req.path);
if(fs.existsSync(`${filePath2}`)){
res.sendFile(filePath2);
return;
}
}
res.sendFile(path.join(__dirname, "webpage", "index.html"));
}
});
const PORT = process.env.PORT || Number(process.argv[2]) || 8080;
app.listen(PORT, ()=>{
console.log(`Server running on port ${PORT}`);
});
export{ getApiUrls };