Retained Events
FastEvent's message retention feature allows new subscribers to immediately receive the last event data, making it ideal for state management scenarios.
Basic Usage
Trigger and Retain Events
typescript
// Trigger and retain event
emitter.emit('system/status', { online: true }, true);
// Later registered listeners will immediately receive the retained event
emitter.on('system/status', (message) => {
console.log('Current status:', message.payload.online); // true
});
Check Retained Events
typescript
// Check if event is retained
const hasRetained = emitter.hasRetained('system/status');
// Get retained event data
const retained = emitter.getRetained('system/status');
if (retained) {
console.log('Last status:', retained.payload);
}
Type Safety
typescript
interface AppEvents {
'system/status': { online: boolean };
'user/current': { id: string; name: string };
}
const emitter = new FastEvent<AppEvents>();
// Type check passes
emitter.emit('system/status', { online: true }, true);
// Type error
emitter.emit('system/status', { status: 'up' }, true); // ❌
Use Cases
State Synchronization
typescript
// Component A: Update and retain state
emitter.emit('ui/theme', { mode: 'dark' }, true);
// Component B: Get current theme on initialization
emitter.on('ui/theme', (message) => {
applyTheme(message.payload.mode);
});
Configuration Sharing
typescript
// Load config on app startup
loadConfig().then((config) => {
emitter.emit('app/config', config, true);
});
// Any module can access latest config
const currentConfig = emitter.getRetained('app/config');
Cross-Component Communication
typescript
// Retain user data after login
emitter.emit('user/login', userData, true);
// Other components get current user
emitter.on('user/login', (message) => {
renderUserProfile(message.payload);
});
Advanced Usage
Retained Event Lifecycle
typescript
// Clear specific retained event
emitter.clearRetained('system/status');
// Clear all retained events
emitter.clearAllRetained();
Retained Event Change Listeners
typescript
emitter.onRetainedChange('user/current', (message) => {
console.log('Current user changed:', message?.payload);
});