From 6f754de2e30c7919819131fff4662146daa8fb2e Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 14:24:08 +0100 Subject: [PATCH 1/9] Switched from project.clj to deps.edn and removed compojure --- deps.edn | 2 ++ project.clj | 8 -------- 2 files changed, 2 insertions(+), 8 deletions(-) create mode 100644 deps.edn delete mode 100644 project.clj diff --git a/deps.edn b/deps.edn new file mode 100644 index 0000000..c4c697f --- /dev/null +++ b/deps.edn @@ -0,0 +1,2 @@ +{:deps {org.clojure/clojure {:mvn/version "1.10.0"} + watchtower/watchtower {:mvn/version "0.1.1"}}} diff --git a/project.clj b/project.clj deleted file mode 100644 index e64bc67..0000000 --- a/project.clj +++ /dev/null @@ -1,8 +0,0 @@ -(defproject ring-refresh "0.2.0" - :description "Ring middleware for automatically refreshing HTML pages" - :url "https://github.com/weavejester/ring-refresh" - :license {:name "Eclipse Public License" - :url "http://www.eclipse.org/legal/epl-v10.html"} - :dependencies [[org.clojure/clojure "1.9.0"] - [watchtower "0.1.1"] - [compojure "1.7.1"]]) From 6d755d094c3985f6ffb34f1cc90613ac9709001f Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:05:27 +0100 Subject: [PATCH 2/9] Use fetch and compare return value to pageLoadTime --- resources/ring/js/refresh.js | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/resources/ring/js/refresh.js b/resources/ring/js/refresh.js index 8426fbc..5e6f2e9 100644 --- a/resources/ring/js/refresh.js +++ b/resources/ring/js/refresh.js @@ -1,19 +1,29 @@ -var pageLoadTime = new Date().getTime() +var pageLoadTime = new Date().getTime(); -function reloadIfSourceChanged() { - var request = new XMLHttpRequest() - request.onreadystatechange = function() { - if (request.readyState == 4) { - if (request.responseText == 'true') { - window.location.reload() - } - else { - setTimeout(reloadIfSourceChanged, 200) + +async function reloadIfSourceChanged() { + try { + const response = await fetch('/__source_changed', { + method: 'GET', + headers: { + 'Content-Type': 'application/json' } + }); + const text = await response.text() + const sourceChanged = parseInt(text); + + if (sourceChanged >= pageLoadTime) { + console.log("Changed") + window.location.reload(); } + } catch (error) { + console.error('Error:', error); } - request.open('GET', '/__source_changed?since=' + pageLoadTime, true) - request.send() } -window.onload = reloadIfSourceChanged +async function reloadIfSourceChangedJob() { + await reloadIfSourceChanged() + setTimeout(reloadIfSourceChangedJob, 200); +} + +window.onload = reloadIfSourceChangedJob; From 0c48d2a917dd70a172410ef460c3a2b7e29b6bd4 Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:05:44 +0100 Subject: [PATCH 3/9] Remove all deps --- deps.edn | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index c4c697f..f25c7da 100644 --- a/deps.edn +++ b/deps.edn @@ -1,2 +1,2 @@ -{:deps {org.clojure/clojure {:mvn/version "1.10.0"} - watchtower/watchtower {:mvn/version "0.1.1"}}} +{:paths ["src" "resources"] + :deps {}} From 879d266c5f285e78d31446a14c513353c3e7a633 Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:07:08 +0100 Subject: [PATCH 4/9] Fix #6: Inject script before the closing --- src/ring/middleware/refresh.clj | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/ring/middleware/refresh.clj b/src/ring/middleware/refresh.clj index 6d98980..6b7bf76 100644 --- a/src/ring/middleware/refresh.clj +++ b/src/ring/middleware/refresh.clj @@ -50,6 +50,8 @@ (defn- random-uuid [] (str (UUID/randomUUID))) + #"" + #(str "\n\n" %)))) (defn- watch-until [reference pred timeout-ms] (let [result (promise) From 9c3ae6cc79f966624ebb92080972baa8fa6562a5 Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:08:10 +0100 Subject: [PATCH 5/9] Get last modified time from .lastModified of io/file --- src/ring/middleware/refresh.clj | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/ring/middleware/refresh.clj b/src/ring/middleware/refresh.clj index 6b7bf76..295ee6e 100644 --- a/src/ring/middleware/refresh.clj +++ b/src/ring/middleware/refresh.clj @@ -6,6 +6,14 @@ (:require [clojure.string :as str] [clojure.java.io :as io]) (:import [java.util Date UUID])) +(defn- dir-last-modified-ts [dir] + (when-let [files (file-seq (io/file dir))] + (apply max (map #(.lastModified %) files)))) + +(defn- dirs-last-modified-ts [dir & dirs] + (->> (cons dir dirs) + (mapv dir-last-modified-ts) + (reduce max))) (defn- get-request? [request] (= (:request-method request) :get)) From 078702c4320e23b9182f6fb3f1919410cf7b6ea5 Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:08:35 +0100 Subject: [PATCH 6/9] Remove dependencies --- src/ring/middleware/refresh.clj | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/ring/middleware/refresh.clj b/src/ring/middleware/refresh.clj index 295ee6e..ddf9110 100644 --- a/src/ring/middleware/refresh.clj +++ b/src/ring/middleware/refresh.clj @@ -1,11 +1,7 @@ (ns ring.middleware.refresh - (:refer-clojure :exclude [random-uuid]) - (:use [compojure.core :only (routes GET)] - [watchtower.core :only (watcher rate on-change)] - ring.middleware.params) (:require [clojure.string :as str] - [clojure.java.io :as io]) - (:import [java.util Date UUID])) + [clojure.java.io :as io])) + (defn- dir-last-modified-ts [dir] (when-let [files (file-seq (io/file dir))] (apply max (map #(.lastModified %) files)))) From a5418e88bfe1a94ce1c5cc966ab4b0b10a9f2b91 Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:09:42 +0100 Subject: [PATCH 7/9] Minor: if-let -> when-let --- src/ring/middleware/refresh.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ring/middleware/refresh.clj b/src/ring/middleware/refresh.clj index ddf9110..0569fd0 100644 --- a/src/ring/middleware/refresh.clj +++ b/src/ring/middleware/refresh.clj @@ -15,7 +15,7 @@ (= (:request-method request) :get)) (defn- html-content? [response] - (if-let [content-type (get-in response [:headers "Content-Type"])] + (when-let [content-type (get-in response [:headers "Content-Type"])] (re-find #"text/html" content-type))) (def ^:private refresh-script @@ -37,7 +37,7 @@ (as-str [_] nil)) (defn- add-script [body script] - (if-let [body-str (as-str body)] + (when-let [body-str (as-str body)] (str/replace body-str #"]+)?>" From 8bbc1d54513b7eefb66ab4cb8ae27cccd0b01fcc Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:10:07 +0100 Subject: [PATCH 8/9] Remove watcher and compojure and inject an endpoint directly --- src/ring/middleware/refresh.clj | 51 ++++++++------------------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/src/ring/middleware/refresh.clj b/src/ring/middleware/refresh.clj index 0569fd0..1b17991 100644 --- a/src/ring/middleware/refresh.clj +++ b/src/ring/middleware/refresh.clj @@ -40,44 +40,19 @@ (when-let [body-str (as-str body)] (str/replace body-str - #"]+)?>" - #(str % "")))) - -(def ^:private last-modified - (atom (Date.))) - -(defn- watch-dirs! [dirs] - (watcher dirs - (rate 100) - (on-change - (fn [_] (reset! last-modified (Date.)))))) - -(defn- random-uuid [] - (str (UUID/randomUUID))) #"" #(str "\n\n" %)))) -(defn- watch-until [reference pred timeout-ms] - (let [result (promise) - watch-key (random-uuid)] - (try - (add-watch reference - watch-key - (fn [_ _ _ value] - (when (pred value) - (deliver result true)))) - (or (pred @reference) - (deref result timeout-ms false)) - (finally - (remove-watch reference watch-key))))) +(defn- source-changed-handler [_ dirs] + {:status 200 + :headers {"Content-Type" "application/json"} + :body (str (apply dirs-last-modified-ts dirs))}) -(def ^:private source-changed-route - (GET "/__source_changed" [since] - (let [timestamp (Long. since)] - (str (watch-until - last-modified - #(> (.getTime %) timestamp) - 60000))))) +(defn- intercept-source-changed-route [handler dirs] + (fn [{:keys [uri] :as request}] + (if (= uri "/__source_changed") + (source-changed-handler request dirs) + (handler request)))) (defn- wrap-with-script [handler script] (fn [request] @@ -97,8 +72,6 @@ ([handler] (wrap-refresh handler ["src" "resources"])) ([handler dirs] - (watch-dirs! dirs) - (wrap-params - (routes - source-changed-route - (wrap-with-script handler refresh-script))))) + (fn [request] + (let [wrapped (-> handler (intercept-source-changed-route dirs) (wrap-with-script refresh-script))] + (wrapped request))))) From 981a1b58333c69414394dbe8a1aa7efe15d12071 Mon Sep 17 00:00:00 2001 From: licht1stein Date: Fri, 5 Jul 2024 20:16:10 +0100 Subject: [PATCH 9/9] Remove console log --- resources/ring/js/refresh.js | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/ring/js/refresh.js b/resources/ring/js/refresh.js index 5e6f2e9..bf7e66c 100644 --- a/resources/ring/js/refresh.js +++ b/resources/ring/js/refresh.js @@ -13,7 +13,6 @@ async function reloadIfSourceChanged() { const sourceChanged = parseInt(text); if (sourceChanged >= pageLoadTime) { - console.log("Changed") window.location.reload(); } } catch (error) {