From 8b538e28021f73da137c8d83117f9cb391a6ec0b Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Fri, 27 Feb 2026 20:52:38 -0800 Subject: [PATCH] dedupe --- .../Layers/ProjectionPipeline.ts | 37 ++++--------------- apps/server/src/projectFaviconRoute.ts | 26 +++++++++++++ apps/server/src/wsServer.ts | 4 +- 3 files changed, 34 insertions(+), 33 deletions(-) diff --git a/apps/server/src/orchestration/Layers/ProjectionPipeline.ts b/apps/server/src/orchestration/Layers/ProjectionPipeline.ts index d0231c20c3664ae798ae32b1e36c355b5c000677..8dbdfccc64249e42a19e29966d9a17a9ab755b52 100644 --- a/apps/server/src/orchestration/Layers/ProjectionPipeline.ts +++ b/apps/server/src/orchestration/Layers/ProjectionPipeline.ts @@ -38,6 +38,11 @@ import { OrchestrationProjectionPipeline, type OrchestrationProjectionPipelineShape, } from "../Services/ProjectionPipeline.ts"; +import { + ATTACHMENTS_ROUTE_PREFIX, + IMAGE_EXTENSION_BY_MIME_TYPE, + SAFE_IMAGE_FILE_EXTENSIONS, +} from "../../projectFaviconRoute.ts"; export const ORCHESTRATION_PROJECTOR_NAMES = { projects: "projection.projects", @@ -61,31 +66,6 @@ interface ProjectorDefinition { ) => Effect.Effect; } -const ATTACHMENTS_ROUTE_PREFIX = "/attachments"; -const ATTACHMENTS_STATE_SUBDIRECTORY = "attachments"; -const IMAGE_EXTENSION_BY_MIME_TYPE: Record = { - "image/png": ".png", - "image/jpeg": ".jpg", - "image/jpg": ".jpg", - "image/gif": ".gif", - "image/webp": ".webp", - "image/svg+xml": ".svg", - "image/bmp": ".bmp", - "image/tiff": ".tiff", - "image/heic": ".heic", -}; -const SAFE_IMAGE_FILE_EXTENSIONS = new Set([ - ".jpg", - ".jpeg", - ".png", - ".gif", - ".webp", - ".bmp", - ".tiff", - ".svg", - ".ico", -]); - interface PendingAttachmentWrite { readonly absolutePath: string; readonly bytes: Uint8Array; @@ -133,7 +113,7 @@ const materializeAttachmentsForProjection = Effect.fn(function* (input: { if (Option.isNone(serverConfig)) return input.attachments; const path = yield* Path.Path; - const attachmentsRootDir = path.join(serverConfig.value.stateDir, ATTACHMENTS_STATE_SUBDIRECTORY); + const attachmentsRootDir = path.join(serverConfig.value.stateDir, "attachments"); const threadSegment = encodeURIComponent(input.threadId); const messageSegment = encodeURIComponent(input.messageId); @@ -332,10 +312,7 @@ const runAttachmentSideEffects = Effect.fn(function* (input: { return; } - const attachmentsRootDir = input.path.join( - serverConfig.value.stateDir, - ATTACHMENTS_STATE_SUBDIRECTORY, - ); + const attachmentsRootDir = input.path.join(serverConfig.value.stateDir, "attachments"); yield* Effect.forEach( input.sideEffects.deletedThreadIds, diff --git a/apps/server/src/projectFaviconRoute.ts b/apps/server/src/projectFaviconRoute.ts index 4d66f0e86f3156ef6c7f194969acbab0b0ac2ea5..cddf2c15af1ae1e944750b9c798ea156a29fd989 100644 --- a/apps/server/src/projectFaviconRoute.ts +++ b/apps/server/src/projectFaviconRoute.ts @@ -2,6 +2,32 @@ import fs from "node:fs"; import http from "node:http"; import path from "node:path"; +export const ATTACHMENTS_ROUTE_PREFIX = "/attachments"; + +export const IMAGE_EXTENSION_BY_MIME_TYPE: Record = { + "image/png": ".png", + "image/jpeg": ".jpg", + "image/jpg": ".jpg", + "image/gif": ".gif", + "image/webp": ".webp", + "image/svg+xml": ".svg", + "image/bmp": ".bmp", + "image/tiff": ".tiff", + "image/heic": ".heic", +}; + +export const SAFE_IMAGE_FILE_EXTENSIONS = new Set([ + ".jpg", + ".jpeg", + ".png", + ".gif", + ".webp", + ".bmp", + ".tiff", + ".svg", + ".ico", +]); + const FAVICON_MIME_TYPES: Record = { ".png": "image/png", ".jpg": "image/jpeg", diff --git a/apps/server/src/wsServer.ts b/apps/server/src/wsServer.ts index 4fc3bd80c8253ee7155b5d183140888297d8cb4b..3e48ecc544c16b6f782638503c32989bdb526891 100644 --- a/apps/server/src/wsServer.ts +++ b/apps/server/src/wsServer.ts @@ -55,9 +55,7 @@ import { clamp } from "effect/Number"; import { Open } from "./open"; import { ServerConfig } from "./config"; import { GitCore } from "./git/Services/GitCore.ts"; -import { tryHandleProjectFaviconRequest } from "./projectFaviconRoute"; - -const ATTACHMENTS_ROUTE_PREFIX = "/attachments/"; +import { ATTACHMENTS_ROUTE_PREFIX, tryHandleProjectFaviconRequest } from "./projectFaviconRoute"; /** * ServerShape - Service API for server lifecycle control. -- 2.54.0