@n-dx/web 0.1.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/LICENSE +96 -0
- package/README.md +5 -0
- package/build.js +243 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.js +50 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/landing/index.html +325 -0
- package/dist/landing/landing.d.ts +38 -0
- package/dist/landing/landing.js +299 -0
- package/dist/landing/landing.js.map +1 -0
- package/dist/public.d.ts +55 -0
- package/dist/public.js +51 -0
- package/dist/public.js.map +1 -0
- package/dist/schema/features.d.ts +28 -0
- package/dist/schema/features.js +9 -0
- package/dist/schema/features.js.map +1 -0
- package/dist/schema/v1.d.ts +317 -0
- package/dist/schema/v1.js +3 -0
- package/dist/schema/v1.js.map +1 -0
- package/dist/server/aggregation-cache.d.ts +105 -0
- package/dist/server/aggregation-cache.js +163 -0
- package/dist/server/aggregation-cache.js.map +1 -0
- package/dist/server/concurrent-execution-metrics.d.ts +103 -0
- package/dist/server/concurrent-execution-metrics.js +253 -0
- package/dist/server/concurrent-execution-metrics.js.map +1 -0
- package/dist/server/domain-gateway.d.ts +18 -0
- package/dist/server/domain-gateway.js +19 -0
- package/dist/server/domain-gateway.js.map +1 -0
- package/dist/server/incremental-task-usage.d.ts +92 -0
- package/dist/server/incremental-task-usage.js +251 -0
- package/dist/server/incremental-task-usage.js.map +1 -0
- package/dist/server/index.d.ts +39 -0
- package/dist/server/index.js +36 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/port.d.ts +96 -0
- package/dist/server/port.js +134 -0
- package/dist/server/port.js.map +1 -0
- package/dist/server/pr-markdown-refresh-diagnostics.d.ts +59 -0
- package/dist/server/pr-markdown-refresh-diagnostics.js +429 -0
- package/dist/server/pr-markdown-refresh-diagnostics.js.map +1 -0
- package/dist/server/prd-io.d.ts +40 -0
- package/dist/server/prd-io.js +66 -0
- package/dist/server/prd-io.js.map +1 -0
- package/dist/server/process-memory-tracker.d.ts +79 -0
- package/dist/server/process-memory-tracker.js +194 -0
- package/dist/server/process-memory-tracker.js.map +1 -0
- package/dist/server/register-scheduler.d.ts +53 -0
- package/dist/server/register-scheduler.js +36 -0
- package/dist/server/register-scheduler.js.map +1 -0
- package/dist/server/rex-gateway.d.ts +39 -0
- package/dist/server/rex-gateway.js +47 -0
- package/dist/server/rex-gateway.js.map +1 -0
- package/dist/server/routes-adaptive.d.ts +21 -0
- package/dist/server/routes-adaptive.js +659 -0
- package/dist/server/routes-adaptive.js.map +1 -0
- package/dist/server/routes-config.d.ts +47 -0
- package/dist/server/routes-config.js +222 -0
- package/dist/server/routes-config.js.map +1 -0
- package/dist/server/routes-data.d.ts +14 -0
- package/dist/server/routes-data.js +129 -0
- package/dist/server/routes-data.js.map +1 -0
- package/dist/server/routes-features.d.ts +14 -0
- package/dist/server/routes-features.js +245 -0
- package/dist/server/routes-features.js.map +1 -0
- package/dist/server/routes-hench.d.ts +116 -0
- package/dist/server/routes-hench.js +2016 -0
- package/dist/server/routes-hench.js.map +1 -0
- package/dist/server/routes-integrations.d.ts +23 -0
- package/dist/server/routes-integrations.js +277 -0
- package/dist/server/routes-integrations.js.map +1 -0
- package/dist/server/routes-mcp.d.ts +31 -0
- package/dist/server/routes-mcp.js +175 -0
- package/dist/server/routes-mcp.js.map +1 -0
- package/dist/server/routes-notion.d.ts +23 -0
- package/dist/server/routes-notion.js +723 -0
- package/dist/server/routes-notion.js.map +1 -0
- package/dist/server/routes-project.d.ts +47 -0
- package/dist/server/routes-project.js +128 -0
- package/dist/server/routes-project.js.map +1 -0
- package/dist/server/routes-rex/analysis.d.ts +11 -0
- package/dist/server/routes-rex/analysis.js +583 -0
- package/dist/server/routes-rex/analysis.js.map +1 -0
- package/dist/server/routes-rex/execution.d.ts +37 -0
- package/dist/server/routes-rex/execution.js +355 -0
- package/dist/server/routes-rex/execution.js.map +1 -0
- package/dist/server/routes-rex/health.d.ts +8 -0
- package/dist/server/routes-rex/health.js +136 -0
- package/dist/server/routes-rex/health.js.map +1 -0
- package/dist/server/routes-rex/index.d.ts +35 -0
- package/dist/server/routes-rex/index.js +72 -0
- package/dist/server/routes-rex/index.js.map +1 -0
- package/dist/server/routes-rex/items.d.ts +8 -0
- package/dist/server/routes-rex/items.js +359 -0
- package/dist/server/routes-rex/items.js.map +1 -0
- package/dist/server/routes-rex/prune.d.ts +11 -0
- package/dist/server/routes-rex/prune.js +379 -0
- package/dist/server/routes-rex/prune.js.map +1 -0
- package/dist/server/routes-rex/reads.d.ts +9 -0
- package/dist/server/routes-rex/reads.js +119 -0
- package/dist/server/routes-rex/reads.js.map +1 -0
- package/dist/server/routes-rex/requirements.d.ts +10 -0
- package/dist/server/routes-rex/requirements.js +408 -0
- package/dist/server/routes-rex/requirements.js.map +1 -0
- package/dist/server/routes-rex/shared.d.ts +37 -0
- package/dist/server/routes-rex/shared.js +73 -0
- package/dist/server/routes-rex/shared.js.map +1 -0
- package/dist/server/routes-search.d.ts +26 -0
- package/dist/server/routes-search.js +82 -0
- package/dist/server/routes-search.js.map +1 -0
- package/dist/server/routes-sourcevision.d.ts +18 -0
- package/dist/server/routes-sourcevision.js +444 -0
- package/dist/server/routes-sourcevision.js.map +1 -0
- package/dist/server/routes-static.d.ts +20 -0
- package/dist/server/routes-static.js +168 -0
- package/dist/server/routes-static.js.map +1 -0
- package/dist/server/routes-status.d.ts +58 -0
- package/dist/server/routes-status.js +191 -0
- package/dist/server/routes-status.js.map +1 -0
- package/dist/server/routes-token-usage.d.ts +63 -0
- package/dist/server/routes-token-usage.js +720 -0
- package/dist/server/routes-token-usage.js.map +1 -0
- package/dist/server/routes-validation.d.ts +10 -0
- package/dist/server/routes-validation.js +365 -0
- package/dist/server/routes-validation.js.map +1 -0
- package/dist/server/routes-workflow.d.ts +15 -0
- package/dist/server/routes-workflow.js +498 -0
- package/dist/server/routes-workflow.js.map +1 -0
- package/dist/server/search-index.d.ts +111 -0
- package/dist/server/search-index.js +348 -0
- package/dist/server/search-index.js.map +1 -0
- package/dist/server/shared-types.d.ts +65 -0
- package/dist/server/shared-types.js +31 -0
- package/dist/server/shared-types.js.map +1 -0
- package/dist/server/start.d.ts +68 -0
- package/dist/server/start.js +568 -0
- package/dist/server/start.js.map +1 -0
- package/dist/server/task-usage.d.ts +17 -0
- package/dist/server/task-usage.js +20 -0
- package/dist/server/task-usage.js.map +1 -0
- package/dist/server/types.d.ts +27 -0
- package/dist/server/types.js +26 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/usage-cleanup-scheduler.d.ts +107 -0
- package/dist/server/usage-cleanup-scheduler.js +232 -0
- package/dist/server/usage-cleanup-scheduler.js.map +1 -0
- package/dist/server/websocket.d.ts +131 -0
- package/dist/server/websocket.js +512 -0
- package/dist/server/websocket.js.map +1 -0
- package/dist/shared/data-files.d.ts +17 -0
- package/dist/shared/data-files.js +18 -0
- package/dist/shared/data-files.js.map +1 -0
- package/dist/shared/index.d.ts +9 -0
- package/dist/shared/index.js +9 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/view-id.d.ts +8 -0
- package/dist/shared/view-id.js +9 -0
- package/dist/shared/view-id.js.map +1 -0
- package/dist/viewer/Hench-F.png +0 -0
- package/dist/viewer/Rex-F.png +0 -0
- package/dist/viewer/SourceVision-F.png +0 -0
- package/dist/viewer/SourceVision.png +0 -0
- package/dist/viewer/api.d.ts +19 -0
- package/dist/viewer/api.js +17 -0
- package/dist/viewer/api.js.map +1 -0
- package/dist/viewer/bootstrap.d.ts +13 -0
- package/dist/viewer/bootstrap.js +40 -0
- package/dist/viewer/bootstrap.js.map +1 -0
- package/dist/viewer/components/active-tasks-panel.d.ts +36 -0
- package/dist/viewer/components/active-tasks-panel.js +183 -0
- package/dist/viewer/components/active-tasks-panel.js.map +1 -0
- package/dist/viewer/components/breadcrumb.d.ts +21 -0
- package/dist/viewer/components/breadcrumb.js +117 -0
- package/dist/viewer/components/breadcrumb.js.map +1 -0
- package/dist/viewer/components/concurrency-panel.d.ts +18 -0
- package/dist/viewer/components/concurrency-panel.js +175 -0
- package/dist/viewer/components/concurrency-panel.js.map +1 -0
- package/dist/viewer/components/config-footer.d.ts +11 -0
- package/dist/viewer/components/config-footer.js +132 -0
- package/dist/viewer/components/config-footer.js.map +1 -0
- package/dist/viewer/components/constants.d.ts +10 -0
- package/dist/viewer/components/constants.js +11 -0
- package/dist/viewer/components/constants.js.map +1 -0
- package/dist/viewer/components/copy-link-button.d.ts +30 -0
- package/dist/viewer/components/copy-link-button.js +74 -0
- package/dist/viewer/components/copy-link-button.js.map +1 -0
- package/dist/viewer/components/crash-recovery-banner.d.ts +28 -0
- package/dist/viewer/components/crash-recovery-banner.js +47 -0
- package/dist/viewer/components/crash-recovery-banner.js.map +1 -0
- package/dist/viewer/components/data-display/collapsible-section.d.ts +14 -0
- package/dist/viewer/components/data-display/collapsible-section.js +66 -0
- package/dist/viewer/components/data-display/collapsible-section.js.map +1 -0
- package/dist/viewer/components/data-display/findings-list.d.ts +13 -0
- package/dist/viewer/components/data-display/findings-list.js +136 -0
- package/dist/viewer/components/data-display/findings-list.js.map +1 -0
- package/dist/viewer/components/data-display/health-gauge.d.ts +37 -0
- package/dist/viewer/components/data-display/health-gauge.js +62 -0
- package/dist/viewer/components/data-display/health-gauge.js.map +1 -0
- package/dist/viewer/components/data-display/mini-charts.d.ts +36 -0
- package/dist/viewer/components/data-display/mini-charts.js +124 -0
- package/dist/viewer/components/data-display/mini-charts.js.map +1 -0
- package/dist/viewer/components/data-display/tree-view.d.ts +18 -0
- package/dist/viewer/components/data-display/tree-view.js +107 -0
- package/dist/viewer/components/data-display/tree-view.js.map +1 -0
- package/dist/viewer/components/data-display/zone-map.d.ts +28 -0
- package/dist/viewer/components/data-display/zone-map.js +197 -0
- package/dist/viewer/components/data-display/zone-map.js.map +1 -0
- package/dist/viewer/components/degradation-banner.d.ts +28 -0
- package/dist/viewer/components/degradation-banner.js +47 -0
- package/dist/viewer/components/degradation-banner.js.map +1 -0
- package/dist/viewer/components/detail-panel.d.ts +12 -0
- package/dist/viewer/components/detail-panel.js +166 -0
- package/dist/viewer/components/detail-panel.js.map +1 -0
- package/dist/viewer/components/elapsed-time.d.ts +38 -0
- package/dist/viewer/components/elapsed-time.js +35 -0
- package/dist/viewer/components/elapsed-time.js.map +1 -0
- package/dist/viewer/components/faq.d.ts +12 -0
- package/dist/viewer/components/faq.js +237 -0
- package/dist/viewer/components/faq.js.map +1 -0
- package/dist/viewer/components/favicon.d.ts +30 -0
- package/dist/viewer/components/favicon.js +90 -0
- package/dist/viewer/components/favicon.js.map +1 -0
- package/dist/viewer/components/guide.d.ts +5 -0
- package/dist/viewer/components/guide.js +116 -0
- package/dist/viewer/components/guide.js.map +1 -0
- package/dist/viewer/components/index.d.ts +37 -0
- package/dist/viewer/components/index.js +46 -0
- package/dist/viewer/components/index.js.map +1 -0
- package/dist/viewer/components/logos.d.ts +42 -0
- package/dist/viewer/components/logos.js +46 -0
- package/dist/viewer/components/logos.js.map +1 -0
- package/dist/viewer/components/memory-panel.d.ts +19 -0
- package/dist/viewer/components/memory-panel.js +181 -0
- package/dist/viewer/components/memory-panel.js.map +1 -0
- package/dist/viewer/components/memory-warning.d.ts +23 -0
- package/dist/viewer/components/memory-warning.js +42 -0
- package/dist/viewer/components/memory-warning.js.map +1 -0
- package/dist/viewer/components/notion-schema-wizard.d.ts +16 -0
- package/dist/viewer/components/notion-schema-wizard.js +263 -0
- package/dist/viewer/components/notion-schema-wizard.js.map +1 -0
- package/dist/viewer/components/polling-suspension-indicator.d.ts +24 -0
- package/dist/viewer/components/polling-suspension-indicator.js +31 -0
- package/dist/viewer/components/polling-suspension-indicator.js.map +1 -0
- package/dist/viewer/components/prd-tree/add-item-form.d.ts +31 -0
- package/dist/viewer/components/prd-tree/add-item-form.js +231 -0
- package/dist/viewer/components/prd-tree/add-item-form.js.map +1 -0
- package/dist/viewer/components/prd-tree/analyze-panel.d.ts +13 -0
- package/dist/viewer/components/prd-tree/analyze-panel.js +245 -0
- package/dist/viewer/components/prd-tree/analyze-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.d.ts +34 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.js +415 -0
- package/dist/viewer/components/prd-tree/batch-import-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/bulk-actions.d.ts +19 -0
- package/dist/viewer/components/prd-tree/bulk-actions.js +90 -0
- package/dist/viewer/components/prd-tree/bulk-actions.js.map +1 -0
- package/dist/viewer/components/prd-tree/compute.d.ts +32 -0
- package/dist/viewer/components/prd-tree/compute.js +129 -0
- package/dist/viewer/components/prd-tree/compute.js.map +1 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.d.ts +23 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.js +83 -0
- package/dist/viewer/components/prd-tree/delete-confirmation.js.map +1 -0
- package/dist/viewer/components/prd-tree/execution-panel.d.ts +14 -0
- package/dist/viewer/components/prd-tree/execution-panel.js +291 -0
- package/dist/viewer/components/prd-tree/execution-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/facet-filter.d.ts +40 -0
- package/dist/viewer/components/prd-tree/facet-filter.js +188 -0
- package/dist/viewer/components/prd-tree/facet-filter.js.map +1 -0
- package/dist/viewer/components/prd-tree/index.d.ts +24 -0
- package/dist/viewer/components/prd-tree/index.js +16 -0
- package/dist/viewer/components/prd-tree/index.js.map +1 -0
- package/dist/viewer/components/prd-tree/inline-add-form.d.ts +32 -0
- package/dist/viewer/components/prd-tree/inline-add-form.js +175 -0
- package/dist/viewer/components/prd-tree/inline-add-form.js.map +1 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.d.ts +31 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.js +110 -0
- package/dist/viewer/components/prd-tree/inline-status-picker.js.map +1 -0
- package/dist/viewer/components/prd-tree/lazy-children.d.ts +40 -0
- package/dist/viewer/components/prd-tree/lazy-children.js +73 -0
- package/dist/viewer/components/prd-tree/lazy-children.js.map +1 -0
- package/dist/viewer/components/prd-tree/levels.d.ts +31 -0
- package/dist/viewer/components/prd-tree/levels.js +72 -0
- package/dist/viewer/components/prd-tree/levels.js.map +1 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.d.ts +105 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.js +173 -0
- package/dist/viewer/components/prd-tree/listener-lifecycle.js.map +1 -0
- package/dist/viewer/components/prd-tree/merge-preview.d.ts +25 -0
- package/dist/viewer/components/prd-tree/merge-preview.js +181 -0
- package/dist/viewer/components/prd-tree/merge-preview.js.map +1 -0
- package/dist/viewer/components/prd-tree/prd-tree.d.ts +91 -0
- package/dist/viewer/components/prd-tree/prd-tree.js +565 -0
- package/dist/viewer/components/prd-tree/prd-tree.js.map +1 -0
- package/dist/viewer/components/prd-tree/proposal-editor.d.ts +44 -0
- package/dist/viewer/components/prd-tree/proposal-editor.js +438 -0
- package/dist/viewer/components/prd-tree/proposal-editor.js.map +1 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.d.ts +25 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.js +336 -0
- package/dist/viewer/components/prd-tree/prune-confirmation.js.map +1 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.d.ts +39 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.js +319 -0
- package/dist/viewer/components/prd-tree/prune-diff-tree.js.map +1 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.d.ts +16 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.js +213 -0
- package/dist/viewer/components/prd-tree/reorganize-panel.js.map +1 -0
- package/dist/viewer/components/prd-tree/smart-add-input.d.ts +19 -0
- package/dist/viewer/components/prd-tree/smart-add-input.js +383 -0
- package/dist/viewer/components/prd-tree/smart-add-input.js.map +1 -0
- package/dist/viewer/components/prd-tree/status-filter.d.ts +40 -0
- package/dist/viewer/components/prd-tree/status-filter.js +131 -0
- package/dist/viewer/components/prd-tree/status-filter.js.map +1 -0
- package/dist/viewer/components/prd-tree/task-detail.d.ts +41 -0
- package/dist/viewer/components/prd-tree/task-detail.js +1205 -0
- package/dist/viewer/components/prd-tree/task-detail.js.map +1 -0
- package/dist/viewer/components/prd-tree/task-utilization.d.ts +7 -0
- package/dist/viewer/components/prd-tree/task-utilization.js +25 -0
- package/dist/viewer/components/prd-tree/task-utilization.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-differ.d.ts +59 -0
- package/dist/viewer/components/prd-tree/tree-differ.js +200 -0
- package/dist/viewer/components/prd-tree/tree-differ.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.d.ts +70 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.js +176 -0
- package/dist/viewer/components/prd-tree/tree-event-delegate.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-search.d.ts +65 -0
- package/dist/viewer/components/prd-tree/tree-search.js +178 -0
- package/dist/viewer/components/prd-tree/tree-search.js.map +1 -0
- package/dist/viewer/components/prd-tree/tree-utils.d.ts +38 -0
- package/dist/viewer/components/prd-tree/tree-utils.js +107 -0
- package/dist/viewer/components/prd-tree/tree-utils.js.map +1 -0
- package/dist/viewer/components/prd-tree/types.d.ts +93 -0
- package/dist/viewer/components/prd-tree/types.js +16 -0
- package/dist/viewer/components/prd-tree/types.js.map +1 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.d.ts +119 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.js +169 -0
- package/dist/viewer/components/prd-tree/virtual-scroll.js.map +1 -0
- package/dist/viewer/components/progressive-loader.d.ts +114 -0
- package/dist/viewer/components/progressive-loader.js +225 -0
- package/dist/viewer/components/progressive-loader.js.map +1 -0
- package/dist/viewer/components/refresh-queue-status.d.ts +20 -0
- package/dist/viewer/components/refresh-queue-status.js +65 -0
- package/dist/viewer/components/refresh-queue-status.js.map +1 -0
- package/dist/viewer/components/rex-task-link.d.ts +50 -0
- package/dist/viewer/components/rex-task-link.js +218 -0
- package/dist/viewer/components/rex-task-link.js.map +1 -0
- package/dist/viewer/components/search-filter.d.ts +20 -0
- package/dist/viewer/components/search-filter.js +28 -0
- package/dist/viewer/components/search-filter.js.map +1 -0
- package/dist/viewer/components/search-overlay.d.ts +31 -0
- package/dist/viewer/components/search-overlay.js +472 -0
- package/dist/viewer/components/search-overlay.js.map +1 -0
- package/dist/viewer/components/sidebar.d.ts +18 -0
- package/dist/viewer/components/sidebar.js +357 -0
- package/dist/viewer/components/sidebar.js.map +1 -0
- package/dist/viewer/components/status-indicators.d.ts +63 -0
- package/dist/viewer/components/status-indicators.js +136 -0
- package/dist/viewer/components/status-indicators.js.map +1 -0
- package/dist/viewer/components/theme-toggle.d.ts +8 -0
- package/dist/viewer/components/theme-toggle.js +28 -0
- package/dist/viewer/components/theme-toggle.js.map +1 -0
- package/dist/viewer/components/throttle-controls.d.ts +18 -0
- package/dist/viewer/components/throttle-controls.js +304 -0
- package/dist/viewer/components/throttle-controls.js.map +1 -0
- package/dist/viewer/components/ws-health-panel.d.ts +18 -0
- package/dist/viewer/components/ws-health-panel.js +250 -0
- package/dist/viewer/components/ws-health-panel.js.map +1 -0
- package/dist/viewer/components/zone-slideout.d.ts +17 -0
- package/dist/viewer/components/zone-slideout.js +162 -0
- package/dist/viewer/components/zone-slideout.js.map +1 -0
- package/dist/viewer/crash/crash-detector.d.ts +69 -0
- package/dist/viewer/crash/crash-detector.js +239 -0
- package/dist/viewer/crash/crash-detector.js.map +1 -0
- package/dist/viewer/crash/index.d.ts +7 -0
- package/dist/viewer/crash/index.js +8 -0
- package/dist/viewer/crash/index.js.map +1 -0
- package/dist/viewer/deployed-mode.d.ts +37 -0
- package/dist/viewer/deployed-mode.js +94 -0
- package/dist/viewer/deployed-mode.js.map +1 -0
- package/dist/viewer/external.d.ts +17 -0
- package/dist/viewer/external.js +17 -0
- package/dist/viewer/external.js.map +1 -0
- package/dist/viewer/graph/index.d.ts +9 -0
- package/dist/viewer/graph/index.js +12 -0
- package/dist/viewer/graph/index.js.map +1 -0
- package/dist/viewer/graph/physics.d.ts +96 -0
- package/dist/viewer/graph/physics.js +366 -0
- package/dist/viewer/graph/physics.js.map +1 -0
- package/dist/viewer/graph/renderer.d.ts +184 -0
- package/dist/viewer/graph/renderer.js +1438 -0
- package/dist/viewer/graph/renderer.js.map +1 -0
- package/dist/viewer/hooks/index.d.ts +27 -0
- package/dist/viewer/hooks/index.js +28 -0
- package/dist/viewer/hooks/index.js.map +1 -0
- package/dist/viewer/hooks/use-app-data.d.ts +31 -0
- package/dist/viewer/hooks/use-app-data.js +152 -0
- package/dist/viewer/hooks/use-app-data.js.map +1 -0
- package/dist/viewer/hooks/use-crash-recovery.d.ts +50 -0
- package/dist/viewer/hooks/use-crash-recovery.js +76 -0
- package/dist/viewer/hooks/use-crash-recovery.js.map +1 -0
- package/dist/viewer/hooks/use-delete-actions.d.ts +48 -0
- package/dist/viewer/hooks/use-delete-actions.js +103 -0
- package/dist/viewer/hooks/use-delete-actions.js.map +1 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.d.ts +68 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.js +71 -0
- package/dist/viewer/hooks/use-dom-performance-monitor.js.map +1 -0
- package/dist/viewer/hooks/use-facet-state.d.ts +32 -0
- package/dist/viewer/hooks/use-facet-state.js +119 -0
- package/dist/viewer/hooks/use-facet-state.js.map +1 -0
- package/dist/viewer/hooks/use-feature-toggle.d.ts +18 -0
- package/dist/viewer/hooks/use-feature-toggle.js +57 -0
- package/dist/viewer/hooks/use-feature-toggle.js.map +1 -0
- package/dist/viewer/hooks/use-file-edges.d.ts +23 -0
- package/dist/viewer/hooks/use-file-edges.js +221 -0
- package/dist/viewer/hooks/use-file-edges.js.map +1 -0
- package/dist/viewer/hooks/use-graceful-degradation.d.ts +30 -0
- package/dist/viewer/hooks/use-graceful-degradation.js +45 -0
- package/dist/viewer/hooks/use-graceful-degradation.js.map +1 -0
- package/dist/viewer/hooks/use-item-selection.d.ts +49 -0
- package/dist/viewer/hooks/use-item-selection.js +117 -0
- package/dist/viewer/hooks/use-item-selection.js.map +1 -0
- package/dist/viewer/hooks/use-memory-monitor.d.ts +39 -0
- package/dist/viewer/hooks/use-memory-monitor.js +73 -0
- package/dist/viewer/hooks/use-memory-monitor.js.map +1 -0
- package/dist/viewer/hooks/use-pan-zoom.d.ts +33 -0
- package/dist/viewer/hooks/use-pan-zoom.js +110 -0
- package/dist/viewer/hooks/use-pan-zoom.js.map +1 -0
- package/dist/viewer/hooks/use-persistent-filter.d.ts +24 -0
- package/dist/viewer/hooks/use-persistent-filter.js +37 -0
- package/dist/viewer/hooks/use-persistent-filter.js.map +1 -0
- package/dist/viewer/hooks/use-polling-suspension.d.ts +32 -0
- package/dist/viewer/hooks/use-polling-suspension.js +41 -0
- package/dist/viewer/hooks/use-polling-suspension.js.map +1 -0
- package/dist/viewer/hooks/use-polling.d.ts +39 -0
- package/dist/viewer/hooks/use-polling.js +55 -0
- package/dist/viewer/hooks/use-polling.js.map +1 -0
- package/dist/viewer/hooks/use-prd-actions.d.ts +126 -0
- package/dist/viewer/hooks/use-prd-actions.js +250 -0
- package/dist/viewer/hooks/use-prd-actions.js.map +1 -0
- package/dist/viewer/hooks/use-prd-data.d.ts +45 -0
- package/dist/viewer/hooks/use-prd-data.js +159 -0
- package/dist/viewer/hooks/use-prd-data.js.map +1 -0
- package/dist/viewer/hooks/use-prd-deep-link.d.ts +45 -0
- package/dist/viewer/hooks/use-prd-deep-link.js +60 -0
- package/dist/viewer/hooks/use-prd-deep-link.js.map +1 -0
- package/dist/viewer/hooks/use-prd-websocket.d.ts +47 -0
- package/dist/viewer/hooks/use-prd-websocket.js +139 -0
- package/dist/viewer/hooks/use-prd-websocket.js.map +1 -0
- package/dist/viewer/hooks/use-project-metadata.d.ts +25 -0
- package/dist/viewer/hooks/use-project-metadata.js +55 -0
- package/dist/viewer/hooks/use-project-metadata.js.map +1 -0
- package/dist/viewer/hooks/use-project-status.d.ts +60 -0
- package/dist/viewer/hooks/use-project-status.js +133 -0
- package/dist/viewer/hooks/use-project-status.js.map +1 -0
- package/dist/viewer/hooks/use-refresh-throttle.d.ts +45 -0
- package/dist/viewer/hooks/use-refresh-throttle.js +52 -0
- package/dist/viewer/hooks/use-refresh-throttle.js.map +1 -0
- package/dist/viewer/hooks/use-route-state.d.ts +18 -0
- package/dist/viewer/hooks/use-route-state.js +115 -0
- package/dist/viewer/hooks/use-route-state.js.map +1 -0
- package/dist/viewer/hooks/use-subzone-edges.d.ts +21 -0
- package/dist/viewer/hooks/use-subzone-edges.js +147 -0
- package/dist/viewer/hooks/use-subzone-edges.js.map +1 -0
- package/dist/viewer/hooks/use-tab-visibility.d.ts +31 -0
- package/dist/viewer/hooks/use-tab-visibility.js +43 -0
- package/dist/viewer/hooks/use-tab-visibility.js.map +1 -0
- package/dist/viewer/hooks/use-tick.d.ts +43 -0
- package/dist/viewer/hooks/use-tick.js +76 -0
- package/dist/viewer/hooks/use-tick.js.map +1 -0
- package/dist/viewer/hooks/use-toast.d.ts +24 -0
- package/dist/viewer/hooks/use-toast.js +26 -0
- package/dist/viewer/hooks/use-toast.js.map +1 -0
- package/dist/viewer/hooks/use-zone-drag.d.ts +30 -0
- package/dist/viewer/hooks/use-zone-drag.js +60 -0
- package/dist/viewer/hooks/use-zone-drag.js.map +1 -0
- package/dist/viewer/index.html +36 -0
- package/dist/viewer/loader.d.ts +33 -0
- package/dist/viewer/loader.js +195 -0
- package/dist/viewer/loader.js.map +1 -0
- package/dist/viewer/main.d.ts +1 -0
- package/dist/viewer/main.js +121 -0
- package/dist/viewer/main.js.map +1 -0
- package/dist/viewer/messaging/call-rate-limiter.d.ts +50 -0
- package/dist/viewer/messaging/call-rate-limiter.js +103 -0
- package/dist/viewer/messaging/call-rate-limiter.js.map +1 -0
- package/dist/viewer/messaging/fetch-pipeline.d.ts +58 -0
- package/dist/viewer/messaging/fetch-pipeline.js +58 -0
- package/dist/viewer/messaging/fetch-pipeline.js.map +1 -0
- package/dist/viewer/messaging/index.d.ts +43 -0
- package/dist/viewer/messaging/index.js +46 -0
- package/dist/viewer/messaging/index.js.map +1 -0
- package/dist/viewer/messaging/message-coalescer.d.ts +96 -0
- package/dist/viewer/messaging/message-coalescer.js +121 -0
- package/dist/viewer/messaging/message-coalescer.js.map +1 -0
- package/dist/viewer/messaging/message-throttle.d.ts +95 -0
- package/dist/viewer/messaging/message-throttle.js +147 -0
- package/dist/viewer/messaging/message-throttle.js.map +1 -0
- package/dist/viewer/messaging/request-dedup.d.ts +43 -0
- package/dist/viewer/messaging/request-dedup.js +55 -0
- package/dist/viewer/messaging/request-dedup.js.map +1 -0
- package/dist/viewer/messaging/ws-pipeline.d.ts +85 -0
- package/dist/viewer/messaging/ws-pipeline.js +68 -0
- package/dist/viewer/messaging/ws-pipeline.js.map +1 -0
- package/dist/viewer/n-dx.png +0 -0
- package/dist/viewer/performance/dom-performance-monitor.d.ts +157 -0
- package/dist/viewer/performance/dom-performance-monitor.js +341 -0
- package/dist/viewer/performance/dom-performance-monitor.js.map +1 -0
- package/dist/viewer/performance/dom-update-gate.d.ts +122 -0
- package/dist/viewer/performance/dom-update-gate.js +229 -0
- package/dist/viewer/performance/dom-update-gate.js.map +1 -0
- package/dist/viewer/performance/graceful-degradation.d.ts +73 -0
- package/dist/viewer/performance/graceful-degradation.js +152 -0
- package/dist/viewer/performance/graceful-degradation.js.map +1 -0
- package/dist/viewer/performance/index.d.ts +14 -0
- package/dist/viewer/performance/index.js +20 -0
- package/dist/viewer/performance/index.js.map +1 -0
- package/dist/viewer/performance/memory-monitor.d.ts +78 -0
- package/dist/viewer/performance/memory-monitor.js +218 -0
- package/dist/viewer/performance/memory-monitor.js.map +1 -0
- package/dist/viewer/performance/refresh-throttle.d.ts +90 -0
- package/dist/viewer/performance/refresh-throttle.js +266 -0
- package/dist/viewer/performance/refresh-throttle.js.map +1 -0
- package/dist/viewer/performance/response-buffer-gate.d.ts +108 -0
- package/dist/viewer/performance/response-buffer-gate.js +170 -0
- package/dist/viewer/performance/response-buffer-gate.js.map +1 -0
- package/dist/viewer/performance/update-batcher.d.ts +79 -0
- package/dist/viewer/performance/update-batcher.js +119 -0
- package/dist/viewer/performance/update-batcher.js.map +1 -0
- package/dist/viewer/polling/batched-tick-dispatcher.d.ts +83 -0
- package/dist/viewer/polling/batched-tick-dispatcher.js +183 -0
- package/dist/viewer/polling/batched-tick-dispatcher.js.map +1 -0
- package/dist/viewer/polling/index.d.ts +13 -0
- package/dist/viewer/polling/index.js +16 -0
- package/dist/viewer/polling/index.js.map +1 -0
- package/dist/viewer/polling/polling-manager.d.ts +82 -0
- package/dist/viewer/polling/polling-manager.js +254 -0
- package/dist/viewer/polling/polling-manager.js.map +1 -0
- package/dist/viewer/polling/polling-restart.d.ts +45 -0
- package/dist/viewer/polling/polling-restart.js +98 -0
- package/dist/viewer/polling/polling-restart.js.map +1 -0
- package/dist/viewer/polling/polling-state.d.ts +182 -0
- package/dist/viewer/polling/polling-state.js +306 -0
- package/dist/viewer/polling/polling-state.js.map +1 -0
- package/dist/viewer/polling/tab-visibility.d.ts +112 -0
- package/dist/viewer/polling/tab-visibility.js +276 -0
- package/dist/viewer/polling/tab-visibility.js.map +1 -0
- package/dist/viewer/polling/tick-timer.d.ts +70 -0
- package/dist/viewer/polling/tick-timer.js +168 -0
- package/dist/viewer/polling/tick-timer.js.map +1 -0
- package/dist/viewer/polling/tick-visibility-gate.d.ts +92 -0
- package/dist/viewer/polling/tick-visibility-gate.js +146 -0
- package/dist/viewer/polling/tick-visibility-gate.js.map +1 -0
- package/dist/viewer/route-state.d.ts +8 -0
- package/dist/viewer/route-state.js +77 -0
- package/dist/viewer/route-state.js.map +1 -0
- package/dist/viewer/schema-compat.d.ts +17 -0
- package/dist/viewer/schema-compat.js +49 -0
- package/dist/viewer/schema-compat.js.map +1 -0
- package/dist/viewer/types.d.ts +66 -0
- package/dist/viewer/types.js +2 -0
- package/dist/viewer/types.js.map +1 -0
- package/dist/viewer/usage/constants.d.ts +14 -0
- package/dist/viewer/usage/constants.js +14 -0
- package/dist/viewer/usage/constants.js.map +1 -0
- package/dist/viewer/usage/index.d.ts +7 -0
- package/dist/viewer/usage/index.js +8 -0
- package/dist/viewer/usage/index.js.map +1 -0
- package/dist/viewer/utils.d.ts +25 -0
- package/dist/viewer/utils.js +48 -0
- package/dist/viewer/utils.js.map +1 -0
- package/dist/viewer/validate.d.ts +23 -0
- package/dist/viewer/validate.js +275 -0
- package/dist/viewer/validate.js.map +1 -0
- package/dist/viewer/views/analysis.d.ts +10 -0
- package/dist/viewer/views/analysis.js +109 -0
- package/dist/viewer/views/analysis.js.map +1 -0
- package/dist/viewer/views/architecture.d.ts +10 -0
- package/dist/viewer/views/architecture.js +44 -0
- package/dist/viewer/views/architecture.js.map +1 -0
- package/dist/viewer/views/domain-hench.d.ts +13 -0
- package/dist/viewer/views/domain-hench.js +14 -0
- package/dist/viewer/views/domain-hench.js.map +1 -0
- package/dist/viewer/views/domain-rex.d.ts +17 -0
- package/dist/viewer/views/domain-rex.js +18 -0
- package/dist/viewer/views/domain-rex.js.map +1 -0
- package/dist/viewer/views/domain-settings.d.ts +12 -0
- package/dist/viewer/views/domain-settings.js +13 -0
- package/dist/viewer/views/domain-settings.js.map +1 -0
- package/dist/viewer/views/domain-sourcevision.d.ts +20 -0
- package/dist/viewer/views/domain-sourcevision.js +21 -0
- package/dist/viewer/views/domain-sourcevision.js.map +1 -0
- package/dist/viewer/views/enrichment-thresholds.d.ts +11 -0
- package/dist/viewer/views/enrichment-thresholds.js +12 -0
- package/dist/viewer/views/enrichment-thresholds.js.map +1 -0
- package/dist/viewer/views/feature-toggles.d.ts +13 -0
- package/dist/viewer/views/feature-toggles.js +185 -0
- package/dist/viewer/views/feature-toggles.js.map +1 -0
- package/dist/viewer/views/files.d.ts +13 -0
- package/dist/viewer/views/files.js +174 -0
- package/dist/viewer/views/files.js.map +1 -0
- package/dist/viewer/views/graph.d.ts +12 -0
- package/dist/viewer/views/graph.js +316 -0
- package/dist/viewer/views/graph.js.map +1 -0
- package/dist/viewer/views/hench-config.d.ts +39 -0
- package/dist/viewer/views/hench-config.js +473 -0
- package/dist/viewer/views/hench-config.js.map +1 -0
- package/dist/viewer/views/hench-runs.d.ts +19 -0
- package/dist/viewer/views/hench-runs.js +460 -0
- package/dist/viewer/views/hench-runs.js.map +1 -0
- package/dist/viewer/views/hench-templates.d.ts +17 -0
- package/dist/viewer/views/hench-templates.js +262 -0
- package/dist/viewer/views/hench-templates.js.map +1 -0
- package/dist/viewer/views/integration-config.d.ts +73 -0
- package/dist/viewer/views/integration-config.js +524 -0
- package/dist/viewer/views/integration-config.js.map +1 -0
- package/dist/viewer/views/notion-config.d.ts +16 -0
- package/dist/viewer/views/notion-config.js +357 -0
- package/dist/viewer/views/notion-config.js.map +1 -0
- package/dist/viewer/views/overview.d.ts +10 -0
- package/dist/viewer/views/overview.js +187 -0
- package/dist/viewer/views/overview.js.map +1 -0
- package/dist/viewer/views/pr-markdown.d.ts +3 -0
- package/dist/viewer/views/pr-markdown.js +350 -0
- package/dist/viewer/views/pr-markdown.js.map +1 -0
- package/dist/viewer/views/prd.d.ts +34 -0
- package/dist/viewer/views/prd.js +257 -0
- package/dist/viewer/views/prd.js.map +1 -0
- package/dist/viewer/views/problems.d.ts +8 -0
- package/dist/viewer/views/problems.js +50 -0
- package/dist/viewer/views/problems.js.map +1 -0
- package/dist/viewer/views/rex-dashboard.d.ts +14 -0
- package/dist/viewer/views/rex-dashboard.js +334 -0
- package/dist/viewer/views/rex-dashboard.js.map +1 -0
- package/dist/viewer/views/routes.d.ts +8 -0
- package/dist/viewer/views/routes.js +216 -0
- package/dist/viewer/views/routes.js.map +1 -0
- package/dist/viewer/views/sourcevision-tabs.d.ts +18 -0
- package/dist/viewer/views/sourcevision-tabs.js +14 -0
- package/dist/viewer/views/sourcevision-tabs.js.map +1 -0
- package/dist/viewer/views/suggestions.d.ts +8 -0
- package/dist/viewer/views/suggestions.js +36 -0
- package/dist/viewer/views/suggestions.js.map +1 -0
- package/dist/viewer/views/task-audit.d.ts +18 -0
- package/dist/viewer/views/task-audit.js +413 -0
- package/dist/viewer/views/task-audit.js.map +1 -0
- package/dist/viewer/views/token-usage.d.ts +10 -0
- package/dist/viewer/views/token-usage.js +410 -0
- package/dist/viewer/views/token-usage.js.map +1 -0
- package/dist/viewer/views/validation.d.ts +11 -0
- package/dist/viewer/views/validation.js +475 -0
- package/dist/viewer/views/validation.js.map +1 -0
- package/dist/viewer/views/view-registry.d.ts +27 -0
- package/dist/viewer/views/view-registry.js +70 -0
- package/dist/viewer/views/view-registry.js.map +1 -0
- package/dist/viewer/views/workflow-optimization.d.ts +12 -0
- package/dist/viewer/views/workflow-optimization.js +311 -0
- package/dist/viewer/views/workflow-optimization.js.map +1 -0
- package/dist/viewer/views/zone-types.d.ts +69 -0
- package/dist/viewer/views/zone-types.js +5 -0
- package/dist/viewer/views/zone-types.js.map +1 -0
- package/dist/viewer/views/zones.d.ts +50 -0
- package/dist/viewer/views/zones.js +1438 -0
- package/dist/viewer/views/zones.js.map +1 -0
- package/dist/viewer/visualization/colors.d.ts +16 -0
- package/dist/viewer/visualization/colors.js +31 -0
- package/dist/viewer/visualization/colors.js.map +1 -0
- package/dist/viewer/visualization/flow.d.ts +54 -0
- package/dist/viewer/visualization/flow.js +123 -0
- package/dist/viewer/visualization/flow.js.map +1 -0
- package/dist/viewer/visualization/index.d.ts +34 -0
- package/dist/viewer/visualization/index.js +40 -0
- package/dist/viewer/visualization/index.js.map +1 -0
- package/dist/viewer/visualization/metrics.d.ts +8 -0
- package/dist/viewer/visualization/metrics.js +16 -0
- package/dist/viewer/visualization/metrics.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Batched tick dispatcher for elapsed time state updates.
|
|
3
|
+
*
|
|
4
|
+
* Sits between the shared tick timer and individual `useTick` hook instances.
|
|
5
|
+
* Instead of N separate `onTick` listeners each calling `setState` independently,
|
|
6
|
+
* this dispatcher:
|
|
7
|
+
*
|
|
8
|
+
* 1. Subscribes to the tick timer **once** (regardless of how many components
|
|
9
|
+
* display elapsed time).
|
|
10
|
+
* 2. On each tick, computes all new values synchronously (read-only phase).
|
|
11
|
+
* 3. Filters out unchanged values via equality check (skip phase).
|
|
12
|
+
* 4. Schedules a single `requestAnimationFrame` to apply all state updates
|
|
13
|
+
* in one synchronous block (write phase).
|
|
14
|
+
*
|
|
15
|
+
* This two-phase (compute → RAF write) approach ensures:
|
|
16
|
+
*
|
|
17
|
+
* - All `setState` calls occur within the same synchronous execution context
|
|
18
|
+
* inside the RAF callback, allowing Preact to batch them into a single
|
|
19
|
+
* reconciliation pass.
|
|
20
|
+
* - State updates are aligned with the browser's paint cycle, eliminating
|
|
21
|
+
* wasted intermediate renders.
|
|
22
|
+
* - With 20+ visible task cards, the re-render count drops from N individual
|
|
23
|
+
* renders to one batched reconciliation per tick.
|
|
24
|
+
*
|
|
25
|
+
* Auto-lifecycle: subscribes to the tick timer when the first component
|
|
26
|
+
* registers, unsubscribes when the last one unregisters. Zero overhead
|
|
27
|
+
* when no elapsed time displays are mounted.
|
|
28
|
+
*
|
|
29
|
+
* Designed as a standalone module with zero framework dependencies —
|
|
30
|
+
* the Preact integration lives in the `useTick` hook.
|
|
31
|
+
*/
|
|
32
|
+
import { onTick } from "./tick-timer.js";
|
|
33
|
+
// ─── Module state ────────────────────────────────────────────────────────────
|
|
34
|
+
let registrations = [];
|
|
35
|
+
let tickUnsub = null;
|
|
36
|
+
let rafId = null;
|
|
37
|
+
let pendingBatch = null;
|
|
38
|
+
// ─── Internal helpers ────────────────────────────────────────────────────────
|
|
39
|
+
/** Phase 1 (tick callback): compute values, filter unchanged, queue RAF. */
|
|
40
|
+
function onTickFired() {
|
|
41
|
+
const batch = [];
|
|
42
|
+
// Snapshot registrations to protect against mid-iteration unregister.
|
|
43
|
+
const snapshot = registrations.slice();
|
|
44
|
+
for (const reg of snapshot) {
|
|
45
|
+
try {
|
|
46
|
+
const next = reg.compute();
|
|
47
|
+
if (next !== reg.lastValueRef.current) {
|
|
48
|
+
batch.push({ setDisplay: reg.setDisplay, value: next, reg });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
// Swallow errors from individual computations to prevent one bad
|
|
53
|
+
// registration from breaking all others.
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (batch.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
// Commit lastValueRef immediately so the next tick won't re-queue
|
|
59
|
+
// the same update if RAF hasn't fired yet.
|
|
60
|
+
for (const { reg, value } of batch) {
|
|
61
|
+
reg.lastValueRef.current = value;
|
|
62
|
+
}
|
|
63
|
+
// Queue state updates for the next animation frame.
|
|
64
|
+
// If a previous batch is still pending (unlikely at 1s intervals),
|
|
65
|
+
// merge into it.
|
|
66
|
+
if (pendingBatch) {
|
|
67
|
+
for (const { setDisplay, value } of batch) {
|
|
68
|
+
pendingBatch.push({ setDisplay, value });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
pendingBatch = batch.map(({ setDisplay, value }) => ({
|
|
73
|
+
setDisplay,
|
|
74
|
+
value,
|
|
75
|
+
}));
|
|
76
|
+
}
|
|
77
|
+
if (rafId === null) {
|
|
78
|
+
rafId = requestAnimationFrame(applyBatch);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/** Phase 2 (RAF callback): apply all state updates in one synchronous block. */
|
|
82
|
+
function applyBatch() {
|
|
83
|
+
rafId = null;
|
|
84
|
+
const batch = pendingBatch;
|
|
85
|
+
pendingBatch = null;
|
|
86
|
+
if (!batch)
|
|
87
|
+
return;
|
|
88
|
+
// All setDisplay calls happen synchronously within this frame →
|
|
89
|
+
// Preact batches them into a single reconciliation pass.
|
|
90
|
+
for (const { setDisplay, value } of batch) {
|
|
91
|
+
try {
|
|
92
|
+
setDisplay(value);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Swallow errors from individual setters.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
100
|
+
/**
|
|
101
|
+
* Register an elapsed time updater with the batched dispatcher.
|
|
102
|
+
*
|
|
103
|
+
* The dispatcher will call `compute()` on each tick, compare the result
|
|
104
|
+
* against `lastValueRef.current`, and — if changed — schedule a batched
|
|
105
|
+
* RAF update that calls `setDisplay(newValue)`.
|
|
106
|
+
*
|
|
107
|
+
* The `lastValueRef` is shared with the calling hook so that both the
|
|
108
|
+
* dispatcher and the hook's immediate-update effect (for `startedAt`
|
|
109
|
+
* prop changes) stay in sync.
|
|
110
|
+
*
|
|
111
|
+
* Returns an unregister function. When the last registration is removed,
|
|
112
|
+
* the dispatcher unsubscribes from the tick timer automatically.
|
|
113
|
+
*
|
|
114
|
+
* @param compute - Pure function returning the current formatted string.
|
|
115
|
+
* @param setDisplay - Preact state setter for the display value.
|
|
116
|
+
* @param lastValueRef - Mutable ref tracking the last emitted value.
|
|
117
|
+
* @returns Unregister function (safe to call multiple times).
|
|
118
|
+
*/
|
|
119
|
+
export function registerTickUpdater(compute, setDisplay, lastValueRef) {
|
|
120
|
+
const reg = { compute, setDisplay, lastValueRef };
|
|
121
|
+
registrations.push(reg);
|
|
122
|
+
// Auto-start: subscribe to the tick timer on first registration.
|
|
123
|
+
if (registrations.length === 1 && tickUnsub === null) {
|
|
124
|
+
tickUnsub = onTick(onTickFired);
|
|
125
|
+
}
|
|
126
|
+
let removed = false;
|
|
127
|
+
return () => {
|
|
128
|
+
if (removed)
|
|
129
|
+
return; // idempotent unregister
|
|
130
|
+
removed = true;
|
|
131
|
+
registrations = registrations.filter((r) => r !== reg);
|
|
132
|
+
// Auto-stop: unsubscribe from tick timer when no registrations remain.
|
|
133
|
+
if (registrations.length === 0) {
|
|
134
|
+
if (tickUnsub) {
|
|
135
|
+
tickUnsub();
|
|
136
|
+
tickUnsub = null;
|
|
137
|
+
}
|
|
138
|
+
if (rafId !== null) {
|
|
139
|
+
cancelAnimationFrame(rafId);
|
|
140
|
+
rafId = null;
|
|
141
|
+
pendingBatch = null;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get the current state of the batched tick dispatcher (for testing/monitoring).
|
|
148
|
+
*/
|
|
149
|
+
export function getBatchedTickDispatcherState() {
|
|
150
|
+
return {
|
|
151
|
+
registrationCount: registrations.length,
|
|
152
|
+
hasPendingRAF: rafId !== null,
|
|
153
|
+
pendingUpdateCount: pendingBatch?.length ?? 0,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Force-flush all pending RAF updates synchronously.
|
|
158
|
+
* Cancels any pending RAF. No-op if nothing is pending.
|
|
159
|
+
*/
|
|
160
|
+
export function flushBatchedTicks() {
|
|
161
|
+
if (rafId !== null) {
|
|
162
|
+
cancelAnimationFrame(rafId);
|
|
163
|
+
rafId = null;
|
|
164
|
+
}
|
|
165
|
+
applyBatch();
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Reset all dispatcher state (for testing). Unsubscribes from the tick
|
|
169
|
+
* timer, cancels pending RAF, and clears all registrations.
|
|
170
|
+
*/
|
|
171
|
+
export function resetBatchedTickDispatcher() {
|
|
172
|
+
if (tickUnsub) {
|
|
173
|
+
tickUnsub();
|
|
174
|
+
tickUnsub = null;
|
|
175
|
+
}
|
|
176
|
+
if (rafId !== null) {
|
|
177
|
+
cancelAnimationFrame(rafId);
|
|
178
|
+
rafId = null;
|
|
179
|
+
}
|
|
180
|
+
registrations = [];
|
|
181
|
+
pendingBatch = null;
|
|
182
|
+
}
|
|
183
|
+
//# sourceMappingURL=batched-tick-dispatcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batched-tick-dispatcher.js","sourceRoot":"","sources":["../../../src/viewer/polling/batched-tick-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polling zone public interface.
|
|
3
|
+
*
|
|
4
|
+
* All cross-zone consumers should import from this barrel rather than
|
|
5
|
+
* individual implementation files.
|
|
6
|
+
*/
|
|
7
|
+
export { startPollingManager, stopPollingManager, registerPoller, unregisterPoller, suspendAll, resumeAll, isSuspended, isPollerActive, getRegisteredPollers, getPollerCount, resetPollingManager, } from "./polling-manager.js";
|
|
8
|
+
export { startPollingRestart, stopPollingRestart, } from "./polling-restart.js";
|
|
9
|
+
export { createTickVisibilityGate, } from "./tick-visibility-gate.js";
|
|
10
|
+
export { onTick, suspendTickTimer, resumeTickTimer, getTickTimerState, resetTickTimer, } from "./tick-timer.js";
|
|
11
|
+
export { registerTickUpdater, } from "./batched-tick-dispatcher.js";
|
|
12
|
+
export { registerPollingSource, onPollingStateChange, getPollingState, resetPollingState, type PollingSourceCallbacks, type PollingSourceConfig, type PollingStateSnapshot, type PollingStateChangeHandler, } from "./polling-state.js";
|
|
13
|
+
export { startTabVisibilityMonitor, stopTabVisibilityMonitor, onVisibilityChange, getTabVisibility, getTabVisibilitySnapshot, isTabVisible, getVisibilityCapabilities, getTransitionHistory, resetTabVisibility, detectVisibilityAPI, type TabVisibilityState, type TabVisibilitySnapshot, type VisibilityChangeHandler, type TabVisibilityConfig, type VisibilityDetectionMethod, type VisibilityAPICapabilities, type VisibilityTransition, } from "./tab-visibility.js";
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polling zone public interface.
|
|
3
|
+
*
|
|
4
|
+
* All cross-zone consumers should import from this barrel rather than
|
|
5
|
+
* individual implementation files.
|
|
6
|
+
*/
|
|
7
|
+
export { startPollingManager, stopPollingManager, registerPoller, unregisterPoller, suspendAll, resumeAll, isSuspended, isPollerActive, getRegisteredPollers, getPollerCount, resetPollingManager, } from "./polling-manager.js";
|
|
8
|
+
export { startPollingRestart, stopPollingRestart, } from "./polling-restart.js";
|
|
9
|
+
export { createTickVisibilityGate, } from "./tick-visibility-gate.js";
|
|
10
|
+
export { onTick, suspendTickTimer, resumeTickTimer, getTickTimerState, resetTickTimer, } from "./tick-timer.js";
|
|
11
|
+
export { registerTickUpdater, } from "./batched-tick-dispatcher.js";
|
|
12
|
+
// ── Polling state — cross-zone API ───────────────────────────────────────────
|
|
13
|
+
export { registerPollingSource, onPollingStateChange, getPollingState, resetPollingState, } from "./polling-state.js";
|
|
14
|
+
// ── Tab visibility ──────────────────────────────────────────────────────────
|
|
15
|
+
export { startTabVisibilityMonitor, stopTabVisibilityMonitor, onVisibilityChange, getTabVisibility, getTabVisibilitySnapshot, isTabVisible, getVisibilityCapabilities, getTransitionHistory, resetTabVisibility, detectVisibilityAPI, } from "./tab-visibility.js";
|
|
16
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/viewer/polling/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,oBAAoB,EACpB,cAAc,EACd,mBAAmB,GACpB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,MAAM,EACN,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,gFAAgF;AAEhF,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,GAKlB,MAAM,oBAAoB,CAAC;AAE5B,+EAA+E;AAE/E,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,EACxB,YAAY,EACZ,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GAQpB,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized polling manager with tab visibility integration.
|
|
3
|
+
*
|
|
4
|
+
* Provides a registry for all polling intervals across the application.
|
|
5
|
+
* When the browser tab is backgrounded, all registered pollers are
|
|
6
|
+
* suspended to conserve resources. When the tab regains focus, pollers
|
|
7
|
+
* are resumed with their original intervals.
|
|
8
|
+
*
|
|
9
|
+
* Rapid visibility changes (e.g. quick alt-tab sequences) are debounced
|
|
10
|
+
* to avoid thrashing interval creation/destruction.
|
|
11
|
+
*
|
|
12
|
+
* Designed as a standalone module with zero framework dependencies —
|
|
13
|
+
* the Preact hook (`usePolling`) is provided separately.
|
|
14
|
+
*/
|
|
15
|
+
/** Read-only view of a registered poller for external inspection. */
|
|
16
|
+
export interface PollerInfo {
|
|
17
|
+
readonly key: string;
|
|
18
|
+
readonly intervalMs: number;
|
|
19
|
+
readonly active: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Start the polling manager. Subscribes to tab visibility changes
|
|
23
|
+
* and enables automatic suspend/resume of registered pollers.
|
|
24
|
+
*
|
|
25
|
+
* Safe to call multiple times — restarts cleanly.
|
|
26
|
+
*/
|
|
27
|
+
export declare function startPollingManager(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Stop the polling manager. Unsubscribes from visibility changes
|
|
30
|
+
* but does NOT clear registered pollers or their timers.
|
|
31
|
+
*/
|
|
32
|
+
export declare function stopPollingManager(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Register a polling interval. The callback will be called every
|
|
35
|
+
* `intervalMs` milliseconds while the tab is visible.
|
|
36
|
+
*
|
|
37
|
+
* If the tab is currently hidden and the manager is started,
|
|
38
|
+
* the poller is registered but not activated until the tab becomes visible.
|
|
39
|
+
*
|
|
40
|
+
* Returns an unregister function for cleanup.
|
|
41
|
+
*
|
|
42
|
+
* @param key - Unique identifier for this poller. Re-registering with the
|
|
43
|
+
* same key replaces the previous entry.
|
|
44
|
+
* @param callback - Function to call on each tick.
|
|
45
|
+
* @param intervalMs - Polling interval in milliseconds.
|
|
46
|
+
*/
|
|
47
|
+
export declare function registerPoller(key: string, callback: () => void, intervalMs: number): () => void;
|
|
48
|
+
/**
|
|
49
|
+
* Remove a poller from the registry and clear its interval.
|
|
50
|
+
*/
|
|
51
|
+
export declare function unregisterPoller(key: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Suspend all registered pollers. Clears their interval timers
|
|
54
|
+
* but keeps them in the registry for later resumption.
|
|
55
|
+
*/
|
|
56
|
+
export declare function suspendAll(): void;
|
|
57
|
+
/**
|
|
58
|
+
* Resume all registered pollers. Restarts their interval timers
|
|
59
|
+
* with their original intervals.
|
|
60
|
+
*/
|
|
61
|
+
export declare function resumeAll(): void;
|
|
62
|
+
/**
|
|
63
|
+
* Check if the polling manager is currently in a suspended state.
|
|
64
|
+
*/
|
|
65
|
+
export declare function isSuspended(): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Check if a specific poller is actively running (has a timer).
|
|
68
|
+
*/
|
|
69
|
+
export declare function isPollerActive(key: string): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Get read-only information about all registered pollers.
|
|
72
|
+
*/
|
|
73
|
+
export declare function getRegisteredPollers(): readonly PollerInfo[];
|
|
74
|
+
/**
|
|
75
|
+
* Get the number of registered pollers.
|
|
76
|
+
*/
|
|
77
|
+
export declare function getPollerCount(): number;
|
|
78
|
+
/**
|
|
79
|
+
* Reset all module state (for testing). Clears all pollers, stops the
|
|
80
|
+
* manager, and resets the suspended flag.
|
|
81
|
+
*/
|
|
82
|
+
export declare function resetPollingManager(): void;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized polling manager with tab visibility integration.
|
|
3
|
+
*
|
|
4
|
+
* Provides a registry for all polling intervals across the application.
|
|
5
|
+
* When the browser tab is backgrounded, all registered pollers are
|
|
6
|
+
* suspended to conserve resources. When the tab regains focus, pollers
|
|
7
|
+
* are resumed with their original intervals.
|
|
8
|
+
*
|
|
9
|
+
* Rapid visibility changes (e.g. quick alt-tab sequences) are debounced
|
|
10
|
+
* to avoid thrashing interval creation/destruction.
|
|
11
|
+
*
|
|
12
|
+
* Designed as a standalone module with zero framework dependencies —
|
|
13
|
+
* the Preact hook (`usePolling`) is provided separately.
|
|
14
|
+
*/
|
|
15
|
+
import { onVisibilityChange, isTabVisible, } from "./tab-visibility.js";
|
|
16
|
+
import { registerPollingSource, } from "./polling-state.js";
|
|
17
|
+
// ─── Constants ───────────────────────────────────────────────────────────────
|
|
18
|
+
/**
|
|
19
|
+
* Debounce delay for visibility-triggered resume (ms).
|
|
20
|
+
* Prevents thrashing when the user rapidly switches between tabs.
|
|
21
|
+
* Suspension is immediate (no debounce) to stop work quickly.
|
|
22
|
+
*/
|
|
23
|
+
const RESUME_DEBOUNCE_MS = 100;
|
|
24
|
+
// ─── Constants (polling-state integration) ───────────────────────────────────
|
|
25
|
+
const POLLING_STATE_KEY = "polling-manager";
|
|
26
|
+
// ─── Module state ────────────────────────────────────────────────────────────
|
|
27
|
+
const pollers = new Map();
|
|
28
|
+
let visibilityUnsub = null;
|
|
29
|
+
let stateUnsub = null;
|
|
30
|
+
let started = false;
|
|
31
|
+
let suspended = false;
|
|
32
|
+
let resumeDebounceTimer = null;
|
|
33
|
+
// ─── Internal helpers ────────────────────────────────────────────────────────
|
|
34
|
+
/**
|
|
35
|
+
* Clean up the polling manager's own resources (visibility subscription,
|
|
36
|
+
* debounce timer, poller intervals). Does NOT touch polling-state
|
|
37
|
+
* registration — callers are responsible for that coordination.
|
|
38
|
+
*/
|
|
39
|
+
function cleanupOwnResources() {
|
|
40
|
+
if (visibilityUnsub) {
|
|
41
|
+
visibilityUnsub();
|
|
42
|
+
visibilityUnsub = null;
|
|
43
|
+
}
|
|
44
|
+
if (resumeDebounceTimer !== null) {
|
|
45
|
+
clearTimeout(resumeDebounceTimer);
|
|
46
|
+
resumeDebounceTimer = null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Start a poller's interval timer. */
|
|
50
|
+
function activatePoller(entry) {
|
|
51
|
+
if (entry.timerId !== null)
|
|
52
|
+
return; // already active
|
|
53
|
+
entry.timerId = setInterval(entry.callback, entry.intervalMs);
|
|
54
|
+
}
|
|
55
|
+
/** Stop a poller's interval timer without removing it from the registry. */
|
|
56
|
+
function deactivatePoller(entry) {
|
|
57
|
+
if (entry.timerId === null)
|
|
58
|
+
return; // already inactive
|
|
59
|
+
clearInterval(entry.timerId);
|
|
60
|
+
entry.timerId = null;
|
|
61
|
+
}
|
|
62
|
+
/** Handle visibility change events from the tab-visibility module. */
|
|
63
|
+
function handleVisibilityChange(snapshot) {
|
|
64
|
+
if (snapshot.isVisible) {
|
|
65
|
+
// Tab became visible — resume with debounce to handle rapid toggling.
|
|
66
|
+
if (resumeDebounceTimer !== null) {
|
|
67
|
+
clearTimeout(resumeDebounceTimer);
|
|
68
|
+
}
|
|
69
|
+
resumeDebounceTimer = setTimeout(() => {
|
|
70
|
+
resumeDebounceTimer = null;
|
|
71
|
+
resumeAll();
|
|
72
|
+
}, RESUME_DEBOUNCE_MS);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
// Tab became hidden — suspend immediately.
|
|
76
|
+
// Cancel any pending resume first.
|
|
77
|
+
if (resumeDebounceTimer !== null) {
|
|
78
|
+
clearTimeout(resumeDebounceTimer);
|
|
79
|
+
resumeDebounceTimer = null;
|
|
80
|
+
}
|
|
81
|
+
suspendAll();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// ─── Public API ──────────────────────────────────────────────────────────────
|
|
85
|
+
/**
|
|
86
|
+
* Start the polling manager. Subscribes to tab visibility changes
|
|
87
|
+
* and enables automatic suspend/resume of registered pollers.
|
|
88
|
+
*
|
|
89
|
+
* Safe to call multiple times — restarts cleanly.
|
|
90
|
+
*/
|
|
91
|
+
export function startPollingManager() {
|
|
92
|
+
if (started)
|
|
93
|
+
stopPollingManager();
|
|
94
|
+
started = true;
|
|
95
|
+
suspended = false;
|
|
96
|
+
// Subscribe to tab visibility changes.
|
|
97
|
+
visibilityUnsub = onVisibilityChange(handleVisibilityChange);
|
|
98
|
+
// If the tab is currently hidden, start in suspended state.
|
|
99
|
+
if (!isTabVisible()) {
|
|
100
|
+
suspended = true;
|
|
101
|
+
}
|
|
102
|
+
// Register with centralized polling state for coordinated lifecycle.
|
|
103
|
+
// The dispose callback cleans up own resources without calling
|
|
104
|
+
// stopPollingManager (which would re-entrantly unregister from
|
|
105
|
+
// polling-state, causing a loop).
|
|
106
|
+
stateUnsub = registerPollingSource(POLLING_STATE_KEY, {
|
|
107
|
+
suspend: () => suspendAll(),
|
|
108
|
+
resume: () => resumeAll(),
|
|
109
|
+
dispose: () => {
|
|
110
|
+
for (const entry of pollers.values()) {
|
|
111
|
+
deactivatePoller(entry);
|
|
112
|
+
}
|
|
113
|
+
cleanupOwnResources();
|
|
114
|
+
started = false;
|
|
115
|
+
stateUnsub = null; // Already being disposed by polling-state.
|
|
116
|
+
},
|
|
117
|
+
getStatus: () => {
|
|
118
|
+
if (!started)
|
|
119
|
+
return "idle";
|
|
120
|
+
return suspended ? "suspended" : "active";
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Stop the polling manager. Unsubscribes from visibility changes
|
|
126
|
+
* but does NOT clear registered pollers or their timers.
|
|
127
|
+
*/
|
|
128
|
+
export function stopPollingManager() {
|
|
129
|
+
cleanupOwnResources();
|
|
130
|
+
started = false;
|
|
131
|
+
// Deregister from centralized polling state. Nullify stateUnsub first
|
|
132
|
+
// to prevent re-entrant dispose (unregisterPollingSource calls dispose,
|
|
133
|
+
// which would otherwise try to call stateUnsub again).
|
|
134
|
+
if (stateUnsub) {
|
|
135
|
+
const unsub = stateUnsub;
|
|
136
|
+
stateUnsub = null;
|
|
137
|
+
unsub();
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Register a polling interval. The callback will be called every
|
|
142
|
+
* `intervalMs` milliseconds while the tab is visible.
|
|
143
|
+
*
|
|
144
|
+
* If the tab is currently hidden and the manager is started,
|
|
145
|
+
* the poller is registered but not activated until the tab becomes visible.
|
|
146
|
+
*
|
|
147
|
+
* Returns an unregister function for cleanup.
|
|
148
|
+
*
|
|
149
|
+
* @param key - Unique identifier for this poller. Re-registering with the
|
|
150
|
+
* same key replaces the previous entry.
|
|
151
|
+
* @param callback - Function to call on each tick.
|
|
152
|
+
* @param intervalMs - Polling interval in milliseconds.
|
|
153
|
+
*/
|
|
154
|
+
export function registerPoller(key, callback, intervalMs) {
|
|
155
|
+
// If a poller with this key already exists, clean it up first.
|
|
156
|
+
const existing = pollers.get(key);
|
|
157
|
+
if (existing) {
|
|
158
|
+
deactivatePoller(existing);
|
|
159
|
+
}
|
|
160
|
+
const entry = {
|
|
161
|
+
key,
|
|
162
|
+
callback,
|
|
163
|
+
intervalMs,
|
|
164
|
+
timerId: null,
|
|
165
|
+
};
|
|
166
|
+
pollers.set(key, entry);
|
|
167
|
+
// Only activate if the manager is started and not suspended.
|
|
168
|
+
if (started && !suspended) {
|
|
169
|
+
activatePoller(entry);
|
|
170
|
+
}
|
|
171
|
+
else if (!started) {
|
|
172
|
+
// Manager not started — activate immediately (unmanaged mode).
|
|
173
|
+
activatePoller(entry);
|
|
174
|
+
}
|
|
175
|
+
return () => unregisterPoller(key);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Remove a poller from the registry and clear its interval.
|
|
179
|
+
*/
|
|
180
|
+
export function unregisterPoller(key) {
|
|
181
|
+
const entry = pollers.get(key);
|
|
182
|
+
if (!entry)
|
|
183
|
+
return;
|
|
184
|
+
deactivatePoller(entry);
|
|
185
|
+
pollers.delete(key);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Suspend all registered pollers. Clears their interval timers
|
|
189
|
+
* but keeps them in the registry for later resumption.
|
|
190
|
+
*/
|
|
191
|
+
export function suspendAll() {
|
|
192
|
+
suspended = true;
|
|
193
|
+
for (const entry of pollers.values()) {
|
|
194
|
+
deactivatePoller(entry);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Resume all registered pollers. Restarts their interval timers
|
|
199
|
+
* with their original intervals.
|
|
200
|
+
*/
|
|
201
|
+
export function resumeAll() {
|
|
202
|
+
suspended = false;
|
|
203
|
+
for (const entry of pollers.values()) {
|
|
204
|
+
activatePoller(entry);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if the polling manager is currently in a suspended state.
|
|
209
|
+
*/
|
|
210
|
+
export function isSuspended() {
|
|
211
|
+
return suspended;
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Check if a specific poller is actively running (has a timer).
|
|
215
|
+
*/
|
|
216
|
+
export function isPollerActive(key) {
|
|
217
|
+
const entry = pollers.get(key);
|
|
218
|
+
return entry !== null && entry !== undefined && entry.timerId !== null;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Get read-only information about all registered pollers.
|
|
222
|
+
*/
|
|
223
|
+
export function getRegisteredPollers() {
|
|
224
|
+
const result = [];
|
|
225
|
+
for (const entry of pollers.values()) {
|
|
226
|
+
result.push({
|
|
227
|
+
key: entry.key,
|
|
228
|
+
intervalMs: entry.intervalMs,
|
|
229
|
+
active: entry.timerId !== null,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
return result;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Get the number of registered pollers.
|
|
236
|
+
*/
|
|
237
|
+
export function getPollerCount() {
|
|
238
|
+
return pollers.size;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Reset all module state (for testing). Clears all pollers, stops the
|
|
242
|
+
* manager, and resets the suspended flag.
|
|
243
|
+
*/
|
|
244
|
+
export function resetPollingManager() {
|
|
245
|
+
// Clear all pollers.
|
|
246
|
+
for (const entry of pollers.values()) {
|
|
247
|
+
deactivatePoller(entry);
|
|
248
|
+
}
|
|
249
|
+
pollers.clear();
|
|
250
|
+
// Stop the manager.
|
|
251
|
+
stopPollingManager();
|
|
252
|
+
suspended = false;
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=polling-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polling-manager.js","sourceRoot":"","sources":["../../../src/viewer/polling/polling-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polling restart coordinator.
|
|
3
|
+
*
|
|
4
|
+
* Bridges the graceful-degradation system to the centralized polling-state
|
|
5
|
+
* manager. When memory pressure disables the `autoRefresh` feature, this
|
|
6
|
+
* module calls `suspendAllSources()` to halt all non-essential polling
|
|
7
|
+
* sources in one atomic operation. When pressure subsides and `autoRefresh`
|
|
8
|
+
* is re-enabled, it calls `resumeAllSources()` to restart everything at
|
|
9
|
+
* original intervals.
|
|
10
|
+
*
|
|
11
|
+
* This provides a safety net that ensures **all** polling loops stop and
|
|
12
|
+
* restart together, even if an individual component forgets to handle
|
|
13
|
+
* degradation on its own. Components that also track degradation individually
|
|
14
|
+
* (e.g. status-indicators, use-app-data) coexist harmlessly — suspending
|
|
15
|
+
* an already-suspended source or resuming an already-active one is a no-op
|
|
16
|
+
* in both polling-state and polling-manager.
|
|
17
|
+
*
|
|
18
|
+
* Flow:
|
|
19
|
+
*
|
|
20
|
+
* memory-monitor → graceful-degradation → polling-restart
|
|
21
|
+
* ↓
|
|
22
|
+
* polling-state
|
|
23
|
+
* ↓ ↓
|
|
24
|
+
* polling-manager tick-timer
|
|
25
|
+
*
|
|
26
|
+
* Designed as a standalone module with zero framework dependencies.
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Start the polling restart coordinator.
|
|
30
|
+
*
|
|
31
|
+
* Subscribes to degradation changes and evaluates the current state
|
|
32
|
+
* immediately. If `autoRefresh` is already disabled (e.g. the coordinator
|
|
33
|
+
* is started after memory pressure began), sources are suspended at once.
|
|
34
|
+
*
|
|
35
|
+
* Safe to call multiple times — restarts cleanly.
|
|
36
|
+
*/
|
|
37
|
+
export declare function startPollingRestart(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Stop the polling restart coordinator.
|
|
40
|
+
*
|
|
41
|
+
* Unsubscribes from degradation changes. If the coordinator had
|
|
42
|
+
* triggered a global suspension, sources are resumed to avoid
|
|
43
|
+
* leaving polling permanently frozen.
|
|
44
|
+
*/
|
|
45
|
+
export declare function stopPollingRestart(): void;
|