diff options
author | Ben Sima <ben@bsima.me> | 2020-03-31 20:48:56 -0700 |
---|---|---|
committer | Ben Sima <ben@bsima.me> | 2020-03-31 20:51:59 -0700 |
commit | 744b673f20c6993038e10a480bd746db2c1dccb3 (patch) | |
tree | 6b4372e0b9ecb160974a55a88a32b41e4a835e58 /Run/Que | |
parent | 492ba39739c869d3f2b9766112232d384a145e38 (diff) |
Add tutorial and apidocs to website
Diffstat (limited to 'Run/Que')
-rw-r--r-- | Run/Que/Website.hs | 64 | ||||
-rw-r--r-- | Run/Que/apidocs.md | 3 | ||||
-rw-r--r-- | Run/Que/index.md | 11 | ||||
-rw-r--r-- | Run/Que/tutorial.md | 55 |
4 files changed, 98 insertions, 35 deletions
diff --git a/Run/Que/Website.hs b/Run/Que/Website.hs index 8681678..910d97b 100644 --- a/Run/Que/Website.hs +++ b/Run/Que/Website.hs @@ -28,6 +28,8 @@ main = do , client = src </> "client.py" , quescripts = src </> "quescripts.md" , style = src </> "style.css" + , apidocs = src </> "apidocs.md" + , tutorial = src </> "tutorial.md" } data Sources = Sources @@ -35,42 +37,38 @@ data Sources = Sources , quescripts :: FilePath , client :: FilePath , style :: FilePath + , tutorial :: FilePath + , apidocs :: FilePath } loop :: Text -> Sources -> IO () -loop ns pages@Sources {..} = do - _ <- - Async.runConcurrently - $ (,,,) - <$> Async.Concurrently - (toHtml style index >>= serve (https "que.run" /: ns /: "index")) - <*> Async.Concurrently - ( BS.readFile client - >>= serve (https "que.run" /: ns /: "client") - ) - <*> Async.Concurrently - ( toHtml style quescripts - >>= serve (https "que.run" /: ns /: "quescripts") - ) - loop ns pages - - -toHtml :: FilePath -> FilePath -> IO ByteString -toHtml style md = - BS.pack - <$> Process.readProcess - "pandoc" - [ "--self-contained" - , "--css" - , style - , "-i" - , md - , "--from" - , "markdown" - , "--to" - , "html" - ] - [] +loop ns pages@Sources {..} = Async.runConcurrently actions >> loop ns pages + where + actions = traverse + Async.Concurrently + [ toHtml index >>= srv "index" + , toHtml quescripts >>= srv "quescripts" + , BS.readFile client >>= srv "client" + , toHtml tutorial >>= srv "tutorial" + , toHtml apidocs >>= srv "apidocs" + ] + srv p = serve $ https "que.run" /: ns /: p + toHtml :: FilePath -> IO ByteString + toHtml md = + BS.pack + <$> Process.readProcess + "pandoc" + [ "--self-contained" + , "--css" + , style + , "-i" + , md + , "--from" + , "markdown" + , "--to" + , "html" + ] + [] -- TODO: recover from 502 errors serve :: Url scheme -> ByteString -> IO () diff --git a/Run/Que/apidocs.md b/Run/Que/apidocs.md new file mode 100644 index 0000000..f400889 --- /dev/null +++ b/Run/Que/apidocs.md @@ -0,0 +1,3 @@ +% que.run Api Docs + +coming soon diff --git a/Run/Que/index.md b/Run/Que/index.md index ca5c7ef..c61dc5c 100644 --- a/Run/Que/index.md +++ b/Run/Que/index.md @@ -9,7 +9,7 @@ que is the concurrent, async runtime in the cloud plumbing - async programming as easy as running two terminal commands -HTTP routes on que.run are Golang-like channels with a namespace and a +HTTP routes on `que.run` are Golang-like channels with a namespace and a path. For example: `https://que.run/example/path/subpath`. ## Quickstart @@ -34,4 +34,11 @@ We are collecting a repository of scripts that make awesome use of que: - ephemeral, serverless chat rooms - collaborative jukebox -<a id="quescripts-btn" href="/_/quescripts">See the examples</a> +<a id="quescripts-btn" href="/_/quescripts">See the scripts</a> + +<!-- +## Docs + +- [tutorial](/_/tutorial) +- [api docs](/_/apidocs) +--> diff --git a/Run/Que/tutorial.md b/Run/Que/tutorial.md new file mode 100644 index 0000000..b5b258d --- /dev/null +++ b/Run/Que/tutorial.md @@ -0,0 +1,55 @@ +% que.run Tutorial + +## Ques + +A que is a multi-consumer, multi-producer channel available anywhere you +have a network connection. If you are familiar with Go channels, they +are pretty much the same thing. Put some values in one end, and take +them out the other end at a different time, or in a different process. + +Ques are created dynamically for every HTTP request you make. Here we +use the `que` client to create a new que at the path `example/new-que`: + + que example/new-que + +The `que` client is useful, but you can use anything to make the HTTP +request, for example here's the same thing with curl: + + curl https://que.run/example/new-que + +These requests will block until a value is placed on the other +end. Let's do that now. In a separate terminal: + + echo "hello world" | que example/new-que - + +This tells the `que` client to read the value from `stdin` and then send +it to `example/new-que`. Or with curl: + + curl https://que.run/example/new-que -d "hello world" + +This will succeed immediately and send the string "`hello world`" over +the channel, which will be received and printed by the listener in the +other terminal. + +You can have as many producers and consumers attached to a channel as +you want. + +## Namespaces + +Ques are organized into namespaces, identified by the first fragment of +the path. In the above commands we used `example` as the namespace, but +you can use whatever you want. + +Except, there is one special namespace `_` which is reserved for +internal use only. You can't write to the `_` namespace. + +Namespaces are normally public, and anyone can write and read to +them. The `Pro` version allows you to reserve namespaces and add +authentication. + +## Events + +Just reading and writing data isn't very exciting, so let's throw in +some events. We can very quickly put together a job processor. + + que example/new-que --then "./worker.sh '\msg'" |