packagedream
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=bf19c13f0da7e01cc30b8dfaa1fca1dc8b44a06fb6e0eef56d56513952b9bb01
md5=1220f17530522e488653eb91115867e3
Description
Dream is a feature-complete Web framework with a simple programmingmodel and no boilerplate. It provides only two data types, request andresponse.
Almost everything else is either a built-in OCaml type, or anabbreviation for a bare function. For example, a Web app, known inDream as a handler, is just an ordinary function from requests toresponses. And a middleware is then just a function from handlers tohandlers.
Within this model, Dream adds:
- Session management with pluggable back ends.
- A fully composable router.
- Support for HTTP/1.1, HTTP/2, and HTTPS.
- WebSockets.
- GraphQL, including subscriptions and a built-in GraphiQL editor.
- SQL connection pool helpers.
- Server-side HTML templates.
- Automatic secure handling of cookies and forms.
- Unified, internationalization-friendly error handling.
- A neat log, and OCaml runtime configuration.
- Helpers for Web formats, such as Base64url, and a modern cipher.
Because of the simple programming model, everything is optional andcomposable. It is trivailly possible to strip Dream down to just abare driver of the various HTTP protocols.
Dream is presented as a single module, whose API is documented on onepage. In addition, Dream comes with a large number of examples.Security topics are introduced throughout, wherever they areapplicable.
README
README.md
Dream
Easy-to-use, feature-complete Web framework without boilerplate.
Quick Start |Playground | Tutorial |Reference
Dream isone flat module inone package, documented onone page, but withmany examples. It offers:
WebSockets andGraphQL for your modern Web apps.
HTML templates with embedded OCaml orReason — use existing skills!
EasyHTTPS andHTTP/2 support — Dream runs without a proxy.
Helpers forsecure cookies andCSRF-safe forms.
Full-stack ML with clients compiled byMelange,ReScript, orjs_of_ocaml.
...all without sacrificing ease of use — Dream has:
A simple programming model — Web apps arejust functions!
Composablemiddleware androutes.
Unified, internationalization-friendlyerror handling.
Cryptography helpers, key rotation, and a chosen cipher.
A neatlogger, and attention to configuring the OCaml runtime nicely.
Deployment instructions forDigital Ocean andHeroku, with sample CI scripts.
Every part of the API is arranged to be easy to understand, use, and remember. Dream sticks to base OCaml types likestring
andlist
, introducing only a fewtypes of its own — and some of those are just abbreviations for bare functions!
The neat interface is not a limitation. Everything is still configurable by a large number of optional arguments, and very loose coupling. Where necessary, Dream exposes the lower-level machinery that it is composed from. For example, the basic body and WebSocket readersreturn strings, but you can also dozero-copy streaming.
You can even run Dream as aquite bare abstraction over itsunderlying set of HTTP libraries, where it acts only as minimal glue code between their slightly different interfaces.
And, even though Dream is presented as one package for ordinary usage, it is internally factored intoseveral sub-libraries, according to the different dependencies of each, for fast porting to different environments.
Dream is a low-level and unopinionated framework, and you can swap out its conveniences. For example, you can use TyXML withserver-side JSX instead of Dream's built-in templates. You can bundle assets into asingle Dream binary, or use Dream in a subcommand. Dream tries to be as functional as possible, touching global runtime state only lazily, when called into.
Quick start
bash -c "$(curl -fsSL https://raw.githubusercontent.com/aantron/dream/master/example/quickstart.sh)"
This downloads and runsquickstart.sh
, which does a sandboxed build of one of the firsttutorials,2-middleware
. It's mostly the same as:
git clone https://github.com/aantron/dream.git --recursivecd dream/example/2-middlewarenpm install esy && npx esynpx esy start
Knowing that, you can start from any otherexample. All of them include their own build commands. They don't have to be subdirectories ofdream
— you can copy them out to start your own project directory. Especially consider starting with thefull-stack examples, which build both a Dream server and a JavaScript client.
opam
opam install dream
After that, go to one of the examples, such as1-hello
, and build it:
cd example/1-hellodune exec --root . ./hello.exe
Playground
Most of the examples are loaded into theplayground. For instance,2-middleware
is athttp://dream.as/2-middleware.
Documentation
Tutorial — Threads together the first several examples of Dream, touching all the basic topics, including security. See the full list and start wherever you like, or begin at
1-hello
, the Dream version ofHello, world!Reason syntax — Several of the examples are written in Reason. See
r-hello
.Full-stack — See skeleton projects
r-fullstack-melange
,w-fullstack-rescript
, andw-fullstack-jsoo
.Deploying — Quick start instructions for small-to-medium deployments.
Examples — These cover various HTTP scenarios.
Contributing
All kinds of contributions are welcome, including examples, links to blogs, related libraries, and, of course, PRs! SeeCONTRIBUTING.md.
As an immediate note, if you'd like to clone the repo, be sure to use--recursive
, because Dream uses several gitsubmodules:
git clone https://github.com/aantron/dream.git --recursive
Acknowledgements
Dream is based on work by the authors and contributors of itsmany dependencies and their transitive dependencies. There are, however, several influences that cannot be discovered directly:
Templates are inspired byECaml fromAlexander Markov andEmbedded OCaml Templates fromEmile Trotignon.
Dream's handler and middleware types are simplified fromOpium byRudi Grinberg and contributors.
The lower-level HTTP and WebSocket servers arevendored copies ofAntonio Nuno Monteiro's forks and original works, with credit also due to their contributors, andSpiros Eliopoulos in particular, as the original author of two of the projects.
The API docs are instantiated bySoupault fromDaniil Baturin.
The name was inspired byMorph fromUlrik Strid, which was itself partially inspired byOpium.
Raphael Rafatpanah andEl-Hassan Wanas provided important early feedback.
Dependencies (31)
- result
- psq
- faraday-lwt-unix
- faraday
>= "0.6.1"
- digestif
>= "0.7.2"
- bigstringaf
>= "0.5.0"
- angstrom
>= "0.14.0"
- yojson
- uri
>= "4.2.0"
- ocaml
>= "4.08.0" & < "5.0"
- multipart_form
>= "0.3.0" & < "0.4.0"
- mirage-crypto-rng
>= "0.8.0" & < "0.11.0"
- mirage-crypto
>= "0.8.1" & < "1.0.0"
- magic-mime
- logs
>= "0.5.0"
- ssl
>= "0.5.8"
- lwt_ssl
- lwt_ppx
>= "1.2.2"
- lwt
- hmap
- graphql-lwt
- graphql_parser
- fmt
>= "0.8.7"
- dune
>= "2.7.0"
- cstruct
>= "6.0.0"
- conf-libev
os != "win32"
- caqti-lwt
- caqti
>= "1.4.0" & < "2.0.0~"
- bigarray-compat
- base64
>= "3.1.0"
- base-unix
Dev Dependencies (11)
- tyxml-ppx
with-test & >= "4.5.0"
- tyxml-jsx
with-test & >= "4.5.0"
- tyxml
with-test & >= "4.5.0"
- reason
with-test
- ppx_yojson_conv
with-test
- ppx_expect
with-test
- lambdasoup
with-test
- crunch
with-test
- caqti-driver-sqlite3
with-test
- bisect_ppx
with-test & >= "2.5.0"
- alcotest
with-test
Used by (12)
- builder-web
< "0.2.0"
- dream-cli
< "0.2.0"
- dream-encoding
< "0.2.0"
- dream-livereload
< "0.2.0"
- dream-serve
< "1.0.1"
- graphql_jsoo_client
- hyper
- osh
- ppx_dream_eml
- u2f
- universal-portal
- webauthn
< "0.2.0"
Conflicts (1)
- tls
>= "0.15.0"