- KV: one write primitive, write(changes) with { key, value? }; writeIfAbsent removed.
The server executes exactly what clients send and never reads values, so they can be
encrypted end to end. Adds setFields/getFields on the base class.
- HTTP: no server history or event ids; SSE relays every change (own writes included) and
the client emits resync when a dropped stream reconnects.
- Composite: writes apply locally, then go to the source (undone locally if refused);
pushed changes are applied and announced only where they differ from local values;
offline writes go to a queue store (any KV storage); sync() = replay, diff, replay.
Removes KVReplicaSet, KVOutbox, KeyCounter, SerialQueue and RetryTimer.
- Events: id = <time>_<sha256(time + canonical data)>, so concurrent appends never
collide and retries can't duplicate; no versions or ConcurrencyError.
- Event-sourced documents: read, resolve, append, apply; catchUp folds in foreign events;
getAt takes an event id.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017Qxbkp4tA7G5SCWjzWuxmE
27 lines
832 B
TypeScript
27 lines
832 B
TypeScript
import { bench, describe } from 'vitest'
|
|
import { EventStorageKV } from '../src/event-storage/event-storage-kv.js'
|
|
import { KVStorageInMemory } from '../src/kv-storage/kv-storage-in-memory.js'
|
|
|
|
const events = new EventStorageKV(new KVStorageInMemory())
|
|
const streams = events.child('streams')
|
|
const ids = await streams.append(
|
|
'long',
|
|
Array.from({ length: 10_000 }, (_, i) => ({ i })),
|
|
)
|
|
const middle = ids[5000]
|
|
let s = 0
|
|
|
|
describe('events', () => {
|
|
bench('append 1 event', async () => {
|
|
await streams.append(`s${s++ % 1000}`, [{ type: 'e' }])
|
|
})
|
|
bench('read 100 events from the middle of 10k', async () => {
|
|
for await (const _ of streams.read('long', { after: middle, limit: 100 })) {
|
|
}
|
|
})
|
|
bench('read full 10k-event stream', async () => {
|
|
for await (const _ of streams.read('long')) {
|
|
}
|
|
})
|
|
})
|