@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.
Files changed (499) hide show
  1. package/.build/opengeodeweb_front_schemas.js +175 -0
  2. package/.build/server/utils/app_config.js +57 -0
  3. package/.build/server/utils/cleanup.js +135 -0
  4. package/.build/server/utils/cloud.js +156 -0
  5. package/.build/server/utils/microservices.js +153 -0
  6. package/.build/server/utils/path.js +108 -0
  7. package/.build/server/utils/scripts.js +134 -0
  8. package/.build/server/utils/server.js +44 -0
  9. package/.build/server/utils/server_config.js +51 -0
  10. package/.build/server/utils/stream.js +6 -0
  11. package/.build/server/utils/ws_client.js +100 -0
  12. package/.build/shared/app_mode.js +8 -0
  13. package/.build/shared/scripts.js +49 -0
  14. package/.build/shared/utils/call_raw.js +31 -0
  15. package/.build/shared/utils/call_schema.js +28 -0
  16. package/.build/shared/utils/fetch_raw.js +52 -0
  17. package/.build/shared/utils/fetch_schema.js +32 -0
  18. package/.build/shared/utils/file.js +14 -0
  19. package/.build/shared/utils/parse_boolean.js +23 -0
  20. package/.build/shared/utils/response_handlers/load.js +50 -0
  21. package/.build/shared/utils/types.js +1 -0
  22. package/.build/shared/utils/validate_schema.js +17 -0
  23. package/README.md +8 -0
  24. package/app/assets/{geode_objects.js → geode_objects.ts} +8 -1
  25. package/app/components/ActionButton.vue +28 -12
  26. package/app/components/Basic/Slider.vue +2 -2
  27. package/app/components/Basic/Switch.vue +2 -2
  28. package/app/components/CameraManager/List.vue +11 -11
  29. package/app/components/CameraManager/Saver.vue +8 -4
  30. package/app/components/CameraManager.vue +24 -12
  31. package/app/components/CameraOrientation.vue +31 -17
  32. package/app/components/ClippingPlaneCard.vue +13 -12
  33. package/app/components/ClippingPlanes.vue +31 -21
  34. package/app/components/CrsSelector.vue +26 -18
  35. package/app/components/DeleteDialog.vue +18 -16
  36. package/app/components/DragAndDrop.vue +55 -37
  37. package/app/components/DragAndDropInternal/DragAndDropInline.vue +31 -16
  38. package/app/components/DragAndDropInternal/DragAndDropOverlay.vue +32 -19
  39. package/app/components/ExtensionSelector.vue +34 -18
  40. package/app/components/FeedBack/ErrorBanner.vue +4 -3
  41. package/app/components/FeedBack/Snackers.vue +6 -5
  42. package/app/components/FetchingData.vue +8 -12
  43. package/app/components/FileSelector.vue +27 -17
  44. package/app/components/FileUploader.vue +51 -30
  45. package/app/components/GlassCard.vue +17 -13
  46. package/app/components/HybridRenderingView.vue +25 -12
  47. package/app/components/HybridViewerTooltip.vue +28 -26
  48. package/app/components/InfraConnected.vue +1 -1
  49. package/app/components/Launcher.vue +12 -10
  50. package/app/components/Loading/EcoMessages.vue +24 -13
  51. package/app/components/Loading/Header.vue +6 -7
  52. package/app/components/Loading/Progress.vue +6 -7
  53. package/app/components/Loading.vue +10 -14
  54. package/app/components/MissingFilesSelector.vue +35 -19
  55. package/app/components/ObjectSelector.vue +37 -21
  56. package/app/components/PackagesVersions.vue +16 -8
  57. package/app/components/Recaptcha.vue +17 -23
  58. package/app/components/RemoteRenderingView.vue +21 -15
  59. package/app/components/Ruler.vue +11 -9
  60. package/app/components/Screenshot.vue +25 -19
  61. package/app/components/SearchBar.vue +12 -6
  62. package/app/components/ShrinkFilter.vue +19 -14
  63. package/app/components/Step.vue +32 -12
  64. package/app/components/Stepper.vue +19 -7
  65. package/app/components/ToolPanel.vue +29 -13
  66. package/app/components/ViewToolbar.vue +53 -44
  67. package/app/components/Viewer/ContextMenu/CenterButton.vue +16 -9
  68. package/app/components/Viewer/ContextMenu/CircularItems.vue +13 -10
  69. package/app/components/Viewer/ContextMenu/ContextMenu.vue +40 -32
  70. package/app/components/Viewer/ContextMenu/ContextMenuItem.vue +31 -17
  71. package/app/components/Viewer/ContextMenu/InfoCard.vue +38 -22
  72. package/app/components/Viewer/EdgedCurve/PointsOptions.vue +8 -5
  73. package/app/components/Viewer/EdgedCurve/SpecificEdgesOptions.vue +67 -48
  74. package/app/components/Viewer/Generic/Mesh/CellsOptions.vue +74 -50
  75. package/app/components/Viewer/Generic/Mesh/EdgesOptions.vue +69 -50
  76. package/app/components/Viewer/Generic/Mesh/PointsOptions.vue +47 -35
  77. package/app/components/Viewer/Generic/Mesh/PolygonsOptions.vue +91 -51
  78. package/app/components/Viewer/Generic/Mesh/PolyhedraOptions.vue +74 -49
  79. package/app/components/Viewer/Generic/Model/BlocksOptions.vue +115 -53
  80. package/app/components/Viewer/Generic/Model/CornersOptions.vue +75 -37
  81. package/app/components/Viewer/Generic/Model/EdgesOptions.vue +13 -9
  82. package/app/components/Viewer/Generic/Model/LinesOptions.vue +110 -61
  83. package/app/components/Viewer/Generic/Model/ModelStyleCard.vue +32 -21
  84. package/app/components/Viewer/Generic/Model/ModelStyleOptions.vue +9 -5
  85. package/app/components/Viewer/Generic/Model/PointsOptions.vue +19 -13
  86. package/app/components/Viewer/Generic/Model/SurfacesOptions.vue +119 -49
  87. package/app/components/Viewer/Grid/2D/CellsOptions.vue +8 -5
  88. package/app/components/Viewer/Grid/2D/EdgesOptions.vue +8 -5
  89. package/app/components/Viewer/Grid/2D/PointsOptions.vue +8 -5
  90. package/app/components/Viewer/Grid/3D/CellsOptions.vue +8 -5
  91. package/app/components/Viewer/Grid/3D/EdgesOptions.vue +8 -5
  92. package/app/components/Viewer/Grid/3D/FacetsOptions.vue +8 -5
  93. package/app/components/Viewer/Grid/3D/PointsOptions.vue +8 -5
  94. package/app/components/Viewer/ObjectTree/Base/CommonTreeView.vue +120 -76
  95. package/app/components/Viewer/ObjectTree/Base/Controls.vue +25 -10
  96. package/app/components/Viewer/ObjectTree/Base/ItemLabel.vue +42 -17
  97. package/app/components/Viewer/ObjectTree/Base/StickyHeader.vue +22 -9
  98. package/app/components/Viewer/ObjectTree/Base/TreeRow.vue +29 -14
  99. package/app/components/Viewer/ObjectTree/Box.vue +32 -15
  100. package/app/components/Viewer/ObjectTree/Layout.vue +55 -35
  101. package/app/components/Viewer/ObjectTree/Views/GlobalObjects.vue +63 -34
  102. package/app/components/Viewer/ObjectTree/Views/{ModelCollections.vue → ModelTree.vue} +101 -39
  103. package/app/components/Viewer/Options/AttributeColorBar.vue +14 -6
  104. package/app/components/Viewer/Options/AttributeRangeSelector.vue +8 -4
  105. package/app/components/Viewer/Options/AttributeSelector.vue +64 -33
  106. package/app/components/Viewer/Options/ColorMapList.vue +52 -24
  107. package/app/components/Viewer/Options/ColorMapPicker.vue +15 -11
  108. package/app/components/Viewer/Options/ColorPicker.vue +239 -50
  109. package/app/components/Viewer/Options/ColoringTypeSelector.vue +87 -67
  110. package/app/components/Viewer/Options/ColormapQuickPicker.vue +16 -12
  111. package/app/components/Viewer/Options/OptionsSection.vue +7 -5
  112. package/app/components/Viewer/Options/Sliders/Size.vue +3 -3
  113. package/app/components/Viewer/Options/Sliders/Slider.vue +9 -6
  114. package/app/components/Viewer/Options/Sliders/Width.vue +3 -3
  115. package/app/components/Viewer/Options/TextureItem.vue +29 -22
  116. package/app/components/Viewer/Options/TexturesSelector.vue +23 -12
  117. package/app/components/Viewer/Options/VisibilitySwitch.vue +3 -3
  118. package/app/components/Viewer/OverlappingObjectsPicker.vue +27 -12
  119. package/app/components/Viewer/PointSet/SpecificPointsOptions.vue +38 -26
  120. package/app/components/Viewer/Solid/EdgesOptions.vue +8 -5
  121. package/app/components/Viewer/Solid/PointsOptions.vue +8 -5
  122. package/app/components/Viewer/Solid/PolygonsOptions.vue +8 -5
  123. package/app/components/Viewer/Solid/SpecificPolyhedraOptions.vue +73 -48
  124. package/app/components/Viewer/Surface/EdgesOptions.vue +8 -5
  125. package/app/components/Viewer/Surface/PointsOptions.vue +8 -5
  126. package/app/components/Viewer/Surface/PolygonsOptions.vue +79 -49
  127. package/app/components/Viewer/Surface/Triangulated/TrianglesOptions.vue +8 -5
  128. package/app/components/Viewer/TetrahedralSolid/TetrahedraOptions.vue +8 -5
  129. package/app/components/Viewer/TetrahedralSolid/TrianglesOptions.vue +8 -5
  130. package/app/components/Viewer/Ui.vue +19 -14
  131. package/app/components/Wrapper.vue +16 -10
  132. package/app/components/ZScaling.vue +18 -10
  133. package/app/components/csv-preview/CsvPreviewer.vue +72 -50
  134. package/app/components/csv-preview/CsvSettings.vue +30 -50
  135. package/app/components/csv-preview/CsvTable.vue +34 -14
  136. package/app/composables/{batch_style.js → batch_style.ts} +9 -7
  137. package/app/composables/clipping_planes_widget.ts +204 -0
  138. package/app/composables/clipping_planes_widget_entries.ts +189 -0
  139. package/app/composables/copy_to_clipboard.ts +7 -0
  140. package/app/composables/global_attribute_style.ts +303 -0
  141. package/app/composables/hover_highlight.ts +127 -0
  142. package/app/composables/{model_collections.js → model_collections.ts} +28 -9
  143. package/app/composables/{model_components.js → model_components.ts} +28 -9
  144. package/app/composables/{project_manager.js → project_manager.ts} +77 -20
  145. package/app/composables/responsive_middle_truncate.ts +48 -0
  146. package/app/composables/{run_function_when_microservices_connected.js → run_function_when_microservices_connected.ts} +1 -1
  147. package/app/composables/stepper_tree.ts +79 -0
  148. package/app/composables/tree_filter.ts +194 -0
  149. package/app/composables/{tree_keyboard_nav.js → tree_keyboard_nav.ts} +62 -20
  150. package/app/composables/{tree_scroll.js → tree_scroll.ts} +61 -12
  151. package/app/composables/use_adaptive_styles.ts +186 -0
  152. package/app/composables/use_overlapping_picker.ts +263 -0
  153. package/app/composables/use_quick_colormap.ts +55 -0
  154. package/app/composables/virtual_tree.ts +271 -0
  155. package/app/composables/vtk_implicit_plane_widget.d.ts +2 -0
  156. package/app/plugins/{auto_store_register.js → auto_store_register.ts} +3 -5
  157. package/app/plugins/click_outside_ignore_snackbars.client.ts +36 -0
  158. package/app/stores/app.ts +252 -0
  159. package/app/stores/app_helpers/extension.ts +179 -0
  160. package/app/stores/{back.js → back.ts} +54 -28
  161. package/app/stores/camera_manager.ts +80 -0
  162. package/app/stores/{cloud.js → cloud.ts} +18 -13
  163. package/app/stores/data.ts +392 -0
  164. package/app/stores/data_helpers/collections.ts +138 -0
  165. package/app/stores/data_helpers/mesh.ts +169 -0
  166. package/app/stores/data_style.ts +167 -0
  167. package/app/stores/{feedback.js → feedback.ts} +19 -8
  168. package/app/stores/{hybrid_viewer.js → hybrid_viewer.ts} +49 -45
  169. package/app/stores/infra.ts +106 -0
  170. package/app/stores/{menu.js → menu.ts} +67 -36
  171. package/app/stores/treeview.ts +383 -0
  172. package/app/stores/{viewer.js → viewer.ts} +75 -42
  173. package/app/utils/attributes.ts +40 -0
  174. package/app/utils/clipping_planes.ts +222 -0
  175. package/app/utils/color_picker.js +54 -0
  176. package/app/utils/colormap.ts +102 -0
  177. package/app/utils/default_styles/{constants.js → constants.ts} +25 -12
  178. package/app/utils/default_styles/{index.js → index.ts} +4 -3
  179. package/app/utils/default_styles/meshes.ts +264 -0
  180. package/app/utils/default_styles/{models.js → models.ts} +106 -52
  181. package/app/utils/{extension.js → extension.ts} +63 -19
  182. package/app/utils/{import_workflow.js → import_workflow.ts} +39 -22
  183. package/app/utils/{log.js → log.ts} +12 -2
  184. package/app/utils/{name_cleaner.js → name_cleaner.ts} +6 -6
  185. package/app/utils/status.ts +19 -0
  186. package/app/utils/{stores.js → stores.ts} +5 -5
  187. package/app/utils/{string.js → string.ts} +6 -6
  188. package/app/utils/{treeview.js → treeview.ts} +4 -1
  189. package/internal/database/{base_database.js → base_database.ts} +7 -3
  190. package/internal/database/database.ts +102 -0
  191. package/internal/database/{extended_database.js → extended_database.ts} +5 -1
  192. package/internal/database/tables/camera_positions.ts +6 -0
  193. package/internal/database/tables/{data.js → data.ts} +3 -1
  194. package/internal/database/tables/data_style.ts +6 -0
  195. package/internal/database/tables/model_component_datastyle.ts +6 -0
  196. package/internal/database/tables/model_component_type_datastyle.ts +6 -0
  197. package/internal/database/tables/model_components.ts +6 -0
  198. package/internal/database/tables/model_components_relation.ts +6 -0
  199. package/internal/database/tables/table_definition.ts +5 -0
  200. package/internal/stores/data_style/mesh/cells/cell.ts +279 -0
  201. package/internal/stores/data_style/mesh/cells/{color.js → color.ts} +13 -7
  202. package/internal/stores/data_style/mesh/cells/common.ts +50 -0
  203. package/internal/stores/data_style/mesh/cells/index.ts +161 -0
  204. package/internal/stores/data_style/mesh/cells/{textures.js → textures.ts} +14 -8
  205. package/internal/stores/data_style/mesh/cells/vertex.ts +285 -0
  206. package/internal/stores/data_style/mesh/cells/visibility.ts +46 -0
  207. package/internal/stores/data_style/mesh/edges/{color.js → color.ts} +13 -7
  208. package/internal/stores/data_style/mesh/edges/common.ts +41 -0
  209. package/internal/stores/data_style/mesh/edges/edge.ts +279 -0
  210. package/internal/stores/data_style/mesh/edges/index.ts +155 -0
  211. package/internal/stores/data_style/mesh/edges/vertex.ts +285 -0
  212. package/internal/stores/data_style/mesh/edges/visibility.ts +45 -0
  213. package/internal/stores/data_style/mesh/edges/width.ts +42 -0
  214. package/internal/stores/data_style/mesh/{index.js → index.ts} +34 -14
  215. package/internal/stores/data_style/mesh/points/{color.js → color.ts} +13 -7
  216. package/internal/stores/data_style/mesh/points/common.ts +51 -0
  217. package/internal/stores/data_style/mesh/points/index.ts +133 -0
  218. package/internal/stores/data_style/mesh/points/size.ts +43 -0
  219. package/internal/stores/data_style/mesh/points/vertex.ts +285 -0
  220. package/internal/stores/data_style/mesh/points/visibility.ts +49 -0
  221. package/internal/stores/data_style/mesh/polygons/{color.js → color.ts} +13 -7
  222. package/internal/stores/data_style/mesh/polygons/common.ts +50 -0
  223. package/internal/stores/data_style/mesh/polygons/index.ts +167 -0
  224. package/internal/stores/data_style/mesh/polygons/polygon.ts +282 -0
  225. package/internal/stores/data_style/mesh/polygons/{textures.js → textures.ts} +14 -8
  226. package/internal/stores/data_style/mesh/polygons/vertex.ts +288 -0
  227. package/internal/stores/data_style/mesh/polygons/visibility.ts +48 -0
  228. package/internal/stores/data_style/mesh/polyhedra/{color.js → color.ts} +13 -7
  229. package/internal/stores/data_style/mesh/polyhedra/common.ts +41 -0
  230. package/internal/stores/data_style/mesh/polyhedra/index.ts +157 -0
  231. package/internal/stores/data_style/mesh/polyhedra/polyhedron.ts +294 -0
  232. package/internal/stores/data_style/mesh/polyhedra/vertex.ts +288 -0
  233. package/internal/stores/data_style/mesh/polyhedra/visibility.ts +48 -0
  234. package/internal/stores/data_style/model/blocks/{color.js → color.ts} +50 -13
  235. package/internal/stores/data_style/model/blocks/common.ts +67 -0
  236. package/internal/stores/data_style/model/blocks/{index.js → index.ts} +111 -66
  237. package/internal/stores/data_style/model/blocks/polyhedron.ts +363 -0
  238. package/internal/stores/data_style/model/blocks/vertex.ts +349 -0
  239. package/internal/stores/data_style/model/blocks/visibility.ts +37 -0
  240. package/internal/stores/data_style/model/color.ts +348 -0
  241. package/internal/stores/data_style/model/common.ts +262 -0
  242. package/internal/stores/data_style/model/corners/{color.js → color.ts} +49 -10
  243. package/internal/stores/data_style/model/corners/common.ts +71 -0
  244. package/internal/stores/data_style/model/corners/{index.js → index.ts} +86 -47
  245. package/internal/stores/data_style/model/corners/vertex.ts +315 -0
  246. package/internal/stores/data_style/model/corners/visibility.ts +39 -0
  247. package/internal/stores/data_style/model/edges/common.ts +29 -0
  248. package/internal/stores/data_style/model/edges/{index.js → index.ts} +2 -7
  249. package/internal/stores/data_style/model/edges/visibility.ts +55 -0
  250. package/internal/stores/data_style/model/{index.js → index.ts} +24 -11
  251. package/internal/stores/data_style/model/lines/{color.js → color.ts} +47 -10
  252. package/internal/stores/data_style/model/lines/common.ts +63 -0
  253. package/internal/stores/data_style/model/lines/edge.ts +343 -0
  254. package/internal/stores/data_style/model/lines/{index.js → index.ts} +108 -66
  255. package/internal/stores/data_style/model/lines/vertex.ts +344 -0
  256. package/internal/stores/data_style/model/lines/visibility.ts +37 -0
  257. package/internal/stores/data_style/model/points/common.ts +25 -0
  258. package/internal/stores/data_style/model/points/index.ts +35 -0
  259. package/internal/stores/data_style/model/points/size.ts +44 -0
  260. package/internal/stores/data_style/model/points/visibility.ts +46 -0
  261. package/internal/stores/data_style/model/selection.ts +138 -0
  262. package/internal/stores/data_style/model/surfaces/{color.js → color.ts} +47 -10
  263. package/internal/stores/data_style/model/surfaces/common.ts +69 -0
  264. package/internal/stores/data_style/model/surfaces/{index.js → index.ts} +113 -66
  265. package/internal/stores/data_style/model/surfaces/polygon.ts +347 -0
  266. package/internal/stores/data_style/model/surfaces/vertex.ts +351 -0
  267. package/internal/stores/data_style/model/surfaces/visibility.ts +37 -0
  268. package/internal/stores/data_style/model/{visibility.js → visibility.ts} +112 -32
  269. package/internal/stores/data_style/state.ts +281 -0
  270. package/internal/stores/data_style/types.ts +30 -0
  271. package/internal/stores/hybrid_viewer/brightness.ts +124 -0
  272. package/internal/stores/hybrid_viewer/camera.ts +326 -0
  273. package/internal/stores/hybrid_viewer/{camera_animation.js → camera_animation.ts} +30 -12
  274. package/internal/stores/hybrid_viewer/{constants.js → constants.ts} +2 -2
  275. package/internal/stores/hybrid_viewer/core.ts +64 -0
  276. package/internal/stores/hybrid_viewer/{filters.js → filters.ts} +10 -13
  277. package/internal/stores/hybrid_viewer/highlight.ts +183 -0
  278. package/internal/stores/hybrid_viewer/{ruler.js → ruler.ts} +50 -22
  279. package/internal/stores/hybrid_viewer/scene.ts +125 -0
  280. package/internal/stores/hybrid_viewer/viewport.ts +177 -0
  281. package/internal/stores/hybrid_viewer/vtk_types.ts +58 -0
  282. package/internal/utils/api_fetch.ts +133 -0
  283. package/internal/utils/upload_file.ts +115 -0
  284. package/internal/utils/viewer_call.ts +99 -0
  285. package/internal/utils/ws_client.ts +54 -0
  286. package/nuxt.config.ts +168 -0
  287. package/opengeodeweb_front_schemas.json +2 -2
  288. package/package.json +49 -13
  289. package/server/api/cloud/extensions/{run.post.js → run.post.ts} +16 -12
  290. package/server/api/local/app/project_folder_path.post.ts +33 -0
  291. package/server/api/local/app/run_back.post.ts +39 -0
  292. package/server/api/local/app/run_viewer.post.ts +39 -0
  293. package/server/api/local/extensions/{kill.post.js → kill.post.ts} +15 -8
  294. package/server/api/local/extensions/{run.post.js → run.post.ts} +17 -12
  295. package/server/api/local/extensions/upload.put.ts +71 -0
  296. package/server/api/microservice/app/{get_is_app_ready.get.js → get_is_app_ready.get.ts} +5 -5
  297. package/server/api/microservice/app/schemas/get_is_app_ready.json +1 -1
  298. package/server/api/microservice/app/set_app_base_url.post.ts +29 -0
  299. package/server/api/microservice/app/set_back_base_url.post.ts +26 -0
  300. package/server/api/microservice/app/set_is_app_ready.post.ts +29 -0
  301. package/server/api/microservice/app/set_viewer_base_url.post.ts +26 -0
  302. package/server/api/microservice/extensions/{download.post.js → download.post.ts} +13 -6
  303. package/server/api/serverless/run_cloud.post.ts +92 -0
  304. package/server/utils/{app_config.js → app_config.ts} +40 -18
  305. package/server/utils/{cleanup.js → cleanup.ts} +76 -29
  306. package/server/utils/{cloud.js → cloud.ts} +33 -17
  307. package/server/utils/{extension.js → extension.ts} +31 -4
  308. package/server/utils/{microservices.js → microservices.ts} +68 -27
  309. package/server/utils/{path.js → path.ts} +36 -17
  310. package/server/utils/{scripts.js → scripts.ts} +49 -33
  311. package/server/utils/{server.js → server.ts} +13 -6
  312. package/server/utils/server_config.ts +74 -0
  313. package/server/utils/stream.ts +6 -0
  314. package/server/utils/ws_client.ts +165 -0
  315. package/shared/{scripts.js → scripts.ts} +15 -10
  316. package/shared/utils/call_raw.ts +73 -0
  317. package/shared/utils/{call_schema.js → call_schema.ts} +15 -6
  318. package/shared/utils/fetch_raw.ts +125 -0
  319. package/shared/utils/{fetch_schema.js → fetch_schema.ts} +16 -7
  320. package/shared/utils/file.ts +22 -0
  321. package/shared/utils/{parse_boolean.js → parse_boolean.ts} +1 -1
  322. package/shared/utils/response_handlers/load.ts +109 -0
  323. package/shared/utils/types.ts +27 -0
  324. package/shared/utils/{validate_schema.js → validate_schema.ts} +3 -1
  325. package/.github/workflows/config.json +0 -5
  326. package/.github/workflows/deploy.yml +0 -15
  327. package/.github/workflows/manual_release.yml +0 -11
  328. package/.github/workflows/merge_request.yml +0 -9
  329. package/.github/workflows/pr_update.yml +0 -11
  330. package/.github/workflows/prepare_deploy.yml +0 -9
  331. package/.github/workflows/schedule.yml +0 -18
  332. package/.github/workflows/test.yml +0 -14
  333. package/.github/workflows/test_pr.yml +0 -12
  334. package/.oxlintrc.json +0 -150
  335. package/.releaserc +0 -11
  336. package/app/components/Viewer/ObjectTree/Views/ModelComponents.vue +0 -224
  337. package/app/composables/clipping_planes_widget.js +0 -249
  338. package/app/composables/global_attribute_style.js +0 -181
  339. package/app/composables/hover_highlight.js +0 -91
  340. package/app/composables/responsive_middle_truncate.js +0 -34
  341. package/app/composables/stepper_tree.js +0 -56
  342. package/app/composables/tree_filter.js +0 -138
  343. package/app/composables/use_adaptive_styles.js +0 -120
  344. package/app/composables/use_overlapping_picker.js +0 -169
  345. package/app/composables/use_quick_colormap.js +0 -32
  346. package/app/composables/virtual_tree.js +0 -191
  347. package/app/stores/app.js +0 -326
  348. package/app/stores/camera_manager.js +0 -57
  349. package/app/stores/data.js +0 -278
  350. package/app/stores/data_helpers/collections.js +0 -96
  351. package/app/stores/data_helpers/mesh.js +0 -122
  352. package/app/stores/data_style.js +0 -116
  353. package/app/stores/infra.js +0 -95
  354. package/app/stores/treeview.js +0 -290
  355. package/app/utils/attributes.js +0 -23
  356. package/app/utils/clipping_planes.js +0 -110
  357. package/app/utils/colormap.js +0 -64
  358. package/app/utils/default_styles/meshes.js +0 -191
  359. package/app/utils/status.js +0 -10
  360. package/commitlint.config.js +0 -20
  361. package/internal/database/database.js +0 -80
  362. package/internal/database/tables/camera_positions.js +0 -4
  363. package/internal/database/tables/data_style.js +0 -4
  364. package/internal/database/tables/model_component_datastyle.js +0 -4
  365. package/internal/database/tables/model_component_type_datastyle.js +0 -4
  366. package/internal/database/tables/model_components.js +0 -4
  367. package/internal/database/tables/model_components_relation.js +0 -4
  368. package/internal/stores/data_style/mesh/cells/cell.js +0 -196
  369. package/internal/stores/data_style/mesh/cells/common.js +0 -39
  370. package/internal/stores/data_style/mesh/cells/index.js +0 -81
  371. package/internal/stores/data_style/mesh/cells/vertex.js +0 -193
  372. package/internal/stores/data_style/mesh/cells/visibility.js +0 -35
  373. package/internal/stores/data_style/mesh/edges/common.js +0 -32
  374. package/internal/stores/data_style/mesh/edges/edge.js +0 -195
  375. package/internal/stores/data_style/mesh/edges/index.js +0 -81
  376. package/internal/stores/data_style/mesh/edges/vertex.js +0 -196
  377. package/internal/stores/data_style/mesh/edges/visibility.js +0 -34
  378. package/internal/stores/data_style/mesh/edges/width.js +0 -34
  379. package/internal/stores/data_style/mesh/points/common.js +0 -37
  380. package/internal/stores/data_style/mesh/points/index.js +0 -82
  381. package/internal/stores/data_style/mesh/points/size.js +0 -35
  382. package/internal/stores/data_style/mesh/points/vertex.js +0 -193
  383. package/internal/stores/data_style/mesh/points/visibility.js +0 -37
  384. package/internal/stores/data_style/mesh/polygons/common.js +0 -32
  385. package/internal/stores/data_style/mesh/polygons/index.js +0 -107
  386. package/internal/stores/data_style/mesh/polygons/polygon.js +0 -196
  387. package/internal/stores/data_style/mesh/polygons/vertex.js +0 -196
  388. package/internal/stores/data_style/mesh/polygons/visibility.js +0 -38
  389. package/internal/stores/data_style/mesh/polyhedra/common.js +0 -32
  390. package/internal/stores/data_style/mesh/polyhedra/index.js +0 -98
  391. package/internal/stores/data_style/mesh/polyhedra/polyhedron.js +0 -196
  392. package/internal/stores/data_style/mesh/polyhedra/vertex.js +0 -196
  393. package/internal/stores/data_style/mesh/polyhedra/visibility.js +0 -38
  394. package/internal/stores/data_style/model/blocks/common.js +0 -51
  395. package/internal/stores/data_style/model/blocks/polyhedron.js +0 -215
  396. package/internal/stores/data_style/model/blocks/vertex.js +0 -204
  397. package/internal/stores/data_style/model/blocks/visibility.js +0 -20
  398. package/internal/stores/data_style/model/color.js +0 -218
  399. package/internal/stores/data_style/model/common.js +0 -141
  400. package/internal/stores/data_style/model/corners/common.js +0 -51
  401. package/internal/stores/data_style/model/corners/vertex.js +0 -204
  402. package/internal/stores/data_style/model/corners/visibility.js +0 -20
  403. package/internal/stores/data_style/model/edges/common.js +0 -20
  404. package/internal/stores/data_style/model/edges/visibility.js +0 -38
  405. package/internal/stores/data_style/model/lines/common.js +0 -51
  406. package/internal/stores/data_style/model/lines/edge.js +0 -203
  407. package/internal/stores/data_style/model/lines/vertex.js +0 -204
  408. package/internal/stores/data_style/model/lines/visibility.js +0 -20
  409. package/internal/stores/data_style/model/points/common.js +0 -20
  410. package/internal/stores/data_style/model/points/index.js +0 -25
  411. package/internal/stores/data_style/model/points/size.js +0 -36
  412. package/internal/stores/data_style/model/points/visibility.js +0 -36
  413. package/internal/stores/data_style/model/selection.js +0 -89
  414. package/internal/stores/data_style/model/surfaces/common.js +0 -51
  415. package/internal/stores/data_style/model/surfaces/polygon.js +0 -215
  416. package/internal/stores/data_style/model/surfaces/vertex.js +0 -215
  417. package/internal/stores/data_style/model/surfaces/visibility.js +0 -20
  418. package/internal/stores/data_style/state.js +0 -197
  419. package/internal/stores/hybrid_viewer/brightness.js +0 -82
  420. package/internal/stores/hybrid_viewer/camera.js +0 -274
  421. package/internal/stores/hybrid_viewer/highlight.js +0 -170
  422. package/internal/stores/hybrid_viewer/scene.js +0 -136
  423. package/internal/stores/hybrid_viewer/viewport.js +0 -140
  424. package/internal/utils/api_fetch.js +0 -52
  425. package/internal/utils/upload_file.js +0 -57
  426. package/internal/utils/viewer_call.js +0 -49
  427. package/internal/utils/ws_client.js +0 -29
  428. package/nuxt.config.js +0 -106
  429. package/scripts/generate_geode_objects.js +0 -24
  430. package/server/api/local/app/project_folder_path.post.js +0 -29
  431. package/server/api/local/app/run_back.post.js +0 -33
  432. package/server/api/local/app/run_viewer.post.js +0 -33
  433. package/server/api/local/extensions/upload.put.js +0 -72
  434. package/server/api/microservice/app/set_app_base_url.post.js +0 -25
  435. package/server/api/microservice/app/set_back_base_url.post.js +0 -22
  436. package/server/api/microservice/app/set_is_app_ready.post.js +0 -25
  437. package/server/api/microservice/app/set_viewer_base_url.post.js +0 -22
  438. package/server/api/serverless/run_cloud.post.js +0 -44
  439. package/server/utils/server_config.js +0 -58
  440. package/server/utils/ws_client.js +0 -112
  441. package/shared/utils/call_raw.js +0 -46
  442. package/shared/utils/fetch_raw.js +0 -61
  443. package/shared/utils/file.js +0 -16
  444. package/shared/utils/response_handlers/load.js +0 -74
  445. package/tests/integration/data/uploads/test.og_brep +0 -0
  446. package/tests/integration/data/uploads/test.og_edc2d +0 -0
  447. package/tests/integration/data/uploads/test.og_edc3d +0 -0
  448. package/tests/integration/data/uploads/test.og_psf3d +0 -0
  449. package/tests/integration/data/uploads/test.og_rgd2d +0 -0
  450. package/tests/integration/data/uploads/test.og_rgd3d +0 -0
  451. package/tests/integration/data/uploads/test.vtu +0 -22
  452. package/tests/integration/setup.js +0 -92
  453. package/tests/integration/stores/data_style/mesh/cells.nuxt.test.js +0 -343
  454. package/tests/integration/stores/data_style/mesh/edges.nuxt.test.js +0 -254
  455. package/tests/integration/stores/data_style/mesh/index.nuxt.test.js +0 -62
  456. package/tests/integration/stores/data_style/mesh/points.nuxt.test.js +0 -201
  457. package/tests/integration/stores/data_style/mesh/polygons.nuxt.test.js +0 -260
  458. package/tests/integration/stores/data_style/mesh/polyhedra.nuxt.test.js +0 -267
  459. package/tests/integration/stores/data_style/model/blocks.nuxt.test.js +0 -397
  460. package/tests/integration/stores/data_style/model/corners.nuxt.test.js +0 -264
  461. package/tests/integration/stores/data_style/model/edges.nuxt.test.js +0 -71
  462. package/tests/integration/stores/data_style/model/index.nuxt.test.js +0 -92
  463. package/tests/integration/stores/data_style/model/lines.nuxt.test.js +0 -379
  464. package/tests/integration/stores/data_style/model/points.nuxt.test.js +0 -95
  465. package/tests/integration/stores/data_style/model/surfaces.nuxt.test.js +0 -574
  466. package/tests/integration/stores/viewer.nuxt.test.js +0 -69
  467. package/tests/setup_indexeddb.js +0 -4
  468. package/tests/unit/components/CrsSelector.nuxt.test.js +0 -55
  469. package/tests/unit/components/DragAndDrop.nuxt.test.js +0 -89
  470. package/tests/unit/components/ExtensionSelector.nuxt.test.js +0 -65
  471. package/tests/unit/components/FeedBack/ErrorsBanner.nuxt.test.js +0 -41
  472. package/tests/unit/components/FeedBack/Snackers.nuxt.test.js +0 -49
  473. package/tests/unit/components/FileSelector.nuxt.test.js +0 -124
  474. package/tests/unit/components/FileUploader.nuxt.test.js +0 -69
  475. package/tests/unit/components/MissingFilesSelector.nuxt.test.js +0 -77
  476. package/tests/unit/components/ObjectSelector.nuxt.test.js +0 -118
  477. package/tests/unit/components/PackagesVersions.nuxt.test.js +0 -42
  478. package/tests/unit/components/Step.nuxt.test.js +0 -51
  479. package/tests/unit/components/Stepper.nuxt.test.js +0 -41
  480. package/tests/unit/components/ToolPanel.nuxt.test.js +0 -66
  481. package/tests/unit/composables/api_fetch.nuxt.test.js +0 -75
  482. package/tests/unit/composables/project_manager.nuxt.test.js +0 -299
  483. package/tests/unit/composables/run_function_when_microservices_connected.nuxt.test.js +0 -57
  484. package/tests/unit/composables/upload_file.nuxt.test.js +0 -45
  485. package/tests/unit/composables/virtual_tree.nuxt.test.js +0 -63
  486. package/tests/unit/plugins/project_load.nuxt.test.js +0 -98
  487. package/tests/unit/stores/app.nuxt.test.js +0 -189
  488. package/tests/unit/stores/back.nuxt.test.js +0 -147
  489. package/tests/unit/stores/cloud.nuxt.test.js +0 -90
  490. package/tests/unit/stores/data.nuxt.test.js +0 -162
  491. package/tests/unit/stores/feedback.nuxt.test.js +0 -90
  492. package/tests/unit/stores/infra.nuxt.test.js +0 -313
  493. package/tests/unit/stores/treeview.nuxt.test.js +0 -63
  494. package/tests/unit/stores/viewer.nuxt.test.js +0 -161
  495. package/tests/unit/utils/validate_schema.nuxt.test.js +0 -38
  496. package/tests/utils.js +0 -20
  497. package/tests/vitest.config.js +0 -67
  498. /package/server/api/local/app/{kill.post.js → kill.post.ts} +0 -0
  499. /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
- return fetchSchema({ schema, params, baseURL: appBaseUrl });
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
- return fetchSchema({ schema, params, baseURL: appBaseUrl });
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
- return fetchSchema({ schema, params, baseURL: appBaseUrl });
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
- return fetchSchema({ schema, params, baseURL: appBaseUrl });
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
- return fetchSchema({ schema, baseURL: appBaseUrl });
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 { callRaw } from "./call_raw.js";
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
- function callSchema(
10
- { schema, params = {}, client, timeout },
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
- return callRaw(
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
- function fetchSchema(
10
- { schema, params = {}, baseURL, headers, timeout, expectEvent = false },
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
- return fetchRaw(
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 };