-
Notifications
You must be signed in to change notification settings - Fork 13
multipart messages
Fanda Vacek edited this page Dec 14, 2023
·
23 revisions
New meta key part
will be introduced in RpcResponse. RpcResponse without part
key is considered to be the final one. This is aligned with single-part messages, which currently have not a part
key.
RpcMessage body IMap keys will be extended by following keys:
-
chunk
- optional, ifchunk
key is received, thenresult
should be appended to result of previous chunks-
String
,Blob
will be concatenated -
List
will be appended -
Map
will be merged
-
-
progress
- optional, IMap with following keys:-
index
- index of current part<0, count)
-
count
- part count message
-
Receiver of multipart message can cancel whole transfer, if it sent back Error RpcResponse, rcid
must be part of RpcRequest to enable this.
Also sender can cancel whole transfer, if it will send RpcResponse with error
set
What multipart messages can be good for:
- transfer big file in N chunks with progress
- keep client informed about progress of very long time lasting Rpc Call
- tunneling
- client issue
getFile()
rqId = RQID
- File device will split file content to N chunks
- N RpcResponses will be sent back to client
- every response will have
rqId == RQID
- first N-1 responses will be sent with
part==true
in metadata andchunk == true
+result == BLOB_DATA_n
in response - N-th response will be sent with
part == false
in metadata andchunk == true
+result == BLOB_DATA_n
in response data
- every response will have
- client issue
sendFile()
withrqId == RQID
+rcid == null
+part == true
key set in metadata. - device responses with some
result
and wait for more messages withrqId == RQID
, client will takercid
list from response, we will call itRCID
- Client will split file content to N chunks
- N RpcResponses will be sent back to device
- every response will have
rqId == RQID
+cid == RCID
- first N-1 responses will be sent with
part==true
in metadata andchunk == true
+result == BLOB_DATA_n
in response - N-th response will be sent with
part == false
in metadata andchunk == true
+result == BLOB_DATA_n
in response data
- every response will have
- client issue
heavyComputation()
withrqId = RQID
- N RpcResponses will be sent back to client
- every response will have
rqId == RQID
- first N-1 responses will be sent with
part==true
in metadata andprogress = PROGRESS_MAP
+result == null
in response - N-th response will be sent with
part == false
in metadata andresult == 42
in response data
- every response will have
- client issue
openTunnel()
withrqId == RQID
+rcid == null
+part == true
key set in metadata. - device will save first message
cid
asCID
- Device responses with some
result
and wait for more messages withrqId == RQID
, client will takercid
list from response, we will call itRCID
- Client will send any data to its tunnel end as Rpcresponse with
rqId == RQID
+cid == RCID
- Device will send any data to its tunnel end as Rpcresponse with
rqId == RQID
+cid == CID
- Tunnel is closet if
- Client or device send RpcResponse with
part = false
- Client or device send RpcResponse with
error
set
- Client or device send RpcResponse with