Current section
19 Versions
Jump to
Current section
19 Versions
Compare versions
9
files changed
+50
additions
-16
deletions
| @@ -11,6 +11,26 @@ not in lockstep yet; entries note which surface they affect. | |
| 11 11 | |
| 12 12 | ## [Unreleased] |
| 13 13 | |
| 14 | + ## [0.10.0] — 2026-06-24 |
| 15 | + |
| 16 | + ### Fixed |
| 17 | + |
| 18 | + - **`@musubi/client` / `@musubi/react`** — Snapshotting a store whose node is |
| 19 | + absent from the index now returns `undefined` instead of a stub object cast to |
| 20 | + the fully-hydrated snapshot type. The stub typechecked as complete, so a |
| 21 | + consumer dereferencing a "guaranteed" field (`snap.artifact.id`) crashed at |
| 22 | + runtime — most visibly on a websocket reconnect (e.g. iOS Safari backgrounded |
| 23 | + then resumed) when a re-render hit the reset index. `StoreProxy.snapshot()` |
| 24 | + and `useMusubiSnapshot` now return `StoreSnapshot<M, R> | undefined`. |
| 25 | + **Breaking (types):** unguarded `.field` access on a snapshot is now a `tsc` |
| 26 | + error — guard with `if (!snap) …` (the same skeleton you render on cold mount). |
| 27 | + - **`@musubi/client`** — Version-mismatch recovery no longer empties the store |
| 28 | + index before re-mounting. It keeps serving the last-good (stale-but-complete) |
| 29 | + snapshot through the remount window and lets the remount's initial patch |
| 30 | + (whole-root `replace ""`) swap in fresh state atomically, closing the |
| 31 | + reconnect-window stub on the self-healing path. The terminal disconnect path |
| 32 | + still resets; the type guard above covers it. |
| 33 | + |
| 14 34 | ## [0.9.2] — 2026-06-23 |
| 15 35 | |
| 16 36 | ### Fixed |
| @@ -326,7 +346,8 @@ Initial public release of the Musubi runtime (then `Arbor`): | |
| 326 346 | - TypeScript client and React adapter that materialize the diff stream |
| 327 347 | into immutable snapshots. |
| 328 348 | |
| 329 | - [Unreleased]: https://github.com/fahchen/musubi/compare/v0.9.2...HEAD |
| 349 | + [Unreleased]: https://github.com/fahchen/musubi/compare/v0.10.0...HEAD |
| 350 | + [0.10.0]: https://github.com/fahchen/musubi/compare/v0.9.2...v0.10.0 |
| 330 351 | [0.9.2]: https://github.com/fahchen/musubi/compare/v0.9.1...v0.9.2 |
| 331 352 | [0.9.1]: https://github.com/fahchen/musubi/compare/v0.9.0...v0.9.1 |
| 332 353 | [0.9.0]: https://github.com/fahchen/musubi/compare/v0.8.0...v0.9.0 |
| @@ -34,7 +34,7 @@ Add Musubi to your Phoenix application: | |
| 34 34 | ```elixir |
| 35 35 | def deps do |
| 36 36 | [ |
| 37 | - {:musubi, "~> 0.9.2"} |
| 37 | + {:musubi, "~> 0.10.0"} |
| 38 38 | ] |
| 39 39 | end |
| 40 40 | ``` |
| @@ -10,7 +10,7 @@ In the Phoenix app: | |
| 10 10 | ```elixir |
| 11 11 | def deps do |
| 12 12 | [ |
| 13 | - {:musubi, "~> 0.9.2"} |
| 13 | + {:musubi, "~> 0.10.0"} |
| 14 14 | ] |
| 15 15 | end |
| 16 16 | ``` |
| @@ -1,6 +1,6 @@ | |
| 1 1 | {<<"links">>,[{<<"GitHub">>,<<"https://github.com/fahchen/musubi">>}]}. |
| 2 2 | {<<"name">>,<<"musubi">>}. |
| 3 | - {<<"version">>,<<"0.9.2">>}. |
| 3 | + {<<"version">>,<<"0.10.0">>}. |
| 4 4 | {<<"description">>, |
| 5 5 | <<"Server-authoritative, page-scoped runtime library for Elixir/Phoenix applications.">>}. |
| 6 6 | {<<"elixir">>,<<"~> 1.18">>}. |
| @@ -1,7 +1,7 @@ | |
| 1 1 | defmodule Musubi.MixProject do |
| 2 2 | use Mix.Project |
| 3 3 | |
| 4 | - @version "0.9.2" |
| 4 | + @version "0.10.0" |
| 5 5 | @source_url "https://github.com/fahchen/musubi" |
| 6 6 | |
| 7 7 | def project do |
Loading more files…