Loading Dockerfile +0 −3 Original line number Diff line number Diff line Loading @@ -123,9 +123,6 @@ ENV PORT 3000 ENV NODE_ENV production ENV SERVE_CLIENT /home/node/app/packages/client ENV SERVE_ADMIN /home/node/app/packages/admin ENV PIXEL_LOG_PATH /home/node/app/pixel.log VOLUME /home/node/app/pixel.log EXPOSE 3000 # profiler port, only used if profiler is explicity running Loading packages/server/src/api/admin.ts +12 −13 Original line number Diff line number Diff line Loading @@ -3,7 +3,6 @@ import { Router } from "express"; import { CanvasController } from "../controllers/CanvasController"; import { SocketController } from "../controllers/SocketController"; import { getLogger } from "../lib/Logger"; import { LogMan } from "../lib/LogMan"; import { prisma } from "../lib/prisma"; import { RateLimiter } from "../lib/RateLimiter"; import { AuditLog } from "../models/AuditLog"; Loading Loading @@ -91,7 +90,7 @@ app.post("/canvas/size", async (req, res) => { // we log this here because Canvas#setSize is ran at launch // this is currently the only way the size is changed is via the API LogMan.log("canvas_size", { width, height }); // LogMan.log("canvas_size", { width, height }); const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = AuditLog.Factory(user.sub) Loading Loading @@ -119,7 +118,7 @@ app.post("/canvas/freeze", async (req, res) => { await CanvasController.get().setFrozen(true); // same reason as canvas size changes, we log this here because #setFrozen is ran at startup LogMan.log("canvas_freeze", {}); // LogMan.log("canvas_freeze", {}); const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = AuditLog.Factory(user.sub) Loading @@ -140,7 +139,7 @@ app.delete("/canvas/freeze", async (req, res) => { await CanvasController.get().setFrozen(false); // same reason as canvas size changes, we log this here because #setFrozen is ran at startup LogMan.log("canvas_unfreeze", {}); // LogMan.log("canvas_unfreeze", {}); const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = AuditLog.Factory(user.sub) Loading Loading @@ -268,10 +267,10 @@ app.put("/canvas/undo", async (req, res) => { return; } const user_sub = req.session.user!.user.username + "@" + req.session.user!.service.instance.hostname; // const user_sub = // req.session.user!.user.username + // "@" + // req.session.user!.service.instance.hostname; const start_position: [x: number, y: number] = [ req.body.start.x, req.body.start.y, Loading Loading @@ -301,11 +300,11 @@ app.put("/canvas/undo", async (req, res) => { }); // TODO: this spams the log, it would be nicer if it combined LogMan.log("mod_rollback", user_sub, { x: pixel.pixel.x, y: pixel.pixel.y, hex: coveredPixel?.color, }); // LogMan.log("mod_rollback", user_sub, { // x: pixel.pixel.x, // y: pixel.pixel.y, // hex: coveredPixel?.color, // }); break; } case "rejected": Loading packages/server/src/controllers/CanvasController.ts +11 −12 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ import { import { Socket } from "socket.io"; import { getLogger } from "../lib/Logger"; import { LogMan } from "../lib/LogMan"; import { prisma } from "../lib/prisma"; import { Settings } from "../lib/Settings"; import { callCacheWorker, getCacheWorkerIdForCoords } from "../workers/worker"; Loading Loading @@ -262,11 +261,11 @@ export class CanvasController { }); } LogMan.log("pixel_undo", pixel.userId, { x: pixel.x, y: pixel.y, hex: coveringPixel?.color, }); // LogMan.log("pixel_undo", pixel.userId, { // x: pixel.x, // y: pixel.y, // hex: coveringPixel?.color, // }); return coveringPixel; } Loading Loading @@ -450,7 +449,7 @@ export class CanvasController { })) ); LogMan.log("mod_fill", user.sub, { from: start, to: end, hex }); // LogMan.log("mod_fill", user.sub, { from: start, to: end, hex }); } async setPixel( Loading Loading @@ -484,11 +483,11 @@ export class CanvasController { await this.updateCanvasRedisAtPos(x, y); Logger.info(`${user.sub} placed pixel at (${x}, ${y})`); LogMan.log(isModAction ? "mod_override" : "pixel_place", user.sub, { x, y, hex, }); // LogMan.log(isModAction ? "mod_override" : "pixel_place", user.sub, { // x, // y, // hex, // }); } /** Loading packages/server/src/lib/LogMan.tsdeleted 100644 → 0 +0 −86 Original line number Diff line number Diff line import { PixelLogger } from "./Logger"; interface UserEvents { pixel_place: { x: number; y: number; hex: string }; pixel_undo: { x: number; y: number; hex?: string }; mod_fill: { from: [x: number, y: number]; to: [x: number, y: number]; hex: string; }; mod_override: { x: number; y: number; hex: string }; mod_rollback: { x: number; y: number; hex?: string }; mod_rollback_undo: { x: number; y: number; hex?: string }; } interface SystemEvents { canvas_size: { width: number; height: number }; canvas_freeze: object; canvas_unfreeze: object; } /** * Handle logs that should be written to a text file * * This could be used as an EventEmitter in the future, but as of right now * it just adds typing to logging of these events * * TODO: better name, this one is not it * * @see #57 */ class LogMan_ { log<EventName extends keyof SystemEvents>( event: EventName, data: SystemEvents[EventName] ): void; log<EventName extends keyof UserEvents>( event: EventName, user: string, data: UserEvents[EventName] ): void; log<EventName extends keyof UserEvents | keyof SystemEvents>( event: EventName, ...params: EventName extends keyof UserEvents ? [user: string, data: UserEvents[EventName]] : EventName extends keyof SystemEvents ? [data: SystemEvents[EventName]] : never ): void { const parts: string[] = []; if (params.length === 2) { // user event const user = params[0] as string; parts.push(user, event); if (event === "mod_fill") { // this event format has a different line format const data: UserEvents["mod_fill"] = params[1] as any; parts.push(data.from.join(","), data.to.join(","), data.hex); } else { const data: UserEvents[Exclude<keyof UserEvents, "mod_fill">] = params[1] as any; parts.push(...[data.x, data.y, data.hex || "unset"].map((a) => a + "")); } } else { // system event parts.push("system", event); switch (event) { case "canvas_size": { const data: SystemEvents["canvas_size"] = params[0] as any; const { width, height } = data; parts.push(width + "", height + ""); break; } } } PixelLogger.info(parts.join("\t")); } } export const LogMan = new LogMan_(); packages/server/src/lib/Logger.ts +0 −18 Original line number Diff line number Diff line import path from "node:path"; import winston, { format } from "winston"; import { createEnum } from "./utils"; // if PIXEL_LOG_PATH is defined, use that, otherwise default to packages/server root const PIXEL_LOG_PATH = process.env.PIXEL_LOG_PATH || path.join(__dirname, "..", "..", "pixels.log"); const formatter = format.printf((options) => { let maxModuleWidth = 0; for (const module of Object.values(LoggerType)) { Loading Loading @@ -62,18 +56,6 @@ const Winston = winston.createLogger({ transports: [new winston.transports.Console()], }); // Used by LogMan for writing to pixels.log export const PixelLogger = winston.createLogger({ format: format.printf((options) => { return [new Date().toISOString(), options.message].join("\t"); }), transports: [ new winston.transports.File({ filename: PIXEL_LOG_PATH, }), ], }); export const LoggerType = createEnum([ "MAIN", "SETTINGS", Loading Loading
Dockerfile +0 −3 Original line number Diff line number Diff line Loading @@ -123,9 +123,6 @@ ENV PORT 3000 ENV NODE_ENV production ENV SERVE_CLIENT /home/node/app/packages/client ENV SERVE_ADMIN /home/node/app/packages/admin ENV PIXEL_LOG_PATH /home/node/app/pixel.log VOLUME /home/node/app/pixel.log EXPOSE 3000 # profiler port, only used if profiler is explicity running Loading
packages/server/src/api/admin.ts +12 −13 Original line number Diff line number Diff line Loading @@ -3,7 +3,6 @@ import { Router } from "express"; import { CanvasController } from "../controllers/CanvasController"; import { SocketController } from "../controllers/SocketController"; import { getLogger } from "../lib/Logger"; import { LogMan } from "../lib/LogMan"; import { prisma } from "../lib/prisma"; import { RateLimiter } from "../lib/RateLimiter"; import { AuditLog } from "../models/AuditLog"; Loading Loading @@ -91,7 +90,7 @@ app.post("/canvas/size", async (req, res) => { // we log this here because Canvas#setSize is ran at launch // this is currently the only way the size is changed is via the API LogMan.log("canvas_size", { width, height }); // LogMan.log("canvas_size", { width, height }); const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = AuditLog.Factory(user.sub) Loading Loading @@ -119,7 +118,7 @@ app.post("/canvas/freeze", async (req, res) => { await CanvasController.get().setFrozen(true); // same reason as canvas size changes, we log this here because #setFrozen is ran at startup LogMan.log("canvas_freeze", {}); // LogMan.log("canvas_freeze", {}); const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = AuditLog.Factory(user.sub) Loading @@ -140,7 +139,7 @@ app.delete("/canvas/freeze", async (req, res) => { await CanvasController.get().setFrozen(false); // same reason as canvas size changes, we log this here because #setFrozen is ran at startup LogMan.log("canvas_unfreeze", {}); // LogMan.log("canvas_unfreeze", {}); const user = (await User.fromAuthSession(req.session.user!))!; const auditLog = AuditLog.Factory(user.sub) Loading Loading @@ -268,10 +267,10 @@ app.put("/canvas/undo", async (req, res) => { return; } const user_sub = req.session.user!.user.username + "@" + req.session.user!.service.instance.hostname; // const user_sub = // req.session.user!.user.username + // "@" + // req.session.user!.service.instance.hostname; const start_position: [x: number, y: number] = [ req.body.start.x, req.body.start.y, Loading Loading @@ -301,11 +300,11 @@ app.put("/canvas/undo", async (req, res) => { }); // TODO: this spams the log, it would be nicer if it combined LogMan.log("mod_rollback", user_sub, { x: pixel.pixel.x, y: pixel.pixel.y, hex: coveredPixel?.color, }); // LogMan.log("mod_rollback", user_sub, { // x: pixel.pixel.x, // y: pixel.pixel.y, // hex: coveredPixel?.color, // }); break; } case "rejected": Loading
packages/server/src/controllers/CanvasController.ts +11 −12 Original line number Diff line number Diff line Loading @@ -7,7 +7,6 @@ import { import { Socket } from "socket.io"; import { getLogger } from "../lib/Logger"; import { LogMan } from "../lib/LogMan"; import { prisma } from "../lib/prisma"; import { Settings } from "../lib/Settings"; import { callCacheWorker, getCacheWorkerIdForCoords } from "../workers/worker"; Loading Loading @@ -262,11 +261,11 @@ export class CanvasController { }); } LogMan.log("pixel_undo", pixel.userId, { x: pixel.x, y: pixel.y, hex: coveringPixel?.color, }); // LogMan.log("pixel_undo", pixel.userId, { // x: pixel.x, // y: pixel.y, // hex: coveringPixel?.color, // }); return coveringPixel; } Loading Loading @@ -450,7 +449,7 @@ export class CanvasController { })) ); LogMan.log("mod_fill", user.sub, { from: start, to: end, hex }); // LogMan.log("mod_fill", user.sub, { from: start, to: end, hex }); } async setPixel( Loading Loading @@ -484,11 +483,11 @@ export class CanvasController { await this.updateCanvasRedisAtPos(x, y); Logger.info(`${user.sub} placed pixel at (${x}, ${y})`); LogMan.log(isModAction ? "mod_override" : "pixel_place", user.sub, { x, y, hex, }); // LogMan.log(isModAction ? "mod_override" : "pixel_place", user.sub, { // x, // y, // hex, // }); } /** Loading
packages/server/src/lib/LogMan.tsdeleted 100644 → 0 +0 −86 Original line number Diff line number Diff line import { PixelLogger } from "./Logger"; interface UserEvents { pixel_place: { x: number; y: number; hex: string }; pixel_undo: { x: number; y: number; hex?: string }; mod_fill: { from: [x: number, y: number]; to: [x: number, y: number]; hex: string; }; mod_override: { x: number; y: number; hex: string }; mod_rollback: { x: number; y: number; hex?: string }; mod_rollback_undo: { x: number; y: number; hex?: string }; } interface SystemEvents { canvas_size: { width: number; height: number }; canvas_freeze: object; canvas_unfreeze: object; } /** * Handle logs that should be written to a text file * * This could be used as an EventEmitter in the future, but as of right now * it just adds typing to logging of these events * * TODO: better name, this one is not it * * @see #57 */ class LogMan_ { log<EventName extends keyof SystemEvents>( event: EventName, data: SystemEvents[EventName] ): void; log<EventName extends keyof UserEvents>( event: EventName, user: string, data: UserEvents[EventName] ): void; log<EventName extends keyof UserEvents | keyof SystemEvents>( event: EventName, ...params: EventName extends keyof UserEvents ? [user: string, data: UserEvents[EventName]] : EventName extends keyof SystemEvents ? [data: SystemEvents[EventName]] : never ): void { const parts: string[] = []; if (params.length === 2) { // user event const user = params[0] as string; parts.push(user, event); if (event === "mod_fill") { // this event format has a different line format const data: UserEvents["mod_fill"] = params[1] as any; parts.push(data.from.join(","), data.to.join(","), data.hex); } else { const data: UserEvents[Exclude<keyof UserEvents, "mod_fill">] = params[1] as any; parts.push(...[data.x, data.y, data.hex || "unset"].map((a) => a + "")); } } else { // system event parts.push("system", event); switch (event) { case "canvas_size": { const data: SystemEvents["canvas_size"] = params[0] as any; const { width, height } = data; parts.push(width + "", height + ""); break; } } } PixelLogger.info(parts.join("\t")); } } export const LogMan = new LogMan_();
packages/server/src/lib/Logger.ts +0 −18 Original line number Diff line number Diff line import path from "node:path"; import winston, { format } from "winston"; import { createEnum } from "./utils"; // if PIXEL_LOG_PATH is defined, use that, otherwise default to packages/server root const PIXEL_LOG_PATH = process.env.PIXEL_LOG_PATH || path.join(__dirname, "..", "..", "pixels.log"); const formatter = format.printf((options) => { let maxModuleWidth = 0; for (const module of Object.values(LoggerType)) { Loading Loading @@ -62,18 +56,6 @@ const Winston = winston.createLogger({ transports: [new winston.transports.Console()], }); // Used by LogMan for writing to pixels.log export const PixelLogger = winston.createLogger({ format: format.printf((options) => { return [new Date().toISOString(), options.message].join("\t"); }), transports: [ new winston.transports.File({ filename: PIXEL_LOG_PATH, }), ], }); export const LoggerType = createEnum([ "MAIN", "SETTINGS", Loading