@machinemetrics/mm-react-embeddable 2.0.0-5 → 2.0.0-7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  Components and hooks for embedding mm-apps into an interface. Primarily used for sandbox testing the creation of custom dashboard widgets.
4
4
 
5
+ ## Host readiness (`ready`, required)
6
+
7
+ `MMEmbeddableZoneProvider` takes a required boolean `ready`: true once the host holds the
8
+ bearer its `credentialBroker` sends. Until then every `MMEmbeddableZone` keeps its slot but
9
+ mounts no iframe, so the first broker call always carries a token. A host that omits the prop
10
+ is treated as not ready and gets a one-time `alert` plus a console error — failing closed beats
11
+ racing the broker against token hydration (a guest that mounted before the host's token
12
+ arrived got a synthetic `invalid_token`, fell through with no credential, and rendered blank
13
+ until refresh). Hosts on mm-react-tools pass `ready={Boolean(useCredential('api'))}`.
14
+
5
15
  ## Consent UI
6
16
 
7
17
  The library ships no consent UI. `useEmbeddedAuthorizations()` exposes the pending
@@ -1,9 +1,9 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),Ee=require("prop-types"),ge=require("styled-components"),te=r=>r&&r.__esModule?r:{default:r},L=te(t),k=te(Ee),ne=te(ge),Y=t.createContext(null),N=t.createContext({pending:[],authorize:()=>{},approve:()=>{},complete:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),ue="access_token",Q=r=>r?r.kind?r:r.accessToken?{kind:ue,accessToken:r.accessToken,expiresAt:r.expiresAt||null}:null:null,Re=60,ke=120,Ce=new Set(["host_not_allowed","unbound_host_bound_guest","invalid_token","provider_unavailable"]),J=typeof window!="undefined"&&window.location.protocol==="https:",Te=8e3,G=r=>{try{return new URL(r).origin}catch{return null}},se=(r,o)=>{const i=o==null?void 0:o.origin;return!i||G(r==null?void 0:r.authUrl)!==i?null:i},oe=r=>{if(!r||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(r)||r.includes(":"))return r;const o=r.split(".");return o.length<=2?r:o.slice(-2).join(".")},ee=(r,o)=>{try{const i=new URL(r),f=new URL(o);return i.protocol!==f.protocol?!0:oe(i.hostname)!==oe(f.hostname)}catch{return!0}},ce=(r,{onBlocked:o,onClosed:i})=>{const f=window.open(r.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!f)return o(),()=>{};const h=setInterval(()=>{f.closed&&(clearInterval(h),i())},1e3);return()=>clearInterval(h)},ie=({children:r,launcher:o,broker:i})=>{const f=t.useContext(Y),[h,E]=t.useState({}),[B,C]=t.useState({}),[x,A]=t.useState({}),[P,O]=t.useState({}),v=t.useRef(x);v.current=x;const g=t.useRef(h);g.current=h;const z=t.useRef(null),K=t.useRef({}),M=t.useRef({}),D=t.useRef({}),$=t.useRef(i);$.current=i;const _=t.useCallback(e=>{const n=M.current[e];if(!n)return;const s=a=>!a[e]||a[e].clientId?a:{...a,[e]:{...a[e],clientId:n}};E(s),O(s)},[]),c=t.useCallback((e,n)=>{e&&(O(s=>s[e]?s:{...s,[e]:{origin:e,reason:n,clientId:M.current[e]||null}}),_(e))},[_]),l=t.useCallback((e,{v2:n=!1,origin:s=null}={})=>{s&&(n&&v.current[s]||(E(a=>a[s]?a:{...a,[s]:{origin:s,authUrl:e.authUrl,silentUrl:e.silentUrl||null,status:n&&$.current?"broker":n&&e.silentUrl&&J?"silent":"interactive",v2:n,scope:e.scope||null,acceptsCredentials:D.current[s]||null,consent:null,error:null,clientId:e.clientId||M.current[s]||null,popupBlocked:!1}}),_(s)))},[_]),u=t.useRef({}),d=t.useCallback(e=>{u.current[e]&&(clearTimeout(u.current[e]),delete u.current[e])},[]),p=t.useCallback(e=>{d(e),E(n=>{if(!n[e])return n;const s={...n};return delete s[e],s})},[d]),m=t.useCallback(e=>{e&&(p(e),C(n=>({...n,[e]:(n[e]||0)+1})))},[p]),S=t.useCallback(e=>{E(n=>!n[e]||n[e].status==="interactive"?n:{...n,[e]:{...n[e],status:"interactive"}})},[]),y=t.useCallback(e=>{p(e.origin)},[p]),R=t.useCallback((e,n)=>{const s=se(e,n);if(s){if(ee(s,window.location.origin)){c(s,"cross-site-legacy");return}l(e,{origin:s})}},[l,c]);t.useEffect(()=>{if(!f)return;const e=[f.addListener("*","init",(n,s)=>{s!=null&&s.origin&&(n!=null&&n.clientId)&&(M.current[s.origin]=n.clientId,_(s.origin)),s!=null&&s.origin&&Array.isArray(n==null?void 0:n.acceptsCredentials)?D.current[s.origin]=n.acceptsCredentials:s!=null&&s.origin&&ee(s.origin,window.location.origin)&&c(s.origin,"cross-site-legacy")}),f.addListener("*","authorize",R),f.addListener("*","login",R),f.addListener("*","credential-request",(n,s)=>l(n,{v2:!0,origin:se(n,s)}))];return()=>e.forEach(n=>n())},[f,R,l,_,c]),t.useEffect(()=>{const e=n=>{const s=n==null?void 0:n.data;if(!s||s.type!=="authorized"&&s.type!=="authorize-failed")return;const a=G(s.authUrl);if(!(!a||n.origin!==a)){if(s.type==="authorized"){if(s.accessToken){if(!g.current[a])return;A(b=>({...b,[a]:Q({accessToken:s.accessToken})})),p(a)}else m(a);return}S(a)}};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[p,m,S]);const F=t.useCallback((e,n)=>{const s=e==null?void 0:e.origin,a=Q(n);!s||!a||(A(b=>({...b,[s]:a})),p(s))},[p]),U=t.useCallback((e,n)=>{E(s=>s[e]?{...s,[e]:{...s[e],...n}}:s)},[]),w=t.useRef({}),I=t.useCallback(async(e,{approve:n}={})=>{const s=$.current,{origin:a}=e;let b;try{b=await s({origin:a,clientId:e.clientId,scope:e.scope,authUrl:e.authUrl},{approve:n})}catch{n?U(a,{error:{reason:"broker_unavailable"}}):U(a,{status:e.silentUrl&&J?"silent":"interactive"});return}if((b==null?void 0:b.status)===200&&b.credential){F(e,b.credential);return}if((b==null?void 0:b.status)===409&&b.consentRequired){U(a,{status:"interactive",consent:{client:b.client||null,stepUp:!!b.stepUp,scope:b.scope||e.scope},error:null});return}const V=(b==null?void 0:b.error)||"broker_error";if(!n&&Ce.has(V)){U(a,{status:e.silentUrl&&J?"silent":"interactive"});return}if(n&&V==="consent_denied"){U(a,{error:null});return}if(V==="rate_limited"&&!e.rateLimitRetried){const X=Math.min(Number(b==null?void 0:b.retryAfter)>0?Number(b.retryAfter):Re,ke),me={...e,rateLimitRetried:!0};d(a),u.current[a]=setTimeout(()=>{delete u.current[a],w.current[a]=!0,Z.current(me,{approve:n}).finally(()=>{delete w.current[a]})},X*1e3),U(a,{rateLimitRetried:!0});return}p(a),O(X=>({...X,[a]:{origin:a,reason:`broker:${V}`,detail:b||null,clientId:e.clientId||M.current[a]||null}}))},[F,U,p,d]),Z=t.useRef(I);Z.current=I,t.useEffect(()=>{Object.values(h).forEach(e=>{e.status!=="broker"||w.current[e.origin]||u.current[e.origin]||(w.current[e.origin]=!0,I(e).finally(()=>{delete w.current[e.origin]}))})},[h,I]);const W=t.useCallback(e=>!$.current||!(e!=null&&e.consent)?Promise.resolve():I(e,{approve:!0}),[I]);t.useEffect(()=>{const e=K.current;Object.values(h).forEach(n=>{n.status==="silent"&&!e[n.origin]&&(e[n.origin]=setTimeout(()=>{delete e[n.origin],S(n.origin)},Te))}),Object.keys(e).forEach(n=>{(!h[n]||h[n].status!=="silent")&&(clearTimeout(e[n]),delete e[n])})},[h,S]),t.useEffect(()=>()=>{z.current&&z.current(),Object.values(K.current).forEach(clearTimeout),Object.values(u.current).forEach(clearTimeout)},[]);const j=t.useCallback(e=>{z.current&&(z.current(),z.current=null);const n=o||ce;z.current=n(e,{onBlocked:()=>{E(s=>s[e.origin]?{...s,[e.origin]:{...s[e.origin],popupBlocked:!0}}:s)},onClosed:()=>{if(e.v2){J&&E(s=>!s[e.origin]||!s[e.origin].silentUrl?s:{...s,[e.origin]:{...s[e.origin],status:"silent"}});return}m(e.origin)}})},[o,m]),T={pending:Object.values(h).filter(e=>e.status==="interactive"),authorize:j,approve:W,complete:F,dismiss:y,originEpochs:B,credentials:x,unsupported:P},q=Object.values(h).filter(e=>e.status==="silent"&&e.silentUrl);return L.default.createElement(N.Provider,{value:T},r,q.map(e=>L.default.createElement("iframe",{key:`mm-silent-auth-${e.origin}`,src:e.silentUrl,title:`MachineMetrics silent authorization (${e.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};ie.propTypes={children:k.default.node,launcher:k.default.func,broker:k.default.func};const _e=()=>t.useContext(N),ae=r=>{const{originEpochs:o}=t.useContext(N),i=G(r);return i&&o[i]||0},le=r=>{const{credentials:o}=t.useContext(N),i=G(r);return i&&o[i]||null},de=r=>{const{unsupported:o}=t.useContext(N),i=G(r);return i&&o[i]||null},fe=({children:r,authorizationLauncher:o,credentialBroker:i})=>{const[f,h]=t.useState({}),[E,B]=t.useState({}),C=t.useRef({}),x=t.useRef({}),A=t.useRef({}),P=t.useCallback((c,l)=>{var u;return!!((u=A.current[c])!=null&&u.has(l))},[]),O=t.useCallback((c,l,u)=>{h(d=>({...d,[c]:{origin:l,frameRef:u}}))},[]),v=t.useCallback(c=>{h(l=>{const u={...l};return delete u[c],u}),B(l=>{const u={...l};return delete u[c],u}),delete A.current[c]},[]);t.useEffect(()=>{const c=(u=[],d,p)=>{u.forEach(m=>m(d,p))},l=u=>{var F,U,w,I,Z,W,j;if(!((F=u==null?void 0:u.data)!=null&&F.instanceId))return;const{instanceId:d,type:p}=u.data,m=f[d],S=(w=(U=m==null?void 0:m.frameRef)==null?void 0:U.current)==null?void 0:w.contentWindow;if(!S||u.source!==S||u.origin!==m.origin)return;const y={origin:u.origin},R=C.current;if(p==="response"){const{callbackId:T,response:q,error:e}=u.data,n=x.current[T];n&&(n(q,e),delete x.current[T]);return}if(p==="mark-registered"){const{requestType:T}=u.data;A.current[d]||(A.current[d]=new Set),A.current[d].add(T);return}p==="ready"&&B(T=>({...T,[d]:!0})),c((I=R[d])==null?void 0:I[p],u.data,y),c((Z=R["*"])==null?void 0:Z[p],u.data,y),c((W=R[d])==null?void 0:W["*"],u.data,y),c((j=R["*"])==null?void 0:j["*"],u.data,y)};return window.addEventListener("message",l),()=>{window.removeEventListener("message",l)}},[f]);const g=t.useCallback((c,l,u)=>{var p,m;const d=f[c];if(!d){console.warn(`Origin not set for id: ${c}. Unable to send message.`);return}(m=(p=d==null?void 0:d.frameRef)==null?void 0:p.current)!=null&&m.contentWindow&&d.frameRef.current.contentWindow.postMessage({type:l,...u,instanceId:c},d.origin)},[f]),z=t.useRef(0),K=t.useCallback(()=>`${Date.now()}-${++z.current}`,[]),M=t.useCallback(async(c,l,u={})=>new Promise((d,p)=>{const m=K(),S=(y,R)=>{delete x.current[m],R?p(R):d(y)};x.current[m]=S,g(c,"request",{callbackId:m,requestType:l,data:u})}),[g]),D=t.useCallback((c,l)=>{g(c,"load-options",l)},[g]),$=t.useCallback((c,l)=>{g(c,"validate",l)},[g]),_=t.useMemo(()=>({registerFrame:O,unregisterFrame:v,sendMessage:g,sendRequest:M,loadOptions:D,validate:$,hasHandler:P,readyFrames:E,addListener:(c,l,u)=>(C.current[c]||(C.current[c]={}),C.current[c][l]||(C.current[c][l]=[]),C.current[c][l].push(u),()=>{C.current[c][l]=C.current[c][l].filter(d=>d!==u)})}),[O,v,g,M,D,$,P,E]);return L.default.createElement(Y.Provider,{value:_},L.default.createElement(ie,{launcher:o,broker:i},r))},H=(r,o,i)=>{const f=t.useContext(Y);if(f===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const h=t.useRef(i);t.useEffect(()=>{h.current=i},[i]),t.useEffect(()=>{if(!(!r||!o)){if(o.startsWith("key:")){const E=o.substring(4);return f.readyFrames[r]&&f.sendMessage(r,"subscribe-key",{keyChord:E}),f.addListener(r,`key-pressed:${E}`,(...C)=>h.current(...C))}return f.addListener(r,o,(...E)=>h.current(...E))}},[f,r,o])};fe.propTypes={children:k.default.node.isRequired,authorizationLauncher:k.default.func,credentialBroker:k.default.func};const re=ne.default.default||ne.default,we=1e4,Ie="credentials",Me=(r,o)=>`${r}/mm-embedded-interop?id=${encodeURIComponent(o)}&origin=${encodeURIComponent(window.location.origin)}&caps=${Ie}`,Se=re.iframe`
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),ke=require("prop-types"),Ce=require("styled-components"),re=n=>n&&n.__esModule?n:{default:n},A=re(t),E=re(ke),oe=re(Ce),G=t.createContext(null),Y=t.createContext({pending:[],authorize:()=>{},approve:()=>{},complete:()=>{},dismiss:()=>{},originEpochs:{},credentials:{},unsupported:{}}),ae="access_token",ee=n=>n?n.kind?n:n.accessToken?{kind:ae,accessToken:n.accessToken,expiresAt:n.expiresAt||null}:null:null,Te=60,we=120,_e=new Set(["host_not_allowed","unbound_host_bound_guest","invalid_token","provider_unavailable"]),J=typeof window!="undefined"&&window.location.protocol==="https:",Ie=8e3,Q=n=>{try{return new URL(n).origin}catch{return null}},ue=(n,o)=>{const i=o==null?void 0:o.origin;return!i||Q(n==null?void 0:n.authUrl)!==i?null:i},ce=n=>{if(!n||/^\d{1,3}(?:\.\d{1,3}){3}$/.test(n)||n.includes(":"))return n;const o=n.split(".");return o.length<=2?n:o.slice(-2).join(".")},te=(n,o)=>{try{const i=new URL(n),f=new URL(o);return i.protocol!==f.protocol?!0:ce(i.hostname)!==ce(f.hostname)}catch{return!0}},le=(n,{onBlocked:o,onClosed:i})=>{const f=window.open(n.authUrl,"mm-embed-auth","popup,width=600,height=700");if(!f)return o(),()=>{};const p=setInterval(()=>{f.closed&&(clearInterval(p),i())},1e3);return()=>clearInterval(p)},de=({children:n,launcher:o,broker:i})=>{const f=t.useContext(G),[p,h]=t.useState({}),[y,P]=t.useState({}),[q,B]=t.useState({}),[k,U]=t.useState({}),x=t.useRef(q);x.current=q;const w=t.useRef(p);w.current=p;const L=t.useRef(null),W=t.useRef({}),m=t.useRef({}),H=t.useRef({}),j=t.useRef(i);j.current=i;const _=t.useCallback(e=>{const r=m.current[e];if(!r)return;const s=c=>!c[e]||c[e].clientId?c:{...c,[e]:{...c[e],clientId:r}};h(s),U(s)},[]),I=t.useCallback((e,r)=>{e&&(U(s=>s[e]?s:{...s,[e]:{origin:e,reason:r,clientId:m.current[e]||null}}),_(e))},[_]),z=t.useCallback((e,{v2:r=!1,origin:s=null}={})=>{s&&(r&&x.current[s]||(h(c=>c[s]?c:{...c,[s]:{origin:s,authUrl:e.authUrl,silentUrl:e.silentUrl||null,status:r&&j.current?"broker":r&&e.silentUrl&&J?"silent":"interactive",v2:r,scope:e.scope||null,acceptsCredentials:H.current[s]||null,consent:null,error:null,clientId:e.clientId||m.current[s]||null,popupBlocked:!1}}),_(s)))},[_]),M=t.useRef({}),l=t.useCallback(e=>{M.current[e]&&(clearTimeout(M.current[e]),delete M.current[e])},[]),a=t.useCallback(e=>{l(e),h(r=>{if(!r[e])return r;const s={...r};return delete s[e],s})},[l]),u=t.useCallback(e=>{e&&(a(e),P(r=>({...r,[e]:(r[e]||0)+1})))},[a]),d=t.useCallback(e=>{h(r=>!r[e]||r[e].status==="interactive"?r:{...r,[e]:{...r[e],status:"interactive"}})},[]),R=t.useCallback(e=>{a(e.origin)},[a]),b=t.useCallback((e,r)=>{const s=ue(e,r);if(s){if(te(s,window.location.origin)){I(s,"cross-site-legacy");return}z(e,{origin:s})}},[z,I]);t.useEffect(()=>{if(!f)return;const e=[f.addListener("*","init",(r,s)=>{s!=null&&s.origin&&(r!=null&&r.clientId)&&(m.current[s.origin]=r.clientId,_(s.origin)),s!=null&&s.origin&&Array.isArray(r==null?void 0:r.acceptsCredentials)?H.current[s.origin]=r.acceptsCredentials:s!=null&&s.origin&&te(s.origin,window.location.origin)&&I(s.origin,"cross-site-legacy")}),f.addListener("*","authorize",b),f.addListener("*","login",b),f.addListener("*","credential-request",(r,s)=>z(r,{v2:!0,origin:ue(r,s)}))];return()=>e.forEach(r=>r())},[f,b,z,_,I]),t.useEffect(()=>{const e=r=>{const s=r==null?void 0:r.data;if(!s||s.type!=="authorized"&&s.type!=="authorize-failed")return;const c=Q(s.authUrl);if(!(!c||r.origin!==c)){if(s.type==="authorized"){if(s.accessToken){if(!w.current[c])return;B(T=>({...T,[c]:ee({accessToken:s.accessToken})})),a(c)}else u(c);return}d(c)}};return window.addEventListener("message",e),()=>window.removeEventListener("message",e)},[a,u,d]);const O=t.useCallback((e,r)=>{const s=e==null?void 0:e.origin,c=ee(r);!s||!c||(B(T=>({...T,[s]:c})),a(s))},[a]),g=t.useCallback((e,r)=>{h(s=>s[e]?{...s,[e]:{...s[e],...r}}:s)},[]),C=t.useRef({}),S=t.useCallback(async(e,{approve:r}={})=>{const s=j.current,{origin:c}=e;let T;try{T=await s({origin:c,clientId:e.clientId,scope:e.scope,authUrl:e.authUrl},{approve:r})}catch{r?g(c,{error:{reason:"broker_unavailable"}}):g(c,{status:e.silentUrl&&J?"silent":"interactive"});return}const se=T==null?void 0:T.status,v=(T==null?void 0:T.body)||{};if(se===200&&v.credential){O(e,v.credential);return}if(se===409&&v.consentRequired){g(c,{status:"interactive",consent:{client:v.client||null,stepUp:!!v.stepUp,scope:v.scope||e.scope},error:null});return}const V=v.error||"broker_error";if(!r&&_e.has(V)){g(c,{status:e.silentUrl&&J?"silent":"interactive"});return}if(r&&V==="consent_denied"){g(c,{error:null});return}if(V==="rate_limited"&&!e.rateLimitRetried){const X=Math.min(Number(v.retryAfter)>0?Number(v.retryAfter):Te,we),Re={...e,rateLimitRetried:!0};l(c),M.current[c]=setTimeout(()=>{delete M.current[c],C.current[c]=!0,D.current(Re,{approve:r}).finally(()=>{delete C.current[c]})},X*1e3),g(c,{rateLimitRetried:!0});return}a(c),U(X=>({...X,[c]:{origin:c,reason:`broker:${V}`,detail:T||null,clientId:e.clientId||m.current[c]||null}}))},[O,g,a,l]),D=t.useRef(S);D.current=S,t.useEffect(()=>{Object.values(p).forEach(e=>{e.status!=="broker"||C.current[e.origin]||M.current[e.origin]||(C.current[e.origin]=!0,S(e).finally(()=>{delete C.current[e.origin]}))})},[p,S]);const K=t.useCallback(e=>!j.current||!(e!=null&&e.consent)?Promise.resolve():S(e,{approve:!0}),[S]);t.useEffect(()=>{const e=W.current;Object.values(p).forEach(r=>{r.status==="silent"&&!e[r.origin]&&(e[r.origin]=setTimeout(()=>{delete e[r.origin],d(r.origin)},Ie))}),Object.keys(e).forEach(r=>{(!p[r]||p[r].status!=="silent")&&(clearTimeout(e[r]),delete e[r])})},[p,d]),t.useEffect(()=>()=>{L.current&&L.current(),Object.values(W.current).forEach(clearTimeout),Object.values(M.current).forEach(clearTimeout)},[]);const Z=t.useCallback(e=>{L.current&&(L.current(),L.current=null);const r=o||le;L.current=r(e,{onBlocked:()=>{h(s=>s[e.origin]?{...s,[e.origin]:{...s[e.origin],popupBlocked:!0}}:s)},onClosed:()=>{if(e.v2){J&&h(s=>!s[e.origin]||!s[e.origin].silentUrl?s:{...s,[e.origin]:{...s[e.origin],status:"silent"}});return}u(e.origin)}})},[o,u]),$={pending:Object.values(p).filter(e=>e.status==="interactive"),authorize:Z,approve:K,complete:O,dismiss:R,originEpochs:y,credentials:q,unsupported:k},F=Object.values(p).filter(e=>e.status==="silent"&&e.silentUrl);return A.default.createElement(Y.Provider,{value:$},n,F.map(e=>A.default.createElement("iframe",{key:`mm-silent-auth-${e.origin}`,src:e.silentUrl,title:`MachineMetrics silent authorization (${e.origin})`,"aria-hidden":"true",tabIndex:-1,style:{display:"none"}})))};de.propTypes={children:E.default.node,launcher:E.default.func,broker:E.default.func};const Me=()=>t.useContext(Y),fe=n=>{const{originEpochs:o}=t.useContext(Y),i=Q(n);return i&&o[i]||0},pe=n=>{const{credentials:o}=t.useContext(Y),i=Q(n);return i&&o[i]||null},be=n=>{const{unsupported:o}=t.useContext(Y),i=Q(n);return i&&o[i]||null},ie="MMEmbeddableZoneProvider requires a boolean `ready` prop (true once the host holds the bearer its credentialBroker needs). Embedded apps will not load until it is provided.",he=({children:n,authorizationLauncher:o,credentialBroker:i,ready:f})=>{const p=f===!0,h=t.useRef(!1);t.useEffect(()=>{f!==void 0||h.current||(h.current=!0,console.error(ie),typeof window!="undefined"&&typeof window.alert=="function"&&window.alert(ie))},[f]);const[y,P]=t.useState({}),[q,B]=t.useState({}),k=t.useRef({}),U=t.useRef({}),x=t.useRef({}),w=t.useCallback((l,a)=>{var u;return!!((u=x.current[l])!=null&&u.has(a))},[]),L=t.useCallback((l,a,u)=>{P(d=>({...d,[l]:{origin:a,frameRef:u}}))},[]),W=t.useCallback(l=>{P(a=>{const u={...a};return delete u[l],u}),B(a=>{const u={...a};return delete u[l],u}),delete x.current[l]},[]);t.useEffect(()=>{const l=(u=[],d,R)=>{u.forEach(b=>b(d,R))},a=u=>{var S,D,K,Z,$,F,e;if(!((S=u==null?void 0:u.data)!=null&&S.instanceId))return;const{instanceId:d,type:R}=u.data,b=y[d],O=(K=(D=b==null?void 0:b.frameRef)==null?void 0:D.current)==null?void 0:K.contentWindow;if(!O||u.source!==O||u.origin!==b.origin)return;const g={origin:u.origin},C=k.current;if(R==="response"){const{callbackId:r,response:s,error:c}=u.data,T=U.current[r];T&&(T(s,c),delete U.current[r]);return}if(R==="mark-registered"){const{requestType:r}=u.data;x.current[d]||(x.current[d]=new Set),x.current[d].add(r);return}R==="ready"&&B(r=>({...r,[d]:!0})),l((Z=C[d])==null?void 0:Z[R],u.data,g),l(($=C["*"])==null?void 0:$[R],u.data,g),l((F=C[d])==null?void 0:F["*"],u.data,g),l((e=C["*"])==null?void 0:e["*"],u.data,g)};return window.addEventListener("message",a),()=>{window.removeEventListener("message",a)}},[y]);const m=t.useCallback((l,a,u)=>{var R,b;const d=y[l];if(!d){console.warn(`Origin not set for id: ${l}. Unable to send message.`);return}(b=(R=d==null?void 0:d.frameRef)==null?void 0:R.current)!=null&&b.contentWindow&&d.frameRef.current.contentWindow.postMessage({type:a,...u,instanceId:l},d.origin)},[y]),H=t.useRef(0),j=t.useCallback(()=>`${Date.now()}-${++H.current}`,[]),_=t.useCallback(async(l,a,u={})=>new Promise((d,R)=>{const b=j(),O=(g,C)=>{delete U.current[b],C?R(C):d(g)};U.current[b]=O,m(l,"request",{callbackId:b,requestType:a,data:u})}),[m]),I=t.useCallback((l,a)=>{m(l,"load-options",a)},[m]),z=t.useCallback((l,a)=>{m(l,"validate",a)},[m]),M=t.useMemo(()=>({registerFrame:L,unregisterFrame:W,sendMessage:m,sendRequest:_,loadOptions:I,validate:z,hasHandler:w,readyFrames:q,ready:p,addListener:(l,a,u)=>(k.current[l]||(k.current[l]={}),k.current[l][a]||(k.current[l][a]=[]),k.current[l][a].push(u),()=>{k.current[l][a]=k.current[l][a].filter(d=>d!==u)})}),[L,W,m,_,I,z,w,q,p]);return A.default.createElement(G.Provider,{value:M},A.default.createElement(de,{launcher:o,broker:i},n))},N=(n,o,i)=>{const f=t.useContext(G);if(f===null)throw new Error("useEmbeddedEffect must be used within a MMEmbeddableZoneProvider");const p=t.useRef(i);t.useEffect(()=>{p.current=i},[i]),t.useEffect(()=>{if(!(!n||!o)){if(o.startsWith("key:")){const h=o.substring(4);return f.readyFrames[n]&&f.sendMessage(n,"subscribe-key",{keyChord:h}),f.addListener(n,`key-pressed:${h}`,(...P)=>p.current(...P))}return f.addListener(n,o,(...h)=>p.current(...h))}},[f,n,o])};he.propTypes={children:E.default.node.isRequired,ready:E.default.bool.isRequired,authorizationLauncher:E.default.func,credentialBroker:E.default.func};const ne=oe.default.default||oe.default,Se=1e4,Ue="credentials",Le=(n,o)=>`${n}/mm-embedded-interop?id=${encodeURIComponent(o)}&origin=${encodeURIComponent(window.location.origin)}&caps=${Ue}`,Ae=ne.iframe`
2
2
  width: 100%;
3
3
  height: 100%;
4
4
  border: none;
5
- visibility: ${r=>r.$isReady?"visible":"hidden"};
6
- `,Ue=re.div`
5
+ visibility: ${n=>n.$isReady?"visible":"hidden"};
6
+ `,xe=ne.div`
7
7
  width: 100%;
8
8
  height: 100%;
9
9
  display: flex;
@@ -16,10 +16,10 @@
16
16
  text-align: center;
17
17
  color: #555;
18
18
  font-size: 14px;
19
- `,pe=r=>{const o=r&&r.origin||"This app",i=r&&r.reason||"";switch(i){case"broker:scope_above_ceiling":return{title:`${o} can’t be authorized here`,detail:"It asks for permissions your role doesn’t have."};case"broker:origin_mismatch":case"broker:unknown_client":return{title:`${o} can’t be authorized here`,detail:"It isn’t registered to run at this address."};case"broker:cross_company_principal":return{title:`${o} can’t be authorized here`,detail:"It can’t be authorized for this account."};default:return i.startsWith("broker:")?{title:`${o} can’t be authorized here`,detail:"Authorization was refused."}:{title:`${o} can’t be embedded here`,detail:"It needs an update to support embedding from a different domain."}}},be=({entry:r})=>{const o=pe(r);return L.default.createElement(Ue,{"data-reason":r&&r.reason||void 0},L.default.createElement("div",{style:{fontWeight:600}},o.title),L.default.createElement("div",{style:{fontSize:12,color:"#888"}},o.detail))};be.propTypes={entry:k.default.shape({origin:k.default.string,name:k.default.string,reason:k.default.string,detail:k.default.object})};const Le=re.div`
19
+ `,Ee=n=>{const o=n&&n.origin||"This app",i=n&&n.reason||"";switch(i){case"broker:scope_above_ceiling":return{title:`${o} can’t be authorized here`,detail:"It asks for permissions your role doesn’t have."};case"broker:origin_mismatch":case"broker:unknown_client":return{title:`${o} can’t be authorized here`,detail:"It isn’t registered to run at this address."};case"broker:cross_company_principal":return{title:`${o} can’t be authorized here`,detail:"It can’t be authorized for this account."};default:return i.startsWith("broker:")?{title:`${o} can’t be authorized here`,detail:"Authorization was refused."}:{title:`${o} can’t be embedded here`,detail:"It needs an update to support embedding from a different domain."}}},me=({entry:n})=>{const o=Ee(n);return A.default.createElement(xe,{"data-reason":n&&n.reason||void 0},A.default.createElement("div",{style:{fontWeight:600}},o.title),A.default.createElement("div",{style:{fontSize:12,color:"#888"}},o.detail))};me.propTypes={entry:E.default.shape({origin:E.default.string,name:E.default.string,reason:E.default.string,detail:E.default.object})};const ze=ne.div`
20
20
  height: 100%;
21
21
  display: flex;
22
22
  flex: 1;
23
23
  align-items: center;
24
24
  justify-content: center;
25
- `,xe=()=>L.default.createElement(Le,null,L.default.createElement("div",{style:{textAlign:"center"}},"This app couldn’t be loaded as an embeddable widget.")),he=({id:r,src:o,path:i,onInit:f=()=>{},onTimeout:h,context:E={},params:B={},renderUnsupported:C,renderTimeout:x,...A})=>{if("isConfiguring"in A)return console.error("isConfiguring must be passed via the params prop to MMEmbeddableZone"),null;if("colorMode"in E)return console.error("colorMode must be passed via the params prop to MMEmbeddableZone"),null;if("isFullScreen"in E)return console.error("isFullScreen must be passed via the params prop to MMEmbeddableZone"),null;const P=t.useRef(),[O,v]=t.useState(),[g,z]=t.useState(0),[K,M]=t.useState(!1),[D,$]=t.useState(!1),_=ae(o),c=le(o),l=de(o),[u,d]=t.useState(0),[p,m]=t.useState(null),{registerFrame:S,unregisterFrame:y,sendMessage:R}=t.useContext(Y),[F,U]=t.useState(),w=t.useRef(),I=t.useRef(h),Z=t.useRef(f),W=t.useRef(!1),j=t.useCallback(()=>{W.current=!1,clearTimeout(w.current),z(0),M(!1),$(!1),m(null)},[]);t.useEffect(()=>{(_>0||u>0)&&j()},[_,u,j]),t.useEffect(()=>{I.current=h},[h]),t.useEffect(()=>{Z.current=f},[f]),t.useEffect(()=>{g&&R(r,"set-context",{context:{...E}})},[E,r,g]),t.useEffect(()=>{g&&R(r,"set-params",{params:B})},[B,r,g]),t.useEffect(()=>{i!==void 0&&U((i==null?void 0:i.indexOf("/"))===0?i:`/${i}`)},[i]),t.useEffect(()=>{F===void 0||!g||R(r,"navigate",{path:F})},[F,g,r,R]),t.useEffect(()=>{if(!o||!r||!P)return;j();const e=new URL(o);return S(r,e.origin,P),Z.current(),v(Me(e.origin,r)),()=>{y(r)}},[o,r,S,P,j]),t.useEffect(()=>{if(!(!O||W.current))return w.current=setTimeout(()=>{M(!0),I.current&&I.current()},we),()=>clearTimeout(w.current)},[O,o,_,u]);const T=t.useCallback(()=>{W.current=!0,clearTimeout(w.current),M(!1)},[]);H(r,"init",e=>{T(),Array.isArray(e==null?void 0:e.acceptsCredentials)&&m(e.acceptsCredentials)}),H(r,"authorize",T),H(r,"login",T),H(r,"credential-request",()=>{T(),$(!0)}),t.useEffect(()=>{if(!D||!c)return;const e=p;if(Array.isArray(e)&&!e.includes(c.kind))return;const n=c.kind==="access_token"?{accessToken:c.accessToken}:{};R(r,"credential",{...n,credential:c})},[D,c,p,r,R]),H(r,"ready",()=>{T(),z(e=>e+1)});const q=t.useRef();return H(r,"heartbeat",()=>{q.current&&clearTimeout(q.current),q.current=setTimeout(()=>{d(e=>e+1)},6e3)}),t.useEffect(()=>()=>{q.current&&clearTimeout(q.current)},[]),l?C?C(l):L.default.createElement(be,{entry:l}):K&&!g?x?x():L.default.createElement(xe,null):L.default.createElement(Se,{key:`auth-epoch-${_}-frame-${u}`,$isReady:g,ref:P,src:O,...A})};he.propTypes={id:k.default.string,src:k.default.string.isRequired,path:k.default.string,onInit:k.default.func,onTimeout:k.default.func,renderUnsupported:k.default.func,renderTimeout:k.default.func};exports.CREDENTIAL_KIND_ACCESS_TOKEN=ue;exports.EmbeddedAuthorizationContext=N;exports.MMEmbeddableZone=he;exports.MMEmbeddableZoneContext=Y;exports.MMEmbeddableZoneProvider=fe;exports.isCrossSite=ee;exports.normalizeCredential=Q;exports.popupAuthorizationLauncher=ce;exports.unsupportedCopy=pe;exports.useEmbeddedAuthorizations=_e;exports.useEmbeddedCredential=le;exports.useEmbeddedEffect=H;exports.useEmbeddedOriginEpoch=ae;exports.useEmbeddedUnsupported=de;
25
+ `,Oe=()=>A.default.createElement(ze,null,A.default.createElement("div",{style:{textAlign:"center"}},"This app couldn’t be loaded as an embeddable widget.")),ge=({id:n,src:o,path:i,onInit:f=()=>{},onTimeout:p,context:h={},params:y={},renderUnsupported:P,renderTimeout:q,...B})=>{if("isConfiguring"in B)return console.error("isConfiguring must be passed via the params prop to MMEmbeddableZone"),null;if("colorMode"in h)return console.error("colorMode must be passed via the params prop to MMEmbeddableZone"),null;if("isFullScreen"in h)return console.error("isFullScreen must be passed via the params prop to MMEmbeddableZone"),null;const k=t.useRef(),[U,x]=t.useState(),[w,L]=t.useState(0),[W,m]=t.useState(!1),[H,j]=t.useState(!1),_=fe(o),I=pe(o),z=be(o),[M,l]=t.useState(0),[a,u]=t.useState(null),{registerFrame:d,unregisterFrame:R,sendMessage:b,ready:O}=t.useContext(G),[g,C]=t.useState(),S=t.useRef(),D=t.useRef(p),K=t.useRef(f),Z=t.useRef(!1),$=t.useCallback(()=>{Z.current=!1,clearTimeout(S.current),L(0),m(!1),j(!1),u(null)},[]);t.useEffect(()=>{(_>0||M>0)&&$()},[_,M,$]),t.useEffect(()=>{D.current=p},[p]),t.useEffect(()=>{K.current=f},[f]),t.useEffect(()=>{w&&b(n,"set-context",{context:{...h}})},[h,n,w]),t.useEffect(()=>{w&&b(n,"set-params",{params:y})},[y,n,w]),t.useEffect(()=>{i!==void 0&&C((i==null?void 0:i.indexOf("/"))===0?i:`/${i}`)},[i]),t.useEffect(()=>{g===void 0||!w||b(n,"navigate",{path:g})},[g,w,n,b]),t.useEffect(()=>{if(!o||!n||!k)return;if(!O){$(),x(void 0);return}$();const r=new URL(o);return d(n,r.origin,k),K.current(),x(Le(r.origin,n)),()=>{R(n)}},[o,n,O,d,k,$]),t.useEffect(()=>{if(!(!U||Z.current))return S.current=setTimeout(()=>{m(!0),D.current&&D.current()},Se),()=>clearTimeout(S.current)},[U,o,_,M]);const F=t.useCallback(()=>{Z.current=!0,clearTimeout(S.current),m(!1)},[]);N(n,"init",r=>{F(),Array.isArray(r==null?void 0:r.acceptsCredentials)&&u(r.acceptsCredentials)}),N(n,"authorize",F),N(n,"login",F),N(n,"credential-request",()=>{F(),j(!0)}),t.useEffect(()=>{if(!H||!I)return;const r=a;if(Array.isArray(r)&&!r.includes(I.kind))return;const s=I.kind==="access_token"?{accessToken:I.accessToken}:{};b(n,"credential",{...s,credential:I})},[H,I,a,n,b]),N(n,"ready",()=>{F(),L(r=>r+1)});const e=t.useRef();return N(n,"heartbeat",()=>{e.current&&clearTimeout(e.current),e.current=setTimeout(()=>{l(r=>r+1)},6e3)}),t.useEffect(()=>()=>{e.current&&clearTimeout(e.current)},[]),z?P?P(z):A.default.createElement(me,{entry:z}):W&&!w?q?q():A.default.createElement(Oe,null):A.default.createElement(Ae,{key:`auth-epoch-${_}-frame-${M}`,$isReady:w,ref:k,src:U,...B})};ge.propTypes={id:E.default.string,src:E.default.string.isRequired,path:E.default.string,onInit:E.default.func,onTimeout:E.default.func,renderUnsupported:E.default.func,renderTimeout:E.default.func};exports.CREDENTIAL_KIND_ACCESS_TOKEN=ae;exports.EmbeddedAuthorizationContext=Y;exports.MMEmbeddableZone=ge;exports.MMEmbeddableZoneContext=G;exports.MMEmbeddableZoneProvider=he;exports.isCrossSite=te;exports.normalizeCredential=ee;exports.popupAuthorizationLauncher=le;exports.unsupportedCopy=Ee;exports.useEmbeddedAuthorizations=Me;exports.useEmbeddedCredential=pe;exports.useEmbeddedEffect=N;exports.useEmbeddedOriginEpoch=fe;exports.useEmbeddedUnsupported=be;