.. _lua_introduction:
Introduction
============
`Lua `_ is a powerful, efficient, lightweight,
embeddable scripting language.
WirePlumber uses `Lua version 5.4 `_ to
implement its engine. For older systems, Lua 5.3 is also supported.
There are currently two uses for Lua in WirePlumber:
- To implement the scripting engine
- To implement lua-based :ref:`config files `
This section is only documenting the API of the **scripting engine**
Lua Reference
-------------
If you are not familiar with the Lua language and its API, please refer to
the `Lua 5.4 Reference Manual `_
Sandbox
-------
WirePlumber's scripting engine sandboxes the lua scripts to a safe environment.
In this environment, the following rules apply:
- Scripts are isolated from one another; global variables in one script
are not visible from another, even though they are actually executed in
the same ``lua_State``
- Tables that hold API methods are not writable. While this may sound strange,
standard Lua allows you to change standard API, for instance
``string.format = rogue_format`` is valid outside the sandbox.
WirePlumber does not allow that.
- The standard Lua API is limited to a subset of safe functions. For instance,
functions that interact with the file system (io.*) and the process's state
(ex.: os.exit) are **not** allowed.
Here is a full list of Lua functions (and API tables) that are exposed:
.. literalinclude:: ../../../modules/module-lua-scripting/wplua/sandbox.lua
:language: lua
:lines: 27-30
- Object methods are not exposed in public tables. To call an object method
you must use the method call syntax of Lua, i.e. ``object:method(params)``
The following, for instance, is **not** valid:
.. code-block:: lua
-- this will cause an exception
local node = ...
Node.send_command(node, "Suspend")
The correct form is this:
.. code-block:: lua
local node = ...
node:send_command("Suspend")