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
innerHTMLile sayfaya eklemeyin. Her zamantextContentveya 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.


Yorumlar (0)
Yorum Yaz