ChangeLog

0.7 - 2024-04-17

Added

  • Add seccomp support.

  • Add filesystem.mkdir() to complement filesystem.create_directory().

  • filesystem.mode() accepts new arguments now.

  • Add filesystem.chroot().

  • filesystem.current_working_directory() accepts file_descriptor objects on UNIX now.

  • Add extra optional parameter to filesystem.mknod().

  • Add filesystem.clock.epoch(). It’s useful to set the last modification date of every file in some directory for the purposes of a reproducible build or something. However there are more attributes besides last-write-time you need to care about if you’re planning to play with reproducible builds (be warned!).

  • Add filesystem.clock.unix_epoch() and filesystem.clock.now().

  • Add more POSIX bindings to init.script API.

  • Add the flock() family to file.stream and file.random_access.

  • Now it’s possible to configure Landlock mode for the calling process or system.spawn() subprocesses.

  • Add byte_span methods for primitive types serialization (e.g. reading i32le from a 4-sized buffer). It also works as an endianness handling interface. 64-bit integers are omitted from the interface because LuaJIT only offers a hacky way to handle them.

Changed

  • Make subprocess.pid nullable. That’s useful for synchronization when multiple fibers are observing parts of subprocess state.

  • Allow file_descriptor.close() to be called multiple times in a row.

  • Change filesystem.copy_file() parameters.

  • Change every name in the module filesystem from hard_* to hard* (e.g. create_hard_link() to create_hardlink()). This C++17 convention is dumb and Python’s pathlib is the one who got it right.

  • Change default record_separator in stream.scanner to "\n".

  • Always start subprocess-based actors with umask 022.

  • Change system.spawn() parameters from nsenter_* to setns_*.

Fixed

  • Close file descriptors from builtin PID1 so EPIPE propagates sooner.

  • Fix races in filesystem.current_working_directory(). Now fchdir() is used.

  • Small documentation issues.

  • Avoid potential IO double-flush on FreeBSD after fork().

0.6 - 2024-01-06

Added

  • Add FreeBSD’s jails support.

  • Add function format() to format strings. The implementation uses C++'s libfmt.

  • Add more functions to the module filesystem: exists(), is_block_file(), is_character_file(), is_directory(), is_fifo(), is_other(), is_regular_file(), is_socket(), is_symlink(), mode(). It was already possible to query for these attributes. These functions were added as an extra convenience.

  • Add yet more functions to the module filesystem: mkfifo(), mknod(), makedev().

  • New UNIX socket options to retrieve security labels and credentials from the remote process.

  • file_descriptor implemented for Windows pipes and file.stream.

  • Many improvements to Windows version of system.spawn().

Changed

  • Convert decomposition functions from filesystem.path to properties: root_name, root_directory, root_path, relative_path, parent_path, filename, stem, extension.

  • Convert some filesystem.path properties to string: root_name, root_directory, filename, stem, extension.

  • filesystem.path.iterator() will return strings at each iteration now.

Removed

  • Remove HTTP & WebSocket classes. They should be offered as separate plugins.

0.5 - 2023-12-03

Added

  • Add mutex.try_lock().

  • Add module recursive_mutex.

  • Add module future.

  • Add filesystem.chown().

  • Enable IPC-based actors on all UNIX systems.

  • Add Linux Landlock support.

  • Add FreeBSD Capsicum support.

Changed

  • spawn_vm() performs the same module path resolution from require() now. That means it’s possible to use root-imports from spawn_vm().

  • spawn_vm() parameters refactored (API break).

0.4 - 2023-04-03

Added

  • A new byte_span type akin to Go slices is used for IO ops.

  • Actor channels now can transceive file descriptors.

  • Support for Linux namespaces. Now you can set up sandboxes and run isolated actors (or just the well-known containers).

  • Modules ip and tls grew a lot. The API for sockets now supports IO ops on byte_span instances, and plenty of new functions and classes (including UDP) were added.

  • New modules.

    • time: clocks and timers.

    • pipe.

    • unix: UNIX domain sockets.

    • serial_port: serial ports.

    • system: UNIX signals, CLI args, env vars, process credentials, and much more.

    • file: file IO. Only available on systems with proactors (e.g. Windows with IOCP, and Linux with io_uring). BSD can still be supported later (with kqueue + POSIX AIO).

    • filesystem: portable path-manipulation, and plenty of filesystem operations & algorithms.

    • stream: AWK-inspired scanner and common stream algorithms.

    • regex: Basic regex functions. The interface has been inspired by C++, Python and AWK.

    • generic_error: portable error comparison for filesystem, sockets, and much more.

    • asio_error: errors thrown by the asio layer.

    • websocket.

  • Lua programs can define their own error categories now.

  • Several new OS-specific APIs (e.g. Linux capabilities, and Windows' TransmitFile()).

  • Add http.request.upgrade_desired().

  • http.socket can work on top of UNIX domain stream sockets now.

  • Documentation can now be installed as manpages.

  • Support for io_uring.

Changed

  • Upgrade to C++20. The motivating feature for the upgrade was std::atomic<std::weak_ptr<T>>. However, other C++20 features are being used as well.

  • Moved steady_timer to the new module time.

  • tls.ctx renamed to tls.context.

  • inbox.recv() renamed to inbox.receive()

  • Module cond renamed to condition_variable.

  • error_code.cat renamed to error_code.category.

  • spawn_ctx_threads() renamed to spawn_context_threads().

  • inherit_ctx renamed to inherit_context in spawn_vm().

  • Now Emilua is less liberal on accepted values for env var EMILUA_COLORS.

  • Finer-grained cancellation of IO ops.

  • Locales are set at application startup.

  • The build system now makes use of Meson’s wrap system.

Removed

  • Removed println().

  • Removed sleep_for. Its functionality has been replaced by the module time.

  • Removed ip.tcp.resolver. Its functionality has been replaced by ip.get_address_info().

Fixed

  • Bug fixes.

0.3 - 2021-03-04

Added

  • HTTP request and response objects now use read-write locks and there is some limited sharing that you can do with them without stumbling upon EBUSY errors.

  • Improvements to the module system (that’s the main feature for this release). You should be able to use guix as the package manager for your emilua projects.

  • EMILUA_PATH environment variable.

  • Native plugins API (it can be disabled at build configure time).

  • Add logging module.

  • Add manpage.

  • --version CLI arg.

  • Build configure options to disable threading.

Changed

  • Use fmtlib from host system.

0.2 - 2021-01-31

Added

  • Add HTTP query function: http.request.continue_required().

Changed

  • Refactor module system. The new module system is incompatible with the previous one. Please refer to the documentation.

  • Numeric values for error codes changed.

Removed

  • Remove failed_to_load_module error code. Now you should see "iostream error" or other more informative error reasons upon a failed module load.

Fixed

  • Fix build when compiler is GCC.