From 6d89668cf717cf6c693a24ef0d0cd02954e9f83e Mon Sep 17 00:00:00 2001 From: Anton Bachin Date: Mon, 10 May 2021 14:20:33 +0300 Subject: [PATCH] Edit README --- README.md | 122 ++++++++++++++++------------------------- docs/asset/sample.html | 8 +-- docs/asset/sample.png | Bin 18321 -> 18572 bytes 3 files changed, 52 insertions(+), 78 deletions(-) diff --git a/README.md b/README.md index ff7c6f47..c71af7f1 100644 --- a/README.md +++ b/README.md @@ -10,9 +10,13 @@ Easy-to-use, feature-complete Web framework without boilerplate.

-
- -
bash -c "$(curl -fsSL https://raw.githubusercontent.com/aantron/dream/master/example/quickstart.sh)"
+

+ Quick Start | + Playground | + + Tutorial | + Reference +



@@ -29,7 +33,7 @@ Dream is **one flat module** in **one package**, documented on proxy. - Helpers for [**secure cookies**][cookies] and [**CSRF-safe forms**][forms]. -- **Full-stack ML** with clients by [**Melange**][melange], +- **Full-stack ML** with clients compiled by [**Melange**][melange], [**ReScript**][rescript], or [**js_of_ocaml**][jsoo].
@@ -42,6 +46,8 @@ Dream is **one flat module** in **one package**, documented on - [**Cryptography**][crypto] helpers, key rotation, and a chosen cipher. - A neat [**logger**][logging], and attention to configuring the OCaml runtime nicely. +- [**Deployment**][deploy] instructions for **Digital Ocean** and **Heroku**, + with sample CI scripts.
@@ -51,20 +57,26 @@ few [types][types] 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. Where necessary, Dream exposes the -lower-level machinery that it is composed from. For example, the basic body and -WebSocket readers return strings, but you can also do [zero-copy -streaming][streaming]. +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 readers [return strings][basic-read], but you can +also do [zero-copy streaming][streaming]. You can even run Dream as a [quite bare abstraction][raw] over its [underlying set of HTTP libraries][vendor], where it acts only as minimal glue code between -their slightly different interfaces, and takes care of horridness like -[ALPN][alpn]. +their slightly different interfaces. And, even though Dream is presented as one package for ordinary usage, it is internally factored into [several sub-libraries][libs], 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 with [server-side JSX][jsx] +instead of Dream's built-in templates. You can bundle assets into a [single +Dream binary][one-binary], or use Dream in a subcommand. Dream tries to be as +functional as possible, touching global runtime state only lazily, when called +into. + [https]: https://github.com/aantron/dream/tree/master/example/l-https#files [websocket]: https://github.com/aantron/dream/tree/master/example/k-websocket#files [graphql]: https://github.com/aantron/dream/tree/master/example/w-graphql-subscription#files @@ -84,37 +96,37 @@ different dependencies of each, for fast porting to different environments. [rescript]: https://github.com/aantron/dream/tree/master/example/w-fullstack-rescript#files [jsoo]: https://github.com/aantron/dream/tree/master/example/w-fullstack-jsoo#files [types]: https://aantron.github.io/dream/#types +[basic-read]: https://aantron.github.io/dream/#val-body [streaming]: https://aantron.github.io/dream/#streaming [raw]: https://aantron.github.io/dream/#builtin [alpn]: https://en.wikipedia.org/wiki/Application-Layer_Protocol_Negotiation [libs]: https://github.com/aantron/dream/tree/master/src +[deploy]: https://github.com/aantron/dream/tree/master/example#deploying +[jsx]: https://github.com/aantron/dream/tree/master/example/r-tyxml#files +[one-binary]: https://github.com/aantron/dream/tree/master/example/w-one-binary#files
## Quick start -``` -bash -c "$(curl -fsSL https://raw.githubusercontent.com/aantron/dream/master/example/quickstart.sh)" -``` - -This [script][quickstart.sh] does a sandboxed build of one of the first -[tutorials][tutorial], [**`2-middleware`**][2-middleware], which you can then -edit. +
bash -c "$(curl -fsSL https://raw.githubusercontent.com/aantron/dream/master/example/quickstart.sh)"
-It's mostly the same as: +This downloads and runs [`quickstart.sh`][quickstart.sh], which does a +sandboxed build of one of the first [tutorials][tutorial], +[**`2-middleware`**][2-middleware]. It's mostly the same as: ``` -git clone https://github.com/aantron/dream.git +git clone https://github.com/aantron/dream.git --recursive cd dream/example/2-middleware npm install esy && npx esy npx esy start ``` Knowing that, you can start from any other [example][tutorial]. All of them -include their own build commands. You can copy them out to start your own -project directory. Especially consider starting with the -[full-stack examples][fullstack], which build both a Dream server and a -JavaScript client. +include their own build commands. They don't have to be subdirectories of +`dream` — you can copy them out to start your own project directory. +Especially consider starting with the [full-stack examples][fullstack], which +build both a Dream server and a JavaScript client. ### opam @@ -130,10 +142,18 @@ cd example/1-hello dune exec --root . ./hello.exe ``` +### Playground + +Most of the examples are loaded into the [playground][playground]. For instance, +[**`2-middleware`**][2-middleware] is at +[http://dream.as/2-middleware][2-middleware-playground]. + [esy-example]: https://github.com/aantron/dream/tree/master/example/w-esy#files [quickstart.sh]: https://github.com/aantron/dream/blob/master/example/quickstart.sh [esy]: https://esy.sh/ [2-middleware]: https://github.com/aantron/dream/tree/master/example/2-middleware#files +[playground]: http://dream.as +[2-middleware-playground]: http://dream.as/2-middleware
@@ -152,6 +172,7 @@ dune exec --root . ./hello.exe small-to-medium deployments. - [**Examples**][examples] — These cover various HTTP scenarios. - [**API reference**][api-main] +- [Watching][fswatch] and [live reloading][reload]. [tutorial]: https://github.com/aantron/dream/tree/master/example#readme [examples]: https://github.com/aantron/dream/tree/master/example#examples @@ -161,8 +182,8 @@ dune exec --root . ./hello.exe [deploying]: https://github.com/aantron/dream/tree/master/example#deploying [api-main]: https://aantron.github.io/dream/#types [fullstack]: https://github.com/aantron/dream/tree/master/example#full-stack - - +[fswatch]: https://github.com/aantron/dream/tree/master/example/w-fswatch#files +[reload]: https://github.com/aantron/dream/tree/master/example/w-live-reload#files
@@ -171,7 +192,7 @@ dune exec --root . ./hello.exe Apart from the [issues](https://github.com/aantron/dream/issues), good places to discuss Dream are... -- The [OCaml](https://discord.gg/DyhPFYGr) and/or +- The [OCaml](https://discord.gg/DyhPFYGr) and [Reason](https://discord.gg/YCTDuzbg) Discord servers. - The [OCaml Discuss forum](https://discuss.ocaml.org/). @@ -185,14 +206,12 @@ All kinds of contributions are welcome, including examples, links to blogs, related libraries, and, of course, PRs! See [CONTRIBUTING.md][contributing.md]. As an immediate note, if you'd like to clone the repo, be sure to use +`--recursive`, because Dream uses several git [submodules][vendor]: ``` git clone https://github.com/aantron/dream.git --recursive ``` -The `--recursive` flag is necessary because Dream uses several git -[submodules][vendor]. - [contributing.md]: https://github.com/aantron/dream/blob/master/docs/CONTRIBUTING.md
@@ -234,48 +253,3 @@ several influences that cannot be discovered directly: [seliopou]: https://github.com/seliopou [persianturtle]: https://github.com/persianturtle [foocraft]: https://github.com/foocraft - -
- -## Roadmap - -- [x] GraphQL subscriptions. -- [ ] Optimizations: router, logger, microparsers (form data, etc.), fully - zero-allocation streaming. -- [ ] WebSocket and stream backpressure. -- [ ] HTTP3/QUIC. -- [ ] Review JSON. -- [ ] Review SQL prepared statements. -- [ ] Switch to AEAD_AES_256_GCM_SIV for the cipher. -- [ ] WebSocket streaming (frames). -- [ ] Factor out internal sub-libraries to port Dream to MirageOS, etc. -- [ ] Token rotation-based session management. -- [ ] Lots of optionals for decoupling defaults, e.g. forms without CSRF - checking, SQL sessions with a different database. -- [x] Bundle GraphiQL into a single HTML file that does not access any external - CDN. -- [ ] Maybe a logo. -- [ ] i18n helper, URL templates. -- [ ] Auth library. -- [ ] Maybe REST helpers. -- [ ] Maybe Async support. -- [ ] Multicore. -- [ ] Effects. -- [ ] Proxy headers support. -- [ ] Introspection. -- [ ] Dependency reduction, especially system dependencies. -- [ ] And *lots*, *lots* more. - - - - - - - - - - - - - diff --git a/docs/asset/sample.html b/docs/asset/sample.html index 435e036b..c82db91e 100644 --- a/docs/asset/sample.html +++ b/docs/asset/sample.html @@ -58,16 +58,16 @@
 let hello who =
   <html>
-    <body>
-      <h1>Hello, <%s who %>!</h1>
-    </body>
+  <body>
+    <h1>Hello, <%s who %>!</h1>
+  </body>
   </html>
 
 let () =
   Dream.run
   @@ Dream.logger
   @@ Dream.router [
-    Dream.get "/" (fun _ -> Dream.respond (hello "world"));
+    Dream.get "/" (fun _ -> Dream.html (hello "world"));
   ]
   @@ Dream.not_found
 
diff --git a/docs/asset/sample.png b/docs/asset/sample.png index 80c82e5ab6dc3a98063cabeb9de4d9b5bf564576..36f3d5bbaad9100c59f48659cee6a78096abdb34 100644 GIT binary patch literal 18572 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 DMO~B$