Skip to content

Commit

Permalink
Move to Electric v3.
Browse files Browse the repository at this point in the history
  • Loading branch information
whilo committed Feb 9, 2025
1 parent ce67937 commit 3b97c81
Show file tree
Hide file tree
Showing 9 changed files with 90 additions and 71 deletions.
2 changes: 1 addition & 1 deletion deps.edn
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{:paths ["src" "resources"]
:deps {com.hyperfiddle/electric {:git/url "https://github.com/hyperfiddle/electric" :git/sha "b32ac98df7d7ec87f225d47354671be172ffa87e"}
:deps {com.hyperfiddle/electric {:mvn/version "v3-alpha-SNAPSHOT"}
ring/ring {:mvn/version "1.11.0"} ; comes with Jetty
ring-basic-authentication/ring-basic-authentication {:mvn/version "1.2.0"}
org.clojure/tools.logging {:mvn/version "1.2.4"}
Expand Down
2 changes: 1 addition & 1 deletion shadow-cljs.edn
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
:output-dir "resources/public/electric_starter_app/js"
:asset-path "/js"
:modules {:main {:entries [dev] :init-fn dev/start!}}
:build-hooks [(hyperfiddle.electric.shadow-cljs.hooks/reload-clj)]}
:build-hooks [(hyperfiddle.electric.shadow-cljs.hooks3/reload-clj)]}
:prod {:target :browser
:output-dir "resources/public/electric_starter_app/js"
:asset-path "/js"
Expand Down
41 changes: 23 additions & 18 deletions src-dev/dev.cljc
Original file line number Diff line number Diff line change
@@ -1,49 +1,54 @@
(ns dev
(:require
clojure.edn
is.simm.views.main
[hyperfiddle.electric :as e]
#_electric-starter-app.main
[hyperfiddle.electric3 :as e]
#?(:cljs hyperfiddle.electric-client3)
#?(:clj [is.simm.server-jetty :as jetty])
#?(:clj [shadow.cljs.devtools.api :as shadow])
#?(:clj [shadow.cljs.devtools.server :as shadow-server])
#?(:clj [clojure.tools.logging :as log])))

(comment (-main)) ; repl entrypoint

#?(:clj ;; Server Entrypoint
#?(:clj ; server entrypoint
(do
(def config
{:host "0.0.0.0"
:port 8081
:resources-path "public/electric_starter_app"
:manifest-path ; contains Electric compiled program's version so client and server stays in sync
"public//electric_starter_app/js/manifest.edn"})

(defn -main [& _args]
(merge
{:host "localhost"
:port 8081
:resources-path "public/electric_starter_app"
:manifest-path ; contains Electric compiled program's version so client and server stays in sync
"public/electric_starter_app/js/manifest.edn"}))

(defn -main [& args]
(log/info "Starting Electric compiler and server...")

(shadow-server/start!)
(shadow-server/start!) ; no-op in calva shadow-cljs configuration which starts this out of band
(shadow/watch :dev)

(comment (shadow-server/stop!))

(def server (jetty/start-server!
(fn [ring-request]
(e/boot-server {} is.simm.views.main/Main ring-request))
(e/boot-server {} is.simm.views.main/Main (e/server ring-request)))
config))

(comment (.stop server))
(comment
(.stop server) ; jetty
(server) ; httpkit
)
)))

#?(:cljs ;; Client Entrypoint
#?(:cljs ; client entrypoint
(do
(def electric-entrypoint (e/boot-client {} is.simm.views.main/Main nil))

(defonce reactor nil)

(defn ^:dev/after-load ^:export start! []
(set! reactor (electric-entrypoint
(set! reactor ((e/boot-client {} is.simm.views.main/Main (e/server nil))
#(js/console.log "Reactor success:" %)
#(js/console.error "Reactor failure:" %))))

(defn ^:dev/before-load stop! []
(when reactor (reactor)) ; stop the reactor
(set! reactor nil))))
(set! reactor nil))))
14 changes: 13 additions & 1 deletion src/is/simm/runtimes/openai.clj
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,19 @@
(comment

(async/<!! (text-chat "gpt-4o-mini" "What is the capital of France?"))


(println
(async/<!! (text-chat "gpt-4o-mini" "You are bootstrapping an AGI system on top of a distributed simulation engine with a git-like memory model in Clojure with Datahike. You can hook into APIs and export a user interface. ")))

(def business-ideas
(async/<!! (text-chat "gpt-4o-mini" "You are bootstrapping profitable economic systems on top of an AGI engine. You can hook into APIs and export a user interface. What business ideas could you persue? Pick ideas that can be executed with low effort, low risk and do not require a large investment. Maximize profits.")))

(println business-ideas)

(def goals
(async/<!! (text-chat "gpt-4o-mini" "What goals should AGI pursue beyond typical human goals?")))

(println goals)

;; vision chat
(import '[java.nio.file Files Paths]
Expand Down
29 changes: 15 additions & 14 deletions src/is/simm/server_jetty.clj
Original file line number Diff line number Diff line change
@@ -1,24 +1,27 @@
(ns is.simm.server-jetty
(ns is.simm.server-jetty #_electric-starter-app.server-jetty
"Electric integrated into a sample ring + jetty app."
(:require
[is.simm.users :refer [authenticate]]
[clojure.edn :as edn]
[clojure.java.io :as io]
[clojure.string :as str]
[clojure.tools.logging :as log]
[contrib.assert :refer [check]]
[hyperfiddle.electric-ring-adapter :as electric-ring]
[hyperfiddle.electric-ring-adapter3 :as electric-ring]
[ring.adapter.jetty :as ring]
[ring.middleware.basic-authentication :as auth]
[ring.middleware.content-type :refer [wrap-content-type]]
[ring.middleware.cookies :as cookies]
[ring.middleware.params :refer [wrap-params]]
[ring.middleware.resource :refer [wrap-resource]]
[ring.util.response :as res]
[is.simm.users :refer [authenticate]])
[ring.util.response :as res])
(:import
(org.eclipse.jetty.server.handler.gzip GzipHandler)
(org.eclipse.jetty.websocket.server.config JettyWebSocketServletContainerInitializer JettyWebSocketServletContainerInitializer$Configurator)))

;;; Demo middlewares

#_(defn authenticate [username _password] username) ; demo (accept-all) authentication

(defn wrap-demo-authentication "A Basic Auth example. Accepts any username/password and store the username in a cookie."
[next-handler]
Expand All @@ -42,7 +45,6 @@
;; For any other route, delegate to next middleware
(next-handler ring-req))))


;;; Electric integration

(defn electric-websocket-middleware
Expand All @@ -57,8 +59,8 @@
;; Applied bottom-up
(-> (electric-ring/wrap-electric-websocket next-handler entrypoint) ; 5. connect electric client
; 4. this is where you would add authentication middleware (after cookie parsing, before Electric starts)
(cookies/wrap-cookies) ; 3. makes cookies available to Electric app
(electric-ring/wrap-reject-stale-client config) ; 2. reject stale electric client
(electric-ring/wrap-reject-stale-client config) ; 3. reject stale electric client
(cookies/wrap-cookies) ; 2. makes cookies available to auth and Electric app
(wrap-params))) ; 1. parse query params

(defn get-modules [manifest-path]
Expand Down Expand Up @@ -102,11 +104,10 @@ information."
(defn http-middleware [config]
;; these compose as functions, so are applied bottom up
(-> not-found-handler
(wrap-index-page config) ; 3. otherwise fallback to default page file
(wrap-resource (:resources-path config)) ; 2. serve static file from classpath
(wrap-content-type) ; 1. detect content (e.g. for index.html)
(wrap-demo-router)

(wrap-index-page config) ; 4. otherwise fallback to default page file
(wrap-resource (:resources-path config)) ; 3. serve static file from classpath
(wrap-content-type) ; 2. detect content (e.g. for index.html)
(wrap-demo-router) ; 1. route
))

(defn middleware [config entrypoint]
Expand Down Expand Up @@ -135,7 +136,7 @@ information."

(defn start-server! [entrypoint
{:keys [port host]
:or {port 8080, host "0.0.0.0"}
:or {port 8081, host "0.0.0.0"}
:as config}]
(let [server (ring/run-jetty (middleware config entrypoint)
(merge {:port port
Expand All @@ -145,4 +146,4 @@ information."
(add-gzip-handler! server))}
config))]
(log/info "👉" (str "http://" host ":" (-> server (.getConnectors) first (.getPort))))
server))
server))
19 changes: 10 additions & 9 deletions src/is/simm/simulations/screenshare/view.cljc
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
(ns is.simm.simulations.screenshare.view
(:require [hyperfiddle.electric :as e]
[hyperfiddle.electric-dom2 :as dom]
(:require [hyperfiddle.electric3 :as e]
[hyperfiddle.electric-dom3 :as dom]
#?(:clj [is.simm.simulations.screenshare.screens :refer [screens-conn get-screens add-screen! remove-screen! set-active!
!running-rustdesks list-recordings remove-recording! parse-date
recordings-conn]])
Expand Down Expand Up @@ -43,11 +43,11 @@
;; Input form for adding screen-id
(dom/div (dom/props {:class "mb-4"})
(dom/input (dom/props {:class "border p-2 mr-4 text-gray-700"
:placeholder "Enter RustDesk screen id"
:value @!screen-id}))
(dom/on "change" (e/fn [e]
(.log js/console e) (reset! !screen-id (.. e -target -value))))
(dom/On-all "change" (e/fn [e] (.log js/console e) (reset! !screen-id (.. e -target -value))))
(dom/button (dom/props {:class "bg-blue-500 text-white p-2 rounded"})
(dom/on "click" (e/fn [e]
(dom/On-all "click" (e/fn [e]
(prn "click" e)
(.log js/console e)
(let [screen-id (e/client @!screen-id)]
Expand All @@ -71,19 +71,19 @@
(dom/button (dom/props (merge {:class (str "bg-gray-900 text-gray-700 p-2 rounded "
(if (contains? running-screens screen)
"text-red-500" "text-gray-700"))}))
(dom/on "click" (e/fn [e]
(dom/On-all "click" (e/fn [e]
(prn "screen" e)
(reset! !selected-screen screen)))
(dom/text screen))
;; Remove button
(dom/button (dom/props {:class "bg-red-500 text-white p-2 rounded"})
(dom/on "click" (e/fn [e]
(dom/On-all "click" (e/fn [e]
(prn "remove" e)
(e/server (remove-screen! screen))))
(dom/text "Remove"))
;; Activate button
(dom/button (dom/props {:class "bg-green-500 text-white p-2 rounded"})
(dom/on "click" (e/fn [e]
(dom/On-all "click" (e/fn [e]
(prn "de/activate" e)
(e/server (set-active! screen (not active)))))
(if active
Expand All @@ -103,12 +103,13 @@
recordings-db selected-screen)]
(e/client
(when (seq recordings)
(dom/h4 (dom/props {:class "text-xl font-semibold text-gray-800"}) (dom/text "Recordings"))
(dom/ul (dom/props {:class "list-disc pl-6 space-y-2 text-left"})
(e/for [rec (seq recordings)]
(dom/li (dom/props {})
(dom/text (e/server (parse-date rec)))
(dom/button (dom/props {:class "bg-red-500 text-white p-2 rounded"})
(dom/on "click" (e/fn [e]
(dom/On-all "click" (e/fn [e]
(prn "remove recording" e)
(e/server (remove-recording! rec))))
(dom/text "Remove"))
Expand Down
32 changes: 16 additions & 16 deletions src/is/simm/views/main.cljc
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
(:require [is.simm.views.tasks :refer [TaskManager]]
[is.simm.simulations.screenshare.view :refer [ScreenShare]]
#?(:clj [is.simm.users :refer [get-session add-session! update-session! delete-session! get-user]])
[hyperfiddle.electric :as e]
[hyperfiddle.electric-dom2 :as dom]
[hyperfiddle.electric3 :as e]
[hyperfiddle.electric-dom3 :as dom]
#?(:clj [datahike.api :as d])
[missionary.core :as m]))

Expand All @@ -15,25 +15,25 @@
(e/defn Header [session-id]
(e/client
(let [user (e/server (get-user session-id))]
(dom/header (dom/props {:class "bg-gray-600 p-4"})
(dom/header (dom/props {:class "bg-gray-400 p-4"})
(dom/div (dom/props {:class "container mx-auto flex justify-between items-center"})
(dom/div (dom/props {:class "flex items-center"})
(dom/a (dom/props {:class "text-white text-xl font-bold"})
(dom/on "click" (e/fn [_e] (reset! !view-state :main)))
(dom/On-all "click" (e/fn [_e] (reset! !view-state :main)))
(dom/img (dom/props {:src "/simmis.png" :alt "Logo" :class "h-10" :style {:transform (str "rotate(" @!rotation "deg)")}})))
(dom/text "immis"))
(dom/nav (dom/props {:class "flex space-x-4"})
(dom/a (dom/props {:class "text-white" :href "#about"})
(dom/on "click" (e/fn [_e] (reset! !view-state :about)))
(dom/On-all "click" (e/fn [_e] (reset! !view-state :about)))
(dom/text "About"))
#_(dom/a (dom/props {:class "text-white" :href "#taskmanager"})
(dom/on "click" (e/fn [_e] (reset! !view-state :taskmanager)))
(dom/On-all "click" (e/fn [_e] (reset! !view-state :taskmanager)))
(dom/text "Task Manager"))
(dom/a (dom/props {:class "text-white" :href "#screenshare"})
(dom/on "click" (e/fn [_e] (reset! !view-state :screenshare)))
(dom/On-all "click" (e/fn [_e] (reset! !view-state :screenshare)))
(dom/text "Screen Share"))
(dom/a (dom/props {:class "text-white" :href "#user"})
(dom/on "click" (e/fn [_e] (js/alert "not implemented")))
(dom/On-all "click" (e/fn [_e] (js/alert "not implemented")))
(dom/text user))))))))


Expand Down Expand Up @@ -75,7 +75,7 @@
(dom/div (dom/props {:class "w-full max-w-md"})
(dom/h1 (dom/props {:class "text-3xl font-bold mb-6"}) (dom/text "Signup"))
(dom/form (dom/props {:class "bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4"})))
(dom/on "submit" submit-fn)
(dom/On-all "submit" submit-fn)
(dom/div (dom/props {:class "mb-4"})
(dom/label (dom/props {:class "block text-gray-700 text-sm font-bold mb-2"} (dom/text "Username")))
(dom/input (dom/props {:id "user" :class "shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" :type "text" :placeholder "Username"})))
Expand All @@ -84,7 +84,7 @@
(dom/input (dom/props {:id "password" :class "shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline" :type "password" :placeholder "Password"})))
(dom/div (dom/props {:class "flex items-center justify-between"})
(dom/button (dom/props {:class "bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline" :type "submit"})
(dom/on "click" submit-fn)
(dom/On-all "click" submit-fn)
(dom/text "Login")))))))


Expand Down Expand Up @@ -143,14 +143,14 @@
(e/client
(binding [dom/node js/document.body]
(dom/section (dom/props {:class "flex flex-col min-h-screen"})
(Header. session)
(Header session)
(if-not session
(LoginOrSignup.)
(LoginOrSignup)
(dom/div (dom/props {:class "flex-grow"})
(case view-state
:main (ScreenShare. session)
:screenshare (ScreenShare. session)
:main (ScreenShare session)
:screenshare (ScreenShare session)
;:taskmanager (TaskManager.)
;:login (Login.)
:about (About.))))
(Footer.))))))
:about (About))))
(Footer))))))
4 changes: 2 additions & 2 deletions src/is/simm/views/react.cljc
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
(ns is.simm.views.react
#?(:cljs (:require-macros [is.simm.views.main :refer [with-reagent]]))
(:require [is.simm.tasks :refer [TaskManager]]
[hyperfiddle.electric :as e]
[hyperfiddle.electric-dom2 :as dom]
[hyperfiddle.electric3 :as e]
[hyperfiddle.electric-dom3 :as dom]
#?(:clj [datahike.api :as d])
#?(:cljs [reagent.core :as r])
[missionary.core :as m]
Expand Down
Loading

0 comments on commit 3b97c81

Please sign in to comment.