From 9384c78ef26210ecaa96cec77d4a964f2e66b6aa Mon Sep 17 00:00:00 2001 From: Kris Nye Date: Fri, 4 Sep 2026 01:19:44 -0700 Subject: [PATCH 1/4] feat(data-rpc): schema-driven bidirectional service projection across iframe/MessagePort New @adobe/data-rpc package projects AsyncDataServices across a boundary in both directions over one channel; only Data crosses the wire, far side synthesizes equivalent-shaped members (incl. nested sub-services). Extracts shared memberKind from create-lazy. Adds data-rpc-iframe Lit sample. Bumps to 0.10.10. Co-Authored-By: Claude Opus 4.8 --- package.json | 2 +- packages/data-ai/.claude-plugin/plugin.json | 2 +- packages/data-ai/package.json | 2 +- packages/data-gpu/package.json | 2 +- packages/data-lit/package.json | 2 +- packages/data-persistence/package.json | 2 +- packages/data-react/package.json | 2 +- packages/data-rpc-iframe/README.md | 43 +++ packages/data-rpc-iframe/index.html | 25 ++ packages/data-rpc-iframe/package.json | 29 ++ .../src/main/create-main-service.ts | 32 ++ .../src/main/main-panel-element.ts | 91 ++++++ .../data-rpc-iframe/src/main/main-panel.ts | 11 + packages/data-rpc-iframe/src/main/main.ts | 44 +++ .../data-rpc-iframe/src/rpc-iframe.test.ts | 62 ++++ .../data-rpc-iframe/src/shared/handshake.ts | 13 + .../src/shared/main-service.ts | 43 +++ .../data-rpc-iframe/src/shared/sub-service.ts | 57 ++++ .../src/sub/create-sub-service.ts | 45 +++ .../src/sub/sub-panel-element.ts | 71 +++++ packages/data-rpc-iframe/src/sub/sub-panel.ts | 11 + packages/data-rpc-iframe/src/sub/sub.ts | 37 +++ packages/data-rpc-iframe/src/ui/panel.css.ts | 47 +++ .../src/ui/rpc-panel-element.ts | 21 ++ packages/data-rpc-iframe/sub.html | 16 + packages/data-rpc-iframe/tsconfig.json | 17 ++ packages/data-rpc-iframe/vite.config.ts | 27 ++ packages/data-rpc/LICENSE | 21 ++ packages/data-rpc/README.md | 137 +++++++++ packages/data-rpc/package.json | 38 +++ .../data-rpc/src/consume/caller-context.ts | 39 +++ .../data-rpc/src/consume/make-generator.ts | 88 ++++++ packages/data-rpc/src/consume/make-observe.ts | 35 +++ packages/data-rpc/src/consume/make-promise.ts | 39 +++ packages/data-rpc/src/consume/make-void.ts | 21 ++ .../data-rpc/src/consume/reconstruct-error.ts | 15 + .../src/consume/synthesize-service.ts | 73 +++++ packages/data-rpc/src/create-endpoint.ts | 209 +++++++++++++ packages/data-rpc/src/endpoint.ts | 67 ++++ packages/data-rpc/src/host/host-context.ts | 27 ++ packages/data-rpc/src/host/marshal-error.ts | 17 ++ .../data-rpc/src/host/register-service.ts | 190 ++++++++++++ packages/data-rpc/src/id.ts | 12 + packages/data-rpc/src/index.ts | 9 + packages/data-rpc/src/nested.test.ts | 160 ++++++++++ packages/data-rpc/src/protocol.ts | 82 +++++ packages/data-rpc/src/rpc.test.ts | 288 ++++++++++++++++++ packages/data-rpc/src/transport.ts | 35 +++ .../src/transports/loopback-transport.test.ts | 48 +++ .../src/transports/loopback-transport.ts | 106 +++++++ .../transports/message-port-transport.test.ts | 63 ++++ .../src/transports/message-port-transport.ts | 63 ++++ .../src/transports/window-transport.test.ts | 52 ++++ .../src/transports/window-transport.ts | 76 +++++ packages/data-rpc/tsconfig.json | 14 + packages/data-rpc/vitest.workspace.ts | 20 ++ packages/data-solid/package.json | 2 +- packages/data-sync/package.json | 2 +- packages/data-testing/package.json | 2 +- packages/data/package.json | 2 +- .../service/async-data-service/create-lazy.ts | 33 +- .../service/async-data-service/member-kind.ts | 35 +++ .../src/service/async-data-service/public.ts | 1 + pnpm-lock.yaml | 47 +++ pnpm-workspace.yaml | 2 + 65 files changed, 2883 insertions(+), 43 deletions(-) create mode 100644 packages/data-rpc-iframe/README.md create mode 100644 packages/data-rpc-iframe/index.html create mode 100644 packages/data-rpc-iframe/package.json create mode 100644 packages/data-rpc-iframe/src/main/create-main-service.ts create mode 100644 packages/data-rpc-iframe/src/main/main-panel-element.ts create mode 100644 packages/data-rpc-iframe/src/main/main-panel.ts create mode 100644 packages/data-rpc-iframe/src/main/main.ts create mode 100644 packages/data-rpc-iframe/src/rpc-iframe.test.ts create mode 100644 packages/data-rpc-iframe/src/shared/handshake.ts create mode 100644 packages/data-rpc-iframe/src/shared/main-service.ts create mode 100644 packages/data-rpc-iframe/src/shared/sub-service.ts create mode 100644 packages/data-rpc-iframe/src/sub/create-sub-service.ts create mode 100644 packages/data-rpc-iframe/src/sub/sub-panel-element.ts create mode 100644 packages/data-rpc-iframe/src/sub/sub-panel.ts create mode 100644 packages/data-rpc-iframe/src/sub/sub.ts create mode 100644 packages/data-rpc-iframe/src/ui/panel.css.ts create mode 100644 packages/data-rpc-iframe/src/ui/rpc-panel-element.ts create mode 100644 packages/data-rpc-iframe/sub.html create mode 100644 packages/data-rpc-iframe/tsconfig.json create mode 100644 packages/data-rpc-iframe/vite.config.ts create mode 100644 packages/data-rpc/LICENSE create mode 100644 packages/data-rpc/README.md create mode 100644 packages/data-rpc/package.json create mode 100644 packages/data-rpc/src/consume/caller-context.ts create mode 100644 packages/data-rpc/src/consume/make-generator.ts create mode 100644 packages/data-rpc/src/consume/make-observe.ts create mode 100644 packages/data-rpc/src/consume/make-promise.ts create mode 100644 packages/data-rpc/src/consume/make-void.ts create mode 100644 packages/data-rpc/src/consume/reconstruct-error.ts create mode 100644 packages/data-rpc/src/consume/synthesize-service.ts create mode 100644 packages/data-rpc/src/create-endpoint.ts create mode 100644 packages/data-rpc/src/endpoint.ts create mode 100644 packages/data-rpc/src/host/host-context.ts create mode 100644 packages/data-rpc/src/host/marshal-error.ts create mode 100644 packages/data-rpc/src/host/register-service.ts create mode 100644 packages/data-rpc/src/id.ts create mode 100644 packages/data-rpc/src/index.ts create mode 100644 packages/data-rpc/src/nested.test.ts create mode 100644 packages/data-rpc/src/protocol.ts create mode 100644 packages/data-rpc/src/rpc.test.ts create mode 100644 packages/data-rpc/src/transport.ts create mode 100644 packages/data-rpc/src/transports/loopback-transport.test.ts create mode 100644 packages/data-rpc/src/transports/loopback-transport.ts create mode 100644 packages/data-rpc/src/transports/message-port-transport.test.ts create mode 100644 packages/data-rpc/src/transports/message-port-transport.ts create mode 100644 packages/data-rpc/src/transports/window-transport.test.ts create mode 100644 packages/data-rpc/src/transports/window-transport.ts create mode 100644 packages/data-rpc/tsconfig.json create mode 100644 packages/data-rpc/vitest.workspace.ts create mode 100644 packages/data/src/service/async-data-service/member-kind.ts diff --git a/package.json b/package.json index ca0e555a..92d197cb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "data-monorepo", - "version": "0.10.9", + "version": "0.10.10", "private": true, "engines": { "node": ">=24" diff --git a/packages/data-ai/.claude-plugin/plugin.json b/packages/data-ai/.claude-plugin/plugin.json index 6943da17..39a0d889 100644 --- a/packages/data-ai/.claude-plugin/plugin.json +++ b/packages/data-ai/.claude-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "adobe-data-ai", - "version": "0.10.9", + "version": "0.10.10", "description": "Architecture skills for @adobe/data — data-oriented modelling, archetype iteration, hot-path performance, and related conventions.", "author": { "name": "Adobe" diff --git a/packages/data-ai/package.json b/packages/data-ai/package.json index 5f45b3da..7ed659b0 100644 --- a/packages/data-ai/package.json +++ b/packages/data-ai/package.json @@ -1,6 +1,6 @@ { "name": "@adobe/data-ai", - "version": "0.10.9", + "version": "0.10.10", "description": "Cross-agent architecture skills for @adobe/data — installable as a Claude Code plugin or copied into any Agent-Skills-compatible agent (Cursor, Codex).", "type": "module", "private": false, diff --git a/packages/data-gpu/package.json b/packages/data-gpu/package.json index e637c416..987f3b4f 100644 --- a/packages/data-gpu/package.json +++ b/packages/data-gpu/package.json @@ -1,6 +1,6 @@ { "name": "@adobe/data-gpu", - "version": "0.10.9", + "version": "0.10.10", "description": "Adobe data WebGPU plugins and types for graphics and compute", "type": "module", "private": false, diff --git a/packages/data-lit/package.json b/packages/data-lit/package.json index f0c3f1cd..6573f805 100644 --- a/packages/data-lit/package.json +++ b/packages/data-lit/package.json @@ -1,6 +1,6 @@ { "name": "@adobe/data-lit", - "version": "0.10.9", + "version": "0.10.10", "description": "Adobe data Lit bindings - hooks, elements, decorators", "type": "module", "private": false, diff --git a/packages/data-persistence/package.json b/packages/data-persistence/package.json index 6d5d3bf1..5ac6b376 100644 --- a/packages/data-persistence/package.json +++ b/packages/data-persistence/package.json @@ -1,6 +1,6 @@ { "name": "@adobe/data-persistence", - "version": "0.10.9", + "version": "0.10.10", "description": "Worker-based incremental persistence layer for @adobe/data ECS over OPFS (browser) and node:fs (server).", "type": "module", "sideEffects": false, diff --git a/packages/data-react/package.json b/packages/data-react/package.json index d7f7a1a5..e4c6e9c8 100644 --- a/packages/data-react/package.json +++ b/packages/data-react/package.json @@ -1,6 +1,6 @@ { "name": "@adobe/data-react", - "version": "0.10.9", + "version": "0.10.10", "description": "Adobe data React bindings — hooks and context for ECS database", "type": "module", "private": false, diff --git a/packages/data-rpc-iframe/README.md b/packages/data-rpc-iframe/README.md new file mode 100644 index 00000000..1a7c911c --- /dev/null +++ b/packages/data-rpc-iframe/README.md @@ -0,0 +1,43 @@ +# data-rpc-iframe + +A runnable sample for [`@adobe/data-rpc`](../data-rpc): a **main frame** embeds a +real **iframe** (the sub frame), and the two exchange async data services over a +single `MessagePort` — **in both directions**. + +## Run it + +```bash +pnpm --filter data-rpc-iframe dev +``` + +Then open http://localhost:3011/. The left column is the main frame; the right +column is the sub frame (a genuine `