Rychlý start pro iframe
Toto je nejrychlejší způsob, jak vyzkoušet vývojářské API bez nutnosti nejprve vytvořit backend.
V režimu iframe vaše aplikace komunikuje s nadřazeným prvkem Chastify prostřednictvím postMessage a Chastify volá serverová API vaším jménem.
Co Chastify předává vašemu iframe
Při otevření vloží Chastify datovou část JSON do location.hash.
Důležité oblasti:
bridge.nonce: hodnota podpisu požadavku pro zprávy mostu.bridge.parentOrigin: požadovaný cílový původ propostMessage.sessionId: ID relace stabilního rozšíření pro tento zámek.lockId: ID aktivního zámku.ui: hodnoty motivu z nadřazené stránky.- Volitelné:
homeActionSlug,homeAction,intent,regularActionsSummary,mainToken.
Rychlý start s knihovnou Bridge (doporučeno)
Použijte pomocné kódy z apps/extension/src/lib/ChastifyBridge.ts:
parseHashPayload()ChastifyBridgeClientstartAutoResizeToParent(...)themeVars(...)
Minimální bootstrap Reactu
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>
);
}
Příklad postMessage (bez pomocné třídy)
Pokud nepoužíváte ChastifyBridgeClient, odešlete celou obálku s požadavkem ručně:
const req = {
type: "chastify:ext:req",
v: 1,
id: crypto.randomUUID(),
nonce,
action: "session.get",
payload: {},
};
window.parent.postMessage(req, parentOrigin);
Poslouchejte odpovídající odpovědi:
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);
});
Testovací tok, který byste měli spustit jako první
session.getstate.getmetadata.getregularActions.get
Tím se potvrzuje autorizace mostu, bezpečné čtení a zpracování požadavků/odpovědí. Zápisy stavu musí provádět váš backend s přihlašovacími údaji k vývojářskému API.
Nahrávání souborů z prvku iframe
Pokud vaše rozšíření potřebuje obrázky nebo generovaná média, použijte pomocné nástroje pro přemosťovací soubory. Chastify nahrává do spravovaného úložiště R2, vrací stabilní ID souboru a poskytuje vám krátkodobě podepsanou URL adresu pro vykreslování.
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;
}
Uložte uploaded.file.id, nikoli podepsanou URL. Podepsané URL vyprší a měly by být obnoveny pomocí files.get / client.filesGet(...), když se iframe znovu načte.
Podpora motivů (ui + themeVars)
Chastify předává objekt ui v hash iframe.
themeVars(ui) jej převede na použitelné designové tokeny:
pageBgtextpanelbordermutedinputBg
Použijte tyto hodnoty jako základní styl rozšíření, aby váš iframe odpovídal tématu hostitele.
Aktualizace živých motivů
Nadřazený objekt může odesílat události chastify:ext:ui, i když je váš iframe otevřený.
Pokud chcete synchronizaci motivu v reálném čase, poslouchejte tuto událost a aktualizujte stav lokálního motivu.
Podrobné informace o práci se světlými/tmavými motivy, příklady kontrastu a vzory Tailwind naleznete v článku Motivace iframe.
Podpora automatické změny velikosti
Použijte startAutoResizeToParent(...), aby rodič mohl změnit velikost iframe podle vašeho obsahu.
Proč je to důležité:
- Zabraňuje rolovacím depeším uvnitř prvku iframe.
- Udržuje správnou velikost modálních oken nastavení a rozšiřujících stránek.
- Funguje dobře pro dynamické sekce, které se rozbalují/sbalují.
Časté chyby
- Nesprávný
targetOrigin(musí se shodovat sebridge.parentOrigin). - Chybějící nebo zastaralý kód
nonce. - Nevolá se
destroy()při odpojení proChastifyBridgeClient. - Odesílání nepodporovaných akcí bez předchozí kontroly možností
session.get.
Referenční soubory
apps/extension/src/lib/ChastifyBridge.tsapps/extension/src/pages/MainPage.tsxapps/extension/src/pages/SetupPage.tsx