Limitations & non-goals
Read this before you build something that assumes a capability BridgeKit doesn’t have yet. The line between built, deferred, and out of scope matters.
Built today
Section titled “Built today”Production-validated, bidirectional, and cross-platform — exercised on a real device on both Android (Kotlin) and iOS (Swift):
- The Kotlin runtime — registry, router, epoch manager, park buffer, state store, ServiceLoader discovery.
- The Swift runtime —
Router,StateStore,StreamHub,OutboundCaller, the Nitro C++/Swift seam, andBridgeKitRuntime.default. At parity with Android, runtime-validated with UI parity in a live iOS demo. - The TypeScript runtime — registry, dispatcher, typed proxies, state mirrors, React hooks, marker contract hooks.
- The code generator for both targets —
axion bridgekit generate --platform kotlinand--platform swift, both schema (t.*) and marker authoring styles, with hash parity,bridgekit.lock, drift--check, and--into. - All four markers in both directions: Async / Void / Stream / State, native→JS and JS→native, including JS→native state push.
- Local-first resolution for pure-JS providers.
- The generic Nitro transport (the single Nitrogen-built component) on both platforms.
- The shared host contract (
axion.host, owned by@axion/core) and feature-owned contracts (e.g.connect.host) — both in use after the Connect migration. See the host contract and migrating Connect.
Still deferred
Section titled “Still deferred”Part of the design and the API is shaped to accommodate them, but not built today:
| Area | Status |
|---|---|
| Web transport | Deferred. LoopbackTransport runs pure-JS providers in-process (web / test / standalone), but there is no formal web bridge yet. Local-first resolution already enables a pure-JS web target without a native side; a real transport is the remaining work. |
| Native binary payloads | t.binary() exists in the TS DSL with a base64 codec, but a native binary round-trip is not validated end-to-end (Android has no binary-specific codec; the wire protocol carries no blobs). Treat it as a JS-level, experimental capability. |
| Gradle-plugin discovery | Discovery is ServiceLoader-based on Android and explicit registration at app init on iOS; a Gradle plugin remains a non-goal. |
In use, not planned
Section titled “In use, not planned”These shipped during the Connect / Lidl Plus migration and are no longer roadmap items:
- Shared + feature-owned host contracts.
axion.hostis the shared, globally-provided host contract;connect.hostis feature-owned and provided atScope.Feature("Lidl.Plus.Connect"). The duplication problem the design called out is addressed by this split, in production. - Migration coexistence. A feature can move actions onto a BridgeKit contract incrementally
while leaving the rest on
FeatureActions— Connect runs exactly this way (17 actions onconnect.host, two onaxion.host, five intentionally still onFeatureActions).
Explicit non-goals
Section titled “Explicit non-goals”Stated outright in the design and still true:
- A web transport today (see above) and native binary payloads (
t.binary()is JS-level / experimental, not a validated native round-trip). - Full version negotiation — replaced by hash diffing + the additive-only rule.
- Multi-React-instance beyond instance scoping.
Hard transport limits
Section titled “Hard transport limits”These are properties of the wire format, shared by both platforms — not roadmap items:
- No binary payloads in AnyMap (no blobs /
ArrayBuffer; a top-levelArrayBufferparam is a possible future extension).AnyMapis map-only — scalars and arrays cross wrapped as{ v: <value> }. - No nested functions in payloads.
- No sync path native→JS —
onInvokeis Promise-returning.querySyncis native-provided only; JS cannot be called synchronously from native, and the provider side must be an in-memory lookup (dev asserts< 2ms). - Stream backpressure is
DROP_OLDEST, capacity 64 — the oldest element is silently dropped and counted instreamDrops. - Readiness timeout is 5000 ms; the re-provide grace window is 1500 ms — both hardcoded.
Correctness notes worth knowing
Section titled “Correctness notes worth knowing”A few state/epoch edge cases to keep in mind:
- A state observer may not receive the current value on subscription in every path —
prefer the snapshot-on-connect hydration and
useBridgeState’sstatusfield.