|
80 | 80 | (:require |
81 | 81 | [clojure.string :as str] |
82 | 82 | [clojure.core.async :as async :refer [<! >! put! chan go go-loop]] |
83 | | - [taoensso.encore :as enc :refer [have have! have? swap-in! reset-in! swapped]] |
| 83 | + [taoensso.encore :as enc :refer [swap-in! reset-in! swapped]] |
| 84 | + [taoensso.truss :as truss] |
84 | 85 | [taoensso.timbre :as timbre] |
85 | | - [taoensso.sente.interfaces :as interfaces]) |
| 86 | + [taoensso.sente.interfaces :as i]) |
86 | 87 |
|
87 | 88 | #?(:cljs (:require-macros [taoensso.sente :as sente-macros :refer [elide-require]])) |
88 | 89 | #?(:clj (:import [org.java_websocket.client WebSocketClient]))) |
|
207 | 208 | [packer packed] |
208 | 209 | (let [[clj ?cb-uuid] |
209 | 210 | (try |
210 | | - (interfaces/unpack packer packed) |
| 211 | + (i/unpack packer packed) |
211 | 212 | (catch #?(:clj Throwable :cljs :default) t |
212 | 213 | (timbre/errorf t "Failed to unpack: %s" packed) |
213 | 214 | [[:chsk/bad-package packed] nil])) |
|
220 | 221 | "[clj ?cb-uuid]->packed" |
221 | 222 | ([packer clj ] (pack packer clj nil)) |
222 | 223 | ([packer clj ?cb-uuid] |
223 | | - (interfaces/pack packer |
| 224 | + (i/pack packer |
224 | 225 | (if-some [cb-uuid (if (= ?cb-uuid :ajax-cb) 0 ?cb-uuid)] |
225 | 226 | [clj cb-uuid] |
226 | 227 | [clj ])))) |
|
230 | 231 | (pack default-edn-packer [:foo]))) |
231 | 232 |
|
232 | 233 | (deftype EdnPacker [] |
233 | | - interfaces/IPacker |
| 234 | + i/IPacker |
234 | 235 | (pack [_ x] (enc/pr-edn x)) |
235 | 236 | (unpack [_ s] (enc/read-edn s))) |
236 | 237 |
|
|
239 | 240 | (defn- coerce-packer [x] |
240 | 241 | (if (= x :edn) |
241 | 242 | default-edn-packer |
242 | | - (have #(satisfies? interfaces/IPacker %) x))) |
| 243 | + (truss/have #(satisfies? i/IPacker %) x))) |
243 | 244 |
|
244 | 245 | (comment |
245 | 246 | (do |
246 | 247 | (require '[taoensso.sente.packers.transit :as transit]) |
247 | 248 | (def ^:private default-transit-json-packer (transit/get-transit-packer))) |
248 | 249 |
|
249 | | - (let [pack interfaces/pack |
250 | | - unpack interfaces/unpack |
| 250 | + (let [pack i/pack |
| 251 | + unpack i/unpack |
251 | 252 | data {:a :A :b :B :c "hello world"}] |
252 | 253 |
|
253 | 254 | (enc/qb 1e4 ; [111.96 67.26] |
|
405 | 406 | packer :edn |
406 | 407 | allowed-origins :all}}]] |
407 | 408 |
|
408 | | - (have? enc/pos-int? send-buf-ms-ajax send-buf-ms-ws) |
409 | | - (have? #(satisfies? interfaces/IServerChanAdapter %) web-server-ch-adapter) |
| 409 | + (truss/have? enc/pos-int? send-buf-ms-ajax send-buf-ms-ws) |
| 410 | + (truss/have? #(satisfies? i/IServerChanAdapter %) web-server-ch-adapter) |
410 | 411 |
|
411 | 412 | (let [max-ms default-client-side-ajax-timeout-ms] |
412 | 413 | (when (>= lp-timeout-ms max-ms) |
|
415 | 416 | {:lp-timeout-ms lp-timeout-ms |
416 | 417 | :default-client-side-ajax-timeout-ms max-ms})))) |
417 | 418 |
|
418 | | - (let [allowed-origins (have [:or set? #{:all}] allowed-origins) |
| 419 | + (let [allowed-origins (truss/have [:or set? #{:all}] allowed-origins) |
419 | 420 | packer (coerce-packer packer) |
420 | 421 | ch-recv (chan recv-buf-or-n) |
421 | 422 |
|
|
430 | 431 | connected-uids_ (atom {:ws #{} :ajax #{} :any #{}}) ; Public |
431 | 432 |
|
432 | 433 | connect-uid!? |
433 | | - (fn [conn-type uid] {:pre [(have? uid)]} |
| 434 | + (fn [conn-type uid] {:pre [(truss/have? uid)]} |
434 | 435 | (let [newly-connected? |
435 | 436 | (swap-in! connected-uids_ [] |
436 | 437 | (fn [{:keys [ws ajax any] :as old-m}] |
|
447 | 448 | newly-connected?)) |
448 | 449 |
|
449 | 450 | maybe-disconnect-uid!? |
450 | | - (fn [uid] {:pre [(have? uid)]} |
| 451 | + (fn [uid] {:pre [(truss/have? uid)]} |
451 | 452 | (let [newly-disconnected? |
452 | 453 | (swap-in! connected-uids_ [] |
453 | 454 | (fn [{:keys [ws ajax any] :as old-m}] |
|
501 | 502 | (swapped m nil)))))] |
502 | 503 |
|
503 | 504 | (let [[buffered-evs ev-uuids] pulled] |
504 | | - (have? vector? buffered-evs) |
505 | | - (have? set? ev-uuids) |
| 505 | + (truss/have? vector? buffered-evs) |
| 506 | + (truss/have? set? ev-uuids) |
506 | 507 |
|
507 | 508 | (let [packed-buffered-evs (pack packer buffered-evs)] |
508 | 509 | (send-buffered-server-evs>clients! conn-type |
|
516 | 517 | (flush-buffer! :ajax)) |
517 | 518 |
|
518 | 519 | (doseq [[?sch _udt] (vals (get-in @conns_ [:ws uid]))] |
519 | | - (when-let [sch ?sch] (interfaces/sch-close! sch))) |
| 520 | + (when-let [sch ?sch] (i/sch-close! sch))) |
520 | 521 |
|
521 | 522 | (doseq [[?sch _udt] (vals (get-in @conns_ [:ajax uid]))] |
522 | | - (when-let [sch ?sch] (interfaces/sch-close! sch)))) |
| 523 | + (when-let [sch ?sch] (i/sch-close! sch)))) |
523 | 524 |
|
524 | 525 | (do |
525 | 526 | ;; Buffer event |
|
622 | 623 | (enc/cond |
623 | 624 | :if-let [resp (possible-rejection-resp ring-req)] resp |
624 | 625 | :else |
625 | | - (interfaces/ring-req->server-ch-resp web-server-ch-adapter ring-req |
| 626 | + (i/ring-req->server-ch-resp web-server-ch-adapter ring-req |
626 | 627 | {:ring-async-resp-fn ?ring-async-resp-fn |
627 | 628 | :ring-async-raise-fn ?ring-async-raise-fn |
628 | 629 |
|
|
641 | 642 | (lid (user-id-fn ring-req client-id) client-id) |
642 | 643 | resp-clj) |
643 | 644 |
|
644 | | - (interfaces/sch-send! server-ch websocket? |
| 645 | + (i/sch-send! server-ch websocket? |
645 | 646 | (pack packer resp-clj)))))] |
646 | 647 |
|
647 | 648 | (put-server-event-msg>ch-recv! ch-recv |
|
704 | 705 | [:chsk/handshake [uid nil]] |
705 | 706 | [:chsk/handshake [uid nil ?handshake-data]])] |
706 | 707 | ;; Returns true iff server-ch open during call |
707 | | - (interfaces/sch-send! server-ch websocket? |
| 708 | + (i/sch-send! server-ch websocket? |
708 | 709 | (pack packer handshake-ev)))) |
709 | 710 |
|
710 | 711 | on-error |
|
729 | 730 | ;; Auto reply to ping |
730 | 731 | (when-let [cb-uuid ?cb-uuid] |
731 | 732 | (timbre/debugf "[ws/on-msg] Server will auto-reply to ping from %s" lid*) |
732 | | - (interfaces/sch-send! server-ch websocket? |
| 733 | + (i/sch-send! server-ch websocket? |
733 | 734 | (pack packer "pong" cb-uuid))) |
734 | 735 |
|
735 | 736 | (receive-event-msg! clj nil)) |
|
741 | 742 | (timbre/debugf "[ws/on-msg] Server will reply to message from %s: %s" lid* resp-clj) |
742 | 743 |
|
743 | 744 | ;; true iff apparent success: |
744 | | - (interfaces/sch-send! server-ch websocket? |
| 745 | + (i/sch-send! server-ch websocket? |
745 | 746 | (pack packer resp-clj ?cb-uuid)))))))) |
746 | 747 |
|
747 | 748 | on-close |
|
826 | 827 |
|
827 | 828 | {:keys [recur? udt ms-timeout expecting-pong? force-close?]} |
828 | 829 | (enc/cond |
829 | | - (nil? ?conn-entry) {:recur? false} |
830 | | - (not= conn-id conn-id*) {:recur? false} |
831 | | - (when-let [sch ?sch] (not (interfaces/sch-open? sch))) {:recur? false, :force-close? true} |
| 830 | + (nil? ?conn-entry) {:recur? false} |
| 831 | + (not= conn-id conn-id*) {:recur? false} |
| 832 | + (when-let [sch ?sch] (not (i/sch-open? sch))) {:recur? false, :force-close? true} |
832 | 833 |
|
833 | 834 | (not= udt-t0 udt-t1) ; Activity in last kalive window |
834 | 835 | {:recur? true, :udt udt-t1, :ms-timeout ws-kalive-ms, :expecting-pong? false} |
|
838 | 839 | expecting-pong? |
839 | 840 | (do |
840 | 841 | ;; Was expecting pong (=> activity) in last kalive window |
841 | | - (interfaces/sch-close! server-ch) |
| 842 | + (i/sch-close! server-ch) |
842 | 843 | {:recur? false}) |
843 | 844 |
|
844 | 845 | :else |
|
847 | 848 | ;; conn's :on-close immediately, i.e. no need to wait |
848 | 849 | ;; for a missed pong. |
849 | 850 | ping-apparently-sent? |
850 | | - (interfaces/sch-send! server-ch websocket? |
| 851 | + (i/sch-send! server-ch websocket? |
851 | 852 | (pack packer :chsk/ws-ping))] |
852 | 853 |
|
853 | 854 | (if ws-ping-timeout-ms |
|
897 | 898 | (when-let [[_?sch _udt conn-id*] (get-in @conns_ [:ajax uid client-id])] |
898 | 899 | (when (= conn-id conn-id*) |
899 | 900 | (timbre/debugf "[ajax/on-open] Polling timeout for %s" lid*) |
900 | | - (interfaces/sch-send! server-ch websocket? |
| 901 | + (i/sch-send! server-ch websocket? |
901 | 902 | (pack packer :chsk/timeout)))))) |
902 | 903 |
|
903 | 904 | (when (connect-uid!? :ajax uid) |
904 | 905 | (timbre/infof "[ajax/on-open] uid port open for %s" lid*) |
905 | 906 | (receive-event-msg! [:chsk/uidport-open uid])))))))] |
906 | 907 |
|
907 | | - (interfaces/ring-req->server-ch-resp web-server-ch-adapter ring-req |
| 908 | + (i/ring-req->server-ch-resp web-server-ch-adapter ring-req |
908 | 909 | {:ring-async-resp-fn ?ring-async-resp-fn |
909 | 910 | :ring-async-raise-fn ?ring-async-raise-fn |
910 | 911 | :on-open on-open |
|
926 | 927 | "Actually pushes buffered events (as packed-str) to all uid's conns. |
927 | 928 | Allows some time for possible reconnects." |
928 | 929 | [conn-type conns_ uid packed-buffered-evs n-buffered-evs] |
929 | | - (have? [:el #{:ajax :ws}] conn-type) |
| 930 | + (truss/have? [:el #{:ajax :ws}] conn-type) |
930 | 931 | (let [;; Mean max wait time: sum*1.5 = 2790*1.5 = 4.2s |
931 | 932 | ms-backoffs [90 180 360 720 720 720] ; => max 1+6 attempts |
932 | 933 | websocket? (= conn-type :ws) |
|
942 | 943 | (when-let [[?sch _udt conn-id] (get-in @conns_ [conn-type uid client-id])] |
943 | 944 | (when-let [sch ?sch] |
944 | 945 | (when-not (simulated-bad-conn?) |
945 | | - (when (interfaces/sch-send! sch websocket? packed-buffered-evs) |
| 946 | + (when (i/sch-send! sch websocket? packed-buffered-evs) |
946 | 947 | conn-id))))] |
947 | 948 |
|
948 | 949 | (swap-in! conns_ [conn-type uid client-id] |
|
1072 | 1073 | open-changed?))))) |
1073 | 1074 |
|
1074 | 1075 | (defn- chsk-state->closed [state reason] |
1075 | | - (have? map? state) |
1076 | | - (have? |
| 1076 | + (truss/have? map? state) |
| 1077 | + (truss/have? |
1077 | 1078 | [:el #{:clean :unexpected |
1078 | 1079 | :requested-disconnect |
1079 | 1080 | :requested-reconnect |
|
1098 | 1099 | (if (or (nil? ?cb) (ifn? ?cb)) |
1099 | 1100 | ?cb |
1100 | 1101 | (do |
1101 | | - (have? enc/chan? ?cb) |
| 1102 | + (truss/have? enc/chan? ?cb) |
1102 | 1103 | (assert-event ev) |
1103 | 1104 | (let [[ev-id _] ev |
1104 | 1105 | cb-ch ?cb] |
|
1108 | 1109 | reply])))))) |
1109 | 1110 |
|
1110 | 1111 | (defn- receive-buffered-evs! [chs clj] |
1111 | | - (let [buffered-evs (have vector? clj)] |
| 1112 | + (let [buffered-evs (truss/have vector? clj)] |
1112 | 1113 |
|
1113 | 1114 | (timbre/tracef "Client received %s buffered evs from server: %s" |
1114 | 1115 | (count buffered-evs) |
|
1125 | 1126 | (let [[x1] x] (= x1 :chsk/handshake)))) |
1126 | 1127 |
|
1127 | 1128 | (defn- receive-handshake! [chsk-type chsk clj] |
1128 | | - (have? [:el #{:ws :ajax}] chsk-type) |
1129 | | - (have? handshake? clj) |
| 1129 | + (truss/have? [:el #{:ws :ajax}] chsk-type) |
| 1130 | + (truss/have? handshake? clj) |
1130 | 1131 |
|
1131 | 1132 | (let [[_ [?uid _ ?handshake-data]] clj |
1132 | 1133 | {:keys [chs ever-opened?_]} chsk |
|
1349 | 1350 | packed (pack packer ev ?cb-uuid)] |
1350 | 1351 |
|
1351 | 1352 | (when-let [cb-uuid ?cb-uuid] |
1352 | | - (reset-in! cbs-waiting_ [cb-uuid] (have ?cb-fn)) |
| 1353 | + (reset-in! cbs-waiting_ [cb-uuid] (truss/have ?cb-fn)) |
1353 | 1354 | (when-let [timeout-ms ?timeout-ms] |
1354 | 1355 | (go |
1355 | 1356 | (<! (async/timeout timeout-ms)) |
|
1371 | 1372 | (do |
1372 | 1373 | (when-let [cb-uuid ?cb-uuid] |
1373 | 1374 | (let [cb-fn* (or (pull-unused-cb-fn! cbs-waiting_ cb-uuid) |
1374 | | - (have ?cb-fn))] |
| 1375 | + (truss/have ?cb-fn))] |
1375 | 1376 | (cb-fn* :chsk/error))) |
1376 | 1377 |
|
1377 | 1378 | (-chsk-reconnect! chsk :ws-error) |
|
1792 | 1793 |
|
1793 | 1794 | (defn- get-chsk-url [protocol host path type] |
1794 | 1795 | (let [protocol (case protocol :http "http:" :https "https:" protocol) |
1795 | | - protocol (have [:el #{"http:" "https:"}] protocol) |
| 1796 | + protocol (truss/have [:el #{"http:" "https:"}] protocol) |
1796 | 1797 | protocol (case type |
1797 | 1798 | :ajax protocol |
1798 | 1799 | :ws (case protocol "https:" "wss:" "http:" "ws:"))] |
|
1855 | 1856 |
|
1856 | 1857 | _deprecated-more-opts]] |
1857 | 1858 |
|
1858 | | - (have? [:in #{:ajax :ws :auto}] type) |
1859 | | - (have? enc/nblank-str? client-id) |
| 1859 | + (truss/have? [:in #{:ajax :ws :auto}] type) |
| 1860 | + (truss/have? enc/nblank-str? client-id) |
1860 | 1861 |
|
1861 | 1862 | (when (not (nil? _deprecated-more-opts)) (timbre/warnf "`make-channel-socket-client!` fn signature CHANGED with Sente v0.10.0.")) |
1862 | 1863 | (when (contains? opts :lp-timeout) (timbre/warnf ":lp-timeout opt has CHANGED; please use :lp-timout-ms.")) |
|
1870 | 1871 | (let [;; Not available with React Native, etc. |
1871 | 1872 | ;; Must always provide explicit path for Java client. |
1872 | 1873 | win-loc #?(:clj nil :cljs (enc/get-win-loc)) |
1873 | | - path (have (or path (:pathname win-loc)))] |
| 1874 | + path (truss/have (or path (:pathname win-loc)))] |
1874 | 1875 |
|
1875 | 1876 | (if-let [f (:chsk-url-fn opts)] ; Deprecated |
1876 | 1877 | [(f path win-loc :ws) |
|
2008 | 2009 | (when trace-evs? (timbre/tracef "Chsk router pre-handler event: %s" event)) |
2009 | 2010 | (event-msg-handler |
2010 | 2011 | (if server? |
2011 | | - (have! server-event-msg? event-msg) |
2012 | | - (have! client-event-msg? event-msg))) |
| 2012 | + (truss/have! server-event-msg? event-msg) |
| 2013 | + (truss/have! client-event-msg? event-msg))) |
2013 | 2014 |
|
2014 | 2015 | (catch :all t1 |
2015 | 2016 | (enc/try* |
|
0 commit comments