- BaseKVStorage / BaseEventStorage / BaseDocumentStorage define the API once; implementations provide only raw primitives (client and server share an API) - Drop KV indexes, query planner, unique indexes; document stores take index fields - Escape every char <= '/' so child keys stay contiguous; skip-scan is now simple - Event-sourced documents = event storage + any document store for projections - New folder layout (kv-storage, event-storage, document-storage, utils); tests only in test/ Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Qxbkp4tA7G5SCWjzWuxmE
23 lines
791 B
TypeScript
23 lines
791 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')
|
|
for (let i = 0; i < 10_000; i++) await streams.append('long', [{ i }])
|
|
let s = 0
|
|
|
|
describe('events', () => {
|
|
bench('append 1 event (warm cache)', async () => {
|
|
await streams.append(`s${s++ % 1000}`, [{ type: 'e' }])
|
|
})
|
|
bench('read 100 events from version 5000 of 10k', async () => {
|
|
for await (const _ of streams.read('long', { from: 5000, limit: 100 })) {
|
|
}
|
|
})
|
|
bench('read full 10k-event stream', async () => {
|
|
for await (const _ of streams.read('long')) {
|
|
}
|
|
})
|
|
})
|