Apply mix format to fix formatting issues that were missed before pushing. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
62 lines
1.7 KiB
Elixir
62 lines
1.7 KiB
Elixir
defmodule Aprsme.DeploymentNotifier do
|
|
@moduledoc """
|
|
Monitors for deployment changes and notifies connected clients.
|
|
In k8s, this detects when the DEPLOYED_AT environment variable changes.
|
|
"""
|
|
use GenServer
|
|
|
|
require Logger
|
|
|
|
@check_interval 30_000
|
|
|
|
def start_link(opts \\ []) do
|
|
GenServer.start_link(__MODULE__, opts, name: __MODULE__)
|
|
end
|
|
|
|
def init(_opts) do
|
|
# Schedule first check
|
|
Process.send_after(self(), :check_deployment, @check_interval)
|
|
|
|
# Get initial deployment timestamp
|
|
deployed_at = Aprsme.Release.deployed_at()
|
|
|
|
{:ok, %{deployed_at: deployed_at}}
|
|
end
|
|
|
|
def handle_info(:check_deployment, state) do
|
|
# Schedule next check
|
|
Process.send_after(self(), :check_deployment, @check_interval)
|
|
|
|
# Get current deployment timestamp
|
|
current_deployed_at = Aprsme.Release.deployed_at()
|
|
|
|
# Check if deployment timestamp changed (shouldn't happen in same process, but useful for monitoring)
|
|
if current_deployed_at == state.deployed_at do
|
|
{:noreply, state}
|
|
|
|
# Broadcast the new deployment
|
|
else
|
|
Logger.info("Deployment timestamp changed from #{state.deployed_at} to #{current_deployed_at}")
|
|
|
|
Phoenix.PubSub.broadcast(
|
|
Aprsme.PubSub,
|
|
"deployment_events",
|
|
{:new_deployment, %{deployed_at: current_deployed_at}}
|
|
)
|
|
|
|
{:noreply, %{state | deployed_at: current_deployed_at}}
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Notify about a new deployment immediately.
|
|
This can be called from the release module when deployment is detected.
|
|
"""
|
|
def notify_deployment(deployed_at) do
|
|
Phoenix.PubSub.broadcast(
|
|
Aprsme.PubSub,
|
|
"deployment_events",
|
|
{:new_deployment, %{deployed_at: deployed_at}}
|
|
)
|
|
end
|
|
end
|