Session Storage
The Session Storage functionality is provided through the session function, which creates reactive objects that automatically synchronize with sessionStorage. This is ideal for temporary data that should persist during navigation within the same tab but not across different sessions.
API
session()
Creates a reactive session object that automatically syncs with sessionStorage.
session = <T, S>(name: string, init: T, options?: StateOptions<S>, storageClass?: typeof SessionStorage) => T;Parameters:
name- Unique identifier for the session storage instanceinit- Initial data to populate the session storageoptions- Optional anchor configuration optionsstorageClass- Custom storage class to use (defaults to SessionStorage)
Returns: A reactive proxy object that syncs with sessionStorage
Naming Convention
The name parameter supports versioning through a special syntax:
// Simple name
const sessionData = session('user-session', { userId: null });
// With version
const sessionData = session('user-session@1.0.0', { userId: null });
// With version and previous version for cleanup
const sessionData = session('user-session@2.0.0:1.0.0', { userId: null });When a previous version is specified, the storage system will automatically clean up the old version data.
session.leave()
Disconnects a reactive session object from sessionStorage synchronization.
type leave = <T>(state: T) => void;Parameters:
state- The reactive session object to disconnect
Usage Examples
Basic Usage
import { session } from '@anchorlib/storage';
// Create a session storage for temporary data
const sessionData = session('session-data', {
currentPage: 1,
searchQuery: '',
filters: {},
});
// Access and modify data as regular object properties
console.log(sessionData.currentPage); // 1
sessionData.currentPage = 2;
sessionData.searchQuery = 'Anchor';
// Changes are automatically persisted to sessionStorage
// Data will persist through page navigation but not browser restartForm State Persistence
import { session } from '@anchorlib/storage';
// Persist form state during a session
const formState = session('contact-form', {
name: '',
email: '',
message: '',
});
// In your form component
function handleInputChange(field, value) {
formState[field] = value;
}
// If the user navigates away and comes back, form data is preserved
// But if they close the browser and come back, form starts freshShopping Cart Example
import { session } from '@anchorlib/storage';
// Temporary shopping cart that persists during the session
const cart = session('shopping-cart', {
items: [],
coupon: null,
lastUpdated: null,
});
// Add items to cart
function addToCart(product) {
cart.items.push({
...product,
addedAt: new Date(),
});
cart.lastUpdated = new Date();
}
// Apply coupon
function applyCoupon(code) {
cart.coupon = code;
}
// Cart data persists through navigation but is cleared when
// the browser/tab is closedUsing with Anchor Options
import { session } from '@anchorlib/storage';
// Create session storage with Anchor options
const uiState = session(
'ui-state',
{
sidebarOpen: true,
modalVisible: false,
activeTab: 'home',
},
{
// Enable immutability
immutable: false,
// Enable observation
observable: true,
}
);
// Work with the data
uiState.sidebarOpen = false;
uiState.activeTab = 'profile';Managing Storage Lifecycle
import { session } from '@anchorlib/storage';
// Create session storage
const appState = session('app-session', {
tempData: null,
sessionStart: new Date(),
});
// ... use the storage in your application ...
// When no longer needed, disconnect from sessionStorage synchronization
session.leave(appState);Best Practices
1. Use Cases
Session Storage is ideal for:
- Temporary form data
- UI state that should persist during navigation
- Shopping cart contents
- Wizard progress
- Recently viewed items
// Good use cases
const formDraft = session('form-draft', { title: '', content: '' });
const uiState = session('ui-state', { sidebarOpen: true });
const cart = session('shopping-cart', { items: [] });
// For data that should persist longer, use persistent storage instead
const userPrefs = persistent('user-preferences', { theme: 'light' });2. Naming Conventions
Use descriptive and unique names for your session storage instances:
// Good
const formState = session('contact-form-state@1.0.0', {});
const wizardProgress = session('checkout-wizard@2.1.0', {});
// Avoid
const temp = session('temp', {});
const data = session('data', {});3. Data Size Considerations
While sessionStorage typically has similar limits to localStorage (5-10MB), be mindful of what you store:
// Good - Store temporary UI state
const uiState = session('ui-state', {
modalVisible: false,
activeTab: 'home',
});
// Avoid - Don't store large temporary datasets
const largeTempData = session('temp-data', {
// ... thousands of items ...
});4. Sensitive Data
Avoid storing sensitive information in sessionStorage as it's persisted to disk in some browsers:
// Bad
const auth = session('auth-session', {
token: 'secret123', // Avoid this
});
// Good
const uiPreferences = session('ui-preferences', {
theme: 'dark',
sidebarCollapsed: false,
});5. Memory Management
Disconnect from storage when components are unmounted or no longer needed:
import { session } from '@anchorlib/storage';
class FormComponent {
constructor() {
this.formData = session('form-data', {
name: '',
email: '',
});
}
destroy() {
// Clean up storage connection
session.leave(this.formData);
}
}6. Cross-Tab Considerations
Unlike localStorage, sessionStorage is isolated to each tab. However, Anchor's reactive system still provides benefits:
import { session } from '@anchorlib/storage';
// Each tab will have its own independent session storage
const tabState = session('tab-state', {
lastActive: new Date(),
});
// Changes in one tab won't affect another tabBrowser Compatibility
Session Storage is supported in all modern browsers:
- Chrome 5+
- Firefox 2+
- Safari 4+
- Edge 12+
- Internet Explorer 8+
In environments where sessionStorage is not available, the session storage will gracefully fall back to in-memory storage.
Storage Limits
Most browsers limit sessionStorage to 5-10 MB per origin, similar to localStorage. Be mindful of this limit when designing your storage strategy.