mirror of
https://github.com/livebook-dev/livebook.git
synced 2025-11-17 14:19:53 +08:00
* Prototype standalone mode with mix * Move runtime initialization into separate LiveViews * Make standalone node initialization async * Refactor async node initialization * Automatically scroll to the bottom of output * Refactor streaming output * Move MessageEmitter under Utils * Add path selector to the mix runtime picker * Update runtime descriptions * Add successful or error message at the end of output * Run formatter * Rename Standalone to ElixirStandalone for consistency * Show only directories when looking for a mix project * Update docs * Extract shared standalone logic * Make the remote primary process monitor Manager instead of session * Further refactoring and docs * Add tests for collectable Callback * Add missing macro doc * Apply review suggestions * Decouple sending asynchronous notifications from the runtime initialization * Apply suggestions
46 lines
1.1 KiB
Elixir
46 lines
1.1 KiB
Elixir
defmodule LiveBook.Utils do
|
|
@moduledoc false
|
|
|
|
@type id :: binary()
|
|
|
|
@doc """
|
|
Generates a random binary id.
|
|
"""
|
|
@spec random_id() :: binary()
|
|
def random_id() do
|
|
:crypto.strong_rand_bytes(20) |> Base.encode32(case: :lower)
|
|
end
|
|
|
|
@doc """
|
|
Generates a random short binary id.
|
|
"""
|
|
@spec random_short_id() :: binary()
|
|
def random_short_id() do
|
|
:crypto.strong_rand_bytes(5) |> Base.encode32(case: :lower)
|
|
end
|
|
|
|
@doc """
|
|
Converts the given name to node identifier.
|
|
"""
|
|
@spec node_from_name(String.t()) :: atom()
|
|
def node_from_name(name) do
|
|
if name =~ "@" do
|
|
String.to_atom(name)
|
|
else
|
|
# Default to the same host as the current node
|
|
[_, host] = node() |> Atom.to_string() |> String.split("@")
|
|
:"#{name}@#{host}"
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Registers the given process under `name` for the time of `fun` evaluation.
|
|
"""
|
|
@spec temporarily_register(pid(), atom(), (... -> any())) :: any()
|
|
def temporarily_register(pid, name, fun) do
|
|
Process.register(pid, name)
|
|
fun.()
|
|
after
|
|
Process.unregister(name)
|
|
end
|
|
end
|