Skip to content

Scribe v2.2.0 - The Server Store

Choose a tag to compare

@ericplane ericplane released this 01 Sep 21:54
· 6 commits to main since this release

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.Transaction is 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.Wave on both realms, replicated as ordinary diffs, never saved.
  • Budget-paced legacy imports: ImportLegacyData and OnPlayerInit get a context with AwaitBudget(requestType, count?), which yields until the DataStore requests are spare. MigrationConcurrency bounds concurrent imports.
  • Per-player prices on the client: Data.GetPrice("VIP") is what this player pays after Roblox Plus and regional pricing, with GetProductInfo, ObserveProductInfo and PrefetchProductInfo. A failed read stays nil.
  • 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 optional Release for custom transports.
  • Budget metrics: waiters, queued, granted, timed out and wait time.

Fixed

  • Scribe.Big inside a container element no longer pushes the template past the type solver's budget.
  • NaN, infinity and a gap in the Args list are refused as command arguments; the same gap in Scribe.Derived inputs is refused too.
  • Owns, OwnsAsync and ObserveOwned raise a named error on a non-string key instead of quietly answering false in production.

Documentation

  • New guide: The Server Store.

Full Changelog: v2.1.1...v2.2.0