This page is not created by, affiliated with, or supported by Slack Technologies, Inc.
2024-01-26
Channels
- # babashka (2)
- # calva (3)
- # clj-kondo (8)
- # clojure (40)
- # clojure-europe (21)
- # clojure-nl (1)
- # clojure-norway (33)
- # clojure-uk (4)
- # core-async (8)
- # data-science (11)
- # datomic (64)
- # fulcro (15)
- # helix (4)
- # hyperfiddle (16)
- # keyboards (2)
- # lsp (6)
- # music (9)
- # off-topic (31)
- # polylith (11)
- # portal (1)
- # reitit (14)
- # shadow-cljs (20)
- # tools-deps (5)
- # xtdb (3)
seeing some unexpected behavior, am I missing something obvious??
(ns app.test
(:require [hyperfiddle.electric :as e]
[hyperfiddle.electric-dom2 :as dom :refer [div text]]))
#?(:clj (def !a (atom "a")))
(e/def a (e/server (e/watch !a)))
#?(:clj (def !b (atom "b")))
(e/def b (e/server (e/watch !b)))
#?(:clj (def !c (atom "c")))
(e/def c (e/server (e/watch !c)))
(e/defn Test []
(e/client
(div
(div (text "a: " (pr-str a)))
(div (text "b: " (pr-str b)))
(div (text "c: " (pr-str c))))
(println a)
(println b)
(println c)))
this is on latest master (`b32ac9`)well this works as expected in electric-fiddle
so it must be something screwy in my app. any tips on locating the issue?
on my original project, I tried pasting in the Toggle demo code (https://electric-examples-app.fly.dev/(electric-tutorial.demo-toggle!%54oggle)/) and got this error:
22:57:17.316 ERROR [qtp362743760-80] hyperfiddle.electric - #error {
:cause check failed: (some? (get (aget frame frame-slot-dynamic) symb)) for nil
:data {:hyperfiddle.electric.debug/trace [{: :, :hyperfiddle.electric.debug/type :eval, :hyperfiddle.electric.debug/fn {}, :hyperfiddle.electric.debug/args [/test2 <exception>], :hyperfiddle.electric.debug/origin #uuid "af9a7076-d898-4b7f-9acb-4aa19cbada54", :hyperfiddle.electric.debug/serializable true} {: :, :hyperfiddle.electric.debug/type :eval, :hyperfiddle.electric.debug/fn {}, :hyperfiddle.electric.debug/args [#object[HTMLBodyElement [object HTMLBodyElement]] <exception>], :hyperfiddle.electric.debug/origin #uuid "af9a7076-d898-4b7f-9acb-4aa19cbada54", :hyperfiddle.electric.debug/serializable true} {: :, :hyperfiddle.electric.debug/origin #uuid "af9a7076-d898-4b7f-9acb-4aa19cbada54", :hyperfiddle.electric.debug/args [], :hyperfiddle.electric.debug/serializable true}], :hyperfiddle.electric/type :hyperfiddle.electric.debug/trace}
:via
[{:type hyperfiddle.electric.FailureInfo
:message check failed: (some? (get (aget frame frame-slot-dynamic) symb)) for nil
:data {:hyperfiddle.electric.debug/trace [{: :, :hyperfiddle.electric.debug/type :eval, :hyperfiddle.electric.debug/fn {}, :hyperfiddle.electric.debug/args [/test2 <exception>], :hyperfiddle.electric.debug/origin #uuid "af9a7076-d898-4b7f-9acb-4aa19cbada54", :hyperfiddle.electric.debug/serializable true} {: :, :hyperfiddle.electric.debug/type :eval, :hyperfiddle.electric.debug/fn {}, :hyperfiddle.electric.debug/args [#object[HTMLBodyElement [object HTMLBodyElement]] <exception>], :hyperfiddle.electric.debug/origin #uuid "af9a7076-d898-4b7f-9acb-4aa19cbada54", :hyperfiddle.electric.debug/serializable true} {: :, :hyperfiddle.electric.debug/origin #uuid "af9a7076-d898-4b7f-9acb-4aa19cbada54", :hyperfiddle.electric.debug/args [], :hyperfiddle.electric.debug/serializable true}], :hyperfiddle.electric/type :hyperfiddle.electric.debug/trace}}]
:trace
[]}
in case default branch
in (case 0 ...)
in reactive (defn Main nil ...) line 19
in (try ...)
client logged an exception, too
think I found a minimal repro. seems you can't import watches
(ns app.teststate
(:require [hyperfiddle.electric :as e]))
#?(:clj (def !a (atom "a")))
(e/def a (e/server (e/watch !a)))
;---
(ns app.test
(:require [hyperfiddle.electric :as e]
[hyperfiddle.electric-dom2 :as dom :refer [div text]]
#?(:cljs [app.teststate :refer [a]])))
(e/defn Test [] (e/client (div (text "a: " (pr-str a)))))
thanks for the report and minimized repro! The last snippet, you tried it in electric-fiddle?
I did not reproduce locally. Comparing the code you posted to what I typed, the #?(:cljs
conditional on the require is likely the culprit. If a
is an electric def the server needs to know that too
i see, makes sense that both client and server need to know about the e/def
. thanks for following up. as written (with the conditional) it seems to mess up EVERYTHING even outside of that ns. easy for a newbie like me to get confused
To summarize, we've learned that #?(:cljs ...)
around a namespace that contains electric expressions that have server contents, causes a client/server mismatch under IC. Furthermore, the mismatch is not detected, is allowed to run and we see spooky undefined behavior due to the programs being out of sync. Correct?