@tdfc/sunbreak-react 0.2.0 → 0.2.1
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/dist/index.cjs +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var A=require('react'),sunbreakCore=require('@tdfc/sunbreak-core'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var A__default=/*#__PURE__*/_interopDefault(A);var
|
|
1
|
+
'use strict';var A=require('react'),sunbreakCore=require('@tdfc/sunbreak-core'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var A__default=/*#__PURE__*/_interopDefault(A);var w;try{let e=globalThis;w=e.__sunbreak_page_refresh_guard??(e.__sunbreak_page_refresh_guard=new Map);}catch{w=new Map;}function $(e,r){try{let t=new URL(r).origin;return `${e}::${t}`}catch{return `${e}::${r}`}}function z(e,r,t,a=[],n={current:false}){let i=A.useRef(null);A.useEffect(()=>{if(!e||!r||!t)return;let o=`${r}:${t.name}`;if(i.current===o||e.registerCooldownActive()||e.isInActiveSession())return;let u=false;return (async()=>{try{if(await e.awaitProbeReady(),await e.awaitMetadataReady(),u||e.isInActiveSession()||e.shouldWaitForInitialRefresh(n.current))return;let c=t.getToken(),f=new Promise((b,k)=>setTimeout(()=>k(new Error("Provider timeout (30s)")),3e4)),g=await Promise.race([c,f]).catch(()=>null);if(await e.awaitKeyStable(),u||!g||e.isInActiveSession()||e.isRefreshInProgress())return;let l=await sunbreakCore.makeProviderProofFromAdapter(t,g);await e.register(r,l)&&!u&&(i.current=o);}catch(c){!u&&e&&e.setError(c instanceof Error?c:new Error(String(c))),e.logger.error("Provider adapter auth failed",c);}})(),()=>{u=true;}},[e,r,t,JSON.stringify(a)]);}function J(e,r,t,a={current:false}){let n=A.useRef(null);A.useEffect(()=>{if(!e||!r||!t)return;let i=sunbreakCore.computeProofFingerprint(t);if(n.current===i)return;let o=e.getRegisteredProofId();if(e.authenticated&&o&&i!==o&&(t.method==="siwe"||t.method==="eip191")&&(e.logger.info("Detected credential change (SIWE/EIP-191 signature changed), clearing session"),e.handleProofChange(t)),e.isInActiveSession()||e.registerCooldownActive()||e.shouldWaitForInitialRefresh(a.current))return;let s=false;return (async()=>{try{if(await e.awaitProbeReady(),s)return;await e.register(r,t)&&!s&&(n.current=i);}catch(f){!s&&e&&e.setError(f instanceof Error?f:new Error(String(f))),e.logger.error("Manual proof auth failed",f);}})(),()=>{s=true;}},[e,r,t,e?.authenticated]);}function V(e,r,t,a,n={current:false},i={current:false}){let o=A.useRef(false),u=A.useRef(r);A.useEffect(()=>{let s=u.current;u.current=r,s!==r&&e&&e.probeCompleted!==false&&!e?.isRefreshInProgress()&&(o.current=false,i.current=false,n.current=false,w.delete($(t,a)));},[e,r,t,a,n]),A.useEffect(()=>{if(!e||o.current)return;o.current=true;let s=false;return (async()=>{try{if(await e.awaitProbeReady(),s||(n.current=!0,!e.shouldAttemptRefresh()))return;let f=$(t,a),g=w.get(f);if(g){let b=await g;if(s)return;b&&!i.current&&(i.current=!0,await e.session());return}let l=e.refresh();w.set(f,l);let d;try{d=await l;}catch(b){throw w.delete(f),b}if(s)return;d&&!i.current&&(i.current=!0,await e.session());}catch(f){!s&&e&&e.setError(f instanceof Error?f:new Error(String(f))),e.logger.warn("Initial refresh failed",f);}})(),()=>{s=true;}},[e,r,t,a]);}function X(e,r,t={current:false}){let a=A.useRef(false);A.useEffect(()=>{if(!e)return;let n=e.authenticated,i=a.current;if(a.current=n,!i&&n&&!t.current){if(!r||!e.getAccessToken())return;let o=e.getBoundWallet();if(o&&!sunbreakCore.walletsMatch(r,o))return;t.current=true;let u=false;return e.session().then(()=>{u||e.logger.info("Session data loaded after authentication");}).catch(s=>{u||(e&&e.setError(s instanceof Error?s:new Error(String(s))),e.logger.warn("Failed to load session after auth",s));}),()=>{u=true;}}n||(t.current=false);},[e,e?.authenticated,r]);}function H(e,r){let t=A.useRef(void 0);A.useEffect(()=>{if(!e)return;let a=t.current;t.current=r;let n=false;return (async()=>{try{if(a===void 0){r&&await e.notifyWalletChange(null,r);return}if(n)return;if(a&&r&&!sunbreakCore.walletsMatch(a,r)){await e.walletSwitch(a,r);return}if(a&&!r){if(await e.disconnect(),n)return;e.notifyWalletDisconnect();return}if(!a&&r){await e.notifyWalletChange(null,r);return}if(e.authenticated&&r){let o=e.getBoundWallet();if(o&&!sunbreakCore.walletsMatch(r,o)){if(e.logger.warn("Wallet mismatch detected, clearing auth",{current:r?.slice(0,8),bound:o?.slice(0,8)}),await e.disconnect(),n)return;await e.notifyWalletChange(o,r);}}}catch(o){n||e.logger.error("Wallet change failed",o);}})(),()=>{n=true;}},[e,r]);}function Q(e){A.useEffect(()=>{if(!e)return;let r=new AbortController,t=false,a=async()=>{if(!(t||r.signal.aborted))try{t=!0;let i=e.getState();if(!i.authenticated)return;let o=e.getBoundWallet(),u=e.getWallet();if(!u||o&&!sunbreakCore.walletsMatch(u,o))return;let s=Math.floor(Date.now()/1e3),c=30,f=3600,g=e.getTokenExpiry(),l=g?g-s<=c&&g-s>0:!1,d=i.session?.expiry,b=d?d-s<=f&&d-s>0:!1;if(l||b){if(r.signal.aborted)return;let k=await e.refresh();if(r.signal.aborted)return;k&&b&&await e.session();}}catch(i){r.signal.aborted||e.logger.error("Focus refresh failed",i);}finally{t=false;}},n=()=>{document.visibilityState==="visible"&&a();};return window.addEventListener("focus",a),document.addEventListener("visibilitychange",n),()=>{r.abort(),window.removeEventListener("focus",a),document.removeEventListener("visibilitychange",n);}},[e]);}function j(e){let{client:r,clientId:t,baseUrl:a,wallet:n,proof:i,providerAdapter:o,refreshDeps:u=[]}=e,s=A.useRef(false),c=A.useRef(false);z(r,n,o,u,s),J(r,n,i,s),V(r,n,t,a,s,c),X(r,n,c),H(r,n),Q(r);}var q=A.createContext(void 0),oe=({children:e,clientId:r,baseUrl:t,base:a,wallet:n,proof:i,providerAdapter:o,debug:u=false,fetchImpl:s,timeoutMs:c,refreshDeps:f=[]})=>{let g=t||a||"https://api.sunbreak.com",l=A.useRef(null),[d,b]=A.useState(null),[k,I]=A.useState(false),[O,D]=A.useState(0),[F,L]=A.useState(null),[v,N]=A.useState(null);A.useEffect(()=>{l.current&&l.current.updateConfig({wallet:n,providerAdapter:o,debug:u});},[d,n,o,u]),j({client:d,clientId:r,baseUrl:g,wallet:n,proof:i,providerAdapter:o,refreshDeps:f}),A.useEffect(()=>{let p=true;return (async()=>{let{adapter:y}=await sunbreakCore.createStorageAdapter(),h=new sunbreakCore.SunbreakClient({clientId:r,baseUrl:g,wallet:n,providerAdapter:o,debug:u,fetchImpl:s,timeoutMs:c},y);if(!p)return;l.current=h,b(h),h.on("stateChange",()=>{let P=h.getState();I(P.authenticated),D(P.loading),L(P.error),N(P.session);}),u&&h.on("policyChange",P=>{h.logger.info("Policy changed:",P);});let E=h.getState();I(E.authenticated),D(E.loading),L(E.error),N(E.session);try{await h.probe();}catch(P){h.logger.error("Probe initialization failed",P);}})(),()=>{p=false,l.current&&l.current.removeAllListeners();}},[]);let W=A__default.default.useCallback((p,R)=>{let y=l.current;return y?y.get(p,R):Promise.resolve(void 0)},[]),_=A__default.default.useCallback((p,R,y)=>{let h=l.current;return h?h.post(p,R,y):Promise.resolve(void 0)},[]),T=A__default.default.useCallback(()=>{let p=l.current;return p?p.session():Promise.resolve(void 0)},[]),M=A__default.default.useCallback(()=>{let p=l.current;return p?p.refresh():Promise.resolve(false)},[]),B=A.useMemo(()=>d?{get:W,post:_,session:T,refresh:M,authenticated:k,loading:O>0,error:F,errorDetail:d.getState().lastError,allowed:v?.allowed??null,sessionExpiry:v?.expiry??null,sessionData:v,wallet:n}:{get:W,post:_,session:T,refresh:M,authenticated:false,loading:false,error:null,errorDetail:void 0,allowed:null,sessionExpiry:null,sessionData:null,wallet:n},[d,k,O,F,v,n,W,_,T,M]);return jsxRuntime.jsx(q.Provider,{value:B,children:e})},se=()=>{let e=A.useContext(q);if(!e)throw new Error("useSunbreak must be used within a SunbreakProvider");return e};var he="0.2.1";
|
|
2
2
|
Object.defineProperty(exports,"isEvmAddress",{enumerable:true,get:function(){return sunbreakCore.isEvmAddress}});Object.defineProperty(exports,"normalizeWallet",{enumerable:true,get:function(){return sunbreakCore.normalizeWallet}});Object.defineProperty(exports,"walletsMatch",{enumerable:true,get:function(){return sunbreakCore.walletsMatch}});exports.SunbreakProvider=oe;exports.useSunbreak=se;exports.version=he;
|
package/dist/index.d.cts
CHANGED
|
@@ -32,6 +32,6 @@ interface SunbreakContextType {
|
|
|
32
32
|
declare const SunbreakProvider: React.FC<SunbreakProviderProps>;
|
|
33
33
|
declare const useSunbreak: () => SunbreakContextType;
|
|
34
34
|
|
|
35
|
-
declare const version = "0.2.
|
|
35
|
+
declare const version = "0.2.1";
|
|
36
36
|
|
|
37
37
|
export { type SunbreakContextType as SunbreakContextProps, type SunbreakContextType, SunbreakProvider, type SunbreakProviderProps, useSunbreak, version };
|
package/dist/index.d.ts
CHANGED
|
@@ -32,6 +32,6 @@ interface SunbreakContextType {
|
|
|
32
32
|
declare const SunbreakProvider: React.FC<SunbreakProviderProps>;
|
|
33
33
|
declare const useSunbreak: () => SunbreakContextType;
|
|
34
34
|
|
|
35
|
-
declare const version = "0.2.
|
|
35
|
+
declare const version = "0.2.1";
|
|
36
36
|
|
|
37
37
|
export { type SunbreakContextType as SunbreakContextProps, type SunbreakContextType, SunbreakProvider, type SunbreakProviderProps, useSunbreak, version };
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import A,{createContext,useRef,useState,useEffect,useMemo,useContext}from'react';import {createStorageAdapter,SunbreakClient,makeProviderProofFromAdapter,computeProofFingerprint,walletsMatch}from'@tdfc/sunbreak-core';export{isEvmAddress,normalizeWallet,walletsMatch}from'@tdfc/sunbreak-core';import {jsx}from'react/jsx-runtime';var
|
|
1
|
+
import A,{createContext,useRef,useState,useEffect,useMemo,useContext}from'react';import {createStorageAdapter,SunbreakClient,makeProviderProofFromAdapter,computeProofFingerprint,walletsMatch}from'@tdfc/sunbreak-core';export{isEvmAddress,normalizeWallet,walletsMatch}from'@tdfc/sunbreak-core';import {jsx}from'react/jsx-runtime';var w;try{let e=globalThis;w=e.__sunbreak_page_refresh_guard??(e.__sunbreak_page_refresh_guard=new Map);}catch{w=new Map;}function $(e,r){try{let t=new URL(r).origin;return `${e}::${t}`}catch{return `${e}::${r}`}}function z(e,r,t,a=[],n={current:false}){let i=useRef(null);useEffect(()=>{if(!e||!r||!t)return;let o=`${r}:${t.name}`;if(i.current===o||e.registerCooldownActive()||e.isInActiveSession())return;let u=false;return (async()=>{try{if(await e.awaitProbeReady(),await e.awaitMetadataReady(),u||e.isInActiveSession()||e.shouldWaitForInitialRefresh(n.current))return;let c=t.getToken(),f=new Promise((b,k)=>setTimeout(()=>k(new Error("Provider timeout (30s)")),3e4)),g=await Promise.race([c,f]).catch(()=>null);if(await e.awaitKeyStable(),u||!g||e.isInActiveSession()||e.isRefreshInProgress())return;let l=await makeProviderProofFromAdapter(t,g);await e.register(r,l)&&!u&&(i.current=o);}catch(c){!u&&e&&e.setError(c instanceof Error?c:new Error(String(c))),e.logger.error("Provider adapter auth failed",c);}})(),()=>{u=true;}},[e,r,t,JSON.stringify(a)]);}function J(e,r,t,a={current:false}){let n=useRef(null);useEffect(()=>{if(!e||!r||!t)return;let i=computeProofFingerprint(t);if(n.current===i)return;let o=e.getRegisteredProofId();if(e.authenticated&&o&&i!==o&&(t.method==="siwe"||t.method==="eip191")&&(e.logger.info("Detected credential change (SIWE/EIP-191 signature changed), clearing session"),e.handleProofChange(t)),e.isInActiveSession()||e.registerCooldownActive()||e.shouldWaitForInitialRefresh(a.current))return;let s=false;return (async()=>{try{if(await e.awaitProbeReady(),s)return;await e.register(r,t)&&!s&&(n.current=i);}catch(f){!s&&e&&e.setError(f instanceof Error?f:new Error(String(f))),e.logger.error("Manual proof auth failed",f);}})(),()=>{s=true;}},[e,r,t,e?.authenticated]);}function V(e,r,t,a,n={current:false},i={current:false}){let o=useRef(false),u=useRef(r);useEffect(()=>{let s=u.current;u.current=r,s!==r&&e&&e.probeCompleted!==false&&!e?.isRefreshInProgress()&&(o.current=false,i.current=false,n.current=false,w.delete($(t,a)));},[e,r,t,a,n]),useEffect(()=>{if(!e||o.current)return;o.current=true;let s=false;return (async()=>{try{if(await e.awaitProbeReady(),s||(n.current=!0,!e.shouldAttemptRefresh()))return;let f=$(t,a),g=w.get(f);if(g){let b=await g;if(s)return;b&&!i.current&&(i.current=!0,await e.session());return}let l=e.refresh();w.set(f,l);let d;try{d=await l;}catch(b){throw w.delete(f),b}if(s)return;d&&!i.current&&(i.current=!0,await e.session());}catch(f){!s&&e&&e.setError(f instanceof Error?f:new Error(String(f))),e.logger.warn("Initial refresh failed",f);}})(),()=>{s=true;}},[e,r,t,a]);}function X(e,r,t={current:false}){let a=useRef(false);useEffect(()=>{if(!e)return;let n=e.authenticated,i=a.current;if(a.current=n,!i&&n&&!t.current){if(!r||!e.getAccessToken())return;let o=e.getBoundWallet();if(o&&!walletsMatch(r,o))return;t.current=true;let u=false;return e.session().then(()=>{u||e.logger.info("Session data loaded after authentication");}).catch(s=>{u||(e&&e.setError(s instanceof Error?s:new Error(String(s))),e.logger.warn("Failed to load session after auth",s));}),()=>{u=true;}}n||(t.current=false);},[e,e?.authenticated,r]);}function H(e,r){let t=useRef(void 0);useEffect(()=>{if(!e)return;let a=t.current;t.current=r;let n=false;return (async()=>{try{if(a===void 0){r&&await e.notifyWalletChange(null,r);return}if(n)return;if(a&&r&&!walletsMatch(a,r)){await e.walletSwitch(a,r);return}if(a&&!r){if(await e.disconnect(),n)return;e.notifyWalletDisconnect();return}if(!a&&r){await e.notifyWalletChange(null,r);return}if(e.authenticated&&r){let o=e.getBoundWallet();if(o&&!walletsMatch(r,o)){if(e.logger.warn("Wallet mismatch detected, clearing auth",{current:r?.slice(0,8),bound:o?.slice(0,8)}),await e.disconnect(),n)return;await e.notifyWalletChange(o,r);}}}catch(o){n||e.logger.error("Wallet change failed",o);}})(),()=>{n=true;}},[e,r]);}function Q(e){useEffect(()=>{if(!e)return;let r=new AbortController,t=false,a=async()=>{if(!(t||r.signal.aborted))try{t=!0;let i=e.getState();if(!i.authenticated)return;let o=e.getBoundWallet(),u=e.getWallet();if(!u||o&&!walletsMatch(u,o))return;let s=Math.floor(Date.now()/1e3),c=30,f=3600,g=e.getTokenExpiry(),l=g?g-s<=c&&g-s>0:!1,d=i.session?.expiry,b=d?d-s<=f&&d-s>0:!1;if(l||b){if(r.signal.aborted)return;let k=await e.refresh();if(r.signal.aborted)return;k&&b&&await e.session();}}catch(i){r.signal.aborted||e.logger.error("Focus refresh failed",i);}finally{t=false;}},n=()=>{document.visibilityState==="visible"&&a();};return window.addEventListener("focus",a),document.addEventListener("visibilitychange",n),()=>{r.abort(),window.removeEventListener("focus",a),document.removeEventListener("visibilitychange",n);}},[e]);}function j(e){let{client:r,clientId:t,baseUrl:a,wallet:n,proof:i,providerAdapter:o,refreshDeps:u=[]}=e,s=useRef(false),c=useRef(false);z(r,n,o,u,s),J(r,n,i,s),V(r,n,t,a,s,c),X(r,n,c),H(r,n),Q(r);}var q=createContext(void 0),oe=({children:e,clientId:r,baseUrl:t,base:a,wallet:n,proof:i,providerAdapter:o,debug:u=false,fetchImpl:s,timeoutMs:c,refreshDeps:f=[]})=>{let g=t||a||"https://api.sunbreak.com",l=useRef(null),[d,b]=useState(null),[k,I]=useState(false),[O,D]=useState(0),[F,L]=useState(null),[v,N]=useState(null);useEffect(()=>{l.current&&l.current.updateConfig({wallet:n,providerAdapter:o,debug:u});},[d,n,o,u]),j({client:d,clientId:r,baseUrl:g,wallet:n,proof:i,providerAdapter:o,refreshDeps:f}),useEffect(()=>{let p=true;return (async()=>{let{adapter:y}=await createStorageAdapter(),h=new SunbreakClient({clientId:r,baseUrl:g,wallet:n,providerAdapter:o,debug:u,fetchImpl:s,timeoutMs:c},y);if(!p)return;l.current=h,b(h),h.on("stateChange",()=>{let P=h.getState();I(P.authenticated),D(P.loading),L(P.error),N(P.session);}),u&&h.on("policyChange",P=>{h.logger.info("Policy changed:",P);});let E=h.getState();I(E.authenticated),D(E.loading),L(E.error),N(E.session);try{await h.probe();}catch(P){h.logger.error("Probe initialization failed",P);}})(),()=>{p=false,l.current&&l.current.removeAllListeners();}},[]);let W=A.useCallback((p,R)=>{let y=l.current;return y?y.get(p,R):Promise.resolve(void 0)},[]),_=A.useCallback((p,R,y)=>{let h=l.current;return h?h.post(p,R,y):Promise.resolve(void 0)},[]),T=A.useCallback(()=>{let p=l.current;return p?p.session():Promise.resolve(void 0)},[]),M=A.useCallback(()=>{let p=l.current;return p?p.refresh():Promise.resolve(false)},[]),B=useMemo(()=>d?{get:W,post:_,session:T,refresh:M,authenticated:k,loading:O>0,error:F,errorDetail:d.getState().lastError,allowed:v?.allowed??null,sessionExpiry:v?.expiry??null,sessionData:v,wallet:n}:{get:W,post:_,session:T,refresh:M,authenticated:false,loading:false,error:null,errorDetail:void 0,allowed:null,sessionExpiry:null,sessionData:null,wallet:n},[d,k,O,F,v,n,W,_,T,M]);return jsx(q.Provider,{value:B,children:e})},se=()=>{let e=useContext(q);if(!e)throw new Error("useSunbreak must be used within a SunbreakProvider");return e};var he="0.2.1";
|
|
2
2
|
export{oe as SunbreakProvider,se as useSunbreak,he as version};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tdfc/sunbreak-react",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "React bindings for Sunbreak SDK",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"homepage": "https://docs.sunbreak.com",
|
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@tdfc/sunbreak-core": "^0.1.
|
|
51
|
+
"@tdfc/sunbreak-core": "^0.1.4"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@eslint/js": "^9.37.0",
|