Storage Decision Flow - Visual Guide
Visual diagrams showing how the storage-system makes intelligent adapter decisions
🎨 Storage Decision Flow - Visual Guide
Visual diagrams showing how the storage-system's intelligence works.
🔄 Complete Decision Flow
graph TD
Start[Your Code: storage.put key, value] --> Estimate[Estimate Size]
Estimate --> Size{Size Analysis}
Size -->|"< 8KB"| Small[Small Data]
Size -->|"8-64KB"| Medium[Medium Data]
Size -->|"64-512KB"| Large[Large Data]
Size -->|"> 512KB"| Huge[Huge Data]
Small --> Classify[Classify Key Pattern]
Medium --> Classify
Large --> Classify
Huge --> Classify
Classify --> KeyType{Key Type?}
KeyType -->|"auth/*, session/*"| Critical[Critical Data]
KeyType -->|"user/*, profile/*"| UserPref[User Preference]
KeyType -->|"cache/*"| Cache[Cache Data]
KeyType -->|"temp/*"| Temp[Temporary Data]
KeyType -->|"Other"| Data[General Data]
Critical --> Policy[Policy Engine Decision]
UserPref --> Policy
Cache --> Policy
Temp --> Policy
Data --> Policy
Policy --> Strategy{Strategy?}
Strategy -->|Speed| SpeedPath[Micro-cache + Queued OPFS]
Strategy -->|Balanced| BalancedPath[IndexedDB/OPFS + Smart Cache]
Strategy -->|Durable| DurablePath[Redundant + Immediate Writes]
SpeedPath --> Adaptive[Adaptive Learning]
BalancedPath --> Adaptive
DurablePath --> Adaptive
Adaptive --> Decision[Final Decision]
Decision --> Execute[Execute Storage Operation]
Execute --> Emit[Emit Event with Adapter Info]
Emit --> Listeners[Event Listeners React]
style Start fill:#6366f1,color:#fff
style Decision fill:#10b981,color:#fff
style Adaptive fill:#f59e0b,color:#000
style Emit fill:#8b5cf6,color:#fff
🎯 Size-Based Routing
graph LR
Data[Your Data] --> Analyze[Size Analysis]
Analyze -->|"< 8KB"| Small
Analyze -->|"8-64KB"| Med
Analyze -->|"64-512KB"| Large
Analyze -->|"> 512KB"| Huge
Small[Small<br/>< 8KB] --> IDB1[IndexedDB]
Med[Medium<br/>8-64KB] --> IDB2[IndexedDB]
Large[Large<br/>64-512KB] --> OPFS1[OPFS<br/>+ IDB Index]
Huge[Huge<br/>> 512KB] --> OPFS2[OPFS<br/>+ CAS Dedup]
style Data fill:#6366f1,color:#fff
style Small fill:#10b981,color:#fff
style Med fill:#10b981,color:#fff
style Large fill:#f59e0b,color:#000
style Huge fill:#ef4444,color:#fff
🔑 Key Pattern Classification
graph TD
Key[Storage Key] --> Pattern{Pattern Match?}
Pattern -->|"auth/*<br/>session/*<br/>critical/*"| Crit[Critical]
Pattern -->|"user/*<br/>profile/*<br/>settings/*"| User[User Preference]
Pattern -->|"cache/*<br/>cached/*"| Cache[Cache]
Pattern -->|"temp/*<br/>tmp/*"| Temp[Temporary]
Pattern -->|"Other patterns"| Data[General Data]
Crit --> CritStore[IndexedDB<br/>+ localStorage<br/>+ RAM Cache<br/>Redundant]
User --> UserStore[IndexedDB<br/>+ localStorage if small<br/>+ RAM Cache]
Cache --> CacheStore[IndexedDB Only<br/>+ RAM Cache]
Temp --> TempStore[localStorage Only<br/>+ RAM Cache]
Data --> DataStore[Size-Based<br/>Intelligent Selection]
style Crit fill:#ef4444,color:#fff
style User fill:#f59e0b,color:#000
style Cache fill:#3b82f6,color:#fff
style Temp fill:#8b5cf6,color:#fff
style Data fill:#10b981,color:#fff
🚀 Strategy Impact
graph LR
subgraph Speed Strategy
S1[Small Critical] --> S1A[localStorage<br/>Micro-Cache]
S2[Large Data] --> S2A[OPFS<br/>Queued Write]
end
subgraph Balanced Strategy Default
B1[Small Critical] --> B1A[IndexedDB<br/>+ localStorage]
B2[Large Data] --> B2A[OPFS<br/>Immediate Write]
end
subgraph Durable Strategy
D1[All Critical] --> D1A[Multi-Adapter<br/>Redundant]
D2[All Data] --> D2A[Immediate Writes<br/>+ Verification]
end
style Speed Strategy fill:#f59e0b20
style Balanced Strategy Default fill:#10b98120
style Durable Strategy fill:#3b82f620
📊 Decision Matrix
graph TD
subgraph Input Analysis
I1[Key: 'auth/token']
I2[Size: 500 bytes]
I3[Strategy: balanced]
end
subgraph Classification
C1[Key Type: Critical]
C2[Size Category: Small]
C3[Strategy: Balanced]
end
subgraph Decision
D1[Primary: IndexedDB]
D2[Redundancy: localStorage]
D3[Cache: RAM + Micro]
D4[Priority: Critical]
end
subgraph Execution
E1[Write to IndexedDB]
E2[Mirror to localStorage]
E3[Update RAM cache]
E4[Update Micro-cache]
end
subgraph Event
V1[emit type: 'put']
V2[emit adapter: 'dexie']
V3[emit timestamp: now]
end
I1 --> C1
I2 --> C2
I3 --> C3
C1 --> D1
C2 --> D2
C3 --> D3
D1 --> E1
D2 --> E2
D3 --> E3
D3 --> E4
E1 --> V1
E1 --> V2
E1 --> V3
style I1 fill:#6366f1,color:#fff
style C1 fill:#f59e0b,color:#000
style D1 fill:#10b981,color:#fff
style E1 fill:#8b5cf6,color:#fff
style V2 fill:#ef4444,color:#fff
🧠 Adaptive Learning Loop
graph LR
Op[Operation] --> Record[Record Performance]
Record --> Analyze[Analyze Patterns]
Analyze --> Learn{Optimization<br/>Possible?}
Learn -->|Yes| Promote[Promote to<br/>Faster Storage]
Learn -->|No| Keep[Keep Current]
Promote --> Next[Next Operation]
Keep --> Next
Next --> Faster[Faster Access!]
style Op fill:#6366f1,color:#fff
style Learn fill:#f59e0b,color:#000
style Promote fill:#10b981,color:#fff
style Faster fill:#ef4444,color:#fff
Example: User Profile Optimization
Access 1-10: storage.get('user/profile') → 20ms (IndexedDB)
↓ System learns: "Accessed frequently, < 10KB"
Access 11+: storage.get('user/profile') → 0.3ms (RAM Cache)
✨ Automatic promotion - no code changes!
🎯 Real-World Example Flow
Scenario: Creating a Universe
sequenceDiagram
participant App as Application
participant Storage as GgStorage
participant Policy as Policy Engine
participant Adaptive as Adaptive Engine
participant IDB as IndexedDB
participant Event as Event System
participant Listener as SpaceService
App->>Storage: put('universe_123', universeData)
Storage->>Storage: estimateSize(universeData)
Note over Storage: Size: 3KB
Storage->>Policy: makeDecision(key, size, 'put')
Policy->>Policy: classifyKey('universe_123')
Note over Policy: Type: 'data'
Policy->>Policy: Analyze capabilities
Note over Policy: Has: IndexedDB, OPFS, localStorage
Policy->>Adaptive: Check history for 'universe_123'
Adaptive-->>Policy: No history yet
Policy-->>Storage: Decision: IndexedDB (dexie: 'inline')
Storage->>IDB: write('universe_123', universeData)
IDB-->>Storage: Success
Storage->>Storage: Update RAM cache
Storage->>Event: emit({ type: 'put', key, adapter: 'dexie', timestamp })
Event->>Listener: Event received
Note over Listener: Adapter automatically populated!
Listener->>Listener: handleStorageEvent(eventData)
Note over Listener: No manual adapter logic needed
🏆 Benefits Achieved
✅ Automatic Intelligence
- Data size → Optimal adapter
- Key pattern → Redundancy decision
- Strategy → Performance tuning
- History → Adaptive optimization
✅ Zero Manual Configuration
// ✅ All you write
await storage.put(key, value);
// ✅ System handles
// - Adapter selection
// - Redundancy
// - Caching
// - Learning
// - Events
✅ Self-Optimizing
- Learns access patterns
- Promotes hot data
- Demotes cold data
- Adapts to usage
🎓 Summary
The storage-system is fully autonomous:
- You: Call
storage.put(key, value) - System: Analyzes and decides everything
- Events: Automatically include adapter info
- Listeners: React to events (no manual logic)
Result: Optimal performance without manual optimization!
Created: November 19, 2025 - 12:25 PM
Session ID: 11.25.1.2
Status: ✅ Complete
Impact: Platform-wide optimal storage decisions