jazz-tools 0.15.4 → 0.15.6

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/react-native-core/provider.tsx","../../src/react-native-core/ReactNativeContextManager.ts","../../src/react-native-core/platform.ts","../../src/react-native-core/storage/kv-store-context.ts","../../src/react-native-core/storage/sqlite-react-native.ts","../../src/react-native-core/auth/DemoAuthUI.tsx","../../src/react-native-core/auth/auth.ts","../../src/react-native-core/hooks.tsx","../../src/react-native-core/media.tsx","../../src/react-native-core/index.ts"],"sourcesContent":["import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InstanceOfSchema,\n JazzContextType,\n KvStore,\n} from \"jazz-tools\";\nimport { JazzContext, JazzContextManagerContext } from \"jazz-tools/react-core\";\nimport React, { useEffect, useRef } from \"react\";\nimport { JazzContextManagerProps } from \"./ReactNativeContextManager.js\";\nimport { ReactNativeContextManager } from \"./ReactNativeContextManager.js\";\nimport { setupKvStore } from \"./platform.js\";\n\nexport type JazzProviderProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n children: React.ReactNode;\n kvStore?: KvStore;\n} & JazzContextManagerProps<S>;\n\n/** @category Context & Hooks */\nexport function JazzProviderCore<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>({\n children,\n guestMode,\n sync,\n storage,\n AccountSchema,\n defaultProfileName,\n onLogOut,\n kvStore,\n onAnonymousAccountDiscarded,\n CryptoProvider,\n logOutReplacement,\n}: JazzProviderProps<S>) {\n setupKvStore(kvStore);\n\n const [contextManager] = React.useState(\n () => new ReactNativeContextManager<S>(),\n );\n\n const onAnonymousAccountDiscardedRefCallback = useRefCallback(\n onAnonymousAccountDiscarded,\n );\n const onLogOutRefCallback = useRefCallback(onLogOut);\n const logOutReplacementRefCallback = useRefCallback(logOutReplacement);\n const logoutReplacementActiveRef = useRef(false);\n logoutReplacementActiveRef.current = Boolean(logOutReplacement);\n\n const value = React.useSyncExternalStore<\n JazzContextType<InstanceOfSchema<S>> | undefined\n >(\n React.useCallback(\n (callback) => {\n const props = {\n AccountSchema,\n guestMode,\n sync,\n storage,\n defaultProfileName,\n onLogOut: onLogOutRefCallback,\n logOutReplacement: logoutReplacementActiveRef.current\n ? logOutReplacementRefCallback\n : undefined,\n onAnonymousAccountDiscarded: onAnonymousAccountDiscardedRefCallback,\n CryptoProvider,\n };\n if (contextManager.propsChanged(props)) {\n contextManager.createContext(props).catch((error) => {\n console.log(error.stack);\n console.error(\"Error creating Jazz context:\", error);\n });\n }\n\n return contextManager.subscribe(callback);\n },\n [sync, guestMode].concat(storage as any),\n ),\n () => contextManager.getCurrentValue(),\n () => contextManager.getCurrentValue(),\n );\n\n useEffect(() => {\n // In development mode we don't return a cleanup function because otherwise\n // the double effect execution would mark the context as done immediately.\n if (process.env.NODE_ENV === \"development\") return;\n\n return () => {\n contextManager.done();\n };\n }, []);\n\n return (\n <JazzContext.Provider value={value}>\n <JazzContextManagerContext.Provider value={contextManager}>\n {value && children}\n </JazzContextManagerContext.Provider>\n </JazzContext.Provider>\n );\n}\n\nfunction useRefCallback<T extends (...args: any[]) => any>(callback?: T) {\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n return useRef(\n (...args: Parameters<T>): ReturnType<T> => callbackRef.current?.(...args),\n ).current;\n}\n","import {\n Account,\n AccountClass,\n CoValueFromRaw,\n JazzContextManager,\n KvStore,\n SyncConfig,\n} from \"jazz-tools\";\nimport type {\n AnyAccountSchema,\n InstanceOfSchema,\n JazzContextManagerAuthProps,\n} from \"jazz-tools\";\nimport {\n BaseReactNativeContextOptions,\n createJazzReactNativeContext,\n createJazzReactNativeGuestContext,\n} from \"./platform.js\";\nimport { KvStoreContext } from \"./storage/kv-store-context.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n storage?: BaseReactNativeContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n CryptoProvider?: BaseReactNativeContextOptions[\"CryptoProvider\"];\n};\n\nexport class ReactNativeContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzReactNativeGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n CryptoProvider: props.CryptoProvider,\n });\n } else {\n return createJazzReactNativeContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n CryptoProvider: props.CryptoProvider,\n });\n }\n }\n\n getKvStore(): KvStore {\n return KvStoreContext.getInstance().getStorage();\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import NetInfo from \"@react-native-community/netinfo\";\nimport { LocalNode, Peer, RawAccountID } from \"cojson\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\"; // Importing from dist to not rely on the exports field\nimport {\n Account,\n AccountClass,\n AccountSchema,\n AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueClass,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n InstanceOfSchema,\n NewAccountProps,\n SessionID,\n SyncConfig,\n createInviteLink as baseCreateInviteLink,\n createAnonymousJazzContext,\n createJazzContext,\n} from \"jazz-tools\";\nimport { KvStore, KvStoreContext } from \"./storage/kv-store-context.js\";\nimport { SQLiteReactNative } from \"./storage/sqlite-react-native.js\";\n\nimport { SQLiteDatabaseDriverAsync } from \"cojson-storage\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport type { RNQuickCrypto } from \"./crypto/RNQuickCrypto.js\";\n\nexport type BaseReactNativeContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: SQLiteDatabaseDriverAsync | \"disabled\";\n CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto;\n authSecretStorage: AuthSecretStorage;\n};\n\nclass ReactNativeWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n return NetInfo.addEventListener((state) =>\n callback(state.isConnected ?? false),\n );\n }\n}\n\nasync function setupPeers(options: BaseReactNativeContextOptions) {\n const CryptoProvider = options.CryptoProvider || PureJSCrypto;\n const crypto = await CryptoProvider.create();\n let node: LocalNode | undefined = undefined;\n\n const peersToLoadFrom: Peer[] = [];\n\n if (options.storage && options.storage !== \"disabled\") {\n const storage = await SQLiteReactNative.asPeer({\n adapter: options.storage,\n });\n peersToLoadFrom.push(storage);\n }\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n peersToLoadFrom,\n setNode: () => {},\n crypto,\n };\n }\n\n const wsPeer = new ReactNativeWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n peersToLoadFrom,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto } =\n await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n}\n\nexport type ReactNativeContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseReactNativeContextOptions;\n\nexport async function createJazzReactNativeContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: ReactNativeContextOptions<S>) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto } =\n await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n // To update the internal state with the current credentials\n authSecretStorage.emitUpdate(credentials);\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.isAuthenticated);\n }\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peersToLoadFrom,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideLockSession,\n authSecretStorage: options.authSecretStorage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport async function provideLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n const sessionDone = () => {};\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n const sessionID =\n ((await kvStore.get(accountID)) as SessionID) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n await kvStore.set(accountID, sessionID);\n\n return Promise.resolve({\n sessionID,\n sessionDone,\n });\n}\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\",\n { baseURL, valueHint }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, baseURL ?? \"\", valueHint);\n}\n\nexport function setupKvStore(\n kvStore: KvStore | undefined,\n): KvStore | undefined {\n if (!kvStore) {\n return undefined;\n }\n KvStoreContext.getInstance().initialize(kvStore);\n return kvStore;\n}\n","export interface KvStore {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n delete(key: string): Promise<void>;\n clearAll(): Promise<void>;\n}\n\nexport class KvStoreContext {\n private static instance: KvStoreContext;\n private storageInstance: KvStore | null = null;\n\n private constructor() {}\n\n public static getInstance(): KvStoreContext {\n if (!KvStoreContext.instance) {\n KvStoreContext.instance = new KvStoreContext();\n }\n return KvStoreContext.instance;\n }\n\n public isInitialized(): boolean {\n return this.storageInstance !== null;\n }\n\n public initialize(store: KvStore): void {\n if (!this.storageInstance) {\n this.storageInstance = store;\n }\n }\n\n public getStorage(): KvStore {\n if (!this.storageInstance) {\n throw new Error(\"Storage instance is not initialized.\");\n }\n return this.storageInstance;\n }\n}\n\nexport default KvStoreContext;\n","import { type Peer } from \"cojson\";\nimport { SQLiteDatabaseDriverAsync, SQLiteNodeBaseAsync } from \"cojson-storage\";\n\nexport interface SQLiteConfig {\n adapter: SQLiteDatabaseDriverAsync;\n}\n\nexport class SQLiteReactNative extends SQLiteNodeBaseAsync {\n static async asPeer(config: SQLiteConfig): Promise<Peer> {\n if (!config.adapter) {\n throw new Error(\"SQLite adapter is required\");\n }\n\n return SQLiteNodeBaseAsync.create({\n db: config.adapter,\n localNodeName: \"localNode\",\n });\n }\n}\n","import { useDemoAuth } from \"jazz-tools/react-core\";\nimport React, { useState } from \"react\";\nimport {\n StyleSheet,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n useColorScheme,\n} from \"react-native\";\n\nexport const DemoAuthBasicUI = ({\n appName,\n auth,\n children,\n}: {\n appName: string;\n auth: ReturnType<typeof useDemoAuth>;\n children: React.ReactNode;\n}) => {\n const colorScheme = useColorScheme();\n const darkMode = colorScheme === \"dark\";\n const [username, setUsername] = useState<string>(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const handleSignUp = () => {\n setErrorMessage(null);\n\n auth.signUp(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n const handleLogIn = (username: string) => {\n setErrorMessage(null);\n\n auth.logIn(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n if (auth.state === \"signedIn\") {\n return children;\n }\n\n return (\n <View\n style={[\n styles.container,\n darkMode ? styles.darkBackground : styles.lightBackground,\n ]}\n >\n <View style={styles.formContainer}>\n <Text\n style={[\n styles.headerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n {appName}\n </Text>\n\n {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}\n\n <TextInput\n placeholder=\"Display name\"\n value={username}\n onChangeText={setUsername}\n placeholderTextColor={darkMode ? \"#fff\" : \"#000\"}\n style={[\n styles.textInput,\n darkMode ? styles.darkInput : styles.lightInput,\n ]}\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n style={[\n styles.button,\n darkMode ? styles.darkButton : styles.lightButton,\n ]}\n >\n <Text\n style={darkMode ? styles.darkButtonText : styles.lightButtonText}\n >\n Sign Up as new account\n </Text>\n </TouchableOpacity>\n\n <View style={styles.existingUsersContainer}>\n {auth.existingUsers.map((user) => (\n <TouchableOpacity\n key={user}\n onPress={() => handleLogIn(user)}\n style={[\n styles.existingUserButton,\n darkMode ? styles.darkUserButton : styles.lightUserButton,\n ]}\n >\n <Text style={darkMode ? styles.darkText : styles.lightText}>\n Log In as \"{user}\"\n </Text>\n </TouchableOpacity>\n ))}\n </View>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 20,\n },\n formContainer: {\n width: \"80%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n headerText: {\n fontSize: 24,\n marginBottom: 20,\n },\n errorText: {\n color: \"red\",\n marginVertical: 5,\n textAlign: \"center\",\n },\n textInput: {\n borderWidth: 1,\n padding: 10,\n marginVertical: 10,\n width: \"100%\",\n borderRadius: 6,\n },\n darkInput: {\n borderColor: \"#444\",\n backgroundColor: \"#000\",\n color: \"#fff\",\n },\n lightInput: {\n borderColor: \"#ddd\",\n backgroundColor: \"#fff\",\n color: \"#000\",\n },\n button: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n width: \"100%\",\n marginVertical: 10,\n },\n darkButton: {\n backgroundColor: \"#444\",\n },\n lightButton: {\n backgroundColor: \"#ddd\",\n },\n darkButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n },\n lightButtonText: {\n color: \"#000\",\n textAlign: \"center\",\n },\n existingUsersContainer: {\n width: \"100%\",\n marginTop: 20,\n },\n existingUserButton: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n marginVertical: 5,\n },\n darkUserButton: {\n backgroundColor: \"#222\",\n },\n lightUserButton: {\n backgroundColor: \"#eee\",\n },\n loadingText: {\n fontSize: 18,\n color: \"#888\",\n },\n darkText: {\n color: \"#fff\",\n },\n lightText: {\n color: \"#000\",\n },\n darkBackground: {\n backgroundColor: \"#000\",\n },\n lightBackground: {\n backgroundColor: \"#fff\",\n },\n});\n","import { KvStoreContext } from \"../storage/kv-store-context.js\";\n\nexport * from \"./DemoAuthUI.js\";\n\nexport function clearUserCredentials() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n // TODO: Migrate the Auth methods to use the same storage key/interface\n return Promise.all([\n kvStore.delete(\"demo-auth-logged-in-secret\"),\n kvStore.delete(\"jazz-clerk-auth\"),\n kvStore.delete(\"jazz-logged-in-secret\"),\n ]);\n}\n","import { useEffect } from \"react\";\n\nimport { CoValueOrZodSchema, parseInviteLink } from \"jazz-tools\";\nimport { useJazzContext } from \"jazz-tools/react-core\";\nimport { Linking } from \"react-native\";\n\nexport {\n useCoState,\n experimental_useInboxSender,\n useDemoAuth,\n usePassphraseAuth,\n useJazzContext,\n useAuthSecretStorage,\n useIsAuthenticated,\n useAccount,\n} from \"jazz-tools/react-core\";\n\nexport function useAcceptInviteNative<S extends CoValueOrZodSchema>({\n invitedObjectSchema,\n onAccept,\n forValueHint,\n}: {\n invitedObjectSchema: S;\n onAccept: (projectID: string) => void;\n forValueHint?: string;\n}): void {\n const context = useJazzContext();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useAcceptInviteNative can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n useEffect(() => {\n const handleDeepLink = ({ url }: { url: string }) => {\n const result = parseInviteLink(url);\n if (result && result.valueHint === forValueHint) {\n context.me\n .acceptInvite(\n result.valueID,\n result.inviteSecret,\n invitedObjectSchema,\n )\n .then(() => {\n onAccept(result.valueID);\n })\n .catch((e) => {\n console.error(\"Failed to accept invite\", e);\n });\n }\n };\n\n const linkingListener = Linking.addEventListener(\"url\", handleDeepLink);\n\n void Linking.getInitialURL().then((url) => {\n if (url) handleDeepLink({ url });\n });\n\n return () => {\n linkingListener.remove();\n };\n }, [context, onAccept, invitedObjectSchema, forValueHint]);\n}\n","import { ImageDefinition, Loaded } from \"jazz-tools\";\nimport React, { useEffect, useState } from \"react\";\n\n/** @category Media */\nexport function useProgressiveImgNative({\n image,\n maxWidth,\n targetWidth,\n}: {\n image: Loaded<typeof ImageDefinition> | null | undefined;\n maxWidth?: number;\n targetWidth?: number;\n}) {\n const [current, setCurrent] = useState<\n { src?: string; res?: `${number}x${number}` | \"placeholder\" } | undefined\n >(undefined);\n\n useEffect(() => {\n let lastHighestRes: string | undefined;\n if (!image) return;\n const unsub = image.subscribe({}, (update) => {\n const highestRes = ImageDefinition.highestResAvailable(update, {\n maxWidth,\n targetWidth,\n });\n if (highestRes && highestRes.res !== lastHighestRes) {\n lastHighestRes = highestRes.res;\n // use the base64 data directly\n const dataUrl = highestRes.stream.asBase64({ dataURL: true });\n if (dataUrl) {\n setCurrent({\n src: dataUrl,\n res: highestRes.res,\n });\n } else {\n // Fallback to placeholder if chunks aren't available\n console.warn(\"No chunks available for image\", image.id);\n setCurrent({\n src: update?.placeholderDataURL,\n res: \"placeholder\",\n });\n }\n } else if (!highestRes) {\n setCurrent({\n src: update?.placeholderDataURL,\n res: \"placeholder\",\n });\n }\n });\n\n return unsub;\n }, [image?.id, maxWidth]);\n\n return {\n src: current?.src,\n res: current?.res,\n originalSize: image?.originalSize,\n };\n}\n\n/** @category Media */\nexport function ProgressiveImgNative({\n children,\n image,\n maxWidth,\n targetWidth,\n}: {\n children: (result: {\n src: string | undefined;\n res: `${number}x${number}` | \"placeholder\" | undefined;\n originalSize: readonly [number, number] | undefined;\n }) => React.ReactNode;\n image: Loaded<typeof ImageDefinition> | null | undefined;\n maxWidth?: number;\n targetWidth?: number;\n}) {\n const result = useProgressiveImgNative({ image, maxWidth, targetWidth });\n return result && children(result);\n}\n","export * from \"./provider.js\";\nexport * from \"./auth/auth.js\";\nexport * from \"./hooks.js\";\nexport * from \"./media.js\";\nexport * from \"./storage/kv-store-context.js\";\n\nexport { SQLiteDatabaseDriverAsync } from \"cojson-storage\";\nexport { parseInviteLink } from \"jazz-tools\";\nexport { createInviteLink, setupKvStore } from \"./platform.js\";\n"],"mappings":"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","names":["CryptoProvider","handleAuthUpdate","AccountSchema","CryptoProvider","jsx","username","useEffect","useJazzContext","useEffect","useState","SQLiteDatabaseDriverAsync","parseInviteLink"]}
1
+ {"version":3,"sources":["../../src/react-native-core/storage/kv-store-context.ts","../../src/react-native-core/auth/DemoAuthUI.tsx","../../src/react-native-core/auth/auth.ts","../../src/react-native-core/hooks.tsx","../../src/react-native-core/media.tsx","../../src/react-native-core/provider.tsx","../../src/react-native-core/ReactNativeContextManager.ts","../../src/react-native-core/platform.ts","../../src/react-native-core/storage/sqlite-react-native.ts","../../src/react-native-core/index.ts"],"sourcesContent":["export interface KvStore {\n get(key: string): Promise<string | null>;\n set(key: string, value: string): Promise<void>;\n delete(key: string): Promise<void>;\n clearAll(): Promise<void>;\n}\n\nexport class KvStoreContext {\n private static instance: KvStoreContext;\n private storageInstance: KvStore | null = null;\n\n private constructor() {}\n\n public static getInstance(): KvStoreContext {\n if (!KvStoreContext.instance) {\n KvStoreContext.instance = new KvStoreContext();\n }\n return KvStoreContext.instance;\n }\n\n public isInitialized(): boolean {\n return this.storageInstance !== null;\n }\n\n public initialize(store: KvStore): void {\n if (!this.storageInstance) {\n this.storageInstance = store;\n }\n }\n\n public getStorage(): KvStore {\n if (!this.storageInstance) {\n throw new Error(\"Storage instance is not initialized.\");\n }\n return this.storageInstance;\n }\n}\n\nexport default KvStoreContext;\n","import { useDemoAuth } from \"jazz-tools/react-core\";\nimport React, { useState } from \"react\";\nimport {\n StyleSheet,\n Text,\n TextInput,\n TouchableOpacity,\n View,\n useColorScheme,\n} from \"react-native\";\n\nexport const DemoAuthBasicUI = ({\n appName,\n auth,\n children,\n}: {\n appName: string;\n auth: ReturnType<typeof useDemoAuth>;\n children: React.ReactNode;\n}) => {\n const colorScheme = useColorScheme();\n const darkMode = colorScheme === \"dark\";\n const [username, setUsername] = useState<string>(\"\");\n const [errorMessage, setErrorMessage] = useState<string | null>(null);\n\n const handleSignUp = () => {\n setErrorMessage(null);\n\n auth.signUp(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n const handleLogIn = (username: string) => {\n setErrorMessage(null);\n\n auth.logIn(username).catch((error) => {\n setErrorMessage(error.message);\n });\n };\n\n if (auth.state === \"signedIn\") {\n return children;\n }\n\n return (\n <View\n style={[\n styles.container,\n darkMode ? styles.darkBackground : styles.lightBackground,\n ]}\n >\n <View style={styles.formContainer}>\n <Text\n style={[\n styles.headerText,\n darkMode ? styles.darkText : styles.lightText,\n ]}\n >\n {appName}\n </Text>\n\n {errorMessage && <Text style={styles.errorText}>{errorMessage}</Text>}\n\n <TextInput\n placeholder=\"Display name\"\n value={username}\n onChangeText={setUsername}\n placeholderTextColor={darkMode ? \"#fff\" : \"#000\"}\n style={[\n styles.textInput,\n darkMode ? styles.darkInput : styles.lightInput,\n ]}\n />\n\n <TouchableOpacity\n onPress={handleSignUp}\n style={[\n styles.button,\n darkMode ? styles.darkButton : styles.lightButton,\n ]}\n >\n <Text\n style={darkMode ? styles.darkButtonText : styles.lightButtonText}\n >\n Sign Up as new account\n </Text>\n </TouchableOpacity>\n\n <View style={styles.existingUsersContainer}>\n {auth.existingUsers.map((user) => (\n <TouchableOpacity\n key={user}\n onPress={() => handleLogIn(user)}\n style={[\n styles.existingUserButton,\n darkMode ? styles.darkUserButton : styles.lightUserButton,\n ]}\n >\n <Text style={darkMode ? styles.darkText : styles.lightText}>\n Log In as \"{user}\"\n </Text>\n </TouchableOpacity>\n ))}\n </View>\n </View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flex: 1,\n justifyContent: \"center\",\n alignItems: \"center\",\n padding: 20,\n },\n formContainer: {\n width: \"80%\",\n alignItems: \"center\",\n justifyContent: \"center\",\n },\n headerText: {\n fontSize: 24,\n marginBottom: 20,\n },\n errorText: {\n color: \"red\",\n marginVertical: 5,\n textAlign: \"center\",\n },\n textInput: {\n borderWidth: 1,\n padding: 10,\n marginVertical: 10,\n width: \"100%\",\n borderRadius: 6,\n },\n darkInput: {\n borderColor: \"#444\",\n backgroundColor: \"#000\",\n color: \"#fff\",\n },\n lightInput: {\n borderColor: \"#ddd\",\n backgroundColor: \"#fff\",\n color: \"#000\",\n },\n button: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n width: \"100%\",\n marginVertical: 10,\n },\n darkButton: {\n backgroundColor: \"#444\",\n },\n lightButton: {\n backgroundColor: \"#ddd\",\n },\n darkButtonText: {\n color: \"#fff\",\n textAlign: \"center\",\n },\n lightButtonText: {\n color: \"#000\",\n textAlign: \"center\",\n },\n existingUsersContainer: {\n width: \"100%\",\n marginTop: 20,\n },\n existingUserButton: {\n paddingVertical: 15,\n paddingHorizontal: 10,\n borderRadius: 6,\n marginVertical: 5,\n },\n darkUserButton: {\n backgroundColor: \"#222\",\n },\n lightUserButton: {\n backgroundColor: \"#eee\",\n },\n loadingText: {\n fontSize: 18,\n color: \"#888\",\n },\n darkText: {\n color: \"#fff\",\n },\n lightText: {\n color: \"#000\",\n },\n darkBackground: {\n backgroundColor: \"#000\",\n },\n lightBackground: {\n backgroundColor: \"#fff\",\n },\n});\n","import { KvStoreContext } from \"../storage/kv-store-context.js\";\n\nexport * from \"./DemoAuthUI.js\";\n\nexport function clearUserCredentials() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n // TODO: Migrate the Auth methods to use the same storage key/interface\n return Promise.all([\n kvStore.delete(\"demo-auth-logged-in-secret\"),\n kvStore.delete(\"jazz-clerk-auth\"),\n kvStore.delete(\"jazz-logged-in-secret\"),\n ]);\n}\n","import { useEffect } from \"react\";\n\nimport { CoValueOrZodSchema, parseInviteLink } from \"jazz-tools\";\nimport { useJazzContext } from \"jazz-tools/react-core\";\nimport { Linking } from \"react-native\";\n\nexport {\n useCoState,\n experimental_useInboxSender,\n useDemoAuth,\n usePassphraseAuth,\n useJazzContext,\n useAuthSecretStorage,\n useIsAuthenticated,\n useAccount,\n} from \"jazz-tools/react-core\";\n\nexport function useAcceptInviteNative<S extends CoValueOrZodSchema>({\n invitedObjectSchema,\n onAccept,\n forValueHint,\n}: {\n invitedObjectSchema: S;\n onAccept: (projectID: string) => void;\n forValueHint?: string;\n}): void {\n const context = useJazzContext();\n\n if (!(\"me\" in context)) {\n throw new Error(\n \"useAcceptInviteNative can't be used in a JazzProvider with auth === 'guest'.\",\n );\n }\n\n useEffect(() => {\n const handleDeepLink = ({ url }: { url: string }) => {\n const result = parseInviteLink(url);\n if (result && result.valueHint === forValueHint) {\n context.me\n .acceptInvite(\n result.valueID,\n result.inviteSecret,\n invitedObjectSchema,\n )\n .then(() => {\n onAccept(result.valueID);\n })\n .catch((e) => {\n console.error(\"Failed to accept invite\", e);\n });\n }\n };\n\n const linkingListener = Linking.addEventListener(\"url\", handleDeepLink);\n\n void Linking.getInitialURL().then((url) => {\n if (url) handleDeepLink({ url });\n });\n\n return () => {\n linkingListener.remove();\n };\n }, [context, onAccept, invitedObjectSchema, forValueHint]);\n}\n","import { ImageDefinition, Loaded } from \"jazz-tools\";\nimport React, { useEffect, useState } from \"react\";\n\n/** @category Media */\nexport function useProgressiveImgNative({\n image,\n maxWidth,\n targetWidth,\n}: {\n image: Loaded<typeof ImageDefinition> | null | undefined;\n maxWidth?: number;\n targetWidth?: number;\n}) {\n const [current, setCurrent] = useState<\n { src?: string; res?: `${number}x${number}` | \"placeholder\" } | undefined\n >(undefined);\n\n useEffect(() => {\n let lastHighestRes: string | undefined;\n if (!image) return;\n const unsub = image.subscribe({}, (update) => {\n const highestRes = ImageDefinition.highestResAvailable(update, {\n maxWidth,\n targetWidth,\n });\n if (highestRes && highestRes.res !== lastHighestRes) {\n lastHighestRes = highestRes.res;\n // use the base64 data directly\n const dataUrl = highestRes.stream.asBase64({ dataURL: true });\n if (dataUrl) {\n setCurrent({\n src: dataUrl,\n res: highestRes.res,\n });\n } else {\n // Fallback to placeholder if chunks aren't available\n console.warn(\"No chunks available for image\", image.id);\n setCurrent({\n src: update?.placeholderDataURL,\n res: \"placeholder\",\n });\n }\n } else if (!highestRes) {\n setCurrent({\n src: update?.placeholderDataURL,\n res: \"placeholder\",\n });\n }\n });\n\n return unsub;\n }, [image?.id, maxWidth]);\n\n return {\n src: current?.src,\n res: current?.res,\n originalSize: image?.originalSize,\n };\n}\n\n/** @category Media */\nexport function ProgressiveImgNative({\n children,\n image,\n maxWidth,\n targetWidth,\n}: {\n children: (result: {\n src: string | undefined;\n res: `${number}x${number}` | \"placeholder\" | undefined;\n originalSize: readonly [number, number] | undefined;\n }) => React.ReactNode;\n image: Loaded<typeof ImageDefinition> | null | undefined;\n maxWidth?: number;\n targetWidth?: number;\n}) {\n const result = useProgressiveImgNative({ image, maxWidth, targetWidth });\n return result && children(result);\n}\n","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InstanceOfSchema,\n JazzContextType,\n KvStore,\n} from \"jazz-tools\";\nimport { JazzContext, JazzContextManagerContext } from \"jazz-tools/react-core\";\nimport React, { useEffect, useRef } from \"react\";\nimport type { JazzContextManagerProps } from \"./ReactNativeContextManager.js\";\nimport { ReactNativeContextManager } from \"./ReactNativeContextManager.js\";\nimport { setupKvStore } from \"./platform.js\";\n\nexport type JazzProviderProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n children: React.ReactNode;\n kvStore?: KvStore;\n} & JazzContextManagerProps<S>;\n\n/** @category Context & Hooks */\nexport function JazzProviderCore<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>({\n children,\n guestMode,\n sync,\n storage,\n AccountSchema,\n defaultProfileName,\n onLogOut,\n logOutReplacement,\n onAnonymousAccountDiscarded,\n kvStore,\n CryptoProvider,\n}: JazzProviderProps<S>) {\n setupKvStore(kvStore);\n\n const [contextManager] = React.useState(\n () => new ReactNativeContextManager<S>(),\n );\n\n const onLogOutRefCallback = useRefCallback(onLogOut);\n const logOutReplacementRefCallback = useRefCallback(logOutReplacement);\n const onAnonymousAccountDiscardedRefCallback = useRefCallback(\n onAnonymousAccountDiscarded,\n );\n const logoutReplacementActiveRef = useRef(false);\n logoutReplacementActiveRef.current = Boolean(logOutReplacement);\n\n const value = React.useSyncExternalStore<\n JazzContextType<InstanceOfSchema<S>> | undefined\n >(\n React.useCallback(\n (callback) => {\n const props = {\n AccountSchema,\n guestMode,\n sync,\n storage,\n defaultProfileName,\n onLogOut: onLogOutRefCallback,\n logOutReplacement: logoutReplacementActiveRef.current\n ? logOutReplacementRefCallback\n : undefined,\n onAnonymousAccountDiscarded: onAnonymousAccountDiscardedRefCallback,\n CryptoProvider,\n } satisfies JazzContextManagerProps<S>;\n\n if (contextManager.propsChanged(props)) {\n contextManager.createContext(props).catch((error) => {\n console.log(error.stack);\n console.error(\"Error creating Jazz React Native context:\", error);\n });\n }\n\n return contextManager.subscribe(callback);\n },\n [sync, guestMode].concat(storage as any),\n ),\n () => contextManager.getCurrentValue(),\n () => contextManager.getCurrentValue(),\n );\n\n useEffect(() => {\n // In development mode we don't return a cleanup function because otherwise\n // the double effect execution would mark the context as done immediately.\n if (process.env.NODE_ENV === \"development\") return;\n\n return () => {\n contextManager.done();\n };\n }, []);\n\n return (\n <JazzContext.Provider value={value}>\n <JazzContextManagerContext.Provider value={contextManager}>\n {value && children}\n </JazzContextManagerContext.Provider>\n </JazzContext.Provider>\n );\n}\n\nfunction useRefCallback<T extends (...args: any[]) => any>(callback?: T) {\n const callbackRef = React.useRef(callback);\n callbackRef.current = callback;\n return useRef(\n (...args: Parameters<T>): ReturnType<T> => callbackRef.current?.(...args),\n ).current;\n}\n","import {\n Account,\n AccountClass,\n CoValueFromRaw,\n JazzContextManager,\n KvStore,\n SyncConfig,\n} from \"jazz-tools\";\nimport type {\n AnyAccountSchema,\n InstanceOfSchema,\n JazzContextManagerAuthProps,\n} from \"jazz-tools\";\nimport {\n BaseReactNativeContextOptions,\n createJazzReactNativeContext,\n createJazzReactNativeGuestContext,\n} from \"./platform.js\";\nimport { KvStoreContext } from \"./storage/kv-store-context.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n storage?: BaseReactNativeContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n CryptoProvider?: BaseReactNativeContextOptions[\"CryptoProvider\"];\n};\n\nexport class ReactNativeContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzReactNativeGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n CryptoProvider: props.CryptoProvider,\n });\n } else {\n return createJazzReactNativeContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n CryptoProvider: props.CryptoProvider,\n });\n }\n }\n\n getKvStore(): KvStore {\n return KvStoreContext.getInstance().getStorage();\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import NetInfo from \"@react-native-community/netinfo\";\nimport { LocalNode, Peer, RawAccountID } from \"cojson\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\"; // Importing from dist to not rely on the exports field\nimport {\n Account,\n AccountClass,\n AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n NewAccountProps,\n SessionID,\n SyncConfig,\n createInviteLink as baseCreateInviteLink,\n createAnonymousJazzContext,\n createJazzContext,\n} from \"jazz-tools\";\nimport { KvStore, KvStoreContext } from \"./storage/kv-store-context.js\";\nimport { SQLiteReactNative } from \"./storage/sqlite-react-native.js\";\n\nimport { SQLiteDatabaseDriverAsync } from \"cojson-storage\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport type { RNQuickCrypto } from \"jazz-tools/react-native-core/crypto\";\n\nexport type BaseReactNativeContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: SQLiteDatabaseDriverAsync | \"disabled\";\n CryptoProvider?: typeof PureJSCrypto | typeof RNQuickCrypto;\n authSecretStorage: AuthSecretStorage;\n};\n\nclass ReactNativeWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n return NetInfo.addEventListener((state) =>\n callback(state.isConnected ?? false),\n );\n }\n}\n\nasync function setupPeers(options: BaseReactNativeContextOptions) {\n const CryptoProvider = options.CryptoProvider || PureJSCrypto;\n const crypto = await CryptoProvider.create();\n let node: LocalNode | undefined = undefined;\n\n const peersToLoadFrom: Peer[] = [];\n\n if (options.storage && options.storage !== \"disabled\") {\n const storage = await SQLiteReactNative.asPeer({\n adapter: options.storage,\n });\n peersToLoadFrom.push(storage);\n }\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n peersToLoadFrom,\n setNode: () => {},\n crypto,\n };\n }\n\n const wsPeer = new ReactNativeWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n peersToLoadFrom,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzReactNativeGuestContext(\n options: BaseReactNativeContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto } =\n await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n}\n\nexport type ReactNativeContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseReactNativeContextOptions;\n\nexport async function createJazzReactNativeContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: ReactNativeContextOptions<S>) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto } =\n await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n // To update the internal state with the current credentials\n authSecretStorage.emitUpdate(credentials);\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.isAuthenticated);\n }\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peersToLoadFrom,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideLockSession,\n authSecretStorage: options.authSecretStorage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport async function provideLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n const sessionDone = () => {};\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n\n const sessionID =\n ((await kvStore.get(accountID)) as SessionID) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n await kvStore.set(accountID, sessionID);\n\n return Promise.resolve({\n sessionID,\n sessionDone,\n });\n}\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\",\n { baseURL, valueHint }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, baseURL ?? \"\", valueHint);\n}\n\nexport function setupKvStore(\n kvStore: KvStore | undefined,\n): KvStore | undefined {\n if (!kvStore) {\n return undefined;\n }\n KvStoreContext.getInstance().initialize(kvStore);\n return kvStore;\n}\n","import { type Peer } from \"cojson\";\nimport { SQLiteDatabaseDriverAsync, SQLiteNodeBaseAsync } from \"cojson-storage\";\n\nexport interface SQLiteConfig {\n adapter: SQLiteDatabaseDriverAsync;\n}\n\nexport class SQLiteReactNative extends SQLiteNodeBaseAsync {\n static async asPeer(config: SQLiteConfig): Promise<Peer> {\n if (!config.adapter) {\n throw new Error(\"SQLite adapter is required\");\n }\n\n return SQLiteNodeBaseAsync.create({\n db: config.adapter,\n localNodeName: \"localNode\",\n });\n }\n}\n","export * from \"./auth/auth.js\";\nexport * from \"./hooks.js\";\nexport * from \"./media.js\";\nexport * from \"./provider.js\";\nexport * from \"./storage/kv-store-context.js\";\n\nexport { SQLiteDatabaseDriverAsync } from \"cojson-storage\";\nexport { parseInviteLink } from \"jazz-tools\";\nexport { createInviteLink, setupKvStore } from \"./platform.js\";\n"],"mappings":"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","names":["username","useJazzContext","useEffect","useState","React","useEffect","CryptoProvider","handleAuthUpdate","jsx","CryptoProvider","React","useEffect","SQLiteDatabaseDriverAsync","parseInviteLink"]}
@@ -1,9 +1,9 @@
1
1
  import { LocalNode, RawAccountID } from "cojson";
2
2
  import { PureJSCrypto } from "cojson/dist/crypto/PureJSCrypto";
3
- import { Account, AccountClass, AgentID, AnyAccountSchema, AuthCredentials, AuthSecretStorage, CoValue, CoValueFromRaw, CryptoProvider, ID, InstanceOfSchema, NewAccountProps, SessionID, SyncConfig } from "jazz-tools";
3
+ import { Account, AccountClass, AgentID, AnyAccountSchema, AuthCredentials, AuthSecretStorage, CoValue, CoValueFromRaw, CryptoProvider, ID, NewAccountProps, SessionID, SyncConfig } from "jazz-tools";
4
4
  import { KvStore } from "./storage/kv-store-context.js";
5
5
  import { SQLiteDatabaseDriverAsync } from "cojson-storage";
6
- import type { RNQuickCrypto } from "./crypto/RNQuickCrypto.js";
6
+ import type { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
7
7
  export type BaseReactNativeContextOptions = {
8
8
  sync: SyncConfig;
9
9
  reconnectionTimeout?: number;
@@ -24,7 +24,7 @@ export type ReactNativeContextOptions<S extends (AccountClass<Account> & CoValue
24
24
  defaultProfileName?: string;
25
25
  } & BaseReactNativeContextOptions;
26
26
  export declare function createJazzReactNativeContext<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>(options: ReactNativeContextOptions<S>): Promise<{
27
- me: InstanceOfSchema<S>;
27
+ me: import("jazz-tools").InstanceOfSchema<S>;
28
28
  node: LocalNode;
29
29
  authSecretStorage: AuthSecretStorage;
30
30
  done: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/react-native-core/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAQ,YAAY,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EAEZ,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,OAAO,EAEP,cAAc,EACd,cAAc,EACd,EAAE,EACF,gBAAgB,EAChB,eAAe,EACf,SAAS,EACT,UAAU,EAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAkB,MAAM,+BAA+B,CAAC;AAGxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/D,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,yBAAyB,GAAG,UAAU,CAAC;IACjD,cAAc,CAAC,EAAE,OAAO,YAAY,GAAG,OAAO,aAAa,CAAC;IAC5D,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAwEF,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,6BAA6B;;;;;GA0BvC;AAED,MAAM,MAAM,yBAAyB,CACnC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,6BAA6B,CAAC;AAElC,wBAAsB,4BAA4B,CAChD,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC;;;;;;GAqDtC;AAED,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,CAC5B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;AAExB,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,EAChC,MAAM,EAAE,cAAc;;;GAevB;AAED,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,EACnC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACpE,MAAM,CAER;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,GAAG,SAAS,GAC3B,OAAO,GAAG,SAAS,CAMrB"}
1
+ {"version":3,"file":"platform.d.ts","sourceRoot":"","sources":["../../src/react-native-core/platform.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAQ,YAAY,EAAE,MAAM,QAAQ,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,cAAc,EACd,EAAE,EACF,eAAe,EACf,SAAS,EACT,UAAU,EAIX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAkB,MAAM,+BAA+B,CAAC;AAGxE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AAEzE,MAAM,MAAM,6BAA6B,GAAG;IAC1C,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,yBAAyB,GAAG,UAAU,CAAC;IACjD,cAAc,CAAC,EAAE,OAAO,YAAY,GAAG,OAAO,aAAa,CAAC;IAC5D,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAwEF,wBAAsB,iCAAiC,CACrD,OAAO,EAAE,6BAA6B;;;;;GA0BvC;AAED,MAAM,MAAM,yBAAyB,CACnC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,6BAA6B,CAAC;AAElC,wBAAsB,4BAA4B,CAChD,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC;;;;;;GAqDtC;AAED,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,CAC5B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;AAExB,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,EAChC,MAAM,EAAE,cAAc;;;GAevB;AAED,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,EACnC,EAAE,OAAO,EAAE,SAAS,EAAE,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACpE,MAAM,CAER;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,OAAO,GAAG,SAAS,GAC3B,OAAO,GAAG,SAAS,CAMrB"}
@@ -1,10 +1,10 @@
1
1
  import { Account, AccountClass, AnyAccountSchema, CoValueFromRaw, KvStore } from "jazz-tools";
2
2
  import React from "react";
3
- import { JazzContextManagerProps } from "./ReactNativeContextManager.js";
3
+ import type { JazzContextManagerProps } from "./ReactNativeContextManager.js";
4
4
  export type JazzProviderProps<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema> = {
5
5
  children: React.ReactNode;
6
6
  kvStore?: KvStore;
7
7
  } & JazzContextManagerProps<S>;
8
8
  /** @category Context & Hooks */
9
- export declare function JazzProviderCore<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ children, guestMode, sync, storage, AccountSchema, defaultProfileName, onLogOut, kvStore, onAnonymousAccountDiscarded, CryptoProvider, logOutReplacement, }: JazzProviderProps<S>): import("react/jsx-runtime").JSX.Element;
9
+ export declare function JazzProviderCore<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ children, guestMode, sync, storage, AccountSchema, defaultProfileName, onLogOut, logOutReplacement, onAnonymousAccountDiscarded, kvStore, CryptoProvider, }: JazzProviderProps<S>): import("react/jsx-runtime").JSX.Element;
10
10
  //# sourceMappingURL=provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/react-native-core/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EAGd,OAAO,EACR,MAAM,YAAY,CAAC;AAEpB,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAIzE,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;AAE/B,gCAAgC;AAChC,wBAAgB,gBAAgB,CAC9B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,EACA,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,OAAO,EACP,2BAA2B,EAC3B,cAAc,EACd,iBAAiB,GAClB,EAAE,iBAAiB,CAAC,CAAC,CAAC,2CAiEtB"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/react-native-core/provider.tsx"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EAGd,OAAO,EACR,MAAM,YAAY,CAAC;AAEpB,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAI9E,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,uBAAuB,CAAC,CAAC,CAAC,CAAC;AAE/B,gCAAgC;AAChC,wBAAgB,gBAAgB,CAC9B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,EACA,QAAQ,EACR,SAAS,EACT,IAAI,EACJ,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,QAAQ,EACR,iBAAiB,EACjB,2BAA2B,EAC3B,OAAO,EACP,cAAc,GACf,EAAE,iBAAiB,CAAC,CAAC,CAAC,2CAkEtB"}
package/dist/testing.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  createAnonymousJazzContext,
7
7
  createJazzContext,
8
8
  randomSessionProvider
9
- } from "./chunk-VBDJM6Z5.js";
9
+ } from "./chunk-AV3MKD64.js";
10
10
 
11
11
  // src/tools/testing.ts
12
12
  import { LocalNode } from "cojson";
@@ -41,12 +41,35 @@ export declare class Group extends CoValueBase implements CoValue {
41
41
  * @param member The group that will lose access to this group.
42
42
  */
43
43
  removeMember(member: Group): Promise<void>;
44
- get members(): Array<{
44
+ private getMembersFromKeys;
45
+ /**
46
+ * Returns all members of the group, including inherited members from parent
47
+ * groups.
48
+ *
49
+ * If you need only the direct members of the group, use
50
+ * {@link getDirectMembers} instead.
51
+ *
52
+ * @returns The members of the group.
53
+ */
54
+ get members(): {
55
+ id: string;
56
+ role: AccountRole;
57
+ ref: Ref<Account>;
58
+ account: Account;
59
+ }[];
60
+ /**
61
+ * Returns the direct members of the group.
62
+ *
63
+ * If you need all members of the group, including inherited members from
64
+ * parent groups, use {@link Group.members|members} instead.
65
+ * @returns The direct members of the group.
66
+ */
67
+ getDirectMembers(): {
45
68
  id: string;
46
69
  role: AccountRole;
47
70
  ref: Ref<Account>;
48
71
  account: Account;
49
- }>;
72
+ }[];
50
73
  getRoleOf(member: Everyone | ID<Account> | "me"): Role | undefined;
51
74
  /**
52
75
  * Make the group public, so that everyone can read it.
@@ -1 +1 @@
1
- {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/tools/coValues/group.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"group.d.ts","sourceRoot":"","sources":["../../../src/tools/coValues/group.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -139,16 +139,14 @@
139
139
  },
140
140
  "type": "module",
141
141
  "license": "MIT",
142
- "version": "0.15.4",
142
+ "version": "0.15.6",
143
143
  "dependencies": {
144
144
  "@manuscripts/prosemirror-recreate-steps": "^0.1.4",
145
- "@op-engineering/op-sqlite": "^11.4.8",
146
145
  "@scure/base": "1.2.1",
147
146
  "@scure/bip39": "^1.3.0",
148
147
  "@tiptap/core": "^2.12.0",
149
148
  "@types/image-blob-reduce": "^4.1.1",
150
149
  "clsx": "^2.0.0",
151
- "expo-sqlite": "15.2.9",
152
150
  "fast-myers-diff": "^3.2.0",
153
151
  "goober": "^2.1.16",
154
152
  "image-blob-reduce": "^4.1.0",
@@ -159,15 +157,11 @@
159
157
  "prosemirror-schema-basic": "^1.2.2",
160
158
  "prosemirror-state": "^1.4.3",
161
159
  "prosemirror-transform": "^1.9.0",
162
- "react-native-fast-encoder": "^0.2.0",
163
- "react-native-mmkv": "^3.2.0",
164
- "react-native-nitro-modules": "0.25.2",
165
- "react-native-quick-crypto": "1.0.0-beta.16",
166
160
  "zod": "3.25.28",
167
- "cojson-storage": "0.15.4",
168
- "cojson-storage-indexeddb": "0.15.4",
169
- "cojson": "0.15.4",
170
- "cojson-transport-ws": "0.15.4"
161
+ "cojson": "0.15.6",
162
+ "cojson-storage": "0.15.6",
163
+ "cojson-storage-indexeddb": "0.15.6",
164
+ "cojson-transport-ws": "0.15.6"
171
165
  },
172
166
  "devDependencies": {
173
167
  "@scure/bip39": "^1.3.0",
@@ -186,27 +180,39 @@
186
180
  },
187
181
  "peerDependencies": {
188
182
  "@bam.tech/react-native-image-resizer": "*",
183
+ "@op-engineering/op-sqlite": "^11.4.8",
189
184
  "@react-native-community/netinfo": "*",
190
185
  "expo-file-system": "*",
191
186
  "expo-secure-store": "*",
187
+ "expo-sqlite": "15.2.9",
192
188
  "react": "*",
193
189
  "react-dom": "*",
194
190
  "react-native": "*",
191
+ "react-native-fast-encoder": "^0.2.0",
192
+ "react-native-mmkv": "^3.2.0",
193
+ "react-native-nitro-modules": "0.25.2",
194
+ "react-native-quick-crypto": "1.0.0-beta.16",
195
195
  "svelte": "^5.0.0"
196
196
  },
197
197
  "peerDependenciesMeta": {
198
198
  "@bam.tech/react-native-image-resizer": {
199
199
  "optional": true
200
200
  },
201
- "expo-file-system": {
201
+ "@op-engineering/op-sqlite": {
202
202
  "optional": true
203
203
  },
204
204
  "@react-native-community/netinfo": {
205
205
  "optional": true
206
206
  },
207
+ "expo-file-system": {
208
+ "optional": true
209
+ },
207
210
  "expo-secure-store": {
208
211
  "optional": true
209
212
  },
213
+ "expo-sqlite": {
214
+ "optional": true
215
+ },
210
216
  "react": {
211
217
  "optional": true
212
218
  },
@@ -216,6 +222,18 @@
216
222
  "react-native": {
217
223
  "optional": true
218
224
  },
225
+ "react-native-fast-encoder": {
226
+ "optional": true
227
+ },
228
+ "react-native-mmkv": {
229
+ "optional": true
230
+ },
231
+ "react-native-nitro-modules": {
232
+ "optional": true
233
+ },
234
+ "react-native-quick-crypto": {
235
+ "optional": true
236
+ },
219
237
  "svelte": {
220
238
  "optional": true
221
239
  }
@@ -74,6 +74,7 @@ export function JazzReactProvider<
74
74
 
75
75
  if (contextManager.propsChanged(props)) {
76
76
  contextManager.createContext(props).catch((error) => {
77
+ console.log(error.stack);
77
78
  console.error("Error creating Jazz browser context:", error);
78
79
  });
79
80
  }
@@ -1,7 +1,7 @@
1
- export * from "./provider.js";
2
1
  export * from "./auth/auth.js";
3
2
  export * from "./hooks.js";
4
3
  export * from "./media.js";
4
+ export * from "./provider.js";
5
5
  export * from "./storage/kv-store-context.js";
6
6
 
7
7
  export { SQLiteDatabaseDriverAsync } from "cojson-storage";
@@ -4,17 +4,14 @@ import { PureJSCrypto } from "cojson/dist/crypto/PureJSCrypto"; // Importing fro
4
4
  import {
5
5
  Account,
6
6
  AccountClass,
7
- AccountSchema,
8
7
  AgentID,
9
8
  AnyAccountSchema,
10
9
  AuthCredentials,
11
10
  AuthSecretStorage,
12
11
  CoValue,
13
- CoValueClass,
14
12
  CoValueFromRaw,
15
13
  CryptoProvider,
16
14
  ID,
17
- InstanceOfSchema,
18
15
  NewAccountProps,
19
16
  SessionID,
20
17
  SyncConfig,
@@ -27,7 +24,7 @@ import { SQLiteReactNative } from "./storage/sqlite-react-native.js";
27
24
 
28
25
  import { SQLiteDatabaseDriverAsync } from "cojson-storage";
29
26
  import { WebSocketPeerWithReconnection } from "cojson-transport-ws";
30
- import type { RNQuickCrypto } from "./crypto/RNQuickCrypto.js";
27
+ import type { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
31
28
 
32
29
  export type BaseReactNativeContextOptions = {
33
30
  sync: SyncConfig;
@@ -9,7 +9,7 @@ import {
9
9
  } from "jazz-tools";
10
10
  import { JazzContext, JazzContextManagerContext } from "jazz-tools/react-core";
11
11
  import React, { useEffect, useRef } from "react";
12
- import { JazzContextManagerProps } from "./ReactNativeContextManager.js";
12
+ import type { JazzContextManagerProps } from "./ReactNativeContextManager.js";
13
13
  import { ReactNativeContextManager } from "./ReactNativeContextManager.js";
14
14
  import { setupKvStore } from "./platform.js";
15
15
 
@@ -35,10 +35,10 @@ export function JazzProviderCore<
35
35
  AccountSchema,
36
36
  defaultProfileName,
37
37
  onLogOut,
38
- kvStore,
38
+ logOutReplacement,
39
39
  onAnonymousAccountDiscarded,
40
+ kvStore,
40
41
  CryptoProvider,
41
- logOutReplacement,
42
42
  }: JazzProviderProps<S>) {
43
43
  setupKvStore(kvStore);
44
44
 
@@ -46,11 +46,11 @@ export function JazzProviderCore<
46
46
  () => new ReactNativeContextManager<S>(),
47
47
  );
48
48
 
49
+ const onLogOutRefCallback = useRefCallback(onLogOut);
50
+ const logOutReplacementRefCallback = useRefCallback(logOutReplacement);
49
51
  const onAnonymousAccountDiscardedRefCallback = useRefCallback(
50
52
  onAnonymousAccountDiscarded,
51
53
  );
52
- const onLogOutRefCallback = useRefCallback(onLogOut);
53
- const logOutReplacementRefCallback = useRefCallback(logOutReplacement);
54
54
  const logoutReplacementActiveRef = useRef(false);
55
55
  logoutReplacementActiveRef.current = Boolean(logOutReplacement);
56
56
 
@@ -71,11 +71,12 @@ export function JazzProviderCore<
71
71
  : undefined,
72
72
  onAnonymousAccountDiscarded: onAnonymousAccountDiscardedRefCallback,
73
73
  CryptoProvider,
74
- };
74
+ } satisfies JazzContextManagerProps<S>;
75
+
75
76
  if (contextManager.propsChanged(props)) {
76
77
  contextManager.createContext(props).catch((error) => {
77
78
  console.log(error.stack);
78
- console.error("Error creating Jazz context:", error);
79
+ console.error("Error creating Jazz React Native context:", error);
79
80
  });
80
81
  }
81
82
 
@@ -182,7 +182,9 @@ export class Group extends CoValueBase implements CoValue {
182
182
  }
183
183
  }
184
184
 
185
- get members(): Array<{
185
+ private getMembersFromKeys(
186
+ accountIDs: Iterable<RawAccountID | AgentID>,
187
+ ): Array<{
186
188
  id: string;
187
189
  role: AccountRole;
188
190
  ref: Ref<Account>;
@@ -195,7 +197,7 @@ export class Group extends CoValueBase implements CoValue {
195
197
  optional: false,
196
198
  } satisfies RefEncoded<Account>;
197
199
 
198
- for (const accountID of this._raw.getAllMemberKeysSet()) {
200
+ for (const accountID of accountIDs) {
199
201
  if (!isAccountID(accountID)) continue;
200
202
 
201
203
  const role = this._raw.roleOf(accountID);
@@ -230,6 +232,30 @@ export class Group extends CoValueBase implements CoValue {
230
232
  return members;
231
233
  }
232
234
 
235
+ /**
236
+ * Returns all members of the group, including inherited members from parent
237
+ * groups.
238
+ *
239
+ * If you need only the direct members of the group, use
240
+ * {@link getDirectMembers} instead.
241
+ *
242
+ * @returns The members of the group.
243
+ */
244
+ get members() {
245
+ return this.getMembersFromKeys(this._raw.getAllMemberKeysSet());
246
+ }
247
+
248
+ /**
249
+ * Returns the direct members of the group.
250
+ *
251
+ * If you need all members of the group, including inherited members from
252
+ * parent groups, use {@link Group.members|members} instead.
253
+ * @returns The direct members of the group.
254
+ */
255
+ getDirectMembers() {
256
+ return this.getMembersFromKeys(this._raw.getMemberKeys());
257
+ }
258
+
233
259
  getRoleOf(member: Everyone | ID<Account> | "me") {
234
260
  if (member === "me") {
235
261
  return this._raw.roleOf(
@@ -650,3 +650,65 @@ describe("Group.members", () => {
650
650
  ]);
651
651
  });
652
652
  });
653
+
654
+ describe("Group.getDirectMembers", () => {
655
+ test("should return only the direct members of the group", async () => {
656
+ const parentGroup = Group.create();
657
+ const childGroup = Group.create();
658
+
659
+ const bob = await createJazzTestAccount({});
660
+ await bob.waitForAllCoValuesSync();
661
+
662
+ // Add bob to parent group
663
+ parentGroup.addMember(bob, "reader");
664
+
665
+ // Add parent group to child group
666
+ childGroup.addMember(parentGroup);
667
+
668
+ // Child group should inherit bob through parent, but bob is not a direct member
669
+ expect(childGroup.members).toEqual([
670
+ expect.objectContaining({
671
+ account: expect.objectContaining({
672
+ id: co.account().getMe().id,
673
+ }),
674
+ }),
675
+ expect.objectContaining({
676
+ account: expect.objectContaining({
677
+ id: bob.id,
678
+ }),
679
+ }),
680
+ ]);
681
+
682
+ // directMembers should only show the admin, not the inherited bob
683
+ expect(childGroup.getDirectMembers()).toEqual([
684
+ expect.objectContaining({
685
+ account: expect.objectContaining({
686
+ id: co.account().getMe().id,
687
+ }),
688
+ }),
689
+ ]);
690
+
691
+ // Explicitly verify bob is not in directMembers
692
+ expect(childGroup.getDirectMembers()).not.toContainEqual(
693
+ expect.objectContaining({
694
+ account: expect.objectContaining({
695
+ id: bob.id,
696
+ }),
697
+ }),
698
+ );
699
+
700
+ // Parent group's direct members should include both admin and bob
701
+ expect(parentGroup.getDirectMembers()).toEqual([
702
+ expect.objectContaining({
703
+ account: expect.objectContaining({
704
+ id: co.account().getMe().id,
705
+ }),
706
+ }),
707
+ expect.objectContaining({
708
+ account: expect.objectContaining({
709
+ id: bob.id,
710
+ }),
711
+ }),
712
+ ]);
713
+ });
714
+ });