@claudexor/daemon 3.24.0 → 4.0.0
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/account-resets.d.ts +39 -0
- package/dist/account-resets.d.ts.map +1 -0
- package/dist/account-resets.js +174 -0
- package/dist/account-resets.js.map +1 -0
- package/dist/client.d.ts +25 -6
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +55 -51
- package/dist/client.js.map +1 -1
- package/dist/command-authority.d.ts +11 -8
- package/dist/command-authority.d.ts.map +1 -1
- package/dist/command-authority.js +5 -6
- package/dist/command-authority.js.map +1 -1
- package/dist/command-list-projection.d.ts +0 -1
- package/dist/command-list-projection.d.ts.map +1 -1
- package/dist/command-list-projection.js +0 -6
- package/dist/command-list-projection.js.map +1 -1
- package/dist/command-list-select.d.ts +0 -4
- package/dist/command-list-select.d.ts.map +1 -1
- package/dist/command-list-select.js +1 -115
- package/dist/command-list-select.js.map +1 -1
- package/dist/command-retention.d.ts +7 -19
- package/dist/command-retention.d.ts.map +1 -1
- package/dist/command-retention.js +1 -117
- package/dist/command-retention.js.map +1 -1
- package/dist/command-rpc.d.ts +4 -1
- package/dist/command-rpc.d.ts.map +1 -1
- package/dist/command-rpc.js +12 -1
- package/dist/command-rpc.js.map +1 -1
- package/dist/command-store.d.ts +15 -52
- package/dist/command-store.d.ts.map +1 -1
- package/dist/command-store.js +5 -493
- package/dist/command-store.js.map +1 -1
- package/dist/daemon-health.d.ts +56 -8
- package/dist/daemon-health.d.ts.map +1 -1
- package/dist/daemon-health.js +44 -9
- package/dist/daemon-health.js.map +1 -1
- package/dist/daemon-local-client.d.ts +28 -0
- package/dist/daemon-local-client.d.ts.map +1 -0
- package/dist/daemon-local-client.js +55 -0
- package/dist/daemon-local-client.js.map +1 -0
- package/dist/delivery-command.d.ts +4 -4
- package/dist/delivery-command.d.ts.map +1 -1
- package/dist/delivery-command.js.map +1 -1
- package/dist/index.d.ts +24 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -8
- package/dist/index.js.map +1 -1
- package/dist/interactions.d.ts +12 -28
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +22 -123
- package/dist/interactions.js.map +1 -1
- package/dist/job-admission.d.ts +26 -0
- package/dist/job-admission.d.ts.map +1 -0
- package/dist/job-admission.js +67 -0
- package/dist/job-admission.js.map +1 -0
- package/dist/job-record.d.ts.map +1 -1
- package/dist/job-record.js +5 -1
- package/dist/job-record.js.map +1 -1
- package/dist/journal-fold-policy.d.ts +1 -1
- package/dist/journal-fold-policy.d.ts.map +1 -1
- package/dist/journal-fold-policy.js +26 -2
- package/dist/journal-fold-policy.js.map +1 -1
- package/dist/journal-recovery-files.d.ts +1 -41
- package/dist/journal-recovery-files.d.ts.map +1 -1
- package/dist/journal-recovery-files.js +2 -340
- package/dist/journal-recovery-files.js.map +1 -1
- package/dist/loop-facts.d.ts +28 -0
- package/dist/loop-facts.d.ts.map +1 -0
- package/dist/loop-facts.js +97 -0
- package/dist/loop-facts.js.map +1 -0
- package/dist/memory-facts.d.ts +2 -0
- package/dist/memory-facts.d.ts.map +1 -1
- package/dist/memory-facts.js +5 -0
- package/dist/memory-facts.js.map +1 -1
- package/dist/model-operations.d.ts +11 -4
- package/dist/model-operations.d.ts.map +1 -1
- package/dist/model-operations.js +68 -38
- package/dist/model-operations.js.map +1 -1
- package/dist/operator-decisions.d.ts +15 -25
- package/dist/operator-decisions.d.ts.map +1 -1
- package/dist/operator-decisions.js +5 -84
- package/dist/operator-decisions.js.map +1 -1
- package/dist/projects.d.ts +42 -41
- package/dist/projects.d.ts.map +1 -1
- package/dist/projects.js +46 -184
- package/dist/projects.js.map +1 -1
- package/dist/quota-poll-lanes.d.ts +5 -3
- package/dist/quota-poll-lanes.d.ts.map +1 -1
- package/dist/quota-poll-lanes.js +16 -6
- package/dist/quota-poll-lanes.js.map +1 -1
- package/dist/quota-refresh-batches.d.ts +26 -0
- package/dist/quota-refresh-batches.d.ts.map +1 -0
- package/dist/quota-refresh-batches.js +83 -0
- package/dist/quota-refresh-batches.js.map +1 -0
- package/dist/quota-registry-replay.d.ts +19 -0
- package/dist/quota-registry-replay.d.ts.map +1 -0
- package/dist/quota-registry-replay.js +106 -0
- package/dist/quota-registry-replay.js.map +1 -0
- package/dist/quota-registry-support.d.ts +4 -1
- package/dist/quota-registry-support.d.ts.map +1 -1
- package/dist/quota-registry-support.js +15 -2
- package/dist/quota-registry-support.js.map +1 -1
- package/dist/quota-registry.d.ts +381 -7
- package/dist/quota-registry.d.ts.map +1 -1
- package/dist/quota-registry.js +111 -149
- package/dist/quota-registry.js.map +1 -1
- package/dist/quota-resources.d.ts +105 -0
- package/dist/quota-resources.d.ts.map +1 -0
- package/dist/quota-resources.js +153 -0
- package/dist/quota-resources.js.map +1 -0
- package/dist/runless-turn-recovery.d.ts +2 -9
- package/dist/runless-turn-recovery.d.ts.map +1 -1
- package/dist/runless-turn-recovery.js +0 -14
- package/dist/runless-turn-recovery.js.map +1 -1
- package/dist/server.d.ts +23 -22
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +74 -84
- package/dist/server.js.map +1 -1
- package/dist/store/blob-files.d.ts +71 -0
- package/dist/store/blob-files.d.ts.map +1 -0
- package/dist/store/blob-files.js +160 -0
- package/dist/store/blob-files.js.map +1 -0
- package/dist/store/command-prune.d.ts +37 -0
- package/dist/store/command-prune.d.ts.map +1 -0
- package/dist/store/command-prune.js +123 -0
- package/dist/store/command-prune.js.map +1 -0
- package/dist/store/command-queries.d.ts +41 -0
- package/dist/store/command-queries.d.ts.map +1 -0
- package/dist/store/command-queries.js +186 -0
- package/dist/store/command-queries.js.map +1 -0
- package/dist/store/command-rows.d.ts +66 -0
- package/dist/store/command-rows.d.ts.map +1 -0
- package/dist/store/command-rows.js +141 -0
- package/dist/store/command-rows.js.map +1 -0
- package/dist/store/commands.d.ts +49 -0
- package/dist/store/commands.d.ts.map +1 -0
- package/dist/store/commands.js +247 -0
- package/dist/store/commands.js.map +1 -0
- package/dist/store/cursors.d.ts +33 -0
- package/dist/store/cursors.d.ts.map +1 -0
- package/dist/store/cursors.js +82 -0
- package/dist/store/cursors.js.map +1 -0
- package/dist/store/engine-recovery-files.d.ts +14 -0
- package/dist/store/engine-recovery-files.d.ts.map +1 -0
- package/dist/store/engine-recovery-files.js +53 -0
- package/dist/store/engine-recovery-files.js.map +1 -0
- package/dist/store/engine-state-recovery.d.ts +71 -0
- package/dist/store/engine-state-recovery.d.ts.map +1 -0
- package/dist/store/engine-state-recovery.js +318 -0
- package/dist/store/engine-state-recovery.js.map +1 -0
- package/dist/store/errors.d.ts +80 -0
- package/dist/store/errors.d.ts.map +1 -0
- package/dist/store/errors.js +130 -0
- package/dist/store/errors.js.map +1 -0
- package/dist/store/event-store.d.ts +52 -0
- package/dist/store/event-store.d.ts.map +1 -0
- package/dist/store/event-store.js +117 -0
- package/dist/store/event-store.js.map +1 -0
- package/dist/store/external-files.d.ts +40 -0
- package/dist/store/external-files.d.ts.map +1 -0
- package/dist/store/external-files.js +90 -0
- package/dist/store/external-files.js.map +1 -0
- package/dist/store/flusher-protocol.d.ts +82 -0
- package/dist/store/flusher-protocol.d.ts.map +1 -0
- package/dist/store/flusher-protocol.js +23 -0
- package/dist/store/flusher-protocol.js.map +1 -0
- package/dist/store/flusher-worker.d.ts +24 -0
- package/dist/store/flusher-worker.d.ts.map +1 -0
- package/dist/store/flusher-worker.js +185 -0
- package/dist/store/flusher-worker.js.map +1 -0
- package/dist/store/flusher.d.ts +87 -0
- package/dist/store/flusher.d.ts.map +1 -0
- package/dist/store/flusher.js +264 -0
- package/dist/store/flusher.js.map +1 -0
- package/dist/store/generations.d.ts +43 -0
- package/dist/store/generations.d.ts.map +1 -0
- package/dist/store/generations.js +143 -0
- package/dist/store/generations.js.map +1 -0
- package/dist/store/idempotency.d.ts +25 -0
- package/dist/store/idempotency.d.ts.map +1 -0
- package/dist/store/idempotency.js +53 -0
- package/dist/store/idempotency.js.map +1 -0
- package/dist/store/import-context.d.ts +22 -0
- package/dist/store/import-context.d.ts.map +1 -0
- package/dist/store/import-context.js +87 -0
- package/dist/store/import-context.js.map +1 -0
- package/dist/store/import-discovery.d.ts +6 -0
- package/dist/store/import-discovery.d.ts.map +1 -0
- package/dist/store/import-discovery.js +66 -0
- package/dist/store/import-discovery.js.map +1 -0
- package/dist/store/import-records.d.ts +6 -0
- package/dist/store/import-records.d.ts.map +1 -0
- package/dist/store/import-records.js +191 -0
- package/dist/store/import-records.js.map +1 -0
- package/dist/store/import-resources.d.ts +14 -0
- package/dist/store/import-resources.d.ts.map +1 -0
- package/dist/store/import-resources.js +197 -0
- package/dist/store/import-resources.js.map +1 -0
- package/dist/store/import-source.d.ts +24 -0
- package/dist/store/import-source.d.ts.map +1 -0
- package/dist/store/import-source.js +65 -0
- package/dist/store/import-source.js.map +1 -0
- package/dist/store/import-verify.d.ts +6 -0
- package/dist/store/import-verify.d.ts.map +1 -0
- package/dist/store/import-verify.js +97 -0
- package/dist/store/import-verify.js.map +1 -0
- package/dist/store/import-worker.d.ts +18 -0
- package/dist/store/import-worker.d.ts.map +1 -0
- package/dist/store/import-worker.js +69 -0
- package/dist/store/import-worker.js.map +1 -0
- package/dist/store/importer.d.ts +42 -0
- package/dist/store/importer.d.ts.map +1 -0
- package/dist/store/importer.js +239 -0
- package/dist/store/importer.js.map +1 -0
- package/dist/store/interactions.d.ts +22 -0
- package/dist/store/interactions.d.ts.map +1 -0
- package/dist/store/interactions.js +82 -0
- package/dist/store/interactions.js.map +1 -0
- package/dist/store/legacy-journal/frame-codec.d.ts +94 -0
- package/dist/store/legacy-journal/frame-codec.d.ts.map +1 -0
- package/dist/store/legacy-journal/frame-codec.js +352 -0
- package/dist/store/legacy-journal/frame-codec.js.map +1 -0
- package/dist/store/legacy-journal/frame-reader.d.ts +30 -0
- package/dist/store/legacy-journal/frame-reader.d.ts.map +1 -0
- package/dist/store/legacy-journal/frame-reader.js +97 -0
- package/dist/store/legacy-journal/frame-reader.js.map +1 -0
- package/dist/store/legacy-journal/journal-fold.d.ts +47 -0
- package/dist/store/legacy-journal/journal-fold.d.ts.map +1 -0
- package/dist/store/legacy-journal/journal-fold.js +81 -0
- package/dist/store/legacy-journal/journal-fold.js.map +1 -0
- package/dist/store/legacy-journal/journal-partition.d.ts +2 -0
- package/dist/store/legacy-journal/journal-partition.d.ts.map +1 -0
- package/dist/store/legacy-journal/journal-partition.js +10 -0
- package/dist/store/legacy-journal/journal-partition.js.map +1 -0
- package/dist/store/legacy-journal/read-only-preparation.d.ts +48 -0
- package/dist/store/legacy-journal/read-only-preparation.d.ts.map +1 -0
- package/dist/store/legacy-journal/read-only-preparation.js +430 -0
- package/dist/store/legacy-journal/read-only-preparation.js.map +1 -0
- package/dist/store/maintenance-worker.d.ts +5 -0
- package/dist/store/maintenance-worker.d.ts.map +1 -0
- package/dist/store/maintenance-worker.js +175 -0
- package/dist/store/maintenance-worker.js.map +1 -0
- package/dist/store/maintenance.d.ts +124 -0
- package/dist/store/maintenance.d.ts.map +1 -0
- package/dist/store/maintenance.js +197 -0
- package/dist/store/maintenance.js.map +1 -0
- package/dist/store/mutation.d.ts +34 -0
- package/dist/store/mutation.d.ts.map +1 -0
- package/dist/store/mutation.js +85 -0
- package/dist/store/mutation.js.map +1 -0
- package/dist/store/obligations.d.ts +101 -0
- package/dist/store/obligations.d.ts.map +1 -0
- package/dist/store/obligations.js +226 -0
- package/dist/store/obligations.js.map +1 -0
- package/dist/store/operator-decisions.d.ts +23 -0
- package/dist/store/operator-decisions.d.ts.map +1 -0
- package/dist/store/operator-decisions.js +68 -0
- package/dist/store/operator-decisions.js.map +1 -0
- package/dist/store/owner-generations.d.ts +33 -0
- package/dist/store/owner-generations.d.ts.map +1 -0
- package/dist/store/owner-generations.js +63 -0
- package/dist/store/owner-generations.js.map +1 -0
- package/dist/store/partitions.d.ts +37 -0
- package/dist/store/partitions.d.ts.map +1 -0
- package/dist/store/partitions.js +68 -0
- package/dist/store/partitions.js.map +1 -0
- package/dist/store/pragmas.d.ts +32 -0
- package/dist/store/pragmas.d.ts.map +1 -0
- package/dist/store/pragmas.js +65 -0
- package/dist/store/pragmas.js.map +1 -0
- package/dist/store/project-router.d.ts +325 -0
- package/dist/store/project-router.d.ts.map +1 -0
- package/dist/store/project-router.js +298 -0
- package/dist/store/project-router.js.map +1 -0
- package/dist/store/projects.d.ts +36 -0
- package/dist/store/projects.d.ts.map +1 -0
- package/dist/store/projects.js +238 -0
- package/dist/store/projects.js.map +1 -0
- package/dist/store/publish-blob.d.ts +20 -0
- package/dist/store/publish-blob.d.ts.map +1 -0
- package/dist/store/publish-blob.js +158 -0
- package/dist/store/publish-blob.js.map +1 -0
- package/dist/store/purge-files.d.ts +30 -0
- package/dist/store/purge-files.d.ts.map +1 -0
- package/dist/store/purge-files.js +79 -0
- package/dist/store/purge-files.js.map +1 -0
- package/dist/store/resource-rows.d.ts +40 -0
- package/dist/store/resource-rows.d.ts.map +1 -0
- package/dist/store/resource-rows.js +103 -0
- package/dist/store/resource-rows.js.map +1 -0
- package/dist/store/resources.d.ts +67 -0
- package/dist/store/resources.d.ts.map +1 -0
- package/dist/store/resources.js +147 -0
- package/dist/store/resources.js.map +1 -0
- package/dist/store/retention.d.ts +91 -0
- package/dist/store/retention.d.ts.map +1 -0
- package/dist/store/retention.js +169 -0
- package/dist/store/retention.js.map +1 -0
- package/dist/store/run-events.d.ts +14 -0
- package/dist/store/run-events.d.ts.map +1 -0
- package/dist/store/run-events.js +35 -0
- package/dist/store/run-events.js.map +1 -0
- package/dist/store/runtime.d.ts +24 -0
- package/dist/store/runtime.d.ts.map +1 -0
- package/dist/store/runtime.js +67 -0
- package/dist/store/runtime.js.map +1 -0
- package/dist/store/schema.d.ts +33 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +187 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/setup-bindings.d.ts +20 -0
- package/dist/store/setup-bindings.d.ts.map +1 -0
- package/dist/store/setup-bindings.js +52 -0
- package/dist/store/setup-bindings.js.map +1 -0
- package/dist/store/sql-command-router.d.ts +79 -0
- package/dist/store/sql-command-router.d.ts.map +1 -0
- package/dist/store/sql-command-router.js +92 -0
- package/dist/store/sql-command-router.js.map +1 -0
- package/dist/store/sql-daemon-services.d.ts +61 -0
- package/dist/store/sql-daemon-services.d.ts.map +1 -0
- package/dist/store/sql-daemon-services.js +124 -0
- package/dist/store/sql-daemon-services.js.map +1 -0
- package/dist/store/sql-recovery-export.d.ts +8 -0
- package/dist/store/sql-recovery-export.d.ts.map +1 -0
- package/dist/store/sql-recovery-export.js +110 -0
- package/dist/store/sql-recovery-export.js.map +1 -0
- package/dist/store/sql-recovery-inspection.d.ts +22 -0
- package/dist/store/sql-recovery-inspection.d.ts.map +1 -0
- package/dist/store/sql-recovery-inspection.js +88 -0
- package/dist/store/sql-recovery-inspection.js.map +1 -0
- package/dist/store/sql-recovery.d.ts +69 -0
- package/dist/store/sql-recovery.d.ts.map +1 -0
- package/dist/store/sql-recovery.js +169 -0
- package/dist/store/sql-recovery.js.map +1 -0
- package/dist/store/sql-validation.d.ts +9 -0
- package/dist/store/sql-validation.d.ts.map +1 -0
- package/dist/store/sql-validation.js +103 -0
- package/dist/store/sql-validation.js.map +1 -0
- package/dist/store/statement-observer.d.ts +7 -0
- package/dist/store/statement-observer.d.ts.map +1 -0
- package/dist/store/statement-observer.js +44 -0
- package/dist/store/statement-observer.js.map +1 -0
- package/dist/store/store.d.ts +110 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/store/store.js +296 -0
- package/dist/store/store.js.map +1 -0
- package/dist/store/terminal-files.d.ts +21 -0
- package/dist/store/terminal-files.d.ts.map +1 -0
- package/dist/store/terminal-files.js +115 -0
- package/dist/store/terminal-files.js.map +1 -0
- package/dist/store/thread-replay.d.ts +12 -0
- package/dist/store/thread-replay.d.ts.map +1 -0
- package/dist/store/thread-replay.js +49 -0
- package/dist/store/thread-replay.js.map +1 -0
- package/dist/store/thread-rows.d.ts +25 -0
- package/dist/store/thread-rows.d.ts.map +1 -0
- package/dist/store/thread-rows.js +141 -0
- package/dist/store/thread-rows.js.map +1 -0
- package/dist/store/threads.d.ts +105 -0
- package/dist/store/threads.d.ts.map +1 -0
- package/dist/store/threads.js +423 -0
- package/dist/store/threads.js.map +1 -0
- package/dist/store/upload-binding-retention.d.ts +26 -0
- package/dist/store/upload-binding-retention.d.ts.map +1 -0
- package/dist/store/upload-binding-retention.js +142 -0
- package/dist/store/upload-binding-retention.js.map +1 -0
- package/dist/store/uploads.d.ts +30 -0
- package/dist/store/uploads.d.ts.map +1 -0
- package/dist/store/uploads.js +238 -0
- package/dist/store/uploads.js.map +1 -0
- package/dist/store-contracts.d.ts +181 -0
- package/dist/store-contracts.d.ts.map +1 -0
- package/dist/store-contracts.js +2 -0
- package/dist/store-contracts.js.map +1 -0
- package/dist/terminal-authority.d.ts +9 -0
- package/dist/terminal-authority.d.ts.map +1 -1
- package/dist/terminal-authority.js +103 -1
- package/dist/terminal-authority.js.map +1 -1
- package/dist/thread-lane-checkpoints.d.ts +0 -2
- package/dist/thread-lane-checkpoints.d.ts.map +1 -1
- package/dist/thread-lane-checkpoints.js +0 -4
- package/dist/thread-lane-checkpoints.js.map +1 -1
- package/dist/thread-store-support.d.ts +1 -27
- package/dist/thread-store-support.d.ts.map +1 -1
- package/dist/thread-store-support.js +0 -63
- package/dist/thread-store-support.js.map +1 -1
- package/dist/threads.d.ts +1 -113
- package/dist/threads.d.ts.map +1 -1
- package/dist/threads.js +1 -379
- package/dist/threads.js.map +1 -1
- package/package.json +9 -7
- package/dist/command-activity.d.ts +0 -14
- package/dist/command-activity.d.ts.map +0 -1
- package/dist/command-activity.js +0 -16
- package/dist/command-activity.js.map +0 -1
- package/dist/journal-events.d.ts +0 -4
- package/dist/journal-events.d.ts.map +0 -1
- package/dist/journal-events.js +0 -23
- package/dist/journal-events.js.map +0 -1
- package/dist/journal-maintenance.d.ts +0 -50
- package/dist/journal-maintenance.d.ts.map +0 -1
- package/dist/journal-maintenance.js +0 -162
- package/dist/journal-maintenance.js.map +0 -1
- package/dist/journal-manager-journal.d.ts +0 -18
- package/dist/journal-manager-journal.d.ts.map +0 -1
- package/dist/journal-manager-journal.js +0 -25
- package/dist/journal-manager-journal.js.map +0 -1
- package/dist/journal-manager-lifecycle.d.ts +0 -11
- package/dist/journal-manager-lifecycle.d.ts.map +0 -1
- package/dist/journal-manager-lifecycle.js +0 -2
- package/dist/journal-manager-lifecycle.js.map +0 -1
- package/dist/journal-manager.d.ts +0 -99
- package/dist/journal-manager.d.ts.map +0 -1
- package/dist/journal-manager.js +0 -559
- package/dist/journal-manager.js.map +0 -1
- package/dist/journal-prepared-operation.d.ts +0 -53
- package/dist/journal-prepared-operation.d.ts.map +0 -1
- package/dist/journal-prepared-operation.js +0 -158
- package/dist/journal-prepared-operation.js.map +0 -1
- package/dist/journal-projection-slot.d.ts +0 -28
- package/dist/journal-projection-slot.d.ts.map +0 -1
- package/dist/journal-projection-slot.js +0 -71
- package/dist/journal-projection-slot.js.map +0 -1
- package/dist/journal-projection.d.ts +0 -13
- package/dist/journal-projection.d.ts.map +0 -1
- package/dist/journal-projection.js +0 -2
- package/dist/journal-projection.js.map +0 -1
- package/dist/partition-accounts.d.ts +0 -27
- package/dist/partition-accounts.d.ts.map +0 -1
- package/dist/partition-accounts.js +0 -21
- package/dist/partition-accounts.js.map +0 -1
- package/dist/project-partition-preparation.d.ts +0 -87
- package/dist/project-partition-preparation.d.ts.map +0 -1
- package/dist/project-partition-preparation.js +0 -273
- package/dist/project-partition-preparation.js.map +0 -1
- package/dist/project-partitions.d.ts +0 -214
- package/dist/project-partitions.d.ts.map +0 -1
- package/dist/project-partitions.js +0 -486
- package/dist/project-partitions.js.map +0 -1
- package/dist/project-remove.d.ts +0 -11
- package/dist/project-remove.d.ts.map +0 -1
- package/dist/project-remove.js +0 -65
- package/dist/project-remove.js.map +0 -1
- package/dist/project-thread-listing.d.ts +0 -14
- package/dist/project-thread-listing.d.ts.map +0 -1
- package/dist/project-thread-listing.js +0 -37
- package/dist/project-thread-listing.js.map +0 -1
- package/dist/quota-projection.d.ts +0 -11
- package/dist/quota-projection.d.ts.map +0 -1
- package/dist/quota-projection.js +0 -10
- package/dist/quota-projection.js.map +0 -1
- package/dist/resource-store.d.ts +0 -39
- package/dist/resource-store.d.ts.map +0 -1
- package/dist/resource-store.js +0 -464
- package/dist/resource-store.js.map +0 -1
- package/dist/run-event-terminal-index.d.ts +0 -13
- package/dist/run-event-terminal-index.d.ts.map +0 -1
- package/dist/run-event-terminal-index.js +0 -38
- package/dist/run-event-terminal-index.js.map +0 -1
- package/dist/run-events.d.ts +0 -17
- package/dist/run-events.d.ts.map +0 -1
- package/dist/run-events.js +0 -31
- package/dist/run-events.js.map +0 -1
- package/dist/thread-head-ping.d.ts +0 -35
- package/dist/thread-head-ping.d.ts.map +0 -1
- package/dist/thread-head-ping.js +0 -67
- package/dist/thread-head-ping.js.map +0 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
/** Flusher pass interval (SYNTHESIS_R5 §4.2): a code constant, not a knob. */
|
|
4
|
+
export const FLUSH_INTERVAL_MS = 200;
|
|
5
|
+
/** The `workerData` discriminator every store worker is spawned with. The
|
|
6
|
+
* worker modules self-start on it, so the same module graph serves the dev
|
|
7
|
+
* `dist/` layout (adjacent worker file) and the single-file daemon bundle
|
|
8
|
+
* (the bundle itself is the worker entry and dispatches by this key). */
|
|
9
|
+
export const STORE_WORKER_DATA_KEY = "claudexorStoreWorker";
|
|
10
|
+
/**
|
|
11
|
+
* Where a store worker starts. Beside this module in the built `dist/` tree
|
|
12
|
+
* the worker file exists and is the entry; inside the single-file daemon
|
|
13
|
+
* bundle `import.meta.url` IS the bundle (esbuild defines it so), the
|
|
14
|
+
* adjacent file does not exist, and the bundle itself is the entry — it
|
|
15
|
+
* embeds the worker modules, which self-start on `workerData`.
|
|
16
|
+
*/
|
|
17
|
+
export function resolveStoreWorkerEntry(moduleUrl, workerFile) {
|
|
18
|
+
const adjacent = fileURLToPath(new URL(`./${workerFile}`, moduleUrl));
|
|
19
|
+
if (existsSync(adjacent))
|
|
20
|
+
return adjacent;
|
|
21
|
+
return fileURLToPath(moduleUrl);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=flusher-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusher-protocol.js","sourceRoot":"","sources":["../../src/store/flusher-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,8EAA8E;AAC9E,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC;;;yEAGyE;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAwD5D;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,SAAiB,EAAE,UAAkB;IAC3E,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IACtE,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,OAAO,aAAa,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type MessagePort } from "node:worker_threads";
|
|
2
|
+
import { type FlusherWorkerData } from "./flusher-protocol.js";
|
|
3
|
+
/**
|
|
4
|
+
* The flusher pass (SYNTHESIS_R5 §4.2), every 200 ms:
|
|
5
|
+
* 1. g_target := the highest generation received so far (FIFO: every
|
|
6
|
+
* registration or flush request handled before this tick is covered);
|
|
7
|
+
* 2. one F_FULLFSYNC per directory touched by a covered registration;
|
|
8
|
+
* 3. `PRAGMA data_version` → dirty := anything committed since the last
|
|
9
|
+
* PROVEN barrier (the first pass of a worker life is always dirty);
|
|
10
|
+
* 4. `PRAGMA wal_checkpoint(PASSIVE)` — space reclamation only; its result
|
|
11
|
+
* is reported as a fact and NEVER decides whether to sync;
|
|
12
|
+
* 5. if dirty: the explicit `fsyncSync(walFd)` — the barrier: it fixes the
|
|
13
|
+
* WAL frames and, as a device-wide barrier on macOS, the O_DSYNC file
|
|
14
|
+
* data already handed to the drive. Database pages become durable
|
|
15
|
+
* through the ff-checkpoint (`checkpoint_fullfsync=1` on every
|
|
16
|
+
* checkpointing connection) before the WAL is reused, not through this
|
|
17
|
+
* fsync (R5_AMENDMENTS B5);
|
|
18
|
+
* 6. `synced(g_target)` with the pass facts.
|
|
19
|
+
* The worker never writes a row and never waits for a lock. `node:sqlite` is
|
|
20
|
+
* imported lazily so the daemon package loads on a Node without it and the
|
|
21
|
+
* typed `engine_runtime_unsupported` stays reachable.
|
|
22
|
+
*/
|
|
23
|
+
export declare function runFlusherWorker(port: MessagePort, data: FlusherWorkerData): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=flusher-worker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusher-worker.d.ts","sourceRoot":"","sources":["../../src/store/flusher-worker.ts"],"names":[],"mappings":"AACA,OAAO,EAAwC,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAI7F,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqJhG"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { closeSync, fstatSync, fsyncSync, openSync, statSync } from "node:fs";
|
|
2
|
+
import { isMainThread, parentPort, workerData } from "node:worker_threads";
|
|
3
|
+
import { fsyncDirectory } from "@claudexor/util";
|
|
4
|
+
import { applyPragmas, FLUSHER_CONNECTION_PRAGMAS } from "./pragmas.js";
|
|
5
|
+
import { loadEngineRuntime } from "./runtime.js";
|
|
6
|
+
import { FLUSH_INTERVAL_MS, STORE_WORKER_DATA_KEY, } from "./flusher-protocol.js";
|
|
7
|
+
/**
|
|
8
|
+
* The flusher pass (SYNTHESIS_R5 §4.2), every 200 ms:
|
|
9
|
+
* 1. g_target := the highest generation received so far (FIFO: every
|
|
10
|
+
* registration or flush request handled before this tick is covered);
|
|
11
|
+
* 2. one F_FULLFSYNC per directory touched by a covered registration;
|
|
12
|
+
* 3. `PRAGMA data_version` → dirty := anything committed since the last
|
|
13
|
+
* PROVEN barrier (the first pass of a worker life is always dirty);
|
|
14
|
+
* 4. `PRAGMA wal_checkpoint(PASSIVE)` — space reclamation only; its result
|
|
15
|
+
* is reported as a fact and NEVER decides whether to sync;
|
|
16
|
+
* 5. if dirty: the explicit `fsyncSync(walFd)` — the barrier: it fixes the
|
|
17
|
+
* WAL frames and, as a device-wide barrier on macOS, the O_DSYNC file
|
|
18
|
+
* data already handed to the drive. Database pages become durable
|
|
19
|
+
* through the ff-checkpoint (`checkpoint_fullfsync=1` on every
|
|
20
|
+
* checkpointing connection) before the WAL is reused, not through this
|
|
21
|
+
* fsync (R5_AMENDMENTS B5);
|
|
22
|
+
* 6. `synced(g_target)` with the pass facts.
|
|
23
|
+
* The worker never writes a row and never waits for a lock. `node:sqlite` is
|
|
24
|
+
* imported lazily so the daemon package loads on a Node without it and the
|
|
25
|
+
* typed `engine_runtime_unsupported` stays reachable.
|
|
26
|
+
*/
|
|
27
|
+
export async function runFlusherWorker(port, data) {
|
|
28
|
+
const hooks = data.hooks ?? {};
|
|
29
|
+
const walPath = `${data.dbPath}-wal`;
|
|
30
|
+
const { sqlite } = await loadEngineRuntime();
|
|
31
|
+
const db = new sqlite.DatabaseSync(data.dbPath, { timeout: 0 });
|
|
32
|
+
applyPragmas(db, FLUSHER_CONNECTION_PRAGMAS);
|
|
33
|
+
const dataVersion = db.prepare("PRAGMA data_version");
|
|
34
|
+
const passive = db.prepare("PRAGMA wal_checkpoint(PASSIVE)");
|
|
35
|
+
const counters = {
|
|
36
|
+
passes: 0,
|
|
37
|
+
barriers: 0,
|
|
38
|
+
dirSyncs: 0,
|
|
39
|
+
busyPassive: 0,
|
|
40
|
+
walReopens: 0,
|
|
41
|
+
};
|
|
42
|
+
const pendingDirs = new Set();
|
|
43
|
+
let gMax = 0;
|
|
44
|
+
let lastProvenDataVersion = null;
|
|
45
|
+
let walFd = null;
|
|
46
|
+
let timer = null;
|
|
47
|
+
let stopped = false;
|
|
48
|
+
const post = (event) => port.postMessage(event);
|
|
49
|
+
const closeWal = () => {
|
|
50
|
+
if (walFd === null)
|
|
51
|
+
return;
|
|
52
|
+
closeSync(walFd);
|
|
53
|
+
walFd = null;
|
|
54
|
+
};
|
|
55
|
+
/** `r+` on the WAL file, never written through; reopened when the inode moved. */
|
|
56
|
+
const ensureWalFd = () => {
|
|
57
|
+
const onDisk = statSync(walPath, { throwIfNoEntry: false });
|
|
58
|
+
if (walFd !== null) {
|
|
59
|
+
if (onDisk && fstatSync(walFd).ino === onDisk.ino)
|
|
60
|
+
return walFd;
|
|
61
|
+
closeWal();
|
|
62
|
+
counters.walReopens += 1;
|
|
63
|
+
}
|
|
64
|
+
walFd = openSync(walPath, "r+");
|
|
65
|
+
return walFd;
|
|
66
|
+
};
|
|
67
|
+
const pass = () => {
|
|
68
|
+
if (stopped)
|
|
69
|
+
return;
|
|
70
|
+
const started = performance.now();
|
|
71
|
+
const gTarget = gMax;
|
|
72
|
+
const dirsSynced = [];
|
|
73
|
+
const dirsMissing = [];
|
|
74
|
+
for (const dir of pendingDirs) {
|
|
75
|
+
// A directory removed since its registration has no entries left to
|
|
76
|
+
// make durable; whoever removed it registered the parent. Any other
|
|
77
|
+
// failure is fatal to this worker life (fail loud, restart).
|
|
78
|
+
try {
|
|
79
|
+
fsyncDirectory(dir);
|
|
80
|
+
dirsSynced.push(dir);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
const code = error.code;
|
|
84
|
+
if (code !== "ENOENT" && code !== "ENOTDIR")
|
|
85
|
+
throw error;
|
|
86
|
+
dirsMissing.push(dir);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
pendingDirs.clear();
|
|
90
|
+
counters.dirSyncs += dirsSynced.length;
|
|
91
|
+
const observed = Number(dataVersion.get().data_version);
|
|
92
|
+
const dirty = lastProvenDataVersion === null || observed !== lastProvenDataVersion;
|
|
93
|
+
const checkpointRow = passive.get();
|
|
94
|
+
const checkpoint = checkpointRow
|
|
95
|
+
? {
|
|
96
|
+
busy: Number(checkpointRow.busy),
|
|
97
|
+
log: Number(checkpointRow.log),
|
|
98
|
+
checkpointed: Number(checkpointRow.checkpointed),
|
|
99
|
+
}
|
|
100
|
+
: null;
|
|
101
|
+
if (checkpoint?.busy)
|
|
102
|
+
counters.busyPassive += 1;
|
|
103
|
+
if (hooks.passDelayMs) {
|
|
104
|
+
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, hooks.passDelayMs);
|
|
105
|
+
}
|
|
106
|
+
let barrier = false;
|
|
107
|
+
let barrierMs = null;
|
|
108
|
+
if (dirty) {
|
|
109
|
+
const fd = ensureWalFd();
|
|
110
|
+
const t0 = performance.now();
|
|
111
|
+
fsyncSync(fd);
|
|
112
|
+
barrierMs = performance.now() - t0;
|
|
113
|
+
barrier = true;
|
|
114
|
+
counters.barriers += 1;
|
|
115
|
+
lastProvenDataVersion = observed;
|
|
116
|
+
}
|
|
117
|
+
counters.passes += 1;
|
|
118
|
+
const wal = statSync(walPath, { throwIfNoEntry: false });
|
|
119
|
+
post({
|
|
120
|
+
type: "synced",
|
|
121
|
+
report: {
|
|
122
|
+
g: gTarget,
|
|
123
|
+
dirty,
|
|
124
|
+
barrier,
|
|
125
|
+
dirsSynced,
|
|
126
|
+
dirsMissing,
|
|
127
|
+
checkpoint,
|
|
128
|
+
walBytes: wal ? wal.size : null,
|
|
129
|
+
passMs: performance.now() - started,
|
|
130
|
+
barrierMs,
|
|
131
|
+
counters: { ...counters },
|
|
132
|
+
at: Date.now(),
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
const stop = () => {
|
|
137
|
+
stopped = true;
|
|
138
|
+
if (timer)
|
|
139
|
+
clearTimeout(timer);
|
|
140
|
+
timer = null;
|
|
141
|
+
closeWal();
|
|
142
|
+
db.close();
|
|
143
|
+
post({ type: "stopped" });
|
|
144
|
+
port.close();
|
|
145
|
+
};
|
|
146
|
+
const schedule = () => {
|
|
147
|
+
if (stopped || hooks.manualTick)
|
|
148
|
+
return;
|
|
149
|
+
timer = setTimeout(() => {
|
|
150
|
+
pass();
|
|
151
|
+
schedule();
|
|
152
|
+
}, FLUSH_INTERVAL_MS);
|
|
153
|
+
};
|
|
154
|
+
port.on("message", (command) => {
|
|
155
|
+
switch (command.type) {
|
|
156
|
+
case "register":
|
|
157
|
+
pendingDirs.add(command.dir);
|
|
158
|
+
gMax = Math.max(gMax, command.g);
|
|
159
|
+
return;
|
|
160
|
+
case "flush":
|
|
161
|
+
gMax = Math.max(gMax, command.g);
|
|
162
|
+
return;
|
|
163
|
+
case "tick":
|
|
164
|
+
if (hooks.manualTick)
|
|
165
|
+
pass();
|
|
166
|
+
return;
|
|
167
|
+
case "exit":
|
|
168
|
+
if (hooks.allowExit)
|
|
169
|
+
process.exit(command.code);
|
|
170
|
+
return;
|
|
171
|
+
case "stop":
|
|
172
|
+
stop();
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
post({ type: "ready", at: Date.now() });
|
|
177
|
+
schedule();
|
|
178
|
+
}
|
|
179
|
+
const spawnData = workerData;
|
|
180
|
+
if (!isMainThread && parentPort && spawnData?.[STORE_WORKER_DATA_KEY] === "flusher") {
|
|
181
|
+
void runFlusherWorker(parentPort, spawnData).catch((error) => {
|
|
182
|
+
throw error;
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=flusher-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusher-worker.js","sourceRoot":"","sources":["../../src/store/flusher-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type FlusherCounters, type FlusherHooks, type FlusherPassReport } from "./flusher-protocol.js";
|
|
2
|
+
import "./flusher-worker.js";
|
|
3
|
+
export interface FlusherFacts {
|
|
4
|
+
state: "starting" | "up" | "down";
|
|
5
|
+
interval_ms: number;
|
|
6
|
+
generation: number;
|
|
7
|
+
acknowledged_generation: number;
|
|
8
|
+
pending_registrations: number;
|
|
9
|
+
pending_waiters: number;
|
|
10
|
+
/** Age of the oldest outstanding registration or waiter; 0 when nothing waits. */
|
|
11
|
+
flush_lag_ms: number;
|
|
12
|
+
last_barrier_at: string | null;
|
|
13
|
+
last_pass: {
|
|
14
|
+
at: string;
|
|
15
|
+
pass_ms: number;
|
|
16
|
+
barrier_ms: number | null;
|
|
17
|
+
dirty: boolean;
|
|
18
|
+
barrier: boolean;
|
|
19
|
+
wal_bytes: number | null;
|
|
20
|
+
checkpoint: FlusherPassReport["checkpoint"];
|
|
21
|
+
} | null;
|
|
22
|
+
counters: FlusherCounters & {
|
|
23
|
+
restarts: number;
|
|
24
|
+
deaths: number;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export interface FlusherControllerOptions {
|
|
28
|
+
dbPath: string;
|
|
29
|
+
workerEntry?: string;
|
|
30
|
+
hooks?: FlusherHooks;
|
|
31
|
+
log?: (line: string) => void;
|
|
32
|
+
onSynced?: (generation: number, report: FlusherPassReport) => void;
|
|
33
|
+
/** Native Worker error transport retains SQLite's code/errcode. */
|
|
34
|
+
onError?: (error: Error) => void;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Main-thread side of the flusher (SYNTHESIS_R5 §4.3): owns the monotonic
|
|
38
|
+
* generation `g`, hands one to every external-file registration and every
|
|
39
|
+
* `flushed()` call, forwards them to the worker in order, and resolves them
|
|
40
|
+
* on `synced(G)`. Unacknowledged registrations live here and are replayed to
|
|
41
|
+
* a restarted worker; waiters that predate a worker death are rejected typed
|
|
42
|
+
* (`store_flush_unavailable`) — the commit is intact, only the power-loss
|
|
43
|
+
* barrier is unproven until the next worker proves one.
|
|
44
|
+
*/
|
|
45
|
+
export declare class FlusherController {
|
|
46
|
+
private readonly options;
|
|
47
|
+
private readonly entry;
|
|
48
|
+
private worker;
|
|
49
|
+
private state;
|
|
50
|
+
private generation;
|
|
51
|
+
private acknowledged;
|
|
52
|
+
private readonly outstanding;
|
|
53
|
+
private readonly waiters;
|
|
54
|
+
private lastReport;
|
|
55
|
+
private lastBarrierAt;
|
|
56
|
+
private counters;
|
|
57
|
+
private restarts;
|
|
58
|
+
private deaths;
|
|
59
|
+
private closing;
|
|
60
|
+
private readyInThisLife;
|
|
61
|
+
private restartTimer;
|
|
62
|
+
constructor(options: FlusherControllerOptions);
|
|
63
|
+
/** Spawn the worker and wait until it opened its connection (or died trying). */
|
|
64
|
+
start(): Promise<void>;
|
|
65
|
+
nextGeneration(): number;
|
|
66
|
+
/** A directory whose entries changed (rename/link); fsynced in the covering pass. */
|
|
67
|
+
register(dir: string): number;
|
|
68
|
+
/** A generation with no waiter: "everything up to now" for an obligation to clear on. */
|
|
69
|
+
mark(): number;
|
|
70
|
+
/** Resolves once a pass that started after this call proved its barrier. */
|
|
71
|
+
flushed(): Promise<void>;
|
|
72
|
+
/** Resolves once an already issued generation (a mark or registration) is acknowledged. */
|
|
73
|
+
awaitGeneration(g: number): Promise<void>;
|
|
74
|
+
private addWaiter;
|
|
75
|
+
private eachWaiter;
|
|
76
|
+
facts(): FlusherFacts;
|
|
77
|
+
/** Test seam: run one pass now (worker spawned with `manualTick`). */
|
|
78
|
+
tick(): void;
|
|
79
|
+
/** Test seam: make the worker exit (worker spawned with `allowExit`). */
|
|
80
|
+
requestExit(code: number): void;
|
|
81
|
+
stop(): Promise<void>;
|
|
82
|
+
private send;
|
|
83
|
+
private spawn;
|
|
84
|
+
private onSynced;
|
|
85
|
+
private onDeath;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=flusher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusher.d.ts","sourceRoot":"","sources":["../../src/store/flusher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { Worker } from "node:worker_threads";
|
|
2
|
+
import { StoreFlushUnavailableError } from "./errors.js";
|
|
3
|
+
import { FLUSH_INTERVAL_MS, STORE_WORKER_DATA_KEY, resolveStoreWorkerEntry, } from "./flusher-protocol.js";
|
|
4
|
+
// Static import: the worker module must be part of this module graph so the
|
|
5
|
+
// single-file daemon bundle embeds it (its self-start is inert on the main thread).
|
|
6
|
+
import "./flusher-worker.js";
|
|
7
|
+
/**
|
|
8
|
+
* Main-thread side of the flusher (SYNTHESIS_R5 §4.3): owns the monotonic
|
|
9
|
+
* generation `g`, hands one to every external-file registration and every
|
|
10
|
+
* `flushed()` call, forwards them to the worker in order, and resolves them
|
|
11
|
+
* on `synced(G)`. Unacknowledged registrations live here and are replayed to
|
|
12
|
+
* a restarted worker; waiters that predate a worker death are rejected typed
|
|
13
|
+
* (`store_flush_unavailable`) — the commit is intact, only the power-loss
|
|
14
|
+
* barrier is unproven until the next worker proves one.
|
|
15
|
+
*/
|
|
16
|
+
export class FlusherController {
|
|
17
|
+
options;
|
|
18
|
+
entry;
|
|
19
|
+
worker = null;
|
|
20
|
+
state = "starting";
|
|
21
|
+
generation = 0;
|
|
22
|
+
acknowledged = 0;
|
|
23
|
+
outstanding = [];
|
|
24
|
+
waiters = new Map();
|
|
25
|
+
lastReport = null;
|
|
26
|
+
lastBarrierAt = null;
|
|
27
|
+
counters = {
|
|
28
|
+
passes: 0,
|
|
29
|
+
barriers: 0,
|
|
30
|
+
dirSyncs: 0,
|
|
31
|
+
busyPassive: 0,
|
|
32
|
+
walReopens: 0,
|
|
33
|
+
};
|
|
34
|
+
restarts = 0;
|
|
35
|
+
deaths = 0;
|
|
36
|
+
closing = false;
|
|
37
|
+
readyInThisLife = false;
|
|
38
|
+
restartTimer = null;
|
|
39
|
+
constructor(options) {
|
|
40
|
+
this.options = options;
|
|
41
|
+
this.entry =
|
|
42
|
+
options.workerEntry ?? resolveStoreWorkerEntry(import.meta.url, "flusher-worker.js");
|
|
43
|
+
}
|
|
44
|
+
/** Spawn the worker and wait until it opened its connection (or died trying). */
|
|
45
|
+
start() {
|
|
46
|
+
return new Promise((resolve) => {
|
|
47
|
+
this.spawn(resolve);
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
nextGeneration() {
|
|
51
|
+
this.generation += 1;
|
|
52
|
+
return this.generation;
|
|
53
|
+
}
|
|
54
|
+
/** A directory whose entries changed (rename/link); fsynced in the covering pass. */
|
|
55
|
+
register(dir) {
|
|
56
|
+
const g = this.nextGeneration();
|
|
57
|
+
this.send({ g, since: performance.now(), command: { type: "register", g, dir } });
|
|
58
|
+
return g;
|
|
59
|
+
}
|
|
60
|
+
/** A generation with no waiter: "everything up to now" for an obligation to clear on. */
|
|
61
|
+
mark() {
|
|
62
|
+
const g = this.nextGeneration();
|
|
63
|
+
this.send({ g, since: performance.now(), command: { type: "flush", g } });
|
|
64
|
+
return g;
|
|
65
|
+
}
|
|
66
|
+
/** Resolves once a pass that started after this call proved its barrier. */
|
|
67
|
+
flushed() {
|
|
68
|
+
const g = this.nextGeneration();
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
this.addWaiter(g, { resolve, reject, since: performance.now() });
|
|
71
|
+
this.send({ g, since: performance.now(), command: { type: "flush", g } });
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/** Resolves once an already issued generation (a mark or registration) is acknowledged. */
|
|
75
|
+
awaitGeneration(g) {
|
|
76
|
+
if (g <= this.acknowledged)
|
|
77
|
+
return Promise.resolve();
|
|
78
|
+
return new Promise((resolve, reject) => {
|
|
79
|
+
this.addWaiter(g, { resolve, reject, since: performance.now() });
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
addWaiter(g, waiter) {
|
|
83
|
+
const list = this.waiters.get(g);
|
|
84
|
+
if (list)
|
|
85
|
+
list.push(waiter);
|
|
86
|
+
else
|
|
87
|
+
this.waiters.set(g, [waiter]);
|
|
88
|
+
}
|
|
89
|
+
eachWaiter(fn) {
|
|
90
|
+
for (const [g, list] of this.waiters)
|
|
91
|
+
for (const waiter of list)
|
|
92
|
+
fn(g, waiter);
|
|
93
|
+
}
|
|
94
|
+
facts() {
|
|
95
|
+
const now = performance.now();
|
|
96
|
+
let oldest = null;
|
|
97
|
+
for (const entry of this.outstanding)
|
|
98
|
+
oldest = oldest === null ? entry.since : Math.min(oldest, entry.since);
|
|
99
|
+
this.eachWaiter((_g, waiter) => {
|
|
100
|
+
oldest = oldest === null ? waiter.since : Math.min(oldest, waiter.since);
|
|
101
|
+
});
|
|
102
|
+
const last = this.lastReport;
|
|
103
|
+
return {
|
|
104
|
+
state: this.state,
|
|
105
|
+
interval_ms: FLUSH_INTERVAL_MS,
|
|
106
|
+
generation: this.generation,
|
|
107
|
+
acknowledged_generation: this.acknowledged,
|
|
108
|
+
pending_registrations: this.outstanding.filter((e) => e.command.type === "register").length,
|
|
109
|
+
pending_waiters: [...this.waiters.values()].reduce((n, list) => n + list.length, 0),
|
|
110
|
+
flush_lag_ms: oldest === null ? 0 : Math.round(now - oldest),
|
|
111
|
+
last_barrier_at: this.lastBarrierAt === null ? null : new Date(this.lastBarrierAt).toISOString(),
|
|
112
|
+
last_pass: last
|
|
113
|
+
? {
|
|
114
|
+
at: new Date(last.at).toISOString(),
|
|
115
|
+
pass_ms: last.passMs,
|
|
116
|
+
barrier_ms: last.barrierMs,
|
|
117
|
+
dirty: last.dirty,
|
|
118
|
+
barrier: last.barrier,
|
|
119
|
+
wal_bytes: last.walBytes,
|
|
120
|
+
checkpoint: last.checkpoint,
|
|
121
|
+
}
|
|
122
|
+
: null,
|
|
123
|
+
counters: { ...this.counters, restarts: this.restarts, deaths: this.deaths },
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/** Test seam: run one pass now (worker spawned with `manualTick`). */
|
|
127
|
+
tick() {
|
|
128
|
+
this.worker?.postMessage({ type: "tick" });
|
|
129
|
+
}
|
|
130
|
+
/** Test seam: make the worker exit (worker spawned with `allowExit`). */
|
|
131
|
+
requestExit(code) {
|
|
132
|
+
this.worker?.postMessage({ type: "exit", code });
|
|
133
|
+
}
|
|
134
|
+
async stop() {
|
|
135
|
+
this.closing = true;
|
|
136
|
+
if (this.restartTimer) {
|
|
137
|
+
clearTimeout(this.restartTimer);
|
|
138
|
+
clearImmediate(this.restartTimer);
|
|
139
|
+
this.restartTimer = null;
|
|
140
|
+
}
|
|
141
|
+
const worker = this.worker;
|
|
142
|
+
this.worker = null;
|
|
143
|
+
this.eachWaiter((g, waiter) => waiter.reject(new StoreFlushUnavailableError(g, "engine store is closing")));
|
|
144
|
+
this.waiters.clear();
|
|
145
|
+
if (!worker)
|
|
146
|
+
return;
|
|
147
|
+
const exited = new Promise((resolve) => worker.once("exit", () => resolve()));
|
|
148
|
+
worker.postMessage({ type: "stop" });
|
|
149
|
+
await Promise.race([exited, new Promise((r) => setTimeout(r, FLUSH_INTERVAL_MS * 5))]);
|
|
150
|
+
await worker.terminate();
|
|
151
|
+
this.state = "down";
|
|
152
|
+
}
|
|
153
|
+
send(entry) {
|
|
154
|
+
this.outstanding.push(entry);
|
|
155
|
+
this.worker?.postMessage(entry.command);
|
|
156
|
+
}
|
|
157
|
+
spawn(onSettled) {
|
|
158
|
+
if (this.closing)
|
|
159
|
+
return;
|
|
160
|
+
const data = {
|
|
161
|
+
[STORE_WORKER_DATA_KEY]: "flusher",
|
|
162
|
+
dbPath: this.options.dbPath,
|
|
163
|
+
hooks: this.options.hooks ?? {},
|
|
164
|
+
};
|
|
165
|
+
const worker = new Worker(this.entry, { workerData: data, name: "claudexor-store-flusher" });
|
|
166
|
+
this.worker = worker;
|
|
167
|
+
this.state = "starting";
|
|
168
|
+
this.readyInThisLife = false;
|
|
169
|
+
let settled = false;
|
|
170
|
+
const settle = () => {
|
|
171
|
+
if (settled)
|
|
172
|
+
return;
|
|
173
|
+
settled = true;
|
|
174
|
+
onSettled?.();
|
|
175
|
+
};
|
|
176
|
+
worker.on("message", (event) => {
|
|
177
|
+
if (this.worker !== worker)
|
|
178
|
+
return;
|
|
179
|
+
if (event.type === "ready") {
|
|
180
|
+
this.readyInThisLife = true;
|
|
181
|
+
this.state = "up";
|
|
182
|
+
settle();
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
if (event.type === "synced")
|
|
186
|
+
this.onSynced(event.report);
|
|
187
|
+
});
|
|
188
|
+
worker.on("error", (error) => {
|
|
189
|
+
if (this.worker !== worker || this.closing)
|
|
190
|
+
return;
|
|
191
|
+
this.options.onError?.(error);
|
|
192
|
+
this.options.log?.(`store flusher worker error: ${error.message}`);
|
|
193
|
+
});
|
|
194
|
+
worker.on("exit", (code) => {
|
|
195
|
+
if (this.worker !== worker)
|
|
196
|
+
return;
|
|
197
|
+
this.worker = null;
|
|
198
|
+
if (this.closing)
|
|
199
|
+
return;
|
|
200
|
+
this.onDeath(code);
|
|
201
|
+
settle();
|
|
202
|
+
});
|
|
203
|
+
// Replay everything the previous life never acknowledged, in generation order.
|
|
204
|
+
for (const entry of this.outstanding)
|
|
205
|
+
worker.postMessage(entry.command);
|
|
206
|
+
}
|
|
207
|
+
onSynced(report) {
|
|
208
|
+
this.lastReport = report;
|
|
209
|
+
this.counters = report.counters;
|
|
210
|
+
if (report.barrier)
|
|
211
|
+
this.lastBarrierAt = report.at;
|
|
212
|
+
if (report.g > this.acknowledged)
|
|
213
|
+
this.acknowledged = report.g;
|
|
214
|
+
let kept = 0;
|
|
215
|
+
for (const entry of this.outstanding) {
|
|
216
|
+
if (entry.g > report.g)
|
|
217
|
+
this.outstanding[kept++] = entry;
|
|
218
|
+
}
|
|
219
|
+
this.outstanding.length = kept;
|
|
220
|
+
for (const [g, list] of this.waiters) {
|
|
221
|
+
if (g <= report.g) {
|
|
222
|
+
this.waiters.delete(g);
|
|
223
|
+
for (const waiter of list)
|
|
224
|
+
waiter.resolve();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
this.options.onSynced?.(report.g, report);
|
|
228
|
+
}
|
|
229
|
+
onDeath(code) {
|
|
230
|
+
this.deaths += 1;
|
|
231
|
+
this.state = "down";
|
|
232
|
+
this.options.log?.(`store flusher worker exited with code ${code}; restarting`);
|
|
233
|
+
// Waiters created before the death are rejected typed; their flush
|
|
234
|
+
// commands are dropped, registrations stay outstanding for the replay.
|
|
235
|
+
this.eachWaiter((g, waiter) => waiter.reject(new StoreFlushUnavailableError(g, `the flusher worker exited with code ${code}`)));
|
|
236
|
+
this.waiters.clear();
|
|
237
|
+
let kept = 0;
|
|
238
|
+
for (const entry of this.outstanding) {
|
|
239
|
+
if (entry.command.type === "register")
|
|
240
|
+
this.outstanding[kept++] = entry;
|
|
241
|
+
}
|
|
242
|
+
this.outstanding.length = kept;
|
|
243
|
+
// A worker that never reported ready failed at startup; retry after one
|
|
244
|
+
// interval instead of spinning on the next tick.
|
|
245
|
+
const restart = () => {
|
|
246
|
+
this.restartTimer = null;
|
|
247
|
+
if (this.closing)
|
|
248
|
+
return;
|
|
249
|
+
this.restarts += 1;
|
|
250
|
+
this.spawn();
|
|
251
|
+
// Drive the new worker's g_target to the current generation so the next
|
|
252
|
+
// pass covers every commit made during the gap.
|
|
253
|
+
this.send({
|
|
254
|
+
g: this.generation,
|
|
255
|
+
since: performance.now(),
|
|
256
|
+
command: { type: "flush", g: this.generation },
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
this.restartTimer = this.readyInThisLife
|
|
260
|
+
? setImmediate(restart)
|
|
261
|
+
: setTimeout(restart, FLUSH_INTERVAL_MS);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=flusher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flusher.js","sourceRoot":"","sources":["../../src/store/flusher.ts"],"names":[],"mappings":"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"}
|