Reference Search docs

Runtime ports

A Camp provides the durable substrate app runtimes need. Ports are product surfaces; engines implement them (SQLite storage engine, local runtime, browser runtime, future Postgres/Temporal/… adapters).

Port table

PortResponsibilityDefault notes
EventStoreAppend-only facts, stream read, live subscribe, snapshotsOCC via expectedSeq
DurableEventStore+ positions, commit with staged effects, durable checkpointsSQLite partition
QueueEnqueue / lease / complete; actor signal mappingAt-least-once
StreamerHigh-volume frames outside domain logReplay-then-live fromSeq
ActorHostSingle-writer lease + monotonic fenceTokenFence couples to append
ClockDeterministic time + sleep/cron for replayVirtual in tests

Coupling rules

  1. Aggregates acquire ActorHost leases and pass fenceToken into EventStore append / commit.
  2. Queue / timer / outbox may stage inside the journal transaction when durability is configured; network I/O happens after commit.
  3. Streamer frame bodies are not domain events unless an audit policy opts in.
  4. Clock reads during replay must not inject wall-clock nondeterminism into pure folds.
  5. Yard control plane is not on the Camp data path for live user requests.

Default engine

EngineRole
SQLite storageSchema, migrations, journal semantics
Local runtimeNode EventStore + storage worker
Browser runtimeSQLite WASM + OPFS policy (fail-closed if durable required)
hobo:storage@0.1.0Component-host storage capability

Scale by adding partitions (single active writer each), not multi-writer WAL over shared network filesystems.

Port descriptors

Port descriptors carry WIT-style interface refs and stability (stable | preview | experimental). Apps depend on ports; engines stay swappable behind conformance.

Testing

ConcernPage
CAS, fencing, restartDurable EventStore
Pure decide + conflictsAggregates
Queue/timer/outboxQueue, timer, outbox
Engine swapConformance

EventStore · Queue · Streamer · ActorHost · Clock