Node.js İle Socket.io Kullanarak Paylaşımlı Canlı Kod Analiz Paneli Nasıl Yapılır?

Node.js İle Socket.io Kullanarak Paylaşımlı Canlı Kod Analiz Paneli Nasıl Yapılır?
Node.js İle Socket.io Kullanarak Paylaşımlı Canlı Kod Analiz Paneli Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projenize başlamadan önce bilgisayarınızda Node.js'in en güncel LTS (Long Term Support) sürümünün yüklü olması gerekmektedir. Ayrıca, paket yönetimi için npm veya pnpm kullanacağız. Proje dizinini oluşturmak ve gerekli bağımlılıkları kurmak için aşağıdaki komutları terminalinizde çalıştırın.

mkdir kod-analiz-paneli
cd kod-analiz-paneli
npm init -y
npm install express socket.io

Bu komutlar, projenizin temel yapılandırmasını oluşturur ve Socket.io kütüphanesini sisteminize dahil eder. Express, sunucu tarafında HTTP isteklerini yönetmek için, Socket.io ise WebSocket bağlantılarını kurmak için kullanılacaktır.

Sunucu Tarafı Kurulumu ve Socket.io Yapılandırması

Sunucu tarafında, hem statik dosyalarımızı servis edecek bir Express sunucusu hem de gelen kod değişikliklerini dinleyecek bir Socket.io örneği oluşturmalıyız. Aşağıdaki kod bloğu, temel bir sunucu kurulumunu göstermektedir.

const express = require('express');
const http = require('http');
const { Server } = require('socket.io');

const app = express();
const server = http.createServer(app);
const io = new Server(server);

app.use(express.static('public'));

io.on('connection', (socket) => {
  console.log('Bir kullanıcı bağlandı: ' + socket.id);

  socket.on('code-change', (data) => {
    socket.broadcast.emit('code-update', data);
  });
});

server.listen(3000, () => {
  console.log('Sunucu http://localhost:3000 adresinde çalışıyor.');
});

Burada socket.broadcast.emit metodu, mesajı gönderen kişi hariç bağlı olan tüm istemcilere veriyi iletmek için kullanılır. Bu, canlı analiz panelinde kodun senkronize kalmasını sağlayan temel mekanizmadır.

İstemci Tarafı Arayüzü ve WebSocket Bağlantısı

İstemci tarafında, kullanıcıların kod yazabileceği bir textarea veya gelişmiş bir editör bileşeni (Monaco Editor gibi) kullanabilirsiniz. Ancak basitlik adına burada bir textarea üzerinden ilerleyeceğiz. İstemcinin sunucuya bağlanması ve değişiklikleri yayınlaması için aşağıdaki JavaScript kodunu kullanın.

const socket = io();
const editor = document.getElementById('code-editor');

editor.addEventListener('input', (e) => {
  const code = e.target.value;
  socket.emit('code-change', code);
});

socket.on('code-update', (data) => {
  editor.value = data;
});

Bu yapı, kullanıcının klavyeden her tuşa basışında içeriği sunucuya gönderir ve sunucudan gelen güncellemeleri editöre yansıtır. Bu adım, uygulamanın temel işlevselliğini oluşturur.

Veri Güvenliği ve XSS Koruması

Canlı kod analiz panellerinde en büyük risk, kullanıcıların birbirlerine zararlı betikler (script) göndermesi sonucu oluşabilecek XSS (Cross-Site Scripting) saldırılarıdır. Kullanıcıdan gelen veriyi doğrudan DOM'a yazarken mutlaka temizlemelisiniz.

Uyarı: Kullanıcı girdilerini asla doğrudan innerHTML ile sayfaya eklemeyin. Her zaman textContent veya güvenli bir kütüphane (DOMPurify gibi) kullanarak sanitizasyon (temizleme) işlemi uygulayın.

Aşağıdaki örnekte, gelen verinin güvenli bir şekilde nasıl işleneceği gösterilmiştir:

// Güvenli veri işleme örneği
socket.on('code-update', (data) => {
  const sanitizedData = data.replace(/&/g, "&").replace(/ {
  socket.emit('code-update', currentCode); // Yeni kullanıcıya mevcut kodu gönder

  socket.on('code-change', (data) => {
    currentCode = data;
    socket.broadcast.emit('code-update', data);
  });
});

Bu basit mantık, uygulamanızın tutarlılığını artırır ve kullanıcı deneyimini iyileştirir.

Kritik Güvenlik Uyarısı: Üretim ortamında (production) Socket.io kullanırken, mutlaka CORS (Cross-Origin Resource Sharing) ayarlarını yapılandırın ve sadece güvenilir alan adlarının bağlantı kurmasına izin verin.

Sıkça Sorulan Sorular

Socket.io yerine neden standart WebSocket kullanmıyoruz?

Socket.io, otomatik yeniden bağlanma, fallback mekanizmaları (WebSocket desteklenmiyorsa HTTP Long Polling kullanır) ve oda (room) yönetimi gibi özellikleri ile geliştirme sürecini büyük ölçüde hızlandırır.

Bu uygulama aynı anda kaç kullanıcıyı destekler?

Node.js'in tek iş parçacıklı yapısı sayesinde, doğru sunucu yapılandırmasıyla yüzlerce eş zamanlı kullanıcıyı destekleyebilir. Daha yüksek ölçekler için Redis Adapter kullanarak sunucular arası haberleşme sağlamanız gerekir.

Kod editörü olarak ne önerirsiniz?

Basit bir textarea yerine Monaco Editor veya CodeMirror gibi kütüphaneler kullanarak sözdizimi renklendirme (syntax highlighting) ve hata ayıklama özellikleri ekleyebilirsiniz.

Veri kaybını nasıl önleyebilirim?

Kullanıcıların yaptığı değişiklikleri belirli aralıklarla (debouncing) sunucuya göndermek ve sunucu tarafında veriyi veritabanına yedeklemek, veri kaybını önlemek için en iyi pratiktir.

Mobil cihazlarda çalışır mı?

Evet, Socket.io tarayıcı tabanlı olduğu için modern tüm mobil tarayıcılarda sorunsuz çalışır. Ancak arayüzü mobil uyumlu (responsive) hale getirmek için CSS medya sorgularını kullanmalısınız.

Uygulama İçin İleri Seviye Performans Optimizasyonları

Canlı kod analiz panelleri, yüksek frekanslı veri akışı nedeniyle sunucu kaynaklarını hızla tüketebilir. Uygulamanızın ölçeklenebilirliğini artırmak ve gecikme süresini (latency) minimize etmek için aşağıdaki stratejileri uygulayabilirsiniz.

Mesaj Yükünü Azaltmak (Payload Optimization)

Her tuş vuruşunda tüm kod bloğunu sunucuya göndermek yerine, sadece değişen karakterleri veya satırları gönderen "diffing" algoritmaları kullanın. Bu yöntem, bant genişliğini ciddi oranda düşürür.

// İstemci tarafında basit bir throttle mekanizması
let timeout = null;
editor.on('change', (delta) => {
  clearTimeout(timeout);
  timeout = setTimeout(() => {
    socket.emit('code-update', delta);
  }, 100); // 100ms gecikme ile gönderim
});

Redis Adaptörü ile Yatay Ölçekleme

Uygulamanız tek bir sunucunun kapasitesini aştığında, birden fazla Node.js örneği çalıştırmanız gerekir. Socket.io'nun farklı sunucular arasında haberleşebilmesi için @socket.io/redis-adapter kullanmalısınız.

const { createClient } = require('redis');
const { createAdapter } = require('@socket.io/redis-adapter');

const pubClient = createClient({ url: 'redis://localhost:6379' });
const subClient = pubClient.duplicate();

io.adapter(createAdapter(pubClient, subClient));

Üretim Ortamında (Deployment) Hata Ayıklama ve İzleme

Canlı bir sistemde Socket.io bağlantı hatalarını tespit etmek zordur. Uygulamanızı yayına alırken bağlantı kopmalarını ve sunucu yükünü izlemek için şu yöntemleri izleyin.

Bağlantı Durumu İzleme

İstemci tarafında bağlantı koptuğunda kullanıcıya bildirim göstermek ve otomatik yeniden bağlanma (reconnection) stratejisini yönetmek kritik öneme sahiptir.

socket.on('connect_error', (err) => {
  console.error('Bağlantı hatası:', err.message);
  // Kullanıcıya arayüz üzerinden uyarı verin
  showNotification('Sunucu ile bağlantı kesildi, tekrar deneniyor...');
});

socket.on('reconnect_attempt', (attempt) => {
  console.log('Yeniden bağlanma denemesi:', attempt);
});

Loglama ve Metrikler

Uygulamanızın performansını ölçmek için pm2 gibi süreç yöneticileri kullanın. Socket.io'nun dahili loglama mekanizmasını geliştirme aşamasında aktif ederek trafiği gözlemleyebilirsiniz:

// Sunucu tarafında debug modunu açmak
// Komut satırında: DEBUG=socket.io:* node server.js

Bu metrikler, özellikle sunucu üzerindeki eşzamanlı bağlantı sayısını ve mesaj işleme sürelerini takip etmenize olanak tanır. İleri seviye izleme için Prometheus ve Grafana entegrasyonu yaparak, sistem kaynaklarınızın anlık kullanımını görselleştirebilirsiniz.

Sonuç

Node.js ve Socket.io kullanarak paylaşımlı canlı kod analiz paneli oluşturmak, gerçek zamanlı web uygulamalarının temellerini anlamak için harika bir projedir. Bu rehberde, bağlantı yönetiminden güvenlik önlemlerine kadar temel adımları tamamladınız. Bir sonraki adım olarak, uygulamaya "oda" (room) özelliği ekleyerek farklı ekiplerin birbirinden bağımsız analiz oturumları başlatmasını sağlayabilirsiniz. Uygulamanızı geliştirmeye devam ederken, hata yönetimi ve performans optimizasyonlarına odaklanmayı unutmayın.

Bu yazıya tepkinizi paylaşın:
Mert Özdemir

Teknoloji ve dijital dünyadaki karmaşık süreçleri adım adım rehberlerle sadeleştiriyorum. Kullanıcıların dijital araçlardan en yüksek verimi alması için anlaşılır ve öğretici içerikler yazıyorum.

Yorumlar (0)

Yorum Yaz