Skip to content

Commit 7604154

Browse files
authored
Add http-kit example (#8)
* Add http-kit example * Make http-kit example runnable like the jetty example
1 parent a302024 commit 7604154

File tree

4 files changed

+145
-0
lines changed

4 files changed

+145
-0
lines changed

examples/hello-httpkit/README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
# A Datastar + http-kit starter
2+
3+
## Running the example
4+
5+
- repl:
6+
7+
```
8+
clojure -M:repl -m nrepl.cmdline --middleware "[cider.nrepl/cider-middleware]"
9+
```
10+
11+
- main:
12+
13+
```
14+
clojure -M -m hello-httpkit
15+
```

examples/hello-httpkit/deps.edn

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{:paths ["src" "resources"]
2+
:deps {com.cnuernber/charred {:mvn/version "1.034"}
3+
dev.data-star.clojure/http-kit {:local/root "../../sdk-adapter-http-kit"}
4+
dev.data-star.clojure/sdk {:local/root "../../sdk"}
5+
dev.onionpancakes/chassis {:mvn/version "1.0.365"}
6+
http-kit/http-kit {:mvn/version "2.8.1"}
7+
metosin/reitit {:mvn/version "0.7.2"}}
8+
:aliases
9+
{:repl {:extra-deps {org.clojure/clojure {:mvn/version "1.12.0"}
10+
nrepl/nrepl {:mvn/version "1.3.0"}
11+
cider/cider-nrepl {:mvn/version "0.50.2"}}}}}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<title>Datastar SDK Demo</title>
5+
<script src="https://unpkg.com/@tailwindcss/browser@4"></script>
6+
<script type="module" src="https://cdn.jsdelivr.net/gh/starfederation/datastar@main/bundles/datastar.js"></script>
7+
</head>
8+
<body class="bg-white dark:bg-gray-900 text-lg max-w-xl mx-auto my-16">
9+
<div data-signals-delay="400" class="bg-white dark:bg-gray-800 text-gray-500 dark:text-gray-400 rounded-lg px-6 py-8 ring shadow-xl ring-gray-900/5 space-y-2">
10+
<div class="flex justify-between items-center">
11+
<h1 class="text-gray-900 dark:text-white text-3xl font-semibold">
12+
Datastar SDK Demo
13+
</h1>
14+
<img src="https://data-star.dev/static/images/rocket-64x64.png" alt="Rocket" width="64" height="64"/>
15+
</div>
16+
<p class="mt-2">
17+
SSE events will be streamed from the backend to the frontend.
18+
</p>
19+
<div class="space-x-2">
20+
<label for="delay">
21+
Delay in milliseconds
22+
</label>
23+
<input data-bind-delay id="delay" type="number" step="100" min="0" class="w-36 rounded-md border border-gray-300 px-3 py-2 placeholder-gray-400 shadow-sm focus:border-sky-500 focus:outline focus:outline-sky-500 dark:disabled:border-gray-700 dark:disabled:bg-gray-800/20" />
24+
</div>
25+
<button data-on-click="@get(&#39;/hello-world&#39;)" class="rounded-md bg-sky-500 px-5 py-2.5 leading-5 font-semibold text-white hover:bg-sky-700 hover:text-gray-100 cursor-pointer">
26+
Start
27+
</button>
28+
</div>
29+
<div class="my-16 text-8xl font-bold text-transparent" style="background: linear-gradient(to right in oklch, red, orange, yellow, green, blue, blue, violet); background-clip: text">
30+
<div id="message">Hello, world!</div>
31+
</div>
32+
</body>
33+
</html>
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
(ns hello-httpkit
2+
(:require
3+
[charred.api]
4+
[clojure.java.io :as io]
5+
[dev.onionpancakes.chassis.compiler :as hc]
6+
[dev.onionpancakes.chassis.core :as h]
7+
[org.httpkit.server]
8+
[reitit.ring.middleware.parameters]
9+
[reitit.ring]
10+
[ring.util.response]
11+
[starfederation.datastar.clojure.adapter.http-kit :refer [->sse-response on-open]]
12+
[starfederation.datastar.clojure.api :as d*]))
13+
14+
(def read-json (charred.api/parse-json-fn {:async? false :bufsize 1024}))
15+
16+
(defn get-signals [req]
17+
(-> req d*/get-signals read-json))
18+
19+
(def home-page
20+
(slurp (io/resource "hello-world.html")))
21+
22+
(defn home [_]
23+
(-> home-page
24+
(ring.util.response/response)
25+
(ring.util.response/content-type "text/html")))
26+
27+
(def message "Hello, world!")
28+
29+
(defn ->frag [i]
30+
(h/html
31+
(hc/compile
32+
[:div {:id "message"}
33+
(subs message 0 (inc i))])))
34+
35+
(defn hello-world [request]
36+
(let [d (-> request get-signals (get "delay") int)]
37+
(->sse-response request
38+
{on-open
39+
(fn [sse]
40+
(d*/with-open-sse sse
41+
(dotimes [i (count message)]
42+
(d*/patch-elements! sse (->frag i))
43+
(Thread/sleep d))))})))
44+
45+
(def routes
46+
[["/" {:handler home}]
47+
["/hello-world" {:handler hello-world
48+
:middleware [reitit.ring.middleware.parameters/parameters-middleware]}]])
49+
50+
(def router (reitit.ring/router routes))
51+
52+
(def handler (reitit.ring/ring-handler router))
53+
54+
;; ------------------------------------------------------------
55+
;; Server
56+
;; ------------------------------------------------------------
57+
(defonce !server (atom nil))
58+
59+
(defn stop! []
60+
(if-let [s @!server]
61+
(do (org.httpkit.server/server-stop! s)
62+
(reset! !server nil))
63+
(throw (ex-info "Server not running" {}))))
64+
65+
(defn start! [handler opts]
66+
(when-not (nil? @!server)
67+
(stop!))
68+
(reset! !server
69+
(org.httpkit.server/run-server
70+
handler
71+
(merge {:port 8080}
72+
opts
73+
{:legacy-return-value? false}))))
74+
75+
(comment
76+
(stop!)
77+
(start! #'handler {})
78+
)
79+
80+
;; ------------------------------------------------------------
81+
;; Main
82+
;; ------------------------------------------------------------
83+
(defn -main [& _]
84+
(start! #'handler {:port 8080})
85+
(.addShutdownHook (Runtime/getRuntime)
86+
(Thread. #(do (stop!) (shutdown-agents)))))

0 commit comments

Comments
 (0)