From 7509f3d23cf97212914c54b63fd08df8064d69a8 Mon Sep 17 00:00:00 2001 From: Insub Kim Date: Mon, 17 Nov 2025 00:57:06 +0900 Subject: [PATCH] Fix formatting issue in wrangler.jsonc by removing extra newline --- src/durable-objects/counter.ts | 115 --------------------------------- wrangler.jsonc | 3 +- 2 files changed, 1 insertion(+), 117 deletions(-) delete mode 100644 src/durable-objects/counter.ts diff --git a/src/durable-objects/counter.ts b/src/durable-objects/counter.ts deleted file mode 100644 index 584fb88..0000000 --- a/src/durable-objects/counter.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { DurableObject } from 'cloudflare:workers'; - -export interface Env { - COUNTER: DurableObjectNamespace; -} - -interface Session { - id: string; - webSocket: WebSocket; - quit?: boolean; -} - -export class CounterDurableObject extends DurableObject { - private sessions: Map; - private count: number; - private lastUpdate: number; - - constructor(ctx: DurableObjectState, env: Env) { - super(ctx, env); - this.sessions = new Map(); - this.count = 0; - this.lastUpdate = Date.now(); - - // Durable Objects에서 영구 저장소로부터 카운트를 복원 - this.ctx.blockConcurrencyWhile(async () => { - const stored = await this.ctx.storage.get('count'); - if (stored !== undefined) { - this.count = stored; - } - }); - } - - async fetch(request: Request): Promise { - // WebSocket 업그레이드 요청 처리 - const upgradeHeader = request.headers.get('Upgrade'); - if (!upgradeHeader || upgradeHeader !== 'websocket') { - return new Response('Expected Upgrade: websocket', { status: 426 }); - } - - // WebSocketPair 생성 - const webSocketPair = new WebSocketPair(); - const [client, server] = Object.values(webSocketPair); - - // 세션 생성 - const session: Session = { - id: crypto.randomUUID(), - webSocket: server - }; - - // WebSocket Hibernation API 사용 - this.ctx.acceptWebSocket(server); - this.sessions.set(server, session); - - // 현재 상태 전송 - this.broadcast(); - - return new Response(null, { - status: 101, - webSocket: client - }); - } - - async webSocketMessage(ws: WebSocket, message: ArrayBuffer | string) { - try { - const data = typeof message === 'string' ? JSON.parse(message) : null; - - if (data && data.type === 'increment') { - // 카운트 증가 - this.count++; - this.lastUpdate = Date.now(); - - // 영구 저장소에 저장 - await this.ctx.storage.put('count', this.count); - - // 모든 클라이언트에 브로드캐스트 - this.broadcast(); - } else if (data && data.type === 'reset') { - // 카운트 리셋 - this.count = 0; - this.lastUpdate = Date.now(); - await this.ctx.storage.put('count', this.count); - this.broadcast(); - } - } catch (error) { - console.error('Error handling message:', error); - } - } - - async webSocketClose(ws: WebSocket, code: number, reason: string, wasClean: boolean) { - // 세션 제거 - this.sessions.delete(ws); - ws.close(code, 'Durable Object is closing WebSocket'); - - // 남은 클라이언트들에게 업데이트 전송 - this.broadcast(); - } - - private broadcast() { - const message = JSON.stringify({ - count: this.count, - online: this.sessions.size, - lastUpdate: this.lastUpdate - }); - - // 모든 연결된 WebSocket에 메시지 전송 - this.ctx.getWebSockets().forEach((ws) => { - try { - ws.send(message); - } catch (error) { - console.error('Error broadcasting to client:', error); - } - }); - } -} - diff --git a/wrangler.jsonc b/wrangler.jsonc index 6e3050d..e241bb0 100644 --- a/wrangler.jsonc +++ b/wrangler.jsonc @@ -21,5 +21,4 @@ "new_sqlite_classes": ["CounterDurableObject"] } ] -} - +} \ No newline at end of file