From 17a092d4388ca580819d40997e177f251fb5c0d3 Mon Sep 17 00:00:00 2001 From: charlie Date: Fri, 1 May 2026 17:52:19 +0800 Subject: [PATCH] fix(electron): compatible ipc for js object --- src/electron/electron/handler.cljs | 4 +++- src/main/electron/ipc.cljs | 23 ++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/electron/electron/handler.cljs b/src/electron/electron/handler.cljs index 719e4d7129..1ebe6adaa3 100644 --- a/src/electron/electron/handler.cljs +++ b/src/electron/electron/handler.cljs @@ -523,7 +523,9 @@ (p/let [message (decode-main-ipc-message args-js) _ (vreset! message* message) result (handle (or (utils/get-win-from-sender event) window) message)] - (sqlite-util/write-transit-str result)) + (if (= (last message) "js-obj") + (bean/->js result) + (sqlite-util/write-transit-str result))) (p/catch (fn [e] (let [command (command-name @message*)] (when-not (contains? #{"mkdir" "stat"} command) diff --git a/src/main/electron/ipc.cljs b/src/main/electron/ipc.cljs index 537164222e..a9bf5d6f57 100644 --- a/src/main/electron/ipc.cljs +++ b/src/main/electron/ipc.cljs @@ -11,12 +11,29 @@ (sqlite-util/read-transit-str result) result)) +(defn- js-pure-object? + [x] + (or (array? x) + (and (some? x) + (= "[object Object]" + (.call (.-toString (.-prototype js/Object)) x)) + (let [prototype (js/Object.getPrototypeOf x)] + (or (nil? prototype) + (nil? (js/Object.getPrototypeOf prototype))))))) + +(defn- has-js-obj? + [args] + (some js-pure-object? args)) + (defn ipc [& args] (when (util/electron?) - (p/let [payload (sqlite-util/write-transit-str (vec args)) - maybe-result-str (js/window.apis.doAction payload)] - (maybe-read-transit maybe-result-str)))) + (if-let [args (and (has-js-obj? args) + (conj (vec args) :js-obj))] + (js/window.apis.doAction (bean/->js args)) + (p/let [payload (sqlite-util/write-transit-str args) + maybe-result-str (js/window.apis.doAction payload)] + (maybe-read-transit maybe-result-str))))) (defn invoke [channel & args]