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