Packages
livebook
0.14.2
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.6
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.14.0
0.14.0-rc.1
0.14.0-rc.0
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.2
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.3
0.6.2
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
Automate code & data workflows with interactive notebooks
Current section
Files
Jump to
Current section
Files
lib/livebook/hubs/broadcasts.ex
defmodule Livebook.Hubs.Broadcasts do
alias Livebook.FileSystem
alias Livebook.Secrets.Secret
@type broadcast :: :ok | {:error, term()}
@crud_topic "hubs:crud"
@connection_topic "hubs:connection"
@secrets_topic "hubs:secrets"
@file_systems_topic "hubs:file_systems"
@doc """
Subscribes to one or more subtopics in `"hubs"`.
## Messages
Topic `hubs:crud`:
* `{:hub_changed, hub_id}`
* `{:hub_deleted, hub_id}`
Topic `hubs:connection`:
* `{:hub_connected, hub_id}`
* `{:hub_connection_failed, hub_id, reason}`
* `{:hub_server_error, hub_id, reason}`
Topic `hubs:secrets`:
* `{:secret_created, %Secret{}}`
* `{:secret_updated, %Secret{}}`
* `{:secret_deleted, %Secret{}}`
Topic `hubs:file_systems`:
* `{:file_system_created, FileSystem.t()}`
* `{:file_system_updated, FileSystem.t()}`
* `{:file_system_deleted, FileSystem.t()}`
"""
@spec subscribe(atom() | list(atom())) :: :ok | {:error, term()}
def subscribe(topics) when is_list(topics) do
for topic <- topics, do: subscribe(topic)
:ok
end
def subscribe(topic) do
Phoenix.PubSub.subscribe(Livebook.PubSub, "hubs:#{topic}")
end
@doc """
Unsubscribes from `subscribe/0`.
"""
@spec unsubscribe(atom() | list(atom())) :: :ok
def unsubscribe(topics) when is_list(topics) do
for topic <- topics, do: unsubscribe(topic)
:ok
end
def unsubscribe(topic) do
Phoenix.PubSub.unsubscribe(Livebook.PubSub, "hubs:#{topic}")
end
@doc """
Broadcasts under `#{@crud_topic}` topic when hubs changed.
"""
@spec hub_changed(String.t()) :: broadcast()
def hub_changed(hub_id) do
broadcast(@crud_topic, {:hub_changed, hub_id})
end
@doc """
Broadcasts under `#{@crud_topic}` topic when hub is deleted.
"""
@spec hub_deleted(String.t()) :: broadcast()
def hub_deleted(hub_id) do
broadcast(@crud_topic, {:hub_deleted, hub_id})
end
@doc """
Broadcasts under `#{@connection_topic}` topic when hub connected.
"""
@spec hub_connected(String.t()) :: broadcast()
def hub_connected(hub_id) do
broadcast(@connection_topic, {:hub_connected, hub_id})
end
@doc """
Broadcasts under `#{@connection_topic}` topic when hub is out-of-date.
"""
@spec hub_server_error(String.t(), String.t()) :: broadcast()
def hub_server_error(hub_id, reason) when is_binary(reason) do
broadcast(@connection_topic, {:hub_server_error, hub_id, reason})
end
@doc """
Broadcasts under `#{@connection_topic}` topic when hub received a connection error.
"""
@spec hub_connection_failed(String.t(), String.t()) :: broadcast()
def hub_connection_failed(hub_id, reason) when is_binary(reason) do
broadcast(@connection_topic, {:hub_connection_failed, hub_id, reason})
end
@doc """
Broadcasts under `#{@secrets_topic}` topic when hub received a new secret.
"""
@spec secret_created(Secret.t()) :: broadcast()
def secret_created(%Secret{} = secret) do
broadcast(@secrets_topic, {:secret_created, secret})
end
@doc """
Broadcasts under `#{@secrets_topic}` topic when hub received an updated secret.
"""
@spec secret_updated(Secret.t()) :: broadcast()
def secret_updated(%Secret{} = secret) do
broadcast(@secrets_topic, {:secret_updated, secret})
end
@doc """
Broadcasts under `#{@secrets_topic}` topic when hub received a deleted secret.
"""
@spec secret_deleted(Secret.t()) :: broadcast()
def secret_deleted(%Secret{} = secret) do
broadcast(@secrets_topic, {:secret_deleted, secret})
end
@allowed_file_systems [FileSystem.S3]
@doc """
Broadcasts under `#{@file_systems_topic}` topic when hub received a new file system.
"""
@spec file_system_created(FileSystem.t()) :: broadcast()
def file_system_created(%struct{} = file_system) when struct in @allowed_file_systems do
broadcast(@file_systems_topic, {:file_system_created, file_system})
end
@doc """
Broadcasts under `#{@file_systems_topic}` topic when hub received an updated file system.
"""
@spec file_system_updated(FileSystem.t()) :: broadcast()
def file_system_updated(%struct{} = file_system) when struct in @allowed_file_systems do
broadcast(@file_systems_topic, {:file_system_updated, file_system})
end
@doc """
Broadcasts under `#{@file_systems_topic}` topic when hub received a deleted file system.
"""
@spec file_system_deleted(FileSystem.t()) :: broadcast()
def file_system_deleted(%struct{} = file_system) when struct in @allowed_file_systems do
broadcast(@file_systems_topic, {:file_system_deleted, file_system})
end
defp broadcast(topic, message) do
Phoenix.PubSub.broadcast(Livebook.PubSub, topic, message)
end
end