Skip to content

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).

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
}
}

Path: /api/chat

Yetki Kontrolü:

  1. Konuşma var mı ve kullanıcı katılımcı mı? (conversations tablosu kontrolü)
  2. Öğ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: websocket header kontrolü
  • userId ve convId query parametreleri gerekli

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"]
  • WebSocket bağlantı yönetimi: Her konuşma için ayrı Durable Object instance
  • Gerçek zamanlı mesajlaşma: broadcast ile tüm bağlı client’lara mesaj gönderimi
  • Read receipt: MARK_READ mesajı ile okundu bilgisi güncelleme
  • Important toggle: TOGGLE_IMPORTANT ile konuşma önemli işaretleme
  • Mesaj kaydetme: saveMessageToDb ile PostgreSQL’e mesaj kaydı
TipAçıklama
textMetin mesajı
imageGörsel mesajı (mediaUrl ile)
fileDosya mesajı (mediaUrl ile)
MARK_READOkundu işaretleme
TOGGLE_IMPORTANTÖnemli işaretleme toggle
broadcast(message: string) {
for (const [ws, userId] of this.sessions) {
try {
ws.send(message);
} catch {
this.sessions.delete(ws);
}
}
}

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: saveMessageToDb ile 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

Dosya: wrangler.toml

name = "coursio"
compatibility_date = "2026-01-03"
compatibility_flags = ["nodejs_compat"]
main = "./workers/app.ts"

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]]
binding = "HYPERDRIVE"
id = "59c4a12da58e45d3993436576a163c85"
localConnectionString = "postgresql://..."
[[durable_objects.bindings]]
name = "CHAT_ROOM"
class_name = "ChatRoom"
[[migrations]]
tag = "v1"
new_sqlite_classes = ["ChatRoom"]
[observability]
enabled = false
head_sampling_rate = 1
[observability.logs]
enabled = true
head_sampling_rate = 1
persist = true
invocation_logs = true
[observability.traces]
enabled = false
persist = true
head_sampling_rate = 1

Not: Production’da observability açık tutulabilir; log ve trace’ler Cloudflare Dashboard’dan görüntülenir.

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.


Komut: npm run start veya npx wrangler dev

Özellikler:

  • Durable Object binding yoksa chat-memory.ts kullanılır
  • Hyperdrive yerine localConnectionString kullanılır
  • .dev.vars dosyasından ortam değişkenleri okunur

  • workers/app.ts — Worker entry point (fetch + /api/chat WebSocket)
  • workers/chat.ts — Durable Object Chat Room
  • workers/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ü