bb2d9c3e59
Generic polyfill layer that makes a single NextGraph broker behave like the not-yet-shipped multi-user NextGraph (emulated capabilities + inbox). Zero app domain. @ng-eventually/client exposes an SDK-identical surface (ng, useShape, inbox); the polyfill bootstrap (configure + capability helpers) is isolated under /polyfill, so the main entry stays a drop-in for @ng-org/web|orm. The real SDK is injected at configure() (no hard import → build-alias safe + testable). Scaffold: NextGraph wiring stubbed with TODO; capability helpers implemented and unit-tested (4 tests, typecheck clean). The global-index curator is deferred — in NextGraph apps/services are mono-user with no global data. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
33 lines
1.6 KiB
Markdown
33 lines
1.6 KiB
Markdown
# @ng-eventually/client
|
|
|
|
Two entry points — the data-plane is **SDK-identical**, the polyfill bootstrap is
|
|
separate:
|
|
|
|
| Import | Surface | At migration |
|
|
|---|---|---|
|
|
| `@ng-eventually/client` | **Same signature as the SDK** — `ng`, `useShape`, `inbox` (+ types). Drop-in for `@ng-org/web` / `@ng-org/orm`. | Resolves to the real SDK (build alias removed) — no code change. |
|
|
| `@ng-eventually/client/polyfill` | The **only non-SDK** surface — `configure`, `setCurrentUser`, capability helpers (`canRead`/`canWrite`/`defaultGrant`/`grantRead`). | Removed. |
|
|
|
|
```ts
|
|
// bootstrap (the only non-SDK call) — inject the REAL SDK
|
|
import { configure } from "@ng-eventually/client/polyfill";
|
|
configure({ ng: realNg, useShape: realUseShape, sharedWallet, currentUser });
|
|
|
|
// from here on, pure SDK surface:
|
|
import { ng, useShape, inbox } from "@ng-eventually/client";
|
|
await ng.doc_create(/* … */);
|
|
const set = useShape(MyShape, scope); // filtered to what the user may read
|
|
await inbox.post(targetInbox, ref); // deposit (anticipated SDK API)
|
|
```
|
|
|
|
What the polyfill adds on top of the real SDK (all removed/native at migration):
|
|
- **Shared-wallet login** (one wallet for everyone).
|
|
- **Capability enforcement** — read filter + write guard, on emulated grants
|
|
attached to documents.
|
|
- **Anticipated methods** (inbox `post`, capability ops) with their future-SDK
|
|
shapes, emulated for now.
|
|
|
|
Generic: **no application domain**. The consumer injects shapes and performs the
|
|
*acts* of granting access. The client **must not** contain the global-index
|
|
curator (a separate package, deferred — see the repo README).
|