- Improved the logging system with pluggable loggers, more specified verbose log levels, an HTML logger, and proper use of stdout/stderr
- Added basic compile support for 64-bit Windows (using the "win32" driver)
- Add a scoped alternative version of
vibe.core.concurrency.lock
(used for safe access toshared
objects with unshared methods) - Add support to repeat the idle event until a new message arrives
- Task is now weakly isolated and can thus be passed to other threads using
runWorkerTask
- Implemented digest authentication in the MongoDB client (by Christian Schneider aka HowToMeetLadies) - pull #218
- The number of worker threads is now
core.cpuid.threadsPerCPU
TaskMutex
is now fully thread safe and has much lower overhead when no contention happensTaskCondition
now also works with a plainMutex
in addition to aTaskMutex
- Removed the deprecated
Mutex
alias - Renamed
Signal
toManualEvent
to avoid confusion with other kinds of "signals" MemoryStream
now supports dynamically growing to the buffer limitHttpServer
will now drop incoming connections that don't send data within 10 seconds after the connection has been established- Added a new
createTimer
overload that doesn't automatically arm the timer after creation exitEventLoop
now by default also shuts down the worker threads (ifenableWorkerThreads
was called)- Added new command line options "--vv", "--vvv" and "--vvvv" to specify more verbose logging
- Added connection pooling to the Redis client (by Junho Nurminen aka jupenur) - pull #199
- Various documentation improvements and better adherence to the style guide
- Compiles with DMD 2.063 (mostly by Vladimir Panteleev aka CyberShadow) - pull #207
- All examples now use exact imports rather than using
import vibe.vibe;
orimport vibe.d;
- Moved basic WWW form parsing from
vibe.http.form
tovibe.inet.webform
to reduce intermodule dependencies and improve compile time - MongoDB URL parsing code uses
vibe.inet.webform
to parse query string arguments now instead ofstd.regex
- improves compile time - Much more complete REST interface generator example (by Михаил Страшун aka Dicebot) - pull #210
- Updated OpenSSL DLLs to 1.0.1e (important security fixes)
- Renamed
EventedObject.isOwner
toamOwner
- Improved intermodule dependencies, configuration option/file handling and added
pragma(lib)
(using "--version=VibePragmaLib") for more comfortable building without dub/vibe (by Vladimir Panteleev aka CyberShadow) - pull #211 - Implemented an automatic command line help screen (inferred from calls to
vibe.core.args.getOption
) - Added meaningful error messages when the connection to a MongoDB or Redis server fails
- Deprecated
vibe.http.server.startListening
, which is not necessary anymore
- Fixed
vibe.core.concurrency.receiveTimeout
to actually work at all - Fixed
Win32Timer.stop
to reset thepending
state and allow repeated calls - Fixed
HttpClient
to avoid running into keep-alive timeouts (will close the connection 2 seconds before the timeout now) - Fixed
HttpClient
to properly handle responses without a "Keep-Alive" header - Fixed
isWeaklyIsolated
for structs containing functions - Fixed all invalid uses of
countUntil
wherestd.string.indexOf
should have been used instead - issue #205 - Fixed spelling of the "--distport" command line switch and some documentation - pull #203, pull #204
- Fixed spurious error messages when accepting connections in the libevent driver (by Vladimir Panteleev aka CyberShadow) - pull #207
- Fixed adjusting of method names in the REST interface generator for sub interfaces (by Михаил Страшун aka Dicebot) - pull #210
- Fixed falling back to IPv4 if listening on IPv6 fails when calling
listenTCP
without a bind address - Fixed
Libevent2MenualEvent.~this
to not access GC memory which may already be finalized - Fixed
Win32TCPConnection.peerAddress
andWin32UDPConnection.bindAddress
- Partially fixed automatic event loop exit in the Win32 driver (use -version=VibePartialAutoExit for now) - pull #213
- Fixed
renderCompat
to work withconst
parameters - Fixed an error in the Deimos bindings (by Henry Robbins Gouk) - pull #220
- Performance tuning for the HTTP server and client
- Implemented distributed listening and HTTP server request processing (using worker threads to accept connections)
- Stable memory usage for HTTP client and server (tested for 50 million requests)
- Implemented new
TaskMutex
andTaskCondition
classes deriving from Druntime'sMutex
andCondition
for drop-in replacement - Added a simplified version of the
std.concurrency
API that works with vibe.d's tasks (temporary drop-in replacement) - Added support for customizing the HTTP method and path using UDAs in the REST interface generator (by Михаил Страшун aka Dicebot) - pull #189
vibe.core.mutex
andvibe.core.signal
have been deprecated- Added support for WebDAV specific HTTP methods - see also issue #109
- Compiles on DMD 2.061/2.062 in unit test mode
- Added
Json.remove()
for JSON objects - Added
Isolated!T
in preparation of a fully thread-safe API - The package description now exposes a proper set of configurations
- VPM uses the new download URL schema instead of relying on a
"downloadUrl"
field in the package description to stay forward compatible with DUB - The default order to listen is now IPv6 and then IPv4 to avoid the IPv4 listener blocking the IPv6 one on certain systems
- Added
HttpServerSettings.disableDistHost
to forcelistenHttp
to listen immediately, even during initialization - Added
WebSocket.receiveBinary
andWebSocket.receiveText
- issue #182 - Added
HttpServerResponse.writeRawBody
andHttpClientResponse.readRwaBody
to allow for verbatim forwarding - ".gz" and ".tgz" are now recognized as compressed formats and are not transferred with a compressed "Content-Encoding"
- Added a pure scoped callback based version of
requestHttp
to allow GC-less operation and also automatic pipelining of requests in the future
- Fixed some possible crashes and memory leaks in the
HttpClient
- Fixed the
HttpRouter
interface to derive fromHttpServerRequestHandler
- Fixed parsing of version ranges in the deprecated VPM
- Fixed some examples by added a
VibeCustomMain
version to their package.json - Fixed a possible range violation in the Diet compiler for raw/filter nodes
- Fixed detection of horizontal lines in the Markdown parser
- Fixed handling of one character methods in the REST interface generator - pull #195
- Fixed the reverse proxy to not drop the "Content-Length" header
- Fixed
HttpClient
to obey "Connection: close" responses - Fixed
Libevent2Signal
to not move tasks between threads
- Compiles with the latest DUB, which is now the recommended way to build vibe.d projects
- Changed all public enums to use Phobos' naming convention (except for JSON and BSON)
- Moved
vibe.http.common.StrMapCI
tovibe.inet.nessage.InetHeaderMap
- Deprecated all hash modules in
vibe.crypto
in favor ofstd.digest
- Deprecated the
vibe.crypto.ssl
module (functionality moved tovibe.stream.ssl
) - Deprecated a number of functions that are available in Phobos
- Deprecated the setter methods in the
Cookie
class
- Fixed connection unlocking in the
HttpClient
- Fixed detection of unsuccessful SSL connection attempts
- Fixed freeing of SSL/BIO contexts
- Fixed some places in the deprecated VPM to use
Path.toNativeString()
instead ofPath.toString()
- Fixed the
package.json
file of the benchmark project - Fixed cross-thread incovations of
vibe.core.signal.Signal
in the Win32 driver - Fixed compilation on DMD 2.062 - issue #183, issue #184
- Big refactoring of the MongoDB interface to be more consistent with its API (by Михаил Страшун aka Dicebot) - pull #171
- Added a range interface to
MongoCursor
- redo of pull #172 - Added a dub compatible "package.json" file for vibe.d and all example projects
- Parameters can be made optional for
registerFormInterface
now (by Robert Klotzner aka eskimor) - issue #156 - The REST interface generator also supports optional parameters by defining default parameter values
- Added
Task.interrupt()
,Task.join()
andTask.running
- Improved detection of needed imports in the REST interface generater (by Михаил Страшун aka Dicebot) - pull #164
- Partially implemented zero-copy file transfers (still disabled for libevent) - issue #143
- Added
HttpRequest.contentType
andcontentTypeParameters
to avoid errors by direct comparison with the "Content-Type" header - issue #154 - Added a small forward compatibility fix for DUB packages ("vibe.d" is ignored as a dependency)
- Cleaned up the function names for writing out
Json
objects as a string and added convenience methods (partially done in pull #166 by Joshua Niehus) - Renamed
HttpRequest.url
toHttpRequest.requestUrl
and addedHttpRequest.fullUrl
- Added the possibility to write a request body in chunked transfer mode in the
HttpClient
- Added
HttpServerRequest.ssl
to determine if a request was sent encryted - Changed several interfaces to take
scope
delegates to avoid useless GC allocations - Removed the
in_url
parameter fromPath.toString
- now assumed to betrue
SysTime
andDateTime
are now specially treated by the JSON/BSON serialization code- Refactored the
Cookie
interface to properly use@property
(by Nick Sabalausky aka Abcissa) - pull #176 - Added
HttpRouter
as an interface forUrlRouter
(by Laurie Clark-Michalek aka bluepeppers) - pull #177 - Changed
HttpFileServerSettings.maxAge
fromlong
toDuration
(by Nick Sabalausky aka Abcissa) - pull #178 - Added
HttpFileServerSettings.preWriteCallback
(by Nick Sabalausky aka Abcissa) - pull #180
- Fixed matching of the host name in
HttpServer
- is case insensitive now - Fixed issues in
ConnectionPool
andHttpClient
that causedInvalidMemoryOperationError
and invalid multiplexed requests - Fixed
GCAllocator
andPoolAllocator
to enforce proper alignment - Fixed passing of misaligned base pointers to
free()
inMallocAllocator
- at least 32-bit Linux seems to choke on it - issue #157 - Fixed
listenTcp
without an explicit bind address - now returns an array of listeners with one entry per IP protocol version - Fixed "Connection: close" hangs also for HTTP/1.0 clients - those that depended on this behavior are broken anyway - issue #147
- Fixed possible invalid line markers in the mixin generated by the Diet compiler - issue #155
- Fixed all uses of
render!()
in the example projects by replacing them withrenderCompat!()
- issue 159 - Fixed concatenation of
Path
objects, where the LHS is not normalized - Fixed
serializeToBson
in conjunction with read-only fields (by Михаил Страшун aka Dicebot) - pull #168 - Fixed a possible endless loop caused by
ChunkedOutputStream
due to an inconsistent redundant field - Fixed
serializeToJson
in conjunction with read-only fields (same fix as for BSON) - Fixed
download
ignoring theport
property of the target URL - Fixed termination of Fibers by exceptions of already terminated tasks
- Fixed propagation of
HttpStatusException
in the REST interface generator (by Михаил Страшун aka Dicebot) - pull #173 - Fixed handling of multiple cookies with the same name
HttpServerRequest.cookies.getAll()
can now be used to query them - fixes [issue #174][issue174] - Fixed
WebSocket.connected
- issue #169 - Fixed accepting of invalid JSON syntax - issue #161
- Fixed use of
tmpnam
on Posix by replacing withmkstemps
, still used on Windows - issue #137 - Fixed
ZlibInputStream.empty
to be consistent withleastSize
- The
setup-linux.sh
script now installs to/usr/local/share
and uses any existingwww-data
user for its config if possible (by Jordi Sayol) - issue #150, issue #152, issue #153
- Fixed hanging HTTP 1.1 requests with "Connection: close" when no "Content-Length" or "Transfer-Encoding" header is set - issue #147
- User/group for privilege lowering are now specified as "user"/"group" in vibe.conf instead of "uid"/"gid" - see issue #133
- Invalid uid/gid now actually cause the application startup to fail
- TCP sockets in the Win32 back end work now
- Added support for struct and array parameters to
registerFormInterface
(by Robert Klotzner aka eskimor) - issue #138, issue #139, issue #140 registerFormInterface
now ignores static methods (by Robert Klotzner aka eskimor) - issue #136- Added support for arbitrary expressions for attributes in Diet templates
- Added
RedisClient.zrangebyscore
and fixed the return type ofRedistClient.ttl
(long
) (by Simon Kerouack aka ekyo) - issue #141 renderCompat()
does not require the parameter values to be wrapped in a Variant anymore- Added a
BsonObjectID.timeStamp
property that extracts the unix time part - Added a versions of
deserialize(B/J)son
that return the result instead of writing it to an out parameter - The REST interface client now can handle more foreign types by searching for all needed module imports recursively
listenTcp
now returns aTcpListener
object that can be used to stop listening again- Added
vibe.inet.message.decodeEncodedWords
anddecodeEmailAddressHeader
- Added
compileDietFileMixin
usable for directly mixing in Diet templates (they are instantiated in the caller scope) - The SMTP client now prints the last command whenever an error is returned from the server - see issue #126
- Documentation improvements
- All examples now use
shared static this
instead ofstatic this
so that they will behave correctly once multi-threading gets enabled vibe.core
now only depends onvibe.inet
andvibe.utils.memory
and thus is ready to be used as a stand-alone libraryBson.length
is now allowed forBson.Type.Object
and addedBson.EmptyArray
- Setting
HttpFileServerSettings.maxAge
to zero will cause the "Expires" and "Cache-Control" headers to be omitted Url
can now be constructed asUrl(str)
in addition toUrl.parse(str)
- The HTTP server logger now logs the requesting host name instead of the selected configuration's host name
- Using
ParameterIdentifierTuple
now for the REST interface generator, which makes the_dummy
parameter hack unnecessary - Compiles with DMD 2.061 and on Win64
- User and group names are now accepted in addition to UID/GID in /etc/vibe/vibe.conf - issue #133
- Fixed forwarding of non-ASCII unicode characters in
htmlEscape
- Fixed the Diet template parser to accept underscores in ID and class identifiers
- Fixed HEAD requests properly falling back to GET routes in the
UrlRouter
- Fixed parsing of unicode escape sequences in the JSON parser - issue #146
- Made
vibe.core.mutex.Mutex
actually pass its unit tests - Fixed compile errors occuring when using the field selector parameter of
MongoDB.find/findOne/findAndModify
- Fixed some cases of
InvalidMemoryOperationError
in ConnectionPool/LockedConnection - possibly issue #117 - Avoid passing
0x8000
(O_BINARY
) on non-Windows systems toopen()
, as this may cause the call to fail (by Martin Nowak) - issue #142 - Fixed creation of HTTP sessions (were not created before at least one key was set)
- Fixed the error detection code (safe mode) for the MongoDB client
int
values are now correctly serialized asBson.Type.Int
instead ofBson.Type.Long
- Fixed handling of the "X-Forwarded-For" header in the reverse proxy server in case of a proxy chain
- During the build, temporary executables are now built in
%TEMP%/.rdmd/source
so they pick up the right DLL versions - Fixed the daytime example (
readLine
was called with a maximum line length of zero) - issue #122, issue #123
- Implemented an automated HTML form interface generator in
vibe.http.form
(by Robert Klotzner aka eskimor) - issue #106 - The REST interface now uses fully qualified names and local imports to resolve parameter/return types, making it much more robust (by Михаил Страшун aka mist) - issue #108
- The Diet template compiler now supports includes and recursive extensions/layouts - issue #32,
- Added support for WebSocket binary messages and closing connections (by kyubuns) - issue #118
- Implemented a directory watcher for the Win32 driver
- Removed
vibe.textfilter.ddoc
- now in http://github.com/rejectedsoftware/ddox - Cleaned up command line handling (e.g. application parameters are now separated from vibe parameters by --)
- Dependencies in package.json can now have "~master" as the version field to take the lastest master version instead of a tagged version
- Renamed
UrlRouter.addRoute()
toUrlRouter.match()
- Moved Path into its own module (
vibe.inet.path
) - Task local storage is now handled directly by
Task
instead of invibe.core.core
- (de)serialze(To)(Json/Bson) now support type customization using (to/from)(Json/Bson) methods
- (de)serialze(To)(Json/Bson) now strip a trailing underscore in field names, if present - allows to use keywords as field names
Json.opt!()
is now much faster in case of non-existent fields- Added
Bson.toJson()
andBson.fromJson()
and deprecatedBson.get!Json()
andcast(Json)bson
- Implemented
InputStream.readAllUtf8()
- strips BOM and sanitizes or validates the input - Implemented
copyFile()
to supplementmoveFile()
- Added RandomAccessStream interface
- Implemented a github like variant of Markdown more suitable for marking up conversation comments
- The Markdown parser now takes flags to control its behavior
- Made ATX header and automatic link detection in the Markdown parser stricter to avoid false detections
- Added
setPlainLogging()
- avoids output of thread and task id - Avoiding some bogous error messages in the HTTP server (when a peer closes a connection actively)
- Renamed the string variant of
filterHtmlAllEscape()
tohtmlAllEscape()
to match similar functions connectMongoDB()
will now throw if the connection is not possible - this was deferred to the first command up to now- By default a
MongoDB
connection will now have the 'safe' flag set - The default max cache age for the HTTP file server is now 1 day instead of 30 days
- Implemented
MemoryStream
- a rendom access stream operating on aubyte[]
array. - The form parser in the HTTP server now enforces the maximum input line width
- A lot of documentation improvements
- Fixed a possible endless loop in
ZlibInputStream
- now triggers an assertion instead; Still suffering from DMD bug 8779 - issue #56 - Fixed handling of escaped characters in Diet templates and dissallowed use of "##" to escape "#"
- Fixed "undefined" appearing in the stringified version of JSON arrays or objects (they are now filtered out)
- Fixed the error message for failed connection attempts
- Fixed a bug in
PoolAllocator.realloc()
that could cause a range violation or corrupted memory - issue #107 - Fixed '//' comments in the Diet template compiler
- Fixed and optimized
readUntil
- it now also obeys the byte limit, if given - Fixed parsing of floating-point numbers with exponents in the JSON parser
- Fixed some HTML output syntax errors in the Markdown compiler
- Added support for UDP sockets
- The reverse proxy now adds the headers "X-Forwarded-For" and "X-Forwarded-Host"
MongoCollection.findAndModify
returns the resulting object only now instead of the full reply of the protocol- Calling
MongoCollection.find()
without arguments now returns all documents of the collection - Implemented "vibe init" to generate a new app skeleton (by 1100110) - issue #95, issue #99
- The application's main module can now also be named after the package name instead of 'app.d' (by 1100110) - issue #88, issue #89
- The default user/group used on Linux for privilege lowering has been renamed to 'www-vibe' to avoid name clashes with possibly existing users named 'vibe' (by Jordy Sayol) - issue #84
BsonBinData
is now converted to a Base-64 encoded string when the BSON value is converted to a JSON valueBsonDate
now hastoString
/fromString
for an ISO extended representation so that its JSON serialization is now a string- The Diet parser now supports string interpolations inside of style and script tags.
- The Diet parser now enforces proper indentation (i.e. the number of spaces used for an indentation level has to be a multiple of the base indent) - see issue #3
- The Diet parser now supports unescaped string interpolations using !{}
- The JSON de(serializer) now supports pointer types
- Upgraded libevent to v2.0.20 and OpenSSL to v1.0.1c on Windows
- The Win32 driver now has a working Timer implementation
OutputStream
now has an output range interface for the types ubyte and char- The logging functions use 'auto ref' instead of 'lazy' now to avoid errors of the kind "this(this) is not nothrow"
- The markdown text filter now emits XHTML compatible <br/> tags instead of <br> (by cybevnm) - issue #98
- The REST interface generator now uses plain strings instead of JSON for query strings and path parameters, if possible
- The
UrlRouter
now URL-decodes all path parameters
- Fixed a null dereference for certain invalid HTTP requests that caused the application to quit
- Fixed
setTaskStackSize()
to actually do anything (the argument was ignored somwhere along the way to creating the fiber) - Fixed parameter name parsing in the REST interface generator for functions with type modifiers on their return type (will be obsolete once __traits(parameterNames) works)
- Fixed a too strict checking of email adresses and using
std.net.isemail
now to perform proper checking on DMD 2.060 and up - issue #103 - Fixed JSON deserialization of associative arrays with a value type different than 'string'
- Fixed empty peer fields in
HttpServerRequest
when the request failed to parse properly - Fixed
yield()
calls to avoid stack overflows and missing I/O events due to improper recursion - Fixed the Diet parser to allow inline HTML as it should
- Fixed the Diet parser to actually output singular HTML elements as singular elements
- Fixed tight loops with
yield()
not causing I/O to stop in the win32 back end - Fixed code running from within
static this()
not being able to use vibe.d I/O functions - Fixed a "memory leak" (an indefinitely growing array)
- Fixed parsing of one-character JSON strings (by Михаил Страшун aka mist) - issue #96
- Fixed the Diet parser to not HTML escape attributes and to properly escape quotation marks (complying with Jade's behavior)
- Fixed the Diet parser to accept an escaped hash (#) as a way to avoid string interpolations
- Fixed a bug in MongoDB cursor end detection causing spurious exceptions
- Fixed the Markdown parser to now recognize emphasis at the start of a line as an unordered list
- Fixed the form parsing to to not reject a content type with character set specification
- Fixed parsing of unicode character sequences in JSON strings
- Fixed the 100-continue response to end with an empty line
- Compiles with DMD 2.060 - issue #70
- Some considerable improvements and fixes for the REST interface generator - it is now also actually used and tested in another project
- MongoDB supports
mongodb://
URLs for specifying various connection settings instead of just host/port (by David Eagen) - issue #80, issue #81 - Added
RestInterfaceClient.requestFilter
to enable authentication and similar add-on functionality - JSON floating-point numbers are now stringified with higher precision
- Improved const-correctness if the Bson struct (by cybevnm) - issue #77
- Added
setIdleHandler()
to enable tasks that run when all events have been processed - Putting a '{' at the end of a D statement in a Diet template instead of using indentation for nesting will now give an error
- API documentation improvements
- The HTTP server now allows query strings that are not valid forms - issue #73
- A good amount of performance tuning of the HTTP server
- Implemented
vibe.core.core.yield()
. This can be used to break up long computations into smaller parts to reduce latency for other tasks - Added setup-linux.sh and setup-mac.sh scripts that set a symlink in /usr/bin and a config file in /etc/vibe (Thanks to Jordi Sayol)
- Installed VPM modules are now passed as version identifiers "VPM_package_xyz" to the application to allow for optional features
- Improved serialization of structs/classes to JSON/BSON - properties are now serialized and all non-field/property members are now ignored
- Added directory handling functions to
vibe.core.file
(not using asynchronous operations, yet) - Improved the vibe shell script's compatibility
- Fixed
TcpConnection.close()
for the libevent driver - this caused hanging page loads in some browsers - Fixed MongoDB connection handling to avoid secondary assertions being triggered in case of exceptions during the communication
- Fixed JSON (de)serialization of structs and classes (member names were wrong) - issue #72
- Fixed
(filter)urlEncode
for character values < 0x10 - issue #65
- Restructured the examples - each example is now a regular vibe.d application (also fixes compilation using run_example)
- The REST interface generator now supports sub interfaces which are mapped to sub paths in the URL
- Added
InjectedParams!()
to access parameters injected using inject!() - The vibe script and VPM now do not write to the application directory anymore if not necessary
- Implement more robust type handling in the REST client generator
- Fixed a possible exception in
ZlibInputStream
at the end of the stream
- Added support for multipart/form-data and file uploads
- Rewrote the Markdown parser - it now does not emit paragraphs inside list elements if no blank lines are present and handles markdown nested in quotes properly
- The SMTP client supports STARTTLS and PLAIN/LOGIN authentication
- The Diet parser now supports generic :filters using
registerDietTextFilter()
- :css, :javascript and :markdown are already built-in - VPM now can automatically updates dependencies and does not query the registry at every run anymore
- Added
vibe.templ.utils.inject
which allows to flexibly stack together request processors and inject variables into the final HTML template (thanks to simendsjo for the kick-off implementation) - Removed
InputStream.readAll()
andreadLine()
and replaced them by UFCS-able global functions + addedreadUntil()
- Added
ConnectionPool
to generically manage reuse of persistent connections (e.g. for databases) - The
HttpClient
(and thus the reverse proxy) now uses a connection pool to avoid continuous reconnects - On *nix now uses pkg-config to find linker dependencies if possible (dawgfoto) - issue #52
- The static HTTP file server now resolves paths with '.' and '..' instead of simply refusing them
- Implemented handling of
HttpServerSettings.maxRequestTime
- Added
setLogFile()
- The vibe.cmd script now works with paths containing spaces
Libevent2TcpConnection
now enforces proper use ofacquire()/release()
- Improved stability in conjunction with TCP connections
- Upgraded libevent to 2.0.19 on Windows
- Hotfix release, fixes a bug that could cause a connection to be dropped immediately after accept
- Added support for timers and
sleep()
- Proper timeout handling for Connection: keep-alive is in place - fixes "Operating on closed connection" errors - issue #20, issue #43
- Setting DFLAGS to change compiler options now actually works
- Implemented
SslStream
, wich is now used instead of libevent's SSL code - fixes a hang on Linux/libevent-2.0.16 - issue #29 - The REST interface generator now supports
index()
methods and 'id' parameters to customize the protocol - Changed the type for durations from
int/double
toDuration
- issue #18 - Using Deimos bindings now instead of the custom ones - issue #48
- Performance tuning
- Added
vibe.utils.validation
- Various fixes and improvements
- Initial development release version