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.
Setting the config
The config can be set using DQL ALTER SYSTEM
and the tcp_server_bind_mdns_server_port
config.
This command should be run using the ditto.store.execute(...)
command within your application.
tcp_server_bind_mdns_server_port
needs to be set ***before ***startSync()
is called to be applied.
Resolves a race condition that could be hit when closing a sync subscription or stopping sync that caused Ditto to crash.
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.
DittoSubscription
that contained a sort()
clause. (#13394)Resolves and issue where using sort()
in sync subsriptions with the legacy query builder would result in a crash.
Previously not all symbols were being included in the package bundle and this led to crashes not being able to be symbolicated and ultimately made readable.
Now the Kotlin bundle includes the correct packages
The extra symbols slightly increase the bundle size. If this additional size is an issue for your application, we recommend stripping these symbols when compiling your production build.
However, please note that stripping symbols will make crash reports in production unreadable, which could lead to longer resolution times for live site incidents.
This fix addresses the issue causing a Live Query callback to receive a delta update, known as a diff, before the initial document.
Previously, there was an issue in which two documents on different internal versions could fail to integrate changes created using an older CRDT version.
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 an unknown
originator.
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.
We’ve optimized compilation by reducing the size of each binary slice of the Ditto SDKs by 19% and fixing incompatibility with PLCrashReporter
.
JVMBased
in the Device Dashboard instead of Unknown
. (#13251)gatt must not be null
. (#13411)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:
To enable the mesh_chooser_avoid_redundant_bluetooth
parameter, use the following DQL query:
ALTER SYSTEM SET mesh_chooser_avoid_redundant_bluetooth = false
AuthClient
by improving the log message for certificate issues returned from the Big Peer Authentication Service. (#13138)This allows peers with large permission sets to establish connections on low bandwidth transports like Bluetooth LE more quickly.
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.
There was an issue where invoking subscribe()
on an invalid query caused sync to be silently disabled.
Invalid queries in the subscribe()
method are now identified, disabled, and logged as errors.
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.
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.
warn
log noise. (#12674)Changed: handle reverse DNS lookup queries in Android mdns to avoid mdns failing to connect in specific network configs
mdns
to handle reverse DNS lookup queries. (#13000)By adding reverse DNS lookup queries, Android mdns
no longer fails to connect in specific network configurations.
Now version metadata is correctly included in the string returned from Ditto.sdkVersion
.
Before this patch release, the documentation incorrectly stated that the return value had to be kept in scope for the fetch to complete. As of this release, the documentation specifies that the return value does not need to be kept in scope.
Previously, your app crashed if the persistence directory was already in use by another Ditto instance. Now, rather than crashing in such scenarios, Ditto throws a DittoError.LockedWorkingDirectoryError
error.
Now, you can use this experimental alternative to the original Ditto constructor to prevent crashes when the persistence directory is still in use by another Ditto instance at the time of calling the constructor. Now, rather than crashing in such scenarios, Ditto throws a DittoError.LockedWorkingDirectoryError
error. (#11801)
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 start unquoted_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.
is_connected_to_big_peer
field from the Small Peer Info document. (#11883)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.
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.
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.
The warning message previously logged when peers connected within the mesh is no longer recorded or printed.
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.
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.
With this fix, operations related to fetching attachments function as expected.
When using SystemParameter
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.
peerMetadata
and peerMetadataJsonString
to ditto.presence
.identityServiceMetadata
to DittoPeer.peerKeyString
to DittoPeer
as a replacement for the now deprecated peerKey
.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.
Setting the config
The config can be set using DQL ALTER SYSTEM
and the tcp_server_bind_mdns_server_port
config.
This command should be run using the ditto.store.execute(...)
command within your application.
tcp_server_bind_mdns_server_port
needs to be set ***before ***startSync()
is called to be applied.
Resolves a race condition that could be hit when closing a sync subscription or stopping sync that caused Ditto to crash.
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.
DittoSubscription
that contained a sort()
clause. (#13394)Resolves and issue where using sort()
in sync subsriptions with the legacy query builder would result in a crash.
Previously not all symbols were being included in the package bundle and this led to crashes not being able to be symbolicated and ultimately made readable.
Now the Kotlin bundle includes the correct packages
The extra symbols slightly increase the bundle size. If this additional size is an issue for your application, we recommend stripping these symbols when compiling your production build.
However, please note that stripping symbols will make crash reports in production unreadable, which could lead to longer resolution times for live site incidents.
This fix addresses the issue causing a Live Query callback to receive a delta update, known as a diff, before the initial document.
Previously, there was an issue in which two documents on different internal versions could fail to integrate changes created using an older CRDT version.
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 an unknown
originator.
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.
We’ve optimized compilation by reducing the size of each binary slice of the Ditto SDKs by 19% and fixing incompatibility with PLCrashReporter
.
JVMBased
in the Device Dashboard instead of Unknown
. (#13251)gatt must not be null
. (#13411)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:
To enable the mesh_chooser_avoid_redundant_bluetooth
parameter, use the following DQL query:
ALTER SYSTEM SET mesh_chooser_avoid_redundant_bluetooth = false
AuthClient
by improving the log message for certificate issues returned from the Big Peer Authentication Service. (#13138)This allows peers with large permission sets to establish connections on low bandwidth transports like Bluetooth LE more quickly.
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.
There was an issue where invoking subscribe()
on an invalid query caused sync to be silently disabled.
Invalid queries in the subscribe()
method are now identified, disabled, and logged as errors.
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.
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.
warn
log noise. (#12674)Changed: handle reverse DNS lookup queries in Android mdns to avoid mdns failing to connect in specific network configs
mdns
to handle reverse DNS lookup queries. (#13000)By adding reverse DNS lookup queries, Android mdns
no longer fails to connect in specific network configurations.
Now version metadata is correctly included in the string returned from Ditto.sdkVersion
.
Before this patch release, the documentation incorrectly stated that the return value had to be kept in scope for the fetch to complete. As of this release, the documentation specifies that the return value does not need to be kept in scope.
Previously, your app crashed if the persistence directory was already in use by another Ditto instance. Now, rather than crashing in such scenarios, Ditto throws a DittoError.LockedWorkingDirectoryError
error.
Now, you can use this experimental alternative to the original Ditto constructor to prevent crashes when the persistence directory is still in use by another Ditto instance at the time of calling the constructor. Now, rather than crashing in such scenarios, Ditto throws a DittoError.LockedWorkingDirectoryError
error. (#11801)
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 start unquoted_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.
is_connected_to_big_peer
field from the Small Peer Info document. (#11883)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.
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.
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.
The warning message previously logged when peers connected within the mesh is no longer recorded or printed.
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.
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.
With this fix, operations related to fetching attachments function as expected.
When using SystemParameter
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.
peerMetadata
and peerMetadataJsonString
to ditto.presence
.identityServiceMetadata
to DittoPeer.peerKeyString
to DittoPeer
as a replacement for the now deprecated peerKey
.