Phase 4: Client-side rendering of :data pages via abstract resolve-page-data
Spec layer (orchestration.sx): - try-client-route now handles :data pages instead of falling back to server - New abstract primitive resolve-page-data(name, params, callback) — platform decides transport (HTTP, IPC, cache, etc) - Extracted swap-rendered-content and resolve-route-target helpers Platform layer (bootstrap_js.py): - resolvePageData() browser implementation: fetches /sx/data/<name>, parses SX response, calls callback. Other hosts provide their own transport. Server layer (pages.py): - evaluate_page_data() evaluates :data expr, serializes result as SX - auto_mount_page_data() mounts /sx/data/ endpoint with per-page auth - _build_pages_sx now computes component deps for all pages (not just pure) Test page at /isomorphism/data-test exercises the full pipeline. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -449,6 +449,20 @@
|
||||
:pages pages :total-pages total-pages :client-count client-count
|
||||
:server-count server-count :registry-sample registry-sample))
|
||||
|
||||
(defpage data-test
|
||||
:path "/isomorphism/data-test"
|
||||
:auth :public
|
||||
:layout (:sx-section
|
||||
:section "Isomorphism"
|
||||
:sub-label "Isomorphism"
|
||||
:sub-href "/isomorphism/"
|
||||
:sub-nav (~section-nav :items isomorphism-nav-items :current "Data Test")
|
||||
:selected "Data Test")
|
||||
:data (data-test-data)
|
||||
:content (~data-test-content
|
||||
:server-time server-time :items items
|
||||
:phase phase :transport transport))
|
||||
|
||||
;; ---------------------------------------------------------------------------
|
||||
;; Plans section
|
||||
;; ---------------------------------------------------------------------------
|
||||
|
||||
@@ -23,6 +23,7 @@ def _register_sx_helpers() -> None:
|
||||
"bootstrapper-data": _bootstrapper_data,
|
||||
"bundle-analyzer-data": _bundle_analyzer_data,
|
||||
"routing-analyzer-data": _routing_analyzer_data,
|
||||
"data-test-data": _data_test_data,
|
||||
})
|
||||
|
||||
|
||||
@@ -488,3 +489,26 @@ def _event_detail_data(slug: str) -> dict:
|
||||
"event-example": detail.get("example"),
|
||||
"event-demo": sx_call(demo_name) if demo_name else None,
|
||||
}
|
||||
|
||||
|
||||
def _data_test_data() -> dict:
|
||||
"""Return test data for the client-side data rendering test page.
|
||||
|
||||
This exercises the Phase 4 data endpoint: server evaluates this
|
||||
helper, serializes the result as SX, the client fetches and parses
|
||||
it, then renders the page content with these bindings.
|
||||
"""
|
||||
from datetime import datetime, timezone
|
||||
|
||||
return {
|
||||
"server-time": datetime.now(timezone.utc).isoformat(timespec="seconds"),
|
||||
"items": [
|
||||
{"label": "Eval", "detail": "Server evaluates :data expression"},
|
||||
{"label": "Serialize", "detail": "Result serialized as SX wire format"},
|
||||
{"label": "Fetch", "detail": "Client calls resolve-page-data"},
|
||||
{"label": "Parse", "detail": "Client parses SX response to dict"},
|
||||
{"label": "Render", "detail": "Client merges data into env, renders content"},
|
||||
],
|
||||
"phase": "Phase 4 — Client Async & IO Bridge",
|
||||
"transport": "SX wire format (text/sx)",
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user