Packages
livebook
0.14.4
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/plugs/memory_provider.ex
defmodule LivebookWeb.MemoryProvider do
@gzippable_exts ~w(.js .css .txt .text .html .json .svg .eot .ttf)
# Configurable implementation of `LivebookWeb.StaticPlug.Provider` behaviour,
# that bundles the files into the module compiled source.
#
# ## `use` options
#
# * `:from` (**required**) - where to read the static files from. See `Plug.Static` for more details.
#
# * `:gzip` - whether to bundle gzipped version of the files,
# in which case the uncompressed files are not included. Defaults to `false`.
defmacro __using__(opts) do
quote bind_quoted: [opts: opts] do
@behaviour LivebookWeb.StaticPlug.Provider
from = Keyword.fetch!(opts, :from)
static_path = LivebookWeb.StaticPlug.Provider.static_path(from)
paths = LivebookWeb.MemoryProvider.__paths__(static_path)
files = LivebookWeb.MemoryProvider.__preload_files__!(static_path, paths, opts)
for path <- paths do
abs_path = Path.join(static_path, path)
@external_resource Path.relative_to_cwd(abs_path)
end
@impl true
def get_file(segments, compression)
for {segments, compression, file} <- files do
def get_file(unquote(segments), unquote(compression)), do: unquote(Macro.escape(file))
end
def get_file(_, _), do: nil
# Force recompilation if the static files change.
def __mix_recompile__? do
current_paths = LivebookWeb.MemoryProvider.__paths__(unquote(static_path))
:erlang.md5(current_paths) != unquote(:erlang.md5(paths))
end
end
end
def __preload_files__!(static_path, paths, opts) do
gzip? = Keyword.get(opts, :gzip, false)
Enum.map(paths, fn path ->
segments = Path.split(path)
abs_path = Path.join(static_path, path)
content = File.read!(abs_path)
digest = content |> :erlang.md5() |> Base.encode16(case: :lower)
if gzip? and Path.extname(path) in @gzippable_exts do
gzipped_content = :zlib.gzip(content)
{segments, :gzip, %LivebookWeb.StaticPlug.File{content: gzipped_content, digest: digest}}
else
{segments, nil, %LivebookWeb.StaticPlug.File{content: content, digest: digest}}
end
end)
end
def __paths__(static_path) do
Path.join(static_path, "**")
|> Path.wildcard()
|> Enum.reject(&File.dir?/1)
|> Enum.map(&String.replace_leading(&1, static_path <> "/", ""))
|> Enum.sort()
end
end