Executor
Executes your code, REPL style.
Warning: This app executes code dangerously, use with caution
The ideal case for this app is to have it deployed in a Docker container with an exposed API where it can do little to no harm.
Currently Supported Languages
- elixir
- ruby
- node (any Javascript that Node can run)
Install
Make sure that you have whatever language(s) you want to use installed/available on the machine you will be running this on.
Add executor to you dependencies in mix.exs
defp deps do
[
{:executor, "~> 0.0.3"},
]
end
Then install
mix deps.getUsage
Common API looks like: Executor.Language.run("code as string")
Example in IEx:
# ruby
iex(2)> Executor.Ruby.run "1 + 1"
{:ok, %{return: "2", stdout: ""}}
iex(2)> Executor.Ruby.run "[].upcase"
{:error,
%{error_message: "undefined method `upcase' for []:Array",
error_type: "NoMethodError", return: nil, stdout: ""}}
iex(3)> Executor.Ruby.run "puts 'hello'; [1,2,3]"
{:ok, %{return: "[1, 2, 3]", stdout: "hello"}}
# node
iex(4)> Executor.Node.run "1 + 1"
{:ok, %{return: "2", stdout: ""}}
iex(5)> Executor.Node.run "1 / 0"
{:ok, %{return: "Infinity", stdout: ""}}
iex(6)> Executor.Node.run "apple.juice()"
{:error,
%{error_message: "apple is not defined", error_type: "ReferenceError",
return: nil, stdout: ""}}
iex(7)> Executor.Node.run "console.log('hello world')"
{:ok, %{return: "undefined", stdout: "hello world"}}
# elixir
iex(9)> Executor.Elixir.run "1 + 1"
{:ok, %{return: "2", stdout: ""}}
iex(10)> Executor.Elixir.run "0 / 0"
{:error,
%{error_message: "bad argument in arithmetic expression",
error_type: "ArithmeticError", return: nil, stdout: ""}}
iex(11)> Executor.Elixir.run "IO.puts \"hello world\""
{:ok, %{return: ":ok", stdout: "hello world"}}
# pass language as argument
iex(12)> Executor.run "1 + 1", "ruby"
{:ok, %{return: "2", stdout: ""}}