Repository navigation
v2.16.0
Full Changelog: 2.15.0...2.16.0
What's Changed
Introducing LiveObjects Path-based API
This release introduces a redesigned LiveObjects API centered around path-based operations. The new PathObject abstraction provides a more intuitive interaction model where operations resolve at runtime against the current value at a path, rather than being bound to specific object instances.
With this release, the ably-js LiveObjects API is no longer marked as @experimental and is in Public Preview.
Key improvements:
- Resilient subscriptions: Subscribe to paths rather than object instances, so subscriptions automatically follow whatever object exists at that location even when it's replaced.
- Deep subscriptions: Observe changes at any depth below a path with configurable depth control.
- Operation context: Subscription callbacks now receive the complete
ObjectMessagethat triggered the change, including information about the publishing client and operation details. - Simplified object creation: Create deeply nested structures in a single operation using
LiveMap.create()andLiveCounter.create()static methods, eliminating the risk of orphaned objects. - Compact representations: New
.compact()and.compactJson()methods for converting LiveObjects to plain JavaScript objects.
This release contains breaking changes to the LiveObjects API. See the LiveObjects migration guide for detailed instructions on updating your code.
Breaking changes:
- The LiveObjects plugin import path changed from
'ably/objects'to'ably/liveobjects' - The plugin is now a named export:
import { LiveObjects } from 'ably/liveobjects' - The API entrypoint changed from
channel.objectstochannel.object channel.objects.getRoot()replaced bychannel.object.get(), which returns aPathObjectchannel.objects.createMap()andchannel.objects.createCounter()replaced by staticLiveMap.create()andLiveCounter.create()methods- Subscription callback signature changed to receive
{ object, message }context - LiveObject lifecycle event methods (
.on(),.off(),.offAll()) removed; deleted events now surface via regular subscriptions LiveObject.unsubscribeAll()removed; use individualSubscription.unsubscribe()insteadRealtimeObject.offAll()removed; use individualStatusSubscription.off()orRealtimeObject.off(event, callback)insteadchannel.objects.batch()moved toPathObject.batch()/Instance.batch()- For TypeScript users: all LiveObjects types moved from
'ably'to'ably/liveobjects'; globalAblyObjectsTypesinterface removed in favor of type parameters onchannel.object.get<T>(); several types renamed, removed, or redesigned