fireproof-storage / fireproof-storage/fireproof

[Architecture] Break circular references between core components

Open
#1,500 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
973
Forks
58
PR merge metrics
No merged PRs in 30d

Description

## Summary

Core components (Ledger, CRDT, Blockstore, Loader) have circular parent references that prevent garbage collection. This causes memory leaks when databases are opened and closed repeatedly.

## Problem

The current architecture has:
- `CRDT` holds reference to `Ledger`
- `Blockstore` holds reference to `CRDT`
- `Loader` holds references to multiple components
- These circular references prevent cleanup when `close()` is called

Repeatedly opening and closing databases causes unbounded memory growth.

## Proposed Solution

1. Define clean interfaces in `core/types/`:
- `ILedger`, `ICRDT`, `IBlockstore`, `ILoader`
2. Extract responsibilities from monolithic `Loader`:
- `BlockLoader` - block loading/caching
- `MetaLoader` - metadata management
- `CompactionManager` - compaction logic
3. Replace parent object references with IDs
4. Create `ComponentRegistry` for service lookup
5. Add event-based communication between components

## Expected Outcomes

- Closing database releases all associated resources
- No references remain to closed database objects
- Components testable in isolation
- Memory stabilizes after 1000 open/close cycles

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.