Ada Eklentileri
Rehberler

Ağ ve gizli değerler

fetch ile API çağırmak, API anahtarlarını Keychain'de tutmak, hataları ele almak.

fetch

Eklentilerde tarayıcıdakine benzer bir fetch vardır. Yalnız https:// adreslerine ve manifest.json'da network:<alan-adı> olarak istenen alan adlarına gider.

manifest.json
"permissions": ["network:api.open-meteo.com"]
const url = new URL("https://api.open-meteo.com/v1/forecast");
url.searchParams.set("latitude", "41.01");
url.searchParams.set("longitude", "28.97");
url.searchParams.set("current", "temperature_2m");

const res = await fetch(url, { timeout: 10_000 });
if (!res.ok) throw new Error(`Open-Meteo: ${res.status}`);
const data = await res.json<{ current: { temperature_2m: number } }>();

Kısayol: ctx.network.fetchJSON<T>(url, init) isteği atar ve .json() döndürür.

İstek gövdesi

await fetch("https://api.example.com/items", {
  method: "POST",
  headers: { authorization: `Bearer ${token}` },
  body: { title: "Yeni" },                     // nesne → JSON, content-type kendiliğinden
});

await fetch("https://api.example.com/login", {
  method: "POST",
  body: new URLSearchParams({ user: "ada" }),  // form
});

Metin olduğu gibi, URLSearchParams form olarak, diğer her değer JSON olarak gönderilir. Gövde en fazla 1 MB.

Hatalar

HataNe zaman
PermissionErrorAlan adı network: izinlerinde yok, http:// adres ya da izinsiz bir adrese yönlendirme
NetworkErrorBağlantı yok, DNS hatası, reddedilen bağlantı, 5 MB'tan büyük yanıt, istek sınırı aşıldı
TimeoutErrortimeout (varsayılan 15 sn) aşıldı

4xx/5xx yanıtlar hata fırlatmaz; res.ok ve res.status'a bak.

async update(ctx) {
  try {
    const data = await ctx.network.fetchJSON<Weather>(url);
    ctx.storage.set("last", data);              // son iyi yanıtı sakla
    return view(data);
  } catch (error) {
    const last = ctx.storage.get<Weather>("last");
    if (error instanceof NetworkError && last) return view(last, { stale: true });
    throw error;
  }
}

Çevrimdışıyken boşuna istek atmamak için await AdanotchKit.system.isOnline() ve network.change olayını kullanabilirsin.

Gizli değerler

API anahtarlarını ve parolaları koda ya da storage'a yazma. manifest.json'da secret türünde bir ayar tanımla; kullanıcı Ayarlar'da girer, Adanotch macOS Keychain'de saklar.

manifest.json
"settings": [
  { "key": "token", "type": "secret", "label": "GitHub token" }
]
async update() {
  const token = await AdanotchKit.secrets.get("token");
  if (!token) {
    return { expanded: ui.text("Ayarlar'dan bir GitHub token gir.", { tone: "secondary" }) };
  }
  const res = await fetch("https://api.github.com/user", {
    headers: { authorization: `Bearer ${token}`, accept: "application/vnd.github+json" },
  });
  // …
}
  • secret ayarları ctx.settings'e gelmez ve default alamaz.
  • secrets.get kullanıcı değeri girene kadar null döner. Kullanıcı değeri kaydettiğinde ya da sildiğinde update yeniden çalışır.
  • Gizli değerler eklentinin kimliğine bağlıdır; başka eklenti okuyamaz.

Gizli değeri console.log ile yazdırma: günlükler Ayarlar › Geliştirici'de ve adanotch dev çıktısında görünür.

Görseller

ui.image(src) da aynı izin listesine tabidir: avatar göstereceksen görselin alan adını da iste.

"permissions": ["network:api.github.com", "network:avatars.githubusercontent.com"]

Bu sayfada