- 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
20 lines
658 B
TypeScript
20 lines
658 B
TypeScript
/** An optimistic-concurrency check failed (stale `expectedVersion` or a lost commit race). */
|
|
export class ConcurrencyError extends Error {
|
|
constructor(
|
|
readonly stream: string,
|
|
readonly expectedVersion: number | 'any',
|
|
readonly actualVersion: number,
|
|
) {
|
|
super(`Concurrency conflict on "${stream}": expected version ${expectedVersion}, actual ${actualVersion}`)
|
|
this.name = 'ConcurrencyError'
|
|
}
|
|
}
|
|
|
|
/** A key argument was passed but is `undefined`/`null`, empty, or not a string/number. */
|
|
export class InvalidKeyError extends TypeError {
|
|
constructor(message: string) {
|
|
super(message)
|
|
this.name = 'InvalidKeyError'
|
|
}
|
|
}
|