Hurtigstart for iframe
Dette er den raskeste måten å prøve Developer API-et uten å bygge en backend først.
I iframe-modus snakker appen din med Chastify-forelderen via postMessage, og Chastify kaller server-API-er på dine vegne.
Hva Chastify sender til iframen din
Ved åpning legger Chastify en JSON-nyttelast i location.hash.
Viktige felt:
bridge.nonce: forespørselssigneringsverdi for bromeldinger.bridge.parentOrigin: obligatorisk målopprinnelse forpostMessage.sessionId: stabil utvidelsesøkt-ID for denne låsen.lockId: aktiv lås-ID.ui: temaverdier fra overordnet side.- Valgfritt:
homeActionSlug,homeAction,intent,regularActionsSummary,mainToken.
Hurtigstart med Bridge-biblioteket (anbefales)
Bruk hjelpere fra apps/extension/src/lib/ChastifyBridge.ts:
parseHashPayload()ChastifyBridgeClientstartAutoResizeToParent(...)themeVars(...)
Minimal 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>
);
}
Rå postMessage-eksempel (ingen hjelpeklasse)
Hvis du ikke bruker ChastifyBridgeClient, send hele forespørselskonvolutten manuelt:
const req = {
type: "chastify:ext:req",
v: 1,
id: crypto.randomUUID(),
nonce,
action: "session.get",
payload: {},
};
window.parent.postMessage(req, parentOrigin);
Lytt etter samsvarende svar:
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);
});
Testflyten du bør kjøre først
session.getstate.getmetadata.getregularActions.get
Dette bekrefter broautifisering, sikre lesninger og håndtering av forespørsler/svar. Tilstandsskrivinger må utføres av backend-serveren din med utvikler-API-legitimasjon.
Filopplastinger fra iframe
Hvis utvidelsen din trenger bilder eller genererte medier, bruk brofilhjelperne. Chastify laster opp til administrert R2-lagring, returnerer en stabil fil-ID og gir deg en kortvarig signert URL for gjengivelse.
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;
}
Lagre uploaded.file.id, ikke den signerte URL-en. Signerte URL-er utløper og bør oppdateres med files.get / client.filesGet(...) når iframe-en lastes inn igjen.
Temastøtte (ui + themeVars)
Chastify sender et ui-objekt i iframe-hashen.
themeVars(ui) konverterer det til brukbare designtokener:
pageBgtextpanelbordermutedinputBg
Bruk disse verdiene som basisstil for utvidelsen din, slik at iframe-en din samsvarer med vertstemaet.
Live-temaoppdateringer
Forelderen kan sende chastify:ext:ui-hendelser mens iframe-en din er åpen.
Hvis du vil ha synkronisering av live-temaer, lytt etter hendelsen og oppdater den lokale tematilstanden.
For detaljert håndtering av lyse/mørke temaer, eksempler på kontrast og Tailwind-mønstre, se Iframe Theming.
Støtte for automatisk størrelsesendring
Bruk startAutoResizeToParent(...) slik at den overordnede kan endre størrelsen på iframe-en til innholdet ditt.
Hvorfor dette er viktig:
- Forhindrer rullefeller inne i iframe-en.
- Holder oppsettsmodaler og utvidelsessider i riktig størrelse.
- Fungerer bra for dynamiske seksjoner som utvides/skjules.
Vanlige feil
- Feil
targetOrigin(må samsvare medbridge.parentOrigin). - Manglende eller foreldet
nonce. - Kaller ikke
destroy()ved avmontering forChastifyBridgeClient. - Sender ustøttede handlinger uten å sjekke
session.get-funksjonaliteten først.
Referansefiler
apps/extension/src/lib/ChastifyBridge.tsapps/extension/src/pages/MainPage.tsxapps/extension/src/pages/SetupPage.tsx