From fc22278b58f5092241d8e591149d5ef9ed2c58c0 Mon Sep 17 00:00:00 2001 From: geoffsee <> Date: Tue, 27 May 2025 14:46:32 -0400 Subject: [PATCH] Remove unused services and refactor SDK structure Deleted outdated SDKs and services, including DocumentService and markdown-sdk. Consolidated and relocated SDKs into a unified "providers" structure to improve maintainability. Updated imports and adjusted utils naming for consistency. --- src/components/chat/input-menu/InputMenu.tsx | 2 +- src/components/chat/input/ChatInput.tsx | 2 +- src/{layout => hooks}/_IsMobileHook.ts | 0 src/{layout => hooks}/useMaxWidth.ts | 0 src/{layout => hooks}/usePageLoaded.ts | 0 src/layout/Content.tsx | 1 + workers/site/context.ts | 3 - .../{sdk/models => providers}/cerebras.ts | 2 +- .../site/{sdk/models => providers}/claude.ts | 2 +- .../{sdk/models => providers}/cloudflareAi.ts | 2 +- .../{sdk/models => providers}/fireworks.ts | 5 +- .../site/{sdk/models => providers}/google.ts | 4 +- .../site/{sdk/models => providers}/groq.ts | 2 +- .../site/{sdk/models => providers}/openai.ts | 2 +- workers/site/{sdk/models => providers}/xai.ts | 2 +- workers/site/sdk/assistant-sdk.ts | 8 +- workers/site/sdk/markdown-sdk.ts | 54 ------ workers/site/sdk/message-sdk.ts | 156 ------------------ workers/site/sdk/perigon-sdk.ts | 97 ----------- workers/site/sdk/stream-processor-sdk.ts | 38 ----- workers/site/sdk/{sdk.ts => utils.ts} | 2 +- workers/site/services/ChatService.ts | 16 +- workers/site/services/DocumentService.ts | 145 ---------------- workers/site/worker.ts | 4 +- 24 files changed, 28 insertions(+), 521 deletions(-) rename src/{layout => hooks}/_IsMobileHook.ts (100%) rename src/{layout => hooks}/useMaxWidth.ts (100%) rename src/{layout => hooks}/usePageLoaded.ts (100%) rename workers/site/{sdk/models => providers}/cerebras.ts (98%) rename workers/site/{sdk/models => providers}/claude.ts (98%) rename workers/site/{sdk/models => providers}/cloudflareAi.ts (99%) rename workers/site/{sdk/models => providers}/fireworks.ts (94%) rename workers/site/{sdk/models => providers}/google.ts (95%) rename workers/site/{sdk/models => providers}/groq.ts (98%) rename workers/site/{sdk/models => providers}/openai.ts (98%) rename workers/site/{sdk/models => providers}/xai.ts (98%) delete mode 100644 workers/site/sdk/markdown-sdk.ts delete mode 100644 workers/site/sdk/message-sdk.ts delete mode 100644 workers/site/sdk/perigon-sdk.ts delete mode 100644 workers/site/sdk/stream-processor-sdk.ts rename workers/site/sdk/{sdk.ts => utils.ts} (98%) delete mode 100644 workers/site/services/DocumentService.ts diff --git a/src/components/chat/input-menu/InputMenu.tsx b/src/components/chat/input-menu/InputMenu.tsx index dfcb4e1..7f473e9 100644 --- a/src/components/chat/input-menu/InputMenu.tsx +++ b/src/components/chat/input-menu/InputMenu.tsx @@ -19,7 +19,7 @@ import ClientChatStore from "../../../stores/ClientChatStore"; import clientChatStore from "../../../stores/ClientChatStore"; import FlyoutSubMenu from "./FlyoutSubMenu"; import { useIsMobile } from "../../contexts/MobileContext"; -import { useIsMobile as useIsMobileUserAgent } from "../../../layout/_IsMobileHook"; +import { useIsMobile as useIsMobileUserAgent } from "../../../hooks/_IsMobileHook"; import { getModelFamily, SUPPORTED_MODELS } from "../lib/SupportedModels"; import { formatConversationMarkdown } from "../lib/exportConversationAsMarkdown"; diff --git a/src/components/chat/input/ChatInput.tsx b/src/components/chat/input/ChatInput.tsx index 09ff6d6..9358314 100644 --- a/src/components/chat/input/ChatInput.tsx +++ b/src/components/chat/input/ChatInput.tsx @@ -11,7 +11,7 @@ import chatStore from "../../../stores/ClientChatStore"; import InputMenu from "../input-menu/InputMenu"; import InputTextarea from "./ChatInputTextArea"; import SendButton from "./ChatInputSendButton"; -import { useMaxWidth } from "../../../layout/useMaxWidth"; +import { useMaxWidth } from "../../../hooks/useMaxWidth"; import userOptionsStore from "../../../stores/UserOptionsStore"; const ChatInput = observer(() => { diff --git a/src/layout/_IsMobileHook.ts b/src/hooks/_IsMobileHook.ts similarity index 100% rename from src/layout/_IsMobileHook.ts rename to src/hooks/_IsMobileHook.ts diff --git a/src/layout/useMaxWidth.ts b/src/hooks/useMaxWidth.ts similarity index 100% rename from src/layout/useMaxWidth.ts rename to src/hooks/useMaxWidth.ts diff --git a/src/layout/usePageLoaded.ts b/src/hooks/usePageLoaded.ts similarity index 100% rename from src/layout/usePageLoaded.ts rename to src/hooks/usePageLoaded.ts diff --git a/src/layout/Content.tsx b/src/layout/Content.tsx index 093a98f..2efcfa6 100644 --- a/src/layout/Content.tsx +++ b/src/layout/Content.tsx @@ -1,6 +1,7 @@ import { Flex } from "@chakra-ui/react"; import React from "react"; import { useIsMobile } from "../components/contexts/MobileContext"; + function Content({ children }) { const isMobile = useIsMobile(); return ( diff --git a/workers/site/context.ts b/workers/site/context.ts index 103a112..c86dc5d 100644 --- a/workers/site/context.ts +++ b/workers/site/context.ts @@ -4,7 +4,6 @@ import AssetService from "./services/AssetService"; import MetricsService from "./services/MetricsService"; import ChatService from "./services/ChatService"; import TransactionService from "./services/TransactionService"; -import DocumentService from "./services/DocumentService"; import FeedbackService from "./services/FeedbackService"; const Context = types @@ -14,7 +13,6 @@ const Context = types assetService: types.optional(AssetService, {}), metricsService: types.optional(MetricsService, {}), transactionService: types.optional(TransactionService, {}), - documentService: types.optional(DocumentService, {}), feedbackService: types.optional(FeedbackService, {}), }) .actions((self) => { @@ -45,7 +43,6 @@ const createServerContext = (env, ctx) => { contactService: ContactService.create({}), assetService: AssetService.create({}), transactionService: TransactionService.create({}), - documentService: DocumentService.create({}), feedbackService: FeedbackService.create({}), metricsService: MetricsService.create({ isCollectingMetrics: true, diff --git a/workers/site/sdk/models/cerebras.ts b/workers/site/providers/cerebras.ts similarity index 98% rename from workers/site/sdk/models/cerebras.ts rename to workers/site/providers/cerebras.ts index 815ece2..316bcb7 100644 --- a/workers/site/sdk/models/cerebras.ts +++ b/workers/site/providers/cerebras.ts @@ -6,7 +6,7 @@ import { ModelSnapshotType2, UnionStringArray, } from "mobx-state-tree"; -import ChatSdk from "../chat-sdk"; +import ChatSdk from "../sdk/chat-sdk"; export class CerebrasSdk { static async handleCerebrasStream( diff --git a/workers/site/sdk/models/claude.ts b/workers/site/providers/claude.ts similarity index 98% rename from workers/site/sdk/models/claude.ts rename to workers/site/providers/claude.ts index 4ce15f4..14b9c96 100644 --- a/workers/site/sdk/models/claude.ts +++ b/workers/site/providers/claude.ts @@ -7,7 +7,7 @@ import { ModelSnapshotType2, UnionStringArray, } from "mobx-state-tree"; -import ChatSdk from "../chat-sdk"; +import ChatSdk from "../sdk/chat-sdk"; export class ClaudeChatSdk { private static async streamClaudeResponse( diff --git a/workers/site/sdk/models/cloudflareAi.ts b/workers/site/providers/cloudflareAi.ts similarity index 99% rename from workers/site/sdk/models/cloudflareAi.ts rename to workers/site/providers/cloudflareAi.ts index b078a43..9bd8968 100644 --- a/workers/site/sdk/models/cloudflareAi.ts +++ b/workers/site/providers/cloudflareAi.ts @@ -6,7 +6,7 @@ import { ModelSnapshotType2, UnionStringArray, } from "mobx-state-tree"; -import ChatSdk from "../chat-sdk"; +import ChatSdk from "../sdk/chat-sdk"; export class CloudflareAISdk { static async handleCloudflareAIStream( diff --git a/workers/site/sdk/models/fireworks.ts b/workers/site/providers/fireworks.ts similarity index 94% rename from workers/site/sdk/models/fireworks.ts rename to workers/site/providers/fireworks.ts index 8c96ab6..4d7e7d0 100644 --- a/workers/site/sdk/models/fireworks.ts +++ b/workers/site/providers/fireworks.ts @@ -8,9 +8,8 @@ import { ModelSnapshotType2, UnionStringArray, } from "mobx-state-tree"; -import Message from "../../models/Message"; -import { MarkdownSdk } from "../markdown-sdk"; -import ChatSdk from "../chat-sdk"; +import Message from "../models/Message"; +import ChatSdk from "../sdk/chat-sdk"; export class FireworksAiChatSdk { private static async streamFireworksResponse( diff --git a/workers/site/sdk/models/google.ts b/workers/site/providers/google.ts similarity index 95% rename from workers/site/sdk/models/google.ts rename to workers/site/providers/google.ts index c451a02..808f29e 100644 --- a/workers/site/sdk/models/google.ts +++ b/workers/site/providers/google.ts @@ -1,6 +1,6 @@ import { OpenAI } from "openai"; -import ChatSdk from "../chat-sdk"; -import { StreamParams } from "../../services/ChatService"; +import ChatSdk from "../sdk/chat-sdk"; +import { StreamParams } from "../services/ChatService"; export class GoogleChatSdk { static async handleGoogleStream( diff --git a/workers/site/sdk/models/groq.ts b/workers/site/providers/groq.ts similarity index 98% rename from workers/site/sdk/models/groq.ts rename to workers/site/providers/groq.ts index d546bee..6c66043 100644 --- a/workers/site/sdk/models/groq.ts +++ b/workers/site/providers/groq.ts @@ -6,7 +6,7 @@ import { ModelSnapshotType2, UnionStringArray, } from "mobx-state-tree"; -import ChatSdk from "../chat-sdk"; +import ChatSdk from "../sdk/chat-sdk"; export class GroqChatSdk { static async handleGroqStream( diff --git a/workers/site/sdk/models/openai.ts b/workers/site/providers/openai.ts similarity index 98% rename from workers/site/sdk/models/openai.ts rename to workers/site/providers/openai.ts index 451c141..612cb3e 100644 --- a/workers/site/sdk/models/openai.ts +++ b/workers/site/providers/openai.ts @@ -1,5 +1,5 @@ import { OpenAI } from "openai"; -import ChatSdk from "../chat-sdk"; +import ChatSdk from "../sdk/chat-sdk"; export class OpenAiChatSdk { static async handleOpenAiStream( diff --git a/workers/site/sdk/models/xai.ts b/workers/site/providers/xai.ts similarity index 98% rename from workers/site/sdk/models/xai.ts rename to workers/site/providers/xai.ts index 3466cfe..d2ffc10 100644 --- a/workers/site/sdk/models/xai.ts +++ b/workers/site/providers/xai.ts @@ -1,5 +1,5 @@ import { OpenAI } from "openai"; -import ChatSdk from "../chat-sdk"; +import ChatSdk from "../sdk/chat-sdk"; export class XaiChatSdk { static async handleXaiStream( diff --git a/workers/site/sdk/assistant-sdk.ts b/workers/site/sdk/assistant-sdk.ts index ea4ab98..db2fae6 100644 --- a/workers/site/sdk/assistant-sdk.ts +++ b/workers/site/sdk/assistant-sdk.ts @@ -1,4 +1,4 @@ -import { Sdk } from "./sdk"; +import { Utils } from "./utils"; import few_shots from "../prompts/few_shots"; export class AssistantSdk { @@ -12,10 +12,10 @@ export class AssistantSdk { userTimezone = "UTC", userLocation = "", } = params; - const selectedFewshots = Sdk.selectEquitably?.(few_shots) || few_shots; + const selectedFewshots = Utils.selectEquitably?.(few_shots) || few_shots; const sdkDate = - typeof Sdk.getCurrentDate === "function" - ? Sdk.getCurrentDate() + typeof Utils.getCurrentDate === "function" + ? Utils.getCurrentDate() : new Date().toISOString(); const [currentDate] = sdkDate.split("T"); const now = new Date(); diff --git a/workers/site/sdk/markdown-sdk.ts b/workers/site/sdk/markdown-sdk.ts deleted file mode 100644 index 5519f09..0000000 --- a/workers/site/sdk/markdown-sdk.ts +++ /dev/null @@ -1,54 +0,0 @@ -export class MarkdownSdk { - static formatContextContainer(contextContainer) { - let markdown = "# Assistant Tools Results\n\n"; - - for (const [key, value] of contextContainer.entries()) { - markdown += `## ${this._escapeForMarkdown(key)}\n\n`; - markdown += this._formatValue(value); - } - - return markdown.trim(); - } - - static _formatValue(value, depth = 0) { - if (Array.isArray(value)) { - return this._formatArray(value, depth); - } else if (value && typeof value === "object") { - return this._formatObject(value, depth); - } else { - return this._formatPrimitive(value, depth); - } - } - - static _formatArray(arr, depth) { - let output = ""; - arr.forEach((item, i) => { - output += `### Item ${i + 1}\n`; - output += this._formatValue(item, depth + 1); - output += "\n"; - }); - return output; - } - - static _formatObject(obj, depth) { - return ( - Object.entries(obj) - .map( - ([k, v]) => - `- **${this._escapeForMarkdown(k)}**: ${this._escapeForMarkdown(v)}`, - ) - .join("\n") + "\n\n" - ); - } - - static _formatPrimitive(value, depth) { - return `${this._escapeForMarkdown(String(value))}\n\n`; - } - - static _escapeForMarkdown(text) { - if (typeof text !== "string") { - text = String(text); - } - return text.replace(/(\*|`|_|~)/g, "\\$1"); - } -} diff --git a/workers/site/sdk/message-sdk.ts b/workers/site/sdk/message-sdk.ts deleted file mode 100644 index 95be0db..0000000 --- a/workers/site/sdk/message-sdk.ts +++ /dev/null @@ -1,156 +0,0 @@ -interface BaseMessage { - role: "user" | "assistant" | "system"; -} - -interface TextMessage extends BaseMessage { - content: string; -} - -interface O1Message extends BaseMessage { - content: Array<{ - type: string; - text: string; - }>; -} - -interface LlamaMessage extends BaseMessage { - content: Array<{ - type: "text" | "image"; - data: string; - }>; -} - -interface MessageConverter { - convert(message: T): U; - convertBatch(messages: T[]): U[]; -} - -class TextToO1Converter implements MessageConverter { - convert(message: TextMessage): O1Message { - return { - role: message.role, - content: [ - { - type: "text", - text: message.content, - }, - ], - }; - } - - convertBatch(messages: TextMessage[]): O1Message[] { - return messages.map((msg) => this.convert(msg)); - } -} - -class O1ToTextConverter implements MessageConverter { - convert(message: O1Message): TextMessage { - return { - role: message.role, - content: message.content.map((item) => item.text).join("\n"), - }; - } - - convertBatch(messages: O1Message[]): TextMessage[] { - return messages.map((msg) => this.convert(msg)); - } -} - -class TextToLlamaConverter - implements MessageConverter -{ - convert(message: TextMessage): LlamaMessage { - return { - role: message.role, - content: [ - { - type: "text", - data: message.content, - }, - ], - }; - } - - convertBatch(messages: TextMessage[]): LlamaMessage[] { - return messages.map((msg) => this.convert(msg)); - } -} - -class LlamaToTextConverter - implements MessageConverter -{ - convert(message: LlamaMessage): TextMessage { - return { - role: message.role, - content: message.content - .filter((item) => item.type === "text") - .map((item) => item.data) - .join("\n"), - }; - } - - convertBatch(messages: LlamaMessage[]): TextMessage[] { - return messages.map((msg) => this.convert(msg)); - } -} - -class MessageConverterFactory { - static createConverter( - fromFormat: string, - toFormat: string, - ): MessageConverter { - const key = `${fromFormat}->${toFormat}`; - const converters = { - "text->o1": new TextToO1Converter(), - "o1->text": new O1ToTextConverter(), - "text->llama": new TextToLlamaConverter(), - "llama->text": new LlamaToTextConverter(), - }; - - const converter = converters[key]; - if (!converter) { - throw new Error(`Unsupported conversion: ${key}`); - } - - return converter; - } -} - -function detectMessageFormat(message: any): string { - if (typeof message.content === "string") { - return "text"; - } - if (Array.isArray(message.content)) { - if (message.content[0]?.type === "text" && "text" in message.content[0]) { - return "o1"; - } - if (message.content[0]?.type && "data" in message.content[0]) { - return "llama"; - } - } - throw new Error("Unknown message format"); -} - -function convertMessage(message: any, targetFormat: string): any { - const sourceFormat = detectMessageFormat(message); - if (sourceFormat === targetFormat) { - return message; - } - - const converter = MessageConverterFactory.createConverter( - sourceFormat, - targetFormat, - ); - return converter.convert(message); -} - -export { - MessageConverterFactory, - convertMessage, - detectMessageFormat, - type BaseMessage, - type TextMessage, - type O1Message, - type LlamaMessage, - type MessageConverter, -}; diff --git a/workers/site/sdk/perigon-sdk.ts b/workers/site/sdk/perigon-sdk.ts deleted file mode 100644 index 4b678e6..0000000 --- a/workers/site/sdk/perigon-sdk.ts +++ /dev/null @@ -1,97 +0,0 @@ -export interface AdvancedSearchParams { - mainQuery?: string; - titleQuery?: string; - descriptionQuery?: string; - contentQuery?: string; - mustInclude?: string[]; - mustNotInclude?: string[]; - exactPhrases?: string[]; - urlContains?: string; -} - -export class PerigonSearchBuilder { - private buildExactPhraseQuery(phrases: string[]): string { - return phrases.map((phrase) => `"${phrase}"`).join(" AND "); - } - - private buildMustIncludeQuery(terms: string[]): string { - return terms.join(" AND "); - } - - private buildMustNotIncludeQuery(terms: string[]): string { - return terms.map((term) => `NOT ${term}`).join(" AND "); - } - - buildSearchParams(params: AdvancedSearchParams): SearchParams { - const searchParts: string[] = []; - const searchParams: SearchParams = {}; - - if (params.mainQuery) { - searchParams.q = params.mainQuery; - } - - if (params.titleQuery) { - searchParams.title = params.titleQuery; - } - - if (params.descriptionQuery) { - searchParams.desc = params.descriptionQuery; - } - - if (params.contentQuery) { - searchParams.content = params.contentQuery; - } - - if (params.exactPhrases?.length) { - searchParts.push(this.buildExactPhraseQuery(params.exactPhrases)); - } - - if (params.mustInclude?.length) { - searchParts.push(this.buildMustIncludeQuery(params.mustInclude)); - } - - if (params.mustNotInclude?.length) { - searchParts.push(this.buildMustNotIncludeQuery(params.mustNotInclude)); - } - - if (searchParts.length) { - searchParams.q = searchParams.q - ? `(${searchParams.q}) AND (${searchParts.join(" AND ")})` - : searchParts.join(" AND "); - } - - if (params.urlContains) { - searchParams.url = `"${params.urlContains}"`; - } - - return searchParams; - } -} - -export interface SearchParams { - /** Main search query parameter that searches across title, description and content */ - q?: string; - /** Search only in article titles */ - title?: string; - /** Search only in article descriptions */ - desc?: string; - /** Search only in article content */ - content?: string; - /** Search in article URLs */ - url?: string; - /** Additional search parameters can be added here as needed */ - [key: string]: string | undefined; -} - -export interface Article { - translation: { - title: string; - description: string; - content: string; - url: string; - }; -} - -export interface SearchResponse { - articles?: Article[]; -} diff --git a/workers/site/sdk/stream-processor-sdk.ts b/workers/site/sdk/stream-processor-sdk.ts deleted file mode 100644 index a5bdbd7..0000000 --- a/workers/site/sdk/stream-processor-sdk.ts +++ /dev/null @@ -1,38 +0,0 @@ -export class StreamProcessorSdk { - static preprocessContent(buffer: string): string { - return buffer - .replace(/(\n\- .*\n)+/g, "$&\n") - .replace(/(\n\d+\. .*\n)+/g, "$&\n") - .replace(/\n{3,}/g, "\n\n"); - } - - static async handleStreamProcessing( - stream: any, - controller: ReadableStreamDefaultController, - ) { - const encoder = new TextEncoder(); - let buffer = ""; - - try { - for await (const chunk of stream) { - const content = chunk.choices[0]?.delta?.content || ""; - buffer += content; - - let processedContent = StreamProcessorSdk.preprocessContent(buffer); - controller.enqueue(encoder.encode(processedContent)); - - buffer = ""; - } - - if (buffer) { - let processedContent = StreamProcessorSdk.preprocessContent(buffer); - controller.enqueue(encoder.encode(processedContent)); - } - } catch (error) { - controller.error(error); - throw new Error("Stream processing error"); - } finally { - controller.close(); - } - } -} diff --git a/workers/site/sdk/sdk.ts b/workers/site/sdk/utils.ts similarity index 98% rename from workers/site/sdk/sdk.ts rename to workers/site/sdk/utils.ts index dfc167b..1b03448 100644 --- a/workers/site/sdk/sdk.ts +++ b/workers/site/sdk/utils.ts @@ -1,4 +1,4 @@ -export class Sdk { +export class Utils { static getSeason(date: string): string { const hemispheres = { Northern: ["Winter", "Spring", "Summer", "Autumn"], diff --git a/workers/site/services/ChatService.ts b/workers/site/services/ChatService.ts index b11e99e..621f112 100644 --- a/workers/site/services/ChatService.ts +++ b/workers/site/services/ChatService.ts @@ -4,15 +4,15 @@ import ChatSdk from '../sdk/chat-sdk'; import Message from "../models/Message"; import O1Message from "../models/O1Message"; import {getModelFamily, ModelFamily} from "../../../src/components/chat/lib/SupportedModels"; -import {OpenAiChatSdk} from "../sdk/models/openai"; -import {GroqChatSdk} from "../sdk/models/groq"; -import {ClaudeChatSdk} from "../sdk/models/claude"; -import {FireworksAiChatSdk} from "../sdk/models/fireworks"; +import {OpenAiChatSdk} from "../providers/openai"; +import {GroqChatSdk} from "../providers/groq"; +import {ClaudeChatSdk} from "../providers/claude"; +import {FireworksAiChatSdk} from "../providers/fireworks"; import handleStreamData from "../sdk/handleStreamData"; -import {GoogleChatSdk} from "../sdk/models/google"; -import {XaiChatSdk} from "../sdk/models/xai"; -import {CerebrasSdk} from "../sdk/models/cerebras"; -import {CloudflareAISdk} from "../sdk/models/cloudflareAi"; +import {GoogleChatSdk} from "../providers/google"; +import {XaiChatSdk} from "../providers/xai"; +import {CerebrasSdk} from "../providers/cerebras"; +import {CloudflareAISdk} from "../providers/cloudflareAi"; export interface StreamParams { env: Env; diff --git a/workers/site/services/DocumentService.ts b/workers/site/services/DocumentService.ts deleted file mode 100644 index bd972f0..0000000 --- a/workers/site/services/DocumentService.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { flow, types } from "mobx-state-tree"; - -async function getExtractedText(file: any) { - const formData = new FormData(); - formData.append("file", file); - - const response = await fetch("https://any2text.seemueller.io/extract", { - method: "POST", - body: formData, - }); - - if (!response.ok) { - throw new Error(`Failed to extract text: ${response.statusText}`); - } - - const { text: extractedText } = await response.json<{ text: string }>(); - return extractedText; -} - -export default types - .model("DocumentService", {}) - .volatile(() => ({ - env: {} as Env, - ctx: {} as ExecutionContext, - })) - .actions((self) => ({ - setEnv(env: Env) { - self.env = env; - }, - setCtx(ctx: ExecutionContext) { - self.ctx = ctx; - }, - handlePutDocument: flow(function* (request: Request) { - try { - if (!request.body) { - return new Response("No content in the request", { status: 400 }); - } - - const formData = yield request.formData(); - const file = formData.get("file"); - const name = file instanceof File ? file.name : "unnamed"; - - if (!(file instanceof File)) { - return new Response("No valid file found in form data", { - status: 400, - }); - } - - const key = `document_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`; - - const content = yield file.arrayBuffer(); - - const contentType = file.type || "application/octet-stream"; - const contentLength = content.byteLength; - - const metadata = { - name, - contentType, - contentLength, - uploadedAt: new Date().toISOString(), - }; - - yield self.env.KV_STORAGE.put(key, content, { - expirationTtl: 60 * 60 * 24 * 7, - }); - - yield self.env.KV_STORAGE.put(`${key}_meta`, JSON.stringify(metadata), { - expirationTtl: 60 * 60 * 24 * 7, - }); - - const url = new URL(request.url); - url.pathname = `/api/documents/${key}`; - - console.log(content.length); - const extracted = yield getExtractedText(file); - - console.log({ extracted }); - - return new Response( - JSON.stringify({ - url: url.toString(), - name, - extractedText: extracted, - }), - { status: 200 }, - ); - } catch (error) { - console.error("Error uploading document:", error); - return new Response("Failed to upload document", { status: 500 }); - } - }), - handleGetDocument: flow(function* (request: Request) { - try { - const url = new URL(request.url); - const key = url.pathname.split("/").pop(); - - if (!key) { - return new Response("Document key is missing", { status: 400 }); - } - - const content = yield self.env.KV_STORAGE.get(key, "arrayBuffer"); - - if (!content) { - return new Response("Document not found", { status: 404 }); - } - - return new Response(content, { - status: 200, - headers: { - "Content-Type": "application/octet-stream", - "Content-Disposition": `attachment; filename="${key}"`, - }, - }); - } catch (error) { - console.error("Error retrieving document:", error); - return new Response("Failed to retrieve document", { status: 500 }); - } - }), - handleGetDocumentMeta: flow(function* (request: Request) { - try { - const url = new URL(request.url); - const key = url.pathname.split("/").pop(); - - if (!key) { - return new Response("Document key is missing", { status: 400 }); - } - - const content = yield self.env.KV_STORAGE.get(`${key}_meta`); - - if (!content) { - return new Response("Document meta not found", { status: 404 }); - } - - return new Response(JSON.stringify({ metadata: content }), { - status: 200, - headers: { - "Content-Type": "application/json", - }, - }); - } catch (error) { - console.error("Error retrieving document:", error); - return new Response("Failed to retrieve document", { status: 500 }); - } - }), - })); diff --git a/workers/site/worker.ts b/workers/site/worker.ts index ca0315e..ba7b5b2 100644 --- a/workers/site/worker.ts +++ b/workers/site/worker.ts @@ -1,8 +1,8 @@ import { createRouter } from "./api-router"; import SiteCoordinator from "./durable_objects/SiteCoordinator"; -// exports durable object +// durable object export { SiteCoordinator }; -// exports worker +// worker export default createRouter();