From 9907f7f60ffe62e1a47ffb303d7a969ff5cd5d56 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Sat, 7 Jun 2025 15:45:56 +0300 Subject: [PATCH] fix(desktop): CLS failing due to lack of listeners --- apps/server/src/routes/electron.ts | 172 +++++++++++++++++------------ 1 file changed, 104 insertions(+), 68 deletions(-) diff --git a/apps/server/src/routes/electron.ts b/apps/server/src/routes/electron.ts index ea4577e14..623552489 100644 --- a/apps/server/src/routes/electron.ts +++ b/apps/server/src/routes/electron.ts @@ -3,82 +3,118 @@ import type { Application } from "express"; import type { ParamsDictionary, Request, Response } from "express-serve-static-core"; import type QueryString from "qs"; import { Session, SessionData } from "express-session"; +import EventEmitter from "events"; type MockedResponse = Response, number>; function init(app: Application) { - const fakeSession: Session & Partial = { - id: "session-id", // Placeholder for session ID - cookie: { - originalMaxAge: 3600000, // 1 hour - }, - loggedIn: true, - regenerate(callback) { - callback?.(null); - return fakeSession; - }, - destroy(callback) { - callback?.(null); - return fakeSession; - }, - reload(callback) { - callback?.(null); - return fakeSession; - }, - save(callback) { - callback?.(null); - return fakeSession; - }, - resetMaxAge: () => fakeSession, - touch: () => fakeSession - }; - electron.ipcMain.on("server-request", (event, arg) => { - const req: Pick>, "url" | "method" | "body" | "headers" | "session"> = { - url: arg.url, - method: arg.method, - body: arg.data, - headers: arg.headers, - session: fakeSession - }; - - const respHeaders: Record = {}; - - const res: Pick, number>, "statusCode" | "getHeader" | "setHeader" | "header" | "status" | "send" | "locals" | "json"> = { - statusCode: 200, - getHeader: (name) => respHeaders[name], - setHeader: (name, value) => { - respHeaders[name] = value.toString(); - return res as MockedResponse; - }, - header(name: string, value?: string | string[]) { - respHeaders[name] = value ?? ""; - return res as MockedResponse; - }, - status: (statusCode) => { - res.statusCode = statusCode; - return res as MockedResponse; - }, - send: (obj) => { - event.sender.send("server-response", { - url: arg.url, - method: arg.method, - requestId: arg.requestId, - statusCode: res.statusCode, - headers: respHeaders, - body: obj - }); - return res as MockedResponse; - }, - locals: {}, - json: (obj) => { - res.send(JSON.stringify(obj)); - return res as MockedResponse; - } - }; + const req = new FakeRequest(arg); + const res = new FakeResponse(event, arg); return app.router(req as any, res as any, () => {}); }); } +const fakeSession: Session & Partial = { + id: "session-id", // Placeholder for session ID + cookie: { + originalMaxAge: 3600000, // 1 hour + }, + loggedIn: true, + regenerate(callback) { + callback?.(null); + return fakeSession; + }, + destroy(callback) { + callback?.(null); + return fakeSession; + }, + reload(callback) { + callback?.(null); + return fakeSession; + }, + save(callback) { + callback?.(null); + return fakeSession; + }, + resetMaxAge: () => fakeSession, + touch: () => fakeSession +}; + +interface Arg { + url: string; + method: string; + data: any; + headers: Record +} + +class FakeRequest extends EventEmitter implements Pick>, "url" | "method" | "body" | "headers" | "session"> { + url: string; + method: string; + body: any; + headers: Record; + session: Session & Partial; + + constructor(arg: Arg) { + super(); + this.url = arg.url; + this.method = arg.method; + this.body = arg.data; + this.headers = arg.headers; + this.session = fakeSession; + } +} + +class FakeResponse extends EventEmitter implements Pick, number>, "status" | "send" | "json" | "setHeader"> { + private respHeaders: Record = {}; + private event: Electron.IpcMainEvent; + private arg: Arg & { requestId: string; }; + statusCode: number = 200; + headers: Record = {}; + locals: Record = {}; + + constructor(event: Electron.IpcMainEvent, arg: Arg & { requestId: string; }) { + super(); + this.event = event; + this.arg = arg; + } + + getHeader(name) { + return this.respHeaders[name]; + } + + setHeader(name, value) { + this.respHeaders[name] = value.toString(); + return this as unknown as MockedResponse; + } + + header(name: string, value?: string | string[]) { + this.respHeaders[name] = value ?? ""; + return this as unknown as MockedResponse; + } + + status(statusCode) { + this.statusCode = statusCode; + return this as unknown as MockedResponse; + } + + send(obj) { + this.event.sender.send("server-response", { + url: this.arg.url, + method: this.arg.method, + requestId: this.arg.requestId, + statusCode: this.statusCode, + headers: this.respHeaders, + body: obj + }); + return this as unknown as MockedResponse; + } + + json(obj) { + this.send(JSON.stringify(obj)); + return this as unknown as MockedResponse; + } +} + export default init;