Repository navigation
Releases: AndersCan/ekrooh
Releases · AndersCan/ekrooh
Release list
v0.4.0
v0.4.0 — on-device p2p peer-drive verification
This release hardens and extends the on-device p2p verification and closes the framework side of issue #41 ("Android bare-kit worklet cannot replicate a peer's drive").
Added
- Peer-drive replication in the on-device p2p verify worklet (
core/p2p-verify.core.ts, issue #41): the worklet now replicates a drive across two real peers over the local DHT — a creator announces its drive and serves it; a reader joins the topic client-only, opens the drive by key,ready()s it (the call the Android photo app timed out on), and reads a photo. This is the platform-level reproduction gate for "Android cannot replicate a peer's drive". - Android emulator p2p verify (
examples/android-app): the reference app packs the worklet asp2p-verify.bundleand ships aP2PVerifyTestinstrumentation test + a newandroid-emulatorCI job. The Android gate runs inmode=self(self-reads — the "reverse direction" that always worked on Android); the full peer-drive replication gate runs on the macOS smoke (npm run smoke:p2p) and the iOS simulator.
Fixed (framework side of #41)
- Verified the framework's Android bare-kit stack handles peer-drive reads (full peer-drive
308mson an Android emulator), pointing the #41 timeout at the consumer's wiring rather than the runtime.
Notes
- The Android emulator CI job uses a self-read smoke because real DHT peer discovery is not a stable gate under the software-rendered x86_64 CI emulator; the full peer-drive gate runs on macOS smoke + iOS simulator.
v0.2.0
Added
- Backend → web push (
@ekrooh/bare/runtime):createLoopbackPush(server, protocol)+LoopbackServer.push(frame)— server-initiated dispatch to the connected web layer (live galleries, sync status). - Custom HTTP routes (
@ekrooh/bare/runtime):LoopbackServer.registerRoute(method, path, handler)runs before mount resolution, behind the auth gate;collectRequestBodyis re-exported for POST handlers. - Consumer plugins:
createWorkletRuntime({ plugins: [...] })registers consumer plugin manifests after the canonical defaults (no more post-hoc registry mutation).
Fixed
getIPC()in plain Node: no longer throws aReferenceErrorwhen neitherBareKitnorBareis defined — returnsundefined, socreateWorkletRuntimeruns host-less in tests/desktop contexts.- Dev mode with a storage dir (
auth: false):handoff.jsonis no longer written (previously a stale handoff appeared wheneverstoragewas set, even with auth off).
v0.1.0-beta.1
First tagged release of the @less/bare framework: the boring bootstrap for
cross-platform apps on the Bare runtime. (An earlier 0.0.1 changelog draft
was never tagged — this entry absorbs it.)
Added
- Binary wire protocol (
@less/bare/core): framed envelopes
(version,type,headerLen, JSON header, raw payload) with a canonical
MessageProtocolcodec, frame-size validation, and forward-compatible
headers. - Plugin kernel: namespaced plugin manifests,
DISPATCH/INVOKE_REQUEST
/INVOKE_RESPONSErouting, deterministicErrorCodes, host delegation. - Typed plugin authoring:
EventSpec+definePlugin— one spec per event
drives the manifest, the handler table, and the typedevents.tsbuilders. - Unified loopback server (
core/server/static-file-server.ts) serves the
web app at/(SPA fallback), mounted media, and the framed-protocol
WebSocket socket; byte-range (206) streaming, WS origin check, single-client
policy, idle timeout. - Cookie auth:
POST /loginexchanges the injectedwindow.__lessBareToken
for anHttpOnly; SameSite=Laxbare_sessioncookie;X-Bare-Token/?token=
remain as fallbacks for non-browser clients. - Port/token handoff: the worklet writes
handoff.jsoninto the host
sandbox dir; hosts read it and loadhttp://127.0.0.1:<port>/index.html. - Transports (
@less/bare/transports): WebSocket (same-origin default,
cookie bootstrap, reconnect with backoff, token fallback on rejected
upgrade) and a deterministic mock. - Android host (
io.less:bare-hoston GitHub Packages):BareProtocol,
HostIpcCoordinator,HostPluginRegistry; the Bare Kit runtime is packaged
inside the self-contained AAR. - iOS host: Swift package
BareHost(SPM, ships as source) — IPC
coordinator, plugin registry; the reference app injects the token via a
WKUserScriptand loads the loopback page. - Reference implementation:
examples/web(lit-html + nanostores),
examples/android-app,examples/ios-app. - Testing contract: vitest unit tests (with a coverage floor),
JUnit (Kotlin host), XCTest (Swift host), Playwright e2e against the mock
transport, and CI (test.yml,playwright.yml,release.yml). - WS connection state machine: the WebSocket transport models
idle/opening/connected/backoff/gaveUp as a mantaqActor(exponential
backoff, retry cap,?token=fallback) — internal-only, never leaks into
the public surface. - Multi-instance web test harness: a dev harness (
harness.core) hosting
N worklet instances behind a management server, with Playwright journeys
(one tab per instance) asserting per-instance isolation + lifecycle. - iOS reference parity: real
vendor.mediapicker/camera
(PHPickerViewController+UIImagePickerController; simulator answers a
deterministic "camera unavailable") and a generic permissions plugin
(permissions.request/permissions.status) with real
AVCaptureDevice.requestAccessfor camera. - iOS p2p addons: udx-native, rocksdb-native, sodium-native (+ hypercore's
quickbit/rabin/simdle and fs-native-extensions) linked via bare-link and
verified running on the iOS simulator (P2PVerifyTestboots a worklet that
exercises Corestore, Hyperdrive, and Hyperswarm).
Changed
- npm ships compiled JS:
@less/barepublishesdist/(compiled ESM +
type declarations viavp pack) — consumers never receive TypeScript source. - Permissions plugin contract:
permissions.requestStorageis replaced by
permissions.request(permission)/permissions.status(permission),
both returning{ permission, status }
(granted | denied | notDetermined | unsupported).
Fixed
- WS auth fallback: a WebSocket upgrade rejected despite a successful
/loginnow retries with?token=appended instead of retrying the same
URL five times and dead-ending. /loginbody decoding:Uint8Arraychunks (bare-http1) are decoded
byte-exact instead of beingString()-ified (which joined bytes with commas).- Single-client WS policy: the refused second socket is rejected before the
handshake — no misleading 101-then-close. - serveFile stream errors: an evicted file (spool LRU) no longer crashes
the whole worklet — pre-flush ENOENT yields a clean 404 and a mid-stream
error resets the response instead of surfacing an unhandled stream error.
Removed
- Android bootstrap bridge and iOS WKWebView bridge transports; the
BarePortMessenger,BareWebViewBridge, andBareAssetSchemeHandler
relays were deleted.