@fluid-app/rep-sdk 0.1.0 → 0.1.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.js CHANGED
@@ -23,6 +23,45 @@ var HTTP_METHODS = {
23
23
  DELETE: "DELETE"
24
24
  };
25
25
 
26
+ // src/auth/auth-redirect.ts
27
+ var DEFAULT_AUTH_URL = "https://auth.fluid.app";
28
+ var AUTH_REDIRECT_TOKEN_KEY = "jwt";
29
+ var REDIRECT_TIMESTAMP_KEY = "__fluid_auth_redirect_ts";
30
+ var REDIRECT_COOLDOWN_S = 10;
31
+ function isRedirectLoop() {
32
+ try {
33
+ const ts = sessionStorage.getItem(REDIRECT_TIMESTAMP_KEY);
34
+ if (!ts) return false;
35
+ const elapsed = (Date.now() - Number(ts)) / 1e3;
36
+ return elapsed < REDIRECT_COOLDOWN_S;
37
+ } catch {
38
+ return false;
39
+ }
40
+ }
41
+ function markRedirect() {
42
+ try {
43
+ sessionStorage.setItem(REDIRECT_TIMESTAMP_KEY, String(Date.now()));
44
+ } catch {
45
+ }
46
+ }
47
+ function createDefaultAuthRedirect(authUrl) {
48
+ return () => {
49
+ if (isRedirectLoop()) {
50
+ console.warn(
51
+ "[FluidAuth] Auth redirect suppressed \u2014 possible redirect loop. Check that your auth server returns a token accepted by the API."
52
+ );
53
+ return;
54
+ }
55
+ markRedirect();
56
+ const base = authUrl ?? DEFAULT_AUTH_URL;
57
+ const currentUrl = encodeURIComponent(window.location.href);
58
+ window.location.href = `${base}/?redirect_url=${currentUrl}`;
59
+ };
60
+ }
61
+ function resolveAuthFailureHandler(onAuthFailure, authUrl) {
62
+ return onAuthFailure ?? createDefaultAuthRedirect(authUrl);
63
+ }
64
+
26
65
  // src/client/fluid-client.ts
27
66
  var ApiError = class _ApiError extends Error {
28
67
  status;
@@ -66,6 +105,7 @@ function extractErrorMessage(data, fallback) {
66
105
  }
67
106
  function createFluidClient(config) {
68
107
  const { baseUrl, getAuthToken, onAuthError, defaultHeaders = {} } = config;
108
+ const effectiveOnAuthError = onAuthError ?? createDefaultAuthRedirect();
69
109
  async function buildHeaders(customHeaders) {
70
110
  const headers = {
71
111
  "Content-Type": "application/json",
@@ -151,8 +191,8 @@ function createFluidClient(config) {
151
191
  null
152
192
  );
153
193
  }
154
- if (response.status === 401 && onAuthError) {
155
- onAuthError();
194
+ if (response.status === 401) {
195
+ effectiveOnAuthError();
156
196
  }
157
197
  if (!response.ok) {
158
198
  try {
@@ -754,6 +794,7 @@ function FluidAuthProvider({
754
794
  const [error, setError] = useState(null);
755
795
  useEffect(() => {
756
796
  const initializeAuth = async () => {
797
+ const handleAuthFailure = resolveAuthFailureHandler(config?.onAuthFailure, config?.authUrl);
757
798
  try {
758
799
  if (isDevBypassActive(config?.devBypass)) {
759
800
  const envToken = import.meta.env.VITE_DEV_TOKEN;
@@ -781,7 +822,11 @@ function FluidAuthProvider({
781
822
  }
782
823
  const tokenKey = config?.tokenKey ?? "fluidUserToken";
783
824
  let candidateToken = extractTokenFromUrl(tokenKey);
825
+ if (!candidateToken && tokenKey !== AUTH_REDIRECT_TOKEN_KEY) {
826
+ candidateToken = extractTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);
827
+ }
784
828
  cleanTokenFromUrl(tokenKey);
829
+ cleanTokenFromUrl(AUTH_REDIRECT_TOKEN_KEY);
785
830
  if (!candidateToken) {
786
831
  candidateToken = getStoredToken(config);
787
832
  }
@@ -794,7 +839,7 @@ function FluidAuthProvider({
794
839
  setToken(null);
795
840
  setUser(null);
796
841
  setError(new Error("JWT signature verification failed"));
797
- config?.onAuthFailure?.();
842
+ handleAuthFailure();
798
843
  return;
799
844
  }
800
845
  if (isTokenExpired(candidateToken, config?.gracePeriodMs)) {
@@ -802,7 +847,7 @@ function FluidAuthProvider({
802
847
  setToken(null);
803
848
  setUser(null);
804
849
  setError(new Error("Token has expired"));
805
- config?.onAuthFailure?.();
850
+ handleAuthFailure();
806
851
  return;
807
852
  }
808
853
  } else {
@@ -817,7 +862,7 @@ function FluidAuthProvider({
817
862
  setToken(null);
818
863
  setUser(null);
819
864
  setError(new Error(validation.error ?? "Invalid token"));
820
- config?.onAuthFailure?.();
865
+ handleAuthFailure();
821
866
  return;
822
867
  }
823
868
  }
@@ -829,14 +874,14 @@ function FluidAuthProvider({
829
874
  setToken(null);
830
875
  setUser(null);
831
876
  setError(new Error("No authentication token found"));
832
- config?.onAuthFailure?.();
877
+ handleAuthFailure();
833
878
  }
834
879
  } catch (err) {
835
880
  const error2 = err instanceof Error ? err : new Error("Authentication error");
836
881
  setError(error2);
837
882
  setToken(null);
838
883
  setUser(null);
839
- config?.onAuthFailure?.();
884
+ handleAuthFailure();
840
885
  } finally {
841
886
  setIsLoading(false);
842
887
  }
@@ -2074,6 +2119,6 @@ var export_toDarkMode = themes_exports.toDarkMode;
2074
2119
  var export_toLightMode = themes_exports.toLightMode;
2075
2120
  var export_tokyoNight = themes_exports.tokyoNight;
2076
2121
 
2077
- export { ACTIVITY_SLUGS, AUTH_CONSTANTS, ApiError, AuthError, AuthLoading, export_BUILT_IN_THEMES as BUILT_IN_THEMES, export_CORE_COLOR_KEYS as CORE_COLOR_KEYS, CORE_PAGE_IDS, CURRENT_REP_QUERY_KEY, export_DEFAULT_CORE_COLORS as DEFAULT_CORE_COLORS, FluidAuthProvider, FluidProvider, FluidThemeProvider, PAGE_CATEGORIES, PERMISSIONS_QUERY_KEY, PROFILE_QUERY_KEY, PageTemplateProvider, PageTemplateRegistry, RequireAuth, STORAGE_KEYS, URL_PARAMS, USER_TYPES, export_catppuccinMocha as catppuccinMocha, export_clampChroma as clampChroma, cleanTokenFromUrl, clearTokens, createFluidClient, decodeToken, export_defaultTheme as defaultTheme, export_detectThemeMode as detectThemeMode, export_dracula as dracula, export_everforest as everforest, extractAllTokensFromUrl, extractCompanyTokenFromUrl, extractTokenFromUrl, export_generateColorSwatches as generateColorSwatches, export_generateDualTheme as generateDualTheme, export_generateSmartDualTheme as generateSmartDualTheme, export_generateTheme as generateTheme, export_generateThemeCssVars as generateThemeCssVars, getAvailablePageTemplates, getCorePageTemplates, getOptionalPageTemplates, getProperty, getStoredToken, getTokenExpiration, getTokenTimeRemaining, export_gruvbox as gruvbox, hasData, hasStoredToken, hasTokenInUrl, isActivitySlug, isApiError, isContactStatus, isErrorResult, isIdle, isLoading, isTokenExpired, isUserType, isValidToken, export_mod as mod, export_monokai as monokai, export_nord as nord, export_oklchString as oklchString, export_parseOklch as parseOklch, resolveNavigationPages, export_rosePine as rosePine, export_rotateHue as rotateHue, export_rotateSoft as rotateSoft, screenPropertySchemas, selectProperty, export_solarized as solarized, storeToken, export_toDarkMode as toDarkMode, export_toLightMode as toLightMode, export_tokyoNight as tokyoNight, useActivities, useCalendarEvents, useCatchUps, useContact, useContacts, useConversationMessages, useConversations, useCurrentRep, useFluidApi, useFluidAuth, useFluidAuthContext, useFluidContext, useFluidPermissions, useFluidProfile, useFluidTheme, useMySite, usePageTemplates, useResolvedPages, useThemeContext, useTodos, validateNavigationPages, validateToken };
2122
+ export { ACTIVITY_SLUGS, AUTH_CONSTANTS, ApiError, AuthError, AuthLoading, export_BUILT_IN_THEMES as BUILT_IN_THEMES, export_CORE_COLOR_KEYS as CORE_COLOR_KEYS, CORE_PAGE_IDS, CURRENT_REP_QUERY_KEY, DEFAULT_AUTH_URL, export_DEFAULT_CORE_COLORS as DEFAULT_CORE_COLORS, FluidAuthProvider, FluidProvider, FluidThemeProvider, PAGE_CATEGORIES, PERMISSIONS_QUERY_KEY, PROFILE_QUERY_KEY, PageTemplateProvider, PageTemplateRegistry, RequireAuth, STORAGE_KEYS, URL_PARAMS, USER_TYPES, export_catppuccinMocha as catppuccinMocha, export_clampChroma as clampChroma, cleanTokenFromUrl, clearTokens, createDefaultAuthRedirect, createFluidClient, decodeToken, export_defaultTheme as defaultTheme, export_detectThemeMode as detectThemeMode, export_dracula as dracula, export_everforest as everforest, extractAllTokensFromUrl, extractCompanyTokenFromUrl, extractTokenFromUrl, export_generateColorSwatches as generateColorSwatches, export_generateDualTheme as generateDualTheme, export_generateSmartDualTheme as generateSmartDualTheme, export_generateTheme as generateTheme, export_generateThemeCssVars as generateThemeCssVars, getAvailablePageTemplates, getCorePageTemplates, getOptionalPageTemplates, getProperty, getStoredToken, getTokenExpiration, getTokenTimeRemaining, export_gruvbox as gruvbox, hasData, hasStoredToken, hasTokenInUrl, isActivitySlug, isApiError, isContactStatus, isErrorResult, isIdle, isLoading, isTokenExpired, isUserType, isValidToken, export_mod as mod, export_monokai as monokai, export_nord as nord, export_oklchString as oklchString, export_parseOklch as parseOklch, resolveNavigationPages, export_rosePine as rosePine, export_rotateHue as rotateHue, export_rotateSoft as rotateSoft, screenPropertySchemas, selectProperty, export_solarized as solarized, storeToken, export_toDarkMode as toDarkMode, export_toLightMode as toLightMode, export_tokyoNight as tokyoNight, useActivities, useCalendarEvents, useCatchUps, useContact, useContacts, useConversationMessages, useConversations, useCurrentRep, useFluidApi, useFluidAuth, useFluidAuthContext, useFluidContext, useFluidPermissions, useFluidProfile, useFluidTheme, useMySite, usePageTemplates, useResolvedPages, useThemeContext, useTodos, validateNavigationPages, validateToken };
2078
2123
  //# sourceMappingURL=index.js.map
2079
2124
  //# sourceMappingURL=index.js.map