refactor: replace core.async with promesa for all async operations

- Store protocol now returns promesa promises instead of core.async channels
- MemoryStore: `(p/resolved val)` replaces chan+put!+close! ceremony
- IDBStore: `p/create` with resolve/reject wraps IDB callbacks
- sync.cljc: CLJ uses `p/vthread`, CLJS returns native Promise chains
- core.cljc: `p/let` replaces go blocks, timer-based sync loop replaces
  go-loop+alts!, debounced push replaces kick channel
- Tests use `deref` with timeout on promesa promises
- Todomvc example uses `p/let` instead of go/<!
This commit is contained in:
Florian Schroedl
2026-04-16 20:05:08 +02:00
parent fffd934262
commit 973b079ae3
9 changed files with 360 additions and 321 deletions

View File

@@ -3,7 +3,7 @@
(:require [pocketbook.core :as pb]
[pocketbook.store.idb :as idb]
[pocketbook.hiccup :refer [html]]
[cljs.core.async :refer [go <!]]
[promesa.core :as p]
[clojure.string :as str]))
;; ---------------------------------------------------------------------------
@@ -232,9 +232,8 @@
;; ---------------------------------------------------------------------------
(defn ^:export init []
(go
(let [store (<! (idb/open "pocketbook-todomvc"))
todos (pb/synced-atom store "todo"
(p/let [store (idb/open "pocketbook-todomvc")]
(let [todos (pb/synced-atom store "todo"
{:server "http://localhost:8090/sync"
:interval 15000})]
(reset! !conn store)
@@ -248,7 +247,7 @@
(.addEventListener js/window "online" (fn [_] (render!)))
(.addEventListener js/window "offline" (fn [_] (render!)))
;; Wait for IDB — watch triggers render automatically
(<! (pb/ready? todos))
(js/console.log "🔶 Pocketbook TodoMVC loaded —" (count @todos) "todos"))))
(p/let [_ (pb/ready? todos)]
(js/console.log "🔶 Pocketbook TodoMVC loaded —" (count @todos) "todos")))))
(init)