forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			61 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { Handler, Server } from "./server"
 | 
						|
import Script from "./Script"
 | 
						|
import { appendFileSync, existsSync, mkdirSync, writeFileSync } from "fs"
 | 
						|
import { mkdir } from "node:fs"
 | 
						|
import ScriptUtils from "./ScriptUtils"
 | 
						|
 | 
						|
class ServerErrorReport extends Script {
 | 
						|
    constructor() {
 | 
						|
        super("A server which receives and logs error reports")
 | 
						|
    }
 | 
						|
 | 
						|
    async main(args: string[]): Promise<void> {
 | 
						|
        const logDirectory = args[0] ?? "./error_logs"
 | 
						|
        console.log("Logging to directory", logDirectory)
 | 
						|
        if (!existsSync(logDirectory)) {
 | 
						|
            mkdirSync(logDirectory)
 | 
						|
            console.log("Created this directory")
 | 
						|
        }
 | 
						|
        let errorReport = 0
 | 
						|
        new Server(2348, {}, [
 | 
						|
            <Handler>{
 | 
						|
                mustMatch: "report",
 | 
						|
                mimetype: "application/json",
 | 
						|
                handle: async (_, queryParams, req, body) => {
 | 
						|
                    if (!body) {
 | 
						|
                        throw '{"error": "No body; use a post request"}'
 | 
						|
                    }
 | 
						|
                    console.log(body)
 | 
						|
                    const ip = <string>req.headers["x-forwarded-for"]
 | 
						|
                    const d = new Date()
 | 
						|
                    const date = d.toISOString()
 | 
						|
                    const file =
 | 
						|
                        logDirectory +
 | 
						|
                        "/" +
 | 
						|
                        d.getUTCFullYear() +
 | 
						|
                        "_" +
 | 
						|
                        d.getUTCMonth() +
 | 
						|
                        "_" +
 | 
						|
                        d.getUTCDay() +
 | 
						|
                        ".lines.json"
 | 
						|
                    try {
 | 
						|
                        body = JSON.parse(body)
 | 
						|
                    } catch (e) {
 | 
						|
                        // could not parse, we'll save it as is
 | 
						|
                    }
 | 
						|
                    const contents =
 | 
						|
                        "\n" + JSON.stringify({ ip, index: errorReport, date, message: body })
 | 
						|
                    if (!existsSync(file)) {
 | 
						|
                        writeFileSync(file, contents)
 | 
						|
                    } else {
 | 
						|
                        appendFileSync(file, contents)
 | 
						|
                    }
 | 
						|
                    errorReport++
 | 
						|
                    return `{"status":"ok", "nr": ${errorReport}}`
 | 
						|
                },
 | 
						|
            },
 | 
						|
        ])
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
new ServerErrorReport().run()
 |