Skip to content

Commit ee92d5a

Browse files
refactor stores wip
1 parent 6e3b3ef commit ee92d5a

File tree

6 files changed

+143
-103
lines changed

6 files changed

+143
-103
lines changed

components/Launcher.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
watch(is_captcha_validated, async (value) => {
3030
if (value === true && process.client) {
3131
await infra_store.create_connexion()
32-
await viewer_store.ws_connect()
32+
await viewer_store.connect()
3333
}
3434
})
3535
</script>

components/RemoteRenderingView.vue

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,16 @@
2424
import vtkRemoteView from "@kitware/vtk.js/Rendering/Misc/RemoteView"
2525
import { useElementSize, useWindowSize } from "@vueuse/core"
2626
import viewer_schemas from "@geode/opengeodeweb-viewer/schemas.json"
27+
import Status from "../utils/status"
2728
2829
const viewer_store = use_viewer_store()
29-
const { client, is_running, picking_mode } = storeToRefs(viewer_store)
30-
3130
const viewer = ref(null)
3231
const { width, height } = useElementSize(viewer)
3332
3433
const { width: windowWidth, height: windowHeight } = useWindowSize()
3534
3635
function get_x_y(event) {
37-
if (picking_mode.value === true) {
36+
if (viewer_store.picking_mode.value === true) {
3837
const { offsetX, offsetY } = event
3938
viewer_store.set_picked_point(offsetX, offsetY)
4039
viewer_call({
@@ -70,7 +69,7 @@
7069
resize()
7170
})
7271
73-
watch(picking_mode, (value) => {
72+
watch(viewer_store.picking_mode, (value) => {
7473
const cursor = value ? "crosshair" : "pointer"
7574
view.getCanvasView().setCursor(cursor)
7675
})
@@ -79,7 +78,7 @@
7978
resize()
8079
})
8180
82-
watch(client, () => {
81+
watch(viewer_store.client, () => {
8382
connect()
8483
})
8584
@@ -91,10 +90,10 @@
9190
})
9291
9392
function connect() {
94-
if (!is_running.value) {
93+
if (!viewer_store.status !== Status.CONNECTED) {
9594
return
9695
}
97-
const session = client.value.getConnection().getSession()
96+
const session = viewer_store.client.value.getConnection().getSession()
9897
view.setSession(session)
9998
view.setViewId(viewId.value)
10099
connected.value = true

stores/geode.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import back_schemas from "@geode/opengeodeweb-back/schemas.json"
2+
import Status from "../utils/status"
23

34
export const use_geode_store = defineStore("geode", {
45
state: () => ({
56
default_local_port: "5000",
67
request_counter: 0,
7-
is_running: false,
8+
status: Status.NOT_CONNECTED,
89
}),
910
getters: {
1011
protocol() {
@@ -37,7 +38,7 @@ export const use_geode_store = defineStore("geode", {
3738
actions: {
3839
ping_task() {
3940
setInterval(() => {
40-
if (this.is_running) {
41+
if (this.status == Status.CONNECTED) {
4142
this.do_ping()
4243
}
4344
}, 10 * 1000)
@@ -51,17 +52,17 @@ export const use_geode_store = defineStore("geode", {
5152
body: {},
5253
onRequestError({ error }) {
5354
feedback_store.server_error = true
54-
geode_store.is_running = false
55+
geode_store.status = Status.NOT_CONNECTED
5556
},
5657
onResponse({ response }) {
5758
if (response.ok) {
5859
feedback_store.server_error = false
59-
geode_store.is_running = true
60+
geode_store.status = Status.CONNECTED
6061
}
6162
},
6263
onResponseError({ response }) {
6364
feedback_store.server_error = true
64-
geode_store.is_running = false
65+
geode_store.status = Status.NOT_CONNECTED
6566
},
6667
})
6768
},
@@ -72,4 +73,7 @@ export const use_geode_store = defineStore("geode", {
7273
this.request_counter--
7374
},
7475
},
76+
share: {
77+
omit: ["status"],
78+
},
7579
})

stores/infra.js

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { useStorage } from "@vueuse/core"
22
import isElectron from "is-electron"
3+
import Status from "../utils/status"
34

45
export const use_infra_store = defineStore("infra", {
56
state: () => ({
67
ID: useStorage("ID", ""),
78
is_captcha_validated: false,
8-
is_connexion_launched: false,
9+
status: Status.NOT_CREATED,
910
}),
1011
getters: {
1112
is_cloud() {
@@ -34,47 +35,61 @@ export const use_infra_store = defineStore("infra", {
3435
"/createbackend"
3536
return url
3637
},
37-
is_running() {
38-
return use_geode_store().is_running && use_viewer_store().is_running
38+
microservices_connected() {
39+
return (
40+
use_geode_store().status == Status.CONNECTED &&
41+
use_viewer_store().status == Status.CONNECTED
42+
)
3943
},
40-
is_busy() {
44+
microservices_busy() {
4145
return use_geode_store().is_busy || use_viewer_store().is_busy
4246
},
4347
},
4448
actions: {
45-
async create_connexion() {
46-
if (this.is_connexion_launched) {
47-
return
48-
}
49-
this.is_connexion_launched = true
50-
return this.create_backend()
51-
},
5249
async create_backend() {
53-
const geode_store = use_geode_store()
54-
const viewer_store = use_viewer_store()
55-
const feedback_store = use_feedback_store()
56-
57-
if (isElectron()) {
58-
const back_port = await window.electronAPI.run_back(geode_store.port)
59-
geode_store.$patch({ default_local_port: back_port })
60-
const viewer_port = await window.electronAPI.run_viewer(
61-
viewer_store.port,
62-
)
63-
viewer_store.$patch({ default_local_port: viewer_port })
64-
} else {
65-
const { data, error } = await useFetch(this.lambda_url, {
66-
method: "POST",
67-
})
68-
if (data.value !== null) {
69-
this.ID = data.value.ID
70-
localStorage.setItem("ID", data.value.ID)
71-
} else {
72-
feedback_store.server_error = true
73-
return
74-
}
50+
if (this.status in [Status.CREATING, Status.CREATED]) {
51+
return
7552
}
76-
geode_store.$patch({ is_running: true })
77-
return geode_store.ping_task()
53+
navigator.locks.request(
54+
"infra.create_backend",
55+
{ mode: "shared" },
56+
async (lock) => {
57+
this.status = Status.CREATING
58+
console.log("LOCK", lock)
59+
if (lock) {
60+
console.log("LOCKED")
61+
this.status = Status.CREATING
62+
const geode_store = use_geode_store()
63+
const viewer_store = use_viewer_store()
64+
const feedback_store = use_feedback_store()
65+
if (isElectron()) {
66+
const back_port = await window.electronAPI.run_back(
67+
geode_store.port,
68+
)
69+
geode_store.$patch({ default_local_port: back_port })
70+
const viewer_port = await window.electronAPI.run_viewer(
71+
viewer_store.port,
72+
)
73+
viewer_store.$patch({ default_local_port: viewer_port })
74+
} else {
75+
const { data, error } = await useFetch(this.lambda_url, {
76+
method: "POST",
77+
})
78+
if (data.value !== null) {
79+
this.ID = data.value.ID
80+
localStorage.setItem("ID", data.value.ID)
81+
} else {
82+
feedback_store.server_error = true
83+
return
84+
}
85+
}
86+
this.status = Status.CREATED
87+
geode_store.ping_task()
88+
viewer_store.connect()
89+
return
90+
}
91+
},
92+
)
7893
},
7994
},
8095
})

stores/viewer.js

Lines changed: 67 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ import _ from "lodash"
22
import vtkWSLinkClient from "@kitware/vtk.js/IO/Core/WSLinkClient"
33
import "@kitware/vtk.js/Rendering/OpenGL/Profiles/Geometry"
44
import schemas from "@geode/opengeodeweb-viewer/schemas.json"
5+
import Status from "../utils/status"
56

67
export const use_viewer_store = defineStore("viewer", {
78
state: () => ({
89
default_local_port: "1234",
910
client: {},
1011
config: null,
11-
is_running: false,
1212
picking_mode: false,
1313
picked_point: { x: null, y: null },
1414
request_counter: 0,
15+
status: Status.NOT_CONNECTED,
1516
}),
1617
getters: {
1718
protocol() {
@@ -55,71 +56,79 @@ export const use_viewer_store = defineStore("viewer", {
5556
this.picked_point.y = world_y
5657
this.picking_mode = false
5758
},
58-
async ws_connect() {
59+
async connect() {
5960
if (process.env.NODE_ENV == "test") {
6061
return
6162
}
62-
const SmartConnect = await import("wslink/src/SmartConnect")
63-
vtkWSLinkClient.setSmartConnectClass(SmartConnect)
63+
navigator.locks.request("viewer.connect", async (lock) => {
64+
this.status = Status.CONNECTING
65+
if (lock) {
66+
this.status = Status.CONNECTING
67+
const SmartConnect = await import("wslink/src/SmartConnect")
68+
vtkWSLinkClient.setSmartConnectClass(SmartConnect)
6469

65-
const config = { application: "Viewer" }
66-
config.sessionURL = this.base_url
70+
const config = { application: "Viewer" }
71+
config.sessionURL = this.base_url
6772

68-
const { client } = this
69-
if (this.is_running && client.isConnected()) {
70-
client.disconnect(-1)
71-
this.is_running = false
72-
}
73-
let clientToConnect = client
74-
if (_.isEmpty(clientToConnect)) {
75-
clientToConnect = vtkWSLinkClient.newInstance()
76-
}
73+
const { client } = this
74+
if (this.is_running && client.isConnected()) {
75+
client.disconnect(-1)
76+
this.is_running = false
77+
}
78+
let clientToConnect = client
79+
if (_.isEmpty(clientToConnect)) {
80+
clientToConnect = vtkWSLinkClient.newInstance()
81+
}
7782

78-
// Connect to busy store
79-
clientToConnect.onBusyChange((count) => {
80-
this.buzy = count
81-
})
82-
clientToConnect.beginBusy()
83+
// Connect to busy store
84+
clientToConnect.onBusyChange((count) => {
85+
this.buzy = count
86+
})
87+
clientToConnect.beginBusy()
8388

84-
// Error
85-
clientToConnect.onConnectionError((httpReq) => {
86-
const message =
87-
(httpReq && httpReq.response && httpReq.response.error) ||
88-
`Connection error`
89-
console.error(message)
90-
})
89+
// Error
90+
clientToConnect.onConnectionError((httpReq) => {
91+
const message =
92+
(httpReq && httpReq.response && httpReq.response.error) ||
93+
`Connection error`
94+
console.error(message)
95+
})
9196

92-
// Close
93-
clientToConnect.onConnectionClose((httpReq) => {
94-
const message =
95-
(httpReq && httpReq.response && httpReq.response.error) ||
96-
`Connection close`
97-
console.error(message)
98-
})
97+
// Close
98+
clientToConnect.onConnectionClose((httpReq) => {
99+
const message =
100+
(httpReq && httpReq.response && httpReq.response.error) ||
101+
`Connection close`
102+
console.error(message)
103+
})
99104

100-
// Connect
101-
const { connectImageStream } = await import(
102-
"@kitware/vtk.js/Rendering/Misc/RemoteView"
103-
)
104-
return new Promise((resolve, reject) => {
105-
clientToConnect
106-
.connect(config)
107-
.then((validClient) => {
108-
connectImageStream(validClient.getConnection().getSession())
109-
this.client = validClient
110-
clientToConnect.endBusy()
105+
// Connect
106+
const { connectImageStream } = await import(
107+
"@kitware/vtk.js/Rendering/Misc/RemoteView"
108+
)
109+
return new Promise((resolve, reject) => {
110+
clientToConnect
111+
.connect(config)
112+
.then((validClient) => {
113+
connectImageStream(validClient.getConnection().getSession())
114+
this.client = validClient
115+
clientToConnect.endBusy()
111116

112-
// Now that the client is ready let's setup the server for us
113-
viewer_call({
114-
schema: schemas.opengeodeweb_viewer.viewer.reset_visualization,
115-
})
116-
this.is_running = true
117-
resolve()
118-
})
119-
.catch((error) => {
120-
console.error(error)
121-
reject(error)
117+
// Now that the client is ready let's setup the server for us
118+
viewer_call({
119+
schema:
120+
schemas.opengeodeweb_viewer.viewer.reset_visualization,
121+
})
122+
this.status = Status.CONNECTED
123+
resolve()
124+
})
125+
.catch((error) => {
126+
console.error(error)
127+
this.status = Status.NOT_CONNECTED
128+
reject(error)
129+
})
122130
})
131+
}
123132
})
124133
},
125134
start_request() {
@@ -129,4 +138,7 @@ export const use_viewer_store = defineStore("viewer", {
129138
this.request_counter--
130139
},
131140
},
141+
share: {
142+
omit: ["status", "client"],
143+
},
132144
})

utils/status.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
const Status = {
2+
NOT_CREATED: "NOT_CREATED",
3+
CREATING: "CREATING",
4+
CREATED: "CREATED",
5+
NOT_CONNECTED: "NOT_CONNECTED",
6+
CONNECTING: "CONNECTING",
7+
CONNECTED: "CONNECTED",
8+
}
9+
10+
export default Status

0 commit comments

Comments
 (0)