From d126abf39b512b49f5713cd2fcda6230ba75f1e9 Mon Sep 17 00:00:00 2001
From: Philippe PITTOLI
Date: Tue, 17 Dec 2019 22:08:54 +0100
Subject: [PATCH] README, with a rationale draft.
---
.gitignore | 5 +++++
README.md | 42 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 47 insertions(+)
create mode 100644 .gitignore
create mode 100644 README.md
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..5948af2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+shard.lock
+bin
+lib
+
+.*
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e5643f3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,42 @@
+# protocol overview
+
+1. AUTHENTICATION: authentication message and informations about messages to transfer
+2. RESPONSE: OK or ERROR
+3. loop:
+ # TRANSFER: message id, file chunk
+ # REPONSE: Ok
+
+# messages content
+
+format: IPC USER MESSAGE TYPE, JSON ENCODED MESSAGE
+
+1. AUTHENTICATION message
+ 1, { message-id: "UUID", token: "JWT", files: [
+ { name: "NAME", size: SIZE-IN-BYTES (unsigned int 64 bits) },
+ { name: "NAME", size: SIZE-IN-BYTES (unsigned int 64 bits) },
+ ], fid: "UUID", tags: [ TAG-NAME, TAG-NAME ]
+ }
+ note: The server knows the user id from the token (JWT) and stores the received files in a
+2. RESPONSE message
+ 2, { message-id: "UUID", response: "Ok" }
+ or
+ 2, { message-id: "UUID", response: "Error", reason: "REASON" }
+3. TRANSFER message
+ 3, { message-id: "UUID", chunk: "UUID", data: [ BINARY DATA ] }
+
+# Rationale
+
+### Why don't we just trust TCP to carry the whole file?
+The application layer has to know which parts are missing so we can transfer them later (in another connection, maybe).
+
+### Why message id?
+The client and the server do not have a direct TCP connection together, there may be proxies.
+The client cannot trust its TCP connection to know exactly what are the parts the server really got.
+The file server to proxy connection can be dropped, we have to ensure the communication between the client and the server.
+
+
+# How this works:
+
+* libipc is used to communicate
+* messages are: JSON encoded, 1KB buffered data
+* message example: { message-id: "UUID", chunk: "UUID", data: [1KB BINARY DATA] }