4.12.1 C++ Specific Changes
Fixed: In the newConfig
-based Ditto
initializer, removed an errant call to dittoffi_ditto_set_cloud_sync_enabled()
which could have resulted in improper initialization (#SDKS-1524)4.12.1 Common Changes
Fixed: A bug where x509 refresh could speed up uncontrollably. (#17947) Fixed: A bug where a peer could get stuck with incorrect connection information. (#17967) Added:ENABLE_ATTACHMENT_PERMISSION_CHECKS
ALTER SYSTEM parameter to be set to false
to avoid certain rare cases of attachment fetcher hanging (#18016) Fixed: Network connections close gracefully when Ditto is stopped. (#18053) Fixed: The system:data_sync_info
collection may briefly report sync immediately after connecting (#18137)Other: improve error reporting for document (de)serialization (#18165) Fixed: Live queries being unable to use indices. (#DS-447) Fixed: Use of DISTINCT with ORDER BY & OFFSET/LIMIT. (#QE-281)4.12 - DQL Enhancements & Platform Expansion
Version 4.12 brings significant enhancements to DQL (Ditto Query Language) with production-ready projections and aggregates, expanded platform support with Flutter for Linux and macOS, and marks the deprecation of legacy query builder APIs in preparation for DQL as the primary interface.DQL Projections & Aggregates
DQL projections and aggregates are now out of preview and fully production-ready. These powerful features enable sophisticated data analysis and optimized query performance directly within DQL.Projections
Select specific fields and create calculated columns to reduce data transfer and processing:DQL
Aggregate Functions
Perform calculations across multiple documents with SQL-standard aggregate functions:DQL
For complete documentation, see DQL SELECT operations
DQL Index Management
Create and manage indexes directly through DQL for improved query performance:DQL
For complete documentation, see DQL Indexing
Flutter Platform Expansion
Linux Support
Flutter developers can now build and deploy Ditto-powered applications on Linux desktops:- Native Linux binary (
libdittoffi.so
) included - Full support for development, testing, and production deployments
- Configurable binary path via
$LIBDITTOFFI_PATH
environment variable - Compatible with Flutter’s standard Linux development workflow
See Flutter Install Guide for Linux setup instructions
Legacy Query Builder Deprecation
The entire legacy query builder API is deprecated across all SDKs. Developers should migrate to DQL for all data operations:Migration Benefits:- SQL-like syntax familiar to developers
- Unified interface for all data operations
- Better performance and optimization
- More powerful query capabilities
Legacy query builder APIs will be removed in SDK v5. Start migrating to DQL now using the migration guide.
Additional Enhancements
System Improvements
- Enhanced disk observer: Now enabled at startup with configurable batch settings
- Improved error handling: Better error propagation and syntax error identification in DQL
- Memory optimizations: Reduced memory usage for aggregate operations and projections
DQL Function Additions
- Duration scalar functions for date/time calculations
- Dynamic field references in queries
- Support for arrays as operation values
- Extended multiplication operations for better numeric handling
Security & Diagnostics
- Support for
SSLKEYLOGFILE
for debugging TLS connections - New
system::data_sync_info
virtual collection for sync diagnostics - Transport diagnostics APIs across multiple SDKs
Upgrading to 4.12
To take advantage of these new features:- Update your SDK to version 4.12.0 or later
- Begin migrating legacy query builder code to DQL
- Explore projections and aggregates for query optimization
- Consider Flutter Linux support for desktop deployments
Version 4.12 maintains full backward compatibility while encouraging migration to modern DQL APIs. Legacy APIs continue to function but should be replaced in preparation for SDK v5.
4.12.0 Common Changelog
Added
- The
transports_discovered_peers
system parameter to dynamically update peers discovered out-of-band (#17009) - The new
system::indexes
virtual collection for viewing DQL indexes on small peers (#17011) - Support for
SSLKEYLOGFILE
for inspecting network traffic in tools like Wireshark (#17029) UPDATE_LOCAL_DIFF
id conflict strategy for INSERT statements (#17310)- A system:data_sync_info virtual collection that exposes per-remote data sync status via DQL (#17360)
transports_tcp_so_nodelay
system parameter to control TCP_NODELAY for TCP and TCP-based websockets connections (#17673)- Additional metadata to keep track of the timestamp of the last update file received (#DS-290)
- Observers for DQL queries can now access system virtual collections (#DS-294)
- Query executor runner to observers - they now support all of the new DQL features like projections, aggregates, use ids… (#QE-143)
- SYSTEM:COLLECTIONS & SYSTEM:ALL_COLLECTIONS virtual collections to list accessible collections (#QE-146)
- Support for ARRAYs as the value options list in IN DQL expressions (#QE-167)
- DQL scalar functions for durations (#QE-170)
- DQL support for CREATE INDEX (#QE-182)
- DQL support for DROP INDEX (#QE-183)
- Support for dynamic field references in DQL statements (#QE-2)
- Query request history cache qualifiers for system datasource deletes and general mutations (#QE-207)
- Basic RBO for index scan selection (#QE-210)
- Query parser handles context dependent keyword (#QE-241)
- Virtual collections for active and historical DQL engine requests (#QE-82)
Changed
- device_disk_observer_is_enabled system parameter can now be changed at runtime (#CORE-612)
- After eviction, document sync now retains high-level session metadata for non-expired sessions, for sync status tracking purposes (#DS-348)
- Projection, distinct and aggregate features out of preview mode! (#QE-100)
- Wildcard expansion to top-level with left-to-right, last-wins projection aliasing (#QE-156)
- Improved ScalarExpr representation in EXPLAIN output (#QE-193)
- Improved syntax error identification in UPDATE statements (#QE-199)
- ALTER SYSTEM DQL statements now accept static expressions (#QE-204)
- USE IDS clause to accept expressions that can be statically evaluated (#QE-217)
- Permit use of unary plus in DQL expressions (#QE-220)
- Extended DQL multiplication to better handle multiplying two large negative integers (#QE-224)
- Query directives processing to accept USE INDEX as the equivalent of USE DIRECTIVES
{"#index":...}
(#QE-255) - CREATE & DROP INDEX statements accept IF [NOT] EXISTS to permit repeated execution without error (#QE-259)
- Websocket connectivity errors are now logged with additional detail (#TRAN-511)
- Ditto no longer includes a peer’s device name and OS during P2P advertisement (BLE, mDNS, Wi-Fi Aware, AWDL) (#TRAN-652)
Fixed
- A rare race condition which caused connection handshakes to erroneously fail (#17251)
- Merge tombstone summaries when applying remote tombstone (#17654)
- Set default TCP_NODELAY socket option to true to improve latency, notably on Linux (#17673)
- DQL collation order is based on length of arrays / objects, not padding values with extra MISSING (#QE-171)
- DQL scalar function clock() and “local” timezone in WASM environments (#QE-181)
- Error propagation from collection scans (#QE-191)
- Collation in DQL aggregates (#QE-216)
- Panic when using COUNT(*) in a dynamic object (#QE-219)
- Panic when subtracting a large positive integer value from a large negative integer value (#QE-223)
- Aggregate output on empty result sets (#QE-242)
Performance
- Revised fetching documents by ID in Query to operate in batches (#QE-248)
Other
- Added a warning to the log when a subscription query uses a LIMIT or ORDER BY (#QE-169)
4.12.0 C++ Specific Changes
Fixed: Improved thread-safety of cleanup ofAttachmentFetcher
, AuthenticationStatusObserver
, Subscription
, and LiveQuery
instances (#SDKS-1122) Added: Store::get_observers()
to get a copy of the collection of active observers. (#SDKS-1123) Fixed: Improved thread-safety of modifications to the Store::observers
collection. (#SDKS-1123) Deprecated: Public Store::observers
data member access. Use Store::get_observers()
instead. (#SDKS-1123) Deprecated: Store::Store() constructor. Use
Ditto::get_store()to get access to a
Store` instance. (#SDKS-1123) Added: Ditto::Config.android_context
Added: Ditto::Config::set_android_context
Changed: On Android, a new required android_context
parameter must be passed to the Ditto
constructor. Deprecated: Ditto::set_android_context
Added: read-only method get_commit_id()
to class ditto::QueryResult
. (#SDKS-1340) Deprecated: The Ditto::operator=(Ditto&&)
move-assignment operator. Create a new Ditto
instance instead. (#SDKS-1303) Fixed: The Ditto::operator(Ditto&&)
move assignment operator now correctly copies the state of the original instance (#SDKS-1303) Deprecated: optional Identity::OfflinePlayground()
site_id
parameter. Use peer_key
instead to uniquely identify a device. (#SDKS-695) Deprecated: OfflinePlaygroundIdentity::site_id
data member. Use peer_key
instead to uniquely identify a device. (#SDKS-695) Deprecated: optional Identity::SharedKey()
site_id
parameter. Use peer_key
instead to uniquely identify a device. (#SDKS-695) Deprecated: SharedKeyIdentity::site_id
data member. Use peer_key
instead to uniquely identify a device. (#SDKS-695) Deprecated: ditto::Collection
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::CollectionsEvent
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::CollectionsEventHandler
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::CollectionsEventWithNextSignalHandler
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::CollectionsEventCallback
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::CollectionsEventWithNextSignalCallback
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::Counter
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::Document
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::DocumentIdHasher
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::DocumentIdPath
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::DocumentPath
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::LiveQuery
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::LiveQueryEvent
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::LiveQueryEventCallback
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::LiveQueryEventHandler
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::LiveQueryEventWithNextSignalCallback
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::LiveQueryEventWithNextSignalEventHandler
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::LiveQueryMove
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::MutableCounter
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::MutableDocument
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::MutableDocumentPath
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::MutableRegister
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::OrderBy
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::PendingCollectionsOperation
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::PendingCursorOperation
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::PendingIDSpecificOperation
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::Register
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::ScopedWriteTransaction
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::SingleDocumentLiveQueryEvent
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::SingleDocumentLiveQueryEventCallback
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::SingleDocumentLiveQueryEventHandler
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::SingleDocumentLiveQueryEventWithNextSignalCallback
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::SingleDocumentLiveQueryWithNextSignalEventHandler
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::SmallPeerInfo::sync_scope()
and set_sync_scope()
methods. Will be removed in v5. (#SDKS-906) Deprecated: ditto::SmallPeerInfo
. Will be removed in v5. (#SDKS-906) Deprecated: ditto::SortDirection
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::Store::collection()
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::Store::collections()
. Use DQL “SELECT * from system:collections” instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::Store::write()
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::Subscription
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::SyncScope
. Will be removed in v5. (#SDKS-906) Deprecated: ditto::UpdateResult
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::UpdateResultIncremented
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::UpdateResultSet
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::UpdateResultRemoved
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteStrategy
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransaction
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransactionResult
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransactionResultInserted
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransactionResultRemoved
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransactionResultEvicted
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransactionResultUpdated
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransactionPendingCursorOperation
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Deprecated: ditto::WriteTransactionPendingIDSpecificOperation
. Use DQL (Ditto Query Language) instead. For more information see: https://ditto.com/link/dql-legacy-to-dql-adoption. (#SDKS-906) Added: ditto::Config
- a unified configuration object that encapsulates all initialization parameters for Ditto. Required by the new Ditto::open()
and Ditto::open_async()
factory methods. (#SDKS-960) Added: Ditto::open_async()
- an async, fallible factory method for creating Ditto instances, alongside the synchronous convenience variant Ditto::open()
. (#SDKS-960) Added: Ditto::get_config()
- access a copy of the configuration used during initialization of a Ditto
instance. Added: ditto::Authenticator::set_expiration_handler()
(#SDKS-960) Added: ditto::Authenticator::get_expiration_handler()
(#SDKS-960) Added: ditto::Authenticator::get_development_provider()
(#SDKS-960) Added: Ditto::get_absolute_persistence_directory()
- a read-only property that returns the absolute file path to the persistence directory. (#SDKS-960) Added: Ditto::default_root_directory()
- returns the platform-specific default directory where Ditto will store data if no persistence directory is specified in the configuration (#SDKS-960)4.11.4 Common Changes
Fixed: A bug where x509 refresh could speed up uncontrollably. (#17947) Fixed: A bug where a peer could get stuck with incorrect connection information. (#17967)4.11.3 Common Changes
Fixed: An issue with BLE on some Android 9 and earlier devices that prevented connection establishment. (#17760)4.11.2 Common Changes
Fixed: A rare race condition which caused connection handshakes to erroneously fail. (#17251) Changed: device_disk_observer_is_enabled system parameter can now be changed at runtime (#CORE-612)4.11 - DQL & Legacy Compatibility
With 4.11 we are excited to introduce legacy compatibility for DQL, which allows developers to use the new DQL APIs while maintaining compatibility with existing code and data. This capability, called STRICT MODE, is designed to ease the transition to the new APIs and ensure that existing applications continue to function as expected.DQL Strict Mode
DQL Strict Mode provides control over how DQL statements are evaluated and how data types are inferred. When disabled, it offers more flexibility in working with documents without requiring explicit collection definitions.For more information see
DQL Strict Mode
DQL_STRICT_MODE=false
), Ditto is more flexible and will infer the CRDT type based on the document’s shape:- Objects are treated as CRDT maps
- Scalars and arrays are treated as Registers
- Counters and attachments are inferred from operations
- Collection definitions are no longer required
DQL
DQL Differ
DQL 4.11 introduces a newDiffer
API for calculating diffs between query results.
This API can be used with a store observer to understand how its results change
over successive callbacks. The Differ
API provides a way to track changes in
the data and can be used to optimize data synchronization and conflict resolution.Differ API documentation.DQL Transactions
DQL 4.11 introduces support for transactions. Transactions can be used to group multiple DQL statements together, ensuring that either all of the statements are executed successfully or none of them are. This is particularly useful in scenarios where multiple updates or inserts need to be made to the database, and you want to ensure that either all of them are applied or none of them are.Transactions API documentation.Advanced DQL Features
DQL 4.11 introduces numerous advanced querying and manipulation features:Feature | Description | Example |
---|---|---|
UNSET clause | Remove fields from documents | UPDATE orders UNSET items.abc WHERE _id = 'my-id' |
CAST function | Explicitly convert between data types | SELECT * FROM products WHERE CAST(price AS INT) > 10 |
USE IDS clause | Direct document retrieval by ID | SELECT * FROM products USE IDS '123', '456' |
SIMILAR TO | Pattern matching expressions | SELECT * FROM products WHERE name SIMILAR TO '%phone%' |
Runtime expressions | Use expressions in object/array construction | UPDATE products SET metadata = { 'updated_at': current_timestamp() } |
Counters | Support for legacy compatible counter type | UPDATE products APPLY in_stock PN_INCREMENT BY 1.0 |
In 4.11, functional operations are denoted with an arrow (
->
) are deprecated. Read more.Tombstone Reaper
The tombstone reaper is now enabled by default for all SDKs. This feature helps clean up deleted document markers (tombstones) to improve database performance and reduce storage requirements.The reaper:- Automatically removes tombstones after a configurable time-to-live (TTL)
- Uses read transactions for efficiency
- Includes random scheduling variations to prevent performance problems
- Tracks the number of tombstones evicted for monitoring
- Remembers previous reap times across restarts
DELETE
to remove documents.4.11.0 Common Changelog
Added
- Introduced
DQL_STRICT_MODE
as a system parameter to opt-out of requiring collection definitions (#16573) - Added transports_ble_adapter_mac system parameter to allow configuring bluetooth adapter MAC address (#16159)
- Small peers now log the result of OnlinePlayground authentication, including if the supplied shared token was incorrect (#16301)
- A cumulative running total of the number of tombstones ever evicted by the reaper to Small Peer Info (#16424)
- Added system parameters to fine-tune Ditto behavior when it encounters a locked persistence directory (#CORE-479)
- New DQL CAST function to explicitly cast between types (#QE-108)
- Conditional functions for unknowns (#QE-111)
- DQL DATE processing functions (#QE-112)
- New DQL clause USE IDS for direct document retrieval by id (#QE-114)
- Additional string functions (#QE-124)
- SIMILAR TO filter expression (#QE-125)
- PN_COUNTER support (APPLY clause in UPDATE statement) (#QE-127)
- UNSET clause to the UPDATE statement (#QE-128)
- MERGE as an alias for UPDATE in the ON ID CONFLICT clause of an INSERT statement (#QE-132)
- The ability to use runtime-evaluated expressions in object constructs in DQL statements (#QE-133)
- The ability to use runtime-evaluated expressions in array constructs in DQL statements (#QE-134)
- Static expressions in mutators (#QE-139)
- Additional object manipulation DQL scalar functions (#QE-159)
- EXPLAIN for query plan (#QE-105)
- More detailed messages about network problems are logged when authentication fails (#SEC-124)
Changed
- Use the modern rustls-platform-verifier TLS crate on all platforms rather than rustls-native-certs (#15956)
- The tombstone reaper scheduling to remember the previous reap times across shutdown and restart of the small peer (#16237)
- The tombstone reaper scheduling code to add random variations, which helps prevent performance problems if/when all peers run the reaper simultaneously (#16286)
- The tombstone reaper to be enabled by default for all SDKs (#16350)
- INSERT to now accept either DOCUMENTS or VALUES as the keyword introducing the list of values to insert (#QE-140)
- Date functions accept “local” as a timezone & use the executing peer’s local timezone (#QE-168)
- Unified dedicated TCP servers across different transports (Multicast, mDNS, and WiFi Aware) by utilizing a single static TCP server implementation (#TRANS-131)
Fixed
- Fixed issue where user_collection_sync_scopes could not be updated after initial set (#16299)
- Fixed: A rare crash on Android devices when shutting down Bluetooth. (#17069)
- Fixed: Bluetooth connectivity on Apple devices works when background Bluetooth permissions are missing. (#17065)
Removed
- Old multihop networking stack and system parameter
network_use_nextgen_multihop_stack
(#16370) - TLS certificate compression, which led to incompatibilities (#SDKS-1046)
Performance
- The tombstone reaper uses read transactions for some of its work instead of holding open a long-running write transaction, thus reducing contention on the small peer database (#16338)
- Improved speed and efficiency of the tombstone reaping process (#16535)
4.11.0 C++ Specific Changes
Added: Methodtransaction()
on DittoStore
allowing a DQL transaction to be performed (#13343) Added: Transaction
representing an active DQL transaction. (#13343) Added: TransactionCompletionAction
represents an action to be taken upon the completion of a transaction: commit or rollback (#13343) Added: TransactionInfo
encapsulates information about a transaction (#13343) Added: TransactionOptions
for configuring options on a transaction (#13343) Added: TransactionReadOnlyError
exception thrown if a mutating DQL query is attempted in a read-only transaction. (#13343) Added: An opt-in Android foreground service which allows Ditto to sync in the background. (#16097) Added: login()
method to ditto::Authenticator
that provides access to authentication feedback on the returned clientInfo JSON value (#SDKS-874) Deprecated: Method login_with_token()
for ditto::Authenticator
. Use login()
instead. (#SDKS-874) Added: class Differ
, which calculates diffs between query results. This can be used with a store observer to understand how its results change over successive callbacks. (#SDKS-985) Added: struct Diff
to represent diffs produced by the Differ
. (#SDKS-985) Changed: Unify dedicated TCP servers across different transports (Multicast, mDNS, and WiFi Aware) by utilizing a single static TCP server implementation (#TRANS-131)4.10.5 C++ Specific Changes
Fixed: A rare crash on Android devices when shutting down Bluetooth. (#17069) Fixed: hard crash on Android 10 Bluetooth (#17073) Fixed:stopSync
does not properly terminate WiFi Aware connections (#17235) Fixed: Bluetooth connectivity on Apple devices works when background Bluetooth permissions are missing. (#17065)4.10.5 Common Changes
No Specific Changes4.10.2 Common Changes
Removed: zlib certificate compression for small peer TLS 1.3 session negotiation, which caused incompatibilities (#1005)4.10.1 Common Changes
Changed: The tombstone reaper scheduling to remember the previous reap times across shutdown and restart of the small peer. (#16237) Changed: the tombstone reaper scheduling code to add random variations, which helps prevent performance problems if/when all peers run the reaper simultaneously. (#16286) Fixed: Unable to update user_collection_sync_scopes after initial set bug (#16299)Performance: The tombstone reaper uses read transactions for some of its work instead of holding open a long-running write transaction, thus reducing contention on the small peer database. (#16338) Changed: The tombstone reaper to be enabled by default for all SDKs. (#16350)4.10.0 New Capabilities
4.10.0 C++ Specific Changelog
Ditto::get_sync()
to replaceDitto::sync()
. The new name is consistent with similar member names of the Ditto class. (#15119)- An optional custom authentication URL parameter to the OnlinePlayground identity. (#SDK-359)
ditto::Sync::get_subscriptions()
which provides a safe way to get the set of active subscriptions (#SDKS-677)- Repeated reads of a document within an ID-specific transaction scope of the query builder API now reflect changes made in the same transaction. (SDKS-245)
- C++ SDK on Android would throw exceptions from
start_sync()
if some APIs were used beforehand. (#SDKS-556) - Improve thread-safety of
ditto::Sync::register_subscription()
and of subscription cancellation (#SDKS-680) - The public
ditto::Sync::subscriptions
data member is not safe for client code to use. Useget_subscriptions()
instead. (#SDKS-677) Ditto::sync()
is deprecated. UseDitto::get_sync()
instead. (#15119)
4.9.4 C++ Specific Changes
Fixed: C++ SDK on Android would throw exceptions fromstart_sync()
if some APIs were used beforehand. (#SDKS-556)4.9.4 Common Changes
Added: new system parameter which defines the number of threads used by the store observer runtime to dispatch the sdk callback invocations. For more information reach out to Ditto’s Support (#15814)4.9.3 C++ Specific Changes
Fixed: starting an HTTP server will no longer fail because of invalid transport config values. (#15553) Fixed: Fixed: starting an HTTP server will now default to using port 80, as the docs suggest, when previously it would incorrectly default to port 8080. (#15553)4.9.3 Common Changes
Changed: Added more actionable information to common connection handshake issues. (#15298) Fixed: Fixed: Some Android devices could fail to export logs to the portal due to a file permissions error (#15582)No C++ Specific Changes
4.9.1 Common Changes
Fixed: iOS 18 crashes related to Bluetooth LE are now resolved. (#15351) Fixed: Disk usage stats are now reported in small peer info on android devices4.9.0 C++ Specific Changes
Added: PendingIDSpecificOperation::update_v2() which passes nullptr to the lambda if the document is not found (#14471) Added: WriteTransactionPendingIDSpecificOperation::update_v2() which passes nullptr to the lambda if the document is not found. (#14471) Changed: libditto.a is now compiled with the fPIC compiler option, to generate position-independent code (#14911) Fixed: The static Ditto::get_sdk_version() function will now return a correct result if called before the Ditto constructor. (#15072) Deprecated: PendingIDSpecificOperation::update(), whose behavior did not match the documentation. Replaced with update_v2(). (#14471) Deprecated: WriteTransactionPendingIDSpecificOperation::update(), whose behavior did not match the documentation. Replaced with update_v2(). (#14471) Removed: An incorrect error log about loading the ditto core library on Android. (#14908)4.9.0 Logging Clarity Improvements
This release comes with a number of logging clarity improvements. The goal of these changes are to make Ditto logs more consumable and actionable for end users. While there are wide ranging changes one of the principal goals of this work is to make our INFO level logs contain the right information to understand the state and health of the Ditto SDK.- More information is included when physical connections start and end (such as the type of connection and the remote peer’s key)
- Devices that try to connect to themselves now say “device has connected to itself” instead of an error about the remote site ID being the same as the local peer
- Authentication client logs have been made more human readable. In particular:
- Recoverable errors are logged together with information about the recovery actions that are being undertaken
- Several abbreviations have been replaced with human-readable descriptions
- Errors are printed using their descriptions rather than by dumping debug representations
- Abbreviated jargon has been replaced with clearer wording in various log lines
- “phy ended” has become “physical connection ended”
- “error getting char” has become “required Ditto BLE characteristic not found”
- “error getting radio state” has become “error getting Windows Bluetooth radio state”
- Peer events that represent a transport starting or stopping are now logged with the message “transport started”/“transport ended” rather than as a raw peer_event=… log
- Reduced the noisiness of “starting” log lines around Ditto initialization time
- Noise from long peer keys in logs has been reduced in some places by replacing them with their truncated form
- Noise from duplicated peer ID/peer key information in replication logs has been reduced by consolidating the information
- “starting compression and export” is now followed by a “completed export” log at the same level
- Successful SQLite WAL recovery logs were further lowered from INFO to DEBUG
4.9.0 Common Changes
Added: regexp_like function in DQL. (#12129) Added: peer_metadata and identity_service_metadata to the small peer info document (#12477) Added: WebSocket connections now send X-DITTO-PEERPUBKEY and X-DITTO-ROUTING-HINT headers as part of the client connect handshake on all platforms except wasm32 (#13171) Added: Small Peer Info now includes information about the current logger configuration (#14317) Added: Permission rules can be written in DQL. (#14563) Added: Ditto logs clearly indicate if a device has established a connection to itself. (#14634) Added: the ability for DQL select statement to produce arbitrary projection lists. (#7979) Added: local subscription info to small peer info (#9412) Added: “device_disk_usage” information to small peer info (#9784) Added: “store” information to small peer info (#9785) Changed: Internal sync metadata format changed. Peers that downgrade to a previous SDK version after upgrading may require full resynchronization. (#14799) Changed: Improved (de)serialization performance and reduced its contribution to the library size (#11545) Changed: In updated replication protocol, verification of a received update file no longer requires both peers to use the same approach to subscription hashing. (#12672) Changed: Experimental multihop connectivity is more resilient to mesh disruptions (#13648) Changed: Synchronization protocol enhanced to reduce the amount of redundant data sent from small peers to big peers. (#13737) Changed: Failed certificate verification due to a lagging device clock now results in a clearer error message (#14035) Changed: Multicast peer-to-peer transport is no longer deprecated to improve support for environments where mDNS is unavailable (#14188) Changed: Replication no longer redundantly re-transmits unchanged subscriptions after eviction. (#14290) Changed: truncated peer keys are now logged in lieu of site IDs. (#14362) Changed: improved logging in the authentication code to provide more useful error context. (#15038) Changed: made the small peer “log request” feature much more responsive (#9777) Fixed: Windows P2P LAN now can connect to IPv6 peers (#11468) Fixed: In certain rare cases, resetting the same replication session multiple times could cause failure to converge. (#12616) Fixed: Internal connection TLS caches are now bounded in size. This prevents a long living peer from holding onto more memory than required. (#13801) Fixed: small peer info “metadata” is now persisted across app launches. (#13987) Fixed: Bluetooth peers are handled better when disconnections occur, fixing a possible loop where a device might repeatedly try and fail to connect. (#14018) Fixed: When replication sessions time out, write transactions on the document store may be blocked for a long period. (#14148) Fixed: Multicast peer-to-peer transport (non-MDNS) is no longer influenced by TCP listen configuration in DittoTransportConfig (#14187) Fixed: an issue preventing attachment transfers under high document sync load is now resolved. (#14189) Fixed: A race condition that could cause attachments to unexpectedly crash under heavy load. (#14342) Fixed: device name no longer incorrectly defaults to “ditto” in small peer info, when a named device first starts syncing (#14674) Fixed: presence observers are now less-likely to fire when there is no observable change to presence data. (#14807) Fixed: Logs report blocked_by=“no blocking transaction” when blocking transaction is known (#14966) Fixed: In-band authentication data is now cleared on logout. (#15039) Fixed: switching appIDs now invalidates cached authentication material correctly. (#15040) Fixed: Transport conditions are now reported for a wider range of failures when starting Bluetooth and mDNS transports. (#8729) Fixed: documentation for the stopSync() method to clarify that the Ditto store can be used locally after stopping sync. (#8849) Fixed: Auth Client would hang when cached X.509 was expired. (#15110) Deprecated: Removed:4.8.4 Common Release Notes
Fixed: Some Android devices could fail to export logs to the portal due to a file permissions error (#15582)4.8.3 Common Release Notes
Fixed: iOS 18 crashes related to Bluetooth LE are now resolved. (#15351) Changed: Added more actionable information to common connection handshake issues. (#15298)4.8.2 C# Specific Changes
No C# Specific Changes4.8.2 Common Changes
Fixed: Setting the minimum log level to WARN or ERROR will now correctly filter out very early logger initialization messages. (#14451) Fixed: A bug that could prevent an attachment created with the same data on multiple peers from syncing. (#14481)4.8.1 C# Specific Changes
Fixed: iOS devices may fail to sync on LAN when the app is backgrounded then foregrounded. (#14150)4.8.1 Common Changes**
Added:** The presence_use_multihop system parameter can be used to disable replicating presence information to other peers in the mesh, reducing network overhead. Use ONLY with guidance from the Ditto Customer Experience team. (#14128) Changed: When failing to load document data sync (replication) metadata, Ditto now attempts to clear and regenerate the metadata. This is a behavior change where previously Ditto would fail to start. This serves to prevent problems after SDK version downgrades. (#13111) Fixed: A rare issue where attachments may not be transferred between two peers.(#14158) Fixed: On-disk logs are more robust in situations with unexpected Ditto shutdown. (#13723)4.8.0 C# Specific Changes
Added: BLE and Wi-Fi Aware transports on Android. #11288 Added: method ExportToFileAsync() to DittoLogger, which exports collected logs to a compressed and JSON-encoded file on the local file system. Logs returned through this method are at DEBUG log level. This new API can be used to do forensic log gathering on a device. Logs are always collected and restricted to a fixed specific size limit to ensure they don’t grow endlessly. Once the size limit has reached new logs replace the oldest logs. #11961 Added: Properties PeerKeyString1 and PeerKeyString2 on DittoConnection replacing the deprecated properties Peer1 and Peer2. This is to align with our usage of the PeerKey string identifer across the system in place of the Peer object. #12799 Added: Method GetAllConnectionsByID on DittoPresenceGraph providing easy access to all connections in the presence graph, grouped by their IDs. #12799 Added: Documentation guidance for StartSync() and DisableSyncWithV3() to include a recommendation for performance improvement. #13098Performance of initial sync when bootstrapping a new peer can be improved by calling DisableSyncWithV3() before calling StartSync(). Only do this when all peers in the mesh are known to be running Ditto v4 or higher. Added: Documentation for property PeerMetadata on DittoPeer to add information about how the property behaves over the lifecycle of the DittoPresenceGraph. #13479 Added: Login method to the DittoAuthenticator that provides access to authentication feedback on the returned clientInfoJson string. #4804 Changed: (Linux) Increased mDNS multicast TTL from 1 to 255 to allow for cross-VLAN announcements #13590 Fixed: No longer losing precision while working with larger floating-point numbers. #13229 Deprecated: Properties Peer1 and Peer2 on DittoConnection, please use PeerKeyString1 and PeerKeyString2 instead #12799 Deprecated: Method LoginWithToken from DittoAuthenticator. Use the newly added Login method instead. #48044.8.0 Common Changes
Changed: The Logging output format for Ditto SDKs has been changed in 4.8.0 as part of our process to improve readablility and observability across the Ditto platform. Customers should validate the new data format in their existing data ingestion pipelines.New Logging Schema:YYYY-MM-DDTHH:MM:SS.ssssss LEVEL TARGET: MESSAGE {field1=value1, field2=value2, …}- Timestamp (YYYY-MM-DDTHH:MM.ssssss):
- Format: ISO 8601 format (e.g., 2024-08-16T14:23:05.123456Z).
- Description: The exact time when the log entry was generated.
- Log Level (LEVEL):
- Format: One of the following levels— DEBUG, INFO, WARNING, ERROR.
- Description: Indicates the severity or importance of the log entry.
- Target (TARGET):
- Format: A string, representing the internal module/area
- Description: The source of the log entry, often corresponding to the internal module where the error was called. (e.g. ditto_init or peer_event_listener)
- Message (MESSAGE):
- Format: A human-readable string.
- Description: The main content of the log entry.
- Structured Fields ({field1=value1, field2=value2, …}):
- Format: A list of key-value pairs enclosed in curly braces.
- Description: Any additional structured data associated with the log entry. These fields can include custom data that you attach to the log entry using the tracing::info!(field1 = value1, “Message”) syntax.
4.7.4
ADDED: Support for specifying the mDNS connection ports for Small Peer SDK instances
Allows you to specify a specifc port that can will be used for mDNS announcements and connections on a given device. This can be used for connect with peers across a VLAN while scanning for open ports.Not setting the config will result in the current default behavior of a random port being assigned.If running multiple application on the same device, for example a debug and/or test flight application along side a production application, each application needs to have a unique port.Failure to do this will result in only one application being able to establish connections at a given time.
ALTER SYSTEM
and the tcp_server_bind_mdns_server_port
config.DQL
ditto.store.execute(...)
command within your application.tcp_server_bind_mdns_server_port
needs to be set ***before ***startSync()
is called to be applied.FIXED: A finalizer issue that was causing crashes when closing sync subscriptions (#13849, #13732)
Resolves a race condition that could be hit when closing a sync subscription or stopping sync that caused Ditto to crash.IMPROVED: (Linux) Increased mDNS multicast TTL from 1 to 255 to allow for cross-VLAN announcements (#13590)
To support scenarios with cross-VLAN device discovery we increated the TTL to ensure message have enough time to reach their destination and get acknowledged.4.7.3
FIXED: An issue causing a race condition with a Live Query callback. (#13180)
This fix addresses the issue causing a Live Query callback to receive a delta update, known as a diff, before the initial document.FIXED: A compatibility issue between documents created using different CRDT versions. (#13236)
Previously, there was an issue in which two documents on different internal versions could fail to integrate changes created using an older CRDT version.IMPROVED: Logging for batch write transactions. (#13339, #13339)
Due to a race condition caused by the logging system mistakenly identifying the previous transaction as blocking the current one, the logger would inaccurately indicate the current transaction as being blocked by the previous one from anunknown
originator.FIXED: An issue in the Small Peer datastore causing slow performance or process termination. (#13395)
This issue was due to an aging dependency with a race condition, which caused thread tasks to get stuck and transactions to be blocked for extended periods.IMPROVED: The Ditto SDKs compilation performance. (#13174)
We’ve optimized compilation by reducing the size of each binary slice of the Ditto SDKs by 19% and fixing incompatibility withPLCrashReporter
.4.7.2
ADDED: mesh_chooser_avoid_redundant_bluetooth
system parameter. (#12984)
This new system parameter allows greater control over the use of Bluetooth Low Energy (LE) connections in Ditto’s peer-to-peer mesh network. When set to false
, Ditto creates Bluetooth LE connections alongside other peer-to-peer connections, serving as a fallback if the primary transport, such as Apple Wireless Direct Link (AWDL) or LAN, fails.However, before you enable the mesh_chooser_avoid_redundant_bluetooth
parameter, consider the following technical tradeoffs:- Benefits:
- Provides additional fallback to maintain connection stability when primary connections cease to function.
- Reduces time to establish new connections since, by having multiple fallback options, Ditto can more quickly re-establish connections.
- Drawbacks:
- Increases network traffic since using multiple transports results in additional network overhead
- Using Bluetooth LE alongside other transports increases resource consumption. In the worst case, enabling this setting can result in slower sync performance and battery drain.
mesh_chooser_avoid_redundant_bluetooth
parameter, use the following DQL query:
ALTER SYSTEM SET mesh_chooser_avoid_redundant_bluetooth = false
CHANGED: The AuthClient
by improving the log message for certificate issues returned from the Big Peer Authentication Service. (#13138)
FIXED: A performance-related issue affecting bulk eviction operations for documents with attachments. (#12331)
ADDED: Improved data compression in the handshake protocol when establishing connections to other peers. (#11264)
This allows peers with large permission sets to establish connections on low bandwidth transports like Bluetooth LE more quickly.FIXED: The HTTP protocol by adding content-length: 0 header
compliance in empty POST
requests. (#12346)
Before, if you invoked an empty POST
request, the cloud load balancer would reject your request with a 411 - Length Required
error message.Now you must explicitly state that the body of your POST
request is empty by setting content-length: 0
in the header of your HTTP API call.FIXED: Handling of malformed subscription queries in the legacy query builder API by adding validation logic early to ensure invalid queries are identified early and logged. (#12463)
There was an issue where invokingsubscribe()
on an invalid query caused sync to be silently disabled.Invalid queries in the subscribe()
method are now identified, disabled, and logged as errors.FIXED: Subscription assumption logic so all acknowledgments are processed, regardless of subscription changes. (#12541)
In scenarios where subscriptions rapidly changed back and forth while documents were being concurrently altered, documents would diverge at merge.We’ve removed subscription logic ignoring acknowledgements based on assumed subscription mismatch and introduced salting functionality to ensure each document is unique for each occurrence of a subscription. This helps differentiate between new and reverted subscription states.FIXED: Sync inefficiency where changing a subscription resulted in unnecessary syncing of redundant update files. (#12967)
To eliminate redundant data from being synced unnecessarily, regardless of whether the remote peer previously acknowledged them, we’ve added validation checks ensuring that only unacknowledged data is synced.This fix reduces sync update file sizes, leading to more performant session sync updates, particularly in apps consisting of large, stable subscriptions and infrequent document changes.FIXED: An issue causing DittoValidationException
to attempt to fetch an attachment from a dictionary representation. (#12668)
FIXED: The DittoPeer.IsDittoCloudConnected
property to correctly reflect the actual connection status. (#13062)
4.7.1
Fixed: Misleading errors related to attachment fetch operations. Now, associated error logs are more accurate and clear. (#12409)
Fixed: A specific issue where incorrect sync metadata rollback caused problems with data consistency at merge. (#12422)
Fixed: Handling of document paths so non-alphanumeric and non-underscore characters function without causing errors. (#12556)
Previous versions may have removed these characters from document paths.4.7
FIXED: The legacy query language error-throwing mechanism to accept invalid field names properly. (#11888)
After upgrading to version 4.7 of the SDK, you may notice unexpected errors while using the legacy query builder language. These errors are likely due to invalid field names or path expressions previously undetected.In addition, make sure to startunquoted_string
with an underscore (_
), a letter, or an alphanumeric character. For example, the following equivalent regular expression: [A-Za-z_][A-Za-z0-9_]*
.In the legacy query builder language, invalid field names and path expressions now throw explicit errors. Previously these invalid names did not throw and would cause undefined behavior.Note: This new error-throwing behavior applies only to the legacy query builder language; DQL is unaffected by this improvement.
REMOVED: The is_connected_to_big_peer
field from the Small Peer Info document. (#11883)
CHANGED: The small peer info JSON metadata by increasing the depth limit to 64 levels. (#11891)
IMPROVED: Transaction contention time for the ATTACHMENT
data type, reducing potential timeouts. (#11893)
Before this improvement, concurrent write transactions were long-lived, potentially causing deadlocks and request timeouts. Now you’ll experience more effective handling of multiple attachments being processed at the same time.FIXED: The issue causing sync crashes due to missing update files. (#11952)
With the latest release, Ditto handles unexpected situations or errors in a way that allows it to recover and continue functioning without crashing or causing disruptions.ADDED: Parameters for adjusting certain settings during runtime
This rollout includes new system parameters for the MeshChooser feature for configuring a limited set of variables, allowing you to adjust certain settings during runtime.RESOLVED: The warning message when peers connect is no more. (#11977)
The warning message previously logged when peers connected within the mesh is no longer recorded or printed.IMPROVED: Sync performance by sending the entire state of the data. (#12029)
Previously, when syncing in mixed mesh environments from Ditto SDK version 4.0.0 of the SDK to version 3.0.0, only partial updates were transmitted. With this release, all updates are transmitted, resulting in greater data consistency and completeness when syncing across different versions of the SDK.FIXED: The issue causing the Small Peer Info collector to become stuck. (#12051)
Previously, the Small Peer Info collector would become stuck when attempting to upload logs in certain situations. Since resolving this issue, the Small Peer Info collector functions properly in those conditions.FIXED: The issue causing fetch operations to appear unresponsive. (#9501, #12067)
With this fix, operations related to fetching attachments function as expected.FIXED: The issue causing type check failures when setting duration parameters through ALTER SYSTEM SET. (#12070)
When usingSystemParameter
to configure timeouts before this fix, if using different types to encode the values representing the timeout, for instance, Milliseconds
and Seconds
, the values failed to downcast, an error log printed, and the new value ignored.Now, when using mismatched wrapper types, Ditto performs a compatibility check, validates, and, if needed, converts them as appropriate.FIXED: Peer-to-peer LAN now advertises on newly added interfaces, such as enabling Wi-Fi at runtime. (#10265)
This addresses an issue where mDNS on Android was slow to recover when transitioning Wi-Fi from disabled to enabled.ADDED: A warning notifying that the DeviceName
changes after sync start. (#11160)
We’ve added a warning message that logs when the DeviceName
property is set after the sync process has started. Previously, setting DeviceName
of a Ditto instance after starting sync did not trigger a warning. This new message warns you that the new value you’ve set only takes effect after you’ve restarted the sync process in your app.FIXED: The DeviceName
property on Ditto instances now reflects the truncation of the value to 24 bytes when starting sync. (#11611)
ADDED: Properties PeerKeyString
property to DittoPeer
as a replacement for the now deprecated PeerKey
. (#11611)
ADDED: Added the PeerMetadataJsonString
property and the SetPeerMetadataJsonString
method to Ditto.Presence
. (#11611)
ADDED: Introduced the PeerMetadata
property and the SetPeerMetadata
method to Ditto.Presence
. (#11611)
ADDED: Added properties PeerMetadata
and IdentityServiceMetadata
to DittoPeer
. (#11611)
ADDED: The ConnectionRequestHandler
property in Ditto.Presence
, allowing filtering of incoming connections from other peers.
DEPRECATED: The DittoPresence.Exec()
method has been deprecated in favor of using the newly introduced Graph
property on Ditto.Presence
. (#11611)
DEPRECATED: The PeerKey
property on DittoPeer
. (#11611)
From now on, use the newly added PeerKeyString
property instead.