Changelog

version 0.7.0 (2025.07.27)

Enhanced PubSub Architecture: Foundation for Event-Driven Architecture

Multi-Channel PubSub System

  • Dedicated PubSub Instances: Implemented three specialized Phoenix.PubSub instances for improved separation of concerns
    • :ex_esdb_events: Primary channel for business event distribution and streaming
    • :ex_esdb_system: Internal system operations, coordination messages, and metrics
    • :ex_esdb_health: Dedicated health monitoring and service availability communications
  • Architectural Foundation: Established infrastructure for transitioning to fully Event-Driven Architecture (EDA)
  • Channel Isolation: Prevents cross-contamination of different message types and improves system reliability

Color-Coded EmitterWorker Observability

  • Visual Message Classification: Implemented comprehensive color-coded logging system for immediate issue identification
    • 🟢 Success Messages (White on Green/Blue): Service activation, health subscriptions, successful operations
    • 🔴 Failure Messages (White on Red): Termination events, errors, unhealthy states
    • 🟡 Action Messages (White on Amber): Broadcasting, forwarding, dynamic worker creation, metrics
    • 🔵 Health Messages (White on Cyan): Health event processing, status changes
  • Enhanced PID Backgrounds: Color-coded process identifiers based on message type for rapid visual debugging
  • BCUtils.ColorFuncs Integration: Leveraged existing color functions for consistent theming across the system

Comprehensive Health and Metrics Monitoring

  • Health Event Logging: Real-time visibility into subscription health status and service availability
    • Health event subscription tracking: 🩺 SUBSCRIBED to health events
    • Individual health events: 📡 HEALTH EVENT: subscription_name -> event_type
    • Health summaries: 📈 HEALTH SUMMARY: Store my_store - 5/7 healthy subscriptions
    • Health impact tracking: 🏥 HEALTH IMPACT: subscription_name is HEALTHY
  • Metrics Event Logging: Performance and operational metrics collection
    • Metrics subscription tracking: 📈 SUBSCRIBED to metrics events
    • Individual metrics: 📈 METRICS EVENT: store -> events_per_second=1250
    • Metrics summaries: 📉 METRICS SUMMARY: 1250 eps, 50000 total, 12 active subs
  • Health-Aware Emission Control: EmitterWorkers can pause/resume emission based on subscription health status

Enhanced EmitterWorker Lifecycle Management

  • Detailed Activation Messages: Comprehensive worker startup information including subscriber details
  • Enhanced Termination Messages: Added subscriber information to termination logs for better debugging
  • Lifecycle Visibility: Complete tracking of worker lifecycle events with structured, color-coded output
  • Subscriber Information: Full visibility into which subscribers are affected by worker state changes

SubscriptionHealthTracker Integration

  • Dedicated Health PubSub: Migrated from :ex_esdb_system to dedicated :ex_esdb_health PubSub instance
  • Health Event Broadcasting: Comprehensive health event distribution to interested subscribers
  • Health Summary Distribution: Periodic health summaries broadcast to monitoring systems
  • Improved Separation: Clean separation between health monitoring and system operations

Technical Implementation

  • Multi-PubSub Architecture: Three specialized PubSub instances for different communication types
  • Enhanced Themes System: Extended ExESDB.Themes with color-coded message functions
    • emitter_worker_success_msg/2, emitter_worker_failure_msg/2
    • emitter_worker_action_msg/2, emitter_worker_health_msg/2
    • Similar functions for emitter_system and emitter_pool components
  • Health-Aware Processing: EmitterWorkers subscribe to both health and metrics events
  • Structured Logging: Consistent, parseable log format with rich visual indicators

Event-Driven Architecture Benefits

  • Separation of Concerns: Dedicated channels prevent message type cross-contamination
  • Enhanced Observability: Real-time visibility into system health, performance, and operations
  • Improved Reliability: Health-aware emission and circuit breaker integration
  • Better Performance: Asynchronous messaging and efficient broadcasting
  • Operational Excellence: Comprehensive monitoring and debugging capabilities

Documentation and Guidelines

  • New Architecture Guide: Comprehensive guides/pubsub_architecture.md documentation
  • Implementation Details: Complete technical implementation and configuration guidance
  • Migration Path: Roadmap for evolving to fully Event-Driven Architecture
  • Best Practices: Topic naming conventions, message structure, and performance considerations
  • Monitoring Guidelines: Health dashboard, performance metrics, and debugging tools

Migration Foundation

  • Phase 1 Complete: Internal events, health/metrics distribution, enhanced observability
  • Phase 2 Prepared: Foundation for business domain events and event sourcing patterns
  • Phase 3 Ready: Infrastructure for external system integration and event streaming

Benefits

  • Unprecedented Observability: Color-coded logging and comprehensive event tracking
  • Enhanced Reliability: Health-aware systems with graceful degradation
  • Improved Performance: Efficient message routing and asynchronous processing
  • Better Developer Experience: Visual debugging aids and structured logging
  • Operational Excellence: Comprehensive monitoring and troubleshooting capabilities
  • Future-Ready Architecture: Solid foundation for full Event-Driven Architecture evolution

version 0.4.9 (2025.07.19)

Comprehensive Debugging and Monitoring System

New Feature: ExESDB.Debugger

  • REPL-friendly debugging tool: Added comprehensive debugging and inspection module for ExESDB systems
  • Real-time system monitoring: Complete visibility into processes, performance, and system health
  • Production-safe operations: All debugging functions are read-only and safe for live systems
  • Auto-discovery capabilities: Automatically detects stores and configuration without manual setup

Core Debugging Functions

  • System Overview: ExESDB.Debugger.overview() - Complete system status at a glance
  • Process Management: ExESDB.Debugger.processes() - List and inspect all ExESDB processes
  • Supervision Tree: ExESDB.Debugger.supervision_tree() - Visual process hierarchy inspection
  • Configuration Analysis: ExESDB.Debugger.config() - Shows current config with sources (env vs app config)
  • Health Monitoring: ExESDB.Debugger.health() - Comprehensive system health validation

Data Investigation Tools

  • Stream Inspection: ExESDB.Debugger.streams() - List all streams in the system
  • Event Browsing: ExESDB.Debugger.events(stream_id, opts) - Browse events within specific streams
  • Subscription Monitoring: ExESDB.Debugger.subscriptions() - Track active subscriptions
  • Emitter Pool Management: ExESDB.Debugger.emitters() - Monitor emitter pools and workers

Performance and Monitoring

  • Performance Metrics: ExESDB.Debugger.performance() - System memory, CPU, uptime statistics
  • Resource Analysis: ExESDB.Debugger.top() - Identify resource-heavy processes
  • Observer Integration: ExESDB.Debugger.observer() - Launch Erlang Observer GUI
  • Memory Tracking: Detailed memory usage analysis across all components

Advanced Debugging Tools

  • Function Tracing: ExESDB.Debugger.trace(module, function) - Trace specific function calls
  • Benchmarking: ExESDB.Debugger.benchmark(fun) - Measure function performance
  • Multi-Store Support: All functions work seamlessly with multiple store configurations
  • Built-in Help System: ExESDB.Debugger.help() - Interactive command reference

Technical Implementation

  • Production-ready: Comprehensive error handling with graceful degradation
  • Rich output formatting: Human-readable output with emojis and structured information
  • Zero configuration: Auto-discovery of stores and system configuration
  • Integration libraries: Added :recon ~> 2.5 dependency for enhanced process inspection

Documentation and Examples

  • Comprehensive guide: New guides/debugging.md with complete usage examples
  • Interactive examples: Built-in help system with real-world usage patterns
  • Development workflow: Step-by-step debugging procedures for common scenarios
  • Production troubleshooting: Safe investigation procedures for live systems

Benefits

  • Faster development: Quickly understand system state and identify issues
  • Enhanced operations: Real-time monitoring and health checking capabilities
  • Better debugging: Trace function calls and analyze performance bottlenecks
  • Learning tool: Visual representation of ExESDB architecture and process relationships
  • Multi-environment: Works in development, testing, and production environments

version 0.3.5 (2025.07.18)

Complete Writer Modernization

Problem Resolution

  • Eliminated remaining fence operations: Completed modernization of all writer components to use asynchronous persistence
  • Consistent performance: All write operations now benefit from the same non-blocking persistence pattern
  • Removed synchronous bottlenecks: No more blocking fence operations throughout the entire system

Updated Components

  • ExESDB.SubscriptionsWriter: Replaced synchronous :khepri.fence(store) with asynchronous ExESDB.PersistenceWorker.request_persistence(store)
  • ExESDB.SnapshotsWriterWorker: Replaced synchronous :khepri.fence(store) with asynchronous ExESDB.PersistenceWorker.request_persistence(store)
  • subscriptions_store.erl: Replaced synchronous khepri:fence(Store) with asynchronous 'Elixir.ExESDB.PersistenceWorker':request_persistence(Store)
  • subscriptions_procs.erl: Replaced synchronous khepri:fence(Store) with asynchronous 'Elixir.ExESDB.PersistenceWorker':request_persistence(Store)
  • streams_procs.erl: Replaced synchronous khepri:fence(Store) with asynchronous 'Elixir.ExESDB.PersistenceWorker':request_persistence(Store)

Technical Implementation

  • Unified persistence pattern: All writers now use the same asynchronous persistence mechanism
  • Elixir-Erlang interoperability: Erlang modules call Elixir PersistenceWorker using proper atom syntax
  • Consistent behavior: All write operations follow the same pattern: immediate memory write + async persistence request
  • Complete fence removal: No synchronous fence operations remain in the writer layer

Benefits

  • System-wide performance: All write operations now complete in milliseconds instead of seconds
  • Eliminated timeout risks: No more 5-second timeout failures across any writer component
  • Consistent user experience: All write operations provide immediate feedback
  • Maintained durability: Data persistence still guaranteed through background worker
  • Reduced complexity: Single persistence mechanism across all writers

version 0.3.4 (2025.07.18)

Asynchronous Persistence System

Problem Resolution

  • Eliminated timeout failures: Resolved 5-second timeout issues in append_events operations that were caused by synchronous fence operations
  • Improved performance: Event append operations now complete in ~10-50ms instead of 5+ seconds
  • Enhanced user experience: System no longer appears unresponsive during data-heavy operations

New Components

  • ExESDB.PersistenceWorker: New GenServer that handles disk persistence operations asynchronously
    • Configurable persistence intervals (default: 5 seconds)
    • Batching of persistence requests for efficiency
    • Non-blocking API for event operations
    • Graceful shutdown with final persistence
    • Comprehensive error handling and logging

Updated Components

  • ExESDB.PersistenceSystem: Enhanced to include PersistenceWorker as a managed component
  • ExESDB.StreamsWriterWorker: Replaced synchronous :khepri.fence(store) with asynchronous ExESDB.PersistenceWorker.request_persistence(store)

New APIs

  • ExESDB.PersistenceWorker.request_persistence(store_id): Non-blocking call to request persistence
  • ExESDB.PersistenceWorker.force_persistence(store_id): Blocking call for immediate persistence (useful for testing)

Configuration Options

  • Global configuration: config :ex_esdb, persistence_interval: 10_000
  • Per-store configuration: opts = [store_id: :my_store, persistence_interval: 5_000]

Technical Implementation

  • Asynchronous persistence: Events are written to memory immediately, persistence happens in background
  • Batching optimization: Multiple persistence requests are deduplicated and processed together
  • Eventual consistency: Data is eventually persisted (within persistence interval)
  • Fault tolerance: System continues operating even if persistence is delayed

Benefits

  • Immediate response: Event append operations return instantly
  • Better throughput: Batched disk operations are more efficient
  • Configurable intervals: Persistence frequency can be tuned per environment
  • Backward compatibility: All existing APIs continue to work unchanged
  • No breaking changes: Optional configuration with sensible defaults

Documentation

  • New guide: Added comprehensive guides/persistence_architecture.md guide
  • Implementation details: Complete architecture overview and migration notes
  • Testing guidance: Instructions for integration tests using force_persistence

version 0.3.3 (2025.07.18)

Data Persistence and Durability Enhancement

Khepri Fence Operations Implementation

  • Enhanced data durability: Added fence operations after all Khepri write operations to ensure data persistence to disk
  • Guaranteed write consistency: All write operations now block until data is committed and persisted through Ra's write-ahead logging
  • Improved reliability: Prevents data loss in case of system crashes or power failures

Updated Components

  • ExESDB.SubscriptionsWriter: Added fence operations after direct :khepri.delete! calls and indirect subscription store operations
  • ExESDB.SnapshotsWriterWorker: Added fence operations after :khepri.delete! and :khepri.put! operations for snapshot management
  • ExESDB.StreamsWriterWorker: Added fence operations after :khepri.put! calls in event recording operations
  • subscriptions_store.erl: Added fence operations after all khepri:put, khepri:update, and khepri:delete operations
  • streams_procs.erl: Added fence operations after khepri:put operations for event procedure registration
  • subscriptions_procs.erl: Added fence operations after khepri:put operations for subscription procedure registration

Technical Implementation

  • Write-through persistence: All write operations now call :khepri.fence(store) immediately after data modification
  • Consistency guarantees: Fence operations ensure that subsequent reads will see the results of all previous writes
  • Durability assurance: Data is guaranteed to be persisted to disk before write operations complete
  • Performance consideration: Fence operations provide strong consistency at the cost of slightly increased write latency

Benefits

  • Data integrity: Eliminates risk of data loss during system failures
  • Consistency guarantees: Ensures all write operations are properly persisted before completion
  • Improved reliability: Provides stronger durability guarantees for critical event store operations
  • Operational confidence: Reduces risk of data corruption in production environments

version 0.3.1 (2025.07.17)

LeaderWorker Registration Fix

Problem Resolution

  • Fixed LeaderWorker registration warnings: Resolved warning messages "LeaderWorker registration issue: expected #PID<...>, got nil"
  • Store-specific registration verification: LeaderWorker now properly verifies its registration using the store-specific name instead of the hardcoded module name
  • Improved logging: Registration confirmation logs now show the actual store-specific process name

Technical Implementation

  • Updated init/1 function: LeaderWorker now extracts store_id from config and uses StoreNaming.genserver_name/2 to determine the expected registration name
  • Correct registration check: Uses Process.whereis(expected_name) instead of Process.whereis(__MODULE__) for verification
  • Enhanced logging: Log messages now show the actual store-specific name used for registration

Benefits

  • Cleaner logs: Eliminates confusing registration warning messages during startup
  • Better debugging: Registration verification now works correctly with store-specific naming
  • Improved reliability: Proper registration verification helps identify actual process registration issues

version 0.3.0 (2025.07.17)

Multiple Stores Naming Conflicts Fix

Problem Resolution

  • Fixed naming conflicts: Resolved already started errors when multiple umbrella applications attempted to start their own ExESDB systems
  • Store isolation: Each store now has its own isolated set of partition supervisors
  • Multi-tenancy support: Different applications can maintain completely separate event stores within the same Elixir node

Updated Components

  • ExESDB.Emitters: Updated start_emitter_pool/3 to use store-specific partition names
  • ExESDB.EmitterSystem: Updated supervisor child spec to use store-specific partition names
  • ExESDB.GatewaySystem: Updated supervisor child spec to use store-specific partition names
  • ExESDB.LeaderWorker: Updated process lookup to use store-specific partition names
  • ExESDB.Snapshots: Updated supervisor child specs to use store-specific partition names
  • ExESDB.SnapshotsReader: Updated start_child/2 to use store-specific partition names
  • ExESDB.SnapshotsWriter: Updated start_child/2 to use store-specific partition names
  • ExESDB.Streams: Updated supervisor child specs to use store-specific partition names
  • ExESDB.StreamsReader: Updated start_child/2 to use store-specific partition names
  • ExESDB.StreamsWriter: Updated start_child/2 to use store-specific partition names

Technical Implementation

  • Store-specific naming: All modules now use ExESDB.StoreNaming.partition_name/2 to generate unique process names
  • Unique process names: Each store gets its own partition supervisors (e.g., :exesdb_streamswriters_store_one, :exesdb_streamswriters_store_two)
  • Backward compatibility: Existing single-store deployments continue to work unchanged
  • Consistent pattern: All partition supervisors follow the same naming convention

Affected Processes

  • ExESDB.StreamsWriters: Now store-specific to prevent conflicts
  • ExESDB.StreamsReaders: Now store-specific to prevent conflicts
  • ExESDB.SnapshotsWriters: Now store-specific to prevent conflicts
  • ExESDB.SnapshotsReaders: Now store-specific to prevent conflicts
  • ExESDB.EmitterPools: Now store-specific to prevent conflicts
  • ExESDB.GatewayWorkers: Now store-specific to prevent conflicts

Benefits

  • True multi-tenancy: Multiple applications can run separate ExESDB systems without conflicts
  • Better isolation: Each store operates independently with its own resources
  • Improved reliability: Eliminates startup failures due to naming conflicts
  • Enhanced scalability: Supports complex umbrella application architectures
  • Maintained compatibility: Zero breaking changes for existing deployments

version 0.1.7 (2025.07.16)

Configuration System Modernization

Legacy Configuration Removal

  • Removed khepri configuration: Eliminated legacy config :ex_esdb, :khepri configuration format
  • Modernized Options module: Updated ExESDB.Options to use umbrella-aware configuration patterns
  • Consistent configuration format: All configurations now use config :your_app_name, :ex_esdb, [options] format
  • Improved isolation: Better configuration isolation between applications in umbrella projects

Configuration Documentation

  • New configuration guide: Added comprehensive guides/configuring_exesdb_apps.md guide
  • Standalone application examples: Complete configuration examples for single-app deployments
  • Umbrella application examples: Detailed examples for multi-app umbrella projects
  • Environment variable documentation: Complete reference for all environment variable overrides
  • Migration guide: Instructions for migrating from legacy khepri configuration

Configuration Features

  • Context management: Enhanced context switching for umbrella applications
  • Explicit context support: Added app_env/3 functions for explicit context usage
  • Context wrapper support: Added with_context/2 for scoped configuration access
  • Libcluster integration: Emphasized libcluster usage over deprecated seed_nodes mechanism

Benefits

  • Better umbrella support: Proper configuration isolation for umbrella applications
  • Clearer configuration patterns: Consistent config :app_name, :ex_esdb format
  • Improved developer experience: Comprehensive documentation and examples
  • Enhanced maintainability: Removed legacy code paths and simplified configuration logic

version 0.1.2 (2025.07.14)

Store Configuration Enhancement

New Environment Variables

  • EX_ESDB_STORE_DESCRIPTION: Human-readable description of the store for documentation and operational purposes
  • EX_ESDB_STORE_TAGS: Comma-separated tags for store categorization and filtering (e.g., "production,cluster,core")

Rich Store Configuration

  • Operational Metadata: Added created_at, version, and status fields to store configuration
  • Resource Management: Added priority and auto_start fields for resource allocation control
  • Administrative Info: Enhanced store registry with tags, environment, and description fields
  • Enhanced Querying: Store registry now supports filtering by tags, environment, priority, and other metadata

Configuration Integration

  • Runtime Configuration: New environment variables integrated into config/runtime.exs
  • Options System: Added parsers in ExESDB.Options with comma-separated tag parsing
  • Store Registry: Enhanced build_store_config/1 to include all new metadata fields
  • Development Environment: Updated dev-env/*.yaml files with new environment variables

Architectural Refactoring

NotificationSystem Introduction

  • New Core Component: Created ExESDB.NotificationSystem as a core supervisor for event notification
  • Leadership Integration: Moved LeaderSystem from clustering layer to core system
  • Core System Enhancement: Updated CoreSystem to include NotificationSystem alongside PersistenceSystem and StoreSystem
  • Supervision Order: PersistenceSystemNotificationSystemStoreSystem for proper dependency management

LeaderWorker Availability Fix

  • Core System Integration: LeaderWorker now starts as part of core system, not clustering components
  • Startup Order: LeaderWorker is available before clustering components attempt to use it
  • Resolved :noproc Error: Fixed LeaderWorker activation failures by ensuring it's always running when needed
  • Single and Cluster Mode: LeaderWorker now available in both single-node and cluster modes

System Architecture Cleanup

  • Removed LeadershipSystem: Consolidated functionality into NotificationSystem
  • Cleaner Separation: Core functionality (leadership, events) vs clustering (coordination, membership)
  • Improved Documentation: Updated supervision tree documentation to reflect new architecture
  • Simplified Dependencies: Reduced coupling between core and clustering components

Process Management Enhancement

Graceful Shutdown Implementation

  • Universal Coverage: All 18 GenServer processes now implement graceful shutdown
  • Terminate Callbacks: Added terminate/2 callbacks to all GenServers for proper cleanup
  • Exit Trapping: Enabled Process.flag(:trap_exit, true) on all GenServers
  • Resource Cleanup: Proper cleanup of Swarm registrations, PubSub subscriptions, and Khepri stores

Enhanced Process Lifecycle

  • Swarm Registration Cleanup: Worker processes properly unregister from Swarm on shutdown
  • PubSub Subscription Cleanup: EventProjector properly unsubscribes from topics
  • Khepri Store Shutdown: Store processes gracefully stop Khepri instances
  • Network Monitoring: NodeMonitor properly disables network monitoring on shutdown

Development Environment

Configuration Updates

  • proc-sup Configuration: Added description "Process Supervisor Event Store" and tags "development,cluster,proc-sup,core"
  • reg-gh Configuration: Added description "Registration System Event Store" and tags "development,cluster,reg-gh,registration"
  • Environment-Specific Tags: Different tags for development vs production environments
  • Consistent Formatting: Standardized environment variable layout across all configuration files

Benefits

Operational Improvements

  • Enhanced Monitoring: Rich store metadata enables better operational visibility
  • Improved Debugging: Store descriptions and tags help identify issues faster
  • Better Resource Management: Priority and auto-start fields enable fine-grained control
  • Cleaner Shutdown: All processes terminate gracefully without resource leaks

Development Experience

  • Clearer Architecture: Separation of core vs clustering concerns
  • Consistent Configuration: Standardized environment variable management
  • Better Testability: Core components can be tested independently of clustering
  • Simplified Debugging: LeaderWorker availability issues resolved

System Reliability

  • Reduced Race Conditions: Proper startup order prevents timing-related failures
  • Resource Leak Prevention: Graceful shutdown prevents resource accumulation
  • Improved Fault Tolerance: Better separation of concerns reduces cascade failures
  • Enhanced Observability: Rich metadata supports better monitoring and alerting

version 0.1.1 (2025.07.13)

StoreRegistry Refactoring

Enhanced Architecture

  • Store Registration Centralization: Moved store registration functionality from StoreCluster to dedicated StoreRegistry module
  • Self-Registration: StoreRegistry now automatically registers its own store during initialization when store_id is provided
  • Simplified StoreCluster: StoreCluster now focuses purely on cluster coordination without store registration concerns

API Integration

  • ExESDBGater.API Integration: list_stores() function now directly calls ExESDB.StoreRegistry.list_stores() instead of maintaining local state
  • Single Source of Truth: Store information is now centralized in StoreRegistry across the entire system
  • Improved Error Handling: Added proper error handling for StoreRegistry calls in GaterAPI

System Integration

  • StoreSystem Supervision: Added StoreRegistry to the StoreSystem supervisor with proper startup order
  • Component Isolation: Each component now has a single, well-defined responsibility
  • Cleaner State Management: Removed redundant store state from multiple components

Benefits

  • Separation of Concerns: Clear boundaries between clustering and registration responsibilities
  • Maintainability: Easier to maintain and reason about store registration logic
  • Testability: Store registration can now be tested in isolation
  • Reduced Coupling: Components are less tightly coupled and more modular

version 0.0.17 (2025.07.01)

Auto-Clustering

  • ExESDB nodes now automatically join the cluster
  • "Split-Brain" scenarios are now mitigated

BCUtils

  • All functionality related to styling is now transferred to the :bc_utils package.
  • Added a Banner after startup.
  • Logger filtering for Swarm and LibCluster noise reduction (via BCUtils.LoggerFilters)

ExESDB Logger Filtering

Features

The ExESDB.LoggerFilters module provides additional log noise reduction specifically for ExESDB's distributed systems components:

  • Ra Consensus Filtering: Reduces Ra heartbeat, append_entries, pre_vote, request_vote, and routine state transition messages while preserving all errors/warnings
  • Khepri Database Filtering: Filters internal Khepri operations (cluster state, store operations) at info/debug levels while maintaining error/warning visibility
  • Enhanced Swarm Filtering: Complements BCUtils filtering with additional ExESDB-specific Swarm noise reduction
  • Enhanced LibCluster Filtering: Complements BCUtils filtering with additional ExESDB-specific cluster formation noise reduction

Benefits

  • Dramatically improves log readability in development and production environments
  • Intelligent filtering preserves all error and warning messages
  • Focused on ExESDB-specific distributed systems infrastructure (Ra, Khepri)
  • Works in conjunction with BCUtils.LoggerFilters for comprehensive noise reduction

ExESDBGater

  • The ExESDB.GatewayAPI is moved to the :ex_esdb_gater package.

Features

Snapshots Subsystem provides cluster wide support for reading and writing snapshots, using a key derived from the source_uuid, stream_uuid and version of the snapshot.

version 0.0.16 (2025.06.26)

Snapshots

Features

Snapshots Subsystem provides cluster wide support for reading and writing snapshots, using a key derived from the source_uuid, stream_uuid and version of the snapshot.

  • record_snapshot/5 function
  • delete_snapshot/4 function
  • read_snapshot/4 function
  • list_snapshots/3 function

Supported by Gateway API

It is advised to use ExESDB.GatewayAPI to access the Snapshots Subsystem.

version 0.0.15 (2025.06.15)

Subscriptions

Transient subscriptions

  • :by_stream, :by_event_type, :by_event_pattern, :by_event_payload
  • Events are forwarded to Phoenix.PubSub for now

Persistent subscriptions

  • :by_stream, with support for replaying from a given version
  • Events are forwarded to a specific subscriber process
  • ack_event/3 function is provided

"Follow-the-Leader"

Emitter processes are automatically started on the leader node, when a new leader is elected.

Gateway API

  • A cluster-wide gateway API is provided
  • is an entry point for all the other modules
  • provides basic High-Availability and Load-Balancing

version 0.0.9-alpha (2025.05.04)

Subscriptions

  • ExESDB.Subscriptions module
  • func_registrations.exs file
  • emitter trigger in khepri now only uses the erlang-native :pg library (process groups)

Skeleton support for Commanded

  • ExESDB.Commanded.Adapter module
  • ExESDB.Commanded.Mapper module

version 0.0.8-alpha

2025.04.13

  • Added ExESDB.EventStore.stream_forward/4 function
  • Added BeamCampus.ColorFuncs module
  • Added ExESDB.Commanded.Adapter module
  • Refactored ExESDB.EventStreamReader and ExESDB.EventStreamWriter modules:
  • Streams are now read and written using the ExESDB.Streams module
  • Removed ExESDB.EventStreamReader module
  • Removed ExESDB.EventStreamWriter module

version 0.0.7-alpha

version 0.0.1-alpha

2025.03.25

  • Initial release