Changelog
This page summarizes released versions of the current eventsalsa components. It is intentionally component-oriented so the notes stay aligned with the published libraries rather than the docs site itself.
eventsalsa/store
Section titled “eventsalsa/store”v0.2.0
Section titled “v0.2.0”- Breaking Changes:
- Removed
ConsumerandScopedConsumerinterfaces from the store package (github.com/eventsalsa/store/consumer).
- Removed
v0.1.0
Section titled “v0.1.0”- Breaking Changes:
- Replaced
Aggregateterminology withStreamacross all core types (Event.StreamType,Event.StreamID,PersistedEvent.StreamVersion,Stream), stream reader interfaces (StreamReader.ReadStream), configuration (postgres.WithStreamHeadsTable), migration tables (stream_heads), and CLI tools (eventmap-gen,migrate-gen).
- Replaced
- Features:
- Added declarative PostgreSQL range partitioning on
global_positionfor massive event logs, supporting native pre-allocated partitions and dynamic management withpg_partman(viapg_cron, background workerbgw, or external scheduler).
- Added declarative PostgreSQL range partitioning on
- Improvements:
- Introduced authoritative
stream_headsatomic optimistic concurrency control engine with transaction row-level locking. - Migrated integration test suite to
testcontainers-go. - Upgraded to
github.com/jackc/pgx/v5v5.10.0.
- Introduced authoritative
v0.0.4
Section titled “v0.0.4”- Bug Fixes:
- Fixed non-deterministic switch-case generation in
eventmap-genand formatted generated code with standardgo/format. - Configured automated releases with Release Please.
- Fixed non-deterministic switch-case generation in
v0.0.3
Section titled “v0.0.3”- Fixed JSONB parameter binding compatibility when using pgx’s simple protocol mode, ensuring metadata maps correctly under PgBouncer transaction pooling.
v0.0.2
Section titled “v0.0.2”- Migrated PostgreSQL event store implementation and interface parameters to native
pgx/v5, removing thedatabase/sqldependency.
v0.0.1
Section titled “v0.0.1”- Initial release.
eventsalsa/projector
Section titled “eventsalsa/projector”v0.5.0
Section titled “v0.5.0”- Breaking Changes:
projector.New(db, eventStore, registry, opts...)now accepts a*projector.Registry(built withprojector.NewRegistry()orprojector.FromProjections(...)) instead of a[]projector.Projectionslice.- Added
OnProjectionDegraded(ctx, DegradedStats)andOnPoisonBatchSkipped(ctx, PoisonBatchStats)methods to theObserverinterface (NoopObserverprovides default no-op implementations).
- Features:
- Added support for four projection handler shapes: transactional per-event (
Projection), transactional batch (BatchProjection), detached per-event (DetachedProjection), and detached batch (DetachedBatchProjection), inferred automatically byRegistry.AddandFromProjections. - Added registration-time stream and event type filters (
OnStreamTypes,OnEventTypes) applicable to all four projection shapes. - Added detached phase timeout budgets (
WithDetachedApplyTimeout,WithCheckpointTimeout) so external network I/O never holds PostgreSQL connections or starves post-apply checkpoint writes. - Added explicit error classification (
failure.Retryable,failure.Permanent), per-projection failure policies (FailurePolicyFailFast,FailurePolicyRetry,WithFailurePolicy), and dead-letter poison batch handlers (WithPoisonHandler).
- Added support for four projection handler shapes: transactional per-event (
- Bug Fixes:
- Fixed a race condition on the dedicated leader connection during forced daemon shutdown.
- Isolated the post-apply detached checkpoint transaction into its own timeout budget (
WithCheckpointTimeout).
v0.4.0
Section titled “v0.4.0”- Features:
- Refined lifecycle coordination for seamless
golang.org/x/sync/errgroupintegration:(*Daemon).Start(ctx)returnsnilon graceful context cancellation and non-nil on fatal faults. - Added configurable
WithShutdownTimeout(d)for in-flight batch draining during graceful daemon shutdown before forced cancellation. - Introduced
(*Daemon).IsRunning()and(*Daemon).IsLeader()state inspection methods for liveness, readiness, and monitoring probes.
- Refined lifecycle coordination for seamless
v0.3.0
Section titled “v0.3.0”- Features:
- Introduced pluggable runtime
Observerinterface (OnBatchProcessed,OnHeartbeat,OnGapDetected,OnGapSkipped,OnRebalance) for real-time telemetry, gap tracking, and Prometheus metrics emission without out-of-band database polling. - Added telemetry data structures (
BatchStats,DaemonStats,GapStats) and utility wrappers (NoopObserver,MultiObserver).
- Introduced pluggable runtime
v0.2.0
Section titled “v0.2.0”- Features:
- Introduced canonical
Projectioninterface (Name() string,Handle(ctx context.Context, tx pgx.Tx, event store.PersistedEvent) error). - Added dynamic projection stream and event filtering decorators (
FilterStreamTypes,FilterEventTypes). - Upgraded core dependency to
github.com/eventsalsa/storev0.2.0.
- Introduced canonical
v0.1.0
Section titled “v0.1.0”- Breaking Changes:
- Replaced
Aggregateterminology withStreamacross all projection contracts, event filtering, and persisted event structures. - Upgraded core dependency to
github.com/eventsalsa/storev0.1.0.
- Replaced
- Improvements:
- Migrated integration test suites to
testcontainers-gofor automated ephemeral PostgreSQL container provisioning. - Configured automated release management and versioning with Release Please.
- Migrated integration test suites to
v0.0.3
Section titled “v0.0.3”- Migrated PostgreSQL projector database operations to native
pgx/v5, removing thedatabase/sqlcoupling. - Introduced table-based lease leader election (
projector.LeaderStrategyLease) to support deployments running behind PgBouncer in transaction pooling mode. - Added a cascading delete constraint to the leader election table.
- Added driver-agnostic database serialization failure detection.
- Expanded integration test suite to cover partitioning, reconnection, and leader demotion scenarios.
v0.0.2
Section titled “v0.0.2”- Added
cmd/migrate-gen, a stable CLI entrypoint for generating projector infrastructure migrations. - Documented both the quick CLI flow and the package-level migration API.
v0.0.1
Section titled “v0.0.1”- Initial release.
eventsalsa/encryption
Section titled “eventsalsa/encryption”v0.0.6
Section titled “v0.0.6”- Breaking Changes:
- Replaced
systemkeywith the behavior-basedkekpackage (kek.Wrapper,kek.Rewrapper,kek.Keyring) andkek/local(NewWrapper,NewKeyringFromMap,NewKeyringFromFiles) so Key Encryption Keys never cross interface boundaries as raw byte slices. - Upgraded
cipher.Cipher,cipher/aesgcm, andenvelope.Envelopeto bytes-first AEAD with Additional Authenticated Data (aad []byte) support and mandatoryKeyScope.AAD()binding on all wrapped DEKs. - Updated
(*postgres.Store).CreateKeyand(*postgres.Store).RotateKeyto return(*encryption.EncryptedKey, error)directly via PostgreSQLRETURNING, and renamedpostgres.RewrapSystemKeystopostgres.RewrapKeys. - Refactored the PostgreSQL keystore schema (
001_encryption_keys.sql) to renameencrypted_key→encrypted_dekandsystem_key_id→kek_id, enforce the single-active-key invariant via a partial unique index, and optimize the compositekek_idrewrap index.
- Replaced
- Features:
- Added isolated Go sub-modules for Cloud KMS KEK providers: AWS KMS (
github.com/eventsalsa/encryption/kek/awskms, with server-sidekms:ReEncryptsupport and configurableWithContextKey) and Google Cloud KMS (github.com/eventsalsa/encryption/kek/gcpkms, with end-to-end Castagnoli CRC32C integrity verification). - Introduced
envelope.Session(env.OpenSession(ctx, key)) to unwrap a DEK once and perform multiple in-memory AEAD operations without repeated KMS calls. - Added
kek.CachingKeyring, a concurrency-safe bounded TTL + LRU DEK cache decorator that automatically zeroes cached DEKs on expiration, eviction, invalidation, or close.
- Added isolated Go sub-modules for Cloud KMS KEK providers: AWS KMS (
v0.0.5
Section titled “v0.0.5”- Breaking Changes:
- Decoupled envelope encryption into a pure in-memory cryptographic engine (
envelope.Envelope) with zero database or context dependencies. - Refactored
postgres.Storeinto a stateless key store where all operations accept an explicitpgxconnection (*pgxpool.Pool,pgx.Tx,*pgx.Conn), eliminating stateful context cloning andkeystore.WithTx. - Consolidated DEK lifecycle management directly into
postgres.Store(CreateKey,RotateKey,GetActiveKey,GetKey,RevokeKeys,DestroyKeys,ActiveKeyVersion). - Converted
RewrapSystemKeysinto a standalone administrative function inpostgres. - Removed domain adapter packages (
pii,secret,keymanager,encerr) andencryption.Modulein favor of direct envelope primitives, clean component injection, and root sentinel errors.
- Decoupled envelope encryption into a pure in-memory cryptographic engine (
v0.0.4
Section titled “v0.0.4”- Migrated PostgreSQL keystore implementation and transactional propagation helpers (
keystore.WithTx) to nativepgx/v5, removing dependencies ondatabase/sql.
v0.0.3
Section titled “v0.0.3”- Added the PostgreSQL system-key rewrap API with
(*postgres.Store).RewrapSystemKeysfor re-encrypting stored DEKs from one system key ID to another in short batches. - Added dry-run support and progress counters so operators can preview the migration and track
rewrapped,remaining, and batch counts during execution. - Expanded the README and PostgreSQL test coverage around the recommended rewrap workflow, validation, idempotency, concurrent runs, and historical decryptability after old-key retirement.
v0.0.2
Section titled “v0.0.2”- Added
cmd/migrate-gen, a stable CLI entrypoint for generating or printing the PostgreSQL key-store migration. - Added package helpers in
keystore/postgres/migrationsfor rendering and writing migration SQL with schema and table overrides. - Updated the documentation to cover the CLI-first migration flow and the package-level alternative.
v0.0.1
Section titled “v0.0.1”- Initial release.