Data Sync
Using Mesh Presence
t his article provides a high level overview of peer presence data within the mesh network peer presence data, or presence for short, refers to the information ditto uses within the mesh network to track peer connectivity within physical proximity to get realtime updates about changes to presence data, use the presence api this article includes instructions on how to implement ditto's presence apis to enable the following end user functionality for network monitoring and management within your app setting and updating peer specific information, such as name, role, and location viewing information about other peers currently connected in the mesh accessing presence apis to access api methods for mesh presence functionality , call the the presence namespace on the root ditto object ditto presenceditto presenceditto presenceditto getpresence();ditto presenceditto get presence()ditto presence() dart (beta) // coming soon presence graph once discovered in the mesh, peers automatically establish a presence graph by advertising their device presence within the mesh and forming network connections with other connected peers the presence graph is a data structure representing the current state of the mesh from a specific peer's point of view you can integrate the presence graph into your app to enable end user functionality like network monitoring, management, and transport optimization for example, once implemented, end users can input personal information, such as their name, and inspect remote peers connected within the mesh for more information, see https //github com/getditto/dittoswifttools on github accessing presence graphs to view your current presence graph let presencegraph = ditto presence graphval presencegraph = ditto presence graphconst presencegraph = ditto presence graphdittopresencegraph graph = ditto getpresence() getgraph();var presencegraph = ditto presence graphauto presencegraph = ditto get presence() graph()let presencegraph = ditto presence() graph() dart (beta) // coming soon once invoked, ditto returns the following object, allowing you to perform actions like displaying t he status of connected peers and managing network resources presence graph response { localpeer peer; remotepeers peer\[]; } the localpeer is the metadata set by the end user within your app the remotepeers property provides a n array of the other client devices connected to the mesh ( see /#end user defined metadata ) observing presence graph modifications to monitor and handle changes observed to the presence graph, call the change handler with the updated graph object as follows make sure the observer response object remains in memory during runtime; otherwise, ditto removes it during the periodic garbage collection process running in the background, resulting in the change handler no longer being triggered let presenceobserver = ditto presence observe { presencegraph in // observe changes to the presence graph }val presenceobserver = ditto presence observe { graph > // observe changes to the presence graph }const presenceobserver = ditto presence observe((presencegraph) => { // observe changes to the presence graph })dittopresenceobserver presenceobserver = ditto getpresence() observe(graph > { // observe changes to the presence graph });var presenceobserver = ditto presence observe((dittopresencegraph graph) => { // observe changes to the presence graph });auto presenceobserver = ditto get presence() observe(\[&]\(presencegraph graph) { // observe changes to the presence graph });let presenceobserver = ditto presence() observe(move | graph| { // observe changes to the presence graph }); dart (beta) // coming soon peer key identifier once discovered in the mesh, each peer device running ditto is automatically assigned a peer key reading peer keys view your local device's peer key or the peer key identifying a specific remote device to retrieve the peer key for the current peer ditto presence graph localpeer peerkeystringditto presence graph localpeer peerkeystringditto presence graph localpeer peerkeystringditto getpresence() getgraph() localpeer peerkeystringditto presence graph localpeer peerkeystringditto get presence() graph() local peer peer key stringditto presence() graph() local peer peer key string dart (beta) // coming soon to retrieve the peer key for a remote peer let remotepeers = presencegraph remotepeers let firstpeer = remotepeers first! let peerkeystring = firstpeer peerkeystringval remotepeers = ditto presence graph remotepeers val firstpeer = remotepeers first() val peerkeystring = firstpeer peerkeystringconst remotepeers = ditto presence graph remotepeers const firstpeer = remotepeers\[0] const peerkeystring = firstpeer peerkeystringlist\<dittopeer> remotepeers = ditto getpresence() getgraph() remotepeers dittopeer firstpeer = remotepeers get(0) string peerkeystring = firstpeer peerkeystringdittopeer remotepeers = ditto presence graph remotepeers const firstpeer = remotepeers\[0] const peerkeystring = firstpeer peerkeystringauto remotepeers = ditto get presence() graph() remote peers; auto firstpeer = remotepeers\[0]; auto peerkeystring = firstpeer peer key string;let remote peers = ditto presence() graph() remote peers; let first peer = \&remote peers\[0]; let peer key string = \&first peer peer key string; dart (beta) // coming soon end user defined metadata using the peer metadata property, you can provide each peer connected within the mesh the ability to set and view information about themselves or read information defined by other peers within the mesh the following table provides an overview of key considerations to know before setting peer metadata, as well as ditto's recommended best practices to ensure optimal mesh performance and avoid potential issues consideration best practice peer metadata syncs across the mesh with each new connection therefore, sharing large data over low bandwidth transports, such as bluetooth low energy (le), and low quality connections may slow or disrupt the connection process keep the size of peer metadata to a minimum, especially when syncing over bluetooth le or similar low bandwidth transports this is because peer metadata exceeding 128 kb, the maximum limit, results in the operation failing and ditto throwing an error peer metadata is visible to all peers connected in the mesh include only non sensitive information in peer metadata setting local peer metadata to implement functionality providing end users the ability to define metadata, call the setpeermetadata api method as follows // setting via object try ditto presence setpeermetadata(\["location" "inside"]) // setting via json string let jsondata = "{location \\"inside\\"}" data(using utf8)! try ditto presence setpeermetadatajsondata(jsondata)// setting via object ditto presence peermetadata = mapof("number" to 1) // setting via json string ditto presence peermetadatajsonstring = """ {"location" "inside"} """ trimindent()// setting via object await ditto presence setpeermetadata({ location "inside" }) // setting via json string await ditto presence setpeermetadatajsonstring("{location \\"inside\\"}")// setting via object ditto getpresence() setpeermetadata( collections singletonmap("number", 1) ); // setting via json string ditto getpresence() setpeermetadatajsonstring("{\\"location\\" \\"inside\\"}");ditto presence setpeermetadata(new dictionary\<string, object>() { { "location", "inside" } });nlohmann json metadata = { {"location", "inside"} }; ditto get presence() set peer metadata(metadata);let metadata = json!({ "location" "inside", }); ditto presence() set peer metadata(\&metadata)?; dart (beta) // coming soon reading local peer metadata once set, inspect the metadata // reading from the presence namespace ditto presence peermetadata // reading from the presence graph ditto presence graph localpeer peermetadata// reading from the presence namespace ditto presence peermetadata // reading from the presence graph ditto presence graph localpeer peermetadata// reading from the presence namespace ditto presence peermetadata // reading from the presence graph ditto presence graph localpeer peermetadata// reading from the presence namespace map\<string, object> metadata = ditto getpresence() getpeermetadata(); // reading from the presence graph map\<string, object> metadata2 = ditto getpresence() getgraph() localpeer peermetadata;// reading from the presence namespace ditto presence peermetadata; // reading from the presence graph ditto presence graph localpeer peermetadata;// reading from the presence namespace ditto get presence() peer metadata() // reading from the presence graph ditto get presence() graph() local peer peer metadata// reading from the presence namespace ditto presence() peer metadata() // reading from the presence graph ditto presence() graph() local peer peer metadata dart (beta) // coming soon reading remote peer metadata to inspect the metadata set by all other peers in the mesh let remotepeers = ditto presence graph remotepeers let firstpeer = remotepeers first! let peermetadata = firstpeer peermetadataval remotepeers = ditto presence graph remotepeers val firstpeer = remotepeers first() val peermetadata = firstpeer peermetadataconst remotepeers = ditto presence graph remotepeers const firstpeer = remotepeers\[0] const peermetadata = firstpeer peermetadatalist\<dittopeer> remotepeers = ditto getpresence() getgraph() remotepeers; dittopeer firstpeer = remotepeers get(0); map\<string, object> metadata = firstpeer peermetadata;var remotepeers = ditto presence graph remotepeers peermetadata; var firstpeer = remotepeers\[0]; var peermetadata = firstpeer peermetadata;auto remotepeers = ditto get presence() graph() remote peers; auto firstpeer = remotepeers\[0]; auto peermetadata = firstpeer peer metadata();let remote peers = ditto presence() graph() remote peers; let first peer = \&remote peers\[0]; let peer metadata = \&first peer peer metadata; dart (beta) // coming soon