diff options
| author | Dax Raad <[email protected]> | 2025-05-30 14:40:53 -0400 |
|---|---|---|
| committer | Dax Raad <[email protected]> | 2025-05-30 14:40:59 -0400 |
| commit | e9bad39a7ed224efefe2d21a35a7d27cd25e0879 (patch) | |
| tree | f1ae466b4b6bac86a11f56a2e0cca366a1192685 /app | |
| parent | 42c7880858ee9bec72f3fb71c7f19512a38b0b8e (diff) | |
| download | opencode-e9bad39a7ed224efefe2d21a35a7d27cd25e0879.tar.gz opencode-e9bad39a7ed224efefe2d21a35a7d27cd25e0879.zip | |
sync
Diffstat (limited to 'app')
| -rw-r--r-- | app/infra/app.ts | 1 | ||||
| -rw-r--r-- | app/packages/function/src/api.ts | 34 | ||||
| -rw-r--r-- | app/packages/web/src/components/Share.tsx | 13 | ||||
| -rw-r--r-- | app/packages/web/src/pages/s/index.astro (renamed from app/packages/web/src/pages/share/index.astro) | 0 |
4 files changed, 24 insertions, 24 deletions
diff --git a/app/infra/app.ts b/app/infra/app.ts index ee33d91a9..73b80994d 100644 --- a/app/infra/app.ts +++ b/app/infra/app.ts @@ -13,6 +13,7 @@ export const api = new sst.cloudflare.Worker("Api", { link: [bucket], transform: { worker: (args) => { + args.logpush = true args.bindings = $resolve(args.bindings).apply((bindings) => [ ...bindings, { diff --git a/app/packages/function/src/api.ts b/app/packages/function/src/api.ts index 52a326727..8b6c52dd8 100644 --- a/app/packages/function/src/api.ts +++ b/app/packages/function/src/api.ts @@ -2,12 +2,13 @@ import { DurableObject } from "cloudflare:workers" import { randomUUID } from "node:crypto" import { Resource } from "sst" -type Bindings = { +type Env = { SYNC_SERVER: DurableObjectNamespace<SyncServer> + Bucket: R2Bucket } -export class SyncServer extends DurableObject { - constructor(ctx: DurableObjectState, env: Bindings) { +export class SyncServer extends DurableObject<Env> { + constructor(ctx: DurableObjectState, env: Env) { super(ctx, env) } async fetch() { @@ -18,14 +19,10 @@ export class SyncServer extends DurableObject { this.ctx.acceptWebSocket(server) - setTimeout(async () => { - const data = await this.ctx.storage.list({ - prefix: "data/", - }) - for (const [key, content] of Object.entries(data)) { - server.send(JSON.stringify({ key, content })) - } - }, 0) + const data = await this.ctx.storage.list() + for (const [key, content] of data.entries()) { + server.send(JSON.stringify({ key, content })) + } return new Response(null, { status: 101, @@ -49,11 +46,17 @@ export class SyncServer extends DurableObject { return new Response("Error: Invalid key", { status: 400 }) // store message - await Resource.Bucket.put(`${key}.json`, JSON.stringify(content)) - await this.ctx.storage.put("data/" + key, content) + await this.env.Bucket.put(`share/${key}.json`, JSON.stringify(content), { + httpMetadata: { + contentType: "application/json", + }, + }) + await this.ctx.storage.put(key, content) const clients = this.ctx.getWebSockets() console.log("SyncServer publish", key, "to", clients.length, "subscribers") - clients.forEach((client) => client.send(JSON.stringify({ key, content }))) + for (const client of clients) { + client.send(JSON.stringify({ key, content })) + } } public async share(sessionID: string) { @@ -90,7 +93,7 @@ export class SyncServer extends DurableObject { } export default { - async fetch(request: Request, env: Bindings, ctx: ExecutionContext) { + async fetch(request: Request, env: Env, ctx: ExecutionContext) { const url = new URL(request.url) const splits = url.pathname.split("/") const method = splits[1] @@ -155,6 +158,7 @@ export default { }) } const id = url.searchParams.get("id") + console.log("share_poll", id) if (!id) return new Response("Error: Share ID is required", { status: 400 }) const stub = env.SYNC_SERVER.get(env.SYNC_SERVER.idFromName(id)) diff --git a/app/packages/web/src/components/Share.tsx b/app/packages/web/src/components/Share.tsx index db533831d..ac75a3cf7 100644 --- a/app/packages/web/src/components/Share.tsx +++ b/app/packages/web/src/components/Share.tsx @@ -26,7 +26,6 @@ import { IconPencilSquare, IconWrenchScrewdriver, } from "./icons" -import CodeBlock from "./CodeBlock" import DiffView from "./DiffView" import styles from "./share.module.css" import { type UIMessage } from "ai" @@ -219,7 +218,7 @@ function PartFooter(props: { time: number }) { export default function Share(props: { api: string }) { let params = new URLSearchParams(document.location.search) - const sessionId = params.get("id") + const id = params.get("id") const [store, setStore] = createStore<{ info?: SessionInfo @@ -233,12 +232,8 @@ export default function Share(props: { api: string }) { onMount(() => { const apiUrl = props.api - console.log("Mounting Share component with ID:", sessionId) - console.log("API URL:", apiUrl) - - if (!sessionId) { - console.error("Session ID not found in environment variables") - setConnectionStatus(["error", "Session ID not found"]) + if (!id) { + setConnectionStatus(["error", "id not found"]) return } @@ -262,7 +257,7 @@ export default function Share(props: { api: string }) { // Always use secure WebSocket protocol (wss) const wsBaseUrl = apiUrl.replace(/^https?:\/\//, "wss://") - const wsUrl = `${wsBaseUrl}/share_poll?id=${sessionId}` + const wsUrl = `${wsBaseUrl}/share_poll?id=${id}` console.log("Connecting to WebSocket URL:", wsUrl) // Create WebSocket connection diff --git a/app/packages/web/src/pages/share/index.astro b/app/packages/web/src/pages/s/index.astro index b678c0db9..b678c0db9 100644 --- a/app/packages/web/src/pages/share/index.astro +++ b/app/packages/web/src/pages/s/index.astro |
