Cloudflare Workers & Durable Objects
Worker entry point, Durable Objects (Chat) ve worker yapılandırması.
Achidemy, Cloudflare Workers üzerinde çalışır ve Durable Objects ile gerçek zamanlı chat sunar. Bu sayfa worker yapısını, entry point’i (workers/app.ts) ve Durable Object binding’lerini açıklar. Scheduled tasks (cron) ile 30 dakikada bir döviz kurları güncellenir (bkz. Döviz Kuru API).
Worker Entry Point
Section titled “Worker Entry Point”Dosya: workers/app.ts
Ana worker entry point’i, React Router uygulamasını serve eder ve özel endpoint’leri (WebSocket chat: /api/chat) yönetir.
export default { async fetch(request, env, ctx): Promise<Response> { // 1. WebSocket Chat endpoint kontrolü (/api/chat) // 2. React Router request handler }}WebSocket Chat Endpoint
Section titled “WebSocket Chat Endpoint”Path: /api/chat
Yetki Kontrolü:
- Konuşma var mı ve kullanıcı katılımcı mı? (
conversationstablosu kontrolü) - Öğrenci ise: Eğitmenin kursuna kaydı var mı? (
canStudentMessageInstructor)
Durable Object Binding:
- Production:
env.CHAT_ROOM(Durable Object) kullanılır - Yerel geliştirme:
handleChatMemory(in-memory fallback) kullanılır
WebSocket Upgrade:
Upgrade: websocketheader kontrolüuserIdveconvIdquery parametreleri gerekli
Durable Objects: Chat Room
Section titled “Durable Objects: Chat Room”Dosya: workers/chat.ts
Class: ChatRoom extends DurableObject
Binding: wrangler.toml
[[durable_objects.bindings]]name = "CHAT_ROOM"class_name = "ChatRoom"
[[migrations]]tag = "v1"new_sqlite_classes = ["ChatRoom"]Özellikler
Section titled “Özellikler”- WebSocket bağlantı yönetimi: Her konuşma için ayrı Durable Object instance
- Gerçek zamanlı mesajlaşma:
broadcastile tüm bağlı client’lara mesaj gönderimi - Read receipt:
MARK_READmesajı ile okundu bilgisi güncelleme - Important toggle:
TOGGLE_IMPORTANTile konuşma önemli işaretleme - Mesaj kaydetme:
saveMessageToDbile PostgreSQL’e mesaj kaydı
Mesaj Tipleri
Section titled “Mesaj Tipleri”| Tip | Açıklama |
|---|---|
text | Metin mesajı |
image | Görsel mesajı (mediaUrl ile) |
file | Dosya mesajı (mediaUrl ile) |
MARK_READ | Okundu işaretleme |
TOGGLE_IMPORTANT | Önemli işaretleme toggle |
Broadcast Mekanizması
Section titled “Broadcast Mekanizması”broadcast(message: string) { for (const [ws, userId] of this.sessions) { try { ws.send(message); } catch { this.sessions.delete(ws); } }}In-Memory Chat (Yerel Geliştirme)
Section titled “In-Memory Chat (Yerel Geliştirme)”Dosya: workers/chat-memory.ts
Kullanım: Durable Object binding’i olmadığında (yerel geliştirme) fallback olarak kullanılır.
Özellikler:
- In-memory
Map<conversationId, Map<WebSocket, userId>>yapısı - WebSocket mesajlaşma (Durable Object ile aynı protokol)
- Mesaj kaydetme:
saveMessageToDbile PostgreSQL’e kayıt
Sınırlamalar:
- Worker restart’ta mesajlar kaybolur (sadece DB’de kalır)
- Production’da Durable Object kullanılmalıdır
Worker Yapılandırması
Section titled “Worker Yapılandırması”Dosya: wrangler.toml
Temel Ayarlar
Section titled “Temel Ayarlar”name = "coursio"compatibility_date = "2026-01-03"compatibility_flags = ["nodejs_compat"]main = "./workers/app.ts"Custom domain (apex + B2B wildcard)
Section titled “Custom domain (apex + B2B wildcard)”Production’da uygulama achidemy.net ve *.achidemy.net host’larından servis edilir (kiracı şirket panelleri alt alan adında):
[[routes]]pattern = "achidemy.net/*"zone_name = "achidemy.net"
[[routes]]pattern = "*.achidemy.net/*"zone_name = "achidemy.net"Hyperdrive (Connection Pooling)
Section titled “Hyperdrive (Connection Pooling)”[[hyperdrive]]binding = "HYPERDRIVE"id = "59c4a12da58e45d3993436576a163c85"localConnectionString = "postgresql://..."Durable Objects
Section titled “Durable Objects”[[durable_objects.bindings]]name = "CHAT_ROOM"class_name = "ChatRoom"
[[migrations]]tag = "v1"new_sqlite_classes = ["ChatRoom"]Observability
Section titled “Observability”[observability]enabled = falsehead_sampling_rate = 1
[observability.logs]enabled = truehead_sampling_rate = 1persist = trueinvocation_logs = true
[observability.traces]enabled = falsepersist = truehead_sampling_rate = 1Not: Production’da observability açık tutulabilir; log ve trace’ler Cloudflare Dashboard’dan görüntülenir.
Cron (Scheduled) — Döviz Kurları
Section titled “Cron (Scheduled) — Döviz Kurları”wrangler.toml:
crons = ["*/30 * * * *"]workers/app.ts: scheduled handler her 30 dakikada bir tetiklenir; updateCachedRates(env) ile döviz kurları API’den çekilip KV’ye yazılır. Detay için Döviz Kuru API (Exchange Rates) sayfasına bakın.
Yerel Geliştirme
Section titled “Yerel Geliştirme”Komut: npm run start veya npx wrangler dev
Özellikler:
- Durable Object binding yoksa
chat-memory.tskullanılır - Hyperdrive yerine
localConnectionStringkullanılır .dev.varsdosyasından ortam değişkenleri okunur
İlgili Dosyalar
Section titled “İlgili Dosyalar”workers/app.ts— Worker entry point (fetch + /api/chat WebSocket)workers/chat.ts— Durable Object Chat Roomworkers/chat-memory.ts— In-memory chat fallback (yerel geliştirme)wrangler.toml— Worker yapılandırmasıapp/lib/can-message-instructor.ts— Mesajlaşma yetki kontrolü