Add paged chat history loading

This commit is contained in:
Federico Jaramillo Martinez
2026-05-07 15:46:08 +02:00
parent 5430a44561
commit eb59f1eb00
42 changed files with 1894 additions and 333 deletions
+22 -12
View File
@@ -2,15 +2,17 @@ import type { FastifyInstance, FastifyReply } from "fastify";
import { WebSocket, type RawData } from "ws";
import { SessionDaemonClient } from "./sessionDaemonClient.js";
export async function registerSessionProxyRoutes(app: FastifyInstance, daemon = new SessionDaemonClient()): Promise<void> {
export function registerSessionProxyRoutes(app: FastifyInstance, daemon = new SessionDaemonClient()): void {
const proxy = async (request: { method: string; url: string; body?: unknown }, reply: FastifyReply) => {
try {
const upstream = await daemon.request(request.method, stripApiPrefix(request.url), request.body);
reply.code(upstream.statusCode);
if (upstream.headers["content-type"]) reply.header("content-type", upstream.headers["content-type"]);
return upstream.body ? JSON.parse(upstream.body) : undefined;
const contentType = upstream.headers["content-type"];
if (contentType !== undefined && contentType !== "") reply.header("content-type", contentType);
return upstream.body !== "" ? parseJson(upstream.body) : undefined;
} catch (error) {
requestFailed(reply, error);
return undefined;
}
};
@@ -36,22 +38,30 @@ export async function registerSessionProxyRoutes(app: FastifyInstance, daemon =
}
function stripApiPrefix(url: string): string {
return url.startsWith("/api") ? url.slice(4) || "/" : url;
const stripped = url.startsWith("/api") ? url.slice(4) : url;
return stripped === "" ? "/" : stripped;
}
function requestFailed(reply: FastifyReply, error: unknown) {
function parseJson(text: string): unknown {
const value: unknown = JSON.parse(text);
return value;
}
function requestFailed(reply: FastifyReply, error: unknown): void {
reply.code(502).send({ error: `Session daemon unavailable: ${error instanceof Error ? error.message : String(error)}` });
}
function bridgeSockets(client: WebSocket, upstream: WebSocket): void {
client.on("message", (data) => sendIfOpen(upstream, data));
upstream.on("message", (data) => sendIfOpen(client, data));
client.on("close", () => upstream.close());
upstream.on("close", () => client.close());
upstream.on("error", () => client.close());
client.on("error", () => upstream.close());
client.on("message", (data) => { sendIfOpen(upstream, data); });
upstream.on("message", (data) => { sendIfOpen(client, data); });
client.on("close", () => { upstream.close(); });
upstream.on("close", () => { client.close(); });
upstream.on("error", () => { client.close(); });
client.on("error", () => { upstream.close(); });
}
function sendIfOpen(socket: WebSocket, data: RawData): void {
if (socket.readyState === WebSocket.OPEN) socket.send(data);
if (socket.readyState === WebSocket.OPEN) {
socket.send(data);
}
}