File tree Expand file tree Collapse file tree 6 files changed +60
-35
lines changed
libraries/sdk/src/main/starfederation/datastar/clojure Expand file tree Collapse file tree 6 files changed +60
-35
lines changed Original file line number Diff line number Diff line change 33## 2025-11-27 - RC5
44
55### Fixed
6+
67- Fixed ` starfederation.datastar.clojure.adapter.http-kit2/wrap-start-responding ` ,
78 the async arity was improperly managed.
89
910### Changes
11+
1012- The internals of the Ring SSE generator have been reworked. The SSE gen won't error
1113 if a user reuses it for different requests anymore. Documentation is in place to warn
1214 against such reuse and this change makes for much simpler code.
15+ - When creating SSE events we need to split on end of lines the text that will
16+ constitute the data lines of the event. This can prevent SSE event injection
17+ problems. The SSE machinery has been refactored so that this splitting happens
18+ in a code path that all API functions go through instead of doing it in every
19+ d* patch function. This way we can't forget that splitting.
1320
1421## 2025-10-30 - RC4
1522
Original file line number Diff line number Diff line change 1- (ns starfederation.datastar.clojure.api.common )
1+ (ns starfederation.datastar.clojure.api.common
2+ (:require
3+ [clojure.string :as string]))
24
35; ; -----------------------------------------------------------------------------
46; ; Option names
3032 " Add an option `v` line to the transient `data-lines!` vector.
3133
3234 Args:
33- - `data-lines`: a transient vector of data-lines that will be written in a sse
35+ - `data-lines! `: a transient vector of data-lines that will be written in a sse
3436 event
3537 - `prefix`: The Datastar specific preffix for that line
3638 - `v`: the value for that line
4143
4244(defn add-data-lines!
4345 " Add several data-lines to the `data-lines!` transient vector."
44- [data-lines! prefix lines-seq ]
45- (reduce
46- ( fn [acc part ]
47- ( conj! acc ( str prefix part)))
48- data-lines!
49- lines-seq ))
50-
46+ [data-lines! prefix ^String text ]
47+ (let [stream ( .lines text)
48+ i ( .iterator stream) ]
49+ ( loop [ acc data-lines!]
50+ ( if ( .hasNext i)
51+ ( recur ( conj! acc ( str prefix ( .next i)) ))
52+ acc))))
5153
5254(defn add-boolean-option?
5355 " Utility used to test whether an boolean option should result in a sse event
5658 (and
5759 (boolean? val)
5860 (not= val default-val )))
59-
60-
61-
Original file line number Diff line number Diff line change 3030 (cond-> data-lines!
3131 (and sel (valid-selector? sel))
3232 (common/add-opt-line! consts/selector-dataline-literal sel)
33-
33+
3434 (and patch-mode (add-epm? patch-mode))
3535 (common/add-opt-line! consts/mode-dataline-literal patch-mode)
3636
4747 [data-lines! element]
4848 (cond-> data-lines!
4949 (u/not-empty-string? element)
50- (common/add-data-lines! consts/elements-dataline-literal
51- (string/split-lines element))))
50+ (common/add-data-lines! consts/elements-dataline-literal element)))
5251
5352
5453(defn ->patch-elements
9190(defn conj-patch-elements-seq
9291 " Adds a the data-lines when patching a seq of strings elements."
9392 [data-lines! elements-seq]
94- (cond-> data-lines!
95- (seq elements-seq)
96- (common/add-data-lines! consts/elements-dataline-literal
97- (eduction
98- (comp (mapcat string/split-lines)
99- (remove string/blank?))
100- elements-seq))))
93+ (if (seq elements-seq)
94+ (reduce
95+ (fn [data-lines! elements]
96+ (if (string/blank? elements)
97+ data-lines!
98+ (common/add-data-lines! data-lines! consts/elements-dataline-literal elements)))
99+ data-lines!
100+ elements-seq)
101+ data-lines!))
101102
102103
103104(defn ->patch-elements-seq
146147 (patch-elements! sse-gen " " (assoc opts
147148 common/selector selector
148149 common/patch-mode consts/element-patch-mode-remove)))
149-
150-
Original file line number Diff line number Diff line change 2121 (common/add-opt-line! consts/only-if-missing-dataline-literal oim)
2222
2323 (u/not-empty-string? signals)
24- (common/add-data-lines! consts/signals-dataline-literal
25- (string/split-lines signals))))))
24+ (common/add-data-lines! consts/signals-dataline-literal signals)))))
2625
2726
2827
2928(comment
3029 (= (->patch-signals " {'some': \n 'json'}" {})
3130 [" signals {'some': "
3231 " signals 'json'}" ]))
33-
32+
3433(defn patch-signals! [sse-gen signals-content opts]
3534 (try
3635 (sse/send-event! sse-gen
5655 (if (= :get (:request-method request))
5756 (get-in request [:query-params consts/datastar-key])
5857 (:body request)))
59-
60-
Original file line number Diff line number Diff line change 22(ns starfederation.datastar.clojure.consts )
33
44
5- (def datastar-key " datastar" )
6- (def version " 1.0.0-RC.1" )
5+ (def datastar-key " datastar" )
76
87
98; ; -----------------------------------------------------------------------------
1413 1000 )
1514
1615
17- ; ; -----------------------------------------------------------------------------
18- ; ; Default values
19- ; ; -----------------------------------------------------------------------------
20-
2116; ; -----------------------------------------------------------------------------
2217; ; Dataline literals
2318; ; -----------------------------------------------------------------------------
Original file line number Diff line number Diff line change 1+ (ns bench.split
2+ (:require
3+ [clojure.string :as string]
4+ [starfederation.datastar.clojure.api.common :as c]))
5+
6+
7+ (defn old-datalines [data-lines! prefix text]
8+ (reduce
9+ (fn [acc part]
10+ (conj! acc (str prefix part)))
11+ data-lines!
12+ (string/split-lines text)))
13+
14+
15+ (def input " hello there\n wold !\r\n How are \r you \n today" )
16+ (def input-big (apply str (repeat 100 input)))
17+
18+ (defn bench [f input]
19+ (println " ---------------------------------------" )
20+ (dotimes [_ 20 ]
21+ (time
22+ (dotimes [_ 10000 ]
23+ (f (transient []) " elements " input)))))
24+
25+
26+ (comment
27+ (bench old-datalines input-big)
28+ (bench c/add-data-lines! input-big))
You can’t perform that action at this time.
0 commit comments