UNPKG

embed-fbcmt-client

Version:
90 lines (87 loc) 2.52 kB
'use strict'; // src/client/main.ts function setPropValue(el, prop, value, origin) { if (origin === void 0) { origin = value; value = void 0; } return new Promise((resolve, reject) => { const id = (Number.MAX_SAFE_INTEGER * Math.random()).toString(34); const handler = (event) => { if (event.data?.type === "res::fb:set_value" && id === event.data.id) { const { code } = event.data; if (typeof code !== "string") return; if (code.startsWith("success.")) resolve(); else if (code.startsWith("error.")) reject(Object.assign(new Error(code), { prop })); else console.warn("[res::fb:set_value]: invalid code error '%s'", code); cancel(); } }; let timeout = null; const cancel = () => { if (timeout) clearTimeout(timeout); window.removeEventListener("message", handler); }; window.addEventListener("message", handler); timeout = setTimeout(() => { cancel(); reject(new Error("error.timeout" /* ERROR_TIMEOUT */)); }, 3e4); const res = { id, type: "req::fb:set_value", props: typeof prop === "object" ? prop : { [prop]: value } }; if (el.contentWindow) el.contentWindow.postMessage(res, origin ?? "*"); else reject(); }); } function listenEvent(el, cb) { const handler = (event) => { if (event.source !== el.contentWindow) return; if (event.data?.type !== "emit::fb_embed") return; const typeCode = getTypeCode(event.data.code); if (!typeCode) return; cb({ type: typeCode, code: event.data.code, message: event.data.message }); }; window.addEventListener("message", handler); return () => window.removeEventListener("message", handler); } function listenResize(el, type, cb) { const handler = (event) => { if (event.source !== el.contentWindow) return; if (event.data?.type !== `update::fb_${type}`) return; cb(event.data.value); }; window.addEventListener("message", handler); return () => window.removeEventListener("message", handler); } function getTypeCode(code) { if (code.startsWith("success.")) return "success"; if (code.startsWith("loading.")) return "loading"; if (code.startsWith("error.")) return "error"; return null; } exports.getTypeCode = getTypeCode; exports.listenEvent = listenEvent; exports.listenResize = listenResize; exports.setPropValue = setPropValue;