User Store
UserStore is the session manager. It handles login/signup, maintains the current user, and orchestrates data loading after authentication.
What it does
After init, the store starts empty. Once a user logs in, it:
- Creates an
ESPCDFUserentity for that adaptor - Exposes the
authservice for login, signup, OAuth, password recovery - Provides
user.getGroups()to bootstrap the app with groups and devices - Clears everything on logout
Multi-adaptor setups maintain one user per adaptor.
API reference
Properties
| Property | Type | Purpose |
|---|---|---|
user | ESPCDFUser | undefined | The logged-in user for the active adaptor |
adaptorAuthorizationEntityMap | Record<string, ESPCDFUser> | null | Map of adaptor ID → user entity (multi-adaptor) |
auth | Auth | Auth service: login, signup, OAuth, password reset |
Getting the store
import { initCDF } from "@espressif/rainmaker-base-cdf";
const espCDF = await initCDF({ sdkAdaptorRegistry });
const { userStore } = espCDF;
How to use it
Sign in with password
await espCDF.userStore.auth.login({
username: "user@example.com",
password: "••••",
});
Sign in with OAuth
await espCDF.userStore.auth.loginWithOauth({
identityProvider: "google",
// adaptorIdentifier optional when active adaptor is set
});
Sign up
// Step 1: request signup code
await espCDF.userStore.auth.getSignUpCode({
username: "user@example.com",
password: "••••",
});
// Step 2: confirm
await espCDF.userStore.auth.confirmSignUp({
username: "user@example.com",
verificationCode: "789012",
});
Forgot password
await espCDF.userStore.auth.forgotPassword({ username: "user@example.com" });
await espCDF.userStore.auth.setNewPassword({
username: "user@example.com",
newPassword: "••••",
verificationCode: "345678",
});
Restore an existing session
Call restoreSession at app launch to check whether the user is still logged in:
const user = await espCDF.userStore.restoreSession();
if (user) {
// Session found — proceed with data fetch
} else {
// No session — show login screen
}
Access the current user entity
const user = espCDF.userStore.user; // ESPCDFUser | undefined
Fetch groups and nodes
The user entity is the entry point for the hierarchical data fetch:
const user = espCDF.userStore.user!;
// Fetch groups — populates GroupStore automatically via UserStoreSynchronizer
await user.getGroups();
// After getGroups, groups are observable in GroupStore
const groups = espCDF.groupStore.groupsList;
Sign out
await user.logout();
// UserStoreSynchronizer clears all stores
Reactive session display
import { observer } from "mobx-react-lite";
import type { ESPCDF } from "@espressif/rainmaker-base-cdf";
const UserProfileBadge = observer(function UserProfileBadge({
espCDF,
}: {
espCDF: ESPCDF;
}) {
const user = espCDF.userStore.user;
if (!user) return <LoginButton />;
return <Text>{user.userInfo.name ?? user.userInfo.email}</Text>;
});
Profile operations
For profile edits, custom data, and account deletion, use the user entity directly. See ESPCDFUser for full operation details.
Multi-adaptor setup
In apps supporting multiple SDKs, manage users per adaptor:
// Get user for a specific adaptor
const rainmakerUser = espCDF.userStore.getAuthorizationEntityForAdaptor("rainmaker-base-sdk");
// Set user for a specific adaptor (done automatically by auth.login)
espCDF.userStore.setAuthorizationEntityForAdaptor("rainmaker-base-sdk", userEntity);
// Remove a specific adaptor's session
espCDF.userStore.removeAuthorizationEntityForAdaptor("rainmaker-base-sdk");
// Clear all sessions
espCDF.userStore.removeAuthorizationEntityForAdaptor();
Reactive user display
import { observer } from "mobx-react-lite";
import type { ESPCDF } from "@espressif/rainmaker-base-cdf";
const UserProfileBadge = observer(function UserProfileBadge({
espCDF,
}: {
espCDF: ESPCDF;
}) {
const user = espCDF.userStore.user;
if (!user) return <LoginButton />;
return <Text>{user.userInfo.name ?? user.userInfo.email}</Text>;
});
See also
Core entity
- ESPCDFUser — full user operation reference
Implementation
API Reference