cubevis 1.0.57__tar.gz → 1.0.62__tar.gz
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.
- {cubevis-1.0.57 → cubevis-1.0.62}/PKG-INFO +1 -1
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__js__/bokeh-3.8/cubevisjs.min.js +5 -5
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/sources/_data_pipe.py +6 -4
- cubevis-1.0.62/cubevis/bokeh/sources/transport/__init__.py +38 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/pyproject.toml +1 -1
- cubevis-1.0.57/cubevis/bokeh/sources/transport/__init__.py +0 -80
- {cubevis-1.0.57 → cubevis-1.0.62}/LICENSE +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/README.rst +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/LICENSE.rst +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/20px/fast-backward.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/20px/fast-forward.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/20px/step-backward.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/20px/step-forward.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/add-chan.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/add-chan.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/add-cube.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/add-cube.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/drag.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/drag.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/mask-selected.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/mask.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/mask.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/new-layer-sm-selected.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/new-layer-sm-selected.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/new-layer-sm.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/new-layer-sm.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/reset.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/reset.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/sub-chan.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/sub-chan.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/sub-cube.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/sub-cube.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/trash.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/trash.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/trash_full.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/trash_full.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/trash_full_raw.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/zoom-to-fit.png +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__icons__/zoom-to-fit.svg +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__js__/bokeh-3.6/cubevisjs.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__js__/bokeh-3.7/cubevisjs.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/__js__/casalib.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/annotations/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/annotations/_ev_poly_annotation.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/components/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/format/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/format/_time_ticks.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/format/_wcs_ticks.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/_bokeh_app_context.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/_edit_span.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/_ev_text_input.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/_shared_dict.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/_showable.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/_tip.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/models/_tip_button.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/sources/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/sources/_image_data_source.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/sources/_image_pipe.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/sources/_spectra_data_source.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/sources/_updatable_data_source.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/_current.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/_initialize.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/_javascript.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/_palette.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/_session.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/bokeh-2.4.1.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/bokeh-gl-2.4.1.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/bokeh-tables-2.4.1.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/bokeh-widgets-2.4.1.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/casaguijs-v0.0.4.0-b2.4.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/casaguijs-v0.0.5.0-b2.4.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/casaguijs-v0.0.6.0-b2.4.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/state/js/casalib-v0.0.1.min.js +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/tools/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/tools/_cbreset_tool.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/tools/_drag_tool.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/utils/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/utils/_axes_labels.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/bokeh/utils/_svg_icon.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/data/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/data/casaimage/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/exe/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/exe/_context.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/exe/_mode.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/exe/_setting.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/exe/_task.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/_gclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_createmask.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_createregion.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_interactiveclean.mustache +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_interactiveclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_interactivecleannotebook.mustache +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_interactivecleannotebook.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_plotants.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/apps/_plotbandpass.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/casashell/createmask.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/casashell/iclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/casatasks/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/casatasks/createmask.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/casatasks/createregion.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/casatasks/iclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/private/casatasks/iclean_notebook.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/readme.rst +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/remote/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/remote/_gclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/remote/_local.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/remote/_remote_kernel.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/toolbox/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/toolbox/_app_context.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/toolbox/_cube.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/toolbox/_interactive_clean_ui.mustache +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/toolbox/_interactive_clean_ui.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/toolbox/_interactiveclean_wrappers.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/toolbox/_region_list.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_ResourceManager.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/__init__.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_browser.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_contextmgrchain.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_conversion.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_copydoc.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_docenum.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_git.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_import_protected_module.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_jupyter.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_logging.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_mutual_exclusion.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_pkgs.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_regions.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_static.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/cubevis/utils/_tiles.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/alma-many-chan/alma-many-chan.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/basic-websockets-demo/client.html +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/basic-websockets-demo/client.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/basic-websockets-demo/server.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/createmask-demo/run-createmask.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/createregion-demo/run-createregion.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/cubemask-demo/image-slider-spectra-done-stats.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/cubemask-demo/image-slider-spectra-done.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/cubemask-demo/image-slider-spectra.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/cubemask-demo/image-slider.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/cubemask-demo/image.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-demo/iclean-demo.ipynb +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-demo/m100_interactive.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-demo/mask0-iclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-demo/run-gclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-demo/run-iclean-obj.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-demo/run-iclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-demo/vla-sim-jet-iclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-first-look/run-fl-cont.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-first-look/run-fl-line.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-outlier/run-iclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-outlier/test_outlier.txt +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/iclean-remote/iclean_remote_webserver.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/large-cube/run-largecube.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/svg-test.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/updatable-data-source/direct-plot.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/updatable-data-source/simple-update.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/updatable-data-source/updated-plot.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/uranus-demo/uranus-iclean.py +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/websocket-reconnect/client.html +0 -0
- {cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/websocket-reconnect/server.py +0 -0
|
@@ -42,15 +42,15 @@
|
|
|
42
42
|
}
|
|
43
43
|
})
|
|
44
44
|
({
|
|
45
|
-
"07c9fde72b": function _(e,t,a,o,c){o();const i=e("tslib"),n=e("
|
|
46
|
-
"
|
|
45
|
+
"07c9fde72b": function _(e,t,a,o,c){o();const i=e("tslib"),n=e("b8d2916258");c("DataPipe",n.DataPipe);c("activeDataPipes",e("5179d11e71").activeDataPipes);const p=e("2889e0dd45");c("ImagePipe",p.ImagePipe);const s=e("de65005924");c("ImageDataSource",s.ImageDataSource);const r=e("02e3c3e46c");c("SpectraDataSource",r.SpectraDataSource);const S=e("64b16deff9");c("UpdatableDataSource",S.UpdatableDataSource);const d=e("b6ae454f0d");c("WcsTicks",d.WcsTicks);const l=e("cb7d28d6b3");c("DragTool",l.DragTool);const D=e("9d3c34ff8e");c("CBResetTool",D.CBResetTool);const T=e("e3901fa9f2");c("serialize",T.serialize),c("deserialize",T.deserialize);const b=e("9f961622ce");c("TipButton",b.TipButton);const u=e("ca4c845905");c("Tip",u.Tip);const P=e("a6e757a69a");c("Showable",P.Showable);const f=e("467d2716b0");c("BokehAppContext",f.BokehAppContext);const g=e("50a1e32f01");c("SharedDict",g.SharedDict);const h=e("b55081402e");c("EditSpan",h.EditSpan);const B=e("9144bfc7a5");c("EvTextInput",B.EvTextInput);const E=e("74e0abef8a");c("EvPolyAnnotation",E.EvPolyAnnotation);const I=i.__importStar(e("484bb85d20"));a.find=I;(0,e("@bokehjs/base").register_models)({DataPipe:n.DataPipe,ImagePipe:p.ImagePipe,ImageDataSource:s.ImageDataSource,SpectraDataSource:r.SpectraDataSource,UpdatableDataSource:S.UpdatableDataSource,WcsTicks:d.WcsTicks,DragTool:l.DragTool,CBResetTool:D.CBResetTool,Tip:u.Tip,TipButton:b.TipButton,SharedDict:g.SharedDict,Showable:P.Showable,BokehAppContext:f.BokehAppContext,EditSpan:h.EditSpan,EvTextInput:B.EvTextInput,EvPolyAnnotation:E.EvPolyAnnotation})},
|
|
46
|
+
"b8d2916258": function _(e,t,s,i,n){var o;i();const a=e("@bokehjs/models/sources/data_source"),c=e("e3901fa9f2"),r=e("@bokehjs/core/util/callbacks"),l=e("5179d11e71");class d extends a.DataSource{constructor(e){super(e),this.send_queue={},this.connection_queue=[],this.pending={},this.incoming_callbacks={},this.session_id=casalib.object_id(this)}checkSessionConflict(){try{if("undefined"==typeof Storage)return console.warn("localStorage not available, skipping session conflict detection"),!0;const e=localStorage.getItem(this.session_storage_key);if(e){const t=JSON.parse(e);if(t.sessionId!==this.session_id&&Date.now()-t.timestamp<12e4){if(this.conflict_check){const e=`CubeVis DataPipe (${this.instance_key}) is already running in another browser window or tab.\n\nPlease close other instances and refresh this page, or\nclose this window to continue using the other instance.`;return alert(e),window.opener||1===window.history.length?window.close():window.location.href="about:blank",!1}console.group(`DataPipe ${this.instance_key} conflict detected in Jupyter context`),console.log("Current session ID:",this.session_id),console.log("Existing session ID:",t.sessionId),console.log("Existing timestamp:",new Date(t.timestamp).toISOString()),console.log("Age of existing session (ms):",Date.now()-t.timestamp),console.log("Backend IP:",this.backend_ip),console.log("Backend Port:",this.backend_port),console.log("Backend URL:",this.backend_url),console.log("Instance key:",this.instance_key),console.log("Storage key:",this.session_storage_key),console.log("Existing data:",t),console.log("All localStorage keys:",Object.keys(localStorage).filter((e=>e.startsWith("cubevis_datapipe_")))),console.groupEnd()}}return this.updateSessionHeartbeat(),!0}catch(e){return console.warn("Session conflict detection failed:",e),!0}}updateSessionHeartbeat(){try{"undefined"!=typeof Storage&&localStorage.setItem(this.session_storage_key,JSON.stringify({sessionId:this.session_id,timestamp:Date.now(),instanceKey:this.instance_key}))}catch(e){console.warn("Session heartbeat update failed:",e)}}startHeartbeat(){this.heartbeat_interval=window.setInterval((()=>{this.updateSessionHeartbeat()}),3e4)}stopHeartbeat(){this.heartbeat_interval&&(clearInterval(this.heartbeat_interval),this.heartbeat_interval=void 0)}cleanupSession(){try{if("undefined"!=typeof Storage){const e=localStorage.getItem(this.session_storage_key);if(e){JSON.parse(e).sessionId===this.session_id&&localStorage.removeItem(this.session_storage_key)}}}catch(e){console.warn("Session cleanup failed:",e)}this.stopHeartbeat()}handleSessionConflictMessage(e){console.error("Session conflict detected by server:",e);let t="Session conflict detected by server.";"session_conflict"===e.type?t=e.error||t:"session_corruption"===e.type&&(t=`Session corruption detected.\nExpected: ${e.expected}\nReceived: ${e.received}`),alert(t+"\n\nThis window will be closed to prevent data corruption."),this.cleanupSession();const s=new CustomEvent("cubevis_session_conflict",{detail:{message:e,sessionId:this.session_id}});window.dispatchEvent(s),setTimeout((()=>{window.opener||1===window.history.length?window.close():window.location.href="about:blank"}),2e3)}generateInstanceKey(){return`${this.instance_id}_${this.backend_port}`}async initializeWebSocket(){console.log(" datapipe url:",this.backend_url),console.log(`datapipe ip/port: ${this.backend_ip}/${this.backend_port}`);var e=void 0;document.shutdown_in_progress_=!1;var t=async()=>{const s=this.backend_url,i=s.replace("wss://","https://");console.log(` [${this.backend_port}] starting priming...`);try{try{await fetch(i,{signal:AbortSignal.timeout(5e3),method:"GET",mode:"cors",credentials:"include",headers:{Accept:"*/*"}})}catch(e){"TimeoutError"===e.name&&console.log(` [${this.backend_port}] prime request timed out after 5 seconds`)}console.log(` [${this.backend_port}] instantiating websocket...`),void 0!==this.websocket&&this.websocket.close(),this.websocket=new WebSocket(s),this.websocket.binaryType="arraybuffer",this.websocket.onopen=()=>{for(console.log(`>>>${this.backend_port}>>> DATAPIPE CONNECTED`),e?0==e.connected&&console.log(`connection reestablished at ${new Date}`):(this.websocket.send((0,c.serialize)({id:"initialize",direction:"j2p",session:this.session_id})),this.startHeartbeat()),e=new casalib.ReconnectState;this.connection_queue.length>0;){let e=this.connection_queue.shift();this.send.apply(e[0],e[1])}},this.websocket.addEventListener("error",(e=>{var t;console.error(`>>>${this.backend_port}>>> DATAPIPE ERROR:`,e),console.log(`>>>${this.backend_port}>> Socket State Upon Error:`,null===(t=this.websocket)||void 0===t?void 0:t.readyState)})),this.websocket.onclose=s=>{if(console.log(`>>>${this.backend_port}>>> WEBSOCKET CLOSED:`,s.code,s.reason),e&&1==e.connected&&(console.log(`connection lost at ${new Date}`),e.connected=!1,!document.shutdown_in_progress_)){console.log(`connection lost at ${new Date}`);var i=e;function n(s){0==e.connected&&(console.log(`${s+1}\treconnection attempt ${new Date}`),t(),i.backoff(),i.retries>0?setTimeout(n,i.timeout,s+1):0==e.connected&&console.log(`aborting reconnection after ${s} attempts ${new Date}`))}n(0)}},this.websocket.onmessage=e=>{if("string"==typeof e.data||e.data instanceof String){let t=(0,c.deserialize)(e.data);if("id"in t&&"direction"in t&&"message"in t){let{id:e,message:s,direction:i}=t;if("error"===i&&("session_conflict"===e||e===this.session_id)&&s&&("session_conflict"===s.type||"session_corruption"===s.type||"close_duplicate"===s.action))return void this.handleSessionConflictMessage(s);if(void 0===s&&console.log("Error, event failure",t),"j2p"==i)if(e in this.pending){let{cb:i}=this.pending[e];if(delete this.pending[e],e in this.send_queue&&this.send_queue[e].length>0){let{cb:t,msg:s}=this.send_queue[e].shift();this.pending[e]={cb:t},this.websocket.send((0,c.serialize)(s))}void 0===s?console.log("DROPPING ERROR FOR NOW (maybe need error callbacks)",t):i(s)}else console.log("message received but could not find id");else if(e in this.incoming_callbacks){let t=this.incoming_callbacks[e](s);this.websocket.send((0,c.serialize)({id:e,direction:i,message:t,session:this.session_id}))}}else console.log(`datapipe received message without one of 'id', 'message' or 'direction': ${t}`)}else console.log("datapipe received binary data",e.data.byteLength,"bytes")}}catch(e){console.error(`>>>${this.backend_port}>>> CRITICAL JS ERROR during WS creation:`,e)}};window.addEventListener("beforeunload",(()=>{this.cleanupSession()})),document.addEventListener("visibilitychange",(()=>{"hidden"===document.visibilityState?this.stopHeartbeat():"visible"===document.visibilityState&&(this.updateSessionHeartbeat(),this.startHeartbeat())})),t()}initialize(){if(super.initialize(),l.activeDataPipes.register(this),this.instance_key=this.generateInstanceKey(),this.session_storage_key=`cubevis_datapipe_${this.instance_key}`,!this.checkSessionConflict())return;this.initializeWebSocket();(()=>{null!=this.init_script&&(0,r.execute)(this.init_script,this)})()}destroy(){l.activeDataPipes.unregister(this),super.destroy()}register(e,t){this.incoming_callbacks[e]=t}send(e,t,s,i=!1){let n={id:e,message:t,direction:"j2p",session:this.session_id};if(!this.websocket||e in this.pending)if(e in this.send_queue)if("boolean"==typeof i&&i&&this.send_queue[e].length>0)this.send_queue[e][0].msg=n,this.send_queue[e][0].cb=s;else if("function"==typeof i&&this.send_queue[e].length>0){let o=!1;for(const a of this.send_queue[e])i(a.msg.message)&&(a.msg=n,a.cb=s,o=!0);o||this.send_queue[e].push({cb:s,msg:n})}else this.send_queue[e].push({cb:s,msg:n});else this.send_queue[e]=[{cb:s,msg:n}];else if(this.websocket.readyState===WebSocket.CONNECTING)this.connection_queue.push([this,[e,t,s]]);else if(e in this.send_queue&&this.send_queue[e].length>0){this.send_queue[e].push({cb:s,msg:n});{let{cb:r,msg:l}=this.send_queue[e].shift();if(this.pending[e]={cb:r},this.websocket.readyState===WebSocket.OPEN)this.websocket.send((0,c.serialize)(l));else{let d=20,h=this;function u(){h.websocket.readyState===WebSocket.OPEN?h.websocket.send((0,c.serialize)(l)):(d-=1,d>0&&setTimeout(u,3e3))}setTimeout(u,3e3)}}}else if(this.websocket.readyState===WebSocket.OPEN)this.pending[e]={cb:s},this.websocket.send((0,c.serialize)(n));else{let b=20,g=this;function p(){g.websocket.readyState===WebSocket.OPEN?(g.pending[e]={cb:s},g.websocket.send((0,c.serialize)(n))):(b-=1,b>0&&setTimeout(p,3e3))}setTimeout(p,3e3)}}}s.DataPipe=d,o=d,d.__name__="DataPipe",d.__module__="cubevis.bokeh.sources._data_pipe",o.define((({Any:e,Str:t,Int:s,Bool:i,Nullable:n})=>({init_script:[n(e),null],backend_ip:[t,"127.0.0.1"],backend_port:[s],backend_url:[t],instance_id:[t],conflict_check:[i,!0]})))},
|
|
47
47
|
"e3901fa9f2": function _(e,r,s,i,o){i();const l=e("@bokehjs/base"),a=e("@bokehjs/core/resolvers"),t=e("@bokehjs/core/serialization/deserializer"),n=e("@bokehjs/core/serialization/serializer"),{deserialize:c}=new class{constructor(){this.resolver=new a.ModelResolver(l.default_resolver),this.deserializer=new t.Deserializer(this.resolver),this.deserialize=e=>{try{return this.deserializer.decode(JSON.parse(e))}catch(r){return console.group("deserialize error"),console.log(e),console.log(r),console.groupEnd(),{}}}}};s.deserialize=c;const{serialize:z}=new class{constructor(){this.serializer=new n.Serializer,this.serialize=e=>JSON.stringify(this.serializer.encode(e))}};s.serialize=z},
|
|
48
48
|
"5179d11e71": function _(a,e,n,c,t){c();const i=a("30b45c52a1");n.activeDataPipes=new i.ModelManager},
|
|
49
49
|
"30b45c52a1": function _(e,n,s,t,i){t();class r{constructor(){this.instances=new Map}register(e){this.instances.set(e.id,e),console.log(`registered instance ${e.id}`)}unregister(e){this.instances.delete(e.id),console.log(`unregistered instance ${e.id}`)}getInstances(){return Array.from(this.instances.values())}getInstance(e){return this.instances.get(e)}}s.ModelManager=r,r.__name__="ModelManager"},
|
|
50
|
-
"2889e0dd45": function _(i,s,e,t,n){var a;t();const o=i("@bokehjs/models/sources/column_data_source"),d=i("
|
|
50
|
+
"2889e0dd45": function _(i,s,e,t,n){var a;t();const o=i("@bokehjs/models/sources/column_data_source"),d=i("b8d2916258");class r extends d.DataPipe{constructor(i){super(i),this.position={},this._wcs=null}initialize(){super.initialize(),this.fits_header_json&&(this._wcs=new casalib.coordtxl.WCSTransform(new casalib.coordtxl.MapKeywordProvider(JSON.parse(this.fits_header_json))))}channel(i,s,e){this.position[e]={index:i};let t={action:"channel",index:i,id:e};super.send(this.dataid,t,(i=>{null!=this._histogram_source&&"hist"in i&&"top"in i.hist&&"bottom"in i.hist&&"left"in i.hist&&"right"in i.hist&&(this._histogram_source.data=i.hist),s(i)}))}spectrum(i,s,e,t=!1){let n={action:"spectrum",index:i,id:e};super.send(this.dataid,n,s,t)}adjust_colormap(i,s,e,t,n=!1){const a={action:"adjust-colormap",bounds:i,transfer:s,id:t};super.send(this.dataid,a,e,n)}refresh(i,s,e=[0,0]){let{index:t}=s in this.position?this.position[s]:{index:e};if(2===t.length){let e={action:"channel",index:t,id:s};super.send(this.dataid,e,i)}else if(3===t.length){let e={action:"spectrum",index:t,id:s};super.send(this.dataid,e,i)}}wcs(){return this._wcs}}e.ImagePipe=r,a=r,r.__name__="ImagePipe",r.__module__="cubevis.bokeh.sources._image_pipe",a.define((({Number:i,Nullable:s,String:e,Tuple:t,Ref:n})=>({dataid:[e],shape:[t(i,i,i,i)],fits_header_json:[s(e),null],_histogram_source:[s(n(o.ColumnDataSource)),null]})))},
|
|
51
51
|
"de65005924": function _(s,a,t,c,i){var o;c();const e=s("@bokehjs/models/sources/column_data_source"),n=s("@bokehjs/core/util/string"),u=s("2889e0dd45"),h=s("@bokehjs/core/util/callbacks");class r extends e.ColumnDataSource{constructor(s){super(s),this.imid=(0,n.uuid4)()}_mask_contour(s){const a=casalib.d3.contours().size(this.image_source.shape.slice(0,2)).thresholds([1])(s[0])[0].coordinates.map((s=>s.map((s=>s.reduce(((s,a)=>(s[0].push(a[0]),s[1].push(a[1]),s)),[[],[]])))));return{xs:[a.map((s=>s.map((s=>s[0]))))],ys:[a.map((s=>s.map((s=>s[1]))))]}}initialize(){if(super.initialize(),null!=this._mask_contour_source&&"msk"in this.data&&this.data.msk.length>0&&this.data.msk[0].length>0){const s=this.data.msk;this._mask_contour_source.data=this._mask_contour(s)}void 0===this.last_chan&&(this.last_chan=[this.cur_chan[0].valueOf(),this.cur_chan[1].valueOf()]);(()=>{null!=this.init_script&&(0,h.execute)(this.init_script,this)})()}channel(s,a=0,t){this.image_source.channel([a,s],(c=>{void 0!==c&&void 0!==c.chan||console.log("ImageDataSource ERROR ENCOUNTERED <1>",c),this.last_chan=[this.cur_chan[0].valueOf(),this.cur_chan[1].valueOf()],this.cur_chan=[a,s],null!=this._mask_contour_source&&"chan"in c&&"msk"in c.chan&&(c.msk_contour=this._mask_contour(c.chan.msk),this._mask_contour_source.data=c.msk_contour),t&&t(c),this.data=c.chan}),this.imid)}adjust_colormap(s,a,t){this.image_source.adjust_colormap(s,a,t,this.imid,!0)}signal_change(){this.change.emit()}refresh(s){this.image_source.refresh((a=>{void 0!==a&&void 0!==a.chan||console.log("ImageDataSource ERROR ENCOUNTERED <2>",a),null!=this._mask_contour_source&&"chan"in a&&"msk"in a.chan&&(a.msk_contour=this._mask_contour(a.chan.msk),this._mask_contour_source.data=a.msk_contour),s&&s(a),this.data=a.chan}),this.imid,[0,0])}wcs(){return this.image_source.wcs()}}t.ImageDataSource=r,o=r,r.__name__="ImageDataSource",r.__module__="cubevis.bokeh.sources._image_data_source",o.define((({Tuple:s,Number:a,Ref:t,Nullable:c,Any:i})=>({init_script:[i,null],image_source:[t(u.ImagePipe)],_mask_contour_source:[c(t(e.ColumnDataSource)),null],num_chans:[s(a,a)],cur_chan:[s(a,a)]})))},
|
|
52
52
|
"02e3c3e46c": function _(e,s,i,t,r){var a;t();const c=e("@bokehjs/models/sources/column_data_source"),u=e("@bokehjs/core/util/string"),o=e("2889e0dd45");class _ extends c.ColumnDataSource{constructor(e){super(e),this.imid=(0,u.uuid4)()}initialize(){super.initialize()}spectra(e,s,i=0,t=!1){this.image_source.spectrum([e,s,i],(e=>this.data=e.spectrum),this.imid,t)}refresh(){this.image_source.refresh((e=>this.data=e.spectrum),this.imid,[0,0,0])}}i.SpectraDataSource=_,a=_,_.__name__="SpectraDataSource",_.__module__="cubevis.bokeh.sources._spectra_data_source",a.define((({Ref:e})=>({image_source:[e(o.ImagePipe)]})))},
|
|
53
|
-
"64b16deff9": function _(e,s,i,t,a){var n;t();const u=e("@bokehjs/models/sources/column_data_source"),l=e("
|
|
53
|
+
"64b16deff9": function _(e,s,i,t,a){var n;t();const u=e("@bokehjs/models/sources/column_data_source"),l=e("b8d2916258"),o=e("@bokehjs/core/util/callbacks");class c extends u.ColumnDataSource{constructor(e){super(e)}send(e,s){this.pipe.send(this.session_id.valueOf(),{action:"callback",message:e},(e=>{s("result"in e?e.result:{error:`expected to find a "result" in "${e}"`,msg:e})}))}initialize(){super.initialize();(()=>{null!=this.js_init&&(0,o.execute)(this.js_init,this)})()}}i.UpdatableDataSource=c,n=c,c.__name__="UpdatableDataSource",c.__module__="cubevis.bokeh.sources._updatable_data_source",n.define((({Ref:e,Any:s,String:i})=>({js_init:[s,null],js_update:[s,null],pipe:[e(l.DataPipe)],session_id:[i]})))},
|
|
54
54
|
"b6ae454f0d": function _(s,i,o,t,e){var r;t();const a=s("@bokehjs/models/formatters/tick_formatter"),c=s("de65005924");class l extends a.TickFormatter{constructor(s){super(s),this._axis=null,this._coord="world"}initialize(){super.initialize(),"x"==this.axis||"X"==this.axis||"y"==this.axis||"Y"==this.axis?this._axis="x"==this.axis||"X"==this.axis?"x":"y":console.log("ERROR: WcsTicks formatter created with invalid axis:",this.axis)}doFormat(s){const i=[];if(this._axis&&this.image_source.wcs()&&"world"==this._coord)for(let o=0,t=s.length;o<t;o++)if("x"==this._axis){const t=new casalib.coordtxl.Point2D(Number(s[o]),0);this.image_source.wcs().imageToWorldCoords(t,!1),i.push(new casalib.coordtxl.WorldCoords(t.getX(),t.getY()).format(2e3)[0])}else{const t=new casalib.coordtxl.Point2D(0,Number(s[o]));this.image_source.wcs().imageToWorldCoords(t,!1),i.push(new casalib.coordtxl.WorldCoords(t.getX(),t.getY()).format(2e3)[1])}else for(let o=0,t=s.length;o<t;o++)i.push(""+s[o]);return i}coordinates(s){return s!=this._coord&&("world"!=s&&"pixel"!=s||(this._coord=s)),this._coord}}o.WcsTicks=l,r=l,l.__name__="WcsTicks",l.__module__="cubevis.bokeh.format._wcs_ticks",r.define((({Ref:s,String:i})=>({axis:[i],image_source:[s(c.ImageDataSource)]})))},
|
|
55
55
|
"cb7d28d6b3": function _(i,e,t,o,s){var d;o();const l=i("@bokehjs/models/tools/gestures/gesture_tool"),r=i("8fc7a9e935"),_=i("484bb85d20"),m=i("@bokehjs/core/util/callbacks");class a extends l.GestureToolView{_pan_start(i){var e;null===(e=this.model.document)||void 0===e||e.interactive_start(this.plot_view.model);const t=(0,_.px_from_sx)(this.plot_view,i.sx),o=(0,_.py_from_sy)(this.plot_view,i.sy),s=(0,_.dx_from_px)(this.plot_view,t),d=(0,_.dy_from_py)(this.plot_view,o),{start:l}=this.model;l?(0,m.execute)(l,this.model,{sx:t,sy:o,x:s,y:d,delta_x:i.dx,delta_y:-i.dy,shift:"modifiers"in i?i.modifiers.shift:void 0,ctrl:"modifiers"in i?i.modifiers.ctrl:void 0,alt:"modifiers"in i?i.modifiers.alt:void 0}):this.model.trigger_event(new r.DragStart(t,o,s,d,i.dx,-i.dy,i.modifiers))}_pan(i){var e;null===(e=this.model.document)||void 0===e||e.interactive_start(this.plot_view.model);const t=(0,_.px_from_sx)(this.plot_view,i.sx),o=(0,_.py_from_sy)(this.plot_view,i.sy),s=(0,_.dx_from_px)(this.plot_view,t),d=(0,_.dy_from_py)(this.plot_view,o),{move:l}=this.model;l?(0,m.execute)(l,this.model,{sx:t,sy:o,x:s,y:d,delta_x:i.dx,delta_y:-i.dy,shift:"modifiers"in i?i.modifiers.shift:void 0,ctrl:"modifiers"in i?i.modifiers.ctrl:void 0,alt:"modifiers"in i?i.modifiers.alt:void 0}):this.model.trigger_event(new r.Drag(t,o,s,d,i.dx,-i.dy,i.modifiers))}_pan_end(i){const e=(0,_.px_from_sx)(this.plot_view,i.sx),t=(0,_.py_from_sy)(this.plot_view,i.sy),o=(0,_.dx_from_px)(this.plot_view,e),s=(0,_.dy_from_py)(this.plot_view,t),{end:d}=this.model;d?(0,m.execute)(d,this.model,{sx:e,sy:t,x:o,y:s,delta_x:i.dx,delta_y:-i.dy,shift:"modifiers"in i?i.modifiers.shift:void 0,ctrl:"modifiers"in i?i.modifiers.ctrl:void 0,alt:"modifiers"in i?i.modifiers.alt:void 0}):this.model.trigger_event(new r.DragEnd(e,t,o,s,i.dx,-i.dy,i.modifiers))}}t.DragToolView=a,a.__name__="DragToolView";class n extends l.GestureTool{constructor(i){super(i),this.tool_name="Drag",this.event_type="pan",this.default_order=10}}t.DragTool=n,d=n,n.__name__="DragTool",n.__module__="cubevis.bokeh.tools._drag_tool",d.prototype.default_view=a,d.define((({Any:i,Nullable:e})=>({start:[e(i),null],move:[e(i),null],end:[e(i),null]})))},
|
|
56
56
|
"8fc7a9e935": function _(e,t,a,s,_){s();const n=e("@bokehjs/core/bokeh_events");class r extends n.Pan{}a.Drag=r,r.__name__="Drag";class l extends n.PanStart{constructor(e,t,a,s,_,n,r){super(e,t,a,s,r),this.delta_x=_,this.delta_y=n}get event_values(){const{delta_x:e,delta_y:t}=this;return{...super.event_values,delta_x:e,delta_y:t}}}a.DragStart=l,l.__name__="DragStart";class d extends n.PanEnd{constructor(e,t,a,s,_,n,r){super(e,t,a,s,r),this.delta_x=_,this.delta_y=n}get event_values(){const{delta_x:e,delta_y:t}=this;return{...super.event_values,delta_x:e,delta_y:t}}}a.DragEnd=d,d.__name__="DragEnd"},
|
|
@@ -64,4 +64,4 @@
|
|
|
64
64
|
"b55081402e": function _(e,n,t,_,s){var a;_();const o=e("@bokehjs/models/annotations/span"),p=e("@bokehjs/core/bokeh_events");class r extends o.SpanView{on_pan_start(e){const n=super.on_pan_start(e);return this.model.trigger_event(new p.LODStart),n}on_pan(e){super.on_pan(e)}on_pan_end(e){super.on_pan_end(e),this.model.trigger_event(new p.LODEnd)}}t.EditSpanView=r,r.__name__="EditSpanView";class d extends o.Span{constructor(e){super(e)}}t.EditSpan=d,a=d,d.__name__="EditSpan",d.__module__="cubevis.bokeh.models._edit_span",a.prototype.default_view=r},
|
|
65
65
|
"9144bfc7a5": function _(e,t,s,n,r){var i;n();const l=e("@bokehjs/models/widgets/text_input"),o=e("@bokehjs/core/dom"),u=e("@bokehjs/core/bokeh_events");class _ extends l.TextInputView{stylesheets(){return[...super.stylesheets(),new o.InlineStyleSheet(".bk-input-prefix { padding: 0 var(--padding-vertical); }")]}connect_signals(){super.connect_signals(),this.el.addEventListener("mouseenter",(e=>{this.model.trigger_event(new u.MouseEnter(e.screenX,e.screenY,e.x,e.y,{shift:e.shiftKey,ctrl:e.ctrlKey,alt:e.altKey}))})),this.el.addEventListener("mouseleave",(e=>{this.model.trigger_event(new u.MouseLeave(e.screenX,e.screenY,e.x,e.y,{shift:e.shiftKey,ctrl:e.ctrlKey,alt:e.altKey}))}))}render(){super.render()}}s.EvTextInputView=_,_.__name__="EvTextInputView";class c extends l.TextInput{constructor(e){super(e)}}s.EvTextInput=c,i=c,c.__name__="EvTextInput",c.__module__="cubevis.bokeh.models._ev_text_input",i.prototype.default_view=_},
|
|
66
66
|
"74e0abef8a": function _(e,t,n,s,o){var i;s();const r=e("@bokehjs/models/annotations/poly_annotation"),a=e("@bokehjs/core/bokeh_events");class _ extends r.PolyAnnotationView{on_enter(e){const{x_scale:t,y_scale:n}=this.plot_view.frame,s=new a.MouseEnter(e.sx,e.sy,t.invert(e.sx),n.invert(e.sy),{shift:e.modifiers.shift,ctrl:e.modifiers.ctrl,alt:e.modifiers.alt}),o=super.on_enter(e);return this.model.trigger_event(s),o}on_leave(e){const{x_scale:t,y_scale:n}=this.plot_view.frame,s=new a.MouseLeave(e.sx,e.sy,t.invert(e.sx),n.invert(e.sy),{shift:e.modifiers.shift,ctrl:e.modifiers.ctrl,alt:e.modifiers.alt});super.on_leave(e),this.model.trigger_event(s)}on_pan_start(e){const{x_scale:t,y_scale:n}=this.plot_view.frame,s=new a.PanStart(e.sx,e.sy,t.invert(e.sx),n.invert(e.sy),{shift:e.modifiers.shift,ctrl:e.modifiers.ctrl,alt:e.modifiers.alt}),o=super.on_pan_start(e);return this.model.trigger_event(s),o}on_pan_end(e){const{x_scale:t,y_scale:n}=this.plot_view.frame,s=new a.PanEnd(e.sx,e.sy,t.invert(e.sx),n.invert(e.sy),{shift:e.modifiers.shift,ctrl:e.modifiers.ctrl,alt:e.modifiers.alt});super.on_pan_end(e),this.model.trigger_event(s)}on_pan(e){super.on_pan(e);const t=new a.RangesUpdate(e.sx,e.sx+e.dx,e.sy,e.sy+e.dy);this.model.trigger_event(t)}}n.EvPolyAnnotationView=_,_.__name__="EvPolyAnnotationView";class l extends r.PolyAnnotation{constructor(e){super(e)}}n.EvPolyAnnotation=l,i=l,l.__name__="EvPolyAnnotation",l.__module__="cubevis.bokeh.annotations._ev_poly_annotation",i.prototype.default_view=_},
|
|
67
|
-
}, "07c9fde72b", {"index":"07c9fde72b","src/bokeh/sources/data_pipe":"
|
|
67
|
+
}, "07c9fde72b", {"index":"07c9fde72b","src/bokeh/sources/data_pipe":"b8d2916258","src/bokeh/util/conversions":"e3901fa9f2","src/bokeh/sources/active_data_pipes":"5179d11e71","src/bokeh/util/model_manager":"30b45c52a1","src/bokeh/sources/image_pipe":"2889e0dd45","src/bokeh/sources/image_data_source":"de65005924","src/bokeh/sources/spectra_data_source":"02e3c3e46c","src/bokeh/sources/updatable_data_source":"64b16deff9","src/bokeh/format/wcs_ticks":"b6ae454f0d","src/bokeh/tools/drag_tool":"cb7d28d6b3","src/bokeh/events":"8fc7a9e935","src/bokeh/util/find":"484bb85d20","src/bokeh/tools/cbreset_tool":"9d3c34ff8e","src/bokeh/models/tip_button":"9f961622ce","src/bokeh/models/tip":"ca4c845905","src/bokeh/models/showable":"a6e757a69a","src/bokeh/models/bokeh_app_context":"467d2716b0","src/bokeh/models/shared_dict":"50a1e32f01","src/bokeh/models/edit_span":"b55081402e","src/bokeh/models/ev_text_input":"9144bfc7a5","src/bokeh/annotations/ev_poly_annotation":"74e0abef8a"}, {});});
|
|
@@ -114,10 +114,12 @@ class DataPipe(DataSource,BokehInit):
|
|
|
114
114
|
|
|
115
115
|
# Fetch URL in Colab
|
|
116
116
|
if is_colab( ):
|
|
117
|
-
from google.colab.output import
|
|
118
|
-
#
|
|
119
|
-
|
|
120
|
-
|
|
117
|
+
from google.colab.output import proxy_port
|
|
118
|
+
# This function both returns the URL AND whitelists the port in the proxy
|
|
119
|
+
external_url = proxy_port(self.backend_port)
|
|
120
|
+
# external_url will be the https://{port}-m-s...dev/ link
|
|
121
|
+
self.backend_url = external_url.replace("https://", "wss://")
|
|
122
|
+
print( f"WHITELISTED PROXY URL FOR PORT {self.backend_port}: {self.backend_url}" )
|
|
121
123
|
else:
|
|
122
124
|
# Standard local/remote access
|
|
123
125
|
self.backend_url = f"ws://{self.backend_ip}:{self.backend_port}"
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from cubevis.utils import is_colab
|
|
2
|
+
import websockets
|
|
3
|
+
import http
|
|
4
|
+
from websockets.server import serve
|
|
5
|
+
from websockets.http11 import Response
|
|
6
|
+
|
|
7
|
+
log_path = "/content/package_debug.txt"
|
|
8
|
+
|
|
9
|
+
def colab_cors_handler(request):
|
|
10
|
+
# LOG EVERY ATTEMPT - If this doesn't show up, traffic isn't reaching Python
|
|
11
|
+
with open(log_path, "a") as f:
|
|
12
|
+
f.write(f"V15 HANDLER: {request.method} to {request.path}\n")
|
|
13
|
+
|
|
14
|
+
# If it's the priming fetch
|
|
15
|
+
if "upgrade" not in request.headers.get("Connection", "").lower():
|
|
16
|
+
origin = request.headers.get("Origin", "*")
|
|
17
|
+
headers = {
|
|
18
|
+
"Access-Control-Allow-Origin": origin,
|
|
19
|
+
"Access-Control-Allow-Credentials": "true",
|
|
20
|
+
"Access-Control-Allow-Methods": "GET, OPTIONS, POST",
|
|
21
|
+
"Access-Control-Allow-Headers": "Content-Type, Authorization, X-Requested-With",
|
|
22
|
+
}
|
|
23
|
+
# Explicitly return 200 OK
|
|
24
|
+
return Response(http.HTTPStatus.OK, "OK", headers)
|
|
25
|
+
|
|
26
|
+
return None # Hand over to WebSocket
|
|
27
|
+
|
|
28
|
+
def create_ws_server(callback, ip_address, port):
|
|
29
|
+
if is_colab():
|
|
30
|
+
print(f"Websocket startup: 0.0.0.0:{port} (CORS Enabled)")
|
|
31
|
+
return serve(
|
|
32
|
+
callback,
|
|
33
|
+
"0.0.0.0",
|
|
34
|
+
port,
|
|
35
|
+
process_request=colab_cors_handler # Add this to fix the fetch error
|
|
36
|
+
)
|
|
37
|
+
else:
|
|
38
|
+
return serve(callback, ip_address, port)
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
from cubevis.utils import is_colab
|
|
2
|
-
import websockets
|
|
3
|
-
import http
|
|
4
|
-
import asyncio
|
|
5
|
-
try:
|
|
6
|
-
from websockets.http11 import Response
|
|
7
|
-
except ImportError:
|
|
8
|
-
Response = None # Fallback for very old versions
|
|
9
|
-
|
|
10
|
-
log_path = "/content/package_debug.txt"
|
|
11
|
-
|
|
12
|
-
try:
|
|
13
|
-
from websockets.server import ServerConnection as BaseConnection
|
|
14
|
-
IS_LEGACY = False
|
|
15
|
-
except ImportError:
|
|
16
|
-
from websockets.server import WebSocketServerProtocol as BaseConnection
|
|
17
|
-
IS_LEGACY = True
|
|
18
|
-
|
|
19
|
-
def universal_process_request(*args):
|
|
20
|
-
"""
|
|
21
|
-
Handles CORS priming.
|
|
22
|
-
Legacy signature: (path, request_headers)
|
|
23
|
-
Modern signature: (request)
|
|
24
|
-
"""
|
|
25
|
-
if IS_LEGACY:
|
|
26
|
-
# Legacy passes: (path, headers)
|
|
27
|
-
path, headers = args[0], args[1]
|
|
28
|
-
method = "GET"
|
|
29
|
-
else:
|
|
30
|
-
request = args[0]
|
|
31
|
-
path, headers, method = request.path, request.headers, request.method
|
|
32
|
-
|
|
33
|
-
with open(log_path, "a") as f:
|
|
34
|
-
f.write(f"Top-level process_request: {method} {path}\n")
|
|
35
|
-
|
|
36
|
-
is_upgrade = "upgrade" in headers.get("Connection", "").lower()
|
|
37
|
-
|
|
38
|
-
if not is_upgrade:
|
|
39
|
-
origin = headers.get("Origin", "*")
|
|
40
|
-
resp_headers = {
|
|
41
|
-
"Content-Type": "text/plain",
|
|
42
|
-
"Connection": "close",
|
|
43
|
-
"Access-Control-Allow-Origin": origin,
|
|
44
|
-
"Access-Control-Allow-Credentials": "true",
|
|
45
|
-
"Access-Control-Allow-Methods": "GET, OPTIONS, POST",
|
|
46
|
-
"Access-Control-Allow-Headers": "Content-Type, Authorization, X-Requested-With",
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if method == "OPTIONS":
|
|
50
|
-
return (http.HTTPStatus.NO_CONTENT, resp_headers, b"") if IS_LEGACY else Response(http.HTTPStatus.NO_CONTENT, "No Content", resp_headers)
|
|
51
|
-
|
|
52
|
-
if method == "GET":
|
|
53
|
-
return (http.HTTPStatus.OK, resp_headers, b"OK") if IS_LEGACY else Response(http.HTTPStatus.OK, "OK", resp_headers)
|
|
54
|
-
|
|
55
|
-
return None
|
|
56
|
-
|
|
57
|
-
class ColabWebSocketServerProtocol(BaseConnection):
|
|
58
|
-
def __init__(self, *args, **kwargs):
|
|
59
|
-
with open(log_path, "a") as f:
|
|
60
|
-
f.write(f"ColabWebSocketServerProtocol.__init__ constructed\n")
|
|
61
|
-
super().__init__(*args, **kwargs)
|
|
62
|
-
|
|
63
|
-
def create_ws_server(callback, ip_address, port):
|
|
64
|
-
host = "0.0.0.0" if is_colab() else ip_address
|
|
65
|
-
|
|
66
|
-
# Pass everything. websockets.serve ignores unknown kwargs.
|
|
67
|
-
conf = {
|
|
68
|
-
"host": host,
|
|
69
|
-
"port": port,
|
|
70
|
-
"origins": None,
|
|
71
|
-
"process_request": universal_process_request,
|
|
72
|
-
"create_connection": ColabWebSocketServerProtocol,
|
|
73
|
-
"create_protocol": ColabWebSocketServerProtocol
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
if is_colab():
|
|
77
|
-
with open(log_path, "a") as f:
|
|
78
|
-
f.write(f"Websocket startup: {host}:{port} | Mode: {'Legacy' if IS_LEGACY else 'Modern'}\n")
|
|
79
|
-
|
|
80
|
-
return websockets.serve(callback, **conf)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cubevis-1.0.57 → cubevis-1.0.62}/tests/manual/cubemask-demo/image-slider-spectra-done-stats.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|