improvements

0ff6a83 · gmorell · 2026-04-26 03:45

10 files +64 -41

Files changed

modified apps/room_sanctum/lib/room_sanctum/workers/vision_worker.ex
+62 −41
@@ -13,6 +13,8 @@ defmodule RoomSanctum.Worker.Vision do
13 13 end
14 14
15 15 def init(opts) do
16 + Process.flag(:trap_exit, true)
17 +
16 18 Periodic.start_link(
17 19 every: :timer.seconds(4),
18 20 run: fn -> RoomSanctum.Worker.Vision.refresh_db_cfg(opts[:id]) end,
@@ -25,7 +27,7 @@ defmodule RoomSanctum.Worker.Vision do
25 27 initial_delay: 100
26 28 )
27 29
28 − {:ok, %{id: opts[:id], vision: nil, vision_q: [], data: [], query_task: nil}}
30 + {:ok, %{id: opts[:id], vision: nil, vision_q: [], data: %{}, query_task: nil}}
29 31 end
30 32
31 33 defp via_tuple(name), do: {:via, Registry, {@registry, name}}
@@ -85,6 +87,14 @@ defmodule RoomSanctum.Worker.Vision do
85 87 {:noreply, state}
86 88 end
87 89
90 + def handle_info({:EXIT, pid, reason}, state) do
91 + if state.query_task && state.query_task.pid == pid and reason != :normal do
92 + Logger.warning("Vision query task crashed: #{inspect(reason)}; keeping previous data")
93 + end
94 +
95 + {:noreply, state}
96 + end
97 +
88 98 def handle_info(_msg, state) do
89 99 {:noreply, state}
90 100 end
@@ -111,56 +121,67 @@ defmodule RoomSanctum.Worker.Vision do
111 121 vision_q
112 122 |> Enum.map(fn q ->
113 123 r =
114 − case q.source.type do
115 − :gtfs ->
116 − RoomGtfs.Worker.query_stop(q.source.id, q.query)
124 + try do
125 + query_one(q)
126 + rescue
127 + e ->
128 + Logger.warning(
129 + "Query failed for #{inspect(q.source.type)} (#{q.source.id}): #{Exception.message(e)}"
130 + )
117 131
118 − :gbfs ->
119 − RoomGbfs.Worker.query_stop(q.source.id, q.query)
132 + []
133 + catch
134 + kind, reason ->
135 + Logger.warning(
136 + "Query #{kind} for #{inspect(q.source.type)} (#{q.source.id}): #{inspect(reason)}"
137 + )
120 138
121 − :tidal ->
122 − RoomTidal.Worker.query_tides(q.source.id, q.query)
139 + []
140 + end
123 141
124 − :weather ->
125 − RoomWeather.Worker.query_weather(
126 − q.source.id,
127 − q.query
128 − )
142 + {{q.id, q.source.type}, r}
143 + end)
144 + |> Enum.into(%{})
145 + end
129 146
130 − :aqi ->
131 − RoomAirQuality.Worker.query_place(
132 − q.source.id,
133 − q.query
134 − )
147 + defp query_one(q) do
148 + case q.source.type do
149 + :gtfs ->
150 + RoomGtfs.Worker.query_stop(q.source.id, q.query)
135 151
136 − :ephem ->
137 − RoomEphem.Worker.query_ephem(
138 − q.source.id,
139 − q.query
140 − )
152 + :gbfs ->
153 + RoomGbfs.Worker.query_stop(q.source.id, q.query)
141 154
142 − :calendar ->
143 − RoomCalendar.Worker.query_calendar(
144 − q.source.id,
145 − q.query
146 − )
155 + :tidal ->
156 + RoomTidal.Worker.query_tides(q.source.id, q.query)
157 +
158 + :weather ->
159 + RoomWeather.Worker.query_weather(q.source.id, q.query)
160 +
161 + :aqi ->
162 + RoomAirQuality.Worker.query_place(q.source.id, q.query)
147 163
148 − :cronos ->
149 − RoomCronos.Worker.query_cronos(q.id, q.query)
164 + :ephem ->
165 + RoomEphem.Worker.query_ephem(q.source.id, q.query)
150 166
151 − :gitlab ->
152 − case RoomGitlab.Worker.pid(q.source.id) do
153 − nil -> []
154 − _val -> (Process.alive?(RoomGitlab.Worker.pid(q.source.id)) &&
155 − RoomGitlab.Worker.read_jobs(q.source.id, q.query)) || []
156 − end
167 + :calendar ->
168 + RoomCalendar.Worker.query_calendar(q.source.id, q.query)
157 169
158 − :packages ->
159 − RoomPackages.Worker.read(q.source.id, q.query)
170 + :cronos ->
171 + RoomCronos.Worker.query_cronos(q.id, q.query)
172 +
173 + :gitlab ->
174 + case RoomGitlab.Worker.pid(q.source.id) do
175 + nil ->
176 + []
177 +
178 + _val ->
179 + (Process.alive?(RoomGitlab.Worker.pid(q.source.id)) &&
180 + RoomGitlab.Worker.read_jobs(q.source.id, q.query)) || []
160 181 end
161 182
162 − {{q.id, q.source.type}, r}
163 − end)
164 − |> Enum.into(%{})
183 + :packages ->
184 + RoomPackages.Worker.read(q.source.id, q.query)
185 + end
165 186 end
166 187 end
modified apps/room_sanctum/lib/room_sanctum_web/live/cfg_pythiae_live/show.ex
+2 −0
@@ -36,6 +36,8 @@ defmodule RoomSanctumWeb.PythiaeLive.Show do
36 36 %{data: data, queries: queries} =
37 37 RoomSanctum.Worker.Vision.get_state(socket.assigns.pythiae.curr_vision)
38 38
39 + data = if is_map(data), do: data, else: Map.new(data)
40 +
39 41 shuffled_consts = socket.assigns.pythiae.consts |> Enum.shuffle |> Enum.with_index |> Enum.map(fn {c, i} -> {{c.title, :const}, c} end) |> Map.new
40 42
41 43 data = Map.merge(data, shuffled_consts) |> Enum.shuffle

Parents: 9f1057c