diff --git a/src/main/frontend/handler/assets.cljs b/src/main/frontend/handler/assets.cljs index 8150df2b6a..017ef4e9d3 100644 --- a/src/main/frontend/handler/assets.cljs +++ b/src/main/frontend/handler/assets.cljs @@ -163,6 +163,34 @@ (-> (if (string? file) file (.arrayBuffer file)) (p/then db-asset/uint8 + [payload] + (cond + (instance? js/Uint8Array payload) + payload + + (instance? js/ArrayBuffer payload) + (js/Uint8Array. payload) + + (and (exists? js/ArrayBuffer) + (.isView js/ArrayBuffer payload)) + (js/Uint8Array. (.-buffer payload) (.-byteOffset payload) (.-byteLength payload)) + + (array? payload) + (js/Uint8Array. payload) + + (sequential? payload) + (js/Uint8Array. (clj->js payload)) + + (and (object? payload) + (= "Buffer" (aget payload "type")) + (array? (aget payload "data"))) + (js/Uint8Array. (aget payload "data")) + + :else + (throw (ex-info "unsupported binary payload" + {:payload-type (str (type payload))})))) + (defn uint8 asset-file) + asset-file) asset-file* (if (not aes-key) asset-file (ldb/write-transit-str diff --git a/src/main/frontend/worker/sync.cljs b/src/main/frontend/worker/sync.cljs index 08d050c9b3..60b93f4d2d 100644 --- a/src/main/frontend/worker/sync.cljs +++ b/src/main/frontend/worker/sync.cljs @@ -5,6 +5,7 @@ [clojure.string :as string] [datascript.core :as d] [datascript.storage :refer [IStorage]] + [frontend.common.crypt :as crypt] [frontend.worker-common.util :as worker-util] [frontend.worker.handler.page :as worker-page] [frontend.worker.shared-service :as shared-service] @@ -729,14 +730,24 @@ (fn [prev] (p/then prev (fn [_] (task))))))) +(defn- vec + [^js payload] + (js->clj (js/Array.from payload))) + +(deftest coerce-array-buffer-to-uint8-test + (let [source (js/Uint8Array. #js [1 2 3]) + output (#'assets/->uint8 (.-buffer source))] + (is (instance? js/Uint8Array output)) + (is (= [1 2 3] (uint8->vec output))))) + +(deftest coerce-array-buffer-view-to-uint8-test + (let [source (js/Uint8Array. #js [9 8 7 6]) + view (js/DataView. (.-buffer source) 1 2) + output (#'assets/->uint8 view)] + (is (instance? js/Uint8Array output)) + (is (= [8 7] (uint8->vec output))))) + +(deftest coerce-buffer-like-object-to-uint8-test + (let [buffer-like #js {:type "Buffer" + :data #js [10 11 12]} + output (#'assets/->uint8 buffer-like)] + (is (instance? js/Uint8Array output)) + (is (= [10 11 12] (uint8->vec output))))) + diff --git a/src/test/frontend/worker/db_sync_test.cljs b/src/test/frontend/worker/db_sync_test.cljs index 55f21f9f2a..a63afa13a3 100644 --- a/src/test/frontend/worker/db_sync_test.cljs +++ b/src/test/frontend/worker/db_sync_test.cljs @@ -541,3 +541,97 @@ (is (= [{:asset-uuid "title-1" :asset-type "txt"}] @download-calls)) (is (= "rehydrated-title" (:block/title block)))) (p/finally done)))))))) + +(deftest upload-remote-asset-passes-exported-aes-key-for-e2ee-test + (async done + (let [calls (atom []) + exported-aes-key (js/Uint8Array. #js [1 2 3])] + (-> (p/with-redefs [db-sync/http-base-url (fn [] "https://base") + sync-crypt/graph-e2ee? (fn [_repo] true) + sync-crypt/ (p/with-redefs [db-sync/http-base-url (fn [] "https://base") + sync-crypt/graph-e2ee? (fn [_repo] true) + sync-crypt/ (p/with-redefs [db-sync/http-base-url (fn [] "https://base") + sync-crypt/graph-e2ee? (fn [_repo] false) + sync-crypt/