@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.
- package/README.md +51 -42
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js +46 -24
- package/lib/commonjs/core/mixins/OxyServices.fedcm.js.map +1 -1
- package/lib/commonjs/ui/components/OxyProvider.js +106 -40
- package/lib/commonjs/ui/components/OxyProvider.js.map +1 -1
- package/lib/commonjs/ui/components/WebOxyProvider.js +9 -10
- package/lib/commonjs/ui/components/WebOxyProvider.js.map +1 -1
- package/lib/commonjs/ui/hooks/useAuth.js +21 -8
- package/lib/commonjs/ui/hooks/useAuth.js.map +1 -1
- package/lib/commonjs/ui/hooks/useWebSSO.js +21 -2
- package/lib/commonjs/ui/hooks/useWebSSO.js.map +1 -1
- package/lib/module/core/mixins/OxyServices.fedcm.js +46 -24
- package/lib/module/core/mixins/OxyServices.fedcm.js.map +1 -1
- package/lib/module/ui/components/OxyProvider.js +106 -39
- package/lib/module/ui/components/OxyProvider.js.map +1 -1
- package/lib/module/ui/components/WebOxyProvider.js +9 -10
- package/lib/module/ui/components/WebOxyProvider.js.map +1 -1
- package/lib/module/ui/hooks/useAuth.js +21 -8
- package/lib/module/ui/hooks/useAuth.js.map +1 -1
- package/lib/module/ui/hooks/useWebSSO.js +21 -2
- package/lib/module/ui/hooks/useWebSSO.js.map +1 -1
- package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts +10 -1
- package/lib/typescript/commonjs/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts +26 -3
- package/lib/typescript/commonjs/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/components/WebOxyProvider.d.ts +9 -10
- package/lib/typescript/commonjs/ui/components/WebOxyProvider.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/commonjs/ui/hooks/useWebSSO.d.ts.map +1 -1
- package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts +10 -1
- package/lib/typescript/module/core/mixins/OxyServices.fedcm.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/OxyProvider.d.ts +26 -3
- package/lib/typescript/module/ui/components/OxyProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/components/WebOxyProvider.d.ts +9 -10
- package/lib/typescript/module/ui/components/WebOxyProvider.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useAuth.d.ts.map +1 -1
- package/lib/typescript/module/ui/hooks/useWebSSO.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/core/mixins/OxyServices.fedcm.ts +47 -23
- package/src/ui/components/OxyProvider.tsx +112 -47
- package/src/ui/components/WebOxyProvider.tsx +9 -10
- package/src/ui/hooks/useAuth.ts +25 -8
- 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,
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
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":";;AACA,SAASA,sBAAsB,QAAQ,0BAAuB;AAc9D;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,qBAAqBA,CAAmCC,IAAO,EAAE;EAC/E,OAAO,cAAcA,IAAI,CAAC;IACxBC,WAAWA,CAAC,GAAGC,IAAW,EAAE;MAC1B,KAAK,CAAC,GAAIA,IAAc,CAAC;IAC3B;IACF,OAAuBC,kBAAkB,GAAG,gCAAgC;IAC5E,OAAuBC,aAAa,GAAG,KAAK,CAAC,CAAC;;IAE9C;AACF;AACA;IACE,OAAOC,gBAAgBA,CAAA,EAAY;MACjC,IAAI,OAAOC,MAAM,KAAK,WAAW,EAAE,OAAO,KAAK;MAC/C,OAAO,oBAAoB,IAAIA,MAAM,IAAI,WAAW,IAAIA,MAAM,IAAI,aAAa,IAAIC,SAAS;IAC9F;;IAEA;AACF;AACA;IACEF,gBAAgBA,CAAA,EAAY;MAC1B,OAAQ,IAAI,CAACJ,WAAW,CAAkEI,gBAAgB,CAAC,CAAC;IAC9G;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACE,MAAMG,eAAeA,CAACC,OAAyB,GAAG,CAAC,CAAC,EAAiC;MACnF,IAAI,CAAC,IAAI,CAACJ,gBAAgB,CAAC,CAAC,EAAE;QAC5B,MAAM,
|
|
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
|
|
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
|
-
*
|
|
24
|
-
*
|
|
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
|
|
111
|
+
// Hook React Query focus manager into app state (native) or visibility (web)
|
|
73
112
|
useEffect(() => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
88
|
-
|
|
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:
|
|
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","
|
|
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 -
|
|
4
|
+
* WebOxyProvider - Lightweight provider for pure React/Next.js apps
|
|
5
5
|
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
*
|
|
27
|
-
*
|
|
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
|
|
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
|
-
//
|
|
58
|
-
|
|
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
|
|
96
|
-
showBottomSheet
|
|
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
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
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":";;AAAA;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,WAAW,QAAkB,OAAO;AAC7C,SAASC,MAAM,QAAQ,0BAAuB;AAE9C,SAASC,YAAY,QAAQ,gBAAa;AAgD1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,OAAOA,CAAA,EAAkB;EACvC,MAAM;IACJC,IAAI;IACJC,eAAe;IACfC,SAAS;IACTC,YAAY;IACZC,KAAK;IACLC,MAAM,EAAEC,SAAS;IACjBC,MAAM;IACNC,SAAS;IACTC,eAAe;IACfC,WAAW;IACXC,WAAW;IACXC,YAAY;IACZC;EACF,CAAC,GAAGhB,MAAM,CAAC,CAAC;EAEZ,MAAMQ,MAAM,GAAGT,WAAW,CAAC,MAAOkB,SAAkB,IAAoB;IACtE;IACA,
|
|
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,
|
|
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":"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","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
|
|
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;
|
|
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"}
|