Ana içeriğe geç

Mesaj Geçişi (Message Passing)

Graytool'un katmanları arası iletişim, Chrome'un mesaj geçişi mekanizması üzerinden gerçekleşir.

Mesaj Tipleri

type GrayToolMessage =
| ActivateMessage
| DeactivateMessage
| ConfigUpdatedMessage
| CheckUrlMessage
| GetConfigMessage
| PingMessage
| RequestPermissionMessage
| HasPermissionMessage
| GetConfiguredOriginsMessage;

Background → Content Script

ACTIVATE

Eklentinin aktif olması gereken bir sayfaya girildiğinde gönderilir.

interface ActivateMessage {
type: "ACTIVATE";
matchedPatternId?: string; // Eşleşen URL pattern'in ID'si
}

Tetikleyici: tabs.onUpdated — sayfa yüklendiğinde Alıcı: inject/index.ts Sonuç: Content script aktif olur, satır işleme başlar

DEACTIVATE

Eklentinin devre dışı kalması gereken durumlarda gönderilir.

interface DeactivateMessage {
type: "DEACTIVATE";
}

Tetikleyici: URL artık pattern ile eşleşmediğinde Alıcı: inject/index.ts Sonuç: Observer durur, stiller kaldırılır

CONFIG_UPDATED

Yapılandırma değiştiğinde tüm sekmelere broadcast edilir.

interface ConfigUpdatedMessage {
type: "CONFIG_UPDATED";
}

Tetikleyici: chrome.storage.onChanged — ayarlar değiştiğinde Alıcı: Tüm sekmelerdeki content script'ler Sonuç: Content script'ler yapılandırmayı yeniden yükler

Content Script → Background

CHECK_URL

Content script, mevcut URL'nin bir pattern ile eşleşip eşleşmediğini sorar.

interface CheckUrlMessage {
type: "CHECK_URL";
}

Yanıt: { isMatch: boolean, matchedPatternId?: string }

GET_CONFIG

Content script, tam yapılandırmayı ister.

interface GetConfigMessage {
type: "GET_CONFIG";
}

Yanıt: GrayToolConfig nesnesi

PING

Bağlantı kontrolü.

interface PingMessage {
type: "PING";
}

Yanıt: { pong: true }

REQUEST_PERMISSION

URL pattern için izin isteği.

interface RequestPermissionMessage {
type: "REQUEST_PERMISSION";
pattern: string;
}

Yanıt: boolean — izin verildi mi

HAS_PERMISSION

Belirli URL için izin sorgusu.

interface HasPermissionMessage {
type: "HAS_PERMISSION";
url: string;
}

Yanıt: boolean — izin var mı

GET_CONFIGURED_ORIGINS

Tüm yapılandırılmış URL pattern'lerini ister.

interface GetConfiguredOriginsMessage {
type: "GET_CONFIGURED_ORIGINS";
}

Yanıt: string[] — URL pattern listesi

Özel Olaylar (Custom Events)

Content script içi iletişim için CustomEvent kullanılır:

graytool:open-detail

Mesaj detay butonundan JSON viewer'a iletişim:

document.dispatchEvent(new CustomEvent("graytool:open-detail", {
detail: {
fields: DiscoveredField[],
config: GrayToolConfig,
row: Element
}
}));

İletişim Diyagramı

┌─────────────┐              ┌─────────────┐
│ Background │ │ Content │
│ Service │ ACTIVATE → │ Script │
│ Worker │ DEACTIVATE →│ (inject) │
│ │ CONFIG_UPD →│ │
│ │ │ │
│ │ ← CHECK_URL │ │
│ │ ← GET_CONFIG │ │
│ │ ← PING │ │
│ │ ← REQ_PERM │ │
│ │ ← HAS_PERM │ │
│ │ ← GET_ORIGINS│ │
└─────────────┘ └──────┬──────┘

CustomEvent

┌──────▼──────┐
│ JSON Viewer │
│ Search Hist │
└─────────────┘


┌─────────────┐
│ Options │ saveConfig() → chrome.storage.sync
│ Page │
│ (React) │ → storage.onChanged → background broadcasts
└─────────────┘

Hata Yönetimi

Bağlantı kopması

Content script, background ile bağlantısını kaybedebilir (service worker uyudu):

try {
const response = await chrome.runtime.sendMessage({ type: "GET_CONFIG" });
} catch (error) {
// Service worker uyanmadı — sessiz başarısızlık
console.log("Graytool: Connection error:", error);
}

Yanıt bekleme

Mesajlar asenkron olarak işlenir. Background handler'lar sendResponse veya Promise döner.