Packages
livebook
0.19.6
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_web/controllers/dev_controller.ex
defmodule LivebookWeb.DevController do
use LivebookWeb, :controller
alias Livebook.LiveMarkdown
plug :disallow_browser
plug :require_enabled
def sync(conn, %{"file" => path}) when is_binary(path) do
file = Livebook.FileSystem.File.local(path)
session =
Livebook.Sessions.list_sessions()
|> Enum.find(fn session ->
session.file != nil and Livebook.FileSystem.File.equal?(session.file, file)
end)
if session do
Livebook.Session.sync_file(session.pid)
json(conn, %{status: "ok"})
else
conn
|> put_status(404)
|> json(%{status: "error", message: "No session found for the given file"})
end
end
def open(conn, %{"file" => path}) when is_binary(path) do
file = Livebook.FileSystem.File.local(path)
session =
Livebook.Sessions.list_sessions()
|> Enum.find(fn session ->
session.file != nil and Livebook.FileSystem.File.equal?(session.file, file)
end)
if session do
json(conn, %{path: ~p"/sessions/#{session.id}"})
else
case Livebook.FileSystem.File.read(file) do
{:ok, content} ->
{notebook, _} = LiveMarkdown.notebook_from_livemd(content)
{:ok, session} =
Livebook.Sessions.create_session(
notebook: notebook,
file: file,
origin: {:file, file}
)
json(conn, %{path: ~p"/sessions/#{session.id}"})
{:error, reason} ->
conn
|> put_status(422)
|> json(%{status: "error", message: "Failed to read file: #{reason}"})
end
end
end
def restamp(conn, %{"old_source" => old_source, "new_source" => new_source})
when is_binary(old_source) and is_binary(new_source) do
{notebook_before, %{has_stamp?: has_stamp?, stamp_verified?: stamp_verified?}} =
LiveMarkdown.notebook_from_livemd(old_source)
if has_stamp? and not stamp_verified? do
conn
|> put_status(422)
|> json(%{status: "error", message: "The old_source stamp is invalid"})
else
{notebook_after, %{stamp_verified?: new_stamp_verified?}} =
LiveMarkdown.notebook_from_livemd(new_source)
if new_stamp_verified? do
json(conn, %{source: new_source})
else
stamp_metadata = LiveMarkdown.Export.notebook_stamp_metadata(notebook_before)
notebook_after = LiveMarkdown.Import.apply_stamp_metadata(notebook_after, stamp_metadata)
{source, _warnings} = LiveMarkdown.notebook_to_livemd(notebook_after)
json(conn, %{source: source})
end
end
end
defp disallow_browser(conn, _opts) do
if get_req_header(conn, "origin") == [] do
conn
else
conn
|> put_status(403)
|> json(%{status: "error", message: "This endpoint is not available in the browser"})
|> halt()
end
end
defp require_enabled(conn, _opts) do
if Livebook.Settings.dev_endpoints_enabled?() do
conn
else
conn
|> put_status(403)
|> json(%{
status: "error",
message: "Dev endpoints are disabled, you can enable them in the settings"
})
|> halt()
end
end
end