feat(event-store-in-memory): InMemoryEventStore implementation of MutableEventStore
ci / JVM build + tests (push) Failing after 1m58s

Первый concrete impl :event-store. ConcurrentLinkedDeque + eviction на
каждом append (amortized O(1) при стабильном размере буфера).

Контракт (по требованию пользователя):
  - maxMessages: Int?  — nullable, NO default (явный null = unlimited)
  - ttl: Duration?      — nullable, NO default (явный null = forever)
  - оба null → store forever
  - любой non-null → соответствующий eviction policy

Eviction:
  - evictExpired(): pollFirst пока head.date < (now - ttl)
  - evictOverCapacity(): pollFirst пока size > maxMessages
  - обе вызываются синхронно на каждом append

Live tail: MutableSharedFlow(capacity=4096, DROP_OLDEST).
Producer никогда не блокируется — slow subscriber получает свежие события,
за полным покрытием — fallback в :message-store-api.

Tests (13):
  - append stores all (both null)
  - maxMessages cap evicts
  - ttl evicts older than threshold
  - both policies apply together (cap=2 + ttl=100ms, a/b/c appends)
  - events(null) replays buffer then collects live
  - events(after) catches up + live
  - earliestEventDate (oldest + empty buffer = now)
  - conversationEvents/agentEvents фильтры (default impl в :event-store)
  - close clears buffer
  - negative maxMessages throws at construction

internal helper snapshot() для тестов — production code использует
events()/events(after) для доступа к буферу.

KMP: jvm + linuxX64 + mingwX64.
This commit is contained in:
2026-09-20 16:30:09 +03:00
parent a05e260457
commit a0b1209457
4 changed files with 399 additions and 0 deletions
+3
View File
@@ -72,6 +72,9 @@ include(":message-store-api")
// (там — MessageStore + ConversationStore). EventStore сам управляет eviction,
// никаких prune-методов наружу. KMP, без implementations пока.
include(":event-store")
// KMP in-memory реализация MutableEventStore. ConcurrentLinkedDeque + TTL/size
// eviction. Для тестов, dev-режима, embedded-сценариев (Android core).
include(":event-store-in-memory")
include(":working-memory-api")
include(":storage-bundle")
include(":storage-inmemory")