About this library
ae (almost everything) is an auxiliary general-purpose D library. Its design goals are composability and simplicity.
Among many things, it implements an asynchronous event loop, and several network protocols, such as HTTP / IRC / TLS.
Overview
The library is split into the following packages:
ae.demo
โ This package contains a few demos for various parts of the library.ae.net
โ All the networking code (event loop, HTTP, NNTP, IRC) lives here.ae.sys
โ Utility code which primarily interfaces with other systems (including the operating system).ae.ui
โ Framework for creating 2D games and graphical applications (SDL, OpenGL).ae.utils
โ Utility code which primarily manipulates data.
Notable sub-packages:
ae.sys.d
โ Builds arbitrary versions of D. Shared by Digger, DAutoTest, and TrenD.ae.sys.net
โ High-level synchronous API for accessing network resources (URLs). Includes implementations based on cURL, WinINet, andae.net
.ae.utils.functor
โ Functor primitives and functions, allowing@nogc
range manipulation and text formatting.ae.utils.graphics
โ Contains a templated graphical context optimized for speed, and basic support for a few image formats.ae.utils.promise
โ Implementation of Promises/A+,async
/await
, and related operations. Can be used on top of theae.net
asynchronous API.ae.utils.time
โ Supplementscore.time
andstd.datetime
with extras such as PHP-like parsing / formatting and floating-point duration operations.
General concepts:
-
Data: Many modules that handle raw data (from the network / disk) do so using the
Data
structure, defined inae.sys.data
. See the module documentation for a description of the type; the quick version is that it is a type equivalent tovoid[]
, with a few benefits. Some modules useDataVec
, aData
vector with deterministic lifetime, to minimize copying / reallocations when handling byte streams with unknown length. -
Networking: ae uses asynchronous event-based networking. A
select
-based event loop dispatches events to connection objects, which then propagate them to higher-level code as necessary.libev
support is also available. -
UI: The
ae.ui
package contains basic support for cross-platform interactive applications using SDL. There is a working game demo inae.demo.pewpew
.
What uses this library?
- DFeed (forum.dlang.org) - networking, SQLite
- Digger -
ae.sys.d
- DAutoTest -
ae.sys.d
, web server - btdu - utility functions, duration parsing, functors
- monocre - image processing
- Community WormNET services for Worms Armageddon (web snooper, community server, HostingBuddy)
- Most of my D projects
- Find more uses on GitHub
Documentation
You may peruse the documentation generated from DDoc on ae.dpldocs.info.
Other ways to get started with this library is to:
- Play with the demo programs (in the
demo
directory) - Look at open-source projects using this library (see above)
- Use your editor's "go to definition" feature to navigate the implementation.
Using this library
-
If you are using Dub, simply add a dependency to
ae
(or a subpackage) in your project.The main package has no additional dependencies, with the rest of the library being split out into sub-packages which have additional dependencies (such as OpenSSL).
See
dub.sdl
for details. -
If you are not using Dub, note that this library has multiple entry points and many optional dependencies, so compiling and linking all
*.d
files into a single library will not work. In this circumstance, the best way is to simply use recursive compilation (rdmd
ordmd -i
).You can achieve strong versioning and avoid configuring compiler import paths by setting it up as a git submodule in your project's root, as seen here.
Versioning
There are currently no stable/development branches, and versioning is done only according to the number of commits in master
.
Breaking changes are prefixed with [BREAKING]
in the commit message.
Each such commit includes a rationale and instructions for updating affected code.
Tags are created regularly for the benefit of Dub packages (e.g. Digger).
The bleeding-edge version can be found in the next
branch (which may be regularly force-pushed).
License
Except where stated otherwise, this library is licensed under the Mozilla Public License, v. 2.0. (Approximate summary: you only need to publish the source code of the files from this library that you edited.)
Modules under licenses other than MPL are:
ae.utils.digest_murmurhash3
- D port of a C MurmurHash3 implementation. Public Domain.ae.utils.graphics.fonts.font8x8
- Data for an 8x8 bitmap font created by Daniel Hepper. Public Domain.ae.utils.graphics.hls
- Code to convert between RGB and HLS. Ported from a Microsoft Knowledge Base article. License unclear.ae.utils.text.parsefp
- Parse floating-point values from strings. Adapted from Phobos. Boost License 1.0.