Ugrás a fő tartalomhoz

Iframe gyors üzembe helyezés

Ez a leggyorsabb módja annak, hogy kipróbáld a fejlesztői API-t anélkül, hogy először egy backendet kellene felépítened.

iframe módban az alkalmazásod a Chastify szülővel kommunikál a postMessage-n keresztül, és a ZXQTER0ZXQ meghívja a szerver API-jait a nevedben.

Amit a Chastify átad az iframe-nek

Megnyitáskor a ZXQTER0ZXQ egy JSON hasznos adatot helyez el a location.hash-ban.
Fontos mezők:

  • bridge.nonce: aláírási érték kérése hídüzenetekhez.
  • bridge.parentOrigin: a postMessage számára kötelező célforrás.
  • sessionId: stabil kiterjesztés munkamenet-azonosító ehhez a zárhoz.
  • lockId: aktív zár azonosító.
  • ui: témaértékek a szülőoldalról.
  • Opcionális: homeActionSlug, homeAction, intent, regularActionsSummary, mainToken.

Használd a apps/extension/src/lib/ChastifyBridge.ts segítőit:

  • parseHashPayload()
  • ChastifyBridgeClient
  • startAutoResizeToParent(...)
  • themeVars(...)

Minimális React bootstrap

import { useEffect, useMemo, useState } from "react";
import {
parseHashPayload,
ChastifyBridgeClient,
startAutoResizeToParent,
themeVars,
} from "../lib/ChastifyBridge";

const payload = parseHashPayload();
if (!payload?.bridge?.nonce || !payload?.bridge?.parentOrigin) {
throw new Error("Missing bridge payload in iframe hash");
}

export function App() {
const [client, setClient] = useState<ChastifyBridgeClient | null>(null);
const [session, setSession] = useState<any>(null);
const [stateDoc, setStateDoc] = useState<any>(null);
const vars = useMemo(() => themeVars(payload.ui ?? null), []);

useEffect(() => {
const c = new ChastifyBridgeClient({
nonce: payload.bridge!.nonce,
targetOrigin: payload.bridge!.parentOrigin,
});
setClient(c);
return () => c.destroy();
}, []);

useEffect(() => {
if (!client) return;
(async () => {
const s = await client.request("session.get", {});
setSession(s);

const st = await client.request("state.get", {});
setStateDoc(st);
})().catch(console.error);
}, [client]);

useEffect(() => {
return startAutoResizeToParent({
nonce: payload.bridge!.nonce,
targetOrigin: payload.bridge!.parentOrigin,
extraPx: 12,
});
}, []);

return (
<div style={{ background: vars.pageBg, color: vars.text, minHeight: "100%" }}>
<h2>Extension Quickstart</h2>
<pre>{JSON.stringify(session, null, 2)}</pre>
<pre>{JSON.stringify(stateDoc, null, 2)}</pre>
</div>
);
}

Nyers postMessage példa (segítő osztály nélkül)

Ha nem a ChastifyBridgeClient kódot használja, küldje el manuálisan a teljes kérési borítékot:

const req = {
type: "chastify:ext:req",
v: 1,
id: crypto.randomUUID(),
nonce,
action: "session.get",
payload: {},
};

window.parent.postMessage(req, parentOrigin);

Figyelj a megfelelő válaszokra:

window.addEventListener("message", (event) => {
if (event.origin !== parentOrigin) return;
const msg = event.data;
if (!msg || msg.type !== "chastify:ext:resp" || msg.v !== 1) return;
if (msg.id !== req.id) return;

if (msg.ok) console.log("Bridge success:", msg.data);
else console.error("Bridge error:", msg.error);
});

Először futtatandó tesztfolyamat

  1. session.get
  2. state.get
  3. metadata.get
  4. regularActions.get

Ez megerősíti a híd hitelesítését, a biztonságos olvasásokat és a kérések/válaszok kezelését. Az állapotírásokat a háttérrendszernek kell elvégeznie fejlesztői API hitelesítő adatokkal.

Fájlfeltöltések iframe-ből

Ha a bővítményednek képekre vagy generált médiatartalmakra van szüksége, használd a bridge fájlsegítőket. A Chastify feltölti a fájlokat a felügyelt R2 tárolóba, stabil fájlazonosítót ad vissza, és egy rövid életű aláírt URL-címet biztosít a rendereléshez.

const capabilities = await client.filesCapabilities();
if (capabilities.enabled) {
const uploaded = await client.filesUpload({
file,
filename: file.name,
purpose: "puzzle-image",
});

// Send uploaded.file.id to your backend if it should be stored in session state.

const refreshed = await client.filesGet(uploaded.file.id);
image.src = refreshed.file.signedUrl;
}

Tárold a uploaded.file.id kódot, ne az aláírt URL-t. Az aláírt URL-ek lejárnak, és a files.get / client.filesGet(...) kóddal kell frissíteni őket, amikor az iframe újra betöltődik.

Tématámogatás (ui + themeVars)

A Chastify egy ui objektumot ad át az iframe hash-ben.
A themeVars(ui) használható design tokenekké alakítja át:

  • pageBg
  • text
  • panel
  • border
  • muted
  • inputBg

Használja ezeket az értékeket a bővítmény alapstílusaként, hogy az iframe illeszkedjen a host témához.

Élő témafrissítések

A szülő chastify:ext:ui eseményeket küldhet, amíg az iframe meg van nyitva.
Ha élő témaszinkronizálást szeretne, figyeljen az adott eseményre, és frissítse a helyi téma állapotát.

A világos/sötét téma részletes kezeléséért, kontraszt példákért és a Tailwind mintákért lásd: Iframe Theming.

Automatikus átméretezés támogatása

Használd a startAutoResizeToParent(...) kódot, hogy a szülő a tartalomhoz igazíthassa az iframe méretét.

Miért fontos ez:

  • Megakadályozza a görgetési csapdákat az iframe-en belül.
  • Megfelelő méretben tartja a beállítási modális ablakokat és a bővítményoldalakat.
  • Jól működik dinamikus, kibontható/összecsukható szakaszoknál.

Gyakori hibák

  • Hibás targetOrigin (meg kell egyeznie a bridge.parentOrigin kóddal).
  • Hiányzó vagy elavult nonce.
  • Nem hívja meg a destroy()-t lecsatolásakor a ChastifyBridgeClient esetében.
  • Nem támogatott műveletek küldése a session.get képességeinek előzetes ellenőrzése nélkül.

Referenciafájlok

  • apps/extension/src/lib/ChastifyBridge.ts
  • apps/extension/src/pages/MainPage.tsx
  • apps/extension/src/pages/SetupPage.tsx