From 8caed635f2d329e06b373ab0e6a42f013b8a84a0 Mon Sep 17 00:00:00 2001 From: Tienson Qin Date: Thu, 9 Apr 2026 03:27:51 +0800 Subject: [PATCH] fix(sync): tolerate stale gzip headers in snapshot download --- src/main/frontend/worker/sync/download.cljs | 91 ++++++++++++------- .../frontend/worker/sync/download_test.cljs | 44 +++++++++ 2 files changed, 102 insertions(+), 33 deletions(-) create mode 100644 src/test/frontend/worker/sync/download_test.cljs diff --git a/src/main/frontend/worker/sync/download.cljs b/src/main/frontend/worker/sync/download.cljs index 71e04dddaf..6ac59cb290 100644 --- a/src/main/frontend/worker/sync/download.cljs +++ b/src/main/frontend/worker/sync/download.cljs @@ -58,19 +58,43 @@ ( resp .-headers (.get "content-encoding"))] - (cond - (nil? (.-body resp)) - nil +(defn- (.read reader) + (p/then (fn [result] + (if (.-done result) + false + (gzip-bytes? (->uint8 (.-value result)))))) + (p/catch (fn [_] false)) + (p/finally (fn [] + (try + (.releaseLock reader) + (catch :default _))))))) - (= "gzip" encoding) - (when (exists? js/DecompressionStream) - (.pipeThrough (.-body resp) (js/DecompressionStream. "gzip"))) +(defn- resp .-headers (.get "content-encoding"))] + (cond + (nil? body) + (p/resolved nil) + + (and (= "gzip" encoding) (exists? js/DecompressionStream)) + (if (fn? (.-tee body)) + (let [branches (.tee body) + probe (aget branches 0) + payload (aget branches 1)] + (-> (uint8 (.-value result))) - pending (into pending rows)] - (p/let [pending (uint8 (.-value result))) + pending (into pending rows)] + (p/let [pending ( (#'sync-download/