@oxyhq/services 5.19.0 → 5.20.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.
Files changed (43) hide show
  1. package/README.md +51 -42
  2. package/lib/commonjs/core/mixins/OxyServices.fedcm.js +46 -24
  3. package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -1
  4. package/lib/commonjs/ui/components/OxyProvider.js +106 -40
  5. package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
  6. package/lib/commonjs/ui/components/WebOxyProvider.js +9 -10
  7. package/lib/commonjs/ui/components/WebOxyProvider.js.map +1 -1
  8. package/lib/commonjs/ui/hooks/useAuth.js +21 -8
  9. package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
  10. package/lib/commonjs/ui/hooks/useWebSSO.js +21 -2
  11. package/lib/commonjs/ui/hooks/useWebSSO.js.map +1 -1
  12. package/lib/module/core/mixins/OxyServices.fedcm.js +46 -24
  13. package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
  14. package/lib/module/ui/components/OxyProvider.js +106 -39
  15. package/lib/module/ui/components/OxyProvider.js.map +1 -1
  16. package/lib/module/ui/components/WebOxyProvider.js +9 -10
  17. package/lib/module/ui/components/WebOxyProvider.js.map +1 -1
  18. package/lib/module/ui/hooks/useAuth.js +21 -8
  19. package/lib/module/ui/hooks/useAuth.js.map +1 -1
  20. package/lib/module/ui/hooks/useWebSSO.js +21 -2
  21. package/lib/module/ui/hooks/useWebSSO.js.map +1 -1
  22. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts +10 -1
  23. package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  24. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts +26 -3
  25. package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
  26. package/lib/typescript/commonjs/ui/components/WebOxyProvider.d.ts +9 -10
  27. package/lib/typescript/commonjs/ui/components/WebOxyProvider.d.ts.map +1 -1
  28. package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
  29. package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts.map +1 -1
  30. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts +10 -1
  31. package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
  32. package/lib/typescript/module/ui/components/OxyProvider.d.ts +26 -3
  33. package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
  34. package/lib/typescript/module/ui/components/WebOxyProvider.d.ts +9 -10
  35. package/lib/typescript/module/ui/components/WebOxyProvider.d.ts.map +1 -1
  36. package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
  37. package/lib/typescript/module/ui/hooks/useWebSSO.d.ts.map +1 -1
  38. package/package.json +1 -1
  39. package/src/core/mixins/OxyServices.fedcm.ts +47 -23
  40. package/src/ui/components/OxyProvider.tsx +112 -47
  41. package/src/ui/components/WebOxyProvider.tsx +9 -10
  42. package/src/ui/hooks/useAuth.ts +25 -8
  43. package/src/ui/hooks/useWebSSO.ts +21 -2
@@ -30,6 +30,16 @@ function isWebBrowser() {
30
30
  return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof document.documentElement !== 'undefined';
31
31
  }
32
32
 
33
+ /**
34
+ * Check if we're on the identity provider domain (where FedCM would authenticate against itself)
35
+ * Only auth.oxy.so is the IdP - accounts.oxy.so is a client app like any other
36
+ */
37
+ function isIdentityProvider() {
38
+ if (!isWebBrowser()) return false;
39
+ const hostname = window.location.hostname;
40
+ return hostname === 'auth.oxy.so';
41
+ }
42
+
33
43
  /**
34
44
  * Hook for automatic cross-domain web SSO
35
45
  *
@@ -63,6 +73,12 @@ function useWebSSO({
63
73
  return null;
64
74
  }
65
75
 
76
+ // Don't use FedCM on the auth domain itself - it would authenticate against itself
77
+ if (isIdentityProvider()) {
78
+ onSSOUnavailable?.();
79
+ return null;
80
+ }
81
+
66
82
  // FedCM is the only reliable cross-domain SSO mechanism
67
83
  // Third-party cookies are deprecated and unreliable
68
84
  if (!fedCMSupported) {
@@ -92,9 +108,12 @@ function useWebSSO({
92
108
  }
93
109
  }, [oxyServices, onSessionFound, onSSOUnavailable, onError, fedCMSupported]);
94
110
 
95
- // Auto-check SSO on mount (web only, FedCM only)
111
+ // Auto-check SSO on mount (web only, FedCM only, not on auth domain)
96
112
  (0, _react.useEffect)(() => {
97
- if (!enabled || !isWebBrowser() || hasCheckedRef.current) {
113
+ if (!enabled || !isWebBrowser() || hasCheckedRef.current || isIdentityProvider()) {
114
+ if (isIdentityProvider()) {
115
+ onSSOUnavailable?.();
116
+ }
98
117
  return;
99
118
  }
100
119
  hasCheckedRef.current = true;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","require","isWebBrowser","window","document","documentElement","useWebSSO","oxyServices","onSessionFound","onSSOUnavailable","onError","enabled","isCheckingRef","useRef","hasCheckedRef","fedCMSupported","isFedCMSupported","checkSSO","useCallback","current","session","silentSignInWithFedCM","error","Error","String","useEffect","isChecking"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":";;;;;;;AAiBA,IAAAA,MAAA,GAAAC,OAAA;AAjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAuBA;AACA;AACA;AACA,SAASC,YAAYA,CAAA,EAAY;EAC/B,OAAO,OAAOC,MAAM,KAAK,WAAW,IAC7B,OAAOC,QAAQ,KAAK,WAAW,IAC/B,OAAOA,QAAQ,CAACC,eAAe,KAAK,WAAW;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASC,SAASA,CAAC;EACxBC,WAAW;EACXC,cAAc;EACdC,gBAAgB;EAChBC,OAAO;EACPC,OAAO,GAAG;AACM,CAAC,EAAmB;EACpC,MAAMC,aAAa,GAAG,IAAAC,aAAM,EAAC,KAAK,CAAC;EACnC,MAAMC,aAAa,GAAG,IAAAD,aAAM,EAAC,KAAK,CAAC;;EAEnC;EACA,MAAME,cAAc,GAAGb,YAAY,CAAC,CAAC,IAAKK,WAAW,CAASS,gBAAgB,GAAG,CAAC;EAElF,MAAMC,QAAQ,GAAG,IAAAC,kBAAW,EAAC,YAAkD;IAC7E,IAAI,CAAChB,YAAY,CAAC,CAAC,IAAIU,aAAa,CAACO,OAAO,EAAE;MAC5C,OAAO,IAAI;IACb;;IAEA;IACA;IACA,IAAI,CAACJ,cAAc,EAAE;MACnBN,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb;IAEAG,aAAa,CAACO,OAAO,GAAG,IAAI;IAE5B,IAAI;MACF;MACA;MACA,MAAMC,OAAO,GAAG,MAAOb,WAAW,CAASc,qBAAqB,GAAG,CAAC;MAEpE,IAAID,OAAO,EAAE;QACX,MAAMZ,cAAc,CAACY,OAAO,CAAC;QAC7B,OAAOA,OAAO;MAChB;;MAEA;MACAX,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb,CAAC,CAAC,OAAOa,KAAK,EAAE;MACd;MACAb,gBAAgB,GAAG,CAAC;MACpBC,OAAO,GAAGY,KAAK,YAAYC,KAAK,GAAGD,KAAK,GAAG,IAAIC,KAAK,CAACC,MAAM,CAACF,KAAK,CAAC,CAAC,CAAC;MACpE,OAAO,IAAI;IACb,CAAC,SAAS;MACRV,aAAa,CAACO,OAAO,GAAG,KAAK;IAC/B;EACF,CAAC,EAAE,CAACZ,WAAW,EAAEC,cAAc,EAAEC,gBAAgB,EAAEC,OAAO,EAAEK,cAAc,CAAC,CAAC;;EAE5E;EACA,IAAAU,gBAAS,EAAC,MAAM;IACd,IAAI,CAACd,OAAO,IAAI,CAACT,YAAY,CAAC,CAAC,IAAIY,aAAa,CAACK,OAAO,EAAE;MACxD;IACF;IAEAL,aAAa,CAACK,OAAO,GAAG,IAAI;IAE5B,IAAIJ,cAAc,EAAE;MAClBE,QAAQ,CAAC,CAAC;IACZ,CAAC,MAAM;MACL;MACAR,gBAAgB,GAAG,CAAC;IACtB;EACF,CAAC,EAAE,CAACE,OAAO,EAAEM,QAAQ,EAAEF,cAAc,EAAEN,gBAAgB,CAAC,CAAC;EAEzD,OAAO;IACLQ,QAAQ;IACRS,UAAU,EAAEd,aAAa,CAACO,OAAO;IACjCH,gBAAgB,EAAED;EACpB,CAAC;AACH","ignoreList":[]}
1
+ {"version":3,"names":["_react","require","isWebBrowser","window","document","documentElement","isIdentityProvider","hostname","location","useWebSSO","oxyServices","onSessionFound","onSSOUnavailable","onError","enabled","isCheckingRef","useRef","hasCheckedRef","fedCMSupported","isFedCMSupported","checkSSO","useCallback","current","session","silentSignInWithFedCM","error","Error","String","useEffect","isChecking"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":"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","ignoreList":[]}
@@ -1,6 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  import { OxyAuthenticationError } from "../OxyServices.errors.js";
4
+ // Global lock to prevent concurrent FedCM requests
5
+ // FedCM only allows one navigator.credentials.get request at a time
6
+ let fedCMRequestInProgress = false;
7
+ let fedCMRequestPromise = null;
8
+
4
9
  /**
5
10
  * Federated Credential Management (FedCM) Authentication Mixin
6
11
  *
@@ -169,36 +174,53 @@ export function OxyServicesFedCMMixin(Base) {
169
174
  /**
170
175
  * Request identity credential from browser using FedCM API
171
176
  *
177
+ * Uses a global lock to prevent concurrent requests, as FedCM only
178
+ * allows one navigator.credentials.get request at a time.
179
+ *
172
180
  * @private
173
181
  */
174
182
  async requestIdentityCredential(options) {
175
- const controller = new AbortController();
176
- const timeout = setTimeout(() => controller.abort(), this.constructor.FEDCM_TIMEOUT);
177
- try {
178
- // Type assertion needed as FedCM types may not be in all TypeScript versions
179
- const credential = await navigator.credentials.get({
180
- identity: {
181
- providers: [{
182
- configURL: options.configURL,
183
- clientId: options.clientId,
184
- nonce: options.nonce,
185
- ...(options.context && {
186
- loginHint: options.context
187
- })
188
- }]
189
- },
190
- mediation: options.mediation || 'optional',
191
- signal: controller.signal
192
- });
193
- if (!credential || credential.type !== 'identity') {
183
+ // If a request is already in progress, wait for it instead of starting a new one
184
+ if (fedCMRequestInProgress && fedCMRequestPromise) {
185
+ try {
186
+ return await fedCMRequestPromise;
187
+ } catch {
194
188
  return null;
195
189
  }
196
- return {
197
- token: credential.token
198
- };
199
- } finally {
200
- clearTimeout(timeout);
201
190
  }
191
+ fedCMRequestInProgress = true;
192
+ const controller = new AbortController();
193
+ const timeout = setTimeout(() => controller.abort(), this.constructor.FEDCM_TIMEOUT);
194
+ fedCMRequestPromise = (async () => {
195
+ try {
196
+ // Type assertion needed as FedCM types may not be in all TypeScript versions
197
+ const credential = await navigator.credentials.get({
198
+ identity: {
199
+ providers: [{
200
+ configURL: options.configURL,
201
+ clientId: options.clientId,
202
+ nonce: options.nonce,
203
+ ...(options.context && {
204
+ loginHint: options.context
205
+ })
206
+ }]
207
+ },
208
+ mediation: options.mediation || 'optional',
209
+ signal: controller.signal
210
+ });
211
+ if (!credential || credential.type !== 'identity') {
212
+ return null;
213
+ }
214
+ return {
215
+ token: credential.token
216
+ };
217
+ } finally {
218
+ clearTimeout(timeout);
219
+ fedCMRequestInProgress = false;
220
+ fedCMRequestPromise = null;
221
+ }
222
+ })();
223
+ return fedCMRequestPromise;
202
224
  }
203
225
 
204
226
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["OxyAuthenticationError","OxyServicesFedCMMixin","Base","constructor","args","DEFAULT_CONFIG_URL","FEDCM_TIMEOUT","isFedCMSupported","window","navigator","signInWithFedCM","options","nonce","generateNonce","clientId","getClientId","credential","requestIdentityCredential","configURL","context","token","session","exchangeIdTokenForSession","accessToken","httpService","setTokens","error","name","silentSignInWithFedCM","mediation","controller","AbortController","timeout","setTimeout","abort","credentials","get","identity","providers","loginHint","signal","type","clearTimeout","idToken","makeRequest","id_token","cache","revokeFedCMCredential","IdentityCredential","logout","getFedCMConfig","enabled","crypto","randomUUID","Date","now","Math","random","toString","substring","location","origin","FedCMMixin"],"sourceRoot":"../../../../src","sources":["core/mixins/OxyServices.fedcm.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["OxyAuthenticationError","fedCMRequestInProgress","fedCMRequestPromise","OxyServicesFedCMMixin","Base","constructor","args","DEFAULT_CONFIG_URL","FEDCM_TIMEOUT","isFedCMSupported","window","navigator","signInWithFedCM","options","nonce","generateNonce","clientId","getClientId","credential","requestIdentityCredential","configURL","context","token","session","exchangeIdTokenForSession","accessToken","httpService","setTokens","error","name","silentSignInWithFedCM","mediation","controller","AbortController","timeout","setTimeout","abort","credentials","get","identity","providers","loginHint","signal","type","clearTimeout","idToken","makeRequest","id_token","cache","revokeFedCMCredential","IdentityCredential","logout","getFedCMConfig","enabled","crypto","randomUUID","Date","now","Math","random","toString","substring","location","origin","FedCMMixin"],"sourceRoot":"../../../../src","sources":["core/mixins/OxyServices.fedcm.ts"],"mappings":"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","ignoreList":[]}
@@ -1,14 +1,12 @@
1
1
  "use strict";
2
2
 
3
3
  import { useEffect, useRef, useState } from 'react';
4
- import { AppState } from 'react-native';
4
+ import { AppState, Platform } from 'react-native';
5
5
  import { GestureHandlerRootView } from 'react-native-gesture-handler';
6
6
  import { SafeAreaProvider } from 'react-native-safe-area-context';
7
- import { KeyboardProvider } from 'react-native-keyboard-controller';
8
7
  import { OxyContextProvider } from "../context/OxyContext.js";
9
8
  import { QueryClientProvider, focusManager, onlineManager } from '@tanstack/react-query';
10
9
  import { setupFonts } from "./FontLoader.js";
11
- import BottomSheetRouter from "./BottomSheetRouter.js";
12
10
  import { Toaster } from "../../lib/sonner.js";
13
11
  import { createQueryClient } from "../hooks/queryClient.js";
14
12
  import { createPlatformStorage } from "../utils/storageHelpers.js";
@@ -17,11 +15,52 @@ import { createPlatformStorage } from "../utils/storageHelpers.js";
17
15
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
18
16
  setupFonts();
19
17
 
18
+ // Detect if running on web
19
+ const isWeb = Platform.OS === 'web';
20
+
21
+ // Conditionally import native-only components
22
+ let KeyboardProvider = ({
23
+ children
24
+ }) => children;
25
+ let BottomSheetRouter = () => null;
26
+ if (!isWeb) {
27
+ try {
28
+ // Only import on native platforms
29
+ KeyboardProvider = require('react-native-keyboard-controller').KeyboardProvider;
30
+ BottomSheetRouter = require('./BottomSheetRouter').default;
31
+ } catch {
32
+ // Fallback if imports fail
33
+ }
34
+ }
35
+
20
36
  /**
21
- * OxyProvider component
37
+ * OxyProvider - Universal provider for Expo apps (native + web)
38
+ *
39
+ * Zero-config authentication and session management:
40
+ * - Native (iOS/Android): Keychain-based identity, bottom sheet auth UI
41
+ * - Web: FedCM cross-domain SSO, popup fallback
42
+ *
43
+ * Usage:
44
+ * ```tsx
45
+ * import { OxyProvider, useAuth } from '@oxyhq/services';
22
46
  *
23
- * Provides the authentication/session context used across the app.
24
- * UI composition (e.g. OxyRouter inside a bottom sheet) can be added externally.
47
+ * function App() {
48
+ * return (
49
+ * <OxyProvider baseURL="https://api.oxy.so">
50
+ * <YourApp />
51
+ * </OxyProvider>
52
+ * );
53
+ * }
54
+ *
55
+ * function MyComponent() {
56
+ * const { isAuthenticated, user, signIn, signOut } = useAuth();
57
+ *
58
+ * if (!isAuthenticated) {
59
+ * return <OxySignInButton />;
60
+ * }
61
+ * return <Text>Welcome, {user?.username}!</Text>;
62
+ * }
63
+ * ```
25
64
  */
26
65
  const OxyProvider = ({
27
66
  oxyServices,
@@ -69,14 +108,26 @@ const OxyProvider = ({
69
108
  };
70
109
  }, [providedQueryClient]);
71
110
 
72
- // Hook React Query focus manager into React Native AppState
111
+ // Hook React Query focus manager into app state (native) or visibility (web)
73
112
  useEffect(() => {
74
- const subscription = AppState.addEventListener('change', state => {
75
- focusManager.setFocused(state === 'active');
76
- });
77
- return () => {
78
- subscription.remove();
79
- };
113
+ if (isWeb) {
114
+ // Web: use document visibility
115
+ const handleVisibilityChange = () => {
116
+ focusManager.setFocused(document.visibilityState === 'visible');
117
+ };
118
+ document.addEventListener('visibilitychange', handleVisibilityChange);
119
+ return () => {
120
+ document.removeEventListener('visibilitychange', handleVisibilityChange);
121
+ };
122
+ } else {
123
+ // Native: use AppState
124
+ const subscription = AppState.addEventListener('change', state => {
125
+ focusManager.setFocused(state === 'active');
126
+ });
127
+ return () => {
128
+ subscription.remove();
129
+ };
130
+ }
80
131
  }, []);
81
132
 
82
133
  // Setup network status monitoring for offline detection
@@ -84,8 +135,19 @@ const OxyProvider = ({
84
135
  let cleanup;
85
136
  const setupNetworkMonitoring = async () => {
86
137
  try {
87
- // For React Native, try to use NetInfo
88
- if (typeof window === 'undefined' || typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {
138
+ if (isWeb) {
139
+ // Web: use navigator.onLine
140
+ onlineManager.setOnline(navigator.onLine);
141
+ const handleOnline = () => onlineManager.setOnline(true);
142
+ const handleOffline = () => onlineManager.setOnline(false);
143
+ window.addEventListener('online', handleOnline);
144
+ window.addEventListener('offline', handleOffline);
145
+ cleanup = () => {
146
+ window.removeEventListener('online', handleOnline);
147
+ window.removeEventListener('offline', handleOffline);
148
+ };
149
+ } else {
150
+ // Native: try to use NetInfo
89
151
  try {
90
152
  const NetInfo = await import('@react-native-community/netinfo');
91
153
  const state = await NetInfo.default.fetch();
@@ -98,17 +160,6 @@ const OxyProvider = ({
98
160
  // NetInfo not available, default to online
99
161
  onlineManager.setOnline(true);
100
162
  }
101
- } else {
102
- // For web, use navigator.onLine
103
- onlineManager.setOnline(navigator.onLine);
104
- const handleOnline = () => onlineManager.setOnline(true);
105
- const handleOffline = () => onlineManager.setOnline(false);
106
- window.addEventListener('online', handleOnline);
107
- window.addEventListener('offline', handleOffline);
108
- cleanup = () => {
109
- window.removeEventListener('online', handleOnline);
110
- window.removeEventListener('offline', handleOffline);
111
- };
112
163
  }
113
164
  } catch (error) {
114
165
  // Default to online if detection fails
@@ -123,27 +174,43 @@ const OxyProvider = ({
123
174
 
124
175
  // Ensure we have a valid QueryClient
125
176
  if (!queryClient) {
126
- // Return loading state or fallback
127
177
  return null;
128
178
  }
179
+
180
+ // Core content that works on all platforms
181
+ const coreContent = /*#__PURE__*/_jsx(QueryClientProvider, {
182
+ client: queryClient,
183
+ children: /*#__PURE__*/_jsxs(OxyContextProvider, {
184
+ oxyServices: oxyServices,
185
+ baseURL: baseURL,
186
+ authWebUrl: authWebUrl,
187
+ authRedirectUri: authRedirectUri,
188
+ storageKeyPrefix: storageKeyPrefix,
189
+ onAuthStateChange: onAuthStateChange,
190
+ children: [children, !isWeb && /*#__PURE__*/_jsx(BottomSheetRouter, {}), /*#__PURE__*/_jsx(Toaster, {})]
191
+ })
192
+ });
193
+
194
+ // On web, minimal wrappers (GestureHandler and SafeArea work via react-native-web)
195
+ if (isWeb) {
196
+ return /*#__PURE__*/_jsx(SafeAreaProvider, {
197
+ children: /*#__PURE__*/_jsx(GestureHandlerRootView, {
198
+ style: {
199
+ flex: 1
200
+ },
201
+ children: coreContent
202
+ })
203
+ });
204
+ }
205
+
206
+ // On native, full wrappers including KeyboardProvider
129
207
  return /*#__PURE__*/_jsx(SafeAreaProvider, {
130
208
  children: /*#__PURE__*/_jsx(GestureHandlerRootView, {
131
209
  style: {
132
210
  flex: 1
133
211
  },
134
212
  children: /*#__PURE__*/_jsx(KeyboardProvider, {
135
- children: queryClient && /*#__PURE__*/_jsx(QueryClientProvider, {
136
- client: queryClient,
137
- children: /*#__PURE__*/_jsxs(OxyContextProvider, {
138
- oxyServices: oxyServices,
139
- baseURL: baseURL,
140
- authWebUrl: authWebUrl,
141
- authRedirectUri: authRedirectUri,
142
- storageKeyPrefix: storageKeyPrefix,
143
- onAuthStateChange: onAuthStateChange,
144
- children: [children, /*#__PURE__*/_jsx(BottomSheetRouter, {}), /*#__PURE__*/_jsx(Toaster, {})]
145
- })
146
- })
213
+ children: coreContent
147
214
  })
148
215
  })
149
216
  });
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useState","AppState","GestureHandlerRootView","SafeAreaProvider","KeyboardProvider","OxyContextProvider","QueryClientProvider","focusManager","onlineManager","setupFonts","BottomSheetRouter","Toaster","createQueryClient","createPlatformStorage","jsx","_jsx","jsxs","_jsxs","OxyProvider","oxyServices","children","onAuthStateChange","storageKeyPrefix","baseURL","authWebUrl","authRedirectUri","queryClient","providedQueryClient","storageRef","queryClientRef","setQueryClient","current","mounted","then","storage","client","catch","error","__DEV__","console","warn","subscription","addEventListener","state","setFocused","remove","cleanup","setupNetworkMonitoring","window","navigator","product","NetInfo","default","fetch","setOnline","isConnected","unsubscribe","onLine","handleOnline","handleOffline","removeEventListener","style","flex"],"sourceRoot":"../../../../src","sources":["ui/components/OxyProvider.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useState","AppState","Platform","GestureHandlerRootView","SafeAreaProvider","OxyContextProvider","QueryClientProvider","focusManager","onlineManager","setupFonts","Toaster","createQueryClient","createPlatformStorage","jsx","_jsx","jsxs","_jsxs","isWeb","OS","KeyboardProvider","children","BottomSheetRouter","require","default","OxyProvider","oxyServices","onAuthStateChange","storageKeyPrefix","baseURL","authWebUrl","authRedirectUri","queryClient","providedQueryClient","storageRef","queryClientRef","setQueryClient","current","mounted","then","storage","client","catch","error","__DEV__","console","warn","handleVisibilityChange","setFocused","document","visibilityState","addEventListener","removeEventListener","subscription","state","remove","cleanup","setupNetworkMonitoring","setOnline","navigator","onLine","handleOnline","handleOffline","window","NetInfo","fetch","isConnected","unsubscribe","coreContent","style","flex"],"sourceRoot":"../../../../src","sources":["ui/components/OxyProvider.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,18 +1,20 @@
1
1
  "use strict";
2
2
 
3
3
  /**
4
- * WebOxyProvider - OxyProvider for web apps (Next.js, React)
4
+ * WebOxyProvider - Lightweight provider for pure React/Next.js apps
5
5
  *
6
- * This provider is specifically for web environments and doesn't include
7
- * React Native-specific dependencies. It provides:
6
+ * Use this provider for web apps that DON'T use Expo/React Native.
7
+ * For Expo apps (native + web), use `OxyProvider` instead - it works on all platforms.
8
+ *
9
+ * Features:
8
10
  * - Automatic cross-domain SSO via FedCM (Chrome 108+, Safari 16.4+, Edge 108+)
11
+ * - No React Native dependencies
9
12
  * - Session management
10
13
  * - All useOxy/useAuth functionality
11
14
  *
12
- * Zero-config: Just wrap your app and SSO works automatically across domains.
13
- *
14
15
  * Usage:
15
16
  * ```tsx
17
+ * // For pure React/Next.js apps (no Expo):
16
18
  * import { WebOxyProvider, useAuth } from '@oxyhq/services';
17
19
  *
18
20
  * function App() {
@@ -23,11 +25,8 @@
23
25
  * );
24
26
  * }
25
27
  *
26
- * function LoginButton() {
27
- * const { isAuthenticated, signIn, user } = useAuth();
28
- * if (isAuthenticated) return <span>Welcome, {user?.username}!</span>;
29
- * return <button onClick={() => signIn()}>Sign In</button>;
30
- * }
28
+ * // For Expo apps (native + web), use OxyProvider instead:
29
+ * import { OxyProvider, useAuth } from '@oxyhq/services';
31
30
  * ```
32
31
  */
33
32
 
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useState","OxyContextProvider","QueryClientProvider","createQueryClient","createPlatformStorage","jsx","_jsx","WebOxyProvider","children","baseURL","authWebUrl","onAuthStateChange","storageKeyPrefix","queryClient","providedQueryClient","storageRef","queryClientRef","setQueryClient","current","mounted","then","storage","client","catch"],"sourceRoot":"../../../../src","sources":["ui/components/WebOxyProvider.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAiC,OAAO;AAC5E,SAASC,kBAAkB,QAAQ,0BAAuB;AAC1D,SAASC,mBAAmB,QAAQ,uBAAuB;AAC3D,SAASC,iBAAiB,QAAQ,yBAAsB;AACxD,SAASC,qBAAqB,QAA+B,4BAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAWvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAuC,GAAGA,CAAC;EAC/CC,QAAQ;EACRC,OAAO;EACPC,UAAU;EACVC,iBAAiB;EACjBC,gBAAgB;EAChBC,WAAW,EAAEC;AACf,CAAC,KAAK;EACJ,MAAMC,UAAU,GAAGhB,MAAM,CAA0B,IAAI,CAAC;EACxD,MAAMiB,cAAc,GAAGjB,MAAM,CAA8C,IAAI,CAAC;EAChF,MAAM,CAACc,WAAW,EAAEI,cAAc,CAAC,GAAGjB,QAAQ,CAA8C,IAAI,CAAC;EAEjGF,SAAS,CAAC,MAAM;IACd,IAAIgB,mBAAmB,EAAE;MACvBE,cAAc,CAACE,OAAO,GAAGJ,mBAAmB;MAC5CG,cAAc,CAACH,mBAAmB,CAAC;MACnC;IACF;IAEA,IAAIK,OAAO,GAAG,IAAI;IAClBf,qBAAqB,CAAC,CAAC,CACpBgB,IAAI,CAAEC,OAAO,IAAK;MACjB,IAAIF,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtCH,UAAU,CAACG,OAAO,GAAGG,OAAO;QAC5B,MAAMC,MAAM,GAAGnB,iBAAiB,CAACkB,OAAO,CAAC;QACzCL,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM;MACX,IAAIJ,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtC,MAAMI,MAAM,GAAGnB,iBAAiB,CAAC,IAAI,CAAC;QACtCa,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC;IAEJ,OAAO,MAAM;MACXH,OAAO,GAAG,KAAK;IACjB,CAAC;EACH,CAAC,EAAE,CAACL,mBAAmB,CAAC,CAAC;;EAEzB;EACA,IAAI,CAACD,WAAW,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,oBACEP,IAAA,CAACJ,mBAAmB;IAACoB,MAAM,EAAET,WAAY;IAAAL,QAAA,eACvCF,IAAA,CAACL,kBAAkB;MACjBQ,OAAO,EAAEA,OAAQ;MACjBC,UAAU,EAAEA,UAAW;MACvBE,gBAAgB,EAAEA,gBAAiB;MACnCD,iBAAiB,EAAEA,iBAAkB;MAAAH,QAAA,EAEpCA;IAAQ,CACS;EAAC,CACF,CAAC;AAE1B,CAAC;AAED,eAAeD,cAAc","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useState","OxyContextProvider","QueryClientProvider","createQueryClient","createPlatformStorage","jsx","_jsx","WebOxyProvider","children","baseURL","authWebUrl","onAuthStateChange","storageKeyPrefix","queryClient","providedQueryClient","storageRef","queryClientRef","setQueryClient","current","mounted","then","storage","client","catch"],"sourceRoot":"../../../../src","sources":["ui/components/WebOxyProvider.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAiC,OAAO;AAC5E,SAASC,kBAAkB,QAAQ,0BAAuB;AAC1D,SAASC,mBAAmB,QAAQ,uBAAuB;AAC3D,SAASC,iBAAiB,QAAQ,yBAAsB;AACxD,SAASC,qBAAqB,QAA+B,4BAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAWvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,cAAuC,GAAGA,CAAC;EAC/CC,QAAQ;EACRC,OAAO;EACPC,UAAU;EACVC,iBAAiB;EACjBC,gBAAgB;EAChBC,WAAW,EAAEC;AACf,CAAC,KAAK;EACJ,MAAMC,UAAU,GAAGhB,MAAM,CAA0B,IAAI,CAAC;EACxD,MAAMiB,cAAc,GAAGjB,MAAM,CAA8C,IAAI,CAAC;EAChF,MAAM,CAACc,WAAW,EAAEI,cAAc,CAAC,GAAGjB,QAAQ,CAA8C,IAAI,CAAC;EAEjGF,SAAS,CAAC,MAAM;IACd,IAAIgB,mBAAmB,EAAE;MACvBE,cAAc,CAACE,OAAO,GAAGJ,mBAAmB;MAC5CG,cAAc,CAACH,mBAAmB,CAAC;MACnC;IACF;IAEA,IAAIK,OAAO,GAAG,IAAI;IAClBf,qBAAqB,CAAC,CAAC,CACpBgB,IAAI,CAAEC,OAAO,IAAK;MACjB,IAAIF,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtCH,UAAU,CAACG,OAAO,GAAGG,OAAO;QAC5B,MAAMC,MAAM,GAAGnB,iBAAiB,CAACkB,OAAO,CAAC;QACzCL,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC,CACDC,KAAK,CAAC,MAAM;MACX,IAAIJ,OAAO,IAAI,CAACH,cAAc,CAACE,OAAO,EAAE;QACtC,MAAMI,MAAM,GAAGnB,iBAAiB,CAAC,IAAI,CAAC;QACtCa,cAAc,CAACE,OAAO,GAAGI,MAAM;QAC/BL,cAAc,CAACK,MAAM,CAAC;MACxB;IACF,CAAC,CAAC;IAEJ,OAAO,MAAM;MACXH,OAAO,GAAG,KAAK;IACjB,CAAC;EACH,CAAC,EAAE,CAACL,mBAAmB,CAAC,CAAC;;EAEzB;EACA,IAAI,CAACD,WAAW,EAAE;IAChB,OAAO,IAAI;EACb;EAEA,oBACEP,IAAA,CAACJ,mBAAmB;IAACoB,MAAM,EAAET,WAAY;IAAAL,QAAA,eACvCF,IAAA,CAACL,kBAAkB;MACjBQ,OAAO,EAAEA,OAAQ;MACjBC,UAAU,EAAEA,UAAW;MACvBE,gBAAgB,EAAEA,gBAAiB;MACnCD,iBAAiB,EAAEA,iBAAkB;MAAAH,QAAA,EAEpCA;IAAQ,CACS;EAAC,CACF,CAAC;AAE1B,CAAC;AAED,eAAeD,cAAc","ignoreList":[]}
@@ -54,8 +54,12 @@ export function useAuth() {
54
54
  showBottomSheet
55
55
  } = useOxy();
56
56
  const signIn = useCallback(async publicKey => {
57
- // Web: Use popup-based authentication
58
- if (isWebBrowser() && !publicKey) {
57
+ // Check if we're on the identity provider itself (auth.oxy.so)
58
+ // Only auth.oxy.so has local login forms - accounts.oxy.so is a client app
59
+ const isIdentityProvider = isWebBrowser() && window.location.hostname === 'auth.oxy.so';
60
+
61
+ // Web (not on IdP): Use FedCM or popup-based authentication
62
+ if (isWebBrowser() && !publicKey && !isIdentityProvider) {
59
63
  try {
60
64
  // Try FedCM first (instant if user already signed in)
61
65
  if (oxyServices.isFedCMSupported?.()) {
@@ -92,13 +96,22 @@ export function useAuth() {
92
96
  }
93
97
  }
94
98
 
95
- // No identity - show auth UI (native bottom sheet)
96
- showBottomSheet?.('OxyAuth');
99
+ // No identity - show auth UI
100
+ if (showBottomSheet) {
101
+ showBottomSheet('OxyAuth');
102
+ // Return a promise that resolves when auth completes
103
+ return new Promise((_, reject) => {
104
+ reject(new Error('Please complete sign-in in the auth sheet'));
105
+ });
106
+ }
97
107
 
98
- // Return a promise that resolves when auth completes
99
- return new Promise((_, reject) => {
100
- reject(new Error('Please complete sign-in in the auth sheet'));
101
- });
108
+ // Web fallback: navigate to login page on auth domain
109
+ if (isWebBrowser()) {
110
+ const loginUrl = window.location.hostname.includes('oxy.so') ? '/login' : 'https://accounts.oxy.so/login';
111
+ window.location.href = loginUrl;
112
+ return new Promise(() => {}); // Never resolves, page will redirect
113
+ }
114
+ throw new Error('No authentication method available');
102
115
  }, [oxySignIn, hasIdentity, getPublicKey, showBottomSheet, oxyServices]);
103
116
  const signOut = useCallback(async () => {
104
117
  await logout();
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useOxy","isWebBrowser","useAuth","user","isAuthenticated","isLoading","isTokenReady","error","signIn","oxySignIn","logout","logoutAll","refreshSessions","oxyServices","hasIdentity","getPublicKey","showBottomSheet","publicKey","isFedCMSupported","fedcmSession","signInWithFedCM","popupSession","signInWithPopup","Error","message","includes","hasExisting","existingKey","Promise","_","reject","signOut","signOutAll","refresh","isReady"],"sourceRoot":"../../../../src","sources":["ui/hooks/useAuth.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useOxy","isWebBrowser","useAuth","user","isAuthenticated","isLoading","isTokenReady","error","signIn","oxySignIn","logout","logoutAll","refreshSessions","oxyServices","hasIdentity","getPublicKey","showBottomSheet","publicKey","isIdentityProvider","window","location","hostname","isFedCMSupported","fedcmSession","signInWithFedCM","popupSession","signInWithPopup","Error","message","includes","hasExisting","existingKey","Promise","_","reject","loginUrl","href","signOut","signOutAll","refresh","isReady"],"sourceRoot":"../../../../src","sources":["ui/hooks/useAuth.ts"],"mappings":"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","ignoreList":[]}
@@ -25,6 +25,16 @@ function isWebBrowser() {
25
25
  return typeof window !== 'undefined' && typeof document !== 'undefined' && typeof document.documentElement !== 'undefined';
26
26
  }
27
27
 
28
+ /**
29
+ * Check if we're on the identity provider domain (where FedCM would authenticate against itself)
30
+ * Only auth.oxy.so is the IdP - accounts.oxy.so is a client app like any other
31
+ */
32
+ function isIdentityProvider() {
33
+ if (!isWebBrowser()) return false;
34
+ const hostname = window.location.hostname;
35
+ return hostname === 'auth.oxy.so';
36
+ }
37
+
28
38
  /**
29
39
  * Hook for automatic cross-domain web SSO
30
40
  *
@@ -58,6 +68,12 @@ export function useWebSSO({
58
68
  return null;
59
69
  }
60
70
 
71
+ // Don't use FedCM on the auth domain itself - it would authenticate against itself
72
+ if (isIdentityProvider()) {
73
+ onSSOUnavailable?.();
74
+ return null;
75
+ }
76
+
61
77
  // FedCM is the only reliable cross-domain SSO mechanism
62
78
  // Third-party cookies are deprecated and unreliable
63
79
  if (!fedCMSupported) {
@@ -87,9 +103,12 @@ export function useWebSSO({
87
103
  }
88
104
  }, [oxyServices, onSessionFound, onSSOUnavailable, onError, fedCMSupported]);
89
105
 
90
- // Auto-check SSO on mount (web only, FedCM only)
106
+ // Auto-check SSO on mount (web only, FedCM only, not on auth domain)
91
107
  useEffect(() => {
92
- if (!enabled || !isWebBrowser() || hasCheckedRef.current) {
108
+ if (!enabled || !isWebBrowser() || hasCheckedRef.current || isIdentityProvider()) {
109
+ if (isIdentityProvider()) {
110
+ onSSOUnavailable?.();
111
+ }
93
112
  return;
94
113
  }
95
114
  hasCheckedRef.current = true;
@@ -1 +1 @@
1
- {"version":3,"names":["useEffect","useRef","useCallback","isWebBrowser","window","document","documentElement","useWebSSO","oxyServices","onSessionFound","onSSOUnavailable","onError","enabled","isCheckingRef","hasCheckedRef","fedCMSupported","isFedCMSupported","checkSSO","current","session","silentSignInWithFedCM","error","Error","String","isChecking"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,WAAW,QAAQ,OAAO;AAqBtD;AACA;AACA;AACA,SAASC,YAAYA,CAAA,EAAY;EAC/B,OAAO,OAAOC,MAAM,KAAK,WAAW,IAC7B,OAAOC,QAAQ,KAAK,WAAW,IAC/B,OAAOA,QAAQ,CAACC,eAAe,KAAK,WAAW;AACxD;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CAAC;EACxBC,WAAW;EACXC,cAAc;EACdC,gBAAgB;EAChBC,OAAO;EACPC,OAAO,GAAG;AACM,CAAC,EAAmB;EACpC,MAAMC,aAAa,GAAGZ,MAAM,CAAC,KAAK,CAAC;EACnC,MAAMa,aAAa,GAAGb,MAAM,CAAC,KAAK,CAAC;;EAEnC;EACA,MAAMc,cAAc,GAAGZ,YAAY,CAAC,CAAC,IAAKK,WAAW,CAASQ,gBAAgB,GAAG,CAAC;EAElF,MAAMC,QAAQ,GAAGf,WAAW,CAAC,YAAkD;IAC7E,IAAI,CAACC,YAAY,CAAC,CAAC,IAAIU,aAAa,CAACK,OAAO,EAAE;MAC5C,OAAO,IAAI;IACb;;IAEA;IACA;IACA,IAAI,CAACH,cAAc,EAAE;MACnBL,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb;IAEAG,aAAa,CAACK,OAAO,GAAG,IAAI;IAE5B,IAAI;MACF;MACA;MACA,MAAMC,OAAO,GAAG,MAAOX,WAAW,CAASY,qBAAqB,GAAG,CAAC;MAEpE,IAAID,OAAO,EAAE;QACX,MAAMV,cAAc,CAACU,OAAO,CAAC;QAC7B,OAAOA,OAAO;MAChB;;MAEA;MACAT,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb,CAAC,CAAC,OAAOW,KAAK,EAAE;MACd;MACAX,gBAAgB,GAAG,CAAC;MACpBC,OAAO,GAAGU,KAAK,YAAYC,KAAK,GAAGD,KAAK,GAAG,IAAIC,KAAK,CAACC,MAAM,CAACF,KAAK,CAAC,CAAC,CAAC;MACpE,OAAO,IAAI;IACb,CAAC,SAAS;MACRR,aAAa,CAACK,OAAO,GAAG,KAAK;IAC/B;EACF,CAAC,EAAE,CAACV,WAAW,EAAEC,cAAc,EAAEC,gBAAgB,EAAEC,OAAO,EAAEI,cAAc,CAAC,CAAC;;EAE5E;EACAf,SAAS,CAAC,MAAM;IACd,IAAI,CAACY,OAAO,IAAI,CAACT,YAAY,CAAC,CAAC,IAAIW,aAAa,CAACI,OAAO,EAAE;MACxD;IACF;IAEAJ,aAAa,CAACI,OAAO,GAAG,IAAI;IAE5B,IAAIH,cAAc,EAAE;MAClBE,QAAQ,CAAC,CAAC;IACZ,CAAC,MAAM;MACL;MACAP,gBAAgB,GAAG,CAAC;IACtB;EACF,CAAC,EAAE,CAACE,OAAO,EAAEK,QAAQ,EAAEF,cAAc,EAAEL,gBAAgB,CAAC,CAAC;EAEzD,OAAO;IACLO,QAAQ;IACRO,UAAU,EAAEX,aAAa,CAACK,OAAO;IACjCF,gBAAgB,EAAED;EACpB,CAAC;AACH;AAEA,SAASZ,YAAY","ignoreList":[]}
1
+ {"version":3,"names":["useEffect","useRef","useCallback","isWebBrowser","window","document","documentElement","isIdentityProvider","hostname","location","useWebSSO","oxyServices","onSessionFound","onSSOUnavailable","onError","enabled","isCheckingRef","hasCheckedRef","fedCMSupported","isFedCMSupported","checkSSO","current","session","silentSignInWithFedCM","error","Error","String","isChecking"],"sourceRoot":"../../../../src","sources":["ui/hooks/useWebSSO.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,SAAS,EAAEC,MAAM,EAAEC,WAAW,QAAQ,OAAO;AAqBtD;AACA;AACA;AACA,SAASC,YAAYA,CAAA,EAAY;EAC/B,OAAO,OAAOC,MAAM,KAAK,WAAW,IAC7B,OAAOC,QAAQ,KAAK,WAAW,IAC/B,OAAOA,QAAQ,CAACC,eAAe,KAAK,WAAW;AACxD;;AAEA;AACA;AACA;AACA;AACA,SAASC,kBAAkBA,CAAA,EAAY;EACrC,IAAI,CAACJ,YAAY,CAAC,CAAC,EAAE,OAAO,KAAK;EACjC,MAAMK,QAAQ,GAAGJ,MAAM,CAACK,QAAQ,CAACD,QAAQ;EACzC,OAAOA,QAAQ,KAAK,aAAa;AACnC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,SAASA,CAAC;EACxBC,WAAW;EACXC,cAAc;EACdC,gBAAgB;EAChBC,OAAO;EACPC,OAAO,GAAG;AACM,CAAC,EAAmB;EACpC,MAAMC,aAAa,GAAGf,MAAM,CAAC,KAAK,CAAC;EACnC,MAAMgB,aAAa,GAAGhB,MAAM,CAAC,KAAK,CAAC;;EAEnC;EACA,MAAMiB,cAAc,GAAGf,YAAY,CAAC,CAAC,IAAKQ,WAAW,CAASQ,gBAAgB,GAAG,CAAC;EAElF,MAAMC,QAAQ,GAAGlB,WAAW,CAAC,YAAkD;IAC7E,IAAI,CAACC,YAAY,CAAC,CAAC,IAAIa,aAAa,CAACK,OAAO,EAAE;MAC5C,OAAO,IAAI;IACb;;IAEA;IACA,IAAId,kBAAkB,CAAC,CAAC,EAAE;MACxBM,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb;;IAEA;IACA;IACA,IAAI,CAACK,cAAc,EAAE;MACnBL,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb;IAEAG,aAAa,CAACK,OAAO,GAAG,IAAI;IAE5B,IAAI;MACF;MACA;MACA,MAAMC,OAAO,GAAG,MAAOX,WAAW,CAASY,qBAAqB,GAAG,CAAC;MAEpE,IAAID,OAAO,EAAE;QACX,MAAMV,cAAc,CAACU,OAAO,CAAC;QAC7B,OAAOA,OAAO;MAChB;;MAEA;MACAT,gBAAgB,GAAG,CAAC;MACpB,OAAO,IAAI;IACb,CAAC,CAAC,OAAOW,KAAK,EAAE;MACd;MACAX,gBAAgB,GAAG,CAAC;MACpBC,OAAO,GAAGU,KAAK,YAAYC,KAAK,GAAGD,KAAK,GAAG,IAAIC,KAAK,CAACC,MAAM,CAACF,KAAK,CAAC,CAAC,CAAC;MACpE,OAAO,IAAI;IACb,CAAC,SAAS;MACRR,aAAa,CAACK,OAAO,GAAG,KAAK;IAC/B;EACF,CAAC,EAAE,CAACV,WAAW,EAAEC,cAAc,EAAEC,gBAAgB,EAAEC,OAAO,EAAEI,cAAc,CAAC,CAAC;;EAE5E;EACAlB,SAAS,CAAC,MAAM;IACd,IAAI,CAACe,OAAO,IAAI,CAACZ,YAAY,CAAC,CAAC,IAAIc,aAAa,CAACI,OAAO,IAAId,kBAAkB,CAAC,CAAC,EAAE;MAChF,IAAIA,kBAAkB,CAAC,CAAC,EAAE;QACxBM,gBAAgB,GAAG,CAAC;MACtB;MACA;IACF;IAEAI,aAAa,CAACI,OAAO,GAAG,IAAI;IAE5B,IAAIH,cAAc,EAAE;MAClBE,QAAQ,CAAC,CAAC;IACZ,CAAC,MAAM;MACL;MACAP,gBAAgB,GAAG,CAAC;IACtB;EACF,CAAC,EAAE,CAACE,OAAO,EAAEK,QAAQ,EAAEF,cAAc,EAAEL,gBAAgB,CAAC,CAAC;EAEzD,OAAO;IACLO,QAAQ;IACRO,UAAU,EAAEX,aAAa,CAACK,OAAO;IACjCF,gBAAgB,EAAED;EACpB,CAAC;AACH;AAEA,SAASf,YAAY","ignoreList":[]}
@@ -95,6 +95,9 @@ export declare function OxyServicesFedCMMixin<T extends typeof OxyServicesBase>(
95
95
  /**
96
96
  * Request identity credential from browser using FedCM API
97
97
  *
98
+ * Uses a global lock to prevent concurrent requests, as FedCM only
99
+ * allows one navigator.credentials.get request at a time.
100
+ *
98
101
  * @private
99
102
  */
100
103
  requestIdentityCredential(options: {
@@ -178,7 +181,13 @@ export declare function OxyServicesFedCMMixin<T extends typeof OxyServicesBase>(
178
181
  handleError(error: unknown): Error;
179
182
  healthCheck(): Promise<{
180
183
  status: string;
181
- users?: number;
184
+ users
185
+ /**
186
+ * Get configuration for FedCM
187
+ *
188
+ * @returns FedCM configuration with browser support info
189
+ */
190
+ ?: number;
182
191
  timestamp?: string;
183
192
  [key: string]: any;
184
193
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"OxyServices.fedcm.d.ts","sourceRoot":"","sources":["../../../../../src/core/mixins/OxyServices.fedcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,eAAe,EAAE,IAAI,EAAE,CAAC;kBAEtD,GAAG,EAAE;QAc5B;;WAEG;4BACiB,OAAO;QAI3B;;;;;;;;;;;;;;;;;;;;;;;WAuBG;kCAC4B,gBAAgB,GAAQ,OAAO,CAAC,oBAAoB,CAAC;QA2CpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BG;iCAC4B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAiCnE;;;;WAIG;2CAC6C;YAC9C,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;SAChD,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QA+BrC;;;;;;;WAOG;2CAC6C,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAStF;;;;;WAKG;iCAC4B,OAAO,CAAC,IAAI,CAAC;QAmB5C;;;;WAIG;0BACe,WAAW;QAQ7B;;;;WAIG;yBACqB,MAAM;QAQ9B;;;;WAIG;uBACmB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAhH3B,CAAF;sBAEM,CAAC;yBAA6B,CAAC;;;;;;iBAgHzB,CAAA;qBAEN,CAAC;;;;iCA3QsC,gCAAgC;4BACrC,KAAK;IAE5C;;OAEG;wBACwB,OAAO;;MAwQnC;AAGD,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"OxyServices.fedcm.d.ts","sourceRoot":"","sources":["../../../../../src/core/mixins/OxyServices.fedcm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAOD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,eAAe,EAAE,IAAI,EAAE,CAAC;kBAEtD,GAAG,EAAE;QAc5B;;WAEG;4BACiB,OAAO;QAI3B;;;;;;;;;;;;;;;;;;;;;;;WAuBG;kCAC4B,gBAAgB,GAAQ,OAAO,CAAC,oBAAoB,CAAC;QA2CpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WA6BG;iCAC4B,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAiCnE;;;;;;;WAOG;2CAC6C;YAC9C,SAAS,EAAE,MAAM,CAAC;YAClB,QAAQ,EAAE,MAAM,CAAC;YACjB,KAAK,EAAE,MAAM,CAAC;YACd,OAAO,CAAC,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,UAAU,CAAC;SAChD,GAAG,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAC;QA+CrC;;;;;;;WAOG;2CAC6C,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;QAStF;;;;;WAKG;iCAC4B,OAAO,CAAC,IAAI,CAAC;QAmB5C;;;;WAIG;0BACe,WAAW;QAQ7B;;;;WAIG;yBACqB,MAAM;QAQ9B;;;;WAIG;uBACmB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBA/IxB,CAAD;sBAGD,CAAH;yBACQ,CAAA;;;;;;;YA4GP;;;;eAIG;YACH,CANF;qBAEiB,CAAC;;;;iCA5P4B,gCAAgC;4BACrC,KAAK;IAE5C;;OAEG;wBACwB,OAAO;;MA2RnC;AAGD,OAAO,EAAE,qBAAqB,IAAI,UAAU,EAAE,CAAC"}