Brzi početak za iframe
Ovo je najbrži način za isprobavanje Developer API-ja bez prethodne izgradnje backenda.
U iframe načinu rada, vaša aplikacija komunicira s roditeljem Chastify putem postMessage, a Chastify poziva poslužiteljske API-je u vaše ime.
Što Chastify prosljeđuje vašem iframeu
Pri otvaranju, Chastify stavlja JSON korisni teret u location.hash.
Važna polja:
bridge.nonce: vrijednost potpisa zahtjeva za poruke mosta.bridge.parentOrigin: potrebno ciljno ishodište zapostMessage.sessionId: stabilni ID sesije proširenja za ovu bravu.lockId: ID aktivne brave.ui: vrijednosti teme s nadređene stranice.- Neobavezno:
homeActionSlug,homeAction,intent,regularActionsSummary,mainToken.
Brzi početak s Bridge bibliotekom (preporučeno)
Koristite pomoćne programe iz apps/extension/src/lib/ChastifyBridge.ts:
parseHashPayload()ChastifyBridgeClientstartAutoResizeToParent(...)themeVars(...)
Minimalni 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>
);
}
Primjer sirovog postMessage (bez pomoćne klase)
Ako ne koristite ChastifyBridgeClient, pošaljite cijelu omotnicu zahtjeva ručno:
const req = {
type: "chastify:ext:req",
v: 1,
id: crypto.randomUUID(),
nonce,
action: "session.get",
payload: {},
};
window.parent.postMessage(req, parentOrigin);
Poslušajte odgovarajuće odgovore:
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);
});
Testni tok koji biste trebali prvo pokrenuti
session.getstate.getmetadata.getregularActions.get
Ovo potvrđuje autorizaciju mosta, sigurna čitanja i rukovanje zahtjevima/odgovorima. Zapisivanje stanja mora izvršiti vaš backend s vjerodajnicama Developer API-ja.
Prijenosi datoteka iz iframea
Ako vašem proširenju trebaju slike ili generirani mediji, upotrijebite pomoćne alate za premosnu datoteku. Chastify prenosi podatke u upravljanu R2 pohranu, vraća stabilan ID datoteke i daje vam kratkotrajni potpisani URL za renderiranje.
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;
}
Pohrani uploaded.file.id, a ne potpisani URL. Potpisani URL-ovi istječu i treba ih osvježiti s files.get / client.filesGet(...) kada se iframe ponovno učita.
Podrška za teme (ui + themeVars)
Chastify prosljeđuje objekt ui u iframe hashu.
themeVars(ui) ga pretvara u upotrebljive dizajnerske tokene:
pageBgtextpanelbordermutedinputBg
Koristite ove vrijednosti kao osnovni stil vašeg proširenja kako bi vaš iframe odgovarao temi hosta.
Ažuriranja tema uživo
Roditelj može slati chastify:ext:ui događaje dok je vaš iframe otvoren.
Ako želite sinkronizaciju teme uživo, osluškujte taj događaj i ažurirajte lokalno stanje teme.
Za detaljno rukovanje svijetlim/tamnim temama, primjere kontrasta i uzorke Tailwind pogledajte Iframe Theming.
Podrška za automatsku promjenu veličine
Koristite startAutoResizeToParent(...) kako bi roditelj mogao promijeniti veličinu iframea prema vašem sadržaju.
Zašto je ovo važno:
- Sprječava zamke pomicanja unutar iframea.
- Održava ispravnu veličinu modalnih prozora za postavljanje i stranica proširenja.
- Dobro funkcionira za dinamičke odjeljke koji se proširuju/sažimaju.
Uobičajene pogreške
- Pogrešan
targetOrigin(mora odgovaratibridge.parentOrigin). - Nedostaje ili je zastario
nonce. - Ne poziva se
destroy()prilikom demontiranja zaChastifyBridgeClient. - Slanje nepodržanih radnji bez prethodne provjere mogućnosti
session.get.
Referentne datoteke
apps/extension/src/lib/ChastifyBridge.tsapps/extension/src/pages/MainPage.tsxapps/extension/src/pages/SetupPage.tsx