diff --git a/spec/more_speech/nostr/protocol_spec.clj b/spec/more_speech/nostr/protocol_spec.clj index 35a4a97..7410e93 100644 --- a/spec/more_speech/nostr/protocol_spec.clj +++ b/spec/more_speech/nostr/protocol_spec.clj @@ -1,5 +1,24 @@ (ns more-speech.nostr.protocol-spec (:require [speclj.core :refer :all] - [more-speech.nostr.protocol :refer :all])) + [more-speech.nostr.protocol :refer :all] + [more-speech.nostr.util :as util])) -(describe "nothing") \ No newline at end of file +(declare now) +(describe "protocol utilities" + (with-stubs) + (with now 100) + (it "increments relay retries on un-retried relays" + (with-redefs [util/get-now (stub :get-now {:return @now})] + (should= {"relay" {:retries 1, :retry-time @now}} + (increment-relay-retry {"relay" {}} "relay")))) + + (it "increments relay retries on retried relays" + (with-redefs [util/get-now (stub :get-now {:return @now})] + (should= {"relay" {:retries 3, :retry-time @now}} + (increment-relay-retry {"relay" {:retries 2 :retry-time (dec @now)}} "relay")))) + + (it "resets relay retries on relays that haven't been retried in over an hour" + (with-redefs [util/get-now (stub :get-now {:return @now})] + (should= {"relay" {:retries 1, :retry-time @now}} + (increment-relay-retry {"relay" {:retries 10 :retry-time (- @now 3600001)}} "relay")))) + ) \ No newline at end of file diff --git a/spec/more_speech/websocket_relay_spec.clj b/spec/more_speech/websocket_relay_spec.clj index ca69825..cf7f046 100644 --- a/spec/more_speech/websocket_relay_spec.clj +++ b/spec/more_speech/websocket_relay_spec.clj @@ -9,10 +9,9 @@ (it "can be made" (should= {::relay/type ::ws-relay/websocket ::ws-relay/url "url" - ::ws-relay/recv-f :some-f - ::ws-relay/socket nil - ::ws-relay/open? false} - (ws-relay/make "url" :some-f))) + ::ws-relay/callbacks :some-callbacks + ::ws-relay/socket nil} + (ws-relay/make "url" :some-callbacks))) (it "can open and close" (pending "be nice to relay.damus.io") diff --git a/src/more_speech/nostr/protocol.clj b/src/more_speech/nostr/protocol.clj index 23169ab..42d1e6e 100644 --- a/src/more_speech/nostr/protocol.clj +++ b/src/more_speech/nostr/protocol.clj @@ -96,17 +96,28 @@ (when (some? open-relay) (swap! relays assoc-in [url :connection] open-relay)))) +(defn increment-relay-retry + "used in a swap!, increments retries counter unless the last retry was over an hour ago + and then resets to 1" + [relays url] + (let [relay (get relays url) + retries (get relay :retries 0) + last-retry-time (get relay :retry-time 0) + now (util/get-now) + time-since-last-retry (- now last-retry-time) + retries (if (> time-since-last-retry 3600000) 1 (inc retries)) + relays (assoc-in relays [url :retries] retries) + relays (assoc-in relays [url :retry-time] now)] + relays)) + (defn handle-close [relay] (let [url (::ws-relay/url relay) now (quot (System/currentTimeMillis) 1000) minutes-10 600 - date (- now minutes-10) - inc-retry (fn [relays url] - (let [retries (get-in relays [url :retries] 0)] - (assoc-in relays [url :retries] (inc retries))))] + date (- now minutes-10)] (prn 'relay-closed url) (swap! relays assoc-in [url :connection] nil) - (swap! relays inc-retry url) + (swap! relays increment-relay-retry url) (future (let [retries (get-in @relays [url :retries]) seconds-to-wait (min 300 (* retries 10))] diff --git a/src/more_speech/nostr/util.clj b/src/more_speech/nostr/util.clj index fb3a1ac..1dfb4c3 100644 --- a/src/more_speech/nostr/util.clj +++ b/src/more_speech/nostr/util.clj @@ -81,3 +81,6 @@ key-bytes (byte-array 32) _ (.nextBytes gen key-bytes)] key-bytes)) + +(defn get-now [] + (System/currentTimeMillis))