Meeto Widget: geliştirici belgeleri
Widget, türlenmiş bir postMessage köprüsüne sahip bir meeto.me iframe'idir. Tek ihtiyacın olan açık bir embed anahtarı — panelde bir tane oluştur.
Hızlı başlangıç
Stack'ini seç, YOUR_KEY'i anahtarınla değiştir ve konteynere bir yükseklik ver — widget onun %100'ünü doldurur.
<div id="meeto-call" style="height: 520px"></div>
<script src="https://meeto.me/widget.js" data-key="YOUR_KEY" data-target="#meeto-call"></script>npm paketleri: @meeto/embed-core (bağımlılıksız), @meeto/embed-react, @meeto/embed-vue, @meeto/embed-angular. Sade widget.js script'i herhangi bir build adımı olmadan çalışır.
Script parametreleri
<script src="https://meeto.me/widget.js"> etiketinin öznitelikleri (* — zorunlu). Aynı seçenekler JavaScript API'sinde (key, container, room, name, lang, accent, autoJoin, baseUrl) ve <meeto-room> web bileşeninin öznitelikleri olarak da bulunur.
| Parametre | Açıklama |
|---|---|
| data-key* | Panelden açık embed anahtarı (mk_live_…). |
| data-mode | inline (varsayılan, kendi kapsayıcınızda iframe) veya bubble — sayfanın köşesinde yüzen bir arama düğmesi; kapsayıcı gerekmez. |
| data-target | Konteynerin CSS seçicisi. Bu olmadan, script etiketinin hemen ardından 520px yüksekliğinde bir blok oluşturulur. |
| data-room-name | Kalıcı adlandırılmış oda: bu kod parçasına sahip herkes aynı odada buluşur («support»). Anahtarın sahibi panelden host olarak katılır. |
| data-position | Balon köşesi: bottom-right (varsayılan) veya bottom-left. |
| data-label | Balon düğmesinin aria-label değeri (widget, sitenizin dilini bilmez). |
| data-room | Var olan bir odanın kodu (meeto.me/<code>). Bu olmadan widget odayı kendisi oluşturur ve sekme içinde yeniden kullanır. |
| data-name | Lobide önceden doldurulan katılımcı adı. |
| data-lang | Widget arayüzü dili (en, ru, de, …). Varsayılan — ziyaretçinin tarayıcı dili. |
| data-accent | Vurgu rengi, hex (ör. #27D6AA). |
| data-auto-join | Lobiyi atla ve hemen katıl (yalnızca açık kapılı odalar; kamera ve mikrofon açık başlar). |
| data-base-url | Self-hosted kurulumlar için Meeto adresi. |
| data-accelerated | call.meeto.me üzerinden sunulan, izolasyona hazır gömme: sayfanız diğer kaynaklardan izole edildiğinde (COOP/COEP başlıkları) kamera efektleri daha hızlı çalışır. Bu başlıklar olmadan widget, varsayılan gömme ile tamamen aynı şekilde çalışır. |
Oda bağlantıları geçerli kalır: herhangi bir widget odası meeto.me/<code> adresinden de açılabilir.
Olaylar ve yöntemler
widget.on(type, handler) (bir abonelikten çıkma fonksiyonu döndürür), onEvent seçeneği, framework bileşeni props'ları ya da <meeto-room> öğesinin meeto:* CustomEvents'leri aracılığıyla abone ol.
const widget = new MeetoWidget({ key: "mk_live_…", container: "#call" });
const off = widget.on("joined", (e) => console.log(e.room));
widget.on("participants", (e) => console.log("in call:", e.count));| Olay | Payload |
|---|---|
| ready | — — widget yüklendi ve sayfaya bağlandı |
| phase | { phase: "prejoin" | "room" | "finished" | "error" } — ekran değişti (lobby, call, finished, error) |
| joined | { room, identity } — ziyaretçi aramaya katıldı |
| left | { reason, durationSec } — ziyaretçi aramadan ayrıldı (reason: left, ended, kicked, connection) |
| participants | { count } — katılımcı sayısı değişti |
| error | { code, message } — widget başlayamıyor (hatalı anahtar, kayıtlı olmayan alan adı, …) |
Widget örneğinin yöntemleri:
| Yöntem | Açıklama |
|---|---|
| join(name?) | Lobiden aramaya programatik olarak katıl (açık kapılı odalar). |
| leave() | Aramadan ayrıl. |
| setMicrophone(on) | Arama sırasında mikrofonu aç/kapat. |
| setCamera(on) | Arama sırasında kamerayı aç/kapat. |
| destroy() | iframe'i ve tüm abonelikleri kaldır. |
Kapı çalma, şifre veya kilit olan bir odada join() ziyaretçiyi lobide tutar ve widget join_not_allowed koduyla error yayar — bunun yerine ziyaretçinin lobiden kendisinin katılmasını sağlayın.
Sunucu API'si
Sunucu tarafı akışlar için (arka ucundan oda oluşturma, bağlantıları e-postayla gönderme, kimin sunucu olacağına karar verme) gizli anahtar mk_secret_…'i kullan — embed'i oluşturduğunda bir kez gösterilir:
curl -X POST https://api.meeto.me/api/embed/rooms \
-H "Authorization: Bearer mk_secret_…"
# → 201 { "slug": "misty-fox-42", "hostSecret": "…" }curl -X POST https://api.meeto.me/api/v1/meetings \
-H "Authorization: Bearer mk_secret_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: appointment-872" \
-d '{
"title": "Project review",
"startsAt": "2027-03-22T10:00:00+02:00",
"durationMin": 45,
"timezone": "Europe/Tallinn"
}'
# → 201 { "meeting": { "id": "…", "joinUrl": "https://meeto.me/…?k=…" }, "hostSecret": "…" }
curl https://api.meeto.me/api/v1/meetings \
-H "Authorization: Bearer mk_secret_…"hostSecret, onu taşıyanı odanın sahibi yapar: odayı widget'a data-room ile ilet ve hostSecret'i yalnızca kendi personeline ver. Gizli anahtarla yapılan istekler alan adı kontrolünü atlar — onu asla tarayıcı kodunda açığa çıkarma.
Sürümlü API (/api/v1) Pro planında kullanılabilir: Free hesabın anahtarıyla yapılan istekler 402 plan_required yanıtı alır. Widget'ın kendisi her planda çalışır.
Mobil SDK’lar (iOS / Android)
Yerel sarmalayıcılar aynı widget’ı uygulamanıza gömer: türlenmiş bir olay/komut köprüsüne sahip bir WebView. Uygulama origin’i app://<bundle-id> değerini anahtarın alan adlarına kaydedin.
iOS (Swift Package, iOS 14+)
// Xcode → File → Add Package Dependencies…
https://github.com/meeto-app/meeto-widget-ios.git // from: 0.1.2import MeetoWidget
MeetoWidget(config: .init(key: "mk_live_…", roomName: "support")) { event in
if event.type == "left" { /* close the screen */ }
}Swift Package; Info.plist dosyasına NSCameraUsageDescription ve NSMicrophoneUsageDescription ekleyin.
Android (Kotlin, minSdk 24)
// settings.gradle.kts
dependencyResolutionManagement { repositories { maven("https://jitpack.io") } }
// module's build.gradle.kts
dependencies { implementation("com.github.meeto-app:meeto-widget-android:0.1.3") }val widget = MeetoWidgetView(this)
widget.onEvent = { event -> if (event.type == "left") finish() }
container.addView(widget)
widget.load(MeetoWidgetConfig(key = "mk_live_…", roomName = "support"))Gradle modülü; CAMERA / RECORD_AUDIO / INTERNET izinlerini tanımlayın ve widget’ı göstermeden önce çalışma zamanı izinlerini isteyin.
Olaylar (ready, joined, left, participants, error) ve komutlar (join, leave, setMicrophone, setCamera) web SDK ile aynıdır.
Kaynak kodu ve sürümler: meeto-app/meeto-widget-ios ↗meeto-app/meeto-widget-android ↗
WordPress eklentisi
Widget’ı bir WordPress sitesine kod yazmadan ekleyin: her sayfada kayan bir arama düğmesi veya bir shortcode ile satır içi arama.
meeto-widget.zip dosyasını indir- WordPress yönetim panelinde Eklentiler → Yeni Ekle → Eklenti Yükle bölümünü açın ve zip dosyasını yükleyin.
- Eklentiyi etkinleştirin ve Ayarlar → Meeto Widget bölümünü açın.
- Yerleştirme anahtarınızı (sitenizin alan adı eklenmiş olarak) yapıştırın — arama düğmesi yayında.
Satır içi bir widget için ayarlarda otomatik eklemeyi kapatın ve shortcode’u herhangi bir sayfaya yerleştirin: [meeto_widget room_name="support" height="600"]
Sınırlar
Widget odaları anahtar sahibinin planına uyar:
- Free — 10 katılımcıya kadar, 60 dakikaya kadar grup aramaları, 1080p'ye kadar.
- Pro — 25 katılımcıya kadar, aynı anda 2 toplantı için süre sınırı yok ve desteklenen masaüstü bilgisayarlarda 4K'ya kadar. Meeto markası görünür kalır.
Güvenlik
- Açık anahtar bir sır değildir: sayfanın kaynağında görünür, bu tasarım gereğidir.
- Widget yalnızca anahtar için kayıtlı alan adlarında çalışır. Tarayıcı, gömülü sitenin origin'ini sayfaların sahteleyemeyeceği bir biçimde bildirir (postMessage event.origin) ve Meeto arka ucu bunu doğrular.
- Gizli anahtar mk_secret_… karma (hash) olarak saklanır ve yalnızca bir kez gösterilir. Onu yalnızca sunucudan sunucuya kullan.
- Sızmış ya da kullanılmayan bir anahtar panelde her an iptal edilebilir — widget anında durur.
SSS
Hangi framework'ler destekleniyor?
Hepsi. widget.js ile sade HTML, npm paketleri ile React/Next.js, Vue/Nuxt ve Angular, geri kalan her şey <meeto-room> web bileşeni ile.
Self-hosted bir Meeto ile çalışır mı?
Evet: data-base-url'yi (ya da baseUrl seçeneğini) kendi kurulumuna yönlendir.
“Powered by Meeto”yu kaldırabilir miyim?
Hayır. “Powered by Meeto” rozeti Pro ve Team dâhil tüm planlarda görünür kalır.
Widget hangi boyutları destekler?
Hepsini: iframe konteynerini doldurur. Dar konteynerlerde arayüz otomatik olarak kompakt düzene geçer.