@powerhousedao/reactor 4.1.0-dev.12 → 4.1.0-dev.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cache/buffer/ring-buffer.d.ts +37 -0
- package/dist/src/cache/buffer/ring-buffer.d.ts.map +1 -0
- package/dist/src/cache/buffer/ring-buffer.js +69 -0
- package/dist/src/cache/buffer/ring-buffer.js.map +1 -0
- package/dist/src/cache/index.d.ts +3 -0
- package/dist/src/cache/index.d.ts.map +1 -0
- package/dist/src/cache/index.js +2 -0
- package/dist/src/cache/index.js.map +1 -0
- package/dist/src/cache/kysely-operation-index.d.ts +13 -0
- package/dist/src/cache/kysely-operation-index.d.ts.map +1 -0
- package/dist/src/cache/kysely-operation-index.js +207 -0
- package/dist/src/cache/kysely-operation-index.js.map +1 -0
- package/dist/src/cache/kysely-write-cache.d.ts +134 -0
- package/dist/src/cache/kysely-write-cache.d.ts.map +1 -0
- package/dist/src/cache/kysely-write-cache.js +375 -0
- package/dist/src/cache/kysely-write-cache.js.map +1 -0
- package/dist/src/cache/lru/lru-tracker.d.ts +15 -0
- package/dist/src/cache/lru/lru-tracker.d.ts.map +1 -0
- package/dist/src/cache/lru/lru-tracker.js +96 -0
- package/dist/src/cache/lru/lru-tracker.js.map +1 -0
- package/dist/src/cache/operation-index-types.d.ts +49 -0
- package/dist/src/cache/operation-index-types.d.ts.map +1 -0
- package/dist/src/cache/operation-index-types.js +4 -0
- package/dist/src/cache/operation-index-types.js.map +1 -0
- package/dist/src/cache/write/interfaces.d.ts +83 -0
- package/dist/src/cache/write/interfaces.d.ts.map +1 -0
- package/dist/src/cache/write/interfaces.js +2 -0
- package/dist/src/cache/write/interfaces.js.map +1 -0
- package/dist/src/cache/write-cache-types.d.ts +42 -0
- package/dist/src/cache/write-cache-types.d.ts.map +1 -0
- package/dist/src/cache/write-cache-types.js +2 -0
- package/dist/src/cache/write-cache-types.js.map +1 -0
- package/dist/src/client/reactor-client.d.ts +103 -0
- package/dist/src/client/reactor-client.d.ts.map +1 -0
- package/dist/src/client/reactor-client.js +184 -0
- package/dist/src/client/reactor-client.js.map +1 -0
- package/dist/src/client/types.d.ts +213 -0
- package/dist/src/client/types.d.ts.map +1 -0
- package/dist/src/client/types.js +14 -0
- package/dist/src/client/types.js.map +1 -0
- package/dist/src/core/builder.d.ts +20 -0
- package/dist/src/core/builder.d.ts.map +1 -0
- package/dist/src/core/builder.js +47 -0
- package/dist/src/core/builder.js.map +1 -0
- package/dist/src/core/reactor-builder.d.ts +37 -0
- package/dist/src/core/reactor-builder.d.ts.map +1 -0
- package/dist/src/core/reactor-builder.js +138 -0
- package/dist/src/core/reactor-builder.js.map +1 -0
- package/dist/src/core/reactor.d.ts +111 -0
- package/dist/src/core/reactor.d.ts.map +1 -0
- package/dist/src/core/reactor.js +952 -0
- package/dist/src/core/reactor.js.map +1 -0
- package/dist/src/core/types.d.ts +183 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +2 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/utils.d.ts +51 -0
- package/dist/src/core/utils.d.ts.map +1 -0
- package/dist/src/core/utils.js +141 -0
- package/dist/src/core/utils.js.map +1 -0
- package/dist/src/events/event-bus.d.ts +3 -3
- package/dist/src/events/event-bus.d.ts.map +1 -1
- package/dist/src/events/event-bus.js.map +1 -1
- package/dist/src/events/interfaces.d.ts +1 -1
- package/dist/src/events/interfaces.d.ts.map +1 -1
- package/dist/src/events/types.d.ts +31 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +7 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/executor/interfaces.d.ts +31 -54
- package/dist/src/executor/interfaces.d.ts.map +1 -1
- package/dist/src/executor/simple-job-executor-manager.d.ts +32 -0
- package/dist/src/executor/simple-job-executor-manager.d.ts.map +1 -0
- package/dist/src/executor/simple-job-executor-manager.js +214 -0
- package/dist/src/executor/simple-job-executor-manager.js.map +1 -0
- package/dist/src/executor/simple-job-executor.d.ts +62 -0
- package/dist/src/executor/simple-job-executor.d.ts.map +1 -0
- package/dist/src/executor/simple-job-executor.js +705 -0
- package/dist/src/executor/simple-job-executor.js.map +1 -0
- package/dist/src/executor/types.d.ts +32 -8
- package/dist/src/executor/types.d.ts.map +1 -1
- package/dist/src/executor/types.js.map +1 -1
- package/dist/src/executor/util.d.ts +65 -0
- package/dist/src/executor/util.d.ts.map +1 -0
- package/dist/src/executor/util.js +154 -0
- package/dist/src/executor/util.js.map +1 -0
- package/dist/src/index.d.ts +35 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +43 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts +16 -0
- package/dist/src/job-tracker/in-memory-job-tracker.d.ts.map +1 -0
- package/dist/src/job-tracker/in-memory-job-tracker.js +84 -0
- package/dist/src/job-tracker/in-memory-job-tracker.js.map +1 -0
- package/dist/src/job-tracker/index.d.ts +3 -0
- package/dist/src/job-tracker/index.d.ts.map +1 -0
- package/dist/src/job-tracker/index.js +2 -0
- package/dist/src/job-tracker/index.js.map +1 -0
- package/dist/src/job-tracker/interfaces.d.ts +42 -0
- package/dist/src/job-tracker/interfaces.d.ts.map +1 -0
- package/dist/src/job-tracker/interfaces.js +2 -0
- package/dist/src/job-tracker/interfaces.js.map +1 -0
- package/dist/src/queue/interfaces.d.ts +46 -5
- package/dist/src/queue/interfaces.d.ts.map +1 -1
- package/dist/src/queue/job-execution-handle.d.ts +25 -0
- package/dist/src/queue/job-execution-handle.d.ts.map +1 -0
- package/dist/src/queue/job-execution-handle.js +62 -0
- package/dist/src/queue/job-execution-handle.js.map +1 -0
- package/dist/src/queue/queue.d.ts +56 -5
- package/dist/src/queue/queue.d.ts.map +1 -1
- package/dist/src/queue/queue.js +284 -36
- package/dist/src/queue/queue.js.map +1 -1
- package/dist/src/queue/types.d.ts +38 -5
- package/dist/src/queue/types.d.ts.map +1 -1
- package/dist/src/queue/types.js +12 -0
- package/dist/src/queue/types.js.map +1 -1
- package/dist/src/read-models/coordinator.d.ts +38 -0
- package/dist/src/read-models/coordinator.d.ts.map +1 -0
- package/dist/src/read-models/coordinator.js +72 -0
- package/dist/src/read-models/coordinator.js.map +1 -0
- package/dist/src/read-models/document-view.d.ts +24 -0
- package/dist/src/read-models/document-view.d.ts.map +1 -0
- package/dist/src/read-models/document-view.js +368 -0
- package/dist/src/read-models/document-view.js.map +1 -0
- package/dist/src/read-models/interfaces.d.ts +29 -0
- package/dist/src/read-models/interfaces.d.ts.map +1 -0
- package/dist/src/read-models/interfaces.js +2 -0
- package/dist/src/read-models/interfaces.js.map +1 -0
- package/dist/src/read-models/types.d.ts +46 -0
- package/dist/src/read-models/types.d.ts.map +1 -0
- package/dist/src/read-models/types.js +2 -0
- package/dist/src/read-models/types.js.map +1 -0
- package/dist/src/registry/implementation.d.ts +62 -0
- package/dist/src/registry/implementation.d.ts.map +1 -0
- package/dist/src/registry/implementation.js +96 -0
- package/dist/src/registry/implementation.js.map +1 -0
- package/dist/src/registry/index.d.ts +3 -0
- package/dist/src/registry/index.d.ts.map +1 -0
- package/dist/src/registry/index.js +2 -0
- package/dist/src/registry/index.js.map +1 -0
- package/dist/src/registry/interfaces.d.ts +39 -0
- package/dist/src/registry/interfaces.d.ts.map +1 -0
- package/dist/src/registry/interfaces.js +2 -0
- package/dist/src/registry/interfaces.js.map +1 -0
- package/dist/src/shared/awaiter.d.ts +32 -0
- package/dist/src/shared/awaiter.d.ts.map +1 -0
- package/dist/src/shared/awaiter.js +132 -0
- package/dist/src/shared/awaiter.js.map +1 -0
- package/dist/src/shared/consistency-tracker.d.ts +48 -0
- package/dist/src/shared/consistency-tracker.d.ts.map +1 -0
- package/dist/src/shared/consistency-tracker.js +123 -0
- package/dist/src/shared/consistency-tracker.js.map +1 -0
- package/dist/src/shared/errors.d.ts +17 -0
- package/dist/src/shared/errors.d.ts.map +1 -0
- package/dist/src/shared/errors.js +33 -0
- package/dist/src/shared/errors.js.map +1 -0
- package/dist/src/shared/factories.d.ts +16 -0
- package/dist/src/shared/factories.d.ts.map +1 -0
- package/dist/src/shared/factories.js +33 -0
- package/dist/src/shared/factories.js.map +1 -0
- package/dist/src/shared/types.d.ts +126 -20
- package/dist/src/shared/types.d.ts.map +1 -1
- package/dist/src/shared/types.js +35 -1
- package/dist/src/shared/types.js.map +1 -1
- package/dist/src/shared/utils.d.ts +3 -0
- package/dist/src/shared/utils.d.ts.map +1 -0
- package/dist/src/shared/utils.js +8 -0
- package/dist/src/shared/utils.js.map +1 -0
- package/dist/src/signer/passthrough-signer.d.ts +6 -0
- package/dist/src/signer/passthrough-signer.d.ts.map +1 -0
- package/dist/src/signer/passthrough-signer.js +6 -0
- package/dist/src/signer/passthrough-signer.js.map +1 -0
- package/dist/src/signer/types.d.ts +15 -0
- package/dist/src/signer/types.d.ts.map +1 -0
- package/dist/src/signer/types.js +2 -0
- package/dist/src/signer/types.js.map +1 -0
- package/dist/src/storage/index.d.ts +4 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +3 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/interfaces.d.ts +335 -0
- package/dist/src/storage/interfaces.d.ts.map +1 -0
- package/dist/src/storage/interfaces.js +19 -0
- package/dist/src/storage/interfaces.js.map +1 -0
- package/dist/src/storage/kysely/document-indexer.d.ts +28 -0
- package/dist/src/storage/kysely/document-indexer.d.ts.map +1 -0
- package/dist/src/storage/kysely/document-indexer.js +350 -0
- package/dist/src/storage/kysely/document-indexer.js.map +1 -0
- package/dist/src/storage/kysely/keyframe-store.d.ts +15 -0
- package/dist/src/storage/kysely/keyframe-store.d.ts.map +1 -0
- package/dist/src/storage/kysely/keyframe-store.js +64 -0
- package/dist/src/storage/kysely/keyframe-store.js.map +1 -0
- package/dist/src/storage/kysely/store.d.ts +15 -0
- package/dist/src/storage/kysely/store.d.ts.map +1 -0
- package/dist/src/storage/kysely/store.js +196 -0
- package/dist/src/storage/kysely/store.js.map +1 -0
- package/dist/src/storage/kysely/sync-cursor-storage.d.ts +13 -0
- package/dist/src/storage/kysely/sync-cursor-storage.d.ts.map +1 -0
- package/dist/src/storage/kysely/sync-cursor-storage.js +93 -0
- package/dist/src/storage/kysely/sync-cursor-storage.js.map +1 -0
- package/dist/src/storage/kysely/sync-remote-storage.d.ts +13 -0
- package/dist/src/storage/kysely/sync-remote-storage.d.ts.map +1 -0
- package/dist/src/storage/kysely/sync-remote-storage.js +134 -0
- package/dist/src/storage/kysely/sync-remote-storage.js.map +1 -0
- package/dist/src/storage/kysely/types.d.ts +135 -0
- package/dist/src/storage/kysely/types.d.ts.map +1 -0
- package/dist/src/storage/kysely/types.js +2 -0
- package/dist/src/storage/kysely/types.js.map +1 -0
- package/dist/src/storage/migrations/001_create_operation_table.d.ts +3 -0
- package/dist/src/storage/migrations/001_create_operation_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/001_create_operation_table.js +40 -0
- package/dist/src/storage/migrations/001_create_operation_table.js.map +1 -0
- package/dist/src/storage/migrations/002_create_keyframe_table.d.ts +3 -0
- package/dist/src/storage/migrations/002_create_keyframe_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/002_create_keyframe_table.js +27 -0
- package/dist/src/storage/migrations/002_create_keyframe_table.js.map +1 -0
- package/dist/src/storage/migrations/003_create_document_table.d.ts +3 -0
- package/dist/src/storage/migrations/003_create_document_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/003_create_document_table.js +10 -0
- package/dist/src/storage/migrations/003_create_document_table.js.map +1 -0
- package/dist/src/storage/migrations/004_create_document_relationship_table.d.ts +3 -0
- package/dist/src/storage/migrations/004_create_document_relationship_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/004_create_document_relationship_table.js +35 -0
- package/dist/src/storage/migrations/004_create_document_relationship_table.js.map +1 -0
- package/dist/src/storage/migrations/005_create_indexer_state_table.d.ts +3 -0
- package/dist/src/storage/migrations/005_create_indexer_state_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/005_create_indexer_state_table.js +10 -0
- package/dist/src/storage/migrations/005_create_indexer_state_table.js.map +1 -0
- package/dist/src/storage/migrations/006_create_document_snapshot_table.d.ts +3 -0
- package/dist/src/storage/migrations/006_create_document_snapshot_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/006_create_document_snapshot_table.js +49 -0
- package/dist/src/storage/migrations/006_create_document_snapshot_table.js.map +1 -0
- package/dist/src/storage/migrations/007_create_slug_mapping_table.d.ts +3 -0
- package/dist/src/storage/migrations/007_create_slug_mapping_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/007_create_slug_mapping_table.js +24 -0
- package/dist/src/storage/migrations/007_create_slug_mapping_table.js.map +1 -0
- package/dist/src/storage/migrations/008_create_view_state_table.d.ts +3 -0
- package/dist/src/storage/migrations/008_create_view_state_table.d.ts.map +1 -0
- package/dist/src/storage/migrations/008_create_view_state_table.js +9 -0
- package/dist/src/storage/migrations/008_create_view_state_table.js.map +1 -0
- package/dist/src/storage/migrations/009_create_operation_index_tables.d.ts +3 -0
- package/dist/src/storage/migrations/009_create_operation_index_tables.d.ts.map +1 -0
- package/dist/src/storage/migrations/009_create_operation_index_tables.js +50 -0
- package/dist/src/storage/migrations/009_create_operation_index_tables.js.map +1 -0
- package/dist/src/storage/migrations/010_create_sync_tables.d.ts +3 -0
- package/dist/src/storage/migrations/010_create_sync_tables.d.ts.map +1 -0
- package/dist/src/storage/migrations/010_create_sync_tables.js +43 -0
- package/dist/src/storage/migrations/010_create_sync_tables.js.map +1 -0
- package/dist/src/storage/migrations/index.d.ts +3 -0
- package/dist/src/storage/migrations/index.d.ts.map +1 -0
- package/dist/src/storage/migrations/index.js +3 -0
- package/dist/src/storage/migrations/index.js.map +1 -0
- package/dist/src/storage/migrations/migrator.d.ts +5 -0
- package/dist/src/storage/migrations/migrator.d.ts.map +1 -0
- package/dist/src/storage/migrations/migrator.js +55 -0
- package/dist/src/storage/migrations/migrator.js.map +1 -0
- package/dist/src/storage/migrations/run-migrations.d.ts +2 -0
- package/dist/src/storage/migrations/run-migrations.d.ts.map +1 -0
- package/dist/src/storage/migrations/run-migrations.js +58 -0
- package/dist/src/storage/migrations/run-migrations.js.map +1 -0
- package/dist/src/storage/migrations/types.d.ts +9 -0
- package/dist/src/storage/migrations/types.d.ts.map +1 -0
- package/dist/src/storage/migrations/types.js +2 -0
- package/dist/src/storage/migrations/types.js.map +1 -0
- package/dist/src/storage/txn.d.ts +15 -0
- package/dist/src/storage/txn.d.ts.map +1 -0
- package/dist/src/storage/txn.js +43 -0
- package/dist/src/storage/txn.js.map +1 -0
- package/dist/src/subs/default-error-handler.d.ts +13 -0
- package/dist/src/subs/default-error-handler.d.ts.map +1 -0
- package/dist/src/subs/default-error-handler.js +27 -0
- package/dist/src/subs/default-error-handler.js.map +1 -0
- package/dist/src/subs/react-subscription-manager.d.ts +45 -0
- package/dist/src/subs/react-subscription-manager.d.ts.map +1 -0
- package/dist/src/subs/react-subscription-manager.js +185 -0
- package/dist/src/subs/react-subscription-manager.js.map +1 -0
- package/dist/src/subs/types.d.ts +64 -0
- package/dist/src/subs/types.d.ts.map +1 -0
- package/dist/src/subs/types.js +2 -0
- package/dist/src/subs/types.js.map +1 -0
- package/dist/src/sync/channels/index.d.ts +3 -0
- package/dist/src/sync/channels/index.d.ts.map +1 -0
- package/dist/src/sync/channels/index.js +3 -0
- package/dist/src/sync/channels/index.js.map +1 -0
- package/dist/src/sync/channels/internal-channel.d.ts +57 -0
- package/dist/src/sync/channels/internal-channel.d.ts.map +1 -0
- package/dist/src/sync/channels/internal-channel.js +106 -0
- package/dist/src/sync/channels/internal-channel.js.map +1 -0
- package/dist/src/sync/channels/utils.d.ts +15 -0
- package/dist/src/sync/channels/utils.d.ts.map +1 -0
- package/dist/src/sync/channels/utils.js +26 -0
- package/dist/src/sync/channels/utils.js.map +1 -0
- package/dist/src/sync/errors.d.ts +10 -0
- package/dist/src/sync/errors.d.ts.map +1 -0
- package/dist/src/sync/errors.js +17 -0
- package/dist/src/sync/errors.js.map +1 -0
- package/dist/src/sync/index.d.ts +12 -0
- package/dist/src/sync/index.d.ts.map +1 -0
- package/dist/src/sync/index.js +9 -0
- package/dist/src/sync/index.js.map +1 -0
- package/dist/src/sync/interfaces.d.ts +150 -0
- package/dist/src/sync/interfaces.d.ts.map +1 -0
- package/dist/src/sync/interfaces.js +2 -0
- package/dist/src/sync/interfaces.js.map +1 -0
- package/dist/src/sync/mailbox.d.ts +21 -0
- package/dist/src/sync/mailbox.d.ts.map +1 -0
- package/dist/src/sync/mailbox.js +59 -0
- package/dist/src/sync/mailbox.js.map +1 -0
- package/dist/src/sync/sync-builder.d.ts +17 -0
- package/dist/src/sync/sync-builder.d.ts.map +1 -0
- package/dist/src/sync/sync-builder.js +29 -0
- package/dist/src/sync/sync-builder.js.map +1 -0
- package/dist/src/sync/sync-manager.d.ts +33 -0
- package/dist/src/sync/sync-manager.d.ts.map +1 -0
- package/dist/src/sync/sync-manager.js +196 -0
- package/dist/src/sync/sync-manager.js.map +1 -0
- package/dist/src/sync/sync-operation.d.ts +28 -0
- package/dist/src/sync/sync-operation.d.ts.map +1 -0
- package/dist/src/sync/sync-operation.js +63 -0
- package/dist/src/sync/sync-operation.js.map +1 -0
- package/dist/src/sync/types.d.ts +61 -0
- package/dist/src/sync/types.d.ts.map +1 -0
- package/dist/src/sync/types.js +16 -0
- package/dist/src/sync/types.js.map +1 -0
- package/dist/src/sync/utils.d.ts +17 -0
- package/dist/src/sync/utils.d.ts.map +1 -0
- package/dist/src/sync/utils.js +34 -0
- package/dist/src/sync/utils.js.map +1 -0
- package/dist/src/utils/reshuffle.d.ts +30 -0
- package/dist/src/utils/reshuffle.d.ts.map +1 -0
- package/dist/src/utils/reshuffle.js +47 -0
- package/dist/src/utils/reshuffle.js.map +1 -0
- package/package.json +23 -7
- package/dist/bench/end-to-end-flow.bench.d.ts +0 -2
- package/dist/bench/end-to-end-flow.bench.d.ts.map +0 -1
- package/dist/bench/end-to-end-flow.bench.js +0 -256
- package/dist/bench/end-to-end-flow.bench.js.map +0 -1
- package/dist/bench/event-bus.bench.d.ts +0 -2
- package/dist/bench/event-bus.bench.d.ts.map +0 -1
- package/dist/bench/event-bus.bench.js +0 -238
- package/dist/bench/event-bus.bench.js.map +0 -1
- package/dist/bench/queue-only.bench.d.ts +0 -2
- package/dist/bench/queue-only.bench.d.ts.map +0 -1
- package/dist/bench/queue-only.bench.js +0 -40
- package/dist/bench/queue-only.bench.js.map +0 -1
- package/dist/bench/reactor-throughput.bench.d.ts +0 -2
- package/dist/bench/reactor-throughput.bench.d.ts.map +0 -1
- package/dist/bench/reactor-throughput.bench.js +0 -137
- package/dist/bench/reactor-throughput.bench.js.map +0 -1
- package/dist/src/executor/job-executor.d.ts +0 -62
- package/dist/src/executor/job-executor.d.ts.map +0 -1
- package/dist/src/executor/job-executor.js +0 -325
- package/dist/src/executor/job-executor.js.map +0 -1
- package/dist/test/event-bus.test.d.ts +0 -2
- package/dist/test/event-bus.test.d.ts.map +0 -1
- package/dist/test/event-bus.test.js +0 -532
- package/dist/test/event-bus.test.js.map +0 -1
- package/dist/test/job-executor.test.d.ts +0 -2
- package/dist/test/job-executor.test.d.ts.map +0 -1
- package/dist/test/job-executor.test.js +0 -581
- package/dist/test/job-executor.test.js.map +0 -1
- package/dist/test/queue.test.d.ts +0 -2
- package/dist/test/queue.test.d.ts.map +0 -1
- package/dist/test/queue.test.js +0 -396
- package/dist/test/queue.test.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RingBuffer is a generic circular buffer implementation that stores a fixed number
|
|
3
|
+
* of items. When the buffer is full, new items overwrite the oldest items.
|
|
4
|
+
*
|
|
5
|
+
* This implementation maintains O(1) time complexity for push operations and provides
|
|
6
|
+
* items in chronological order (oldest to newest) via getAll().
|
|
7
|
+
*
|
|
8
|
+
* @template T - The type of items stored in the buffer
|
|
9
|
+
*/
|
|
10
|
+
export declare class RingBuffer<T> {
|
|
11
|
+
private buffer;
|
|
12
|
+
private head;
|
|
13
|
+
private size;
|
|
14
|
+
private capacity;
|
|
15
|
+
constructor(capacity: number);
|
|
16
|
+
/**
|
|
17
|
+
* Adds an item to the buffer. If the buffer is full, overwrites the oldest item.
|
|
18
|
+
*
|
|
19
|
+
* @param item - The item to add
|
|
20
|
+
*/
|
|
21
|
+
push(item: T): void;
|
|
22
|
+
/**
|
|
23
|
+
* Returns all items in the buffer in chronological order (oldest to newest).
|
|
24
|
+
*
|
|
25
|
+
* @returns Array of items in insertion order
|
|
26
|
+
*/
|
|
27
|
+
getAll(): T[];
|
|
28
|
+
/**
|
|
29
|
+
* Clears all items from the buffer.
|
|
30
|
+
*/
|
|
31
|
+
clear(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Gets the current number of items in the buffer.
|
|
34
|
+
*/
|
|
35
|
+
get length(): number;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=ring-buffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-buffer.d.ts","sourceRoot":"","sources":["../../../../src/cache/buffer/ring-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAQ5B;;;;OAIG;IACH,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAYnB;;;;OAIG;IACH,MAAM,IAAI,CAAC,EAAE;IAab;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RingBuffer is a generic circular buffer implementation that stores a fixed number
|
|
3
|
+
* of items. When the buffer is full, new items overwrite the oldest items.
|
|
4
|
+
*
|
|
5
|
+
* This implementation maintains O(1) time complexity for push operations and provides
|
|
6
|
+
* items in chronological order (oldest to newest) via getAll().
|
|
7
|
+
*
|
|
8
|
+
* @template T - The type of items stored in the buffer
|
|
9
|
+
*/
|
|
10
|
+
export class RingBuffer {
|
|
11
|
+
buffer;
|
|
12
|
+
head = 0;
|
|
13
|
+
size = 0;
|
|
14
|
+
capacity;
|
|
15
|
+
constructor(capacity) {
|
|
16
|
+
if (capacity <= 0) {
|
|
17
|
+
throw new Error("Ring buffer capacity must be greater than 0");
|
|
18
|
+
}
|
|
19
|
+
this.capacity = capacity;
|
|
20
|
+
this.buffer = new Array(capacity);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Adds an item to the buffer. If the buffer is full, overwrites the oldest item.
|
|
24
|
+
*
|
|
25
|
+
* @param item - The item to add
|
|
26
|
+
*/
|
|
27
|
+
push(item) {
|
|
28
|
+
const index = (this.head + this.size) % this.capacity;
|
|
29
|
+
if (this.size < this.capacity) {
|
|
30
|
+
this.buffer[index] = item;
|
|
31
|
+
this.size++;
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
this.buffer[this.head] = item;
|
|
35
|
+
this.head = (this.head + 1) % this.capacity;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Returns all items in the buffer in chronological order (oldest to newest).
|
|
40
|
+
*
|
|
41
|
+
* @returns Array of items in insertion order
|
|
42
|
+
*/
|
|
43
|
+
getAll() {
|
|
44
|
+
if (this.size === 0) {
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const result = [];
|
|
48
|
+
for (let i = 0; i < this.size; i++) {
|
|
49
|
+
const index = (this.head + i) % this.capacity;
|
|
50
|
+
result.push(this.buffer[index]);
|
|
51
|
+
}
|
|
52
|
+
return result;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clears all items from the buffer.
|
|
56
|
+
*/
|
|
57
|
+
clear() {
|
|
58
|
+
this.buffer = new Array(this.capacity);
|
|
59
|
+
this.head = 0;
|
|
60
|
+
this.size = 0;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Gets the current number of items in the buffer.
|
|
64
|
+
*/
|
|
65
|
+
get length() {
|
|
66
|
+
return this.size;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=ring-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-buffer.js","sourceRoot":"","sources":["../../../../src/cache/buffer/ring-buffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,CAAM;IACZ,IAAI,GAAW,CAAC,CAAC;IACjB,IAAI,GAAW,CAAC,CAAC;IACjB,QAAQ,CAAS;IAEzB,YAAY,QAAgB;QAC1B,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAI,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,IAAO;QACV,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEtD,IAAI,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;YAC9B,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,MAAM;QACJ,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC9C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAI,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cache/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import type { PagedResults, PagingOptions, ViewFilter } from "../storage/interfaces.js";
|
|
3
|
+
import type { Database } from "../storage/kysely/types.js";
|
|
4
|
+
import type { IOperationIndex, IOperationIndexTxn, OperationIndexEntry } from "./operation-index-types.js";
|
|
5
|
+
export declare class KyselyOperationIndex implements IOperationIndex {
|
|
6
|
+
private db;
|
|
7
|
+
constructor(db: Kysely<Database>);
|
|
8
|
+
start(): IOperationIndexTxn;
|
|
9
|
+
commit(txn: IOperationIndexTxn, signal?: AbortSignal): Promise<void>;
|
|
10
|
+
find(collectionId: string, cursor?: number, view?: ViewFilter, paging?: PagingOptions, signal?: AbortSignal): Promise<PagedResults<OperationIndexEntry>>;
|
|
11
|
+
private rowToOperationIndexEntry;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=kysely-operation-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely-operation-index.d.ts","sourceRoot":"","sources":["../../../src/cache/kysely-operation-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACX,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAGV,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,4BAA4B,CAAC;AAsEpC,qBAAa,oBAAqB,YAAW,eAAe;IAC9C,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,MAAM,CAAC,QAAQ,CAAC;IAExC,KAAK,IAAI,kBAAkB;IAIrB,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyGpE,IAAI,CACR,YAAY,EAAE,MAAM,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,IAAI,CAAC,EAAE,UAAU,EACjB,MAAM,CAAC,EAAE,aAAa,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;IA4D7C,OAAO,CAAC,wBAAwB;CAiBjC"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { sql } from "kysely";
|
|
2
|
+
class KyselyOperationIndexTxn {
|
|
3
|
+
collections = [];
|
|
4
|
+
collectionMemberships = [];
|
|
5
|
+
collectionRemovals = [];
|
|
6
|
+
operations = [];
|
|
7
|
+
createCollection(collectionId) {
|
|
8
|
+
this.collections.push(collectionId);
|
|
9
|
+
}
|
|
10
|
+
addToCollection(collectionId, documentId) {
|
|
11
|
+
const lastOpIndex = this.operations.length - 1;
|
|
12
|
+
if (lastOpIndex < 0) {
|
|
13
|
+
throw new Error("addToCollection must be called after write() - no operations in transaction");
|
|
14
|
+
}
|
|
15
|
+
this.collectionMemberships.push({
|
|
16
|
+
collectionId,
|
|
17
|
+
documentId,
|
|
18
|
+
operationIndex: lastOpIndex,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
removeFromCollection(collectionId, documentId) {
|
|
22
|
+
const lastOpIndex = this.operations.length - 1;
|
|
23
|
+
if (lastOpIndex < 0) {
|
|
24
|
+
throw new Error("removeFromCollection must be called after write() - no operations in transaction");
|
|
25
|
+
}
|
|
26
|
+
this.collectionRemovals.push({
|
|
27
|
+
collectionId,
|
|
28
|
+
documentId,
|
|
29
|
+
operationIndex: lastOpIndex,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
write(operations) {
|
|
33
|
+
this.operations.push(...operations);
|
|
34
|
+
}
|
|
35
|
+
getCollections() {
|
|
36
|
+
return this.collections;
|
|
37
|
+
}
|
|
38
|
+
getCollectionMemberships() {
|
|
39
|
+
return this.collectionMemberships;
|
|
40
|
+
}
|
|
41
|
+
getCollectionRemovals() {
|
|
42
|
+
return this.collectionRemovals;
|
|
43
|
+
}
|
|
44
|
+
getOperations() {
|
|
45
|
+
return this.operations;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export class KyselyOperationIndex {
|
|
49
|
+
db;
|
|
50
|
+
constructor(db) {
|
|
51
|
+
this.db = db;
|
|
52
|
+
}
|
|
53
|
+
start() {
|
|
54
|
+
return new KyselyOperationIndexTxn();
|
|
55
|
+
}
|
|
56
|
+
async commit(txn, signal) {
|
|
57
|
+
if (signal?.aborted) {
|
|
58
|
+
throw new Error("Operation aborted");
|
|
59
|
+
}
|
|
60
|
+
const kyselyTxn = txn;
|
|
61
|
+
const collections = kyselyTxn.getCollections();
|
|
62
|
+
const memberships = kyselyTxn.getCollectionMemberships();
|
|
63
|
+
const removals = kyselyTxn.getCollectionRemovals();
|
|
64
|
+
const operations = kyselyTxn.getOperations();
|
|
65
|
+
await this.db.transaction().execute(async (trx) => {
|
|
66
|
+
if (collections.length > 0) {
|
|
67
|
+
const collectionRows = collections.map((collectionId) => ({
|
|
68
|
+
documentId: collectionId,
|
|
69
|
+
collectionId,
|
|
70
|
+
joinedOrdinal: BigInt(0),
|
|
71
|
+
leftOrdinal: null,
|
|
72
|
+
}));
|
|
73
|
+
await trx
|
|
74
|
+
.insertInto("document_collections")
|
|
75
|
+
.values(collectionRows)
|
|
76
|
+
.onConflict((oc) => oc.doNothing())
|
|
77
|
+
.execute();
|
|
78
|
+
}
|
|
79
|
+
let operationOrdinals = [];
|
|
80
|
+
if (operations.length > 0) {
|
|
81
|
+
const operationRows = operations.map((op) => {
|
|
82
|
+
const timestamp = op.timestampUtcMs;
|
|
83
|
+
let timestampMs;
|
|
84
|
+
if (/^\d+$/.test(timestamp)) {
|
|
85
|
+
timestampMs = Number(timestamp);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
timestampMs = new Date(timestamp).getTime();
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
opId: op.id || "",
|
|
92
|
+
documentId: op.documentId,
|
|
93
|
+
documentType: op.documentType,
|
|
94
|
+
scope: op.scope,
|
|
95
|
+
branch: op.branch,
|
|
96
|
+
timestampUtcMs: BigInt(timestampMs || 0),
|
|
97
|
+
index: op.index,
|
|
98
|
+
skip: op.skip,
|
|
99
|
+
hash: op.hash,
|
|
100
|
+
action: op.action,
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
const insertedOps = await trx
|
|
104
|
+
.insertInto("operation_index_operations")
|
|
105
|
+
.values(operationRows)
|
|
106
|
+
.returning("ordinal")
|
|
107
|
+
.execute();
|
|
108
|
+
operationOrdinals = insertedOps.map((row) => row.ordinal);
|
|
109
|
+
}
|
|
110
|
+
if (memberships.length > 0) {
|
|
111
|
+
for (const m of memberships) {
|
|
112
|
+
// this is guaranteed to be defined because we enforce in KyselyOperationIndexTxn
|
|
113
|
+
const ordinal = operationOrdinals[m.operationIndex];
|
|
114
|
+
await trx
|
|
115
|
+
.insertInto("document_collections")
|
|
116
|
+
.values({
|
|
117
|
+
documentId: m.documentId,
|
|
118
|
+
collectionId: m.collectionId,
|
|
119
|
+
joinedOrdinal: BigInt(ordinal),
|
|
120
|
+
leftOrdinal: null,
|
|
121
|
+
})
|
|
122
|
+
.onConflict((oc) => oc.columns(["documentId", "collectionId"]).doUpdateSet({
|
|
123
|
+
joinedOrdinal: BigInt(ordinal),
|
|
124
|
+
leftOrdinal: null,
|
|
125
|
+
}))
|
|
126
|
+
.execute();
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (removals.length > 0) {
|
|
130
|
+
for (const r of removals) {
|
|
131
|
+
// this is guaranteed to be defined because we enforce in KyselyOperationIndexTxn
|
|
132
|
+
const ordinal = operationOrdinals[r.operationIndex];
|
|
133
|
+
await trx
|
|
134
|
+
.updateTable("document_collections")
|
|
135
|
+
.set({
|
|
136
|
+
leftOrdinal: BigInt(ordinal),
|
|
137
|
+
})
|
|
138
|
+
.where("collectionId", "=", r.collectionId)
|
|
139
|
+
.where("documentId", "=", r.documentId)
|
|
140
|
+
.where("leftOrdinal", "is", null)
|
|
141
|
+
.execute();
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
async find(collectionId, cursor, view, paging, signal) {
|
|
147
|
+
if (signal?.aborted) {
|
|
148
|
+
throw new Error("Operation aborted");
|
|
149
|
+
}
|
|
150
|
+
let query = this.db
|
|
151
|
+
.selectFrom("operation_index_operations as oi")
|
|
152
|
+
.innerJoin("document_collections as dc", "oi.documentId", "dc.documentId")
|
|
153
|
+
.selectAll("oi")
|
|
154
|
+
.select(["dc.documentId", "dc.collectionId"])
|
|
155
|
+
.where("dc.collectionId", "=", collectionId)
|
|
156
|
+
.whereRef("oi.ordinal", ">=", "dc.joinedOrdinal")
|
|
157
|
+
.where(sql `dc."leftOrdinal" IS NULL OR oi.ordinal < dc."leftOrdinal"`)
|
|
158
|
+
.orderBy("oi.ordinal", "asc");
|
|
159
|
+
if (cursor !== undefined) {
|
|
160
|
+
query = query.where("oi.ordinal", ">", cursor);
|
|
161
|
+
}
|
|
162
|
+
if (view?.branch) {
|
|
163
|
+
query = query.where("oi.branch", "=", view.branch);
|
|
164
|
+
}
|
|
165
|
+
if (view?.scopes && view.scopes.length > 0) {
|
|
166
|
+
query = query.where("oi.scope", "in", view.scopes);
|
|
167
|
+
}
|
|
168
|
+
if (paging?.cursor) {
|
|
169
|
+
const cursorOrdinal = Number.parseInt(paging.cursor, 10);
|
|
170
|
+
query = query.where("oi.ordinal", ">", cursorOrdinal);
|
|
171
|
+
}
|
|
172
|
+
if (paging?.limit) {
|
|
173
|
+
query = query.limit(paging.limit + 1);
|
|
174
|
+
}
|
|
175
|
+
const rows = await query.execute();
|
|
176
|
+
let hasMore = false;
|
|
177
|
+
let items = rows;
|
|
178
|
+
if (paging?.limit && rows.length > paging.limit) {
|
|
179
|
+
hasMore = true;
|
|
180
|
+
items = rows.slice(0, paging.limit);
|
|
181
|
+
}
|
|
182
|
+
const nextCursor = hasMore && items.length > 0
|
|
183
|
+
? items[items.length - 1].ordinal.toString()
|
|
184
|
+
: undefined;
|
|
185
|
+
return {
|
|
186
|
+
items: items.map((row) => this.rowToOperationIndexEntry(row)),
|
|
187
|
+
nextCursor,
|
|
188
|
+
hasMore,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
rowToOperationIndexEntry(row) {
|
|
192
|
+
return {
|
|
193
|
+
ordinal: row.ordinal,
|
|
194
|
+
documentId: row.documentId,
|
|
195
|
+
documentType: row.documentType,
|
|
196
|
+
branch: row.branch,
|
|
197
|
+
scope: row.scope,
|
|
198
|
+
index: row.index,
|
|
199
|
+
timestampUtcMs: row.timestampUtcMs.toString(),
|
|
200
|
+
hash: row.hash,
|
|
201
|
+
skip: row.skip,
|
|
202
|
+
action: row.action,
|
|
203
|
+
id: row.opId,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=kysely-operation-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely-operation-index.js","sourceRoot":"","sources":["../../../src/cache/kysely-operation-index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import type { PHDocument } from "document-model";
|
|
2
|
+
import type { IDocumentModelRegistry } from "../registry/interfaces.js";
|
|
3
|
+
import type { IKeyframeStore, IOperationStore } from "../storage/interfaces.js";
|
|
4
|
+
import { RingBuffer } from "./buffer/ring-buffer.js";
|
|
5
|
+
import type { CachedSnapshot, WriteCacheConfig } from "./write-cache-types.js";
|
|
6
|
+
import type { IWriteCache } from "./write/interfaces.js";
|
|
7
|
+
type DocumentStream = {
|
|
8
|
+
key: string;
|
|
9
|
+
ringBuffer: RingBuffer<CachedSnapshot>;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* In-memory write cache with keyframe persistence for PHDocuments.
|
|
13
|
+
*
|
|
14
|
+
* Caches document snapshots in ring buffers with LRU eviction. On cache miss,
|
|
15
|
+
* rebuilds documents from nearest keyframe or full operation history.
|
|
16
|
+
*
|
|
17
|
+
* **Performance Characteristics:**
|
|
18
|
+
* - Cache hit: O(1) lookup in ring buffer
|
|
19
|
+
* - Cold miss: O(n) where n is total operation count, or O(k) where k is operations since keyframe
|
|
20
|
+
* - Warm miss: O(m) where m is operations since cached revision
|
|
21
|
+
* - Eviction: O(1) for LRU tracking and removal
|
|
22
|
+
*
|
|
23
|
+
* **Thread Safety:**
|
|
24
|
+
* Not thread-safe. Designed for single-threaded job executor environment.
|
|
25
|
+
* External synchronization required for concurrent access across multiple executors.
|
|
26
|
+
*
|
|
27
|
+
* **Example:**
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const cache = new KyselyWriteCache(
|
|
30
|
+
* keyframeStore,
|
|
31
|
+
* operationStore,
|
|
32
|
+
* registry,
|
|
33
|
+
* { maxDocuments: 1000, ringBufferSize: 10, keyframeInterval: 10 }
|
|
34
|
+
* );
|
|
35
|
+
*
|
|
36
|
+
* await cache.startup();
|
|
37
|
+
*
|
|
38
|
+
* // Retrieve or rebuild document
|
|
39
|
+
* const doc = await cache.getState(docId, docType, scope, branch, revision);
|
|
40
|
+
*
|
|
41
|
+
* // Cache result after job execution
|
|
42
|
+
* cache.putState(docId, docType, scope, branch, newRevision, updatedDoc);
|
|
43
|
+
*
|
|
44
|
+
* await cache.shutdown();
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class KyselyWriteCache implements IWriteCache {
|
|
48
|
+
private streams;
|
|
49
|
+
private lruTracker;
|
|
50
|
+
private keyframeStore;
|
|
51
|
+
private operationStore;
|
|
52
|
+
private registry;
|
|
53
|
+
private config;
|
|
54
|
+
constructor(keyframeStore: IKeyframeStore, operationStore: IOperationStore, registry: IDocumentModelRegistry, config: WriteCacheConfig);
|
|
55
|
+
/**
|
|
56
|
+
* Initializes the write cache.
|
|
57
|
+
* Currently a no-op as keyframe store lifecycle is managed externally.
|
|
58
|
+
*/
|
|
59
|
+
startup(): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* Shuts down the write cache.
|
|
62
|
+
* Currently a no-op as keyframe store lifecycle is managed externally.
|
|
63
|
+
*/
|
|
64
|
+
shutdown(): Promise<void>;
|
|
65
|
+
/**
|
|
66
|
+
* Retrieves document state at a specific revision from cache or rebuilds it.
|
|
67
|
+
*
|
|
68
|
+
* Cache hit path: Returns cached snapshot if available (O(1))
|
|
69
|
+
* Warm miss path: Rebuilds from cached base revision + incremental ops
|
|
70
|
+
* Cold miss path: Rebuilds from keyframe or from scratch using all operations
|
|
71
|
+
*
|
|
72
|
+
* @param documentId - The document identifier
|
|
73
|
+
* @param scope - The operation scope
|
|
74
|
+
* @param branch - The operation branch
|
|
75
|
+
* @param targetRevision - The target revision, or undefined for newest
|
|
76
|
+
* @param signal - Optional abort signal to cancel the operation
|
|
77
|
+
* @returns The document at the target revision
|
|
78
|
+
* @throws {Error} "Operation aborted" if signal is aborted
|
|
79
|
+
* @throws {ModuleNotFoundError} If document type not registered in registry
|
|
80
|
+
* @throws {Error} "Failed to rebuild document" if operation store fails
|
|
81
|
+
* @throws {Error} If reducer throws during operation application
|
|
82
|
+
* @throws {Error} If document serialization fails
|
|
83
|
+
*/
|
|
84
|
+
getState(documentId: string, scope: string, branch: string, targetRevision?: number, signal?: AbortSignal): Promise<PHDocument>;
|
|
85
|
+
/**
|
|
86
|
+
* Stores a document snapshot in the cache at a specific revision.
|
|
87
|
+
*
|
|
88
|
+
* Stores the document reference as-is. Callers must avoid mutating cached
|
|
89
|
+
* snapshots if they need to preserve historical revisions.
|
|
90
|
+
* Updates LRU tracker and may evict least recently used stream if at capacity.
|
|
91
|
+
* Asynchronously persists keyframes at configured intervals (fire-and-forget).
|
|
92
|
+
*
|
|
93
|
+
* @param documentId - The document identifier
|
|
94
|
+
* @param scope - The operation scope
|
|
95
|
+
* @param branch - The operation branch
|
|
96
|
+
* @param revision - The revision number
|
|
97
|
+
* @param document - The document to cache
|
|
98
|
+
* @throws {Error} If document serialization fails
|
|
99
|
+
*/
|
|
100
|
+
putState(documentId: string, scope: string, branch: string, revision: number, document: PHDocument): void;
|
|
101
|
+
/**
|
|
102
|
+
* Invalidates cached document streams.
|
|
103
|
+
*
|
|
104
|
+
* Supports three invalidation scopes:
|
|
105
|
+
* - Document-level: invalidate(documentId) - removes all streams for document
|
|
106
|
+
* - Scope-level: invalidate(documentId, scope) - removes all branches for scope
|
|
107
|
+
* - Stream-level: invalidate(documentId, scope, branch) - removes specific stream
|
|
108
|
+
*
|
|
109
|
+
* @param documentId - The document identifier
|
|
110
|
+
* @param scope - Optional scope to narrow invalidation
|
|
111
|
+
* @param branch - Optional branch to narrow invalidation (requires scope)
|
|
112
|
+
* @returns The number of streams evicted
|
|
113
|
+
*/
|
|
114
|
+
invalidate(documentId: string, scope?: string, branch?: string): number;
|
|
115
|
+
/**
|
|
116
|
+
* Clears the entire cache, removing all cached document streams.
|
|
117
|
+
* Resets LRU tracking state. This operation always succeeds.
|
|
118
|
+
*/
|
|
119
|
+
clear(): void;
|
|
120
|
+
/**
|
|
121
|
+
* Retrieves a specific stream for a document. Exposed on the implementation
|
|
122
|
+
* for testing, but not on the interface.
|
|
123
|
+
*/
|
|
124
|
+
getStream(documentId: string, scope: string, branch: string): DocumentStream | undefined;
|
|
125
|
+
private findNearestKeyframe;
|
|
126
|
+
private coldMissRebuild;
|
|
127
|
+
private warmMissRebuild;
|
|
128
|
+
private findNearestOlderSnapshot;
|
|
129
|
+
private makeStreamKey;
|
|
130
|
+
private getOrCreateStream;
|
|
131
|
+
private isKeyframeRevision;
|
|
132
|
+
}
|
|
133
|
+
export {};
|
|
134
|
+
//# sourceMappingURL=kysely-write-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely-write-cache.d.ts","sourceRoot":"","sources":["../../../src/cache/kysely-write-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAMvE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEzD,KAAK,cAAc,GAAG;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;CACxC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,gBAAiB,YAAW,WAAW;IAClD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,aAAa,CAAiB;IACtC,OAAO,CAAC,cAAc,CAAkB;IACxC,OAAO,CAAC,QAAQ,CAAyB;IACzC,OAAO,CAAC,MAAM,CAA6B;gBAGzC,aAAa,EAAE,cAAc,EAC7B,cAAc,EAAE,eAAe,EAC/B,QAAQ,EAAE,sBAAsB,EAChC,MAAM,EAAE,gBAAgB;IAc1B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAI/B;;;;;;;;;;;;;;;;;;OAkBG;IACG,QAAQ,CACZ,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,EACvB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC;IAiEtB;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CACN,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,UAAU,GACnB,IAAI;IAuBP;;;;;;;;;;;;OAYG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM;IA+BvE;;;OAGG;IACH,KAAK,IAAI,IAAI;IAKb;;;OAGG;IACH,SAAS,CACP,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,SAAS;YAKf,mBAAmB;YAoBnB,eAAe;YAmJf,eAAe;IA6D7B,OAAO,CAAC,wBAAwB;IAiBhC,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,kBAAkB;CAG3B"}
|