Skip to content

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);
});