@geode/opengeodeweb-front 10.34.0-rc.2 → 10.34.0-rc.21
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/.build/opengeodeweb_front_schemas.js +175 -0
- package/.build/server/utils/app_config.js +57 -0
- package/.build/server/utils/cleanup.js +135 -0
- package/.build/server/utils/cloud.js +156 -0
- package/.build/server/utils/microservices.js +153 -0
- package/.build/server/utils/path.js +108 -0
- package/.build/server/utils/scripts.js +134 -0
- package/.build/server/utils/server.js +44 -0
- package/.build/server/utils/server_config.js +51 -0
- package/.build/server/utils/stream.js +6 -0
- package/.build/server/utils/ws_client.js +100 -0
- package/.build/shared/app_mode.js +8 -0
- package/.build/shared/scripts.js +49 -0
- package/.build/shared/utils/call_raw.js +31 -0
- package/.build/shared/utils/call_schema.js +28 -0
- package/.build/shared/utils/fetch_raw.js +52 -0
- package/.build/shared/utils/fetch_schema.js +32 -0
- package/.build/shared/utils/file.js +14 -0
- package/.build/shared/utils/parse_boolean.js +23 -0
- package/.build/shared/utils/response_handlers/load.js +50 -0
- package/.build/shared/utils/types.js +1 -0
- package/.build/shared/utils/validate_schema.js +17 -0
- package/README.md +8 -0
- package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
- package/app/components/ActionButton.vue +28 -12
- package/app/components/Basic/Slider.vue +2 -2
- package/app/components/Basic/Switch.vue +2 -2
- package/app/components/CameraManager/List.vue +11 -11
- package/app/components/CameraManager/Saver.vue +8 -4
- package/app/components/CameraManager.vue +24 -12
- package/app/components/CameraOrientation.vue +31 -17
- package/app/components/ClippingPlaneCard.vue +13 -12
- package/app/components/ClippingPlanes.vue +31 -21
- package/app/components/CrsSelector.vue +26 -18
- package/app/components/DeleteDialog.vue +18 -16
- package/app/components/DragAndDrop.vue +55 -37
- package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
- package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
- package/app/components/ExtensionSelector.vue +34 -18
- package/app/components/FeedBack/ErrorBanner.vue +4 -3
- package/app/components/FeedBack/Snackers.vue +6 -5
- package/app/components/FetchingData.vue +8 -12
- package/app/components/FileSelector.vue +27 -17
- package/app/components/FileUploader.vue +51 -30
- package/app/components/GlassCard.vue +17 -13
- package/app/components/HybridRenderingView.vue +25 -12
- package/app/components/HybridViewerTooltip.vue +28 -26
- package/app/components/InfraConnected.vue +1 -1
- package/app/components/Launcher.vue +12 -10
- package/app/components/Loading/EcoMessages.vue +24 -13
- package/app/components/Loading/Header.vue +6 -7
- package/app/components/Loading/Progress.vue +6 -7
- package/app/components/Loading.vue +10 -14
- package/app/components/MissingFilesSelector.vue +35 -19
- package/app/components/ObjectSelector.vue +37 -21
- package/app/components/PackagesVersions.vue +16 -8
- package/app/components/Recaptcha.vue +17 -23
- package/app/components/RemoteRenderingView.vue +21 -15
- package/app/components/Ruler.vue +11 -9
- package/app/components/Screenshot.vue +25 -19
- package/app/components/SearchBar.vue +12 -6
- package/app/components/ShrinkFilter.vue +19 -14
- package/app/components/Step.vue +32 -12
- package/app/components/Stepper.vue +19 -7
- package/app/components/ToolPanel.vue +29 -13
- package/app/components/ViewToolbar.vue +53 -44
- package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
- package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
- package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
- package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
- package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
- package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
- package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
- package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
- package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
- package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
- package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
- package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
- package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
- package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
- package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
- package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
- package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
- package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
- package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
- package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
- package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
- package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
- package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
- package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
- package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
- package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
- package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
- package/app/components/Viewer/ObjectTree/Box.vue +32 -15
- package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
- package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
- package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
- package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
- package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
- package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
- package/app/components/Viewer/Options/ColorMapList.vue +52 -24
- package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
- package/app/components/Viewer/Options/ColorPicker.vue +239 -50
- package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
- package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
- package/app/components/Viewer/Options/OptionsSection.vue +7 -5
- package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
- package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
- package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
- package/app/components/Viewer/Options/TextureItem.vue +29 -22
- package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
- package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
- package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
- package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
- package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
- package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
- package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
- package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
- package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
- package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
- package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
- package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
- package/app/components/Viewer/Ui.vue +19 -14
- package/app/components/Wrapper.vue +16 -10
- package/app/components/ZScaling.vue +18 -10
- package/app/components/csv-preview/CsvPreviewer.vue +72 -50
- package/app/components/csv-preview/CsvSettings.vue +30 -50
- package/app/components/csv-preview/CsvTable.vue +34 -14
- package/app/composables/{batch_style.js → batch_style.ts} +9 -7
- package/app/composables/clipping_planes_widget.ts +204 -0
- package/app/composables/clipping_planes_widget_entries.ts +189 -0
- package/app/composables/copy_to_clipboard.ts +7 -0
- package/app/composables/global_attribute_style.ts +303 -0
- package/app/composables/hover_highlight.ts +127 -0
- package/app/composables/{model_collections.js → model_collections.ts} +28 -9
- package/app/composables/{model_components.js → model_components.ts} +28 -9
- package/app/composables/{project_manager.js → project_manager.ts} +77 -20
- package/app/composables/responsive_middle_truncate.ts +48 -0
- package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
- package/app/composables/stepper_tree.ts +79 -0
- package/app/composables/tree_filter.ts +194 -0
- package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
- package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
- package/app/composables/use_adaptive_styles.ts +186 -0
- package/app/composables/use_overlapping_picker.ts +263 -0
- package/app/composables/use_quick_colormap.ts +55 -0
- package/app/composables/virtual_tree.ts +271 -0
- package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
- package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
- package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
- package/app/stores/app.ts +252 -0
- package/app/stores/app_helpers/extension.ts +179 -0
- package/app/stores/{back.js → back.ts} +54 -28
- package/app/stores/camera_manager.ts +80 -0
- package/app/stores/{cloud.js → cloud.ts} +18 -13
- package/app/stores/data.ts +392 -0
- package/app/stores/data_helpers/collections.ts +138 -0
- package/app/stores/data_helpers/mesh.ts +169 -0
- package/app/stores/data_style.ts +167 -0
- package/app/stores/{feedback.js → feedback.ts} +19 -8
- package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
- package/app/stores/infra.ts +106 -0
- package/app/stores/{menu.js → menu.ts} +67 -36
- package/app/stores/treeview.ts +383 -0
- package/app/stores/{viewer.js → viewer.ts} +75 -42
- package/app/utils/attributes.ts +40 -0
- package/app/utils/clipping_planes.ts +222 -0
- package/app/utils/color_picker.js +54 -0
- package/app/utils/colormap.ts +102 -0
- package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
- package/app/utils/default_styles/{index.js → index.ts} +4 -3
- package/app/utils/default_styles/meshes.ts +264 -0
- package/app/utils/default_styles/{models.js → models.ts} +106 -52
- package/app/utils/{extension.js → extension.ts} +63 -19
- package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
- package/app/utils/{log.js → log.ts} +12 -2
- package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
- package/app/utils/status.ts +19 -0
- package/app/utils/{stores.js → stores.ts} +5 -5
- package/app/utils/{string.js → string.ts} +6 -6
- package/app/utils/{treeview.js → treeview.ts} +4 -1
- package/internal/database/{base_database.js → base_database.ts} +7 -3
- package/internal/database/database.ts +102 -0
- package/internal/database/{extended_database.js → extended_database.ts} +5 -1
- package/internal/database/tables/camera_positions.ts +6 -0
- package/internal/database/tables/{data.js → data.ts} +3 -1
- package/internal/database/tables/data_style.ts +6 -0
- package/internal/database/tables/model_component_datastyle.ts +6 -0
- package/internal/database/tables/model_component_type_datastyle.ts +6 -0
- package/internal/database/tables/model_components.ts +6 -0
- package/internal/database/tables/model_components_relation.ts +6 -0
- package/internal/database/tables/table_definition.ts +5 -0
- package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
- package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/cells/common.ts +50 -0
- package/internal/stores/data_style/mesh/cells/index.ts +161 -0
- package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
- package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/edges/common.ts +41 -0
- package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
- package/internal/stores/data_style/mesh/edges/index.ts +155 -0
- package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
- package/internal/stores/data_style/mesh/edges/width.ts +42 -0
- package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
- package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/points/common.ts +51 -0
- package/internal/stores/data_style/mesh/points/index.ts +133 -0
- package/internal/stores/data_style/mesh/points/size.ts +43 -0
- package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
- package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
- package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
- package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
- package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
- package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
- package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
- package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
- package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
- package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
- package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
- package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
- package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
- package/internal/stores/data_style/model/blocks/common.ts +67 -0
- package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
- package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
- package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
- package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
- package/internal/stores/data_style/model/color.ts +348 -0
- package/internal/stores/data_style/model/common.ts +262 -0
- package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
- package/internal/stores/data_style/model/corners/common.ts +71 -0
- package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
- package/internal/stores/data_style/model/corners/vertex.ts +315 -0
- package/internal/stores/data_style/model/corners/visibility.ts +39 -0
- package/internal/stores/data_style/model/edges/common.ts +29 -0
- package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
- package/internal/stores/data_style/model/edges/visibility.ts +55 -0
- package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
- package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/lines/common.ts +63 -0
- package/internal/stores/data_style/model/lines/edge.ts +343 -0
- package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
- package/internal/stores/data_style/model/lines/vertex.ts +344 -0
- package/internal/stores/data_style/model/lines/visibility.ts +37 -0
- package/internal/stores/data_style/model/points/common.ts +25 -0
- package/internal/stores/data_style/model/points/index.ts +35 -0
- package/internal/stores/data_style/model/points/size.ts +44 -0
- package/internal/stores/data_style/model/points/visibility.ts +46 -0
- package/internal/stores/data_style/model/selection.ts +138 -0
- package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
- package/internal/stores/data_style/model/surfaces/common.ts +69 -0
- package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
- package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
- package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
- package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
- package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
- package/internal/stores/data_style/state.ts +281 -0
- package/internal/stores/data_style/types.ts +30 -0
- package/internal/stores/hybrid_viewer/brightness.ts +124 -0
- package/internal/stores/hybrid_viewer/camera.ts +326 -0
- package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
- package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
- package/internal/stores/hybrid_viewer/core.ts +64 -0
- package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
- package/internal/stores/hybrid_viewer/highlight.ts +183 -0
- package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
- package/internal/stores/hybrid_viewer/scene.ts +125 -0
- package/internal/stores/hybrid_viewer/viewport.ts +177 -0
- package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
- package/internal/utils/api_fetch.ts +133 -0
- package/internal/utils/upload_file.ts +115 -0
- package/internal/utils/viewer_call.ts +99 -0
- package/internal/utils/ws_client.ts +54 -0
- package/nuxt.config.ts +168 -0
- package/opengeodeweb_front_schemas.json +2 -2
- package/package.json +49 -13
- package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
- package/server/api/local/app/project_folder_path.post.ts +33 -0
- package/server/api/local/app/run_back.post.ts +39 -0
- package/server/api/local/app/run_viewer.post.ts +39 -0
- package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
- package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
- package/server/api/local/extensions/upload.put.ts +71 -0
- package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
- package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
- package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
- package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
- package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
- package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
- package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
- package/server/api/serverless/run_cloud.post.ts +92 -0
- package/server/utils/{app_config.js → app_config.ts} +40 -18
- package/server/utils/{cleanup.js → cleanup.ts} +76 -29
- package/server/utils/{cloud.js → cloud.ts} +33 -17
- package/server/utils/{extension.js → extension.ts} +31 -4
- package/server/utils/{microservices.js → microservices.ts} +68 -27
- package/server/utils/{path.js → path.ts} +36 -17
- package/server/utils/{scripts.js → scripts.ts} +49 -33
- package/server/utils/{server.js → server.ts} +13 -6
- package/server/utils/server_config.ts +74 -0
- package/server/utils/stream.ts +6 -0
- package/server/utils/ws_client.ts +165 -0
- package/shared/{scripts.js → scripts.ts} +15 -10
- package/shared/utils/call_raw.ts +73 -0
- package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
- package/shared/utils/fetch_raw.ts +125 -0
- package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
- package/shared/utils/file.ts +22 -0
- package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
- package/shared/utils/response_handlers/load.ts +109 -0
- package/shared/utils/types.ts +27 -0
- package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
- package/.github/workflows/config.json +0 -5
- package/.github/workflows/deploy.yml +0 -15
- package/.github/workflows/manual_release.yml +0 -11
- package/.github/workflows/merge_request.yml +0 -9
- package/.github/workflows/pr_update.yml +0 -11
- package/.github/workflows/prepare_deploy.yml +0 -9
- package/.github/workflows/schedule.yml +0 -18
- package/.github/workflows/test.yml +0 -14
- package/.github/workflows/test_pr.yml +0 -12
- package/.oxlintrc.json +0 -150
- package/.releaserc +0 -11
- package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
- package/app/composables/clipping_planes_widget.js +0 -249
- package/app/composables/global_attribute_style.js +0 -181
- package/app/composables/hover_highlight.js +0 -91
- package/app/composables/responsive_middle_truncate.js +0 -34
- package/app/composables/stepper_tree.js +0 -56
- package/app/composables/tree_filter.js +0 -138
- package/app/composables/use_adaptive_styles.js +0 -120
- package/app/composables/use_overlapping_picker.js +0 -169
- package/app/composables/use_quick_colormap.js +0 -32
- package/app/composables/virtual_tree.js +0 -191
- package/app/stores/app.js +0 -326
- package/app/stores/camera_manager.js +0 -57
- package/app/stores/data.js +0 -278
- package/app/stores/data_helpers/collections.js +0 -96
- package/app/stores/data_helpers/mesh.js +0 -122
- package/app/stores/data_style.js +0 -116
- package/app/stores/infra.js +0 -95
- package/app/stores/treeview.js +0 -290
- package/app/utils/attributes.js +0 -23
- package/app/utils/clipping_planes.js +0 -110
- package/app/utils/colormap.js +0 -64
- package/app/utils/default_styles/meshes.js +0 -191
- package/app/utils/status.js +0 -10
- package/commitlint.config.js +0 -20
- package/internal/database/database.js +0 -80
- package/internal/database/tables/camera_positions.js +0 -4
- package/internal/database/tables/data_style.js +0 -4
- package/internal/database/tables/model_component_datastyle.js +0 -4
- package/internal/database/tables/model_component_type_datastyle.js +0 -4
- package/internal/database/tables/model_components.js +0 -4
- package/internal/database/tables/model_components_relation.js +0 -4
- package/internal/stores/data_style/mesh/cells/cell.js +0 -196
- package/internal/stores/data_style/mesh/cells/common.js +0 -39
- package/internal/stores/data_style/mesh/cells/index.js +0 -81
- package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
- package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
- package/internal/stores/data_style/mesh/edges/common.js +0 -32
- package/internal/stores/data_style/mesh/edges/edge.js +0 -195
- package/internal/stores/data_style/mesh/edges/index.js +0 -81
- package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
- package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
- package/internal/stores/data_style/mesh/edges/width.js +0 -34
- package/internal/stores/data_style/mesh/points/common.js +0 -37
- package/internal/stores/data_style/mesh/points/index.js +0 -82
- package/internal/stores/data_style/mesh/points/size.js +0 -35
- package/internal/stores/data_style/mesh/points/vertex.js +0 -193
- package/internal/stores/data_style/mesh/points/visibility.js +0 -37
- package/internal/stores/data_style/mesh/polygons/common.js +0 -32
- package/internal/stores/data_style/mesh/polygons/index.js +0 -107
- package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
- package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
- package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
- package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
- package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
- package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
- package/internal/stores/data_style/model/blocks/common.js +0 -51
- package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
- package/internal/stores/data_style/model/blocks/vertex.js +0 -204
- package/internal/stores/data_style/model/blocks/visibility.js +0 -20
- package/internal/stores/data_style/model/color.js +0 -218
- package/internal/stores/data_style/model/common.js +0 -141
- package/internal/stores/data_style/model/corners/common.js +0 -51
- package/internal/stores/data_style/model/corners/vertex.js +0 -204
- package/internal/stores/data_style/model/corners/visibility.js +0 -20
- package/internal/stores/data_style/model/edges/common.js +0 -20
- package/internal/stores/data_style/model/edges/visibility.js +0 -38
- package/internal/stores/data_style/model/lines/common.js +0 -51
- package/internal/stores/data_style/model/lines/edge.js +0 -203
- package/internal/stores/data_style/model/lines/vertex.js +0 -204
- package/internal/stores/data_style/model/lines/visibility.js +0 -20
- package/internal/stores/data_style/model/points/common.js +0 -20
- package/internal/stores/data_style/model/points/index.js +0 -25
- package/internal/stores/data_style/model/points/size.js +0 -36
- package/internal/stores/data_style/model/points/visibility.js +0 -36
- package/internal/stores/data_style/model/selection.js +0 -89
- package/internal/stores/data_style/model/surfaces/common.js +0 -51
- package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
- package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
- package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
- package/internal/stores/data_style/state.js +0 -197
- package/internal/stores/hybrid_viewer/brightness.js +0 -82
- package/internal/stores/hybrid_viewer/camera.js +0 -274
- package/internal/stores/hybrid_viewer/highlight.js +0 -170
- package/internal/stores/hybrid_viewer/scene.js +0 -136
- package/internal/stores/hybrid_viewer/viewport.js +0 -140
- package/internal/utils/api_fetch.js +0 -52
- package/internal/utils/upload_file.js +0 -57
- package/internal/utils/viewer_call.js +0 -49
- package/internal/utils/ws_client.js +0 -29
- package/nuxt.config.js +0 -106
- package/scripts/generate_geode_objects.js +0 -24
- package/server/api/local/app/project_folder_path.post.js +0 -29
- package/server/api/local/app/run_back.post.js +0 -33
- package/server/api/local/app/run_viewer.post.js +0 -33
- package/server/api/local/extensions/upload.put.js +0 -72
- package/server/api/microservice/app/set_app_base_url.post.js +0 -25
- package/server/api/microservice/app/set_back_base_url.post.js +0 -22
- package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
- package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
- package/server/api/serverless/run_cloud.post.js +0 -44
- package/server/utils/server_config.js +0 -58
- package/server/utils/ws_client.js +0 -112
- package/shared/utils/call_raw.js +0 -46
- package/shared/utils/fetch_raw.js +0 -61
- package/shared/utils/file.js +0 -16
- package/shared/utils/response_handlers/load.js +0 -74
- package/tests/integration/data/uploads/test.og_brep +0 -0
- package/tests/integration/data/uploads/test.og_edc2d +0 -0
- package/tests/integration/data/uploads/test.og_edc3d +0 -0
- package/tests/integration/data/uploads/test.og_psf3d +0 -0
- package/tests/integration/data/uploads/test.og_rgd2d +0 -0
- package/tests/integration/data/uploads/test.og_rgd3d +0 -0
- package/tests/integration/data/uploads/test.vtu +0 -22
- package/tests/integration/setup.js +0 -92
- package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
- package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
- package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
- package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
- package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
- package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
- package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
- package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
- package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
- package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
- package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
- package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
- package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
- package/tests/integration/stores/viewer.nuxt.test.js +0 -69
- package/tests/setup_indexeddb.js +0 -4
- package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
- package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
- package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
- package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
- package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
- package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
- package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
- package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
- package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
- package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
- package/tests/unit/components/Step.nuxt.test.js +0 -51
- package/tests/unit/components/Stepper.nuxt.test.js +0 -41
- package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
- package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
- package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
- package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
- package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
- package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
- package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
- package/tests/unit/stores/app.nuxt.test.js +0 -189
- package/tests/unit/stores/back.nuxt.test.js +0 -147
- package/tests/unit/stores/cloud.nuxt.test.js +0 -90
- package/tests/unit/stores/data.nuxt.test.js +0 -162
- package/tests/unit/stores/feedback.nuxt.test.js +0 -90
- package/tests/unit/stores/infra.nuxt.test.js +0 -313
- package/tests/unit/stores/treeview.nuxt.test.js +0 -63
- package/tests/unit/stores/viewer.nuxt.test.js +0 -161
- package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
- package/tests/utils.js +0 -20
- package/tests/vitest.config.js +0 -67
- /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
- /package/shared/{app_mode.js → app_mode.ts} +0 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
// Third party imports
|
|
2
|
+
import { WebSocket } from "ws";
|
|
3
|
+
import { v4 as uuidv4 } from "uuid";
|
|
4
|
+
|
|
5
|
+
// Local imports
|
|
6
|
+
|
|
7
|
+
const HELLO_ID = "system:hello";
|
|
8
|
+
const HELLO_SECRET = "wslink-secret";
|
|
9
|
+
|
|
10
|
+
interface PendingCall {
|
|
11
|
+
resolve: (value: unknown) => void;
|
|
12
|
+
reject: (reason?: unknown) => void;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface WsRpcMessage {
|
|
16
|
+
id?: string;
|
|
17
|
+
error?: { message?: string };
|
|
18
|
+
result?: unknown;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function isWsRpcMessage(value: unknown): value is WsRpcMessage {
|
|
22
|
+
return typeof value === "object" && value !== null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// oxlint-disable-next-line prefer-readonly-parameter-types
|
|
26
|
+
function rawDataToString(raw: WebSocket.RawData): string {
|
|
27
|
+
if (Buffer.isBuffer(raw)) {
|
|
28
|
+
return raw.toString();
|
|
29
|
+
}
|
|
30
|
+
if (Array.isArray(raw)) {
|
|
31
|
+
return Buffer.concat(raw).toString();
|
|
32
|
+
}
|
|
33
|
+
return Buffer.from(raw).toString();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
interface ServerWsRpcClient {
|
|
37
|
+
call: (rpc: string, params?: Record<string, unknown>) => Promise<unknown>;
|
|
38
|
+
close: () => void;
|
|
39
|
+
getConnection: () => {
|
|
40
|
+
getSession: () => {
|
|
41
|
+
call: (rpc: string, params: readonly [Record<string, unknown>]) => Promise<unknown>;
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
isOpen: () => boolean;
|
|
45
|
+
onConnectionClose: (callback: () => void) => void;
|
|
46
|
+
onConnectionError: (callback: (error: unknown) => void) => void;
|
|
47
|
+
ready: Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//oxlint-disable-next-line max-lines-per-function
|
|
51
|
+
function createServerWsRpcClient(baseUrl: string): ServerWsRpcClient {
|
|
52
|
+
const socket = new WebSocket(baseUrl);
|
|
53
|
+
const pending = new Map<string, PendingCall>();
|
|
54
|
+
let onCloseCallback: (() => void) | undefined = undefined;
|
|
55
|
+
let onErrorCallback: ((error: unknown) => void) | undefined = undefined;
|
|
56
|
+
|
|
57
|
+
//oxlint-disable-next-line promise/avoid-new max-lines-per-function
|
|
58
|
+
const ready = new Promise<void>((resolve, reject) => {
|
|
59
|
+
socket.on("open", () => {
|
|
60
|
+
socket.send(
|
|
61
|
+
JSON.stringify({
|
|
62
|
+
id: HELLO_ID,
|
|
63
|
+
method: "wslink.hello",
|
|
64
|
+
args: [{ secret: HELLO_SECRET }],
|
|
65
|
+
}),
|
|
66
|
+
);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// oxlint-disable-next-line prefer-readonly-parameter-types
|
|
70
|
+
socket.on("message", (raw: WebSocket.RawData) => {
|
|
71
|
+
let message: WsRpcMessage | undefined = undefined;
|
|
72
|
+
try {
|
|
73
|
+
const parsed: unknown = JSON.parse(rawDataToString(raw));
|
|
74
|
+
if (!isWsRpcMessage(parsed)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
message = parsed;
|
|
78
|
+
} catch {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (message.id === HELLO_ID) {
|
|
83
|
+
resolve();
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (typeof message.id === "string" && message.id.startsWith("publish:")) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const entry = message.id === undefined ? undefined : pending.get(message.id);
|
|
92
|
+
if (!entry || message.id === undefined) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
pending.delete(message.id);
|
|
96
|
+
if (message.error) {
|
|
97
|
+
entry.reject(new Error(message.error.message ?? "wslink RPC error"));
|
|
98
|
+
} else {
|
|
99
|
+
entry.resolve(message.result);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
socket.on("error", (error: Error) => {
|
|
104
|
+
onErrorCallback?.(error);
|
|
105
|
+
reject(error);
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
socket.on("close", () => {
|
|
109
|
+
onCloseCallback?.();
|
|
110
|
+
for (const { reject: rejectPending } of pending.values()) {
|
|
111
|
+
rejectPending(new Error("WebSocket closed"));
|
|
112
|
+
}
|
|
113
|
+
pending.clear();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
async function call(rpc: string, params: Record<string, unknown> = {}): Promise<unknown> {
|
|
118
|
+
await ready;
|
|
119
|
+
const id = uuidv4();
|
|
120
|
+
//oxlint-disable-next-line promise/avoid-new
|
|
121
|
+
return new Promise((resolve, reject) => {
|
|
122
|
+
pending.set(id, { resolve, reject });
|
|
123
|
+
socket.send(
|
|
124
|
+
JSON.stringify({
|
|
125
|
+
wslink: "1.0",
|
|
126
|
+
id,
|
|
127
|
+
method: rpc,
|
|
128
|
+
args: [params],
|
|
129
|
+
kwargs: { stream: true },
|
|
130
|
+
}),
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function close(): void {
|
|
136
|
+
socket.close();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function getConnection(): ReturnType<ServerWsRpcClient["getConnection"]> {
|
|
140
|
+
return {
|
|
141
|
+
getSession: () => ({
|
|
142
|
+
call: (rpc: string, [params]: readonly [Record<string, unknown>]) => call(rpc, params),
|
|
143
|
+
}),
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function isOpen(): boolean {
|
|
148
|
+
return socket.readyState === WebSocket.OPEN;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
//oxlint-disable-next-line promise/prefer-await-to-callbacks
|
|
152
|
+
function onConnectionClose(callback: () => void): void {
|
|
153
|
+
onCloseCallback = callback;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
//oxlint-disable-next-line promise/prefer-await-to-callbacks
|
|
157
|
+
function onConnectionError(callback: (error: unknown) => void): void {
|
|
158
|
+
onErrorCallback = callback;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
return { call, close, getConnection, isOpen, onConnectionClose, onConnectionError, ready };
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export { createServerWsRpcClient };
|
|
165
|
+
export type { ServerWsRpcClient };
|
|
@@ -7,38 +7,43 @@ import { fetchSchema } from "./utils/fetch_schema.js";
|
|
|
7
7
|
|
|
8
8
|
import opengeodeweb_front_schemas from "@geode/opengeodeweb-front/opengeodeweb_front_schemas.json" with { type: "json" };
|
|
9
9
|
|
|
10
|
-
function setAppBaseUrl(appBaseUrl) {
|
|
10
|
+
async function setAppBaseUrl(appBaseUrl: string): Promise<unknown> {
|
|
11
11
|
console.log("[API] setAppBaseUrl", appBaseUrl);
|
|
12
12
|
const schema = opengeodeweb_front_schemas.api.microservice.app.set_app_base_url;
|
|
13
13
|
const params = { baseUrl: appBaseUrl };
|
|
14
|
-
|
|
14
|
+
const result = await fetchSchema({ schema, params, baseURL: appBaseUrl });
|
|
15
|
+
return result;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
|
-
function setBackBaseUrl(appBaseUrl, backBaseUrl) {
|
|
18
|
+
async function setBackBaseUrl(appBaseUrl: string, backBaseUrl: string): Promise<unknown> {
|
|
18
19
|
console.log("[API] setBackBaseUrl", appBaseUrl, backBaseUrl);
|
|
19
20
|
const schema = opengeodeweb_front_schemas.api.microservice.app.set_back_base_url;
|
|
20
21
|
const params = { baseUrl: backBaseUrl };
|
|
21
|
-
|
|
22
|
+
const result = await fetchSchema({ schema, params, baseURL: appBaseUrl });
|
|
23
|
+
return result;
|
|
22
24
|
}
|
|
23
25
|
|
|
24
|
-
function setViewerBaseUrl(appBaseUrl, viewerBaseUrl) {
|
|
26
|
+
async function setViewerBaseUrl(appBaseUrl: string, viewerBaseUrl: string): Promise<unknown> {
|
|
25
27
|
console.log("[API] setViewerBaseUrl", appBaseUrl, viewerBaseUrl);
|
|
26
28
|
const schema = opengeodeweb_front_schemas.api.microservice.app.set_viewer_base_url;
|
|
27
29
|
const params = { baseUrl: viewerBaseUrl };
|
|
28
|
-
|
|
30
|
+
const result = await fetchSchema({ schema, params, baseURL: appBaseUrl });
|
|
31
|
+
return result;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
|
-
function setIsAppReady(appBaseUrl, isReady) {
|
|
34
|
+
async function setIsAppReady(appBaseUrl: string, isReady: boolean): Promise<unknown> {
|
|
32
35
|
console.log("[API] setIsAppReady", isReady);
|
|
33
36
|
const schema = opengeodeweb_front_schemas.api.microservice.app.set_is_app_ready;
|
|
34
37
|
const params = { isReady };
|
|
35
|
-
|
|
38
|
+
const result = await fetchSchema({ schema, params, baseURL: appBaseUrl });
|
|
39
|
+
return result;
|
|
36
40
|
}
|
|
37
41
|
|
|
38
|
-
function getIsAppReady(appBaseUrl) {
|
|
42
|
+
async function getIsAppReady(appBaseUrl: string): Promise<unknown> {
|
|
39
43
|
console.log("[API] getIsAppReady");
|
|
40
44
|
const schema = opengeodeweb_front_schemas.api.microservice.app.get_is_app_ready;
|
|
41
|
-
|
|
45
|
+
const result = await fetchSchema({ schema, baseURL: appBaseUrl });
|
|
46
|
+
return result;
|
|
42
47
|
}
|
|
43
48
|
|
|
44
49
|
export { getIsAppReady, setAppBaseUrl, setBackBaseUrl, setIsAppReady, setViewerBaseUrl };
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Third party imports
|
|
2
|
+
import _ from "lodash";
|
|
3
|
+
import pTimeout from "p-timeout";
|
|
4
|
+
|
|
5
|
+
// Local imports
|
|
6
|
+
import type { RequestHandlers } from "./types.js";
|
|
7
|
+
|
|
8
|
+
interface RpcSession {
|
|
9
|
+
readonly call: (rpc: string, params: readonly [Record<string, unknown>]) => Promise<unknown>;
|
|
10
|
+
}
|
|
11
|
+
interface RpcConnection {
|
|
12
|
+
readonly getSession: () => RpcSession;
|
|
13
|
+
}
|
|
14
|
+
interface RpcClient {
|
|
15
|
+
readonly call: (rpc: string, params: Record<string, unknown>) => Promise<unknown>;
|
|
16
|
+
readonly getConnection: () => RpcConnection;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface CallClientOptions {
|
|
20
|
+
rpc: string;
|
|
21
|
+
params?: Record<string, unknown>;
|
|
22
|
+
client: RpcClient;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface CallRawOptions extends CallClientOptions {
|
|
26
|
+
timeout?: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async function callClient({ rpc, params = {}, client }: CallClientOptions): Promise<unknown> {
|
|
30
|
+
if (globalThis.window !== undefined) {
|
|
31
|
+
const response = await client.getConnection().getSession().call(rpc, [params]);
|
|
32
|
+
return response;
|
|
33
|
+
}
|
|
34
|
+
const response = await client.call(rpc, params);
|
|
35
|
+
return response;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function callRaw(
|
|
39
|
+
{ rpc, params = {}, client, timeout }: CallRawOptions,
|
|
40
|
+
{ request_error_function, response_function, response_error_function }: RequestHandlers = {},
|
|
41
|
+
): Promise<unknown> {
|
|
42
|
+
async function performCall(): Promise<unknown> {
|
|
43
|
+
try {
|
|
44
|
+
const response = await callClient({ rpc, params, client });
|
|
45
|
+
if (response_function) {
|
|
46
|
+
await response_function(response);
|
|
47
|
+
}
|
|
48
|
+
return response;
|
|
49
|
+
} catch (error) {
|
|
50
|
+
if (request_error_function) {
|
|
51
|
+
request_error_function(error);
|
|
52
|
+
}
|
|
53
|
+
if (response_error_function) {
|
|
54
|
+
response_error_function(error);
|
|
55
|
+
}
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (timeout !== undefined && timeout > 0) {
|
|
61
|
+
const result = await pTimeout(performCall(), {
|
|
62
|
+
milliseconds: timeout,
|
|
63
|
+
message: `${rpc}: Timed out after ${timeout}ms`,
|
|
64
|
+
});
|
|
65
|
+
return result;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const result = await performCall();
|
|
69
|
+
return result;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export { callRaw };
|
|
73
|
+
export type { RpcClient };
|
|
@@ -1,20 +1,28 @@
|
|
|
1
1
|
// Third party imports
|
|
2
2
|
|
|
3
3
|
// Local imports
|
|
4
|
-
import {
|
|
4
|
+
import type { JsonRpcSchema, RequestHandlersWithValidation } from "./types.js";
|
|
5
|
+
import { type RpcClient, callRaw } from "./call_raw.js";
|
|
5
6
|
import { validateSchema } from "./validate_schema.js";
|
|
6
7
|
|
|
7
8
|
const ERROR_400 = 400;
|
|
8
9
|
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
interface CallSchemaOptions {
|
|
11
|
+
schema: JsonRpcSchema;
|
|
12
|
+
params?: Record<string, unknown>;
|
|
13
|
+
client: RpcClient;
|
|
14
|
+
timeout?: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function callSchema(
|
|
18
|
+
{ schema, params = {}, client, timeout }: CallSchemaOptions,
|
|
11
19
|
{
|
|
12
20
|
request_error_function,
|
|
13
21
|
response_function,
|
|
14
22
|
response_error_function,
|
|
15
23
|
validation_error_function,
|
|
16
|
-
} = {},
|
|
17
|
-
) {
|
|
24
|
+
}: RequestHandlersWithValidation = {},
|
|
25
|
+
): Promise<unknown> {
|
|
18
26
|
const { valid, error: schema_error } = validateSchema(schema, params);
|
|
19
27
|
|
|
20
28
|
if (!valid) {
|
|
@@ -27,7 +35,7 @@ function callSchema(
|
|
|
27
35
|
throw new Error(`${schema.$id}: ${schema_error}`);
|
|
28
36
|
}
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
const result = await callRaw(
|
|
31
39
|
{
|
|
32
40
|
rpc: schema.$id,
|
|
33
41
|
params,
|
|
@@ -40,6 +48,7 @@ function callSchema(
|
|
|
40
48
|
response_error_function,
|
|
41
49
|
},
|
|
42
50
|
);
|
|
51
|
+
return result;
|
|
43
52
|
}
|
|
44
53
|
|
|
45
54
|
export { callSchema };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Third party imports
|
|
2
|
+
import { $fetch } from "ofetch";
|
|
3
|
+
import _ from "lodash";
|
|
4
|
+
import pTimeout from "p-timeout";
|
|
5
|
+
|
|
6
|
+
// Local imports
|
|
7
|
+
import type { RequestHandlers } from "./types.js";
|
|
8
|
+
import { hasBody } from "./file.js";
|
|
9
|
+
|
|
10
|
+
interface FetchRawOptions {
|
|
11
|
+
route: string;
|
|
12
|
+
method?: string;
|
|
13
|
+
params?: unknown;
|
|
14
|
+
baseURL?: string;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
max_retry?: number;
|
|
17
|
+
timeout?: number;
|
|
18
|
+
expectEvent?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function resolveHeaders(
|
|
22
|
+
headers: Record<string, string>,
|
|
23
|
+
expectEvent: boolean,
|
|
24
|
+
): Record<string, string> {
|
|
25
|
+
const resolvedHeaders: Record<string, string> = { ...headers };
|
|
26
|
+
if (expectEvent) {
|
|
27
|
+
const value = "text/event-stream";
|
|
28
|
+
if (_.isEmpty(resolvedHeaders)) {
|
|
29
|
+
resolvedHeaders.Accept = value;
|
|
30
|
+
} else {
|
|
31
|
+
resolvedHeaders.Accept = `${resolvedHeaders.Accept}, ${value}`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return resolvedHeaders;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface PerformFetchOptions extends RequestHandlers {
|
|
38
|
+
route: string;
|
|
39
|
+
method?: string;
|
|
40
|
+
params?: unknown;
|
|
41
|
+
baseURL?: string;
|
|
42
|
+
headers: Record<string, string>;
|
|
43
|
+
max_retry?: number;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async function performFetch({
|
|
47
|
+
route,
|
|
48
|
+
method,
|
|
49
|
+
params,
|
|
50
|
+
baseURL,
|
|
51
|
+
headers,
|
|
52
|
+
max_retry,
|
|
53
|
+
request_error_function,
|
|
54
|
+
response_function,
|
|
55
|
+
response_error_function,
|
|
56
|
+
}: PerformFetchOptions): Promise<unknown> {
|
|
57
|
+
const fetchResult = await $fetch<unknown>(route, {
|
|
58
|
+
baseURL,
|
|
59
|
+
method,
|
|
60
|
+
headers,
|
|
61
|
+
...(hasBody(params) ? { body: params } : {}),
|
|
62
|
+
...(max_retry === undefined ? {} : { retry: max_retry }),
|
|
63
|
+
async onRequestError({ error }: { error: unknown }) {
|
|
64
|
+
if (request_error_function) {
|
|
65
|
+
await request_error_function(error);
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
async onResponse({
|
|
69
|
+
response,
|
|
70
|
+
}: {
|
|
71
|
+
// oxlint-disable-next-line eslint/id-length -- mirrors the real ofetch/vitest API field name (`ok`/`fn`)
|
|
72
|
+
response: { ok: boolean; _data?: unknown };
|
|
73
|
+
}) {
|
|
74
|
+
if (response.ok && response_function) {
|
|
75
|
+
// Ofetch awaits whatever this hook returns; without awaiting here, callers relying on
|
|
76
|
+
// An async response_function (e.g. store patches) race the resolution of this $fetch call.
|
|
77
|
+
await response_function(response._data);
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
async onResponseError({ response }: { response: unknown }) {
|
|
81
|
+
if (response_error_function) {
|
|
82
|
+
await response_error_function(response);
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
return fetchResult;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function fetchRaw(
|
|
90
|
+
{
|
|
91
|
+
route,
|
|
92
|
+
method,
|
|
93
|
+
params = {},
|
|
94
|
+
baseURL,
|
|
95
|
+
headers = {},
|
|
96
|
+
max_retry,
|
|
97
|
+
timeout,
|
|
98
|
+
expectEvent = false,
|
|
99
|
+
}: FetchRawOptions,
|
|
100
|
+
{ request_error_function, response_function, response_error_function }: RequestHandlers = {},
|
|
101
|
+
): Promise<unknown> {
|
|
102
|
+
const fetchOptions: PerformFetchOptions = {
|
|
103
|
+
route,
|
|
104
|
+
method,
|
|
105
|
+
params,
|
|
106
|
+
baseURL,
|
|
107
|
+
headers: resolveHeaders(headers, expectEvent),
|
|
108
|
+
max_retry,
|
|
109
|
+
request_error_function,
|
|
110
|
+
response_function,
|
|
111
|
+
response_error_function,
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
if (timeout !== undefined && timeout > 0) {
|
|
115
|
+
const result = await pTimeout(performFetch(fetchOptions), {
|
|
116
|
+
milliseconds: timeout,
|
|
117
|
+
message: `${route}: Timed out after ${timeout}ms`,
|
|
118
|
+
});
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
const result = await performFetch(fetchOptions);
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export { fetchRaw };
|
|
@@ -1,20 +1,28 @@
|
|
|
1
|
-
// Third party imports
|
|
2
|
-
|
|
3
1
|
// Local imports
|
|
2
|
+
import type { JsonRpcSchema, RequestHandlersWithValidation } from "./types.js";
|
|
4
3
|
import { fetchRaw } from "./fetch_raw.js";
|
|
5
4
|
import { validateSchema } from "./validate_schema.js";
|
|
6
5
|
|
|
7
6
|
const ERROR_400 = 400;
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
interface FetchSchemaOptions {
|
|
9
|
+
schema: JsonRpcSchema & { methods: readonly string[] };
|
|
10
|
+
params?: unknown;
|
|
11
|
+
baseURL?: string;
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
timeout?: number;
|
|
14
|
+
expectEvent?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
async function fetchSchema(
|
|
18
|
+
{ schema, params = {}, baseURL, headers, timeout, expectEvent = false }: FetchSchemaOptions,
|
|
11
19
|
{
|
|
12
20
|
request_error_function,
|
|
13
21
|
response_function,
|
|
14
22
|
response_error_function,
|
|
15
23
|
validation_error_function,
|
|
16
|
-
} = {},
|
|
17
|
-
) {
|
|
24
|
+
}: RequestHandlersWithValidation = {},
|
|
25
|
+
): Promise<unknown> {
|
|
18
26
|
const { valid, error: schema_error } = validateSchema(schema, params);
|
|
19
27
|
|
|
20
28
|
if (!valid) {
|
|
@@ -27,7 +35,7 @@ function fetchSchema(
|
|
|
27
35
|
throw new Error(`${schema.$id}: ${schema_error}`);
|
|
28
36
|
}
|
|
29
37
|
|
|
30
|
-
|
|
38
|
+
const result = await fetchRaw(
|
|
31
39
|
{
|
|
32
40
|
route: schema.$id,
|
|
33
41
|
method: schema.methods.find((method) => method !== "OPTIONS"),
|
|
@@ -44,6 +52,7 @@ function fetchSchema(
|
|
|
44
52
|
response_error_function,
|
|
45
53
|
},
|
|
46
54
|
);
|
|
55
|
+
return result;
|
|
47
56
|
}
|
|
48
57
|
|
|
49
58
|
export { fetchSchema };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import _ from "lodash";
|
|
2
|
+
|
|
3
|
+
const BYTES_PER_KIBIBYTE = 1024;
|
|
4
|
+
const KIBIBYTES_PER_MEBIBYTE = 1024;
|
|
5
|
+
const CHUNK_SIZE_MEBIBYTES = 8;
|
|
6
|
+
// Cloud hosting in front of the upload routes (Cloud Run/Firebase Hosting) enforces a hard ~32MB request body limit that no amount of server-side streaming can bypass, so uploads are always split into chunks comfortably under that cap. The single source of truth here keeps every uploader (OpenGeodeWeb-Front, Vease) and the routes that assemble the chunks in agreement.
|
|
7
|
+
const CHUNK_SIZE_BYTES = CHUNK_SIZE_MEBIBYTES * KIBIBYTES_PER_MEBIBYTE * BYTES_PER_KIBIBYTE;
|
|
8
|
+
|
|
9
|
+
function assertFile(file: unknown): asserts file is File {
|
|
10
|
+
console.log("[ASSERT_FILE] Asserting file", { file });
|
|
11
|
+
if (!(file instanceof File)) {
|
|
12
|
+
throw new Error("file must be an instance of File");
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function hasBody(params: unknown): params is Blob | FormData | Record<string, unknown> {
|
|
17
|
+
if (params instanceof FormData || params instanceof Blob) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
20
|
+
return !_.isEmpty(params);
|
|
21
|
+
}
|
|
22
|
+
export { assertFile, BYTES_PER_KIBIBYTE, CHUNK_SIZE_BYTES, hasBody };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const TRUTHY_VALUES = new Set([true, 1, "1", "true", "yes"]);
|
|
2
2
|
const FALSY_VALUES = new Set([false, 0, "0", "false", "no"]);
|
|
3
3
|
|
|
4
|
-
function parseBoolean(value) {
|
|
4
|
+
function parseBoolean(value: string | number | boolean): boolean {
|
|
5
5
|
const normalized = typeof value === "string" ? value.trim().toLowerCase() : value;
|
|
6
6
|
|
|
7
7
|
if (TRUTHY_VALUES.has(normalized)) {
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
interface AllowedObject {
|
|
2
|
+
readonly is_loadable: number;
|
|
3
|
+
readonly object_priority?: number;
|
|
4
|
+
}
|
|
5
|
+
type AllowedObjectMap = Record<string, AllowedObject>;
|
|
6
|
+
|
|
7
|
+
function getFileExtension(filename: string): string {
|
|
8
|
+
return filename.slice(filename.lastIndexOf(".") + 1);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function getObject(objectMap: AllowedObjectMap, key: string): AllowedObject {
|
|
12
|
+
const object = objectMap[key];
|
|
13
|
+
if (!object) {
|
|
14
|
+
throw new Error(`Unknown geode object key: ${key}`);
|
|
15
|
+
}
|
|
16
|
+
return object;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function selectGeodeObject(objectMap: AllowedObjectMap): string | undefined {
|
|
20
|
+
const objectKeys = Object.keys(objectMap);
|
|
21
|
+
if (objectKeys.length === 0) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
const [firstKey] = objectKeys;
|
|
25
|
+
if (
|
|
26
|
+
objectKeys.length === 1 &&
|
|
27
|
+
firstKey !== undefined &&
|
|
28
|
+
getObject(objectMap, firstKey).is_loadable > 0
|
|
29
|
+
) {
|
|
30
|
+
return firstKey;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const highestLoadScore = Math.max(
|
|
34
|
+
...objectKeys.map((key) => getObject(objectMap, key).is_loadable),
|
|
35
|
+
);
|
|
36
|
+
if (highestLoadScore <= 0) {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const bestScoreObjects = objectKeys.filter(
|
|
41
|
+
(key) => getObject(objectMap, key).is_loadable === highestLoadScore,
|
|
42
|
+
);
|
|
43
|
+
if (bestScoreObjects.length === 1) {
|
|
44
|
+
return bestScoreObjects[0];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const highestPriority = Math.max(
|
|
48
|
+
...bestScoreObjects.map((key) => getObject(objectMap, key).object_priority ?? -Infinity),
|
|
49
|
+
);
|
|
50
|
+
const bestPriorityObjects = bestScoreObjects.filter(
|
|
51
|
+
(key) => getObject(objectMap, key).object_priority === highestPriority,
|
|
52
|
+
);
|
|
53
|
+
if (highestPriority !== -Infinity && bestPriorityObjects.length === 1) {
|
|
54
|
+
return bestPriorityObjects[0];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function intersectAllowedObjects(allowedObjectsList: readonly AllowedObjectMap[]): {
|
|
61
|
+
commonKeys: string[];
|
|
62
|
+
allKeys: string[];
|
|
63
|
+
mergedAllowedObjects: AllowedObjectMap;
|
|
64
|
+
} {
|
|
65
|
+
const allKeys = [...new Set(allowedObjectsList.flatMap((object) => Object.keys(object)))];
|
|
66
|
+
const commonKeys = allKeys.filter((key) => allowedObjectsList.every((object) => key in object));
|
|
67
|
+
|
|
68
|
+
const mergedEntries = commonKeys.map((key): [string, AllowedObject] => {
|
|
69
|
+
const loadScores = allowedObjectsList.map((object) => getObject(object, key).is_loadable);
|
|
70
|
+
const priorities = allowedObjectsList
|
|
71
|
+
.map((object) => getObject(object, key).object_priority)
|
|
72
|
+
.filter((priority): priority is number => priority !== undefined);
|
|
73
|
+
|
|
74
|
+
if (priorities.length > 0) {
|
|
75
|
+
return [
|
|
76
|
+
key,
|
|
77
|
+
{ is_loadable: Math.min(...loadScores), object_priority: Math.max(...priorities) },
|
|
78
|
+
];
|
|
79
|
+
}
|
|
80
|
+
return [key, { is_loadable: Math.min(...loadScores) }];
|
|
81
|
+
});
|
|
82
|
+
const mergedAllowedObjects: AllowedObjectMap = Object.fromEntries(mergedEntries);
|
|
83
|
+
|
|
84
|
+
return { commonKeys, allKeys, mergedAllowedObjects };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function resolveAllowedObjects(
|
|
88
|
+
filenames: readonly string[],
|
|
89
|
+
allowedObjectsList: readonly AllowedObjectMap[],
|
|
90
|
+
): {
|
|
91
|
+
mergedAllowedObjects: AllowedObjectMap;
|
|
92
|
+
multipleFilesNoCommon: boolean;
|
|
93
|
+
selectedGeodeObject: string | undefined;
|
|
94
|
+
} {
|
|
95
|
+
const { commonKeys, allKeys, mergedAllowedObjects } = intersectAllowedObjects(allowedObjectsList);
|
|
96
|
+
|
|
97
|
+
const multipleFilesNoCommon =
|
|
98
|
+
filenames.length > 1 && allKeys.length > 0 && commonKeys.length === 0;
|
|
99
|
+
|
|
100
|
+
const selectedGeodeObject = selectGeodeObject(mergedAllowedObjects);
|
|
101
|
+
|
|
102
|
+
return {
|
|
103
|
+
mergedAllowedObjects,
|
|
104
|
+
multipleFilesNoCommon,
|
|
105
|
+
selectedGeodeObject,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export { resolveAllowedObjects, getFileExtension };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Covers both flavors of schema used across this codebase: HTTP ("front") schemas carry a `methods` array, websocket RPC ("viewer"/"back") schemas carry `rpc` instead. Neither field is required here since call sites that need one specifically (e.g. fetchSchema needing `methods`) narrow it themselves.
|
|
2
|
+
interface JsonRpcSchema {
|
|
3
|
+
readonly $id: string;
|
|
4
|
+
readonly methods?: readonly string[];
|
|
5
|
+
readonly rpc?: string;
|
|
6
|
+
readonly max_retry?: number;
|
|
7
|
+
readonly [key: string]: unknown;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
interface ValidationError {
|
|
11
|
+
code: number;
|
|
12
|
+
name: string;
|
|
13
|
+
error: string | null | undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface RequestHandlers {
|
|
17
|
+
readonly request_error_function?: (error: unknown) => void | Promise<void>;
|
|
18
|
+
// Return value is intentionally untyped: callers commonly return the Promise of a downstream call (e.g. a Dexie `.put()`, which resolves to a primary key) that this code chains/awaits but never inspects the resolved value of.
|
|
19
|
+
readonly response_function?: (response: unknown) => unknown;
|
|
20
|
+
readonly response_error_function?: (response: unknown) => void | Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface RequestHandlersWithValidation extends RequestHandlers {
|
|
24
|
+
readonly validation_error_function?: (error: ValidationError) => void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export type { JsonRpcSchema, RequestHandlers, RequestHandlersWithValidation, ValidationError };
|