@powerhousedao/reactor 4.1.0-dev.12 → 4.1.0-dev.120
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,375 @@
|
|
|
1
|
+
import { applyDeleteDocumentAction, applyUpgradeDocumentAction, createDocumentFromAction, } from "../executor/util.js";
|
|
2
|
+
import { RingBuffer } from "./buffer/ring-buffer.js";
|
|
3
|
+
import { LRUTracker } from "./lru/lru-tracker.js";
|
|
4
|
+
/**
|
|
5
|
+
* In-memory write cache with keyframe persistence for PHDocuments.
|
|
6
|
+
*
|
|
7
|
+
* Caches document snapshots in ring buffers with LRU eviction. On cache miss,
|
|
8
|
+
* rebuilds documents from nearest keyframe or full operation history.
|
|
9
|
+
*
|
|
10
|
+
* **Performance Characteristics:**
|
|
11
|
+
* - Cache hit: O(1) lookup in ring buffer
|
|
12
|
+
* - Cold miss: O(n) where n is total operation count, or O(k) where k is operations since keyframe
|
|
13
|
+
* - Warm miss: O(m) where m is operations since cached revision
|
|
14
|
+
* - Eviction: O(1) for LRU tracking and removal
|
|
15
|
+
*
|
|
16
|
+
* **Thread Safety:**
|
|
17
|
+
* Not thread-safe. Designed for single-threaded job executor environment.
|
|
18
|
+
* External synchronization required for concurrent access across multiple executors.
|
|
19
|
+
*
|
|
20
|
+
* **Example:**
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const cache = new KyselyWriteCache(
|
|
23
|
+
* keyframeStore,
|
|
24
|
+
* operationStore,
|
|
25
|
+
* registry,
|
|
26
|
+
* { maxDocuments: 1000, ringBufferSize: 10, keyframeInterval: 10 }
|
|
27
|
+
* );
|
|
28
|
+
*
|
|
29
|
+
* await cache.startup();
|
|
30
|
+
*
|
|
31
|
+
* // Retrieve or rebuild document
|
|
32
|
+
* const doc = await cache.getState(docId, docType, scope, branch, revision);
|
|
33
|
+
*
|
|
34
|
+
* // Cache result after job execution
|
|
35
|
+
* cache.putState(docId, docType, scope, branch, newRevision, updatedDoc);
|
|
36
|
+
*
|
|
37
|
+
* await cache.shutdown();
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export class KyselyWriteCache {
|
|
41
|
+
streams;
|
|
42
|
+
lruTracker;
|
|
43
|
+
keyframeStore;
|
|
44
|
+
operationStore;
|
|
45
|
+
registry;
|
|
46
|
+
config;
|
|
47
|
+
constructor(keyframeStore, operationStore, registry, config) {
|
|
48
|
+
this.keyframeStore = keyframeStore;
|
|
49
|
+
this.operationStore = operationStore;
|
|
50
|
+
this.registry = registry;
|
|
51
|
+
this.config = {
|
|
52
|
+
maxDocuments: config.maxDocuments,
|
|
53
|
+
ringBufferSize: config.ringBufferSize,
|
|
54
|
+
keyframeInterval: config.keyframeInterval,
|
|
55
|
+
};
|
|
56
|
+
this.streams = new Map();
|
|
57
|
+
this.lruTracker = new LRUTracker();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Initializes the write cache.
|
|
61
|
+
* Currently a no-op as keyframe store lifecycle is managed externally.
|
|
62
|
+
*/
|
|
63
|
+
async startup() {
|
|
64
|
+
return Promise.resolve();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Shuts down the write cache.
|
|
68
|
+
* Currently a no-op as keyframe store lifecycle is managed externally.
|
|
69
|
+
*/
|
|
70
|
+
async shutdown() {
|
|
71
|
+
return Promise.resolve();
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Retrieves document state at a specific revision from cache or rebuilds it.
|
|
75
|
+
*
|
|
76
|
+
* Cache hit path: Returns cached snapshot if available (O(1))
|
|
77
|
+
* Warm miss path: Rebuilds from cached base revision + incremental ops
|
|
78
|
+
* Cold miss path: Rebuilds from keyframe or from scratch using all operations
|
|
79
|
+
*
|
|
80
|
+
* @param documentId - The document identifier
|
|
81
|
+
* @param scope - The operation scope
|
|
82
|
+
* @param branch - The operation branch
|
|
83
|
+
* @param targetRevision - The target revision, or undefined for newest
|
|
84
|
+
* @param signal - Optional abort signal to cancel the operation
|
|
85
|
+
* @returns The document at the target revision
|
|
86
|
+
* @throws {Error} "Operation aborted" if signal is aborted
|
|
87
|
+
* @throws {ModuleNotFoundError} If document type not registered in registry
|
|
88
|
+
* @throws {Error} "Failed to rebuild document" if operation store fails
|
|
89
|
+
* @throws {Error} If reducer throws during operation application
|
|
90
|
+
* @throws {Error} If document serialization fails
|
|
91
|
+
*/
|
|
92
|
+
async getState(documentId, scope, branch, targetRevision, signal) {
|
|
93
|
+
if (signal?.aborted) {
|
|
94
|
+
throw new Error("Operation aborted");
|
|
95
|
+
}
|
|
96
|
+
const streamKey = this.makeStreamKey(documentId, scope, branch);
|
|
97
|
+
const stream = this.streams.get(streamKey);
|
|
98
|
+
if (stream) {
|
|
99
|
+
const snapshots = stream.ringBuffer.getAll();
|
|
100
|
+
if (targetRevision === undefined) {
|
|
101
|
+
if (snapshots.length > 0) {
|
|
102
|
+
const newest = snapshots[snapshots.length - 1];
|
|
103
|
+
this.lruTracker.touch(streamKey);
|
|
104
|
+
return newest.document;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const exactMatch = snapshots.find((s) => s.revision === targetRevision);
|
|
109
|
+
if (exactMatch) {
|
|
110
|
+
this.lruTracker.touch(streamKey);
|
|
111
|
+
return exactMatch.document;
|
|
112
|
+
}
|
|
113
|
+
const newestOlder = this.findNearestOlderSnapshot(snapshots, targetRevision);
|
|
114
|
+
if (newestOlder) {
|
|
115
|
+
const document = await this.warmMissRebuild(newestOlder.document, newestOlder.revision, documentId, scope, branch, targetRevision, signal);
|
|
116
|
+
this.putState(documentId, scope, branch, targetRevision, document);
|
|
117
|
+
this.lruTracker.touch(streamKey);
|
|
118
|
+
return document;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const document = await this.coldMissRebuild(documentId, scope, branch, targetRevision, signal);
|
|
123
|
+
let revision = targetRevision;
|
|
124
|
+
if (revision === undefined) {
|
|
125
|
+
revision = document.header.revision[scope] || 0;
|
|
126
|
+
}
|
|
127
|
+
this.putState(documentId, scope, branch, revision, document);
|
|
128
|
+
return document;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Stores a document snapshot in the cache at a specific revision.
|
|
132
|
+
*
|
|
133
|
+
* Stores the document reference as-is. Callers must avoid mutating cached
|
|
134
|
+
* snapshots if they need to preserve historical revisions.
|
|
135
|
+
* Updates LRU tracker and may evict least recently used stream if at capacity.
|
|
136
|
+
* Asynchronously persists keyframes at configured intervals (fire-and-forget).
|
|
137
|
+
*
|
|
138
|
+
* @param documentId - The document identifier
|
|
139
|
+
* @param scope - The operation scope
|
|
140
|
+
* @param branch - The operation branch
|
|
141
|
+
* @param revision - The revision number
|
|
142
|
+
* @param document - The document to cache
|
|
143
|
+
* @throws {Error} If document serialization fails
|
|
144
|
+
*/
|
|
145
|
+
putState(documentId, scope, branch, revision, document) {
|
|
146
|
+
const streamKey = this.makeStreamKey(documentId, scope, branch);
|
|
147
|
+
const stream = this.getOrCreateStream(streamKey);
|
|
148
|
+
const snapshot = {
|
|
149
|
+
revision,
|
|
150
|
+
document,
|
|
151
|
+
};
|
|
152
|
+
stream.ringBuffer.push(snapshot);
|
|
153
|
+
if (this.isKeyframeRevision(revision)) {
|
|
154
|
+
this.keyframeStore
|
|
155
|
+
.putKeyframe(documentId, scope, branch, revision, document)
|
|
156
|
+
.catch((err) => {
|
|
157
|
+
console.error(`Failed to persist keyframe ${documentId}@${revision}:`, err);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Invalidates cached document streams.
|
|
163
|
+
*
|
|
164
|
+
* Supports three invalidation scopes:
|
|
165
|
+
* - Document-level: invalidate(documentId) - removes all streams for document
|
|
166
|
+
* - Scope-level: invalidate(documentId, scope) - removes all branches for scope
|
|
167
|
+
* - Stream-level: invalidate(documentId, scope, branch) - removes specific stream
|
|
168
|
+
*
|
|
169
|
+
* @param documentId - The document identifier
|
|
170
|
+
* @param scope - Optional scope to narrow invalidation
|
|
171
|
+
* @param branch - Optional branch to narrow invalidation (requires scope)
|
|
172
|
+
* @returns The number of streams evicted
|
|
173
|
+
*/
|
|
174
|
+
invalidate(documentId, scope, branch) {
|
|
175
|
+
let evicted = 0;
|
|
176
|
+
if (scope === undefined && branch === undefined) {
|
|
177
|
+
for (const [key] of this.streams.entries()) {
|
|
178
|
+
if (key.startsWith(`${documentId}:`)) {
|
|
179
|
+
this.streams.delete(key);
|
|
180
|
+
this.lruTracker.remove(key);
|
|
181
|
+
evicted++;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else if (scope !== undefined && branch === undefined) {
|
|
186
|
+
for (const [key] of this.streams.entries()) {
|
|
187
|
+
if (key.startsWith(`${documentId}:${scope}:`)) {
|
|
188
|
+
this.streams.delete(key);
|
|
189
|
+
this.lruTracker.remove(key);
|
|
190
|
+
evicted++;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
else if (scope !== undefined && branch !== undefined) {
|
|
195
|
+
const key = this.makeStreamKey(documentId, scope, branch);
|
|
196
|
+
if (this.streams.has(key)) {
|
|
197
|
+
this.streams.delete(key);
|
|
198
|
+
this.lruTracker.remove(key);
|
|
199
|
+
evicted = 1;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return evicted;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Clears the entire cache, removing all cached document streams.
|
|
206
|
+
* Resets LRU tracking state. This operation always succeeds.
|
|
207
|
+
*/
|
|
208
|
+
clear() {
|
|
209
|
+
this.streams.clear();
|
|
210
|
+
this.lruTracker.clear();
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Retrieves a specific stream for a document. Exposed on the implementation
|
|
214
|
+
* for testing, but not on the interface.
|
|
215
|
+
*/
|
|
216
|
+
getStream(documentId, scope, branch) {
|
|
217
|
+
const key = this.makeStreamKey(documentId, scope, branch);
|
|
218
|
+
return this.streams.get(key);
|
|
219
|
+
}
|
|
220
|
+
async findNearestKeyframe(documentId, scope, branch, targetRevision, signal) {
|
|
221
|
+
if (targetRevision === Number.MAX_SAFE_INTEGER || targetRevision <= 0) {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
return this.keyframeStore.findNearestKeyframe(documentId, scope, branch, targetRevision, signal);
|
|
225
|
+
}
|
|
226
|
+
async coldMissRebuild(documentId, scope, branch, targetRevision, signal) {
|
|
227
|
+
const effectiveTargetRevision = targetRevision || Number.MAX_SAFE_INTEGER;
|
|
228
|
+
const keyframe = await this.findNearestKeyframe(documentId, scope, branch, effectiveTargetRevision, signal);
|
|
229
|
+
let document;
|
|
230
|
+
let startRevision;
|
|
231
|
+
let documentType;
|
|
232
|
+
if (keyframe) {
|
|
233
|
+
document = keyframe.document;
|
|
234
|
+
startRevision = keyframe.revision;
|
|
235
|
+
documentType = keyframe.document.header.documentType;
|
|
236
|
+
}
|
|
237
|
+
else {
|
|
238
|
+
document = undefined;
|
|
239
|
+
startRevision = 0;
|
|
240
|
+
const createOpResult = await this.operationStore.getSince(documentId, "document", branch, -1, { limit: 1 }, signal);
|
|
241
|
+
if (createOpResult.items.length === 0) {
|
|
242
|
+
throw new Error(`Failed to rebuild document ${documentId}: no CREATE_DOCUMENT operation found in document scope`);
|
|
243
|
+
}
|
|
244
|
+
const createOp = createOpResult.items[0];
|
|
245
|
+
if (createOp.action.type !== "CREATE_DOCUMENT") {
|
|
246
|
+
throw new Error(`Failed to rebuild document ${documentId}: first operation in document scope must be CREATE_DOCUMENT, found ${createOp.action.type}`);
|
|
247
|
+
}
|
|
248
|
+
const documentCreateAction = createOp.action;
|
|
249
|
+
documentType = documentCreateAction.input.model;
|
|
250
|
+
if (!documentType) {
|
|
251
|
+
throw new Error(`Failed to rebuild document ${documentId}: CREATE_DOCUMENT action missing model in input`);
|
|
252
|
+
}
|
|
253
|
+
document = createDocumentFromAction(documentCreateAction);
|
|
254
|
+
const docModule = this.registry.getModule(documentType);
|
|
255
|
+
const docScopeOps = await this.operationStore.getSince(documentId, "document", branch, 0, undefined, signal);
|
|
256
|
+
for (const operation of docScopeOps.items) {
|
|
257
|
+
if (operation.index === 0) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
if (operation.action.type === "UPGRADE_DOCUMENT") {
|
|
261
|
+
applyUpgradeDocumentAction(document, operation.action);
|
|
262
|
+
}
|
|
263
|
+
else if (operation.action.type === "DELETE_DOCUMENT") {
|
|
264
|
+
applyDeleteDocumentAction(document, operation.action);
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
document = docModule.reducer(document, operation.action);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
const module = this.registry.getModule(documentType);
|
|
272
|
+
let cursor = undefined;
|
|
273
|
+
const pageSize = 100;
|
|
274
|
+
let hasMorePages;
|
|
275
|
+
do {
|
|
276
|
+
if (signal?.aborted) {
|
|
277
|
+
throw new Error("Operation aborted");
|
|
278
|
+
}
|
|
279
|
+
const paging = cursor ? { cursor, pageSize } : { pageSize };
|
|
280
|
+
try {
|
|
281
|
+
const result = await this.operationStore.getSince(documentId, scope, branch, startRevision, paging, signal);
|
|
282
|
+
for (const operation of result.items) {
|
|
283
|
+
if (targetRevision !== undefined &&
|
|
284
|
+
operation.index > targetRevision) {
|
|
285
|
+
break;
|
|
286
|
+
}
|
|
287
|
+
// Fail-fast: if reducer throws, error propagates immediately without caching partial state
|
|
288
|
+
document = module.reducer(document, operation.action);
|
|
289
|
+
}
|
|
290
|
+
const reachedTarget = targetRevision !== undefined &&
|
|
291
|
+
result.items.some((op) => op.index >= targetRevision);
|
|
292
|
+
hasMorePages = Boolean(result.nextCursor) && !reachedTarget;
|
|
293
|
+
if (hasMorePages) {
|
|
294
|
+
cursor = result.nextCursor;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
catch (err) {
|
|
298
|
+
// Wrap errors with context to include document ID for debugging
|
|
299
|
+
throw new Error(`Failed to rebuild document ${documentId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
300
|
+
}
|
|
301
|
+
} while (hasMorePages);
|
|
302
|
+
// we let these errors bubble up to jobs
|
|
303
|
+
const revisions = await this.operationStore.getRevisions(documentId, branch, signal);
|
|
304
|
+
document.header.revision = revisions.revision;
|
|
305
|
+
document.header.lastModifiedAtUtcIso = revisions.latestTimestamp;
|
|
306
|
+
return document;
|
|
307
|
+
}
|
|
308
|
+
async warmMissRebuild(baseDocument, baseRevision, documentId, scope, branch, targetRevision, signal) {
|
|
309
|
+
const documentType = baseDocument.header.documentType;
|
|
310
|
+
const module = this.registry.getModule(documentType);
|
|
311
|
+
let document = baseDocument;
|
|
312
|
+
try {
|
|
313
|
+
const pagedResults = await this.operationStore.getSince(documentId, scope, branch, baseRevision, undefined, signal);
|
|
314
|
+
for (const operation of pagedResults.items) {
|
|
315
|
+
if (signal?.aborted) {
|
|
316
|
+
throw new Error("Operation aborted");
|
|
317
|
+
}
|
|
318
|
+
if (targetRevision !== undefined && operation.index > targetRevision) {
|
|
319
|
+
break;
|
|
320
|
+
}
|
|
321
|
+
// Fail-fast: if reducer throws, error propagates immediately without caching partial state
|
|
322
|
+
document = module.reducer(document, operation.action);
|
|
323
|
+
if (targetRevision !== undefined &&
|
|
324
|
+
operation.index === targetRevision) {
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
catch (err) {
|
|
330
|
+
// Wrap errors with context to include document ID for debugging
|
|
331
|
+
throw new Error(`Failed to rebuild document ${documentId}: ${err instanceof Error ? err.message : String(err)}`);
|
|
332
|
+
}
|
|
333
|
+
// we let these errors bubble up to jobs
|
|
334
|
+
const revisions = await this.operationStore.getRevisions(documentId, branch, signal);
|
|
335
|
+
document.header.revision = revisions.revision;
|
|
336
|
+
document.header.lastModifiedAtUtcIso = revisions.latestTimestamp;
|
|
337
|
+
return document;
|
|
338
|
+
}
|
|
339
|
+
findNearestOlderSnapshot(snapshots, targetRevision) {
|
|
340
|
+
let nearest = undefined;
|
|
341
|
+
for (const snapshot of snapshots) {
|
|
342
|
+
if (snapshot.revision < targetRevision) {
|
|
343
|
+
if (!nearest || snapshot.revision > nearest.revision) {
|
|
344
|
+
nearest = snapshot;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
return nearest;
|
|
349
|
+
}
|
|
350
|
+
makeStreamKey(documentId, scope, branch) {
|
|
351
|
+
return `${documentId}:${scope}:${branch}`;
|
|
352
|
+
}
|
|
353
|
+
getOrCreateStream(key) {
|
|
354
|
+
let stream = this.streams.get(key);
|
|
355
|
+
if (!stream) {
|
|
356
|
+
if (this.streams.size >= this.config.maxDocuments) {
|
|
357
|
+
const evictKey = this.lruTracker.evict();
|
|
358
|
+
if (evictKey) {
|
|
359
|
+
this.streams.delete(evictKey);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
stream = {
|
|
363
|
+
key,
|
|
364
|
+
ringBuffer: new RingBuffer(this.config.ringBufferSize),
|
|
365
|
+
};
|
|
366
|
+
this.streams.set(key, stream);
|
|
367
|
+
}
|
|
368
|
+
this.lruTracker.touch(key);
|
|
369
|
+
return stream;
|
|
370
|
+
}
|
|
371
|
+
isKeyframeRevision(revision) {
|
|
372
|
+
return revision > 0 && revision % this.config.keyframeInterval === 0;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=kysely-write-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kysely-write-cache.js","sourceRoot":"","sources":["../../../src/cache/kysely-write-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class LRUTracker<K> {
|
|
2
|
+
private map;
|
|
3
|
+
private head;
|
|
4
|
+
private tail;
|
|
5
|
+
constructor();
|
|
6
|
+
get size(): number;
|
|
7
|
+
touch(key: K): void;
|
|
8
|
+
evict(): K | undefined;
|
|
9
|
+
remove(key: K): void;
|
|
10
|
+
clear(): void;
|
|
11
|
+
private addToFront;
|
|
12
|
+
private moveToFront;
|
|
13
|
+
private removeNode;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=lru-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-tracker.d.ts","sourceRoot":"","sources":["../../../../src/cache/lru/lru-tracker.ts"],"names":[],"mappings":"AAYA,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,GAAG,CAAqB;IAChC,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,IAAI,CAAyB;;IAQrC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,KAAK,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI;IAUnB,KAAK,IAAI,CAAC,GAAG,SAAS;IAUtB,MAAM,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI;IAUpB,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,UAAU;IAclB,OAAO,CAAC,WAAW;IAoBnB,OAAO,CAAC,UAAU;CAanB"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
class LRUNode {
|
|
2
|
+
key;
|
|
3
|
+
prev;
|
|
4
|
+
next;
|
|
5
|
+
constructor(key) {
|
|
6
|
+
this.key = key;
|
|
7
|
+
this.prev = undefined;
|
|
8
|
+
this.next = undefined;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export class LRUTracker {
|
|
12
|
+
map;
|
|
13
|
+
head;
|
|
14
|
+
tail;
|
|
15
|
+
constructor() {
|
|
16
|
+
this.map = new Map();
|
|
17
|
+
this.head = undefined;
|
|
18
|
+
this.tail = undefined;
|
|
19
|
+
}
|
|
20
|
+
get size() {
|
|
21
|
+
return this.map.size;
|
|
22
|
+
}
|
|
23
|
+
touch(key) {
|
|
24
|
+
const node = this.map.get(key);
|
|
25
|
+
if (node) {
|
|
26
|
+
this.moveToFront(node);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.addToFront(key);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
evict() {
|
|
33
|
+
if (!this.tail) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const key = this.tail.key;
|
|
37
|
+
this.remove(key);
|
|
38
|
+
return key;
|
|
39
|
+
}
|
|
40
|
+
remove(key) {
|
|
41
|
+
const node = this.map.get(key);
|
|
42
|
+
if (!node) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
this.removeNode(node);
|
|
46
|
+
this.map.delete(key);
|
|
47
|
+
}
|
|
48
|
+
clear() {
|
|
49
|
+
this.map.clear();
|
|
50
|
+
this.head = undefined;
|
|
51
|
+
this.tail = undefined;
|
|
52
|
+
}
|
|
53
|
+
addToFront(key) {
|
|
54
|
+
const node = new LRUNode(key);
|
|
55
|
+
this.map.set(key, node);
|
|
56
|
+
if (!this.head) {
|
|
57
|
+
this.head = node;
|
|
58
|
+
this.tail = node;
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
node.next = this.head;
|
|
62
|
+
this.head.prev = node;
|
|
63
|
+
this.head = node;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
moveToFront(node) {
|
|
67
|
+
if (node === this.head) {
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
this.removeNode(node);
|
|
71
|
+
node.prev = undefined;
|
|
72
|
+
node.next = this.head;
|
|
73
|
+
if (this.head) {
|
|
74
|
+
this.head.prev = node;
|
|
75
|
+
}
|
|
76
|
+
this.head = node;
|
|
77
|
+
if (!this.tail) {
|
|
78
|
+
this.tail = node;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
removeNode(node) {
|
|
82
|
+
if (node.prev) {
|
|
83
|
+
node.prev.next = node.next;
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.head = node.next;
|
|
87
|
+
}
|
|
88
|
+
if (node.next) {
|
|
89
|
+
node.next.prev = node.prev;
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
this.tail = node.prev;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=lru-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lru-tracker.js","sourceRoot":"","sources":["../../../../src/cache/lru/lru-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Operation } from "document-model";
|
|
2
|
+
import type { Generated, Insertable, Selectable, Updateable } from "kysely";
|
|
3
|
+
import type { PagedResults, PagingOptions, ViewFilter } from "../storage/interfaces.js";
|
|
4
|
+
export type OperationIndexEntry = Operation & {
|
|
5
|
+
ordinal?: number;
|
|
6
|
+
documentId: string;
|
|
7
|
+
documentType: string;
|
|
8
|
+
branch: string;
|
|
9
|
+
scope: string;
|
|
10
|
+
};
|
|
11
|
+
export interface IOperationIndexTxn {
|
|
12
|
+
createCollection(collectionId: string): void;
|
|
13
|
+
addToCollection(collectionId: string, documentId: string): void;
|
|
14
|
+
removeFromCollection(collectionId: string, documentId: string): void;
|
|
15
|
+
write(operations: OperationIndexEntry[]): void;
|
|
16
|
+
}
|
|
17
|
+
export interface IOperationIndex {
|
|
18
|
+
start(): IOperationIndexTxn;
|
|
19
|
+
commit(txn: IOperationIndexTxn, signal?: AbortSignal): Promise<void>;
|
|
20
|
+
find(collectionId: string, cursor?: number, view?: ViewFilter, paging?: PagingOptions, signal?: AbortSignal): Promise<PagedResults<OperationIndexEntry>>;
|
|
21
|
+
}
|
|
22
|
+
export interface DocumentCollectionTable {
|
|
23
|
+
documentId: string;
|
|
24
|
+
collectionId: string;
|
|
25
|
+
joinedOrdinal: bigint;
|
|
26
|
+
leftOrdinal: bigint | null;
|
|
27
|
+
}
|
|
28
|
+
export interface OperationIndexOperationTable {
|
|
29
|
+
ordinal: Generated<number>;
|
|
30
|
+
opId: string;
|
|
31
|
+
documentId: string;
|
|
32
|
+
documentType: string;
|
|
33
|
+
scope: string;
|
|
34
|
+
branch: string;
|
|
35
|
+
timestampUtcMs: bigint;
|
|
36
|
+
writeTimestampUtcMs: Generated<Date>;
|
|
37
|
+
index: number;
|
|
38
|
+
skip: number;
|
|
39
|
+
hash: string;
|
|
40
|
+
action: unknown;
|
|
41
|
+
}
|
|
42
|
+
export type DocumentCollectionRow = Selectable<DocumentCollectionTable>;
|
|
43
|
+
export type InsertableDocumentCollection = Insertable<DocumentCollectionTable>;
|
|
44
|
+
export type UpdateableDocumentCollection = Updateable<DocumentCollectionTable>;
|
|
45
|
+
export type OperationIndexOperationRow = Selectable<OperationIndexOperationTable>;
|
|
46
|
+
export type InsertableOperationIndexOperation = Insertable<OperationIndexOperationTable>;
|
|
47
|
+
export type UpdateableOperationIndexOperation = Updateable<OperationIndexOperationTable>;
|
|
48
|
+
export declare function driveCollectionId(branch: string, driveId: string): string;
|
|
49
|
+
//# sourceMappingURL=operation-index-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-index-types.d.ts","sourceRoot":"","sources":["../../../src/cache/operation-index-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC5E,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACX,MAAM,0BAA0B,CAAC;AAElC,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7C,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAChE,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACrE,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,GAAG,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,IAAI,kBAAkB,CAAC;IAC5B,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,IAAI,CACF,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,CAAC;CAC/C;AAED,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,qBAAqB,GAAG,UAAU,CAAC,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,uBAAuB,CAAC,CAAC;AAC/E,MAAM,MAAM,4BAA4B,GAAG,UAAU,CAAC,uBAAuB,CAAC,CAAC;AAE/E,MAAM,MAAM,0BAA0B,GACpC,UAAU,CAAC,4BAA4B,CAAC,CAAC;AAC3C,MAAM,MAAM,iCAAiC,GAC3C,UAAU,CAAC,4BAA4B,CAAC,CAAC;AAC3C,MAAM,MAAM,iCAAiC,GAC3C,UAAU,CAAC,4BAA4B,CAAC,CAAC;AAE3C,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAEzE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operation-index-types.js","sourceRoot":"","sources":["../../../src/cache/operation-index-types.ts"],"names":[],"mappings":"AAoEA,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,OAAe;IAC/D,OAAO,SAAS,MAAM,IAAI,OAAO,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { PHDocument } from "document-model";
|
|
2
|
+
/**
|
|
3
|
+
* IWriteCache is a write-side projection that optimizes document state retrieval
|
|
4
|
+
* for the job executor. This is separate from IDocumentView (read-side projection) which optimizes
|
|
5
|
+
* queries and searches.
|
|
6
|
+
*/
|
|
7
|
+
export interface IWriteCache {
|
|
8
|
+
/**
|
|
9
|
+
* Retrieves or builds the document at the specified revision.
|
|
10
|
+
* If targetRevision is not provided, retrieves the latest state.
|
|
11
|
+
*
|
|
12
|
+
* @param documentId - The document identifier
|
|
13
|
+
* @param scope - Operation scope
|
|
14
|
+
* @param branch - Branch name
|
|
15
|
+
* @param targetRevision - The exact revision to retrieve (optional, defaults to latest)
|
|
16
|
+
* @param signal - Optional abort signal to cancel the operation
|
|
17
|
+
* @returns The complete document at the specified revision
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* // Get latest document state
|
|
22
|
+
* const doc = await cache.getState(docId, 'global', 'main');
|
|
23
|
+
*
|
|
24
|
+
* // Get document at specific revision
|
|
25
|
+
* const doc = await cache.getState(docId, 'global', 'main', 42);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
getState(documentId: string, scope: string, branch: string, targetRevision?: number, signal?: AbortSignal): Promise<PHDocument>;
|
|
29
|
+
/**
|
|
30
|
+
* Stores a document snapshot in the cache at the specified revision.
|
|
31
|
+
* The document will be deep copied to prevent external mutations.
|
|
32
|
+
*
|
|
33
|
+
* @param documentId - The document identifier
|
|
34
|
+
* @param scope - Operation scope
|
|
35
|
+
* @param branch - Branch name
|
|
36
|
+
* @param revision - The revision this document represents
|
|
37
|
+
* @param document - The complete document to cache
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* cache.putState(docId, 'global', 'main', 42, document);
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
putState(documentId: string, scope: string, branch: string, revision: number, document: PHDocument): void;
|
|
45
|
+
/**
|
|
46
|
+
* Invalidates (removes) cached entries for a document stream.
|
|
47
|
+
*
|
|
48
|
+
* - If only documentId is provided: invalidates all scopes and branches for that document
|
|
49
|
+
* - If documentId + scope provided: invalidates all branches for that document and scope
|
|
50
|
+
* - If all parameters provided: invalidates the specific stream
|
|
51
|
+
*
|
|
52
|
+
* @param documentId - The document identifier
|
|
53
|
+
* @param scope - Optional scope to narrow invalidation
|
|
54
|
+
* @param branch - Optional branch to narrow invalidation
|
|
55
|
+
* @returns Number of ring buffers evicted
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```typescript
|
|
59
|
+
* // Invalidate all streams for a document
|
|
60
|
+
* cache.invalidate(docId);
|
|
61
|
+
*
|
|
62
|
+
* // Invalidate all branches for a specific scope
|
|
63
|
+
* cache.invalidate(docId, 'global');
|
|
64
|
+
*
|
|
65
|
+
* // Invalidate specific stream
|
|
66
|
+
* cache.invalidate(docId, 'global', 'main');
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
invalidate(documentId: string, scope?: string, branch?: string): number;
|
|
70
|
+
/**
|
|
71
|
+
* Clears all cached data from the in-memory cache.
|
|
72
|
+
*/
|
|
73
|
+
clear(): void;
|
|
74
|
+
/**
|
|
75
|
+
* Performs startup initialization.
|
|
76
|
+
*/
|
|
77
|
+
startup(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Performs graceful shutdown.
|
|
80
|
+
*/
|
|
81
|
+
shutdown(): Promise<void>;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../../../src/cache/write/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,QAAQ,CACN,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,CAAC;IAEvB;;;;;;;;;;;;;;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,CAAC;IAER;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExE;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;IAEd;;OAEG;IACH,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB;;OAEG;IACH,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B"}
|