@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.cjs +54 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -8
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/index.d.cts +0 -2164
- package/dist/index.d.ts +0 -2164
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
|
|
155
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|