Scribe v2.2.0 - The Server Store
A server-owned store, budget-paced legacy imports, per-player prices on the client, and the Scribe.Big type-solver wall fixed. Read the behaviour changes first.
Behaviour changes
- Assigning to an accessor (
data.Coins = 5) is now a type error. It never worked: it overwrote the accessor.data.Coins.Set(5)and every method are unchanged. - A server store write inside
Data.Transactionis refused and aborts it, since a rollback cannot reach the store.
Added
ServerStore: a second tree owned by the server, not a player.Data.ServerStore.Waveon both realms, replicated as ordinary diffs, never saved.- Budget-paced legacy imports:
ImportLegacyDataandOnPlayerInitget a context withAwaitBudget(requestType, count?), which yields until the DataStore requests are spare.MigrationConcurrencybounds concurrent imports. - Per-player prices on the client:
Data.GetPrice("VIP")is what this player pays after Roblox Plus and regional pricing, withGetProductInfo,ObserveProductInfoandPrefetchProductInfo. A failed read staysnil. - UI adapters for Vide, React and Fusion in
adapters/ - Kick messages name the cause: throttled load, failed migration, schema rejection, import failure, version-ahead and session steal each have their own wording and option.
Data.Stop()on the client, plus an optionalReleasefor custom transports.- Budget metrics: waiters, queued, granted, timed out and wait time.
Fixed
Scribe.Biginside a container element no longer pushes the template past the type solver's budget.- NaN, infinity and a gap in the
Argslist are refused as command arguments; the same gap inScribe.Derivedinputs is refused too. Owns,OwnsAsyncandObserveOwnedraise a named error on a non-string key instead of quietly answeringfalsein production.
Documentation
- New guide: The Server Store.
Full Changelog: v2.1.1...v2.2.0