@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.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/README.md +201 -460
- package/esm2022/index.mjs +34 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +123 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +25 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +55 -84
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +46 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/assets/slice.svg +23 -0
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A {@link RegionSource} over a GeoJSON string, parsed and tiled in the region-source Web Worker.
|
|
3
|
+
*
|
|
4
|
+
* One worker serves every open source. Where no worker can start (jsdom, SSR, a blocked worker
|
|
5
|
+
* URL) the same tables run on the main thread; if the worker dies, each source re-opens itself
|
|
6
|
+
* there from its text (which the host holds anyway: it handed it over) and carries on — whether
|
|
7
|
+
* it had a call in flight then or not (see {@link RegionSourceWorkerClient.generation}).
|
|
8
|
+
*/
|
|
9
|
+
import { RegionTileCache, abortable } from './region-source';
|
|
10
|
+
import { RegionSourceTables, } from './region-source-ops';
|
|
11
|
+
/** The worker died under a call; the caller re-opens on the main thread. */
|
|
12
|
+
class WorkerLostError extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super('The region-source worker stopped.');
|
|
15
|
+
this.name = 'WorkerLostError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Owns the region-source worker and the calls in flight on it. */
|
|
19
|
+
export class RegionSourceWorkerClient {
|
|
20
|
+
/**
|
|
21
|
+
* `factory` is optional: without one the real worker module is imported on demand —
|
|
22
|
+
* dynamically, because it holds an `import.meta.url` that ts-jest's CommonJS compile
|
|
23
|
+
* rejects.
|
|
24
|
+
*/
|
|
25
|
+
constructor(factory) {
|
|
26
|
+
this.factory = factory;
|
|
27
|
+
this.worker = null;
|
|
28
|
+
this.starting = null;
|
|
29
|
+
this.unavailable = false;
|
|
30
|
+
this.nextId = 1;
|
|
31
|
+
this.pending = new Map();
|
|
32
|
+
/** The main-thread tables, once anything runs here. */
|
|
33
|
+
this.local = null;
|
|
34
|
+
this.tables = 0;
|
|
35
|
+
}
|
|
36
|
+
/** Whether calls now run on the main thread. */
|
|
37
|
+
get inThread() {
|
|
38
|
+
return this.unavailable;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Which table set calls run on: bumped when the worker is lost. A handle opened under another
|
|
42
|
+
* names a table that is gone (or, here, another source's), so its source must open again.
|
|
43
|
+
*/
|
|
44
|
+
get generation() {
|
|
45
|
+
return this.tables;
|
|
46
|
+
}
|
|
47
|
+
/** Run `request` in the worker, or here when there is none. */
|
|
48
|
+
async call(request) {
|
|
49
|
+
return (await this.run(request)).result;
|
|
50
|
+
}
|
|
51
|
+
/** {@link call}, with the {@link generation} the request ran on. */
|
|
52
|
+
async run(request) {
|
|
53
|
+
const started = await this.ensureWorker();
|
|
54
|
+
// The worker may have been lost while this waited for it.
|
|
55
|
+
const worker = started === this.worker ? started : null;
|
|
56
|
+
const generation = this.tables;
|
|
57
|
+
if (!worker)
|
|
58
|
+
return { result: (this.local ??= new RegionSourceTables()).run(request), generation };
|
|
59
|
+
const id = this.nextId++;
|
|
60
|
+
const result = await new Promise((resolve, reject) => {
|
|
61
|
+
this.pending.set(id, { resolve: resolve, reject });
|
|
62
|
+
worker.postMessage({ ...request, id });
|
|
63
|
+
});
|
|
64
|
+
return { result, generation };
|
|
65
|
+
}
|
|
66
|
+
/** Terminate the worker; calls in flight reject. */
|
|
67
|
+
dispose() {
|
|
68
|
+
this.lose();
|
|
69
|
+
}
|
|
70
|
+
ensureWorker() {
|
|
71
|
+
if (this.worker)
|
|
72
|
+
return Promise.resolve(this.worker);
|
|
73
|
+
if (this.unavailable || (!this.factory && typeof Worker === 'undefined')) {
|
|
74
|
+
this.unavailable = true;
|
|
75
|
+
return Promise.resolve(null);
|
|
76
|
+
}
|
|
77
|
+
if (!this.starting) {
|
|
78
|
+
const starting = this.startWorker();
|
|
79
|
+
this.starting = starting;
|
|
80
|
+
void starting.then(() => {
|
|
81
|
+
if (this.starting === starting)
|
|
82
|
+
this.starting = null;
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return this.starting;
|
|
86
|
+
}
|
|
87
|
+
async startWorker() {
|
|
88
|
+
try {
|
|
89
|
+
const made = this.factory
|
|
90
|
+
? this.factory()
|
|
91
|
+
: import('./region-source-worker').then((m) => m.createRegionSourceWorker());
|
|
92
|
+
const worker = made instanceof Promise ? await made : made;
|
|
93
|
+
worker.onmessage = (event) => this.onReply(event.data);
|
|
94
|
+
worker.onerror = (event) => {
|
|
95
|
+
event.preventDefault?.();
|
|
96
|
+
if (worker === this.worker) {
|
|
97
|
+
console.warn('[region-source] worker failed; tiling on the main thread');
|
|
98
|
+
this.lose();
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
this.worker = worker;
|
|
102
|
+
return worker;
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
console.warn('[region-source] worker unavailable; tiling on the main thread', err);
|
|
106
|
+
this.unavailable = true;
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
onReply(reply) {
|
|
111
|
+
const call = this.pending.get(reply.id);
|
|
112
|
+
if (!call)
|
|
113
|
+
return;
|
|
114
|
+
this.pending.delete(reply.id);
|
|
115
|
+
if (reply.ok)
|
|
116
|
+
call.resolve(reply.result);
|
|
117
|
+
else
|
|
118
|
+
call.reject(new Error(reply.error));
|
|
119
|
+
}
|
|
120
|
+
/** Stop the worker for good: every later call runs here, every call in flight is lost. */
|
|
121
|
+
lose() {
|
|
122
|
+
if (this.worker)
|
|
123
|
+
this.tables++;
|
|
124
|
+
this.unavailable = true;
|
|
125
|
+
this.worker?.terminate();
|
|
126
|
+
this.worker = null;
|
|
127
|
+
const calls = [...this.pending.values()];
|
|
128
|
+
this.pending.clear();
|
|
129
|
+
for (const call of calls)
|
|
130
|
+
call.reject(new WorkerLostError());
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
let shared = null;
|
|
134
|
+
/** The worker client every GeoJSON source shares. */
|
|
135
|
+
export function sharedRegionSourceClient() {
|
|
136
|
+
return (shared ??= new RegionSourceWorkerClient());
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Open a GeoJSON FeatureCollection string as a tiled region source. Rejects on invalid JSON or
|
|
140
|
+
* a collection without `features`.
|
|
141
|
+
*/
|
|
142
|
+
export async function openGeoJsonRegionSource(text, client = sharedRegionSourceClient()) {
|
|
143
|
+
// The worker lost under the open: open on the main thread instead.
|
|
144
|
+
const opened = await client
|
|
145
|
+
.run({ op: 'open', text })
|
|
146
|
+
.catch((err) => (err instanceof WorkerLostError ? client.run({ op: 'open', text }) : Promise.reject(err)));
|
|
147
|
+
const { handle, info } = opened.result;
|
|
148
|
+
return new WorkerRegionSource(client, text, handle, opened.generation, info);
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* The 3D reconstruction of a region from its outlines on a stack (see `geometry/reconstruct`),
|
|
152
|
+
* meshed in the region-source worker (on the main thread where there is none).
|
|
153
|
+
*/
|
|
154
|
+
export function reconstructInWorker(slices, options, client = sharedRegionSourceClient()) {
|
|
155
|
+
return client.call({ op: 'mesh', slices, options });
|
|
156
|
+
}
|
|
157
|
+
class WorkerRegionSource {
|
|
158
|
+
constructor(client, text, handle,
|
|
159
|
+
/** The client's {@link RegionSourceWorkerClient.generation} {@link handle} was opened under. */
|
|
160
|
+
generation, info) {
|
|
161
|
+
this.client = client;
|
|
162
|
+
this.text = text;
|
|
163
|
+
this.handle = handle;
|
|
164
|
+
this.generation = generation;
|
|
165
|
+
this.info = info;
|
|
166
|
+
this.cache = new RegionTileCache();
|
|
167
|
+
this.disposed = false;
|
|
168
|
+
/** The main-thread re-open after the worker died, shared by every call that finds it so. */
|
|
169
|
+
this.reopening = null;
|
|
170
|
+
}
|
|
171
|
+
getTile(z, key, signal) {
|
|
172
|
+
const tile = this.cache.get(z, key, () => this.call((handle) => ({ op: 'tile', handle, z, level: key.level, gx: key.gx, gy: key.gy })));
|
|
173
|
+
return abortable(tile, signal);
|
|
174
|
+
}
|
|
175
|
+
getFeatures(ids) {
|
|
176
|
+
return this.call((handle) => ({ op: 'features', handle, ids }));
|
|
177
|
+
}
|
|
178
|
+
getIndex(z, query) {
|
|
179
|
+
return this.call((handle) => ({ op: 'index', handle, z, query }));
|
|
180
|
+
}
|
|
181
|
+
getClassOutlines(classes, level, exclude) {
|
|
182
|
+
return this.call((handle) => ({ op: 'outlines', handle, classes, level, exclude }));
|
|
183
|
+
}
|
|
184
|
+
getClassCounts(z, exclude) {
|
|
185
|
+
return this.call((handle) => ({ op: 'classes', handle, z, exclude }));
|
|
186
|
+
}
|
|
187
|
+
exportGeoJson(exclude, extra) {
|
|
188
|
+
return this.call((handle) => ({ op: 'export', handle, exclude, extra }));
|
|
189
|
+
}
|
|
190
|
+
dispose() {
|
|
191
|
+
if (this.disposed)
|
|
192
|
+
return;
|
|
193
|
+
this.disposed = true;
|
|
194
|
+
this.cache.clear();
|
|
195
|
+
// A handle from a lost worker's tables names nothing here, or another source's table.
|
|
196
|
+
if (this.generation !== this.client.generation)
|
|
197
|
+
return;
|
|
198
|
+
void this.client.call({ op: 'close', handle: this.handle }).catch(() => undefined);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Run a request on this source's table; when the worker died (under this call or before it),
|
|
202
|
+
* re-open here and run it there.
|
|
203
|
+
*/
|
|
204
|
+
async call(make) {
|
|
205
|
+
for (let attempt = 0;; attempt++) {
|
|
206
|
+
if (this.generation !== this.client.generation)
|
|
207
|
+
await this.reopen();
|
|
208
|
+
try {
|
|
209
|
+
return await this.client.call(make(this.handle));
|
|
210
|
+
}
|
|
211
|
+
catch (err) {
|
|
212
|
+
if (!(err instanceof WorkerLostError) || attempt > 0)
|
|
213
|
+
throw err;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/** Open this source's text again on the client's current tables, once for every call waiting. */
|
|
218
|
+
reopen() {
|
|
219
|
+
this.reopening ??= this.client
|
|
220
|
+
.run({ op: 'open', text: this.text })
|
|
221
|
+
.then(({ result, generation }) => {
|
|
222
|
+
this.handle = result.handle;
|
|
223
|
+
this.generation = generation;
|
|
224
|
+
})
|
|
225
|
+
.finally(() => (this.reopening = null));
|
|
226
|
+
return this.reopening;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2VyLXJlZ2lvbi1zb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUNILE9BQU8sRUFBZ0IsZUFBZSxFQUFpQixTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMxRixPQUFPLEVBS0wsa0JBQWtCLEdBQ25CLE1BQU0scUJBQXFCLENBQUM7QUFlN0IsNEVBQTRFO0FBQzVFLE1BQU0sZUFBZ0IsU0FBUSxLQUFLO0lBQ2pDO1FBQ0UsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0NBQ0Y7QUFPRCxtRUFBbUU7QUFDbkUsTUFBTSxPQUFPLHdCQUF3QjtJQVVuQzs7OztPQUlHO0lBQ0gsWUFBNkIsT0FBbUM7UUFBbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFkeEQsV0FBTSxHQUFrQixJQUFJLENBQUM7UUFDN0IsYUFBUSxHQUFrQyxJQUFJLENBQUM7UUFDL0MsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNGLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBdUIsQ0FBQztRQUMxRCx1REFBdUQ7UUFDL0MsVUFBSyxHQUE4QixJQUFJLENBQUM7UUFDeEMsV0FBTSxHQUFHLENBQUMsQ0FBQztJQU9nRCxDQUFDO0lBRXBFLGdEQUFnRDtJQUNoRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNILElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsK0RBQStEO0lBQy9ELEtBQUssQ0FBQyxJQUFJLENBQWdDLE9BQVU7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SUFDSCxDQUFDO0lBRUQsaUdBQWlHO0lBQ3pGLE1BQU07UUFDWixJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxNQUFNO2FBQzNCLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUNwQyxJQUFJLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFO1lBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUM1QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUMvQixDQUFDLENBQUM7YUFDRCxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQSB7QGxpbmsgUmVnaW9uU291cmNlfSBvdmVyIGEgR2VvSlNPTiBzdHJpbmcsIHBhcnNlZCBhbmQgdGlsZWQgaW4gdGhlIHJlZ2lvbi1zb3VyY2UgV2ViIFdvcmtlci5cbiAqXG4gKiBPbmUgd29ya2VyIHNlcnZlcyBldmVyeSBvcGVuIHNvdXJjZS4gV2hlcmUgbm8gd29ya2VyIGNhbiBzdGFydCAoanNkb20sIFNTUiwgYSBibG9ja2VkIHdvcmtlclxuICogVVJMKSB0aGUgc2FtZSB0YWJsZXMgcnVuIG9uIHRoZSBtYWluIHRocmVhZDsgaWYgdGhlIHdvcmtlciBkaWVzLCBlYWNoIHNvdXJjZSByZS1vcGVucyBpdHNlbGZcbiAqIHRoZXJlIGZyb20gaXRzIHRleHQgKHdoaWNoIHRoZSBob3N0IGhvbGRzIGFueXdheTogaXQgaGFuZGVkIGl0IG92ZXIpIGFuZCBjYXJyaWVzIG9uIOKAlCB3aGV0aGVyXG4gKiBpdCBoYWQgYSBjYWxsIGluIGZsaWdodCB0aGVuIG9yIG5vdCAoc2VlIHtAbGluayBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQuZ2VuZXJhdGlvbn0pLlxuICovXG5pbXBvcnQgeyBSZWdpb25Tb3VyY2UsIFJlZ2lvblRpbGVDYWNoZSwgU291cmNlRmVhdHVyZSwgYWJvcnRhYmxlIH0gZnJvbSAnLi9yZWdpb24tc291cmNlJztcbmltcG9ydCB7XG4gIFJlZ2lvblNvdXJjZU1lc3NhZ2UsXG4gIFJlZ2lvblNvdXJjZVJlcGx5LFxuICBSZWdpb25Tb3VyY2VSZXF1ZXN0LFxuICBSZWdpb25Tb3VyY2VSZXN1bHRzLFxuICBSZWdpb25Tb3VyY2VUYWJsZXMsXG59IGZyb20gJy4vcmVnaW9uLXNvdXJjZS1vcHMnO1xuaW1wb3J0IHR5cGUge1xuICBDbGFzc091dGxpbmVzLFxuICBSZWdpb25JbmRleFBhZ2UsXG4gIFJlZ2lvbkluZGV4UXVlcnksXG4gIFJlZ2lvblNvdXJjZUluZm8sXG4gIFJlZ2lvblRpbGUsXG4gIFJlZ2lvblRpbGVLZXksXG59IGZyb20gJy4vcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVjb25zdHJ1Y3RPcHRpb25zLCBTbGljZU91dGxpbmVzIH0gZnJvbSAnLi4vZ2VvbWV0cnkvcmVjb25zdHJ1Y3QnO1xuaW1wb3J0IHR5cGUgeyBNZXNoIH0gZnJvbSAnbmFwYXJpLWpzL2dlb21ldHJ5JztcblxuLyoqIE1ha2VzIHRoZSB3b3JrZXI7IG1heSBiZSBhc3luYywgYXMgdGhlIGRlZmF1bHQgb25lIGlzIChpdCBpbXBvcnRzIHRoZSBmYWN0b3J5IG9uIGRlbWFuZCkuICovXG5leHBvcnQgdHlwZSBSZWdpb25Tb3VyY2VXb3JrZXJGYWN0b3J5ID0gKCkgPT4gV29ya2VyIHwgUHJvbWlzZTxXb3JrZXI+O1xuXG4vKiogVGhlIHdvcmtlciBkaWVkIHVuZGVyIGEgY2FsbDsgdGhlIGNhbGxlciByZS1vcGVucyBvbiB0aGUgbWFpbiB0aHJlYWQuICovXG5jbGFzcyBXb3JrZXJMb3N0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdUaGUgcmVnaW9uLXNvdXJjZSB3b3JrZXIgc3RvcHBlZC4nKTtcbiAgICB0aGlzLm5hbWUgPSAnV29ya2VyTG9zdEVycm9yJztcbiAgfVxufVxuXG5pbnRlcmZhY2UgUGVuZGluZ0NhbGwge1xuICByZXNvbHZlOiAodmFsdWU6IHVua25vd24pID0+IHZvaWQ7XG4gIHJlamVjdDogKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZDtcbn1cblxuLyoqIE93bnMgdGhlIHJlZ2lvbi1zb3VyY2Ugd29ya2VyIGFuZCB0aGUgY2FsbHMgaW4gZmxpZ2h0IG9uIGl0LiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCB7XG4gIHByaXZhdGUgd29ya2VyOiBXb3JrZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBzdGFydGluZzogUHJvbWlzZTxXb3JrZXIgfCBudWxsPiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVuYXZhaWxhYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgbmV4dElkID0gMTtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxudW1iZXIsIFBlbmRpbmdDYWxsPigpO1xuICAvKiogVGhlIG1haW4tdGhyZWFkIHRhYmxlcywgb25jZSBhbnl0aGluZyBydW5zIGhlcmUuICovXG4gIHByaXZhdGUgbG9jYWw6IFJlZ2lvblNvdXJjZVRhYmxlcyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHRhYmxlcyA9IDA7XG5cbiAgLyoqXG4gICAqIGBmYWN0b3J5YCBpcyBvcHRpb25hbDogd2l0aG91dCBvbmUgdGhlIHJlYWwgd29ya2VyIG1vZHVsZSBpcyBpbXBvcnRlZCBvbiBkZW1hbmQg4oCUXG4gICAqIGR5bmFtaWNhbGx5LCBiZWNhdXNlIGl0IGhvbGRzIGFuIGBpbXBvcnQubWV0YS51cmxgIHRoYXQgdHMtamVzdCdzIENvbW1vbkpTIGNvbXBpbGVcbiAgICogcmVqZWN0cy5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZmFjdG9yeT86IFJlZ2lvblNvdXJjZVdvcmtlckZhY3RvcnkpIHt9XG5cbiAgLyoqIFdoZXRoZXIgY2FsbHMgbm93IHJ1biBvbiB0aGUgbWFpbiB0aHJlYWQuICovXG4gIGdldCBpblRocmVhZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51bmF2YWlsYWJsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGljaCB0YWJsZSBzZXQgY2FsbHMgcnVuIG9uOiBidW1wZWQgd2hlbiB0aGUgd29ya2VyIGlzIGxvc3QuIEEgaGFuZGxlIG9wZW5lZCB1bmRlciBhbm90aGVyXG4gICAqIG5hbWVzIGEgdGFibGUgdGhhdCBpcyBnb25lIChvciwgaGVyZSwgYW5vdGhlciBzb3VyY2UncyksIHNvIGl0cyBzb3VyY2UgbXVzdCBvcGVuIGFnYWluLlxuICAgKi9cbiAgZ2V0IGdlbmVyYXRpb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy50YWJsZXM7XG4gIH1cblxuICAvKiogUnVuIGByZXF1ZXN0YCBpbiB0aGUgd29ya2VyLCBvciBoZXJlIHdoZW4gdGhlcmUgaXMgbm9uZS4gKi9cbiAgYXN5bmMgY2FsbDxSIGV4dGVuZHMgUmVnaW9uU291cmNlUmVxdWVzdD4ocmVxdWVzdDogUik6IFByb21pc2U8UmVnaW9uU291cmNlUmVzdWx0c1tSWydvcCddXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5ydW4ocmVxdWVzdCkpLnJlc3VsdDtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgY2FsbH0sIHdpdGggdGhlIHtAbGluayBnZW5lcmF0aW9ufSB0aGUgcmVxdWVzdCByYW4gb24uICovXG4gIGFzeW5jIHJ1bjxSIGV4dGVuZHMgUmVnaW9uU291cmNlUmVxdWVzdD4oXG4gICAgcmVxdWVzdDogUixcbiAgKTogUHJvbWlzZTx7IHJlc3VsdDogUmVnaW9uU291cmNlUmVzdWx0c1tSWydvcCddXTsgZ2VuZXJhdGlvbjogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGFydGVkID0gYXdhaXQgdGhpcy5lbnN1cmVXb3JrZXIoKTtcbiAgICAvLyBUaGUgd29ya2VyIG1heSBoYXZlIGJlZW4gbG9zdCB3aGlsZSB0aGlzIHdhaXRlZCBmb3IgaXQuXG4gICAgY29uc3Qgd29ya2VyID0gc3RhcnRlZCA9PT0gdGhpcy53b3JrZXIgPyBzdGFydGVkIDogbnVsbDtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdGhpcy50YWJsZXM7XG4gICAgaWYgKCF3b3JrZXIpIHJldHVybiB7IHJlc3VsdDogKHRoaXMubG9jYWwgPz89IG5ldyBSZWdpb25Tb3VyY2VUYWJsZXMoKSkucnVuKHJlcXVlc3QpLCBnZW5lcmF0aW9uIH07XG4gICAgY29uc3QgaWQgPSB0aGlzLm5leHRJZCsrO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG5ldyBQcm9taXNlPFJlZ2lvblNvdXJjZVJlc3VsdHNbUlsnb3AnXV0+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucGVuZGluZy5zZXQoaWQsIHsgcmVzb2x2ZTogcmVzb2x2ZSBhcyAodjogdW5rbm93bikgPT4gdm9pZCwgcmVqZWN0IH0pO1xuICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHsgLi4ucmVxdWVzdCwgaWQgfSBhcyBSZWdpb25Tb3VyY2VNZXNzYWdlKTtcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXN1bHQsIGdlbmVyYXRpb24gfTtcbiAgfVxuXG4gIC8qKiBUZXJtaW5hdGUgdGhlIHdvcmtlcjsgY2FsbHMgaW4gZmxpZ2h0IHJlamVjdC4gKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW5zdXJlV29ya2VyKCk6IFByb21pc2U8V29ya2VyIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLndvcmtlcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLndvcmtlcik7XG4gICAgaWYgKHRoaXMudW5hdmFpbGFibGUgfHwgKCF0aGlzLmZhY3RvcnkgJiYgdHlwZW9mIFdvcmtlciA9PT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICB0aGlzLnVuYXZhaWxhYmxlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zdGFydGluZykge1xuICAgICAgY29uc3Qgc3RhcnRpbmcgPSB0aGlzLnN0YXJ0V29ya2VyKCk7XG4gICAgICB0aGlzLnN0YXJ0aW5nID0gc3RhcnRpbmc7XG4gICAgICB2b2lkIHN0YXJ0aW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zdGFydGluZyA9PT0gc3RhcnRpbmcpIHRoaXMuc3RhcnRpbmcgPSBudWxsO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXJ0aW5nO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydFdvcmtlcigpOiBQcm9taXNlPFdvcmtlciB8IG51bGw+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbWFkZSA9IHRoaXMuZmFjdG9yeVxuICAgICAgICA/IHRoaXMuZmFjdG9yeSgpXG4gICAgICAgIDogaW1wb3J0KCcuL3JlZ2lvbi1zb3VyY2Utd29ya2VyJykudGhlbigobSkgPT4gbS5jcmVhdGVSZWdpb25Tb3VyY2VXb3JrZXIoKSk7XG4gICAgICBjb25zdCB3b3JrZXIgPSBtYWRlIGluc3RhbmNlb2YgUHJvbWlzZSA/IGF3YWl0IG1hZGUgOiBtYWRlO1xuICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50PFJlZ2lvblNvdXJjZVJlcGx5PikgPT4gdGhpcy5vblJlcGx5KGV2ZW50LmRhdGEpO1xuICAgICAgd29ya2VyLm9uZXJyb3IgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0Py4oKTtcbiAgICAgICAgaWYgKHdvcmtlciA9PT0gdGhpcy53b3JrZXIpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb24tc291cmNlXSB3b3JrZXIgZmFpbGVkOyB0aWxpbmcgb24gdGhlIG1haW4gdGhyZWFkJyk7XG4gICAgICAgICAgdGhpcy5sb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgIHJldHVybiB3b3JrZXI7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1tyZWdpb24tc291cmNlXSB3b3JrZXIgdW5hdmFpbGFibGU7IHRpbGluZyBvbiB0aGUgbWFpbiB0aHJlYWQnLCBlcnIpO1xuICAgICAgdGhpcy51bmF2YWlsYWJsZSA9IHRydWU7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG9uUmVwbHkocmVwbHk6IFJlZ2lvblNvdXJjZVJlcGx5KTogdm9pZCB7XG4gICAgY29uc3QgY2FsbCA9IHRoaXMucGVuZGluZy5nZXQocmVwbHkuaWQpO1xuICAgIGlmICghY2FsbCkgcmV0dXJuO1xuICAgIHRoaXMucGVuZGluZy5kZWxldGUocmVwbHkuaWQpO1xuICAgIGlmIChyZXBseS5vaykgY2FsbC5yZXNvbHZlKHJlcGx5LnJlc3VsdCk7XG4gICAgZWxzZSBjYWxsLnJlamVjdChuZXcgRXJyb3IocmVwbHkuZXJyb3IpKTtcbiAgfVxuXG4gIC8qKiBTdG9wIHRoZSB3b3JrZXIgZm9yIGdvb2Q6IGV2ZXJ5IGxhdGVyIGNhbGwgcnVucyBoZXJlLCBldmVyeSBjYWxsIGluIGZsaWdodCBpcyBsb3N0LiAqL1xuICBwcml2YXRlIGxvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMud29ya2VyKSB0aGlzLnRhYmxlcysrO1xuICAgIHRoaXMudW5hdmFpbGFibGUgPSB0cnVlO1xuICAgIHRoaXMud29ya2VyPy50ZXJtaW5hdGUoKTtcbiAgICB0aGlzLndvcmtlciA9IG51bGw7XG4gICAgY29uc3QgY2FsbHMgPSBbLi4udGhpcy5wZW5kaW5nLnZhbHVlcygpXTtcbiAgICB0aGlzLnBlbmRpbmcuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IGNhbGwgb2YgY2FsbHMpIGNhbGwucmVqZWN0KG5ldyBXb3JrZXJMb3N0RXJyb3IoKSk7XG4gIH1cbn1cblxubGV0IHNoYXJlZDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50IHwgbnVsbCA9IG51bGw7XG5cbi8qKiBUaGUgd29ya2VyIGNsaWVudCBldmVyeSBHZW9KU09OIHNvdXJjZSBzaGFyZXMuICovXG5leHBvcnQgZnVuY3Rpb24gc2hhcmVkUmVnaW9uU291cmNlQ2xpZW50KCk6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCB7XG4gIHJldHVybiAoc2hhcmVkID8/PSBuZXcgUmVnaW9uU291cmNlV29ya2VyQ2xpZW50KCkpO1xufVxuXG4vKipcbiAqIE9wZW4gYSBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uIHN0cmluZyBhcyBhIHRpbGVkIHJlZ2lvbiBzb3VyY2UuIFJlamVjdHMgb24gaW52YWxpZCBKU09OIG9yXG4gKiBhIGNvbGxlY3Rpb24gd2l0aG91dCBgZmVhdHVyZXNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoXG4gIHRleHQ6IHN0cmluZyxcbiAgY2xpZW50OiBSZWdpb25Tb3VyY2VXb3JrZXJDbGllbnQgPSBzaGFyZWRSZWdpb25Tb3VyY2VDbGllbnQoKSxcbik6IFByb21pc2U8UmVnaW9uU291cmNlPiB7XG4gIC8vIFRoZSB3b3JrZXIgbG9zdCB1bmRlciB0aGUgb3Blbjogb3BlbiBvbiB0aGUgbWFpbiB0aHJlYWQgaW5zdGVhZC5cbiAgY29uc3Qgb3BlbmVkID0gYXdhaXQgY2xpZW50XG4gICAgLnJ1bih7IG9wOiAnb3BlbicsIHRleHQgfSlcbiAgICAuY2F0Y2goKGVycikgPT4gKGVyciBpbnN0YW5jZW9mIFdvcmtlckxvc3RFcnJvciA/IGNsaWVudC5ydW4oeyBvcDogJ29wZW4nLCB0ZXh0IH0pIDogUHJvbWlzZS5yZWplY3QoZXJyKSkpO1xuICBjb25zdCB7IGhhbmRsZSwgaW5mbyB9ID0gb3BlbmVkLnJlc3VsdDtcbiAgcmV0dXJuIG5ldyBXb3JrZXJSZWdpb25Tb3VyY2UoY2xpZW50LCB0ZXh0LCBoYW5kbGUsIG9wZW5lZC5nZW5lcmF0aW9uLCBpbmZvKTtcbn1cblxuLyoqXG4gKiBUaGUgM0QgcmVjb25zdHJ1Y3Rpb24gb2YgYSByZWdpb24gZnJvbSBpdHMgb3V0bGluZXMgb24gYSBzdGFjayAoc2VlIGBnZW9tZXRyeS9yZWNvbnN0cnVjdGApLFxuICogbWVzaGVkIGluIHRoZSByZWdpb24tc291cmNlIHdvcmtlciAob24gdGhlIG1haW4gdGhyZWFkIHdoZXJlIHRoZXJlIGlzIG5vbmUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVjb25zdHJ1Y3RJbldvcmtlcihcbiAgc2xpY2VzOiByZWFkb25seSBTbGljZU91dGxpbmVzW10sXG4gIG9wdGlvbnM/OiBSZWNvbnN0cnVjdE9wdGlvbnMsXG4gIGNsaWVudDogUmVnaW9uU291cmNlV29ya2VyQ2xpZW50ID0gc2hhcmVkUmVnaW9uU291cmNlQ2xpZW50KCksXG4pOiBQcm9taXNlPE1lc2g+IHtcbiAgcmV0dXJuIGNsaWVudC5jYWxsKHsgb3A6ICdtZXNoJywgc2xpY2VzLCBvcHRpb25zIH0pO1xufVxuXG5jbGFzcyBXb3JrZXJSZWdpb25Tb3VyY2UgaW1wbGVtZW50cyBSZWdpb25Tb3VyY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhY2hlID0gbmV3IFJlZ2lvblRpbGVDYWNoZSgpO1xuICBwcml2YXRlIGRpc3Bvc2VkID0gZmFsc2U7XG4gIC8qKiBUaGUgbWFpbi10aHJlYWQgcmUtb3BlbiBhZnRlciB0aGUgd29ya2VyIGRpZWQsIHNoYXJlZCBieSBldmVyeSBjYWxsIHRoYXQgZmluZHMgaXQgc28uICovXG4gIHByaXZhdGUgcmVvcGVuaW5nOiBQcm9taXNlPHZvaWQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjbGllbnQ6IFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHQ6IHN0cmluZyxcbiAgICBwcml2YXRlIGhhbmRsZTogbnVtYmVyLFxuICAgIC8qKiBUaGUgY2xpZW50J3Mge0BsaW5rIFJlZ2lvblNvdXJjZVdvcmtlckNsaWVudC5nZW5lcmF0aW9ufSB7QGxpbmsgaGFuZGxlfSB3YXMgb3BlbmVkIHVuZGVyLiAqL1xuICAgIHByaXZhdGUgZ2VuZXJhdGlvbjogbnVtYmVyLFxuICAgIHJlYWRvbmx5IGluZm86IFJlZ2lvblNvdXJjZUluZm8sXG4gICkge31cblxuICBnZXRUaWxlKHo6IG51bWJlciwga2V5OiBSZWdpb25UaWxlS2V5LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UmVnaW9uVGlsZT4ge1xuICAgIGNvbnN0IHRpbGUgPSB0aGlzLmNhY2hlLmdldCh6LCBrZXksICgpID0+XG4gICAgICB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICd0aWxlJywgaGFuZGxlLCB6LCBsZXZlbDoga2V5LmxldmVsLCBneDoga2V5Lmd4LCBneToga2V5Lmd5IH0pKSxcbiAgICApO1xuICAgIHJldHVybiBhYm9ydGFibGUodGlsZSwgc2lnbmFsKTtcbiAgfVxuXG4gIGdldEZlYXR1cmVzKGlkczogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFNvdXJjZUZlYXR1cmVbXT4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdmZWF0dXJlcycsIGhhbmRsZSwgaWRzIH0pKTtcbiAgfVxuXG4gIGdldEluZGV4KHo6IG51bWJlciwgcXVlcnk6IFJlZ2lvbkluZGV4UXVlcnkpOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdpbmRleCcsIGhhbmRsZSwgeiwgcXVlcnkgfSkpO1xuICB9XG5cbiAgZ2V0Q2xhc3NPdXRsaW5lcyhcbiAgICBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB8IG51bGwsXG4gICAgbGV2ZWw6IG51bWJlcixcbiAgICBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sXG4gICk6IFByb21pc2U8Q2xhc3NPdXRsaW5lc1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2FsbCgoaGFuZGxlKSA9PiAoeyBvcDogJ291dGxpbmVzJywgaGFuZGxlLCBjbGFzc2VzLCBsZXZlbCwgZXhjbHVkZSB9KSk7XG4gIH1cblxuICBnZXRDbGFzc0NvdW50cyh6OiBudW1iZXIgfCBudWxsLCBleGNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIG51bWJlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsKChoYW5kbGUpID0+ICh7IG9wOiAnY2xhc3NlcycsIGhhbmRsZSwgeiwgZXhjbHVkZSB9KSk7XG4gIH1cblxuICBleHBvcnRHZW9Kc29uKGV4Y2x1ZGU6IHJlYWRvbmx5IHN0cmluZ1tdLCBleHRyYTogcmVhZG9ubHkgb2JqZWN0W10pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLmNhbGwoKGhhbmRsZSkgPT4gKHsgb3A6ICdleHBvcnQnLCBoYW5kbGUsIGV4Y2x1ZGUsIGV4dHJhIH0pKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHJldHVybjtcbiAgICB0aGlzLmRpc3Bvc2VkID0gdHJ1ZTtcbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgLy8gQSBoYW5kbGUgZnJvbSBhIGxvc3Qgd29ya2VyJ3MgdGFibGVzIG5hbWVzIG5vdGhpbmcgaGVyZSwgb3IgYW5vdGhlciBzb3VyY2UncyB0YWJsZS5cbiAgICBpZiAodGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmNsaWVudC5nZW5lcmF0aW9uKSByZXR1cm47XG4gICAgdm9pZCB0aGlzLmNsaWVudC5jYWxsKHsgb3A6ICdjbG9zZScsIGhhbmRsZTogdGhpcy5oYW5kbGUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByZXF1ZXN0IG9uIHRoaXMgc291cmNlJ3MgdGFibGU7IHdoZW4gdGhlIHdvcmtlciBkaWVkICh1bmRlciB0aGlzIGNhbGwgb3IgYmVmb3JlIGl0KSxcbiAgICogcmUtb3BlbiBoZXJlIGFuZCBydW4gaXQgdGhlcmUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNhbGw8UiBleHRlbmRzIFJlZ2lvblNvdXJjZVJlcXVlc3Q+KFxuICAgIG1ha2U6IChoYW5kbGU6IG51bWJlcikgPT4gUixcbiAgKTogUHJvbWlzZTxSZWdpb25Tb3VyY2VSZXN1bHRzW1JbJ29wJ11dPiB7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IDsgYXR0ZW1wdCsrKSB7XG4gICAgICBpZiAodGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmNsaWVudC5nZW5lcmF0aW9uKSBhd2FpdCB0aGlzLnJlb3BlbigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY2xpZW50LmNhbGwobWFrZSh0aGlzLmhhbmRsZSkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmICghKGVyciBpbnN0YW5jZW9mIFdvcmtlckxvc3RFcnJvcikgfHwgYXR0ZW1wdCA+IDApIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT3BlbiB0aGlzIHNvdXJjZSdzIHRleHQgYWdhaW4gb24gdGhlIGNsaWVudCdzIGN1cnJlbnQgdGFibGVzLCBvbmNlIGZvciBldmVyeSBjYWxsIHdhaXRpbmcuICovXG4gIHByaXZhdGUgcmVvcGVuKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMucmVvcGVuaW5nID8/PSB0aGlzLmNsaWVudFxuICAgICAgLnJ1bih7IG9wOiAnb3BlbicsIHRleHQ6IHRoaXMudGV4dCB9KVxuICAgICAgLnRoZW4oKHsgcmVzdWx0LCBnZW5lcmF0aW9uIH0pID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGUgPSByZXN1bHQuaGFuZGxlO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgfSlcbiAgICAgIC5maW5hbGx5KCgpID0+ICh0aGlzLnJlb3BlbmluZyA9IG51bGwpKTtcbiAgICByZXR1cm4gdGhpcy5yZW9wZW5pbmc7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -8,11 +8,12 @@ export class RenderOrchestrator {
|
|
|
8
8
|
if (!smallInfo) {
|
|
9
9
|
try {
|
|
10
10
|
await this.host.renderPhase(info, false);
|
|
11
|
-
this.host.finished(false
|
|
11
|
+
this.host.finished(false);
|
|
12
12
|
}
|
|
13
13
|
catch (err) {
|
|
14
14
|
console.error('Preview failed', err);
|
|
15
|
-
this.host.finished(false
|
|
15
|
+
this.host.finished(false);
|
|
16
|
+
this.host.renderFailed(err);
|
|
16
17
|
}
|
|
17
18
|
return;
|
|
18
19
|
}
|
|
@@ -21,7 +22,6 @@ export class RenderOrchestrator {
|
|
|
21
22
|
await this.host.renderPhase(smallInfo, false);
|
|
22
23
|
this.host.smallShown();
|
|
23
24
|
smallReleasedOverlay = true;
|
|
24
|
-
console.log('multi-tier: small tier rendered, starting large');
|
|
25
25
|
}
|
|
26
26
|
catch (err) {
|
|
27
27
|
// Small-tier render failed (older backend without tier support, transient
|
|
@@ -31,17 +31,20 @@ export class RenderOrchestrator {
|
|
|
31
31
|
try {
|
|
32
32
|
await this.renderLargeWithRetry(info);
|
|
33
33
|
this.host.sharpenSettled();
|
|
34
|
-
|
|
35
|
-
this.host.finished(true, 'multi-tier: large tier rendered, sharpening complete');
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
this.host.finished(false, 'finished plotting (large only after small fallback)');
|
|
39
|
-
}
|
|
34
|
+
this.host.finished(smallReleasedOverlay);
|
|
40
35
|
}
|
|
41
36
|
catch (err) {
|
|
42
37
|
this.host.sharpenSettled();
|
|
43
38
|
console.error('Large-tier preview failed after retry', err);
|
|
44
|
-
|
|
39
|
+
if (smallReleasedOverlay) {
|
|
40
|
+
this.host.sharpenFailed(err);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
// The small tier never made it either: there is no preview to fall back
|
|
44
|
+
// on, and the overlay is still up.
|
|
45
|
+
this.host.finished(false);
|
|
46
|
+
this.host.renderFailed(err);
|
|
47
|
+
}
|
|
45
48
|
}
|
|
46
49
|
}
|
|
47
50
|
/** One retry after a brief delay before giving up on the large tier. */
|
|
@@ -84,4 +87,4 @@ export class SliceScrubber {
|
|
|
84
87
|
}
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9yY2hlc3RyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLW9yY2hlc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtQ0EsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLElBQXVCLEVBQ3ZCLGVBQWUsSUFBSTtRQURuQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBTztJQUMxQixDQUFDO0lBRUosZ0ZBQWdGO0lBQ2hGLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBZ0IsRUFBRSxTQUE0QjtRQUN6RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBQ2hELENBQUM7WUFDRCxPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2pDLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdkIsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELENBQUMsQ0FBQztRQUNqRSxDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixJQUFJLG9CQUFvQixFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzREFBc0QsQ0FBQyxDQUFDO1lBQ25GLENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUscURBQXFELENBQUMsQ0FBQztZQUNuRixDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0IsQ0FBQztJQUNILENBQUM7SUFFRCx3RUFBd0U7SUFDaEUsb0JBQW9CLENBQUMsSUFBZ0I7UUFDM0MsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDckQsT0FBTyxDQUFDLElBQUksQ0FBQyx3REFBd0QsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1RSxPQUFPLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FDdEYsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUNsQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFDVSxLQUEwQixFQUMxQixVQUFVLEdBQUc7UUFEYixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUMxQixZQUFPLEdBQVAsT0FBTyxDQUFNO1FBSmYsVUFBSyxHQUF5QyxJQUFJLENBQUM7SUFLeEQsQ0FBQztJQUVKLGlEQUFpRDtJQUNqRCxLQUFLLENBQUMsQ0FBUztRQUNiLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVELG1GQUFtRjtJQUNuRixNQUFNLENBQUMsQ0FBUztRQUNkLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEIsQ0FBQztJQUVELHdEQUF3RDtJQUN4RCxNQUFNO1FBQ0osSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuXG4vKipcbiAqIFR3by1wYXNzIChzbWFsbOKGkmxhcmdlKSByZW5kZXIgc2VxdWVuY2luZywgZXh0cmFjdGVkIGZyb21cbiAqIFZpc3VhbGl6ZXJDb21wb25lbnQgKHJlZmFjdG9yaW5nIHBsYW4sIFN0ZXAgNyDigJQgYSBwdXJlIG1vdmUgb2YgdGhlXG4gKiBvcmNoZXN0cmF0aW9uOyB0aGUgY29tcG9uZW50IGtlZXBzIHRoZSBVSSBmbGFncyBhbmQgc3VwcGxpZXMgdGhlbSB0aHJvdWdoXG4gKiB0aGUgaG9zdCBjYWxsYmFja3MpLlxuICpcbiAqIFdoZW4gdGhlIGZpbGUgaGFzIHNtYWxsLXRpZXIgVVJMcyB3ZSByZW5kZXIgdGhlIHNtYWxsIHRpZXIgZmlyc3QgZm9yIGEgZmFzdFxuICogYmx1cnJ5IHByZXZpZXcsIHJlbGVhc2UgdGhlIGxvYWRpbmcgb3ZlcmxheSAoa2VlcGluZyBhIHRyYW5zbHVjZW50XG4gKiBcInNoYXJwZW5pbmdcIiBzcGlubmVyKSwgdGhlbiBzaGFycGVuIGJ5IHJlLXJlbmRlcmluZyB0aGUgY2Fub25pY2FsIGxhcmdlIHRpZXJcbiAqIGluIHBsYWNlLiBXaXRob3V0IGEgc21hbGwgdGllciBpdCdzIHRoZSBvcmlnaW5hbCBzaW5nbGUgcGFzcy4gVGhlIGxhcmdlIHBhc3NcbiAqIHJldHJpZXMgb25jZSBhZnRlciBhIHNob3J0IGRlbGF5IOKAlCB0aGUgcHJldmlldyBlbmRwb2ludCBjYW4gaGl0IGEgdHJhbnNpZW50XG4gKiA1MDMgb3IgYSBsb2NrLWNvbnRlbnRpb24gd2luZG93LCBhbmQgdGhlIHNlY29uZCBhdHRlbXB0IHVzdWFsbHkgbGFuZHMgb25cbiAqIGZyZXNoIHByZS1nZW4tY2FjaGVkIFBOR3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHdvUGFzc1JlbmRlckhvc3Qge1xuICAvKiogTG9hZCArIHBsb3Qgb25lIHBoYXNlICh0aGUgY29tcG9uZW50IG93bnMgZGl2L3NjcmVlbi9wbG90LXR5cGUveiBhbmQgdGhlXG4gICAqICBuZXdlci1jbGljayBmaWxlbmFtZSBndWFyZCkuIGBpblBsYWNlYCB1cGRhdGVzIHRoZSBleGlzdGluZyByZW5kZXIgc28gdGhlXG4gICAqICBjYW52YXMgZG9lc24ndCBibGFuayBkdXJpbmcgdGhlIHNtYWxs4oaSbGFyZ2Ugc3dhcC4gKi9cbiAgcmVuZGVyUGhhc2UoaW5mbzogSUltYWdlSW5mbywgaW5QbGFjZTogYm9vbGVhbik6IFByb21pc2U8dW5rbm93bj47XG4gIC8qKiBUaGUgc21hbGwgdGllciBpcyBvbiBzY3JlZW4g4oCUIGRyb3AgdGhlIGZ1bGwgbG9hZGluZyBvdmVybGF5IHNvIHRoZSB1c2VyXG4gICAqICBzZWVzIHRoZSBibHVycnkgcHJldmlldywgYW5kIHNob3cgdGhlIHNoYXJwZW5pbmcgc3Bpbm5lci4gKi9cbiAgc21hbGxTaG93bigpOiB2b2lkO1xuICAvKiogVGhlIGxhcmdlIHJlbmRlciBzZXR0bGVkIChlaXRoZXIgd2F5KSDigJQgc2hhcnBlbmluZyBzcGlubmVyIG9mZi4gKi9cbiAgc2hhcnBlblNldHRsZWQoKTogdm9pZDtcbiAgLyoqIFJlbmRlcmluZyBmaW5pc2hlZC4gYHZpYVNtYWxsYCA9IHRoZSBvdmVybGF5IHdhcyBhbHJlYWR5IHJlbGVhc2VkIGJ5IHRoZVxuICAgKiAgc21hbGwgdGllciAoc28gb25seSByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgYXBwbHkgdGhlIFJPSSk7IG90aGVyd2lzZVxuICAgKiAgZG8gdGhlIGZ1bGwgZmluYWxpemUgKG92ZXJsYXkgKyBydW5uaW5nICsgUk9JKS4gKi9cbiAgZmluaXNoZWQodmlhU21hbGw6IGJvb2xlYW4sIGxvZ1RhZzogc3RyaW5nKTogdm9pZDtcbiAgLyoqIEJvdGggbGFyZ2UtdGllciBhdHRlbXB0cyBmYWlsZWQ7IHRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGVcbiAgICogIGZhbGxiYWNrLiBTdXJmYWNlIGl0IHRvIHRoZSB1c2VyIGFuZCByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgUk9JLiAqL1xuICBzaGFycGVuRmFpbGVkKGVycjogdW5rbm93bik6IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBSZW5kZXJPcmNoZXN0cmF0b3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGhvc3Q6IFR3b1Bhc3NSZW5kZXJIb3N0LFxuICAgIHByaXZhdGUgcmV0cnlEZWxheU1zID0gMTAwMCxcbiAgKSB7fVxuXG4gIC8qKiBSdW4gdGhlIHJlbmRlcjogc2luZ2xlLXBhc3Mgd2hlbiBgc21hbGxJbmZvYCBpcyBudWxsLCB0d28tcGFzcyBvdGhlcndpc2UuICovXG4gIGFzeW5jIHJlbmRlcihpbmZvOiBJSW1hZ2VJbmZvLCBzbWFsbEluZm86IElJbWFnZUluZm8gfCBudWxsKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFzbWFsbEluZm8pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCBmYWxzZSk7XG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZChmYWxzZSwgJ2ZpbmlzaGVkIHBsb3R0aW5nJyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignUHJldmlldyBmYWlsZWQnLCBlcnIpO1xuICAgICAgICB0aGlzLmhvc3QuZmluaXNoZWQoZmFsc2UsICdwbG90dGluZyBhYm9ydGVkJyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNtYWxsUmVsZWFzZWRPdmVybGF5ID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuaG9zdC5yZW5kZXJQaGFzZShzbWFsbEluZm8sIGZhbHNlKTtcbiAgICAgIHRoaXMuaG9zdC5zbWFsbFNob3duKCk7XG4gICAgICBzbWFsbFJlbGVhc2VkT3ZlcmxheSA9IHRydWU7XG4gICAgICBjb25zb2xlLmxvZygnbXVsdGktdGllcjogc21hbGwgdGllciByZW5kZXJlZCwgc3RhcnRpbmcgbGFyZ2UnKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIFNtYWxsLXRpZXIgcmVuZGVyIGZhaWxlZCAob2xkZXIgYmFja2VuZCB3aXRob3V0IHRpZXIgc3VwcG9ydCwgdHJhbnNpZW50XG4gICAgICAvLyBlcnJvciwg4oCmKS4gQ29udGludWUgd2l0aCBsYXJnZSBvbmx5OyB0aGUgb3ZlcmxheSBzdGF5cyB1cCB1bnRpbCBpdCBsYW5kcy5cbiAgICAgIGNvbnNvbGUud2FybignU21hbGwtdGllciBwcmV2aWV3IGZhaWxlZCwgZmFsbGluZyBiYWNrIHRvIGxhcmdlJywgZXJyKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5yZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvKTtcbiAgICAgIHRoaXMuaG9zdC5zaGFycGVuU2V0dGxlZCgpO1xuICAgICAgaWYgKHNtYWxsUmVsZWFzZWRPdmVybGF5KSB7XG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZCh0cnVlLCAnbXVsdGktdGllcjogbGFyZ2UgdGllciByZW5kZXJlZCwgc2hhcnBlbmluZyBjb21wbGV0ZScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ob3N0LmZpbmlzaGVkKGZhbHNlLCAnZmluaXNoZWQgcGxvdHRpbmcgKGxhcmdlIG9ubHkgYWZ0ZXIgc21hbGwgZmFsbGJhY2spJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmhvc3Quc2hhcnBlblNldHRsZWQoKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgYWZ0ZXIgcmV0cnknLCBlcnIpO1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5GYWlsZWQoZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogT25lIHJldHJ5IGFmdGVyIGEgYnJpZWYgZGVsYXkgYmVmb3JlIGdpdmluZyB1cCBvbiB0aGUgbGFyZ2UgdGllci4gKi9cbiAgcHJpdmF0ZSByZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvOiBJSW1hZ2VJbmZvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgb24gZmlyc3QgdHJ5LCByZXRyeWluZyBpbiAxcycsIGVycik7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy5yZXRyeURlbGF5TXMpKS50aGVuKCgpID0+XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKGV4dHJhY3RlZCB3aXRoIHRoZSBvcmNoZXN0cmF0b3IpOiBjb2FsZXNjZSB0aGVcbiAqIHJhcGlkIGNoYW5nZXMgYSBzbGlkZXIgZHJhZyBmaXJlcyBzbyBhIHNsaWNlIHN3YXAgZG9lc24ndCBydW4gb24gZXZlcnlcbiAqIHBpeGVsOyB0aGUgZmluYWwgdmFsdWUgbGFuZHMgaW1tZWRpYXRlbHkgdmlhIHtAbGluayBjb21taXR9IChvblNsaWRlRW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWNlU2NydWJiZXIge1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwbHk6ICh6OiBudW1iZXIpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSBkZWxheU1zID0gMTIwLFxuICApIHt9XG5cbiAgLyoqIERlYm91bmNlZCBhcHBsaWNhdGlvbiBvZiB6IHdoaWxlIGRyYWdnaW5nLiAqL1xuICBzY3J1Yih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseSh6KTtcbiAgICB9LCB0aGlzLmRlbGF5TXMpO1xuICB9XG5cbiAgLyoqIEFwcGx5IHogaW1tZWRpYXRlbHkgKHNsaWRlIGVuZCAvIGtleWJvYXJkIHN0ZXApLCBkcm9wcGluZyBhbnkgcGVuZGluZyBzY3J1Yi4gKi9cbiAgY29tbWl0KHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5hcHBseSh6KTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgcGVuZGluZyBzY3J1YiB3aXRob3V0IGFwcGx5aW5nICh0ZWFyZG93bikuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLW9yY2hlc3RyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvcmVuZGVyLW9yY2hlc3RyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUF1Q0EsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixZQUNVLElBQXVCLEVBQ3ZCLGVBQWUsSUFBSTtRQURuQixTQUFJLEdBQUosSUFBSSxDQUFtQjtRQUN2QixpQkFBWSxHQUFaLFlBQVksQ0FBTztJQUMxQixDQUFDO0lBRUosZ0ZBQWdGO0lBQ2hGLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBZ0IsRUFBRSxTQUE0QjtRQUN6RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLENBQUM7WUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO2dCQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM5QixDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLG9CQUFvQixHQUFHLEtBQUssQ0FBQztRQUNqQyxJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3ZCLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUM5QixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLDBFQUEwRTtZQUMxRSw0RUFBNEU7WUFDNUUsT0FBTyxDQUFDLElBQUksQ0FBQyxrREFBa0QsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1lBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVELElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDL0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLHdFQUF3RTtnQkFDeEUsbUNBQW1DO2dCQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsd0VBQXdFO0lBQ2hFLG9CQUFvQixDQUFDLElBQWdCO1FBQzNDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3JELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDNUUsT0FBTyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQ3RGLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FDbEMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxhQUFhO0lBR3hCLFlBQ1UsS0FBMEIsRUFDMUIsVUFBVSxHQUFHO1FBRGIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFDMUIsWUFBTyxHQUFQLE9BQU8sQ0FBTTtRQUpmLFVBQUssR0FBeUMsSUFBSSxDQUFDO0lBS3hELENBQUM7SUFFSixpREFBaUQ7SUFDakQsS0FBSyxDQUFDLENBQVM7UUFDYixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQixDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxtRkFBbUY7SUFDbkYsTUFBTSxDQUFDLENBQVM7UUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDZCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCx3REFBd0Q7SUFDeEQsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2YsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcblxuLyoqXG4gKiBUd28tcGFzcyAoc21hbGzihpJsYXJnZSkgcmVuZGVyIHNlcXVlbmNpbmcsIGV4dHJhY3RlZCBmcm9tXG4gKiBWaXN1YWxpemVyQ29tcG9uZW50IChyZWZhY3RvcmluZyBwbGFuLCBTdGVwIDcg4oCUIGEgcHVyZSBtb3ZlIG9mIHRoZVxuICogb3JjaGVzdHJhdGlvbjsgdGhlIGNvbXBvbmVudCBrZWVwcyB0aGUgVUkgZmxhZ3MgYW5kIHN1cHBsaWVzIHRoZW0gdGhyb3VnaFxuICogdGhlIGhvc3QgY2FsbGJhY2tzKS5cbiAqXG4gKiBXaGVuIHRoZSBmaWxlIGhhcyBzbWFsbC10aWVyIFVSTHMgd2UgcmVuZGVyIHRoZSBzbWFsbCB0aWVyIGZpcnN0IGZvciBhIGZhc3RcbiAqIGJsdXJyeSBwcmV2aWV3LCByZWxlYXNlIHRoZSBsb2FkaW5nIG92ZXJsYXkgKGtlZXBpbmcgYSB0cmFuc2x1Y2VudFxuICogXCJzaGFycGVuaW5nXCIgc3Bpbm5lciksIHRoZW4gc2hhcnBlbiBieSByZS1yZW5kZXJpbmcgdGhlIGNhbm9uaWNhbCBsYXJnZSB0aWVyXG4gKiBpbiBwbGFjZS4gV2l0aG91dCBhIHNtYWxsIHRpZXIgaXQncyB0aGUgb3JpZ2luYWwgc2luZ2xlIHBhc3MuIFRoZSBsYXJnZSBwYXNzXG4gKiByZXRyaWVzIG9uY2UgYWZ0ZXIgYSBzaG9ydCBkZWxheSDigJQgdGhlIHByZXZpZXcgZW5kcG9pbnQgY2FuIGhpdCBhIHRyYW5zaWVudFxuICogNTAzIG9yIGEgbG9jay1jb250ZW50aW9uIHdpbmRvdywgYW5kIHRoZSBzZWNvbmQgYXR0ZW1wdCB1c3VhbGx5IGxhbmRzIG9uXG4gKiBmcmVzaCBwcmUtZ2VuLWNhY2hlZCBQTkdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR3b1Bhc3NSZW5kZXJIb3N0IHtcbiAgLyoqIExvYWQgKyBwbG90IG9uZSBwaGFzZSAodGhlIGNvbXBvbmVudCBvd25zIGRpdi9zY3JlZW4vcGxvdC10eXBlL3ogYW5kIHRoZVxuICAgKiAgbmV3ZXItY2xpY2sgZmlsZW5hbWUgZ3VhcmQpLiBgaW5QbGFjZWAgdXBkYXRlcyB0aGUgZXhpc3RpbmcgcmVuZGVyIHNvIHRoZVxuICAgKiAgY2FudmFzIGRvZXNuJ3QgYmxhbmsgZHVyaW5nIHRoZSBzbWFsbOKGkmxhcmdlIHN3YXAuIFJlamVjdHMgd2hlbiB0aGUgcGhhc2VcbiAgICogIGNvdWxkIG5vdCBiZSBkcmF3biAoaW5jbHVkaW5nIGEgYmFja2VuZCdzIGBwbG90KClgIHJlc29sdmluZyBmYWxzZSkuICovXG4gIHJlbmRlclBoYXNlKGluZm86IElJbWFnZUluZm8sIGluUGxhY2U6IGJvb2xlYW4pOiBQcm9taXNlPHVua25vd24+O1xuICAvKiogVGhlIHNtYWxsIHRpZXIgaXMgb24gc2NyZWVuIOKAlCBkcm9wIHRoZSBmdWxsIGxvYWRpbmcgb3ZlcmxheSBzbyB0aGUgdXNlclxuICAgKiAgc2VlcyB0aGUgYmx1cnJ5IHByZXZpZXcsIGFuZCBzaG93IHRoZSBzaGFycGVuaW5nIHNwaW5uZXIuICovXG4gIHNtYWxsU2hvd24oKTogdm9pZDtcbiAgLyoqIFRoZSBsYXJnZSByZW5kZXIgc2V0dGxlZCAoZWl0aGVyIHdheSkg4oCUIHNoYXJwZW5pbmcgc3Bpbm5lciBvZmYuICovXG4gIHNoYXJwZW5TZXR0bGVkKCk6IHZvaWQ7XG4gIC8qKiBSZW5kZXJpbmcgZmluaXNoZWQuIGB2aWFTbWFsbGAgPSB0aGUgb3ZlcmxheSB3YXMgYWxyZWFkeSByZWxlYXNlZCBieSB0aGVcbiAgICogIHNtYWxsIHRpZXIgKHNvIG9ubHkgcmVsZWFzZSB0aGUgcnVubmluZyBndWFyZCArIGFwcGx5IHRoZSBST0kpOyBvdGhlcndpc2VcbiAgICogIGRvIHRoZSBmdWxsIGZpbmFsaXplIChvdmVybGF5ICsgcnVubmluZyArIFJPSSkuICovXG4gIGZpbmlzaGVkKHZpYVNtYWxsOiBib29sZWFuKTogdm9pZDtcbiAgLyoqIEJvdGggbGFyZ2UtdGllciBhdHRlbXB0cyBmYWlsZWQ7IHRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGVcbiAgICogIGZhbGxiYWNrLiBTdXJmYWNlIGl0IHRvIHRoZSB1c2VyIGFuZCByZWxlYXNlIHRoZSBydW5uaW5nIGd1YXJkICsgUk9JLiAqL1xuICBzaGFycGVuRmFpbGVkKGVycjogdW5rbm93bik6IHZvaWQ7XG4gIC8qKiBOb3RoaW5nIGNvdWxkIGJlIGRyYXduOiB0aGUgc2luZ2xlIHBhc3MgZmFpbGVkLCBvciBib3RoIHRpZXJzIGRpZC4gQ2FsbGVkXG4gICAqICBhZnRlciB7QGxpbmsgZmluaXNoZWR9ICh3aGljaCByZWxlYXNlcyB0aGUgb3ZlcmxheSksIHRvIHRlbGwgdGhlIHVzZXIuICovXG4gIHJlbmRlckZhaWxlZChlcnI6IHVua25vd24pOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUmVuZGVyT3JjaGVzdHJhdG9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBob3N0OiBUd29QYXNzUmVuZGVySG9zdCxcbiAgICBwcml2YXRlIHJldHJ5RGVsYXlNcyA9IDEwMDAsXG4gICkge31cblxuICAvKiogUnVuIHRoZSByZW5kZXI6IHNpbmdsZS1wYXNzIHdoZW4gYHNtYWxsSW5mb2AgaXMgbnVsbCwgdHdvLXBhc3Mgb3RoZXJ3aXNlLiAqL1xuICBhc3luYyByZW5kZXIoaW5mbzogSUltYWdlSW5mbywgc21hbGxJbmZvOiBJSW1hZ2VJbmZvIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghc21hbGxJbmZvKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmhvc3QucmVuZGVyUGhhc2UoaW5mbywgZmFsc2UpO1xuICAgICAgICB0aGlzLmhvc3QuZmluaXNoZWQoZmFsc2UpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1ByZXZpZXcgZmFpbGVkJywgZXJyKTtcbiAgICAgICAgdGhpcy5ob3N0LmZpbmlzaGVkKGZhbHNlKTtcbiAgICAgICAgdGhpcy5ob3N0LnJlbmRlckZhaWxlZChlcnIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBzbWFsbFJlbGVhc2VkT3ZlcmxheSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmhvc3QucmVuZGVyUGhhc2Uoc21hbGxJbmZvLCBmYWxzZSk7XG4gICAgICB0aGlzLmhvc3Quc21hbGxTaG93bigpO1xuICAgICAgc21hbGxSZWxlYXNlZE92ZXJsYXkgPSB0cnVlO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gU21hbGwtdGllciByZW5kZXIgZmFpbGVkIChvbGRlciBiYWNrZW5kIHdpdGhvdXQgdGllciBzdXBwb3J0LCB0cmFuc2llbnRcbiAgICAgIC8vIGVycm9yLCDigKYpLiBDb250aW51ZSB3aXRoIGxhcmdlIG9ubHk7IHRoZSBvdmVybGF5IHN0YXlzIHVwIHVudGlsIGl0IGxhbmRzLlxuICAgICAgY29uc29sZS53YXJuKCdTbWFsbC10aWVyIHByZXZpZXcgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gbGFyZ2UnLCBlcnIpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnJlbmRlckxhcmdlV2l0aFJldHJ5KGluZm8pO1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5TZXR0bGVkKCk7XG4gICAgICB0aGlzLmhvc3QuZmluaXNoZWQoc21hbGxSZWxlYXNlZE92ZXJsYXkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5ob3N0LnNoYXJwZW5TZXR0bGVkKCk7XG4gICAgICBjb25zb2xlLmVycm9yKCdMYXJnZS10aWVyIHByZXZpZXcgZmFpbGVkIGFmdGVyIHJldHJ5JywgZXJyKTtcbiAgICAgIGlmIChzbWFsbFJlbGVhc2VkT3ZlcmxheSkge1xuICAgICAgICB0aGlzLmhvc3Quc2hhcnBlbkZhaWxlZChlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhlIHNtYWxsIHRpZXIgbmV2ZXIgbWFkZSBpdCBlaXRoZXI6IHRoZXJlIGlzIG5vIHByZXZpZXcgdG8gZmFsbCBiYWNrXG4gICAgICAgIC8vIG9uLCBhbmQgdGhlIG92ZXJsYXkgaXMgc3RpbGwgdXAuXG4gICAgICAgIHRoaXMuaG9zdC5maW5pc2hlZChmYWxzZSk7XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJGYWlsZWQoZXJyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogT25lIHJldHJ5IGFmdGVyIGEgYnJpZWYgZGVsYXkgYmVmb3JlIGdpdmluZyB1cCBvbiB0aGUgbGFyZ2UgdGllci4gKi9cbiAgcHJpdmF0ZSByZW5kZXJMYXJnZVdpdGhSZXRyeShpbmZvOiBJSW1hZ2VJbmZvKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oJ0xhcmdlLXRpZXIgcHJldmlldyBmYWlsZWQgb24gZmlyc3QgdHJ5LCByZXRyeWluZyBpbiAxcycsIGVycik7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgdGhpcy5yZXRyeURlbGF5TXMpKS50aGVuKCgpID0+XG4gICAgICAgIHRoaXMuaG9zdC5yZW5kZXJQaGFzZShpbmZvLCB0cnVlKSxcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWJvdW5jZWQgei1zbGljZSBzY3J1YmJpbmcgKGV4dHJhY3RlZCB3aXRoIHRoZSBvcmNoZXN0cmF0b3IpOiBjb2FsZXNjZSB0aGVcbiAqIHJhcGlkIGNoYW5nZXMgYSBzbGlkZXIgZHJhZyBmaXJlcyBzbyBhIHNsaWNlIHN3YXAgZG9lc24ndCBydW4gb24gZXZlcnlcbiAqIHBpeGVsOyB0aGUgZmluYWwgdmFsdWUgbGFuZHMgaW1tZWRpYXRlbHkgdmlhIHtAbGluayBjb21taXR9IChvblNsaWRlRW5kKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNsaWNlU2NydWJiZXIge1xuICBwcml2YXRlIHRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYXBwbHk6ICh6OiBudW1iZXIpID0+IHZvaWQsXG4gICAgcHJpdmF0ZSBkZWxheU1zID0gMTIwLFxuICApIHt9XG5cbiAgLyoqIERlYm91bmNlZCBhcHBsaWNhdGlvbiBvZiB6IHdoaWxlIGRyYWdnaW5nLiAqL1xuICBzY3J1Yih6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMudGltZXIgPSBudWxsO1xuICAgICAgdGhpcy5hcHBseSh6KTtcbiAgICB9LCB0aGlzLmRlbGF5TXMpO1xuICB9XG5cbiAgLyoqIEFwcGx5IHogaW1tZWRpYXRlbHkgKHNsaWRlIGVuZCAvIGtleWJvYXJkIHN0ZXApLCBkcm9wcGluZyBhbnkgcGVuZGluZyBzY3J1Yi4gKi9cbiAgY29tbWl0KHo6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsKCk7XG4gICAgdGhpcy5hcHBseSh6KTtcbiAgfVxuXG4gIC8qKiBEcm9wIGEgcGVuZGluZyBzY3J1YiB3aXRob3V0IGFwcGx5aW5nICh0ZWFyZG93bikuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IG51bGw7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { RenderOrchestrator } from './render-orchestrator';
|
|
2
|
+
import { Supersede } from './util/supersede';
|
|
3
|
+
/** A user-facing message for a failure: an HttpErrorResponse's server message, an
|
|
4
|
+
* Error's message, or the status text, else the value itself. */
|
|
5
|
+
export function errorMessage(err) {
|
|
6
|
+
const e = err;
|
|
7
|
+
return e?.error?.message || e?.message || e?.statusText || String(err);
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* The viewer's render pipeline: one image (or image-less dataset) at a time, the newest
|
|
11
|
+
* always winning.
|
|
12
|
+
*
|
|
13
|
+
* Every render takes a task from a {@link Supersede}: a newer render, a Cancel or
|
|
14
|
+
* teardown makes the older one stale — its callbacks return early instead of painting,
|
|
15
|
+
* releasing the newer render's overlay or applying its ROIs — and aborts the signal its
|
|
16
|
+
* loads were given, so superseded network work stops at the source. Sequencing of the
|
|
17
|
+
* small→large tiers lives in {@link RenderOrchestrator}; this owns the UI flags it
|
|
18
|
+
* drives ({@link running}, {@link sharpening}).
|
|
19
|
+
*/
|
|
20
|
+
export class ImageRenderSession {
|
|
21
|
+
constructor(host) {
|
|
22
|
+
this.host = host;
|
|
23
|
+
/** A render is in flight. */
|
|
24
|
+
this.running = false;
|
|
25
|
+
/** The small tier is on screen and the large one is still loading. */
|
|
26
|
+
this.sharpening = false;
|
|
27
|
+
/** Set once the plot div exists; an image-less draw before then waits for it. */
|
|
28
|
+
this.viewReady = false;
|
|
29
|
+
this.pendingDraw = null;
|
|
30
|
+
this.supersede = new Supersede();
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Render `info` (which has urls), preempting whatever is in flight. A newer image
|
|
34
|
+
* ALWAYS preempts: dropping it while the old one finished reported image B as loaded
|
|
35
|
+
* while image A stayed on screen, and a cold image held the slot for its whole
|
|
36
|
+
* server-side cache fill.
|
|
37
|
+
*/
|
|
38
|
+
render(info) {
|
|
39
|
+
const host = this.host;
|
|
40
|
+
const viz = host.visualizer;
|
|
41
|
+
const urls = info.urls;
|
|
42
|
+
const task = this.supersede.next();
|
|
43
|
+
if (this.running) {
|
|
44
|
+
// Stop the previous render's frame streaming (napari volume/surface preload keeps
|
|
45
|
+
// fetching otherwise) and clear its sharpen flag. Its callbacks are already inert.
|
|
46
|
+
viz.cancelLoading?.();
|
|
47
|
+
this.sharpening = false;
|
|
48
|
+
}
|
|
49
|
+
// Measure the plot div directly so the toolbar height is excluded.
|
|
50
|
+
const screenHeight = document.getElementById(host.plotDivName)?.offsetHeight || 500;
|
|
51
|
+
host.beforeReset();
|
|
52
|
+
viz.reset();
|
|
53
|
+
host.prepare(info);
|
|
54
|
+
this.running = true;
|
|
55
|
+
const smallCount = info.smallUrls?.length ?? 0;
|
|
56
|
+
const small = host.isHeatmap() && smallCount > 0 && smallCount === urls.length
|
|
57
|
+
? { ...info, urls: info.smallUrls }
|
|
58
|
+
: null;
|
|
59
|
+
let overlayReleased = false;
|
|
60
|
+
const releaseOverlay = () => {
|
|
61
|
+
if (overlayReleased)
|
|
62
|
+
return;
|
|
63
|
+
overlayReleased = true;
|
|
64
|
+
host.releaseOverlay(info);
|
|
65
|
+
};
|
|
66
|
+
const settle = () => {
|
|
67
|
+
this.running = false;
|
|
68
|
+
host.landed(info);
|
|
69
|
+
};
|
|
70
|
+
new RenderOrchestrator({
|
|
71
|
+
// inPlace=true updates the existing render instead of rebuilding it, so the
|
|
72
|
+
// canvas doesn't blank during the small→large swap.
|
|
73
|
+
renderPhase: (phaseInfo, inPlace) => {
|
|
74
|
+
const phase = (rebuild) => {
|
|
75
|
+
// Superseded BEFORE this phase started — don't even issue the load (the
|
|
76
|
+
// orchestrator calls this per tier and retries the sharpen pass).
|
|
77
|
+
if (!task.isCurrent())
|
|
78
|
+
return Promise.resolve(null);
|
|
79
|
+
// The backend that loads is the one for the type selected NOW (see RoutingVisualizerService).
|
|
80
|
+
const plotType = host.plotType();
|
|
81
|
+
return viz.load(phaseInfo, host.zIndex(), task.signal).then((loaded) => {
|
|
82
|
+
if (!task.isCurrent())
|
|
83
|
+
return null;
|
|
84
|
+
// Guard against a newer click reaching us mid-render.
|
|
85
|
+
if (phaseInfo.fileName !== loaded.filename)
|
|
86
|
+
return null;
|
|
87
|
+
// The type changed while this loaded (a spatial dataset cleared mid-switch falls
|
|
88
|
+
// back to Image): the loaded image is the old backend's, so load for the new one.
|
|
89
|
+
if (host.plotType() !== plotType)
|
|
90
|
+
return phase(true);
|
|
91
|
+
return viz
|
|
92
|
+
.plot(host.plotDivName, loaded, phaseInfo, screenHeight, plotType, inPlace && !rebuild)
|
|
93
|
+
.then((drawn) => {
|
|
94
|
+
// A backend that cannot draw (no plot target, no WebGPU, no tile descriptor)
|
|
95
|
+
// resolves false: a failed phase, so the retry/failure paths run.
|
|
96
|
+
if (drawn === false && task.isCurrent())
|
|
97
|
+
throw new Error('the renderer could not draw the image');
|
|
98
|
+
return drawn;
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
return phase(false);
|
|
103
|
+
},
|
|
104
|
+
smallShown: () => {
|
|
105
|
+
if (!task.isCurrent())
|
|
106
|
+
return;
|
|
107
|
+
// Still caching server-side: keep the full cache-progress overlay up rather than
|
|
108
|
+
// a translucent spinner over a blank canvas; finished() releases it.
|
|
109
|
+
if (host.isCaching())
|
|
110
|
+
return;
|
|
111
|
+
// Small tier on screen: drop the full overlay, keep a translucent spinner so the
|
|
112
|
+
// blurry render isn't mistaken for the final image.
|
|
113
|
+
releaseOverlay();
|
|
114
|
+
this.sharpening = true;
|
|
115
|
+
},
|
|
116
|
+
sharpenSettled: () => {
|
|
117
|
+
if (task.isCurrent())
|
|
118
|
+
this.sharpening = false;
|
|
119
|
+
},
|
|
120
|
+
finished: () => {
|
|
121
|
+
if (!task.isCurrent())
|
|
122
|
+
return;
|
|
123
|
+
releaseOverlay(); // idempotent: now if smallShown deferred it or was skipped
|
|
124
|
+
settle();
|
|
125
|
+
},
|
|
126
|
+
sharpenFailed: (err) => {
|
|
127
|
+
if (!task.isCurrent())
|
|
128
|
+
return;
|
|
129
|
+
// The small tier stays on screen as the fallback.
|
|
130
|
+
host.alert('warn', 'Preview not sharpened', `The full-resolution preview did not load (${errorMessage(err)}). ` +
|
|
131
|
+
'The low-resolution preview is still shown. Try clicking the image again.');
|
|
132
|
+
settle();
|
|
133
|
+
},
|
|
134
|
+
renderFailed: (err) => {
|
|
135
|
+
if (!task.isCurrent())
|
|
136
|
+
return;
|
|
137
|
+
host.alert('error', 'Could not draw the image', `${info.fileName ?? 'The image'}: ${errorMessage(err)}. Try opening it again.`);
|
|
138
|
+
},
|
|
139
|
+
}).render(info, small);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Draw a spatial mode with no image behind it: the observations alone, framed on their
|
|
143
|
+
* own extent. The image info is a placeholder naming the dataset, so regions drawn here
|
|
144
|
+
* are kept per dataset like any image's. Supersedes (and is superseded by) image renders.
|
|
145
|
+
*/
|
|
146
|
+
async plotWithoutImage(dataset) {
|
|
147
|
+
if (!this.viewReady) {
|
|
148
|
+
// A host that creates the viewer AFTER publishing the dataset has it replayed before
|
|
149
|
+
// the plot div exists; drawing now finds no target. Draw once the view is ready.
|
|
150
|
+
this.pendingDraw = dataset;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const host = this.host;
|
|
154
|
+
const task = this.supersede.next();
|
|
155
|
+
const info = {
|
|
156
|
+
isGrayscale: false,
|
|
157
|
+
trueImageSize: [0, 0],
|
|
158
|
+
urls: [],
|
|
159
|
+
isStack: false,
|
|
160
|
+
showStack: false,
|
|
161
|
+
scaleRatio: true,
|
|
162
|
+
fileName: `spatial:${dataset.id}`,
|
|
163
|
+
imageMeta: [],
|
|
164
|
+
};
|
|
165
|
+
const height = document.getElementById(host.plotDivName)?.offsetHeight || 500;
|
|
166
|
+
let failure = null;
|
|
167
|
+
try {
|
|
168
|
+
// A backend that cannot draw (no WebGPU, no plot target) resolves false rather than throwing.
|
|
169
|
+
if (!(await host.visualizer.plot(host.plotDivName, null, info, height, host.plotType()))) {
|
|
170
|
+
failure = 'the renderer could not start';
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
catch (err) {
|
|
174
|
+
failure = err;
|
|
175
|
+
}
|
|
176
|
+
// Superseded: a newer render owns the loading state now.
|
|
177
|
+
if (!task.isCurrent())
|
|
178
|
+
return;
|
|
179
|
+
if (failure) {
|
|
180
|
+
console.warn('[visualizer] could not draw the spatial dataset', failure);
|
|
181
|
+
const e = failure;
|
|
182
|
+
// An image-less dataset has no tissue image to fall back on, so say so rather than
|
|
183
|
+
// leave an empty canvas that looks finished.
|
|
184
|
+
host.alert('error', 'Could not draw the dataset', `${dataset.name ?? dataset.id}: ${e?.message ?? String(failure)}.`);
|
|
185
|
+
}
|
|
186
|
+
host.setImageLoading(false);
|
|
187
|
+
host.detectChanges();
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The plot div exists now: run an image-less draw that arrived before it did — only if
|
|
191
|
+
* its dataset is still the one on offer (by id: the port may re-emit the same dataset
|
|
192
|
+
* as a new object, and the current object is the one to draw) and no image has arrived.
|
|
193
|
+
*/
|
|
194
|
+
viewIsReady(current, hasImage) {
|
|
195
|
+
this.viewReady = true;
|
|
196
|
+
const pending = this.pendingDraw;
|
|
197
|
+
this.pendingDraw = null;
|
|
198
|
+
if (pending && current && current.id === pending.id && !hasImage)
|
|
199
|
+
void this.plotWithoutImage(current);
|
|
200
|
+
}
|
|
201
|
+
/** Cancel the render in flight: abort its loads and make its callbacks inert. */
|
|
202
|
+
cancel() {
|
|
203
|
+
this.supersede.cancel();
|
|
204
|
+
this.running = false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVuZGVyLXNlc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JlbmRlci1zZXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzNELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUU3QztrRUFDa0U7QUFDbEUsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFZO0lBQ3ZDLE1BQU0sQ0FBQyxHQUFHLEdBQXFGLENBQUM7SUFDaEcsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxDQUFDLEVBQUUsT0FBTyxJQUFJLENBQUMsRUFBRSxVQUFVLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUEyQkQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFVN0IsWUFBNkIsSUFBdUI7UUFBdkIsU0FBSSxHQUFKLElBQUksQ0FBbUI7UUFUcEQsNkJBQTZCO1FBQzdCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFDaEIsc0VBQXNFO1FBQ3RFLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsaUZBQWlGO1FBQ3pFLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsZ0JBQVcsR0FBMEIsSUFBSSxDQUFDO1FBQ2pDLGNBQVMsR0FBRyxJQUFJLFNBQVMsRUFBRSxDQUFDO0lBRVUsQ0FBQztJQUV4RDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxJQUFnQjtRQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDNUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN2QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFD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QixJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksT0FBTyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUFFLEtBQUssSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hHLENBQUM7SUFFRCxpRkFBaUY7SUFDakYsTUFBTTtRQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBsb3RUeXBlIH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7IFNwYXRpYWxEYXRhc2V0IH0gZnJvbSAnLi9jb250cmFjdHMvc3BhdGlhbC1kYXRhc2V0LmNvbnRyYWN0JztcbmltcG9ydCB7IElWaXN1YWxpemVyIH0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBSZW5kZXJPcmNoZXN0cmF0b3IgfSBmcm9tICcuL3JlbmRlci1vcmNoZXN0cmF0b3InO1xuaW1wb3J0IHsgU3VwZXJzZWRlIH0gZnJvbSAnLi91dGlsL3N1cGVyc2VkZSc7XG5cbi8qKiBBIHVzZXItZmFjaW5nIG1lc3NhZ2UgZm9yIGEgZmFpbHVyZTogYW4gSHR0cEVycm9yUmVzcG9uc2UncyBzZXJ2ZXIgbWVzc2FnZSwgYW5cbiAqICBFcnJvcidzIG1lc3NhZ2UsIG9yIHRoZSBzdGF0dXMgdGV4dCwgZWxzZSB0aGUgdmFsdWUgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVycm9yTWVzc2FnZShlcnI6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBlID0gZXJyIGFzIHsgZXJyb3I/OiB7IG1lc3NhZ2U/OiBzdHJpbmcgfTsgbWVzc2FnZT86IHN0cmluZzsgc3RhdHVzVGV4dD86IHN0cmluZyB9IHwgbnVsbDtcbiAgcmV0dXJuIGU/LmVycm9yPy5tZXNzYWdlIHx8IGU/Lm1lc3NhZ2UgfHwgZT8uc3RhdHVzVGV4dCB8fCBTdHJpbmcoZXJyKTtcbn1cblxuLyoqIFRoZSB2aWV3ZXIgYSByZW5kZXIgc2Vzc2lvbiBkcmF3cyBpbnRvLCBhbmQgd2hhdCBpdCB0ZWxscyB0aGUgdmlld2VyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJTZXNzaW9uSG9zdCB7XG4gIHJlYWRvbmx5IHBsb3REaXZOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZpc3VhbGl6ZXI6IElWaXN1YWxpemVyO1xuICAvKiogVGhlIHNsaWNlIHRvIGxvYWQsIHJlYWQgd2hlbiBlYWNoIHBoYXNlIHN0YXJ0cy4gKi9cbiAgekluZGV4KCk6IG51bWJlcjtcbiAgcGxvdFR5cGUoKTogUGxvdFR5cGU7XG4gIC8qKiBBIDJEIHZpZXc6IG9ubHkgaXQgcmVuZGVycyB0aGUgc21hbGwgdGllciBmaXJzdCAodGhlIGluLXBsYWNlIHNoYXJwZW4gcGFzcyBkb2VzXG4gICAqICBub3QgcmVidWlsZCBhIDNEIHNjZW5lLCBzbyBpdCBibGFua2VkIG9uZSkuICovXG4gIGlzSGVhdG1hcCgpOiBib29sZWFuO1xuICAvKiogQSBzZXJ2ZXItc2lkZSBjYWNoZSBmaWxsIGlzIGluIHByb2dyZXNzIChrZWVwcyB0aGUgZnVsbCBvdmVybGF5IHVwKS4gKi9cbiAgaXNDYWNoaW5nKCk6IGJvb2xlYW47XG4gIC8qKiBUaGUgdmlldyBpcyBhYm91dCB0byBiZSB0b3JuIGRvd246IGVuZCB3aGF0IHdhcyBib3VuZCB0byBpdCAoY29udHJpYnV0ZWQgc2Vzc2lvbnMpLiAqL1xuICBiZWZvcmVSZXNldCgpOiB2b2lkO1xuICAvKiogTGF5IHRoZSBuZXcgaW1hZ2Ugb3V0IChzdGFjayBmbGFnLCBzbGljZSBib3VuZHMsIGluaXRpYWwgc2xpY2UpIG9uY2UgdGhlIG9sZCB2aWV3IGlzIGdvbmUuICovXG4gIHByZXBhcmUoaW5mbzogSUltYWdlSW5mbyk6IHZvaWQ7XG4gIC8qKiBEcm9wIHRoZSBsb2FkaW5nIG92ZXJsYXkgdGhlIHJlbmRlciBvd25zIChvbmNlIHBlciByZW5kZXIpLiAqL1xuICByZWxlYXNlT3ZlcmxheShpbmZvOiBJSW1hZ2VJbmZvKTogdm9pZDtcbiAgLyoqIFRoZSByZW5kZXIgbGFuZGVkLCBzaGFycCBvciBhcyBhIGZhbGxiYWNrOiBhcHBseSBST0lzLCBzdGFydCBzZXNzaW9ucy4gKi9cbiAgbGFuZGVkKGluZm86IElJbWFnZUluZm8pOiB2b2lkO1xuICBzZXRJbWFnZUxvYWRpbmcobG9hZGluZzogYm9vbGVhbik6IHZvaWQ7XG4gIGFsZXJ0KHNldmVyaXR5OiAnd2FybicgfCAnZXJyb3InLCBzdW1tYXJ5OiBzdHJpbmcsIGRldGFpbDogc3RyaW5nKTogdm9pZDtcbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSB2aWV3ZXIncyByZW5kZXIgcGlwZWxpbmU6IG9uZSBpbWFnZSAob3IgaW1hZ2UtbGVzcyBkYXRhc2V0KSBhdCBhIHRpbWUsIHRoZSBuZXdlc3RcbiAqIGFsd2F5cyB3aW5uaW5nLlxuICpcbiAqIEV2ZXJ5IHJlbmRlciB0YWtlcyBhIHRhc2sgZnJvbSBhIHtAbGluayBTdXBlcnNlZGV9OiBhIG5ld2VyIHJlbmRlciwgYSBDYW5jZWwgb3JcbiAqIHRlYXJkb3duIG1ha2VzIHRoZSBvbGRlciBvbmUgc3RhbGUg4oCUIGl0cyBjYWxsYmFja3MgcmV0dXJuIGVhcmx5IGluc3RlYWQgb2YgcGFpbnRpbmcsXG4gKiByZWxlYXNpbmcgdGhlIG5ld2VyIHJlbmRlcidzIG92ZXJsYXkgb3IgYXBwbHlpbmcgaXRzIFJPSXMg4oCUIGFuZCBhYm9ydHMgdGhlIHNpZ25hbCBpdHNcbiAqIGxvYWRzIHdlcmUgZ2l2ZW4sIHNvIHN1cGVyc2VkZWQgbmV0d29yayB3b3JrIHN0b3BzIGF0IHRoZSBzb3VyY2UuIFNlcXVlbmNpbmcgb2YgdGhlXG4gKiBzbWFsbOKGkmxhcmdlIHRpZXJzIGxpdmVzIGluIHtAbGluayBSZW5kZXJPcmNoZXN0cmF0b3J9OyB0aGlzIG93bnMgdGhlIFVJIGZsYWdzIGl0XG4gKiBkcml2ZXMgKHtAbGluayBydW5uaW5nfSwge0BsaW5rIHNoYXJwZW5pbmd9KS5cbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlUmVuZGVyU2Vzc2lvbiB7XG4gIC8qKiBBIHJlbmRlciBpcyBpbiBmbGlnaHQuICovXG4gIHJ1bm5pbmcgPSBmYWxzZTtcbiAgLyoqIFRoZSBzbWFsbCB0aWVyIGlzIG9uIHNjcmVlbiBhbmQgdGhlIGxhcmdlIG9uZSBpcyBzdGlsbCBsb2FkaW5nLiAqL1xuICBzaGFycGVuaW5nID0gZmFsc2U7XG4gIC8qKiBTZXQgb25jZSB0aGUgcGxvdCBkaXYgZXhpc3RzOyBhbiBpbWFnZS1sZXNzIGRyYXcgYmVmb3JlIHRoZW4gd2FpdHMgZm9yIGl0LiAqL1xuICBwcml2YXRlIHZpZXdSZWFkeSA9IGZhbHNlO1xuICBwcml2YXRlIHBlbmRpbmdEcmF3OiBTcGF0aWFsRGF0YXNldCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHN1cGVyc2VkZSA9IG5ldyBTdXBlcnNlZGUoKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IFJlbmRlclNlc3Npb25Ib3N0KSB7fVxuXG4gIC8qKlxuICAgKiBSZW5kZXIgYGluZm9gICh3aGljaCBoYXMgdXJscyksIHByZWVtcHRpbmcgd2hhdGV2ZXIgaXMgaW4gZmxpZ2h0LiBBIG5ld2VyIGltYWdlXG4gICAqIEFMV0FZUyBwcmVlbXB0czogZHJvcHBpbmcgaXQgd2hpbGUgdGhlIG9sZCBvbmUgZmluaXNoZWQgcmVwb3J0ZWQgaW1hZ2UgQiBhcyBsb2FkZWRcbiAgICogd2hpbGUgaW1hZ2UgQSBzdGF5ZWQgb24gc2NyZWVuLCBhbmQgYSBjb2xkIGltYWdlIGhlbGQgdGhlIHNsb3QgZm9yIGl0cyB3aG9sZVxuICAgKiBzZXJ2ZXItc2lkZSBjYWNoZSBmaWxsLlxuICAgKi9cbiAgcmVuZGVyKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0O1xuICAgIGNvbnN0IHZpeiA9IGhvc3QudmlzdWFsaXplcjtcbiAgICBjb25zdCB1cmxzID0gaW5mby51cmxzO1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnN1cGVyc2VkZS5uZXh0KCk7XG4gICAgaWYgKHRoaXMucnVubmluZykge1xuICAgICAgLy8gU3RvcCB0aGUgcHJldmlvdXMgcmVuZGVyJ3MgZnJhbWUgc3RyZWFtaW5nIChuYXBhcmkgdm9sdW1lL3N1cmZhY2UgcHJlbG9hZCBrZWVwc1xuICAgICAgLy8gZmV0Y2hpbmcgb3RoZXJ3aXNlKSBhbmQgY2xlYXIgaXRzIHNoYXJwZW4gZmxhZy4gSXRzIGNhbGxiYWNrcyBhcmUgYWxyZWFkeSBpbmVydC5cbiAgICAgIHZpei5jYW5jZWxMb2FkaW5nPy4oKTtcbiAgICAgIHRoaXMuc2hhcnBlbmluZyA9IGZhbHNlO1xuICAgIH1cbiAgICAvLyBNZWFzdXJlIHRoZSBwbG90IGRpdiBkaXJlY3RseSBzbyB0aGUgdG9vbGJhciBoZWlnaHQgaXMgZXhjbHVkZWQuXG4gICAgY29uc3Qgc2NyZWVuSGVpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaG9zdC5wbG90RGl2TmFtZSk/Lm9mZnNldEhlaWdodCB8fCA1MDA7XG4gICAgaG9zdC5iZWZvcmVSZXNldCgpO1xuICAgIHZpei5yZXNldCgpO1xuICAgIGhvc3QucHJlcGFyZShpbmZvKTtcbiAgICB0aGlzLnJ1bm5pbmcgPSB0cnVlO1xuICAgIGNvbnN0IHNtYWxsQ291bnQgPSBpbmZvLnNtYWxsVXJscz8ubGVuZ3RoID8/IDA7XG4gICAgY29uc3Qgc21hbGwgPVxuICAgICAgaG9zdC5pc0hlYXRtYXAoKSAmJiBzbWFsbENvdW50ID4gMCAmJiBzbWFsbENvdW50ID09PSB1cmxzLmxlbmd0aFxuICAgICAgICA/IHsgLi4uaW5mbywgdXJsczogaW5mby5zbWFsbFVybHMgYXMgc3RyaW5nW10gfVxuICAgICAgICA6IG51bGw7XG4gICAgbGV0IG92ZXJsYXlSZWxlYXNlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHJlbGVhc2VPdmVybGF5ID0gKCkgPT4ge1xuICAgICAgaWYgKG92ZXJsYXlSZWxlYXNlZCkgcmV0dXJuO1xuICAgICAgb3ZlcmxheVJlbGVhc2VkID0gdHJ1ZTtcbiAgICAgIGhvc3QucmVsZWFzZU92ZXJsYXkoaW5mbyk7XG4gICAgfTtcbiAgICBjb25zdCBzZXR0bGUgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgICAgIGhvc3QubGFuZGVkKGluZm8pO1xuICAgIH07XG5cbiAgICBuZXcgUmVuZGVyT3JjaGVzdHJhdG9yKHtcbiAgICAgIC8vIGluUGxhY2U9dHJ1ZSB1cGRhdGVzIHRoZSBleGlzdGluZyByZW5kZXIgaW5zdGVhZCBvZiByZWJ1aWxkaW5nIGl0LCBzbyB0aGVcbiAgICAgIC8vIGNhbnZhcyBkb2Vzbid0IGJsYW5rIGR1cmluZyB0aGUgc21hbGzihpJsYXJnZSBzd2FwLlxuICAgICAgcmVuZGVyUGhhc2U6IChwaGFzZUluZm8sIGluUGxhY2UpID0+IHtcbiAgICAgICAgY29uc3QgcGhhc2UgPSAocmVidWlsZDogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbiB8IG51bGw+ID0+IHtcbiAgICAgICAgICAvLyBTdXBlcnNlZGVkIEJFRk9SRSB0aGlzIHBoYXNlIHN0YXJ0ZWQg4oCUIGRvbid0IGV2ZW4gaXNzdWUgdGhlIGxvYWQgKHRoZVxuICAgICAgICAgIC8vIG9yY2hlc3RyYXRvciBjYWxscyB0aGlzIHBlciB0aWVyIGFuZCByZXRyaWVzIHRoZSBzaGFycGVuIHBhc3MpLlxuICAgICAgICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAvLyBUaGUgYmFja2VuZCB0aGF0IGxvYWRzIGlzIHRoZSBvbmUgZm9yIHRoZSB0eXBlIHNlbGVjdGVkIE5PVyAoc2VlIFJvdXRpbmdWaXN1YWxpemVyU2VydmljZSkuXG4gICAgICAgICAgY29uc3QgcGxvdFR5cGUgPSBob3N0LnBsb3RUeXBlKCk7XG4gICAgICAgICAgcmV0dXJuIHZpei5sb2FkKHBoYXNlSW5mbywgaG9zdC56SW5kZXgoKSwgdGFzay5zaWduYWwpLnRoZW4oKGxvYWRlZCkgPT4ge1xuICAgICAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgYSBuZXdlciBjbGljayByZWFjaGluZyB1cyBtaWQtcmVuZGVyLlxuICAgICAgICAgICAgaWYgKHBoYXNlSW5mby5maWxlTmFtZSAhPT0gbG9hZGVkLmZpbGVuYW1lKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIC8vIFRoZSB0eXBlIGNoYW5nZWQgd2hpbGUgdGhpcyBsb2FkZWQgKGEgc3BhdGlhbCBkYXRhc2V0IGNsZWFyZWQgbWlkLXN3aXRjaCBmYWxsc1xuICAgICAgICAgICAgLy8gYmFjayB0byBJbWFnZSk6IHRoZSBsb2FkZWQgaW1hZ2UgaXMgdGhlIG9sZCBiYWNrZW5kJ3MsIHNvIGxvYWQgZm9yIHRoZSBuZXcgb25lLlxuICAgICAgICAgICAgaWYgKGhvc3QucGxvdFR5cGUoKSAhPT0gcGxvdFR5cGUpIHJldHVybiBwaGFzZSh0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB2aXpcbiAgICAgICAgICAgICAgLnBsb3QoaG9zdC5wbG90RGl2TmFtZSwgbG9hZGVkLCBwaGFzZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UgJiYgIXJlYnVpbGQpXG4gICAgICAgICAgICAgIC50aGVuKChkcmF3bikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEEgYmFja2VuZCB0aGF0IGNhbm5vdCBkcmF3IChubyBwbG90IHRhcmdldCwgbm8gV2ViR1BVLCBubyB0aWxlIGRlc2NyaXB0b3IpXG4gICAgICAgICAgICAgICAgLy8gcmVzb2x2ZXMgZmFsc2U6IGEgZmFpbGVkIHBoYXNlLCBzbyB0aGUgcmV0cnkvZmFpbHVyZSBwYXRocyBydW4uXG4gICAgICAgICAgICAgICAgaWYgKGRyYXduID09PSBmYWxzZSAmJiB0YXNrLmlzQ3VycmVudCgpKSB0aHJvdyBuZXcgRXJyb3IoJ3RoZSByZW5kZXJlciBjb3VsZCBub3QgZHJhdyB0aGUgaW1hZ2UnKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHJhd247XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gcGhhc2UoZmFsc2UpO1xuICAgICAgfSxcbiAgICAgIHNtYWxsU2hvd246ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIC8vIFN0aWxsIGNhY2hpbmcgc2VydmVyLXNpZGU6IGtlZXAgdGhlIGZ1bGwgY2FjaGUtcHJvZ3Jlc3Mgb3ZlcmxheSB1cCByYXRoZXIgdGhhblxuICAgICAgICAvLyBhIHRyYW5zbHVjZW50IHNwaW5uZXIgb3ZlciBhIGJsYW5rIGNhbnZhczsgZmluaXNoZWQoKSByZWxlYXNlcyBpdC5cbiAgICAgICAgaWYgKGhvc3QuaXNDYWNoaW5nKCkpIHJldHVybjtcbiAgICAgICAgLy8gU21hbGwgdGllciBvbiBzY3JlZW46IGRyb3AgdGhlIGZ1bGwgb3ZlcmxheSwga2VlcCBhIHRyYW5zbHVjZW50IHNwaW5uZXIgc28gdGhlXG4gICAgICAgIC8vIGJsdXJyeSByZW5kZXIgaXNuJ3QgbWlzdGFrZW4gZm9yIHRoZSBmaW5hbCBpbWFnZS5cbiAgICAgICAgcmVsZWFzZU92ZXJsYXkoKTtcbiAgICAgICAgdGhpcy5zaGFycGVuaW5nID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICBzaGFycGVuU2V0dGxlZDogKCkgPT4ge1xuICAgICAgICBpZiAodGFzay5pc0N1cnJlbnQoKSkgdGhpcy5zaGFycGVuaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZmluaXNoZWQ6ICgpID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIHJlbGVhc2VPdmVybGF5KCk7IC8vIGlkZW1wb3RlbnQ6IG5vdyBpZiBzbWFsbFNob3duIGRlZmVycmVkIGl0IG9yIHdhcyBza2lwcGVkXG4gICAgICAgIHNldHRsZSgpO1xuICAgICAgfSxcbiAgICAgIHNoYXJwZW5GYWlsZWQ6IChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKCF0YXNrLmlzQ3VycmVudCgpKSByZXR1cm47XG4gICAgICAgIC8vIFRoZSBzbWFsbCB0aWVyIHN0YXlzIG9uIHNjcmVlbiBhcyB0aGUgZmFsbGJhY2suXG4gICAgICAgIGhvc3QuYWxlcnQoXG4gICAgICAgICAgJ3dhcm4nLFxuICAgICAgICAgICdQcmV2aWV3IG5vdCBzaGFycGVuZWQnLFxuICAgICAgICAgIGBUaGUgZnVsbC1yZXNvbHV0aW9uIHByZXZpZXcgZGlkIG5vdCBsb2FkICgke2Vycm9yTWVzc2FnZShlcnIpfSkuIGAgK1xuICAgICAgICAgICAgJ1RoZSBsb3ctcmVzb2x1dGlvbiBwcmV2aWV3IGlzIHN0aWxsIHNob3duLiBUcnkgY2xpY2tpbmcgdGhlIGltYWdlIGFnYWluLicsXG4gICAgICAgICk7XG4gICAgICAgIHNldHRsZSgpO1xuICAgICAgfSxcbiAgICAgIHJlbmRlckZhaWxlZDogKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICBpZiAoIXRhc2suaXNDdXJyZW50KCkpIHJldHVybjtcbiAgICAgICAgaG9zdC5hbGVydChcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICdDb3VsZCBub3QgZHJhdyB0aGUgaW1hZ2UnLFxuICAgICAgICAgIGAke2luZm8uZmlsZU5hbWUgPz8gJ1RoZSBpbWFnZSd9OiAke2Vycm9yTWVzc2FnZShlcnIpfS4gVHJ5IG9wZW5pbmcgaXQgYWdhaW4uYCxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSkucmVuZGVyKGluZm8sIHNtYWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3IGEgc3BhdGlhbCBtb2RlIHdpdGggbm8gaW1hZ2UgYmVoaW5kIGl0OiB0aGUgb2JzZXJ2YXRpb25zIGFsb25lLCBmcmFtZWQgb24gdGhlaXJcbiAgICogb3duIGV4dGVudC4gVGhlIGltYWdlIGluZm8gaXMgYSBwbGFjZWhvbGRlciBuYW1pbmcgdGhlIGRhdGFzZXQsIHNvIHJlZ2lvbnMgZHJhd24gaGVyZVxuICAgKiBhcmUga2VwdCBwZXIgZGF0YXNldCBsaWtlIGFueSBpbWFnZSdzLiBTdXBlcnNlZGVzIChhbmQgaXMgc3VwZXJzZWRlZCBieSkgaW1hZ2UgcmVuZGVycy5cbiAgICovXG4gIGFzeW5jIHBsb3RXaXRob3V0SW1hZ2UoZGF0YXNldDogU3BhdGlhbERhdGFzZXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMudmlld1JlYWR5KSB7XG4gICAgICAvLyBBIGhvc3QgdGhhdCBjcmVhdGVzIHRoZSB2aWV3ZXIgQUZURVIgcHVibGlzaGluZyB0aGUgZGF0YXNldCBoYXMgaXQgcmVwbGF5ZWQgYmVmb3JlXG4gICAgICAvLyB0aGUgcGxvdCBkaXYgZXhpc3RzOyBkcmF3aW5nIG5vdyBmaW5kcyBubyB0YXJnZXQuIERyYXcgb25jZSB0aGUgdmlldyBpcyByZWFkeS5cbiAgICAgIHRoaXMucGVuZGluZ0RyYXcgPSBkYXRhc2V0O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBob3N0ID0gdGhpcy5ob3N0O1xuICAgIGNvbnN0IHRhc2sgPSB0aGlzLnN1cGVyc2VkZS5uZXh0KCk7XG4gICAgY29uc3QgaW5mbzogSUltYWdlSW5mbyA9IHtcbiAgICAgIGlzR3JheXNjYWxlOiBmYWxzZSxcbiAgICAgIHRydWVJbWFnZVNpemU6IFswLCAwXSxcbiAgICAgIHVybHM6IFtdLFxuICAgICAgaXNTdGFjazogZmFsc2UsXG4gICAgICBzaG93U3RhY2s6IGZhbHNlLFxuICAgICAgc2NhbGVSYXRpbzogdHJ1ZSxcbiAgICAgIGZpbGVOYW1lOiBgc3BhdGlhbDoke2RhdGFzZXQuaWR9YCxcbiAgICAgIGltYWdlTWV0YTogW10sXG4gICAgfTtcbiAgICBjb25zdCBoZWlnaHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChob3N0LnBsb3REaXZOYW1lKT8ub2Zmc2V0SGVpZ2h0IHx8IDUwMDtcbiAgICBsZXQgZmFpbHVyZTogdW5rbm93biA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEEgYmFja2VuZCB0aGF0IGNhbm5vdCBkcmF3IChubyBXZWJHUFUsIG5vIHBsb3QgdGFyZ2V0KSByZXNvbHZlcyBmYWxzZSByYXRoZXIgdGhhbiB0aHJvd2luZy5cbiAgICAgIGlmICghKGF3YWl0IGhvc3QudmlzdWFsaXplci5wbG90KGhvc3QucGxvdERpdk5hbWUsIG51bGwsIGluZm8sIGhlaWdodCwgaG9zdC5wbG90VHlwZSgpKSkpIHtcbiAgICAgICAgZmFpbHVyZSA9ICd0aGUgcmVuZGVyZXIgY291bGQgbm90IHN0YXJ0JztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGZhaWx1cmUgPSBlcnI7XG4gICAgfVxuICAgIC8vIFN1cGVyc2VkZWQ6IGEgbmV3ZXIgcmVuZGVyIG93bnMgdGhlIGxvYWRpbmcgc3RhdGUgbm93LlxuICAgIGlmICghdGFzay5pc0N1cnJlbnQoKSkgcmV0dXJuO1xuICAgIGlmIChmYWlsdXJlKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBjb3VsZCBub3QgZHJhdyB0aGUgc3BhdGlhbCBkYXRhc2V0JywgZmFpbHVyZSk7XG4gICAgICBjb25zdCBlID0gZmFpbHVyZSBhcyB7IG1lc3NhZ2U/OiBzdHJpbmcgfTtcbiAgICAgIC8vIEFuIGltYWdlLWxlc3MgZGF0YXNldCBoYXMgbm8gdGlzc3VlIGltYWdlIHRvIGZhbGwgYmFjayBvbiwgc28gc2F5IHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBsZWF2ZSBhbiBlbXB0eSBjYW52YXMgdGhhdCBsb29rcyBmaW5pc2hlZC5cbiAgICAgIGhvc3QuYWxlcnQoXG4gICAgICAgICdlcnJvcicsXG4gICAgICAgICdDb3VsZCBub3QgZHJhdyB0aGUgZGF0YXNldCcsXG4gICAgICAgIGAke2RhdGFzZXQubmFtZSA/PyBkYXRhc2V0LmlkfTogJHtlPy5tZXNzYWdlID8/IFN0cmluZyhmYWlsdXJlKX0uYCxcbiAgICAgICk7XG4gICAgfVxuICAgIGhvc3Quc2V0SW1hZ2VMb2FkaW5nKGZhbHNlKTtcbiAgICBob3N0LmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcGxvdCBkaXYgZXhpc3RzIG5vdzogcnVuIGFuIGltYWdlLWxlc3MgZHJhdyB0aGF0IGFycml2ZWQgYmVmb3JlIGl0IGRpZCDigJQgb25seSBpZlxuICAgKiBpdHMgZGF0YXNldCBpcyBzdGlsbCB0aGUgb25lIG9uIG9mZmVyIChieSBpZDogdGhlIHBvcnQgbWF5IHJlLWVtaXQgdGhlIHNhbWUgZGF0YXNldFxuICAgKiBhcyBhIG5ldyBvYmplY3QsIGFuZCB0aGUgY3VycmVudCBvYmplY3QgaXMgdGhlIG9uZSB0byBkcmF3KSBhbmQgbm8gaW1hZ2UgaGFzIGFycml2ZWQuXG4gICAqL1xuICB2aWV3SXNSZWFkeShjdXJyZW50OiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIGhhc0ltYWdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aWV3UmVhZHkgPSB0cnVlO1xuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdEcmF3O1xuICAgIHRoaXMucGVuZGluZ0RyYXcgPSBudWxsO1xuICAgIGlmIChwZW5kaW5nICYmIGN1cnJlbnQgJiYgY3VycmVudC5pZCA9PT0gcGVuZGluZy5pZCAmJiAhaGFzSW1hZ2UpIHZvaWQgdGhpcy5wbG90V2l0aG91dEltYWdlKGN1cnJlbnQpO1xuICB9XG5cbiAgLyoqIENhbmNlbCB0aGUgcmVuZGVyIGluIGZsaWdodDogYWJvcnQgaXRzIGxvYWRzIGFuZCBtYWtlIGl0cyBjYWxsYmFja3MgaW5lcnQuICovXG4gIGNhbmNlbCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1cGVyc2VkZS5jYW5jZWwoKTtcbiAgICB0aGlzLnJ1bm5pbmcgPSBmYWxzZTtcbiAgfVxufVxuIl19
|