From b67c187132fa9f1ae842d604ce73c6a9dc6d3bc3 Mon Sep 17 00:00:00 2001 From: Dariusz Rybicki <dariusz@elixxir.io> Date: Fri, 3 Jun 2022 14:07:06 +0200 Subject: [PATCH] Add basic usage examples to README.md --- README.md | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/README.md b/README.md index 5a65a5b5..985aee7f 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,146 @@ Add `ElixxirDAppsSDK` library as a dependency to your project using Swift Packag For usage examples, checkout included example iOS application. +### â–¶ï¸ Instantiating client + +Create a new client and store it on disk: + +```swift +let createClient: ClientCreator = .live +try createClient( + directoryURL: ..., + ndf: ..., + password: ... +) +``` + +Load existing client from disk: + +```swift +let loadClient: ClientLoader = .live +let client = try loadClient( + directoryURL: ..., + password: ... +) +``` + +You can also use a convenient `ClientStorage` wrapper to manage a client stored on disk: + +```swift +let storage: ClientStorage = .live( + passwordStorage: .init( + save: { password in + // securely save provided client's password + }, + load: { + // load securely stored client's password + } + ) +) +let client: Client +if storage.hasStoredClient() { + client = try storage.loadClient() +} else { + client = try storage.createClient() +} +``` + +Check out included example iOS application for the `PasswordStorage` implementation that uses the iOS keychain. + +### â–¶ï¸ Connecting to the network + +Start network follower: + +``` +let client: Client = ... +try client.networkFollower.start(timeoutMS: 10_000) +``` + +Wait until connected: + +``` +let client: Client = ... +let isNetworkHealthy = client.waitForNetwork(timeoutMS: 30_000) +``` + +### â–¶ï¸ Making a new identity + +Use the client to make a new identity: + +```swift +let client: Client = ... +let myIdentity = try client.makeIdentity() +``` + +### â–¶ï¸ Connecting to remote + +Perform auth key negotiation with the given recipient to get the `Connection`: + +```swift +let client: Client = ... +let connection = try client.connect( + withAuthentication: false, + recipientContact: ..., + myIdentity: ... +) +``` + +Pass `true` for the `withAuthentication` parameter if you want to prove id ownership to remote as well. + +### â–¶ï¸ Sending messages + +Send a message to the connection's partner: + +```swift +let connection: Connection = ... +let report = try connection.send( + messageType: 1, + payload: ... +) +``` + +Check if the round succeeded: + +```swift +let client: Client = ... +try client.waitForDelivery(roundList: ..., timeoutMS: 30_000) { result in + switch result { + case .delivered(let roundResults): + ... + case .notDelivered(let timedOut): + ... + } +} +``` + +### â–¶ï¸ Receiving messages + +Use connection's message listener to receive messages from partner: + +```swift +let connection: Connection = ... +connection.listen(messageType: 1) { message in + ... +} +``` + +### â–¶ï¸ Using rest-like API + +Use `RestlikeRequestSender` to perform rest-like requests: + +```swift +let client: Client = ... +let connection: Connection = ... +let sendRestlike: RestlikeRequestSender = .live(authenticated: false) +let response = try sendRestlike( + clientId: client.getId(), + connectionId: connection.getId(), + request: ... +) +``` + +Pass `true` for the `authenticated` parameter if you want to perform authenticated requests. + ## 🛠Development Open `ElixxirDAppsSDK.xcworkspace` in Xcode (≥13.4). -- GitLab