From 43a2433b75b8206bdd5ce40fe326e865ef710b18 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Thu, 5 Feb 2026 15:31:29 +0100 Subject: [PATCH 01/11] fix(Viewer): test state --- app/stores/viewer.js | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index c605b2e0..24b93249 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -27,7 +27,7 @@ export const useViewerStore = defineStore("viewer", { return "ws" } }, - port() { + port(state) { if (useInfraStore().app_mode == appMode.CLOUD) { return "443" } @@ -35,11 +35,11 @@ export const useViewerStore = defineStore("viewer", { if (VIEWER_PORT != null && VIEWER_PORT !== "") { return VIEWER_PORT } - return this.default_local_port + return state.this.default_local_port }, - base_url() { + base_url(state) { const infraStore = useInfraStore() - let viewer_url = `${this.protocol}://${infraStore.domain_name}:${this.port}` + let viewer_url = `${state.protocol}://${infraStore.domain_name}:${state.port}` if (infraStore.app_mode == appMode.CLOUD) { if (infraStore.ID == "") { throw new Error("ID must not be empty in cloud mode") @@ -49,8 +49,8 @@ export const useViewerStore = defineStore("viewer", { viewer_url += "/ws" return viewer_url }, - is_busy() { - return this.request_counter > 0 + is_busy(state) { + return state.request_counter > 0 }, }, actions: { @@ -66,29 +66,30 @@ export const useViewerStore = defineStore("viewer", { }, async ws_connect() { if (this.status === Status.CONNECTED) return + const self = this return navigator.locks.request("viewer.ws_connect", async (lock) => { - if (this.status === Status.CONNECTED) return + if (self.status === Status.CONNECTED) return try { console.log("VIEWER LOCK GRANTED !", lock) - this.status = Status.CONNECTING + self.status = Status.CONNECTING const SmartConnect = await import("wslink/src/SmartConnect") vtkWSLinkClient.setSmartConnectClass(SmartConnect) const config = { application: "Viewer" } - config.sessionURL = this.base_url + config.sessionURL = self.base_url - if (this.status === Status.CONNECTED && this.client.isConnected()) { - this.client.disconnect(-1) - this.status = Status.NOT_CONNECTED + if (self.status === Status.CONNECTED && self.client.isConnected()) { + self.client.disconnect(-1) + self.status = Status.NOT_CONNECTED } - let clientToConnect = this.client + let clientToConnect = self.client if (_.isEmpty(clientToConnect)) { clientToConnect = vtkWSLinkClient.newInstance() } // Connect to busy store clientToConnect.onBusyChange((count) => { - this.buzy = count + self.buzy = count }) clientToConnect.beginBusy() @@ -112,19 +113,19 @@ export const useViewerStore = defineStore("viewer", { const { connectImageStream } = await import( "@kitware/vtk.js/Rendering/Misc/RemoteView" ) - this.client = await clientToConnect.connect(config) - connectImageStream(this.client.getConnection().getSession()) - this.client.endBusy() - await this.request( + self.client = await clientToConnect.connect(config) + connectImageStream(self.client.getConnection().getSession()) + self.client.endBusy() + await self.request( schemas.opengeodeweb_viewer.viewer.reset_visualization, {}, {}, undefined, ) - this.status = Status.CONNECTED + self.status = Status.CONNECTED } catch (error) { console.error("error", error) - this.status = Status.NOT_CONNECTED + self.status = Status.NOT_CONNECTED throw error } }) From 530f0187bd17ec1ce7de77a6c5c5edd16f218f76 Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Thu, 5 Feb 2026 14:33:10 +0000 Subject: [PATCH 02/11] Apply prepare changes --- app/stores/viewer.js | 5 ++--- tests/integration/microservices/back/requirements.txt | 1 - tests/integration/microservices/viewer/requirements.txt | 1 - 3 files changed, 2 insertions(+), 5 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 24b93249..d2953c9f 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -110,9 +110,8 @@ export const useViewerStore = defineStore("viewer", { }) // Connect - const { connectImageStream } = await import( - "@kitware/vtk.js/Rendering/Misc/RemoteView" - ) + const { connectImageStream } = + await import("@kitware/vtk.js/Rendering/Misc/RemoteView") self.client = await clientToConnect.connect(config) connectImageStream(self.client.getConnection().getSession()) self.client.endBusy() diff --git a/tests/integration/microservices/back/requirements.txt b/tests/integration/microservices/back/requirements.txt index f46331da..bd3a3ef5 100644 --- a/tests/integration/microservices/back/requirements.txt +++ b/tests/integration/microservices/back/requirements.txt @@ -5,4 +5,3 @@ # pip-compile --output-file=tests/integration/microservices/back/requirements.txt tests/integration/microservices/back/requirements.in # -opengeodeweb-back==6.*,>=6.1.0rc3 diff --git a/tests/integration/microservices/viewer/requirements.txt b/tests/integration/microservices/viewer/requirements.txt index 68cb23f1..4d097394 100644 --- a/tests/integration/microservices/viewer/requirements.txt +++ b/tests/integration/microservices/viewer/requirements.txt @@ -5,4 +5,3 @@ # pip-compile --output-file=tests/integration/microservices/viewer/requirements.txt tests/integration/microservices/viewer/requirements.in # -opengeodeweb-viewer==1.*,>=1.15.1rc1 From 4acd10213e1b18cee706ed267d9cbe2fbd850031 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Thu, 5 Feb 2026 15:52:51 +0100 Subject: [PATCH 03/11] viewer store setup --- app/stores/viewer.js | 195 +++++++++++++++++++++++++++---------------- 1 file changed, 124 insertions(+), 71 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 24b93249..e0a4288d 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -1,7 +1,8 @@ import _ from "lodash" +import { ref, computed } from "vue" import vtkWSLinkClient from "@kitware/vtk.js/IO/Core/WSLinkClient" import "@kitware/vtk.js/Rendering/OpenGL/Profiles/Geometry" -import schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json" +import schemas from "@geode/opengeode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json" import Status from "@ogw_front/utils/status" import { appMode } from "@ogw_front/utils/app_mode" import { viewer_call } from "../../internal/utils/viewer_call" @@ -9,25 +10,31 @@ import { useInfraStore } from "@ogw_front/stores/infra" const request_timeout = 10 * 1000 -export const useViewerStore = defineStore("viewer", { - state: () => ({ - default_local_port: "1234", - client: {}, - config: null, - picking_mode: false, - picked_point: { x: null, y: null }, - request_counter: 0, - status: Status.NOT_CONNECTED, - }), - getters: { - protocol() { +export const useViewerStore = defineStore( + "viewer", + () => { + // Stores + const infraStore = useInfraStore() + + // State + const default_local_port = ref("1234") + const client = ref({}) + const config = ref(null) + const picking_mode = ref(false) + const picked_point = ref({ x: null, y: null }) + const request_counter = ref(0) + const status = ref(Status.NOT_CONNECTED) + + // Getters + const protocol = computed(() => { if (useInfraStore().app_mode == appMode.CLOUD) { return "wss" } else { return "ws" } - }, - port(state) { + }) + + const port = computed(() => { if (useInfraStore().app_mode == appMode.CLOUD) { return "443" } @@ -35,11 +42,11 @@ export const useViewerStore = defineStore("viewer", { if (VIEWER_PORT != null && VIEWER_PORT !== "") { return VIEWER_PORT } - return state.this.default_local_port - }, - base_url(state) { - const infraStore = useInfraStore() - let viewer_url = `${state.protocol}://${infraStore.domain_name}:${state.port}` + return default_local_port.value + }) + + const base_url = computed(() => { + let viewer_url = `${protocol.value}://${infraStore.domain_name}:${port.value}` if (infraStore.app_mode == appMode.CLOUD) { if (infraStore.ID == "") { throw new Error("ID must not be empty in cloud mode") @@ -48,48 +55,51 @@ export const useViewerStore = defineStore("viewer", { } viewer_url += "/ws" return viewer_url - }, - is_busy(state) { - return state.request_counter > 0 - }, - }, - actions: { - toggle_picking_mode(value) { - this.picking_mode = value - }, - async set_picked_point(x, y) { - const response = await this.get_point_position({ x, y }) + }) + + const is_busy = computed(() => { + return request_counter.value > 0 + }) + + // Actions + function toggle_picking_mode(value) { + picking_mode.value = value + } + + async function set_picked_point(x, y) { + const response = await get_point_position({ x, y }) const { x: world_x, y: world_y } = response - this.picked_point.x = world_x - this.picked_point.y = world_y - this.picking_mode = false - }, - async ws_connect() { - if (this.status === Status.CONNECTED) return - const self = this + picked_point.value.x = world_x + picked_point.value.y = world_y + picking_mode.value = false + } + + async function ws_connect() { + if (status.value === Status.CONNECTED) return + return navigator.locks.request("viewer.ws_connect", async (lock) => { - if (self.status === Status.CONNECTED) return + if (status.value === Status.CONNECTED) return try { console.log("VIEWER LOCK GRANTED !", lock) - self.status = Status.CONNECTING + status.value = Status.CONNECTING const SmartConnect = await import("wslink/src/SmartConnect") vtkWSLinkClient.setSmartConnectClass(SmartConnect) - const config = { application: "Viewer" } - config.sessionURL = self.base_url + const config_obj = { application: "Viewer" } + config_obj.sessionURL = base_url.value - if (self.status === Status.CONNECTED && self.client.isConnected()) { - self.client.disconnect(-1) - self.status = Status.NOT_CONNECTED + if (status.value === Status.CONNECTED && client.value.isConnected()) { + client.value.disconnect(-1) + status.value = Status.NOT_CONNECTED } - let clientToConnect = self.client + let clientToConnect = client.value if (_.isEmpty(clientToConnect)) { clientToConnect = vtkWSLinkClient.newInstance() } // Connect to busy store clientToConnect.onBusyChange((count) => { - self.buzy = count + buzy.value = count }) clientToConnect.beginBusy() @@ -113,45 +123,58 @@ export const useViewerStore = defineStore("viewer", { const { connectImageStream } = await import( "@kitware/vtk.js/Rendering/Misc/RemoteView" ) - self.client = await clientToConnect.connect(config) - connectImageStream(self.client.getConnection().getSession()) - self.client.endBusy() - await self.request( + client.value = await clientToConnect.connect(config_obj) + connectImageStream(client.value.getConnection().getSession()) + client.value.endBusy() + await request( schemas.opengeodeweb_viewer.viewer.reset_visualization, {}, {}, undefined, ) - self.status = Status.CONNECTED + status.value = Status.CONNECTED } catch (error) { console.error("error", error) - self.status = Status.NOT_CONNECTED + status.value = Status.NOT_CONNECTED throw error } }) - }, - start_request() { - this.request_counter++ - }, - stop_request() { - this.request_counter-- - }, - async launch() { + } + + function start_request() { + request_counter.value++ + } + + function stop_request() { + request_counter.value-- + } + + async function launch() { console.log("[VIEWER] Launching viewer microservice...") const port = await window.electronAPI.run_viewer() console.log("[VIEWER] Viewer launched on port:", port) return port - }, - async connect() { + } + + async function connect() { console.log("[VIEWER] Connecting to viewer microservice...") - await this.ws_connect() + await ws_connect() console.log("[VIEWER] Viewer connected successfully") - }, - request(schema, params = {}, callbacks = {}, timeout = request_timeout) { + } + + function request( + schema, + params = {}, + callbacks = {}, + timeout = request_timeout, + ) { console.log("[VIEWER] Request:", schema.$id) + // Get current store instance to pass to viewer_call + const store = useViewerStore() + return viewer_call( - this, + store, { schema, params }, { ...callbacks, @@ -164,9 +187,39 @@ export const useViewerStore = defineStore("viewer", { }, timeout, ) - }, + } + + // Return everything that should be exposed + return { + // State + default_local_port, + client, + config, + picking_mode, + picked_point, + request_counter, + status, + + // Getters + protocol, + port, + base_url, + is_busy, + + // Actions + toggle_picking_mode, + set_picked_point, + ws_connect, + start_request, + stop_request, + launch, + connect, + request, + } }, - share: { - omit: ["status", "client"], + { + share: { + omit: ["status", "client"], + }, }, -}) +) From 83f12e934378277a52fd1488759a95bd6f52a2c8 Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Thu, 5 Feb 2026 14:53:59 +0000 Subject: [PATCH 04/11] Apply prepare changes --- app/stores/viewer.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index e0a4288d..8761d772 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -120,9 +120,8 @@ export const useViewerStore = defineStore( }) // Connect - const { connectImageStream } = await import( - "@kitware/vtk.js/Rendering/Misc/RemoteView" - ) + const { connectImageStream } = + await import("@kitware/vtk.js/Rendering/Misc/RemoteView") client.value = await clientToConnect.connect(config_obj) connectImageStream(client.value.getConnection().getSession()) client.value.endBusy() From 734e81c2635e1429671b3458e2713f7d517a971f Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Thu, 5 Feb 2026 16:02:56 +0100 Subject: [PATCH 05/11] fix schema import --- app/stores/viewer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index e0a4288d..6011467e 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -2,7 +2,7 @@ import _ from "lodash" import { ref, computed } from "vue" import vtkWSLinkClient from "@kitware/vtk.js/IO/Core/WSLinkClient" import "@kitware/vtk.js/Rendering/OpenGL/Profiles/Geometry" -import schemas from "@geode/opengeode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json" +import schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json" import Status from "@ogw_front/utils/status" import { appMode } from "@ogw_front/utils/app_mode" import { viewer_call } from "../../internal/utils/viewer_call" From 168535ecd23f7bc8779f7e7c18a0715bb34005a9 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Thu, 5 Feb 2026 16:08:26 +0100 Subject: [PATCH 06/11] remove vue imports --- app/stores/viewer.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 859277d2..961c3d6c 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -1,5 +1,4 @@ import _ from "lodash" -import { ref, computed } from "vue" import vtkWSLinkClient from "@kitware/vtk.js/IO/Core/WSLinkClient" import "@kitware/vtk.js/Rendering/OpenGL/Profiles/Geometry" import schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json" @@ -120,8 +119,9 @@ export const useViewerStore = defineStore( }) // Connect - const { connectImageStream } = - await import("@kitware/vtk.js/Rendering/Misc/RemoteView") + const { connectImageStream } = await import( + "@kitware/vtk.js/Rendering/Misc/RemoteView" + ) client.value = await clientToConnect.connect(config_obj) connectImageStream(client.value.getConnection().getSession()) client.value.endBusy() From 7805424df39a01e1a7f7d3fcac20ee0f269580d6 Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Thu, 5 Feb 2026 15:09:45 +0000 Subject: [PATCH 07/11] Apply prepare changes --- app/stores/viewer.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 961c3d6c..54bdf05a 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -119,9 +119,8 @@ export const useViewerStore = defineStore( }) // Connect - const { connectImageStream } = await import( - "@kitware/vtk.js/Rendering/Misc/RemoteView" - ) + const { connectImageStream } = + await import("@kitware/vtk.js/Rendering/Misc/RemoteView") client.value = await clientToConnect.connect(config_obj) connectImageStream(client.value.getConnection().getSession()) client.value.endBusy() From 3ada87e894b61c3f791685b16307bd62cb96f505 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Thu, 5 Feb 2026 17:11:55 +0100 Subject: [PATCH 08/11] cleanup comments --- app/stores/viewer.js | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 961c3d6c..e93dc570 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -12,10 +12,8 @@ const request_timeout = 10 * 1000 export const useViewerStore = defineStore( "viewer", () => { - // Stores const infraStore = useInfraStore() - // State const default_local_port = ref("1234") const client = ref({}) const config = ref(null) @@ -24,7 +22,6 @@ export const useViewerStore = defineStore( const request_counter = ref(0) const status = ref(Status.NOT_CONNECTED) - // Getters const protocol = computed(() => { if (useInfraStore().app_mode == appMode.CLOUD) { return "wss" @@ -60,7 +57,6 @@ export const useViewerStore = defineStore( return request_counter.value > 0 }) - // Actions function toggle_picking_mode(value) { picking_mode.value = value } @@ -188,9 +184,7 @@ export const useViewerStore = defineStore( ) } - // Return everything that should be exposed return { - // State default_local_port, client, config, @@ -198,14 +192,10 @@ export const useViewerStore = defineStore( picked_point, request_counter, status, - - // Getters protocol, port, base_url, is_busy, - - // Actions toggle_picking_mode, set_picked_point, ws_connect, From ed13d5437ca9a94ca4cb3a1e729914dc86d33b31 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Thu, 5 Feb 2026 17:28:11 +0100 Subject: [PATCH 09/11] test --- app/stores/viewer.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index c91a29bc..27ecf3c4 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -94,9 +94,8 @@ export const useViewerStore = defineStore( // Connect to busy store clientToConnect.onBusyChange((count) => { - buzy.value = count + clientToConnect.beginBusy() }) - clientToConnect.beginBusy() // Error clientToConnect.onConnectionError((httpReq) => { @@ -115,8 +114,9 @@ export const useViewerStore = defineStore( }) // Connect - const { connectImageStream } = - await import("@kitware/vtk.js/Rendering/Misc/RemoteView") + const { connectImageStream } = await import( + "@kitware/vtk.js/Rendering/Misc/RemoteView" + ) client.value = await clientToConnect.connect(config_obj) connectImageStream(client.value.getConnection().getSession()) client.value.endBusy() From 0d77802367ac9a8af35d9f0ee7eb182e6582e0a9 Mon Sep 17 00:00:00 2001 From: JulienChampagnol <91873154+JulienChampagnol@users.noreply.github.com> Date: Thu, 5 Feb 2026 16:33:28 +0000 Subject: [PATCH 10/11] Apply prepare changes --- app/stores/viewer.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 27ecf3c4..03be4c50 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -114,9 +114,8 @@ export const useViewerStore = defineStore( }) // Connect - const { connectImageStream } = await import( - "@kitware/vtk.js/Rendering/Misc/RemoteView" - ) + const { connectImageStream } = + await import("@kitware/vtk.js/Rendering/Misc/RemoteView") client.value = await clientToConnect.connect(config_obj) connectImageStream(client.value.getConnection().getSession()) client.value.endBusy() From c3d13054c6cf85b0296865cfa52ad4c77b6f8c51 Mon Sep 17 00:00:00 2001 From: JulienChampagnol Date: Fri, 6 Feb 2026 09:56:41 +0100 Subject: [PATCH 11/11] test onBusyChange --- app/stores/viewer.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/stores/viewer.js b/app/stores/viewer.js index 27ecf3c4..21245d21 100644 --- a/app/stores/viewer.js +++ b/app/stores/viewer.js @@ -21,6 +21,7 @@ export const useViewerStore = defineStore( const picked_point = ref({ x: null, y: null }) const request_counter = ref(0) const status = ref(Status.NOT_CONNECTED) + const buzy = ref(0) const protocol = computed(() => { if (useInfraStore().app_mode == appMode.CLOUD) { @@ -94,8 +95,9 @@ export const useViewerStore = defineStore( // Connect to busy store clientToConnect.onBusyChange((count) => { - clientToConnect.beginBusy() + buzy.value = count }) + clientToConnect.beginBusy() // Error clientToConnect.onConnectionError((httpReq) => {